Module:User:Kai/sandbox: Difference between revisionsGive feedback
Jump to navigation
Jump to search
Debug run() results with status filter (via update-page on MediaWiki MCP Server) |
Fix select/where calls on Bucket query object (via update-page on MediaWiki MCP Server) Tag: Manual revert |
||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local function isTruthy(v) | |||
if v == nil then | |||
return false | |||
end | |||
v = mw.text.trim(tostring(v)):lower() | |||
return v ~= '' and v ~= '0' and v ~= 'false' and v ~= 'no' and v ~= 'off' | |||
end | |||
local function formatUser(user) | |||
user = mw.text.trim(tostring(user or '')) | |||
if user == '' or user:lower() == 'anonymous' then | |||
return 'Anonymous' | |||
end | |||
return string.format('[[User:%s|%s]]', user, user) | |||
end | |||
function p.main(frame) | |||
local parent = frame:getParent() | |||
local args = parent and parent.args or frame.args | |||
return p._main(args) | |||
end | |||
function p._main(args) | |||
local feedback = args.feedback or "No feedback provided" | |||
local user = args.user or "Anonymous" | |||
local resolved = isTruthy(args.resolved) | |||
local statusStr = resolved and 'resolved' or 'unresolved' | |||
local currentPage = mw.title.getCurrentTitle().fullText | |||
-- Write directly to the Bucket database | |||
if mw.ext and mw.ext.bucket then | |||
mw.ext.bucket('feedback').put({ | |||
page = currentPage, | |||
user = user, | |||
status = statusStr, | |||
feedback = feedback | |||
}) | |||
end | |||
-- Build HTML display | |||
local root = mw.html.create('div') | |||
:addClass('feedback-box') | |||
:addClass(resolved and 'feedback-box--resolved' or 'feedback-box--unresolved') | |||
local meta = root:tag('div') | |||
:addClass('feedback-meta') | |||
meta:tag('span') | |||
:addClass('feedback-user') | |||
:wikitext(formatUser(user)) | |||
meta:tag('span') | |||
:addClass('feedback-separator') | |||
:wikitext(' • ') | |||
meta:tag('span') | |||
:addClass('feedback-status') | |||
:addClass(resolved and 'feedback-status--resolved' or 'feedback-status--unresolved') | |||
:wikitext(resolved and 'Resolved' or 'Unresolved') | |||
root:tag('div') | |||
:addClass('feedback-body') | |||
:wikitext(feedback) | |||
if not resolved then | |||
root:tag('div') | |||
:addClass('feedback-instruction') | |||
:wikitext('If this feedback has been resolved, edit this page and set <code>|resolved=true</code>.') | |||
end | |||
local category = resolved and '[[Category:Resolved Feedback]]' or '[[Category:Unresolved Feedback]]' | |||
return tostring(root) .. category | |||
end | |||
function p.view(frame) | function p.view(frame) | ||
local | local parent = frame:getParent() | ||
local args = parent and parent.args or frame.args | |||
return p._view(args) | |||
local | end | ||
return mw. | |||
function p._view(args) | |||
if not (mw.ext and mw.ext.bucket) then | |||
return "<em>Bucket extension is not available.</em>" | |||
end | |||
local filterStatus = mw.text.trim(args.status or args[1] or 'all'):lower() | |||
local query = mw.ext.bucket('feedback') | |||
query.select('page', 'user', 'status', 'feedback') | |||
if filterStatus == 'resolved' or filterStatus == 'unresolved' then | |||
query.where('status', filterStatus) | |||
end | |||
local results = query.run() | |||
if not results or #results == 0 then | |||
return "<em>No feedback entries found.</em>" | |||
end | |||
local tableRoot = mw.html.create('table') | |||
:addClass('wikitable sortable') | |||
:css('width', '100%') | |||
local header = tableRoot:tag('tr') | |||
header:tag('th'):wikitext('Page') | |||
header:tag('th'):wikitext('User') | |||
header:tag('th'):wikitext('Status') | |||
header:tag('th'):wikitext('Feedback') | |||
for _, row in ipairs(results) do | |||
local tr = tableRoot:tag('tr') | |||
tr:tag('td'):wikitext(string.format('[[%s]]', row.page or '')) | |||
tr:tag('td'):wikitext(formatUser(row.user)) | |||
local isResolved = row.status == 'resolved' | |||
local statusText = isResolved and 'Resolved' or 'Unresolved' | |||
local statusStyle = isResolved and 'color: #2e7d32; font-weight: bold;' or 'color: #c62828; font-weight: bold;' | |||
tr:tag('td') | |||
:cssText(statusStyle) | |||
:wikitext(statusText) | |||
tr:tag('td'):wikitext(row.feedback or '') | |||
end | |||
return tostring(tableRoot) | |||
end | end | ||
return p | return p | ||