Actor sheet -> working !!!
This commit is contained in:
+14
-7
@@ -24,15 +24,24 @@
|
|||||||
|
|
||||||
.resource-label {
|
.resource-label {
|
||||||
font-size: 0.75rem;
|
font-size: 0.75rem;
|
||||||
color: @color-text-light-2;
|
color: @color-text-light-highlight;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-weight: bold;
|
||||||
text-shadow: 0 0 3px rgba(0, 0, 0, 0.9);
|
text-shadow: 0 0 3px rgba(0, 0, 0, 0.9);
|
||||||
}
|
}
|
||||||
|
|
||||||
.resource {
|
.resource {
|
||||||
border: none;
|
border: 1px solid @color-border-dark-3;
|
||||||
border-left: 1px solid gray;
|
border-left: 3px solid @theme-color-primary;
|
||||||
padding: 0.2rem 1rem;
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
padding: 0.5rem 1rem;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
.transition();
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: rgba(0, 0, 0, 0.2);
|
||||||
|
border-color: @theme-color-primary;
|
||||||
|
}
|
||||||
|
|
||||||
.flexrow {
|
.flexrow {
|
||||||
min-width: 5rem;
|
min-width: 5rem;
|
||||||
@@ -56,13 +65,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
select {
|
select {
|
||||||
background: rgba(0, 0, 0, 0.4);
|
.custom-select-style();
|
||||||
color: @color-text-light-1;
|
color: @color-text-light-1;
|
||||||
font-family: "DistressBlack", sans-serif;
|
font-family: "DistressBlack", sans-serif;
|
||||||
font-size: 0.875rem;
|
font-size: 0.875rem;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
border: none;
|
|
||||||
box-shadow: 0px 0px 3px rgba(31, 26, 26, 0.979) inset;
|
|
||||||
text-shadow: 0 0 3px rgba(0, 0, 0, 0.9);
|
text-shadow: 0 0 3px rgba(0, 0, 0, 0.9);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -64,6 +64,35 @@ export class VermineBaseActorSheet extends HandlebarsApplicationMixin(foundry.ap
|
|||||||
_canDragStart() { return this.isEditable }
|
_canDragStart() { return this.isEditable }
|
||||||
_canDragDrop() { return this.isEditable }
|
_canDragDrop() { return this.isEditable }
|
||||||
|
|
||||||
|
// ── Soumission du formulaire ────────────────────────────────────────
|
||||||
|
|
||||||
|
/** @override - coerce string values from HTML form inputs to numbers */
|
||||||
|
_prepareSubmitData(submitData, form, formData) {
|
||||||
|
const fd = foundry.utils.deepClone(formData.object)
|
||||||
|
|
||||||
|
for (const [key, value] of Object.entries(fd)) {
|
||||||
|
if (!key.startsWith("system.") || typeof value === "number") continue
|
||||||
|
|
||||||
|
const segments = key.slice(7).split(".")
|
||||||
|
let node = this.document.system.schema
|
||||||
|
for (const seg of segments) {
|
||||||
|
if (node instanceof foundry.data.fields.SchemaField) node = node.fields[seg]
|
||||||
|
else { node = undefined; break }
|
||||||
|
}
|
||||||
|
if (!(node instanceof foundry.data.fields.NumberField)) continue
|
||||||
|
|
||||||
|
// Handle arrays from duplicate-named form inputs
|
||||||
|
let raw = Array.isArray(value) ? value.filter(v => v !== "" && v !== null).pop() : value
|
||||||
|
if (raw === undefined) continue
|
||||||
|
if (typeof raw === "string" && raw.trim() === "") { fd[key] = 0; continue }
|
||||||
|
|
||||||
|
const num = Number(typeof raw === "string" ? raw.trim() : raw)
|
||||||
|
if (!isNaN(num)) fd[key] = num
|
||||||
|
}
|
||||||
|
|
||||||
|
return fd
|
||||||
|
}
|
||||||
|
|
||||||
// ── Contexte commun ─────────────────────────────────────────────────
|
// ── Contexte commun ─────────────────────────────────────────────────
|
||||||
|
|
||||||
async _prepareContext() {
|
async _prepareContext() {
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ export class VermineCharacterSheetV2 extends VermineBaseActorSheet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static PARTS = {
|
static PARTS = {
|
||||||
|
header: { template: "systems/vermine2047/templates/actor/appv2/character-header.hbs" },
|
||||||
main: { template: "systems/vermine2047/templates/actor/appv2/character-main.hbs" },
|
main: { template: "systems/vermine2047/templates/actor/appv2/character-main.hbs" },
|
||||||
tabs: { template: "templates/generic/tab-navigation.hbs" },
|
tabs: { template: "templates/generic/tab-navigation.hbs" },
|
||||||
abilities: { template: "systems/vermine2047/templates/actor/appv2/character-abilities.hbs" },
|
abilities: { template: "systems/vermine2047/templates/actor/appv2/character-abilities.hbs" },
|
||||||
|
|||||||
@@ -39,6 +39,14 @@ export class VermineCreatureSheetV2 extends VermineBaseActorSheet {
|
|||||||
return context
|
return context
|
||||||
}
|
}
|
||||||
|
|
||||||
|
changeTab(tab, group, options = {}) {
|
||||||
|
super.changeTab(tab, group, options)
|
||||||
|
if (group === "sheet") {
|
||||||
|
const main = this.element?.querySelector('[data-group="sheet"][data-tab="main"]')
|
||||||
|
if (main) main.classList.add("active")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async _preparePartContext(partId, context) {
|
async _preparePartContext(partId, context) {
|
||||||
const doc = this.document
|
const doc = this.document
|
||||||
switch (partId) {
|
switch (partId) {
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ export class VermineGroupSheetV2 extends VermineBaseActorSheet {
|
|||||||
position: { width: 700, height: 600 },
|
position: { width: 700, height: 600 },
|
||||||
window: { contentClasses: ["group-content"] },
|
window: { contentClasses: ["group-content"] },
|
||||||
actions: {
|
actions: {
|
||||||
chooseTotem: VermineGroupSheetV2.#onChooseTotem,
|
|
||||||
chooseActor: VermineGroupSheetV2.#onChooseActor,
|
chooseActor: VermineGroupSheetV2.#onChooseActor,
|
||||||
deleteMember: VermineGroupSheetV2.#onDeleteMember,
|
deleteMember: VermineGroupSheetV2.#onDeleteMember,
|
||||||
deleteEncounter: VermineGroupSheetV2.#onDeleteEncounter,
|
deleteEncounter: VermineGroupSheetV2.#onDeleteEncounter,
|
||||||
@@ -62,6 +61,14 @@ export class VermineGroupSheetV2 extends VermineBaseActorSheet {
|
|||||||
return context
|
return context
|
||||||
}
|
}
|
||||||
|
|
||||||
|
changeTab(tab, group, options = {}) {
|
||||||
|
super.changeTab(tab, group, options)
|
||||||
|
if (group === "sheet") {
|
||||||
|
const main = this.element?.querySelector('[data-group="sheet"][data-tab="main"]')
|
||||||
|
if (main) main.classList.add("active")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async _preparePartContext(partId, context) {
|
async _preparePartContext(partId, context) {
|
||||||
const doc = this.document
|
const doc = this.document
|
||||||
switch (partId) {
|
switch (partId) {
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ export default class VermineActor extends Actor {
|
|||||||
* is queried and has a roll executed directly from it).
|
* is queried and has a roll executed directly from it).
|
||||||
*/
|
*/
|
||||||
prepareDerivedData() {
|
prepareDerivedData() {
|
||||||
|
super.prepareDerivedData();
|
||||||
const actorData = this;
|
const actorData = this;
|
||||||
const systemData = actorData.system;
|
const systemData = actorData.system;
|
||||||
const flags = actorData.flags.vermine2047 || {};
|
const flags = actorData.flags.vermine2047 || {};
|
||||||
|
|||||||
@@ -3,6 +3,18 @@
|
|||||||
* Fonctions factory retournant des objets SchemaField réutilisables.
|
* Fonctions factory retournant des objets SchemaField réutilisables.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
const fields = foundry.data.fields
|
||||||
|
|
||||||
|
/** NumberField qui accepte les strings vides en les remplaçant par `initial`. */
|
||||||
|
class LooseNumberField extends fields.NumberField {
|
||||||
|
clean(value, options) {
|
||||||
|
if (value === "" || value === null || value === undefined) {
|
||||||
|
return this.initial ?? 0
|
||||||
|
}
|
||||||
|
return super.clean(value, options)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retourne un schema pour une blessure (minor/major/deadly)
|
* Retourne un schema pour une blessure (minor/major/deadly)
|
||||||
* @param {number} defaultThreshold
|
* @param {number} defaultThreshold
|
||||||
@@ -63,7 +75,7 @@ export function attributeSchema(defaultVal = 0, defaultMin = 0, defaultMax = 10)
|
|||||||
const fields = foundry.data.fields
|
const fields = foundry.data.fields
|
||||||
const reqInt = { required: true, nullable: false, integer: true }
|
const reqInt = { required: true, nullable: false, integer: true }
|
||||||
return new fields.SchemaField({
|
return new fields.SchemaField({
|
||||||
value: new fields.NumberField({ ...reqInt, initial: defaultVal, min: defaultMin }),
|
value: new LooseNumberField({ ...reqInt, initial: defaultVal, min: defaultMin }),
|
||||||
min: new fields.NumberField({ ...reqInt, initial: defaultMin, min: 0 }),
|
min: new fields.NumberField({ ...reqInt, initial: defaultMin, min: 0 }),
|
||||||
max: new fields.NumberField({ ...reqInt, initial: defaultMax, min: 0 })
|
max: new fields.NumberField({ ...reqInt, initial: defaultMax, min: 0 })
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
<div class="tab abilities sheet-part" data-group="sheet" data-tab="abilities">
|
<div class="tab abilities sheet-part" data-group="sheet" data-tab="abilities">
|
||||||
{{> "systems/vermine2047/templates/actor/appv2/character-header.hbs"}}
|
|
||||||
{{!-- Character --}}
|
{{!-- Character --}}
|
||||||
<h3>{{ localize 'VERMINE.abilities' }}</h3>
|
<h3>{{ localize 'VERMINE.abilities' }}</h3>
|
||||||
<div class="grid grid-4col">
|
<div class="grid grid-4col">
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
<div class="tab combat sheet-part" data-group="sheet" data-tab="combat">
|
<div class="tab combat sheet-part" data-group="sheet" data-tab="combat">
|
||||||
{{> "systems/vermine2047/templates/actor/appv2/character-header.hbs"}}
|
|
||||||
<div class="align-center">
|
<div class="align-center">
|
||||||
<div class="shadow">
|
<div class="shadow">
|
||||||
<h4>situation de combat par défaut</h4>
|
<h4>situation de combat par défaut</h4>
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
<div class="tab equipment sheet-part" data-group="sheet" data-tab="equipment">
|
<div class="tab equipment sheet-part" data-group="sheet" data-tab="equipment">
|
||||||
{{> "systems/vermine2047/templates/actor/appv2/character-header.hbs"}}
|
|
||||||
<div class="grid grid-2col">
|
<div class="grid grid-2col">
|
||||||
<div>
|
<div>
|
||||||
<ol class="items-list">
|
<ol class="items-list">
|
||||||
|
|||||||
@@ -44,16 +44,16 @@
|
|||||||
<div class="reputation flexrow flex-group-center">
|
<div class="reputation flexrow flex-group-center">
|
||||||
<label>{{ localize 'VERMINE.reputation' }}</label>
|
<label>{{ localize 'VERMINE.reputation' }}</label>
|
||||||
{{#if isEditMode}}
|
{{#if isEditMode}}
|
||||||
<input name="system.attributes.reputation.value" type="number" min="0"
|
<input name="system.attributes.reputation.value" data-type="Number" type="number"
|
||||||
value="{{#if (or (not system.attributes.reputation.value) (eq system.attributes.reputation.value 0))}}0{{else}}{{system.attributes.reputation.value}}{{/if}}" />
|
value="{{system.attributes.reputation.value}}" />
|
||||||
{{else}}
|
{{else}}
|
||||||
<span>{{system.attributes.reputation.value}}</span>
|
<span>{{system.attributes.reputation.value}}</span>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
<label>{{ localize 'VERMINE.experience' }}</label>
|
<label>{{ localize 'VERMINE.experience' }}</label>
|
||||||
{{#if isEditMode}}
|
{{#if isEditMode}}
|
||||||
<input name="system.attributes.xp.value" type="number" min="0"
|
<input name="system.attributes.xp.value" data-type="Number" type="number"
|
||||||
value="{{#if (or (not system.attributes.xp.value) (eq system.attributes.xp.value 0))}}0{{else}}{{system.attributes.xp.value}}{{/if}}" />
|
value="{{system.attributes.xp.value}}" />
|
||||||
{{else}}
|
{{else}}
|
||||||
<span>{{system.attributes.xp.value}}</span>
|
<span>{{system.attributes.xp.value}}</span>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
<div class="tab stories sheet-part" data-group="sheet" data-tab="stories">
|
<div class="tab stories sheet-part" data-group="sheet" data-tab="stories">
|
||||||
{{> "systems/vermine2047/templates/actor/appv2/character-header.hbs"}}
|
|
||||||
<section class="flexrow flex-group-left flex-align-left gap-md">
|
<section class="flexrow flex-group-left flex-align-left gap-md">
|
||||||
<div>
|
<div>
|
||||||
<h4>{{ localize 'IDENTITY.theme'}}</h4>
|
<h4>{{ localize 'IDENTITY.theme'}}</h4>
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
<div class="tab totem sheet-part" data-group="sheet" data-tab="totem">
|
<div class="tab totem sheet-part" data-group="sheet" data-tab="totem">
|
||||||
{{> "systems/vermine2047/templates/actor/appv2/character-header.hbs"}}
|
|
||||||
{{#if system.identity.totem}}
|
{{#if system.identity.totem}}
|
||||||
<div class="totem-details">
|
<div class="totem-details">
|
||||||
<img
|
<img
|
||||||
|
|||||||
Reference in New Issue
Block a user