redo removal after restructuring
This commit is contained in:
parent
1a7c0d4796
commit
1b60f459cb
9
app.js
9
app.js
@ -402,7 +402,7 @@ function toggleSection(contentId, iconId) {
|
|||||||
const icon = document.getElementById(iconId);
|
const icon = document.getElementById(iconId);
|
||||||
|
|
||||||
if (content.style.display === 'none') {
|
if (content.style.display === 'none') {
|
||||||
content.style.display = 'block';
|
content.style.display = '';
|
||||||
icon.textContent = '▼';
|
icon.textContent = '▼';
|
||||||
} else {
|
} else {
|
||||||
content.style.display = 'none';
|
content.style.display = 'none';
|
||||||
@ -464,6 +464,8 @@ function renderMarket(marketData, reputationData) {
|
|||||||
const filteredItems = applyMarketFilters(availableItems);
|
const filteredItems = applyMarketFilters(availableItems);
|
||||||
|
|
||||||
if (filteredItems.length === 0) {
|
if (filteredItems.length === 0) {
|
||||||
|
|
||||||
|
const emptyColspan = 5;
|
||||||
marketContainer.innerHTML = `
|
marketContainer.innerHTML = `
|
||||||
<div class="market-table-wrapper">
|
<div class="market-table-wrapper">
|
||||||
<table class="market-table">
|
<table class="market-table">
|
||||||
@ -473,7 +475,7 @@ function renderMarket(marketData, reputationData) {
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<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>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@ -511,10 +513,10 @@ function renderMarket(marketData, reputationData) {
|
|||||||
: isAdminPage
|
: isAdminPage
|
||||||
? `${item.adjustedPrice} gp <span class="base-price">(${item.baseCost} gp)</span>`
|
? `${item.adjustedPrice} gp <span class="base-price">(${item.baseCost} gp)</span>`
|
||||||
: `${item.adjustedPrice} gp`;
|
: `${item.adjustedPrice} gp`;
|
||||||
|
|
||||||
const nameDisplay = item.dndbeyondUrl
|
const nameDisplay = item.dndbeyondUrl
|
||||||
? `<a class="item-link" href="${item.dndbeyondUrl}" target="_blank" rel="noopener">${item.name}</a>`
|
? `<a class="item-link" href="${item.dndbeyondUrl}" target="_blank" rel="noopener">${item.name}</a>`
|
||||||
: item.name;
|
: item.name;
|
||||||
|
|
||||||
html += `
|
html += `
|
||||||
<tr class="market-row">
|
<tr class="market-row">
|
||||||
<td class="item-name-cell">${nameDisplay}</td>
|
<td class="item-name-cell">${nameDisplay}</td>
|
||||||
@ -992,4 +994,3 @@ function updatePublicUI() {
|
|||||||
document.addEventListener('DOMContentLoaded', () => {
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
setupRealtimeListeners();
|
setupRealtimeListeners();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
47
filtering.js
47
filtering.js
@ -12,19 +12,19 @@ let marketFilterOpenKey = null;
|
|||||||
let marketFilterSearch = {
|
let marketFilterSearch = {
|
||||||
faction: '',
|
faction: '',
|
||||||
rarity: '',
|
rarity: '',
|
||||||
stock: ''
|
stock: '',
|
||||||
};
|
};
|
||||||
let marketTableScrollLeft = null;
|
let marketTableScrollLeft = null;
|
||||||
let marketFilterAllValues = {
|
let marketFilterAllValues = {
|
||||||
faction: [],
|
faction: [],
|
||||||
rarity: [],
|
rarity: [],
|
||||||
stock: []
|
stock: [],
|
||||||
};
|
};
|
||||||
let marketFiltersInitialized = false;
|
let marketFiltersInitialized = false;
|
||||||
|
let marketFilterDebounce = null;
|
||||||
function renderMarketFilters(values) {
|
function renderMarketFilters(values) {
|
||||||
// Build the filter row markup for the market table.
|
// Build the filter row markup for the market table.
|
||||||
const { factions, rarities, stocks } = values;
|
const { factions, rarities, stocks, } = values;
|
||||||
return `
|
return `
|
||||||
<tr class="market-filter-row">
|
<tr class="market-filter-row">
|
||||||
<th>
|
<th>
|
||||||
@ -84,7 +84,7 @@ function getMarketFilterValues(items) {
|
|||||||
marketFilterAllValues = {
|
marketFilterAllValues = {
|
||||||
faction: factions,
|
faction: factions,
|
||||||
rarity: rarities,
|
rarity: rarities,
|
||||||
stock: stocks
|
stock: stocks,
|
||||||
};
|
};
|
||||||
if (!marketFiltersInitialized) {
|
if (!marketFiltersInitialized) {
|
||||||
marketFilters.faction = [...factions];
|
marketFilters.faction = [...factions];
|
||||||
@ -220,9 +220,7 @@ function updateMarketFilter(key, value) {
|
|||||||
// Preserve focus while re-rendering.
|
// Preserve focus while re-rendering.
|
||||||
captureMarketFilterFocus();
|
captureMarketFilterFocus();
|
||||||
marketFilters[key] = value;
|
marketFilters[key] = value;
|
||||||
if (marketData && campaignData) {
|
scheduleMarketFilterRender();
|
||||||
renderMarket(marketData, campaignData.reputation);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleMarketFilterValue(key, value, isChecked) {
|
function toggleMarketFilterValue(key, value, isChecked) {
|
||||||
@ -235,9 +233,7 @@ function toggleMarketFilterValue(key, value, isChecked) {
|
|||||||
} else if (!isChecked && index >= 0) {
|
} else if (!isChecked && index >= 0) {
|
||||||
values.splice(index, 1);
|
values.splice(index, 1);
|
||||||
}
|
}
|
||||||
if (marketData && campaignData) {
|
scheduleMarketFilterRender();
|
||||||
renderMarket(marketData, campaignData.reputation);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearMarketFilter(key) {
|
function clearMarketFilter(key) {
|
||||||
@ -255,9 +251,7 @@ function clearMarketFilter(key) {
|
|||||||
selectionEnd: 0
|
selectionEnd: 0
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
if (marketData && campaignData) {
|
scheduleMarketFilterRender();
|
||||||
renderMarket(marketData, campaignData.reputation);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function selectAllMarketFilter(key) {
|
function selectAllMarketFilter(key) {
|
||||||
@ -265,17 +259,13 @@ function selectAllMarketFilter(key) {
|
|||||||
const values = marketFilters[key];
|
const values = marketFilters[key];
|
||||||
if (!Array.isArray(values)) return;
|
if (!Array.isArray(values)) return;
|
||||||
marketFilters[key] = [...(marketFilterAllValues[key] || [])];
|
marketFilters[key] = [...(marketFilterAllValues[key] || [])];
|
||||||
if (marketData && campaignData) {
|
scheduleMarketFilterRender();
|
||||||
renderMarket(marketData, campaignData.reputation);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleMarketFilterDropdown(key) {
|
function toggleMarketFilterDropdown(key) {
|
||||||
// Open/close the filter popover for the given column.
|
// Open/close the filter popover for the given column.
|
||||||
marketFilterOpenKey = marketFilterOpenKey === key ? null : key;
|
marketFilterOpenKey = marketFilterOpenKey === key ? null : key;
|
||||||
if (marketData && campaignData) {
|
scheduleMarketFilterRender();
|
||||||
renderMarket(marketData, campaignData.reputation);
|
|
||||||
}
|
|
||||||
if (marketFilterOpenKey) {
|
if (marketFilterOpenKey) {
|
||||||
requestAnimationFrame(() => positionMarketFilterPopover(marketFilterOpenKey));
|
requestAnimationFrame(() => positionMarketFilterPopover(marketFilterOpenKey));
|
||||||
}
|
}
|
||||||
@ -285,18 +275,15 @@ function updateMarketFilterSearch(key, value) {
|
|||||||
// Update popover search text and refresh the list.
|
// Update popover search text and refresh the list.
|
||||||
captureMarketFilterFocus();
|
captureMarketFilterFocus();
|
||||||
marketFilterSearch[key] = value;
|
marketFilterSearch[key] = value;
|
||||||
if (marketData && campaignData) {
|
scheduleMarketFilterRender();
|
||||||
renderMarket(marketData, campaignData.reputation);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function closeMarketFilterDropdown() {
|
function closeMarketFilterDropdown() {
|
||||||
// Close any open popover when clicking outside.
|
// Close any open popover when clicking outside.
|
||||||
if (marketFilterOpenKey !== null) {
|
if (marketFilterOpenKey !== null) {
|
||||||
|
captureMarketFilterFocus();
|
||||||
marketFilterOpenKey = null;
|
marketFilterOpenKey = null;
|
||||||
if (marketData && campaignData) {
|
scheduleMarketFilterRender();
|
||||||
renderMarket(marketData, campaignData.reputation);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -380,3 +367,11 @@ function restoreMarketTableScroll() {
|
|||||||
marketTableScrollLeft = null;
|
marketTableScrollLeft = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function scheduleMarketFilterRender() {
|
||||||
|
clearTimeout(marketFilterDebounce);
|
||||||
|
marketFilterDebounce = setTimeout(() => {
|
||||||
|
if (marketData && campaignData) {
|
||||||
|
renderMarket(marketData, campaignData.reputation);
|
||||||
|
}
|
||||||
|
}, 250);
|
||||||
|
}
|
||||||
|
|||||||
@ -82,4 +82,3 @@
|
|||||||
<script src="app.js"></script>
|
<script src="app.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|||||||
@ -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_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" }
|
{ id: "item_328", name: "Wings of Flying", rarity: "Rare", faction: "Tarkanan", baseCost: 3600, dndbeyondPage: "9229204-wings-of-flying" }
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@ -585,7 +585,6 @@ body {
|
|||||||
.ashbound div[class*="header"] .faction-name, .faction-name.ashbound { color: #228b22; }
|
.ashbound div[class*="header"] .faction-name, .faction-name.ashbound { color: #228b22; }
|
||||||
.morgrave div[class*="header"] .faction-name, .faction-name.morgrave { color: #ff8c00; }
|
.morgrave div[class*="header"] .faction-name, .faction-name.morgrave { color: #ff8c00; }
|
||||||
|
|
||||||
|
|
||||||
/* Loading & Empty States */
|
/* Loading & Empty States */
|
||||||
.loading, .no-quests {
|
.loading, .no-quests {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@ -1030,9 +1029,6 @@ button {
|
|||||||
white-space: normal;
|
white-space: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
.market-table tbody {
|
|
||||||
height: 40vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
.market-filter-input,
|
.market-filter-input,
|
||||||
.market-filter-select {
|
.market-filter-select {
|
||||||
@ -1252,12 +1248,10 @@ button {
|
|||||||
background: #1e7b1e;
|
background: #1e7b1e;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sync the shade of blue across columns */
|
|
||||||
.rarity-rare {
|
.rarity-rare {
|
||||||
background: #4169e1;
|
background: #4169e1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sync the shade of purple across columns */
|
|
||||||
.rarity-very-rare {
|
.rarity-very-rare {
|
||||||
background: #9370db;
|
background: #9370db;
|
||||||
}
|
}
|
||||||
@ -1330,6 +1324,7 @@ button {
|
|||||||
padding: 0 10px;
|
padding: 0 10px;
|
||||||
position: relative;
|
position: relative;
|
||||||
min-height: 320px;
|
min-height: 320px;
|
||||||
|
min-height: 60vh;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Scroll hint shadow on mobile */
|
/* Scroll hint shadow on mobile */
|
||||||
@ -1362,4 +1357,3 @@ button {
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user