From accb65136c6b41531c4cf3426928c8fc5eca5430 Mon Sep 17 00:00:00 2001 From: "Daniel J. Summers" Date: Wed, 13 Jul 2022 19:02:06 -0400 Subject: [PATCH] Remove /web prefix from URLs --- src/PrayerTracker.UI/Church.fs | 8 +- src/PrayerTracker.UI/Home.fs | 2 +- src/PrayerTracker.UI/Layout.fs | 47 ++++---- src/PrayerTracker.UI/PrayerRequest.fs | 37 +++---- src/PrayerTracker.UI/SmallGroup.fs | 32 +++--- src/PrayerTracker.UI/User.fs | 16 +-- src/PrayerTracker/App.fs | 154 +++++++++++++------------- src/PrayerTracker/Church.fs | 4 +- src/PrayerTracker/CommonFunctions.fs | 8 +- src/PrayerTracker/Home.fs | 4 +- src/PrayerTracker/PrayerRequest.fs | 12 +- src/PrayerTracker/SmallGroup.fs | 14 +-- src/PrayerTracker/User.fs | 22 ++-- 13 files changed, 181 insertions(+), 179 deletions(-) diff --git a/src/PrayerTracker.UI/Church.fs b/src/PrayerTracker.UI/Church.fs index 28ec25c..50fb4d1 100644 --- a/src/PrayerTracker.UI/Church.fs +++ b/src/PrayerTracker.UI/Church.fs @@ -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) 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) 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 [] diff --git a/src/PrayerTracker.UI/Home.fs b/src/PrayerTracker.UI/Home.fs index 654eed5..7871862 100644 --- a/src/PrayerTracker.UI/Home.fs +++ b/src/PrayerTracker.UI/Home.fs @@ -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)"] ] ] ] diff --git a/src/PrayerTracker.UI/Layout.fs b/src/PrayerTracker.UI/Layout.fs index 38e178d..9b18b4d 100644 --- a/src/PrayerTracker.UI/Layout.fs +++ b/src/PrayerTracker.UI/Layout.fs @@ -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 diff --git a/src/PrayerTracker.UI/PrayerRequest.fs b/src/PrayerTracker.UI/PrayerRequest.fs index 3efe208..7be0d24 100644 --- a/src/PrayerTracker.UI/PrayerRequest.fs +++ b/src/PrayerTracker.UI/PrayerRequest.fs @@ -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"] ] ] diff --git a/src/PrayerTracker.UI/SmallGroup.fs b/src/PrayerTracker.UI/SmallGroup.fs index 07188d9..56ed7ca 100644 --- a/src/PrayerTracker.UI/SmallGroup.fs +++ b/src/PrayerTracker.UI/SmallGroup.fs @@ -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) 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) 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 diff --git a/src/PrayerTracker.UI/User.fs b/src/PrayerTracker.UI/User.fs index ee954cc..a8d5ab5 100644 --- a/src/PrayerTracker.UI/User.fs +++ b/src/PrayerTracker.UI/User.fs @@ -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 [] diff --git a/src/PrayerTracker/App.fs b/src/PrayerTracker/App.fs index 899a6f4..c35e7f5 100644 --- a/src/PrayerTracker/App.fs +++ b/src/PrayerTracker/App.fs @@ -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 diff --git a/src/PrayerTracker/Church.fs b/src/PrayerTracker/Church.fs index 92aee52..9863340 100644 --- a/src/PrayerTracker/Church.fs +++ b/src/PrayerTracker/Church.fs @@ -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 } diff --git a/src/PrayerTracker/CommonFunctions.fs b/src/PrayerTracker/CommonFunctions.fs index e3ad1d6..5377dd9 100644 --- a/src/PrayerTracker/CommonFunctions.fs +++ b/src/PrayerTracker/CommonFunctions.fs @@ -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 } diff --git a/src/PrayerTracker/Home.fs b/src/PrayerTracker/Home.fs index 9e80aac..4a42535 100644 --- a/src/PrayerTracker/Home.fs +++ b/src/PrayerTracker/Home.fs @@ -41,7 +41,7 @@ let language culture : HttpHandler = requireAccess [ AccessLevel.Public ] >=> fu CookieRequestCultureProvider.MakeCookieValue (RequestCulture c), CookieOptions (Expires = Nullable (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 diff --git a/src/PrayerTracker/PrayerRequest.fs b/src/PrayerTracker/PrayerRequest.fs index a63112a..b417441 100644 --- a/src/PrayerTracker/PrayerRequest.fs +++ b/src/PrayerTracker/PrayerRequest.fs @@ -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 } diff --git a/src/PrayerTracker/SmallGroup.fs b/src/PrayerTracker/SmallGroup.fs index be21d04..6c6784b 100644 --- a/src/PrayerTracker/SmallGroup.fs +++ b/src/PrayerTracker/SmallGroup.fs @@ -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 } diff --git a/src/PrayerTracker/User.fs b/src/PrayerTracker/User.fs index 1e7eef3..acc90e5 100644 --- a/src/PrayerTracker/User.fs +++ b/src/PrayerTracker/User.fs @@ -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 }