Sorts et dévotions

This commit is contained in:
sladecraven 2021-04-02 16:47:38 +02:00
parent 558a7c08a7
commit 3880dfb034
12 changed files with 196 additions and 153 deletions

View File

@ -31,6 +31,8 @@ export class VadentisActorSheet extends ActorSheet {
data.editScore = this.options.editScore;
data.donnees = this.actor.getDonnees();
data.competences = this.actor.getCompetences();
data.sorts = this.actor.getSorts();
data.devotions = this.actor.getDevotions();
data.isGM = game.user.isGM;
return data;
@ -50,17 +52,6 @@ export class VadentisActorSheet extends ActorSheet {
const item = this.actor.getOwnedItem(li.data("item-id"));
item.sheet.render(true);
});
html.find('.item-equip').click(ev => {
const li = $(ev.currentTarget).parents(".item");
const item = this.actor.equipObject( li.data("item-id") );
this.render(true);
});
html.find('.item-worn').click(ev => {
const li = $(ev.currentTarget).parents(".item");
const item = this.actor.wornObject( li.data("item-id") );
this.render(true);
});
// Delete Inventory Item
html.find('.item-delete').click(ev => {
const li = $(ev.currentTarget).parents(".item");
@ -76,6 +67,16 @@ export class VadentisActorSheet extends ActorSheet {
const competenceId = li.data("item-id");
this.actor.rollCompetence(competenceId);
});
html.find('.sort-label a').click((event) => {
const li = $(event.currentTarget).parents(".item");
const sortId = li.data("item-id");
this.actor.rollSort(sortId);
});
html.find('.devotion-label a').click((event) => {
const li = $(event.currentTarget).parents(".item");
const devotionId = li.data("item-id");
this.actor.rollDevotion(devotionId);
});
html.find('.weapon-label a').click((event) => {
const li = $(event.currentTarget).parents(".item");
const weapon = this.actor.getOwnedItem(li.data("item-id"));
@ -93,11 +94,6 @@ export class VadentisActorSheet extends ActorSheet {
let skillName = event.currentTarget.attributes.skillname.value;
this.actor.updateCompetence(skillName, "malus", parseInt(event.target.value));
});
html.find('.skill-xp').change((event) => {
let skillName = event.currentTarget.attributes.skillname.value;
//console.log("Competence changed :", skillName);
this.actor.updateSkillExperience(skillName, parseInt(event.target.value));
});
html.find('.lock-unlock-sheet').click((event) => {
this.options.editScore = !this.options.editScore;
this.render(true);

View File

@ -57,6 +57,16 @@ export class VadentisActor extends Actor {
return this.data.items.filter( item => item.type == 'donnee');
}
/* -------------------------------------------- */
getSorts() {
return this.data.items.filter( item => item.type == 'sort');
}
/* -------------------------------------------- */
getDevotions() {
return this.data.items.filter( item => item.type == 'devotion');
}
/* -------------------------------------------- */
async updateCompetence( name, field, value) {
let competence = this.data.items.find( item => item.type == 'competence' && item.name == name);
@ -65,10 +75,76 @@ export class VadentisActor extends Actor {
await this.updateOwnedItem( { _id: competence._id, [dataPath]:value });
}
}
/* -------------------------------------------- */
rollSort( sortId ) {
let sort = this.data.items.find( item => item.type == 'sort' && item._id == sortId );
if ( sort ) {
if ( sort.data.pe > this.data.data.stats.pointsenergie.value) { // Vérification du ~ de points d'énergie
ChatMessage.create({ content: `Vous n'avez pas assez de Points d'Energie pour lancer votre sort ${sort.name}` } );
return;
}
let magieElementaire = this.data.data.magie['matriseelementaire'];
let statValue = magieElementaire.base + magieElementaire.malus + magieElementaire.bonus;
let formulaFull = `1d20+${magieElementaire.base}+${magieElementaire.malus}+${magieElementaire.bonus}`;
let myRoll = new Roll("1d20+"+statValue);
myRoll.evaluate();
myRoll.toMessage( { flavor: `Lancer de Sort : ${sort.name} (${formulaFull})` } );
console.log("ROLL", myRoll);
if (myRoll.total >= sort.data.difficulty) {
let content = `Votre sort ${sort.name} a réussi ! Vous perdez ${sort.data.pe} Points d'Energie et votre sort produit l'effet : <br>${sort.data.effect}`;
if ( sort.data.damage != "") {
if (myRoll.results[0] == 20 ) { // Critique ?
content += `<br>Et provoque les dégats critiques suivants : ${sort.data.damagecritical}`;
} else {
content += `<br>Et provoque les dégats suivants : ${sort.data.damage}`;
}
}
ChatMessage.create({ content:content} );
} else {
ChatMessage.create({ content: `Votre sort ${sort.name} a échoué !`});
}
}
}
/* -------------------------------------------- */
rollDevotion( devotionId ) {
let devotion = this.data.items.find( item => item.type == 'devotion' && item._id == devotionId );
if ( devotion ) {
if ( devotion.data.pe > this.data.data.stats.pointsenergie.value) { // Vérification du ~ de points d'énergie
ChatMessage.create({ content: `Vous n'avez pas assez de Points d'Energie pour lancer votre dévotion ${devotion.name}` } );
return;
}
let devotionComp = this.data.data.magie['devotion'];
let statValue = devotionComp.base + devotionComp.malus + devotionComp.bonus;
let formulaFull = `1d20+${devotionComp.base}+${devotionComp.malus}+${devotionComp.bonus}`;
let myRoll = new Roll("1d20+"+statValue);
myRoll.evaluate();
myRoll.toMessage( { flavor: `Lancer de Dévotion : ${devotion.name} (${formulaFull})` } );
if (myRoll.total >= devotion.data.difficulty) {
let content = `Votre dévotion ${devotion.name} a réussie ! Vous perdez ${devotion.data.pe} Points d'Energie et votre dévotion produit l'effet : <br>${devotion.data.effect}`;
if ( devotion.data.damage != "") {
if (myRoll.results[0] == 20 ) { // Critique ?
content += `<br>Et provoque les dégats critiques suivants : ${devotion.data.damagecritical}`;
} else {
content += `<br>Et provoque les dégats suivants : ${devotion.data.damage}`;
}
}
ChatMessage.create({ content:content} );
} else {
ChatMessage.create({ content: `Votre dévotion ${devotion.name} a échoué !`});
}
}
}
/* -------------------------------------------- */
rollCompetence( competenceId ) {
console.log("HERE !!!!", competenceId);
let competence = this.data.items.find( item => item.type == 'competence' && item._id == competenceId);
if ( competence) {
let statValue = competence.data.base + competence.data.malus + competence.data.bonus;

View File

@ -44,7 +44,14 @@ export class VadentisItemSheet extends ItemSheet {
/* -------------------------------------------- */
async getData() {
let data = super.getData();
if (data.item.type == 'sort') {
data.donnees = await VadentisUtility.getDonnees();
}
if (data.item.type == 'devotion') {
data.eglises = await VadentisUtility.getEglises();
}
data.isGM = game.user.isGM;
console.log("DATA", data);
return data;
}

View File

@ -61,6 +61,15 @@ export class VadentisUtility extends Entity {
return list;
}
/* -------------------------------------------- */
static getDonnees( ) {
return this.loadCompendiumNames('foundryvtt-vadentis.donnees');
}
/* -------------------------------------------- */
static getEglises( ) {
return this.loadCompendiumNames('foundryvtt-vadentis.eglises');
}
/* -------------------------------------------- */
static async confirmDelete(actorSheet, li) {
let itemId = li.data("item-id");

8
packs/donnees.db Normal file
View File

@ -0,0 +1,8 @@
{"name":"Donnée du Vent","permission":{"default":0,"sCecJLVlaPEcY7nF":3},"type":"donnee","data":{"description":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"3Rm5NhRowtPPXDGY"}
{"name":"Donnée de l'Ombre","permission":{"default":0,"sCecJLVlaPEcY7nF":3},"type":"donnee","data":{"description":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"5rTJDLgO7HjQsPbr"}
{"name":"Donnée du Feu","permission":{"default":0,"sCecJLVlaPEcY7nF":3},"type":"donnee","data":{"description":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"RrwN3NGZQZmlE1xn"}
{"name":"Donnée des Sentiments","permission":{"default":0,"sCecJLVlaPEcY7nF":3},"type":"donnee","data":{"description":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"aIpYtzCM1yWCDAU6"}
{"name":"Donnée de la Lumière","permission":{"default":0,"sCecJLVlaPEcY7nF":3},"type":"donnee","data":{"description":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"grt6xY5BY1kPGsmV"}
{"name":"Donnée de la Foudre","permission":{"default":0,"sCecJLVlaPEcY7nF":3},"type":"donnee","data":{"description":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"gypftiVXTACPuTg2"}
{"name":"Donnée de la Terre","permission":{"default":0,"sCecJLVlaPEcY7nF":3},"type":"donnee","data":{"description":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"huZaByOsJ4OgOQM0"}
{"name":"Donnée de l'Eau","permission":{"default":0,"sCecJLVlaPEcY7nF":3},"type":"donnee","data":{"description":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"xhNHMkKLL4kW0Sts"}

7
packs/eglises.db Normal file
View File

@ -0,0 +1,7 @@
{"name":"Eglise des 26","permission":{"default":0,"sCecJLVlaPEcY7nF":3},"type":"eglise","data":{"description":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"1gQX3Uq6tVXAtQcX"}
{"name":"Eglise Estuanienne","permission":{"default":0,"sCecJLVlaPEcY7nF":3},"type":"eglise","data":{"description":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"5T2uht7mCGI9rzyo"}
{"name":"Les Elus d'Estuans","permission":{"default":0,"sCecJLVlaPEcY7nF":3},"type":"eglise","data":{"description":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"9bBe6gQLAnM5dpFq"}
{"name":"Eglise des Ombres","permission":{"default":0,"sCecJLVlaPEcY7nF":3},"type":"eglise","data":{"description":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"KWX1EDBkp1yPhoa0"}
{"name":"Adorateurs de Yeshua","permission":{"default":0,"sCecJLVlaPEcY7nF":3},"type":"eglise","data":{"description":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"TV6QiHWXprN8PBjm"}
{"name":"Eglise du Soleil","permission":{"default":0,"sCecJLVlaPEcY7nF":3},"type":"eglise","data":{"description":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"muPAkVllu9D6cE7Q"}
{"name":"Eglise du Temps","permission":{"default":0,"sCecJLVlaPEcY7nF":3},"type":"eglise","data":{"description":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"nEAicuYriaP3hmc2"}

View File

@ -672,17 +672,8 @@ ul, li {
.arme-label,
.generic-label,
.competence-label,
.astrologie-label,
.tache-label,
.subacteur-label,
.chant-label,
.musique-label,
.oeuvre-label,
.chant-label,
.danse-label,
.recette-label,
.jeu-label,
.recettecuisine-label,
.devotion-label,
.sort-label,
.description-label {
flex-grow: 2;
}

View File

@ -2,11 +2,11 @@
"name": "foundryvtt-vadentis",
"title": "Vadentis",
"description": "Système Vadentis pour FoundryVTT",
"version": "0.0.7",
"version": "0.0.9",
"manifestPlusVersion": "1.0.0",
"minimumCoreVersion": "0.7.5",
"compatibleCoreVersion": "0.7.9",
"templateVersion": 6,
"templateVersion": 7,
"author": "Uberwald",
"esmodules": [ "modules/vadentis-main.js" ],
"styles": ["styles/simple.css"],
@ -14,6 +14,24 @@
"media": [
],
"packs": [
{
"name": "eglises",
"label": "Eglises",
"system": "foundryvtt-vadentis",
"module": "foundryvtt-vadentis",
"path": "./packs/eglises.db",
"entity": "Item",
"tags" : [ "eglise" ]
},
{
"name": "donnees",
"label": "Données",
"system": "foundryvtt-vadentis",
"module": "foundryvtt-vadentis",
"path": "./packs/donnees.db",
"entity": "Item",
"tags" : [ "données", "donnee" ]
}
],
"library": false,
"languages": [

View File

@ -94,9 +94,9 @@
"difficulty": 0,
"description": "",
"effect": "",
"critical": "",
"notes": "",
"damage": ""
"damage": "",
"damagecritical": ""
},
"equipcommun": {
"description": "",

View File

@ -142,30 +142,39 @@
{{!-- Sort Tab --}}
<div class="tab sorts" data-group="primary" data-tab="sorts">
<span><a class="lock-unlock-sheet"><img class="small-button-container"
src="systems/foundryvtt-shadows-over-sol/img/icons/{{#if data.editStatSkill}}unlocked.svg{{else}}locked.svg{{/if}}" alt="lock/unlock"
>{{#if data.editStatSkill}}Lock{{else}}Unlock{{/if}}</a></span>
<h4>Sorts</h4>
<div class="flex-group-left flexcol skill-column">
<ul class="item-list alterne-list">
<li class="item flexrow list-item" data-wound-name="light"><h4>Wounds : </h4></li>
<li class="item flexrow list-item" data-wound-name="light"><span class="skill-label">Light :</span>
<input class="wound-value" type="text" woundname="light" value="{{numberFormat data.wounds.light decimals=0}}" data-dtype="number" {{#unless @root.data.editStatSkill}}disabled{{/unless}}/>
</li>
<li class="item flexrow list-item" data-wound-name="moderate"><span class="skill-label">Moderate :</span>
<input class="wound-value" type="text" woundname="moderate" value="{{numberFormat data.wounds.moderate decimals=0}}" data-dtype="number" {{#unless @root.data.editStatSkill}}disabled{{/unless}}/>
</li>
<li class="item flexrow list-item" data-wound-name="severe"><span class="skill-label">Severe :</span>
<input class="wound-value" type="text" woundname="severe" value="{{numberFormat data.wounds.severe decimals=0}}" data-dtype="number" {{#unless @root.data.editStatSkill}}disabled{{/unless}}/>
</li>
<li class="item flexrow list-item" data-wound-name="critical"><span class="skill-label">Critical :</span>
<input class="wound-value" type="text" woundname="critical" value="{{numberFormat data.wounds.critical decimals=0}}" data-dtype="number" {{#unless @root.data.editStatSkill}}disabled{{/unless}}/>
</li>
<li class="item flexrow list-item" data-wound-name="critical"><span class="skill-label">Total :</span>
<span class="skill-label">{{data.currentWounds}} / {{data.totalWounds}}</span>
</li>
</ul>
<div class="flexcol">
<span class="generic-label">Sorts</span>
<ul class="item-list alterne-list">
{{#each sorts as |sort key|}}
<li class="item flexrow list-item" data-item-id="{{sort._id}}">
<img class="sheet-competence-img" src="{{sort.img}}"/>
<span class="sort-label"><a>{{sort.name}}</a></span>
<span class="sort-difficulty"><a>{{sort.data.difficulty}}</a></span>
<div class="item-controls">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
<span class="generic-label">Dévotions</span>
<ul class="item-list alterne-list">
{{#each devotions as |devotion key|}}
<li class="item flexrow list-item" data-item-id="{{devotion._id}}">
<img class="sheet-competence-img" src="{{devotion.img}}"/>
<span class="devotion-label"><a>{{devotion.name}}</a></span>
<span class="sort-difficulty"><a>{{devotion.data.difficulty}}</a></span>
<div class="item-controls">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
</div>
</div>
{{!-- Equipeme,t Tab --}}
@ -219,102 +228,10 @@
<div class="tab description" data-group="primary" data-tab="description">
<article class="flexrow">
<ul class="item-list alternate-list">
<li class="item flexrow list-item">
<label class="description-label generic-label">Geneline : </label>
<label class="description-label generic-label item-link"><a data-item-id="{{data.geneline._id}}">{{data.geneline.name}}</a></label>
</li>
<li class="item flexrow list-item">
<label class="description-label generic-label">Main Subculture :</label>
<select class="stat-value flexrow" type="text" name="data.subculture" value="{{data.subculture}}" data-dtype="String">
{{#select data.subculture}}
{{#each data.subcultureList as |subculture key|}}
<option value="{{subculture.name}}">{{subculture.name}}</option>
{{/each}}
{{/select}}
</select>
</li>
<li class="item flexrow list-item">
<label class="description-label stat-label">Genre : </label>
<input class="description-value flexrow" type="text" name="data.sex" value="{{data.sex}}" data-dtype="String"/>
</li>
<li class="item flexrow list-item">
<label class="description-label stat-label">Weight : </label>
<input class="description-value flexrow" type="text" name="data.weight" value="{{data.weight}}" data-dtype="String"/>
</li>
<li class="item flexrow list-item">
<label class="description-label stat-label">Size : </label>
<input class="description-value flexrow" type="text" name="data.taille" value="{{data.taille}}" data-dtype="String"/>
</li>
</ul>
<ul class="item-list alterne-list">
<li class="item flexrow list-item">
<label class="description-label stat-label">Hair : </label>
<input class="description-value flexrow" type="text" name="data.hair" value="{{data.hair}}" data-dtype="String"/>
</li>
<li class="item flexrow list-item">
<label class="description-label stat-label">Eyes : </label>
<input class="description-value flexrow" type="text" name="data.eyes" value="{{data.eyes}}" data-dtype="String"/>
</li>
<li class="item flexrow list-item">
<label class="description-label stat-label">Age : </label>
<input class="description-value flexrow" type="text" name="data.age" value="{{data.age}}" data-dtype="String"/>
</li>
</ul>
</article>
<hr>
<article class="flexcol">
<div class="grid grid-3col">
<div class="flex-group-left flexcol genelang-column">
<span class="description-label">Familiar Subcultures</span>
<ul class="item-list alternate-list">
{{#each data.subcultureList as |subculture key|}}
<li class="item flexrow list-item" data-item-id="{{subculture._id}}">
<img class="sheet-skill-img" src="{{subculture.img}}"/>
<span class="conseq-label genelang-label">{{subculture.name}}</span>
<div class="item-controls">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
</div>
<div class="flex-group-left flexcol genelang-column">
<span class="description-label">Known Languages</span>
<ul class="item-list alternate-list">
{{#each data.languageList as |language key|}}
<li class="item flexrow list-item" data-item-id="{{language._id}}">
<img class="sheet-skill-img" src="{{language.img}}"/>
<span class="conseq-label">{{language.name}}</span>
<div class="item-controls">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
</div>
<div class="flex-group-left flexcol genelang-column">
<span class="description-label">Weaknesses</span>
<ul class="item-list alternate-list">
{{#each data.weaknessList as |weakness key|}}
<li class="item flexrow list-item" data-item-id="{{weakness._id}}">
<img class="sheet-skill-img" src="{{weakness.img}}"/>
<span class="conseq-label">{{weakness.name}}</span>
<div class="item-controls">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
</div>
</div>
</article>
<hr>
<article class="flexcol">
<hr>
<h3>Biography : </h3>

View File

@ -11,17 +11,24 @@
<div class="tab" data-group="primary">
<ul>
<li class="flexrow"><label class="generic-label">Eglise</label><input type="text" name="data.eglise" value="{{data.eglise}}" data-dtype="String"/></li>
<li class="flexrow"><label class="generic-label">Eglise</label>
<select class="competence-base flexrow" type="text" name="data.eglise" value="{{data.eglise}}" data-dtype="String">
{{#select data.eglise}}
{{#each eglises as |eglise key|}}
<option value="{{eglise.name}}">{{eglise.name}}</option>
{{/each}}
{{/select}}
</select>
</li>
<li class="flexrow"><label class="generic-label">Points d'Energie</label><input type="text" name="data.pe" value="{{data.pe}}" data-dtype="Number"/></li>
<li class="flexrow"><label class="generic-label">Cible</label><input type="text" name="data.target" value="{{data.target}}" data-dtype="String"/></li>
<li class="flexrow"><label class="generic-label">Difficulté</label><input type="text" name="data.difficulty" value="{{data.difficulty}}" data-dtype="Number"/></li>
<li class="flexrow"><label class="generic-label">XP</label><input type="text" name="data.xp" value="{{data.xp}}" data-dtype="Number"/></li>
<li class="flexrow"><label class="generic-label">Dégâts</label><input type="text" name="data.damage" value="{{data.damage}}" data-dtype="String"/></li>
<li class="flexrow"><label class="generic-label">Dégâts Critiques</label><input type="text" name="data.damagecritical" value="{{data.damagecritical}}" data-dtype="String"/></li>
</ul>
<label class="generic-label">Effets</label>
{{editor content=data.effect target="data.effect" button=true owner=owner editable=editable}}
<label class="generic-label">Effets Critiques</label>
{{editor content=data.critical target="data.critical" button=true owner=owner editable=editable}}
<label class="generic-label">Notes</label>
{{editor content=data.notes target="data.notes" button=true owner=owner editable=editable}}
</div>

View File

@ -11,17 +11,24 @@
<div class="tab" data-group="primary">
<ul>
<li class="flexrow"><label class="generic-label">Donnée</label><input type="text" name="data.donnee" value="{{data.donnee}}" data-dtype="String"/></li>
<li class="flexrow"><label class="generic-label">Donnée</label>
<select class="competence-base flexrow" type="text" name="data.donnee" value="{{data.donnee}}" data-dtype="String">
{{#select data.donnee}}
{{#each donnees as |donnee key|}}
<option value="{{donnee.name}}">{{donnee.name}}</option>
{{/each}}
{{/select}}
</select>
</li>
<li class="flexrow"><label class="generic-label">Points d'Energie</label><input type="text" name="data.pe" value="{{data.pe}}" data-dtype="Number"/></li>
<li class="flexrow"><label class="generic-label">Cible</label><input type="text" name="data.target" value="{{data.target}}" data-dtype="String"/></li>
<li class="flexrow"><label class="generic-label">Difficulté</label><input type="text" name="data.difficulty" value="{{data.difficulty}}" data-dtype="Number"/></li>
<li class="flexrow"><label class="generic-label">XP</label><input type="text" name="data.xp" value="{{data.xp}}" data-dtype="Number"/></li>
<li class="flexrow"><label class="generic-label">Dégâts</label><input type="text" name="data.damage" value="{{data.damage}}" data-dtype="String"/></li>
<li class="flexrow"><label class="generic-label">Dégâts Critiques</label><input type="text" name="data.damagecritical" value="{{data.damagecritical}}" data-dtype="String"/></li>
</ul>
<label class="generic-label">Effets</label>
{{editor content=data.effect target="data.effect" button=true owner=owner editable=editable}}
<label class="generic-label">Effets Critiques</label>
{{editor content=data.critical target="data.critical" button=true owner=owner editable=editable}}
<label class="generic-label">Notes</label>
{{editor content=data.notes target="data.notes" button=true owner=owner editable=editable}}
</div>