Version 2.1 #41
@ -604,6 +604,59 @@ type EditMyInfoModel = {
|
|||||||
NewPasswordConfirm = "" }
|
NewPasswordConfirm = "" }
|
||||||
|
|
||||||
|
|
||||||
|
/// View model common to page and post edits
|
||||||
|
type EditCommonModel() =
|
||||||
|
|
||||||
|
/// Find the latest revision within a list of revisions
|
||||||
|
let findLatestRevision (revs: Revision list) =
|
||||||
|
match revs |> List.sortByDescending _.AsOf |> List.tryHead with Some rev -> rev | None -> Revision.Empty
|
||||||
|
|
||||||
|
/// The ID of the page or post
|
||||||
|
member val Id = "" with get, set
|
||||||
|
|
||||||
|
/// The title of the page or post
|
||||||
|
member val Title = "" with get, set
|
||||||
|
|
||||||
|
/// The permalink for the page or post
|
||||||
|
member val Permalink = "" with get, set
|
||||||
|
|
||||||
|
/// The entity to which this model applies ("page" or "post")
|
||||||
|
member val Entity = "" with get, set
|
||||||
|
|
||||||
|
/// Whether to provide a link to manage chapters
|
||||||
|
member val IncludeChapterLink = false with get, set
|
||||||
|
|
||||||
|
/// The source type ("HTML" or "Markdown")
|
||||||
|
member val Source = "" with get, set
|
||||||
|
|
||||||
|
/// The text of the page or post
|
||||||
|
member val Text = "" with get, set
|
||||||
|
|
||||||
|
/// Whether this is a new page or post
|
||||||
|
member this.IsNew with get () = this.Id = "new"
|
||||||
|
|
||||||
|
/// Fill the properties of this object from a page
|
||||||
|
member this.FromPage (page: Page) =
|
||||||
|
let latest = findLatestRevision page.Revisions
|
||||||
|
this.Id <- string page.Id
|
||||||
|
this.Title <- page.Title
|
||||||
|
this.Permalink <- string page.Permalink
|
||||||
|
this.Entity <- "page"
|
||||||
|
this.Source <- latest.Text.SourceType
|
||||||
|
this.Text <- latest.Text.Text
|
||||||
|
|
||||||
|
/// Fill the properties of this object from a post
|
||||||
|
member this.FromPost (post: Post) =
|
||||||
|
let latest = findLatestRevision post.Revisions
|
||||||
|
this.Id <- string post.Id
|
||||||
|
this.Title <- post.Title
|
||||||
|
this.Permalink <- string post.Permalink
|
||||||
|
this.Entity <- "post"
|
||||||
|
this.IncludeChapterLink <- Option.isSome post.Episode && Option.isSome post.Episode.Value.Chapters
|
||||||
|
this.Source <- latest.Text.SourceType
|
||||||
|
this.Text <- latest.Text.Text
|
||||||
|
|
||||||
|
|
||||||
/// View model to edit a page
|
/// View model to edit a page
|
||||||
[<CLIMutable; NoComparison; NoEquality>]
|
[<CLIMutable; NoComparison; NoEquality>]
|
||||||
type EditPageModel = {
|
type EditPageModel = {
|
||||||
|
@ -229,9 +229,8 @@ let register () =
|
|||||||
typeof<RedirectRule>; typeof<RssOptions>; typeof<TagMap>; typeof<UploadDestination>; typeof<WebLog>
|
typeof<RedirectRule>; typeof<RssOptions>; typeof<TagMap>; typeof<UploadDestination>; typeof<WebLog>
|
||||||
// View models
|
// View models
|
||||||
typeof<AppViewContext>; typeof<DisplayCategory>; typeof<DisplayCustomFeed>; typeof<DisplayPage>
|
typeof<AppViewContext>; typeof<DisplayCategory>; typeof<DisplayCustomFeed>; typeof<DisplayPage>
|
||||||
typeof<DisplayTheme>; typeof<DisplayUpload>; typeof<DisplayUser>; typeof<EditCategoryModel>
|
typeof<DisplayTheme>; typeof<DisplayUpload>; typeof<DisplayUser>; typeof<EditPageModel>
|
||||||
typeof<EditCustomFeedModel>; typeof<EditPageModel>; typeof<EditPostModel>; typeof<EditRssModel>
|
typeof<EditPostModel>; typeof<PostDisplay>; typeof<PostListItem>; typeof<UserMessage>
|
||||||
typeof<PostDisplay>; typeof<PostListItem>; typeof<SettingsModel>; typeof<UserMessage>
|
|
||||||
// Framework types
|
// Framework types
|
||||||
typeof<AntiforgeryTokenSet>; typeof<DateTime option>; typeof<int option>; typeof<KeyValuePair>
|
typeof<AntiforgeryTokenSet>; typeof<DateTime option>; typeof<int option>; typeof<KeyValuePair>
|
||||||
typeof<MetaItem list>; typeof<string list>; typeof<string option>; typeof<TagMap list>
|
typeof<MetaItem list>; typeof<string list>; typeof<string option>; typeof<TagMap list>
|
||||||
|
@ -310,6 +310,40 @@ let roundTrip = InstantPattern.CreateWithInvariantCulture "uuuu'-'MM'-'dd'T'HH':
|
|||||||
let private capitalize (it: string) =
|
let private capitalize (it: string) =
|
||||||
$"{(string it[0]).ToUpper()}{it[1..]}"
|
$"{(string it[0]).ToUpper()}{it[1..]}"
|
||||||
|
|
||||||
|
/// The common edit form shared by pages and posts
|
||||||
|
let commonEdit (model: EditCommonModel) app = [
|
||||||
|
textField [ _required; _autofocus ] (nameof model.Title) "Title" model.Title []
|
||||||
|
textField [ _required ] (nameof model.Permalink) "Permalink" model.Permalink [
|
||||||
|
if not model.IsNew then
|
||||||
|
let urlBase = relUrl app $"admin/{model.Entity}/{model.Id}"
|
||||||
|
span [ _class "form-text" ] [
|
||||||
|
a [ _href $"{urlBase}/permalinks" ] [ raw "Manage Permalinks" ]; actionSpacer
|
||||||
|
a [ _href $"{urlBase}/revisions" ] [ raw "Manage Revisions" ]
|
||||||
|
if model.IncludeChapterLink then
|
||||||
|
span [ _id "chapterEditLink" ] [
|
||||||
|
actionSpacer; a [ _href $"{urlBase}/chapters" ] [ raw "Manage Chapters" ]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
div [ _class "mb-2" ] [
|
||||||
|
label [ _for "text" ] [ raw "Text" ]; raw " "
|
||||||
|
div [ _class "btn-group btn-group-sm"; _roleGroup; _ariaLabel "Text format button group" ] [
|
||||||
|
input [ _type "radio"; _name (nameof model.Source); _id "source_html"; _class "btn-check"
|
||||||
|
_value (string Html); if model.Source = string Html then _checked ]
|
||||||
|
label [ _class "btn btn-sm btn-outline-secondary"; _for "source_html" ] [ raw "HTML" ]
|
||||||
|
input [ _type "radio"; _name (nameof model.Source); _id "source_md"; _class "btn-check"
|
||||||
|
_value (string Markdown); if model.Source = string Markdown then _checked ]
|
||||||
|
label [ _class "btn btn-sm btn-outline-secondary"; _for "source_md" ] [ raw "Markdown" ]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
div [ _class "pb-3" ] [
|
||||||
|
textarea [ _name (nameof model.Text); _id (nameof model.Text); _class "form-control"; _rows "20" ] [
|
||||||
|
raw model.Text
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
/// Form to manage permalinks for pages or posts
|
/// Form to manage permalinks for pages or posts
|
||||||
let managePermalinks (model: ManagePermalinksModel) app = [
|
let managePermalinks (model: ManagePermalinksModel) app = [
|
||||||
let baseUrl = relUrl app $"admin/{model.Entity}/"
|
let baseUrl = relUrl app $"admin/{model.Entity}/"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user