Skip to main content

ITEMS_JS

Constant ITEMS_JS 

Source
const ITEMS_JS: &str = "\"use strict\";\n\nconst itemsState = {\n  ilvl: \"all\",\n  limit: \"20\",\n  mode: \"pct\",\n  scenario: \"patchwerk\",\n  spec: null,\n  tab: \"spec\",\n};\n\nconst itemsUrlKeys = {\n  ilvl: (v) => itemsSelectIlvl(v),\n  limit: (v) => itemsSelectLimit(v),\n  mode: (v) => itemsSelectMode(v),\n  scenario: (v) => itemsSelectScenario(v),\n  spec: (v) => {\n    const sel = document.getElementById(\"spec-select\");\n    if (sel) {\n      sel.value = v;\n    }\n    itemsSelectSpec(v);\n  },\n  tab: (v) => switchSection(v),\n};\n\nlet itemsLoading = false;\nlet itemsNameToIdCache = null;\n\nfunction itemsBarClick(params) {\n  const id = itemsNameToId()[params?.name];\n  if (!id) {\n    return;\n  }\n  window.open(\n    `https://wowlab.gg/inspect/item/${id}`,\n    \"_blank\",\n    \"noopener noreferrer\",\n  );\n}\n\nfunction itemsLoadUrl() {\n  const params = new URLSearchParams(window.location.search);\n  itemsLoading = true;\n  try {\n    for (const [key, setter] of Object.entries(itemsUrlKeys)) {\n      const value = params.get(key);\n      if (value !== null) {\n        setter(value);\n      }\n    }\n  } finally {\n    itemsLoading = false;\n  }\n  itemsSyncUrl();\n}\n\nfunction itemsNameToId() {\n  if (itemsNameToIdCache) {\n    return itemsNameToIdCache;\n  }\n  const script = document.getElementById(\"items-name-to-id\");\n  itemsNameToIdCache = script ? (parseJSON(script) ?? {}) : {};\n  return itemsNameToIdCache;\n}\n\nfunction itemsRenderChart() {\n  const { limit, mode, scenario, spec } = itemsState;\n  if (!spec) {\n    return;\n  }\n\n  const script = document.getElementById(\n    `items-bars-${mode}-${spec}-${scenario}`,\n  );\n  if (!script) {\n    return;\n  }\n\n  const opts = parseJSON(script);\n  if (!opts) {\n    return;\n  }\n\n  const n = Number.parseInt(limit, 10);\n  if (Number.isFinite(n) && n > 0) {\n    const yAxis = Array.isArray(opts.yAxis) ? opts.yAxis[0] : opts.yAxis;\n    if (Array.isArray(yAxis?.data)) {\n      yAxis.data = yAxis.data.slice(0, n);\n    }\n    if (Array.isArray(opts.series)) {\n      for (const s of opts.series) {\n        if (Array.isArray(s.data)) {\n          s.data = s.data.slice(0, n);\n        }\n      }\n    }\n  }\n\n  const chartKey = `items-bars-${spec}`;\n  const containers = document.querySelectorAll(\n    `.spec-view[data-spec=\"${spec}\"] [data-chart=\"${chartKey}\"]`,\n  );\n  for (const el of containers) {\n    initChart(el, opts);\n    charts[el.dataset.chart]?.on(\"click\", itemsBarClick);\n  }\n}\n\nfunction itemsSelectIlvl(value) {\n  itemsState.ilvl = value;\n  itemsSetActive(\"ilvl-group\", \"ilvl\", value);\n  for (const row of document.querySelectorAll(\".ilvl-row\")) {\n    row.hidden = !(value === \"all\" || row.dataset.ilvl === value);\n  }\n  itemsSyncUrl();\n}\n\nfunction itemsSelectLimit(value) {\n  itemsState.limit = value;\n  itemsSetActive(\"limit-group\", \"limit\", value);\n  itemsRenderChart();\n  itemsSyncUrl();\n}\n\nfunction itemsSelectMode(value) {\n  itemsState.mode = value;\n  itemsSetActive(\"mode-group\", \"mode\", value);\n  itemsRenderChart();\n  itemsSyncUrl();\n}\n\nfunction itemsSelectScenario(value) {\n  itemsState.scenario = value;\n  itemsSetActive(\"scenario-group\", \"scenario\", value);\n  itemsRenderChart();\n  itemsSyncUrl();\n}\n\nfunction itemsSelectSpec(slug) {\n  itemsState.spec = slug;\n  for (const el of document.querySelectorAll(\".spec-view\")) {\n    el.hidden = el.dataset.spec !== slug;\n  }\n  itemsRenderChart();\n  itemsSyncUrl();\n}\n\nfunction itemsSetActive(groupId, datasetKey, value) {\n  const group = document.getElementById(groupId);\n  if (!group) {\n    return;\n  }\n  for (const btn of group.querySelectorAll(`button[data-${datasetKey}]`)) {\n    const match = btn.dataset[datasetKey] === value;\n    btn.classList.toggle(\"is-active\", match);\n    btn.setAttribute(\"aria-pressed\", match ? \"true\" : \"false\");\n  }\n}\n\nfunction itemsSyncUrl() {\n  if (itemsLoading) {\n    return;\n  }\n  const params = new URLSearchParams();\n  for (const key of Object.keys(itemsUrlKeys)) {\n    const value = itemsState[key];\n    if (value != null && value !== \"\") {\n      params.set(key, value);\n    }\n  }\n  const qs = params.toString();\n  const url = `${window.location.pathname}${qs ? `?${qs}` : \"\"}${window.location.hash}`;\n  window.history.replaceState(null, \"\", url);\n}\n\n{\n  const original = window.switchSection;\n  if (typeof original === \"function\") {\n    window.switchSection = (id) => {\n      original(id);\n      itemsState.tab = id;\n      itemsSyncUrl();\n    };\n  }\n}\n\nitemsLoading = true;\ntry {\n  itemsSelectMode(\"pct\");\n  itemsSelectScenario(\"patchwerk\");\n  itemsSelectLimit(\"20\");\n  itemsSelectIlvl(\"all\");\n  const specSelect = document.getElementById(\"spec-select\");\n  if (specSelect) {\n    itemsSelectSpec(specSelect.value);\n  }\n} finally {\n  itemsLoading = false;\n}\nitemsLoadUrl();\n";