Compare commits
52 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2fbc54fee8 | ||
|
|
a064ae3fe8 | ||
|
|
ba9b518d7e | ||
|
|
2f729070b2 | ||
|
|
7aedb9451c | ||
|
|
c6886dd49e | ||
|
|
038ce490e4 | ||
|
|
52bef57637 | ||
|
|
29e9f8c8dc | ||
|
|
fea02811ff | ||
|
|
73cee52fff | ||
|
|
b58c006ed4 | ||
|
|
ef44f6c1a5 | ||
|
|
f455cea43f | ||
|
|
e4083bc744 | ||
|
|
baffafb62a | ||
|
|
4143929667 | ||
|
|
18286d1b9c | ||
|
|
9f51567162 | ||
|
|
66d8a3bfbf | ||
|
|
a9648c10cc | ||
|
|
679292373c | ||
|
|
ae416458b5 | ||
|
|
0ff4a887ea | ||
|
|
955794b5c0 | ||
|
|
b0ac1dcc29 | ||
|
|
83150bc527 | ||
|
|
061f1fd0a5 | ||
|
|
e40dd196e6 | ||
|
|
5dbb59ef80 | ||
|
|
49e25d7304 | ||
|
|
85df0257e2 | ||
|
|
b88bb95928 | ||
|
|
2122e543d5 | ||
|
|
a71519aaa7 | ||
|
|
2404845d51 | ||
|
|
bf032bcdf3 | ||
|
|
ff8ae89722 | ||
|
|
80ca7307ce | ||
|
|
a539b0bc6c | ||
|
|
c6b3cad9c8 | ||
|
|
95b7b66390 | ||
|
|
43c4122fe3 | ||
|
|
3f4dcc146a | ||
|
|
e4600decd0 | ||
|
|
f6df716870 | ||
|
|
b99da301cd | ||
|
|
0a01885300 | ||
|
|
5cb1515235 | ||
|
|
7430c2c795 | ||
|
|
39f7548b8d | ||
|
|
c4a8c4b7ba |
@@ -16,7 +16,14 @@ differential:vulcanize
|
|||||||
matb33:collection-hooks
|
matb33:collection-hooks
|
||||||
zimme:collection-softremovable
|
zimme:collection-softremovable
|
||||||
momentjs:moment
|
momentjs:moment
|
||||||
mike:mocha
|
|
||||||
dburles:mongo-collection-instances
|
dburles:mongo-collection-instances
|
||||||
percolate:migrations
|
percolate:migrations
|
||||||
ecwyne:mathjs
|
ecwyne:mathjs
|
||||||
|
useraccounts:polymer
|
||||||
|
accounts-google
|
||||||
|
splendido:accounts-meld
|
||||||
|
email
|
||||||
|
fourseven:scss@2.1.1
|
||||||
|
wolves:bourbon
|
||||||
|
meteorhacks:subs-manager
|
||||||
|
meteorhacks:kadira
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
accounts-base@1.2.0
|
accounts-base@1.2.0
|
||||||
|
accounts-google@1.0.4
|
||||||
|
accounts-oauth@1.1.5
|
||||||
accounts-password@1.1.1
|
accounts-password@1.1.1
|
||||||
accounts-ui@1.1.5
|
accounts-ui@1.1.5
|
||||||
accounts-ui-unstyled@1.1.7
|
accounts-ui-unstyled@1.1.7
|
||||||
aldeed:collection2@2.3.3
|
aldeed:collection2@2.3.3
|
||||||
aldeed:simple-schema@1.3.2
|
aldeed:simple-schema@1.3.3
|
||||||
amplify@1.0.0
|
|
||||||
autoupdate@1.2.1
|
autoupdate@1.2.1
|
||||||
base64@1.0.3
|
base64@1.0.3
|
||||||
binary-heap@1.0.3
|
binary-heap@1.0.3
|
||||||
@@ -23,7 +24,9 @@ ecwyne:mathjs@0.25.0
|
|||||||
ejson@1.0.6
|
ejson@1.0.6
|
||||||
email@1.0.6
|
email@1.0.6
|
||||||
fastclick@1.0.3
|
fastclick@1.0.3
|
||||||
|
fourseven:scss@2.1.1
|
||||||
geojson-utils@1.0.3
|
geojson-utils@1.0.3
|
||||||
|
google@1.1.5
|
||||||
html-tools@1.0.4
|
html-tools@1.0.4
|
||||||
htmljs@1.0.4
|
htmljs@1.0.4
|
||||||
http@1.1.0
|
http@1.1.0
|
||||||
@@ -44,48 +47,48 @@ less@1.0.14
|
|||||||
livedata@1.0.13
|
livedata@1.0.13
|
||||||
localstorage@1.0.3
|
localstorage@1.0.3
|
||||||
logging@1.0.7
|
logging@1.0.7
|
||||||
matb33:collection-hooks@0.7.11
|
matb33:collection-hooks@0.7.13
|
||||||
meteor@1.1.6
|
meteor@1.1.6
|
||||||
meteor-platform@1.2.2
|
meteor-platform@1.2.2
|
||||||
mike:mocha@0.5.3
|
meteorhacks:kadira@2.21.0
|
||||||
|
meteorhacks:meteorx@1.3.1
|
||||||
|
meteorhacks:subs-manager@1.3.0
|
||||||
minifiers@1.1.5
|
minifiers@1.1.5
|
||||||
minimongo@1.0.8
|
minimongo@1.0.8
|
||||||
mobile-status-bar@1.0.3
|
mobile-status-bar@1.0.3
|
||||||
momentjs:moment@2.10.3
|
momentjs:moment@2.10.3
|
||||||
mongo@1.1.0
|
mongo@1.1.0
|
||||||
|
mongo-livedata@1.0.8
|
||||||
npm-bcrypt@0.7.8_2
|
npm-bcrypt@0.7.8_2
|
||||||
|
oauth@1.1.4
|
||||||
|
oauth2@1.1.3
|
||||||
observe-sequence@1.0.6
|
observe-sequence@1.0.6
|
||||||
ordered-dict@1.0.3
|
ordered-dict@1.0.3
|
||||||
package-version-parser@3.0.3
|
percolate:migrations@0.7.5
|
||||||
percolate:migrations@0.7.3
|
|
||||||
practicalmeteor:chai@1.9.2_3
|
|
||||||
practicalmeteor:loglevel@1.1.0_3
|
|
||||||
random@1.0.3
|
random@1.0.3
|
||||||
reactive-dict@1.1.0
|
reactive-dict@1.1.0
|
||||||
reactive-var@1.0.5
|
reactive-var@1.0.5
|
||||||
reload@1.1.3
|
reload@1.1.3
|
||||||
retry@1.0.3
|
retry@1.0.3
|
||||||
routepolicy@1.0.5
|
routepolicy@1.0.5
|
||||||
sanjo:long-running-child-process@1.0.3
|
|
||||||
sanjo:meteor-files-helpers@1.1.0_4
|
|
||||||
sanjo:meteor-version@1.0.0
|
|
||||||
service-configuration@1.0.4
|
service-configuration@1.0.4
|
||||||
session@1.1.0
|
session@1.1.0
|
||||||
sha@1.0.3
|
sha@1.0.3
|
||||||
|
softwarerero:accounts-t9n@1.0.9
|
||||||
spacebars@1.0.6
|
spacebars@1.0.6
|
||||||
spacebars-compiler@1.0.6
|
spacebars-compiler@1.0.6
|
||||||
|
splendido:accounts-emails-field@1.2.0
|
||||||
|
splendido:accounts-meld@1.3.0
|
||||||
srp@1.0.3
|
srp@1.0.3
|
||||||
templating@1.1.1
|
templating@1.1.1
|
||||||
tracker@1.0.7
|
tracker@1.0.7
|
||||||
ui@1.0.6
|
ui@1.0.6
|
||||||
underscore@1.0.3
|
underscore@1.0.3
|
||||||
url@1.0.4
|
url@1.0.4
|
||||||
velocity:chokidar@0.12.6_1
|
useraccounts:core@1.9.1
|
||||||
velocity:core@0.6.0
|
useraccounts:polymer@1.9.1
|
||||||
velocity:html-reporter@0.5.3
|
|
||||||
velocity:meteor-internals@1.1.0_7
|
|
||||||
velocity:shim@0.1.0
|
|
||||||
webapp@1.2.0
|
webapp@1.2.0
|
||||||
webapp-hashing@1.0.3
|
webapp-hashing@1.0.3
|
||||||
|
wolves:bourbon@1.0.0
|
||||||
zimme:collection-behaviours@1.0.4
|
zimme:collection-behaviours@1.0.4
|
||||||
zimme:collection-softremovable@1.0.4
|
zimme:collection-softremovable@1.0.4
|
||||||
|
|||||||
@@ -24,18 +24,12 @@ Schemas.Attack = new SimpleSchema({
|
|||||||
optional: true,
|
optional: true,
|
||||||
trim: false,
|
trim: false,
|
||||||
},
|
},
|
||||||
damageBonus: {
|
damage: {
|
||||||
type: String,
|
type: String,
|
||||||
defaultValue: "strengthMod",
|
defaultValue: "1d8 + {strengthMod}",
|
||||||
optional: true,
|
optional: true,
|
||||||
trim: false,
|
trim: false,
|
||||||
},
|
},
|
||||||
damageDice: {
|
|
||||||
type: String,
|
|
||||||
optional: true,
|
|
||||||
defaultValue: "1d8",
|
|
||||||
allowedValues: DAMAGE_DICE,
|
|
||||||
},
|
|
||||||
damageType: {
|
damageType: {
|
||||||
type: String,
|
type: String,
|
||||||
allowedValues: [
|
allowedValues: [
|
||||||
|
|||||||
@@ -1,28 +1,51 @@
|
|||||||
Buffs = new Mongo.Collection("buffs");
|
Buffs = new Mongo.Collection("buffs");
|
||||||
|
|
||||||
//buffs are temporary once applied and store things which expire and their expiry time
|
|
||||||
Schemas.Buff = new SimpleSchema({
|
Schemas.Buff = new SimpleSchema({
|
||||||
//buff id
|
|
||||||
_id: {
|
|
||||||
type: String,
|
|
||||||
regEx: SimpleSchema.RegEx.Id,
|
|
||||||
autoValue: function(){
|
|
||||||
if (!this.isSet) return Random.id();
|
|
||||||
},
|
|
||||||
},
|
|
||||||
charId: {
|
charId: {
|
||||||
type: String,
|
type: String,
|
||||||
regEx: SimpleSchema.RegEx.Id,
|
regEx: SimpleSchema.RegEx.Id,
|
||||||
},
|
},
|
||||||
//expiry time
|
name: {
|
||||||
expiry: {type: Number, optional: true},
|
type: String,
|
||||||
duration: {type: Number},
|
trim: false,
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
type: String,
|
||||||
|
optional: true,
|
||||||
|
trim: false,
|
||||||
|
},
|
||||||
|
enabled: {
|
||||||
|
type: Boolean,
|
||||||
|
defaultValue: true,
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
allowedValues: [
|
||||||
|
"inate",
|
||||||
|
"custom",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
"lifeTime.total": {
|
||||||
|
type: Number,
|
||||||
|
defaultValue: 0, //0 is infinite
|
||||||
|
min: 0,
|
||||||
|
},
|
||||||
|
"lifeTime.spent": {
|
||||||
|
type: Number,
|
||||||
|
defaultValue: 0,
|
||||||
|
min: 0,
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
type: String,
|
||||||
|
allowedValues: _.pluck(colorOptions, "key"),
|
||||||
|
defaultValue: "q",
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Buffs.attachSchema(Schemas.Buff);
|
Buffs.attachSchema(Schemas.Buff);
|
||||||
|
|
||||||
Buffs.attachBehaviour("softRemovable");
|
Buffs.attachBehaviour("softRemovable");
|
||||||
makeParent(Buffs, "name"); //parents of effects and attacks
|
makeParent(Buffs, ["name", "enabled"]); //parents of effects
|
||||||
|
|
||||||
Buffs.allow(CHARACTER_SUBSCHEMA_ALLOW);
|
Buffs.allow(CHARACTER_SUBSCHEMA_ALLOW);
|
||||||
Buffs.deny(CHARACTER_SUBSCHEMA_DENY);
|
Buffs.deny(CHARACTER_SUBSCHEMA_DENY);
|
||||||
|
|||||||
@@ -168,21 +168,56 @@ Schemas.Character = new SimpleSchema({
|
|||||||
defaultValue: "q",
|
defaultValue: "q",
|
||||||
},
|
},
|
||||||
//TODO add per-character settings
|
//TODO add per-character settings
|
||||||
"settings.experiencesInc": {type: Number, defaultValue: 20}, //how many experiences to load at a time in XP table
|
//how many experiences to load at a time in XP table
|
||||||
|
"settings.experiencesInc": {type: Number, defaultValue: 20},
|
||||||
|
//slowed down by carrying too much?
|
||||||
|
"settings.useVariantEncumbrance": {type: Boolean, defaultValue: false},
|
||||||
|
"settings.useStandardEncumbrance": {type: Boolean, defaultValue: true},
|
||||||
});
|
});
|
||||||
|
|
||||||
Characters.attachSchema(Schemas.Character);
|
Characters.attachSchema(Schemas.Character);
|
||||||
|
|
||||||
var attributeBase = function(charId, statName){
|
var attributeBase = function(charId, statName){
|
||||||
check(statName, String);
|
check(statName, String);
|
||||||
|
//if it's a damage multiplier, we treat it specially
|
||||||
|
if (_.contains(DAMAGE_MULTIPLIERS, statName)){
|
||||||
var effects = Effects.find(
|
var effects = Effects.find(
|
||||||
{charId: charId, stat: statName, enabled: true}
|
{charId: charId, stat: statName, enabled: true, operation: "mul"}
|
||||||
).fetch();
|
).fetch();
|
||||||
effects = _.groupBy(effects, "operation");
|
var resistCount = 0;
|
||||||
var value = _.contains(DAMAGE_MULTIPLIERS, statName) ? 1 : 0;
|
var vulnCount = 0;
|
||||||
|
var multiplierEvaluationFail = false;
|
||||||
|
_.each(effects, function(effect){
|
||||||
|
var val = evaluateEffect(charId, effect);
|
||||||
|
if (val === 0.5){ //resistance
|
||||||
|
resistCount += 1;
|
||||||
|
} else if (val === 2){ //vulnerability
|
||||||
|
vulnCount += 1;
|
||||||
|
} else if (val === 0){ //imunity
|
||||||
|
return 0; //imunity is absolute
|
||||||
|
} else {
|
||||||
|
multiplierEvaluationFail = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (multiplierEvaluationFail){
|
||||||
|
//we can't work it out correctly, set the value to 1
|
||||||
|
//and try work it out using regular maths below
|
||||||
|
value = 1;
|
||||||
|
} else if (resistCount && !vulnCount){
|
||||||
|
return 0.5;
|
||||||
|
} else if (!resistCount && vulnCount){
|
||||||
|
return 2;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var value = 0;
|
||||||
|
|
||||||
//start with the highest base value
|
//start with the highest base value
|
||||||
_.each(effects.base, function(effect){
|
Effects.find(
|
||||||
|
{charId: charId, stat: statName, enabled: true, operation: "base"}
|
||||||
|
).forEach(function(effect){
|
||||||
var efv = evaluateEffect(charId, effect);
|
var efv = evaluateEffect(charId, effect);
|
||||||
if (efv > value){
|
if (efv > value){
|
||||||
value = efv;
|
value = efv;
|
||||||
@@ -190,23 +225,31 @@ var attributeBase = function(charId, statName){
|
|||||||
});
|
});
|
||||||
|
|
||||||
//add all the add values
|
//add all the add values
|
||||||
_.each(effects.add, function(effect){
|
Effects.find(
|
||||||
|
{charId: charId, stat: statName, enabled: true, operation: "add"}
|
||||||
|
).forEach(function(effect){
|
||||||
value += evaluateEffect(charId, effect);
|
value += evaluateEffect(charId, effect);
|
||||||
});
|
});
|
||||||
|
|
||||||
//multiply all the mul values
|
//multiply all the mul values
|
||||||
_.each(effects.mul, function(effect){
|
Effects.find(
|
||||||
|
{charId: charId, stat: statName, enabled: true, operation: "mul"}
|
||||||
|
).forEach(function(effect){
|
||||||
value *= evaluateEffect(charId, effect);
|
value *= evaluateEffect(charId, effect);
|
||||||
});
|
});
|
||||||
|
|
||||||
//ensure value is >= all mins
|
//ensure value is >= all mins
|
||||||
_.each(effects.min, function(effect){
|
Effects.find(
|
||||||
|
{charId: charId, stat: statName, enabled: true, operation: "min"}
|
||||||
|
).forEach(function(effect){
|
||||||
var min = evaluateEffect(charId, effect);
|
var min = evaluateEffect(charId, effect);
|
||||||
value = value > min ? value : min;
|
value = value > min ? value : min;
|
||||||
});
|
});
|
||||||
|
|
||||||
//ensure value is <= all maxes
|
//ensure value is <= all maxes
|
||||||
_.each(effects.max, function(effect){
|
Effects.find(
|
||||||
|
{charId: charId, stat: statName, enabled: true, operation: "max"}
|
||||||
|
).forEach(function(effect){
|
||||||
var max = evaluateEffect(charId, effect);
|
var max = evaluateEffect(charId, effect);
|
||||||
value = value < max ? value : max;
|
value = value < max ? value : max;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -61,7 +61,6 @@ Effects.attachSchema(Schemas.Effect);
|
|||||||
if (Meteor.isServer) Characters.after.insert(function(userId, char) {
|
if (Meteor.isServer) Characters.after.insert(function(userId, char) {
|
||||||
Effects.insert({
|
Effects.insert({
|
||||||
charId: char._id,
|
charId: char._id,
|
||||||
type: "inate",
|
|
||||||
name: "Constitution modifier for each level",
|
name: "Constitution modifier for each level",
|
||||||
stat: "hitPoints",
|
stat: "hitPoints",
|
||||||
operation: "add",
|
operation: "add",
|
||||||
@@ -69,11 +68,11 @@ if (Meteor.isServer) Characters.after.insert(function(userId, char) {
|
|||||||
parent: {
|
parent: {
|
||||||
id: char._id,
|
id: char._id,
|
||||||
collection: "Characters",
|
collection: "Characters",
|
||||||
|
group: "Inate",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
Effects.insert({
|
Effects.insert({
|
||||||
charId: char._id,
|
charId: char._id,
|
||||||
type: "inate",
|
|
||||||
name: "Proficiency bonus by level",
|
name: "Proficiency bonus by level",
|
||||||
stat: "proficiencyBonus",
|
stat: "proficiencyBonus",
|
||||||
operation: "add",
|
operation: "add",
|
||||||
@@ -81,11 +80,11 @@ if (Meteor.isServer) Characters.after.insert(function(userId, char) {
|
|||||||
parent: {
|
parent: {
|
||||||
id: char._id,
|
id: char._id,
|
||||||
collection: "Characters",
|
collection: "Characters",
|
||||||
|
group: "Inate",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
Effects.insert({
|
Effects.insert({
|
||||||
charId: char._id,
|
charId: char._id,
|
||||||
type: "inate",
|
|
||||||
name: "Dexterity Armor Bonus",
|
name: "Dexterity Armor Bonus",
|
||||||
stat: "armor",
|
stat: "armor",
|
||||||
operation: "add",
|
operation: "add",
|
||||||
@@ -93,11 +92,11 @@ if (Meteor.isServer) Characters.after.insert(function(userId, char) {
|
|||||||
parent: {
|
parent: {
|
||||||
id: char._id,
|
id: char._id,
|
||||||
collection: "Characters",
|
collection: "Characters",
|
||||||
|
group: "Inate",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
Effects.insert({
|
Effects.insert({
|
||||||
charId: char._id,
|
charId: char._id,
|
||||||
type: "inate",
|
|
||||||
name: "Natural Armor",
|
name: "Natural Armor",
|
||||||
stat: "armor",
|
stat: "armor",
|
||||||
operation: "base",
|
operation: "base",
|
||||||
@@ -105,6 +104,7 @@ if (Meteor.isServer) Characters.after.insert(function(userId, char) {
|
|||||||
parent: {
|
parent: {
|
||||||
id: char._id,
|
id: char._id,
|
||||||
collection: "Characters",
|
collection: "Characters",
|
||||||
|
group: "Inate",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ Schemas.Item = new SimpleSchema({
|
|||||||
value: {type: Number, min: 0, defaultValue: 0, decimal: true},
|
value: {type: Number, min: 0, defaultValue: 0, decimal: true},
|
||||||
enabled: {type: Boolean, defaultValue: false},
|
enabled: {type: Boolean, defaultValue: false},
|
||||||
requiresAttunement: {type: Boolean, defaultValue: false},
|
requiresAttunement: {type: Boolean, defaultValue: false},
|
||||||
|
"settings.showIncrement": {type: Boolean, defaultValue: false},
|
||||||
color: {
|
color: {
|
||||||
type: String,
|
type: String,
|
||||||
allowedValues: _.pluck(colorOptions, "key"),
|
allowedValues: _.pluck(colorOptions, "key"),
|
||||||
@@ -19,6 +20,156 @@ Schemas.Item = new SimpleSchema({
|
|||||||
|
|
||||||
Items.attachSchema(Schemas.Item);
|
Items.attachSchema(Schemas.Item);
|
||||||
|
|
||||||
|
var checkMovePermission = function(itemId, parent) {
|
||||||
|
var item = Items.findOne(itemId);
|
||||||
|
if (!item)
|
||||||
|
throw new Meteor.Error("No such item",
|
||||||
|
"An item could not be found to move");
|
||||||
|
//handle permissions
|
||||||
|
var permission = Meteor.call("canWriteCharacter", item.charId);
|
||||||
|
if (!permission){
|
||||||
|
throw new Meteor.Error("Access denied",
|
||||||
|
"Not permitted to move items from this character");
|
||||||
|
}
|
||||||
|
if (parent.collection === "Characters"){
|
||||||
|
permission = Meteor.call("canWriteCharacter", parent.id);
|
||||||
|
if (!permission){
|
||||||
|
throw new Meteor.Error("Access denied",
|
||||||
|
"Not permitted to move items to this character");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var parentCollectionObject = global[parent.collection];
|
||||||
|
var parentObject = null;
|
||||||
|
if (parentCollectionObject)
|
||||||
|
parentObject = parentCollectionObject.findOne(
|
||||||
|
parent.id, {fields: {_id: 1, charId: 1}}
|
||||||
|
);
|
||||||
|
if (!parentObject) throw new Meteor.Error(
|
||||||
|
"Invalid parent",
|
||||||
|
"The destination parent " + parent.id +
|
||||||
|
" does not exist in the collection " + parent.collection
|
||||||
|
);
|
||||||
|
if (parentObject.charId){
|
||||||
|
permission = Meteor.call("canWriteCharacter", parentObject.charId);
|
||||||
|
if (!permission){
|
||||||
|
throw new Meteor.Error("Access denied",
|
||||||
|
"Not permitted to move items to this character");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var moveItem = function(itemId, enable, parentCollection, parentId) {
|
||||||
|
var item = Items.findOne(itemId);
|
||||||
|
if (!item) return;
|
||||||
|
parentCollection = parentCollection || item.parent.collection;
|
||||||
|
parentId = parentId || item.parent.id;
|
||||||
|
|
||||||
|
if (Meteor.isServer) {
|
||||||
|
checkMovePermission(itemId, {collection: parentCollection, id: parentId});
|
||||||
|
}
|
||||||
|
|
||||||
|
//update the item provided the update will actually change something
|
||||||
|
if (
|
||||||
|
item.parent.collection !== parentCollection ||
|
||||||
|
item.parent.id !== parentId ||
|
||||||
|
item.enabled !== enable
|
||||||
|
){
|
||||||
|
Items.update(
|
||||||
|
itemId,
|
||||||
|
{$set: {
|
||||||
|
"parent.collection": parentCollection,
|
||||||
|
"parent.id": parentId,
|
||||||
|
enabled: enable,
|
||||||
|
}}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Meteor.methods({
|
||||||
|
moveItemToParent: function(itemId, parent) {
|
||||||
|
check(itemId, String);
|
||||||
|
check(parent, {collection: String, id: String});
|
||||||
|
moveItem(itemId, false, parent.collection, parent.id);
|
||||||
|
},
|
||||||
|
moveItemToCharacter: function(itemId, charId) {
|
||||||
|
check(itemId, String);
|
||||||
|
check(charId, String);
|
||||||
|
moveItem(itemId, false, "Characters", charId);
|
||||||
|
},
|
||||||
|
moveItemToContainer: function(itemId, containerId) {
|
||||||
|
check(itemId, String);
|
||||||
|
check(containerId, String);
|
||||||
|
moveItem(itemId, false, "Containers", containerId);
|
||||||
|
},
|
||||||
|
equipItem: function(itemId, charId){
|
||||||
|
check(itemId, String);
|
||||||
|
check(charId, String);
|
||||||
|
moveItem(itemId, true, "Characters", charId);
|
||||||
|
},
|
||||||
|
unequipItem: function(itemId, charId){
|
||||||
|
check(itemId, String);
|
||||||
|
check(charId, String);
|
||||||
|
moveItem(itemId, false, "Characters", charId);
|
||||||
|
},
|
||||||
|
splitItemToParent: function(itemId, moveQuantity, parent){
|
||||||
|
check(itemId, String);
|
||||||
|
check(moveQuantity, Number);
|
||||||
|
check(parent, {id: String, collection: String});
|
||||||
|
|
||||||
|
//get the item
|
||||||
|
var item = Items.findOne(itemId);
|
||||||
|
if (!item) return;
|
||||||
|
|
||||||
|
//don't bother moving nothing
|
||||||
|
if (moveQuantity <= 0 || item.quantity <= 0){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//ensure we are only moving up to the current stack size
|
||||||
|
if (item.quantity < moveQuantity){
|
||||||
|
moveQuantity = this.quantity;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Meteor.isServer) {
|
||||||
|
checkMovePermission(itemId, parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
//create a new item stack
|
||||||
|
var newStack = _.omit(EJSON.clone(item), "_id");
|
||||||
|
newStack.parent = parent;
|
||||||
|
newStack.quantity = moveQuantity;
|
||||||
|
|
||||||
|
//find out if we have an exact replica in the destination
|
||||||
|
var query = _.omit(newStack, ["parent", "quantity"]);
|
||||||
|
query["parent.collection"] = newStack.parent.collection;
|
||||||
|
query["parent.id"] = newStack.parent.id;
|
||||||
|
query._id = {$ne: itemId}; //make sure we don't join it to itself
|
||||||
|
var existingStack = Items.findOne(query);
|
||||||
|
if (existingStack){
|
||||||
|
//increase the existing stack's size
|
||||||
|
Items.update(
|
||||||
|
existingStack._id,
|
||||||
|
{$inc: {quantity: moveQuantity}}
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
//insert the new stack
|
||||||
|
Items.insert(newStack, function(err, id){
|
||||||
|
if (err) throw err;
|
||||||
|
//copy the children also
|
||||||
|
Meteor.call("cloneChildren", item._id, {collection: "Items", id: id});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//reduce the old stack's size
|
||||||
|
var oldQuantity = item.quantity - moveQuantity;
|
||||||
|
if (oldQuantity === 0){
|
||||||
|
Items.remove(itemId);
|
||||||
|
} else {
|
||||||
|
Items.update(itemId, {$set: {quantity: oldQuantity}});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
Items.helpers({
|
Items.helpers({
|
||||||
totalValue: function(){
|
totalValue: function(){
|
||||||
return this.value * this.quantity;
|
return this.value * this.quantity;
|
||||||
@@ -33,103 +184,6 @@ Items.helpers({
|
|||||||
return this.name;
|
return this.name;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
equip: function(characterId){
|
|
||||||
var charId = characterId || this.charId;
|
|
||||||
if (!charId || !Characters.findOne(charId)) throw "Invalid character";
|
|
||||||
if (this.parent.collection === "Characters" &&
|
|
||||||
this.parent.id === charId &&
|
|
||||||
this.enabled) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Items.update(
|
|
||||||
this._id,
|
|
||||||
{$set: {
|
|
||||||
"parent.collection": "Characters",
|
|
||||||
"parent.id": charId,
|
|
||||||
enabled: true,
|
|
||||||
}}
|
|
||||||
);
|
|
||||||
},
|
|
||||||
unequip: function(){
|
|
||||||
if (!this.enabled) return;
|
|
||||||
Items.update(this._id, {$set: {enabled: false}});
|
|
||||||
},
|
|
||||||
moveToContainer: function(containerId){
|
|
||||||
if (!containerId || !Containers.findOne(containerId)){
|
|
||||||
throw "Invalid container";
|
|
||||||
}
|
|
||||||
if (this.parent.collection === "Containers" &&
|
|
||||||
this.parent.id === containerId &&
|
|
||||||
!this.enabled) return;
|
|
||||||
Items.update(
|
|
||||||
this._id,
|
|
||||||
{$set: {
|
|
||||||
"parent.collection": "Containers",
|
|
||||||
"parent.id": containerId,
|
|
||||||
enabled: false,
|
|
||||||
}}
|
|
||||||
);
|
|
||||||
},
|
|
||||||
moveToCharacter: function(characterId){
|
|
||||||
if (!characterId || !Characters.findOne(characterId)) {
|
|
||||||
throw "Invalid character";
|
|
||||||
}
|
|
||||||
if (this.parent.collection === "Characters" &&
|
|
||||||
this.parent.id === characterId &&
|
|
||||||
!this.enabled) return;
|
|
||||||
Items.update(
|
|
||||||
this._id,
|
|
||||||
{$set: {
|
|
||||||
"parent.collection": "Characters",
|
|
||||||
"parent.id": characterId,
|
|
||||||
charId: characterId,
|
|
||||||
enabled: false,
|
|
||||||
}}
|
|
||||||
);
|
|
||||||
},
|
|
||||||
splitToParent: function(parent, moveQuantity){
|
|
||||||
check(parent, {id: String, collection: String});
|
|
||||||
check(moveQuantity, Number);
|
|
||||||
var parentCollection = Meteor.isClient ?
|
|
||||||
window[parent.collection] : global[parent.collection];
|
|
||||||
if (!parent.id || !parentCollection.findOne(parent.id)){
|
|
||||||
throw "Invalid parent";
|
|
||||||
}
|
|
||||||
var oldStack = this;
|
|
||||||
//we can only move as much as we have, leaving 0 behind at worst
|
|
||||||
if (oldStack.quantity < moveQuantity) moveQuantity = oldStack.quantity;
|
|
||||||
var oldQuantity = oldStack.quantity - moveQuantity;
|
|
||||||
|
|
||||||
var newStack = _.pick(oldStack, Schemas.Item.objectKeys());
|
|
||||||
newStack.parent = parent;
|
|
||||||
newStack.quantity = moveQuantity;
|
|
||||||
|
|
||||||
var existingStack = Items.findOne(_.omit(newStack, "quantity"));
|
|
||||||
var updateStackSize = function(){
|
|
||||||
if (oldQuantity > 0){
|
|
||||||
Items.update(oldStack._id, {$set: {quantity: oldQuantity}});
|
|
||||||
} else {
|
|
||||||
Items.remove(oldStack._id);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
if (existingStack){
|
|
||||||
Items.update(
|
|
||||||
existingStack._id,
|
|
||||||
{$inc: {quantity: moveQuantity}},
|
|
||||||
{},
|
|
||||||
function(){
|
|
||||||
updateStackSize();
|
|
||||||
}
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
Items.insert(newStack, function(err, id){
|
|
||||||
if (err) throw err;
|
|
||||||
updateStackSize();
|
|
||||||
//copy the children also
|
|
||||||
Meteor.call("cloneChildren", oldStack._id, {collection: "Items", id: id});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Items.before.update(function(userId, doc, fieldNames, modifier, options){
|
Items.before.update(function(userId, doc, fieldNames, modifier, options){
|
||||||
|
|||||||
27
rpg-docs/Model/Meta/ChangeLogs.js
Normal file
27
rpg-docs/Model/Meta/ChangeLogs.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
ChangeLogs = new Mongo.Collection("changeLogs");
|
||||||
|
|
||||||
|
Schemas.ChangeLog = new SimpleSchema({
|
||||||
|
version: {
|
||||||
|
type: String,
|
||||||
|
},
|
||||||
|
changes: {
|
||||||
|
type: [String],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
ChangeLogs.attachSchema(Schemas.ChangeLog);
|
||||||
|
|
||||||
|
ChangeLogs.allow({
|
||||||
|
insert: function(userId, doc) {
|
||||||
|
var user = Meteor.users.findOne(userId);
|
||||||
|
if (user) return _.contains(user.roles, "admin");
|
||||||
|
},
|
||||||
|
update: function(userId, doc, fields, modifier) {
|
||||||
|
var user = Meteor.users.findOne(userId);
|
||||||
|
if (user) return _.contains(user.roles, "admin");
|
||||||
|
},
|
||||||
|
remove: function(userId, doc) {
|
||||||
|
var user = Meteor.users.findOne(userId);
|
||||||
|
if (user) return _.contains(user.roles, "admin");
|
||||||
|
},
|
||||||
|
});
|
||||||
60
rpg-docs/Model/Meta/Reports.js
Normal file
60
rpg-docs/Model/Meta/Reports.js
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
Reports = new Mongo.Collection("reports");
|
||||||
|
|
||||||
|
Schemas.Report = new SimpleSchema({
|
||||||
|
owner: {
|
||||||
|
type: String,
|
||||||
|
regEx: SimpleSchema.RegEx.Id,
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
type: String,
|
||||||
|
trim: false,
|
||||||
|
optional: true,
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
type: String,
|
||||||
|
trim: false,
|
||||||
|
optional: true,
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
allowedValues: ["bug", "change", "feature", "general"],
|
||||||
|
defaultValue: "bug",
|
||||||
|
},
|
||||||
|
//the immediate impact of doing this action (eg. -1 rages)
|
||||||
|
severity: {
|
||||||
|
type: Number,
|
||||||
|
defaultValue: 5,
|
||||||
|
min: 1,
|
||||||
|
max: 10,
|
||||||
|
},
|
||||||
|
metaData: {
|
||||||
|
type: Object,
|
||||||
|
blackbox: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
Reports.attachSchema(Schemas.Report);
|
||||||
|
|
||||||
|
Meteor.methods({
|
||||||
|
insertReport: function(report) {
|
||||||
|
check(report, {
|
||||||
|
title: String,
|
||||||
|
description: String,
|
||||||
|
type: String,
|
||||||
|
severity: Number,
|
||||||
|
metaData: Object,
|
||||||
|
});
|
||||||
|
report.owner = this.userId;
|
||||||
|
Reports.insert(report);
|
||||||
|
},
|
||||||
|
deleteReport: function(id) {
|
||||||
|
var user = Meteor.users.findOne(this.userId);
|
||||||
|
if (!_.contains(user.roles, "admin")){
|
||||||
|
throw new Meteor.Error(
|
||||||
|
"not admin",
|
||||||
|
"The user must be an administrator to delete feedback"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Reports.remove(id);
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -1,44 +1,23 @@
|
|||||||
Schema = {};
|
|
||||||
|
|
||||||
Schema.User = new SimpleSchema({
|
|
||||||
username: {
|
|
||||||
type: String,
|
|
||||||
regEx: /^[a-z0-9A-Z_]{3,15}$/,
|
|
||||||
optional: true,
|
|
||||||
},
|
|
||||||
emails: {
|
|
||||||
type: [Object],
|
|
||||||
// this must be optional if you also use other login services like facebook,
|
|
||||||
// but if you use only accounts-password, then it can be required
|
|
||||||
optional: true,
|
|
||||||
},
|
|
||||||
"emails.$.address": {
|
|
||||||
type: String,
|
|
||||||
regEx: SimpleSchema.RegEx.Email,
|
|
||||||
},
|
|
||||||
"emails.$.verified": {
|
|
||||||
type: Boolean
|
|
||||||
},
|
|
||||||
createdAt: {
|
|
||||||
type: Date
|
|
||||||
},
|
|
||||||
services: {
|
|
||||||
type: Object,
|
|
||||||
optional: true,
|
|
||||||
blackbox: true,
|
|
||||||
},
|
|
||||||
roles: {
|
|
||||||
type: [String],
|
|
||||||
optional: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
Meteor.users.attachSchema(Schema.User);
|
|
||||||
|
|
||||||
Meteor.users.allow({
|
Meteor.users.allow({
|
||||||
update: function(userId, doc, fields, modifier) {
|
update: function(userId, doc, fields, modifier) {
|
||||||
return userId === doc._id &&
|
if (
|
||||||
fields.length === 1 &&
|
doc._id === userId &&
|
||||||
fields[0] === "username";
|
_.contains(fields, "username") &&
|
||||||
|
_.contains(fields, "profile") &&
|
||||||
|
fields.length === 2 &&
|
||||||
|
_.keys(modifier).length === 1 &&
|
||||||
|
modifier.$set &&
|
||||||
|
modifier.$set["profile.username"] &&
|
||||||
|
modifier.$set.username &&
|
||||||
|
_.keys(modifier.$set).length === 2
|
||||||
|
){
|
||||||
|
var expectedUsername = modifier.$set["profile.username"];
|
||||||
|
expectedUsername = expectedUsername.toLowerCase().replace(/\s+/gm, "");
|
||||||
|
if (modifier.$set.username !== expectedUsername){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
var foundUser = Meteor.call("getUserId", expectedUsername);
|
||||||
|
return !foundUser || foundUser === userId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -3,15 +3,35 @@ Router.configure({
|
|||||||
layoutTemplate: "layout",
|
layoutTemplate: "layout",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Router.plugin("ensureSignedIn", {
|
||||||
|
except: [
|
||||||
|
"home",
|
||||||
|
"atSignIn",
|
||||||
|
"atSignUp",
|
||||||
|
"atForgotPassword",
|
||||||
|
"atResetPwd",
|
||||||
|
"atEnrollAccount",
|
||||||
|
"atVerifyEmail",
|
||||||
|
"atResendVerificationEmail",
|
||||||
|
"loginButtons",
|
||||||
|
"notFound",
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
Router.plugin("dataNotFound", {notFoundTemplate: "notFound"});
|
||||||
|
|
||||||
Router.map(function() {
|
Router.map(function() {
|
||||||
this.route("/", {
|
this.route("/", {
|
||||||
name: "home",
|
name: "home",
|
||||||
|
onAfterAction: function() {
|
||||||
|
document.title = appName;
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
this.route("characterList", {
|
this.route("characterList", {
|
||||||
path: "/characterList",
|
path: "/characterList",
|
||||||
waitOn: function(){
|
waitOn: function(){
|
||||||
return Meteor.subscribe("characterList", Meteor.userId());
|
return subsManager.subscribe("characterList", Meteor.userId());
|
||||||
},
|
},
|
||||||
data: {
|
data: {
|
||||||
characters: function(){
|
characters: function(){
|
||||||
@@ -27,13 +47,13 @@ Router.map(function() {
|
|||||||
path: "/character/:_id",
|
path: "/character/:_id",
|
||||||
waitOn: function(){
|
waitOn: function(){
|
||||||
return [
|
return [
|
||||||
Meteor.subscribe("singleCharacter", this.params._id, Meteor.userId()),
|
subsManager.subscribe("singleCharacter", this.params._id, Meteor.userId()),
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
data: function() {
|
data: function() {
|
||||||
var data = Characters.findOne(
|
var data = Characters.findOne(
|
||||||
{_id: this.params._id},
|
{_id: this.params._id},
|
||||||
{fields: {_id: 1, name: 1, color: 1}}
|
{fields: {_id: 1, name: 1, color: 1, writers: 1, readers: 1}}
|
||||||
);
|
);
|
||||||
return data;
|
return data;
|
||||||
},
|
},
|
||||||
@@ -56,4 +76,21 @@ Router.map(function() {
|
|||||||
document.title = appName + " Account";
|
document.title = appName + " Account";
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.route("/changelog", {
|
||||||
|
name: "changeLog",
|
||||||
|
waitOn: function() {
|
||||||
|
return [
|
||||||
|
subsManager.subscribe("changeLog"),
|
||||||
|
]
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
changeLogs: function() {
|
||||||
|
return ChangeLogs.find({}, {sort: {version: -1}});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onAfterAction: function() {
|
||||||
|
document.title = appName;
|
||||||
|
},
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -13,10 +13,9 @@
|
|||||||
"tests"
|
"tests"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"polymer": "Polymer/polymer#~0.5.4",
|
"polymer": "Polymer/polymer#~0.5.5",
|
||||||
"core-elements": "Polymer/core-elements#~0.5.4",
|
"core-elements": "Polymer/core-elements#~0.5.5",
|
||||||
"paper-elements": "Polymer/paper-elements#~0.5.4",
|
"paper-elements": "Polymer/paper-elements#~0.5.5"
|
||||||
"paper-fab-menu": "cwdoh/paper-fab-menu"
|
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"core-component-page": "^0.5.0",
|
"core-component-page": "^0.5.0",
|
||||||
|
|||||||
6
rpg-docs/client/globalHelpers/canEditCharacter.js
Normal file
6
rpg-docs/client/globalHelpers/canEditCharacter.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Template.registerHelper("canEditCharacter", function(charId) {
|
||||||
|
var char = Characters.findOne(charId)
|
||||||
|
var userId = Meteor.userId();
|
||||||
|
return char.owner === userId ||
|
||||||
|
_.contains(char.writers, userId);
|
||||||
|
});
|
||||||
96
rpg-docs/client/style/cards.scss
Normal file
96
rpg-docs/client/style/cards.scss
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
@import "bourbon/bourbon";
|
||||||
|
|
||||||
|
$thickColumnWidth: 304px;
|
||||||
|
$thinColumnWidth: 240px;
|
||||||
|
|
||||||
|
//Column layouts of cards
|
||||||
|
.column-container {
|
||||||
|
@include column-fill(balance);
|
||||||
|
@include column-gap(8px);
|
||||||
|
@include column-width($thickColumnWidth);
|
||||||
|
padding: 8px;
|
||||||
|
|
||||||
|
&.thin-columns {
|
||||||
|
@include column-count(4);
|
||||||
|
@include column-width($thinColumnWidth);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Cards
|
||||||
|
.card {
|
||||||
|
background: white;
|
||||||
|
border-radius: 2px;
|
||||||
|
|
||||||
|
.column-container & {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
width: 100%;
|
||||||
|
//hack to stop flickering
|
||||||
|
-webkit-backface-visibility: hidden;
|
||||||
|
-webkit-transform: translateX(0);
|
||||||
|
//stop breaking over column divide
|
||||||
|
-webkit-column-break-inside: avoid;
|
||||||
|
page-break-inside: avoid;
|
||||||
|
break-inside: avoid;
|
||||||
|
//Fixes extra margin at top of columns
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.top {
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 16px;
|
||||||
|
border-radius: 2px 2px 0 0;
|
||||||
|
&.white {
|
||||||
|
cursor: auto;
|
||||||
|
padding: 16px;
|
||||||
|
border-bottom: rgba(0,0,0,0.12) solid 1px;
|
||||||
|
}
|
||||||
|
paper-checkbox::shadow #ink[checked] {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
paper-checkbox::shadow #ink {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
paper-checkbox::shadow #checkbox.checked {
|
||||||
|
background-color: #ffffff;
|
||||||
|
background-color: rgba(255,255,255,0.27);
|
||||||
|
border-color: #ffffff;
|
||||||
|
border-color: rgba(255,255,255,0.27);
|
||||||
|
}
|
||||||
|
paper-checkbox::shadow #checkbox {
|
||||||
|
border-color: #ffffff;
|
||||||
|
border-color: rgba(255,255,255,0.54);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.bottom {
|
||||||
|
padding: 16px;
|
||||||
|
border-radius: 0 0 2px 2px;
|
||||||
|
&.list {
|
||||||
|
padding: 0 0 16px 0;
|
||||||
|
.subhead {
|
||||||
|
color: rgba(0,0,0,0.54);
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 500;
|
||||||
|
letter-spacing: 0.010em;
|
||||||
|
padding: 12px 16px 12px 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&.text {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.left {
|
||||||
|
padding: 16px;
|
||||||
|
border-radius: 2px 0 0 2px;
|
||||||
|
text-align: center;
|
||||||
|
min-width: 72px;
|
||||||
|
}
|
||||||
|
.right {
|
||||||
|
padding: 16px;
|
||||||
|
border-radius: 0 2px 2px 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* undo pointer cursor on detail box heading */
|
||||||
|
#globalDetail .card .top {
|
||||||
|
cursor: auto;
|
||||||
|
}
|
||||||
37
rpg-docs/client/style/listItem.scss
Normal file
37
rpg-docs/client/style/listItem.scss
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
List items
|
||||||
|
*/
|
||||||
|
.item-slot {
|
||||||
|
background-color: rgb(232, 232, 232);
|
||||||
|
background-color: rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.item {
|
||||||
|
background: white;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 16px;
|
||||||
|
height: 40px;
|
||||||
|
margin: 1px 0 1px 0;
|
||||||
|
padding: 0 16px 0 16px;
|
||||||
|
position: relative;
|
||||||
|
transition: box-shadow 0.3s ease, opacity 0.5s ease-in-out;
|
||||||
|
&.small {
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
&.tall {
|
||||||
|
height: 56px;
|
||||||
|
}
|
||||||
|
&.flexible {
|
||||||
|
height: auto;
|
||||||
|
padding-top: 16px;
|
||||||
|
padding-bottom: 16px;
|
||||||
|
}
|
||||||
|
&[hero], &:active{
|
||||||
|
box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.37);
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
core-icon, paper-icon-button {
|
||||||
|
color: #747474;
|
||||||
|
color: rgba(0,0,0,0.54);
|
||||||
|
}
|
||||||
|
}
|
||||||
74
rpg-docs/client/style/main.scss
Normal file
74
rpg-docs/client/style/main.scss
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
@import "bourbon/bourbon";
|
||||||
|
@import "colors";
|
||||||
|
|
||||||
|
//apply a natural box layout model to all elements
|
||||||
|
*, *:before, *:after {
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
root {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Roboto', 'Helvetica Neue', Helvetica, Arial;
|
||||||
|
margin: 0;
|
||||||
|
overflow-x: hidden;
|
||||||
|
background-color: #E0E0E0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Horizontal rule
|
||||||
|
hr {
|
||||||
|
background-color: #444;
|
||||||
|
opacity: 0.12;
|
||||||
|
border-width: 0;
|
||||||
|
color: #444;
|
||||||
|
height: 1px;
|
||||||
|
line-height: 0;
|
||||||
|
margin: 16px -16px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
//FABs
|
||||||
|
.floatyButton {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 24px;
|
||||||
|
right: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Buttons
|
||||||
|
paper-button {
|
||||||
|
color: #000;
|
||||||
|
color: rgba(0,0,0,0.87);
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
letter-spacing: 0.010;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Style shortcuts
|
||||||
|
.scroll-y {
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.clickable, core-item, paper-tab {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pre-wrap, .prewrap{
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.padded {
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fullwidth {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fab-buffer {
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
20
rpg-docs/client/style/shadowDom.css
Normal file
20
rpg-docs/client/style/shadowDom.css
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
.card .left paper-icon-button {
|
||||||
|
display: block;
|
||||||
|
height: 32px;
|
||||||
|
padding: 0;
|
||||||
|
width: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card .left paper-icon-button[disabled] {
|
||||||
|
color: rgba(255, 255, 255, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.card .left paper-icon-button /deep/ core-icon {
|
||||||
|
height: 32px;
|
||||||
|
width: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*fix paper-dropdowns*/
|
||||||
|
body /deep/ core-menu {
|
||||||
|
overflow-x: hidden !important;
|
||||||
|
}
|
||||||
18
rpg-docs/client/style/tables.scss
Normal file
18
rpg-docs/client/style/tables.scss
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
td {
|
||||||
|
padding: 8px;
|
||||||
|
&:nth-child(1) {
|
||||||
|
min-width: 100px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.strengthTable{
|
||||||
|
width: 100%;
|
||||||
|
td{
|
||||||
|
&:nth-child(2) {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
&:nth-child(3) {
|
||||||
|
width: 250px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,268 +0,0 @@
|
|||||||
root {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: 'Roboto', 'Helvetica Neue', Helvetica, Arial;
|
|
||||||
margin: 0;
|
|
||||||
overflow-x: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
body.core-narrow {
|
|
||||||
padding: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
body /deep/ core-menu {
|
|
||||||
overflow-x: hidden !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.calculatedValue {
|
|
||||||
color: #021C33;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
* {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
td {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
table {
|
|
||||||
border-spacing: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.summaryTable td{
|
|
||||||
text-align: right;
|
|
||||||
padding: 4px;
|
|
||||||
min-width: 80px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.summaryTable td:first-child {
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr {
|
|
||||||
background-color: #444;
|
|
||||||
opacity: 0.12;
|
|
||||||
border-width: 0;
|
|
||||||
color: #444;
|
|
||||||
height: 1px;
|
|
||||||
line-height: 0;
|
|
||||||
margin: 0 -16px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
paper-button {
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 400;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: #000;
|
|
||||||
color: rgba(0,0,0,0.87);
|
|
||||||
letter-spacing: 0.010;
|
|
||||||
}
|
|
||||||
|
|
||||||
core-item {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.listRow {
|
|
||||||
height: 32px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card {
|
|
||||||
margin-bottom: 8px;
|
|
||||||
/*hack to stop flickering*/
|
|
||||||
-webkit-backface-visibility: hidden;
|
|
||||||
-webkit-transform: translateX(0);
|
|
||||||
/*stop divs breaking over divide*/
|
|
||||||
-webkit-column-break-inside: avoid;
|
|
||||||
page-break-inside: avoid;
|
|
||||||
break-inside: avoid;
|
|
||||||
/*Fixes extra margin at top of columns*/
|
|
||||||
display: inline-block;
|
|
||||||
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
font-size: 14px;
|
|
||||||
border-radius: 2px;
|
|
||||||
background-color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card.double {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card paper-button {
|
|
||||||
font-size: 14px;
|
|
||||||
letter-spacing: 0.01em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cardHeader {
|
|
||||||
height: 48px;
|
|
||||||
padding: 0 16px 0 16px;
|
|
||||||
align-content: center;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 400;
|
|
||||||
color: rgba(0, 0, 0, 0.54);
|
|
||||||
}
|
|
||||||
|
|
||||||
.clickable, .statCard, .abilityMiniCard {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.skillRow {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.resourceCards {
|
|
||||||
padding: 4px 4px 0 4px;
|
|
||||||
margin-bottom: -4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.resourceCards .card {
|
|
||||||
width: 180px;
|
|
||||||
margin: 4px;
|
|
||||||
flex-grow: 1;
|
|
||||||
flex-shrink: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.grey-background, body {
|
|
||||||
background-color: #E0E0E0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.center {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.screen-center {
|
|
||||||
position: fixed;
|
|
||||||
top: 50%;
|
|
||||||
left: 50%;
|
|
||||||
-webkit-transform: translate(-50%, -50%);
|
|
||||||
transform: translate(-50%, -50%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.scroll-y {
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fab-buffer {
|
|
||||||
height: 88px;
|
|
||||||
width: 100%;
|
|
||||||
order: 999;
|
|
||||||
}
|
|
||||||
|
|
||||||
*[hidden] {
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hidden{
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 640px) {
|
|
||||||
html /deep/ paper-action-dialog[global-dialog] {
|
|
||||||
top: 0 !important;
|
|
||||||
left: 0 !important;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
margin: 0;
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.floatyButton {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 24px;
|
|
||||||
right: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.wideTable td {
|
|
||||||
padding: 4px 8px 4px 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.wideTable table {
|
|
||||||
padding: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
paper-fab-menu /deep/ .container {
|
|
||||||
padding: 24px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
paper-slider {
|
|
||||||
margin-left: -8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.list-subhead {
|
|
||||||
color: rgba(0,0,0,0.54);
|
|
||||||
font-size: 14px;
|
|
||||||
height: 40px;
|
|
||||||
padding-left: 16px;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
.whiteTop {
|
|
||||||
cursor: initial;
|
|
||||||
border-bottom: black solid 0.5px;
|
|
||||||
border-bottom: rgba(0,0,0,0.12) solid 1px;
|
|
||||||
background: white;
|
|
||||||
padding: 16px;
|
|
||||||
position: relative;
|
|
||||||
border-radius: 2px 2px 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.whiteTop paper-icon-button {
|
|
||||||
margin: -8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fullwidth {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.padded {
|
|
||||||
padding: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.listPadded {
|
|
||||||
padding: 0 0 16px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rightPadded {
|
|
||||||
padding-right: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bottomPadded {
|
|
||||||
padding-bottom: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sideMargin {
|
|
||||||
margin-left: 16px;
|
|
||||||
margin-right: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vertMargin {
|
|
||||||
margin-top: 16px;
|
|
||||||
margin-bottom: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.spaceAfter {
|
|
||||||
margin-bottom: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.s {
|
|
||||||
padding: 0 0 16px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.leftRound{
|
|
||||||
border-radius: 2px 0 0 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.preline {
|
|
||||||
white-space: pre-line;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prewrap{
|
|
||||||
white-space: pre-wrap;
|
|
||||||
}
|
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
letter-spacing: 0;
|
letter-spacing: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.white-text .display1{
|
.white-text .display1, .white-text.display1{
|
||||||
color: rgba(255,255,255,0.54);
|
color: rgba(255,255,255,0.54);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,21 +15,11 @@
|
|||||||
value={{details}}></paper-input>
|
value={{details}}></paper-input>
|
||||||
</div>
|
</div>
|
||||||
<div layout horizontal>
|
<div layout horizontal>
|
||||||
<!--DamageType-->
|
|
||||||
<paper-dropdown-menu id="damageDiceDropdown" label="Damage Dice">
|
|
||||||
<paper-dropdown layered class="dropdown">
|
|
||||||
<core-menu class="menu" selected={{damageDice}}>
|
|
||||||
{{#each DAMAGE_DICE}}
|
|
||||||
<paper-item name={{this}} class="containerMenuItem">{{this}}</paper-item>
|
|
||||||
{{/each}}
|
|
||||||
</core-menu>
|
|
||||||
</paper-dropdown>
|
|
||||||
</paper-dropdown-menu>
|
|
||||||
<!--damageBonus-->
|
<!--damageBonus-->
|
||||||
<paper-input id="damageInput"
|
<paper-input id="damageInput"
|
||||||
label="Damage Bonus"
|
label="Damage"
|
||||||
floatinglabel
|
floatinglabel
|
||||||
value={{damageBonus}}
|
value={{damage}}
|
||||||
flex></paper-input>
|
flex></paper-input>
|
||||||
<!--DamageType-->
|
<!--DamageType-->
|
||||||
<paper-dropdown-menu id="damageTypeDropdown" label="Damage Type">
|
<paper-dropdown-menu id="damageTypeDropdown" label="Damage Type">
|
||||||
|
|||||||
@@ -1,6 +1,18 @@
|
|||||||
var damageTypes = ["bludgeoning", "piercing", "slashing",
|
var damageTypes = [
|
||||||
"acid", "cold", "fire", "force", "lightning", "necrotic",
|
"bludgeoning",
|
||||||
"poison", "psychic", "radiant", "thunder"];
|
"piercing",
|
||||||
|
"slashing",
|
||||||
|
"acid",
|
||||||
|
"cold",
|
||||||
|
"fire",
|
||||||
|
"force",
|
||||||
|
"lightning",
|
||||||
|
"necrotic",
|
||||||
|
"poison",
|
||||||
|
"psychic",
|
||||||
|
"radiant",
|
||||||
|
"thunder",
|
||||||
|
];
|
||||||
|
|
||||||
Template.attackEdit.events({
|
Template.attackEdit.events({
|
||||||
"tap #deleteAttack": function(event, instance) {
|
"tap #deleteAttack": function(event, instance) {
|
||||||
@@ -13,7 +25,7 @@ Template.attackEdit.events({
|
|||||||
},
|
},
|
||||||
"change #damageInput": function(event) {
|
"change #damageInput": function(event) {
|
||||||
var value = event.currentTarget.value;
|
var value = event.currentTarget.value;
|
||||||
Attacks.update(this._id, {$set: {damageBonus: value}});
|
Attacks.update(this._id, {$set: {damage: value}});
|
||||||
},
|
},
|
||||||
"change #detailInput": function(event) {
|
"change #detailInput": function(event) {
|
||||||
var value = event.currentTarget.value;
|
var value = event.currentTarget.value;
|
||||||
@@ -26,13 +38,6 @@ Template.attackEdit.events({
|
|||||||
if (value == this.damageType) return;
|
if (value == this.damageType) return;
|
||||||
Attacks.update(this._id, {$set: {damageType: value}});
|
Attacks.update(this._id, {$set: {damageType: value}});
|
||||||
},
|
},
|
||||||
"core-select #damageDiceDropdown": function(event) {
|
|
||||||
var detail = event.originalEvent.detail;
|
|
||||||
if (!detail.isSelected) return;
|
|
||||||
var value = detail.item.getAttribute("name");
|
|
||||||
if (value == this.damageDice) return;
|
|
||||||
Attacks.update(this._id, {$set: {damageDice: value}});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.attackEdit.helpers({
|
Template.attackEdit.helpers({
|
||||||
@@ -41,5 +46,5 @@ Template.attackEdit.helpers({
|
|||||||
},
|
},
|
||||||
DAMAGE_DICE: function() {
|
DAMAGE_DICE: function() {
|
||||||
return DAMAGE_DICE;
|
return DAMAGE_DICE;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
<template name="attackView">
|
<template name="attackView">
|
||||||
<div class="attackView" layout horizontal>
|
<div class="attackView" layout horizontal>
|
||||||
<div class="headline rightPadded" layout horizontal center>
|
<div class="headline" style="margin-right: 16px;" layout horizontal center>
|
||||||
{{evaluateSigned charId attackBonus}}
|
{{evaluateSigned charId attackBonus}}
|
||||||
</div>
|
</div>
|
||||||
<div layout vertical>
|
<div layout vertical>
|
||||||
<div>
|
<div>
|
||||||
{{damageDice}} {{{evaluateSignedSpaced charId damageBonus}}} {{damageType}}
|
{{evaluateString charId damage}} {{damageType}}
|
||||||
</div>
|
</div>
|
||||||
{{#if details}}
|
{{#if details}}
|
||||||
<div class="caption">
|
<div class="caption">
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<template name="buffDialog">
|
||||||
|
{{#with buff}}
|
||||||
|
{{#baseDialog title=name class=colorClass hideEdit=true}}
|
||||||
|
{{> buffDetails}}
|
||||||
|
{{/baseDialog}}
|
||||||
|
{{/with}}
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template name="buffDetails">
|
||||||
|
{{#if description}}
|
||||||
|
<div class="pre-wrap">{{evaluateString charId description}}</div>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
{{> effectsViewList charId=charId parentId=_id}}
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
Template.buffDialog.helpers({
|
||||||
|
buff: function(){
|
||||||
|
return Buffs.findOne(this.buffId);
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -1,3 +1,13 @@
|
|||||||
<template name="characterSettings">
|
<template name="characterSettings">
|
||||||
|
{{#with character}}
|
||||||
|
<div>
|
||||||
|
<div layout horizontal>
|
||||||
|
<div>Use variant encumbrance </div>
|
||||||
|
<paper-toggle-button id="variantEncumbrance"
|
||||||
|
checked={{settings.useVariantEncumbrance}}
|
||||||
|
touch-action="pan-y">
|
||||||
|
</paper-toggle-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/with}}
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,3 +1,17 @@
|
|||||||
Template.characterSettings.events({
|
Template.characterSettings.helpers({
|
||||||
|
character: function() {
|
||||||
|
return Characters.findOne(this._id, {fields: {settings: 1}});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.characterSettings.events({
|
||||||
|
"change #variantEncumbrance": function(event, instance){
|
||||||
|
var value = instance.find("#variantEncumbrance").checked;
|
||||||
|
if (this.settings.useVariantEncumbrance !== value){
|
||||||
|
Characters.update(
|
||||||
|
this._id,
|
||||||
|
{$set: {"settings.useVariantEncumbrance": value}}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
<div flex>
|
<div flex>
|
||||||
{{name}}
|
{{name}}
|
||||||
</div>
|
</div>
|
||||||
|
{{#if canEditCharacter _id}}
|
||||||
<div>
|
<div>
|
||||||
{{> colorDropdown}}
|
{{> colorDropdown}}
|
||||||
</div>
|
</div>
|
||||||
@@ -12,11 +13,19 @@
|
|||||||
<paper-icon-button icon="more-vert" noink></paper-icon-button>
|
<paper-icon-button icon="more-vert" noink></paper-icon-button>
|
||||||
<paper-dropdown class="dropdown" halign="right">
|
<paper-dropdown class="dropdown" halign="right">
|
||||||
<core-menu class="menu" style="color: black; color: rgba(0,0,0,0.87);">
|
<core-menu class="menu" style="color: black; color: rgba(0,0,0,0.87);">
|
||||||
<paper-item id="deleteCharacter"><core-icon icon="delete"></core-icon>Delete</paper-item>
|
<paper-item id="deleteCharacter">
|
||||||
<paper-item id="shareCharacter"><core-icon icon="social:share"></core-icon>Share</paper-item>
|
<core-icon icon="delete"></core-icon>Delete
|
||||||
|
</paper-item>
|
||||||
|
<paper-item id="shareCharacter">
|
||||||
|
<core-icon icon="social:share"></core-icon>Share
|
||||||
|
</paper-item>
|
||||||
|
<paper-item id="characterSettings">
|
||||||
|
<core-icon icon="settings"></core-icon>Settings
|
||||||
|
</paper-item>
|
||||||
</core-menu>
|
</core-menu>
|
||||||
</paper-dropdown>
|
</paper-dropdown>
|
||||||
</paper-menu-button>
|
</paper-menu-button>
|
||||||
|
{{/if}}
|
||||||
<div class="bottom fit" horizontal layout>
|
<div class="bottom fit" horizontal layout>
|
||||||
<paper-tabs flex horizontal center layout id="characterSheetTabs" selected={{selectedTab}} class="{{colorClass}}">
|
<paper-tabs flex horizontal center layout id="characterSheetTabs" selected={{selectedTab}} class="{{colorClass}}">
|
||||||
<paper-tab name="stats">Stats</paper-tab>
|
<paper-tab name="stats">Stats</paper-tab>
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
Template.characterSheet.created = function(){
|
Template.characterSheet.onCreated(function() {
|
||||||
|
//default to the first tab
|
||||||
Session.setDefault(this.data._id + ".selectedTab", "stats");
|
Session.setDefault(this.data._id + ".selectedTab", "stats");
|
||||||
};
|
//watch this character and make sure their encumbrance is updated
|
||||||
|
trackEncumbranceConditions(this.data._id, this);
|
||||||
|
});
|
||||||
|
|
||||||
var setTab = function(charId, tab){
|
var setTab = function(charId, tab){
|
||||||
return Session.set(charId + ".selectedTab", tab);
|
return Session.set(charId + ".selectedTab", tab);
|
||||||
@@ -13,7 +16,7 @@ var getTab = function(charId){
|
|||||||
Template.characterSheet.helpers({
|
Template.characterSheet.helpers({
|
||||||
selectedTab: function(){
|
selectedTab: function(){
|
||||||
return getTab(this._id);
|
return getTab(this._id);
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.characterSheet.events({
|
Template.characterSheet.events({
|
||||||
@@ -40,4 +43,11 @@ Template.characterSheet.events({
|
|||||||
template: "shareDialog",
|
template: "shareDialog",
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
"tap #characterSettings": function(event, instance){
|
||||||
|
GlobalUI.showDialog({
|
||||||
|
heading: this.name + " Settings",
|
||||||
|
data: this,
|
||||||
|
template: "characterSettings",
|
||||||
|
});
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{#if description}}
|
{{#if description}}
|
||||||
<div class="prewrap">{{description}}</div>
|
<div class="pre-wrap">{{evaluateString charId description}}</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{> effectsViewList charId=charId parentId=_id}}
|
{{> effectsViewList charId=charId parentId=_id}}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template name="features">
|
<template name="features">
|
||||||
<div fit>
|
<div fit>
|
||||||
<div class="scroll-y" fit>
|
<div class="scroll-y" fit>
|
||||||
<div class="containers">
|
<div class="column-container">
|
||||||
<!--expertiseDice-->
|
<!--expertiseDice-->
|
||||||
{{>resource name="expertiseDice" title="Expertise Dice" color="teal" char=this}}
|
{{>resource name="expertiseDice" title="Expertise Dice" color="teal" char=this}}
|
||||||
<!--ki-->
|
<!--ki-->
|
||||||
@@ -14,27 +14,27 @@
|
|||||||
{{>resource name="superiorityDice" title="Superiority Dice" color="teal" char=this}}
|
{{>resource name="superiorityDice" title="Superiority Dice" color="teal" char=this}}
|
||||||
|
|
||||||
<!--Attacks-->
|
<!--Attacks-->
|
||||||
<paper-shadow class="card container" hero-id="main" {{detailHero}}>
|
<paper-shadow class="card">
|
||||||
<div class="whiteTop" hero-id="toolbar" layout horizontal center {{detailHero}}>
|
<div class="top white">
|
||||||
<div flex>
|
Attacks
|
||||||
<div class="containerName subhead">Attacks</div>
|
|
||||||
</div>
|
</div>
|
||||||
<!--<paper-icon-button class="black54" id="addAttackButton" icon="add"></paper-icon-button>-->
|
<div class="bottom list">
|
||||||
</div>
|
|
||||||
<div class="containerMain listPadded">
|
|
||||||
{{#each attacks}}
|
{{#each attacks}}
|
||||||
<div class="itemSlot">
|
<div class="item-slot">
|
||||||
<paper-item class="white attack" hero-id="main" {{detailHero}}>
|
<div class="flexible attack item"
|
||||||
<div layout horizontal class="fullwidth">
|
hero-id="main" {{detailHero}}>
|
||||||
<div class="headline rightPadded" layout horizontal center>
|
<div layout horizontal>
|
||||||
|
<div class="headline"
|
||||||
|
style="margin-right: 16px;"
|
||||||
|
layout horizontal center>
|
||||||
{{evaluateSigned ../_id attackBonus}}
|
{{evaluateSigned ../_id attackBonus}}
|
||||||
</div>
|
</div>
|
||||||
<div layout vertical flex>
|
<div flex layout vertical>
|
||||||
<div class="body2">
|
<div class="body2">
|
||||||
{{name}}
|
{{name}}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{{damageDice}} {{{evaluateSignedSpaced ../_id damageBonus}}} {{damageType}}
|
{{evaluateString ../_id damage}} {{damageType}}
|
||||||
</div>
|
</div>
|
||||||
{{#if details}}
|
{{#if details}}
|
||||||
<div class="caption">
|
<div class="caption">
|
||||||
@@ -43,34 +43,32 @@
|
|||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</paper-item>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
</paper-shadow>
|
</paper-shadow>
|
||||||
|
|
||||||
<!--Proficiencies-->
|
<!--Proficiencies-->
|
||||||
<paper-shadow class="card container" hero-id="main" {{detailHero "proficiencies"}}>
|
<paper-shadow class="card">
|
||||||
<div id="proficiencies"
|
<div class="white top">
|
||||||
class="whiteTop"
|
Proficiencies
|
||||||
layout horizontal center>
|
|
||||||
<div class="containerName subhead">Proficiencies</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div flex class="containerMain listPadded">
|
<div flex class="bottom list">
|
||||||
{{#if weaponProfs.count}}
|
{{#if weaponProfs.count}}
|
||||||
<div class="list-subhead" layout horizontal center>Weapons</div>
|
<div class="subhead">Weapons</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#each weaponProfs}}
|
{{#each weaponProfs}}
|
||||||
{{> proficiencyListItem}}
|
{{> proficiencyListItem}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
{{#if armorProfs.count}}
|
{{#if armorProfs.count}}
|
||||||
<div class="list-subhead" layout horizontal center>Armor</div>
|
<div class="subhead">Armor</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#each armorProfs}}
|
{{#each armorProfs}}
|
||||||
{{> proficiencyListItem}}
|
{{> proficiencyListItem}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
{{#if toolProfs.count}}
|
{{#if toolProfs.count}}
|
||||||
<div class="list-subhead" layout horizontal center>Tools</div>
|
<div class="subhead">Tools</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#each toolProfs}}
|
{{#each toolProfs}}
|
||||||
{{> proficiencyListItem}}
|
{{> proficiencyListItem}}
|
||||||
@@ -80,23 +78,42 @@
|
|||||||
|
|
||||||
<!--features-->
|
<!--features-->
|
||||||
{{#each features}}
|
{{#each features}}
|
||||||
<paper-shadow class="card container featureCard" hero-id="main" {{detailHero}}>
|
<paper-shadow class="card featureCard"
|
||||||
<div class="containerTop {{colorClass}}" hero-id="toolbar" layout horizontal center {{detailHero}}>
|
hero-id="main" {{detailHero}}>
|
||||||
<paper-ripple fit></paper-ripple>
|
<div class="top {{colorClass}} subhead"
|
||||||
<div class="containerName subhead" hero-id="title" flex {{detailHero}}>{{name}}</div>
|
layout horizontal
|
||||||
{{#if hasUses}}<div class="subhead" style="margin-right: 8px">{{usesLeft}}/{{usesValue}}</div>{{/if}}
|
hero-id="toolbar" {{detailHero}}>
|
||||||
<paper-ripple fit></paper-ripple>
|
<div flex hero-id="title" {{detailHero}}>
|
||||||
|
{{name}}
|
||||||
|
</div>
|
||||||
|
{{#if hasUses}}
|
||||||
|
<div style="margin-right: 8px">
|
||||||
|
{{usesLeft}}/{{usesValue}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
{{#if canEnable}}
|
{{#if canEnable}}
|
||||||
<core-tooltip label="Feature enabled" position="left">
|
<core-tooltip label="Feature enabled"
|
||||||
<paper-checkbox class="enabledCheckbox" checked={{enabled}}></paper-checkbox>
|
position="left">
|
||||||
|
<paper-checkbox class="enabledCheckbox"
|
||||||
|
checked={{enabled}}>
|
||||||
|
</paper-checkbox>
|
||||||
</core-tooltip>
|
</core-tooltip>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
{{#if description}}<div flex class="containerMain body1 featureDescription">{{description}}</div>{{/if}}
|
{{#if description}}
|
||||||
|
<div flex class="bottom text"
|
||||||
|
>{{evaluateString charId description}}</div>
|
||||||
|
{{/if}}
|
||||||
{{#if hasUses}}
|
{{#if hasUses}}
|
||||||
<div class="containerFoot" layout horizontal center end-justified>
|
<div layout horizontal center end-justified>
|
||||||
<paper-button class="useFeature" disabled={{noUsesLeft}}>Use</paper-button>
|
<paper-button class="useFeature"
|
||||||
<paper-button class="resetFeature" disabled={{usesFull}}>Reset</paper-button>
|
disabled={{noUsesLeft}}>
|
||||||
|
Use
|
||||||
|
</paper-button>
|
||||||
|
<paper-button class="resetFeature"
|
||||||
|
disabled={{usesFull}}>
|
||||||
|
Reset
|
||||||
|
</paper-button>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</paper-shadow>
|
</paper-shadow>
|
||||||
@@ -104,6 +121,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="fab-buffer"></div>
|
<div class="fab-buffer"></div>
|
||||||
</div>
|
</div>
|
||||||
|
{{#if canEditCharacter _id}}
|
||||||
<paper-fab id="addFeature"
|
<paper-fab id="addFeature"
|
||||||
class="floatyButton"
|
class="floatyButton"
|
||||||
icon="add"
|
icon="add"
|
||||||
@@ -112,23 +130,34 @@
|
|||||||
tabindex="0"
|
tabindex="0"
|
||||||
aria-label="Add"
|
aria-label="Add"
|
||||||
hero-id="main"></paper-fab>
|
hero-id="main"></paper-fab>
|
||||||
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="resource">
|
<template name="resource">
|
||||||
{{#if char.attributeBase name}}
|
{{#if char.attributeBase name}}
|
||||||
<paper-shadow class="card container" hero-id="main" {{detailHero name char._id}} layout horizontal>
|
<paper-shadow class="card"
|
||||||
<div class="containerLeft {{getColor}}" hero-id="toolbar" {{detailHero name char._id}} >
|
hero-id="main" {{detailHero name char._id}}
|
||||||
<div class="resourceButtons">
|
layout horizontal>
|
||||||
<paper-icon-button class="resourceUp" icon="arrow-drop-up" disabled={{cantIncrement}}></paper-icon-button>
|
<div class="left {{getColor}} display1 white-text"
|
||||||
<paper-icon-button class="resourceDown" icon="arrow-drop-down" disabled={{cantDecrement}}></paper-icon-button>
|
hero-id="toolbar" {{detailHero name char._id}}
|
||||||
|
layout horizontal center>
|
||||||
|
<div style="margin-right: 8px;">
|
||||||
|
<paper-icon-button class="resourceUp"
|
||||||
|
icon="arrow-drop-up"
|
||||||
|
disabled={{cantIncrement}}>
|
||||||
|
</paper-icon-button>
|
||||||
|
<paper-icon-button class="resourceDown"
|
||||||
|
icon="arrow-drop-down"
|
||||||
|
disabled={{cantDecrement}}>
|
||||||
|
</paper-icon-button>
|
||||||
</div>
|
</div>
|
||||||
<div class="resourceValue">{{char.attributeValue name}}</div>
|
<div>{{char.attributeValue name}}</div>
|
||||||
<!--<div class="resourceMax">{{char.attributeBase name}}</div>-->
|
<!--<div>/{{char.attributeBase name}}</div>-->
|
||||||
</div>
|
</div>
|
||||||
<div class="containerRight clickable" flex relative horizontal layout center>
|
<div class="right clickable"
|
||||||
|
flex layout horizontal center>
|
||||||
{{title}}
|
{{title}}
|
||||||
<paper-ripple fit></paper-ripple>
|
|
||||||
</div>
|
</div>
|
||||||
</paper-shadow>
|
</paper-shadow>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ Template.features.events({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap .featureCard .containerTop": function(event){
|
"tap .featureCard .top": function(event){
|
||||||
var featureId = this._id;
|
var featureId = this._id;
|
||||||
var charId = Template.parentData()._id;
|
var charId = Template.parentData()._id;
|
||||||
GlobalUI.setDetail({
|
GlobalUI.setDetail({
|
||||||
@@ -128,7 +128,7 @@ Template.resource.events({
|
|||||||
Characters.update(this.char._id, modifier, {validate: false});
|
Characters.update(this.char._id, modifier, {validate: false});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tap .containerRight": function(event, instance) {
|
"tap .right": function(event, instance) {
|
||||||
GlobalUI.setDetail({
|
GlobalUI.setDetail({
|
||||||
template: "attributeDialog",
|
template: "attributeDialog",
|
||||||
data: {name: this.title, statName: this.name, charId: this.char._id},
|
data: {name: this.title, statName: this.name, charId: this.char._id},
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
<template name="carryCapacityBar">
|
||||||
|
<div class="carryCapacityBar">
|
||||||
|
<div class="carriedWeightBar"
|
||||||
|
style="width: {{carriedPercent}}%;
|
||||||
|
background-color: {{carriedColor}}">
|
||||||
|
</div>
|
||||||
|
<div class="tick"
|
||||||
|
style="width: 33.333%;">
|
||||||
|
</div>
|
||||||
|
<div class="tick"
|
||||||
|
style="width: 66.666%;">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{#if overCarriedPercent}}
|
||||||
|
<div class="carryCapacityBar">
|
||||||
|
<div class="carriedWeightBar"
|
||||||
|
style="width: {{overCarriedPercent}}%;
|
||||||
|
background-color: {{overCarriedColor}}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
var getFractionCarried = function(char) {
|
||||||
|
//find out the weight
|
||||||
|
var weight = 0;
|
||||||
|
Containers.find(
|
||||||
|
{charId: char._id, isCarried: true}
|
||||||
|
).forEach(function(container){
|
||||||
|
weight += container.totalWeight();
|
||||||
|
});
|
||||||
|
Items.find(
|
||||||
|
{charId: char._id, "parent.id": char._id},
|
||||||
|
{fields: {weight : 1, quantity: 1}}
|
||||||
|
).forEach(function(item){
|
||||||
|
weight += item.totalWeight();
|
||||||
|
});
|
||||||
|
//get strength
|
||||||
|
var strength = char.attributeValue("strength");
|
||||||
|
var capacity = strength * 15;
|
||||||
|
return weight / capacity;
|
||||||
|
};
|
||||||
|
|
||||||
|
Template.carryCapacityBar.onCreated(function() {
|
||||||
|
var self = this;
|
||||||
|
self.carriedFraction = new ReactiveVar(0);
|
||||||
|
self.autorun(function() {
|
||||||
|
self.carriedFraction.set(getFractionCarried(self.data));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.carryCapacityBar.helpers({
|
||||||
|
carriedPercent: function() {
|
||||||
|
var percent = 100 * Template.instance().carriedFraction.get();
|
||||||
|
return percent > 100 ? 100 : percent;
|
||||||
|
},
|
||||||
|
overCarriedPercent: function() {
|
||||||
|
var percent = 100 * Template.instance().carriedFraction.get();
|
||||||
|
var overPercent = percent - 100;
|
||||||
|
if (overPercent < 0) return 0;
|
||||||
|
if (overPercent > 100) return 100;
|
||||||
|
return overPercent;
|
||||||
|
},
|
||||||
|
carriedColor: function() {
|
||||||
|
var frac = Template.instance().carriedFraction.get();
|
||||||
|
if (frac < 1 / 3){
|
||||||
|
return "#2196F3";
|
||||||
|
} else if (frac < 2 / 3){
|
||||||
|
return "#CDDC39";
|
||||||
|
} else if (frac < 1) {
|
||||||
|
return "#FFC107";
|
||||||
|
} else {
|
||||||
|
return "#F44336";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
overCarriedColor: function() {
|
||||||
|
var frac = Template.instance().carriedFraction.get();
|
||||||
|
if (frac < 1 / 3){
|
||||||
|
return "#2196F3";
|
||||||
|
} else if (frac < 2 / 3){
|
||||||
|
return "#CDDC39";
|
||||||
|
} else if (frac < 1) {
|
||||||
|
return "#FFC107";
|
||||||
|
} else {
|
||||||
|
return "#F44336";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
.carryCapacityBar {
|
||||||
|
background-color: #7DC580;
|
||||||
|
background-color: rgba(255,255,255,0.27);
|
||||||
|
position: relative;
|
||||||
|
height: 4px;
|
||||||
|
div{
|
||||||
|
height: 100%;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
.tick {
|
||||||
|
border-right: solid 2px #E5E5E5;
|
||||||
|
border-right-color: rgba(255,255,255,0.54);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<template name="carryDialog">
|
||||||
|
{{#baseDialog title="Weight Carried" class=color hideEdit=true}}
|
||||||
|
<div layout horizontal center-justified end>
|
||||||
|
<div class="display2">
|
||||||
|
{{round carriedWeight 1}}
|
||||||
|
</div>
|
||||||
|
<div class="display1">
|
||||||
|
lbs
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<hr class="vertMargin">
|
||||||
|
|
||||||
|
{{> carryCapacityTable}}
|
||||||
|
|
||||||
|
{{/baseDialog}}
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
Template.carryDialog.helpers({
|
||||||
|
carriedWeight: function() {
|
||||||
|
var weight = 0;
|
||||||
|
Containers.find(
|
||||||
|
{charId: this.charId, isCarried: true}
|
||||||
|
).forEach(function(container){
|
||||||
|
weight += container.totalWeight();
|
||||||
|
});
|
||||||
|
Items.find(
|
||||||
|
{charId: this.charId, "parent.id": this.charId},
|
||||||
|
{fields: {weight : 1, quantity: 1}}
|
||||||
|
).forEach(function(item){
|
||||||
|
weight += item.totalWeight();
|
||||||
|
});
|
||||||
|
return weight;
|
||||||
|
},
|
||||||
|
color: function() {
|
||||||
|
if (this.color) return this.color + " white-text";
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -41,6 +41,6 @@
|
|||||||
</div>
|
</div>
|
||||||
{{#if description}}
|
{{#if description}}
|
||||||
<hr class="vertMargin">
|
<hr class="vertMargin">
|
||||||
<div class="prewrap">{{description}}</div>
|
<div class="pre-wrap">{{evaluateString charId description}}</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,152 +0,0 @@
|
|||||||
div#stats {
|
|
||||||
-webkit-column-width: 200px;
|
|
||||||
-moz-column-width: 200px;
|
|
||||||
column-width: 200px;
|
|
||||||
-webkit-column-count: 4;
|
|
||||||
-moz-column-count: 4;
|
|
||||||
column-count: 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
.containers {
|
|
||||||
-webkit-column-width: 300px;
|
|
||||||
-moz-column-width: 300px;
|
|
||||||
column-width: 300px;
|
|
||||||
-webkit-column-gap: 8px;
|
|
||||||
-moz-column-gap: 8px;
|
|
||||||
column-gap: 8px;
|
|
||||||
-moz-column-fill: balance;
|
|
||||||
column-fill: balance;
|
|
||||||
padding: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.containerLeft {
|
|
||||||
padding: 16px 16px 16px 24px;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
flex-direction: row;
|
|
||||||
border-radius: 2px 0 0 2px;
|
|
||||||
|
|
||||||
/* same style as display-1 */
|
|
||||||
font-size: 34px;
|
|
||||||
font-weight: 400;
|
|
||||||
color: #ffffff;
|
|
||||||
color: rgba(255,255,255,0.54);
|
|
||||||
letter-spacing: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.statCard .containerLeft {
|
|
||||||
padding: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.containerRight {
|
|
||||||
padding: 16px;
|
|
||||||
|
|
||||||
/* same style as subhead */
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: 400;
|
|
||||||
margin: 0;
|
|
||||||
color: #000;
|
|
||||||
color: rgba(0,0,0,0.87);
|
|
||||||
letter-spacing: 0.010em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.resourceValue {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.resourceMax {
|
|
||||||
display: inline-block;
|
|
||||||
align-self: flex-end;
|
|
||||||
|
|
||||||
/* same style as subhead */
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: 400;
|
|
||||||
margin: 0;
|
|
||||||
color: #fff;
|
|
||||||
color: rgba(255,255,255,0.54);
|
|
||||||
letter-spacing: 0.010em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.resourceMax:before {
|
|
||||||
content: "/";
|
|
||||||
}
|
|
||||||
|
|
||||||
.resourceButtons {
|
|
||||||
margin: -16px 8px -16px -16px;
|
|
||||||
align-self: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.resourceButtons paper-icon-button{
|
|
||||||
width: 32px;
|
|
||||||
height: 32px;
|
|
||||||
padding: 0;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.resourceButtons paper-icon-button[disabled]{
|
|
||||||
color: rgba(255, 255, 255, 0.26);
|
|
||||||
}
|
|
||||||
|
|
||||||
.resourceButtons /deep/ core-icon {
|
|
||||||
width: 32px;
|
|
||||||
height: 32px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.containerTop {
|
|
||||||
cursor: pointer;
|
|
||||||
padding: 16px;
|
|
||||||
position: relative;
|
|
||||||
border-radius: 2px 2px 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.equipmentTop {
|
|
||||||
padding: 16px;
|
|
||||||
border-bottom: rgba(0,0,0,0.12) solid 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.containerMain {
|
|
||||||
padding: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.equipmentMain {
|
|
||||||
padding-bottom: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inventoryItem {
|
|
||||||
background: white;
|
|
||||||
transition: box-shadow 0.3s ease,
|
|
||||||
opacity 0.5s ease-in-out;
|
|
||||||
height: 40px;
|
|
||||||
margin: 1px 0 1px 0;
|
|
||||||
font-size: 16px;
|
|
||||||
color: rgba(0,0,0,0.87);
|
|
||||||
letter-spacing: 0.010em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inventoryItem core-icon, .inventoryItem paper-icon-button {
|
|
||||||
color: rgba(0,0,0,0.54);
|
|
||||||
}
|
|
||||||
|
|
||||||
.inventoryItem core-icon {
|
|
||||||
margin-right: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inventoryItem /deep/ .button-content {
|
|
||||||
-webkit-flex: 1;
|
|
||||||
flex: 1;
|
|
||||||
-webkit-flex-basis: 0.000000001px;
|
|
||||||
flex-basis: 0.000000001px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inventoryItem[hero] {
|
|
||||||
box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.37);
|
|
||||||
}
|
|
||||||
|
|
||||||
.itemSlot {
|
|
||||||
background-color: rgb(232, 232, 232);
|
|
||||||
background-color: rgba(0, 0, 0, 0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#inventory .containerMain {
|
|
||||||
padding: 0 0 16px 0;
|
|
||||||
}
|
|
||||||
@@ -1,73 +1,124 @@
|
|||||||
<template name="inventory">
|
<template name="inventory">
|
||||||
<div fit>
|
<div fit>
|
||||||
<div id="inventory" class="scroll-y" fit>
|
<div id="inventory" class="scroll-y" fit>
|
||||||
<div class="containers">
|
<div class="column-container">
|
||||||
<!--Net Worth-->
|
<!--Net Worth-->
|
||||||
<paper-shadow class="card container" hero-id="main" {{detailHero}} layout horizontal>
|
<paper-shadow class="card">
|
||||||
<div class="indigo white-text subhead padded leftRound" layout horizontal center>
|
<div class="white top" layout horizontal center>
|
||||||
|
<div class="subhead" flex>
|
||||||
Net Worth
|
Net Worth
|
||||||
</div>
|
</div>
|
||||||
<div class="padded" layout horizontal center>
|
<div>
|
||||||
{{valueString netWorth}}
|
{{valueString netWorth}}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</paper-shadow>
|
</paper-shadow>
|
||||||
<!--Weight Carried-->
|
<!--Weight Carried-->
|
||||||
<paper-shadow class="card container" hero-id="main" {{detailHero}} layout horizontal>
|
<paper-shadow class="card"
|
||||||
<div class="green white-text subhead padded leftRound" layout horizontal center>
|
hero-id="main" {{detailHero "weightCarried" _id}}>
|
||||||
|
<div class="top green white-text weightCarried"
|
||||||
|
hero-id="toolbar" {{detailHero "weightCarried" _id}}
|
||||||
|
layout horizontal center>
|
||||||
|
<div class="subhead" flex>
|
||||||
Weight Carried
|
Weight Carried
|
||||||
</div>
|
</div>
|
||||||
<div class="padded" layout horizontal center>
|
<div>
|
||||||
{{round weightCarried}}lbs
|
{{round weightCarried}}lbs
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="bottom green" style="padding: 0;">
|
||||||
|
{{> carryCapacityBar}}
|
||||||
|
</div>
|
||||||
|
{{#if encumberedBuffs.count}}
|
||||||
|
<div class="bottom list">
|
||||||
|
{{#each encumberedBuffs}}
|
||||||
|
<div class="item-slot">
|
||||||
|
<div class="item buff"
|
||||||
|
hero-id="main" {{detailHero}}
|
||||||
|
layout horizontal center
|
||||||
|
draggable="true">
|
||||||
|
<div flex>
|
||||||
|
<core-icon icon="work"
|
||||||
|
style="margin-right: 16px">
|
||||||
|
</core-icon>
|
||||||
|
{{name}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
</paper-shadow>
|
</paper-shadow>
|
||||||
<!--Equipment-->
|
<!--Equipment-->
|
||||||
<paper-shadow class="card container equipmentContainer">
|
<paper-shadow class="card equipmentContainer">
|
||||||
<div class="equipmentTop" layout horizontal center>
|
<div class="white top" layout horizontal center>
|
||||||
<div class="containerName subhead" flex>
|
<div class="subhead" flex>
|
||||||
Equipment
|
Equipment
|
||||||
</div>
|
</div>
|
||||||
<div class="caption" style="margin-right: 8px">{{valueString equipmentValue}}</div>
|
<div class="caption" style="margin-right: 8px">
|
||||||
<div class="caption">{{round equipmentWeight}}lbs</div>
|
{{valueString equipmentValue}}
|
||||||
</div>
|
</div>
|
||||||
<div flex class="equipmentMain">
|
<div class="caption">
|
||||||
|
{{round equipmentWeight}}lbs
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div flex class="bottom list">
|
||||||
{{#if attuned.count}}
|
{{#if attuned.count}}
|
||||||
<div class="list-subhead" layout horizontal center>Attuned</div>
|
<div class="subhead">Attuned</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#each attuned}}
|
{{#each attuned}}
|
||||||
{{>inventoryItem}}
|
{{>inventoryItem}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
{{#if attuned.count}}<div class="list-subhead" layout horizontal center>Equipment</div>{{/if}}
|
{{#if attuned.count}}
|
||||||
|
<div class="subhead">Equipment</div>
|
||||||
|
{{/if}}
|
||||||
{{#each equipment}}
|
{{#each equipment}}
|
||||||
{{>inventoryItem}}
|
{{>inventoryItem}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
</paper-shadow>
|
</paper-shadow>
|
||||||
<!--Carried Items-->
|
<!--Carried Items-->
|
||||||
<paper-shadow class="card container carriedContainer">
|
<paper-shadow class="card carriedContainer">
|
||||||
<div class="equipmentTop" layout horizontal center>
|
<div class="white top" layout horizontal center>
|
||||||
<div class="containerName subhead" flex>
|
<div class="subhead" flex>
|
||||||
Carried
|
Carried
|
||||||
</div>
|
</div>
|
||||||
<div class="caption" style="margin-right: 8px">{{valueString carriedValue}}</div>
|
<div class="caption" style="margin-right: 8px">
|
||||||
<div class="caption">{{round carriedWeight}}lbs</div>
|
{{valueString carriedValue}}
|
||||||
</div>
|
</div>
|
||||||
<div flex class="containerMain">
|
<div class="caption">
|
||||||
|
{{round carriedWeight}}lbs
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div flex class="bottom list">
|
||||||
{{#each carriedItems}}
|
{{#each carriedItems}}
|
||||||
{{>inventoryItem}}
|
{{>inventoryItem}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
</paper-shadow>
|
</paper-shadow>
|
||||||
{{#each containers}}
|
{{#each containers}}
|
||||||
<paper-shadow class="card container itemContainer" hero-id="main" {{detailHero}} style="order: {{containerOrder}};">
|
<paper-shadow class="card itemContainer"
|
||||||
<div class="containerTop {{colorClass}}" hero-id="toolbar" layout horizontal center {{detailHero}}>
|
hero-id="main" {{detailHero}}>
|
||||||
<div class="containerName subhead" hero-id="title" flex {{detailHero}}>{{name}}</div>
|
<div class="top {{colorClass}}"
|
||||||
<div class="caption" style="margin-right: 8px">{{valueString totalValue}}</div>
|
hero-id="toolbar" {{detailHero}}
|
||||||
<div class="caption" style="margin-right: 8px">{{round totalWeight}}lbs</div>
|
layout horizontal center>
|
||||||
|
<div class="subhead" flex
|
||||||
|
hero-id="title" {{detailHero}}>
|
||||||
|
{{name}}
|
||||||
|
</div>
|
||||||
|
<div class="caption" style="margin-right: 8px">
|
||||||
|
{{valueString totalValue}}
|
||||||
|
</div>
|
||||||
|
<div class="caption" style="margin-right: 8px">
|
||||||
|
{{round totalWeight}}lbs
|
||||||
|
</div>
|
||||||
<core-tooltip label="Container carried" position="left">
|
<core-tooltip label="Container carried" position="left">
|
||||||
<paper-checkbox class="carriedCheckbox" checked={{isCarried}}></paper-checkbox>
|
<paper-checkbox class="carriedCheckbox"
|
||||||
|
checked={{isCarried}}>
|
||||||
|
</paper-checkbox>
|
||||||
</core-tooltip>
|
</core-tooltip>
|
||||||
</div>
|
</div>
|
||||||
<div flex class="containerMain">
|
<div class="bottom list">
|
||||||
{{#each items ../_id _id}}
|
{{#each items ../_id _id}}
|
||||||
{{>inventoryItem}}
|
{{>inventoryItem}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
@@ -77,17 +128,45 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="fab-buffer"></div>
|
<div class="fab-buffer"></div>
|
||||||
</div>
|
</div>
|
||||||
<paper-fab-menu id="inventoryAddMenu" icon="add" closeIcon="close" duration="0.3">
|
{{#if canEditCharacter _id}}
|
||||||
<paper-fab-menu-item id="addItem" icon="note-add" color="#d23f31" tooltip="Item"></paper-fab-menu-item>
|
{{#fabMenu}}
|
||||||
<paper-fab-menu-item id="addContainer" icon="work" color="#d23f31" tooltip="Container"></paper-fab-menu-item>
|
<core-tooltip label="New container" position="left">
|
||||||
</paper-fab-menu>
|
<paper-fab icon="work"
|
||||||
|
class="addContainer"
|
||||||
|
mini>
|
||||||
|
</paper-fab>
|
||||||
|
</core-tooltip>
|
||||||
|
<core-tooltip label="New item" position="left">
|
||||||
|
<paper-fab icon="note-add"
|
||||||
|
class="addItem"
|
||||||
|
mini>
|
||||||
|
</paper-fab>
|
||||||
|
</core-tooltip>
|
||||||
|
{{/fabMenu}}
|
||||||
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="inventoryItem">
|
<template name="inventoryItem">
|
||||||
<div class="itemSlot">
|
<div class="item-slot">
|
||||||
<paper-item class="inventoryItem {{hidden}}" hero-id="main" noink {{detailHero}} layout horizontal draggable="true">
|
<div class="item {{hidden}} inventoryItem"
|
||||||
|
hero-id="main" {{detailHero}}
|
||||||
|
layout horizontal center
|
||||||
|
draggable="true">
|
||||||
|
<div flex class="itemName">
|
||||||
{{#if ne1 quantity}}{{quantity}} {{/if}}{{pluralName}}
|
{{#if ne1 quantity}}{{quantity}} {{/if}}{{pluralName}}
|
||||||
</paper-item>
|
</div>
|
||||||
|
{{#if settings.showIncrement}}
|
||||||
|
<div class="incrementButtons">
|
||||||
|
<paper-icon-button class="addItemQuantity"
|
||||||
|
icon="add"
|
||||||
|
style="margin-right: -8px"></paper-icon-button>
|
||||||
|
<paper-icon-button class="subItemQuantity"
|
||||||
|
disabled={{lt1 quantity}}
|
||||||
|
icon="remove"
|
||||||
|
style="margin-right: -8px"></paper-icon-button>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -61,6 +61,18 @@ Template.inventory.helpers({
|
|||||||
});
|
});
|
||||||
return weight;
|
return weight;
|
||||||
},
|
},
|
||||||
|
encumberedBuffs: function(){
|
||||||
|
return Buffs.find({
|
||||||
|
charId: this._id,
|
||||||
|
type: "inate",
|
||||||
|
name: {$in: [
|
||||||
|
"Encumbered",
|
||||||
|
"Heavily encumbered",
|
||||||
|
"Over encumbered",
|
||||||
|
"Can't move load",
|
||||||
|
]},
|
||||||
|
});
|
||||||
|
},
|
||||||
equipmentValue: function(){
|
equipmentValue: function(){
|
||||||
var value = 0;
|
var value = 0;
|
||||||
Items.find(
|
Items.find(
|
||||||
@@ -103,7 +115,7 @@ Template.inventory.helpers({
|
|||||||
});
|
});
|
||||||
|
|
||||||
Template.inventory.events({
|
Template.inventory.events({
|
||||||
"tap #addItem": function(event){
|
"tap .addItem": function(event){
|
||||||
var charId = this._id;
|
var charId = this._id;
|
||||||
Items.insert({
|
Items.insert({
|
||||||
charId: charId,
|
charId: charId,
|
||||||
@@ -120,7 +132,7 @@ Template.inventory.events({
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap #addContainer": function(event){
|
"tap .addContainer": function(event){
|
||||||
var containerId = Containers.insert({
|
var containerId = Containers.insert({
|
||||||
name: "New Container",
|
name: "New Container",
|
||||||
isCarried: true,
|
isCarried: true,
|
||||||
@@ -136,6 +148,23 @@ Template.inventory.events({
|
|||||||
heroId: containerId,
|
heroId: containerId,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
"tap .weightCarried": function(event) {
|
||||||
|
var charId = this._id;
|
||||||
|
GlobalUI.setDetail({
|
||||||
|
template: "carryDialog",
|
||||||
|
data: {charId: charId, color: "green"},
|
||||||
|
heroId: charId + "weightCarried",
|
||||||
|
});
|
||||||
|
},
|
||||||
|
"tap .buff": function(event){
|
||||||
|
var buffId = this._id;
|
||||||
|
var charId = Template.parentData()._id;
|
||||||
|
GlobalUI.setDetail({
|
||||||
|
template: "buffDialog",
|
||||||
|
data: {buffId: buffId, charId: charId},
|
||||||
|
heroId: buffId,
|
||||||
|
});
|
||||||
|
},
|
||||||
"tap .inventoryItem": function(event){
|
"tap .inventoryItem": function(event){
|
||||||
var itemId = this._id;
|
var itemId = this._id;
|
||||||
var charId = Template.parentData()._id;
|
var charId = Template.parentData()._id;
|
||||||
@@ -145,7 +174,18 @@ Template.inventory.events({
|
|||||||
heroId: itemId,
|
heroId: itemId,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap .containerTop": function(event){
|
"tap .incrementButtons": function(event) {
|
||||||
|
event.stopPropagation();
|
||||||
|
},
|
||||||
|
"tap .addItemQuantity": function(event) {
|
||||||
|
var itemId = this._id;
|
||||||
|
Items.update(itemId, {$set: {quantity: this.quantity + 1}});
|
||||||
|
},
|
||||||
|
"tap .subItemQuantity": function(event) {
|
||||||
|
var itemId = this._id;
|
||||||
|
Items.update(itemId, {$set: {quantity: this.quantity - 1}});
|
||||||
|
},
|
||||||
|
"tap .itemContainer .top": function(event){
|
||||||
GlobalUI.setDetail({
|
GlobalUI.setDetail({
|
||||||
template: "containerDialog",
|
template: "containerDialog",
|
||||||
data: {containerId: this._id, charId: this.charId},
|
data: {containerId: this._id, charId: this.charId},
|
||||||
@@ -167,6 +207,9 @@ Template.inventoryItem.helpers({
|
|||||||
ne1: function(num){
|
ne1: function(num){
|
||||||
return num !== 1;
|
return num !== 1;
|
||||||
},
|
},
|
||||||
|
lt1: function(num) {
|
||||||
|
return num < 1;
|
||||||
|
},
|
||||||
hidden: function(){
|
hidden: function(){
|
||||||
return Session.equals("inventory.dragItemId", this._id) ? "hidden" : null;
|
return Session.equals("inventory.dragItemId", this._id) ? "hidden" : null;
|
||||||
},
|
},
|
||||||
@@ -174,71 +217,93 @@ Template.inventoryItem.helpers({
|
|||||||
|
|
||||||
Template.layout.events({
|
Template.layout.events({
|
||||||
"dragstart .inventoryItem": function(event, instance){
|
"dragstart .inventoryItem": function(event, instance){
|
||||||
|
event.originalEvent.dataTransfer.setData("dicecloud-id/items", this._id);
|
||||||
Session.set("inventory.dragItemId", this._id);
|
Session.set("inventory.dragItemId", this._id);
|
||||||
Session.set("inventory.dragItemOriginalContainer", this.container);
|
},
|
||||||
Session.set("inventory.dragItemOriginalCharacter", this.charId);
|
"dragover .itemContainer, dragenter .itemContainer":
|
||||||
|
function(event, instance){
|
||||||
|
if (_.contains(event.originalEvent.dataTransfer.types, "dicecloud-id/items")){
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dragover .equipmentContainer, dragenter .equipmentContainer":
|
||||||
|
function(event, instance){
|
||||||
|
if (_.contains(event.originalEvent.dataTransfer.types, "dicecloud-id/items")){
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dragover .carriedContainer, dragenter .carriedContainer":
|
||||||
|
function(event, instance){
|
||||||
|
if (_.contains(event.originalEvent.dataTransfer.types, "dicecloud-id/items")){
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dragover .characterRepresentative, dragenter .characterRepresentative":
|
||||||
|
function(event, instance){
|
||||||
|
if (_.contains(event.originalEvent.dataTransfer.types, "dicecloud-id/items")){
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"dragend .inventoryItem": function(event, instance){
|
"dragend .inventoryItem": function(event, instance){
|
||||||
resetInvetorySession(); //this is a valid drop zone
|
Session.set("inventory.dragItemId", null);
|
||||||
},
|
},
|
||||||
"dragover .itemContainer": function(event, instance){
|
"drop .itemContainer": function(event, instance){
|
||||||
event.preventDefault();
|
var itemId = event.originalEvent.dataTransfer.getData("dicecloud-id/items");
|
||||||
},
|
|
||||||
"dragover .equipmentContainer": function(event, instance){
|
|
||||||
event.preventDefault();
|
|
||||||
},
|
|
||||||
"dragover .carriedContainer": function(event, instance){
|
|
||||||
event.preventDefault();
|
|
||||||
},
|
|
||||||
"drop .itemContainer": function(event, instacne){
|
|
||||||
var item = Items.findOne(Session.get("inventory.dragItemId"));
|
|
||||||
if (event.ctrlKey){
|
if (event.ctrlKey){
|
||||||
//split the stack to the container
|
//split the stack to the container
|
||||||
GlobalUI.showDialog({
|
GlobalUI.showDialog({
|
||||||
template: "splitStackDialog",
|
template: "splitStackDialog",
|
||||||
data: {
|
data: {
|
||||||
id: item._id,
|
id: itemId,
|
||||||
parentCollection: "Containers",
|
parentCollection: "Containers",
|
||||||
parentId: this._id,
|
parentId: this._id,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
//move item to the container
|
//move item to the container
|
||||||
item.moveToContainer(this._id);
|
Meteor.call("moveItemToContainer", itemId, this._id);
|
||||||
}
|
}
|
||||||
resetInvetorySession();
|
Session.set("inventory.dragItemId", null);
|
||||||
},
|
},
|
||||||
"drop .equipmentContainer": function(event, instance){
|
"drop .equipmentContainer": function(event, instance){
|
||||||
var charId = Session.get("inventory.dragItemOriginalCharacter");
|
var itemId = event.originalEvent.dataTransfer.getData("dicecloud-id/items");
|
||||||
var item = Items.findOne(Session.get("inventory.dragItemId"));
|
Meteor.call("equipItem", itemId, this._id);
|
||||||
item.equip(charId);
|
Session.set("inventory.dragItemId", null);
|
||||||
resetInvetorySession();
|
|
||||||
},
|
},
|
||||||
"drop .carriedContainer": function(event, instance){
|
"drop .carriedContainer": function(event, instance){
|
||||||
var charId = Session.get("inventory.dragItemOriginalCharacter");
|
var itemId = event.originalEvent.dataTransfer.getData("dicecloud-id/items");
|
||||||
var item = Items.findOne(Session.get("inventory.dragItemId"));
|
|
||||||
if (event.ctrlKey){
|
if (event.ctrlKey){
|
||||||
//split the stack to the container
|
//split the stack to the container
|
||||||
GlobalUI.showDialog({
|
GlobalUI.showDialog({
|
||||||
template: "splitStackDialog",
|
template: "splitStackDialog",
|
||||||
data: {
|
data: {
|
||||||
id: item._id,
|
id: itemId,
|
||||||
parentCollection: "Characters",
|
parentCollection: "Characters",
|
||||||
parentId: this._id,
|
parentId: this._id,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
//move item to the character
|
//move item to the character
|
||||||
item.moveToCharacter(this._id);
|
Meteor.call("moveItemToCharacter", itemId, this._id);
|
||||||
}
|
}
|
||||||
resetInvetorySession();
|
Session.set("inventory.dragItemId", null);
|
||||||
|
},
|
||||||
|
"drop .characterRepresentative": function(event, instance) {
|
||||||
|
var itemId = event.originalEvent.dataTransfer.getData("dicecloud-id/items");
|
||||||
|
if (event.ctrlKey){
|
||||||
|
//split the stack to the container
|
||||||
|
GlobalUI.showDialog({
|
||||||
|
template: "splitStackDialog",
|
||||||
|
data: {
|
||||||
|
id: itemId,
|
||||||
|
parentCollection: "Characters",
|
||||||
|
parentId: this._id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
//move item to the character
|
||||||
|
Meteor.call("moveItemToCharacter", itemId, this._id);
|
||||||
|
}
|
||||||
|
Session.set("inventory.dragItemId", null);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
var resetInvetorySession = function(){
|
|
||||||
_.defer(function(){
|
|
||||||
Session.set("inventory.dragItemId", null);
|
|
||||||
Session.set("inventory.dragItemOriginalContainer", null);
|
|
||||||
Session.set("inventory.dragItemOriginalCharacter", null);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
<template name="itemDetails">
|
<template name="itemDetails">
|
||||||
<div layout horizontal wrap center justified class="headline">
|
<div layout horizontal wrap center justified class="headline">
|
||||||
{{#if weight}}<div class="sideMargin">{{totalWeight}}lbs</div>{{/if}}
|
{{#if weight}}<div class="sideMargin">{{round totalWeight}}lbs</div>{{/if}}
|
||||||
{{#if value}}<div>{{valueString totalValue}}</div>{{/if}}
|
{{#if value}}<div>{{valueString totalValue}}</div>{{/if}}
|
||||||
</div>
|
</div>
|
||||||
<div layout horizontal wrap class="caption">
|
<div layout horizontal wrap class="caption">
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{{#if description}}
|
{{#if description}}
|
||||||
<hr class="vertMargin">
|
<hr class="vertMargin">
|
||||||
<div class="prewrap">{{description}}</div>
|
<div class="pre-wrap">{{evaluateString charId description}}</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{> effectsViewList charId=charId parentId=_id}}
|
{{> effectsViewList charId=charId parentId=_id}}
|
||||||
{{> attacksViewList charId=charId parentId=_id}}
|
{{> attacksViewList charId=charId parentId=_id}}
|
||||||
@@ -28,10 +28,25 @@
|
|||||||
<template name="itemEdit">
|
<template name="itemEdit">
|
||||||
<paper-input class="fullwidth" id="itemNameInput" label="Name" floatinglabel value={{name}}></paper-input>
|
<paper-input class="fullwidth" id="itemNameInput" label="Name" floatinglabel value={{name}}></paper-input>
|
||||||
<div layout horizontal wrap>
|
<div layout horizontal wrap>
|
||||||
<paper-input-decorator label="Quantity" floatinglabel>
|
<paper-input-decorator label="Quantity"
|
||||||
<input id="quantityInput" type="number" value={{quantity}}>
|
floatinglabel
|
||||||
|
style="width: 80px">
|
||||||
|
<input id="quantityInput"
|
||||||
|
type="number"
|
||||||
|
value={{quantity}}>
|
||||||
</paper-input-decorator>
|
</paper-input-decorator>
|
||||||
{{# if ne1 quantity}}<paper-input flex id="itemPluralInput" label="Plural Name" floatinglabel value={{plural}}></paper-input>{{/if}}
|
{{# if ne1 quantity}}
|
||||||
|
<paper-input flex id="itemPluralInput"
|
||||||
|
label="Plural Name"
|
||||||
|
floatinglabel
|
||||||
|
value={{plural}}></paper-input>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
<div center horizontal layout>
|
||||||
|
<div class="padded">Show increment buttons</div>
|
||||||
|
<paper-checkbox id="incrementCheckbox"
|
||||||
|
checked={{settings.showIncrement}}>
|
||||||
|
</paper-checkbox>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr class="vertMargin">
|
<hr class="vertMargin">
|
||||||
@@ -53,7 +68,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<div center horizontal layout>
|
<div center horizontal layout>
|
||||||
<div class="padded">Requires Attunement</div>
|
<div class="padded">Requires Attunement</div>
|
||||||
<paper-checkbox id="attunementCheckbox" checked={{requiresAttunement}}></paper-checkbox>
|
<paper-checkbox id="attunementCheckbox"
|
||||||
|
checked={{requiresAttunement}}>
|
||||||
|
</paper-checkbox>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ Template.itemEdit.onRendered(function(){
|
|||||||
Template.itemEdit.helpers({
|
Template.itemEdit.helpers({
|
||||||
ne1: function(num){
|
ne1: function(num){
|
||||||
return num != 1;
|
return num != 1;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.itemEdit.events({
|
Template.itemEdit.events({
|
||||||
@@ -81,15 +81,16 @@ Template.itemEdit.events({
|
|||||||
},
|
},
|
||||||
"change #equippedInput": function(event){
|
"change #equippedInput": function(event){
|
||||||
var equipped = Template.instance().find("#equippedInput").checked;
|
var equipped = Template.instance().find("#equippedInput").checked;
|
||||||
var item = Items.findOne(this._id);
|
|
||||||
if (item){
|
|
||||||
if (equipped){
|
if (equipped){
|
||||||
item.equip();
|
Meteor.call("equipItem", this._id, this.charId);
|
||||||
} else {
|
} else {
|
||||||
item.unequip();
|
Meteor.call("unequipItem", this._id, this.charId);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"change #incrementCheckbox": function(event){
|
||||||
|
var value = event.currentTarget.checked;
|
||||||
|
Items.update(this._id, {$set: {"settings.showIncrement": value}});
|
||||||
|
},
|
||||||
"change #attunementCheckbox": function(event){
|
"change #attunementCheckbox": function(event){
|
||||||
var value = event.currentTarget.checked;
|
var value = event.currentTarget.checked;
|
||||||
Items.update(this._id, {$set: {requiresAttunement: value}});
|
Items.update(this._id, {$set: {requiresAttunement: value}});
|
||||||
@@ -107,7 +108,6 @@ Template.containerDropdown.events({
|
|||||||
var detail = event.originalEvent.detail;
|
var detail = event.originalEvent.detail;
|
||||||
if (!detail.isSelected) return;
|
if (!detail.isSelected) return;
|
||||||
var containerId = detail.item.getAttribute("name");
|
var containerId = detail.item.getAttribute("name");
|
||||||
var item = Items.findOne(Template.currentData()._id);
|
Meteor.call("moveItemToContainer", Template.currentData()._id, containerId);
|
||||||
item.moveToContainer(containerId);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -7,13 +7,12 @@ Template.splitStackDialog.helpers({
|
|||||||
|
|
||||||
Template.splitStackDialog.events({
|
Template.splitStackDialog.events({
|
||||||
"tap #moveButton": function(event, instance){
|
"tap #moveButton": function(event, instance){
|
||||||
var item = Items.findOne(this.id);
|
Meteor.call(
|
||||||
if (item){
|
"splitItemToParent",
|
||||||
item.splitToParent(
|
this.id,
|
||||||
{collection: this.parentCollection , id: this.parentId},
|
+instance.find("#quantityInput").value,
|
||||||
+instance.find("#quantityInput").value
|
{collection: this.parentCollection , id: this.parentId}
|
||||||
);
|
);
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"tap #oneButton":function(event, instance){
|
"tap #oneButton":function(event, instance){
|
||||||
instance.find("#quantityInput").value = 1;
|
instance.find("#quantityInput").value = 1;
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ Template.classDialog.onRendered(function(){
|
|||||||
});
|
});
|
||||||
|
|
||||||
Template.classDialog.events({
|
Template.classDialog.events({
|
||||||
|
"color-change": function(event, instance){
|
||||||
|
Classes.update(instance.data.classId, {$set: {color: event.color}});
|
||||||
|
},
|
||||||
"tap #deleteButton": function(event, instance){
|
"tap #deleteButton": function(event, instance){
|
||||||
Classes.softRemoveNode(instance.data.classId);
|
Classes.softRemoveNode(instance.data.classId);
|
||||||
GlobalUI.deletedToast(instance.data.classId, "Classes", "Class");
|
GlobalUI.deletedToast(instance.data.classId, "Classes", "Class");
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
<template name="experienceDialog">
|
<template name="experienceDialog">
|
||||||
{{#with experience}}
|
{{#with experience}}
|
||||||
{{#baseDialog title=name class=colorClass hideColor="true" startEditing=../startEditing}}
|
{{#baseDialog title=name class=color hideColor="true" startEditing=../startEditing}}
|
||||||
<div horizontal layout center-justified>
|
<div horizontal layout center-justified class= "display2">
|
||||||
{{value}}
|
{{value}}
|
||||||
</div>
|
</div>
|
||||||
{{#if description}}
|
{{#if description}}
|
||||||
<hr class="vertMargin">
|
<hr class="vertMargin">
|
||||||
<div class="prewrap">{{description}}</div>
|
<div class="pre-wrap">{{description}}</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{else}}
|
{{else}}
|
||||||
<div horizontal layout>
|
<div horizontal layout>
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
Template.experienceDialog.helpers({
|
Template.experienceDialog.helpers({
|
||||||
feature: function(){
|
experience: function(){
|
||||||
return Features.findOne(this.featureId);
|
Experiences.findOne(this.experienceId);
|
||||||
|
return Experiences.findOne(this.experienceId);
|
||||||
|
},
|
||||||
|
color: function() {
|
||||||
|
var char = Characters.findOne(this.charId, {fields: {color: 1}});
|
||||||
|
if (char) return getColorClass(char.color);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -27,10 +32,3 @@ Template.experienceDialog.events({
|
|||||||
Experiences.update(this._id, {$set: {description: value}});
|
Experiences.update(this._id, {$set: {description: value}});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.experienceDialog.helpers({
|
|
||||||
experience: function(){
|
|
||||||
Experiences.findOne(this.experienceId);
|
|
||||||
return Experiences.findOne(this.experienceId);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|||||||
@@ -1,73 +1,98 @@
|
|||||||
<template name="journal">
|
<template name="journal">
|
||||||
<div fit>
|
<div fit>
|
||||||
<div id="journal" class="scroll-y" fit>
|
<div id="journal" class="scroll-y" fit>
|
||||||
<div class="containers">
|
<div class="column-container">
|
||||||
<!--Experience Table-->
|
<!--Experience Table-->
|
||||||
<paper-shadow class="card container experiencesCard" hero-id="main" {{detailHero}}>
|
<paper-shadow class="card experiencesCard"
|
||||||
<div class="whiteTop" hero-id="toolbar" layout horizontal center {{detailHero}}>
|
hero-id="main" {{detailHero}}>
|
||||||
<div class="containerName subhead" flex>Experience</div>
|
<div class="top white subhead"
|
||||||
<div class="subhead">{{experience}} XP</div>
|
hero-id="toolbar" {{detailHero}}
|
||||||
|
layout horizontal center>
|
||||||
|
<div flex>Experience</div>
|
||||||
|
<div >{{experience}} XP</div>
|
||||||
<paper-icon-button class="black54" id="addXP" icon="add"></paper-icon-button>
|
<paper-icon-button class="black54" id="addXP" icon="add"></paper-icon-button>
|
||||||
</div>
|
</div>
|
||||||
<div class="containerMain experiences">
|
<div class="bottom list">
|
||||||
{{#each experiences}}
|
{{#each experiences}}
|
||||||
<div class="itemSlot">
|
<div class="item-slot">
|
||||||
<paper-item class="inventoryItem experience" hero-id="main" {{detailHero}} layout horizontal>
|
<div class="item experience"
|
||||||
<div flex>{{name}}</div><div class="xpValue">{{value}}</div>
|
hero-id="main" {{detailHero}}
|
||||||
</paper-item>
|
layout horizontal center>
|
||||||
|
<div flex>{{name}}</div>
|
||||||
|
<div class="xpValue">{{value}}</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
{{#if moreExperiencesOrCollapse}}
|
{{#if moreExperiencesOrCollapse}}
|
||||||
<div class="containerFoot" layout="" horizontal="" center="" end-justified="">
|
<div layout horizontal center end-justified>
|
||||||
<paper-button id="moreExperiences" disabled={{notMoreExperiences}}>Load More</paper-button>
|
<paper-button id="moreExperiences"
|
||||||
<paper-button id="lessExperiences" disabled={{cantCollapse}}>Collapse</paper-button>
|
disabled={{notMoreExperiences}}>
|
||||||
|
Load More
|
||||||
|
</paper-button>
|
||||||
|
<paper-button id="lessExperiences"
|
||||||
|
disabled={{cantCollapse}}>
|
||||||
|
Collapse
|
||||||
|
</paper-button>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</paper-shadow>
|
</paper-shadow>
|
||||||
<!--Class Table-->
|
<!--Class Table-->
|
||||||
<paper-shadow class="card container" hero-id="main" {{detailHero}}>
|
<paper-shadow class="card"
|
||||||
<div class="whiteTop" hero-id="toolbar" layout horizontal center {{detailHero}}>
|
hero-id="main" {{detailHero}}>
|
||||||
|
<div class="white top"
|
||||||
|
hero-id="toolbar" {{detailHero}}
|
||||||
|
layout horizontal center>
|
||||||
<div flex>
|
<div flex>
|
||||||
<div class="containerName subhead">Level {{level}}</div>
|
<div class="containerName subhead">
|
||||||
|
Level {{level}}
|
||||||
|
</div>
|
||||||
{{#if nextLevelXP}}
|
{{#if nextLevelXP}}
|
||||||
<div class="caption">
|
<div class="caption">
|
||||||
Next Level: {{nextLevelXP}}XP
|
Next Level: {{nextLevelXP}}XP
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
<paper-icon-button class="black54" id="addClassButton" icon="add"></paper-icon-button>
|
<paper-icon-button class="black54"
|
||||||
|
id="addClassButton"
|
||||||
|
icon="add">
|
||||||
|
</paper-icon-button>
|
||||||
</div>
|
</div>
|
||||||
<div class="containerMain experiences">
|
<div class="bottom list">
|
||||||
<div class="itemSlot">
|
<div class="item-slot">
|
||||||
<paper-item class="inventoryItem race" hero-id="main" {{detailHero "race" _id}} layout horizontal>
|
<div class="item race"
|
||||||
|
hero-id="main" {{detailHero "race" _id}}
|
||||||
|
layout horizontal center>
|
||||||
{{race}}
|
{{race}}
|
||||||
</paper-item>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{#each classes}}
|
{{#each classes}}
|
||||||
<div class="itemSlot">
|
<div class="item-slot">
|
||||||
<paper-item class="inventoryItem class" hero-id="main" {{detailHero}} layout horizontal>
|
<div class="item class"
|
||||||
|
hero-id="main" {{detailHero}}
|
||||||
|
layout horizontal center>
|
||||||
{{name}} {{level}}
|
{{name}} {{level}}
|
||||||
</paper-item>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
</paper-shadow>
|
</paper-shadow>
|
||||||
<!--Notes-->
|
<!--Notes-->
|
||||||
{{#each notes}}
|
{{#each notes}}
|
||||||
<paper-shadow class="card container" hero-id="main" {{detailHero}}>
|
<paper-shadow class="card" hero-id="main" {{detailHero}}>
|
||||||
<div class="containerTop {{colorClass}} noteTop" hero-id="toolbar" layout horizontal center {{detailHero}}>
|
<div class="top {{colorClass}} noteTop subhead"
|
||||||
<div flex>
|
hero-id="toolbar" {{detailHero}}
|
||||||
<div class="containerName subhead">{{name}}</div>
|
layout horizontal center>
|
||||||
|
{{name}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="bottom text">{{description}}</div>
|
||||||
<div class="containerMain preline">{{description}}</div>
|
|
||||||
</paper-shadow>
|
</paper-shadow>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
<div class="fab-buffer"></div>
|
<div class="fab-buffer"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{{#if canEditCharacter _id}}
|
||||||
<paper-fab id="addNote"
|
<paper-fab id="addNote"
|
||||||
class="floatyButton"
|
class="floatyButton"
|
||||||
icon="add"
|
icon="add"
|
||||||
@@ -75,4 +100,5 @@
|
|||||||
role="button"
|
role="button"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
hero-id="main"></paper-fab>
|
hero-id="main"></paper-fab>
|
||||||
|
{{/if}}
|
||||||
</template>
|
</template>
|
||||||
@@ -1,18 +1,30 @@
|
|||||||
<template name="noteDialog">
|
<template name="noteDialog">
|
||||||
{{#with note}}
|
{{#with note}}
|
||||||
{{#baseDialog title=name class=colorClass startEditing=../startEditing}}
|
{{#baseDialog title=name class=colorClass startEditing=../startEditing}}
|
||||||
<div class="prewrap">{{description}}</div>
|
<div class="pre-wrap">{{description}}</div>
|
||||||
{{else}}
|
{{else}}
|
||||||
<!--Name-->
|
{{> noteDialogEdit}}
|
||||||
<div horizontal layout>
|
|
||||||
<paper-input id="noteNameInput" label="Name" floatinglabel value={{name}} flex></paper-input>
|
|
||||||
</div>
|
|
||||||
<!--Description-->
|
|
||||||
<paper-input-decorator label="Description" floatinglabel layout vertical>
|
|
||||||
<paper-autogrow-textarea>
|
|
||||||
<textarea id="noteDescriptionInput" value={{description}}></textarea>
|
|
||||||
</paper-autogrow-textarea>
|
|
||||||
</paper-input-decorator>
|
|
||||||
{{/baseDialog}}
|
{{/baseDialog}}
|
||||||
{{/with}}
|
{{/with}}
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<template name="noteDialogEdit">
|
||||||
|
<!--Name-->
|
||||||
|
<div horizontal layout>
|
||||||
|
<paper-input id="noteNameInput"
|
||||||
|
label="Name"
|
||||||
|
floatinglabel
|
||||||
|
value={{name}}
|
||||||
|
flex>
|
||||||
|
</paper-input>
|
||||||
|
</div>
|
||||||
|
<!--Description, formatting this nicely breaks it, leave it as is-->
|
||||||
|
<paper-input-decorator label="Description"
|
||||||
|
floatinglabel
|
||||||
|
layout vertical>
|
||||||
|
<paper-autogrow-textarea>
|
||||||
|
<textarea id="noteDescriptionInput"
|
||||||
|
value={{description}}></textarea>
|
||||||
|
</paper-autogrow-textarea>
|
||||||
|
</paper-input-decorator>
|
||||||
|
</template>
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
Template.noteDialog.onRendered(function(){
|
Template.noteDialog.helpers({
|
||||||
updatePolymerInputs(this);
|
note: function(){
|
||||||
|
return Notes.findOne(this.noteId);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.noteDialog.events({
|
Template.noteDialog.events({
|
||||||
@@ -11,6 +13,13 @@ Template.noteDialog.events({
|
|||||||
GlobalUI.deletedToast(instance.data.noteId, "Notes", "Note");
|
GlobalUI.deletedToast(instance.data.noteId, "Notes", "Note");
|
||||||
GlobalUI.closeDetail();
|
GlobalUI.closeDetail();
|
||||||
},
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.noteDialogEdit.onRendered(function(){
|
||||||
|
updatePolymerInputs(this);
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.noteDialogEdit.events({
|
||||||
"change #noteNameInput, input #noteNameInput": function(event){
|
"change #noteNameInput, input #noteNameInput": function(event){
|
||||||
var value = event.currentTarget.value;
|
var value = event.currentTarget.value;
|
||||||
Notes.update(this._id, {$set: {name: value}});
|
Notes.update(this._id, {$set: {name: value}});
|
||||||
@@ -20,9 +29,3 @@ Template.noteDialog.events({
|
|||||||
Notes.update(this._id, {$set: {description: value}});
|
Notes.update(this._id, {$set: {description: value}});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.noteDialog.helpers({
|
|
||||||
note: function(){
|
|
||||||
return Notes.findOne(this.noteId);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
<template name="raceDialog">
|
<template name="raceDialog">
|
||||||
{{#baseDialog title="Race" class=colorClass hideColor="true" hideDelete="true" startEditing=startEditing}}
|
{{#baseDialog title="Race" class=color hideColor="true" hideDelete="true" startEditing=startEditing}}
|
||||||
|
<div horizontal layout center-justified class= "display2">
|
||||||
|
{{race}}
|
||||||
|
</div>
|
||||||
{{> effectsViewList charId=charId parentId=charId parentGroup="racial"}}
|
{{> effectsViewList charId=charId parentId=charId parentGroup="racial"}}
|
||||||
{{> proficiencyViewList charId=charId parentId=charId parentGroup="racial"}}
|
{{> proficiencyViewList charId=charId parentId=charId parentGroup="racial"}}
|
||||||
{{else}}
|
{{else}}
|
||||||
|
|||||||
@@ -13,5 +13,9 @@ Template.raceDialog.helpers({
|
|||||||
race: function(){
|
race: function(){
|
||||||
var char = Characters.findOne(this.charId, {fields: {race: 1}});
|
var char = Characters.findOne(this.charId, {fields: {race: 1}});
|
||||||
return char && char.race;
|
return char && char.race;
|
||||||
}
|
},
|
||||||
|
color: function() {
|
||||||
|
var char = Characters.findOne(this.charId, {fields: {color: 1}});
|
||||||
|
if (char) return getColorClass(char.color);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template name="persona">
|
<template name="persona">
|
||||||
<div fit>
|
<div fit>
|
||||||
<div id="persona" class="scroll-y" fit>
|
<div id="persona" class="scroll-y" fit>
|
||||||
<div class="containers">
|
<div class="column-container">
|
||||||
{{#with characterDetails}}
|
{{#with characterDetails}}
|
||||||
{{#containerCardHelper this}}{{alignment}} {{gender}} {{race}}{{/containerCardHelper}}
|
{{#containerCardHelper this}}{{alignment}} {{gender}} {{race}}{{/containerCardHelper}}
|
||||||
{{/with}}
|
{{/with}}
|
||||||
@@ -11,11 +11,11 @@
|
|||||||
{{> containerCard characterField "bonds" "Bonds"}}
|
{{> containerCard characterField "bonds" "Bonds"}}
|
||||||
{{> containerCard characterField "flaws" "Flaws"}}
|
{{> containerCard characterField "flaws" "Flaws"}}
|
||||||
{{> containerCard characterField "backstory" "Background"}}
|
{{> containerCard characterField "backstory" "Background"}}
|
||||||
<paper-shadow class="card container">
|
<paper-shadow class="card">
|
||||||
<div class="containerTop whiteTop" layout horizontal center>
|
<div class="white top subhead">
|
||||||
<div class="containerName subhead" flex>Languages</div>
|
Languages
|
||||||
</div>
|
</div>
|
||||||
<div flex class="containerMain listPadded">
|
<div class="bottom list">
|
||||||
{{#each languages}}
|
{{#each languages}}
|
||||||
{{> proficiencyListItem}}
|
{{> proficiencyListItem}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
@@ -27,14 +27,19 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="containerCard">
|
<template name="containerCard">
|
||||||
{{#containerCardHelper this}}{{body}}{{/containerCardHelper}}
|
{{#containerCardHelper this}}{{evaluateString _id body}}{{/containerCardHelper}}
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="containerCardHelper">
|
<template name="containerCardHelper">
|
||||||
<paper-shadow class="card container {{class}}" hero-id="main" {{detailHero field ../_id}}>
|
<paper-shadow class="card {{class}}"
|
||||||
<div class="containerTop {{colorClass}} {{topClass}}" hero-id="toolbar" layout horizontal center {{detailHero field ../_id}}>
|
hero-id="main" {{detailHero field ../_id}}>
|
||||||
<div class="containerName subhead" hero-id="title" flex {{detailHero field ../_id}}>{{title}}</div>
|
<div class="top subhead {{colorClass}} {{topClass}}"
|
||||||
|
hero-id="toolbar" {{detailHero field ../_id}}>
|
||||||
|
<div class="subhead" flex
|
||||||
|
hero-id="title" {{detailHero field ../_id}}>
|
||||||
|
{{title}}
|
||||||
</div>
|
</div>
|
||||||
<div flex class="containerMain prewrap">{{> UI.contentBlock}}</div>
|
</div>
|
||||||
|
<div class="bottom text">{{> UI.contentBlock}}</div>
|
||||||
</paper-shadow>
|
</paper-shadow>
|
||||||
</template>
|
</template>
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<template name="textDialog">
|
<template name="textDialog">
|
||||||
{{#baseDialog title=title class=colorClass hideColor="true" hideDelete="true" startEditing=startEditing}}
|
{{#baseDialog title=title class=colorClass hideColor="true" hideDelete="true" startEditing=startEditing}}
|
||||||
<div class="prewrap">{{value}}</div>
|
<div class="pre-wrap">{{evaluateString charId value}}</div>
|
||||||
{{else}}
|
{{else}}
|
||||||
{{> textDialogEdit}}
|
{{> textDialogEdit}}
|
||||||
{{/baseDialog}}
|
{{/baseDialog}}
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
<template name="proficiencyListItem">
|
<template name="proficiencyListItem">
|
||||||
<div class="itemSlot">
|
<div class="item-slot">
|
||||||
<paper-item noink class="white proficiencyItem" hero-id="main" {{detailHero}}>
|
<div class="proficiency item small"
|
||||||
<core-icon icon="{{profIcon}}" class="black54"></core-icon>
|
hero-id="main" {{detailHero}}
|
||||||
<div class="sideMargin">{{getName}}</div>
|
layout horizontal center>
|
||||||
</paper-item>
|
<core-icon icon="{{profIcon}}"
|
||||||
|
style="margin-right: 16px;"></core-icon>
|
||||||
|
<div flex>{{getName}}</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -14,7 +14,7 @@ Template.proficiencyListItem.helpers({
|
|||||||
});
|
});
|
||||||
|
|
||||||
Template.proficiencyListItem.events({
|
Template.proficiencyListItem.events({
|
||||||
"tap .proficiencyItem": function(event, instance){
|
"tap .proficiency": function(event, instance){
|
||||||
openParentDialog(this.parent, this.charId, this._id);
|
openParentDialog(this.parent, this.charId, this._id);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
<span class="body2">Duration: </span><span>{{duration}}</span>
|
<span class="body2">Duration: </span><span>{{duration}}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="prewrap">{{description}}</div>
|
<div class="pre-wrap">{{evaluateString charId description}}</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="spellEdit">
|
<template name="spellEdit">
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
<hr class="vertMargin">
|
<hr class="vertMargin">
|
||||||
<div class="prewrap">{{description}}</div>
|
<div class="pre-wrap">{{evaluateString charId description}}</div>
|
||||||
</div>
|
</div>
|
||||||
{{else}}
|
{{else}}
|
||||||
<!--Name-->
|
<!--Name-->
|
||||||
|
|||||||
@@ -1,84 +1,120 @@
|
|||||||
<template name="spells">
|
<template name="spells">
|
||||||
<div fit>
|
<div fit>
|
||||||
<div id="spells" class="scroll-y" fit>
|
<div id="spells" class="scroll-y" fit>
|
||||||
<div class="spellsContainer" layout horizontal start wrap>
|
<div style="padding: 4px;"
|
||||||
|
layout horizontal start wrap>
|
||||||
{{#if hasSlots}}
|
{{#if hasSlots}}
|
||||||
<paper-shadow class="card container spellSlotContainer" hero-id="main" {{detailHero}}>
|
<paper-shadow class="card"
|
||||||
<div class="containerTop whiteTop" layout horizontal center>
|
style="margin: 4px;"
|
||||||
<div class="containerName subhead" hero-id="title" flex>Spell Slots</div>
|
hero-id="main" {{detailHero}}>
|
||||||
|
<div class="white top subhead"
|
||||||
|
layout horizontal center>
|
||||||
|
Spell Slots
|
||||||
</div>
|
</div>
|
||||||
<div flex class="containerMain">
|
<div class="bottom list">
|
||||||
{{#each levels}}{{#if showSlots ..}}
|
{{#each levels}}{{#if showSlots ..}}
|
||||||
<div class="itemSlot">
|
<div class="item-slot">
|
||||||
<paper-item class="inventoryItem spellSlot" hero-id="main" {{detailHero slotStatName ../_id}} layout horizontal>
|
<div class="item spellSlot"
|
||||||
<div class="slotName">
|
hero-id="main" {{detailHero slotStatName ../_id}}
|
||||||
|
layout horizontal center>
|
||||||
|
<div style="margin-right: 16px">
|
||||||
{{name}}
|
{{name}}
|
||||||
</div>
|
</div>
|
||||||
<div flex layout horizontal center>
|
<div flex layout horizontal center>
|
||||||
{{#each slotBubbles ..}}
|
{{#each slotBubbles ..}}
|
||||||
<paper-icon-button class="slotBubble" icon={{icon}} disabled={{disabled}}></paper-icon-button>
|
<paper-icon-button class="slotBubble"
|
||||||
|
icon={{icon}}
|
||||||
|
disabled={{disabled}}>
|
||||||
|
</paper-icon-button>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
</paper-item>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}{{/each}}
|
{{/if}}{{/each}}
|
||||||
</div>
|
</div>
|
||||||
</paper-shadow>
|
</paper-shadow>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#each spellLists}}
|
{{#each spellLists}}
|
||||||
<paper-shadow class="card container spellList" hero-id="main" {{detailHero}} flex>
|
<paper-shadow class="card spellList" flex
|
||||||
<div class="containerTop {{colorClass}}" hero-id="toolbar" layout horizontal center {{detailHero}}>
|
hero-id="main" {{detailHero}}
|
||||||
|
style="margin: 4px;">
|
||||||
|
<div class="top {{colorClass}}"
|
||||||
|
hero-id="toolbar" {{detailHero}}
|
||||||
|
layout horizontal center>
|
||||||
<div flex>
|
<div flex>
|
||||||
<div class="containerName subhead">{{name}}</div>
|
<div class="subhead">{{name}}</div>
|
||||||
<div class="caption">
|
<div class="caption">
|
||||||
{{#if saveDC}}
|
{{#if saveDC}}
|
||||||
|
<span style="margin-right: 16px;">
|
||||||
Save DC: {{evaluate charId saveDC}}
|
Save DC: {{evaluate charId saveDC}}
|
||||||
<div style="width: 16px; display: inline-block;"></div>
|
</span>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#if attackBonus}}
|
{{#if attackBonus}}
|
||||||
|
<span>
|
||||||
Attack Bonus: {{evaluateSigned charId attackBonus}}
|
Attack Bonus: {{evaluateSigned charId attackBonus}}
|
||||||
|
</span>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{#if settings.showUnprepared}}
|
{{#if settings.showUnprepared}}
|
||||||
{{#if maxPrepared}}<div class="subhead">{{numPrepared}} / {{evaluate charId maxPrepared}}</div>{{/if}}
|
{{#if maxPrepared}}
|
||||||
<core-tooltip label="Done" position="left">
|
<div class="subhead">
|
||||||
<paper-icon-button class="finishPrep" icon="done"></paper-icon-button>
|
{{numPrepared}} / {{evaluate charId maxPrepared}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
<core-tooltip label="Done"
|
||||||
|
position="left">
|
||||||
|
<paper-icon-button class="finishPrep"
|
||||||
|
icon="done">
|
||||||
|
</paper-icon-button>
|
||||||
</core-tooltip>
|
</core-tooltip>
|
||||||
{{else}}
|
{{else}}
|
||||||
<core-tooltip label="Change prepared spells" position="left">
|
<core-tooltip label="Change prepared spells"
|
||||||
<paper-icon-button class="prepSpells" icon="book"></paper-icon-button>
|
position="left">
|
||||||
|
<paper-icon-button class="prepSpells"
|
||||||
|
icon="book">
|
||||||
|
</paper-icon-button>
|
||||||
</core-tooltip>
|
</core-tooltip>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
<div class="containerMain">
|
<div class="bottom list column-container">
|
||||||
{{#each levels}}
|
{{#each levels}}
|
||||||
<div class="spellLevel">
|
<div class="spellLevel">
|
||||||
{{#if spellCount .. ../../_id}}
|
{{#if spellCount .. ../../_id}}
|
||||||
<div class="list-subhead" layout horizontal center>
|
<div class="subhead">
|
||||||
{{name}}
|
{{name}}
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#each spells ../_id ../../_id}}
|
{{#each spells ../_id ../../_id}}
|
||||||
{{#if showSpell ../../settings.showUnprepared}}
|
{{#if showSpell ../../settings.showUnprepared}}
|
||||||
<div class="itemSlot">
|
<div class="item-slot">
|
||||||
<paper-item class="inventoryItem spell" hero-id="main" {{detailHero}}
|
<div class="tall spell item"
|
||||||
|
hero-id="main" {{detailHero}}
|
||||||
layout horizontal center>
|
layout horizontal center>
|
||||||
<!--disabled={{cantCast ../level ../../..}} to grey out spells above highest usable slot-->
|
|
||||||
<core-icon icon="social:whatshot"
|
<core-icon icon="social:whatshot"
|
||||||
style="color: {{hexColor color}};"
|
style="color: {{hexColor color}};
|
||||||
|
margin-right: 16px;"
|
||||||
></core-icon>
|
></core-icon>
|
||||||
<div flex layout vertical>
|
<div flex layout vertical>
|
||||||
<div>{{name}}</div>
|
<div>{{name}}</div>
|
||||||
<div class="caption">
|
<div class="caption">
|
||||||
{{school}} {{castingTime}}
|
{{school}}
|
||||||
{{#if ritual}}(ritual){{/if}}{{#if spellComponents}} - {{spellComponents}}{{/if}}
|
{{castingTime}}
|
||||||
|
{{#if ritual}}
|
||||||
|
(ritual)
|
||||||
|
{{/if}}
|
||||||
|
{{#if spellComponents}}
|
||||||
|
- {{spellComponents}}
|
||||||
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{#if ../../settings.showUnprepared}}
|
{{#if ../../settings.showUnprepared}}
|
||||||
<paper-checkbox class="preparedCheckbox" checked={{isPrepared}} disabled={{cantUnprepare}}></paper-checkbox>
|
<paper-checkbox class="preparedCheckbox"
|
||||||
|
checked={{isPrepared}}
|
||||||
|
disabled={{cantUnprepare}}>
|
||||||
|
</paper-checkbox>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</paper-item>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
@@ -91,8 +127,20 @@
|
|||||||
<div class="fab-buffer"></div>
|
<div class="fab-buffer"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<paper-fab-menu id="inventoryAddMenu" icon="add" closeIcon="close" duration="0.3">
|
{{#if canEditCharacter _id}}
|
||||||
<paper-fab-menu-item id="addSpell" icon="note-add" color="#d23f31" tooltip="Spell"></paper-fab-menu-item>
|
{{#fabMenu}}
|
||||||
<paper-fab-menu-item id="addSpellList" icon="work" color="#d23f31" tooltip="Spell List"></paper-fab-menu-item>
|
<core-tooltip label="New spell list" position="left">
|
||||||
</paper-fab-menu>
|
<paper-fab icon="work"
|
||||||
|
class="addSpellList"
|
||||||
|
mini>
|
||||||
|
</paper-fab>
|
||||||
|
</core-tooltip>
|
||||||
|
<core-tooltip label="New spell" position="left">
|
||||||
|
<paper-fab icon="note-add"
|
||||||
|
class="addSpell"
|
||||||
|
mini>
|
||||||
|
</paper-fab>
|
||||||
|
</core-tooltip>
|
||||||
|
{{/fabMenu}}
|
||||||
|
{{/if}}
|
||||||
</template>
|
</template>
|
||||||
@@ -170,7 +170,7 @@ Template.spells.events({
|
|||||||
heroId: charId + stat,
|
heroId: charId + stat,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap .containerTop": function(event){
|
"tap .spellList .top": function(event){
|
||||||
GlobalUI.setDetail({
|
GlobalUI.setDetail({
|
||||||
template: "spellListDialog",
|
template: "spellListDialog",
|
||||||
data: {spellListId: this._id, charId: this.charId},
|
data: {spellListId: this._id, charId: this.charId},
|
||||||
@@ -184,7 +184,7 @@ Template.spells.events({
|
|||||||
heroId: this._id,
|
heroId: this._id,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap #addSpellList": function(event){
|
"tap .addSpellList": function(event){
|
||||||
var charId = this.charId;
|
var charId = this.charId;
|
||||||
SpellLists.insert({
|
SpellLists.insert({
|
||||||
name: "New SpellList",
|
name: "New SpellList",
|
||||||
@@ -201,7 +201,7 @@ Template.spells.events({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap #addSpell": function(event){
|
"tap .addSpell": function(event){
|
||||||
var charId = this.charId;
|
var charId = this.charId;
|
||||||
var listId = SpellLists.findOne({charId: this._id})._id;
|
var listId = SpellLists.findOne({charId: this._id})._id;
|
||||||
Spells.insert({
|
Spells.insert({
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
.card.double {
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card.double > div{
|
|
||||||
vertical-align: top;
|
|
||||||
padding: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.abilityScore {
|
|
||||||
width: 70px;
|
|
||||||
text-align: center;
|
|
||||||
background-color: #D50000;
|
|
||||||
padding: 16px;
|
|
||||||
position: relative;
|
|
||||||
border-radius: 2px 0 0 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#stats .card {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.abilityCardRight {
|
|
||||||
flex-grow: 1;
|
|
||||||
padding-right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.abilityCardRight hr{
|
|
||||||
margin: 8px 0 8px -16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.abilityCardRight h1{
|
|
||||||
margin-bottom: 8px;
|
|
||||||
}
|
|
||||||
@@ -1,122 +1,14 @@
|
|||||||
<template name="abilityMiniCard">
|
<template name="abilityMiniCard">
|
||||||
<paper-shadow class="card double abilityMiniCard"
|
<paper-shadow class="card abilityMiniCard clickable"
|
||||||
hero-id="main" {{detailHero ability ../_id}}>
|
hero-id="main" {{detailHero ability ../_id}}
|
||||||
<div class="abilityScore white-text {{color}}"
|
layout horizontal>
|
||||||
|
<div class="left white-text {{color}}"
|
||||||
hero-id="toolbar" {{detailHero ability ../_id}}>
|
hero-id="toolbar" {{detailHero ability ../_id}}>
|
||||||
<h1 class="display1">{{../attributeValue ability}}</h1>
|
<div class="display1">{{../attributeValue ability}}</div>
|
||||||
<h2>{{../abilityMod ability}}</h2>
|
<div class="title">{{../abilityMod ability}}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="abilityCardRight subhead" layout horizontal center>
|
<div class="right subhead" layout horizontal center>
|
||||||
{{title}}
|
{{title}}
|
||||||
</div>
|
</div>
|
||||||
<paper-ripple fit></paper-ripple>
|
|
||||||
</paper-shadow>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<template name="strengthCard">
|
|
||||||
<paper-shadow class="card double">
|
|
||||||
<div class="abilityScore red white-text">
|
|
||||||
{{> ripple color="#eee"}}
|
|
||||||
<h1 class="display1">{{attributeValue "strength"}}</h1>
|
|
||||||
<h2>{{abilityMod "strength"}}</h2>
|
|
||||||
</div>
|
|
||||||
<div class="abilityCardRight">
|
|
||||||
<h1>Strength</h1>
|
|
||||||
{{> skillRow name="Save" skill="strengthSave"}}
|
|
||||||
<hr>
|
|
||||||
{{> skillRow name="Athletics" skill="athletics"}}
|
|
||||||
</div>
|
|
||||||
</paper-shadow>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<template name="dexterityCard">
|
|
||||||
<paper-shadow class="card double">
|
|
||||||
<div class="abilityScore green white-text">
|
|
||||||
{{> ripple color="#eee"}}
|
|
||||||
<h1 class="display1">{{attributeValue "dexterity"}}</h1>
|
|
||||||
<h2>{{abilityMod "dexterity"}}</h2>
|
|
||||||
</div>
|
|
||||||
<div class="abilityCardRight">
|
|
||||||
<h1>Dexterity</h1>
|
|
||||||
{{> skillRow name="Save" skill="dexteritySave"}}
|
|
||||||
<hr>
|
|
||||||
{{> skillRow name="Acrobatics" skill="acrobatics"}}
|
|
||||||
{{> skillRow name="Sleight of Hand" skill="sleightOfHand"}}
|
|
||||||
{{> skillRow name="Stealth" skill="stealth"}}
|
|
||||||
</div>
|
|
||||||
</paper-shadow>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<template name="constitutionCard">
|
|
||||||
<paper-shadow class="card double">
|
|
||||||
<div class="abilityScore deep-orange white-text">
|
|
||||||
{{> ripple color="#eee"}}
|
|
||||||
<h1 class="display1">{{attributeValue "constitution"}}</h1>
|
|
||||||
<h2>{{abilityMod "constitution"}}</h2>
|
|
||||||
</div>
|
|
||||||
<div class="abilityCardRight">
|
|
||||||
<h1>Constitution</h1>
|
|
||||||
{{> skillRow name="Save" skill="constitutionSave"}}
|
|
||||||
<hr>
|
|
||||||
</div>
|
|
||||||
</paper-shadow>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<template name="intelligenceCard">
|
|
||||||
<paper-shadow class="card double">
|
|
||||||
<div class="abilityScore indigo white-text">
|
|
||||||
{{> ripple color="#eee"}}
|
|
||||||
<h1 class="display1">{{attributeValue "intelligence"}}</h1>
|
|
||||||
<h2>{{abilityMod "intelligence"}}</h2>
|
|
||||||
</div>
|
|
||||||
<div class="abilityCardRight">
|
|
||||||
<h1>Intelligence</h1>
|
|
||||||
{{> skillRow name="Save" skill="intelligenceSave"}}
|
|
||||||
<hr>
|
|
||||||
{{> skillRow name="Arcana" skill="arcana"}}
|
|
||||||
{{> skillRow name="History" skill="history"}}
|
|
||||||
{{> skillRow name="Investigation" skill="investigation"}}
|
|
||||||
{{> skillRow name="Nature" skill="nature"}}
|
|
||||||
{{> skillRow name="Religion" skill="religion"}}
|
|
||||||
</div>
|
|
||||||
</paper-shadow>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<template name="wisdomCard">
|
|
||||||
<paper-shadow class="card double">
|
|
||||||
<div class="abilityScore purple white-text">
|
|
||||||
{{> ripple color="#eee"}}
|
|
||||||
<h1 class="display1">{{attributeValue "wisdom"}}</h1>
|
|
||||||
<h2>{{abilityMod "wisdom"}}</h2>
|
|
||||||
</div>
|
|
||||||
<div class="abilityCardRight">
|
|
||||||
<h1>Wisdom</h1>
|
|
||||||
{{> skillRow name="Save" skill="wisdomSave"}}
|
|
||||||
<hr>
|
|
||||||
{{> skillRow name="Animal Handling" skill="animalHandling"}}
|
|
||||||
{{> skillRow name="Insight" skill="insight"}}
|
|
||||||
{{> skillRow name="Medicine" skill="medicine"}}
|
|
||||||
{{> skillRow name="Perception" skill="perception" showPassive="true"}}
|
|
||||||
{{> skillRow name="Survival" skill="survival"}}
|
|
||||||
</div>
|
|
||||||
</paper-shadow>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<template name="charismaCard">
|
|
||||||
<paper-shadow class="card double">
|
|
||||||
<div class="abilityScore pink white-text">
|
|
||||||
{{> ripple color="#eee"}}
|
|
||||||
<h1 class="display1">{{attributeValue "charisma"}}</h1>
|
|
||||||
<h2>{{abilityMod "charisma"}}</h2>
|
|
||||||
</div>
|
|
||||||
<div class="abilityCardRight">
|
|
||||||
<h1>Charisma</h1>
|
|
||||||
{{> skillRow name="Save" skill="charismaSave"}}
|
|
||||||
<hr>
|
|
||||||
{{> skillRow name="Deception" skill="deception"}}
|
|
||||||
{{> skillRow name="Intimidation" skill="intimidation"}}
|
|
||||||
{{> skillRow name="Performance" skill="performance"}}
|
|
||||||
{{> skillRow name="Persuasion" skill="persuasion"}}
|
|
||||||
</div>
|
|
||||||
</paper-shadow>
|
</paper-shadow>
|
||||||
</template>
|
</template>
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<!-- needs name, char, and statName -->
|
<!-- needs name, char, and statName -->
|
||||||
<template name="attributeDialog">
|
<template name="attributeDialog">
|
||||||
{{#baseDialog title=name class=colorClass hideEdit=true}}
|
{{#baseDialog title=name class=color hideEdit=true}}
|
||||||
{{> attributeDialogView}}
|
{{> attributeDialogView}}
|
||||||
{{/baseDialog}}
|
{{/baseDialog}}
|
||||||
</template>
|
</template>
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
{{#each baseEffects}}
|
{{#each baseEffects}}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{sourceName}}</td>
|
<td>{{sourceName}}</td>
|
||||||
<td>{{signedString statValue}}</td>
|
<td>Base: {{statValue}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
{{#each addEffects}}
|
{{#each addEffects}}
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
{{#each mulEffects}}
|
{{#each mulEffects}}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{sourceName}}</td>
|
<td>{{sourceName}}</td>
|
||||||
<td>×{{statValue}}</td>
|
<td>× {{statValue}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
{{#each minEffects}}
|
{{#each minEffects}}
|
||||||
|
|||||||
@@ -93,6 +93,14 @@ var abilities = {
|
|||||||
charisma: {name: "Charisma"},
|
charisma: {name: "Charisma"},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Template.attributeDialog.helpers({
|
||||||
|
color: function(){
|
||||||
|
if (this.color) return this.color + " white-text";
|
||||||
|
var char = Characters.findOne(this.charId, {fields: {color: 1}});
|
||||||
|
if (char) return getColorClass(char.color);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
Template.attributeDialogView.helpers({
|
Template.attributeDialogView.helpers({
|
||||||
or: function(a, b, c){
|
or: function(a, b, c){
|
||||||
return a || b || c;
|
return a || b || c;
|
||||||
@@ -106,27 +114,27 @@ Template.attributeDialogView.helpers({
|
|||||||
},
|
},
|
||||||
baseEffects: function(){
|
baseEffects: function(){
|
||||||
return Effects.find(
|
return Effects.find(
|
||||||
{charId: this.charId, stat: this.statName, operation: "base"}
|
{charId: this.charId, stat: this.statName, operation: "base", enabled: true}
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
addEffects: function(){
|
addEffects: function(){
|
||||||
return Effects.find(
|
return Effects.find(
|
||||||
{charId: this.charId, stat: this.statName, operation: "add"}
|
{charId: this.charId, stat: this.statName, operation: "add", enabled: true}
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
mulEffects: function(){
|
mulEffects: function(){
|
||||||
return Effects.find(
|
return Effects.find(
|
||||||
{charId: this.charId, stat: this.statName, operation: "mul"}
|
{charId: this.charId, stat: this.statName, operation: "mul", enabled: true}
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
minEffects: function(){
|
minEffects: function(){
|
||||||
return Effects.find(
|
return Effects.find(
|
||||||
{charId: this.charId, stat: this.statName, operation: "min"}
|
{charId: this.charId, stat: this.statName, operation: "min", enabled: true}
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
maxEffects: function(){
|
maxEffects: function(){
|
||||||
return Effects.find(
|
return Effects.find(
|
||||||
{charId: this.charId, stat: this.statName, operation: "max"}
|
{charId: this.charId, stat: this.statName, operation: "max", enabled: true}
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
attributeBase: function(){
|
attributeBase: function(){
|
||||||
@@ -140,7 +148,12 @@ Template.attributeDialogView.helpers({
|
|||||||
return char.attributeValue(this.statName);
|
return char.attributeValue(this.statName);
|
||||||
},
|
},
|
||||||
sourceName: function(){
|
sourceName: function(){
|
||||||
if (this.parent.collection === "Characters") return this.name;
|
if (this.parent.group === "racial"){
|
||||||
|
return this.getParent().race;
|
||||||
|
}
|
||||||
|
if (this.parent.collection === "Characters"){
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
return this.getParent().name;
|
return this.getParent().name;
|
||||||
},
|
},
|
||||||
operationName: function(){
|
operationName: function(){
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
<template name="strengthDialog">
|
||||||
|
{{#baseDialog title=name class=color hideEdit=true}}
|
||||||
|
{{> attributeDialogView}}
|
||||||
|
<hr class="vertMargin">
|
||||||
|
<div>
|
||||||
|
<div class="title padded">Carrying</div>
|
||||||
|
{{> carryCapacityTable}}
|
||||||
|
<div class="title padded">Jumping</div>
|
||||||
|
<table class="strengthTable">
|
||||||
|
<tr>
|
||||||
|
<td>Running long jump</td>
|
||||||
|
<td>{{evaluate charId "strength"}} feet</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Standing long jump</td>
|
||||||
|
<td>{{evaluate charId "floor(strength/2)"}} feet</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Running high jump</td>
|
||||||
|
<td>{{evaluate charId "3 + strengthMod"}} feet</td>
|
||||||
|
<td class="caption">
|
||||||
|
Can reach a ledge as high as
|
||||||
|
{{evaluate charId "3 + strengthMod"}} feet
|
||||||
|
+ 1.5× your height
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Standing high jump</td>
|
||||||
|
<td>{{evaluate charId "floor((3 + strengthMod)/2)"}} feet</td>
|
||||||
|
<td class="caption">
|
||||||
|
Can reach a ledge as high as
|
||||||
|
{{evaluate charId "floor((3 + strengthMod)/2)"}} feet
|
||||||
|
+ 1.5× your height
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{{/baseDialog}}
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
Template.strengthDialog.helpers({
|
||||||
|
color: function(){
|
||||||
|
if (this.color) return this.color + " white-text";
|
||||||
|
var char = Characters.findOne(this.charId, {fields: {color: 1}});
|
||||||
|
if (char) return getColorClass(char.color);
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
<template name="carryCapacityTable">
|
||||||
|
<table class="carryCapacityTable strengthTable">
|
||||||
|
<tr>
|
||||||
|
<td>Encumbered</td>
|
||||||
|
<td>>{{evaluate charId "strength * 5"}}lbs</td>
|
||||||
|
<td class="caption">Variant rule, encumbered characters move 10 feet slower</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Heavily encumbered</td>
|
||||||
|
<td>>{{evaluate charId "strength * 10"}}lbs</td>
|
||||||
|
<td class="caption">
|
||||||
|
Variant rule, heavily encumbered characters move 20 feet slower and have disadvantage on ability checks, attack rolls, and saving thows that use Strength, Dexterity, or Constitution
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Over Encumbered</td>
|
||||||
|
<td>>{{evaluate charId "strength * 15"}}lbs</td>
|
||||||
|
<td class="caption">
|
||||||
|
Characters that can only just lift, push or drag their current load can only move at 5 feet.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Push, drag or lift maximum</td>
|
||||||
|
<td>{{evaluate charId "strength * 30"}}lbs</td>
|
||||||
|
<td class="caption"></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</template>
|
||||||
@@ -2,19 +2,21 @@
|
|||||||
<paper-shadow class="card container healthCard"
|
<paper-shadow class="card container healthCard"
|
||||||
hero-id="main" {{detailHero "hitPoints" _id}}
|
hero-id="main" {{detailHero "hitPoints" _id}}
|
||||||
layout horizontal wrap>
|
layout horizontal wrap>
|
||||||
<div class="green white-text subhead padded leftRound"
|
<div class="green white-text subhead left"
|
||||||
hero-id="toolbar" {{detailHero "hitPoints" _id}}
|
hero-id="toolbar" {{detailHero "hitPoints" _id}}
|
||||||
layout vertical center>
|
layout vertical center center-justified>
|
||||||
<div class="hitPointTitle clickable">Hit Points</div>
|
<div class="hitPointTitle clickable">Hit Points</div>
|
||||||
<paper-icon-button class="white54" id="addTempHP" icon="add"></paper-icon-button>
|
<paper-icon-button class="white54" id="addTempHP" icon="add"></paper-icon-button>
|
||||||
</div>
|
</div>
|
||||||
<div class="padded" flex layout vertical center-justified style="min-width: 180px;">
|
<div class="right" flex layout vertical center-justified style="min-width: 180px;">
|
||||||
|
<div layout horizontal>
|
||||||
<paper-slider id="hitPointSlider"
|
<paper-slider id="hitPointSlider"
|
||||||
value={{attributeValue "hitPoints"}}
|
value={{attributeValue "hitPoints"}}
|
||||||
max={{attributeBase "hitPoints"}}
|
max={{attributeBase "hitPoints"}}
|
||||||
editable pin
|
editable pin
|
||||||
role="slider"
|
role="slider"
|
||||||
></paper-slider>
|
></paper-slider>
|
||||||
|
</div>
|
||||||
{{#each tempHitPoints}}
|
{{#each tempHitPoints}}
|
||||||
<div>
|
<div>
|
||||||
{{name}}
|
{{name}}
|
||||||
|
|||||||
@@ -1,10 +1,20 @@
|
|||||||
<template name="hitDice">
|
<template name="hitDice">
|
||||||
{{#if ../attributeBase name}}
|
{{#if ../attributeBase name}}
|
||||||
<paper-shadow class="card container" hero-id="main" {{detailHero name ../_id}} layout horizontal>
|
<paper-shadow class="card hit-dice" hero-id="main"
|
||||||
<div class="containerLeft green" layout horizontal hero-id="toolbar" {{detailHero name ../_id}}>
|
{{detailHero name ../_id}}
|
||||||
<div class="resourceButtons">
|
layout horizontal>
|
||||||
<paper-icon-button class="resourceUp" icon="arrow-drop-up" disabled={{cantIncrement}}></paper-icon-button>
|
<div class="left green display1 white-text"
|
||||||
<paper-icon-button class="resourceDown" icon="arrow-drop-down" disabled={{cantDecrement}}></paper-icon-button>
|
hero-id="toolbar" {{detailHero name ../_id}}
|
||||||
|
layout horizontal>
|
||||||
|
<div>
|
||||||
|
<paper-icon-button class="resourceUp"
|
||||||
|
icon="arrow-drop-up"
|
||||||
|
disabled={{cantIncrement}}>
|
||||||
|
</paper-icon-button>
|
||||||
|
<paper-icon-button class="resourceDown"
|
||||||
|
icon="arrow-drop-down"
|
||||||
|
disabled={{cantDecrement}}>
|
||||||
|
</paper-icon-button>
|
||||||
</div>
|
</div>
|
||||||
<div class="resourceValue" layout vertical center>
|
<div class="resourceValue" layout vertical center>
|
||||||
<div>
|
<div>
|
||||||
@@ -15,9 +25,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="containerRight clickable" flex relative horizontal layout center>
|
<div class="right clickable" flex relative horizontal layout center>
|
||||||
Hit Dice
|
Hit Dice
|
||||||
<paper-ripple fit></paper-ripple>
|
|
||||||
</div>
|
</div>
|
||||||
</paper-shadow>
|
</paper-shadow>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|||||||
@@ -25,12 +25,17 @@ Template.hitDice.events({
|
|||||||
Characters.update(this.char._id, modifier, {validate: false});
|
Characters.update(this.char._id, modifier, {validate: false});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tap .containerRight": function() {
|
"tap .right": function() {
|
||||||
var charId = Template.parentData()._id;
|
var charId = Template.parentData()._id;
|
||||||
var title = "d" + this.diceNum + " Hit Dice";
|
var title = "d" + this.diceNum + " Hit Dice";
|
||||||
GlobalUI.setDetail({
|
GlobalUI.setDetail({
|
||||||
template: "attributeDialog",
|
template: "attributeDialog",
|
||||||
data: {name: title, statName: this.name, charId: charId},
|
data: {
|
||||||
|
name: title,
|
||||||
|
statName: this.name,
|
||||||
|
charId: charId,
|
||||||
|
color: "green",
|
||||||
|
},
|
||||||
heroId: charId + this.name,
|
heroId: charId + this.name,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<!-- needs name, char, and skillName -->
|
<!-- needs name, char, and skillName -->
|
||||||
<template name="skillDialog">
|
<template name="skillDialog">
|
||||||
{{#baseDialog title=name class=colorClass hideEdit=true}}
|
{{#baseDialog title=name class=color hideEdit=true}}
|
||||||
{{> skillDialogView}}
|
{{> skillDialogView}}
|
||||||
{{/baseDialog}}
|
{{/baseDialog}}
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -93,6 +93,14 @@ var abilities = {
|
|||||||
charisma: {name: "Charisma"},
|
charisma: {name: "Charisma"},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Template.skillDialog.helpers({
|
||||||
|
color: function(){
|
||||||
|
if (this.color) return this.color + " white-text";
|
||||||
|
var char = Characters.findOne(this.charId, {fields: {color: 1}});
|
||||||
|
if (char) return getColorClass(char.color);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
Template.skillDialogView.helpers({
|
Template.skillDialogView.helpers({
|
||||||
or: function(a, b, c){
|
or: function(a, b, c){
|
||||||
return a || b || c;
|
return a || b || c;
|
||||||
@@ -132,6 +140,7 @@ Template.skillDialogView.helpers({
|
|||||||
charId: this.charId,
|
charId: this.charId,
|
||||||
stat: this.skillName,
|
stat: this.skillName,
|
||||||
operation: "add",
|
operation: "add",
|
||||||
|
enabled: true,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
mulEffects: function(){
|
mulEffects: function(){
|
||||||
@@ -139,6 +148,7 @@ Template.skillDialogView.helpers({
|
|||||||
charId: this.charId,
|
charId: this.charId,
|
||||||
stat: this.skillName,
|
stat: this.skillName,
|
||||||
operation: "mul",
|
operation: "mul",
|
||||||
|
enabled: true,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
minEffects: function(){
|
minEffects: function(){
|
||||||
@@ -146,6 +156,7 @@ Template.skillDialogView.helpers({
|
|||||||
charId: this.charId,
|
charId: this.charId,
|
||||||
stat: this.skillName,
|
stat: this.skillName,
|
||||||
operation: "min",
|
operation: "min",
|
||||||
|
enabled: true,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
maxEffects: function(){
|
maxEffects: function(){
|
||||||
@@ -153,6 +164,7 @@ Template.skillDialogView.helpers({
|
|||||||
charId: this.charId,
|
charId: this.charId,
|
||||||
stat: this.skillName,
|
stat: this.skillName,
|
||||||
operation: "max",
|
operation: "max",
|
||||||
|
enabled: true,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
advEffects: function(){
|
advEffects: function(){
|
||||||
@@ -160,6 +172,7 @@ Template.skillDialogView.helpers({
|
|||||||
charId: this.charId,
|
charId: this.charId,
|
||||||
stat: this.skillName,
|
stat: this.skillName,
|
||||||
operation: "advantage",
|
operation: "advantage",
|
||||||
|
enabled: true,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
dadvEffects: function(){
|
dadvEffects: function(){
|
||||||
@@ -167,6 +180,7 @@ Template.skillDialogView.helpers({
|
|||||||
charId: this.charId,
|
charId: this.charId,
|
||||||
stat: this.skillName,
|
stat: this.skillName,
|
||||||
operation: "disadvantage",
|
operation: "disadvantage",
|
||||||
|
enabled: true,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
conditionalEffects: function(){
|
conditionalEffects: function(){
|
||||||
@@ -174,6 +188,7 @@ Template.skillDialogView.helpers({
|
|||||||
charId: this.charId,
|
charId: this.charId,
|
||||||
stat: this.skillName,
|
stat: this.skillName,
|
||||||
operation: "conditional",
|
operation: "conditional",
|
||||||
|
enabled: true,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
ability: function(){
|
ability: function(){
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
.skillRow {
|
|
||||||
height: 32px;
|
|
||||||
margin: 0 -16px 0 -16px;
|
|
||||||
background: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.skillRow core-icon {
|
|
||||||
color: rgba(0,0,0,0.54);
|
|
||||||
}
|
|
||||||
|
|
||||||
.skillMod {
|
|
||||||
width: 42px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.skillName, .skillMod{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.fail.skillMod {
|
|
||||||
color: #D50000;
|
|
||||||
}
|
|
||||||
|
|
||||||
.advantage{
|
|
||||||
background-image: url(/png/advantage/greenUp.png);
|
|
||||||
background-size: contain;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.disadvantage{
|
|
||||||
background-image: url(/png/advantage/redDown.png);
|
|
||||||
background-size: contain;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hasConditionals::after{
|
|
||||||
content: "*";
|
|
||||||
}
|
|
||||||
@@ -1,16 +1,24 @@
|
|||||||
<template name="skillRow">
|
<template name="skillRow">
|
||||||
<paper-item class="skillRow" layout horizontal hero-id="main" {{detailHero skill ../_id}}>
|
<div class="item-slot">
|
||||||
|
<div class="skill-row item small"
|
||||||
|
hero-id="main"
|
||||||
|
{{detailHero skill ../_id}}
|
||||||
|
layout horizontal center>
|
||||||
<core-icon icon="{{profIcon}}"></core-icon>
|
<core-icon icon="{{profIcon}}"></core-icon>
|
||||||
{{#if failSkill}}
|
{{#if failSkill}}
|
||||||
<div class="fail skillMod">fail</div>
|
<div class="fail skill-mod">fail</div>
|
||||||
{{else}}
|
{{else}}
|
||||||
<div class="{{advantage}} skillMod">{{../skillMod skill}}</div>
|
<div class="{{advantage}} skill-mod">{{../skillMod skill}}</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<div class="{{#if conditionalCount}}hasConditionals{{/if}} skillName">
|
<div flex>
|
||||||
{{name}}
|
{{name}}
|
||||||
|
{{#if conditionalCount}}
|
||||||
|
*
|
||||||
|
{{/if}}
|
||||||
{{#if showPassive}}
|
{{#if showPassive}}
|
||||||
({{../passiveSkill skill}})
|
({{../passiveSkill skill}})
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</paper-item>
|
</div>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
21
rpg-docs/client/views/character/stats/skillRow/skillRow.scss
Normal file
21
rpg-docs/client/views/character/stats/skillRow/skillRow.scss
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
.skill-row {
|
||||||
|
.skill-mod{
|
||||||
|
width: 45px;
|
||||||
|
text-align: center;
|
||||||
|
&.fail {
|
||||||
|
color: #D50000;
|
||||||
|
}
|
||||||
|
&.advantage{
|
||||||
|
background-image: url(/png/advantage/greenUp.png);
|
||||||
|
background-size: contain;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center;
|
||||||
|
}
|
||||||
|
&.disadvantage{
|
||||||
|
background-image: url(/png/advantage/redDown.png);
|
||||||
|
background-size: contain;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
<template name="stats">
|
<template name="stats">
|
||||||
<div class="scroll-y" fit>
|
<div class="scroll-y" fit>
|
||||||
<div class="resourceCards" layout horizontal wrap>
|
<div style="padding: 8px 8px 0 8px">
|
||||||
{{> healthCard}}
|
{{> healthCard}}
|
||||||
</div>
|
</div>
|
||||||
<div id="stats" class="containers" >
|
<div class="column-container thin-columns" >
|
||||||
<!--Ability Scores-->
|
<!--Ability Scores-->
|
||||||
{{> abilityMiniCard ability="strength" title="Strength" color="red"}}
|
{{> abilityMiniCard ability="strength" title="Strength" color="red"}}
|
||||||
{{> abilityMiniCard ability="dexterity" title="Dexterity" color="indigo"}}
|
{{> abilityMiniCard ability="dexterity" title="Dexterity" color="indigo"}}
|
||||||
@@ -27,11 +27,11 @@
|
|||||||
{{>hitDice name="d10HitDice" diceNum="10" char=this}}
|
{{>hitDice name="d10HitDice" diceNum="10" char=this}}
|
||||||
{{>hitDice name="d12HitDice" diceNum="12" char=this}}
|
{{>hitDice name="d12HitDice" diceNum="12" char=this}}
|
||||||
<!--Saving Throws-->
|
<!--Saving Throws-->
|
||||||
<paper-shadow class="card container" hero-id="main" {{detailHero}}>
|
<paper-shadow class="card">
|
||||||
<div class="containerTop whiteTop" layout horizontal center>
|
<div class="top white subhead">
|
||||||
<div class="containerName subhead" hero-id="title" flex>Saving Throws</div>
|
Saving Throws
|
||||||
</div>
|
</div>
|
||||||
<div flex class="containerMain">
|
<div flex class="bottom list">
|
||||||
{{> skillRow name="Strength" skill="strengthSave"}}
|
{{> skillRow name="Strength" skill="strengthSave"}}
|
||||||
{{> skillRow name="Dexterity" skill="dexteritySave"}}
|
{{> skillRow name="Dexterity" skill="dexteritySave"}}
|
||||||
{{> skillRow name="Constitution" skill="constitutionSave"}}
|
{{> skillRow name="Constitution" skill="constitutionSave"}}
|
||||||
@@ -41,11 +41,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</paper-shadow>
|
</paper-shadow>
|
||||||
<!--Skills-->
|
<!--Skills-->
|
||||||
<paper-shadow class="card container" hero-id="main" {{detailHero}}>
|
<paper-shadow class="card">
|
||||||
<div class="containerTop whiteTop" layout horizontal center>
|
<div class="top white subhead">
|
||||||
<div class="containerName subhead" hero-id="title" flex>Skills</div>
|
Skills
|
||||||
</div>
|
</div>
|
||||||
<div flex class="containerMain">
|
<div flex class="bottom list">
|
||||||
{{> skillRow name="Acrobatics" skill="acrobatics"}}
|
{{> skillRow name="Acrobatics" skill="acrobatics"}}
|
||||||
{{> skillRow name="Animal Handling" skill="animalHandling"}}
|
{{> skillRow name="Animal Handling" skill="animalHandling"}}
|
||||||
{{> skillRow name="Arcana" skill="arcana"}}
|
{{> skillRow name="Arcana" skill="arcana"}}
|
||||||
@@ -71,8 +71,8 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="statCard">
|
<template name="statCard">
|
||||||
<paper-shadow class="card container statCard" hero-id="main" {{detailHero stat ../_id}} layout horizontal>
|
<paper-shadow class="card statCard clickable" hero-id="main" {{detailHero stat ../_id}} layout horizontal>
|
||||||
<div class="containerLeft {{color}}"
|
<div class="left display1 white-text {{color}}"
|
||||||
hero-id="toolbar" {{detailHero stat ../_id}}>
|
hero-id="toolbar" {{detailHero stat ../_id}}>
|
||||||
{{#if isSkill}}
|
{{#if isSkill}}
|
||||||
{{../skillMod stat}}
|
{{../skillMod stat}}
|
||||||
@@ -80,9 +80,8 @@
|
|||||||
{{prefix}}{{../attributeValue stat}}
|
{{prefix}}{{../attributeValue stat}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
<div class="containerRight" flex horizontal layout center>
|
<div class="right subhead" flex horizontal layout center>
|
||||||
{{name}}
|
{{name}}
|
||||||
</div>
|
</div>
|
||||||
<paper-ripple fit></paper-ripple>
|
|
||||||
</paper-shadow>
|
</paper-shadow>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -4,38 +4,64 @@ Template.stats.events({
|
|||||||
if (this.isSkill){
|
if (this.isSkill){
|
||||||
GlobalUI.setDetail({
|
GlobalUI.setDetail({
|
||||||
template: "skillDialog",
|
template: "skillDialog",
|
||||||
data: {name: this.name, skillName: this.stat, charId: charId},
|
data: {
|
||||||
|
name: this.name,
|
||||||
|
skillName: this.stat,
|
||||||
|
charId: charId,
|
||||||
|
color: this.color,
|
||||||
|
},
|
||||||
heroId: charId + this.stat,
|
heroId: charId + this.stat,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
GlobalUI.setDetail({
|
GlobalUI.setDetail({
|
||||||
template: "attributeDialog",
|
template: "attributeDialog",
|
||||||
data: {name: this.name, statName: this.stat, charId: charId},
|
data: {
|
||||||
|
name: this.name,
|
||||||
|
statName: this.stat,
|
||||||
|
charId: charId,
|
||||||
|
color: this.color,
|
||||||
|
},
|
||||||
heroId: charId + this.stat,
|
heroId: charId + this.stat,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tap .abilityMiniCard": function(event, instance){
|
"tap .abilityMiniCard": function(event, instance){
|
||||||
var charId = Template.parentData()._id;
|
var charId = Template.parentData()._id;
|
||||||
|
var template = "attributeDialog";
|
||||||
|
if (this.ability === "strength") template = "strengthDialog";
|
||||||
GlobalUI.setDetail({
|
GlobalUI.setDetail({
|
||||||
template: "attributeDialog",
|
template: template,
|
||||||
data: {name: this.title, statName: this.ability, charId: charId},
|
data: {
|
||||||
|
name: this.title,
|
||||||
|
statName: this.ability,
|
||||||
|
charId: charId,
|
||||||
|
color: this.color,
|
||||||
|
},
|
||||||
heroId: charId + this.ability,
|
heroId: charId + this.ability,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap .skillRow": function(event, instance){
|
"tap .skill-row": function(event, instance){
|
||||||
var skill = this.skill;
|
var skill = this.skill;
|
||||||
var charId = instance.data._id;
|
var charId = instance.data._id;
|
||||||
GlobalUI.setDetail({
|
GlobalUI.setDetail({
|
||||||
template: "skillDialog",
|
template: "skillDialog",
|
||||||
data: {name: this.name, skillName: skill, charId: charId},
|
data: {
|
||||||
|
name: this.name,
|
||||||
|
skillName: skill,
|
||||||
|
charId: charId,
|
||||||
|
},
|
||||||
heroId: charId + skill,
|
heroId: charId + skill,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap .hitPointTitle": function(event, instance) {
|
"tap .hitPointTitle": function(event, instance) {
|
||||||
GlobalUI.setDetail({
|
GlobalUI.setDetail({
|
||||||
template: "attributeDialog",
|
template: "attributeDialog",
|
||||||
data: {name: "Hit Points", statName: "hitPoints", charId: this._id},
|
data: {
|
||||||
|
name: "Hit Points",
|
||||||
|
statName: "hitPoints",
|
||||||
|
charId: this._id,
|
||||||
|
color: "green",
|
||||||
|
},
|
||||||
heroId: this._id + "hitPoints",
|
heroId: this._id + "hitPoints",
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2,10 +2,21 @@
|
|||||||
color: black;
|
color: black;
|
||||||
color: rgba(0, 0, 0, 0.870588);
|
color: rgba(0, 0, 0, 0.870588);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
font-size: 16px;
|
|
||||||
height: 40px;
|
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
padding: 12px 0 12px 16px;
|
padding: 8px 0 8px 16px;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.singleLineItem core-icon {
|
||||||
|
height: 8px;
|
||||||
|
margin-right: 8px;
|
||||||
|
width: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.singleLineItem div {
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
/* Required for text-overflow to do anything */
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
@@ -3,7 +3,11 @@
|
|||||||
{{#if characters.count}}
|
{{#if characters.count}}
|
||||||
<div>
|
<div>
|
||||||
{{#each characters}}
|
{{#each characters}}
|
||||||
<div class="singleLineItem">{{name}}</div>
|
<div class="singleLineItem characterRepresentative"
|
||||||
|
layout horizontal center>
|
||||||
|
<core-icon icon="image:brightness-1"></core-icon>
|
||||||
|
<div>{{name}}</div>
|
||||||
|
</div>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|||||||
@@ -21,8 +21,10 @@ Template.characterSideList.helpers({
|
|||||||
Template.characterSideList.events({
|
Template.characterSideList.events({
|
||||||
"tap .singleLineItem": function(event, instance) {
|
"tap .singleLineItem": function(event, instance) {
|
||||||
Router.go("characterSheet", {_id: this._id});
|
Router.go("characterSheet", {_id: this._id});
|
||||||
|
$("core-drawer-panel").get(0).closeDrawer();
|
||||||
},
|
},
|
||||||
"tap core-item": function() {
|
"tap core-item": function() {
|
||||||
Router.go("characterList");
|
Router.go("characterList");
|
||||||
|
$("core-drawer-panel").get(0).closeDrawer();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
30
rpg-docs/client/views/feedback/feedback.html
Normal file
30
rpg-docs/client/views/feedback/feedback.html
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<template name="feedback">
|
||||||
|
<div class="feedback" style="min-width: 300px; min-height: 370px">
|
||||||
|
<div>
|
||||||
|
<paper-input id="feedbackTitle" label="Title" floatinglabel></paper-input>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<paper-dropdown-menu class="typeDropdown" label="Operation" flex>
|
||||||
|
<paper-dropdown layered class="dropdown">
|
||||||
|
<core-menu class="menu typeMenu" selected="general">
|
||||||
|
<paper-item name="general">General Feedback</paper-item>
|
||||||
|
<paper-item name="bug">Bug</paper-item>
|
||||||
|
<paper-item name="change">Suggested Change</paper-item>
|
||||||
|
<paper-item name="feature">Feature Request</paper-item>
|
||||||
|
</core-menu>
|
||||||
|
</paper-dropdown>
|
||||||
|
</paper-dropdown-menu>
|
||||||
|
</div>
|
||||||
|
<div layout horizontal center>
|
||||||
|
<div>Importance</div>
|
||||||
|
<paper-slider id="severity" max=10 min=1 value=5 snap></paper-slider>
|
||||||
|
</div>
|
||||||
|
<paper-input-decorator label="Description" floatinglabel layout vertical>
|
||||||
|
<paper-autogrow-textarea rows=10 maxRows=10>
|
||||||
|
<textarea id="feedbackDescription"></textarea>
|
||||||
|
</paper-autogrow-textarea>
|
||||||
|
</paper-input-decorator>
|
||||||
|
</div>
|
||||||
|
<paper-button id="cancelButton" affirmative>Cancel</paper-button>
|
||||||
|
<paper-button id="sendButton" affirmative>Send </paper-button>
|
||||||
|
</template>
|
||||||
14
rpg-docs/client/views/feedback/feedback.js
Normal file
14
rpg-docs/client/views/feedback/feedback.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
Template.feedback.events({
|
||||||
|
"tap #sendButton": function(event, instance) {
|
||||||
|
var report = {};
|
||||||
|
report.title = instance.find("#feedbackTitle").value;
|
||||||
|
report.severity = instance.find("#severity").value;
|
||||||
|
report.type = instance.find(".typeMenu").selected;
|
||||||
|
report.description = instance.find("#feedbackDescription").value;
|
||||||
|
report.metaData = {
|
||||||
|
url: window.location.href,
|
||||||
|
session: _.pairs(Session.keys),
|
||||||
|
};
|
||||||
|
Meteor.call("insertReport", report);
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -1,9 +1,11 @@
|
|||||||
<template name="guide">
|
<template name="guide">
|
||||||
<div class="wallOfText">
|
<div layout vertical center>
|
||||||
|
<paper-shadow class="wallOfText card" style="padding: 32px; max-width: 800px;">
|
||||||
<h1>Dicecloud Beta</h1>
|
<h1>Dicecloud Beta</h1>
|
||||||
<p>Welcome to the Dicecloud beta. Please don't share the link with people you don't actively play with, since the beta is intended to be small, and your experience will probably get laggy if it gets more traffic than I'm expecting.</p>
|
<p>Welcome to the Dicecloud beta.</p>
|
||||||
<p>The beta is going to start with just the character sheet. You can play D&D without minis and maps, without a pre-written adventure, you can play without a lot of things, but the character sheet is necessary. So I'm starting here and working my way outwards.</p>
|
<p>The beta is going to start with just the character sheet. You can play D&D without minis and maps, without a pre-written adventure, you can play without a lot of things, but the character sheet is necessary. So I'm starting here and working my way outwards.</p>
|
||||||
<p>I will eventually have public bug tracking and feature requests going, but for now I'm going to track comments, feedback and suggestions on <a href="http://reddit.com/r/dicecloud">this subreddit</a>. If you've never used reddit before, all you need is a username and password to sign up. So it should be pretty accessible.</p>
|
<p>Leave any comments, feedback and suggestions on <a href="http://reddit.com/r/dicecloud">this subreddit</a>. If you've never used reddit before, all you need is a username and password to sign up. So it should be pretty accessible.</p>
|
||||||
|
<p>If you'd like to see a list of known issues and upcoming features, check out the <a href="https://trello.com/b/94M0SCnq/dicecloud-roadmap">DiceCloud Roadmap</a>.</p>
|
||||||
<h2>Character Sheet Philosophy</h2>
|
<h2>Character Sheet Philosophy</h2>
|
||||||
<p>Setting up your character on Dicecloud is going to take you a little longer than just filling it in on a paper character sheet would have. The goal of using an online sheet is to make actually playing the game more streamlined, and ultimately more fun. So putting a little extra effort into setting up your character now will pay off over and over again once you're playing.</p>
|
<p>Setting up your character on Dicecloud is going to take you a little longer than just filling it in on a paper character sheet would have. The goal of using an online sheet is to make actually playing the game more streamlined, and ultimately more fun. So putting a little extra effort into setting up your character now will pay off over and over again once you're playing.</p>
|
||||||
<p>The idea is to track where each number comes from, and allow you to easily make changes on the fly.</p>
|
<p>The idea is to track where each number comes from, and allow you to easily make changes on the fly.</p>
|
||||||
@@ -11,7 +13,7 @@
|
|||||||
<p>You need to swim through a sunken section of dungeon to fetch the quest's Thing.<br>You'll need to take off your magical Plate Armor of +1 Constitution to swim without sinking, of course. Taking it off will change your armor class, your speed and your constitution, which in turn changes your hitpoints and your constitution saving throw. Working out all those changes in the middle of a game will drag the game to a hault. <br> Fortunately you have a digital character sheet, so it's a matter of dragging your Plate Armor +1 Con from your "equipment" box to your "backpack" box and you're done. Your hitpoints change correctly, your saving throws are up to date, your armor class goes back to reflecting the fact that you have natural armor from being a dragonborn. Your character sheet keeps up and you ultimately get more time to play the game. Huzzah!</p>
|
<p>You need to swim through a sunken section of dungeon to fetch the quest's Thing.<br>You'll need to take off your magical Plate Armor of +1 Constitution to swim without sinking, of course. Taking it off will change your armor class, your speed and your constitution, which in turn changes your hitpoints and your constitution saving throw. Working out all those changes in the middle of a game will drag the game to a hault. <br> Fortunately you have a digital character sheet, so it's a matter of dragging your Plate Armor +1 Con from your "equipment" box to your "backpack" box and you're done. Your hitpoints change correctly, your saving throws are up to date, your armor class goes back to reflecting the fact that you have natural armor from being a dragonborn. Your character sheet keeps up and you ultimately get more time to play the game. Huzzah!</p>
|
||||||
<h2>Creating a Character</h2>
|
<h2>Creating a Character</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>In the <a href={{pathFor route="characterList"}}>character list</a>, click the plus button, floating in the bottom left corner.</li>
|
<li>In the <a href={{pathFor route="characterList"}}>character list</a>, click the plus button, floating in the bottom right corner.</li>
|
||||||
<li>Give your character a name, gender and race, these can be changed later if you change your mind. Then click the Add button</li>
|
<li>Give your character a name, gender and race, these can be changed later if you change your mind. Then click the Add button</li>
|
||||||
<li>Your new character should open, with most of its attributes and abilities at zero.</li>
|
<li>Your new character should open, with most of its attributes and abilities at zero.</li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -41,7 +43,7 @@
|
|||||||
<p>Your character currently doesn't have any ability scores, so lets fix that. Whether you roll your abilities or point-buy them, lets add a feature to represent where they came from</p>
|
<p>Your character currently doesn't have any ability scores, so lets fix that. Whether you roll your abilities or point-buy them, lets add a feature to represent where they came from</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Navigate to the <emd>Features</emd> tab</li>
|
<li>Navigate to the <emd>Features</emd> tab</li>
|
||||||
<li>Click the plus button in the bottom left to add a new feature</li>
|
<li>Click the plus button in the bottom right to add a new feature</li>
|
||||||
<li>Give the Feature a name, like <em>Point Buy</em></li>
|
<li>Give the Feature a name, like <em>Point Buy</em></li>
|
||||||
<li>Leave the feature as always enabled, don't limit its uses, and leave the description blank</li>
|
<li>Leave the feature as always enabled, don't limit its uses, and leave the description blank</li>
|
||||||
<li>Click the <em>Add Effect</em> button</li>
|
<li>Click the <em>Add Effect</em> button</li>
|
||||||
@@ -88,5 +90,6 @@
|
|||||||
<li>Change your level and check that the <em>Stats</em> tab gets updated accordingly</li>
|
<li>Change your level and check that the <em>Stats</em> tab gets updated accordingly</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>You can try all sorts of calculations in your effects and in certain other places too. For example if you had some feature that is used a number of times equal to your wisdom modifier or 1, whichever is lower, you could limit its uses to <em>min(1, wisdomMod)</em> and the character sheet will figure it out for you, and update itself if you wisdom modifier happens to change later.</p>
|
<p>You can try all sorts of calculations in your effects and in certain other places too. For example if you had some feature that is used a number of times equal to your wisdom modifier or 1, whichever is lower, you could limit its uses to <em>min(1, wisdomMod)</em> and the character sheet will figure it out for you, and update itself if you wisdom modifier happens to change later.</p>
|
||||||
|
</paper-shadow>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
DiceCloud
|
DiceCloud
|
||||||
</div>
|
</div>
|
||||||
</core-toolbar>
|
</core-toolbar>
|
||||||
<div class="padded scroll-y white" fit>
|
<div class="scroll-y" style="padding: 16px" fit>
|
||||||
{{> guide}}
|
{{> guide}}
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -1,18 +1,20 @@
|
|||||||
<template name="layout">
|
<template name="layout">
|
||||||
|
<core-drawer-panel responsiveWidth="905px">
|
||||||
<core-drawer-panel>
|
|
||||||
<core-header-panel drawer navigation flex mode="seamed" class="white">
|
<core-header-panel drawer navigation flex mode="seamed" class="white">
|
||||||
<div id="accountSummary">
|
<div id="accountSummary">
|
||||||
{{> loginButtons}}
|
|
||||||
{{#if currentUser}}
|
{{#if currentUser}}
|
||||||
<div id="profileLink" style="text-decoration: underline; cursor: pointer;">
|
<div id="profileLink" style="text-decoration: underline; cursor: pointer;">
|
||||||
My account
|
{{profileLink}}
|
||||||
</div>
|
</div>
|
||||||
|
{{else}}
|
||||||
|
<a href="/sign-in" style="color: white;">Sign in</a>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
<div id="navPanel">
|
<div id="navPanel">
|
||||||
<core-item id="homeNav" icon="home" label="Home"></core-item>
|
<core-item id="homeNav" icon="home" label="Home"></core-item>
|
||||||
{{> characterSideList}}
|
{{> characterSideList}}
|
||||||
|
<core-item id="feedback" icon="bug-report" label="Send Feedback"></core-item>
|
||||||
|
<core-item id="changeLog" icon="list" label="Change Log"></core-item>
|
||||||
</div>
|
</div>
|
||||||
</core-header-panel>
|
</core-header-panel>
|
||||||
<core-animated-pages main
|
<core-animated-pages main
|
||||||
@@ -31,7 +33,9 @@
|
|||||||
<section id="detailSection">
|
<section id="detailSection">
|
||||||
<div id="detailScreenFiller">
|
<div id="detailScreenFiller">
|
||||||
<div id="screenDim" cross-fade></div>
|
<div id="screenDim" cross-fade></div>
|
||||||
<paper-shadow id="globalDetail" z="5" animated hero hero-id="main">
|
<paper-shadow id="globalDetail" class="card" z="5"
|
||||||
|
animated hero hero-id="main"
|
||||||
|
layout vertical>
|
||||||
{{#if globalDetailTemplate}}
|
{{#if globalDetailTemplate}}
|
||||||
{{> UI.dynamic template=globalDetailTemplate data=globalDetailData}}
|
{{> UI.dynamic template=globalDetailTemplate data=globalDetailData}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
Template.layout.onCreated(function() {
|
||||||
|
this.subscribe("user");
|
||||||
|
});
|
||||||
|
|
||||||
Template.layout.rendered = function() {
|
Template.layout.rendered = function() {
|
||||||
$(window).on("popstate", GlobalUI.popStateHandler);
|
$(window).on("popstate", GlobalUI.popStateHandler);
|
||||||
};
|
};
|
||||||
@@ -9,14 +13,32 @@ Template.layout.destroyed = function() {
|
|||||||
Template.layout.helpers({
|
Template.layout.helpers({
|
||||||
notSelected: function(){
|
notSelected: function(){
|
||||||
return Session.get("global.ui.detailShow") ? "not-selected" : null;
|
return Session.get("global.ui.detailShow") ? "not-selected" : null;
|
||||||
}
|
},
|
||||||
|
profileLink: function() {
|
||||||
|
var user = Meteor.user();
|
||||||
|
return user.profile && user.profile.username || user.username || "My Account";
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.layout.events({
|
Template.layout.events({
|
||||||
"tap #homeNav": function(event, instance){
|
"tap #homeNav": function(event, instance){
|
||||||
Router.go("/");
|
Router.go("/");
|
||||||
|
instance.find("core-drawer-panel").closeDrawer();
|
||||||
},
|
},
|
||||||
"tap #profileLink": function(event, instance){
|
"tap #profileLink": function(event, instance){
|
||||||
Router.go("profile");
|
Router.go("profile");
|
||||||
|
instance.find("core-drawer-panel").closeDrawer();
|
||||||
|
},
|
||||||
|
"tap #feedback": function(event, instance) {
|
||||||
|
GlobalUI.showDialog({
|
||||||
|
heading: "Feedback",
|
||||||
|
template: "feedback",
|
||||||
|
fullOnMobile: true,
|
||||||
|
});
|
||||||
|
instance.find("core-drawer-panel").closeDrawer();
|
||||||
|
},
|
||||||
|
"tap #changeLog": function(event, instance) {
|
||||||
|
Router.go("changeLog");
|
||||||
|
instance.find("core-drawer-panel").closeDrawer();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
27
rpg-docs/client/views/meta/changeLog/changeLog.html
Normal file
27
rpg-docs/client/views/meta/changeLog/changeLog.html
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<template name="changeLog">
|
||||||
|
<core-toolbar class="blue-grey white-text">
|
||||||
|
<core-icon-button icon="menu" core-drawer-toggle></core-icon-button>
|
||||||
|
<div flex>
|
||||||
|
Change Log
|
||||||
|
</div>
|
||||||
|
</core-toolbar>
|
||||||
|
<div class="changeLog scroll-y" fit>
|
||||||
|
<div layout vertical center>
|
||||||
|
<div layout vertical style="max-width: 800px; padding: 4px;">
|
||||||
|
{{#each changeLogs}}
|
||||||
|
<paper-shadow class="card"
|
||||||
|
style="margin: 4px;
|
||||||
|
padding: 16px;"
|
||||||
|
layout vertical>
|
||||||
|
<h2>{{version}}</h2>
|
||||||
|
<ul>
|
||||||
|
{{#each changes}}
|
||||||
|
<li>{{this}}</li>
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
||||||
|
</paper-shadow>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
11
rpg-docs/client/views/notFound/notFound.html
Normal file
11
rpg-docs/client/views/notFound/notFound.html
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<template name="notFound">
|
||||||
|
<div layout vertical center center-justified fit>
|
||||||
|
<h2>The data for the page you requested could not be found.</h2>
|
||||||
|
{{#if currentUser}}
|
||||||
|
<h2>It might not exist, or you might not have permission to view it.</h2>
|
||||||
|
{{else}}
|
||||||
|
<h2>Perhaps you need to sign in first:</h2>
|
||||||
|
{{atForm}}
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -1,7 +1,11 @@
|
|||||||
<template name="baseDialog">
|
<template name="baseDialog">
|
||||||
<core-header-panel fit>
|
<div class="{{class}} top subhead"
|
||||||
<core-toolbar class={{class}} hero-id="toolbar" hero>
|
style="height: 72px;"
|
||||||
<paper-icon-button id="backButton" role="button" tabindex="0" icon="arrow-back" aria-label="close"></paper-icon-button>
|
hero-id="toolbar" hero
|
||||||
|
layout horizontal center>
|
||||||
|
<paper-icon-button id="backButton"
|
||||||
|
icon="arrow-back">
|
||||||
|
</paper-icon-button>
|
||||||
<div flex>{{title}}</div>
|
<div flex>{{title}}</div>
|
||||||
{{#if editing}}
|
{{#if editing}}
|
||||||
{{#unless hideDelete}}
|
{{#unless hideDelete}}
|
||||||
@@ -20,20 +24,21 @@
|
|||||||
aria-label="Delete Feature"
|
aria-label="Delete Feature"
|
||||||
noink></paper-icon-button>
|
noink></paper-icon-button>
|
||||||
{{else}}
|
{{else}}
|
||||||
{{#unless hideEdit}}
|
{{#if showEdit}}
|
||||||
<paper-icon-button id="editButton"
|
<paper-icon-button id="editButton"
|
||||||
icon="create"
|
icon="create"
|
||||||
aria-label="Delete Feature"
|
aria-label="Delete Feature"
|
||||||
noink></paper-icon-button>
|
noink></paper-icon-button>
|
||||||
{{/unless}}
|
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</core-toolbar>
|
{{/if}}
|
||||||
<div class="detailContent">
|
</div>
|
||||||
|
<div class="bottom scroll-y"
|
||||||
|
style="padding: 24px"
|
||||||
|
flex>
|
||||||
{{#unless editing}}
|
{{#unless editing}}
|
||||||
{{> UI.contentBlock}}
|
{{> UI.contentBlock}}
|
||||||
{{else}}
|
{{else}}
|
||||||
{{> UI.elseBlock}}
|
{{> UI.elseBlock}}
|
||||||
{{/unless}}
|
{{/unless}}
|
||||||
</div>
|
</div>
|
||||||
</core-header-panel>
|
|
||||||
</template>
|
</template>
|
||||||
@@ -11,6 +11,18 @@ Template.baseDialog.helpers({
|
|||||||
editing: function(){
|
editing: function(){
|
||||||
return Template.instance().editing.get();
|
return Template.instance().editing.get();
|
||||||
},
|
},
|
||||||
|
showEdit: function() {
|
||||||
|
if (this.hideEdit) return false;
|
||||||
|
var charId = Template.parentData().charId;
|
||||||
|
if (charId){
|
||||||
|
var char = Characters.findOne(charId);
|
||||||
|
var userId = Meteor.userId();
|
||||||
|
if (char && userId)
|
||||||
|
return char.owner === userId ||
|
||||||
|
_.contains(char.writers, userId);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.baseDialog.events({
|
Template.baseDialog.events({
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<template name="fabMenu">
|
||||||
|
<paper-fab class="floatyButton expand-menu {{#if active}}active{{/if}}"
|
||||||
|
icon="add"></paper-fab>
|
||||||
|
<div class="{{#if active}}active{{/if}} mini-holder"
|
||||||
|
layout vertical center>
|
||||||
|
{{> UI.contentBlock}}
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
18
rpg-docs/client/views/paperTemplates/fabMenu/fabMenu.js
Normal file
18
rpg-docs/client/views/paperTemplates/fabMenu/fabMenu.js
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
Template.fabMenu.onCreated(function() {
|
||||||
|
this.active = new ReactiveVar(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.fabMenu.helpers({
|
||||||
|
active: function() {
|
||||||
|
return Template.instance().active.get();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.fabMenu.events({
|
||||||
|
"tap .expand-menu": function(event, instance) {
|
||||||
|
instance.active.set(!instance.active.get());
|
||||||
|
},
|
||||||
|
"tap .mini-holder paper-fab": function(event, instance) {
|
||||||
|
instance.active.set(false);
|
||||||
|
},
|
||||||
|
});
|
||||||
46
rpg-docs/client/views/paperTemplates/fabMenu/fabMenu.scss
Normal file
46
rpg-docs/client/views/paperTemplates/fabMenu/fabMenu.scss
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
@import "bourbon/bourbon";
|
||||||
|
|
||||||
|
.mini-holder {
|
||||||
|
position: absolute;
|
||||||
|
padding: 4px;
|
||||||
|
bottom: 80px;
|
||||||
|
right: 24px;
|
||||||
|
width: 56px;
|
||||||
|
pointer-events: none;
|
||||||
|
flex-direction: column-reverse !important;
|
||||||
|
core-tooltip{
|
||||||
|
@include transform(scale(0));
|
||||||
|
@include transition-property(transform);
|
||||||
|
@include transition-duration(0.3s);
|
||||||
|
@include transition-timing-function(ease-in-out);
|
||||||
|
margin: 4px;
|
||||||
|
}
|
||||||
|
&.active {
|
||||||
|
pointer-events: auto;
|
||||||
|
core-tooltip{
|
||||||
|
@include transform(scale(1));
|
||||||
|
}
|
||||||
|
core-tooltip:nth-child(2){
|
||||||
|
@include transition-delay(0.1s);
|
||||||
|
}
|
||||||
|
core-tooltip:nth-child(3){
|
||||||
|
@include transition-delay(0.2s);
|
||||||
|
}
|
||||||
|
core-tooltip:nth-child(4){
|
||||||
|
@include transition-delay(0.3s);
|
||||||
|
}
|
||||||
|
core-tooltip:nth-child(5){
|
||||||
|
@include transition-delay(0.4s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.expand-menu {
|
||||||
|
&::shadow core-icon {
|
||||||
|
@include transition(transform 0.3s ease-in-out);
|
||||||
|
}
|
||||||
|
&.active::shadow core-icon{
|
||||||
|
@include transform(rotate(405deg));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -9,6 +9,10 @@ Template.undoToast.events({
|
|||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (collection.restoreNode){
|
||||||
collection.restoreNode(this.id);
|
collection.restoreNode(this.id);
|
||||||
|
} else {
|
||||||
|
collection.restore(this.id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -3,11 +3,7 @@
|
|||||||
<core-toolbar class="blue-grey white-text">
|
<core-toolbar class="blue-grey white-text">
|
||||||
<core-icon-button icon="menu" core-drawer-toggle></core-icon-button>
|
<core-icon-button icon="menu" core-drawer-toggle></core-icon-button>
|
||||||
<div id="username" class="clickable" flex>
|
<div id="username" class="clickable" flex>
|
||||||
{{#if username}}
|
{{profileName}}
|
||||||
{{username}}
|
|
||||||
{{else}}
|
|
||||||
Tap to set username
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
</div>
|
||||||
</core-toolbar>
|
</core-toolbar>
|
||||||
<div id="userProfile" class="padded">
|
<div id="userProfile" class="padded">
|
||||||
@@ -20,5 +16,7 @@
|
|||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{{> atForm}}
|
||||||
|
{{> atNavButton }}
|
||||||
{{/with}}
|
{{/with}}
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,3 +1,12 @@
|
|||||||
|
Template.profile.helpers({
|
||||||
|
profileName: function() {
|
||||||
|
var user = Meteor.user();
|
||||||
|
return user.profile && user.profile.username ||
|
||||||
|
user.username ||
|
||||||
|
"Tap to set username";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
Template.profile.events({
|
Template.profile.events({
|
||||||
"tap #username": function(){
|
"tap #username": function(){
|
||||||
if (this._id === Meteor.userId()){
|
if (this._id === Meteor.userId()){
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
<template name="usernameDialog">
|
<template name="usernameDialog">
|
||||||
{{#with currentUser}}
|
|
||||||
<div>
|
<div>
|
||||||
<paper-input id="usernameInput" label="Username" value={{username}}></paper-input>
|
<paper-input id="usernameInput" label="Username" value={{profileName}}></paper-input>
|
||||||
</div>
|
</div>
|
||||||
{{/with}}
|
<div style="color: red;" class="vertMargin">{{errorMessage}}</div>
|
||||||
<paper-button id="cancelButton" affirmative> Cancel </paper-button>
|
<paper-button id="cancelButton" affirmative> Cancel </paper-button>
|
||||||
<paper-button id="changeButton" affirmative> Change Username </paper-button>
|
<paper-button id="changeButton" disabled={{invalid}} affirmative> Change Username </paper-button>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,8 +1,49 @@
|
|||||||
|
var getUsername = function() {
|
||||||
|
var user = Meteor.user();
|
||||||
|
return user.profile && user.profile.username || user.username;
|
||||||
|
};
|
||||||
|
|
||||||
|
Template.usernameDialog.onCreated(function() {
|
||||||
|
this.errorMessage = new ReactiveVar("");
|
||||||
|
this.username = new ReactiveVar(getUsername());
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.usernameDialog.helpers({
|
||||||
|
profileName: function() {
|
||||||
|
return getUsername();
|
||||||
|
},
|
||||||
|
invalid: function() {
|
||||||
|
return !!Template.instance().errorMessage.get();
|
||||||
|
},
|
||||||
|
errorMessage: function() {
|
||||||
|
return Template.instance().errorMessage.get();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
Template.usernameDialog.events({
|
Template.usernameDialog.events({
|
||||||
|
"change #usernameInput, input #usernameInput": function(event, instance) {
|
||||||
|
var username = instance.find("#usernameInput").value;
|
||||||
|
username = username.trim().toLowerCase().replace(/\s+/gm, "");
|
||||||
|
if (username.length < 3){
|
||||||
|
instance.errorMessage.set("Username too short");
|
||||||
|
} else {
|
||||||
|
instance.errorMessage.set("Validating...");
|
||||||
|
Meteor.call("getUserId", username, function(err, userId){
|
||||||
|
if (userId && userId !== Meteor.userId())
|
||||||
|
instance.errorMessage.set("This username is taken");
|
||||||
|
else
|
||||||
|
instance.errorMessage.set("");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
"tap #changeButton": function(event, instance){
|
"tap #changeButton": function(event, instance){
|
||||||
|
var username = instance.find("#usernameInput").value;
|
||||||
|
username = username.trim().replace(/\s+/gm, " ");
|
||||||
|
var profileName = username;
|
||||||
|
username = username.toLowerCase().replace(/\s+/gm, "");
|
||||||
Meteor.users.update(
|
Meteor.users.update(
|
||||||
Meteor.userId(),
|
Meteor.userId(),
|
||||||
{$set: {username: instance.find("#usernameInput").value}}
|
{$set: {username: username, "profile.username": profileName}}
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
13
rpg-docs/client/views/user/titledAtForm/titledAtForm.html
Normal file
13
rpg-docs/client/views/user/titledAtForm/titledAtForm.html
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<template name="titledAtForm">
|
||||||
|
<core-toolbar class="blue-grey white-text">
|
||||||
|
<core-icon-button icon="menu" core-drawer-toggle></core-icon-button>
|
||||||
|
<div flex>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</core-toolbar>
|
||||||
|
<div class="scroll-y padded" fit layout vertical center center-justified>
|
||||||
|
<paper-shadow class="white" style="max-width: 400px;">
|
||||||
|
{{> atForm}}
|
||||||
|
</paper-shadow>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user