Files
Foundry-VTT-Docker/resources/app/client/data/documents/journal-entry.js
2025-01-04 00:34:03 +01:00

102 lines
3.8 KiB
JavaScript

/**
* The client-side JournalEntry document which extends the common BaseJournalEntry model.
* @extends foundry.documents.BaseJournalEntry
* @mixes ClientDocumentMixin
*
* @see {@link Journal} The world-level collection of JournalEntry documents
* @see {@link JournalSheet} The JournalEntry configuration application
*/
class JournalEntry extends ClientDocumentMixin(foundry.documents.BaseJournalEntry) {
/* -------------------------------------------- */
/* Properties */
/* -------------------------------------------- */
/**
* A boolean indicator for whether the JournalEntry is visible to the current user in the directory sidebar
* @type {boolean}
*/
get visible() {
return this.testUserPermission(game.user, "OBSERVER");
}
/* -------------------------------------------- */
/** @inheritdoc */
getUserLevel(user) {
// Upgrade to OBSERVER ownership if the journal entry is in a LIMITED compendium, as LIMITED has no special meaning
// for journal entries in this context.
if ( this.pack && (this.compendium.getUserLevel(user) === CONST.DOCUMENT_OWNERSHIP_LEVELS.LIMITED) ) {
return CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER;
}
return super.getUserLevel(user);
}
/* -------------------------------------------- */
/**
* Return a reference to the Note instance for this Journal Entry in the current Scene, if any.
* If multiple notes are placed for this Journal Entry, only the first will be returned.
* @type {Note|null}
*/
get sceneNote() {
if ( !canvas.ready ) return null;
return canvas.notes.placeables.find(n => n.document.entryId === this.id) || null;
}
/* -------------------------------------------- */
/* Methods */
/* -------------------------------------------- */
/**
* Show the JournalEntry to connected players.
* By default, the entry will only be shown to players who have permission to observe it.
* If the parameter force is passed, the entry will be shown to all players regardless of normal permission.
*
* @param {boolean} [force=false] Display the entry to all players regardless of normal permissions
* @returns {Promise<JournalEntry>} A Promise that resolves back to the shown entry once the request is processed
* @alias Journal.show
*/
async show(force=false) {
return Journal.show(this, {force});
}
/* -------------------------------------------- */
/**
* If the JournalEntry has a pinned note on the canvas, this method will animate to that note
* The note will also be highlighted as if hovered upon by the mouse
* @param {object} [options={}] Options which modify the pan operation
* @param {number} [options.scale=1.5] The resulting zoom level
* @param {number} [options.duration=250] The speed of the pan animation in milliseconds
* @returns {Promise<void>} A Promise which resolves once the pan animation has concluded
*/
panToNote(options={}) {
return canvas.notes.panToNote(this.sceneNote, options);
}
/* -------------------------------------------- */
/* Event Handlers */
/* -------------------------------------------- */
/** @inheritDoc */
_onUpdate(changed, options, userId) {
super._onUpdate(changed, options, userId);
if ( !canvas.ready ) return;
if ( ["name", "ownership"].some(k => k in changed) ) {
canvas.notes.placeables.filter(n => n.document.entryId === this.id).forEach(n => n.draw());
}
}
/* -------------------------------------------- */
/** @inheritDoc */
_onDelete(options, userId) {
super._onDelete(options, userId);
if ( !canvas.ready ) return;
for ( let n of canvas.notes.placeables ) {
if ( n.document.entryId === this.id ) n.draw();
}
}
}