Version 8 #43
| @ -8,7 +8,7 @@ open PrayerTracker.ViewModels | ||||
| let edit (m : EditChurch) ctx vi = | ||||
|     let pageTitle = match m.IsNew with true -> "Add a New Church" | false -> "Edit Church" | ||||
|     let s         = I18N.localizer.Force () | ||||
|     [ form [ _action "/web/church/save"; _method "post"; _class "pt-center-columns" ] [ | ||||
|     [ form [ _action "/church/save"; _method "post"; _class "pt-center-columns" ] [ | ||||
|         style [ _scoped ] [ | ||||
|             rawText "#name { width: 20rem; } #city { width: 10rem; } #st { width: 3rem; } #interfaceAddress { width: 30rem; }" | ||||
|         ] | ||||
| @ -82,12 +82,12 @@ let maintain (churches : Church list) (stats : Map<string, ChurchStats>) ctx vi | ||||
|                 churches | ||||
|                 |> List.map (fun ch -> | ||||
|                     let chId      = flatGuid ch.churchId | ||||
|                     let delAction = $"/web/church/{chId}/delete" | ||||
|                     let delAction = $"/church/{chId}/delete" | ||||
|                     let delPrompt = s["Are you sure you want to delete this {0}?  This action cannot be undone.", | ||||
|                                       $"""{s["Church"].Value.ToLower ()} ({ch.name})"""] | ||||
|                     tr [] [ | ||||
|                         td [] [ | ||||
|                           a [ _href $"/web/church/{chId}/edit"; _title s["Edit This Church"].Value ] [ icon "edit" ] | ||||
|                           a [ _href $"/church/{chId}/edit"; _title s["Edit This Church"].Value ] [ icon "edit" ] | ||||
|                           a [ _href delAction | ||||
|                               _title s["Delete This Church"].Value | ||||
|                               _onclick $"return PT.confirmDelete('{delAction}','{delPrompt}')" ] | ||||
| @ -104,7 +104,7 @@ let maintain (churches : Church list) (stats : Map<string, ChurchStats>) ctx vi | ||||
|             ] | ||||
|     [ div [ _class "pt-center-text" ] [ | ||||
|         br [] | ||||
|         a [ _href $"/web/church/{emptyGuid}/edit"; _title s["Add a New Church"].Value ] | ||||
|         a [ _href $"/church/{emptyGuid}/edit"; _title s["Add a New Church"].Value ] | ||||
|           [ icon "add_circle"; rawText "  "; locStr s["Add a New Church"] ] | ||||
|         br [] | ||||
|         br [] | ||||
|  | ||||
| @ -202,7 +202,7 @@ let termsOfService vi = | ||||
|     use sw     = new StringWriter () | ||||
|     let raw    = rawLocText sw | ||||
|     let ppLink = | ||||
|         a [ _href "/web/legal/privacy-policy" ] [ str (s["Privacy Policy"].Value.ToLower ()) ] | ||||
|         a [ _href "/legal/privacy-policy" ] [ str (s["Privacy Policy"].Value.ToLower ()) ] | ||||
|         |> renderHtmlString | ||||
| 
 | ||||
|     [ p [ _class "pt-right-text" ] [ small [] [ em [] [ raw l["(as of May 24, 2018)"] ] ] ] | ||||
|  | ||||
| @ -23,22 +23,25 @@ module Navigation = | ||||
|             match m.User with | ||||
|             | Some u -> | ||||
|                 li [ _class "dropdown" ] [ | ||||
|                     a [ _class "dropbtn"; _role "button"; _aria "label" s["Requests"].Value; _title s["Requests"].Value ] | ||||
|                     a [ _class "dropbtn" | ||||
|                         _role "button" | ||||
|                         _aria "label" s["Requests"].Value | ||||
|                         _title s["Requests"].Value ] | ||||
|                       [ icon "question_answer"; space; locStr s["Requests"]; space; icon "keyboard_arrow_down" ] | ||||
|                     div [ _class "dropdown-content"; _role "menu" ] [ | ||||
|                         a [ _href "/web/prayer-requests" ] [ icon "compare_arrows"; menuSpacer; locStr s["Maintain"] ] | ||||
|                         a [ _href "/web/prayer-requests/view" ] [ icon "list"; menuSpacer; locStr s["View List"] ] | ||||
|                         a [ _href "/prayer-requests" ] [ icon "compare_arrows"; menuSpacer; locStr s["Maintain"] ] | ||||
|                         a [ _href "/prayer-requests/view" ] [ icon "list"; menuSpacer; locStr s["View List"] ] | ||||
|                     ] | ||||
|                 ] | ||||
|                 li [ _class "dropdown" ] [ | ||||
|                     a [ _class "dropbtn"; _role "button"; _aria "label" s["Group"].Value; _title s["Group"].Value ] | ||||
|                       [ icon "group"; space; locStr s["Group"]; space; icon "keyboard_arrow_down" ] | ||||
|                     div [ _class "dropdown-content"; _role "menu" ] [ | ||||
|                         a [ _href "/web/small-group/members" ] | ||||
|                         a [ _href "/small-group/members" ] | ||||
|                           [ icon "email"; menuSpacer; locStr s["Maintain Group Members"] ] | ||||
|                         a [ _href "/web/small-group/announcement" ] | ||||
|                         a [ _href "/small-group/announcement" ] | ||||
|                           [ icon "send";  menuSpacer; locStr s["Send Announcement"] ] | ||||
|                         a [ _href "/web/small-group/preferences" ] | ||||
|                         a [ _href "/small-group/preferences" ] | ||||
|                           [ icon "build"; menuSpacer; locStr s["Change Preferences"] ] | ||||
|                     ] | ||||
|                 ] | ||||
| @ -50,16 +53,16 @@ module Navigation = | ||||
|                             _title s["Administration"].Value | ||||
|                           ] [ icon "settings"; space; locStr s["Administration"]; space; icon "keyboard_arrow_down" ] | ||||
|                         div [ _class "dropdown-content"; _role "menu" ] [ | ||||
|                             a [ _href "/web/churches" ]     [ icon "home";  menuSpacer; locStr s["Churches"] ] | ||||
|                             a [ _href "/web/small-groups" ] [ icon "send";  menuSpacer; locStr s["Groups"] ] | ||||
|                             a [ _href "/web/users" ]        [ icon "build"; menuSpacer; locStr s["Users"] ] | ||||
|                             a [ _href "/churches" ]     [ icon "home";  menuSpacer; locStr s["Churches"] ] | ||||
|                             a [ _href "/small-groups" ] [ icon "send";  menuSpacer; locStr s["Groups"] ] | ||||
|                             a [ _href "/users" ]        [ icon "build"; menuSpacer; locStr s["Users"] ] | ||||
|                         ] | ||||
|                     ] | ||||
|             | None -> | ||||
|                 match m.Group with | ||||
|                 | Some _ -> | ||||
|                     li [] [ | ||||
|                         a [ _href "/web/prayer-requests/view" | ||||
|                         a [ _href "/prayer-requests/view" | ||||
|                             _aria "label" s["View Request List"].Value | ||||
|                             _title s["View Request List"].Value | ||||
|                           ] [ icon "list"; space; locStr s["View Request List"] ] | ||||
| @ -72,12 +75,12 @@ module Navigation = | ||||
|                             _title s["Log On"].Value | ||||
|                           ] [ icon "security"; space; locStr s["Log On"]; space; icon "keyboard_arrow_down" ] | ||||
|                         div [ _class "dropdown-content"; _role "menu" ] [ | ||||
|                             a [ _href "/web/user/log-on" ]        [ icon "person"; menuSpacer; locStr s["User"] ] | ||||
|                             a [ _href "/web/small-group/log-on" ] [ icon "group";  menuSpacer; locStr s["Group"] ] | ||||
|                             a [ _href "/user/log-on" ]        [ icon "person"; menuSpacer; locStr s["User"] ] | ||||
|                             a [ _href "/small-group/log-on" ] [ icon "group";  menuSpacer; locStr s["Group"] ] | ||||
|                         ] | ||||
|                     ] | ||||
|                     li [] [ | ||||
|                         a [ _href "/web/prayer-requests/lists" | ||||
|                         a [ _href "/prayer-requests/lists" | ||||
|                             _aria "label" s["View Request List"].Value | ||||
|                             _title s["View Request List"].Value | ||||
|                           ] [ icon "list"; space; locStr s["View Request List"] ] | ||||
| @ -96,14 +99,14 @@ module Navigation = | ||||
|                 match m.User with | ||||
|                 | Some _ -> | ||||
|                     li [] [ | ||||
|                         a [ _href "/web/user/password" | ||||
|                         a [ _href "/user/password" | ||||
|                             _aria "label" s["Change Your Password"].Value | ||||
|                             _title s["Change Your Password"].Value | ||||
|                           ] [ icon "lock"; space; locStr s["Change Your Password"] ] | ||||
|                     ] | ||||
|                 | None -> () | ||||
|                 li [] [ | ||||
|                     a [ _href "/web/log-off"; _aria "label" s["Log Off"].Value; _title s["Log Off"].Value ] | ||||
|                     a [ _href "/log-off"; _aria "label" s["Log Off"].Value; _title s["Log Off"].Value ] | ||||
|                       [ icon "power_settings_new"; space; locStr s["Log Off"] ] | ||||
|                 ] | ||||
|               ] | ||||
| @ -111,7 +114,7 @@ module Navigation = | ||||
|         header [ _class "pt-title-bar" ] [ | ||||
|             section [ _class "pt-title-bar-left" ] [ | ||||
|                 span [ _class "pt-title-bar-home" ] [ | ||||
|                     a [ _href "/web/"; _title s["Home"].Value ] [ locStr s["PrayerTracker"] ] | ||||
|                     a [ _href "/"; _title s["Home"].Value ] [ locStr s["PrayerTracker"] ] | ||||
|                 ] | ||||
|                 ul [] leftLinks | ||||
|             ] | ||||
| @ -131,11 +134,11 @@ module Navigation = | ||||
|                 | "es" ->  | ||||
|                     locStr s["Spanish"] | ||||
|                     rawText "   •   " | ||||
|                     a [ _href "/web/language/en" ] [ locStr s["Change to English"] ] | ||||
|                     a [ _href "/language/en" ] [ locStr s["Change to English"] ] | ||||
|                 | _ -> | ||||
|                     locStr s["English"] | ||||
|                     rawText "   •   " | ||||
|                     a [ _href "/web/language/es" ] [ locStr s["Cambie a Español"] ] | ||||
|                     a [ _href "/language/es" ] [ locStr s["Cambie a Español"] ] | ||||
|             ] | ||||
|             match m.Group with | ||||
|             | Some g ->[ | ||||
| @ -152,7 +155,7 @@ module Navigation = | ||||
|                 icon "group" | ||||
|                 space | ||||
|                 match m.User with | ||||
|                 | Some _ -> a [ _href "/web/small-group" ] [ strong [] [ str g.name ] ] | ||||
|                 | Some _ -> a [ _href "/small-group" ] [ strong [] [ str g.name ] ] | ||||
|                 | None -> strong [] [ str g.name ] | ||||
|                 rawText "  " | ||||
|               ] | ||||
| @ -241,9 +244,9 @@ let private htmlFooter m = | ||||
|     let resultTime = TimeSpan(DateTime.Now.Ticks - m.RequestStart).TotalSeconds | ||||
|     footer [] [ | ||||
|         div [ _id "pt-legal" ] [ | ||||
|             a [ _href "/web/legal/privacy-policy" ] [ locStr s["Privacy Policy"] ] | ||||
|             a [ _href "/legal/privacy-policy" ] [ locStr s["Privacy Policy"] ] | ||||
|             rawText " • " | ||||
|             a [ _href "/web/legal/terms-of-service" ] [ locStr s["Terms of Service"] ] | ||||
|             a [ _href "/legal/terms-of-service" ] [ locStr s["Terms of Service"] ] | ||||
|             rawText " • " | ||||
|             a [ _href "https://github.com/bit-badger/PrayerTracker" | ||||
|                 _title s["View source code and get technical support"].Value | ||||
| @ -253,7 +256,7 @@ let private htmlFooter m = | ||||
|             ] | ||||
|         ] | ||||
|         div [ _id "pt-footer" ] [ | ||||
|             a [ _href "/web/"; _style "line-height:28px;" ] | ||||
|             a [ _href "/"; _style "line-height:28px;" ] | ||||
|               [ img [ _src $"""/img/%O{s["footer_en"]}.png"""; _alt imgText; _title imgText ] ] | ||||
|             str m.Version | ||||
|             space | ||||
|  | ||||
| @ -14,7 +14,7 @@ open PrayerTracker.ViewModels | ||||
| let edit (m : EditRequest) today ctx vi = | ||||
|     let s         = I18N.localizer.Force () | ||||
|     let pageTitle = if m.IsNew then "Add a New Request" else "Edit Request" | ||||
|     [ form [ _action "/web/prayer-request/save"; _method "post"; _class "pt-center-columns" ] [ | ||||
|     [ form [ _action "/prayer-request/save"; _method "post"; _class "pt-center-columns" ] [ | ||||
|         csrfToken ctx | ||||
|         input [ _type "hidden"; _name (nameof m.RequestId); _value (flatGuid m.RequestId) ] | ||||
|         div [ _class "pt-field-row" ] [ | ||||
| @ -137,10 +137,9 @@ let lists (groups : SmallGroup list) vi = | ||||
|                   let grpId = flatGuid grp.smallGroupId | ||||
|                   tr [] [ | ||||
|                       if grp.preferences.isPublic then | ||||
|                           a [ _href $"/web/prayer-requests/{grpId}/list"; _title s["View"].Value ] [ icon "list" ] | ||||
|                           a [ _href $"/prayer-requests/{grpId}/list"; _title s["View"].Value ] [ icon "list" ] | ||||
|                       else | ||||
|                           a [ _href $"/web/small-group/log-on/{grpId}"; _title s["Log On"].Value ] | ||||
|                             [ icon "verified_user" ] | ||||
|                           a [ _href $"/small-group/log-on/{grpId}"; _title s["Log On"].Value ] [ icon "verified_user" ] | ||||
|                       |> List.singleton | ||||
|                       |> td [] | ||||
|                       td [] [ str grp.church.name ] | ||||
| @ -174,7 +173,7 @@ let maintain (m : MaintainRequests) (ctx : HttpContext) vi = | ||||
|         |> List.map (fun req -> | ||||
|             let reqId     = flatGuid req.prayerRequestId | ||||
|             let reqText   = htmlToPlainText req.text | ||||
|             let delAction = $"/web/prayer-request/{reqId}/delete" | ||||
|             let delAction = $"/prayer-request/{reqId}/delete" | ||||
|             let delPrompt = | ||||
|                 [ s["Are you sure you want to delete this {0}?  This action cannot be undone.", | ||||
|                     s["Prayer Request"].Value.ToLower() ].Value | ||||
| @ -185,14 +184,14 @@ let maintain (m : MaintainRequests) (ctx : HttpContext) vi = | ||||
|                 |> String.concat "" | ||||
|             tr [] [ | ||||
|                 td [] [ | ||||
|                     a [ _href $"/web/prayer-request/{reqId}/edit"; _title l["Edit This Prayer Request"].Value ] | ||||
|                     a [ _href $"/prayer-request/{reqId}/edit"; _title l["Edit This Prayer Request"].Value ] | ||||
|                       [ icon "edit" ] | ||||
|                     if req.isExpired now m.SmallGroup.preferences.daysToExpire then | ||||
|                         a [ _href $"/web/prayer-request/{reqId}/restore" | ||||
|                         a [ _href $"/prayer-request/{reqId}/restore" | ||||
|                             _title l["Restore This Inactive Request"].Value ] | ||||
|                           [ icon "visibility" ] | ||||
|                     else | ||||
|                         a [ _href $"/web/prayer-request/{reqId}/expire" | ||||
|                         a [ _href $"/prayer-request/{reqId}/expire" | ||||
|                             _title l["Expire This Request Immediately"].Value ] | ||||
|                           [ icon "visibility_off" ] | ||||
|                     a [ _href delAction; _title l["Delete This Request"].Value; | ||||
| @ -213,19 +212,19 @@ let maintain (m : MaintainRequests) (ctx : HttpContext) vi = | ||||
|         |> List.ofSeq | ||||
|     [ div [ _class "pt-center-text" ] [ | ||||
|         br [] | ||||
|         a [ _href $"/web/prayer-request/{emptyGuid}/edit"; _title s["Add a New Request"].Value ] | ||||
|         a [ _href $"/prayer-request/{emptyGuid}/edit"; _title s["Add a New Request"].Value ] | ||||
|           [ icon "add_circle"; rawText "  "; locStr s["Add a New Request"] ] | ||||
|         rawText "       " | ||||
|         a [ _href "/web/prayer-requests/view"; _title s["View Prayer Request List"].Value ] | ||||
|         a [ _href "/prayer-requests/view"; _title s["View Prayer Request List"].Value ] | ||||
|           [ icon "list"; rawText "  "; locStr s["View Prayer Request List"] ] | ||||
|         match m.SearchTerm with | ||||
|         | Some _ -> | ||||
|             rawText "       " | ||||
|             a [ _href "/web/prayer-requests"; _title l["Clear Search Criteria"].Value ] | ||||
|             a [ _href "/prayer-requests"; _title l["Clear Search Criteria"].Value ] | ||||
|               [ icon "highlight_off"; rawText "  "; raw l["Clear Search Criteria"] ] | ||||
|         | None -> () | ||||
|       ] | ||||
|       form [ _action "/web/prayer-requests"; _method "get"; _class "pt-center-text pt-search-form" ] [ | ||||
|       form [ _action "/prayer-requests"; _method "get"; _class "pt-center-text pt-search-form" ] [ | ||||
|           input [ _type "text" | ||||
|                   _name "search" | ||||
|                   _placeholder l["Search requests..."].Value | ||||
| @ -257,18 +256,18 @@ let maintain (m : MaintainRequests) (ctx : HttpContext) vi = | ||||
|           | Some true -> | ||||
|               raw l["Inactive requests are currently not shown"] | ||||
|               br [] | ||||
|               a [ _href "/web/prayer-requests/inactive" ] [ raw l["Show Inactive Requests"] ] | ||||
|               a [ _href "/prayer-requests/inactive" ] [ raw l["Show Inactive Requests"] ] | ||||
|           | _ -> | ||||
|               if defaultArg m.OnlyActive false then | ||||
|                   raw l["Inactive requests are currently shown"] | ||||
|                   br [] | ||||
|                   a [ _href "/web/prayer-requests" ] [ raw l["Do Not Show Inactive Requests"] ] | ||||
|                   a [ _href "/prayer-requests" ] [ raw l["Do Not Show Inactive Requests"] ] | ||||
|                   br [] | ||||
|                   br [] | ||||
|               let search = [ match m.SearchTerm with Some s -> "search", s | None -> () ] | ||||
|               let pg     = defaultArg m.PageNbr 1 | ||||
|               let url    = | ||||
|                   match m.OnlyActive with Some true | None -> "" | _ -> "/inactive" |> sprintf "/web/prayer-requests%s" | ||||
|                   match m.OnlyActive with Some true | None -> "" | _ -> "/inactive" |> sprintf "/prayer-requests%s" | ||||
|               match pg with | ||||
|               | 1 -> () | ||||
|               | _ -> | ||||
| @ -319,7 +318,7 @@ let view m vi = | ||||
|     [ div [ _class "pt-center-text" ] [ | ||||
|         br [] | ||||
|         a [ _class "pt-icon-link" | ||||
|             _href $"/web/prayer-requests/print/{dtString}" | ||||
|             _href $"/prayer-requests/print/{dtString}" | ||||
|             _title s["View Printable"].Value | ||||
|           ] [ icon "print"; rawText "  "; locStr s["View Printable"] ] | ||||
|         if m.CanEmail then | ||||
| @ -329,20 +328,20 @@ let view m vi = | ||||
|                     if date.DayOfWeek = DayOfWeek.Sunday then date else findSunday (date.AddDays 1.) | ||||
|                 let sunday = findSunday m.Date | ||||
|                 a [ _class "pt-icon-link" | ||||
|                     _href $"""/web/prayer-requests/view/{sunday.ToString "yyyy-MM-dd"}""" | ||||
|                     _href $"""/prayer-requests/view/{sunday.ToString "yyyy-MM-dd"}""" | ||||
|                     _title s["List for Next Sunday"].Value ] [ | ||||
|                     icon "update"; rawText "  "; locStr s["List for Next Sunday"] | ||||
|                 ] | ||||
|                 spacer | ||||
|             let emailPrompt = s["This will e-mail the current list to every member of your group, without further prompting.  Are you sure this is what you are ready to do?"].Value | ||||
|             a [ _class "pt-icon-link" | ||||
|                 _href $"/web/prayer-requests/email/{dtString}" | ||||
|                 _href $"/prayer-requests/email/{dtString}" | ||||
|                 _title s["Send via E-mail"].Value | ||||
|                 _onclick $"return PT.requests.view.promptBeforeEmail('{emailPrompt}')" ] [ | ||||
|                 icon "mail_outline"; rawText "  "; locStr s["Send via E-mail"] | ||||
|             ] | ||||
|         spacer | ||||
|         a [ _class "pt-icon-link"; _href "/web/prayer-requests"; _title s["Maintain Prayer Requests"].Value ] [ | ||||
|         a [ _class "pt-icon-link"; _href "/prayer-requests"; _title s["Maintain Prayer Requests"].Value ] [ | ||||
|            icon "compare_arrows"; rawText "  "; locStr s["Maintain Prayer Requests"] | ||||
|         ] | ||||
|       ] | ||||
|  | ||||
| @ -12,7 +12,7 @@ let announcement isAdmin ctx vi = | ||||
|     let s        = I18N.localizer.Force () | ||||
|     let m        = { SendToClass = ""; Text = ""; AddToRequestList = None; RequestType = None } | ||||
|     let reqTypes = ReferenceList.requestTypeList s | ||||
|     [ form [ _action "/web/small-group/announcement/send"; _method "post"; _class "pt-center-columns" ] [ | ||||
|     [ form [ _action "/small-group/announcement/send"; _method "post"; _class "pt-center-columns" ] [ | ||||
|         csrfToken ctx | ||||
|         div [ _class "pt-field-row" ] [ | ||||
|             div [ _class "pt-field pt-editor" ] [ | ||||
| @ -74,7 +74,7 @@ let announcementSent (m : Announcement) vi = | ||||
| let edit (m : EditSmallGroup) (churches : Church list) ctx vi = | ||||
|     let s         = I18N.localizer.Force () | ||||
|     let pageTitle = if m.IsNew then "Add a New Group" else "Edit Group" | ||||
|     form [ _action "/web/small-group/save"; _method "post"; _class "pt-center-columns" ] [ | ||||
|     form [ _action "/small-group/save"; _method "post"; _class "pt-center-columns" ] [ | ||||
|         csrfToken ctx | ||||
|         input [ _type "hidden"; _name (nameof m.SmallGroupId); _value (flatGuid m.SmallGroupId) ] | ||||
|         div [ _class "pt-field-row" ] [ | ||||
| @ -104,7 +104,7 @@ let edit (m : EditSmallGroup) (churches : Church list) ctx vi = | ||||
| let editMember (m : EditMember) (types : (string * LocalizedString) seq) ctx vi = | ||||
|     let s         = I18N.localizer.Force () | ||||
|     let pageTitle = if m.IsNew then "Add a New Group Member" else "Edit Group Member" | ||||
|     form [ _action "/web/small-group/member/save"; _method "post"; _class "pt-center-columns" ] [ | ||||
|     form [ _action "/small-group/member/save"; _method "post"; _class "pt-center-columns" ] [ | ||||
|         style [ _scoped ] [ rawText "#name { width: 15rem; } #email { width: 20rem; }" ] | ||||
|         csrfToken ctx | ||||
|         input [ _type "hidden"; _name (nameof m.MemberId); _value (flatGuid m.MemberId) ] | ||||
| @ -137,7 +137,7 @@ let editMember (m : EditMember) (types : (string * LocalizedString) seq) ctx vi | ||||
| let logOn (groups : SmallGroup list) grpId ctx vi = | ||||
|     let s = I18N.localizer.Force () | ||||
|     let m = { SmallGroupId = System.Guid.Empty; Password = ""; RememberMe = None } | ||||
|     [ form [ _action "/web/small-group/log-on/submit"; _method "post"; _class "pt-center-columns" ] [ | ||||
|     [ form [ _action "/small-group/log-on/submit"; _method "post"; _class "pt-center-columns" ] [ | ||||
|         csrfToken ctx | ||||
|         div [ _class "pt-field-row" ] [ | ||||
|             div [ _class "pt-field" ] [ | ||||
| @ -195,12 +195,12 @@ let maintain (groups : SmallGroup list) ctx vi = | ||||
|                 groups | ||||
|                 |> List.map (fun g -> | ||||
|                     let grpId     = flatGuid g.smallGroupId | ||||
|                     let delAction = $"/web/small-group/{grpId}/delete" | ||||
|                     let delAction = $"/small-group/{grpId}/delete" | ||||
|                     let delPrompt = s["Are you sure you want to delete this {0}?  This action cannot be undone.", | ||||
|                                          $"""{s["Small Group"].Value.ToLower ()} ({g.name})""" ].Value | ||||
|                     tr [] [ | ||||
|                         td [] [ | ||||
|                             a [ _href $"/web/small-group/{grpId}/edit"; _title s["Edit This Group"].Value ] | ||||
|                             a [ _href $"/small-group/{grpId}/edit"; _title s["Edit This Group"].Value ] | ||||
|                               [ icon "edit" ] | ||||
|                             a [ _href delAction | ||||
|                                 _title s["Delete This Group"].Value | ||||
| @ -215,7 +215,7 @@ let maintain (groups : SmallGroup list) ctx vi = | ||||
|             ] | ||||
|     [ div [ _class "pt-center-text" ] [ | ||||
|         br [] | ||||
|         a [ _href $"/web/small-group/{emptyGuid}/edit"; _title s["Add a New Group"].Value ] [ | ||||
|         a [ _href $"/small-group/{emptyGuid}/edit"; _title s["Add a New Group"].Value ] [ | ||||
|           icon "add_circle" | ||||
|           rawText "  " | ||||
|           locStr s["Add a New Group"] | ||||
| @ -250,13 +250,13 @@ let members (members : Member list) (emailTyps : Map<string, LocalizedString>) c | ||||
|                 members | ||||
|                 |> List.map (fun mbr -> | ||||
|                     let mbrId     = flatGuid mbr.memberId | ||||
|                     let delAction = $"/web/small-group/member/{mbrId}/delete" | ||||
|                     let delAction = $"/small-group/member/{mbrId}/delete" | ||||
|                     let delPrompt = | ||||
|                         s["Are you sure you want to delete this {0}?  This action cannot be undone.", s["group member"]] | ||||
|                             .Value.Replace("?", $" ({mbr.memberName})?") | ||||
|                     tr [] [ | ||||
|                         td [] [ | ||||
|                             a [ _href $"/web/small-group/member/{mbrId}/edit"; _title s["Edit This Group Member"].Value ] | ||||
|                             a [ _href $"/small-group/member/{mbrId}/edit"; _title s["Edit This Group Member"].Value ] | ||||
|                               [ icon "edit" ] | ||||
|                             a [ _href delAction | ||||
|                                 _title s["Delete This Group Member"].Value | ||||
| @ -271,7 +271,7 @@ let members (members : Member list) (emailTyps : Map<string, LocalizedString>) c | ||||
|             ] | ||||
|     [ div [ _class"pt-center-text" ] [ | ||||
|         br [] | ||||
|         a [ _href $"/web/small-group/member/{emptyGuid}/edit"; _title s["Add a New Group Member"].Value ] | ||||
|         a [ _href $"/small-group/member/{emptyGuid}/edit"; _title s["Add a New Group Member"].Value ] | ||||
|           [ icon "add_circle"; rawText "  "; locStr s["Add a New Group Member"] ] | ||||
|         br [] | ||||
|         br [] | ||||
| @ -296,12 +296,12 @@ let overview m vi = | ||||
|                 locStr s["Quick Actions"] | ||||
|             ] | ||||
|             div [] [ | ||||
|                 a [ _href "/web/prayer-requests/view" ] | ||||
|                 a [ _href "/prayer-requests/view" ] | ||||
|                   [ icon "list"; linkSpacer; locStr s["View Prayer Request List"] ] | ||||
|                 hr [] | ||||
|                 a [ _href "/web/small-group/announcement" ] [ icon "send"; linkSpacer; locStr s["Send Announcement"] ] | ||||
|                 a [ _href "/small-group/announcement" ] [ icon "send"; linkSpacer; locStr s["Send Announcement"] ] | ||||
|                 hr [] | ||||
|                 a [ _href "/web/small-group/preferences" ] [ icon "build"; linkSpacer; locStr s["Change Preferences"] ] | ||||
|                 a [ _href "/small-group/preferences" ] [ icon "build"; linkSpacer; locStr s["Change Preferences"] ] | ||||
|             ] | ||||
|         ] | ||||
|         section [] [ | ||||
| @ -324,7 +324,7 @@ let overview m vi = | ||||
|                 space | ||||
|                 locStr s["Total Requests"] | ||||
|                 hr [] | ||||
|                 a [ _href "/web/prayer-requests/maintain" ] [ | ||||
|                 a [ _href "/prayer-requests/maintain" ] [ | ||||
|                     icon "compare_arrows" | ||||
|                     linkSpacer | ||||
|                     locStr s["Maintain Prayer Requests"] | ||||
| @ -339,7 +339,7 @@ let overview m vi = | ||||
|             div [ _class "pt-center-text" ] [ | ||||
|                 strong [] [ str (m.TotalMembers.ToString "N0"); space; locStr s["Members"] ] | ||||
|                 hr [] | ||||
|                 a [ _href "/web/small-group/members" ] [ icon "email"; linkSpacer; locStr s["Maintain Group Members"] ] | ||||
|                 a [ _href "/small-group/members" ] [ icon "email"; linkSpacer; locStr s["Maintain Group Members"] ] | ||||
|             ] | ||||
|         ] | ||||
|     ] | ||||
| @ -354,7 +354,7 @@ let preferences (m : EditPreferences) (tzs : TimeZone list) ctx vi = | ||||
|     let l   = I18N.forView "SmallGroup/Preferences" | ||||
|     use sw  = new StringWriter () | ||||
|     let raw = rawLocText sw | ||||
|     [ form [ _action "/web/small-group/preferences/save"; _method "post"; _class "pt-center-columns" ] [ | ||||
|     [ form [ _action "/small-group/preferences/save"; _method "post"; _class "pt-center-columns" ] [ | ||||
|         style [ _scoped ] | ||||
|               [ rawText "#expireDays, #daysToKeepNew, #longTermUpdateWeeks, #headingFontSize, #listFontSize, #pageSize { width: 3rem; } #emailFromAddress { width: 20rem; } #fonts { width: 40rem; } @media screen and (max-width: 40rem) { #fonts { width: 100%; } }" ] | ||||
|         csrfToken ctx | ||||
|  | ||||
| @ -8,7 +8,7 @@ open PrayerTracker.ViewModels | ||||
| let assignGroups m groups curGroups ctx vi = | ||||
|     let s         = I18N.localizer.Force () | ||||
|     let pageTitle = sprintf "%s • %A" m.UserName s["Assign Groups"] | ||||
|     form [ _action "/web/user/small-groups/save"; _method "post"; _class "pt-center-columns" ] [ | ||||
|     form [ _action "/user/small-groups/save"; _method "post"; _class "pt-center-columns" ] [ | ||||
|         csrfToken ctx | ||||
|         input [ _type "hidden"; _name (nameof m.UserId); _value (flatGuid m.UserId) ] | ||||
|         input [ _type "hidden"; _name (nameof m.UserName); _value m.UserName ] | ||||
| @ -48,7 +48,7 @@ let changePassword ctx vi = | ||||
|     [ p [ _class "pt-center-text" ] [ | ||||
|           locStr s["To change your password, enter your current password in the specified box below, then enter your new password twice."] | ||||
|       ] | ||||
|       form [ _action "/web/user/password/change" | ||||
|       form [ _action "/user/password/change" | ||||
|              _method "post" | ||||
|              _onsubmit $"""return PT.compareValidation('newPassword','newPasswordConfirm','%A{s["The passwords do not match"]}')""" ] [ | ||||
|           style [ _scoped ] [ rawText "#oldPassword, #newPassword, #newPasswordConfirm { width: 10rem; } "] | ||||
| @ -84,7 +84,7 @@ let edit (m : EditUser) ctx vi = | ||||
|     let s             = I18N.localizer.Force () | ||||
|     let pageTitle     = if m.IsNew then "Add a New User" else "Edit User" | ||||
|     let pwPlaceholder = s[if m.IsNew then "" else "No change"].Value | ||||
|     [ form [ _action "/web/user/edit/save"; _method "post"; _class "pt-center-columns" | ||||
|     [ form [ _action "/user/edit/save"; _method "post"; _class "pt-center-columns" | ||||
|              _onsubmit $"""return PT.compareValidation('password','passwordConfirm','%A{s["The passwords do not match"]}')""" ] [ | ||||
|         style [ _scoped ] | ||||
|               [ rawText "#firstName, #lastName, #password, #passwordConfirm { width: 10rem; } #email { width: 20rem; } " ] | ||||
| @ -141,7 +141,7 @@ let edit (m : EditUser) ctx vi = | ||||
| /// View for the user log on page | ||||
| let logOn (m : UserLogOn) groups ctx vi = | ||||
|     let s = I18N.localizer.Force () | ||||
|     form [ _action "/web/user/log-on"; _method "post"; _class "pt-center-columns" ] [ | ||||
|     form [ _action "/user/log-on"; _method "post"; _class "pt-center-columns" ] [ | ||||
|         style [ _scoped ] [ rawText "#email { width: 20rem; }" ] | ||||
|         csrfToken ctx | ||||
|         input [ _type "hidden"; _name (nameof m.RedirectUrl); _value (defaultArg m.RedirectUrl "") ] | ||||
| @ -200,13 +200,13 @@ let maintain (users : User list) ctx vi = | ||||
|                 users | ||||
|                 |> List.map (fun user -> | ||||
|                     let userId    = flatGuid user.userId | ||||
|                     let delAction = $"/web/user/{userId}/delete" | ||||
|                     let delAction = $"/user/{userId}/delete" | ||||
|                     let delPrompt = s["Are you sure you want to delete this {0}?  This action cannot be undone.", | ||||
|                                       $"""{s["User"].Value.ToLower ()} ({user.fullName})"""].Value | ||||
|                     tr [] [ | ||||
|                         td [] [ | ||||
|                             a [ _href $"/web/user/{userId}/edit"; _title s["Edit This User"].Value ] [ icon "edit" ] | ||||
|                             a [ _href $"/web/user/{userId}/small-groups"; _title s["Assign Groups to This User"].Value ] | ||||
|                             a [ _href $"/user/{userId}/edit"; _title s["Edit This User"].Value ] [ icon "edit" ] | ||||
|                             a [ _href $"/user/{userId}/small-groups"; _title s["Assign Groups to This User"].Value ] | ||||
|                               [ icon "group" ] | ||||
|                             a [ _href delAction | ||||
|                                 _title s["Delete This User"].Value | ||||
| @ -222,7 +222,7 @@ let maintain (users : User list) ctx vi = | ||||
|               ] | ||||
|     [ div [ _class "pt-center-text" ] [ | ||||
|         br [] | ||||
|         a [ _href $"/web/user/{emptyGuid}/edit"; _title s["Add a New User"].Value ] | ||||
|         a [ _href $"/user/{emptyGuid}/edit"; _title s["Add a New User"].Value ] | ||||
|           [ icon "add_circle"; rawText "  "; locStr s["Add a New User"] ] | ||||
|         br [] | ||||
|         br [] | ||||
|  | ||||
| @ -62,88 +62,88 @@ module Configure = | ||||
|             ServiceLifetime.Scoped, ServiceLifetime.Singleton) | ||||
|         () | ||||
|      | ||||
|     let noWeb : HttpHandler = fun next ctx -> | ||||
|         redirectTo true ($"""/{string ctx.Request.RouteValues["path"]}""") next ctx | ||||
|          | ||||
|     /// Routes for PrayerTracker | ||||
|     let routes = [ | ||||
|         subRoute "/web" [ | ||||
|             GET_HEAD [ | ||||
|                 subRoute "/church" [ | ||||
|                     route  "es"       Handlers.Church.maintain | ||||
|                     routef "/%O/edit" Handlers.Church.edit | ||||
|                 ] | ||||
|                 route  "/class/logon" (redirectTo true "/web/small-group/log-on") | ||||
|                 routef "/error/%s"    Handlers.Home.error | ||||
|                 routef "/language/%s" Handlers.Home.language | ||||
|                 subRoute "/legal" [ | ||||
|                     route "/privacy-policy"   Handlers.Home.privacyPolicy | ||||
|                     route "/terms-of-service" Handlers.Home.tos | ||||
|                 ] | ||||
|                 route "/log-off" Handlers.Home.logOff | ||||
|                 subRoute "/prayer-request" [ | ||||
|                     route  "s"           (Handlers.PrayerRequest.maintain true) | ||||
|                     routef "s/email/%s"  Handlers.PrayerRequest.email | ||||
|                     route  "s/inactive"  (Handlers.PrayerRequest.maintain false) | ||||
|                     route  "s/lists"     Handlers.PrayerRequest.lists | ||||
|                     routef "s/%O/list"   Handlers.PrayerRequest.list | ||||
|                     route  "s/maintain"  (redirectTo true "/web/prayer-requests") | ||||
|                     routef "s/print/%s"  Handlers.PrayerRequest.print | ||||
|                     route  "s/view"      (Handlers.PrayerRequest.view None) | ||||
|                     routef "s/view/%s"   (Some >> Handlers.PrayerRequest.view) | ||||
|                     routef "/%O/edit"    Handlers.PrayerRequest.edit | ||||
|                     routef "/%O/expire"  Handlers.PrayerRequest.expire | ||||
|                     routef "/%O/restore" Handlers.PrayerRequest.restore | ||||
|                 ] | ||||
|                 subRoute "/small-group" [ | ||||
|                     route  ""                Handlers.SmallGroup.overview | ||||
|                     route  "s"               Handlers.SmallGroup.maintain | ||||
|                     route  "/announcement"   Handlers.SmallGroup.announcement | ||||
|                     routef "/%O/edit"        Handlers.SmallGroup.edit | ||||
|                     route  "/log-on"         (Handlers.SmallGroup.logOn None) | ||||
|                     routef "/log-on/%O"      (Some >> Handlers.SmallGroup.logOn) | ||||
|                     route  "/logon"          (redirectTo true "/web/small-group/log-on") | ||||
|                     routef "/member/%O/edit" Handlers.SmallGroup.editMember | ||||
|                     route  "/members"        Handlers.SmallGroup.members | ||||
|                     route  "/preferences"    Handlers.SmallGroup.preferences | ||||
|                 ] | ||||
|                 route "/unauthorized" Handlers.Home.unauthorized | ||||
|                 subRoute "/user" [ | ||||
|                     route  "s"                Handlers.User.maintain | ||||
|                     routef "/%O/edit"         Handlers.User.edit | ||||
|                     routef "/%O/small-groups" Handlers.User.smallGroups | ||||
|                     route  "/log-on"          Handlers.User.logOn | ||||
|                     route  "/logon"           (redirectTo true "/web/user/log-on") | ||||
|                     route  "/password"        Handlers.User.password | ||||
|                 ] | ||||
|                 route "/" Handlers.Home.homePage | ||||
|         route "/web/{**path}" noWeb | ||||
|         GET_HEAD [ | ||||
|             subRoute "/church" [ | ||||
|                 route  "es"       Handlers.Church.maintain | ||||
|                 routef "/%O/edit" Handlers.Church.edit | ||||
|             ] | ||||
|             POST [ | ||||
|                 subRoute "/church" [ | ||||
|                     routef "/%O/delete" Handlers.Church.delete | ||||
|                     route  "/save"      Handlers.Church.save | ||||
|                 ] | ||||
|                 subRoute "/prayer-request" [ | ||||
|                     routef "/%O/delete" Handlers.PrayerRequest.delete | ||||
|                     route  "/save"      Handlers.PrayerRequest.save | ||||
|                 ] | ||||
|                 subRoute "/small-group" [ | ||||
|                     route  "/announcement/send" Handlers.SmallGroup.sendAnnouncement | ||||
|                     routef "/%O/delete"         Handlers.SmallGroup.delete | ||||
|                     route  "/log-on/submit"     Handlers.SmallGroup.logOnSubmit | ||||
|                     routef "/member/%O/delete"  Handlers.SmallGroup.deleteMember | ||||
|                     route  "/member/save"       Handlers.SmallGroup.saveMember | ||||
|                     route  "/preferences/save"  Handlers.SmallGroup.savePreferences | ||||
|                     route  "/save"              Handlers.SmallGroup.save | ||||
|                 ] | ||||
|                 subRoute "/user" [ | ||||
|                     routef "/%O/delete"         Handlers.User.delete | ||||
|                     route  "/edit/save"         Handlers.User.save | ||||
|                     route  "/log-on"            Handlers.User.doLogOn | ||||
|                     route  "/password/change"   Handlers.User.changePassword | ||||
|                     route  "/small-groups/save" Handlers.User.saveGroups | ||||
|                 ] | ||||
|             route  "/class/logon" (redirectTo true "/small-group/log-on") | ||||
|             routef "/error/%s"    Handlers.Home.error | ||||
|             routef "/language/%s" Handlers.Home.language | ||||
|             subRoute "/legal" [ | ||||
|                 route "/privacy-policy"   Handlers.Home.privacyPolicy | ||||
|                 route "/terms-of-service" Handlers.Home.tos | ||||
|             ] | ||||
|             route "/log-off" Handlers.Home.logOff | ||||
|             subRoute "/prayer-request" [ | ||||
|                 route  "s"           (Handlers.PrayerRequest.maintain true) | ||||
|                 routef "s/email/%s"  Handlers.PrayerRequest.email | ||||
|                 route  "s/inactive"  (Handlers.PrayerRequest.maintain false) | ||||
|                 route  "s/lists"     Handlers.PrayerRequest.lists | ||||
|                 routef "s/%O/list"   Handlers.PrayerRequest.list | ||||
|                 route  "s/maintain"  (redirectTo true "/prayer-requests") | ||||
|                 routef "s/print/%s"  Handlers.PrayerRequest.print | ||||
|                 route  "s/view"      (Handlers.PrayerRequest.view None) | ||||
|                 routef "s/view/%s"   (Some >> Handlers.PrayerRequest.view) | ||||
|                 routef "/%O/edit"    Handlers.PrayerRequest.edit | ||||
|                 routef "/%O/expire"  Handlers.PrayerRequest.expire | ||||
|                 routef "/%O/restore" Handlers.PrayerRequest.restore | ||||
|             ] | ||||
|             subRoute "/small-group" [ | ||||
|                 route  ""                Handlers.SmallGroup.overview | ||||
|                 route  "s"               Handlers.SmallGroup.maintain | ||||
|                 route  "/announcement"   Handlers.SmallGroup.announcement | ||||
|                 routef "/%O/edit"        Handlers.SmallGroup.edit | ||||
|                 route  "/log-on"         (Handlers.SmallGroup.logOn None) | ||||
|                 routef "/log-on/%O"      (Some >> Handlers.SmallGroup.logOn) | ||||
|                 route  "/logon"          (redirectTo true "/small-group/log-on") | ||||
|                 routef "/member/%O/edit" Handlers.SmallGroup.editMember | ||||
|                 route  "/members"        Handlers.SmallGroup.members | ||||
|                 route  "/preferences"    Handlers.SmallGroup.preferences | ||||
|             ] | ||||
|             route "/unauthorized" Handlers.Home.unauthorized | ||||
|             subRoute "/user" [ | ||||
|                 route  "s"                Handlers.User.maintain | ||||
|                 routef "/%O/edit"         Handlers.User.edit | ||||
|                 routef "/%O/small-groups" Handlers.User.smallGroups | ||||
|                 route  "/log-on"          Handlers.User.logOn | ||||
|                 route  "/logon"           (redirectTo true "/user/log-on") | ||||
|                 route  "/password"        Handlers.User.password | ||||
|             ] | ||||
|             route "/" Handlers.Home.homePage | ||||
|         ] | ||||
|         POST [ | ||||
|             subRoute "/church" [ | ||||
|                 routef "/%O/delete" Handlers.Church.delete | ||||
|                 route  "/save"      Handlers.Church.save | ||||
|             ] | ||||
|             subRoute "/prayer-request" [ | ||||
|                 routef "/%O/delete" Handlers.PrayerRequest.delete | ||||
|                 route  "/save"      Handlers.PrayerRequest.save | ||||
|             ] | ||||
|             subRoute "/small-group" [ | ||||
|                 route  "/announcement/send" Handlers.SmallGroup.sendAnnouncement | ||||
|                 routef "/%O/delete"         Handlers.SmallGroup.delete | ||||
|                 route  "/log-on/submit"     Handlers.SmallGroup.logOnSubmit | ||||
|                 routef "/member/%O/delete"  Handlers.SmallGroup.deleteMember | ||||
|                 route  "/member/save"       Handlers.SmallGroup.saveMember | ||||
|                 route  "/preferences/save"  Handlers.SmallGroup.savePreferences | ||||
|                 route  "/save"              Handlers.SmallGroup.save | ||||
|             ] | ||||
|             subRoute "/user" [ | ||||
|                 routef "/%O/delete"         Handlers.User.delete | ||||
|                 route  "/edit/save"         Handlers.User.save | ||||
|                 route  "/log-on"            Handlers.User.doLogOn | ||||
|                 route  "/password/change"   Handlers.User.changePassword | ||||
|                 route  "/small-groups/save" Handlers.User.saveGroups | ||||
|             ] | ||||
|         ] | ||||
|         // Temp redirect to new URLs | ||||
|         route "/" (redirectTo false "/web/") | ||||
|     ] | ||||
| 
 | ||||
|     /// Giraffe error handler | ||||
|  | ||||
| @ -28,7 +28,7 @@ let delete churchId : HttpHandler = requireAccess [ Admin ] >=> validateCSRF >=> | ||||
|         addInfo ctx | ||||
|           s["The church {0} and its {1} small groups (with {2} prayer request(s)) were deleted successfully; revoked access from {3} user(s)", | ||||
|               church.name, stats.smallGroups, stats.prayerRequests, stats.users] | ||||
|         return! redirectTo false "/web/churches" next ctx | ||||
|         return! redirectTo false "/churches" next ctx | ||||
|     | None -> return! fourOhFour next ctx | ||||
| } | ||||
| 
 | ||||
| @ -80,7 +80,7 @@ let save : HttpHandler = requireAccess [ Admin ] >=> validateCSRF >=> fun next c | ||||
|             let  s   = Views.I18N.localizer.Force () | ||||
|             let  act = s[if m.IsNew then "Added" else "Updated"].Value.ToLower () | ||||
|             addInfo ctx s["Successfully {0} church “{1}”", act, m.Name] | ||||
|             return! redirectTo false "/web/churches" next ctx | ||||
|             return! redirectTo false "/churches" next ctx | ||||
|         | None -> return! fourOhFour next ctx | ||||
|     | Result.Error e -> return! bindError e next ctx | ||||
| } | ||||
|  | ||||
| @ -234,17 +234,17 @@ let requireAccess level : HttpHandler = | ||||
|             | false -> | ||||
|                 let s = Views.I18N.localizer.Force () | ||||
|                 addError ctx s["You are not authorized to view the requested page."] | ||||
|                 return! redirectTo false "/web/unauthorized" next ctx | ||||
|                 return! redirectTo false "/unauthorized" next ctx | ||||
|         | _ when level |> List.contains User -> | ||||
|             // Redirect to the user log on page | ||||
|             ctx.Session.SetString (Key.Session.redirectUrl, ctx.Request.GetEncodedUrl ()) | ||||
|             return! redirectTo false "/web/user/log-on" next ctx | ||||
|             return! redirectTo false "/user/log-on" next ctx | ||||
|         | _ when level |> List.contains Group -> | ||||
|             // Redirect to the small group log on page | ||||
|             ctx.Session.SetString (Key.Session.redirectUrl, ctx.Request.GetEncodedUrl ()) | ||||
|             return! redirectTo false "/web/small-group/log-on" next ctx | ||||
|             return! redirectTo false "/small-group/log-on" next ctx | ||||
|         | _ -> | ||||
|             let s = Views.I18N.localizer.Force () | ||||
|             addError ctx s["You are not authorized to view the requested page."] | ||||
|             return! redirectTo false "/web/unauthorized" next ctx | ||||
|             return! redirectTo false "/unauthorized" next ctx | ||||
|     } | ||||
|  | ||||
| @ -41,7 +41,7 @@ let language culture : HttpHandler = requireAccess [ AccessLevel.Public ] >=> fu | ||||
|             CookieRequestCultureProvider.MakeCookieValue (RequestCulture c), | ||||
|             CookieOptions (Expires = Nullable<DateTimeOffset> (DateTimeOffset (DateTime.Now.AddYears 1)))) | ||||
|     | _ -> () | ||||
|     let url = match string ctx.Request.Headers["Referer"] with null | "" -> "/web/" | r -> r | ||||
|     let url = match string ctx.Request.Headers["Referer"] with null | "" -> "/" | r -> r | ||||
|     redirectTo false url next ctx | ||||
| 
 | ||||
| 
 | ||||
| @ -66,7 +66,7 @@ let logOff : HttpHandler = requireAccess [ AccessLevel.Public ] >=> fun next ctx | ||||
|     Key.Cookie.logOffCookies |> List.iter ctx.Response.Cookies.Delete | ||||
|     let s = Views.I18N.localizer.Force () | ||||
|     addHtmlInfo ctx s["Log Off Successful • Have a nice day!"] | ||||
|     redirectTo false "/web/" next ctx | ||||
|     redirectTo false "/" next ctx | ||||
| 
 | ||||
| 
 | ||||
| /// GET /unauthorized | ||||
|  | ||||
| @ -16,7 +16,7 @@ let private findRequest (ctx : HttpContext) reqId = task { | ||||
|     | Some _ -> | ||||
|         let s = Views.I18N.localizer.Force () | ||||
|         addError ctx s["The prayer request you tried to access is not assigned to your group"] | ||||
|         return Result.Error (redirectTo false "/web/unauthorized") | ||||
|         return Result.Error (redirectTo false "/unauthorized") | ||||
|     | None -> return Result.Error fourOhFour | ||||
| } | ||||
| 
 | ||||
| @ -101,7 +101,7 @@ let delete reqId : HttpHandler = requireAccess [ User ] >=> validateCSRF >=> fun | ||||
|         ctx.db.PrayerRequests.Remove req |> ignore | ||||
|         let! _ = ctx.db.SaveChangesAsync () | ||||
|         addInfo ctx s["The prayer request was deleted successfully"] | ||||
|         return! redirectTo false "/web/prayer-requests" next ctx | ||||
|         return! redirectTo false "/prayer-requests" next ctx | ||||
|     | Result.Error e -> return! e next ctx | ||||
| } | ||||
| 
 | ||||
| @ -114,7 +114,7 @@ let expire reqId : HttpHandler = requireAccess [ User ] >=> fun next ctx -> task | ||||
|         ctx.db.UpdateEntry { req with expiration = Forced } | ||||
|         let! _ = ctx.db.SaveChangesAsync () | ||||
|         addInfo ctx s["Successfully {0} prayer request", s["Expired"].Value.ToLower ()] | ||||
|         return! redirectTo false "/web/prayer-requests" next ctx | ||||
|         return! redirectTo false "/prayer-requests" next ctx | ||||
|     | Result.Error e -> return! e next ctx | ||||
| } | ||||
| 
 | ||||
| @ -140,7 +140,7 @@ let list groupId : HttpHandler = requireAccess [ AccessLevel.Public ] >=> fun ne | ||||
|     | Some _ -> | ||||
|         let s = Views.I18N.localizer.Force () | ||||
|         addError ctx s["The request list for the group you tried to view is not public."] | ||||
|         return! redirectTo false "/web/unauthorized" next ctx | ||||
|         return! redirectTo false "/unauthorized" next ctx | ||||
|     | None -> return! fourOhFour next ctx | ||||
| } | ||||
| 
 | ||||
| @ -209,7 +209,7 @@ let restore reqId : HttpHandler = requireAccess [ User ] >=> fun next ctx -> tas | ||||
|         ctx.db.UpdateEntry { req with expiration = Automatic; updatedDate = DateTime.Now } | ||||
|         let! _ = ctx.db.SaveChangesAsync () | ||||
|         addInfo ctx s["Successfully {0} prayer request", s["Restored"].Value.ToLower ()] | ||||
|         return! redirectTo false "/web/prayer-requests" next ctx | ||||
|         return! redirectTo false "/prayer-requests" next ctx | ||||
|     | Result.Error e -> return! e next ctx | ||||
| } | ||||
| 
 | ||||
| @ -248,7 +248,7 @@ let save : HttpHandler = requireAccess [ User ] >=> validateCSRF >=> fun next ct | ||||
|             let  s   = Views.I18N.localizer.Force () | ||||
|             let  act = if m.IsNew then "Added" else "Updated" | ||||
|             addInfo ctx s["Successfully {0} prayer request", s[act].Value.ToLower ()] | ||||
|             return! redirectTo false "/web/prayer-requests" next ctx | ||||
|             return! redirectTo false "/prayer-requests" next ctx | ||||
|         | None -> return! fourOhFour next ctx | ||||
|     | Result.Error e -> return! bindError e next ctx | ||||
| } | ||||
|  | ||||
| @ -38,7 +38,7 @@ let delete groupId : HttpHandler = requireAccess [ Admin ] >=> validateCSRF >=> | ||||
|         addInfo ctx | ||||
|             s["The group {0} and its {1} prayer request(s) were deleted successfully; revoked access from {2} user(s)", | ||||
|               grp.name, reqs, users] | ||||
|         return! redirectTo false "/web/small-groups" next ctx | ||||
|         return! redirectTo false "/small-groups" next ctx | ||||
|     | None -> return! fourOhFour next ctx | ||||
| } | ||||
| 
 | ||||
| @ -51,7 +51,7 @@ let deleteMember memberId : HttpHandler = requireAccess [ User ] >=> validateCSR | ||||
|         ctx.db.RemoveEntry mbr | ||||
|         let! _ = ctx.db.SaveChangesAsync () | ||||
|         addHtmlInfo ctx s["The group member “{0}” was deleted successfully", mbr.memberName] | ||||
|         return! redirectTo false "/web/small-group/members" next ctx | ||||
|         return! redirectTo false "/small-group/members" next ctx | ||||
|     | Some _ | ||||
|     | None -> return! fourOhFour next ctx | ||||
| } | ||||
| @ -122,10 +122,10 @@ let logOnSubmit : HttpHandler = requireAccess [ AccessLevel.Public ] >=> validat | ||||
|             ctx.Session.smallGroup <- Some grp | ||||
|             if defaultArg m.RememberMe false then (setGroupCookie ctx << sha1Hash) m.Password | ||||
|             addInfo ctx s["Log On Successful • Welcome to {0}", s["PrayerTracker"]] | ||||
|             return! redirectTo false "/web/prayer-requests/view" next ctx | ||||
|             return! redirectTo false "/prayer-requests/view" next ctx | ||||
|         | None -> | ||||
|             addError ctx s["Password incorrect - login unsuccessful"] | ||||
|             return! redirectTo false $"/web/small-group/log-on/{flatGuid m.SmallGroupId}" next ctx | ||||
|             return! redirectTo false $"/small-group/log-on/{flatGuid m.SmallGroupId}" next ctx | ||||
|     | Result.Error e -> return! bindError e next ctx | ||||
| } | ||||
| 
 | ||||
| @ -211,7 +211,7 @@ let save : HttpHandler = requireAccess [ Admin ] >=> validateCSRF >=> fun next c | ||||
|             let! _ = ctx.db.SaveChangesAsync () | ||||
|             let act = s[if m.IsNew then "Added" else "Updated"].Value.ToLower () | ||||
|             addHtmlInfo ctx s["Successfully {0} group “{1}”", act, m.Name] | ||||
|             return! redirectTo false "/web/small-groups" next ctx | ||||
|             return! redirectTo false "/small-groups" next ctx | ||||
|         | None -> return! fourOhFour next ctx | ||||
|     | Result.Error e -> return! bindError e next ctx | ||||
| } | ||||
| @ -238,7 +238,7 @@ let saveMember : HttpHandler = requireAccess [ User ] >=> validateCSRF >=> fun n | ||||
|             let s = Views.I18N.localizer.Force () | ||||
|             let act = s[if m.IsNew then "Added" else "Updated"].Value.ToLower () | ||||
|             addInfo ctx s["Successfully {0} group member", act] | ||||
|             return! redirectTo false "/web/small-group/members" next ctx | ||||
|             return! redirectTo false "/small-group/members" next ctx | ||||
|         | Some _ | ||||
|         | None -> return! fourOhFour next ctx | ||||
|     | Result.Error e -> return! bindError e next ctx | ||||
| @ -261,7 +261,7 @@ let savePreferences : HttpHandler = requireAccess [ User ] >=> validateCSRF >=> | ||||
|             ctx.Session.smallGroup <- Some { grp with preferences = prefs } | ||||
|             let s = Views.I18N.localizer.Force () | ||||
|             addInfo ctx s["Group preferences updated successfully"] | ||||
|             return! redirectTo false "/web/small-group/preferences" next ctx | ||||
|             return! redirectTo false "/small-group/preferences" next ctx | ||||
|         | None -> return! fourOhFour next ctx | ||||
|     | Result.Error e -> return! bindError e next ctx | ||||
| } | ||||
|  | ||||
| @ -69,13 +69,13 @@ let changePassword : HttpHandler = requireAccess [ User ] >=> validateCSRF >=> f | ||||
|                 if ctx.Request.Cookies.Keys.Contains Key.Cookie.user then setUserCookie ctx usr.passwordHash | ||||
|                 addInfo ctx s["Your password was changed successfully"] | ||||
|             | None -> addError ctx s["Unable to change password"] | ||||
|             return! redirectTo false "/web/" next ctx | ||||
|             return! redirectTo false "/" next ctx | ||||
|         | Some _ -> | ||||
|             addError ctx s["The new passwords did not match - your password was NOT changed"] | ||||
|             return! redirectTo false "/web/user/password" next ctx | ||||
|             return! redirectTo false "/user/password" next ctx | ||||
|         | None -> | ||||
|             addError ctx s["The old password was incorrect - your password was NOT changed"] | ||||
|             return! redirectTo false "/web/user/password" next ctx | ||||
|             return! redirectTo false "/user/password" next ctx | ||||
|     | Result.Error e -> return! bindError e next ctx | ||||
| } | ||||
| 
 | ||||
| @ -88,7 +88,7 @@ let delete userId : HttpHandler = requireAccess [ Admin ] >=> validateCSRF >=> f | ||||
|         let! _ = ctx.db.SaveChangesAsync () | ||||
|         let  s = Views.I18N.localizer.Force () | ||||
|         addInfo ctx s["Successfully deleted user {0}", user.fullName] | ||||
|         return! redirectTo false "/web/users" next ctx | ||||
|         return! redirectTo false "/users" next ctx | ||||
|     | _ -> return! fourOhFour next ctx | ||||
| } | ||||
| 
 | ||||
| @ -108,8 +108,8 @@ let doLogOn : HttpHandler = requireAccess [ AccessLevel.Public ] >=> validateCSR | ||||
|                 if defaultArg m.RememberMe false then setUserCookie ctx pwHash | ||||
|                 addHtmlInfo ctx s["Log On Successful • Welcome to {0}", s["PrayerTracker"]] | ||||
|                 match m.RedirectUrl with | ||||
|                 | None -> "/web/small-group" | ||||
|                 | Some x when x = "" -> "/web/small-group" | ||||
|                 | None -> "/small-group" | ||||
|                 | Some x when x = "" -> "/small-group" | ||||
|                 | Some x -> x | ||||
|             | _ -> | ||||
|                 let grpName = match grp with Some g -> g.name | _ -> "N/A" | ||||
| @ -130,7 +130,7 @@ let doLogOn : HttpHandler = requireAccess [ AccessLevel.Public ] >=> validateCSR | ||||
|                         |> (HtmlString >> Some) | ||||
|                 } | ||||
|                 |> addUserMessage ctx | ||||
|                 "/web/user/log-on" | ||||
|                 "/user/log-on" | ||||
|         return! redirectTo false nextUrl next ctx | ||||
|     | Result.Error e -> return! bindError e next ctx | ||||
| } | ||||
| @ -225,10 +225,10 @@ let save : HttpHandler = requireAccess [ Admin ] >=> validateCSRF >=> fun next c | ||||
|                       |> Some | ||||
|                 } | ||||
|                 |> addUserMessage ctx | ||||
|                 return! redirectTo false $"/web/user/{flatGuid u.userId}/small-groups" next ctx | ||||
|                 return! redirectTo false $"/user/{flatGuid u.userId}/small-groups" next ctx | ||||
|             else | ||||
|                 addInfo ctx s["Successfully {0} user", s["Updated"].Value.ToLower ()] | ||||
|                 return! redirectTo false "/web/users" next ctx | ||||
|                 return! redirectTo false "/users" next ctx | ||||
|         | None -> return! fourOhFour next ctx | ||||
|     | Result.Error e -> return! bindError e next ctx | ||||
| } | ||||
| @ -242,7 +242,7 @@ let saveGroups : HttpHandler = requireAccess [ Admin ] >=> validateCSRF >=> fun | ||||
|         match Seq.length m.SmallGroups with | ||||
|         | 0 -> | ||||
|             addError ctx s["You must select at least one group to assign"] | ||||
|             return! redirectTo false $"/web/user/{flatGuid m.UserId}/small-groups" next ctx | ||||
|             return! redirectTo false $"/user/{flatGuid m.UserId}/small-groups" next ctx | ||||
|         | _ -> | ||||
|             match! ctx.db.TryUserByIdWithGroups m.UserId with | ||||
|             | Some user -> | ||||
| @ -261,7 +261,7 @@ let saveGroups : HttpHandler = requireAccess [ Admin ] >=> validateCSRF >=> fun | ||||
|                 |> List.iter ctx.db.AddEntry | ||||
|                 let! _ = ctx.db.SaveChangesAsync () | ||||
|                 addInfo ctx s["Successfully updated group permissions for {0}", m.UserName] | ||||
|                 return! redirectTo false "/web/users" next ctx | ||||
|                 return! redirectTo false "/users" next ctx | ||||
|               | _ -> return! fourOhFour next ctx | ||||
|     | Result.Error e -> return! bindError e next ctx | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user