Library nodes can now be edited :D

This commit is contained in:
Stefan Zermatten
2019-08-02 10:47:29 +02:00
parent 3c4f3e26f8
commit 745f4fd353
13 changed files with 110 additions and 80 deletions

View File

@@ -45,21 +45,26 @@ const insertNode = new ValidatedMethod({
},
});
const updateNode = new ValidatedMethod({
name: 'LibraryNodes.methods.update',
validate({_id, update}){
let fields = getModifierFields(update);
return !fields.hasAny([
'type',
'order',
'parent',
'ancestors',
]);
const updateLibraryNode = new ValidatedMethod({
name: 'LibraryNodes.methods.set',
validate({_id, path, value, ack}){
if (!_id) return false;
switch (path[0]){
case 'type':
case 'order':
case 'parent':
case 'ancestors':
return false;
}
},
run({_id, update}) {
run({_id, path, value, ack}) {
let node = LibraryNodes.findOne(_id);
assertNodeEditPermission(node, this.userId);
return LibraryNodes.update(_id, update);
return LibraryNodes.update(_id, {
$set: {[path.join('.')]: value},
}, {
selector: {type: node.type},
}, error => ack && ack(error));
},
});
@@ -93,4 +98,4 @@ function libraryNodesToTree(ancestorId){
}
export default LibraryNodes;
export { LibraryNodeSchema, insertNode, updateNode, libraryNodesToTree };
export { LibraryNodeSchema, insertNode, updateLibraryNode, libraryNodesToTree };

View File

@@ -44,7 +44,7 @@
import ColorPicker from '/imports/ui/components/ColorPicker.Story.vue';
import ColumnLayout from "/imports/ui/components/ColumnLayout.Story.vue";
import DialogStack from '/imports/ui/dialogStack/DialogStack.Story.vue';
import EffectEditExpansionList from '/imports/ui/properties/effects/EffectEditExpansionList.Story.vue';
import EffectEditExpansionList from '/imports/ui/properties/viewers/shared/effects/EffectEditExpansionList.Story.vue';
import FeatureCard from '/imports/ui/properties/features/FeatureCard.Story.vue';
import HealthBar from '/imports/ui/properties/attributes/HealthBar.Story.vue';
import HitDiceListTile from '/imports/ui/properties/attributes/HitDiceListTile.Story.vue';

View File

@@ -5,6 +5,7 @@ import FeatureCreationDialog from '/imports/ui/properties/features/FeatureCreati
import FeatureDialogContainer from '/imports/ui/properties/features/FeatureDialogContainer.vue';
import LibraryCreationDialog from '/imports/ui/library/LibraryCreationDialog.vue';
import LibraryNodeCreationDialog from '/imports/ui/library/LibraryNodeCreationDialog.vue';
import LibraryNodeEditDialog from '/imports/ui/library/LibraryNodeEditDialog.vue';
import SkillDialogContainer from '/imports/ui/properties/skills/SkillDialogContainer.vue';
export default {
@@ -15,5 +16,6 @@ export default {
FeatureDialogContainer,
LibraryCreationDialog,
LibraryNodeCreationDialog,
LibraryNodeEditDialog,
SkillDialogContainer,
};

View File

@@ -1,14 +1,18 @@
<template lang="html">
<dialog-base v-show="step == 1" class="step-1" key="left">
<dialog-base>
<template slot="toolbar">
<div>Add {{propertyName}}</div>
<property-icon :type="model.type" class="mr-2"/>
<div class="title">
{{getPropertyName(model.type)}}
</div>
<v-spacer/>
<v-btn icon flat @click="remove">
<v-icon>delete</v-icon>
</v-btn>
</template>
<component
v-if="type"
:is="type"
v-if="model"
:is="model.type"
class="library-node-form"
:model="model"
@change="change"
@@ -21,7 +25,6 @@
>
<v-btn
flat
:disabled="!valid"
@click="$store.dispatch('popDialogStack')"
>Done</v-btn>
</div>
@@ -29,41 +32,49 @@
</template>
<script>
import librarySchemas from '/imports/api/library/librarySchemas.js';
import DialogBase from '/imports/ui/dialogStack/DialogBase.vue';
import propertyFormIndex from '/imports/ui/properties/forms/shared/propertyFormIndex.js';
import LibraryNodes, { updateLibraryNode } from '/imports/api/library/LibraryNodes.js';
import librarySchemas from '/imports/api/library/librarySchemas.js';
import DialogBase from '/imports/ui/dialogStack/DialogBase.vue';
import { getPropertyName } from '/imports/constants/PROPERTIES.js';
import PropertyIcon from '/imports/ui/components/properties/PropertyIcon.vue';
import propertyFormIndex from '/imports/ui/properties/forms/shared/propertyFormIndex.js';
let todo = () => console.log('not implemented');
let libraryNodeSet = libraryNodePull = libraryNodePush = libraryNodeRemove = todo;
let todo = ({ack}) => {
console.warn('not implemented');
ack && ack();
};
let libraryNodePull = libraryNodePush = libraryNodeRemove = todo;
export default {
components: {
...propertyFormIndex,
DialogBase,
},
props: {
_id: String,
},
meteor: {
model(){
return LibrarNodes.findOne(this._id);
export default {
components: {
...propertyFormIndex,
PropertyIcon,
DialogBase,
},
props: {
_id: String,
},
},
methods: {
change({path, value, ack}){
libraryNodeSet({_id: this._id, path, value}, e => ack(e));
meteor: {
model(){
return LibraryNodes.findOne(this._id);
},
},
push({path, value, ack}){
libraryNodePush({_id: this._id, path}, e => ack(e));
},
pull({path, ack}){
libraryNodePull({_id: this._id, path}, e => ack(e));
},
remove(){
libraryNodeRemove({_id: this._id});
},
}
};
methods: {
getPropertyName,
change({path, value, ack}){
updateLibraryNode.call({_id: this._id, path, value, ack});
},
push({path, value, ack}){
libraryNodePush({_id: this._id, path}, e => ack(e));
},
pull({path, ack}){
libraryNodePull({_id: this._id, path}, e => ack(e));
},
remove(){
libraryNodeRemove({_id: this._id});
},
}
};
</script>
<style lang="css" scoped>

View File

@@ -7,7 +7,7 @@
{{library && library.name || 'Library'}}
<v-spacer/>
</template>
<v-card class="ma-4 layout row">
<v-card class="ma-4 layout row" data-id="library-card">
<div>
<v-toolbar dense flat>
<v-spacer/>
@@ -19,21 +19,21 @@
/>
</v-toolbar>
<library-contents-container
:library-id="$route.params.id"
:organize="organize"
@selected="e => selected = e"
:selected-node-id="selected"
:library-id="$route.params.id"
:organize="organize"
@selected="e => selected = e"
:selected-node-id="selected"
/>
</div>
<v-divider vertical/>
<div style="width: 100%;">
<div style="width: 100%; background-color: inherit;" data-id="selected-node-card">
<v-toolbar dense flat>
<property-icon :type="selectedNode && selectedNode.type" class="mr-2"/>
<div class="title">
{{getPropertyName(selectedNode && selectedNode.type)}}
</div>
<v-spacer/>
<v-btn flat icon>
<v-btn flat icon @click="editLibraryNode" v-if="selectedNode">
<v-icon>create</v-icon>
</v-btn>
</v-toolbar>
@@ -84,12 +84,19 @@
libraryNode.parent = {collection: "libraries", id: that.library._id};
libraryNode.ancestors = [ {collection: "libraries", id: that.library._id}];
setDocToLastOrder({collection: LibraryNodes, doc: libraryNode});
console.log(libraryNode);
let libraryNodeId = insertNode.call(libraryNode);
return libraryNodeId;
}
});
},
editLibraryNode(){
let that = this;
this.$store.commit('pushDialogStack', {
component: 'library-node-edit-dialog',
elementId: 'selected-node-card',
data: {_id: this.selected},
});
},
getPropertyName,
},
meteor: {

View File

@@ -35,7 +35,7 @@
<script>
import DialogBase from "/imports/ui/dialogStack/DialogBase.vue";
import EffectChildList from '/imports/ui/properties/effects/EffectChildList.vue';
import EffectChildList from '/imports/ui/properties/viewers/shared/effects/EffectChildList.vue';
import AttributeForm from '/imports/ui/properties/forms/AttributeForm.vue';
import numberToSignedString from '/imports/ui/utility/numberToSignedString.js';

View File

@@ -27,7 +27,7 @@
</template>
<script>
import EffectChildList from '/imports/ui/properties/effects/EffectChildList.vue';
import EffectChildList from '/imports/ui/properties/viewers/shared/effects/EffectChildList.vue';
import DialogBase from "/imports/ui/dialogStack/DialogBase.vue";
import SkillEdit from '/imports/ui/properties/skills/SkillEdit.vue';
import SkillProficiencyList from '/imports/ui/properties/skills/SkillProficiencyList.vue';

View File

@@ -11,24 +11,21 @@
<div v-if="model.mod !== undefined">
{{numberToSignedString(model.mod)}}
</div>
<div class="title">
<h1 class="display-1">
{{model.name}}
</div>
<div>
</h1>
<p class="my-2">
<code>{{model.variableName}}</code>
</div>
<div>
{{model.attributeType}}
</div>
<div>
Base value: {{model.baseValue}}
</div>
<div v-if="reset">
</p>
<p v-if="reset">
{{reset}}
</div>
<div v-if="model.resetMultiplier">
Reset multiplier: {{model.resetMultiplier}}
</div>
</p>
<effect-list-tile
class="mb-3"
operation="base"
:result="model.baseValue"
:name="model.attributeType"
/>
<p v-if="model.description">
{{model.description}}
</p>
@@ -37,8 +34,12 @@
<script>
import numberToSignedString from '/imports/ui/utility/numberToSignedString.js';
import EffectListTile from '/imports/ui/properties/viewers/shared/effects/EffectListTile.vue';
export default {
components: {
EffectListTile,
},
props: {
model: Object,
required: true,
@@ -50,9 +51,13 @@
reset(){
let reset = this.model.reset
if (reset === 'shortRest'){
return 'Reset on a short rest';
return `Reset${
this.model.resetMultiplier && ' x' + this.model.resetMultiplier
} on a short rest`;
} else if (reset === 'longRest'){
return 'Reset on a long rest';
return `Reset${
this.model.resetMultiplier && ' x' + this.model.resetMultiplier
} on a long rest`;
}
}
}

View File

@@ -11,7 +11,7 @@
</template>
<script>
import EffectListTile from '/imports/ui/properties/effects/EffectListTile.vue';
import EffectListTile from '/imports/ui/properties/viewers/shared/effects/EffectListTile.vue';
import sortEffects from '/imports/ui/utility/sortEffects.js';
export default {

View File

@@ -7,7 +7,7 @@
</template>
<script>
import EffectEditExpansionList from '/imports/ui/properties/effects/EffectEditExpansionList.vue';
import EffectEditExpansionList from '/imports/ui/properties/viewers/shared/effects/EffectEditExpansionList.vue';
export default {
data(){ return {
effects: [

View File

@@ -25,7 +25,7 @@
<script>
import EffectForm from '/imports/ui/properties/forms/EffectForm.vue';
import EffectListTile from '/imports/ui/properties/effects/EffectListTile.vue';
import EffectListTile from '/imports/ui/properties/viewers/shared/effects/EffectListTile.vue';
export default {
props: {
effects: Array,