Module:Card datatable: Difference between revisions

From Sekaipedia
Content added Content deleted
No edit summary
mNo edit summary
 
(38 intermediate revisions by the same user not shown)
Line 1: Line 1:
local getArgs = require('Module:Arguments').getArgs
local getArgs = require('Module:Arguments').getArgs
local AskBuilder = require('Module:AskBuilder')
local DatatableBuilder = require('Module:DatatableBuilder')
local DatatableBuilder = require('Module:DatatableBuilder')
local QueryBuilder = require('Module:QueryBuilder')
local QueryBuilder = require('Module:QueryBuilder')
Line 12: Line 11:
local ricon = require('Module:Rarity icon')._main
local ricon = require('Module:Rarity icon')._main
local uicon = require('Module:Unit icon')._main
local uicon = require('Module:Unit icon')._main

local VariablesLua = mw.ext.VariablesLua


local p = {}
local p = {}
Line 20: Line 21:
both = 'BOTH'
both = 'BOTH'
}
}

local function formatName(cardPage, cardName)
return string.format('[[%s|%s]]', cardPage, cardName)
end


local function formatAttribute(attribute)
local function formatAttribute(attribute)
Line 58: Line 55:
if rarity == nil or rarity == '' then return nil end
if rarity == nil or rarity == '' then return nil end
return ricon({ rarity, size='25px' })
return ricon({ rarity, size = '25px' })
end
end


Line 75: Line 72:


local function formatIfPretty(pretty, fn)
local function formatIfPretty(pretty, fn)
if pretty == true then
if pretty == true then return fn end
return fn
end
return nil
return nil
end
end
Line 92: Line 86:
local qb = QueryBuilder.new()
local qb = QueryBuilder.new()
qb
qb
:setTables('Cards, card_skills, gachas, Costumes')
:setTables('cards, card_skills, events, gachas')
:setFields([[
:setFields([[
Cards._pageName = cardPageName,
cards._pageName = cardPageName,
Cards.card_id,
cards.card_id,
Cards.card_name,
cards.card_name,
Cards.thumbnail,
cards.thumbnail,
Cards.card_character,
cards.card_character,
Cards.unit,
cards.unit,
Cards.support_unit,
cards.support_unit,
Cards.attribute,
cards.attribute,
Cards.rarity,
cards.rarity,
Cards.date,
cards.release_date,
Cards.status,
cards.status,
Cards.obtain,
cards.acquire,
Cards.event,
cards.event_id,
Cards.banner,
cards.gacha_id,
card_skills.skill_type,
card_skills.skill_type,
events._pageName = eventPageName,
events.event_id,
events.event_name,
gachas._pageName = gachaPageName,
gachas._pageName = gachaPageName,
gachas.gacha_id,
gachas.gacha_id,
gachas.gacha_name,
gachas.gacha_name,
Costumes._pageName = costumePageName,
Costumes.costume_name,
]])
]])
:setJoinOn([[
:setJoinOn([[
Cards._pageID = card_skills._pageID,
cards._pageID = card_skills._pageID,
Cards.banner = gachas._pageName,
cards.event_id = events.event_id,
Cards._pageName = Costumes.card
cards.gacha_id = gachas.gacha_id
]])
]])
:addWhere('card_id', '>', 0)
:addWhere('card_id', '>', 0)
:setOrderBy('Cards.card_id ASC')
:setOrderBy('cards.card_id ASC')
:setGroupBy('Cards._pageID, Costumes._pageID')
:setGroupBy('cards._pageID')
:setLimit(args['limit'] or 500)
:setLimit(args['limit'] or 500)
:setOffset(args['offset'])
:setOffset(args['offset'])
qb
qb
:addWhereList(
:addWhereList(
'Cards.card_id',
'cards.card_id',
'=',
'=',
args['card ids'],
args['card ids'],
Line 133: Line 128:
'OR'
'OR'
)
)
:addWhere('cards.card_id', '>=', args['min card id'])
:addWhere('cards.card_id', '<=', args['max card id'])
:addWhereList(
:addWhereList(
'Cards.card_character',
'cards.card_character',
'=',
'=',
args['characters'],
args['characters'],
Line 141: Line 138:
)
)
:addWhereList(
:addWhereList(
'Cards.unit',
'cards.unit',
'=',
'=',
args['units'],
args['units'],
Line 148: Line 145:
)
)
:addWhereList(
:addWhereList(
'Cards.support_unit',
'cards.support_unit',
'=',
'=',
args['support units'],
args['support units'],
Line 155: Line 152:
)
)
:addWhereList(
:addWhereList(
'Cards.attribute',
'cards.attribute',
'=',
'=',
args['attributes'],
args['attributes'],
Line 162: Line 159:
)
)
:addWhereList(
:addWhereList(
'Cards.rarity',
'cards.rarity',
'=',
'=',
args['rarities'],
args['rarities'],
Line 168: Line 165:
'OR'
'OR'
)
)
:addWhere('Cards.date', '>=', args['released after'])
:addWhere('cards.release_date', '>=', args['released after'])
:addWhere('Cards.date', '<=', args['released before'])
:addWhere('cards.release_date', '<=', args['released before'])
:addWhereList(
:addWhereList(
'Cards.status',
'cards.status',
'=',
'=',
args['statuses'],
args['statuses'],
Line 178: Line 175:
)
)
:addWhereList(
:addWhereList(
'Cards.obtain',
'cards.acquire',
'HOLDS',
'HOLDS',
args['acquire'],
args['acquire'],
Line 192: Line 189:
)
)
:addWhereList(
:addWhereList(
'Cards.event',
'cards.event',
'=',
'=',
args['events'],
args['events'],
Line 205: Line 202:
name = 'id',
name = 'id',
header = 'ID',
header = 'ID',
dataFields = { 'Cards.card_id' },
dataFields = { 'cards.card_id' },
visible = false
visible = false
},
},
Line 211: Line 208:
name = 'thumbnail',
name = 'thumbnail',
header = 'Thumbnail',
header = 'Thumbnail',
dataFields = { 'Cards.thumbnail' },
dataFields = { 'cards.thumbnail' },
fn = DisplayFns.image('64px'),
fn = DisplayFns.image('64px'),
sortable = false
sortable = false
Line 218: Line 215:
name = 'name',
name = 'name',
header = 'Card name',
header = 'Card name',
dataFields = { 'cardPageName', 'Cards.card_name' },
dataFields = { 'cardPageName', 'cards.card_name' },
css = { ['width'] = '30em' },
css = { ['width'] = '30em' },
fn = formatName
fn = formatLink
},
},
{
{
name = 'character',
name = 'character',
header = 'Character',
header = 'Character',
dataFields = { 'Cards.card_character' },
dataFields = { 'cards.card_character' },
fn = formatIfPretty(isPretty, formatCharacter),
fn = formatIfPretty(isPretty, formatCharacter),
visible = false
visible = false
Line 232: Line 229:
name = 'unit',
name = 'unit',
header = 'Unit',
header = 'Unit',
dataFields = { 'Cards.unit' },
dataFields = { 'cards.unit' },
fn = formatIfPretty(isPretty, formatUnit),
fn = formatIfPretty(isPretty, formatUnit),
visible = false
visible = false
Line 239: Line 236:
name = 'support unit',
name = 'support unit',
header = 'Support unit',
header = 'Support unit',
dataFields = { 'Cards.support_unit' },
dataFields = { 'cards.support_unit' },
fn = formatIfPretty(isPretty, formatUnit),
fn = formatIfPretty(isPretty, formatUnit),
default = '',
default = '',
Line 247: Line 244:
name = 'attribute',
name = 'attribute',
header = 'Attribute',
header = 'Attribute',
dataFields = { 'Cards.attribute' },
dataFields = { 'cards.attribute' },
fn = formatIfPretty(isPretty, formatAttribute),
fn = formatIfPretty(isPretty, formatAttribute),
css = { ['min-width'] = 'calc(25px + 6em)' },
css = { ['min-width'] = 'calc(25px + 6em)' },
Line 255: Line 252:
name = 'rarity',
name = 'rarity',
header = 'Rarity',
header = 'Rarity',
dataFields = { 'Cards.rarity' },
dataFields = { 'cards.rarity' },
fn = formatIfPretty(isPretty, formatRarity),
fn = formatIfPretty(isPretty, formatRarity),
visible = false
visible = false
},
},
{
{
name = 'date',
name = 'release date',
header = 'Release date',
header = 'Release date',
dataFields = { 'Cards.date' },
dataFields = { 'cards.release_date' },
visible = false
visible = false
},
},
Line 268: Line 265:
name = 'status',
name = 'status',
header = 'Status',
header = 'Status',
dataFields = { 'Cards.status' },
dataFields = { 'cards.status' },
visible = false
visible = false
},
},
Line 281: Line 278:
name = 'acquire',
name = 'acquire',
header = 'Acquisition method(s)',
header = 'Acquisition method(s)',
dataFields = { 'Cards.obtain' },
dataFields = { 'cards.acquire' },
fn = formatAcquire,
fn = formatAcquire,
visible = false
visible = false
Line 288: Line 285:
name = 'event',
name = 'event',
header = 'Associated event',
header = 'Associated event',
dataFields = { 'Cards.event' },
dataFields = { 'eventPageName, events.event_name' },
fn = formatLink,
default = '',
default = '',
visible = false
visible = false
Line 300: Line 298:
visible = false
visible = false
},
},
{
name = 'costume',
header = 'Costume',
dataFields = { 'costumePageName', 'Costumes.costume_name' },
fn = formatLink,
default = '',
visible = false
}
}
:setData({})
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() ..
'<p>Data table has been disabled, see our [https://blog.sekaipedia.org/2023/04/unexpected-disruption-due-to-extension.html first] and [https://blog.sekaipedia.org/2023/04/acknowledgements-on-continued-wiki.html second] blog posts for more details.</p>'
..
'<p>Consider using [[:Category:Cards]] instead.</p>'
end

local function defineDatatable(columns, isPretty)
local datatable = DatatableBuilder.new()
datatable
:setColumns{
{
name = 'Card ID',
header = 'ID',
dataFields = { 'Card ID' },
visible = false
},
{
name = 'Card thumbnail',
header = 'Thumbnail',
dataFields = { 'Card thumbnail' },
fn = DisplayFns.image('64px'),
sortable = false
},
{
name = 'Display name',
header = 'Card name',
dataFields = { '__page_name', 'Display name' },
css = { ['width'] = '30em' },
fn = formatName
},
{
name = 'Character',
header = 'Character',
dataFields = { 'Character' },
fn = formatIfPretty(isPretty, formatCharacter),
visible = false
},
{
name = 'Unit',
header = 'Unit',
dataFields = { 'Unit' },
fn = formatIfPretty(isPretty, formatUnit),
visible = false
},
{
name = 'Support unit',
header = 'Support unit',
dataFields = { 'Support unit' },
fn = formatIfPretty(isPretty, formatUnit),
default = '',
visible = false
},
{
name = 'Attribute',
header = 'Attribute',
dataFields = { 'Attribute' },
fn = formatIfPretty(isPretty, formatAttribute),
css = { ['min-width'] = 'calc(25px + 6em)' },
visible = false
},
{
name = 'Rarity',
header = 'Rarity',
dataFields = { 'Rarity' },
fn = formatIfPretty(isPretty, formatRarity),
visible = false
},
{
name = 'Release date',
header = 'Release date',
dataFields = { 'Release date' },
visible = false
},
{
name = 'Card status',
header = 'Status',
dataFields = { 'Status' },
visible = false
},
{
name = 'Skill',
header = 'Skill',
dataFields = { 'Skill' },
css = { ['min-width'] = '5em' },
visible = false
},
{
name = 'Acquisition method',
header = 'Acquisition method(s)',
dataFields = { 'Acquisition method' },
fn = formatAcquire,
visible = false
},
-- {
-- name = 'event',
-- header = 'Associated event',
-- dataFields = { 'Cards.event' },
-- default = '',
-- visible = false
-- },
-- {
-- name = 'gacha',
-- header = 'Debut gacha',
-- dataFields = { 'gachaPageName', 'gachas.gacha_name' },
-- fn = formatLink,
-- default = '',
-- visible = false
-- },
-- {
-- {
-- name = 'costume',
-- name = 'costume',
Line 435: Line 307:
-- }
-- }
}
}
:setData(qb:query())
columns = ProcessingFns.stringToArray(',')(columns)
if columns and #columns > 0 then
if columns and #columns > 0 then
for _, column in ipairs(columns) do
for _, column in ipairs(columns) do
Line 442: Line 316:
end
end
return datatable
return datatable:tostring()
end

function p.header(frame)
local args = getArgs(frame)
local columns = args['columns']
columns = ProcessingFns.stringToArray(',')(columns)
for column,_ in pairs(args) do
table.insert(columns, column)
end
local datatable = defineDatatable(columns, true)
return tostring(datatable:renderHeader())
end

function p.row(frame)
local args = getArgs(frame)
local columns = {}
for column,_ in pairs(args) do
if string.sub(column,1,string.len('#')) ~= '#' then
table.insert(columns, column)
end
end
return mw.text.jsonEncode(columns)
-- local datatable = defineDatatable(columns, true)
-- return tostring(datatable:renderRow(args))
end


function p.smw(frame)
local args = getArgs(frame)
local columns = args['columns']
local ab = AskBuilder.new()
ab
:setCategory('Cards')
:setProperties(columns)
:addWhere('Card ID', '>', 0)
:setOrderBy('Card ID', 'ASC')
:setLimit(args['limit'] or 700)
:setOffset(args['offset'])
ab
:addWhereList(
'Card ID',
'=',
args['card ids'],
',',
'OR'
)
:addWhereList(
'Character',
'=',
args['characters'],
',',
'OR'
)
:addWhereList(
'Unit',
'=',
args['units'],
';',
'OR'
)
:addWhereList(
'Support unit',
'=',
args['support units'],
';',
'OR'
)
:addWhereList(
'Attribute',
'=',
args['attributes'],
',',
'OR'
)
:addWhereList(
'Rarity',
'=',
args['rarities'],
',',
'OR'
)
:addWhere('Release date', '>=', args['released after'])
:addWhere('Release date', '<=', args['released before'])
:addWhereList(
'Card status',
'=',
args['statuses'],
',',
'OR'
)
:addWhereList(
'Acquisition method',
'HOLDS',
args['acquire'],
',',
'OR'
)
:addWhereList(
'Skill',
'=',
args['skills'],
';',
'OR'
)
ab:setPlainlistOptions(nil, 'Card datatable row', nil)
return '{| class="wikitable"' .. p.header(frame) .. ab:ask(frame) .. '|}'
end
end



Latest revision as of 23:03, 30 April 2023

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
Cookies help us deliver our services. By using our services, you agree to our use of cookies.