|
|
- class OwnershipViewer {
- // Creates and applies the OwnershipViewer div to each document in a directory - called when each directory renders.
- static directoryRendered(obj, html, data) {
- if (!game.user.isGM || !obj._getEntryContextOptions) return;
-
- // Get the current directory's right-click context options, then tore the ownership config option
- const contextOptions = obj._getEntryContextOptions();
- const ownershipOption = contextOptions.find((e) => e.name === "OWNERSHIP.Configure");
-
- // Determine if we are working with a directory or a journal sheet
- const isJournalSheet = obj.constructor.name === "JournalSheet";
-
- // Gather all documents in the current directory or journal
- const collection = isJournalSheet ? obj.object.collections.pages : obj.constructor.collection;
- const documentList = html.find(`li.directory-item${isJournalSheet ? ".level1" : ".document"}`);
-
- // Interate through each directory list item.
- for (let li of documentList) {
- // Match it to the corresponding document
- li = $(li);
- const document = collection.get(li.attr(`data-${isJournalSheet ? "page" : "document"}-id`));
- const users = [];
-
- // Iterate through each ownership definition on the document
- for (let id in document.ownership) {
- const ownership = document.ownership[id] ?? 0;
-
- // If the ownership definition isn't 'None'...
- if (ownership !== CONST.DOCUMENT_OWNERSHIP_LEVELS.NONE) {
- // Create the div for this ownership definition, with the appropriate class based on the ownership level
- const user_div = $(`<div data-user-id=${id}></div>`);
-
- // And if the ownership definition isn't 'All Players' (default) or a GM, set 'bg_color' to the user's color
- const user = game.users.get(id);
- if (id !== "default") {
- if (user && !user.isGM) {
- user_div.css({ "background-color": user.color });
- user_div.attr("data-tooltip", user.name);
- } else {
- continue;
- }
- }
-
- const ownerships = invertObject(CONST.DOCUMENT_OWNERSHIP_LEVELS);
- user_div.addClass(`ownership-viewer-${ownerships[ownership].toLowerCase()}`);
- user_div.attr(
- "data-tooltip",
- `${user ? user.name + ": " : ""} ${game.i18n.localize("OWNERSHIP." + ownerships[ownership])}`
- );
- user_div.attr("data-tooltip-direction", "UP");
-
- if (id == "default") {
- user_div.addClass("ownership-viewer-all");
- } else {
- user_div.addClass("ownership-viewer-user");
- }
-
- // Store the resulting div and keep iterating through the other ownership definitions on the document
- users.push(user_div);
- }
- }
-
- const div = $('<div class="ownership-viewer"></div>');
-
- // Append the collection of divs to the document's list item, or add the 'none set' icon if empty
- if (ownershipOption) {
- if (users.length === 0) {
- users.push($('<div><i class="fas fa-share-alt" style="color: white;"></i></div>'));
- }
- const anchor = $(`<a href="#"></a>`);
- div.append(anchor);
- anchor.append(...users);
- } else {
- div.append(...users);
- }
-
- if (isJournalSheet) {
- li.find(".page-ownership").remove();
- li.find(".page-heading").append(div);
- } else {
- li.append(div);
- }
- }
-
- // Ensure any clicks on the OwnershipViewer div open the ownership config for that document
- if (ownershipOption) {
- function registerClickEvents() {
- html.find(".ownership-viewer").click((event) => {
- event.preventDefault();
- event.stopPropagation();
- const li = $(event.currentTarget).closest("li");
- if (li) ownershipOption.callback(li);
- });
- }
-
- if (isJournalSheet) {
- // On journal sheets, delay registering click events until the page is selected and its header is expanded
- Hooks.once("renderJournalPageSheet", () => {
- registerClickEvents();
- });
- } else {
- registerClickEvents();
- }
- }
- }
-
- // Update the user color in OwnershipViewer divs if the user is edited
- static userUpdated(user) {
- for (let user_div of $(".ownership-viewer-user")) {
- let id = $(user_div).attr("data-user-id");
- if (id == user.id) {
- $(user_div).css("background-color", user.color);
- }
- }
- }
-
- // Makes the color assigned to each player clearer in the player list if they are inactive.
- static playerListRendered(list, html, options) {
- if (!options.showOffline) return;
- const userIdColorMap = game.users.contents
- .filter((user) => !user.active)
- .reduce((map, user) => {
- map[user.id] = user.color;
- return map;
- }, {});
- const players = html[0].querySelectorAll("span.player-active.inactive");
- for (let player of players) {
- const id = player.parentElement.dataset.userId;
- player.style.borderColor = userIdColorMap[id];
- }
- }
- }
-
- Hooks.on("renderJournalSheet", OwnershipViewer.directoryRendered);
- Hooks.on("renderJournalDirectory", OwnershipViewer.directoryRendered);
- Hooks.on("renderSceneDirectory", OwnershipViewer.directoryRendered);
- Hooks.on("renderActorDirectory", OwnershipViewer.directoryRendered);
- Hooks.on("renderItemDirectory", OwnershipViewer.directoryRendered);
- Hooks.on("renderMacroDirectory", OwnershipViewer.directoryRendered);
- Hooks.on("renderRollTableDirectory", OwnershipViewer.directoryRendered);
- Hooks.on("renderCardsDirectory", OwnershipViewer.directoryRendered);
- Hooks.on("updateUser", OwnershipViewer.userUpdated);
- Hooks.on("renderPlayerList", OwnershipViewer.playerListRendered);
|