rename /rpg-docs to /app
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
.spell-library-dialog .category-header {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.spell-library-dialog .category-header iron-icon {
|
||||
transition: transform 0.3s ease;
|
||||
}
|
||||
|
||||
.spell-library-dialog .category-header iron-icon.open {
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
<template name="spellLibraryDialog">
|
||||
<div class="fit spell-library-dialog layout vertical">
|
||||
<app-toolbar class="app-grey white-text">
|
||||
<paper-icon-button id="backButton"
|
||||
icon="arrow-back">
|
||||
</paper-icon-button>
|
||||
<div main-title>Spells</div>
|
||||
<paper-input label="Search" class="search-input">
|
||||
<iron-icon icon="search" prefix></iron-icon>
|
||||
</paper-input>
|
||||
</app-toolbar>
|
||||
<div class="flex scroll-y">
|
||||
<div class="spells" style="padding:8px">
|
||||
{{#if searchTerm}}
|
||||
{{#if searchSpells.count}}
|
||||
<div>
|
||||
{{#each spell in searchSpells}}
|
||||
{{>librarySpell spell=spell selected=(isSelected spell)}}
|
||||
{{/each}}
|
||||
</div>
|
||||
{{else}}{{#if searchReady}}
|
||||
<p>
|
||||
No spells match "{{searchTerm}}"
|
||||
</p>
|
||||
<p class="paper-font-caption">
|
||||
DiceCloud only includes content provided by Wizards of the Coast in the official system reference document. If the spell you are looking for is not available in the system reference document, you will need to add it manually.
|
||||
</p>
|
||||
{{/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}}>
|
||||
<div>
|
||||
{{#each spell in (spellsInCategory key)}}
|
||||
{{>librarySpell spell=spell selected=(isSelected spell)}}
|
||||
{{/each}}
|
||||
</div>
|
||||
{{#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>
|
||||
<paper-button class="okButton">OK</paper-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<template name="librarySpell">
|
||||
<div style="margin: ">
|
||||
<paper-checkbox class="spell library-spell" checked={{selected}} style="padding: 2px 0 2px 16px; width: 100%;">
|
||||
{{spell.name}}
|
||||
<paper-ripple></paper-ripple>
|
||||
</paper-checkbox>
|
||||
</div>
|
||||
</template>
|
||||
@@ -0,0 +1,135 @@
|
||||
const librarySubs = new SubsManager();
|
||||
|
||||
const categories = [
|
||||
{name: "Cantrips", key: 0},
|
||||
{name: "Level 1", key: 1},
|
||||
{name: "Level 2", key: 2},
|
||||
{name: "Level 3", key: 3},
|
||||
{name: "Level 4", key: 4},
|
||||
{name: "Level 5", key: 5},
|
||||
{name: "Level 6", key: 6},
|
||||
{name: "Level 7", key: 7},
|
||||
{name: "Level 8", key: 8},
|
||||
{name: "Level 9", key: 9},
|
||||
];
|
||||
|
||||
Template.spellLibraryDialog.onCreated(function(){
|
||||
this.selectedSpells = new ReactiveVar([]); //this holds an array of the selected spells by ID
|
||||
this.searchTerm = new ReactiveVar();
|
||||
this.categoriesOpen = new ReactiveVar([]);
|
||||
this.readyDict = new ReactiveDict();
|
||||
this.searchReady = new ReactiveVar();
|
||||
librarySubs.subscribe("standardLibraries");
|
||||
this.autorun(() => {
|
||||
// Subscribe to all open categories
|
||||
_.each(this.categoriesOpen.get(), (key) => {
|
||||
var handle = librarySubs.subscribe("standardLibrarySpells", 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("standardLibrarySpells", category.key)
|
||||
);
|
||||
// Ready when all handles are ready
|
||||
this.autorun(() => {
|
||||
this.searchReady.set(_.every(handles, h => h.ready()));
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
Template.spellLibraryDialog.helpers({
|
||||
ready(key){
|
||||
return Template.instance().readyDict.get(key);
|
||||
},
|
||||
categories(){
|
||||
return categories;
|
||||
},
|
||||
spellsInCategory(categoryKey){
|
||||
return LibrarySpells.find({
|
||||
library: "SRDLibraryGA3XWsd",
|
||||
level: categoryKey,
|
||||
}, {
|
||||
sort: {name: 1},
|
||||
});
|
||||
},
|
||||
isSelected(spell){
|
||||
const selected = Template.instance().selectedSpells.get();
|
||||
return _.contains(selected, spell._id);
|
||||
},
|
||||
selectedCount(){
|
||||
const selected = Template.instance().selectedSpells.get();
|
||||
return selected && selected.length;
|
||||
},
|
||||
isOpen(key){
|
||||
const cats = Template.instance().categoriesOpen.get();
|
||||
return _.contains(cats, key);
|
||||
},
|
||||
searchTerm(){
|
||||
return Template.instance().searchTerm.get();
|
||||
},
|
||||
searchReady(){
|
||||
return Template.instance().searchReady.get();
|
||||
},
|
||||
searchSpells(){
|
||||
const searchTerm = Template.instance().searchTerm.get();
|
||||
if (!searchTerm) return;
|
||||
return LibrarySpells.find({
|
||||
library: "SRDLibraryGA3XWsd",
|
||||
name: {
|
||||
$regex: new RegExp(".*" + searchTerm + ".*", "gi")
|
||||
},
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
Template.spellLibraryDialog.events({
|
||||
"click .cancelButton": function(event, template){
|
||||
popDialogStack();
|
||||
},
|
||||
"click .okButton": function(event, template){
|
||||
const selectedIds = template.selectedSpells.get();
|
||||
var returnSpells = [];
|
||||
_.each(selectedIds, (id) => {
|
||||
let spell = LibrarySpells.findOne(id);
|
||||
if (spell) {
|
||||
returnSpells.push(spell)
|
||||
}
|
||||
});
|
||||
popDialogStack(returnSpells);
|
||||
},
|
||||
"click .library-spell": function(event, template){
|
||||
let selected = template.selectedSpells.get();
|
||||
const spellId = this.spell._id;
|
||||
// Toggle whether this spellId is in the array or not
|
||||
if (_.contains(selected, spellId)){
|
||||
selected = _.without(selected, spellId);
|
||||
} else {
|
||||
selected.push(spellId);
|
||||
}
|
||||
template.selectedSpells.set(selected);
|
||||
},
|
||||
"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);
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user