added track edit pages

This commit is contained in:
Tangent 2019-04-17 23:23:16 -07:00
parent f24c00d517
commit b6d377f687
4 changed files with 103 additions and 0 deletions

View File

@ -2,11 +2,42 @@ lapis = require "lapis"
console = require "lapis.console"
import respond_to from require "lapis.application"
import trim from require "lapis.util"
import process_tags from require "helpers"
import Tracks from require "models"
class extends lapis.Application
"/console": console.make!
[track: "/track/:id[%d]"]: respond_to {
GET: =>
if @track = Tracks\find id: tonumber @params.id
return render: true
else
return redirect_to: @url_for "tracks"
POST: =>
if @track = Tracks\find id: tonumber @params.id
updates = {}
for field in pairs Tracks.fields
if @params[field]
switch field
when "status"
updates.status = Tracks.statuses\for_db @params.status
when "quality"
updates.quality = Tracks.qualities\for_db @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
return redirect_to: @url_for "track", id: @track.id
else
return redirect_to: @url_for "tracks"
}
-- TODO figure out why [%u] character class does not work
[tracks: "/tracks(/:order[%a])(/:asc_desc)(/:page[%d])"]: =>
-- validate order field
@ -31,6 +62,7 @@ class extends lapis.Application
@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

17
helpers.moon Normal file
View File

@ -0,0 +1,17 @@
process_tags = (tags_str) ->
-- split into a table to garuntee uniqueness
unique = {}
for tag in tags_str\gmatch "%S+"
unique[tag] = true
-- place back into an array
taglist = {}
for tag in pairs unique
table.insert taglist, tag
-- sort case-sensitively and then case-insensitively (so capitalized tags appear before their uncapitalized counterparts)
table.sort taglist
table.sort taglist, (a, b) -> a\lower! < b\lower!
return " #{table.concat taglist, " "} "
return {
:process_tags
}

View File

@ -31,4 +31,5 @@ class Tracks extends Model
genre: true
tags: true
quality: true
mood: true
}

53
views/track.moon Normal file
View File

@ -0,0 +1,53 @@
import Widget from require "lapis.html"
import trim from require "lapis.util"
import Tracks from require "models"
class extends Widget
content: =>
form {
action: @url_for "track", id: @track.id
method: "POST"
enctype: "multipart/form"
}, ->
text "Artist: "
input type: "text", name: "artist", value: @track.artist, placeholder: "Artist"
text " Title: "
input type: "text", name: "title", value: @track.title, placeholder: "Title"
br!
text "Album: "
input type: "text", name: "album", value: @track.album, placeholder: "Album"
text " Link: "
input type: "text", name: "link", value: @track.link, placeholder: "Link"
br!
text "Status: "
element "select", name: "status", ->
statuses = Tracks.statuses
for status in *statuses
if status == statuses[@track.status]
option value: statuses[status], selected: true, status
else
option value: statuses[status], status
text " Quality: "
element "select", name: "quality", ->
qualities = Tracks.qualities
for quality in *qualities
if quality == qualities[@track.quality]
option value: qualities[quality], selected: true, quality
else
option value: qualities[quality], quality
br!
text "Genre: "
input type: "text", name: "genre", value: @track.genre, placeholder: "Genre"
text " Mood: "
input type: "text", name: "mood", value: @track.mood, placeholder: "Mood"
br!
text "Tags: "
input type: "text", name: "tags", value: trim(@track.tags), placeholder: "untagged"
br!
input type: "submit", value: "Update"