From 23f4603dec67581937a9022658a24a58c51feca5 Mon Sep 17 00:00:00 2001 From: Arnaud Delcasse Date: Tue, 6 Sep 2022 15:02:59 +0200 Subject: [PATCH] Agenda improvements --- handlers/application/administration.go | 86 +++++++- handlers/application/agenda.go | 4 +- handlers/application/dashboard.go | 26 ++- main.go | 1 + renderer/administration.go | 6 +- renderer/dashboard.go | 6 +- themes/default/config.yaml | 1 + .../_partials/groups_admins.html | 47 +++-- .../dashboard/_partials/agenda-widget.html | 29 +++ .../default/layouts/dashboard/dashboard.html | 5 +- themes/default/layouts/layout.html | 3 +- .../layouts/vehicles/booking-display.html | 8 +- .../vehicles_management/booking-display.html | 8 +- themes/default/public/css/main.css | 192 ++++++++---------- 14 files changed, 285 insertions(+), 137 deletions(-) create mode 100644 themes/default/layouts/dashboard/_partials/agenda-widget.html 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 @@

Administrateurs

- + + {{range .ViewState.admins}} - - + {{end}}
-
-

Ajouter

-
+ +
+
-
- + -
+
+ + {{end}} \ No newline at end of file diff --git a/themes/default/layouts/dashboard/_partials/agenda-widget.html b/themes/default/layouts/dashboard/_partials/agenda-widget.html new file mode 100644 index 0000000..c63ce4b --- /dev/null +++ b/themes/default/layouts/dashboard/_partials/agenda-widget.html @@ -0,0 +1,29 @@ +{{define "agenda_widget"}} +
+
+
+

Prochains dispositifs

+
+ +
+ + + + + +
+{{end}} \ No newline at end of file diff --git a/themes/default/layouts/dashboard/dashboard.html b/themes/default/layouts/dashboard/dashboard.html index 331c9df..10c1e7f 100644 --- a/themes/default/layouts/dashboard/dashboard.html +++ b/themes/default/layouts/dashboard/dashboard.html @@ -57,7 +57,7 @@ class="flex-1 flex items-center justify-between border-t border-r border-b border-gray-200 bg-white rounded-r-3xl truncate">
Référents -

53 membres

+

{{.ViewState.count_members}} membres

@@ -68,7 +68,8 @@
- {{template "beneficiaries_widget" .ViewState.beneficiaries}} + {{template "beneficiaries_widget" .ViewState.beneficiaries}} + {{template "agenda_widget" .ViewState.events}}
diff --git a/themes/default/layouts/layout.html b/themes/default/layouts/layout.html index f2d3425..21d534b 100644 --- a/themes/default/layouts/layout.html +++ b/themes/default/layouts/layout.html @@ -130,7 +130,8 @@
- - +
diff --git a/themes/default/layouts/vehicles_management/booking-display.html b/themes/default/layouts/vehicles_management/booking-display.html index 8c40277..995544e 100644 --- a/themes/default/layouts/vehicles_management/booking-display.html +++ b/themes/default/layouts/vehicles_management/booking-display.html @@ -6,7 +6,7 @@

-
+
@@ -85,8 +85,8 @@ class="relative inline-flex items-center px-4 py-2 border border-transparent shadow-sm text-xs font-medium rounded-2xl text-co-blue bg-gray-100 hover:bg-co-blue hover:text-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-co-blue">SMS - +
diff --git a/themes/default/public/css/main.css b/themes/default/public/css/main.css index d445bc0..274cdee 100644 --- a/themes/default/public/css/main.css +++ b/themes/default/public/css/main.css @@ -846,6 +846,11 @@ html { margin-bottom: 1rem; } +.my-8 { + margin-top: 2rem; + margin-bottom: 2rem; +} + .-my-1\.5 { margin-top: -0.375rem; margin-bottom: -0.375rem; @@ -856,11 +861,6 @@ html { margin-bottom: -0.25rem; } -.my-8 { - margin-top: 2rem; - margin-bottom: 2rem; -} - .-mr-12 { margin-right: -3rem; } @@ -929,6 +929,18 @@ html { margin-left: 1.25rem; } +.ml-2 { + margin-left: 0.5rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.mr-2 { + margin-right: 0.5rem; +} + .ml-6 { margin-left: 1.5rem; } @@ -945,10 +957,6 @@ html { margin-top: -1rem; } -.mb-4 { - margin-bottom: 1rem; -} - .-mt-2 { margin-top: -0.5rem; } @@ -957,30 +965,10 @@ html { margin-right: -0.375rem; } -.ml-2 { - margin-left: 0.5rem; -} - .-mr-1 { margin-right: -0.25rem; } -.mr-2 { - margin-right: 0.5rem; -} - -.mr-0 { - margin-right: 0px; -} - -.mt-16 { - margin-top: 4rem; -} - -.mt-12 { - margin-top: 3rem; -} - .block { display: block; } @@ -1097,14 +1085,14 @@ html { width: 4rem; } -.w-12 { - width: 3rem; -} - .w-11 { width: 2.75rem; } +.w-12 { + width: 3rem; +} + .min-w-0 { min-width: 0px; } @@ -1438,6 +1426,16 @@ html { border-bottom-right-radius: 1.5rem; } +.rounded-l-2xl { + border-top-left-radius: 1rem; + border-bottom-left-radius: 1rem; +} + +.rounded-r-2xl { + border-top-right-radius: 1rem; + border-bottom-right-radius: 1rem; +} + .rounded-l-md { border-top-left-radius: 0.375rem; border-bottom-left-radius: 0.375rem; @@ -1448,16 +1446,6 @@ html { border-bottom-right-radius: 0.375rem; } -.rounded-r-2xl { - border-top-right-radius: 1rem; - border-bottom-right-radius: 1rem; -} - -.rounded-l-2xl { - border-top-left-radius: 1rem; - border-bottom-left-radius: 1rem; -} - .rounded-b-2xl { border-bottom-right-radius: 1rem; border-bottom-left-radius: 1rem; @@ -1555,6 +1543,11 @@ html { background-color: rgb(255 221 0 / var(--tw-bg-opacity)); } +.bg-gray-200 { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)); +} + .bg-gray-50 { --tw-bg-opacity: 1; background-color: rgb(249 250 251 / var(--tw-bg-opacity)); @@ -1580,33 +1573,28 @@ html { background-color: rgb(17 24 39 / var(--tw-bg-opacity)); } -.bg-gray-200 { - --tw-bg-opacity: 1; - background-color: rgb(229 231 235 / var(--tw-bg-opacity)); -} - .bg-opacity-75 { --tw-bg-opacity: 0.75; } -.p-4 { - padding: 1rem; -} - .p-12 { padding: 3rem; } +.p-1 { + padding: 0.25rem; +} + .p-2 { padding: 0.5rem; } -.p-1\.5 { - padding: 0.375rem; +.p-4 { + padding: 1rem; } -.p-1 { - padding: 0.25rem; +.p-1\.5 { + padding: 0.375rem; } .px-4 { @@ -1649,21 +1637,11 @@ html { padding-bottom: 1rem; } -.py-12 { - padding-top: 3rem; - padding-bottom: 3rem; -} - .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; } -.px-1 { - padding-left: 0.25rem; - padding-right: 0.25rem; -} - .py-3\.5 { padding-top: 0.875rem; padding-bottom: 0.875rem; @@ -1674,6 +1652,16 @@ html { padding-bottom: 0.75rem; } +.py-12 { + padding-top: 3rem; + padding-bottom: 3rem; +} + +.px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} + .py-8 { padding-top: 2rem; padding-bottom: 2rem; @@ -1712,24 +1700,24 @@ html { padding-right: 2.25rem; } -.pl-1 { - padding-left: 0.25rem; -} - -.pr-10 { - padding-right: 2.5rem; -} - -.pl-4 { - padding-left: 1rem; +.pr-12 { + padding-right: 3rem; } .pr-4 { padding-right: 1rem; } -.pr-12 { - padding-right: 3rem; +.pl-4 { + padding-left: 1rem; +} + +.pl-1 { + padding-left: 0.25rem; +} + +.pr-10 { + padding-right: 2.5rem; } .pt-8 { @@ -1744,10 +1732,6 @@ html { padding-left: 0.375rem; } -.pb-1 { - padding-bottom: 0.25rem; -} - .text-left { text-align: left; } @@ -1760,10 +1744,6 @@ html { text-align: right; } -.text-justify { - text-align: justify; -} - .align-middle { vertical-align: middle; } @@ -2122,6 +2102,11 @@ html { color: rgb(75 85 99 / var(--tw-text-opacity)); } +.hover\:text-co-blue:hover { + --tw-text-opacity: 1; + color: rgb(36 56 135 / var(--tw-text-opacity)); +} + .hover\:text-white:hover { --tw-text-opacity: 1; color: rgb(255 255 255 / var(--tw-text-opacity)); @@ -2132,11 +2117,6 @@ html { color: rgb(55 65 81 / var(--tw-text-opacity)); } -.hover\:text-co-blue:hover { - --tw-text-opacity: 1; - color: rgb(36 56 135 / var(--tw-text-opacity)); -} - .hover\:text-gray-900:hover { --tw-text-opacity: 1; color: rgb(17 24 39 / var(--tw-text-opacity)); @@ -2255,25 +2235,20 @@ html { grid-column: span 3 / span 3; } - .sm\:col-span-4 { - grid-column: span 4 / span 4; - } - - .sm\:col-span-2 { - grid-column: span 2 / span 2; + .sm\:col-span-6 { + grid-column: span 6 / span 6; } .sm\:col-span-1 { grid-column: span 1 / span 1; } - .sm\:col-span-6 { - grid-column: span 6 / span 6; + .sm\:col-span-2 { + grid-column: span 2 / span 2; } - .sm\:mx-auto { - margin-left: auto; - margin-right: auto; + .sm\:col-span-4 { + grid-column: span 4 / span 4; } .sm\:-mx-6 { @@ -2281,6 +2256,11 @@ html { margin-right: -1.5rem; } + .sm\:mx-auto { + margin-left: auto; + margin-right: auto; + } + .sm\:mt-0 { margin-top: 0px; } @@ -2317,14 +2297,14 @@ html { width: 100%; } - .sm\:max-w-md { - max-width: 28rem; - } - .sm\:max-w-xs { max-width: 20rem; } + .sm\:max-w-md { + max-width: 28rem; + } + .sm\:flex-auto { flex: 1 1 auto; }