diff --git a/handlers/application/administration.go b/handlers/application/administration.go index 1ea7ca0..15b4a58 100644 --- a/handlers/application/administration.go +++ b/handlers/application/administration.go @@ -6,6 +6,7 @@ import ( "net/http" groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi" + accounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi" "github.com/google/uuid" "github.com/gorilla/mux" "google.golang.org/protobuf/types/known/structpb" @@ -119,5 +120,88 @@ func (h *ApplicationHandler) AdministrationGroupDisplay(w http.ResponseWriter, r return } - h.Renderer.AdministrationGroupDisplay(w, r, resp.Group.ToStorageType()) + members, err := h.members() + if err != nil { + if err != nil { + fmt.Println(err) + w.WriteHeader(http.StatusInternalServerError) + return + } + } + + groupmembers := []any{} + admins := []any{} + + for _, m := range members { + mm := m.ToStorageType() + for _, g := range mm.Data["groups"].([]any) { + if g.(string) == groupid { + groupmembers = append(groupmembers, mm) + } + if g.(string) == groupid+":admin" { + admins = append(admins, mm) + } + } + } + + h.Renderer.AdministrationGroupDisplay(w, r, resp.Group.ToStorageType(), groupmembers, admins) +} + +func (h *ApplicationHandler) AdministrationGroupInviteAdmin(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + groupid := vars["groupid"] + + // groupresp, err := h.services.GRPC.GroupsManagement.GetGroup(&groupsmanagement.GetGroupRequest{ + // Id: groupid, + // Namespace: "parcoursmob_organizations", + // }) + + // if err != nil { + // fmt.Println(err) + // w.WriteHeader(http.StatusInternalServerError) + // return + // } + + r.ParseForm() + + accountresp, err := h.services.GRPC.MobilityAccounts.GetAccountUsername(context.TODO(), &accounts.GetAccountUsernameRequest{ + Username: r.FormValue("username"), + Namespace: "parcoursmob", + }) + + fmt.Println(err) + + if err == nil { + account := accountresp.Account.ToStorageType() + account.Data["groups"] = append(account.Data["groups"].([]any), groupid, groupid) + account.Data["groups"] = append(account.Data["groups"].([]any), groupid, groupid+":admin") + + as, _ := accounts.AccountFromStorageType(&account) + + _, err = h.services.GRPC.MobilityAccounts.UpdateData( + context.TODO(), + &accounts.UpdateDataRequest{ + Account: as, + }, + ) + + fmt.Println(err) + + http.Redirect(w, r, fmt.Sprintf("/app/administration/groups/%s", groupid), http.StatusFound) + return + } + + http.Redirect(w, r, fmt.Sprintf("/app/administration/groups/%s", groupid), http.StatusFound) + return +} + +func (h *ApplicationHandler) members() ([]*accounts.Account, error) { + resp, err := h.services.GRPC.MobilityAccounts.GetAccounts(context.TODO(), &accounts.GetAccountsRequest{ + Namespaces: []string{"parcoursmob"}, + }) + if err != nil { + return nil, err + } + + return resp.Accounts, nil } diff --git a/handlers/application/agenda.go b/handlers/application/agenda.go index f42fa6f..692c250 100644 --- a/handlers/application/agenda.go +++ b/handlers/application/agenda.go @@ -58,8 +58,6 @@ func (h *ApplicationHandler) AgendaHome(w http.ResponseWriter, r *http.Request) for _, e := range resp.Events { groupids = append(groupids, e.Owners...) responses = append(responses, e.ToStorageType()) - // fmt.Println(e) - // fmt.Println(e.ToStorageType()) } sort.Sort(EventsByStartdate(responses)) @@ -294,7 +292,7 @@ func parseEventsForm(r *http.Request) (*EventsForm, error) { return formData, nil } -func contains(s []string, e string) bool { +func contains[V string](s []V, e V) bool { for _, a := range s { if a == e { return true diff --git a/handlers/application/dashboard.go b/handlers/application/dashboard.go index addfaf5..e13fb85 100644 --- a/handlers/application/dashboard.go +++ b/handlers/application/dashboard.go @@ -4,8 +4,11 @@ import ( "context" "fmt" "net/http" + "sort" "git.coopgo.io/coopgo-apps/parcoursmob/utils/identification" + agenda "git.coopgo.io/coopgo-platform/agenda/grpcapi" + agendastorage "git.coopgo.io/coopgo-platform/agenda/storage" "git.coopgo.io/coopgo-platform/groups-management/storage" mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi" ) @@ -47,6 +50,27 @@ func (h *ApplicationHandler) Dashboard(w http.ResponseWriter, r *http.Request) { } } - h.Renderer.Dashboard(w, r, accounts, count) + members, err := h.members() + if err != nil { + fmt.Println(err) + w.WriteHeader(http.StatusInternalServerError) + return + } + + count_members := len(members) + + events := []agendastorage.Event{} + + eventsresp, err := h.services.GRPC.Agenda.GetEvents(context.TODO(), &agenda.GetEventsRequest{ + Namespaces: []string{"parcoursmob_dispositifs"}, + }) + + for _, e := range eventsresp.Events { + events = append(events, e.ToStorageType()) + } + + sort.Sort(EventsByStartdate(events)) + + h.Renderer.Dashboard(w, r, accounts, count, count_members, events) } diff --git a/main.go b/main.go index 94bba2f..583b132 100644 --- a/main.go +++ b/main.go @@ -91,6 +91,7 @@ func main() { appAdmin.HandleFunc("/", applicationHandler.Administration) appAdmin.HandleFunc("/groups/", applicationHandler.AdministrationCreateGroup) appAdmin.HandleFunc("/groups/{groupid}", applicationHandler.AdministrationGroupDisplay) + appAdmin.HandleFunc("/groups/{groupid}/invite-admin", applicationHandler.AdministrationGroupInviteAdmin) //TODO Secure with Middleware checking for modules fmt.Println("-> HTTP server listening on", address) diff --git a/renderer/administration.go b/renderer/administration.go index 8fb4342..9aa09c4 100644 --- a/renderer/administration.go +++ b/renderer/administration.go @@ -21,11 +21,13 @@ func (renderer *Renderer) AdministrationCreateGroup(w http.ResponseWriter, r *ht renderer.Render("administration", w, r, files, state) } -func (renderer *Renderer) AdministrationGroupDisplay(w http.ResponseWriter, r *http.Request, group any) { +func (renderer *Renderer) AdministrationGroupDisplay(w http.ResponseWriter, r *http.Request, group any, groupmembers []any, admins []any) { files := renderer.ThemeConfig.GetStringSlice("views.administration.display_group.files") state := NewState(r, renderer.ThemeConfig, administrationMenu) state.ViewState = map[string]any{ - "group": group, + "group": group, + "members": groupmembers, + "admins": admins, } renderer.Render("administration", w, r, files, state) diff --git a/renderer/dashboard.go b/renderer/dashboard.go index 31ad9a8..cd88997 100644 --- a/renderer/dashboard.go +++ b/renderer/dashboard.go @@ -2,11 +2,13 @@ package renderer import ( "net/http" + + agendastorage "git.coopgo.io/coopgo-platform/agenda/storage" ) const dashboardMenu = "dashboard" -func (renderer *Renderer) Dashboard(w http.ResponseWriter, r *http.Request, accounts []any, nbaccounts int) { +func (renderer *Renderer) Dashboard(w http.ResponseWriter, r *http.Request, accounts []any, nbaccounts int, count_members int, events []agendastorage.Event) { files := renderer.ThemeConfig.GetStringSlice("views.dashboard.files") state := NewState(r, renderer.ThemeConfig, dashboardMenu) state.ViewState = map[string]any{ @@ -14,6 +16,8 @@ func (renderer *Renderer) Dashboard(w http.ResponseWriter, r *http.Request, acco "count": nbaccounts, "latest": accounts, }, + "count_members": count_members, + "events": events, } renderer.Render("dashboard", w, r, files, state) diff --git a/themes/default/config.yaml b/themes/default/config.yaml index 5c6fbf0..5bfc77c 100644 --- a/themes/default/config.yaml +++ b/themes/default/config.yaml @@ -7,6 +7,7 @@ views: - layouts/_partials/mainmenu.html dashboard: files: + - layouts/dashboard/_partials/agenda-widget.html - layouts/dashboard/_partials/beneficiaries-widget.html - layouts/dashboard/dashboard.html beneficiaries: diff --git a/themes/default/layouts/administration/_partials/groups_admins.html b/themes/default/layouts/administration/_partials/groups_admins.html index 34040cc..2344667 100644 --- a/themes/default/layouts/administration/_partials/groups_admins.html +++ b/themes/default/layouts/administration/_partials/groups_admins.html @@ -4,34 +4,57 @@
{{(timeFrom .Startdate).Format "02/01"}} - {{.Type}} - {{.Name}}
+