From a38f604330d5d560240dc7dafb47f85f1acef7a6 Mon Sep 17 00:00:00 2001 From: juliostorino Date: Mon, 16 Dec 2024 19:59:59 -0300 Subject: [PATCH 1/3] Added the ability to edit the estimated hours of an issue --- internal/cmd/issue/edit/edit.go | 100 +++++++++++++++++++------------- internal/cmdcommon/create.go | 6 +- pkg/jira/edit.go | 31 +++++++--- pkg/jira/types.go | 9 +-- 4 files changed, 90 insertions(+), 56 deletions(-) diff --git a/internal/cmd/issue/edit/edit.go b/internal/cmd/issue/edit/edit.go index 5e52adb2..71adfa2f 100644 --- a/internal/cmd/issue/edit/edit.go +++ b/internal/cmd/issue/edit/edit.go @@ -148,15 +148,16 @@ func edit(cmd *cobra.Command, args []string) { } edr := jira.EditRequest{ - ParentIssueKey: parent, - Summary: params.summary, - Body: body, - Priority: params.priority, - Labels: labels, - Components: components, - FixVersions: fixVersions, - AffectsVersions: affectsVersions, - CustomFields: params.customFields, + ParentIssueKey: parent, + Summary: params.summary, + Body: body, + Priority: params.priority, + Labels: labels, + OriginalEstimate: params.originalEstimate, + Components: components, + FixVersions: fixVersions, + AffectsVersions: affectsVersions, + CustomFields: params.customFields, } if configuredCustomFields, err := cmdcommon.GetConfiguredCustomFields(); err == nil { cmdcommon.ValidateCustomFields(edr.CustomFields, configuredCustomFields) @@ -194,11 +195,12 @@ func getAnswers(params *editParams, issue *jira.Issue) { if len(ans.Metadata) > 0 { qs := getMetadataQuestions(ans.Metadata, issue) ans := struct { - Priority string - Labels string - Components string - FixVersions string - AffectsVersions string + Priority string + Labels string + OriginalEstimate string + Components string + FixVersions string + AffectsVersions string }{} err := survey.Ask(qs, &ans) cmdutil.ExitIfError(err) @@ -209,6 +211,9 @@ func getAnswers(params *editParams, issue *jira.Issue) { if len(ans.Labels) > 0 { params.labels = strings.Split(ans.Labels, ",") } + if ans.OriginalEstimate != "" { + params.originalEstimate = ans.OriginalEstimate + } if len(ans.Components) > 0 { params.components = strings.Split(ans.Components, ",") } @@ -300,19 +305,20 @@ func (ec *editCmd) askQuestions(issue *jira.Issue, originalBody string) error { } type editParams struct { - issueKey string - parentIssueKey string - summary string - body string - priority string - assignee string - labels []string - components []string - fixVersions []string - affectsVersions []string - customFields map[string]string - noInput bool - debug bool + issueKey string + parentIssueKey string + summary string + body string + priority string + assignee string + labels []string + originalEstimate string + components []string + fixVersions []string + affectsVersions []string + customFields map[string]string + noInput bool + debug bool } func parseArgsAndFlags(flags query.FlagParser, args []string, project string) *editParams { @@ -334,6 +340,9 @@ func parseArgsAndFlags(flags query.FlagParser, args []string, project string) *e labels, err := flags.GetStringArray("label") cmdutil.ExitIfError(err) + originalEstimate, err := flags.GetString("original-estimate") + cmdutil.ExitIfError(err) + components, err := flags.GetStringArray("component") cmdutil.ExitIfError(err) @@ -353,19 +362,20 @@ func parseArgsAndFlags(flags query.FlagParser, args []string, project string) *e cmdutil.ExitIfError(err) return &editParams{ - issueKey: cmdutil.GetJiraIssueKey(project, args[0]), - parentIssueKey: parentIssueKey, - summary: summary, - body: body, - priority: priority, - assignee: assignee, - labels: labels, - components: components, - fixVersions: fixVersions, - affectsVersions: affectsVersions, - customFields: custom, - noInput: noInput, - debug: debug, + issueKey: cmdutil.GetJiraIssueKey(project, args[0]), + parentIssueKey: parentIssueKey, + summary: summary, + body: body, + priority: priority, + assignee: assignee, + labels: labels, + originalEstimate: originalEstimate, + components: components, + fixVersions: fixVersions, + affectsVersions: affectsVersions, + customFields: custom, + noInput: noInput, + debug: debug, } } @@ -406,6 +416,15 @@ func getMetadataQuestions(meta []string, issue *jira.Issue) []*survey.Question { Default: strings.Join(issue.Fields.Labels, ","), }, }) + case "OriginalEstimate": + qs = append(qs, &survey.Question{ + Name: "originalestimate", + Prompt: &survey.Input{ + Message: "Estimate", + Help: "Estimate in hours", + Default: issue.Fields.OriginalEstimate, + }, + }) case "FixVersions": qs = append(qs, &survey.Question{ Name: "fixversions", @@ -441,6 +460,7 @@ func setFlags(cmd *cobra.Command) { cmd.Flags().StringP("priority", "y", "", "Edit priority") cmd.Flags().StringP("assignee", "a", "", "Edit assignee (email or display name)") cmd.Flags().StringArrayP("label", "l", []string{}, "Append labels") + cmd.Flags().StringP("original-estimate", "e", "", "Original Estimate in hours") cmd.Flags().StringArrayP("component", "C", []string{}, "Replace components") cmd.Flags().StringArray("fix-version", []string{}, "Add/Append release info (fixVersions)") cmd.Flags().StringArray("affects-version", []string{}, "Add/Append release info (affectsVersions)") diff --git a/internal/cmdcommon/create.go b/internal/cmdcommon/create.go index 7615ba70..2e49f167 100644 --- a/internal/cmdcommon/create.go +++ b/internal/cmdcommon/create.go @@ -94,7 +94,7 @@ func GetMetadata() []*survey.Question { Name: "metadata", Prompt: &survey.MultiSelect{ Message: "What would you like to add?", - Options: []string{"Priority", "Components", "Labels", "FixVersions", "AffectsVersions"}, + Options: []string{"Priority", "Components", "Labels", "OriginalEstimate", "FixVersions", "AffectsVersions"}, }, }, } @@ -248,13 +248,13 @@ func ValidateCustomFields(fields map[string]string, configuredFields []jira.Issu fieldsMap := make(map[string]string) for _, configured := range configuredFields { - identifier := strings.ReplaceAll(strings.ToLower(strings.TrimSpace(configured.Name)), " ", "-") + identifier := strings.ToLower(strings.TrimSpace(strings.ReplaceAll(configured.Name, " ", "-"))) fieldsMap[identifier] = configured.Name } invalidCustomFields := make([]string, 0, len(fields)) for key := range fields { - if _, ok := fieldsMap[key]; !ok { + if _, ok := fieldsMap[strings.ToLower(strings.TrimSpace(key))]; !ok { invalidCustomFields = append(invalidCustomFields, key) } } diff --git a/pkg/jira/edit.go b/pkg/jira/edit.go index 6c96c336..350711cf 100644 --- a/pkg/jira/edit.go +++ b/pkg/jira/edit.go @@ -19,15 +19,16 @@ type EditResponse struct { // EditRequest struct holds request data for edit request. // Setting an Assignee requires an account ID. type EditRequest struct { - IssueType string - ParentIssueKey string - Summary string - Body string - Priority string - Labels []string - Components []string - FixVersions []string - AffectsVersions []string + IssueType string + ParentIssueKey string + Summary string + Body string + Priority string + Labels []string + OriginalEstimate string + Components []string + FixVersions []string + AffectsVersions []string // CustomFields holds all custom fields passed // while editing the issue. CustomFields map[string]string @@ -84,6 +85,11 @@ type editFields struct { Add string `json:"add,omitempty"` Remove string `json:"remove,omitempty"` } `json:"labels,omitempty"` + Timetracking []struct { + Edit struct { + OriginalEstimate string `json:"originalEstimate,omitempty"` + } `json:"edit,omitempty"` + } `json:"timetracking,omitempty"` Components []struct { Add *struct { Name string `json:"name,omitempty"` @@ -181,6 +187,13 @@ func getRequestDataForEdit(req *EditRequest) *editRequest { }{{Set: struct { Name string `json:"name,omitempty"` }{Name: req.Priority}}}, + Timetracking: []struct { + Edit struct { + OriginalEstimate string `json:"originalEstimate,omitempty"` + } `json:"edit,omitempty"` + }{{Edit: struct { + OriginalEstimate string `json:"originalEstimate,omitempty"` + }{OriginalEstimate: req.OriginalEstimate}}}, }} if len(req.Labels) > 0 { diff --git a/pkg/jira/types.go b/pkg/jira/types.go index 56217ce1..304cdbcb 100644 --- a/pkg/jira/types.go +++ b/pkg/jira/types.go @@ -57,10 +57,11 @@ type Issue struct { // IssueFields holds issue fields. type IssueFields struct { - Summary string `json:"summary"` - Description interface{} `json:"description"` // string in v1/v2, adf.ADF in v3 - Labels []string `json:"labels"` - Resolution struct { + Summary string `json:"summary"` + Description interface{} `json:"description"` // string in v1/v2, adf.ADF in v3 + Labels []string `json:"labels"` + OriginalEstimate string `json:"originalEstimate"` + Resolution struct { Name string `json:"name"` } `json:"resolution"` IssueType IssueType `json:"issueType"` From bec11632adc7792fd4f5185ec2541213d8eb218d Mon Sep 17 00:00:00 2001 From: jcstorino Date: Tue, 10 Jun 2025 22:10:26 -0300 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20Adicionar=20par=C3=A2metro=20skipNo?= =?UTF-8?q?tify=20=C3=A0=20estrutura=20editParams?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/cmd/issue/edit/edit.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/internal/cmd/issue/edit/edit.go b/internal/cmd/issue/edit/edit.go index 8eef1538..5c7d9031 100644 --- a/internal/cmd/issue/edit/edit.go +++ b/internal/cmd/issue/edit/edit.go @@ -319,6 +319,7 @@ type editParams struct { customFields map[string]string noInput bool debug bool + skipNotify bool } func parseArgsAndFlags(flags query.FlagParser, args []string, project string) *editParams { @@ -379,6 +380,7 @@ func parseArgsAndFlags(flags query.FlagParser, args []string, project string) *e customFields: custom, noInput: noInput, debug: debug, + skipNotify: skipNotify, } } From fe56c6eed17fd2841b7238cdff7e11e7b72726c3 Mon Sep 17 00:00:00 2001 From: jcstorino Date: Wed, 11 Jun 2025 14:53:01 -0300 Subject: [PATCH 3/3] Add create flow with field OriginalEstimate --- internal/cmdcommon/create.go | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/internal/cmdcommon/create.go b/internal/cmdcommon/create.go index 2e49f167..f685b43e 100644 --- a/internal/cmdcommon/create.go +++ b/internal/cmdcommon/create.go @@ -127,6 +127,14 @@ func GetMetadataQuestions(cat []string) []*survey.Question { Help: "Comma separated list of labels. For eg: backend,urgent", }, }) + case "OriginalEstimate": + qs = append(qs, &survey.Question{ + Name: "originalestimate", + Prompt: &survey.Input{ + Message: "Original Estimate", + Help: "Original estimate in the format of 1w 2d 3h 4m (weeks, days, hours, minutes). For eg: 1w 2d 3h 4m", + }, + }) case "FixVersions": qs = append(qs, &survey.Question{ Name: "fixversions", @@ -171,11 +179,12 @@ func HandleNoInput(params *CreateParams) error { if len(ans.Metadata) > 0 { qs := GetMetadataQuestions(ans.Metadata) ans := struct { - Priority string - Labels string - Components string - FixVersions string - AffectsVersions string + Priority string + Labels string + OriginalEstimate string + Components string + FixVersions string + AffectsVersions string }{} err := survey.Ask(qs, &ans) if err != nil { @@ -188,6 +197,9 @@ func HandleNoInput(params *CreateParams) error { if len(ans.Labels) > 0 { params.Labels = strings.Split(ans.Labels, ",") } + if len(ans.OriginalEstimate) > 0 { + params.OriginalEstimate = ans.OriginalEstimate + } if len(ans.Components) > 0 { params.Components = strings.Split(ans.Components, ",") }