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

Module:Calendar: Difference between revisions

From eSportsAmaze
No edit summary
No edit summary
Line 6: Line 6:
     local tournament = args.tournament
     local tournament = args.tournament
     local game = args.game
     local game = args.game
    local stage = args.stage
    local exclude_stage = args.exclude_stage


     local whereParts = {}
     local whereParts = {}
     if tournament and tournament ~= "" then
     if tournament and tournament ~= "" then table.insert(whereParts, "tournament='" .. tournament:gsub("'", "\\'") .. "'") end
         table.insert(whereParts, "tournament='" .. tournament:gsub("'", "\\'") .. "'")
    if game and game ~= "" then table.insert(whereParts, "game='" .. game:gsub("'", "\\'") .. "'") end
   
    -- Stage Filtering Logic
    if stage and stage ~= "" then  
         table.insert(whereParts, "stage='" .. stage:gsub("'", "\\'") .. "'")  
     end
     end
     if game and game ~= "" then
     if exclude_stage and exclude_stage ~= "" then  
         table.insert(whereParts, "game='" .. game:gsub("'", "\\'") .. "'")
         table.insert(whereParts, "stage!='" .. exclude_stage:gsub("'", "\\'") .. "'")  
     end
     end


Line 18: Line 24:
     if whereClause == "" then whereClause = "1=1" end
     if whereClause == "" then whereClause = "1=1" end


    -- Fetch all schedule data
     local results = cargo.query("Tournament_Schedule", "tournament, game, match_type, date, stage, day_data", { where = whereClause, orderBy = "date ASC", limit = 500 })
     local results = cargo.query(
        "Tournament_Schedule",
        "tournament, game, match_type, date, stage, day_data",
        { where = whereClause, orderBy = "date ASC", limit = 500 }
    )


     if not results or #results == 0 then
     if not results or #results == 0 then
         return "<div class='calendar-empty' style='padding:20px; text-align:center; background:var(--bg-card); border-radius:8px; border:1px solid var(--border-light);'>No schedule data found. Add matches using the MatchDay template.</div>"
         return "<div style='padding:20px; text-align:center; color:var(--text-muted); background:var(--bg-card); border-radius:8px; border:1px solid var(--border-light);'>No schedule data found. Add matches using the MatchDay template.</div>"
     end
     end


    -- Group data by Date
     local scheduleByDate = {}
     local scheduleByDate = {}
     for _, row in ipairs(results) do
     for _, row in ipairs(results) do
Line 35: Line 35:
         if not scheduleByDate[d] then scheduleByDate[d] = {} end
         if not scheduleByDate[d] then scheduleByDate[d] = {} end
         table.insert(scheduleByDate[d], {
         table.insert(scheduleByDate[d], {
             tournament = row.tournament,
             tournament = row.tournament, game = row.game, match_type = row.match_type, stage = row.stage,
            game = row.game,
            match_type = row.match_type,
            stage = row.stage,
             data = mw.text.jsonDecode(row.day_data)
             data = mw.text.jsonDecode(row.day_data)
         })
         })
Line 44: Line 41:


     local jsonString = mw.text.jsonEncode(scheduleByDate)
     local jsonString = mw.text.jsonEncode(scheduleByDate)
    -- Build UI Container
     local root = mw.html.create('div'):addClass('esports-calendar-container')
     local root = mw.html.create('div'):addClass('esports-calendar-container')


    -- SAFE HIDDEN DATA ISLAND (Fixes the raw text bleeding issue)
     root:tag('div'):addClass('calendar-data'):css('display', 'none'):wikitext(jsonString)
     root:tag('div')
        :addClass('calendar-data')
        :css('display', 'none')
        :wikitext(jsonString)


    -- Left Side: The Calendar Grid
     local calLeft = root:tag('div'):addClass('calendar-left')
     local calLeft = root:tag('div'):addClass('calendar-left')
     local header = calLeft:tag('div'):addClass('calendar-header')
     local header = calLeft:tag('div'):addClass('calendar-header')
      
      
     -- Safe Buttons
     -- Bulletproof HTML Arrow Icons
     header:tag('div'):addClass('cal-prev'):wikitext('<i class="fa-solid fa-chevron-left"></i>')
     header:tag('div'):addClass('cal-prev'):wikitext('&#10094;')
     header:tag('div'):addClass('cal-month-year'):wikitext('Loading...')
     header:tag('div'):addClass('cal-month-year'):wikitext('Loading...')
     header:tag('div'):addClass('cal-next'):wikitext('<i class="fa-solid fa-chevron-right"></i>')
     header:tag('div'):addClass('cal-next'):wikitext('&#10095;')


     local gridWrap = calLeft:tag('div'):addClass('calendar-grid-wrapper')
     local gridWrap = calLeft:tag('div'):addClass('calendar-grid-wrapper')
     local daysRow = gridWrap:tag('div'):addClass('calendar-grid-days')
     gridWrap:tag('div'):addClass('calendar-grid-days'):wikitext('<div>Sun</div><div>Mon</div><div>Tue</div><div>Wed</div><div>Thu</div><div>Fri</div><div>Sat</div>')
    daysRow:wikitext('<div>Sun</div><div>Mon</div><div>Tue</div><div>Wed</div><div>Thu</div><div>Fri</div><div>Sat</div>')
     gridWrap:tag('div'):addClass('calendar-grid-dates')
     gridWrap:tag('div'):addClass('calendar-grid-dates') -- JS fills this


    -- Right Side: The Details Panel
     local calRight = root:tag('div'):addClass('calendar-right')
     local calRight = root:tag('div'):addClass('calendar-right')
    calRight:tag('div'):addClass('cal-details-placeholder')
     calRight:tag('div'):addClass('cal-details-content')
        :wikitext('<i class="fa-regular fa-calendar-days" style="font-size:3em; color:var(--border-thick); margin-bottom:15px; display:block;"></i>Select a highlighted date to view the schedule.')
     calRight:tag('div'):addClass('cal-details-content'):css('display', 'none')


     return tostring(root)
     return tostring(root)

Revision as of 01:41, 23 February 2026

Documentation for this module may be created at Module:Calendar/doc

local p = {}
local cargo = mw.ext.cargo

function p.main(frame)
    local args = frame:getParent().args
    local tournament = args.tournament
    local game = args.game
    local stage = args.stage
    local exclude_stage = args.exclude_stage

    local whereParts = {}
    if tournament and tournament ~= "" then table.insert(whereParts, "tournament='" .. tournament:gsub("'", "\\'") .. "'") end
    if game and game ~= "" then table.insert(whereParts, "game='" .. game:gsub("'", "\\'") .. "'") end
    
    -- Stage Filtering Logic
    if stage and stage ~= "" then 
        table.insert(whereParts, "stage='" .. stage:gsub("'", "\\'") .. "'") 
    end
    if exclude_stage and exclude_stage ~= "" then 
        table.insert(whereParts, "stage!='" .. exclude_stage:gsub("'", "\\'") .. "'") 
    end

    local whereClause = table.concat(whereParts, " AND ")
    if whereClause == "" then whereClause = "1=1" end

    local results = cargo.query("Tournament_Schedule", "tournament, game, match_type, date, stage, day_data", { where = whereClause, orderBy = "date ASC", limit = 500 })

    if not results or #results == 0 then
        return "<div style='padding:20px; text-align:center; color:var(--text-muted); background:var(--bg-card); border-radius:8px; border:1px solid var(--border-light);'>No schedule data found. Add matches using the MatchDay template.</div>"
    end

    local scheduleByDate = {}
    for _, row in ipairs(results) do
        local d = row.date
        if not scheduleByDate[d] then scheduleByDate[d] = {} end
        table.insert(scheduleByDate[d], {
            tournament = row.tournament, game = row.game, match_type = row.match_type, stage = row.stage,
            data = mw.text.jsonDecode(row.day_data)
        })
    end

    local jsonString = mw.text.jsonEncode(scheduleByDate)
    local root = mw.html.create('div'):addClass('esports-calendar-container')

    root:tag('div'):addClass('calendar-data'):css('display', 'none'):wikitext(jsonString)

    local calLeft = root:tag('div'):addClass('calendar-left')
    local header = calLeft:tag('div'):addClass('calendar-header')
    
    -- Bulletproof HTML Arrow Icons
    header:tag('div'):addClass('cal-prev'):wikitext('&#10094;')
    header:tag('div'):addClass('cal-month-year'):wikitext('Loading...')
    header:tag('div'):addClass('cal-next'):wikitext('&#10095;')

    local gridWrap = calLeft:tag('div'):addClass('calendar-grid-wrapper')
    gridWrap:tag('div'):addClass('calendar-grid-days'):wikitext('<div>Sun</div><div>Mon</div><div>Tue</div><div>Wed</div><div>Thu</div><div>Fri</div><div>Sat</div>')
    gridWrap:tag('div'):addClass('calendar-grid-dates')

    local calRight = root:tag('div'):addClass('calendar-right')
    calRight:tag('div'):addClass('cal-details-content')

    return tostring(root)
end

return p