Working on 0.8.x
- Finished the dialog for add new item on title and other advancements - some documentation update
This commit is contained in:
@@ -259,7 +259,7 @@ export class BaseSheetL5r5e extends ActorSheet {
|
||||
|
||||
/**
|
||||
* Subscribe to events from the sheet.
|
||||
* @param html HTML content of the sheet.
|
||||
* @param {jQuery} html HTML content of the sheet.
|
||||
*/
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
@@ -318,6 +318,9 @@ export class BaseSheetL5r5e extends ActorSheet {
|
||||
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));
|
||||
|
||||
// Others Advancements
|
||||
html.find(".item-advancement-choose").on("click", this._showDialogAddSubItem.bind(this));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -336,37 +339,20 @@ export class BaseSheetL5r5e extends ActorSheet {
|
||||
|
||||
/**
|
||||
* Add a generic item with sub type
|
||||
* @param {Event} event
|
||||
* @param {string} type Item sub type (armor, weapon, bond...)
|
||||
* @param {boolean} isEquipped For item with prop "Equipped" set the value
|
||||
* @param {string|null} techniqueType Technique subtype (kata, shuji...)
|
||||
* @return {Promise<void>}
|
||||
* @private
|
||||
*/
|
||||
async _addSubItem(event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
||||
const type = $(event.currentTarget).data("item-type");
|
||||
async _createSubItem({ type, isEquipped = false, techniqueType = null }) {
|
||||
if (!type) {
|
||||
return;
|
||||
}
|
||||
|
||||
const titles = {
|
||||
item: "ITEM.TypeItem",
|
||||
armor: "ITEM.TypeArmor",
|
||||
weapon: "ITEM.TypeWeapon",
|
||||
technique: "ITEM.TypeTechnique",
|
||||
peculiarity: "ITEM.TypePeculiarity",
|
||||
advancement: "ITEM.TypeAdvancement",
|
||||
title: "ITEM.TypeTitle",
|
||||
bond: "ITEM.TypeBond",
|
||||
item_pattern: "ITEM.TypeItem_pattern",
|
||||
signature_scroll: "ITEM.TypeSignature_scroll",
|
||||
};
|
||||
if (!titles[type]) {
|
||||
return;
|
||||
}
|
||||
|
||||
const created = await this.actor.createEmbeddedDocuments("Item", [
|
||||
{
|
||||
name: game.i18n.localize(titles[type]),
|
||||
name: game.i18n.localize(`ITEM.Type${type.capitalize()}`),
|
||||
type: type,
|
||||
img: `${CONFIG.l5r5e.paths.assets}icons/items/${type}.svg`,
|
||||
},
|
||||
@@ -385,19 +371,17 @@ export class BaseSheetL5r5e extends ActorSheet {
|
||||
}
|
||||
|
||||
switch (item.data.type) {
|
||||
case "item": // no break
|
||||
case "armor": // no break
|
||||
case "weapon":
|
||||
if ($(event.currentTarget).data("item-eqquiped")) {
|
||||
item.data.data.equipped = true;
|
||||
}
|
||||
item.data.data.equipped = isEquipped;
|
||||
break;
|
||||
|
||||
case "technique": {
|
||||
// If technique, select the current type
|
||||
const techType = $(event.currentTarget).data("tech-type");
|
||||
if (CONFIG.l5r5e.techniques.get(techType)) {
|
||||
item.data.data.technique_type = techType;
|
||||
item.data.img = `${CONFIG.l5r5e.paths.assets}icons/techs/${techType}.svg`;
|
||||
if (CONFIG.l5r5e.techniques.get(techniqueType)) {
|
||||
item.data.data.technique_type = techniqueType;
|
||||
item.data.img = `${CONFIG.l5r5e.paths.assets}icons/techs/${techniqueType}.svg`;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -406,6 +390,40 @@ export class BaseSheetL5r5e extends ActorSheet {
|
||||
item.sheet.render(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Display a dialog to choose what Item to add
|
||||
* @param {Event} event
|
||||
* @return {Promise<void>}
|
||||
* @private
|
||||
*/
|
||||
async _showDialogAddSubItem(event) {
|
||||
game.l5r5e.HelpersL5r5e.showSubItemDialog(["bond", "title", "signature_scroll", "item_pattern"]).then(
|
||||
(selectedType) => {
|
||||
this._createSubItem({ type: selectedType });
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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");
|
||||
if (!type) {
|
||||
return;
|
||||
}
|
||||
|
||||
const isEquipped = $(event.currentTarget).data("item-equipped") || false;
|
||||
const techniqueType = $(event.currentTarget).data("tech-type") || null;
|
||||
|
||||
return this._createSubItem({ type, isEquipped, techniqueType });
|
||||
}
|
||||
|
||||
/**
|
||||
* Edit a generic item with sub type
|
||||
* @param {Event} event
|
||||
|
||||
@@ -65,7 +65,7 @@ export class CharacterSheetL5r5e extends BaseSheetL5r5e {
|
||||
|
||||
/**
|
||||
* Subscribe to events from the sheet.
|
||||
* @param html HTML content of the sheet.
|
||||
* @param {jQuery} html HTML content of the sheet.
|
||||
*/
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
|
||||
@@ -154,6 +154,7 @@ export class TwentyQuestionsDialog extends FormApplication {
|
||||
|
||||
/**
|
||||
* Listen to html elements
|
||||
* @param {jQuery} html HTML content of the sheet.
|
||||
* @override
|
||||
*/
|
||||
activateListeners(html) {
|
||||
|
||||
@@ -23,7 +23,7 @@ L5R5E.techniques.set("ninjutsu", { type: "core", displayInTypes: true });
|
||||
L5R5E.techniques.set("school_ability", { type: "school", displayInTypes: false });
|
||||
L5R5E.techniques.set("mastery_ability", { type: "school", displayInTypes: false });
|
||||
// Title
|
||||
L5R5E.techniques.set("title_ability", { type: "title", displayInTypes: false });
|
||||
// L5R5E.techniques.set("title_ability", { type: "title", displayInTypes: false });
|
||||
// Custom
|
||||
L5R5E.techniques.set("specificity", { type: "custom", displayInTypes: false });
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ export class GmToolsDialog extends FormApplication {
|
||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||
id: "l5r5e-gm-tools-dialog",
|
||||
classes: ["l5r5e", "gm-tools-dialog"],
|
||||
template: CONFIG.l5r5e.paths.templates + "dice/gm-tools-dialog.html",
|
||||
template: CONFIG.l5r5e.paths.templates + "dialogs/gm-tools-dialog.html",
|
||||
title: game.i18n.localize("l5r5e.gm_toolbox.title"),
|
||||
left: x - 512,
|
||||
top: y - 98,
|
||||
@@ -111,6 +111,7 @@ export class GmToolsDialog extends FormApplication {
|
||||
|
||||
/**
|
||||
* Listen to html elements
|
||||
* @param {jQuery} html HTML content of the sheet.
|
||||
* @override
|
||||
*/
|
||||
activateListeners(html) {
|
||||
@@ -300,6 +300,7 @@ export class DicePickerDialog extends FormApplication {
|
||||
|
||||
/**
|
||||
* Listen to html elements
|
||||
* @param {jQuery} html HTML content of the sheet.
|
||||
* @override
|
||||
*/
|
||||
activateListeners(html) {
|
||||
|
||||
@@ -239,6 +239,7 @@ export class RollnKeepDialog extends FormApplication {
|
||||
|
||||
/**
|
||||
* Listen to html elements
|
||||
* @param {jQuery} html HTML content of the sheet.
|
||||
* @override
|
||||
*/
|
||||
activateListeners(html) {
|
||||
|
||||
@@ -39,6 +39,7 @@ export class HelpDialog extends FormApplication {
|
||||
|
||||
/**
|
||||
* Listen to html elements
|
||||
* @param {jQuery} html HTML content of the sheet.
|
||||
* @override
|
||||
*/
|
||||
activateListeners(html) {
|
||||
|
||||
@@ -6,6 +6,8 @@ import { ItemL5r5e } from "./item.js";
|
||||
export class HelpersL5r5e {
|
||||
/**
|
||||
* Get Rings/Element for List / Select
|
||||
* @param {Actor|null} actor
|
||||
* @return {{id: string, label: *, value}[]}
|
||||
*/
|
||||
static getRingsList(actor = null) {
|
||||
return CONFIG.l5r5e.stances.map((e) => ({
|
||||
@@ -17,6 +19,8 @@ export class HelpersL5r5e {
|
||||
|
||||
/**
|
||||
* Get Skills for List / Select with groups
|
||||
* @param {boolean} useGroup
|
||||
* @return {{cat: any, id: any, label: *}[]}
|
||||
*/
|
||||
static getSkillsList(useGroup = false) {
|
||||
if (!useGroup) {
|
||||
@@ -64,6 +68,8 @@ export class HelpersL5r5e {
|
||||
|
||||
/**
|
||||
* Return the target object on a drag n drop event, or null if not found
|
||||
* @param {DragEvent} event
|
||||
* @return {Promise<null>}
|
||||
*/
|
||||
static async getDragnDropTargetObject(event) {
|
||||
const json = event.dataTransfer.getData("text/plain");
|
||||
@@ -76,6 +82,11 @@ export class HelpersL5r5e {
|
||||
|
||||
/**
|
||||
* Return the object from Game or Pack by his ID, or null if not found
|
||||
* @param {number} id
|
||||
* @param {string} type
|
||||
* @param {string|null} data
|
||||
* @param {string|null} pack
|
||||
* @return {Promise<null>}
|
||||
*/
|
||||
static async getObjectGameOrPack({ id, type, data = null, pack = null }) {
|
||||
let document = null;
|
||||
@@ -142,6 +153,8 @@ export class HelpersL5r5e {
|
||||
|
||||
/**
|
||||
* Make a temporary item for compendium drag n drop
|
||||
* @param {ItemL5r5e|any[]} data
|
||||
* @return {ItemL5r5e}
|
||||
*/
|
||||
static createItemFromCompendium(data) {
|
||||
if (
|
||||
@@ -174,6 +187,8 @@ export class HelpersL5r5e {
|
||||
|
||||
/**
|
||||
* Babele and properties specific
|
||||
* @param {Document} document
|
||||
* @return {Promise<void>}
|
||||
*/
|
||||
static async refreshItemProperties(document) {
|
||||
if (document.data.data.properties && typeof Babele !== "undefined") {
|
||||
@@ -191,6 +206,9 @@ export class HelpersL5r5e {
|
||||
|
||||
/**
|
||||
* Convert (op), (ex)... to associated symbols for content/descriptions
|
||||
* @param {string} text Input text
|
||||
* @param {boolean} toSymbol If True convert symbol to html (op), if false html to symbol
|
||||
* @return {string}
|
||||
*/
|
||||
static convertSymbols(text, toSymbol) {
|
||||
CONFIG.l5r5e.symbols.forEach((cfg, tag) => {
|
||||
@@ -208,6 +226,8 @@ export class HelpersL5r5e {
|
||||
|
||||
/**
|
||||
* Escape Regx characters
|
||||
* @param {string} str
|
||||
* @return {string}
|
||||
*/
|
||||
static escapeRegExp(str) {
|
||||
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
||||
@@ -215,6 +235,8 @@ export class HelpersL5r5e {
|
||||
|
||||
/**
|
||||
* Get the associated pack for a core item (time saving)
|
||||
* @param {string} documentId
|
||||
* @return {string}
|
||||
*/
|
||||
static getPackNameForCoreItem(documentId) {
|
||||
const core = new Map();
|
||||
@@ -266,6 +288,38 @@ export class HelpersL5r5e {
|
||||
}).render(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Display a dialog to choose what Item type to add
|
||||
* @param {string[]|null} types
|
||||
* @return {Promise<*>} Return the item type choice (armor, bond...)
|
||||
*/
|
||||
static async showSubItemDialog(types = null) {
|
||||
// If no types, get the full list
|
||||
if (!types) {
|
||||
types = game.system.entityTypes.Item;
|
||||
}
|
||||
const title = game.i18n.format("ENTITY.Create", { entity: game.i18n.localize("Item") });
|
||||
|
||||
// Render the template
|
||||
const html = await renderTemplate(`${CONFIG.l5r5e.paths.templates}dialogs/choose-item-type-dialog.html`, {
|
||||
type: null,
|
||||
types: types.reduce((obj, t) => {
|
||||
const label = CONFIG.Item.typeLabels[t] ?? t;
|
||||
obj[t] = game.i18n.has(label) ? game.i18n.localize(label) : t;
|
||||
return obj;
|
||||
}, {}),
|
||||
});
|
||||
|
||||
// Display the dialog
|
||||
return Dialog.prompt({
|
||||
title: title,
|
||||
content: html,
|
||||
label: title,
|
||||
callback: (html) => $(html).find("[name='type'] option:selected").val(),
|
||||
rejectClose: false,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify Applications using Difficulty settings that the values was changed
|
||||
*/
|
||||
|
||||
@@ -131,14 +131,14 @@ export class ItemL5r5e extends Item {
|
||||
* @param {boolean} save if we save in db or not (used internally)
|
||||
* @param {boolean} newId if we change the id
|
||||
* @param {boolean} addBonusToActor if we update the actor bonus for advancements
|
||||
* @return {Promise<void>}
|
||||
* @return {Promise<string>}
|
||||
*/
|
||||
async addEmbedItem(item, { save = true, newId = true, addBonusToActor = true } = {}) {
|
||||
if (!item) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(item instanceof Item) && item._id) {
|
||||
if (!(item instanceof Item) && item?.name && item?.type) {
|
||||
// Data -> Item
|
||||
item = new ItemL5r5e(item);
|
||||
}
|
||||
@@ -165,16 +165,17 @@ export class ItemL5r5e extends Item {
|
||||
if (save) {
|
||||
await this.saveEmbedItems();
|
||||
}
|
||||
return item.data._id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update a Embed Item
|
||||
* @param {ItemL5r5e} item Object to add
|
||||
* @param {boolean} save if we save in db or not (used internally)
|
||||
* @return {Promise<void>}
|
||||
* @return {Promise<string>}
|
||||
*/
|
||||
async updateEmbedItem(item, { save = true } = {}) {
|
||||
await this.addEmbedItem(item, { save, newId: false, addBonusToActor: false });
|
||||
return await this.addEmbedItem(item, { save, newId: false, addBonusToActor: false });
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -31,7 +31,7 @@ export class AdvancementSheetL5r5e extends ItemSheetL5r5e {
|
||||
|
||||
/**
|
||||
* Subscribe to events from the sheet.
|
||||
* @param html HTML content of the sheet.
|
||||
* @param {jQuery} html HTML content of the sheet.
|
||||
*/
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
|
||||
@@ -50,7 +50,7 @@ export class ItemPatternSheetL5r5e extends ItemSheetL5r5e {
|
||||
|
||||
/**
|
||||
* Subscribe to events from the sheet.
|
||||
* @param html HTML content of the sheet.
|
||||
* @param {jQuery} html HTML content of the sheet.
|
||||
*/
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
|
||||
@@ -82,7 +82,8 @@ export class ItemSheetL5r5e extends ItemSheet {
|
||||
|
||||
/**
|
||||
* Subscribe to events from the sheet.
|
||||
* @param html HTML content of the sheet.
|
||||
* @param {jQuery} html HTML content of the sheet.
|
||||
* @override
|
||||
*/
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
@@ -112,7 +113,7 @@ export class ItemSheetL5r5e extends ItemSheet {
|
||||
|
||||
/**
|
||||
* Create drag-and-drop workflow handlers for this Application
|
||||
* @return An array of DragDrop handlers
|
||||
* @return {DragDrop[]} An array of DragDrop handlers
|
||||
*/
|
||||
_createDragDropHandlers() {
|
||||
return [
|
||||
@@ -160,6 +161,7 @@ export class ItemSheetL5r5e extends ItemSheet {
|
||||
|
||||
/**
|
||||
* Add a property to the current item
|
||||
* @param {Item} item
|
||||
* @private
|
||||
*/
|
||||
_addProperty(item) {
|
||||
@@ -222,19 +224,19 @@ export class ItemSheetL5r5e extends ItemSheet {
|
||||
|
||||
/**
|
||||
* Add a embed item
|
||||
* @param event
|
||||
* @param {Event} event
|
||||
* @private
|
||||
*/
|
||||
_addSubItem(event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
const itemId = $(event.currentTarget).data("item-id");
|
||||
console.log("TODO _addSubItem", itemId); // TODO _addSubItem
|
||||
console.warn("L5R5E | TODO ItemSheetL5r5e._addSubItem()", itemId); // TODO _addSubItem Currently not used, title override it
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a embed item
|
||||
* @param event
|
||||
* @param {Event} event
|
||||
* @private
|
||||
*/
|
||||
_editSubItem(event) {
|
||||
@@ -249,7 +251,7 @@ export class ItemSheetL5r5e extends ItemSheet {
|
||||
|
||||
/**
|
||||
* Delete a embed item
|
||||
* @param event
|
||||
* @param {Event} event
|
||||
* @private
|
||||
*/
|
||||
_deleteSubItem(event) {
|
||||
|
||||
@@ -81,7 +81,7 @@ export class TitleSheetL5r5e extends ItemSheetL5r5e {
|
||||
|
||||
/**
|
||||
* Subscribe to events from the sheet.
|
||||
* @param html HTML content of the sheet.
|
||||
* @param {jQuery} html HTML content of the sheet.
|
||||
*/
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
@@ -96,4 +96,30 @@ export class TitleSheetL5r5e extends ItemSheetL5r5e {
|
||||
html.find(`.item-edit`).on("click", this._editSubItem.bind(this));
|
||||
html.find(`.item-delete`).on("click", this._deleteSubItem.bind(this));
|
||||
}
|
||||
|
||||
/**
|
||||
* Display a dialog to choose what Item to add, and add it on this Item
|
||||
* @param {Event} event
|
||||
* @return {Promise<void>}
|
||||
* @private
|
||||
*/
|
||||
async _addSubItem(event) {
|
||||
// Show Dialog
|
||||
const selectedType = await game.l5r5e.HelpersL5r5e.showSubItemDialog(["advancement", "technique"]);
|
||||
|
||||
// Create the new Item
|
||||
const itemId = await this.document.addEmbedItem(
|
||||
new game.l5r5e.ItemL5r5e({
|
||||
name: game.i18n.localize(`ITEM.Type${selectedType.capitalize()}`),
|
||||
type: selectedType,
|
||||
img: `${CONFIG.l5r5e.paths.assets}icons/items/${selectedType}.svg`,
|
||||
})
|
||||
);
|
||||
|
||||
// Get the store object and display it
|
||||
const item = this.document.items.get(itemId);
|
||||
if (item) {
|
||||
item.sheet.render(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ import { RollL5r5e } from "./dice/roll.js";
|
||||
import { DicePickerDialog } from "./dice/dice-picker-dialog.js";
|
||||
import { RollnKeepDialog } from "./dice/roll-n-keep-dialog.js";
|
||||
import { CombatL5r5e } from "./combat.js";
|
||||
import { GmToolsDialog } from "./dice/gm-tools-dialog.js";
|
||||
import { GmToolsDialog } from "./dialogs/gm-tools-dialog.js";
|
||||
// Items
|
||||
import { ItemL5r5e } from "./item.js";
|
||||
import { ItemSheetL5r5e } from "./items/item-sheet.js";
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
</fieldset>
|
||||
{{!-- Others progession (does not count in school xp) --}}
|
||||
<fieldset class="xp-spent xp-spent-body">
|
||||
<legend class="tools">{{localize 'l5r5e.advancements.title'}} <a data-item-type="advancement-others" class="advancement-others-control item-add" title="{{localize 'l5r5e.global.add'}}"><i class="fas fa-plus"></i></a></legend>
|
||||
<legend class="tools">{{localize 'l5r5e.advancements.title'}} <a class="advancement-others-control item-advancement-choose" title="{{localize 'l5r5e.global.add'}}"><i class="fas fa-plus"></i></a></legend>
|
||||
<table>
|
||||
<thead class="flex">
|
||||
<tr class="flexrow row">
|
||||
|
||||
10
system/templates/dialogs/choose-item-type-dialog.html
Normal file
10
system/templates/dialogs/choose-item-type-dialog.html
Normal file
@@ -0,0 +1,10 @@
|
||||
<form id="choose-item-type-dialog" class="l5r5e choose-item-type-dialog" autocomplete="off">
|
||||
<div class="form-group">
|
||||
<label>{{localize "Type"}}</label>
|
||||
<div class="form-fields">
|
||||
<select name="type">
|
||||
{{selectOptions types selected=type}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@@ -2,7 +2,7 @@
|
||||
<legend class="section-header">
|
||||
{{localize 'l5r5e.armors.title'}}
|
||||
{{#if options.editable}}
|
||||
<a data-item-type="armor" data-item-eqquiped="true" class="armor-control item-add" title="{{localize 'l5r5e.global.add'}}"><i class="fas fa-plus"></i></a>
|
||||
<a data-item-type="armor" data-item-equipped="true" class="armor-control item-add" title="{{localize 'l5r5e.global.add'}}"><i class="fas fa-plus"></i></a>
|
||||
{{/if}}
|
||||
</legend>
|
||||
<ul class="item-list">
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<legend class="section-header">
|
||||
{{localize 'l5r5e.weapons.title'}}
|
||||
{{#if options.editable}}
|
||||
<a data-item-type="weapon" data-item-eqquiped="true" class="weapon-control item-add" title="{{localize 'l5r5e.global.add'}}"><i class="fas fa-plus"></i></a>
|
||||
<a data-item-type="weapon" data-item-equipped="true" class="weapon-control item-add" title="{{localize 'l5r5e.global.add'}}"><i class="fas fa-plus"></i></a>
|
||||
{{/if}}
|
||||
</legend>
|
||||
<ul class="item-list">
|
||||
|
||||
Reference in New Issue
Block a user