Files
5etools-mirror-2.github.io/js/races.js
TheGiddyLimit 99cb60d804 v1.206.0
2024-04-23 23:14:25 +01:00

143 lines
3.9 KiB
JavaScript

"use strict";
class RacesSublistManager extends SublistManager {
static get _ROW_TEMPLATE () {
return [
new SublistCellTemplate({
name: "Name",
css: "bold ve-col-5 pl-0",
colStyle: "",
}),
new SublistCellTemplate({
name: "Ability",
css: "ve-col-5",
colStyle: "",
}),
new SublistCellTemplate({
name: "Size",
css: "ve-col-2 ve-text-center pr-0",
colStyle: "text-center",
}),
];
}
pGetSublistItem (race, hash) {
const cellsText = [
race.name,
new SublistCell({text: race._slAbility, css: race._slAbility === "Lineage (choose)" ? "italic" : ""}),
(race.size || [Parser.SZ_VARIES]).map(sz => Parser.sizeAbvToFull(sz)).join("/"),
];
const $ele = $(`<div class="lst__row lst__row--sublist ve-flex-col">
<a href="#${UrlUtil.autoEncodeHash(race)}" class="lst--border lst__row-inner">
${this.constructor._getRowCellsHtml({values: cellsText})}
</a>
</div>
`)
.contextmenu(evt => this._handleSublistItemContextMenu(evt, listItem))
.click(evt => this._listSub.doSelect(listItem, evt));
const listItem = new ListItem(
hash,
$ele,
race.name,
{
hash,
ability: race._slAbility,
},
{
entity: race,
mdRow: [...cellsText],
},
);
return listItem;
}
}
class RacesPage extends ListPage {
constructor () {
const pageFilter = new PageFilterRaces();
super({
dataSource: DataUtil.race.loadJSON.bind(DataUtil.race, {isAddBaseRaces: true}),
prereleaseDataSource: DataUtil.race.loadPrerelease.bind(DataUtil.race),
brewDataSource: DataUtil.race.loadBrew.bind(DataUtil.race),
pFnGetFluff: Renderer.race.pGetFluff.bind(Renderer.race),
pageFilter,
dataProps: ["race"],
isMarkdownPopout: true,
bookViewOptions: {
namePlural: "races",
pageTitle: "Races Book View",
},
hasAudio: true,
});
}
_addData (data) {
if (data.race && data.race.length) super._addData(data);
if (!data.subrace || !data.subrace.length) return;
// Attach each subrace to a parent race, and recurse
const nxtData = Renderer.race.adoptSubraces(this._dataList, data.subrace);
if (nxtData.length) this._addData({race: Renderer.race.mergeSubraces(nxtData)});
}
getListItem (race, rcI, isExcluded) {
const hash = UrlUtil.autoEncodeHash(race);
if (this._seenHashes.has(hash)) return null;
this._seenHashes.add(hash);
this._pageFilter.mutateAndAddToFilters(race, isExcluded);
const eleLi = document.createElement("div");
eleLi.className = `lst__row ve-flex-col ${isExcluded ? "lst__row--blocklisted" : ""}`;
const size = (race.size || [Parser.SZ_VARIES]).map(sz => Parser.sizeAbvToFull(sz)).join("/");
const source = Parser.sourceJsonToAbv(race.source);
eleLi.innerHTML = `<a href="#${hash}" class="lst--border lst__row-inner">
<span class="bold ve-col-4 pl-0">${race.name}</span>
<span class="ve-col-4 ${race._slAbility === "Lineage (choose)" ? "italic" : ""}">${race._slAbility}</span>
<span class="ve-col-2 ve-text-center">${size}</span>
<span class="ve-col-2 ve-text-center ${Parser.sourceJsonToColor(race.source)} pr-0" title="${Parser.sourceJsonToFull(race.source)}" ${Parser.sourceJsonToStyle(race.source)}>${source}</span>
</a>`;
const listItem = new ListItem(
rcI,
eleLi,
race.name,
{
hash,
ability: race._slAbility,
size,
source,
cleanName: PageFilterRaces.getInvertedName(race.name) || "",
alias: PageFilterRaces.getListAliases(race),
},
{
isExcluded,
},
);
eleLi.addEventListener("click", (evt) => this._list.doSelect(listItem, evt));
eleLi.addEventListener("contextmenu", (evt) => this._openContextMenu(evt, this._list, listItem));
return listItem;
}
_renderStats_doBuildStatsTab ({ent}) {
this._$pgContent.empty().append(RenderRaces.$getRenderedRace(ent));
}
}
const racesPage = new RacesPage();
racesPage.sublistManager = new RacesSublistManager();
window.addEventListener("load", () => racesPage.pOnLoad());