parent
8fbdffc965
commit
45b220c69f
|
@ -102,6 +102,23 @@ func (s *HolidayService) Delete(id uuid.UUID) error {
|
|||
return err
|
||||
}
|
||||
|
||||
func (s *HolidayService) Copy(country string, from int, to int) error {
|
||||
holidays, err := s.findByYear(from, nil, nil, country)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var diff = to - from
|
||||
|
||||
for _, holiday := range holidays {
|
||||
holiday.Date = holiday.Date.AddDate(diff, 0, 0)
|
||||
_, err := s.Create(holiday)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func getDateOrDefault(date *time.Time, year int) time.Time {
|
||||
if date == nil {
|
||||
return time.Date(year, 1, 1, 0, 0, 0, 0, time.UTC)
|
||||
|
|
29
main.go
29
main.go
|
@ -110,6 +110,8 @@ func loadTemplates(g *gin.Engine) {
|
|||
"templates/admin_dashboard.gohtml",
|
||||
"templates/countries.gohtml",
|
||||
|
||||
"templates/dialogs/copy-year.gohtml",
|
||||
|
||||
"templates/dialogs/add-holiday.gohtml",
|
||||
"templates/dialogs/edit-holiday.gohtml",
|
||||
"templates/dialogs/delete-holiday.gohtml",
|
||||
|
@ -189,6 +191,24 @@ func setupAdminDashboard(adminDashboard *gin.RouterGroup, service holiday.Holida
|
|||
c.Redirect(http.StatusSeeOther, "/admin?country="+request.Country+"&year="+strconv.FormatInt(int64(request.Date.Year()), 10))
|
||||
}
|
||||
})
|
||||
adminDashboard.POST("/holidays/copy", func(c *gin.Context) {
|
||||
request := struct {
|
||||
From int `form:"from"`
|
||||
To int `form:"to"`
|
||||
Country string `form:"country" binding:"len=2"`
|
||||
}{}
|
||||
if err := c.ShouldBind(&request); err != nil {
|
||||
c.AbortWithError(http.StatusBadRequest, err)
|
||||
return
|
||||
}
|
||||
|
||||
err := service.Copy(request.Country, request.From, request.To)
|
||||
if err != nil {
|
||||
c.AbortWithError(http.StatusInternalServerError, err)
|
||||
} else {
|
||||
c.Redirect(http.StatusSeeOther, "/admin?country="+request.Country+"&year="+strconv.FormatInt(int64(request.To), 10))
|
||||
}
|
||||
})
|
||||
adminDashboard.POST("/holidays/:id/delete", func(c *gin.Context) {
|
||||
id := uuid.MustParse(c.Param("id"))
|
||||
hol, err := service.FindById(id)
|
||||
|
@ -266,6 +286,15 @@ func setupAdminDashboard(adminDashboard *gin.RouterGroup, service holiday.Holida
|
|||
countries, _ := countryService.Find()
|
||||
c.HTML(http.StatusOK, "edit-holiday.gohtml", gin.H{"Countries": countries, "Holiday": hol})
|
||||
})
|
||||
adminDashboard.GET("/dialogs/copy-year", func(c *gin.Context) {
|
||||
country := c.Query("country")
|
||||
year, err := strconv.ParseInt(c.Query("year"), 10, 32)
|
||||
if err != nil {
|
||||
c.AbortWithError(http.StatusNotFound, err)
|
||||
return
|
||||
}
|
||||
c.HTML(http.StatusOK, "copy-year.gohtml", gin.H{"Country": country, "Year": year})
|
||||
})
|
||||
adminDashboard.GET("/dialogs/edit-country", func(c *gin.Context) {
|
||||
id := uuid.MustParse(c.Query("id"))
|
||||
country, err := countryService.FindById(id)
|
||||
|
|
2
makefile
2
makefile
|
@ -1,7 +1,7 @@
|
|||
# scripts for building app
|
||||
# requires go 1.19+ and git installed
|
||||
|
||||
VERSION := 0.4.0
|
||||
VERSION := 0.5.0
|
||||
|
||||
serve:
|
||||
go run ./...
|
||||
|
|
|
@ -64,8 +64,11 @@
|
|||
</div>
|
||||
|
||||
<div style="flex-grow: 1; background: transparent">
|
||||
<button style="float: right; margin-top: 0" data-type="dialog" data-trigger="#create-card" data-url="/admin/dialogs/add-holiday" class="primary">Dodaj novi praznik</button>
|
||||
<section class="dialog table-results" style="margin: 0; margin-top: 3.5em" id="results">
|
||||
<div style="display: flex; flex-direction: row; flex-wrap: wrap; justify-content: end; background: transparent; gap: 0.5em">
|
||||
<button data-type="dialog" data-trigger="#copy-year" data-url="/admin/dialogs/copy-year?year={{$.Search.Year}}&country={{$.Search.Country}}" class="secondary">Kopiraj godinu</button>
|
||||
<button data-type="dialog" data-trigger="#create-card" data-url="/admin/dialogs/add-holiday" class="primary">Dodaj novi praznik</button>
|
||||
</div>
|
||||
<section class="dialog table-results" style="margin: 0; margin-top: 0.5em" id="results">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
|
|
|
@ -17,8 +17,10 @@
|
|||
</header>
|
||||
<main class="admin-dashboard">
|
||||
<div style="width: 640px; max-width: 100%; margin: auto; background: transparent">
|
||||
<button style="float: right; margin-top: 0" data-type="dialog" data-trigger="#create-card" data-url="/admin/dialogs/add-country" class="primary">Dodaj državu</button>
|
||||
<section class="dialog table-results" style="margin: 0; margin-top: 3.5em" id="results">
|
||||
<div style="display: flex; flex-direction: row; flex-wrap: wrap; justify-content: end; background: transparent">
|
||||
<button style="float: right; margin-top: 0" data-type="dialog" data-trigger="#create-card" data-url="/admin/dialogs/add-country" class="primary">Dodaj državu</button>
|
||||
</div>
|
||||
<section class="dialog table-results" style="margin: 0; margin-top: 0.5em" id="results">
|
||||
<table style="width: 100%">
|
||||
<thead>
|
||||
<tr>
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
|
||||
<dialog class="card" id="copy-year">
|
||||
<h3 class="card-title">Kopiraj godinu {{.Year}}</h3>
|
||||
|
||||
<p>Na koji godinu želite kopirati praznike iz godine {{.Year}}?</p>
|
||||
<form method="post" action="/admin/holidays/copy">
|
||||
<input type="hidden" name="from" value="{{.Year}}">
|
||||
<input type="hidden" name="country" value="{{.Country}}">
|
||||
<section class="form-field">
|
||||
<label for="to">Godina:</label>
|
||||
<input required id="to" name="to" type="number" step="1">
|
||||
</section>
|
||||
<section class="actions">
|
||||
<button class="primary" type="submit">Kopiraj</button>
|
||||
<button class="secondary" type="button" onclick="closeDialog('#copy-year')">Odustani</button>
|
||||
</section>
|
||||
</form>
|
||||
</dialog>
|
Loading…
Reference in New Issue