Merge branch 'feature-library'

This commit is contained in:
Stefan Zermatten
2017-05-04 14:23:19 +02:00
9 changed files with 390 additions and 55 deletions

View File

@@ -1,3 +1,4 @@
{
"undef": false
}
"undef": false,
"esversion": 6
}

247
dataSources/srd/tools.json Normal file
View File

@@ -0,0 +1,247 @@
[
{
"name": "Alchemists supplies",
"plural": "Alchemists supplies",
"description": "These special tools include the items needed to pursue a craft or trade. The table shows examples of the most common types of tools, each providing items related to a single craft. Proficiency with a set of artisans tools lets you add your proficiency bonus to any ability checks you make using the tools in your craft. Each type of artisans tools requires a separate proficiency.",
"value": 50,
"weight": 8
},
{
"name": "Brewers supplies",
"plural": "Brewers supplies",
"description": "These special tools include the items needed to pursue a craft or trade. The table shows examples of the most common types of tools, each providing items related to a single craft. Proficiency with a set of artisans tools lets you add your proficiency bonus to any ability checks you make using the tools in your craft. Each type of artisans tools requires a separate proficiency.",
"value": 20,
"weight": 9
},
{
"name": "Calligraphers supplies",
"plural": "Calligraphers supplies",
"description": "These special tools include the items needed to pursue a craft or trade. The table shows examples of the most common types of tools, each providing items related to a single craft. Proficiency with a set of artisans tools lets you add your proficiency bonus to any ability checks you make using the tools in your craft. Each type of artisans tools requires a separate proficiency.",
"value": 10,
"weight": 5
},
{
"name": "Carpenters tools",
"plural": "Carpenters tools",
"description": "These special tools include the items needed to pursue a craft or trade. The table shows examples of the most common types of tools, each providing items related to a single craft. Proficiency with a set of artisans tools lets you add your proficiency bonus to any ability checks you make using the tools in your craft. Each type of artisans tools requires a separate proficiency.",
"value": 8,
"weight": 6
},
{
"name": "Cartographers tools",
"plural": "Cartographers tools",
"description": "These special tools include the items needed to pursue a craft or trade. The table shows examples of the most common types of tools, each providing items related to a single craft. Proficiency with a set of artisans tools lets you add your proficiency bonus to any ability checks you make using the tools in your craft. Each type of artisans tools requires a separate proficiency.",
"value": 15,
"weight": 6
},
{
"name": "Cobblers tools",
"plural": "Cobblers tools",
"description": "These special tools include the items needed to pursue a craft or trade. The table shows examples of the most common types of tools, each providing items related to a single craft. Proficiency with a set of artisans tools lets you add your proficiency bonus to any ability checks you make using the tools in your craft. Each type of artisans tools requires a separate proficiency.",
"value": 5,
"weight": 5
},
{
"name": "Cooks utensils",
"plural": "Cooks utensils",
"description": "These special tools include the items needed to pursue a craft or trade. The table shows examples of the most common types of tools, each providing items related to a single craft. Proficiency with a set of artisans tools lets you add your proficiency bonus to any ability checks you make using the tools in your craft. Each type of artisans tools requires a separate proficiency.",
"value": 1,
"weight": 8
},
{
"name": "Glassblowers tools",
"plural": "Glassblowers tools",
"description": "These special tools include the items needed to pursue a craft or trade. The table shows examples of the most common types of tools, each providing items related to a single craft. Proficiency with a set of artisans tools lets you add your proficiency bonus to any ability checks you make using the tools in your craft. Each type of artisans tools requires a separate proficiency.",
"value": 30,
"weight": 5
},
{
"name": "Jewelers tools",
"plural": "Jewelers tools",
"description": "These special tools include the items needed to pursue a craft or trade. The table shows examples of the most common types of tools, each providing items related to a single craft. Proficiency with a set of artisans tools lets you add your proficiency bonus to any ability checks you make using the tools in your craft. Each type of artisans tools requires a separate proficiency.",
"value": 25,
"weight": 2
},
{
"name": "Leatherworkers tools",
"plural": "Leatherworkers tools",
"description": "These special tools include the items needed to pursue a craft or trade. The table shows examples of the most common types of tools, each providing items related to a single craft. Proficiency with a set of artisans tools lets you add your proficiency bonus to any ability checks you make using the tools in your craft. Each type of artisans tools requires a separate proficiency.",
"value": 5,
"weight": 5
},
{
"name": "Masons tools",
"plural": "Masons tools",
"description": "These special tools include the items needed to pursue a craft or trade. The table shows examples of the most common types of tools, each providing items related to a single craft. Proficiency with a set of artisans tools lets you add your proficiency bonus to any ability checks you make using the tools in your craft. Each type of artisans tools requires a separate proficiency.",
"value": 10,
"weight": 8
},
{
"name": "Painters supplies",
"plural": "Painters supplies",
"description": "These special tools include the items needed to pursue a craft or trade. The table shows examples of the most common types of tools, each providing items related to a single craft. Proficiency with a set of artisans tools lets you add your proficiency bonus to any ability checks you make using the tools in your craft. Each type of artisans tools requires a separate proficiency.",
"value": 10,
"weight": 5
},
{
"name": "Potters tools",
"plural": "Potters tools",
"description": "These special tools include the items needed to pursue a craft or trade. The table shows examples of the most common types of tools, each providing items related to a single craft. Proficiency with a set of artisans tools lets you add your proficiency bonus to any ability checks you make using the tools in your craft. Each type of artisans tools requires a separate proficiency.",
"value": 10,
"weight": 3
},
{
"name": "Smiths tools",
"plural": "Smiths tools",
"description": "These special tools include the items needed to pursue a craft or trade. The table shows examples of the most common types of tools, each providing items related to a single craft. Proficiency with a set of artisans tools lets you add your proficiency bonus to any ability checks you make using the tools in your craft. Each type of artisans tools requires a separate proficiency.",
"value": 20,
"weight": 8
},
{
"name": "Tinkers tools",
"plural": "Tinkers tools",
"description": "These special tools include the items needed to pursue a craft or trade. The table shows examples of the most common types of tools, each providing items related to a single craft. Proficiency with a set of artisans tools lets you add your proficiency bonus to any ability checks you make using the tools in your craft. Each type of artisans tools requires a separate proficiency.",
"value": 50,
"weight": 10
},
{
"name": "Weavers tools",
"plural": "Weavers tools",
"description": "These special tools include the items needed to pursue a craft or trade. The table shows examples of the most common types of tools, each providing items related to a single craft. Proficiency with a set of artisans tools lets you add your proficiency bonus to any ability checks you make using the tools in your craft. Each type of artisans tools requires a separate proficiency.",
"value": 1,
"weight": 5
},
{
"name": "Woodcarvers tools",
"plural": "Woodcarvers tools",
"description": "These special tools include the items needed to pursue a craft or trade. The table shows examples of the most common types of tools, each providing items related to a single craft. Proficiency with a set of artisans tools lets you add your proficiency bonus to any ability checks you make using the tools in your craft. Each type of artisans tools requires a separate proficiency.",
"value": 1,
"weight": 5
},
{
"name": "Dice set",
"plural": "Dice sets",
"description": "This item encompasses a wide range of game pieces, including dice and decks of cards (for games such as Three-Dragon Ante). A few common examples appear on the Tools table, but other kinds of gaming sets exist. If you are proficient with a gaming set, you can add your proficiency bonus to ability checks you make to play a game with that set. Each type of gaming set requires a separate proficiency.",
"value": 0.1,
"weight": 0
},
{
"name": "Playing card set",
"plural": "Playing card sets",
"description": "This item encompasses a wide range of game pieces, including dice and decks of cards (for games such as Three-Dragon Ante). A few common examples appear on the Tools table, but other kinds of gaming sets exist. If you are proficient with a gaming set, you can add your proficiency bonus to ability checks you make to play a game with that set. Each type of gaming set requires a separate proficiency.",
"value": 0.5,
"weight": 0
},
{
"name": "Bagpipes",
"plural": "Bagpipes",
"description": "If you have proficiency with a given musical instrument, you can add your proficiency bonus to any ability checks you make to play music with the instrument. A bard can use a musical instrument as a spellcasting focus.",
"value": 30,
"weight": 6
},
{
"name": "Drum",
"plural": "Drums",
"description": "If you have proficiency with a given musical instrument, you can add your proficiency bonus to any ability checks you make to play music with the instrument. A bard can use a musical instrument as a spellcasting focus.",
"value": 6,
"weight": 3
},
{
"name": "Dulcimer",
"plural": "Dulcimers",
"description": "If you have proficiency with a given musical instrument, you can add your proficiency bonus to any ability checks you make to play music with the instrument. A bard can use a musical instrument as a spellcasting focus.",
"value": 25,
"weight": 10
},
{
"name": "Flute",
"plural": "Flutes",
"description": "If you have proficiency with a given musical instrument, you can add your proficiency bonus to any ability checks you make to play music with the instrument. A bard can use a musical instrument as a spellcasting focus.",
"value": 2,
"weight": 1
},
{
"name": "Lute",
"plural": "Lutes",
"description": "If you have proficiency with a given musical instrument, you can add your proficiency bonus to any ability checks you make to play music with the instrument. A bard can use a musical instrument as a spellcasting focus.",
"value": 35,
"weight": 2
},
{
"name": "Lyre",
"plural": "Lyres",
"description": "If you have proficiency with a given musical instrument, you can add your proficiency bonus to any ability checks you make to play music with the instrument. A bard can use a musical instrument as a spellcasting focus.",
"value": 30,
"weight": 2
},
{
"name": "Horn",
"plural": "Horns",
"description": "If you have proficiency with a given musical instrument, you can add your proficiency bonus to any ability checks you make to play music with the instrument. A bard can use a musical instrument as a spellcasting focus.",
"value": 3,
"weight": 2
},
{
"name": "Pan flute",
"plural": "Pan flutes",
"description": "If you have proficiency with a given musical instrument, you can add your proficiency bonus to any ability checks you make to play music with the instrument. A bard can use a musical instrument as a spellcasting focus.",
"value": 12,
"weight": 2
},
{
"name": "Shawm",
"plural": "Shawms",
"description": "If you have proficiency with a given musical instrument, you can add your proficiency bonus to any ability checks you make to play music with the instrument. A bard can use a musical instrument as a spellcasting focus.",
"value": 2,
"weight": 1
},
{
"name": "Viol",
"plural": "Viols",
"description": "If you have proficiency with a given musical instrument, you can add your proficiency bonus to any ability checks you make to play music with the instrument. A bard can use a musical instrument as a spellcasting focus.",
"value": 30,
"weight": 1
},
{
"name": "Disguise Kit",
"plural": "Disguise Kits",
"description": "This pouch of cosmetics, hair dye, and small props lets you create disguises that change your physical appearance. Proficiency with this kit lets you add your proficiency bonus to any ability checks you make to create a visual disguise.",
"value": 25,
"weight": 3
},
{
"name": "Forgery Kit",
"plural": "Forgery Kits",
"description": "This small box contains a variety of papers and parchments, pens and inks, seals and sealing wax, gold and silver leaf, and other supplies necessary to create convincing forgeries of physical documents. Proficiency with this kit lets you add your proficiency bonus to any ability checks you make to create a physical forgery of a document.",
"value": 15,
"weight": 5
},
{
"name": "Herbalism Kit",
"plural": "Herbalism Kits",
"description": "This kit contains a variety of instruments such as clippers, mortar and pestle, and pouches and vials used by herbalists to create remedies and potions. Proficiency with this kit lets you add your proficiency bonus to any ability checks you make to identify or apply herbs. Also, proficiency with this kit is required to create antitoxin and potions of healing.",
"value": 5,
"weight": 3
},
{
"name": "Navigators tools",
"plural": "Navigators tools",
"description": "This set of instruments is used for navigation at sea. Proficiency with navigators tools lets you chart a ships course and follow navigation charts. In addition, these tools allow you to add your proficiency bonus to any ability check you make to avoid getting lost at sea.",
"value": 25,
"weight": 2
},
{
"name": "Thieves tools",
"plural": "Thieves tools",
"description": "This set of tools includes a small file, a set of lock picks, a small mirror mounted on a metal handle, a set of narrow-bladed scissors, and a pair of pliers. Proficiency with these tools lets you add your proficiency bonus to any ability checks you make to disarm traps or open locks.",
"value": 25,
"weight": 1
},
{
"name": "Poisoner's Kit",
"plural": "Poisoner's Kits",
"description": "A poisoners kit includes the vials, chemicals, and other equipment necessary for the creation of poisons. Proficiency with this kit lets you add your proficiency bonus to any ability checks you make to craft or use poisons.",
"value": 50,
"weight": 2
}
]

View File

@@ -46,3 +46,4 @@ templates:array
ecmascript@0.6.1
es5-shim@4.6.15
differential:vulcanize
reactive-dict

View File

@@ -2,6 +2,22 @@
background-color: #e4e4e4;
}
.item-library-dialog .paper-font-subhead {
color: rgba(0,0,0,0.54);
.item-library-dialog .category-header {
font-size: 16px;
}
.item-library-dialog .category-header iron-icon {
transition: transform 0.3s ease;
}
.item-library-dialog .category-header iron-icon.open {
transform: rotate(90deg);
}
.item-library-dialog table {
border-collapse: collapse;
}
.item-library-dialog .library-item td {
position: relative;
}

View File

@@ -10,32 +10,46 @@
</paper-input>
</app-toolbar>
<div class="flex scroll-y">
{{#if ready}}
<div class="items" style="padding:8px">
{{#if searchTerm}}
{{#if searchItems.count}}
{{#each item in searchItems}}
{{>libraryItem item=item selected=(isSelected item)}}
{{/each}}
{{else}}
<div class="items" style="padding:8px">
{{#if searchTerm}}
{{#if searchItems.count}}
<table style="width: 100%">
<tbody>
{{#each item in searchItems}}
{{>libraryItem item=item selected=(isSelected item)}}
{{/each}}
</tbody>
</table>
{{else}}{{#if searchReady}}
No items match "{{searchTerm}}"
{{/if}}
{{else}}
{{#each category in categories}}
<div class="paper-font-subhead">
{{category.name}}
</div>
{{#each item in (itemsInCategory category.key)}}
{{>libraryItem item=item selected=(isSelected item)}}
{{/each}}
{{/each}}
{{/if}}
</div>
{{else}}
<div class="fit layout vertical center center-justified">
<paper-spinner active></paper-spinner>
</div>
{{/if}}
{{/if}}{{/if}}
{{#unless searchReady}}
<div class="layout vertical center" style="width: 100%; padding: 16px;">
<paper-spinner active></paper-spinner>
</div>
{{/unless}}
{{else}}
{{#each categories}}
<div class="paper-font-body2 category-header clickable">
<iron-icon icon="chevron-right" class="{{#if isOpen key}}open{{/if}}">
</iron-icon>
{{name}}
</div>
<iron-collapse opened={{isOpen key}}>
<table style="width: 100%">
<tbody>
{{#each item in (itemsInCategory key)}}
{{>libraryItem item=item selected=(isSelected item)}}
{{/each}}
</tbody>
</table>
{{#unless ready key}}
<paper-spinner active></paper-spinner>
{{/unless}}
</iron-collapse>
{{/each}}
{{/if}}
</div>
</div>
<div class="layout horizontal end-justified">
<paper-button class="cancelButton">Cancel</paper-button>
@@ -45,10 +59,18 @@
</template>
<template name="libraryItem">
<div class="item library-item layout horizontal center {{#if selected}}selected{{/if}}">
<paper-ripple></paper-ripple>
<div class="itemName flex">
<tr class="item library-item {{#if selected}}selected{{/if}}">
<td class="itemName">
{{item.name}}
</div>
</div>
<paper-ripple></paper-ripple>
</td>
<td>
{{item.weight}} lb.
<paper-ripple></paper-ripple>
</td>
<td>
{{valueString item.value}}
<paper-ripple></paper-ripple>
</td>
</tr>
</template>

View File

@@ -1,41 +1,74 @@
const librarySubs = new SubsManager();
const categories = [
{name: "Weapons", key: "weapons"},
{name: "Armor", key: "armor"},
{name: "Adventuring Gear", key: "adventuringGear"},
{name: "Tools", key: "tools"},
];
Template.itemLibraryDialog.onCreated(function(){
this.selectedItem = new ReactiveVar();
this.searchTerm = new ReactiveVar();
this.ready = new ReactiveVar();
this.categoriesOpen = new ReactiveVar([]);
this.readyDict = new ReactiveDict();
this.searchReady = new ReactiveVar();
librarySubs.subscribe("standardLibraries");
this.autorun(() => {
var handle = librarySubs.subscribe("standardLibraries");
this.ready.set(handle.ready());
// Subscribe to all open categories
_.each(this.categoriesOpen.get(), (key) => {
var handle = librarySubs.subscribe("standardLibraryItems", key);
this.autorun(() => {
this.readyDict.set(key, handle.ready());
});
});
});
this.autorun(() => {
// If we are searching, subscibe to all categories
if (this.searchTerm.get()){
let handles = _.map(categories, category =>
librarySubs.subscribe("standardLibraryItems", category.key)
);
// Ready when all handles are ready
this.autorun(() => {
this.searchReady.set(_.every(handles, h => h.ready()));
});
}
});
});
Template.itemLibraryDialog.helpers({
ready(){
return Template.instance().ready.get();
ready(key){
return Template.instance().readyDict.get(key);
},
categories(){
return [
{name: "Weapons", key: "weapons"},
{name: "Armor", key: "armor"},
{name: "Adventuring Gear", key: "adventuringGear"},
];
return categories;
},
itemsInCategory(categoryKey){
return LibraryItems.find({
library: "SRDLibraryGA3XWsd",
"settings.category": categoryKey,
}, {
sort: {name: 1},
});
},
isSelected(item){
const selected = Template.instance().selectedItem.get();
return selected && selected._id === item._id;
},
isOpen(key){
const cats = Template.instance().categoriesOpen.get();
return _.contains(cats, key);
},
searchTerm(){
return Template.instance().searchTerm.get();
},
searchReady(){
return Template.instance().searchReady.get();
},
searchItems(){
const searchTerm = Template.instance().searchTerm.get();
if (!searchTerm) return;
return LibraryItems.find({
library: "SRDLibraryGA3XWsd",
name: {
@@ -58,6 +91,17 @@ Template.itemLibraryDialog.events({
"click #backButton": function(event, template){
popDialogStack();
},
"click .category-header": function(event, template){
let cats = template.categoriesOpen.get();
const key = this.key;
// Toggle whether this key is in the array or not
if (_.contains(cats, key)){
cats = _.without(cats, key);
} else {
cats.push(key);
}
template.categoriesOpen.set(cats);
},
"input .search-input, change .search-input": function(event, template){
const value = event.currentTarget.value;
template.searchTerm.set(value);

View File

@@ -7,10 +7,6 @@
display: initial !important;
}
#navPanel {
padding: 16px;
}
#navPanel paper-icon-item {
background: white;
cursor: pointer;

View File

@@ -8,6 +8,7 @@
"/components/app-layout/app-scroll-effects/effects/parallax-background.html",
"/components/app-layout/app-scroll-effects/effects/resize-title.html",
"/components/iron-collapse/iron-collapse.html",
"/components/iron-icon/iron-icon.html",
"/components/iron-icons/av-icons.html",
"/components/iron-icons/editor-icons.html",

View File

@@ -1,9 +1,16 @@
const standardLibraryIds = [
"SRDLibraryGA3XWsd",
];
Meteor.publish("standardLibraries", function(){
const standardLibraryIds = [
"SRDLibraryGA3XWsd",
];
return [
LibraryItems.find({library: {$in: standardLibraryIds}}),
Libraries.find({_id: {$in: standardLibraryIds}}),
];
return Libraries.find({_id: {$in: standardLibraryIds}});
});
Meteor.publish("standardLibraryItems", function(categoryKey){
return LibraryItems.find({
library: {$in: standardLibraryIds},
"settings.category": categoryKey,
}, {
sort: {name: 1},
});
});