Working on 0.8.x

- Working on title
- Added property update/delete for item patterns
This commit is contained in:
Vlyan
2021-05-21 14:12:14 +02:00
parent 4350ea25ee
commit 4f9b72c63f
22 changed files with 586 additions and 101 deletions

View File

@@ -14,4 +14,121 @@ export class ItemPatternSheetL5r5e extends ItemSheetL5r5e {
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description" }],
});
}
/**
* @return {Object|Promise}
*/
async getData(options = {}) {
const sheetData = await super.getData(options);
sheetData.data.dtypes = ["String", "Number", "Boolean"];
sheetData.data.ringsList = game.l5r5e.HelpersL5r5e.getRingsList();
// Linked Property
sheetData.data.linkedProperty = await this.getLinkedProperty(sheetData);
return sheetData;
}
/**
* Get the linked property name
* @param sheetData
* @return {Promise<null|{name, id}>}
*/
async getLinkedProperty(sheetData) {
if (sheetData.data.data.linked_property_id) {
const linkedProperty = await game.l5r5e.HelpersL5r5e.getObjectGameOrPack({
id: sheetData.data.data.linked_property_id,
type: "Item",
});
if (linkedProperty) {
return {
id: linkedProperty.data._id,
name: linkedProperty.data.name,
};
}
}
return null;
}
/**
* Subscribe to events from the sheet.
* @param html HTML content of the sheet.
*/
activateListeners(html) {
super.activateListeners(html);
// Everything below here is only needed if the sheet is editable
if (!this.options.editable) {
return;
}
// Delete the linked property
html.find(`.linked-property-delete`).on("click", this._deleteLinkedProperty.bind(this));
}
/**
* Callback actions which occur when a dragged element is dropped on a target.
* @param {DragEvent} event The originating DragEvent
* @private
*/
async _onDrop(event) {
// Everything below here is only needed if the sheet is editable
if (!this.options.editable) {
return;
}
// Only property allowed here
let item = await game.l5r5e.HelpersL5r5e.getDragnDropTargetObject(event);
if (!item || item.documentName !== "Item" || item.data.type !== "property") {
return;
}
// Set the new property, and update
this.document.data.data.linked_property_id = item.id;
this.document.update({
data: {
linked_property_id: this.document.data.data.linked_property_id,
},
});
}
/**
* Remove the link to a property for the current item
* @param {Event} event
* @return {Promise<void>}
* @private
*/
async _deleteLinkedProperty(event) {
event.preventDefault();
event.stopPropagation();
let name;
const linkedProperty = await game.l5r5e.HelpersL5r5e.getObjectGameOrPack({
id: this.document.data.data.linked_property_id,
type: "Item",
});
if (linkedProperty) {
name = linkedProperty.data.name;
}
const callback = async () => {
this.document.data.data.linked_property_id = null;
this.document.update({
data: {
linked_property_id: this.document.data.data.linked_property_id,
},
});
};
// Holing Ctrl = without confirm
if (event.ctrlKey || !name) {
return callback();
}
game.l5r5e.HelpersL5r5e.confirmDeleteDialog(
game.i18n.format("l5r5e.global.delete_confirm", { name }),
callback
);
}
}

View File

@@ -142,8 +142,11 @@ export class ItemSheetL5r5e extends ItemSheet {
}
// Specific ItemPattern's drop, get the associated props instead
if (item.data.type === "item_pattern" && item.data.flags.l5r5e?.linkedPropertyId) {
item = await game.packs.get("l5r5e.core-properties").getDocument(item.data.flags.l5r5e.linkedPropertyId);
if (item.data.type === "item_pattern" && item.data.data.linked_property_id) {
item = await game.l5r5e.HelpersL5r5e.getObjectGameOrPack({
id: item.data.data.linked_property_id,
type: "Item",
});
}
// Final object has to be a property
@@ -179,6 +182,8 @@ export class ItemSheetL5r5e extends ItemSheet {
/**
* Delete a property from the current item
* @param {Event} event
* @return {Promise<void>}
* @private
*/
_deleteProperty(event) {
@@ -214,4 +219,43 @@ export class ItemSheetL5r5e extends ItemSheet {
callback
);
}
/**
* Add a embed item
* @param event
* @private
*/
_addSubItem(event) {
event.preventDefault();
event.stopPropagation();
const itemId = $(event.currentTarget).data("item-id");
console.log("TODO _addSubItem", itemId); // TODO _addSubItem
}
/**
* Add a embed item
* @param event
* @private
*/
_editSubItem(event) {
event.preventDefault();
event.stopPropagation();
const itemId = $(event.currentTarget).data("item-id");
const item = this.document.items.get(itemId);
if (item) {
item.sheet.render(true);
}
}
/**
* Delete a embed item
* @param event
* @private
*/
_deleteSubItem(event) {
event.preventDefault();
event.stopPropagation();
const itemId = $(event.currentTarget).data("item-id");
this.document.deleteEmbedItem(itemId);
}
}

View File

@@ -14,4 +14,95 @@ export class TitleSheetL5r5e extends ItemSheetL5r5e {
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description" }],
});
}
/**
* @return {Object|Promise}
*/
async getData(options = {}) {
const sheetData = await super.getData(options);
sheetData.data.dtypes = ["String", "Number", "Boolean"];
sheetData.data.ringsList = game.l5r5e.HelpersL5r5e.getRingsList();
console.log(sheetData.data.data.items); // todo tmp
// Prepare OwnedItems
sheetData.data.embedItemsList = this._prepareEmbedItems(sheetData.data.data.items);
console.log(sheetData); // todo tmp
return sheetData;
}
/**
* Prepare Embed items
* @param {[]|Map} itemsMap
* @return {[]}
* @private
*/
_prepareEmbedItems(itemsMap) {
let itemsList = itemsMap;
if (itemsMap instanceof Map) {
itemsList = Array.from(itemsMap).map(([id, item]) => item.data);
}
// Sort by rank desc
itemsList.sort((a, b) => (b.data.rank || 0) - (a.data.rank || 0));
return itemsList;
}
/**
* Callback actions which occur when a dragged element is dropped on a target.
* @param {DragEvent} event The originating DragEvent
* @private
*/
async _onDrop(event) {
// Everything below here is only needed if the sheet is editable
if (!this.options.editable) {
return;
}
// Check item type and subtype
let item = await game.l5r5e.HelpersL5r5e.getDragnDropTargetObject(event);
if (!item || (item.documentName !== "Item" && !["technique", "advancement"].includes(item.data.type))) {
return;
}
const data = item.data.toJSON();
console.log("------ data", data); // todo tmp
this.document.addEmbedItem(data);
console.log(this.document); // todo tmp
}
/**
* Subscribe to events from the sheet.
* @param html HTML content of the sheet.
*/
activateListeners(html) {
super.activateListeners(html);
// Everything below here is only needed if the sheet is editable
if (!this.options.editable) {
return;
}
// *** Items : add, edit, delete ***
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));
}
/**
* This method is called upon form submission after form data is validated
* @param {Event} event The initial triggering submission event
* @param {object} formData The object of validated form data with which to update the object
* @returns {Promise} A Promise which resolves once the update operation has completed
* @abstract
*/
// async _updateObject(event, formData) {
// console.log("------- _updateObject.", formData); // todo TMP
// return super._updateObject(event, formData);
// }
}