# @cjsx React.DOM @Posts = React.createClass( propTypes: site: React.PropTypes.object.isRequired getInitialState: -> { loading: false, posts: null } fetchPosts: -> return if @state.loading @setState(loading: true) $.getq("default", "/api/posts").always(@handleResponse).done(@handleSuccess).fail(@handleError) handleResponse: -> @setState(loading: false) if @isMounted() handleSuccess: (response) -> @setState(posts: response.posts) if @isMounted() handleError: (error) -> $.growl("Could not load posts: #{error.statusText} (#{error.status})", growlError) componentWillMount: -> @fetchPosts() @timer = setInterval(@fetchPosts, 5000) $(document).on("fetchPosts", @fetchPosts) componentWillUnmount: -> clearInterval(@timer) $(document).off("fetchPosts", @fetchPosts) render: ->
{@state.posts?.map(((post) -> ).bind(this))}
) @NewPostPartial = React.createClass( mixins: [ReactRouter.Navigation] propTypes: site: React.PropTypes.object.isRequired getInitialState: -> { loading: false } form: -> $(@refs.form.getDOMNode()) handleSubmit: (event) -> event.preventDefault() return if @state.loading @setState(loading: true) $.postq("default", "/api/posts", @form().serialize()).always(@handleResponse).done(@handleSuccess).fail(@handleError) handleResponse: -> @setState(loading: false) handleSuccess: (response) -> @form()[0].reset() $(document).trigger("fetchPosts") @transitionTo("post_edit", post_id: response.posts.identifier) handleError: (error) -> $.growl(error.responseJSON?.errors.join(", ") || error.statusText, growlError) render: ->
) @PostPartial = React.createClass( mixins: [ReactRouter.Navigation] propTypes: site: React.PropTypes.object.isRequired post: React.PropTypes.object.isRequired getInitialState: -> { loading: false } panelClass: -> if @props.post.added "success" else if @props.post.changed "warning" else if @props.post.deleted "danger" else "default" isoDate: -> try (new Date(@props.post.date.replace(/-/g, "/"))).toISOString() catch e null handleEdit: -> @transitionTo("post_edit", post_id: @props.post.identifier) handleRevert: -> return if @state.loading @setState(loading: true) $.ajaxq("default", type: "PATCH", url: "/api/posts/#{@props.post.identifier}/revert"). always(@handleResponse). done(@handleSuccess). fail(@handleError) handleDelete: -> if @props.post.added return unless confirm("Are you sure? This can't be undone") return if @state.loading @setState(loading: true) $.ajaxq("default", type: "DELETE", url: "/api/posts/#{@props.post.identifier}"). always(@handleResponse). done(@handleSuccess). fail(@handleError) handleRestore: -> return if @state.loading @setState(loading: true) $.ajaxq("default", type: "PATCH", url: "/api/posts/#{@props.post.identifier}/restore"). always(@handleResponse). done(@handleSuccess). fail(@handleError) handleResponse: -> @setState(loading: false) handleSuccess: (response) -> $(document).trigger("fetchPosts") handleError: (error) -> $.growl("Could not load post: #{error.statusText} (#{error.status})", growlError) render: ->

{@props.post.title}

{if @isoDate() then moment(@isoDate()).format("LLL") else ""}
{if @props.post.deleted
else
{if @props.post.changed }
}
) @PostEdit = React.createClass( mixins: [ReactRouter.State, ReactRouter.Navigation] propTypes: site: React.PropTypes.object.isRequired getInitialState: -> { loading: false, post: null } form: -> $(@refs.form.getDOMNode()) frontMatter: -> @props.site.octodmin.front_matter fetchPost: -> return if @state.loading @setState(loading: true) $.getq("default", "/api/posts/#{@getParams().post_id}").always(@handleResponse).done(@handleSuccess).fail(@handleError) handleUpload: (event)-> form = $("
") form.find("input").on("change", (-> event.disableButtons("cmdUpload") data = new FormData(form[0]) $.ajaxq("default", type: "POST" url: "/api/posts/#{@state.post.identifier}/upload" data: data cache: false contentType: false processData: false ).always(-> event.enableButtons("cmdUpload") ).done(((result) -> @handleUploadSuccess(event, result) ).bind(this)).fail(@handleError) ).bind(this)) form.find("input").click() handleUploadSuccess: (event, response) -> event.replaceSelection(response.uploads[0]) handleBack: (event) -> event.preventDefault() @transitionTo("app") handleSubmit: (event) -> event.preventDefault() return if @state.loading @setState(loading: true) data = @form().serializeObject() $.ajaxq("default", type: "PATCH", url: "/api/posts/#{@state.post.identifier}", data: data). always(@handleResponse). done(@handleFormSuccess). fail(@handleError) handleResponse: -> @setState(loading: false) handleSuccess: (response) -> @setState(post: response.posts) handleFormSuccess: (response) -> $.growl("Post is updated", growlSuccess) @transitionTo("post_edit", post_id: response.posts.identifier) handleError: (error) -> $.growl(error.responseJSON?.errors.join(", ") || error.statusText, growlError) componentWillMount: -> @fetchPost() componentDidUpdate: -> return if !@state.post || !@refs.editor return if !/markdown$/.test(@state.post.path) && !/md$/.test(@state.post.path) $(@refs.editor.getDOMNode()).markdown( autofocus: false savable: false iconlibrary: "fa" resize: "vertical" fullscreen: enable: false additionalButtons: [ [{ name: "customGroup" data: [{ name: "cmdUpload" title: "Upload" icon: "fa fa-upload" callback: @handleUpload }] }] ] ) render: -> {if @state.post
{Object.keys(@frontMatter()).map(((key) -> if key != "title" && key != "date" config = @frontMatter()[key] title = key.charAt(0).toUpperCase() + key.slice(1)
).bind(this))}
}
)