Files
fvtt-celestopol/module/models/items.mjs
LeRatierBretonnier cff700bd3d Fix roll dialog CSS + JS: template <div> wrapper, moon-section, selectors
- Remplace <form class='roll-dialog celestopol'> par <div class='roll-dialog-content'>
  pour éviter les formulaires HTML imbriqués invalides (DialogV2 a son propre <form>)
- Corrige le sélecteur CSS de .roll-dialog.celestopol vers .application.roll-dialog .roll-dialog-content
- Remplace .form-group.form-moon par .moon-section (classe custom) pour éviter
  les conflits avec le CSS grid de FoundryVTT standard-form (label 130px de hauteur)
- Met à jour le script JS inline pour utiliser document.querySelector('.roll-dialog-content')
- Ajoute white-space: nowrap sur le label Destin pour éviter le wrapping sur 3 lignes
- Supprime .application.roll-dialog .window-content padding override (remplacé par dialog-content)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-28 17:21:18 +01:00

99 lines
4.5 KiB
JavaScript

import { SYSTEM } from "../config/system.mjs"
/** Schéma partagé pour les bonus/malus par domaine (utilisé dans anomaly/aspect/attribute). */
function skillScoresSchema() {
const fields = foundry.data.fields
const reqInt = { required: true, nullable: false, integer: true }
const scoreField = () => new fields.SchemaField({
bonus: new fields.NumberField({ ...reqInt, initial: 0 }),
malus: new fields.NumberField({ ...reqInt, initial: 0 }),
})
const statGroup = (statId) => {
const skills = SYSTEM.SKILLS[statId]
const schema = {}
for (const key of Object.keys(skills)) {
schema[key] = scoreField()
}
return new fields.SchemaField(schema)
}
return new fields.SchemaField({
ame: statGroup("ame"),
corps: statGroup("corps"),
coeur: statGroup("coeur"),
esprit: statGroup("esprit"),
})
}
export class CelestopolAnomaly extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields
const reqInt = { required: true, nullable: false, integer: true }
return {
subtype: new fields.StringField({ required: true, nullable: false, initial: "none",
choices: Object.keys(SYSTEM.ANOMALY_TYPES) }),
value: new fields.NumberField({ ...reqInt, initial: 0, min: 0, max: 8 }),
reference: new fields.StringField({ required: true, nullable: false, initial: "" }),
scores: skillScoresSchema(),
description: new fields.HTMLField({ required: true, textSearch: true }),
technique: new fields.HTMLField({ required: true, textSearch: true }),
narratif: new fields.HTMLField({ required: true, textSearch: true }),
notes: new fields.HTMLField({ required: true, textSearch: true }),
}
}
}
export class CelestopolAspect extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields
const reqInt = { required: true, nullable: false, integer: true }
return {
value: new fields.NumberField({ ...reqInt, initial: 0, min: 0, max: 8 }),
reference: new fields.StringField({ required: true, nullable: false, initial: "" }),
scores: skillScoresSchema(),
description: new fields.HTMLField({ required: true, textSearch: true }),
technique: new fields.HTMLField({ required: true, textSearch: true }),
narratif: new fields.HTMLField({ required: true, textSearch: true }),
notes: new fields.HTMLField({ required: true, textSearch: true }),
}
}
}
export class CelestopolAttribute extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields
const reqInt = { required: true, nullable: false, integer: true }
return {
value: new fields.NumberField({ ...reqInt, initial: 0, min: 0, max: 8 }),
reference: new fields.StringField({ required: true, nullable: false, initial: "" }),
scores: skillScoresSchema(),
description: new fields.HTMLField({ required: true, textSearch: true }),
technique: new fields.HTMLField({ required: true, textSearch: true }),
narratif: new fields.HTMLField({ required: true, textSearch: true }),
notes: new fields.HTMLField({ required: true, textSearch: true }),
}
}
}
export class CelestopolEquipment extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields
const reqInt = { required: true, nullable: false, integer: true }
return {
subtype: new fields.StringField({ required: true, nullable: false, initial: "autre",
choices: Object.keys(SYSTEM.EQUIPMENT_TYPES) }),
reference: new fields.StringField({ required: true, nullable: false, initial: "" }),
quantity: new fields.NumberField({ ...reqInt, initial: 1, min: 0 }),
weight: new fields.NumberField({ required: true, nullable: false, initial: 0, min: 0 }),
damage: new fields.StringField({ required: true, nullable: false, initial: "" }),
range: new fields.StringField({ required: true, nullable: false, initial: "" }),
speed: new fields.StringField({ required: true, nullable: false, initial: "" }),
protection: new fields.StringField({ required: true, nullable: false, initial: "" }),
crew: new fields.StringField({ required: true, nullable: false, initial: "" }),
description:new fields.HTMLField({ required: true, textSearch: true }),
notes: new fields.HTMLField({ required: true, textSearch: true }),
}
}
}