To edit the documentation or categories for this module, click here.
local util_args = require('Module:ArgsUtil')
local util_cargo = require('Module:CargoUtil')
local util_dpl = require('Module:DPLUtil')
local util_table = require('Module:TableUtil')
local util_title = require('Module:TitleUtil')
local util_text = require('Module:TextUtil')
local util_vars = require('Module:VarsUtil')
local m_team = require('Module:Team')
local lang = mw.getLanguage('en')
local systems = mw.loadData('Module:Systems')
local p = {}
function p.main(frame)
local args = util_args.merge(true)
if util_vars.getBool('suppressorgnavbox') then
return ''
end
-- get inputs
local settings = p.getSettings(args)
local vars = p.getVariables(settings)
return p.makeNavbox(vars, frame, settings)
end
function p.getSettings(args)
return {
suffix = util_args.castAsBool(args.suffix),
team = args[1],
from_player = args.useplayer,
state = args.innerstate
}
end
function p.getVariables(settings)
-- gets team & suffix
local title = util_title.titleTable()
local tbl = {}
local titleteam = table.remove(title,1)
tbl.team = settings.team or titleteam
tbl.system = title[1] and systems[title[1]] and systems[table.remove(title,1)]
if settings.from_player then
p.teamFromPlayer(tbl)
end
tbl.teamlink = util_title.concatSubpage(tbl.team, tbl.system)
tbl.suffix = settings.suffix and next(title) and table.concat(title,'/')
tbl.state = settings.state or 'mw-collapsed'
return tbl
end
function p.teamFromPlayer(tbl)
local result = util_cargo.getOneRow({
tables = 'Players',
fields = {'Team','TeamSystem'},
where = string.format('_pageName="%s"',tbl.team)
})
tbl.team = result.Team
tbl.system = result.TeamSystem or ''
return
end
-- below this can be called directly from a module
function p.makeNavbox(vars, frame)
if not vars.team then return '' end
if not frame then frame = mw.getCurrentFrame() end
-- get data,
local data = p.getData(vars)
if not data then return '' end
p.processLinks(frame, data, vars.suffix)
-- print data
return p.printNavbox(frame, data, vars)
end
function p.getData(vars)
local data = {}
local localsettings = {}
local thisteam = vars.team
local thisteamlink = vars.teamlink
if thisteamlink and mw.title.makeTitle('',thisteamlink).exists then
if p.isActive(thisteamlink) then
localsettings.active = true
data.aboveFold = thisteam
data[thisteam] = { links = {}, names = {} }
p.getPlayers(thisteamlink, data[thisteam])
end
else
localsettings.exists = false
end
localsettings.hasSister = p.getSisterTeamInfo(vars, data)
return (localsettings.active or localsettings.hasSister) and data
end
function p.isActive(teamlink)
local query = {
tables = 'Teams',
fields = 'IsDisbanded',
where = string.format('_pageName="%s"',teamlink)
}
local isDisbanded = util_cargo.getOneResult(query)
return isDisbanded == 'No'
end
function p.getPlayers(thisteamlink, data)
local result = mw.ext.cargo.query('ListplayerCurrent', 'Link,ID', {
where = string.format('_pageName="%s" AND ID IS NOT NULL',thisteamlink),
groupBy = 'Link',
orderBy = 'N'
})
for key, row in ipairs(result) do
data.links[key] = row.Link
data.names[key] = row.ID
end
end
function p.getSisterTeamInfo(vars, data)
local row = p.sisterTeamsCargo(vars.team)
if not row then return nil end
data.belowFold = {
active = (row.ActiveList ~= '') and util_text.split(row.ActiveList,'%s*,%s*'),
inactive = (row.InactiveList ~= '') and { links = util_text.split(row.InactiveList,'%s*,%s*') }
}
for _, team in ipairs(data.belowFold.active or {}) do
data.belowFold[team] = { links = {}, names = {} }
p.getPlayers(team, data.belowFold[team])
end
if data.belowFold.inactive then
data.belowFold.inactive.names = mw.clone(data.belowFold.inactive.links)
end
return true
end
function p.sisterTeamsCargo(team)
local fieldstable = {
"Status=Status",
"CONCAT(_pageName)=Pagename",
"ActiveList=ActiveList",
"InactiveList=InactiveList"
}
local cargoresult = mw.ext.cargo.query(
"CCSisterTeams",
table.concat(fieldstable, ","),
{ where = 'Team="' .. team .. '"' }
)
return cargoresult[1]
end
-- process links
-- need to figure out how to deal with different systems & links
-- but i think that will be handled with team links / sister team concepts
function p.processLinks(frame, data, suffix)
local links = p.getLinksListFromData(data)
util_title.concatSubpages(links, suffix)
local whatExists = util_table.hash(util_dpl.whichPagesExist(links, frame))
p.processLinksInData(data, whatExists, suffix)
return
end
function p.getLinksListFromData(data)
local links = {}
if data.aboveFold then
links[#links+1] = data.aboveFold
links[#links+1] = util_title.concatSubpageSystem(data.aboveFold, data.system)
util_table.mergeArrays(links,data[data.aboveFold].links)
end
if data.belowFold then
if data.belowFold.inactive then
util_table.mergeArrays(links,data.belowFold.inactive.links)
end
for k, v in ipairs(data.belowFold.active or {}) do
links[#links+1] = v
util_table.mergeArrays(links,data.belowFold[v].links)
end
end
return links
end
function p.processLinksInData(data, whatExists, suffix)
p.linkLists(data[data.aboveFold], whatExists, suffix)
data.aboveFold = p.linkToObject(data.aboveFold, whatExists, suffix)
if data.belowFold then
for key, team in ipairs(data.belowFold.active or {}) do
p.linkLists(data.belowFold[team], whatExists, suffix)
data.belowFold.active[key] = p.linkToObject(team, whatExists, suffix)
end
p.linkLists(data.belowFold.inactive, whatExists, suffix)
end
return
end
function p.linkToObject(link, whatExists, suffix)
if not link then return nil end
local newlink = util_title.concatSubpage(link, suffix)
local exists = whatExists[lang:ucfirst(newlink)]
return {
name = link,
exists = exists,
link = exists and newlink or link
}
end
function p.linkLists(list, hash, suffix)
if not list then return end
if not list.exists then list.exists = {} end
for k, v in ipairs(list.links) do
newlink = util_title.concatSubpage(v, suffix)
list.exists[k] = hash[lang:ucfirst(newlink)]
list.links[k] = list.exists[k] and newlink or v
end
return
end
-- below is printing only
function p.printNavbox(frame, data, settings)
local thisteam = data.aboveFold
local navboxargs = {
name = 'OrgNavbox',
state = 'mw-collapsible'
}
local i = 1
if thisteam then
navboxargs.group1 = p.makeOutput(
util_title.concatSubpageSystem(thisteam.link,settings.system),
m_team.teammediumname(thisteam.name),
(not settings.suffix) or thisteam.exists
)
navboxargs.list1 = p.makeListOutput(data[thisteam.name], settings.suffix)
i = i + 1
navboxargs.title = p.makeNavboxTitle(thisteam.name, settings.suffix, settings.system, 'Roster')
else
navboxargs.title = p.makeNavboxTitle(settings.team, settings.suffix, settings.system, 'Organization')
end
if data.belowFold then
navboxargs['list' .. i] = p.afterFold(frame, data.belowFold, settings)
end
return frame:expandTemplate{ title = 'Navbox', args = navboxargs }
end
function p.makeNavboxTitle(thisteam, suffix, system, defaulttext)
return string.format(
'<span class="%s">%s</span> %s',
suffix and 'no-subpage' or '',
m_team.rightlonglinked(thisteam, { system = system, size = 45 }),
suffix and ('- ' .. suffix) or defaulttext
)
end
function p.afterFold(frame, data, settings)
local navboxargs = {
'child',
title = 'Other Teams In Organization (Click [Show] to the Right)',
state = settings.state
}
for k, v in ipairs(data.active or {}) do
navboxargs['group' .. k] = p.makeOutput(
util_title.concatSubpageSystem(v.link,settings.system),
v.name,
(not settings.suffix) or v.exists
)
navboxargs['list' .. k] = p.makeListOutput(data[v.name], settings.suffix)
end
if data.inactive then
navboxargs.below = p.makeListOutput(data.inactive, settings.suffix)
end
return frame:expandTemplate{ title = 'Navbox', args = navboxargs }
end
function p.makeListOutput(list, suffix)
local tbl = {}
for k, link in ipairs(list.links or {}) do
tbl[k] = p.makeOutput(link, list.names[k], (not suffix) or list.exists[k])
end
local output = table.concat(tbl,' • ')
return output
end
function p.makeOutput(link, name, exists)
if exists then
return string.format('[[%s|%s]]',link,name)
else
return string.format(
'<span class="no-subpage">[[%s|%s]]</span>',
link,
name
)
end
end
return p