This module depends on the following other modules: |
To generate {{Song datatable}}, invoke using the main function.
local getArgs = require('Module:Arguments').getArgs
local DatatableBuilder = require('Module:DatatableBuilder')
local QueryBuilder = require('Module:QueryBuilder')
local Yesno = require('Module:Yesno')
local DisplayFns = require('Module:DisplayFunctions')
local ProcessingFns = require('Module:ProcessingFunctions')
local p = {}
local function formatName(pageName, songName)
return string.format('[[%s|%s]]', pageName, songName)
end
local function formatBoolean(value)
return DisplayFns.yesAndNo(Yesno(value))
end
local function formatStringToList(delim)
return function(str)
local arr = ProcessingFns.stringToArray(delim)(str)
return DisplayFns.list('unbulleted')(arr)
end
end
function p.main(frame)
local args = getArgs(frame)
local columns = args['columns']
local qb = QueryBuilder.new()
qb:setTables('songs')
:setFields([[
_pageName,
song_id,
jacket,
song_name,
producers,
units,
bpm,
game_duration,
release_date,
song_type,
3d_mv,
2d_mv,
original_mv,
easy_difficulty,
normal_difficulty,
hard_difficulty,
expert_difficulty,
master_difficulty,
easy_notes,
normal_notes,
hard_notes,
expert_notes,
master_notes
]])
:addWhere('songs.song_id', '>', '0')
:setGroupBy('songs.song_id')
:setOrderBy('songs.song_id ASC')
:setLimit(args['limit'] or 500)
:setOffset(args['offset'] or 0)
qb
:addWhereList(
'songs.units',
'HOLDS',
args['units'],
';',
'OR'
)
:addWhere('songs.3d_mv', '=', args['3d mv'])
:addWhere('songs.2d_mv', '=', args['2d mv'])
:addWhere('songs.original_mv', '=', args['original mv'])
:addWhere('songs.song_type', '=', args['type'])
:addWhere('songs.game_duration', '>=', args['min length'])
:addWhere('songs.game_duration', '<=', args['max length'])
:addWhere('songs.release_date', '>=', args['released after'])
:addWhere('songs.release_date', '<=', args['released before'])
:addWhereList(
'songs.easy_difficulty',
'=',
args['easy difficulties'],
',',
'OR'
)
:addWhereList(
'songs.normal_difficulty',
'=',
args['normal difficulties'],
',',
'OR'
)
:addWhereList(
'songs.hard_difficulty',
'=',
args['hard difficulties'],
',',
'OR'
)
:addWhereList(
'songs.expert_difficulty',
'=',
args['expert difficulties'],
',',
'OR'
)
:addWhereList(
'songs.master_difficulty',
'=',
args['master difficulties'],
',',
'OR'
)
local datatable = DatatableBuilder.new()
datatable
:setColumns{
{
name = 'id',
header = 'ID',
dataFields = { 'song_id' }
},
{
name = 'jacket',
header = 'Jacket art',
dataFields = { 'jacket' },
fn = DisplayFns.image('64px'),
css = { ['width'] = '64px' },
sortable = false
},
{
name = 'name',
header = 'Song name',
dataFields = { '_pageName', 'song_name' },
fn = formatName
},
{
name = 'producers',
header = 'Producer(s)',
dataFields = { 'producers' },
fn = formatStringToList(','),
visible = false
},
{
name = 'units',
header = 'Unit(s)',
dataFields = { 'units' },
fn = formatStringToList(';'),
visible = false
},
{
name = 'bpm',
header = 'BPM',
dataFields = { 'bpm' },
visible = false
},
{
name = 'game duration',
header = 'Duration (game-size)',
dataFields = { 'game_duration' },
fn = DisplayFns.minutesAndSeconds,
visible = false
},
{
name = 'release date',
header = 'Release date',
dataFields = { 'release_date' },
visible = false
},
{
name = 'type',
header = 'Type',
dataFields = { 'song_type' },
visible = false
},
{
name = '3d mv',
header = '3D MV?',
dataFields = { '3d_mv' },
fn = formatBoolean,
visible = false
},
{
name = '2d mv',
header = '2D MV?',
dataFields = { '2d_mv' },
fn = formatBoolean,
visible = false
},
{
name = 'original mv',
header = 'Original MV?',
dataFields = { 'original_mv' },
fn = formatBoolean,
visible = false
},
{
name = 'easy difficulty',
header = 'Easy difficulty',
dataFields = { 'easy_difficulty' },
visible = false
},
{
name = 'normal difficulty',
header = 'Normal difficulty',
dataFields = { 'normal_difficulty' },
visible = false
},
{
name = 'hard difficulty',
header = 'Hard difficulty',
dataFields = { 'hard_difficulty' },
visible = false
},
{
name = 'expert difficulty',
header = 'Expert difficulty',
dataFields = { 'expert_difficulty' },
visible = false
},
{
name = 'master difficulty',
header = 'Master difficulty',
dataFields = { 'master_difficulty' },
visible = false
},
{
name = 'easy notes',
header = 'Easy notes',
dataFields = { 'easy_notes' },
visible = false
},
{
name = 'normal notes',
header = 'Normal notes',
dataFields = { 'normal_notes' },
visible = false
},
{
name = 'hard notes',
header = 'Hard notes',
dataFields = { 'hard_notes' },
visible = false
},
{
name = 'expert notes',
header = 'Expert notes',
dataFields = { 'expert_notes' },
visible = false
},
{
name = 'master notes',
header = 'Master notes',
dataFields = { 'master_notes' },
visible = false
},
}
:setData(qb:query())
columns = ProcessingFns.stringToArray(',')(columns)
if columns and #columns > 0 then
for _, column in ipairs(columns) do
datatable:setColumnVisibility(column, true)
end
end
return datatable:tostring()
end
return p