Prise en compte des milieux
Les filtrages par milieux prennent en compte la rareté/fréquence du milieu
This commit is contained in:
parent
7f051e76be
commit
7a67cb7cea
@ -12,6 +12,7 @@ export class Environnement {
|
|||||||
name: COMPENDIUMS_RECHERCHE,
|
name: COMPENDIUMS_RECHERCHE,
|
||||||
default: [
|
default: [
|
||||||
SystemCompendiums.getCompendium('faune-flore-mineraux'),
|
SystemCompendiums.getCompendium('faune-flore-mineraux'),
|
||||||
|
SystemCompendiums.getCompendium('meditations-et-ecrits'),
|
||||||
SystemCompendiums.getCompendium('equipement')
|
SystemCompendiums.getCompendium('equipement')
|
||||||
],
|
],
|
||||||
scope: "world",
|
scope: "world",
|
||||||
|
@ -178,28 +178,35 @@ export class RdDItem extends Item {
|
|||||||
isHerbeAPotion() { return this.type == 'herbe' && (this.system.categorie == 'Soin' || this.system.categorie == 'Repos'); }
|
isHerbeAPotion() { return this.type == 'herbe' && (this.system.categorie == 'Soin' || this.system.categorie == 'Repos'); }
|
||||||
|
|
||||||
isPresentDansMilieux(milieux) {
|
isPresentDansMilieux(milieux) {
|
||||||
return this.getEnvironnement(milieux).length > 0
|
return this.getEnvironnements(milieux).length > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
getEnvironnement(milieux = undefined) {
|
getEnvironnements(milieux = undefined) {
|
||||||
const environnements = this.isInventaire() ? this.system?.environnement ?? [] : [];
|
const environnements = this.isInventaire() ? this.system.environnement : undefined;
|
||||||
return environnements.filter(env => !milieux || milieux.includes(env.milieu))
|
if (milieux == undefined || !environnements) {
|
||||||
|
return environnements ?? [];
|
||||||
|
}
|
||||||
|
return environnements.filter(env => milieux.includes(env.milieu))
|
||||||
}
|
}
|
||||||
|
|
||||||
getMilieux() {
|
getMilieux() {
|
||||||
return this.getEnvironnement().map(env => env.milieu);
|
return this.getEnvironnements().map(env => env.milieu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getRaretes(milieux = undefined) {
|
||||||
getRarete(milieux = undefined) {
|
|
||||||
if (this.isInventaire()) {
|
if (this.isInventaire()) {
|
||||||
return RdDRaretes.selonEnvironnement(this, milieux)
|
const raretes = this.getEnvironnements(milieux).map(env => RdDRaretes.byCode(env.rarete));
|
||||||
|
if (milieux == undefined && raretes.length == 0) {
|
||||||
|
return [RdDRaretes.rareteFrequente()];
|
||||||
|
}
|
||||||
|
return raretes;
|
||||||
}
|
}
|
||||||
return RdDRaretes.rareteFrequente();
|
return [RdDRaretes.rareteEgale()];
|
||||||
}
|
}
|
||||||
|
|
||||||
getFrequence(milieux = undefined) {
|
getFrequence(milieux = undefined) {
|
||||||
return this.getRarete(milieux)?.frequence ?? 0;
|
const frequences = this.getEnvironnements(milieux).map(it => it.frequence);
|
||||||
|
return frequences.length == 0 ? 0 : Math.max(...frequences);
|
||||||
}
|
}
|
||||||
|
|
||||||
getItemGroup() {
|
getItemGroup() {
|
||||||
|
@ -4,6 +4,7 @@ const RARETE_FREQUENTE = { code: 'Frequente', label: 'Fréquente', frequence: 18
|
|||||||
const RARETE_RARE = { code: 'Rare', label: 'Rare', frequence: 6, min: 3, max: 12 };
|
const RARETE_RARE = { code: 'Rare', label: 'Rare', frequence: 6, min: 3, max: 12 };
|
||||||
const RARETE_RARISSIME = { code: 'Rarissime', label: 'Rarissime', frequence: 2, min: 1, max: 4 };
|
const RARETE_RARISSIME = { code: 'Rarissime', label: 'Rarissime', frequence: 2, min: 1, max: 4 };
|
||||||
const RARETE_INEXISTANT = { code: 'Inexistant', label: 'Inexistant', frequence: 0, min: 0, max: 0 };
|
const RARETE_INEXISTANT = { code: 'Inexistant', label: 'Inexistant', frequence: 0, min: 0, max: 0 };
|
||||||
|
const RARETE_EGALE = { code: 'eqal', label: 'Egal', frequence: 1, min: 1, max: 1 };
|
||||||
|
|
||||||
const RARETES = [
|
const RARETES = [
|
||||||
RARETE_COMMUNE,
|
RARETE_COMMUNE,
|
||||||
@ -15,50 +16,16 @@ const RARETES = [
|
|||||||
|
|
||||||
export class RdDRaretes {
|
export class RdDRaretes {
|
||||||
|
|
||||||
static getRareteByCode(code = undefined) {
|
static rareteFrequente() { return RARETE_FREQUENTE; }
|
||||||
|
static rareteEgale() { return RARETE_EGALE; }
|
||||||
|
static raretes() { return RARETES; }
|
||||||
|
|
||||||
|
static byCode(code = undefined) {
|
||||||
return RARETES.find(it => it.code == code) ?? RARETE_FREQUENTE;
|
return RARETES.find(it => it.code == code) ?? RARETE_FREQUENTE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static getChamp(rarete, field = undefined) {
|
static getChamp(rarete, field = undefined) {
|
||||||
const selected = this.getRareteByCode(rarete);
|
return RdDRaretes.byCode(rarete)[field ?? 'frequence'];
|
||||||
return field ? selected[field] : selected[frequence];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static rareteFrequente() {
|
|
||||||
return RARETE_FREQUENTE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static raretes() {
|
|
||||||
return RARETES;
|
|
||||||
}
|
|
||||||
|
|
||||||
static selonEnvironnement(item, milieux = undefined) {
|
|
||||||
const list = item.getEnvironnement(milieux);
|
|
||||||
const freqMax = Math.max(0, ...list.map(env => env.frequence));
|
|
||||||
const env = list.find(env => env.frequence == freqMax);
|
|
||||||
if (env) {
|
|
||||||
return RdDRaretes.getRareteByCode(env.rarete)
|
|
||||||
}
|
|
||||||
if (milieux == undefined) {
|
|
||||||
return RdDRaretes.selonQualite(item)
|
|
||||||
}
|
|
||||||
return RARETE_INEXISTANT;
|
|
||||||
}
|
|
||||||
|
|
||||||
static selonQualite(item) {
|
|
||||||
const qualite = item.system.qualite ?? 0;
|
|
||||||
if (qualite <= 0) {
|
|
||||||
return RARETE_COMMUNE
|
|
||||||
}
|
|
||||||
if (qualite <= 3) {
|
|
||||||
return RARETE_FREQUENTE
|
|
||||||
}
|
|
||||||
if (qualite <= 6) {
|
|
||||||
return RARETE_RARE
|
|
||||||
}
|
|
||||||
if (qualite <= 9) {
|
|
||||||
return RARETE_RARISSIME
|
|
||||||
}
|
|
||||||
return RARETE_INEXISTANT
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -70,7 +70,7 @@ export class RdDItemInventaireSheet extends RdDItemSheet {
|
|||||||
|
|
||||||
$changeRarete(event, updated) {
|
$changeRarete(event, updated) {
|
||||||
const code = this.html.find(event.currentTarget).val();
|
const code = this.html.find(event.currentTarget).val();
|
||||||
const rarete = RdDRaretes.getRareteByCode(code);
|
const rarete = RdDRaretes.byCode(code);
|
||||||
updated.rarete = rarete.code;
|
updated.rarete = rarete.code;
|
||||||
updated.frequence = rarete.frequence;
|
updated.frequence = rarete.frequence;
|
||||||
}
|
}
|
||||||
@ -81,21 +81,22 @@ export class RdDItemInventaireSheet extends RdDItemSheet {
|
|||||||
ui.notifications.warn(`Choisissez le milieu dans lequel se trouve le/la ${this.item.name}`);
|
ui.notifications.warn(`Choisissez le milieu dans lequel se trouve le/la ${this.item.name}`);
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const list = this.item.getEnvironnement();
|
const list = this.item.getEnvironnements();
|
||||||
const exists = list.find(it => it.milieu == milieu);
|
const exists = list.find(it => it.milieu == milieu);
|
||||||
if (exists) {
|
if (exists) {
|
||||||
ui.notifications.warn(`${this.item.name} a déjà une rareté ${exists.rarete} en ${milieu} (fréquence: ${exists.frequence})`);
|
ui.notifications.warn(`${this.item.name} a déjà une rareté ${exists.rarete} en ${milieu} (fréquence: ${exists.frequence})`);
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const rarete = RdDRaretes.rareteFrequente();
|
const rarete = RdDRaretes.rareteFrequente();
|
||||||
const newList = [...list, { milieu, rarete: rarete.code, frequence: rarete.frequence }].sort(Misc.ascending(it => it.milieu))
|
const added = { milieu, rarete: rarete.code, frequence: rarete.frequence };
|
||||||
|
const newList = [added, ...list].sort(Misc.ascending(it => it.milieu))
|
||||||
await this.item.update({ 'system.environnement': newList })
|
await this.item.update({ 'system.environnement': newList })
|
||||||
}
|
}
|
||||||
|
|
||||||
async onDeleteMilieu(event) {
|
async onDeleteMilieu(event) {
|
||||||
const milieu = this.$getEventMilieu(event);
|
const milieu = this.$getEventMilieu(event);
|
||||||
if (milieu != undefined) {
|
if (milieu != undefined) {
|
||||||
const newList = this.item.getEnvironnement().filter(it => it.milieu != milieu)
|
const newList = this.item.getEnvironnements().filter(it => it.milieu != milieu)
|
||||||
.sort(Misc.ascending(it => it.milieu));
|
.sort(Misc.ascending(it => it.milieu));
|
||||||
await this.item.update({ 'system.environnement': newList });
|
await this.item.update({ 'system.environnement': newList });
|
||||||
}
|
}
|
||||||
|
@ -288,7 +288,7 @@ class _10_3_0_FrequenceEnvironnement extends Migration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_updatesFrequences(it) {
|
_updatesFrequences(it) {
|
||||||
const rarete = RdDRaretes.getRareteByCode(it.system.rarete);
|
const rarete = RdDRaretes.byCode(it.system.rarete);
|
||||||
return {
|
return {
|
||||||
_id: it.id,
|
_id: it.id,
|
||||||
'system.rarete': undefined,
|
'system.rarete': undefined,
|
||||||
|
@ -8,7 +8,6 @@ const FILTER_GROUPS = [
|
|||||||
{ group: 'type', label: "Type d'objet" },
|
{ group: 'type', label: "Type d'objet" },
|
||||||
{ group: 'comestible', label: 'Alimentaire' },
|
{ group: 'comestible', label: 'Alimentaire' },
|
||||||
{ group: 'categorie', label: 'Utilisation' },
|
{ group: 'categorie', label: 'Utilisation' },
|
||||||
{ group: 'milieu', label: 'Milieu' },
|
|
||||||
{ group: 'rarete', label: 'Rarete' },
|
{ group: 'rarete', label: 'Rarete' },
|
||||||
{ group: 'qualite', label: 'Qualité' },
|
{ group: 'qualite', label: 'Qualité' },
|
||||||
{ group: 'enc', label: 'Encombrement' },
|
{ group: 'enc', label: 'Encombrement' },
|
||||||
@ -16,60 +15,77 @@ const FILTER_GROUPS = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
const FILTERS = [
|
const FILTERS = [
|
||||||
{ group: 'comestible', code: 'comestible', label: 'Comestible', check: item => item.getUtilisation() == 'cuisine' },
|
{ group: 'comestible', code: 'comestible', label: 'Comestible', check: (item, milieux) => item.getUtilisation() == 'cuisine' },
|
||||||
{ group: 'comestible', code: 'pret', label: 'Préparé', check: item => item.getUtilisationCuisine() == 'pret' },
|
{ group: 'comestible', code: 'pret', label: 'Préparé', check: (item, milieux) => item.getUtilisationCuisine() == 'pret' },
|
||||||
{ group: 'comestible', code: 'brut', label: 'A préparer', check: item => item.getUtilisationCuisine() == 'brut' },
|
{ group: 'comestible', code: 'brut', label: 'A préparer', check: (item, milieux) => item.getUtilisationCuisine() == 'brut' },
|
||||||
{ group: 'comestible', code: 'boisson', label: 'Boisson', check: item => item.isBoisson() },
|
{ group: 'comestible', code: 'boisson', label: 'Boisson', check: (item, milieux) => item.isBoisson() },
|
||||||
{ group: 'comestible', code: 'alcool', label: 'Alcool', check: item => item.isAlcool() },
|
{ group: 'comestible', code: 'alcool', label: 'Alcool', check: (item, milieux) => item.isAlcool() },
|
||||||
{ group: 'comestible', code: 'immangeable', label: 'Immangeable', check: item => item.isInventaire() && item.getUtilisation() != 'cuisine' },
|
{ group: 'comestible', code: 'immangeable', label: 'Immangeable', check: (item, milieux) => item.isInventaire() && item.getUtilisation() != 'cuisine' },
|
||||||
|
|
||||||
{ group: 'categorie', code: 'alchimie', label: 'Alchimique', check: item => item.isInventaire() && item.getUtilisation() == 'alchimie' },
|
{ group: 'categorie', code: 'alchimie', label: 'Alchimique', check: (item, milieux) => item.isInventaire() && item.getUtilisation() == 'alchimie' },
|
||||||
{ group: 'categorie', code: 'soins', label: 'Médical', check: item => item.isInventaire() && item.getUtilisation() == 'soins' },
|
{ group: 'categorie', code: 'soins', label: 'Médical', check: (item, milieux) => item.isInventaire() && item.getUtilisation() == 'soins' },
|
||||||
{ group: 'categorie', code: 'poison', label: 'Toxique', check: item => item.isInventaire() && item.getUtilisation() == 'poison' },
|
{ group: 'categorie', code: 'poison', label: 'Toxique', check: (item, milieux) => item.isInventaire() && item.getUtilisation() == 'poison' },
|
||||||
{ group: 'categorie', code: 'autres', label: 'Autres', check: item => !item.isInventaire() || item.getUtilisation() == '' },
|
{ group: 'categorie', code: 'autres', label: 'Autres', check: (item, milieux) => !item.isInventaire() || item.getUtilisation() == '' },
|
||||||
|
|
||||||
{ group: "qualite", code: "mauvaise", label: "Mauvaise (négative)", check: item => item.isInventaire() && item.system.qualite < 0 },
|
{ group: "qualite", code: "mauvaise", label: "Mauvaise (négative)", check: (item, milieux) => item.isInventaire() && item.system.qualite < 0 },
|
||||||
{ group: "qualite", code: "quelconque", label: "Quelconque (0)", check: item => item.isInventaire() && item.system.qualite == 0 },
|
{ group: "qualite", code: "quelconque", label: "Quelconque (0)", check: (item, milieux) => item.isInventaire() && item.system.qualite == 0 },
|
||||||
{ group: "qualite", code: "correcte", label: "Correcte (1-3)", check: item => item.isInventaire() && 1 <= item.system.qualite && item.system.qualite <= 3 },
|
{ group: "qualite", code: "correcte", label: "Correcte (1-3)", check: (item, milieux) => item.isInventaire() && 1 <= item.system.qualite && item.system.qualite <= 3 },
|
||||||
{ group: "qualite", code: "bonne", label: "Bonne (4-6)", check: item => item.isInventaire() && 4 <= item.system.qualite && item.system.qualite <= 6 },
|
{ group: "qualite", code: "bonne", label: "Bonne (4-6)", check: (item, milieux) => item.isInventaire() && 4 <= item.system.qualite && item.system.qualite <= 6 },
|
||||||
{ group: "qualite", code: "excellente", label: "Excellente (7-9)", check: item => item.isInventaire() && 7 <= item.system.qualite && item.system.qualite <= 9 },
|
{ group: "qualite", code: "excellente", label: "Excellente (7-9)", check: (item, milieux) => item.isInventaire() && 7 <= item.system.qualite && item.system.qualite <= 9 },
|
||||||
{ group: "qualite", code: "mythique", label: "Mythique (10+)", check: item => item.isInventaire() && 10 <= item.system.qualite },
|
{ group: "qualite", code: "mythique", label: "Mythique (10+)", check: (item, milieux) => item.isInventaire() && 10 <= item.system.qualite },
|
||||||
|
|
||||||
{ group: "enc", code: "negligeable", label: "Négligeable (jusqu'à 0.1)", check: item => item.isInventaire() && item.system.encombrement <= 0.1 },
|
{ group: "enc", code: "negligeable", label: "Négligeable (jusqu'à 0.1)", check: (item, milieux) => item.isInventaire() && item.system.encombrement <= 0.1 },
|
||||||
{ group: "enc", code: "leger", label: "Léger (0.1 à 0.5)", check: item => item.isInventaire() && 0.1 < item.system.encombrement && item.system.encombrement <= 0.5 },
|
{ group: "enc", code: "leger", label: "Léger (0.1 à 0.5)", check: (item, milieux) => item.isInventaire() && 0.1 < item.system.encombrement && item.system.encombrement <= 0.5 },
|
||||||
{ group: "enc", code: "moyen", label: "Moyen (0.5 à 1.5)", check: item => item.isInventaire() && 0.5 < item.system.encombrement && item.system.encombrement <= 1.5 },
|
{ group: "enc", code: "moyen", label: "Moyen (0.5 à 1.5)", check: (item, milieux) => item.isInventaire() && 0.5 < item.system.encombrement && item.system.encombrement <= 1.5 },
|
||||||
{ group: "enc", code: "lourd", label: "Lourd (1.5 à 3)", check: item => item.isInventaire() && 1.5 < item.system.encombrement && item.system.encombrement <= 3 },
|
{ group: "enc", code: "lourd", label: "Lourd (1.5 à 3)", check: (item, milieux) => item.isInventaire() && 1.5 < item.system.encombrement && item.system.encombrement <= 3 },
|
||||||
{ group: "enc", code: "massif", label: "Massif (3 à 10)", check: item => item.isInventaire() && 3 < item.system.encombrement && item.system.encombrement <= 10 },
|
{ group: "enc", code: "massif", label: "Massif (3 à 10)", check: (item, milieux) => item.isInventaire() && 3 < item.system.encombrement && item.system.encombrement <= 10 },
|
||||||
{ group: "enc", code: "anemort", label: "Un âne mort (plus de 10)", check: item => item.isInventaire() && 10 < item.system.encombrement },
|
{ group: "enc", code: "anemort", label: "Un âne mort (plus de 10)", check: (item, milieux) => item.isInventaire() && 10 < item.system.encombrement },
|
||||||
|
|
||||||
{ group: "prix", code: "gratuit", label: "Gratuit", check: item => item.isInventaire() && item.system.cout == 0 },
|
{ group: "prix", code: "gratuit", label: "Gratuit", check: (item, milieux) => item.isInventaire() && item.system.cout == 0 },
|
||||||
{ group: "prix", code: "deniers", label: "Deniers (étain)", check: item => item.isInventaire() && 0 < item.system.cout && item.system.cout < 0.1 },
|
{ group: "prix", code: "deniers", label: "Deniers (étain)", check: (item, milieux) => item.isInventaire() && 0 < item.system.cout && item.system.cout < 0.1 },
|
||||||
{ group: "prix", code: "bronze", label: "Sous (bronze)", check: item => item.isInventaire() && 0.1 <= item.system.cout && item.system.cout < 1 },
|
{ group: "prix", code: "bronze", label: "Sous (bronze)", check: (item, milieux) => item.isInventaire() && 0.1 <= item.system.cout && item.system.cout < 1 },
|
||||||
{ group: "prix", code: "sols", label: "Sols (argent)", check: item => item.isInventaire() && 1 <= item.system.cout && item.system.cout < 10 },
|
{ group: "prix", code: "sols", label: "Sols (argent)", check: (item, milieux) => item.isInventaire() && 1 <= item.system.cout && item.system.cout < 10 },
|
||||||
{ group: "prix", code: "dragons", label: "Dragons (or)", check: item => item.isInventaire() && 10 <= item.system.cout },
|
{ group: "prix", code: "dragons", label: "Dragons (or)", check: (item, milieux) => item.isInventaire() && 10 <= item.system.cout },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
function $typeToFilter(type) { return { group: 'type', code: type, label: Misc.typeName('Item', type), check: item => item.type == type }; }
|
|
||||||
|
|
||||||
function $filterMilieux(milieux) {
|
function $filterMilieux(milieux) {
|
||||||
return milieux.map(m => { return { group: 'milieu', code: m, label: m, check: item => item.isPresentDansMilieux(m) } })
|
return milieux.map(m => {
|
||||||
|
return {
|
||||||
|
code: m,
|
||||||
|
label: m,
|
||||||
|
check: (item, milieux) => item.isPresentDansMilieux(m)
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function $filterRarete() {
|
function $filterRarete() {
|
||||||
return RdDRaretes.raretes()
|
return RdDRaretes.raretes()
|
||||||
.filter(it => it.frequence > 0)
|
.filter(it => it.frequence > 0)
|
||||||
.map(r => { return { group: 'rarete', code: r.code, label: r.label, check: item => item.getRarete()?.code == r.code }; });
|
.map(r => {
|
||||||
|
return {
|
||||||
|
group: 'rarete',
|
||||||
|
code: r.code,
|
||||||
|
label: r.label,
|
||||||
|
check: (item, milieux) => item.getRaretes(milieux).map(it => it.code).includes(r.code)
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function $filterTypes() {
|
function $filterTypes() {
|
||||||
return RdDItem.getItemTypesInventaire().map(it => $typeToFilter(it));
|
return RdDItem.getItemTypesInventaire().map(type => {
|
||||||
|
return {
|
||||||
|
group: 'type',
|
||||||
|
code: type,
|
||||||
|
label: Misc.typeName('Item', type),
|
||||||
|
check: (item, milieux) => item.type == type
|
||||||
|
};
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function $getAllFilters(milieux) {
|
function $getAllFilters() {
|
||||||
return FILTERS
|
return FILTERS
|
||||||
.concat($filterTypes())
|
.concat($filterTypes())
|
||||||
.concat($filterMilieux(milieux))
|
|
||||||
.concat($filterRarete());
|
.concat($filterRarete());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,8 +127,10 @@ export class FenetreRechercheTirage extends Application {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static async create() {
|
static async create() {
|
||||||
|
const milieux = await game.system.rdd.environnement.milieux();
|
||||||
const parameters = {
|
const parameters = {
|
||||||
milieux: await game.system.rdd.environnement.milieux(),
|
milieux: milieux,
|
||||||
|
filterMilieux: $filterMilieux(milieux),
|
||||||
filterGroups: duplicate(FILTER_GROUPS).filter(it => it.group),
|
filterGroups: duplicate(FILTER_GROUPS).filter(it => it.group),
|
||||||
}
|
}
|
||||||
const options = {}
|
const options = {}
|
||||||
@ -127,17 +145,12 @@ export class FenetreRechercheTirage extends Application {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async getData() {
|
async getData() {
|
||||||
let formData = super.getData();
|
return mergeObject(await super.getData(), this.parameters)
|
||||||
mergeObject(formData, this.parameters)
|
|
||||||
return formData;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_canDragStart() {
|
_canDragStart() { return true; }
|
||||||
return true;
|
_onDragStart(event) { }
|
||||||
}
|
|
||||||
_onDragStart(event) {
|
|
||||||
console.log('_onDragStart', event)
|
|
||||||
}
|
|
||||||
_getHeaderButtons() {
|
_getHeaderButtons() {
|
||||||
let buttons = super._getHeaderButtons();
|
let buttons = super._getHeaderButtons();
|
||||||
if (game.user.isGM) {
|
if (game.user.isGM) {
|
||||||
@ -155,17 +168,15 @@ export class FenetreRechercheTirage extends Application {
|
|||||||
super.activateListeners(html);
|
super.activateListeners(html);
|
||||||
this.html = html;
|
this.html = html;
|
||||||
|
|
||||||
HtmlUtility.showControlWhen(this.html.find('div.group-filters'), false);
|
this.showFilterGroup(this.html, false);
|
||||||
HtmlUtility.showControlWhen(this.html.find('i.filter-group-hide'), false);
|
|
||||||
HtmlUtility.showControlWhen(this.html.find('i.filter-group-show'), true);
|
|
||||||
|
|
||||||
this.html.find("a.filter-group-toggle").click(event => {
|
this.html.find("a.section-filters-toggle").click(event => {
|
||||||
const groupDiv = this.html.find(event.currentTarget)?.parents('div.filter-group').first();
|
const groupDiv = this.html.find(event.currentTarget)?.parents('div.section-filters-root').first();
|
||||||
const visible = groupDiv.find('div.group-filters').first().is(":visible");
|
const visible = groupDiv.find('div.section-filters-content').first().is(":visible");
|
||||||
this.showFilterGroup(groupDiv, !visible)
|
this.showFilterGroup(groupDiv, !visible)
|
||||||
});
|
});
|
||||||
|
|
||||||
this.html.find("input.activate-filter").change(event => this.changeListeFiltresActifs())
|
this.html.find("input:is(.activate-filter-group,.activate-filter-milieu)").change(event => this.changeListeFiltresActifs())
|
||||||
|
|
||||||
this.html.find("a.supprimer-filtres").click(async event => this.supprimerFiltres())
|
this.html.find("a.supprimer-filtres").click(async event => this.supprimerFiltres())
|
||||||
|
|
||||||
@ -178,9 +189,18 @@ export class FenetreRechercheTirage extends Application {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
showFilterGroup(groupDiv, show) {
|
||||||
|
if (groupDiv) {
|
||||||
|
HtmlUtility.showControlWhen(groupDiv.find('div.section-filters-content'), show);
|
||||||
|
HtmlUtility.showControlWhen(groupDiv.find('i.section-filters-hide'), show);
|
||||||
|
HtmlUtility.showControlWhen(groupDiv.find('i.section-filters-show'), !show);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
supprimerFiltres() {
|
supprimerFiltres() {
|
||||||
|
this.html.find('input:is(.activate-filter-group,.activate-filter-milieu)').prop("checked", false);
|
||||||
this.html.find('div.liste-resultats').html('');
|
this.html.find('div.liste-resultats').html('');
|
||||||
return this.html.find('input.activate-filter:checked').prop("checked", false);
|
this.changeListeFiltresActifs();
|
||||||
}
|
}
|
||||||
|
|
||||||
async recherche() {
|
async recherche() {
|
||||||
@ -191,53 +211,72 @@ export class FenetreRechercheTirage extends Application {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async buildTable() {
|
async buildTable() {
|
||||||
return await game.system.rdd.environnement.buildTable(it => it.getFrequence(), this.buildCheckedItemsFilter())
|
const milieux = this.getSelectedMilieux();
|
||||||
|
const filterItemMilieux = this.buildCheckedGroupFilter(milieux);
|
||||||
|
const filter = it => filterItemMilieux(it, milieux);
|
||||||
|
const itemFrequence = it => it.getFrequence(milieux);
|
||||||
|
return await game.system.rdd.environnement.buildTable(itemFrequence, filter)
|
||||||
}
|
}
|
||||||
|
|
||||||
buildCheckedItemsFilter() {
|
buildMilieuxFilter(milieux) {
|
||||||
const byGroup = this.getCheckedFiltersByGroup();
|
if (milieux) {
|
||||||
const groupSummaries = Object.entries(byGroup).map(([key, list]) => {
|
return this.buildOrFilter(this.parameters.filterMilieux.filter(it => milieux.includes(it.code)).map(f => f.check));
|
||||||
const group = this.parameters.filterGroups.find(g => key == g.group);
|
|
||||||
const filters = list.map(it => it.code).map(code => group.filters.find(f => code == f.code))
|
|
||||||
return filters
|
|
||||||
.map(f => f.check)
|
|
||||||
.reduce((a, b) => { return it => a(it) || b(it) });;
|
|
||||||
});
|
|
||||||
if (groupSummaries.length == 0) {
|
|
||||||
return it => true;
|
|
||||||
}
|
}
|
||||||
return groupSummaries.reduce((a, b) => { return it => a(it) && b(it) })
|
return (it, mi) => true;
|
||||||
}
|
}
|
||||||
|
|
||||||
showFilterGroup(groupDiv, show) {
|
buildCheckedGroupFilter(milieux) {
|
||||||
if (groupDiv) {
|
const filtersList = this.getGroupCheckedFilters()
|
||||||
HtmlUtility.showControlWhen(groupDiv.find('div.group-filters'), show);
|
.map(gf => this.buildOrFilter(gf.filters.map(f => f.check)));
|
||||||
HtmlUtility.showControlWhen(groupDiv.find('i.filter-group-hide'), show);
|
if (milieux) {
|
||||||
HtmlUtility.showControlWhen(groupDiv.find('i.filter-group-show'), !show);
|
filtersList.push(this.buildMilieuxFilter(milieux));
|
||||||
}
|
}
|
||||||
|
return this.buildAndFilter(filtersList)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buildAndFilter(filters) { return filters.reduce((f1, f2) => { return (it, mi) => f1(it, mi) && f2(it, mi); }); }
|
||||||
|
buildOrFilter(filters) { return filters.reduce((f1, f2) => { return (it, mi) => f1(it, mi) || f2(it, mi); }); }
|
||||||
|
|
||||||
changeListeFiltresActifs() {
|
changeListeFiltresActifs() {
|
||||||
const byGroup = this.getCheckedFiltersByGroup();
|
const milieux = this.getSelectedMilieux();
|
||||||
const groupSummaries = Object.entries(byGroup).map(([key, list]) => {
|
const summariesList = this.getGroupCheckedFilters()
|
||||||
const group = this.parameters.filterGroups.find(g => key == g.group);
|
.map(gf => {
|
||||||
const filters = list.map(it => it.code).map(code => group.filters.find(f => code == f.code))
|
return gf.group.label + ': ' + gf.filters
|
||||||
return group.label + ': ' + filters
|
.map(f => f.label)
|
||||||
.map(f => f.label)
|
.reduce(Misc.joining(', '))
|
||||||
.reduce(Misc.joining(', '));;
|
});
|
||||||
});
|
if (milieux) {
|
||||||
const fullText = groupSummaries.length == 0 ? "" : groupSummaries.reduce(Misc.joining(' - '));
|
summariesList.push('Milieux: ' + this.parameters.filterMilieux.filter(f => milieux.includes(f.code)).map(f => f.label).reduce(Misc.joining(', ')))
|
||||||
|
}
|
||||||
|
const fullText = summariesList.length == 0 ? "" : summariesList.reduce(Misc.joining(' - '));
|
||||||
this.html.find('span.liste-filtres-actifs').text(fullText);
|
this.html.find('span.liste-filtres-actifs').text(fullText);
|
||||||
}
|
}
|
||||||
|
|
||||||
getCheckedFiltersByGroup() {
|
getGroupCheckedFilters() {
|
||||||
const selectedFilters = jQuery.map(this.html.find('input.activate-filter:checked'), it => {
|
const checkedGroupFilters = jQuery.map(this.html.find('input.activate-filter-group:checked'), it => this.html.find(it))
|
||||||
const element = this.html.find(it);
|
.map(element => {
|
||||||
return { group: element.data('group'), code: element.data('code') };
|
return {
|
||||||
|
group: element.data('group'),
|
||||||
|
code: element.data('code')
|
||||||
|
};
|
||||||
|
}).filter(it => it.group);
|
||||||
|
|
||||||
|
const entries = Object.entries(Misc.classify(checkedGroupFilters, it => it.group));
|
||||||
|
return entries.map(([key, list]) => {
|
||||||
|
const group = this.parameters.filterGroups.find(g => g.group == key);
|
||||||
|
const filters = list.map(it => group.filters.find(f => it.code == f.code));
|
||||||
|
return { group, filters };
|
||||||
});
|
});
|
||||||
return Misc.classify(selectedFilters, it => it.group);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getSelectedMilieux() {
|
||||||
|
const milieux = jQuery.map(this.html.find('input.activate-filter-milieu:checked'), it => {
|
||||||
|
return this.html.find(it).data('code');
|
||||||
|
});
|
||||||
|
return milieux.length == 0 ? undefined : milieux
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
async configurer() {
|
async configurer() {
|
||||||
FenetreRechercheConfiguration.create();
|
FenetreRechercheConfiguration.create();
|
||||||
}
|
}
|
||||||
|
@ -12,19 +12,39 @@
|
|||||||
<div class="titre-fenetre-recherche">
|
<div class="titre-fenetre-recherche">
|
||||||
<h3>Filtres</h3>
|
<h3>Filtres</h3>
|
||||||
</div>
|
</div>
|
||||||
{{#each filterGroups as |group|}}
|
|
||||||
<div class="filter-group" data-group="{{group.group}}" >
|
<div class="section-filters-root">
|
||||||
<h4><a class="filter-group-toggle" >{{group.label}}
|
<h4>
|
||||||
|
<a class="section-filters-toggle">Milieux
|
||||||
<span class="item-controls">
|
<span class="item-controls">
|
||||||
<i class="filter-group-show fa-solid fa-chevrons-down"></i>
|
<i class="section-filters-show fa-solid fa-chevrons-down"></i>
|
||||||
<i class="filter-group-hide fa-solid fa-chevrons-up"></i>
|
<i class="section-filters-hide fa-solid fa-chevrons-up"></i>
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
</h4>
|
</h4>
|
||||||
<div class="flexcol group-filters">
|
<div class="flexcol section-filters-content">
|
||||||
|
{{#each filterMilieux as |filter|}}
|
||||||
|
<div class="flexrow">
|
||||||
|
<input type="checkbox" class="activate-filter-milieu" name="milieu-{{filter.code}}" data-code="{{filter.code}}"/>
|
||||||
|
<label for="milieu-{{filter.code}}">{{filter.label}}</label>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{#each filterGroups as |group|}}
|
||||||
|
<div class="section-filters-root" data-group="{{group.group}}" >
|
||||||
|
<h4><a class="section-filters-toggle" >{{group.label}}
|
||||||
|
<span class="item-controls">
|
||||||
|
<i class="section-filters-show fa-solid fa-chevrons-down"></i>
|
||||||
|
<i class="section-filters-hide fa-solid fa-chevrons-up"></i>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</h4>
|
||||||
|
<div class="flexcol section-filters-content">
|
||||||
{{#each group.filters as |filter|}}
|
{{#each group.filters as |filter|}}
|
||||||
<div class="flexrow">
|
<div class="flexrow">
|
||||||
<input type="checkbox" class="activate-filter" name="{{filter.group}}-{{filter.code}}"
|
<input type="checkbox" class="activate-filter-group" name="{{filter.group}}-{{filter.code}}"
|
||||||
data-group="{{filter.group}}" data-code="{{filter.code}}"/>
|
data-group="{{filter.group}}" data-code="{{filter.code}}"/>
|
||||||
<label for="{{filter.group}}-{{filter.code}}">{{filter.label}}</label>
|
<label for="{{filter.group}}-{{filter.code}}">{{filter.label}}</label>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user