1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
package commands
import (
"errors"
"fmt"
"git.tjp.lol/punchcard/internal/actions"
punchctx "git.tjp.lol/punchcard/internal/context"
"github.com/spf13/cobra"
)
func NewArchiveCmd() *cobra.Command {
var clientFlag, projectFlag string
cmd := &cobra.Command{
Use: "archive",
Short: "Archive a client or project",
Long: `Archive a client or project to hide it from the default view.
Archived clients and projects will not be shown in the "Clients & Projects" pane
by default, but can be toggled visible. All historical time entries remain accessible.
Examples:
punch archive --client "Acme Corp"
punch archive --client 1
punch archive --project "Website Redesign"
punch archive --project 5`,
RunE: func(cmd *cobra.Command, args []string) error {
if clientFlag == "" && projectFlag == "" {
return errors.New("either --client or --project must be specified")
}
if clientFlag != "" && projectFlag != "" {
return errors.New("cannot specify both --client and --project")
}
q := punchctx.GetDB(cmd.Context())
if q == nil {
return fmt.Errorf("database not available in context")
}
a := actions.New(q)
if clientFlag != "" {
client, err := a.FindClient(cmd.Context(), clientFlag)
if err != nil {
return fmt.Errorf("failed to find client: %w", err)
}
if err := a.ArchiveClient(cmd.Context(), client.ID); err != nil {
return fmt.Errorf("failed to archive client: %w", err)
}
cmd.Printf("Archived client: %s\n", client.Name)
} else {
project, err := a.FindProject(cmd.Context(), projectFlag)
if err != nil {
return fmt.Errorf("failed to find project: %w", err)
}
if err := a.ArchiveProject(cmd.Context(), project.ID); err != nil {
return fmt.Errorf("failed to archive project: %w", err)
}
cmd.Printf("Archived project: %s\n", project.Name)
}
return nil
},
}
cmd.Flags().StringVarP(&clientFlag, "client", "c", "", "Client name or ID")
cmd.Flags().StringVarP(&projectFlag, "project", "p", "", "Project name or ID")
return cmd
}
func NewUnarchiveCmd() *cobra.Command {
var clientFlag, projectFlag string
cmd := &cobra.Command{
Use: "unarchive",
Short: "Unarchive a client or project",
Long: `Unarchive a client or project to show it in the default view again.
Examples:
punch unarchive --client "Acme Corp"
punch unarchive --client 1
punch unarchive --project "Website Redesign"
punch unarchive --project 5`,
RunE: func(cmd *cobra.Command, args []string) error {
if clientFlag == "" && projectFlag == "" {
return errors.New("either --client or --project must be specified")
}
if clientFlag != "" && projectFlag != "" {
return errors.New("cannot specify both --client and --project")
}
q := punchctx.GetDB(cmd.Context())
if q == nil {
return fmt.Errorf("database not available in context")
}
a := actions.New(q)
if clientFlag != "" {
client, err := a.FindClient(cmd.Context(), clientFlag)
if err != nil {
return fmt.Errorf("failed to find client: %w", err)
}
if err := a.UnarchiveClient(cmd.Context(), client.ID); err != nil {
return fmt.Errorf("failed to unarchive client: %w", err)
}
cmd.Printf("Unarchived client: %s\n", client.Name)
} else {
project, err := a.FindProject(cmd.Context(), projectFlag)
if err != nil {
return fmt.Errorf("failed to find project: %w", err)
}
if err := a.UnarchiveProject(cmd.Context(), project.ID); err != nil {
return fmt.Errorf("failed to unarchive project: %w", err)
}
cmd.Printf("Unarchived project: %s\n", project.Name)
}
return nil
},
}
cmd.Flags().StringVarP(&clientFlag, "client", "c", "", "Client name or ID")
cmd.Flags().StringVarP(&projectFlag, "project", "p", "", "Project name or ID")
return cmd
}
|