Dan Anglin
3169d341d2
Change Status.Order to Status.Position, and the ByStatusOrder type to ByStatusPosition to make it clearer that status' are ordered by their position on the Kanban board.
119 lines
2.3 KiB
Go
119 lines
2.3 KiB
Go
package board
|
|
|
|
import (
|
|
"sort"
|
|
)
|
|
|
|
// Status represents the status of the Kanban board.
|
|
type Status struct {
|
|
ID int
|
|
Name string
|
|
CardIds []int
|
|
Position int
|
|
}
|
|
|
|
// UpdateID updates the ID of the Status value.
|
|
func (s *Status) UpdateId(id int) {
|
|
s.ID = id
|
|
}
|
|
|
|
// Id returns the ID of the Status value.
|
|
func (s *Status) Id() int {
|
|
return s.ID
|
|
}
|
|
|
|
// AddCardID adds a card ID to the status' list of card IDs.
|
|
func (s *Status) AddCardID(cardID int) {
|
|
// Create a new list if it does not exist
|
|
// and then return.
|
|
if s.CardIds == nil {
|
|
s.CardIds = []int{cardID}
|
|
|
|
return
|
|
}
|
|
|
|
// Sort list if not sorted.
|
|
if !sort.IntsAreSorted(s.CardIds) {
|
|
sort.Ints(s.CardIds)
|
|
}
|
|
|
|
// Get index of the card's ID if it already exists in the list.
|
|
// Return if it already exists in the list
|
|
ind := sort.SearchInts(s.CardIds, cardID)
|
|
|
|
if ind < len(s.CardIds) && cardID == s.CardIds[ind] {
|
|
return
|
|
}
|
|
|
|
s.CardIds = append(s.CardIds, cardID)
|
|
sort.Ints(s.CardIds)
|
|
}
|
|
|
|
// RemoveCardID removes a card ID from the status' list of card IDs.
|
|
func (s *Status) RemoveCardID(cardID int) {
|
|
if s.CardIds == nil {
|
|
return
|
|
}
|
|
|
|
// Sort list if not sorted.
|
|
if !sort.IntsAreSorted(s.CardIds) {
|
|
sort.Ints(s.CardIds)
|
|
}
|
|
|
|
// Get index of id.
|
|
// If the card ID is somehow not in the list, then ind
|
|
// will be the index where the id can be inserted.
|
|
ind := sort.SearchInts(s.CardIds, cardID)
|
|
|
|
if ind >= len(s.CardIds) || cardID != s.CardIds[ind] {
|
|
return
|
|
}
|
|
|
|
if len(s.CardIds) == 1 {
|
|
s.CardIds = nil
|
|
|
|
return
|
|
}
|
|
|
|
// use append to eliminate the id from the new slice
|
|
s.CardIds = append(s.CardIds[:ind], s.CardIds[ind+1:]...)
|
|
}
|
|
|
|
// ByStatusPosition implements sort.Interface for []Status based on the status' position on the Kanban board.
|
|
type ByStatusPosition []Status
|
|
|
|
func (s ByStatusPosition) Len() int {
|
|
return len(s)
|
|
}
|
|
|
|
func (s ByStatusPosition) Swap(i, j int) {
|
|
s[i], s[j] = s[j], s[i]
|
|
}
|
|
|
|
func (s ByStatusPosition) Less(i, j int) bool {
|
|
return s[i].Position < s[j].Position
|
|
}
|
|
|
|
// defaultStatusList returns the default list of statuses.
|
|
func defaultStatusList() []Status {
|
|
return []Status{
|
|
{
|
|
ID: -1,
|
|
Name: "To Do",
|
|
Position: 1,
|
|
CardIds: nil,
|
|
},
|
|
{
|
|
ID: -1,
|
|
Name: "Doing",
|
|
Position: 2,
|
|
CardIds: nil,
|
|
},
|
|
{
|
|
ID: -1,
|
|
Name: "Done",
|
|
Position: 3,
|
|
CardIds: nil,
|
|
},
|
|
}
|
|
}
|