Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Module:Event datatable: Difference between revisions

From Sekaipedia
Content added Content deleted
m (test no-wrap)
mNo edit summary
 
(46 intermediate revisions by 2 users not shown)
Line 2: Line 2:
local DatatableBuilder = require('Module:DatatableBuilder')
local DatatableBuilder = require('Module:DatatableBuilder')
local QueryBuilder = require('Module:QueryBuilder')
local QueryBuilder = require('Module:QueryBuilder')

local icons = require('Module:Icons')._main
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 p = {}


local function formatLogo(logo)
return string.format('[[File:%s|192px]]', logo)
end


local function formatName(pageName, eventName)
local function formatName(pageName, eventName)
Line 18: Line 23:
return string.format(
return string.format(
'%s %s',
'%s %s',
icons({ unit, size = '25px' }),
uicon({ unit, size = '25px' }),
unit
unit
)
)
Line 24: Line 29:
return unit
return unit
end

local function formatDuration(start_dt, end_dt)
if start_dt and end_dt then
return string.format(
'Start: %s <br> End: %s',
start_dt,
end_dt
)
end
end
end


local function formatCharacters(characters)
local function formatCharacters(characters)
local characters = mw.text.split(characters, ',')
local characters = ProcessingFns.stringToArray(';')(characters)
local icon_tbl = {}
local icon_tbl = {}


for _,x in ipairs(characters) do
for _,x in ipairs(characters) do
local _icon = icons({ mw.text.trim(x), size = '45px' })
local _icon = cicon({ mw.text.trim(x), size = '40px' })
if _icon then
if _icon then
table.insert(icon_tbl, _icon)
table.insert(icon_tbl, _icon)
end
end
end
end

local wrapper = mw.html.create('div')
return table.concat(icon_tbl, ' ')
wrapper
:css({
['display'] = 'flex',
['flex-wrap'] = 'wrap',
['gap'] = '5px'
})
:wikitext(table.concat(icon_tbl, ''))
return tostring(wrapper)
end
end


Line 54: Line 58:
return string.format(
return string.format(
'%s %s',
'%s %s',
icons({ attribute, size = '25px' }),
aicon({ attribute, size = '25px' }),
attribute
attribute
)
)
Line 66: Line 70:
local qb = QueryBuilder.new()
local qb = QueryBuilder.new()
qb
qb
:setTables('Events')
:setTables('events')
:setFields([[
:setFields([[
event_id,
event_id,
_pageName,
_pageName,
image,
logo,
event_name,
event_name,
DATE_FORMAT(DATE_ADD(start, INTERVAL 9 HOUR), "%Y/%m/%d, %H:%i JST") = start,
DATE_FORMAT(DATE_ADD(start_date, INTERVAL 9 HOUR), "%Y/%m/%d, %H:%i JST") = start_date,
DATE_FORMAT(DATE_ADD(end, INTERVAL 9 HOUR), "%Y/%m/%d, %H:%i JST") = end,
DATE_FORMAT(DATE_ADD(end_date, INTERVAL 9 HOUR), "%Y/%m/%d, %H:%i JST") = end_date,
unit_focus,
unit_focus,
type,
event_type,
characters,
characters,
attribute
attribute
Line 81: Line 85:
:addWhere('event_id', '>', 0)
:addWhere('event_id', '>', 0)
:setOrderBy('event_id ASC')
:setOrderBy('event_id ASC')
:setGroupBy('_pageName')
:setGroupBy('_pageID')
:setLimit(200)
:setLimit(200)
qb
qb
:addWhere('type', '=', args['type'])
:addWhere('event_type', '=', args['type'])
:addWhereList(
:addWhere('start', '<', args['start before'])
'unit_focus',
:addWhere('start', '>', args['start after'])
'=',
:addWhere('end', '<', args['end before'])
:addWhere('end', '>', args['end after'])
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()
local datatable = DatatableBuilder.new()
datatable
datatable
:setColumns{
:setColumns{
{
{ name = 'id', header = 'ID', data_fields = { 'event_id' } },
name = 'id',
{ name = 'logo', header = 'Logo', data_fields = { 'image' }, func = formatLogo },
header = 'ID',
{ name = 'name', header = 'Event', data_fields = { '_pageName', 'event_name' }, func = formatName },
dataFields = { 'event_id' }
{ name = 'unit', header = 'Unit focus', data_fields = { 'unit_focus' }, func = formatUnit, css = { ['white-space'] = 'nowrap' } },
},
{ name = 'duration', header = 'Event period', data_fields = { 'start', 'end' }, func = formatDuration },
{
{ name = 'characters', header = 'Bonus characters', data_fields = { 'characters' }, func = formatCharacters },
name = 'logo',
{ name = 'attribute', header = 'Bonus attribute', data_fields = { 'attribute' }, func = formatAttribute },
{ name = 'type', header = 'Type', data_fields = { 'type' } },
header = 'Logo',
dataFields = { 'logo' },
}
func = DisplayFns.image('150px'),
:setHeaders{
sortable = false
'id',
'logo',
},
'name',
{
'unit',
name = 'name',
'duration',
header = 'Event',
dataFields = { '_pageName', 'event_name' },
'characters',
func = formatName,
'attribute',
css = { ['min-width'] = '150px' },
'type'
},
{
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())
:setData(qb:query())

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