mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-01-12 03:31:07 +01:00
[Fix] Inventory Item Transfer (#1316)
* Fixed so items from the inventory tab of the Party sheet can be dragged out * Added transfer logic * Added translation * Improved item transfer dialog title * Simplified title * Updated image * Simplified the handlebars templates for itemTransfer * Improved item-identicial check * Slight improved rendering * .
This commit is contained in:
parent
9f7554cdff
commit
2920ead81a
15 changed files with 228 additions and 47 deletions
|
|
@ -464,6 +464,9 @@
|
||||||
"title": "Select Image",
|
"title": "Select Image",
|
||||||
"selectImage": "Select Image"
|
"selectImage": "Select Image"
|
||||||
},
|
},
|
||||||
|
"ItemTransfer": {
|
||||||
|
"transfer": "Transfer"
|
||||||
|
},
|
||||||
"Levelup": {
|
"Levelup": {
|
||||||
"actions": {
|
"actions": {
|
||||||
"creatureComfort": {
|
"creatureComfort": {
|
||||||
|
|
@ -2651,7 +2654,7 @@
|
||||||
"cardTooHighLevel": "The card is too high level!",
|
"cardTooHighLevel": "The card is too high level!",
|
||||||
"duplicateCard": "You cannot select the same card more than once.",
|
"duplicateCard": "You cannot select the same card more than once.",
|
||||||
"duplicateCharacter": "This actor is already registered in the party members list.",
|
"duplicateCharacter": "This actor is already registered in the party members list.",
|
||||||
"onlyCharactersInPartySheet": "You can only drag characters, companions and adverasries to the party sheet.",
|
"onlyCharactersInPartySheet": "You can only drag characters, companions and adversaries to the party sheet.",
|
||||||
"notPrimary": "The weapon is not a primary weapon!",
|
"notPrimary": "The weapon is not a primary weapon!",
|
||||||
"notSecondary": "The weapon is not a secondary weapon!",
|
"notSecondary": "The weapon is not a secondary weapon!",
|
||||||
"itemTooHighTier": "The item must be from Tier1",
|
"itemTooHighTier": "The item must be from Tier1",
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ export { default as DamageReductionDialog } from './damageReductionDialog.mjs';
|
||||||
export { default as DeathMove } from './deathMove.mjs';
|
export { default as DeathMove } from './deathMove.mjs';
|
||||||
export { default as Downtime } from './downtime.mjs';
|
export { default as Downtime } from './downtime.mjs';
|
||||||
export { default as ImageSelectDialog } from './imageSelectDialog.mjs';
|
export { default as ImageSelectDialog } from './imageSelectDialog.mjs';
|
||||||
|
export { default as ItemTransferDialog } from './itemTransfer.mjs';
|
||||||
export { default as MulticlassChoiceDialog } from './multiclassChoiceDialog.mjs';
|
export { default as MulticlassChoiceDialog } from './multiclassChoiceDialog.mjs';
|
||||||
export { default as OwnershipSelection } from './ownershipSelection.mjs';
|
export { default as OwnershipSelection } from './ownershipSelection.mjs';
|
||||||
export { default as RerollDamageDialog } from './rerollDamageDialog.mjs';
|
export { default as RerollDamageDialog } from './rerollDamageDialog.mjs';
|
||||||
|
|
|
||||||
70
module/applications/dialogs/itemTransfer.mjs
Normal file
70
module/applications/dialogs/itemTransfer.mjs
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
|
||||||
|
|
||||||
|
export default class ItemTransferDialog extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
|
constructor(item) {
|
||||||
|
super({});
|
||||||
|
|
||||||
|
this.item = item;
|
||||||
|
this.quantity = item.system.quantity;
|
||||||
|
}
|
||||||
|
|
||||||
|
get title() {
|
||||||
|
return this.item.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
tag: 'form',
|
||||||
|
classes: ['daggerheart', 'dh-style', 'dialog', 'item-transfer'],
|
||||||
|
position: { width: 300, height: 'auto' },
|
||||||
|
window: { icon: 'fa-solid fa-hand-holding-hand' },
|
||||||
|
actions: {
|
||||||
|
finish: ItemTransferDialog.#finish
|
||||||
|
},
|
||||||
|
form: { handler: this.updateData, submitOnChange: true, closeOnSubmit: false }
|
||||||
|
};
|
||||||
|
|
||||||
|
static PARTS = {
|
||||||
|
main: { template: 'systems/daggerheart/templates/dialogs/item-transfer.hbs' }
|
||||||
|
};
|
||||||
|
|
||||||
|
_attachPartListeners(partId, htmlElement, options) {
|
||||||
|
super._attachPartListeners(partId, htmlElement, options);
|
||||||
|
|
||||||
|
htmlElement.querySelector('.number-display').addEventListener('change', event => {
|
||||||
|
this.quantity = isNaN(event.target.value) ? this.quantity : Number(event.target.value);
|
||||||
|
this.render();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async _prepareContext(_options) {
|
||||||
|
const context = await super._prepareContext(_options);
|
||||||
|
context.item = this.item;
|
||||||
|
context.quantity = this.quantity;
|
||||||
|
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
|
||||||
|
static async updateData(_event, _element, formData) {
|
||||||
|
const { quantity } = foundry.utils.expandObject(formData.object);
|
||||||
|
this.quantity = quantity;
|
||||||
|
this.render();
|
||||||
|
}
|
||||||
|
|
||||||
|
static async #finish() {
|
||||||
|
this.close({ submitted: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
close(options = {}) {
|
||||||
|
if (!options.submitted) this.quantity = null;
|
||||||
|
|
||||||
|
super.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
static async configure(item) {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
const app = new this(item);
|
||||||
|
app.addEventListener('close', () => resolve(app.quantity), { once: true });
|
||||||
|
app.render({ force: true });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -8,7 +8,6 @@ import { getDocFromElement, getDocFromElementSync } from '../../../helpers/utils
|
||||||
|
|
||||||
/**@typedef {import('@client/applications/_types.mjs').ApplicationClickAction} ApplicationClickAction */
|
/**@typedef {import('@client/applications/_types.mjs').ApplicationClickAction} ApplicationClickAction */
|
||||||
|
|
||||||
const { TextEditor } = foundry.applications.ux;
|
|
||||||
export default class CharacterSheet extends DHBaseActorSheet {
|
export default class CharacterSheet extends DHBaseActorSheet {
|
||||||
/**@inheritdoc */
|
/**@inheritdoc */
|
||||||
static DEFAULT_OPTIONS = {
|
static DEFAULT_OPTIONS = {
|
||||||
|
|
@ -881,6 +880,8 @@ export default class CharacterSheet extends DHBaseActorSheet {
|
||||||
const item = await getDocFromElement(event.target);
|
const item = await getDocFromElement(event.target);
|
||||||
|
|
||||||
const dragData = {
|
const dragData = {
|
||||||
|
originActor: this.document.uuid,
|
||||||
|
originId: item.id,
|
||||||
type: item.documentName,
|
type: item.documentName,
|
||||||
uuid: item.uuid
|
uuid: item.uuid
|
||||||
};
|
};
|
||||||
|
|
@ -894,9 +895,12 @@ export default class CharacterSheet extends DHBaseActorSheet {
|
||||||
// Prevent event bubbling to avoid duplicate handling
|
// Prevent event bubbling to avoid duplicate handling
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event);
|
||||||
|
|
||||||
super._onDrop(event);
|
const { cancel } = await super._onDrop(event);
|
||||||
this._onDropItem(event, TextEditor.getDragEventData(event));
|
if (cancel) return;
|
||||||
|
|
||||||
|
this._onDropItem(event, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
async _onDropItem(event, data) {
|
async _onDropItem(event, data) {
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ import { socketEvent } from '../../../systemRegistration/socket.mjs';
|
||||||
import GroupRollDialog from '../../dialogs/group-roll-dialog.mjs';
|
import GroupRollDialog from '../../dialogs/group-roll-dialog.mjs';
|
||||||
import DhpActor from '../../../documents/actor.mjs';
|
import DhpActor from '../../../documents/actor.mjs';
|
||||||
import DHItem from '../../../documents/item.mjs';
|
import DHItem from '../../../documents/item.mjs';
|
||||||
import DhParty from '../../../data/actor/party.mjs';
|
|
||||||
|
|
||||||
export default class Party extends DHBaseActorSheet {
|
export default class Party extends DHBaseActorSheet {
|
||||||
constructor(options) {
|
constructor(options) {
|
||||||
|
|
@ -21,7 +20,7 @@ export default class Party extends DHBaseActorSheet {
|
||||||
classes: ['party'],
|
classes: ['party'],
|
||||||
position: {
|
position: {
|
||||||
width: 550,
|
width: 550,
|
||||||
height: 900,
|
height: 900
|
||||||
},
|
},
|
||||||
window: {
|
window: {
|
||||||
resizable: true
|
resizable: true
|
||||||
|
|
@ -41,7 +40,7 @@ export default class Party extends DHBaseActorSheet {
|
||||||
selectRefreshable: DaggerheartMenu.selectRefreshable,
|
selectRefreshable: DaggerheartMenu.selectRefreshable,
|
||||||
refreshActors: DaggerheartMenu.refreshActors
|
refreshActors: DaggerheartMenu.refreshActors
|
||||||
},
|
},
|
||||||
dragDrop: [{ dragSelector: '.actors-section .inventory-item', dropSelector: null }]
|
dragDrop: [{ dragSelector: '[data-item-id][draggable="true"]', dropSelector: null }]
|
||||||
};
|
};
|
||||||
|
|
||||||
/**@override */
|
/**@override */
|
||||||
|
|
@ -439,23 +438,28 @@ export default class Party extends DHBaseActorSheet {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|
||||||
async _onDragStart(event) {
|
async _onDragStart(event) {
|
||||||
const item = event.currentTarget.closest('.inventory-item');
|
const item = await getDocFromElement(event.target);
|
||||||
|
const dragData = {
|
||||||
|
originActor: this.document.uuid,
|
||||||
|
originId: item.id,
|
||||||
|
type: item.documentName,
|
||||||
|
uuid: item.uuid
|
||||||
|
};
|
||||||
|
|
||||||
if (item) {
|
event.dataTransfer.setData('text/plain', JSON.stringify(dragData));
|
||||||
const adversaryData = { type: 'Actor', uuid: item.dataset.itemUuid };
|
super._onDragStart(event);
|
||||||
event.dataTransfer.setData('text/plain', JSON.stringify(adversaryData));
|
|
||||||
event.dataTransfer.setDragImage(item, 60, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async _onDrop(event) {
|
async _onDrop(event) {
|
||||||
// Prevent event bubbling to avoid duplicate handling
|
// Prevent event bubbling to avoid duplicate handling
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event);
|
const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event);
|
||||||
|
|
||||||
|
const { cancel } = await super._onDrop(event);
|
||||||
|
if (cancel) return;
|
||||||
|
|
||||||
const document = await foundry.utils.fromUuid(data.uuid);
|
const document = await foundry.utils.fromUuid(data.uuid);
|
||||||
|
|
||||||
if (document instanceof DhpActor && Party.ALLOWED_ACTOR_TYPES.includes(document.type)) {
|
if (document instanceof DhpActor && Party.ALLOWED_ACTOR_TYPES.includes(document.type)) {
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { itemIsIdentical } from '../../../helpers/utils.mjs';
|
||||||
import DHBaseActorSettings from './actor-setting.mjs';
|
import DHBaseActorSettings from './actor-setting.mjs';
|
||||||
import DHApplicationMixin from './application-mixin.mjs';
|
import DHApplicationMixin from './application-mixin.mjs';
|
||||||
|
|
||||||
|
|
@ -217,6 +218,70 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) {
|
||||||
/* Application Drag/Drop */
|
/* Application Drag/Drop */
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|
||||||
|
async _onDrop(event) {
|
||||||
|
const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event);
|
||||||
|
if (data.originActor === this.document.uuid) return { cancel: true };
|
||||||
|
|
||||||
|
/* Handling transfer of inventoryItems */
|
||||||
|
let cancel = false;
|
||||||
|
const physicalActorTypes = ['character', 'party'];
|
||||||
|
if (physicalActorTypes.includes(this.document.type)) {
|
||||||
|
const originActor = data.originActor ? await foundry.utils.fromUuid(data.originActor) : null;
|
||||||
|
if (data.originId && originActor && physicalActorTypes.includes(originActor.type)) {
|
||||||
|
const dropDocument = await foundry.utils.fromUuid(data.uuid);
|
||||||
|
|
||||||
|
if (dropDocument.system.metadata.isInventoryItem) {
|
||||||
|
cancel = true;
|
||||||
|
if (dropDocument.system.metadata.isQuantifiable) {
|
||||||
|
const actorItem = originActor.items.get(data.originId);
|
||||||
|
const quantityTransfered =
|
||||||
|
actorItem.system.quantity === 1
|
||||||
|
? 1
|
||||||
|
: await game.system.api.applications.dialogs.ItemTransferDialog.configure(dropDocument);
|
||||||
|
|
||||||
|
if (quantityTransfered) {
|
||||||
|
if (quantityTransfered === actorItem.system.quantity) {
|
||||||
|
await originActor.deleteEmbeddedDocuments('Item', [data.originId]);
|
||||||
|
} else {
|
||||||
|
cancel = true;
|
||||||
|
await actorItem.update({
|
||||||
|
'system.quantity': actorItem.system.quantity - quantityTransfered
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const existingItem = this.document.items.find(x => itemIsIdentical(x, dropDocument));
|
||||||
|
if (existingItem) {
|
||||||
|
cancel = true;
|
||||||
|
await existingItem.update({
|
||||||
|
'system.quantity': existingItem.system.quantity + quantityTransfered
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const createData = dropDocument.toObject();
|
||||||
|
await this.document.createEmbeddedDocuments('Item', [
|
||||||
|
{
|
||||||
|
...createData,
|
||||||
|
system: {
|
||||||
|
...createData.system,
|
||||||
|
quantity: quantityTransfered
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cancel = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
await originActor.deleteEmbeddedDocuments('Item', [data.originId], { render: false });
|
||||||
|
const createData = dropDocument.toObject();
|
||||||
|
await this.document.createEmbeddedDocuments('Item', [createData]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return { cancel };
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* On dragStart on the item.
|
* On dragStart on the item.
|
||||||
* @param {DragEvent} event - The drag event
|
* @param {DragEvent} event - The drag event
|
||||||
|
|
|
||||||
|
|
@ -33,9 +33,9 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) {
|
||||||
removeResource: DHBaseItemSheet.#removeResource
|
removeResource: DHBaseItemSheet.#removeResource
|
||||||
},
|
},
|
||||||
dragDrop: [
|
dragDrop: [
|
||||||
{ dragSelector: null, dropSelector: '.tab.features .drop-section' },
|
{ dragSelector: null, dropSelector: '.drop-section' },
|
||||||
{ dragSelector: '.feature-item', dropSelector: null },
|
{ dragSelector: '.feature-item', dropSelector: null },
|
||||||
{ dragSelector: '.action-item', dropSelector: null }
|
{ dragSelector: '.inventory-item', dropSelector: null }
|
||||||
],
|
],
|
||||||
contextMenus: [
|
contextMenus: [
|
||||||
{
|
{
|
||||||
|
|
@ -242,37 +242,30 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) {
|
||||||
* @param {DragEvent} event - The drag event
|
* @param {DragEvent} event - The drag event
|
||||||
*/
|
*/
|
||||||
async _onDragStart(event) {
|
async _onDragStart(event) {
|
||||||
|
/* Can prolly be improved a lot, but I don't wanna >_< */
|
||||||
const featureItem = event.currentTarget.closest('.feature-item');
|
const featureItem = event.currentTarget.closest('.feature-item');
|
||||||
|
const inventoryItem = event.currentTarget.closest('.inventory-item');
|
||||||
|
const lineItem = event.currentTarget.closest('.item-line');
|
||||||
|
const dragItemData = featureItem ?? inventoryItem ?? lineItem;
|
||||||
|
|
||||||
if (featureItem) {
|
const dragItem = await foundry.utils.fromUuid(dragItemData.dataset.itemUuid);
|
||||||
const feature = this.document.system.features.find(x => x?.id === featureItem.id);
|
if (dragItem) {
|
||||||
if (!feature) {
|
if (!dragItem) {
|
||||||
ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureIsMissing'));
|
ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureIsMissing'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const featureData = { type: 'Item', data: { ...feature.toObject(), _id: null }, fromInternal: true };
|
let dragData = {};
|
||||||
event.dataTransfer.setData('text/plain', JSON.stringify(featureData));
|
if (dragItemData.dataset.type === 'effect')
|
||||||
event.dataTransfer.setDragImage(featureItem.querySelector('img'), 60, 0);
|
dragData = {
|
||||||
} else {
|
type: 'ActiveEffect',
|
||||||
const actionItem = event.currentTarget.closest('.action-item');
|
fromInternal: this.document.uuid,
|
||||||
if (actionItem) {
|
data: { ...dragItem, uuid: dragItem.uuid, id: dragItem.id }
|
||||||
const action = this.document.system.actions[actionItem.dataset.index];
|
|
||||||
if (!action) {
|
|
||||||
ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.actionIsMissing'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const actionData = {
|
|
||||||
type: 'Action',
|
|
||||||
data: { ...action.toObject(), id: action.id, itemUuid: this.document.uuid },
|
|
||||||
fromInternal: true
|
|
||||||
};
|
};
|
||||||
event.dataTransfer.setData('text/plain', JSON.stringify(actionData));
|
else dragData = { type: 'Item', uuid: dragItem.uuid, id: dragItem.id, fromInternal: this.document.id };
|
||||||
event.dataTransfer.setDragImage(actionItem.querySelector('img'), 60, 0);
|
|
||||||
} else {
|
event.dataTransfer.setData('text/plain', JSON.stringify(dragData));
|
||||||
super._onDragStart(event);
|
event.dataTransfer.setDragImage(dragItemData.querySelector('img'), 60, 0);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -284,7 +277,7 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) {
|
||||||
super._onDrop(event);
|
super._onDrop(event);
|
||||||
|
|
||||||
const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event);
|
const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event);
|
||||||
if (data.fromInternal) return;
|
if (data.fromInternal === this.document.id) return;
|
||||||
|
|
||||||
const target = event.target.closest('fieldset.drop-section');
|
const target = event.target.closest('fieldset.drop-section');
|
||||||
let item = await fromUuid(data.uuid);
|
let item = await fromUuid(data.uuid);
|
||||||
|
|
|
||||||
|
|
@ -125,8 +125,8 @@ export default class ClassSheet extends DHBaseItemSheet {
|
||||||
async _onDrop(event) {
|
async _onDrop(event) {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
const data = TextEditor.getDragEventData(event);
|
const data = TextEditor.getDragEventData(event);
|
||||||
const item = data.data ?? (await fromUuid(data.uuid));
|
const item = await fromUuid(data.uuid);
|
||||||
const itemType = data.data ? data.type : item.type;
|
const itemType = data.type === 'ActiveEffect' ? data.type : item.type;
|
||||||
const target = event.target.closest('fieldset.drop-section');
|
const target = event.target.closest('fieldset.drop-section');
|
||||||
if (itemType === 'subclass') {
|
if (itemType === 'subclass') {
|
||||||
if (item.system.linkedClass) {
|
if (item.system.linkedClass) {
|
||||||
|
|
|
||||||
|
|
@ -437,3 +437,11 @@ export function shuffleArray(array) {
|
||||||
|
|
||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function itemIsIdentical(a, b) {
|
||||||
|
const compendiumSource = a._stats.compendiumSource === b._stats.compendiumSource;
|
||||||
|
const name = a.name === b.name;
|
||||||
|
const description = a.system.description === b.system.description;
|
||||||
|
|
||||||
|
return compendiumSource && name & description;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,3 +35,5 @@
|
||||||
@import './tag-team-dialog/sheet.less';
|
@import './tag-team-dialog/sheet.less';
|
||||||
|
|
||||||
@import './image-select/sheet.less';
|
@import './image-select/sheet.less';
|
||||||
|
|
||||||
|
@import './item-transfer/sheet.less';
|
||||||
|
|
|
||||||
20
styles/less/dialog/item-transfer/sheet.less
Normal file
20
styles/less/dialog/item-transfer/sheet.less
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
.daggerheart.dh-style.dialog.item-transfer {
|
||||||
|
.item-transfer-container {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 42px;
|
||||||
|
gap: 4px;
|
||||||
|
|
||||||
|
.number-display {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-sheet-footer {
|
||||||
|
padding-top: 8px;
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
button {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
templates/dialogs/item-transfer.hbs
Normal file
9
templates/dialogs/item-transfer.hbs
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
<div>
|
||||||
|
<div class="item-transfer-container">
|
||||||
|
<input type="range" step="1" min="0" max="{{item.system.quantity}}" name="quantity" value="{{quantity}}" />
|
||||||
|
<input type="text" value="{{quantity}}" class="number-display" />
|
||||||
|
</div>
|
||||||
|
<footer class="item-sheet-footer">
|
||||||
|
<button type="button" data-action="finish">{{localize "DAGGERHEART.APPLICATIONS.ItemTransfer.transfer"}}</button>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
<li class='feature-item' data-item-uuid='{{feature.uuid}}' data-type="{{type}}">
|
<li class='feature-item' data-item-uuid='{{feature.uuid}}' id="{{feature._id}}" data-type="{{type}}">
|
||||||
<div class='feature-line'>
|
<div class='feature-line'>
|
||||||
<img class='image' src='{{feature.img}}' />
|
<img class='image' src='{{feature.img}}' />
|
||||||
<h4>
|
<h4>
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@
|
||||||
data-action="editDoc"
|
data-action="editDoc"
|
||||||
data-item-uuid="{{document.system.primaryFeature.uuid}}"
|
data-item-uuid="{{document.system.primaryFeature.uuid}}"
|
||||||
data-type="primary"
|
data-type="primary"
|
||||||
|
id="{{document.system.primaryFeature._id}}"
|
||||||
>
|
>
|
||||||
<img class="image" src="{{document.system.primaryFeature.img}}" />
|
<img class="image" src="{{document.system.primaryFeature.img}}" />
|
||||||
<span>{{document.system.primaryFeature.name}}</span>
|
<span>{{document.system.primaryFeature.name}}</span>
|
||||||
|
|
@ -36,6 +37,7 @@
|
||||||
data-action="editDoc"
|
data-action="editDoc"
|
||||||
data-item-uuid="{{document.system.secondaryFeature.uuid}}"
|
data-item-uuid="{{document.system.secondaryFeature.uuid}}"
|
||||||
data-type="secondary"
|
data-type="secondary"
|
||||||
|
id="{{document.system.secondaryFeature._id}}"
|
||||||
>
|
>
|
||||||
<img class="image" src="{{document.system.secondaryFeature.img}}" />
|
<img class="image" src="{{document.system.secondaryFeature.img}}" />
|
||||||
<span>{{document.system.secondaryFeature.name}}</span>
|
<span>{{document.system.secondaryFeature.name}}</span>
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@
|
||||||
<input type="text" name="system.characterGuide.suggestedTraits.knowledge" value="{{source.system.characterGuide.suggestedTraits.knowledge}}" />
|
<input type="text" name="system.characterGuide.suggestedTraits.knowledge" value="{{source.system.characterGuide.suggestedTraits.knowledge}}" />
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
<fieldset class="one-column">
|
<fieldset class="one-column {{#if (eq document.parent.type 'character')}}disabled{{/if}}">
|
||||||
<legend>{{localize "DAGGERHEART.ITEMS.Class.guide.suggestedEquipment"}}</legend>
|
<legend>{{localize "DAGGERHEART.ITEMS.Class.guide.suggestedEquipment"}}</legend>
|
||||||
<fieldset class="one-column drop-section primary-weapon-section {{#if (eq document.parent.type 'character')}}inactive{{/if}}">
|
<fieldset class="one-column drop-section primary-weapon-section {{#if (eq document.parent.type 'character')}}inactive{{/if}}">
|
||||||
<legend>{{localize "DAGGERHEART.ITEMS.Class.guide.suggestedPrimaryWeaponTitle"}}</legend>
|
<legend>{{localize "DAGGERHEART.ITEMS.Class.guide.suggestedPrimaryWeaponTitle"}}</legend>
|
||||||
|
|
@ -86,7 +86,7 @@
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
<fieldset class="one-column">
|
<fieldset class="one-column {{#if (eq document.parent.type 'character')}}disabled{{/if}}">
|
||||||
<legend>{{localize "DAGGERHEART.GENERAL.inventory"}}</legend>
|
<legend>{{localize "DAGGERHEART.GENERAL.inventory"}}</legend>
|
||||||
<fieldset class="one-column drop-section take-section {{#if (eq document.parent.type 'character')}}inactive{{/if}}">
|
<fieldset class="one-column drop-section take-section {{#if (eq document.parent.type 'character')}}inactive{{/if}}">
|
||||||
<legend>{{localize "DAGGERHEART.GENERAL.take"}}</legend>
|
<legend>{{localize "DAGGERHEART.GENERAL.take"}}</legend>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue