Module:OOOInfoBox: Difference between revisions

No edit summary
Tag: Manual revert
No edit summary
 
(7 intermediate revisions by the same user not shown)
Line 51: Line 51:
   local tr = tbl:tag('tr'):addClass('ooo-infobox__group')
   local tr = tbl:tag('tr'):addClass('ooo-infobox__group')
   tr:tag('th'):attr('colspan', '2'):wikitext(text)
   tr:tag('th'):attr('colspan', '2'):wikitext(text)
end
local function add_group(tbl, header, rows)
  -- rows: { {label, value, tip}, ... }
  local has = false
  for _, r in ipairs(rows) do
    if r then
      local v = r[2]
      if v ~= nil and tostring(v) ~= '' then
        has = true
        break
      end
    end
  end
  if not has then return end
  add_group_header(tbl, header)
  for _, r in ipairs(rows) do
    if r then
      local label, value, tip = r[1], r[2], r[3]
      if value ~= nil and tostring(value) ~= '' then
        add_row(tbl, label, value, tip)
      end
    end
  end
end
-- Compact "W × L × H" builder (returns nil when nothing to show)
local function join_dims(a, b, c, unit)
  local parts = {}
  if a then parts[#parts+1] = tostring(a) end
  if b then parts[#parts+1] = tostring(b) end
  if c then parts[#parts+1] = tostring(c) end
  if #parts == 0 then return nil end
  return table.concat(parts, ' × ') .. (unit or '')
end
end


Line 81: Line 115:


   local box = mw.html.create('table'):addClass('ooo-infobox')
   local box = mw.html.create('table'):addClass('ooo-infobox')
  -- optional width (keeps CSS default if omitted)
  local w = tonumber((frame:getParent() or frame).args.width)
  if w and w >= 240 and w <= 600 then
    box:css('width', w .. 'px')
  end
 
  -- default is right via CSS; only add class when overriding
  local align = trim(args.align)
  if align == 'left' then
    box:addClass('ooo-infobox--left')
  elseif align == 'none' then
    box:addClass('ooo-infobox--none')
  elseif align == 'center' then
    box:addClass('ooo-infobox--center')
  end
  -- keep optional extra classes
  local extra_class = trim(args.class)
  if extra_class and extra_class ~= '' then
    for c in mw.text.gsplit(extra_class, '%s+') do box:addClass(c) end
  end


   -- Title
   -- Title
Line 107: Line 163:


   -- Basics
   -- Basics
   add_row(box, 'Domain', domain)
add_group(box, 'General', {
  add_row(box, 'Art Number', art)
  {'Art Number', art},
   add_row(box, 'Type', pick(args, data, 'type'))
  {'Category',  pick(args, data, 'category')},
  {'Subcategory',pick(args, data, 'subcategory')},
   {'Price',      pick(args, data, 'price')},
  {'Domain',     domain},
})
 
-- Performance (auto-hides if empty)
add_group(box, 'Performance', {
  {'Throughput (m³/h)', pick(args, data, 'throughput_m3h')},
   {'Capacity',          pick(args, data, 'capacity')},
})
 
-- Power (keep separate from Performance; easy to add more later)
add_group(box, 'Power', {
  {'Power (kW)', with_unit(pick(args, data, 'power_kw'), U.kw)},
  -- Example for later: {'Generated (MW)', with_unit(pick(args, data, 'power_generated_mw'), U.mw)},
})


  -- Performance / Power
-- I/O (mergers/splitters etc.)
  add_group_header(box, 'Performance')
add_group(box, 'I/O', {
   add_row(box, 'Throughput (m³/h)', pick(args, data, 'throughput_m3h'))
   {'Conveyor inputs',  pick(args, data, 'beltInputs')},
   add_row(box, 'Power (kW)', with_unit(pick(args, data, 'power_kw'), U.kw))
  {'Conveyor outputs', pick(args, data, 'beltOutputs')},
   add_row(box, 'Capacity', pick(args, data, 'capacity'))
   {'Pipeline inputs', pick(args, data, 'pipeInputs')},
   {'Pipeline outputs', pick(args, data, 'pipeOutputs')},
})


  -- I/O (mergers/splitters etc.)
-- Dimensions: supports size={x,y,z} OR flat keys; always compact
   local belt_in  = pick(args, data, 'beltInputs')
local sx, sy, sz
  local belt_out = pick(args, data, 'beltOutputs')
if data.size and type(data.size) == 'table' then
  local pipe_in  = pick(args, data, 'pipeInputs')
   sx, sy, sz = data.size.x, data.size.y, data.size.z
  local pipe_out = pick(args, data, 'pipeOutputs')
end
  if belt_in or belt_out or pipe_in or pipe_out then
local size_w    = pick(args, data, 'size_width') or sx
    add_group_header(box, 'I/O')
local size_l    = pick(args, data, 'size_length') or sy
    add_row(box, 'Conveyor inputs', belt_in)
local size_h    = pick(args, data, 'size_height') or sz
    add_row(box, 'Conveyor outputs', belt_out)
local size_note = pick(args, data, 'size_note')
    add_row(box, 'Pipeline inputs', pipe_in)
    add_row(box, 'Pipeline outputs', pipe_out)
  end


  -- Dimensions (with tiny tooltip like their wiki)
add_group(box, 'Dimensions', {
  local size_w = pick(args, data, 'size_width')
   {'Overall', join_dims(size_w, size_l, size_h, U.m), 'Width × Length × Height'},
   local size_l = pick(args, data, 'size_length')
   {'Note',    size_note},
  local size_h = pick(args, data, 'size_height')
})
   local size_note = pick(args, data, 'size_note')


  if size_w or size_l or size_h or size_note then
    add_group_header(box, 'Dimensions')
    add_row(box, 'Width',  with_unit(size_w, U.m), 'Measured outer width')
    add_row(box, 'Length', with_unit(size_l, U.m), 'Measured outer length')
    add_row(box, 'Height', with_unit(size_h, U.m), 'Measured to highest point')
    if tonumber(size_w) and tonumber(size_l) then
      local area = tonumber(size_w) * tonumber(size_l)
      add_row(box, 'Area', with_unit(area, U.m2))
    end
    add_row(box, 'Note', size_note)
  end


   out:node(box)
   out:node(box)