Version 8 #43
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -332,5 +332,6 @@ ASALocalRun/ | ||||
| ### --- ### | ||||
| src/PrayerTracker/appsettings.json | ||||
| docs/_site | ||||
| **/*.db* | ||||
| 
 | ||||
| .ionide | ||||
| @ -1,6 +1,7 @@ | ||||
| module PrayerTracker.Views.Church | ||||
| 
 | ||||
| open Giraffe.ViewEngine | ||||
| open Giraffe.ViewEngine.Accessibility | ||||
| open PrayerTracker | ||||
| open PrayerTracker.Entities | ||||
| open PrayerTracker.ViewModels | ||||
| @ -56,38 +57,72 @@ let edit (model : EditChurch) ctx viewInfo = | ||||
| 
 | ||||
| 
 | ||||
| /// View for church maintenance page | ||||
| let maintain (churches : Church list) (stats : Map<string, ChurchStats>) ctx vi = | ||||
| let maintain (churches : Church list) (stats : Map<string, ChurchStats>) ctx viewInfo = | ||||
|     let s     = I18N.localizer.Force () | ||||
|     let vi = | ||||
|         AppViewInfo.withScopedStyles [ | ||||
|             "#churchList { grid-template-columns: repeat(7, auto); }" | ||||
|         ] viewInfo | ||||
|     let chTbl = | ||||
|         match churches with | ||||
|         | [] -> space | ||||
|         | _ -> | ||||
|             table [ _class "pt-table pt-action-table" ] [ | ||||
|                 tableHeadings s [ "Actions"; "Name"; "Location"; "Groups"; "Requests"; "Users"; "Interface?" ] | ||||
|                 churches | ||||
|                 |> List.map (fun ch -> | ||||
|                     let chId      = shortGuid ch.Id.Value | ||||
|                     let delAction = $"/church/{chId}/delete" | ||||
|             section [ _id "churchList"; _class "pt-data-list"; _ariaLabel "Church list" ] [ | ||||
|                 header [] [ locStr s["Actions"] ] | ||||
|                 header [] [ locStr s["Name"] ] | ||||
|                 header [] [ locStr s["Location"] ] | ||||
|                 header [] [ locStr s["Groups"] ] | ||||
|                 header [] [ locStr s["Requests"] ] | ||||
|                 header [] [ locStr s["Users"] ] | ||||
|                 header [] [ locStr s["Interface?"] ] | ||||
|                 for church in churches do | ||||
|                     let churchId  = shortGuid church.Id.Value | ||||
|                     let delAction = $"/church/{churchId}/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 $"/church/{chId}/edit"; _title s["Edit This Church"].Value ] [ icon "edit" ] | ||||
|                                       $"""{s["Church"].Value.ToLower ()} ({church.Name})"""] | ||||
|                     div [ _class "row" ] [ | ||||
|                         div [] [ | ||||
|                             a [ _href $"/church/{churchId}/edit"; _title s["Edit This Church"].Value ] [ icon "edit" ] | ||||
|                             a [ _href    delAction | ||||
|                                 _title   s["Delete This Church"].Value | ||||
|                                 _onclick $"return PT.confirmDelete('{delAction}','{delPrompt}')" ] [ | ||||
|                                 icon "delete_forever" | ||||
|                             ] | ||||
|                         ] | ||||
|                         td [] [ str ch.Name ] | ||||
|                         td [] [ str ch.City; rawText ", "; str ch.State ] | ||||
|                         td [ _class "pt-right-text" ] [ rawText (stats[chId].SmallGroups.ToString "N0") ] | ||||
|                         td [ _class "pt-right-text" ] [ rawText (stats[chId].PrayerRequests.ToString "N0") ] | ||||
|                         td [ _class "pt-right-text" ] [ rawText (stats[chId].Users.ToString "N0") ] | ||||
|                         td [ _class "pt-center-text" ] [ locStr s[if ch.HasVpsInterface then "Yes" else "No"] ] | ||||
|                     ]) | ||||
|                 |> tbody [] | ||||
|                         div [] [ str church.Name ] | ||||
|                         div [] [ str church.City; rawText ", "; str church.State ] | ||||
|                         div [ _class "pt-right-text" ] [ rawText (stats[churchId].SmallGroups.ToString "N0") ] | ||||
|                         div [ _class "pt-right-text" ] [ rawText (stats[churchId].PrayerRequests.ToString "N0") ] | ||||
|                         div [ _class "pt-right-text" ] [ rawText (stats[churchId].Users.ToString "N0") ] | ||||
|                         div [ _class "pt-center-text" ] [ locStr s[if church.HasVpsInterface then "Yes" else "No"] ] | ||||
|                     ] | ||||
|             ] | ||||
|             // table [ _class "pt-table pt-action-table" ] [ | ||||
|             //     tableHeadings s [ "Actions"; "Name"; "Location"; "Groups"; "Requests"; "Users"; "Interface?" ] | ||||
|             //     churches | ||||
|             //     |> List.map (fun ch -> | ||||
|             //         let chId      = shortGuid ch.Id.Value | ||||
|             //         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 $"/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}')" ] [ | ||||
|             //                     icon "delete_forever" | ||||
|             //                 ] | ||||
|             //             ] | ||||
|             //             td [] [ str ch.Name ] | ||||
|             //             td [] [ str ch.City; rawText ", "; str ch.State ] | ||||
|             //             td [ _class "pt-right-text" ] [ rawText (stats[chId].SmallGroups.ToString "N0") ] | ||||
|             //             td [ _class "pt-right-text" ] [ rawText (stats[chId].PrayerRequests.ToString "N0") ] | ||||
|             //             td [ _class "pt-right-text" ] [ rawText (stats[chId].Users.ToString "N0") ] | ||||
|             //             td [ _class "pt-center-text" ] [ locStr s[if ch.HasVpsInterface then "Yes" else "No"] ] | ||||
|             //         ]) | ||||
|             //     |> tbody [] | ||||
|             // ] | ||||
|     [   div [ _class "pt-center-text" ] [ | ||||
|             br [] | ||||
|             a [ _href $"/church/{emptyGuid}/edit"; _title s["Add a New Church"].Value ] [ | ||||
|  | ||||
| @ -36,18 +36,20 @@ module Configure = | ||||
|         (ctx.Configuration.GetSection >> opts.Configure >> ignore) "Kestrel" | ||||
| 
 | ||||
|     open System.Globalization | ||||
|     open System.IO | ||||
|     open Microsoft.AspNetCore.Authentication.Cookies | ||||
|     open Microsoft.AspNetCore.Localization | ||||
|     open Microsoft.EntityFrameworkCore | ||||
|     open Microsoft.Extensions.DependencyInjection | ||||
|     open NeoSmart.Caching.Sqlite | ||||
|     open NodaTime | ||||
|      | ||||
|     /// Configure ASP.NET Core's service collection (dependency injection container) | ||||
|     let services (svc : IServiceCollection) = | ||||
|         let _ = svc.AddOptions() | ||||
|         let _ = svc.AddLocalization(fun options -> options.ResourcesPath <- "Resources") | ||||
|         let _ = svc.AddOptions () | ||||
|         let _ = svc.AddLocalization (fun options -> options.ResourcesPath <- "Resources") | ||||
|         let _ = | ||||
|             svc.Configure<RequestLocalizationOptions>(fun (opts : RequestLocalizationOptions) -> | ||||
|             svc.Configure<RequestLocalizationOptions> (fun (opts : RequestLocalizationOptions) -> | ||||
|                 let supportedCultures =[| | ||||
|                     CultureInfo "en-US"; CultureInfo "en-GB"; CultureInfo "en-AU"; CultureInfo "en" | ||||
|                     CultureInfo "es-MX"; CultureInfo "es-ES"; CultureInfo "es" | ||||
| @ -57,20 +59,20 @@ module Configure = | ||||
|                 opts.SupportedUICultures   <- supportedCultures) | ||||
|         let _ = | ||||
|             svc.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) | ||||
|                 .AddCookie(fun opts -> | ||||
|                 .AddCookie (fun opts -> | ||||
|                     opts.ExpireTimeSpan    <- TimeSpan.FromMinutes 120. | ||||
|                     opts.SlidingExpiration <- true | ||||
|                     opts.AccessDeniedPath  <- "/error/403") | ||||
|         let _ = svc.AddAuthorization () | ||||
|         let _ = svc.AddDistributedMemoryCache() | ||||
|         let _ = svc.AddSession() | ||||
|         let _ = svc.AddAntiforgery() | ||||
|         let _ = svc.AddRouting() | ||||
|         let _ = svc.AddSqliteCache (fun opts -> opts.CachePath <- Path.Combine (".", "session.db")) | ||||
|         let _ = svc.AddSession () | ||||
|         let _ = svc.AddAntiforgery () | ||||
|         let _ = svc.AddRouting () | ||||
|         let _ = svc.AddSingleton<IClock> SystemClock.Instance | ||||
|          | ||||
|         let config = svc.BuildServiceProvider().GetRequiredService<IConfiguration> () | ||||
|         let _      = | ||||
|             svc.AddDbContext<AppDbContext>( | ||||
|             svc.AddDbContext<AppDbContext> ( | ||||
|                 (fun options -> options.UseNpgsql (config.GetConnectionString "PrayerTracker") |> ignore), | ||||
|                 ServiceLifetime.Scoped, ServiceLifetime.Singleton) | ||||
|         () | ||||
|  | ||||
| @ -26,6 +26,7 @@ | ||||
|   <ItemGroup> | ||||
|     <PackageReference Include="Giraffe" Version="6.0.0" /> | ||||
|     <PackageReference Include="Giraffe.Htmx" Version="1.8.0" /> | ||||
|     <PackageReference Include="NeoSmart.Caching.Sqlite" Version="6.0.1" /> | ||||
|     <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.5" /> | ||||
|     <PackageReference Update="FSharp.Core" Version="6.0.5" /> | ||||
|   </ItemGroup> | ||||
|  | ||||
| @ -262,6 +262,20 @@ footer a:hover { | ||||
| .pt-right-text { | ||||
|   text-align: right; | ||||
| } | ||||
| 
 | ||||
| .pt-data-list { | ||||
|   display: grid; | ||||
|   justify-content: center; | ||||
|   grid-row-gap: .5rem; | ||||
|   grid-column-gap: 1rem; | ||||
| } | ||||
| .pt-data-list .row { | ||||
|   display: contents; | ||||
| } | ||||
| .pt-data-list .row:hover > * { | ||||
|   background-color: purple; | ||||
| } | ||||
| 
 | ||||
| .pt-table { | ||||
|   margin: auto; | ||||
|   border-collapse: collapse; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user