diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 221b4ae7..7103aeff 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -66,9 +66,9 @@ export class RdDActorSheet extends RdDBaseActorSheet { formData.calc.fatigue = RdDUtility.calculFatigueHtml(formData.system.sante.fatigue.value, formData.system.sante.endurance.max); formData.competences.forEach(item => { - item.system.isVisible = this.options.recherche - ? RdDItemCompetence.nomContientTexte(item, this.options.recherche.text) - : (!this.options.showCompNiveauBase || !RdDItemCompetence.isNiveauBase(item)); + item.system.isHidden = this.options.recherche + ? !item.isNomLike(this.options.recherche.text) + : (this.options.showCompNiveauBase && RdDItemCompetence.isNiveauBase(item)); RdDItemCompetence.levelUp(item, formData.system.compteurs.experience.value); }); @@ -354,29 +354,6 @@ export class RdDActorSheet extends RdDBaseActorSheet { this.render(true); }); - this.html.find('.recherche') - .each((index, field) => { - if (this.options.recherche) { - field.focus(); - field.setSelectionRange(this.options.recherche.start, this.options.recherche.end); - } - }) - .keyup(async event => { - const nouvelleRecherche = this._optionRecherche(event.currentTarget); - if (this.options.recherche?.text != nouvelleRecherche?.text) { - this.options.recherche = nouvelleRecherche; - if (this.timerRecherche) { - clearTimeout(this.timerRecherche); - } - this.timerRecherche = setTimeout(() => { - this.timerRecherche = undefined; - this.render(true); - }, 500); - } - }) - .change(async event => - this.options.recherche = this._optionRecherche(event.currentTarget) - ); this.html.find('.vue-detaillee').click(async event => { this.options.vueDetaillee = !this.options.vueDetaillee; this.render(true); @@ -486,16 +463,6 @@ export class RdDActorSheet extends RdDBaseActorSheet { async createEmptyTache() { await this.actor.createItem('tache', 'Nouvelle tache'); } - _optionRecherche(target) { - if (!target.value?.length) { - return undefined; - } - return { - text: target.value, - start: target.selectionStart, - end: target.selectionEnd, - }; - } _getEventArmeCombat(event) { const li = this.html.find(event.currentTarget)?.parents(".item"); diff --git a/module/actor/base-actor-sheet.js b/module/actor/base-actor-sheet.js index e0d92bd1..c4d09424 100644 --- a/module/actor/base-actor-sheet.js +++ b/module/actor/base-actor-sheet.js @@ -52,10 +52,30 @@ export class RdDBaseActorSheet extends ActorSheet { this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets); formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs); - + this._appliquerRechercheObjets(formData.objets, formData.conteneurs, this.options.recherche); return formData; } + _appliquerRechercheObjets(objets, conteneurs, recherche) { + if (recherche) { + this._setConteneursVisibles(objets, conteneurs); + } + } + + _setConteneursVisibles(objets, conteneurs) { + const recherche = this.options.recherche; + const allVisible = objets.filter(it => it.isNomTypeLike(recherche.text)).map(it => it.id); + let addVisible = conteneurs.filter(it => it.isNomTypeLike(recherche.text)).map(it => it.id) + do { + allVisible.push(...addVisible) + const parentsIds = conteneurs.filter(it => it.system.contenu.find(id => allVisible.includes(id))).map(it => it.id) + addVisible = parentsIds.filter(id => !allVisible.includes(id)) + } + while (addVisible.length > 0) + objets.forEach(it => it.system.isHidden = !allVisible.includes(it.id)) + conteneurs.forEach(it => it.system.isHidden = !allVisible.includes(it.id)) + } + /* -------------------------------------------- */ static filterItemsPerTypeForSheet(formData, itemTypes) { formData.recettescuisine = Misc.arrayOrEmpty(itemTypes['recettecuisine']); @@ -140,6 +160,38 @@ export class RdDBaseActorSheet extends ActorSheet { this.html.find('.monnaie-moins').click(async event => { this.actor.monnaieIncDec(this.getItemId(event), -1); }); + this.html.find('.recherche') + .each((index, field) => { + this._rechercheSelectArea(field); + }) + .keyup(async event => { + this._rechercherKeyup(event); + }) + .change(async event => + this.options.recherche = this._optionRecherche(event.currentTarget) + ); + } + + _rechercherKeyup(event) { + const currentTarget = event.currentTarget; + const nouvelleRecherche = this._optionRecherche(currentTarget); + if (this.options.recherche?.text != nouvelleRecherche?.text) { + this.options.recherche = nouvelleRecherche; + if (this.timerRecherche) { + clearTimeout(this.timerRecherche); + } + this.timerRecherche = setTimeout(() => { + this.timerRecherche = undefined; + this.render(true); + }, 500); + } + } + + _rechercheSelectArea(field) { + if (this.options.recherche) { + field.focus(); + field.setSelectionRange(this.options.recherche.start, this.options.recherche.end); + } } getItemId(event) { @@ -150,6 +202,16 @@ export class RdDBaseActorSheet extends ActorSheet { return RdDSheetUtility.getItem(event, this.actor); } + _optionRecherche(target) { + if (!target.value?.length) { + return undefined; + } + return { + text: target.value, + start: target.selectionStart, + end: target.selectionEnd, + }; + } /* -------------------------------------------- */ _getHeaderButtons() { let buttons = super._getHeaderButtons(); diff --git a/module/item-competence.js b/module/item-competence.js index 8772c75b..be1039ca 100644 --- a/module/item-competence.js +++ b/module/item-competence.js @@ -190,15 +190,6 @@ export class RdDItemCompetence extends Item { } } - /* -------------------------------------------- */ - static isVisible(item) { - return Number(item.system.niveau) != RdDItemCompetence.getNiveauBase(item.system.categorie); - } - - static nomContientTexte(item, texte) { - return Grammar.toLowerCaseNoAccent(item.name).includes(Grammar.toLowerCaseNoAccent(texte)) - } - /* -------------------------------------------- */ static isNiveauBase(item) { return Number(item.system.niveau) == RdDItemCompetence.getNiveauBase(item.system.categorie); @@ -279,7 +270,7 @@ export class RdDItemCompetence extends Item { /* -------------------------------------------- */ static triVisible(competences) { - return competences.filter(it => it.system.isVisible) + return competences.filter(it => !it.system.isHidden) .sort((a, b) => RdDItemCompetence.compare(a, b)) } diff --git a/module/item.js b/module/item.js index 11cb6614..74b59594 100644 --- a/module/item.js +++ b/module/item.js @@ -304,6 +304,13 @@ export class RdDItem extends Item { return this.parent?.type == 'commerce'; } + isNomLike(texte) { + return Grammar.includesLowerCaseNoAccent(this.name, texte) + } + isNomTypeLike(texte) { + return this.isNomLike(texte) || Grammar.includesLowerCaseNoAccent(Misc.typeName(this.type, 'Item'), texte) + } + getQuantite() { return this.isService() ? undefined : Math.round(this.system.quantite ?? 0) } diff --git a/styles/simple.css b/styles/simple.css index 40221b90..e5999b92 100644 --- a/styles/simple.css +++ b/styles/simple.css @@ -1005,6 +1005,10 @@ ul, li { max-height: 1.2rem; } +span.embed-inline { + display: inline-flex; +} + .alterne-list > .list-item:hover { background: rgba(100, 100, 50, 0.25); } diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index de44d86f..c122ea18 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -61,7 +61,7 @@ Filtrer {{/if}} - + diff --git a/templates/actor/competence.html b/templates/actor/competence.html index d9de370a..d954ea9c 100644 --- a/templates/actor/competence.html +++ b/templates/actor/competence.html @@ -1,4 +1,4 @@ -{{#if system.isVisible}} +{{#unless system.isHidden}}
  • @@ -49,4 +49,4 @@ {{/if}}
  • -{{/if}} \ No newline at end of file +{{/unless}} \ No newline at end of file diff --git a/templates/actor/inventaire-item.html b/templates/actor/inventaire-item.html index a89f0716..71aac1ba 100644 --- a/templates/actor/inventaire-item.html +++ b/templates/actor/inventaire-item.html @@ -1,3 +1,4 @@ +{{#unless item.system.isHidden}} {{#if (or options.isObserver (ne item.type 'monnaie'))}}
  • @@ -43,3 +44,4 @@
  • {{/if}} +{{/unless}} diff --git a/templates/actor/inventaire.html b/templates/actor/inventaire.html index 61e13c29..20de7846 100644 --- a/templates/actor/inventaire.html +++ b/templates/actor/inventaire.html @@ -6,6 +6,9 @@ {{#if options.isGM}}
    Tout vider {{/if}} + + + {{#if calc.surEncombrementMessage}}{{calc.surEncombrementMessage}} ‐{{/if}} Encombrement: {{numberFormat calc.encTotal decimals=2}} (max: {{system.attributs.encombrement.value}}) {{#if (regle-optionnelle 'afficher-prix-joueurs')}}