diff --git a/module/applications/sheets/actors/adversary.mjs b/module/applications/sheets/actors/adversary.mjs index f575a2f2..a7deaf7a 100644 --- a/module/applications/sheets/actors/adversary.mjs +++ b/module/applications/sheets/actors/adversary.mjs @@ -25,6 +25,10 @@ export default class AdversarySheet extends DHBaseActorSheet { }; static PARTS = { + limited: { + template: 'systems/daggerheart/templates/sheets/actors/adversary/limited.hbs', + scrollable: ['.limited-container'] + }, sidebar: { template: 'systems/daggerheart/templates/sheets/actors/adversary/sidebar.hbs', scrollable: ['.shortcut-items-section'] diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index 465da28d..36be3e73 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -78,6 +78,11 @@ export default class CharacterSheet extends DHBaseActorSheet { /**@override */ static PARTS = { + limited: { + id: 'limited', + scrollable: ['.limited-container'], + template: 'systems/daggerheart/templates/sheets/actors/character/limited.hbs' + }, sidebar: { id: 'sidebar', scrollable: ['.shortcut-items-section'], @@ -146,19 +151,21 @@ export default class CharacterSheet extends DHBaseActorSheet { async _onRender(context, options) { await super._onRender(context, options); - this.element - .querySelector('.level-value') - ?.addEventListener('change', event => this.document.updateLevel(Number(event.currentTarget.value))); + if (!this.document.testUserPermission(game.user, 'LIMITED', { exact: true })) { + this.element + .querySelector('.level-value') + ?.addEventListener('change', event => this.document.updateLevel(Number(event.currentTarget.value))); - const observer = this.document.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER, { - exact: true - }); - if (observer) { - this.element.querySelector('.window-content').classList.add('viewMode'); + const observer = this.document.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER, { + exact: true + }); + if (observer) { + this.element.querySelector('.window-content').classList.add('viewMode'); + } + + this._createFilterMenus(); + this._createSearchFilter(); } - - this._createFilterMenus(); - this._createSearchFilter(); } /* -------------------------------------------- */ diff --git a/module/applications/sheets/actors/companion.mjs b/module/applications/sheets/actors/companion.mjs index 82aee312..9e08f13c 100644 --- a/module/applications/sheets/actors/companion.mjs +++ b/module/applications/sheets/actors/companion.mjs @@ -14,6 +14,10 @@ export default class DhCompanionSheet extends DHBaseActorSheet { }; static PARTS = { + limited: { + template: 'systems/daggerheart/templates/sheets/actors/companion/limited.hbs', + scrollable: ['.limited-container'] + }, header: { template: 'systems/daggerheart/templates/sheets/actors/companion/header.hbs' }, details: { template: 'systems/daggerheart/templates/sheets/actors/companion/details.hbs' }, effects: { diff --git a/module/applications/sheets/actors/environment.mjs b/module/applications/sheets/actors/environment.mjs index 0389d2c9..58c661fd 100644 --- a/module/applications/sheets/actors/environment.mjs +++ b/module/applications/sheets/actors/environment.mjs @@ -26,6 +26,10 @@ export default class DhpEnvironment extends DHBaseActorSheet { /**@override */ static PARTS = { + limited: { + template: 'systems/daggerheart/templates/sheets/actors/environment/limited.hbs', + scrollable: ['.limited-container'] + }, header: { template: 'systems/daggerheart/templates/sheets/actors/environment/header.hbs' }, features: { template: 'systems/daggerheart/templates/sheets/actors/environment/features.hbs', diff --git a/module/applications/sheets/api/base-actor.mjs b/module/applications/sheets/api/base-actor.mjs index 930edf86..273a3c67 100644 --- a/module/applications/sheets/api/base-actor.mjs +++ b/module/applications/sheets/api/base-actor.mjs @@ -47,6 +47,12 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { return (this.#settingSheet ??= SheetClass ? new SheetClass({ document: this.document }) : null); } + get isVisible() { + const viewPermission = this.document.testUserPermission(game.user, this.options.viewPermission); + const limitedOnly = this.document.testUserPermission(game.user, this.options.viewPermission, { exact: true }); + return limitedOnly ? this.document.system.metadata.hasLimitedView : viewPermission; + } + /* -------------------------------------------- */ /* Prepare Context */ /* -------------------------------------------- */ @@ -72,6 +78,31 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { return context; } + _configureRenderParts(options) { + const parts = super._configureRenderParts(options); + if (!this.document.system.metadata.hasLimitedView) return parts; + + if (this.document.testUserPermission(game.user, 'LIMITED', { exact: true })) return { limited: parts.limited }; + + return Object.keys(parts).reduce((acc, key) => { + if (key !== 'limited') acc[key] = parts[key]; + + return acc; + }, {}); + } + + /** @inheritDoc */ + async _onRender(context, options) { + await super._onRender(context, options); + + if ( + this.document.system.metadata.hasLimitedView && + this.document.testUserPermission(game.user, 'LIMITED', { exact: true }) + ) { + this.element.classList = `${this.element.classList} limited`; + } + } + /**@inheritdoc */ _attachPartListeners(partId, htmlElement, options) { super._attachPartListeners(partId, htmlElement, options); diff --git a/module/data/actor/base.mjs b/module/data/actor/base.mjs index 9653cd6d..772a5af3 100644 --- a/module/data/actor/base.mjs +++ b/module/data/actor/base.mjs @@ -40,7 +40,8 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel { isNPC: true, settingSheet: null, hasResistances: true, - hasAttribution: false + hasAttribution: false, + hasLimitedView: true }; } diff --git a/styles/less/sheets/actors/actor-sheet-shared.less b/styles/less/sheets/actors/actor-sheet-shared.less index 4a7d6404..868897b9 100644 --- a/styles/less/sheets/actors/actor-sheet-shared.less +++ b/styles/less/sheets/actors/actor-sheet-shared.less @@ -17,4 +17,40 @@ font-family: @font-body; color: light-dark(@chat-blue-bg, @beige-50); } + + &.limited { + &.character, + &.adversary, + &.environment, + &.companion { + width: 360px !important; + + .window-content { + display: unset; + } + + .limited-container { + width: 100%; + padding-top: var(--header-height); + display: flex; + flex-direction: column; + gap: 8px; + + header { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + + .profile { + width: 275px; + } + + .title-name { + text-align: center; + } + } + } + } + } } diff --git a/templates/sheets/actors/adversary/limited.hbs b/templates/sheets/actors/adversary/limited.hbs new file mode 100644 index 00000000..f623eeda --- /dev/null +++ b/templates/sheets/actors/adversary/limited.hbs @@ -0,0 +1,6 @@ +