redo removal after restructuring

This commit is contained in:
Thomas 2026-01-30 10:59:29 -05:00
parent 1a7c0d4796
commit 1b60f459cb
5 changed files with 49 additions and 61 deletions

9
app.js
View File

@ -402,7 +402,7 @@ function toggleSection(contentId, iconId) {
const icon = document.getElementById(iconId);
if (content.style.display === 'none') {
content.style.display = 'block';
content.style.display = '';
icon.textContent = '▼';
} else {
content.style.display = 'none';
@ -464,6 +464,8 @@ function renderMarket(marketData, reputationData) {
const filteredItems = applyMarketFilters(availableItems);
if (filteredItems.length === 0) {
const emptyColspan = 5;
marketContainer.innerHTML = `
<div class="market-table-wrapper">
<table class="market-table">
@ -473,7 +475,7 @@ function renderMarket(marketData, reputationData) {
</thead>
<tbody>
<tr>
<td class="no-items" colspan="6">No items match the current filters.</td>
<td class="no-items" colspan="${emptyColspan}">No items match the current filters.</td>
</tr>
</tbody>
</table>
@ -511,10 +513,10 @@ function renderMarket(marketData, reputationData) {
: isAdminPage
? `${item.adjustedPrice} gp <span class="base-price">(${item.baseCost} gp)</span>`
: `${item.adjustedPrice} gp`;
const nameDisplay = item.dndbeyondUrl
? `<a class="item-link" href="${item.dndbeyondUrl}" target="_blank" rel="noopener">${item.name}</a>`
: item.name;
html += `
<tr class="market-row">
<td class="item-name-cell">${nameDisplay}</td>
@ -992,4 +994,3 @@ function updatePublicUI() {
document.addEventListener('DOMContentLoaded', () => {
setupRealtimeListeners();
});

View File

@ -12,19 +12,19 @@ let marketFilterOpenKey = null;
let marketFilterSearch = {
faction: '',
rarity: '',
stock: ''
stock: '',
};
let marketTableScrollLeft = null;
let marketFilterAllValues = {
faction: [],
rarity: [],
stock: []
stock: [],
};
let marketFiltersInitialized = false;
let marketFilterDebounce = null;
function renderMarketFilters(values) {
// Build the filter row markup for the market table.
const { factions, rarities, stocks } = values;
const { factions, rarities, stocks, } = values;
return `
<tr class="market-filter-row">
<th>
@ -84,7 +84,7 @@ function getMarketFilterValues(items) {
marketFilterAllValues = {
faction: factions,
rarity: rarities,
stock: stocks
stock: stocks,
};
if (!marketFiltersInitialized) {
marketFilters.faction = [...factions];
@ -220,9 +220,7 @@ function updateMarketFilter(key, value) {
// Preserve focus while re-rendering.
captureMarketFilterFocus();
marketFilters[key] = value;
if (marketData && campaignData) {
renderMarket(marketData, campaignData.reputation);
}
scheduleMarketFilterRender();
}
function toggleMarketFilterValue(key, value, isChecked) {
@ -235,9 +233,7 @@ function toggleMarketFilterValue(key, value, isChecked) {
} else if (!isChecked && index >= 0) {
values.splice(index, 1);
}
if (marketData && campaignData) {
renderMarket(marketData, campaignData.reputation);
}
scheduleMarketFilterRender();
}
function clearMarketFilter(key) {
@ -255,9 +251,7 @@ function clearMarketFilter(key) {
selectionEnd: 0
};
}
if (marketData && campaignData) {
renderMarket(marketData, campaignData.reputation);
}
scheduleMarketFilterRender();
}
function selectAllMarketFilter(key) {
@ -265,17 +259,13 @@ function selectAllMarketFilter(key) {
const values = marketFilters[key];
if (!Array.isArray(values)) return;
marketFilters[key] = [...(marketFilterAllValues[key] || [])];
if (marketData && campaignData) {
renderMarket(marketData, campaignData.reputation);
}
scheduleMarketFilterRender();
}
function toggleMarketFilterDropdown(key) {
// Open/close the filter popover for the given column.
marketFilterOpenKey = marketFilterOpenKey === key ? null : key;
if (marketData && campaignData) {
renderMarket(marketData, campaignData.reputation);
}
scheduleMarketFilterRender();
if (marketFilterOpenKey) {
requestAnimationFrame(() => positionMarketFilterPopover(marketFilterOpenKey));
}
@ -285,18 +275,15 @@ function updateMarketFilterSearch(key, value) {
// Update popover search text and refresh the list.
captureMarketFilterFocus();
marketFilterSearch[key] = value;
if (marketData && campaignData) {
renderMarket(marketData, campaignData.reputation);
}
scheduleMarketFilterRender();
}
function closeMarketFilterDropdown() {
// Close any open popover when clicking outside.
if (marketFilterOpenKey !== null) {
captureMarketFilterFocus();
marketFilterOpenKey = null;
if (marketData && campaignData) {
renderMarket(marketData, campaignData.reputation);
}
scheduleMarketFilterRender();
}
}
@ -380,3 +367,11 @@ function restoreMarketTableScroll() {
marketTableScrollLeft = null;
}
function scheduleMarketFilterRender() {
clearTimeout(marketFilterDebounce);
marketFilterDebounce = setTimeout(() => {
if (marketData && campaignData) {
renderMarket(marketData, campaignData.reputation);
}
}, 250);
}

View File

@ -82,4 +82,3 @@
<script src="app.js"></script>
</body>
</html>

View File

@ -330,4 +330,3 @@ const MAGIC_ITEMS_DATA = [
{ id: "item_327", name: "Winged Boots", rarity: "Uncommon", faction: "Tarkanan", baseCost: 5000, dndbeyondPage: "9229203-winged-boots" },
{ id: "item_328", name: "Wings of Flying", rarity: "Rare", faction: "Tarkanan", baseCost: 3600, dndbeyondPage: "9229204-wings-of-flying" }
];

View File

@ -585,7 +585,6 @@ body {
.ashbound div[class*="header"] .faction-name, .faction-name.ashbound { color: #228b22; }
.morgrave div[class*="header"] .faction-name, .faction-name.morgrave { color: #ff8c00; }
/* Loading & Empty States */
.loading, .no-quests {
text-align: center;
@ -1030,9 +1029,6 @@ button {
white-space: normal;
}
.market-table tbody {
height: 40vh;
}
.market-filter-input,
.market-filter-select {
@ -1252,12 +1248,10 @@ button {
background: #1e7b1e;
}
/* Sync the shade of blue across columns */
.rarity-rare {
background: #4169e1;
}
/* Sync the shade of purple across columns */
.rarity-very-rare {
background: #9370db;
}
@ -1330,6 +1324,7 @@ button {
padding: 0 10px;
position: relative;
min-height: 320px;
min-height: 60vh;
}
/* Scroll hint shadow on mobile */
@ -1362,4 +1357,3 @@ button {
display: none;
}
}