Modul:Participation: Unterschied zwischen den Versionen

This is [[MediaWiki:Tagline]]. Set to <code>display:none</code> by chameleon skin.
Wechseln zu:Navigation, Suche
Zeile 1: Zeile 1:
 
local config = {
 
local config = {
 +
playPlayerDelimiter = ',',
 
signalAbsent = '[[File:X mark.png|13px|alt=Abwesend|Abwesend]]',
 
signalAbsent = '[[File:X mark.png|13px|alt=Abwesend|Abwesend]]',
 
signalPresent = '[[File:Yes check.png|13px|alt=Anwesend|Anwesend]]',
 
signalPresent = '[[File:Yes check.png|13px|alt=Anwesend|Anwesend]]',
Zeile 100: Zeile 101:
 
end
 
end
  
function buildControlStatusAndButton( characters, character )
+
function buildControlStatusAndButton( characters, character, targetPage )
local status = tt.inTable( characters, character ) and config.signalPresent or config.signalAbsent
+
-- nach oben schieben
 +
local frame = mw.getCurrentFrame()
 +
local participating = tt.inTable( characters, character )
 +
local status = participating and config.signalPresent or config.signalAbsent
 
local button = 'klick'
 
local button = 'klick'
 +
local newCast = characters
 +
table.insert( newCast, character )
 +
 +
button = frame:callParserFunction{ name = '#autoedit', args={
 +
form='Spiel',
 +
target=targetPage,
 +
summary='Figur ' .. character .. ' wurde ' .. ( participating and 'ausgetragen' or 'eingetragen' ),
 +
tooltip='Durch Klicken, die Figur ' .. character .. ( participating and ' ausgetragen' or ' eingetragen' ),
 +
'link text=' .. ( participating and 'Abmelden!' or 'Anmelden!'),
 +
'query string=play[cast]=' .. table.concat( newCast, config.playPlayerDelimiter )
 +
'reload'
 +
}
 +
}
 +
-- {{#autoedit:form=|target=|link text=|link type=|summary=|tooltip=|query string=query string parameters|reload}}
 
return status, button
 
return status, button
 
-- return 'Teilnehner: \'\'' .. mw.text.listToText( characters ) .. '\'\' bedeutet ' .. character .. ' ist \'\'\''
 
-- return 'Teilnehner: \'\'' .. mw.text.listToText( characters ) .. '\'\' bedeutet ' .. character .. ' ist \'\'\''
Zeile 108: Zeile 126:
 
end
 
end
  
function buildControlTableBody( playData, character )
+
function buildControlTableHeader()
-- nach oben schieben
 
local html = mw.html.create()
 
 
local header = mw.html.create( 'tr' )
 
local header = mw.html.create( 'tr' )
 
header:tag('th')
 
header:tag('th')
Zeile 130: Zeile 146:
 
:wikitext('Aktion')
 
:wikitext('Aktion')
 
:done()
 
:done()
 +
return header
 +
end
 +
 +
function buildControlTableBody( playData, character )
 +
-- nach oben schieben
 
local body = mw.html.create( '' )
 
local body = mw.html.create( '' )
 
for num, play in pairs( playData ) do
 
for num, play in pairs( playData ) do
local status, button = buildControlStatusAndButton( play.characters, character )
+
local status, button = buildControlStatusAndButton( play.characters, character, play.play )
 
local tr = mw.html.create('tr')
 
local tr = mw.html.create('tr')
 
tr:tag( 'td' )
 
tr:tag( 'td' )
:wikitext( play.play )
+
:wikitext( play.number )
 
:done()
 
:done()
 
tr:tag( 'td' )
 
tr:tag( 'td' )
Zeile 154: Zeile 175:
 
body:node(tr)
 
body:node(tr)
 
end
 
end
html:node( header )
+
return body
:node( body )
 
return html
 
 
end
 
end
  
 
function printParticipationControl( playData, character )
 
function printParticipationControl( playData, character )
local ret = '== Spielteilnahmen für ' .. character .. ' ==\n'
+
local text = '== Spielteilnahmen für ' .. character .. ' ==\n'
ret = ret .. 'Diese Seite zeigt Dir eine Übersicht der Spielteilnahmen für die Figur \'\''
+
text = text .. 'Diese Seite zeigt Dir eine Übersicht der Spielteilnahmen für die Figur \'\''
 
.. character .. [[
 
.. character .. [[
 
\'\ und erlaubt es Dir, sie für Spiele einzutragen oder aus Spielen wieder auszutragen. Bitte beachte, dass
 
\'\ und erlaubt es Dir, sie für Spiele einzutragen oder aus Spielen wieder auszutragen. Bitte beachte, dass
Zeile 167: Zeile 186:
  
 
local t = mw.html.create('table')
 
local t = mw.html.create('table')
t:addClass( 'table table-striped table-bordered ' )
+
t:addClass( 'table table-striped table-bordered sortable' )
t:node( buildControlTableBody( playData, character ) )
+
:node( buildControlTableHeader() )
 
+
:node( buildControlTableBody( playData, character ) )
return ret .. tostring(t)
+
return text .. tostring(t)
--[[
 
return '== ' .. character .. ' ==\n'
 
.. '<pre>\n'
 
.. tt.printTable( playData )
 
.. '</pre>\n'
 
--]]
 
 
end
 
end
  

Version vom 23. Dezember 2017, 22:52 Uhr

Documentation icon Module documentation[view] [edit] [history] [purge]

Dieses Modul kommt direkt auf Seiten im Namensraum "Spielteilnahme" zum Einsatz. Es prüft, ob es eine Spielfigur mit dem gleichen Namen wie die aktuelle Seite hat gibt und zeigt dann für die entsprechende Figur eine Übersicht aller Spiele und den Teilnahmestatus an. Zusätzlich gibt es für jedes Spiel eine Möglichkeit, sich direkt An- oder abzumelden.

Usage[Quelltext bearbeiten]

{{#invoke:Participation|main}}

Example[Quelltext bearbeiten]

See Spielteilnahme:Caspar.

local config = {
	playPlayerDelimiter = ',',
	signalAbsent = '[[File:X mark.png|13px|alt=Abwesend|Abwesend]]',
	signalPresent = '[[File:Yes check.png|13px|alt=Anwesend|Anwesend]]',
	validNamespace = 'Spielteilnahme',
	validTargetPageCategory = 'Figuren'
}

local p = {}
local smw = mw.smw
local tt = require( 'Module:TableTools' )

local currentTitle = nil

function assertCorrectNamespace( title, namespace )
	return title.nsText == namespace
end

function assesPrerequisites()
	if not assertCorrectNamespace(
		getCurrentTitle(),
		config.validNamespace
		) then
		return false, 'Diese Vorlage darf nur im Namensraum \'\''
			.. config.validNamespace
			.. '\'\' verwendet werden!'
	end
	if not assertTargetIsValid(
		getCurrentTitle().text,
		config.validTargetPageCategory
		) then
		return false, 'Die Seite mit dem Namen \'\''
			.. getCurrentTitle().text
			.. '\'\' existiert nicht oder ist keine Figur!'
	end
	return true
end

function assertTargetIsValid( targetPageName, validCategory )
	--[=[
	-- ssc's '?Category:' .. validCategory handling seems broken atm
	local query = {
		'[[' .. targetPageName .. ']]',
		'?Category:' .. validCategory
	}
	--]=]
	local query = {
		'[[' .. targetPageName .. ']]',
		'?Category#=pageCategories'
	}
	local res = smw.ask ( query )
	if not res[1] or not res[1].pageCategories then
		return false
	end
	return tt.inTable( res[1].pageCategories, 'Kategorie:' .. validCategory )
end

function alertBox( text )
	return '<div class="alert alert-danger" role="alert">'
		.. '<strong>Achtung:</strong> ' .. text
		.. '</div>'
end

function getCurrentTitle()
	if currentTitle ~= nil then
		return currentTitle
	end
	currentTitle = mw.title.getCurrentTitle()
	return currentTitle
end

function getPlayData()
	local query = {
		'[[Category:Spiele]]',
		'?#=play',
		'?Has number#=number',
		'?Has character participating#=characters',
		'?Has display name#=displayName',
		'?Has title#=title',
		'?Is held in#=place',
		'?Is held at#=time',
		'mainlabel=-'
	}
	res = smw.ask( query )
	if not res then
		return {}
	end
	local playData = {}
	for k, row in pairs(res) do
		if row and row.number and row.title then
			if not row.characters then
				row.characters = {}
			end
			if type( row.characters ) ~= 'table' then
				row.characters = { row.characters }
			end
			playData[row.number] = row
		end
	end
	return playData
end

function buildControlStatusAndButton( characters, character, targetPage )
	-- nach oben schieben
	local frame = mw.getCurrentFrame()
	local participating = tt.inTable( characters, character )
	local status = participating and config.signalPresent or config.signalAbsent
	local button = 'klick'
	local newCast = characters
	table.insert( newCast, character )
	
	button = frame:callParserFunction{ name = '#autoedit', args={
		form='Spiel',
		target=targetPage,
		summary='Figur ' .. character .. ' wurde ' .. ( participating and 'ausgetragen' or 'eingetragen' ),
		tooltip='Durch Klicken, die Figur ' .. character .. ( participating and ' ausgetragen' or ' eingetragen' ),
		'link text=' .. ( participating and 'Abmelden!' or 'Anmelden!'),
		'query string=play[cast]=' .. table.concat( newCast, config.playPlayerDelimiter )
		'reload'
		}
	}
	-- {{#autoedit:form=|target=|link text=|link type=|summary=|tooltip=|query string=query string parameters|reload}}
	return status, button
--	return 'Teilnehner: \'\'' .. mw.text.listToText( characters ) .. '\'\' bedeutet ' .. character .. ' ist \'\'\''
--		.. ( tt.inTable( characters, character ) and 'dabei' or 'nicht dabei' ) .. '\'\'\'!'
end

function buildControlTableHeader()
	local header = mw.html.create( 'tr' )
	header:tag('th')
		:wikitext('Spiel')
		:done()
		:tag('th')
		:wikitext('Titel')
		:done()
		:tag('th')
		:wikitext('Ort')
		:done()
		:tag('th')
		:wikitext('Jahr')
		:done()
		:tag('th')
		:wikitext('Status')
		:done()
		:tag('th')
		:wikitext('Aktion')
		:done()
	return header
end

function buildControlTableBody( playData, character )
	-- nach oben schieben
	local body = mw.html.create( '' )
	for num, play in pairs( playData ) do
		local status, button = buildControlStatusAndButton( play.characters, character, play.play )
		local tr = mw.html.create('tr')
		tr:tag( 'td' )
			:wikitext( play.number  )
			:done()
		tr:tag( 'td' )
			:wikitext( play.title  )
			:done()
		tr:tag( 'td' )
			:wikitext( play.place and play.place or 'unbekannt'  )
			:done()
		tr:tag( 'td' )
			:wikitext( play.time and play.time or 'unbekannt'  )
			:done()
		tr:tag( 'td' )
			:wikitext( status )
			:done()
		tr:tag( 'td' )
			:wikitext( button )
			:done()
		body:node(tr)
	end
	return body
end

function printParticipationControl( playData, character )
	local text = '== Spielteilnahmen für ' .. character .. ' ==\n'
	text = text .. 'Diese Seite zeigt Dir eine Übersicht der Spielteilnahmen für die Figur \'\''
		.. character .. [[
\'\ und erlaubt es Dir, sie für Spiele einzutragen oder aus Spielen wieder auszutragen. Bitte beachte, dass
jeder Vorgang das neu Laden der Seite nach sich zieht und daher etwas dauern kann. ]]

	local t = mw.html.create('table')
	t:addClass( 'table table-striped table-bordered sortable' )
		:node( buildControlTableHeader() )
		:node( buildControlTableBody( playData, character ) )
	return text .. tostring(t)
end

function p.main( frame )
	local assesmentResult, assesmentMessage = assesPrerequisites()
	if not assesmentResult then
		return alertBox( assesmentMessage )
	end
	-- all is well
	local playData = getPlayData()
	return printParticipationControl(
		playData,
		getCurrentTitle().text
	)
end

-- pt = require('Module:TableTools').printTable

return p