This module depends on the following other modules: |
To generate {{Card 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 aicon = require('Module:Attribute icon')._main
local cicon = require('Module:Character icon')._main
local ricon = require('Module:Rarity icon')._main
local uicon = require('Module:Unit icon')._main
local VariablesLua = mw.ext.VariablesLua
local p = {}
local DisplayType = {
text = 'TEXT',
icon = 'ICON',
both = 'BOTH'
}
local function formatAttribute(attribute)
if attribute == nil or attribute == '' then return nil end
return string.format(
'%s %s',
aicon({ attribute, size = '25px' }),
attribute
)
end
local function formatCharacter(character)
if character == nil or character == '' then return nil end
return string.format(
'%s %s',
cicon({ character, size = '25px' }),
character
)
end
local function formatUnit(unit)
if unit == nil or unit == '' then return nil end
return string.format(
'%s %s',
uicon({ unit, size = '25px' }),
unit
)
end
local function formatRarity(rarity)
if rarity == nil or rarity == '' then return nil end
return ricon({ rarity, size = '25px' })
end
local function formatAcquire(acquire)
local acquireArr = ProcessingFns.stringToArray(',')(acquire)
return DisplayFns.list('unbulleted')(acquireArr)
end
local function formatLink(page, name)
if page and name then
return string.format('[[%s|%s]]', page, name)
end
return nil
end
local function formatIfPretty(pretty, fn)
if pretty == true then return fn end
return nil
end
function p.main(frame)
local args = getArgs(frame)
local columns = args['columns']
local isPretty = Yesno(args['pretty'])
local displayType = DisplayType[args['display type']] or DisplayType.text
local qb = QueryBuilder.new()
qb
:setTables('cards, card_skills, events, gachas')
:setFields([[
cards._pageName = cardPageName,
cards.card_id,
cards.card_name,
cards.thumbnail,
cards.card_character,
cards.unit,
cards.support_unit,
cards.attribute,
cards.rarity,
cards.release_date,
cards.status,
cards.acquire,
cards.event_id,
cards.gacha_id,
card_skills.skill_type,
events._pageName = eventPageName,
events.event_id,
events.event_name,
gachas._pageName = gachaPageName,
gachas.gacha_id,
gachas.gacha_name,
]])
:setJoinOn([[
cards._pageID = card_skills._pageID,
cards.event_id = events.event_id,
cards.gacha_id = gachas.gacha_id
]])
:addWhere('card_id', '>', 0)
:setOrderBy('cards.card_id ASC')
:setGroupBy('cards._pageID')
:setLimit(args['limit'] or 500)
:setOffset(args['offset'])
qb
:addWhereList(
'cards.card_id',
'=',
args['card ids'],
',',
'OR'
)
:addWhere('cards.card_id', '>=', args['min card id'])
:addWhere('cards.card_id', '<=', args['max card id'])
:addWhereList(
'cards.card_character',
'=',
args['characters'],
',',
'OR'
)
:addWhereList(
'cards.unit',
'=',
args['units'],
';',
'OR'
)
:addWhereList(
'cards.support_unit',
'=',
args['support units'],
';',
'OR'
)
:addWhereList(
'cards.attribute',
'=',
args['attributes'],
',',
'OR'
)
:addWhereList(
'cards.rarity',
'=',
args['rarities'],
',',
'OR'
)
:addWhere('cards.release_date', '>=', args['released after'])
:addWhere('cards.release_date', '<=', args['released before'])
:addWhereList(
'cards.status',
'=',
args['statuses'],
',',
'OR'
)
:addWhereList(
'cards.acquire',
'HOLDS',
args['acquire'],
',',
'OR'
)
:addWhereList(
'card_skills.skill_type',
'=',
args['skills'],
';',
'OR'
)
:addWhereList(
'cards.event',
'=',
args['events'],
';',
'OR'
)
local datatable = DatatableBuilder.new()
datatable
:setColumns{
{
name = 'id',
header = 'ID',
dataFields = { 'cards.card_id' },
visible = false
},
{
name = 'thumbnail',
header = 'Thumbnail',
dataFields = { 'cards.thumbnail' },
fn = DisplayFns.image('64px'),
sortable = false
},
{
name = 'name',
header = 'Card name',
dataFields = { 'cardPageName', 'cards.card_name' },
css = { ['width'] = '30em' },
fn = formatLink
},
{
name = 'character',
header = 'Character',
dataFields = { 'cards.card_character' },
fn = formatIfPretty(isPretty, formatCharacter),
visible = false
},
{
name = 'unit',
header = 'Unit',
dataFields = { 'cards.unit' },
fn = formatIfPretty(isPretty, formatUnit),
visible = false
},
{
name = 'support unit',
header = 'Support unit',
dataFields = { 'cards.support_unit' },
fn = formatIfPretty(isPretty, formatUnit),
default = '',
visible = false
},
{
name = 'attribute',
header = 'Attribute',
dataFields = { 'cards.attribute' },
fn = formatIfPretty(isPretty, formatAttribute),
css = { ['min-width'] = 'calc(25px + 6em)' },
visible = false
},
{
name = 'rarity',
header = 'Rarity',
dataFields = { 'cards.rarity' },
fn = formatIfPretty(isPretty, formatRarity),
visible = false
},
{
name = 'release date',
header = 'Release date',
dataFields = { 'cards.release_date' },
visible = false
},
{
name = 'status',
header = 'Status',
dataFields = { 'cards.status' },
visible = false
},
{
name = 'skill',
header = 'Skill',
dataFields = { 'card_skills.skill_type' },
css = { ['min-width'] = '5em' },
visible = false
},
{
name = 'acquire',
header = 'Acquisition method(s)',
dataFields = { 'cards.acquire' },
fn = formatAcquire,
visible = false
},
{
name = 'event',
header = 'Associated event',
dataFields = { 'eventPageName, events.event_name' },
fn = formatLink,
default = '',
visible = false
},
{
name = 'gacha',
header = 'Debut gacha',
dataFields = { 'gachaPageName', 'gachas.gacha_name' },
fn = formatLink,
default = '',
visible = false
},
-- {
-- name = 'costume',
-- header = 'Costume',
-- dataFields = { 'costumePageName', 'Costumes.costume_name' },
-- fn = formatLink,
-- default = '',
-- 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