Skip to content

Commit

Permalink
Feat/jira cmdb fields (#609)
Browse files Browse the repository at this point in the history
* feat(jira): add cmdb in the jira flow

* fix(jira): remove mock data and fix the flow of jira with cmdb
  • Loading branch information
rogefm authored Dec 18, 2024
1 parent 90a174d commit 3d29ca1
Show file tree
Hide file tree
Showing 11 changed files with 370 additions and 98 deletions.
1 change: 1 addition & 0 deletions gateway/models/jira_issue_templates.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ func UpdateJiraIssueTemplates(issue *JiraIssueTemplate) error {
IssueTypeName: issue.IssueTypeName,
MappingTypes: issue.MappingTypes,
PromptTypes: issue.PromptTypes,
CmdbTypes: issue.CmdbTypes,
UpdatedAt: issue.UpdatedAt,
}).
Where("org_id = ? AND id = ?", issue.OrgID, issue.ID)
Expand Down
29 changes: 24 additions & 5 deletions webapp/src/webapp/events/jira_templates.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,17 @@
:on-success #(rf/dispatch [:jira-templates->set-active-template %])
:on-failure #(rf/dispatch [:jira-templates->set-active-template nil])}]]]}))

(rf/reg-event-fx
:jira-templates->get-submit-template
(fn [{:keys [db]} [_ id]]
{:db (assoc db :jira-templates->submit-template {:status :loading
:data {}})
:fx [[:dispatch
[:fetch {:method "GET"
:uri (str "/integrations/jira/issuetemplates/" id "?expand=cmdbtype-values")
:on-success #(rf/dispatch [:jira-templates->set-submit-template %])
:on-failure #(rf/dispatch [:jira-templates->set-submit-template nil])}]]]}))

(rf/reg-event-db
:jira-templates->set-all
(fn [db [_ templates]]
Expand All @@ -33,6 +44,16 @@
(fn [db [_ template]]
(assoc db :jira-templates->active-template {:status :ready :data template})))

(rf/reg-event-db
:jira-templates->set-submit-template
(fn [db [_ template]]
(assoc db :jira-templates->submit-template {:status :ready :data template})))

(rf/reg-event-db
:jira-templates->clear-submit-template
(fn [db _]
(assoc db :jira-templates->submit-template {:status :loading :data nil})))

(rf/reg-event-fx
:jira-templates->create
(fn [_ [_ template]]
Expand Down Expand Up @@ -80,8 +101,6 @@
(:jira-templates->active-template db)))

(rf/reg-sub
:jira-templates->template-by-id
:<- [:jira-templates->list]
(fn [templates [_ id]]
(when-let [template-list (:data templates)]
(first (filter #(= (:id %) id) template-list)))))
:jira-templates->submit-template
(fn [db _]
(:jira-templates->submit-template db)))
4 changes: 2 additions & 2 deletions webapp/src/webapp/jira_templates/basic_info.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
on-description-change
on-project-key-change
on-issue-type-change]}]
[:> Grid {:columns "7" :gap "7"}
[:> Flex {:direction "column" :gap "5"}
[:> Box {:grid-column "span 2 / span 2"}
[:> Heading {:as "h3" :size "4" :weight "medium" :class "text-[--gray-12]"}
[:> Heading {:as "h3" :size "4" :weight "bold" :class "text-[--gray-12]"}
"Integration details"]
[:> Text {:size "3" :class "text-[--gray-11]"}
"Used to identify your Jira configuration in your connections."]]
Expand Down
99 changes: 99 additions & 0 deletions webapp/src/webapp/jira_templates/cmdb_table.cljs
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
(ns webapp.jira-templates.cmdb-table
(:require
["@radix-ui/themes" :refer [Box Table Text]]
[webapp.components.forms :as forms]
[webapp.jira-templates.rule-buttons :as rule-buttons]))

(def required-options
[{:value "true" :text "Yes"}
{:value "false" :text "No"}])

(defn main [{:keys [state
select-state
on-cmdb-field-change
on-cmdb-select
on-toggle-cmdb-select
on-toggle-all-cmdb
on-cmdb-delete
on-cmdb-add]}]
[:> Box {:class "space-y-radix-5"}
[:> Table.Root {:size "2" :variant "surface"}
[:> Table.Header
[:> Table.Row {:align "center"}
(when @select-state
[:> Table.ColumnHeaderCell ""])
[:> Table.ColumnHeaderCell "Label"]
[:> Table.ColumnHeaderCell "Jira Field"]
[:> Table.ColumnHeaderCell "Value"]
[:> Table.ColumnHeaderCell "Object Type"]
[:> Table.ColumnHeaderCell "Description (Optional)"]
[:> Table.ColumnHeaderCell "Required"]]]

[:> Table.Body
(doall
(for [[idx cmdb] (map-indexed vector @state)]
^{:key idx}
[:> Table.Row {:align "center"}
(when @select-state
[:> Table.RowHeaderCell {:p "2" :width "20px"}
[:input {:type "checkbox"
:checked (:selected cmdb)
:on-change #(on-cmdb-select state idx)}]])

[:> Table.Cell {:p "4"}
[forms/input
{:size "2"
:placeholder "e.g. Employee ID"
:value (:label cmdb)
:not-margin-bottom? true
:on-change #(on-cmdb-field-change state idx :label (-> % .-target .-value))}]]

[:> Table.Cell {:p "4"}
[forms/input
{:size "2"
:placeholder "e.g. customfield_0410"
:value (:jira_field cmdb)
:not-margin-bottom? true
:on-change #(on-cmdb-field-change state idx :jira_field (-> % .-target .-value))}]]

[:> Table.Cell {:p "4"}
[forms/input
{:size "2"
:placeholder "e.g. value_123"
:value (:value cmdb)
:not-margin-bottom? true
:on-change #(on-cmdb-field-change state idx :value (-> % .-target .-value))}]]

[:> Table.Cell {:p "4"}
[forms/input
{:size "2"
:placeholder "e.g. product"
:value (:jira_object_type cmdb)
:not-margin-bottom? true
:on-change #(on-cmdb-field-change state idx :jira_object_type (-> % .-target .-value))}]]

[:> Table.Cell {:p "4"}
[forms/input
{:size "2"
:placeholder "e.g. customfield_0410"
:value (:description cmdb)
:not-margin-bottom? true
:on-change #(on-cmdb-field-change state idx :description (-> % .-target .-value))}]]

[:> Table.Cell {:p "4" :align "center"}
[forms/select
{:size "2"
:variant "ghost"
:not-margin-bottom? true
:on-change #(on-cmdb-field-change state idx :required (= "true" %))
:selected (str (:required cmdb))
:full-width? true
:options required-options}]]]))]]

[rule-buttons/main
{:on-rule-add #(on-cmdb-add state)
:on-toggle-select #(on-toggle-cmdb-select select-state)
:select-state select-state
:selected? (every? :selected @state)
:on-toggle-all #(on-toggle-all-cmdb state)
:on-rules-delete #(on-cmdb-delete state)}]])
35 changes: 28 additions & 7 deletions webapp/src/webapp/jira_templates/create_update_form.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
[reagent.core :as r]
[webapp.components.loaders :as loaders]
[webapp.jira-templates.basic-info :as basic-info]
[webapp.jira-templates.cmdb-table :as cmdb-table]
[webapp.jira-templates.form-header :as form-header]
[webapp.jira-templates.helpers :as helpers]
[webapp.jira-templates.prompts-table :as prompts-table]
[webapp.jira-templates.mapping-table :as mapping-table]))
[webapp.jira-templates.mapping-table :as mapping-table]
[webapp.jira-templates.prompts-table :as prompts-table]))

(defn jira-form [form-type template scroll-pos]
(let [state (helpers/create-form-state template)
Expand Down Expand Up @@ -39,10 +40,10 @@
:on-project-key-change #(reset! (:project_key state) %)
:on-issue-type-change #(reset! (:issue_type_name state) %)}]

[:> Grid {:columns "7" :gap "7"}
[:> Flex {:direction "column" :gap "5"}
[:> Box {:grid-column "span 2 / span 2"}
[:> Flex {:align "center" :gap "2"}
[:> Heading {:as "h3" :size "4" :weight "medium" :class "text-[--gray-12]"}
[:> Heading {:as "h3" :size "4" :weight "bold" :class "text-[--gray-12]"}
"Configure automated mapping"]]
[:> Text {:size "3" :class "text-[--gray-11]"}
"Append additional information to your Jira cards when executing a command in your connections."]]
Expand All @@ -61,10 +62,10 @@
:on-mapping-add]))]]]


[:> Grid {:columns "7" :gap "7"}
[:> Flex {:direction "column" :gap "5"}
[:> Box {:grid-column "span 2 / span 2"}
[:> Flex {:align "center" :gap "2"}
[:> Heading {:as "h3" :size "4" :weight "medium" :class "text-[--gray-12]"}
[:> Heading {:as "h3" :size "4" :weight "bold" :class "text-[--gray-12]"}
"Configure manual prompt"]]
[:> Text {:size "3" :class "text-[--gray-11]"}
"Request additional information from executed commands."]]
Expand All @@ -80,7 +81,27 @@
:on-toggle-prompt-select
:on-toggle-all-prompts
:on-prompt-delete
:on-prompt-add]))]]]]]])))
:on-prompt-add]))]]]

[:> Flex {:direction "column" :gap "5"}
[:> Box {:grid-column "span 2 / span 2"}
[:> Heading {:as "h3" :size "4" :weight "bold" :class "text-[--gray-12]"}
"Configure CMDB"]
[:> Text {:size "3" :class "text-[--gray-11]"}
"Set up configuration management database relationships."]]

[:> Box {:class "space-y-radix-7" :grid-column "span 5 / span 5"}
[cmdb-table/main
(merge
{:state (:cmdb state)
:select-state (:cmdb-select-state state)}
(select-keys handlers
[:on-cmdb-field-change
:on-cmdb-select
:on-toggle-cmdb-select
:on-toggle-all-cmdb
:on-cmdb-delete
:on-cmdb-add]))]]]]]])))

(defn- loading []
[:div {:class "flex items-center justify-center rounded-lg border bg-white h-full"}
Expand Down
2 changes: 1 addition & 1 deletion webapp/src/webapp/jira_templates/form_header.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,6 @@
:type "button"
:on-click #(rf/dispatch [:jira-templates->delete-by-id id])}
"Delete"])
[:> Button {:size "4"
[:> Button {:size "3"
:type "submit"}
"Save"]]]]])
68 changes: 65 additions & 3 deletions webapp/src/webapp/jira_templates/helpers.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,15 @@
:description ""
:selected false})

(defn create-empty-cmdb []
{:label ""
:value ""
:jira_field ""
:required true
:description ""
:jira_object_type ""
:selected false})

(defn- format-mapping-rule [rule]
(if (empty? (:type rule))
(create-empty-mapping-rule)
Expand All @@ -33,6 +42,17 @@
:description (:description prompt)
:selected false}))

(defn- format-cmdb [cmdb]
(if (empty? (:label cmdb))
(create-empty-cmdb)
{:label (:label cmdb)
:value (:value cmdb)
:jira_field (:jira_field cmdb)
:required (:required cmdb)
:description (:description cmdb)
:jira_object_type (:jira_object_type cmdb)
:selected false}))

(defn- format-mapping-rules [rules]
(if (empty? rules)
[(create-empty-mapping-rule)]
Expand All @@ -43,6 +63,11 @@
[(create-empty-prompt)]
(mapv format-prompt prompts)))

(defn- format-cmdbs [cmdbs]
(if (empty? cmdbs)
[(create-empty-cmdb)]
(mapv format-cmdb cmdbs)))

(defn create-form-state [initial-data]
{:id (r/atom (or (:id initial-data) ""))
:name (r/atom (or (:name initial-data) ""))
Expand All @@ -51,8 +76,10 @@
:issue_type_name (r/atom (or (:issue_type_name initial-data) ""))
:mapping (r/atom (format-mapping-rules (get-in initial-data [:mapping_types :items])))
:prompts (r/atom (format-prompts (get-in initial-data [:prompt_types :items])))
:cmdb (r/atom (format-cmdbs (get-in initial-data [:cmdb_types :items])))
:mapping-select-state (r/atom false)
:prompts-select-state (r/atom false)})
:prompts-select-state (r/atom false)
:cmdb-select-state (r/atom false)})

(defn create-form-handlers [state]
{:on-mapping-field-change (fn [rules-atom idx field value]
Expand All @@ -61,18 +88,27 @@
:on-prompt-field-change (fn [prompts-atom idx field value]
(swap! prompts-atom assoc-in [idx field] value))

:on-cmdb-field-change (fn [cmdbs-atom idx field value]
(swap! cmdbs-atom assoc-in [idx field] value))

:on-mapping-select (fn [rules-atom idx]
(swap! rules-atom update-in [idx :selected] not))

:on-prompt-select (fn [prompts-atom idx]
(swap! prompts-atom update-in [idx :selected] not))

:on-cmdb-select (fn [cmdbs-atom idx]
(swap! cmdbs-atom update-in [idx :selected] not))

:on-toggle-mapping-select (fn [select-state-atom]
(reset! select-state-atom (not @select-state-atom)))

:on-toggle-prompt-select (fn [select-state-atom]
(reset! select-state-atom (not @select-state-atom)))

:on-toggle-cmdb-select (fn [select-state-atom]
(reset! select-state-atom (not @select-state-atom)))

:on-toggle-all-mapping (fn [rules-atom]
(let [all-selected? (every? :selected @rules-atom)]
(swap! rules-atom #(mapv
Expand All @@ -87,6 +123,13 @@
(assoc prompt :selected (not all-selected?)))
%))))

:on-toggle-all-cmdb (fn [cmdbs-atom]
(let [all-selected? (every? :selected @cmdbs-atom)]
(swap! cmdbs-atom #(mapv
(fn [cmdb]
(assoc cmdb :selected (not all-selected?)))
%))))

:on-mapping-delete (fn [rules-atom]
(let [filtered-rules (vec (remove :selected @rules-atom))]
(reset! rules-atom
Expand All @@ -101,11 +144,21 @@
[(create-empty-prompt)]
filtered-prompts))))

:on-cmdb-delete (fn [cmdbs-atom]
(let [filtered-cmdbs (vec (remove :selected @cmdbs-atom))]
(reset! cmdbs-atom
(if (empty? filtered-cmdbs)
[(create-empty-cmdb)]
filtered-cmdbs))))

:on-mapping-add (fn [rules-atom]
(swap! rules-atom conj (create-empty-mapping-rule)))

:on-prompt-add (fn [prompts-atom]
(swap! prompts-atom conj (create-empty-prompt)))})
(swap! prompts-atom conj (create-empty-prompt)))

:on-cmdb-add (fn [cmdbs-atom]
(swap! cmdbs-atom conj (create-empty-cmdb)))})

(defn remove-empty-mapping [mappings]
(remove (fn [rule]
Expand All @@ -120,11 +173,20 @@
(empty? (:jira_field prompt))))
prompts))

(defn remove-empty-cmdb [cmdbs]
(remove (fn [cmdb]
(or (empty? (:label cmdb))
(empty? (:value cmdb))
(empty? (:jira_field cmdb))
(empty? (:jira_object_type cmdb))))
cmdbs))

(defn prepare-payload [state]
{:id @(:id state)
:name @(:name state)
:description @(:description state)
:project_key @(:project_key state)
:issue_type_name @(:issue_type_name state)
:mapping_types {:items (vec (remove-empty-mapping @(:mapping state)))}
:prompt_types {:items (vec (remove-empty-prompts @(:prompts state)))}})
:prompt_types {:items (vec (remove-empty-prompts @(:prompts state)))}
:cmdb_types {:items (vec (remove-empty-cmdb @(:cmdb state)))}})
Loading

0 comments on commit 3d29ca1

Please sign in to comment.