From ff87a71c9cd5752c40e8ab28e2475507dea7108b Mon Sep 17 00:00:00 2001 From: "Daniel J. Summers" Date: Tue, 26 Apr 2022 21:04:20 -0400 Subject: [PATCH] Add page/post templates for personal theme - Add images from personal site --- src/MyWebLog.Data/Data.fs | 12 +-- src/MyWebLog.Domain/ViewModels.fs | 46 +++++++--- src/MyWebLog/Handlers.fs | 46 ++++++++-- src/MyWebLog/appsettings.json | 2 +- .../themes/admin/category-edit.liquid | 6 +- src/MyWebLog/themes/admin/post-edit.liquid | 79 ++++++++++++++++++ src/MyWebLog/themes/admin/post-list.liquid | 8 +- src/MyWebLog/themes/admin/settings.liquid | 20 +++-- .../themes/daniel-j-summers/index.liquid | 59 +++++++++++++ .../themes/daniel-j-summers/layout.liquid | 8 +- .../daniel-j-summers/single-page.liquid | 6 ++ .../daniel-j-summers/single-post.liquid | 63 ++++++++++++++ .../img/daniel-j-summers/2005/03/jameson.jpg | Bin 0 -> 92562 bytes .../2007/05/0525_kidswalk380x285.jpg | Bin 0 -> 24858 bytes .../2007/06/hillary_banner.jpg | Bin 0 -> 12166 bytes .../2007/08/propaganda_pic.jpg | Bin 0 -> 11885 bytes .../daniel-j-summers/2007/10/steak_fry.jpg | Bin 0 -> 38590 bytes .../2007/11/uber_cool_nerd_king.png | Bin 0 -> 13423 bytes .../img/daniel-j-summers/2007/12/gw_comic.jpg | Bin 0 -> 25257 bytes .../img/daniel-j-summers/2008/07/believe.png | Bin 0 -> 72500 bytes .../img/daniel-j-summers/2008/07/dearth.png | Bin 0 -> 72656 bytes .../2008/10/noclothes2ek3.jpg | Bin 0 -> 68846 bytes .../2008/12/christmas_lolcat.jpg | Bin 0 -> 43580 bytes .../img/daniel-j-summers/2008/12/rams.png | Bin 0 -> 56667 bytes .../2009/04/obamas_deep_impact.jpg | Bin 0 -> 22499 bytes .../daniel-j-summers/2009/04/obamas_plan.jpg | Bin 0 -> 40204 bytes .../2009/05/obama-koolaid.jpg | Bin 0 -> 9397 bytes .../img/daniel-j-summers/2009/09/lnm.jpg | Bin 0 -> 13059 bytes .../2010/01/human_life_300.jpg | Bin 0 -> 16269 bytes .../2010/09/911-incoming-300x200.jpg | Bin 0 -> 19077 bytes .../2010/09/911-jump-170x300.jpg | Bin 0 -> 14915 bytes .../2010/09/d22_2010_tshirt.jpg | Bin 0 -> 40148 bytes .../2010/12/gmail_inbox_zero.png | Bin 0 -> 283040 bytes .../2011/05/michelle_at_pretty_place.png | Bin 0 -> 129491 bytes .../2011/09/never_again-249x300.jpg | Bin 0 -> 30811 bytes .../2011/09/the_cains-300x259.jpg | Bin 0 -> 18775 bytes .../2011/10/999_tax_plan_analysis-54x1024.jpg | Bin 0 -> 15399 bytes .../2011/10/999_tax_plan_analysis.jpg | Bin 0 -> 242337 bytes .../2011/10/money-from-rich-people.jpg | Bin 0 -> 107206 bytes .../2011/11/reduce-reuse-recycle-150x150.jpg | Bin 0 -> 5635 bytes .../2011/12/king_size_bed-300x188.jpg | Bin 0 -> 25777 bytes .../2012/05/michelle_brugge.jpg | Bin 0 -> 19281 bytes .../2012/07/freedom_is_won-300x300.jpg | Bin 0 -> 26071 bytes .../2012/07/salman_yard-300x183.jpg | Bin 0 -> 13425 bytes .../daniel-j-summers/2012/08/wrong-way.jpg | Bin 0 -> 98145 bytes .../2012/11/brace_yourself-201x300.jpg | Bin 0 -> 21173 bytes .../2013/08/cnn_tech_hoodie.png | Bin 0 -> 57096 bytes .../2013/08/michelle_flowers-300x256.png | Bin 0 -> 132043 bytes .../2013/10/pink-ribbon-166x300.jpg | Bin 0 -> 11697 bytes .../04/childhood-1980-vs-2014-259x300.jpg | Bin 0 -> 39405 bytes .../img/daniel-j-summers/2014/05/boy_flag.jpg | Bin 0 -> 78447 bytes .../2014/06/miss-nevada-usa-2014.jpg | Bin 0 -> 42524 bytes .../2020/01/dave-michelle-joy.jpg | Bin 0 -> 47906 bytes .../2020/07/pride-flag-bad.png | Bin 0 -> 15533 bytes .../2020/07/pride-flag-good.png | Bin 0 -> 2393 bytes .../2020/07/saints-flag-bad.gif | Bin 0 -> 6859 bytes .../2020/07/saints-flag-good.jpg | Bin 0 -> 17966 bytes .../2020/07/thin-blue-line-bad.jpg | Bin 0 -> 23552 bytes .../2020/07/thin-blue-line-good.png | Bin 0 -> 1635 bytes .../img/daniel-j-summers/2020/07/us-flag.png | Bin 0 -> 10091 bytes .../2021/04/allen-j-summers-337x400.jpg | Bin 0 -> 34222 bytes src/MyWebLog/wwwroot/themes/admin/admin.css | 7 ++ .../themes/daniel-j-summers/csurams.png | Bin 0 -> 20239 bytes .../wwwroot/themes/daniel-j-summers/jo20.png | Bin 0 -> 15439 bytes .../wwwroot/themes/daniel-j-summers/style.css | 5 +- .../themes/daniel-j-summers/tennessee.png | Bin 0 -> 756 bytes 66 files changed, 320 insertions(+), 47 deletions(-) create mode 100644 src/MyWebLog/themes/daniel-j-summers/index.liquid create mode 100644 src/MyWebLog/themes/daniel-j-summers/single-page.liquid create mode 100644 src/MyWebLog/themes/daniel-j-summers/single-post.liquid create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2005/03/jameson.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2007/05/0525_kidswalk380x285.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2007/06/hillary_banner.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2007/08/propaganda_pic.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2007/10/steak_fry.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2007/11/uber_cool_nerd_king.png create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2007/12/gw_comic.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2008/07/believe.png create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2008/07/dearth.png create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2008/10/noclothes2ek3.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2008/12/christmas_lolcat.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2008/12/rams.png create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2009/04/obamas_deep_impact.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2009/04/obamas_plan.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2009/05/obama-koolaid.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2009/09/lnm.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2010/01/human_life_300.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2010/09/911-incoming-300x200.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2010/09/911-jump-170x300.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2010/09/d22_2010_tshirt.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2010/12/gmail_inbox_zero.png create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2011/05/michelle_at_pretty_place.png create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2011/09/never_again-249x300.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2011/09/the_cains-300x259.jpg create mode 100755 src/MyWebLog/wwwroot/img/daniel-j-summers/2011/10/999_tax_plan_analysis-54x1024.jpg create mode 100755 src/MyWebLog/wwwroot/img/daniel-j-summers/2011/10/999_tax_plan_analysis.jpg create mode 100755 src/MyWebLog/wwwroot/img/daniel-j-summers/2011/10/money-from-rich-people.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2011/11/reduce-reuse-recycle-150x150.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2011/12/king_size_bed-300x188.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2012/05/michelle_brugge.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2012/07/freedom_is_won-300x300.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2012/07/salman_yard-300x183.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2012/08/wrong-way.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2012/11/brace_yourself-201x300.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2013/08/cnn_tech_hoodie.png create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2013/08/michelle_flowers-300x256.png create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2013/10/pink-ribbon-166x300.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2014/04/childhood-1980-vs-2014-259x300.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2014/05/boy_flag.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2014/06/miss-nevada-usa-2014.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2020/01/dave-michelle-joy.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2020/07/pride-flag-bad.png create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2020/07/pride-flag-good.png create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2020/07/saints-flag-bad.gif create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2020/07/saints-flag-good.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2020/07/thin-blue-line-bad.jpg create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2020/07/thin-blue-line-good.png create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2020/07/us-flag.png create mode 100644 src/MyWebLog/wwwroot/img/daniel-j-summers/2021/04/allen-j-summers-337x400.jpg create mode 100644 src/MyWebLog/wwwroot/themes/daniel-j-summers/csurams.png create mode 100644 src/MyWebLog/wwwroot/themes/daniel-j-summers/jo20.png create mode 100644 src/MyWebLog/wwwroot/themes/daniel-j-summers/tennessee.png diff --git a/src/MyWebLog.Data/Data.fs b/src/MyWebLog.Data/Data.fs index 0dbcbf3..a3015c7 100644 --- a/src/MyWebLog.Data/Data.fs +++ b/src/MyWebLog.Data/Data.fs @@ -376,7 +376,7 @@ module Post = let findByPermalink (permalink : Permalink) (webLogId : WebLogId) = rethink { withTable Table.Post - getAll [ r.Array(permalink, webLogId) ] (nameof permalink) + getAll [ r.Array(webLogId, permalink) ] (nameof permalink) without [ "priorPermalinks"; "revisions" ] limit 1 result; withRetryDefault @@ -468,18 +468,12 @@ module WebLog = resultOption; withRetryOptionDefault } - /// Update web log settings + /// Update web log settings (updates all values) let updateSettings (webLog : WebLog) = rethink { withTable Table.WebLog get webLog.id - update [ - "name", webLog.name :> obj - "subtitle", webLog.subtitle - "defaultPage", webLog.defaultPage - "postsPerPage", webLog.postsPerPage - "timeZone", webLog.timeZone - ] + replace webLog write; withRetryDefault; ignoreResult } diff --git a/src/MyWebLog.Domain/ViewModels.fs b/src/MyWebLog.Domain/ViewModels.fs index c0261de..95ee8d1 100644 --- a/src/MyWebLog.Domain/ViewModels.fs +++ b/src/MyWebLog.Domain/ViewModels.fs @@ -218,6 +218,15 @@ type EditPostModel = /// Values of metadata items metaValues : string[] + + /// Whether to override the published date/time + setPublished : bool + + /// The published date/time to override + pubOverride : Nullable + + /// Whether all revisions should be purged and the override date set as the updated date as well + setUpdated : bool } /// Create an edit model from an existing past static member fromPost (post : Post) = @@ -226,17 +235,20 @@ type EditPostModel = | Some rev -> rev | None -> Revision.empty let post = if post.metadata |> List.isEmpty then { post with metadata = [ MetaItem.empty ] } else post - { postId = PostId.toString post.id - title = post.title - permalink = Permalink.toString post.permalink - source = MarkupText.sourceType latest.text - text = MarkupText.text latest.text - tags = String.Join (", ", post.tags) - categoryIds = post.categoryIds |> List.map CategoryId.toString |> Array.ofList - status = PostStatus.toString post.status - doPublish = false - metaNames = post.metadata |> List.map (fun m -> m.name) |> Array.ofList - metaValues = post.metadata |> List.map (fun m -> m.value) |> Array.ofList + { postId = PostId.toString post.id + title = post.title + permalink = Permalink.toString post.permalink + source = MarkupText.sourceType latest.text + text = MarkupText.text latest.text + tags = String.Join (", ", post.tags) + categoryIds = post.categoryIds |> List.map CategoryId.toString |> Array.ofList + status = PostStatus.toString post.status + doPublish = false + metaNames = post.metadata |> List.map (fun m -> m.name) |> Array.ofList + metaValues = post.metadata |> List.map (fun m -> m.value) |> Array.ofList + setPublished = false + pubOverride = Nullable () + setUpdated = false } @@ -350,7 +362,19 @@ type SettingsModel = /// The time zone in which dates/times should be displayed timeZone : string + + /// The theme to use to display the web log + themePath : string } + /// Create a settings model from a web log + static member fromWebLog (webLog : WebLog) = + { name = webLog.name + subtitle = defaultArg webLog.subtitle "" + defaultPage = webLog.defaultPage + postsPerPage = webLog.postsPerPage + timeZone = webLog.timeZone + themePath = webLog.themePath + } [] diff --git a/src/MyWebLog/Handlers.fs b/src/MyWebLog/Handlers.fs index 79072b9..e34b3ac 100644 --- a/src/MyWebLog/Handlers.fs +++ b/src/MyWebLog/Handlers.fs @@ -197,6 +197,16 @@ module private Helpers = /// Handlers to manipulate admin functions module Admin = + open System.IO + + /// The currently available themes + let private themes () = + Directory.EnumerateDirectories "themes" + |> Seq.map (fun it -> it.Split Path.DirectorySeparatorChar |> Array.last) + |> Seq.filter (fun it -> it <> "admin") + |> Seq.map (fun it -> KeyValuePair.Create (it, it)) + |> Array.ofSeq + // GET /admin let dashboard : HttpHandler = requireUser >=> fun next ctx -> task { let webLogId = webLogId ctx @@ -230,20 +240,16 @@ module Admin = return! Hash.FromAnonymousObject {| csrf = csrfToken ctx - model = - { name = webLog.name - subtitle = defaultArg webLog.subtitle "" - defaultPage = webLog.defaultPage - postsPerPage = webLog.postsPerPage - timeZone = webLog.timeZone - } + model = SettingsModel.fromWebLog webLog pages = seq { KeyValuePair.Create ("posts", "- First Page of Posts -") yield! allPages + |> List.sortBy (fun p -> p.title.ToLower ()) |> List.map (fun p -> KeyValuePair.Create (PageId.toString p.id, p.title)) } |> Array.ofSeq + themes = themes () web_log = webLog page_title = "Web Log Settings" |} @@ -263,6 +269,7 @@ module Admin = defaultPage = model.defaultPage postsPerPage = model.postsPerPage timeZone = model.timeZone + themePath = model.themePath } do! Data.WebLog.updateSettings updated conn @@ -510,8 +517,10 @@ module Post = let permalink = (string >> Permalink) ctx.Request.RouteValues["link"] // Current post match! Data.Post.findByPermalink permalink webLog.id conn with - | Some _ -> return! Error.notFound next ctx - // TODO: return via single-post action + | Some post -> + let! model = preparePostList webLog [ post ] 1 1 conn + model.Add ("page_title", post.title) + return! themedView "single-post" next ctx model | None -> // Current page match! Data.Page.findByPermalink permalink webLog.id conn with @@ -610,10 +619,29 @@ module Post = |> List.ofSeq categoryIds = model.categoryIds |> Array.map CategoryId |> List.ofArray status = if model.doPublish then Published else post.status + metadata = Seq.zip model.metaNames model.metaValues + |> Seq.filter (fun it -> fst it > "") + |> Seq.map (fun it -> { name = fst it; value = snd it }) + |> Seq.sortBy (fun it -> $"{it.name.ToLower ()} {it.value.ToLower ()}") + |> List.ofSeq revisions = match post.revisions |> List.tryHead with | Some r when r.text = revision.text -> post.revisions | _ -> revision :: post.revisions } + let post = + match model.setPublished with + | true -> + let dt = DateTime (model.pubOverride.Value.ToUniversalTime().Ticks, DateTimeKind.Utc) + printf $"**** DateKind = {dt.Kind}" + match model.setUpdated with + | true -> + { post with + publishedOn = Some dt + updatedOn = dt + revisions = [ { (List.head post.revisions) with asOf = dt } ] + } + | false -> { post with publishedOn = Some dt } + | false -> post do! (match model.postId with "new" -> Data.Post.add | _ -> Data.Post.update) post conn do! addMessage ctx { UserMessage.success with message = "Post saved successfully" } return! redirectToGet $"/post/{PostId.toString post.id}/edit" next ctx diff --git a/src/MyWebLog/appsettings.json b/src/MyWebLog/appsettings.json index 5099ff2..3ba3a03 100644 --- a/src/MyWebLog/appsettings.json +++ b/src/MyWebLog/appsettings.json @@ -3,5 +3,5 @@ "hostname": "data02.bitbadger.solutions", "database": "myWebLog-dev" }, - "Generator": "myWebLog 2.0-alpha01" + "Generator": "myWebLog 2.0-alpha02" } diff --git a/src/MyWebLog/themes/admin/category-edit.liquid b/src/MyWebLog/themes/admin/category-edit.liquid index 0e5cc26..5927344 100644 --- a/src/MyWebLog/themes/admin/category-edit.liquid +++ b/src/MyWebLog/themes/admin/category-edit.liquid @@ -8,14 +8,14 @@
+ value="{{ model.name | escape }}">
+ value="{{ model.slug | escape }}">
@@ -41,7 +41,7 @@
+ placeholder="A short description of this category" value="{{ model.description | escape }}">
diff --git a/src/MyWebLog/themes/admin/post-edit.liquid b/src/MyWebLog/themes/admin/post-edit.liquid index 9e9aca0..fcebc1f 100644 --- a/src/MyWebLog/themes/admin/post-edit.liquid +++ b/src/MyWebLog/themes/admin/post-edit.liquid @@ -62,6 +62,85 @@ +
+
+
+ + Metadata + + +
+
+ {%- for meta in model.metadata %} +
+
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+ {% endfor -%} +
+ + +
+
+
+
+ {% if model.status == "Published" %} +
+
+
+ Maintenance +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+
+ {% endif %} diff --git a/src/MyWebLog/themes/admin/post-list.liquid b/src/MyWebLog/themes/admin/post-list.liquid index b22ae1d..6a33ec3 100644 --- a/src/MyWebLog/themes/admin/post-list.liquid +++ b/src/MyWebLog/themes/admin/post-list.liquid @@ -5,7 +5,7 @@ Date - Title + Title Author Status Tags @@ -14,7 +14,7 @@ {% for post in model.posts -%} - + {% if post.published_on.has_value -%} {{ post.published_on | date: "MMMM d, yyyy" }} {%- else -%} @@ -31,9 +31,9 @@ Delete - {{ model.authors | value: post.author_id }} + {{ model.authors | value: post.author_id }} {{ post.status }} - {{ post.tags | join: ", " }} + {{ post.tags | join: ", " }} {%- endfor %} diff --git a/src/MyWebLog/themes/admin/settings.liquid b/src/MyWebLog/themes/admin/settings.liquid index 23ecde2..116536d 100644 --- a/src/MyWebLog/themes/admin/settings.liquid +++ b/src/MyWebLog/themes/admin/settings.liquid @@ -4,7 +4,7 @@
-
+
@@ -16,15 +16,25 @@
-
-
-
+
+
+
+ + +
+
Time Zone
-
+