diff --git a/system/lang/en-en.json b/system/lang/en-en.json index 25fc222..82fd610 100644 --- a/system/lang/en-en.json +++ b/system/lang/en-en.json @@ -25,10 +25,9 @@ }, "l5r5e": { "global": { - "ok": "OK", "add": "Add", "edit": "Edit", - "delete": "Delete", + "delete_confirm": "Are you sure you want to delete '{name}' ?", "drop_here": "Drop here", "edge_translation_disclaimer": "" }, diff --git a/system/lang/es-es.json b/system/lang/es-es.json index c721c5c..abb298a 100644 --- a/system/lang/es-es.json +++ b/system/lang/es-es.json @@ -25,10 +25,9 @@ }, "l5r5e": { "global": { - "ok": "OK", "add": "Añadir", "edit": "Editar", - "delete": "Borrar", + "delete_confirm": "Are you sure you want to delete '{name}' ?", "drop_here": "Dejar caer aquí", "edge_translation_disclaimer": "Edge Studio nos da su permiso para ofrecer este módulo a la comunidad, pero tanto los textos así como los códigos que lo constituyen no tienen su aprobación explícita." }, diff --git a/system/lang/fr-fr.json b/system/lang/fr-fr.json index 2df563c..a929fa1 100644 --- a/system/lang/fr-fr.json +++ b/system/lang/fr-fr.json @@ -25,10 +25,9 @@ }, "l5r5e": { "global": { - "ok": "OK", "add": "Ajouter", "edit": "Modifier", - "delete": "Supprimer", + "delete_confirm": "Etes-vous sûr de vouloir supprimer '{name}' ?", "drop_here": "Déposez ici", "edge_translation_disclaimer": "" }, diff --git a/system/scripts/actors/base-sheet.js b/system/scripts/actors/base-sheet.js index 73efd90..a11b508 100644 --- a/system/scripts/actors/base-sheet.js +++ b/system/scripts/actors/base-sheet.js @@ -71,6 +71,7 @@ export class BaseSheetL5r5e extends ActorSheet { /** * Handle dropped data on the Actor sheet + * @param {Event} event */ async _onDrop(event) { // *** Everything below here is only needed if the sheet is editable *** @@ -208,28 +209,12 @@ export class BaseSheetL5r5e extends ActorSheet { }); // Equipped / Readied - html.find(".equip-readied-control").on("click", (event) => { - event.preventDefault(); - event.stopPropagation(); - this._switchEquipReadied(event); - }); + html.find(".equip-readied-control").on("click", this._switchEquipReadied.bind(this)); // *** Items : add, edit, delete *** - html.find(".item-add").on("click", (event) => { - event.preventDefault(); - event.stopPropagation(); - this._addSubItem(event); - }); - html.find(`.item-edit`).on("click", (event) => { - event.preventDefault(); - event.stopPropagation(); - this._editSubItem(event); - }); - html.find(`.item-delete`).on("click", (event) => { - event.preventDefault(); - event.stopPropagation(); - this._deleteSubItem(event); - }); + html.find(".item-add").on("click", this._addSubItem.bind(this)); + html.find(`.item-edit`).on("click", this._editSubItem.bind(this)); + html.find(`.item-delete`).on("click", this._deleteSubItem.bind(this)); } /** @@ -248,9 +233,13 @@ export class BaseSheetL5r5e extends ActorSheet { /** * Add a generic item with sub type + * @param {Event} event * @private */ async _addSubItem(event) { + event.preventDefault(); + event.stopPropagation(); + const type = $(event.currentTarget).data("item-type"); const titles = { item: "l5r5e.items.title_new", @@ -278,9 +267,13 @@ export class BaseSheetL5r5e extends ActorSheet { /** * Edit a generic item with sub type + * @param {Event} event * @private */ _editSubItem(event) { + event.preventDefault(); + event.stopPropagation(); + const itemId = $(event.currentTarget).data("item-id"); const item = this.actor.getOwnedItem(itemId); item.sheet.render(true); @@ -288,9 +281,13 @@ export class BaseSheetL5r5e extends ActorSheet { /** * Delete a generic item with sub type + * @param {Event} event * @private */ _deleteSubItem(event) { + event.preventDefault(); + event.stopPropagation(); + const itemId = $(event.currentTarget).data("item-id"); // Remove 1 qty if possible @@ -299,32 +296,48 @@ export class BaseSheetL5r5e extends ActorSheet { return; } - // Specific advancements, remove 1 to selected ring/skill - if (tmpItem.type === "advancement") { - const actor = duplicate(this.actor.data.data); - const itmData = tmpItem.data.data; - if (itmData.advancement_type === "ring") { - // Ring - actor.rings[itmData.ring] = Math.max(1, actor.rings[itmData.ring] - 1); - } else { - // Skill - const skillCatId = CONFIG.l5r5e.skills.get(itmData.skill); - if (skillCatId) { - actor.skills[skillCatId][itmData.skill] = Math.max(0, actor.skills[skillCatId][itmData.skill] - 1); + const callback = async () => { + // Specific advancements, remove 1 to selected ring/skill + if (tmpItem.type === "advancement") { + const actor = duplicate(this.actor.data.data); + const itmData = tmpItem.data.data; + if (itmData.advancement_type === "ring") { + // Ring + actor.rings[itmData.ring] = Math.max(1, actor.rings[itmData.ring] - 1); + } else { + // Skill + const skillCatId = CONFIG.l5r5e.skills.get(itmData.skill); + if (skillCatId) { + actor.skills[skillCatId][itmData.skill] = Math.max( + 0, + actor.skills[skillCatId][itmData.skill] - 1 + ); + } } + + // Update Actor + this.actor.update({ + data: diffObject(this.actor.data.data, actor), + }); } - // Update Actor - this.actor.update({ - data: diffObject(this.actor.data.data, actor), - }); + return this.actor.deleteOwnedItem(itemId); + }; + + // Holing Ctrl = without confirm + if (event.ctrlKey) { + return callback(); } - return this.actor.deleteOwnedItem(itemId); + game.l5r5e.HelpersL5r5e.confirmDeleteDialog( + game.i18n.format("l5r5e.global.delete_confirm", { name: tmpItem.name }), + callback + ); } /** * Switch "in_curriculum" + * @param {Event} event * @private */ _switchSubItemCurriculum(event) { @@ -359,9 +372,13 @@ export class BaseSheetL5r5e extends ActorSheet { /** * Switch Readied state on a weapon + * @param {Event} event * @private */ _switchEquipReadied(event) { + event.preventDefault(); + event.stopPropagation(); + const type = $(event.currentTarget).data("type"); if (!["equipped", "readied"].includes(type)) { return; diff --git a/system/scripts/helpers.js b/system/scripts/helpers.js index 3d5a967..1f273bd 100644 --- a/system/scripts/helpers.js +++ b/system/scripts/helpers.js @@ -215,4 +215,27 @@ export class HelpersL5r5e { core.set("Anx", "l5r5e.core-peculiarities-anxieties"); return core.get(itemId.replace(/L5RCore(\w{3})\d+/gi, "$1")); } + + /** + * Show a confirm dialog before a deletion + * @param {string} content + * @param {function} callback The callback function for confirmed action + */ + static confirmDeleteDialog(content, callback) { + new Dialog({ + title: game.i18n.localize("Delete"), + content, + buttons: { + confirm: { + icon: '', + label: game.i18n.localize("Yes"), + callback, + }, + cancel: { + icon: '', + label: game.i18n.localize("No"), + }, + }, + }).render(true); + } } diff --git a/system/scripts/items/item-sheet.js b/system/scripts/items/item-sheet.js index c9c8c8b..64eb864 100644 --- a/system/scripts/items/item-sheet.js +++ b/system/scripts/items/item-sheet.js @@ -105,12 +105,7 @@ export class ItemSheetL5r5e extends ItemSheet { }); // Delete a property - html.find(`.property-delete`).on("click", (event) => { - event.preventDefault(); - event.stopPropagation(); - const li = $(event.currentTarget).parents(".property"); - this._deleteProperty(li.data("propertyId")); - }); + html.find(`.property-delete`).on("click", this._deleteProperty.bind(this)); } /** @@ -174,20 +169,37 @@ export class ItemSheetL5r5e extends ItemSheet { * Delete a property from the current item * @private */ - _deleteProperty(id) { - if ( - !Array.isArray(this.entity.data.data.properties) || - this.entity.data.data.properties.findIndex((p) => p.id === id) === -1 - ) { + _deleteProperty(event) { + event.preventDefault(); + event.stopPropagation(); + + if (!Array.isArray(this.entity.data.data.properties)) { return; } - this.entity.data.data.properties = this.entity.data.data.properties.filter((p) => p.id !== id); + const id = $(event.currentTarget).parents(".property").data("propertyId"); + const tmpProps = this.entity.data.data.properties.find((p) => p.id === id); + if (!tmpProps) { + return; + } - this.entity.update({ - data: { - properties: this.entity.data.data.properties, - }, - }); + const callback = async () => { + this.entity.data.data.properties = this.entity.data.data.properties.filter((p) => p.id !== id); + this.entity.update({ + data: { + properties: this.entity.data.data.properties, + }, + }); + }; + + // Holing Ctrl = without confirm + if (event.ctrlKey) { + return callback(); + } + + game.l5r5e.HelpersL5r5e.confirmDeleteDialog( + game.i18n.format("l5r5e.global.delete_confirm", { name: tmpProps.name }), + callback + ); } } diff --git a/system/templates/items/advancement/advancement-entry.html b/system/templates/items/advancement/advancement-entry.html index 8bb1f6a..abd91e1 100644 --- a/system/templates/items/advancement/advancement-entry.html +++ b/system/templates/items/advancement/advancement-entry.html @@ -4,7 +4,7 @@
  • {{ advancement.name }}
  • {{#if editable}}
  • -
  • +
  • {{/if}} {{#if advancement.data.description}} diff --git a/system/templates/items/armor/armor-entry.html b/system/templates/items/armor/armor-entry.html index c86df13..e0e282e 100644 --- a/system/templates/items/armor/armor-entry.html +++ b/system/templates/items/armor/armor-entry.html @@ -8,7 +8,7 @@ {{#if editable}}
  • -
  • +
  • {{/if}} {{#if peculiarity.data.types}} diff --git a/system/templates/items/property/property-entry.html b/system/templates/items/property/property-entry.html index d46abb6..cdf071d 100644 --- a/system/templates/items/property/property-entry.html +++ b/system/templates/items/property/property-entry.html @@ -3,7 +3,7 @@
  • {{ item.name }}
  • {{#if editable}} -
  • +
  • {{/if}} {{#if item.data.data.description}} diff --git a/system/templates/items/technique/technique-entry.html b/system/templates/items/technique/technique-entry.html index dce00d3..5a14a32 100644 --- a/system/templates/items/technique/technique-entry.html +++ b/system/templates/items/technique/technique-entry.html @@ -4,7 +4,7 @@
  • {{ technique.name }}
  • {{#if editable}}
  • -
  • +
  • {{/if}} {{#if technique.data.description}} diff --git a/system/templates/items/weapon/weapon-entry.html b/system/templates/items/weapon/weapon-entry.html index 24d4a28..8ee6f2a 100644 --- a/system/templates/items/weapon/weapon-entry.html +++ b/system/templates/items/weapon/weapon-entry.html @@ -9,7 +9,7 @@ {{#if editable}}
  • -
  • +
  • {{/if}}