diff --git a/app.moon b/app.moon index c077fb7..b2bd599 100644 --- a/app.moon +++ b/app.moon @@ -2,9 +2,8 @@ lapis = require "lapis" console = require "lapis.console" import respond_to from require "lapis.application" -import trim from require "lapis.util" import escape_identifier from require "lapis.db" -import process_tags from require "helpers" +import create_track, update_track from require "helpers" import Tracks from require "models" @@ -21,36 +20,14 @@ class extends lapis.Application else return redirect_to: @url_for "tracks" POST: => - if @track = Tracks\find id: tonumber @params.id - updates = {} - -- automatic tags - for field in *{"artist", "mood", "link", "genre"} - if @params[field] - if @params.tags - @params.tags ..= " #{field}:#{@params[field]}" - else - @params.tags = "#{field}:#{@params[field]}" - -- update all fields - for field in pairs Tracks.fields - if @params[field] - switch field - when "status" - updates.status = Tracks.statuses\for_db tonumber(@params.status) or @params.status - when "quality" - updates.quality = Tracks.qualities\for_db tonumber(@params.quality) or @params.quality - when "tags" - updates.tags = process_tags @params.tags - when "id" - nil -- IDs cannot be modified - else - updates[field] = trim @params[field] - @track\update updates + if track = update_track(@params) return redirect_to: @url_for "track", id: @track.id else return redirect_to: @url_for "tracks" } [tracks: "/tracks(/:order[%a])(/:asc_desc)(/:page[%d])"]: => + update_track(@params) if @params.id -- update a track if needed -- validate order field @order = tostring(@params.order)\lower! unless Tracks.fields[@order] @@ -69,31 +46,15 @@ class extends lapis.Application if @page > @last_page return redirect_to: @url_for "tracks", order: @order, asc_desc: @asc_desc, page: @last_page - @tracks = tracks\get_page @page + @tracks = tracks\get_page(@page) return render: true - -- NOTE deprecated - [index: "/(:page[%d])"]: respond_to { - GET: => - tracks = Tracks\paginated "* ORDER BY id", per_page: 32 - @page = tonumber(@params.page) or 1 - @tracks = tracks\get_page @page - render: true + [new_track: "/new"]: respond_to { + GET: => render: true POST: => - if @params.id - track = Tracks\find id: @params.id - track\update { - artist: @params.artist - title: @params.title - link: @params.link - status: tonumber @params.status - } + track = create_track(@params) + if track + redirect_to: @url_for "track", id: track.id else - Tracks\create { - artist: @params.artist - title: @params.title - link: @params.link - status: @params.status - } - redirect_to: @url_for "index", page: @params.page + redirect_to: @url_for "new_track" } diff --git a/helpers.moon b/helpers.moon index fb96bfd..c387e76 100644 --- a/helpers.moon +++ b/helpers.moon @@ -12,6 +12,39 @@ process_tags = (tags_str) -> table.sort taglist, (a, b) -> a\lower! < b\lower! return " #{table.concat taglist, " "} " +update_track = (user_input) -> + if track = Tracks\find id: tonumber @params.id + updates = {} + -- automatic tags + for field in *{"artist", "mood", "link", "genre"} + if user_input[field] and #user_input[field] > 0 -- NOTE includes fix + if user_input.tags + user_input.tags ..= " #{field}:#{user_input[field]\gsub "%s*", "_"}" -- NOTE fix! + else + user_input.tags = "#{field}:#{user_input[field]\gsub "%s*", "_"}" + -- update all fields + for field in pairs Tracks.fields + if user_input[field] + switch field + when "status" + updates.status = Tracks.statuses\for_db user_input.status + when "quality" + updates.quality = Tracks.qualities\for_db user_input.quality + when "tags" + updates.tags = process_tags user_input.tags + when "id" + nil -- IDs cannot be modified + else + updates[field] = trim user_input[field] + track\update updates + +create_track = (user_input) -> + if track = Tracks\create! + user_input.id = track.id + update_track user_input + return { :process_tags + :update_track + :create_track } diff --git a/models/Tracks.moon b/models/Tracks.moon index f2e61d1..615f8e1 100644 --- a/models/Tracks.moon +++ b/models/Tracks.moon @@ -15,7 +15,7 @@ class Tracks extends Model imported: 6 -- needs to be checked out } @qualities: enum { - not_available: 1 -- not in library + unavailable: 1 -- not in library lossless: 2 high: 3 acceptable: 4 diff --git a/views/index.moon b/views/index.moon deleted file mode 100644 index 9a74975..0000000 --- a/views/index.moon +++ /dev/null @@ -1,61 +0,0 @@ -import Widget from require "lapis.html" - -import Tracks from require "models" - -class extends Widget - content: => - div -> - a href: @url_for("index", page: @page - 1), "<" - raw " " - a href: @url_for("index", page: @page + 1), ">" - element "table", -> - tr -> - th "Artist" - th "Title" - th "Link" - th "Status" - th "✓" - - for track in *@tracks - tr -> - form { - action: @url_for "index", page: @page - method: "POST" - enctype: "multipart/form-data" - }, -> - td -> input type: "text", name: "artist", value: track.artist - td -> input type: "text", name: "title", value: track.title - td -> - if track.link and #track.link > 0 - a href: track.link, "*" - else - text "+" - text " " - input type: "text", name: "link", value: track.link - td -> - element "select", name: "status", -> - for status in *Tracks.statuses - if status == Tracks.statuses[track.status] - option value: Tracks.statuses[status], selected: true, status - else - option value: Tracks.statuses[status], status - td -> - input type: "hidden", name: "id", value: track.id - input type: "submit", value: "Update" - - tr -> - form { - action: @url_for "index", page: @page - method: "POST" - enctype: "multipart/form-data" - }, -> - td -> input type: "text", name: "artist", placeholder: "artist" - td -> input type: "text", name: "title", placeholder: "title" - td -> - raw "   " - input type: "text", name: "link", placeholder: "link" - td -> - element "select", name: "status", -> - for status in *Tracks.statuses - option value: Tracks.statuses[status], status - td -> input type: "submit", value: "Submit" diff --git a/views/new_track.moon b/views/new_track.moon new file mode 100644 index 0000000..1d158fc --- /dev/null +++ b/views/new_track.moon @@ -0,0 +1,54 @@ +import Widget from require "lapis.html" + +import trim from require "lapis.util" + +import Tracks from require "models" + +class extends Widget + content: => + div -> + form { + action: @url_for "new_track" + method: "POST" + enctype: "multipart/form" + }, -> + text "Artist: " + input type: "text", name: "artist", placeholder: "Artist" + text " Title: " + input type: "text", name: "title", placeholder: "Title" + br! + + text "Album: " + input type: "text", name: "album", placeholder: "Album" + text " Link: " + input type: "text", name: "link", placeholder: "Link" + br! + + text "Status: " + element "select", name: "status", -> + statuses = Tracks.statuses + for status_name in *statuses + if status_name == "new" + option value: statuses[status_name], selected: true, status_name + else + option value: statuses[status_name], status_name + text " Quality: " + element "select", name: "quality", -> + qualities = Tracks.qualities + for quality_name in *qualities + if quality_name == "unavailable" + option value: qualities[quality_name], selected: true, quality_name + else + option value: qualities[quality_name], quality_name + br! + + text "Genre: " + input type: "text", name: "genre", placeholder: "Genre" + text " Mood: " + input type: "text", name: "mood", placeholder: "Mood" + br! + + text "Tags: " + textarea rows: 8, name: "tags", placeholder: "untagged" + br! + input type: "submit", value: "Update" diff --git a/views/track.moon b/views/track.moon index 93b645c..d3824fc 100644 --- a/views/track.moon +++ b/views/track.moon @@ -65,7 +65,6 @@ class extends Widget br! text "Tags: " - -- input type: "text", name: "tags", value: trim(@track.tags), placeholder: "untagged" textarea rows: 8, name: "tags", placeholder: "untagged", trim(@track.tags) br! input type: "submit", value: "Update" diff --git a/views/tracks.moon b/views/tracks.moon index 3980761..e8f9ad2 100644 --- a/views/tracks.moon +++ b/views/tracks.moon @@ -1,5 +1,6 @@ import Widget from require "lapis.html" +import trim from require "lapis.util" import Tracks from require "models" class extends Widget @@ -37,18 +38,42 @@ class extends Widget th "Link" th "Status" th "Quality" + th "✓" for track in *@tracks tr -> - td -> - a href: @url_for("track", id: track.id), track.title - td track.artist - td track.genre - td track.mood - td track.album - td -> - if track.link and #track.link > 0 - a href: track.link, track.link - td Tracks.statuses[track.status] - td Tracks.qualities[track.quality] + form { + action: @url_for "tracks", order: @order, asc_desc: @asc_desc, page: @page + method: "POST" + enctype: "multipart/form-data" + }, -> + td -> input type: "text", name: "title", value: track.title + td -> input type: "text", name: "artist", value: track.artist + td -> input type: "text", name: "genre", value: track.genre + td -> input type: "text", name: "mood", value: track.mood + td -> input type: "text", name: "album", value: track.album + td -> + if track.link and #track.link > 0 + a href: track.link, "*" + else + text "+" + text " " + input type: "text", name: "link", value: track.link + td -> + element "select", name: "status", -> + for status_name in *Tracks.statuses + if status_name == Tracks.statuses[track.status] + option value: Tracks.statuses[status_name], selected: true, status_name + else + option value: Tracks.statuses[status_name], status_name + td -> + element "select", name: "quality", -> + for quality_name in *Tracks.qualities + if quality_name == Tracks.qualities[track.quality] + option value: Tracks.qualities[quality_name], selected: true, quality_name + else + option value: Tracks.qualities[quality_name], quality_name + td -> + input type: "hidden", name: "id", value: track.id + input type: "submit", value: "Update" @menu!