Content added Content deleted
No edit summary Tag: Reverted |
mNo edit summary |
||
(9 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 15: | Line 14: | ||
local p = {} |
local p = {} |
||
local function formatLogo(logo) |
|||
if logo then |
|||
return string.format('[[File:%s|150px]]', logo) |
|||
end |
|||
return nil |
|||
end |
|||
local function formatName(pageName, eventName) |
local function formatName(pageName, eventName) |
||
Line 71: | Line 62: | ||
) |
) |
||
end |
end |
||
end |
|||
local function columnToProperty(column) |
|||
local map = { |
|||
['id'] = 'Event ID', |
|||
['unit'] = 'Unit focus', |
|||
['start'] = 'Start date', |
|||
['end'] = 'End date', |
|||
['attribute'] = 'Bonus attribute', |
|||
['characters'] = 'Bonus character', |
|||
['type'] = 'Event type' |
|||
} |
|||
return map[column] |
|||
end |
|||
local function isColumn(arg) |
|||
local columns = { |
|||
'__page', |
|||
'id', |
|||
'unit', |
|||
'start', |
|||
'end', |
|||
'attribute', |
|||
'characters', |
|||
'type' |
|||
} |
|||
for _,column in ipairs(columns) do |
|||
if column == arg then |
|||
return true |
|||
end |
|||
end |
|||
return false |
|||
end |
end |
||
Line 118: | Line 74: | ||
event_id, |
event_id, |
||
_pageName, |
_pageName, |
||
logo, |
|||
event_name, |
event_name, |
||
DATE_FORMAT(DATE_ADD( |
DATE_FORMAT(DATE_ADD(start_date, INTERVAL 9 HOUR), "%Y/%m/%d, %H:%i JST") = start_date, |
||
DATE_FORMAT(DATE_ADD( |
DATE_FORMAT(DATE_ADD(end_date, INTERVAL 9 HOUR), "%Y/%m/%d, %H:%i JST") = end_date, |
||
unit_focus, |
unit_focus, |
||
event_type, |
|||
characters, |
characters, |
||
attribute |
attribute |
||
Line 132: | Line 88: | ||
:setLimit(200) |
:setLimit(200) |
||
qb |
qb |
||
:addWhere(' |
:addWhere('event_type', '=', args['type']) |
||
:addWhereList( |
:addWhereList( |
||
'unit_focus', |
'unit_focus', |
||
Line 140: | Line 96: | ||
'OR' |
'OR' |
||
) |
) |
||
:addWhere(' |
:addWhere('start_date', '<', args['start before']) |
||
:addWhere(' |
:addWhere('start_date', '>', args['start after']) |
||
:addWhere(' |
:addWhere('end_date', '<', args['end before']) |
||
:addWhere(' |
:addWhere('end_date', '>', args['end after']) |
||
local datatable = DatatableBuilder.new() |
local datatable = DatatableBuilder.new() |
||
Line 156: | Line 112: | ||
name = 'logo', |
name = 'logo', |
||
header = 'Logo', |
header = 'Logo', |
||
dataFields = { ' |
dataFields = { 'logo' }, |
||
func = |
func = DisplayFns.image('150px'), |
||
sortable = false |
sortable = false |
||
}, |
}, |
||
Line 177: | Line 133: | ||
name = 'start', |
name = 'start', |
||
header = 'Start date', |
header = 'Start date', |
||
dataFields = { ' |
dataFields = { 'start_date' } |
||
}, |
}, |
||
{ |
{ |
||
name = 'end', |
name = 'end', |
||
header = 'End date', |
header = 'End date', |
||
dataFields = { ' |
dataFields = { 'end_date' } |
||
}, |
}, |
||
{ |
{ |
||
Line 201: | Line 157: | ||
name = 'type', |
name = 'type', |
||
header = 'Type', |
header = 'Type', |
||
dataFields = { ' |
dataFields = { 'event_type' } |
||
}, |
}, |
||
} |
} |
||
:setData( |
:setData(qb:query()) |
||
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:Events]] instead.</p>' |
|||
end |
|||
local function defineDatatable(columns) |
|||
local datatable = DatatableBuilder.new() |
|||
datatable |
|||
:setColumns{ |
|||
{ |
|||
name = 'id', |
|||
header = 'ID', |
|||
dataFields = { 'id' } |
|||
}, |
|||
{ |
|||
name = 'logo', |
|||
header = 'Logo', |
|||
dataFields = { 'logo' }, |
|||
func = formatLogo, |
|||
sortable = false |
|||
}, |
|||
{ |
|||
name = '__page', |
|||
header = 'Event', |
|||
dataFields = { '__page', 'event name' }, |
|||
func = formatName, |
|||
css = { ['min-width'] = '150px' }, |
|||
}, |
|||
{ |
|||
name = 'unit', |
|||
header = 'Unit focus', |
|||
dataFields = { 'unit' }, |
|||
func = formatUnit, |
|||
css = { ['min-width'] = '200px' }, |
|||
}, |
|||
{ |
|||
name = 'start', |
|||
header = 'Start date', |
|||
dataFields = { 'start' } |
|||
}, |
|||
{ |
|||
name = 'end', |
|||
header = 'End date', |
|||
dataFields = { 'end' } |
|||
}, |
|||
{ |
|||
name = 'characters', |
|||
header = 'Bonus characters', |
|||
dataFields = { 'characters' }, |
|||
func = formatCharacters, |
|||
css = { ['min-width'] = '150px' }, |
|||
}, |
|||
{ |
|||
name = 'attribute', |
|||
header = 'Bonus attribute', |
|||
dataFields = { 'attribute' }, |
|||
func = formatAttribute, |
|||
css = { ['min-width'] = '150px' }, |
|||
}, |
|||
{ |
|||
name = 'type', |
|||
header = 'Type', |
|||
dataFields = { 'type' } |
|||
}, |
|||
} |
|||
if columns and #columns > 0 then |
|||
for _, column in ipairs(columns) do |
|||
datatable:setColumnVisibility(column, true) |
|||
end |
|||
end |
|||
return datatable |
|||
end |
|||
function p.header(frame) |
|||
local args = getArgs(frame) |
|||
local columns = args['columns'] |
|||
columns = ProcessingFns.stringToArray(',')(columns) |
|||
local actualColumns = {} |
|||
for _,column in ipairs(columns) do |
|||
if isColumn(column) then |
|||
table.insert(actualColumns, column) |
|||
end |
|||
end |
|||
local datatable = defineDatatable(actualColumns, true) |
|||
VariablesLua.vardefine('event datatable columns', table.concat(actualColumns, ',')) |
|||
return tostring(datatable:renderHeader()) |
|||
end |
|||
function p.row(frame) |
|||
local args = getArgs(frame) |
|||
local actualColumns = {} |
|||
local columns = VariablesLua.var('event datatable columns') |
|||
if columns then |
|||
columns = ProcessingFns.stringToArray(',')(columns) |
|||
for _,column in ipairs(columns) do |
|||
if isColumn(column) then |
|||
table.insert(actualColumns, column) |
|||
end |
|||
end |
|||
end |
|||
if #actualColumns == 0 then |
|||
for column,_ in pairs(args) do |
|||
if isColumn(column) then |
|||
table.insert(actualColumns, column) |
|||
end |
|||
end |
|||
end |
|||
local datatable = defineDatatable(actualColumns, true) |
|||
return tostring(datatable:renderRow(args)) |
|||
end |
|||
function p.smw(frame) |
|||
local args = getArgs(frame) |
|||
local ab = AskBuilder.new() |
|||
ab |
|||
:setCategory('Events') |
|||
:setProperties(table.concat(properties, ',')) |
|||
:addWhere('Event ID', '>', 0) |
|||
:setOrderBy('Event ID ASC') |
|||
:setLimit(args['limit'] or 700) |
|||
:setOffset(args['offset']) |
|||
ab |
|||
:addWhere('Event type', '=', args['type']) |
|||
:addWhereList( |
|||
'Unit focus', |
|||
'=', |
|||
args['units'], |
|||
';', |
|||
'OR' |
|||
) |
|||
:addWhere('Start date', '<', args['start before']) |
|||
:addWhere('Start date', '>', args['start after']) |
|||
:addWhere('End date', '<', args['end before']) |
|||
:addWhere('End date', '>', args['end after']) |
|||
return |
return datatable:tostring() |
||
end |
end |
||
Latest revision as of 02:32, 29 April 2023
Documentation for this module may be created at Module:Event datatable/doc
local getArgs = require('Module:Arguments').getArgs
local DatatableBuilder = require('Module:DatatableBuilder')
local QueryBuilder = require('Module:QueryBuilder')
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 uicon = require('Module:Unit icon')._main
local VariablesLua = mw.ext.VariablesLua
local p = {}
local function formatName(pageName, eventName)
return string.format('[[%s|%s]]', pageName, eventName)
end
local function formatUnit(unit)
if unit and unit ~= 'Mixed' then
return string.format(
'%s %s',
uicon({ unit, size = '25px' }),
unit
)
end
return unit
end
local function formatCharacters(characters)
local characters = ProcessingFns.stringToArray(';')(characters)
local icon_tbl = {}
for _,x in ipairs(characters) do
local _icon = cicon({ mw.text.trim(x), size = '40px' })
if _icon then
table.insert(icon_tbl, _icon)
end
end
local wrapper = mw.html.create('div')
wrapper
:css({
['display'] = 'flex',
['flex-wrap'] = 'wrap',
['gap'] = '5px'
})
:wikitext(table.concat(icon_tbl, ''))
return tostring(wrapper)
end
local function formatAttribute(attribute)
if attribute then
return string.format(
'%s %s',
aicon({ attribute, size = '25px' }),
attribute
)
end
end
function p.main(frame)
local args = getArgs(frame)
local qb = QueryBuilder.new()
qb
:setTables('events')
:setFields([[
event_id,
_pageName,
logo,
event_name,
DATE_FORMAT(DATE_ADD(start_date, INTERVAL 9 HOUR), "%Y/%m/%d, %H:%i JST") = start_date,
DATE_FORMAT(DATE_ADD(end_date, INTERVAL 9 HOUR), "%Y/%m/%d, %H:%i JST") = end_date,
unit_focus,
event_type,
characters,
attribute
]])
:addWhere('event_id', '>', 0)
:setOrderBy('event_id ASC')
:setGroupBy('_pageID')
:setLimit(200)
qb
:addWhere('event_type', '=', args['type'])
:addWhereList(
'unit_focus',
'=',
args['units'],
';',
'OR'
)
:addWhere('start_date', '<', args['start before'])
:addWhere('start_date', '>', args['start after'])
:addWhere('end_date', '<', args['end before'])
:addWhere('end_date', '>', args['end after'])
local datatable = DatatableBuilder.new()
datatable
:setColumns{
{
name = 'id',
header = 'ID',
dataFields = { 'event_id' }
},
{
name = 'logo',
header = 'Logo',
dataFields = { 'logo' },
func = DisplayFns.image('150px'),
sortable = false
},
{
name = 'name',
header = 'Event',
dataFields = { '_pageName', 'event_name' },
func = formatName,
css = { ['min-width'] = '150px' },
},
{
name = 'unit',
header = 'Unit focus',
dataFields = { 'unit_focus' },
func = formatUnit,
css = { ['min-width'] = '200px' },
},
{
name = 'start',
header = 'Start date',
dataFields = { 'start_date' }
},
{
name = 'end',
header = 'End date',
dataFields = { 'end_date' }
},
{
name = 'characters',
header = 'Bonus characters',
dataFields = { 'characters' },
func = formatCharacters,
css = { ['min-width'] = '150px' },
},
{
name = 'attribute',
header = 'Bonus attribute',
dataFields = { 'attribute' },
func = formatAttribute,
css = { ['min-width'] = '150px' },
},
{
name = 'type',
header = 'Type',
dataFields = { 'event_type' }
},
}
:setData(qb:query())
return datatable:tostring()
end
return p