// import DhpApplicationMixin from '../daggerheart-sheet.mjs'; // import Tagify from '@yaireo/tagify'; // export default class ClassSheet extends DhpApplicationMixin(ItemSheet) { // static documentType = "class"; // /** @override */ // static get defaultOptions() { // return foundry.utils.mergeObject(super.defaultOptions, { // classes: ["daggerheart", "sheet", "class"], // width: 600, // height: 'auto', // resizable: false, // tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "features" }], // dragDrop: [ // { dragSelector: '.suggested-item', dropSelector: null }, // { dragSelector: null, dropSelector: '.take-section' }, // { dragSelector: null, dropSelector: '.choice-a-section' }, // { dragSelector: null, dropSelector: '.choice-b-section' }, // { dragSelector: null, dropSelector: '.primary-weapon-section' }, // { dragSelector: null, dropSelector: '.secondary-weapon-section' }, // { dragSelector: null, dropSelector: '.armor-section' }, // { dragSelector: null, dropSelector: null }, // ] // }); // } // /** @override */ // async getData() { // const context = super.getData(); // context.domains = this.object.system.domains.map(x => SYSTEM.DOMAIN.domains[x].name) // return context; // } // activateListeners(html){ // super.activateListeners(html); // const domainInput = $(html).find('.domain-input')[0]; // const domainTagify = new Tagify(domainInput, { // tagTextProp: "name", // enforceWhitelist: true, // whitelist : Object.keys(SYSTEM.DOMAIN.domains).map(key => { // const domain = SYSTEM.DOMAIN.domains[key]; // return { value: key, name: game.i18n.localize(domain.name), src: domain.src, background: domain.background }; // }), // maxTags: 2, // callbacks : { invalid: this.onAddTag }, // dropdown : { // mapValueTo: 'name', // searchKeys: ['name'], // enabled: 0, // maxItems: 20, // closeOnSelect : true, // highlightFirst: false, // }, // templates: { // tag(tagData){ //z-index: unset; background-image: ${tagData.background}; Maybe a domain specific background for the chips? // return ` // //
// ${tagData[this.settings.tagTextProp] || tagData.value} // //
//
`; // }} // }); // domainTagify.on('change', this.onDomainSelect.bind(this)); // } // onAddTag(e){ // if( e.detail.index ===2 ){ // ui.notifications.info(game.i18n.localize("DAGGERHEART.Notification.Info.ClassCanOnlyHaveTwoDomains")); // } // } // async onDomainSelect(event) { // const domains = event.detail?.value ? JSON.parse(event.detail.value) : []; // await this.object.update({ "system.domains": domains.map(x => x.value) }); // this.render(true); // } // async _handleAction(action, event, button) { // switch(action){ // case 'removeSubclass': // await this.removeSubclass(button); // break; // case 'viewSubclass': // await this.viewSubclass(button); // break; // case 'removeFeature': // await this.removeFeature(button); // break; // case 'viewFeature': // await this.viewFeature(button); // break; // case 'removeItem': // await this.removeItem(event); // break; // case 'viewItem': // await this.viewItem(button); // break; // case 'removePrimaryWeapon': // await this.removePrimaryWeapon(event); // break; // case 'removeSecondaryWeapon': // await this.removeSecondaryWeapon(event); // break; // case 'removeArmor': // await this.removeArmor(event); // break; // } // } // async removeSubclass(button){ // await this.object.update({ "system.subclasses": this.object.system.subclasses.filter(x => x.uuid !== button.dataset.subclass)}); // } // async viewSubclass(button){ // const subclass = await fromUuid(button.dataset.subclass); // subclass.sheet.render(true); // } // async removeFeature(button){ // await this.object.update({ "system.features": this.object.system.features.filter(x => x.uuid !== button.dataset.feature)}); // } // async viewFeature(button){ // const feature = await fromUuid(button.dataset.feature); // feature.sheet.render(true); // } // async removeItem(event){ // event.stopPropagation(); // const type = event.currentTarget.dataset.type; // const path = `system.inventory.${type}`; // await this.object.update({ [path]: this.object.system.inventory[type].filter(x => x.uuid !== event.currentTarget.dataset.item)}); // } // async viewItem(button){ // const item = await fromUuid(button.dataset.item); // item.sheet.render(true); // } // async removePrimaryWeapon(event){ // event.stopPropagation(); // await this.object.update({ "system.characterGuide.suggestedPrimaryWeapon": null }, { diff: false }); // } // async removeSecondaryWeapon(event){ // event.stopPropagation(); // await this.object.update({ "system.characterGuide.suggestedSecondaryWeapon": null }, { diff: false }); // } // async removeArmor(event){ // event.stopPropagation(); // await this.object.update({ "system.characterGuide.suggestedArmor": null }, { diff: false }); // } // async _onDragStart(event){ // if(event.currentTarget.classList.contains('suggested-item')){ // event.dataTransfer.setData("text/plain", JSON.stringify({ type: 'Item', uuid: event.currentTarget.dataset.item })); // } // super._onDragStart(event); // } // async _onDrop(event) { // const data = TextEditor.getDragEventData(event); // const item = await fromUuid(data.uuid); // if(item.type === 'subclass') { // await this.object.update({ "system.subclasses": [...this.object.system.subclasses, { img: item.img, name: item.name, uuid: item.uuid }] }); // } // else if(item.type === 'feature') { // await this.object.update({ "system.features": [...this.object.system.features, { img: item.img, name: item.name, uuid: item.uuid }] }); // } // else if(item.type === 'weapon'){ // if(event.currentTarget.classList.contains('primary-weapon-section')){ // if(!this.object.system.characterGuide.suggestedPrimaryWeapon && !item.system.secondary) await this.object.update({ "system.characterGuide.suggestedPrimaryWeapon": { img: item.img, name: item.name, uuid: item.uuid } }); // } else if(event.currentTarget.classList.contains('secondary-weapon-section')){ // if(!this.object.system.characterGuide.suggestedSecondaryWeapon && item.system.secondary) await this.object.update({ "system.characterGuide.suggestedSecondaryWeapon": { img: item.img, name: item.name, uuid: item.uuid } }); // } // } // else if(item.type === 'armor'){ // if(event.currentTarget.classList.contains('armor-section')){ // if(!this.object.system.characterGuide.suggestedArmor) await this.object.update({ "system.characterGuide.suggestedArmor": { img: item.img, name: item.name, uuid: item.uuid } }); // } // } // else if(event.currentTarget.classList.contains('choice-a-section')){ // if(item.type === 'miscellaneous' || item.type === 'consumable'){ // if(this.object.system.inventory.choiceA.length < 2) await this.object.update({ "system.inventory.choiceA": [...this.object.system.inventory.choiceA, { img: item.img, name: item.name, uuid: item.uuid }] }); // } // } // else if(item.type === 'miscellaneous'){ // if(event.currentTarget.classList.contains('take-section')){ // if(this.object.system.inventory.take.length < 3) await this.object.update({ "system.inventory.take": [...this.object.system.inventory.take, { img: item.img, name: item.name, uuid: item.uuid }] }); // } // else if(event.currentTarget.classList.contains('choice-b-section')){ // if(this.object.system.inventory.choiceB.length < 2) await this.object.update({ "system.inventory.choiceB": [...this.object.system.inventory.choiceB, { img: item.img, name: item.name, uuid: item.uuid }] }); // } // } // } // } import DaggerheartSheet from './daggerheart-sheet.mjs'; import Tagify from '@yaireo/tagify'; const { ItemSheetV2 } = foundry.applications.sheets; export default class ClassSheet extends DaggerheartSheet(ItemSheetV2) { static DEFAULT_OPTIONS = { tag: 'form', id: 'daggerheart-class', classes: ['daggerheart', 'sheet', 'class'], position: { width: 600 }, actions: { removeSubclass: this.removeSubclass, viewSubclass: this.viewSubclass, removeFeature: this.removeFeature, viewFeature: this.viewFeature, removeItem: this.removeItem, viewItem: this.viewItem, removePrimaryWeapon: this.removePrimaryWeapon, removeSecondaryWeapon: this.removeSecondaryWeapon, removeArmor: this.removeArmor }, form: { handler: this.updateForm, submitOnChange: true, closeOnSubmit: false }, dragDrop: [ { dragSelector: '.suggested-item', dropSelector: null }, { dragSelector: null, dropSelector: '.take-section' }, { dragSelector: null, dropSelector: '.choice-a-section' }, { dragSelector: null, dropSelector: '.choice-b-section' }, { dragSelector: null, dropSelector: '.primary-weapon-section' }, { dragSelector: null, dropSelector: '.secondary-weapon-section' }, { dragSelector: null, dropSelector: '.armor-section' }, { dragSelector: null, dropSelector: null } ] }; static PARTS = { form: { id: 'feature', template: 'systems/daggerheart/templates/sheets/class.hbs' } }; _getTabs() { const tabs = { features: { active: true, cssClass: '', group: 'primary', id: 'features', icon: null, label: game.i18n.localize('DAGGERHEART.Sheets.Class.Tabs.Features') }, guide: { active: false, cssClass: '', group: 'primary', id: 'guide', icon: null, label: game.i18n.localize('DAGGERHEART.Sheets.Class.Tabs.Guide') } }; for (const v of Object.values(tabs)) { v.active = this.tabGroups[v.group] ? this.tabGroups[v.group] === v.id : v.active; v.cssClass = v.active ? 'active' : ''; } return tabs; } _attachPartListeners(partId, htmlElement, options) { super._attachPartListeners(partId, htmlElement, options); const domainInput = htmlElement.querySelector('.domain-input'); const domainTagify = new Tagify(domainInput, { tagTextProp: 'name', enforceWhitelist: true, whitelist: Object.keys(SYSTEM.DOMAIN.domains).map(key => { const domain = SYSTEM.DOMAIN.domains[key]; return { value: key, name: game.i18n.localize(domain.label), src: domain.src, background: domain.background }; }), maxTags: 2, callbacks: { invalid: this.onAddTag }, dropdown: { mapValueTo: 'name', searchKeys: ['name'], enabled: 0, maxItems: 20, closeOnSelect: true, highlightFirst: false }, templates: { tag(tagData) { //z-index: unset; background-image: ${tagData.background}; Maybe a domain specific background for the chips? return `
${tagData[this.settings.tagTextProp] || tagData.value}
`; } } }); domainTagify.on('change', this.onDomainSelect.bind(this)); } async _prepareContext(_options) { const context = await super._prepareContext(_options); context.document = this.document; context.tabs = this._getTabs(); context.domains = this.document.system.domains.map(x => SYSTEM.DOMAIN.domains[x].label); return context; } static async updateForm(event, _, formData) { await this.document.update(formData.object); this.render(); } onAddTag(e) { if (e.detail.index === 2) { ui.notifications.info(game.i18n.localize('DAGGERHEART.Notification.Info.ClassCanOnlyHaveTwoDomains')); } } async onDomainSelect(event) { const domains = event.detail?.value ? JSON.parse(event.detail.value) : []; await this.document.update({ 'system.domains': domains.map(x => x.value) }); this.render(true); } static async removeSubclass(_, button) { await this.document.update({ 'system.subclasses': this.document.system.subclasses.filter(x => x.uuid !== button.dataset.subclass) }); } static async viewSubclass(_, button) { const subclass = await fromUuid(button.dataset.subclass); subclass.sheet.render(true); } static async removeFeature(_, button) { await this.document.update({ 'system.features': this.document.system.features.filter(x => x.uuid !== button.dataset.feature) }); } static async viewFeature(_, button) { const feature = await fromUuid(button.dataset.feature); feature.sheet.render(true); } static async removeItem(event, button) { event.stopPropagation(); const type = button.dataset.type; const path = `system.inventory.${type}`; await this.document.update({ [path]: this.document.system.inventory[type].filter(x => x.uuid !== button.dataset.item) }); } static async viewItem(_, button) { const item = await fromUuid(button.dataset.item); item.sheet.render(true); } static async removePrimaryWeapon(event) { event.stopPropagation(); await this.document.update({ 'system.characterGuide.suggestedPrimaryWeapon': null }, { diff: false }); } static async removeSecondaryWeapon(event) { event.stopPropagation(); await this.document.update({ 'system.characterGuide.suggestedSecondaryWeapon': null }, { diff: false }); } static async removeArmor(event) { event.stopPropagation(); await this.document.update({ 'system.characterGuide.suggestedArmor': null }, { diff: false }); } async _onDrop(event) { const data = TextEditor.getDragEventData(event); const item = await fromUuid(data.uuid); if (item.type === 'subclass') { await this.document.update({ 'system.subclasses': [ ...this.document.system.subclasses, { img: item.img, name: item.name, uuid: item.uuid } ] }); } else if (item.type === 'feature') { await this.document.update({ 'system.features': [ ...this.document.system.features, { img: item.img, name: item.name, uuid: item.uuid } ] }); } else if (item.type === 'weapon') { if (event.currentTarget.classList.contains('primary-weapon-section')) { if (!this.document.system.characterGuide.suggestedPrimaryWeapon && !item.system.secondary) await this.document.update({ 'system.characterGuide.suggestedPrimaryWeapon': { img: item.img, name: item.name, uuid: item.uuid } }); } else if (event.currentTarget.classList.contains('secondary-weapon-section')) { if (!this.document.system.characterGuide.suggestedSecondaryWeapon && item.system.secondary) await this.document.update({ 'system.characterGuide.suggestedSecondaryWeapon': { img: item.img, name: item.name, uuid: item.uuid } }); } } else if (item.type === 'armor') { if (event.currentTarget.classList.contains('armor-section')) { if (!this.document.system.characterGuide.suggestedArmor) await this.document.update({ 'system.characterGuide.suggestedArmor': { img: item.img, name: item.name, uuid: item.uuid } }); } } else if (event.currentTarget.classList.contains('choice-a-section')) { if (item.type === 'miscellaneous' || item.type === 'consumable') { if (this.document.system.inventory.choiceA.length < 2) await this.document.update({ 'system.inventory.choiceA': [ ...this.document.system.inventory.choiceA, { img: item.img, name: item.name, uuid: item.uuid } ] }); } } else if (item.type === 'miscellaneous') { if (event.currentTarget.classList.contains('take-section')) { if (this.document.system.inventory.take.length < 3) await this.document.update({ 'system.inventory.take': [ ...this.document.system.inventory.take, { img: item.img, name: item.name, uuid: item.uuid } ] }); } else if (event.currentTarget.classList.contains('choice-b-section')) { if (this.document.system.inventory.choiceB.length < 2) await this.document.update({ 'system.inventory.choiceB': [ ...this.document.system.inventory.choiceB, { img: item.img, name: item.name, uuid: item.uuid } ] }); } } } }