Compare commits
217 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2540278787 | ||
|
|
5ed1977082 | ||
|
|
a750101765 | ||
|
|
aa08a9b57a | ||
|
|
a8960e26ec | ||
|
|
eefb3895ad | ||
|
|
5b1caa7e95 | ||
|
|
21fdad1054 | ||
|
|
c482395426 | ||
|
|
cb493a9f16 | ||
|
|
576c1f953b | ||
|
|
eb4336b3e9 | ||
|
|
03cb32bf34 | ||
|
|
a869772238 | ||
|
|
9c61493a12 | ||
|
|
7af3b8e06e | ||
|
|
fd21f4f7d7 | ||
|
|
3530eefb2a | ||
|
|
d710579025 | ||
|
|
f7a3929c05 | ||
|
|
1af15eff3c | ||
|
|
33ca60c2e6 | ||
|
|
4261776d8c | ||
|
|
b44fe33b30 | ||
|
|
c4a488a176 | ||
|
|
137a94f251 | ||
|
|
817020bea8 | ||
|
|
420de9b005 | ||
|
|
b8fdc27df9 | ||
|
|
bdc64dfb10 | ||
|
|
d4bec4f5e7 | ||
|
|
041186059c | ||
|
|
01535a414c | ||
|
|
d9e180bac0 | ||
|
|
235089e790 | ||
|
|
c560d80c26 | ||
|
|
a67b13f659 | ||
|
|
c416adc85b | ||
|
|
dbbb3739d0 | ||
|
|
38ea89995a | ||
|
|
37268495ae | ||
|
|
042b67dd77 | ||
|
|
07cb3859db | ||
|
|
b1fdaa726c | ||
|
|
a333b0bdc8 | ||
|
|
c32680a15a | ||
|
|
d1950b4598 | ||
|
|
af20eb4f3c | ||
|
|
be0283a342 | ||
|
|
e05561dcf9 | ||
|
|
3c776ed018 | ||
|
|
ebecb46935 | ||
|
|
7af2e80ec1 | ||
|
|
d83fe917d0 | ||
|
|
f526de88a7 | ||
|
|
55adca36d5 | ||
|
|
be6f54e53a | ||
|
|
d41c27c86d | ||
|
|
f4397e65ab | ||
|
|
c00c69a0c7 | ||
|
|
6737983782 | ||
|
|
78441439c3 | ||
|
|
9b72e1aea2 | ||
|
|
684eca8603 | ||
|
|
868e5f96a4 | ||
|
|
6fe368cde7 | ||
|
|
2ffacb88e0 | ||
|
|
af3af0e550 | ||
|
|
81f50d94c1 | ||
|
|
49e6d51b95 | ||
|
|
1e4e1a3b11 | ||
|
|
4440c88417 | ||
|
|
98047ca806 | ||
|
|
051cabc712 | ||
|
|
636fa504f1 | ||
|
|
ff9fc916f6 | ||
|
|
2206a607b2 | ||
|
|
ce224301b2 | ||
|
|
e6a9911dfc | ||
|
|
8a1871ee18 | ||
|
|
402f885f85 | ||
|
|
d07c118d47 | ||
|
|
103d44eeec | ||
|
|
33196c6771 | ||
|
|
80dc862047 | ||
|
|
314da14ad1 | ||
|
|
e5dbe81ac1 | ||
|
|
7e68ef64cc | ||
|
|
c9d71cad52 | ||
|
|
d79a808c81 | ||
|
|
1016c39bdf | ||
|
|
5f4923e049 | ||
|
|
e83237a728 | ||
|
|
9f323738bf | ||
|
|
1fc76fa50d | ||
|
|
36d5ff0a88 | ||
|
|
d05874ed13 | ||
|
|
df2521e69c | ||
|
|
3c6a685fe8 | ||
|
|
a77e560284 | ||
|
|
4cec83918f | ||
|
|
fec95c51c6 | ||
|
|
425c42d049 | ||
|
|
ab6f0c4f5b | ||
|
|
5d6e57b896 | ||
|
|
7c0a8125f2 | ||
|
|
7481ef08a8 | ||
|
|
b578dd5fb0 | ||
|
|
5d6f934d88 | ||
|
|
337f0bfa8a | ||
|
|
c62784894b | ||
|
|
75fff43d7d | ||
|
|
a9eeeac0df | ||
|
|
c8af0ff0a9 | ||
|
|
9e200db7b9 | ||
|
|
c08cf83096 | ||
|
|
d9368b06d0 | ||
|
|
2703367681 | ||
|
|
d419442549 | ||
|
|
99df01c950 | ||
|
|
d76349b3bb | ||
|
|
39c061f4e8 | ||
|
|
6d167ddb22 | ||
|
|
037acbd459 | ||
|
|
4d3fc3bb09 | ||
|
|
4b984d4fac | ||
|
|
58843613ba | ||
|
|
39b549b24b | ||
|
|
c79177de72 | ||
|
|
11d09b1487 | ||
|
|
0e4918d57d | ||
|
|
949f313af2 | ||
|
|
85b63f152f | ||
|
|
2141d52a7a | ||
|
|
4c84235064 | ||
|
|
0e194a5408 | ||
|
|
4b60eac330 | ||
|
|
cb017c359d | ||
|
|
15aaaa5c14 | ||
|
|
290bee83b4 | ||
|
|
fcd2461205 | ||
|
|
52198d0249 | ||
|
|
ba7ccfdfa0 | ||
|
|
92d3b086fa | ||
|
|
e180595dcd | ||
|
|
ed708bdde0 | ||
|
|
d7852d640f | ||
|
|
a2fdee88b6 | ||
|
|
af070b1578 | ||
|
|
83a8eeef0f | ||
|
|
34f8e7402b | ||
|
|
1b7e2cd850 | ||
|
|
463b7f0fc9 | ||
|
|
266495abc8 | ||
|
|
453d4365d3 | ||
|
|
e0ce6275bf | ||
|
|
16b16ce6c6 | ||
|
|
80c72a274e | ||
|
|
91f0f7954c | ||
|
|
c74abcb608 | ||
|
|
da8b91594e | ||
|
|
fc26f5a73e | ||
|
|
4f60766d5d | ||
|
|
e992aeebef | ||
|
|
4108346a98 | ||
|
|
946fadadc2 | ||
|
|
d2cc2833a9 | ||
|
|
af57326194 | ||
|
|
98c69e9e17 | ||
|
|
395edd0563 | ||
|
|
43e87e7786 | ||
|
|
ad347504c6 | ||
|
|
4e6e99b695 | ||
|
|
104624a322 | ||
|
|
79d166e6af | ||
|
|
86c934e8ac | ||
|
|
a034cbf30e | ||
|
|
d5680ebf8a | ||
|
|
53f2fcc945 | ||
|
|
612e127be4 | ||
|
|
2b0d975cee | ||
|
|
248ab9bb6b | ||
|
|
314ce85410 | ||
|
|
9ff45dbcc2 | ||
|
|
6caf19bc99 | ||
|
|
c2b04d0977 | ||
|
|
9012c4a558 | ||
|
|
65a84937f2 | ||
|
|
eebb88b6b1 | ||
|
|
06ab7c5116 | ||
|
|
89f03c7601 | ||
|
|
9d2eb14c0c | ||
|
|
7b3cb54983 | ||
|
|
a09bad2fed | ||
|
|
afd897edfe | ||
|
|
efc79cb6e7 | ||
|
|
35efe39ea7 | ||
|
|
034067bd6e | ||
|
|
0d75cd5d15 | ||
|
|
4f1376a666 | ||
|
|
78b1d71b9d | ||
|
|
1323d8006c | ||
|
|
87d722adaf | ||
|
|
90e511eb00 | ||
|
|
5b8c25f5de | ||
|
|
2fbc54fee8 | ||
|
|
a064ae3fe8 | ||
|
|
ba9b518d7e | ||
|
|
2f729070b2 | ||
|
|
7aedb9451c | ||
|
|
c6886dd49e | ||
|
|
038ce490e4 | ||
|
|
52bef57637 | ||
|
|
29e9f8c8dc | ||
|
|
fea02811ff | ||
|
|
73cee52fff | ||
|
|
b58c006ed4 |
4
.jscsrc
4
.jscsrc
@@ -13,7 +13,7 @@
|
|||||||
"disallowMixedSpacesAndTabs": "smart",
|
"disallowMixedSpacesAndTabs": "smart",
|
||||||
"disallowTrailingWhitespace": true,
|
"disallowTrailingWhitespace": true,
|
||||||
"disallowSpaceAfterPrefixUnaryOperators": true,
|
"disallowSpaceAfterPrefixUnaryOperators": true,
|
||||||
"disallowMultipleVarDecl": true,
|
"disallowMultipleVarDecl": false,
|
||||||
"disallowNewlineBeforeBlockStatements": true,
|
"disallowNewlineBeforeBlockStatements": true,
|
||||||
"disallowKeywordsOnNewLine": ["else"],
|
"disallowKeywordsOnNewLine": ["else"],
|
||||||
|
|
||||||
@@ -53,4 +53,4 @@
|
|||||||
|
|
||||||
"disallowMultipleLineBreaks": true,
|
"disallowMultipleLineBreaks": true,
|
||||||
"disallowNewlineBeforeBlockStatements": true
|
"disallowNewlineBeforeBlockStatements": true
|
||||||
}
|
}
|
||||||
|
|||||||
65
README.md
65
README.md
@@ -1,58 +1,13 @@
|
|||||||
TODO
|
RPG Docs
|
||||||
====
|
========
|
||||||
|
|
||||||
* Get Polymer installed using bower.
|
This is the repo for [DiceCloud](dicecloud.com). The currently deployed version should always be the latest release of the master branch.
|
||||||
* Install Vulcanize package listed below
|
|
||||||
* Copy the differential polymer demo to get polymer implemented nicely
|
|
||||||
* Update Meteor
|
|
||||||
* Install and use LESS
|
|
||||||
|
|
||||||
Packages used
|
Getting started
|
||||||
=============
|
---------------
|
||||||
|
|
||||||
* meteor-platform
|
`git clone https://github.com/ThaumRystra/RPG-Docs RPG-Docs`
|
||||||
* Base Meteor.
|
`cd RPG-Docs`
|
||||||
* [Docs](http://docs.meteor.com/#/full/)
|
`cd rpg-docs`
|
||||||
* autopublish
|
`bower install`
|
||||||
* Publishes everything to the client.
|
`meteor`
|
||||||
* Must be removed before release
|
|
||||||
* insecure
|
|
||||||
* Allows the client the freedom to modify any colleciton.
|
|
||||||
* Must be removed before release
|
|
||||||
* iron:router
|
|
||||||
* Enables pagination and URL's to direct to specific templates.
|
|
||||||
* [Tutorial](http://www.manuel-schoebel.com/blog/iron-router-tutorial)
|
|
||||||
* accounts-password
|
|
||||||
* Lets users create accounts with a simple password
|
|
||||||
* accounts-ui
|
|
||||||
* Adds simple UI for logging in
|
|
||||||
* random
|
|
||||||
* Somewhat decent cryptographically strong psuedo random number generation.
|
|
||||||
* [readme](https://atmospherejs.com/meteor/random)
|
|
||||||
* dburles:collection-helpers
|
|
||||||
* Adds template-style helpers to collections. [github page](https://github.com/dburles/meteor-collection-helpers)
|
|
||||||
* reactive-var
|
|
||||||
* Friendly reactive variables
|
|
||||||
* [Meteor Docs](http://docs.meteor.com/#/full/reactivevar_pkg)
|
|
||||||
* cw4gn3r:jquery-event-drag
|
|
||||||
* Adds jquery drag events
|
|
||||||
* underscore
|
|
||||||
* Handy javascript utilities
|
|
||||||
* [Docs](http://underscorejs.org/)
|
|
||||||
* aldeed:collection2
|
|
||||||
* Extends collections with Schemas
|
|
||||||
* [(gitHub page)](https://github.com/aldeed/meteor-collection2)
|
|
||||||
* uses [SimpleSchema](https://github.com/aldeed/meteor-simple-schema)
|
|
||||||
* aldeed:autoform
|
|
||||||
* Automatically generates bootstrap forms for collection2 Schemas.
|
|
||||||
* [github](https://github.com/aldeed/meteor-autoform)
|
|
||||||
* differential:vulcanize
|
|
||||||
* Bakes all the polymer imports into one file
|
|
||||||
* [github](https://github.com/Differential/meteor-vulcanize)
|
|
||||||
|
|
||||||
************
|
|
||||||
|
|
||||||
Resources
|
|
||||||
=========
|
|
||||||
|
|
||||||
[differential's polymer demo](https://github.com/Differential/polymer-demo)
|
|
||||||
|
|||||||
6
rpg-docs/.gitignore
vendored
6
rpg-docs/.gitignore
vendored
@@ -1,5 +1,9 @@
|
|||||||
.meteor/local
|
.meteor/local
|
||||||
.meteor/meteorite
|
.meteor/meteorite
|
||||||
|
.demeteorized
|
||||||
|
settings.json
|
||||||
public/components
|
public/components
|
||||||
|
public/_imports.html
|
||||||
nohup.out
|
nohup.out
|
||||||
dump
|
node_modules
|
||||||
|
dump
|
||||||
|
|||||||
@@ -6,3 +6,10 @@ notices-for-0.9.0
|
|||||||
notices-for-0.9.1
|
notices-for-0.9.1
|
||||||
0.9.4-platform-file
|
0.9.4-platform-file
|
||||||
notices-for-facebook-graph-api-2
|
notices-for-facebook-graph-api-2
|
||||||
|
1.2.0-standard-minifiers-package
|
||||||
|
1.2.0-meteor-platform-split
|
||||||
|
1.2.0-cordova-changes
|
||||||
|
1.2.0-breaking-changes
|
||||||
|
1.3.0-split-minifiers-package
|
||||||
|
1.4.0-remove-old-dev-bundle-link
|
||||||
|
1.4.1-add-shell-server-package
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
|
|
||||||
|
|||||||
@@ -3,16 +3,14 @@
|
|||||||
# 'meteor add' and 'meteor remove' will edit this file for you,
|
# 'meteor add' and 'meteor remove' will edit this file for you,
|
||||||
# but you can also edit it by hand.
|
# but you can also edit it by hand.
|
||||||
|
|
||||||
meteor-platform
|
|
||||||
iron:router
|
iron:router
|
||||||
accounts-password
|
accounts-password@1.3.3
|
||||||
accounts-ui
|
accounts-ui@1.1.9
|
||||||
random
|
random@1.0.10
|
||||||
dburles:collection-helpers
|
dburles:collection-helpers
|
||||||
reactive-var
|
reactive-var@1.0.11
|
||||||
underscore
|
underscore@1.0.10
|
||||||
aldeed:collection2
|
aldeed:collection2
|
||||||
differential:vulcanize
|
|
||||||
matb33:collection-hooks
|
matb33:collection-hooks
|
||||||
zimme:collection-softremovable
|
zimme:collection-softremovable
|
||||||
momentjs:moment
|
momentjs:moment
|
||||||
@@ -20,8 +18,31 @@ dburles:mongo-collection-instances
|
|||||||
percolate:migrations
|
percolate:migrations
|
||||||
ecwyne:mathjs
|
ecwyne:mathjs
|
||||||
useraccounts:polymer
|
useraccounts:polymer
|
||||||
accounts-google
|
accounts-google@1.0.11
|
||||||
splendido:accounts-meld
|
splendido:accounts-meld
|
||||||
email
|
email@1.1.18
|
||||||
fourseven:scss@2.1.1
|
meteorhacks:subs-manager
|
||||||
wolves:bourbon
|
chuangbo:marked
|
||||||
|
reywood:iron-router-ga
|
||||||
|
meteor-base@1.0.4
|
||||||
|
mobile-experience@1.0.4
|
||||||
|
mongo@1.1.14
|
||||||
|
blaze-html-templates
|
||||||
|
session@1.1.7
|
||||||
|
jquery@1.11.10
|
||||||
|
tracker@1.1.1
|
||||||
|
logging@1.1.16
|
||||||
|
reload@1.1.11
|
||||||
|
ejson@1.0.13
|
||||||
|
spacebars
|
||||||
|
check@1.2.4
|
||||||
|
useraccounts:iron-routing
|
||||||
|
wizonesolutions:canonical
|
||||||
|
standard-minifier-js@1.2.1
|
||||||
|
shell-server@0.2.1
|
||||||
|
seba:minifiers-autoprefixer
|
||||||
|
nikogosovd:multiple-uihooks
|
||||||
|
templates:array
|
||||||
|
ecmascript@0.6.1
|
||||||
|
es5-shim@4.6.15
|
||||||
|
differential:vulcanize
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
METEOR@1.1.0.2
|
METEOR@1.4.2.6
|
||||||
|
|||||||
@@ -1,90 +1,128 @@
|
|||||||
accounts-base@1.2.0
|
accounts-base@1.2.14
|
||||||
accounts-google@1.0.4
|
accounts-google@1.0.11
|
||||||
accounts-oauth@1.1.5
|
accounts-oauth@1.1.15
|
||||||
accounts-password@1.1.1
|
accounts-password@1.3.3
|
||||||
accounts-ui@1.1.5
|
accounts-ui@1.1.9
|
||||||
accounts-ui-unstyled@1.1.7
|
accounts-ui-unstyled@1.1.13
|
||||||
aldeed:collection2@2.3.3
|
aldeed:collection2@2.10.0
|
||||||
aldeed:simple-schema@1.3.3
|
aldeed:collection2-core@1.2.0
|
||||||
autoupdate@1.2.1
|
aldeed:schema-deny@1.1.0
|
||||||
base64@1.0.3
|
aldeed:schema-index@1.1.1
|
||||||
binary-heap@1.0.3
|
aldeed:simple-schema@1.5.3
|
||||||
blaze@2.1.2
|
allow-deny@1.0.5
|
||||||
blaze-tools@1.0.3
|
autoupdate@1.3.12
|
||||||
boilerplate-generator@1.0.3
|
babel-compiler@6.13.0
|
||||||
callback-hook@1.0.3
|
babel-runtime@1.0.1
|
||||||
check@1.0.5
|
base64@1.0.10
|
||||||
coffeescript@1.0.6
|
binary-heap@1.0.10
|
||||||
dburles:collection-helpers@1.0.3
|
blaze@2.3.0
|
||||||
dburles:mongo-collection-instances@0.3.3
|
blaze-html-templates@1.1.0
|
||||||
ddp@1.1.0
|
blaze-tools@1.0.10
|
||||||
deps@1.0.7
|
boilerplate-generator@1.0.11
|
||||||
differential:vulcanize@0.0.5
|
caching-compiler@1.1.9
|
||||||
|
caching-html-compiler@1.1.0
|
||||||
|
callback-hook@1.0.10
|
||||||
|
check@1.2.4
|
||||||
|
chuangbo:marked@0.3.5_1
|
||||||
|
coffeescript@1.11.1_4
|
||||||
|
dburles:collection-helpers@1.1.0
|
||||||
|
dburles:mongo-collection-instances@0.3.5
|
||||||
|
ddp@1.2.5
|
||||||
|
ddp-client@1.3.2
|
||||||
|
ddp-common@1.2.8
|
||||||
|
ddp-rate-limiter@1.0.6
|
||||||
|
ddp-server@1.3.12
|
||||||
|
deps@1.0.12
|
||||||
|
diff-sequence@1.0.7
|
||||||
|
differential:vulcanize@3.0.0
|
||||||
|
ecmascript@0.6.1
|
||||||
|
ecmascript-runtime@0.3.15
|
||||||
ecwyne:mathjs@0.25.0
|
ecwyne:mathjs@0.25.0
|
||||||
ejson@1.0.6
|
ejson@1.0.13
|
||||||
email@1.0.6
|
email@1.1.18
|
||||||
fastclick@1.0.3
|
es5-shim@4.6.15
|
||||||
fourseven:scss@2.1.1
|
fastclick@1.0.13
|
||||||
geojson-utils@1.0.3
|
geojson-utils@1.0.10
|
||||||
google@1.1.5
|
google@1.1.15
|
||||||
html-tools@1.0.4
|
hot-code-push@1.0.4
|
||||||
htmljs@1.0.4
|
html-tools@1.0.11
|
||||||
http@1.1.0
|
htmljs@1.0.11
|
||||||
id-map@1.0.3
|
http@1.2.10
|
||||||
iron:controller@1.0.7
|
id-map@1.0.9
|
||||||
iron:core@1.0.7
|
iron:controller@1.0.12
|
||||||
iron:dynamic-template@1.0.7
|
iron:core@1.0.11
|
||||||
iron:layout@1.0.7
|
iron:dynamic-template@1.0.12
|
||||||
iron:location@1.0.7
|
iron:layout@1.0.12
|
||||||
iron:middleware-stack@1.0.7
|
iron:location@1.0.11
|
||||||
iron:router@1.0.7
|
iron:middleware-stack@1.1.0
|
||||||
iron:url@1.0.7
|
iron:router@1.1.1
|
||||||
jquery@1.11.3_2
|
iron:url@1.0.11
|
||||||
json@1.0.3
|
jquery@1.11.10
|
||||||
lai:collection-extensions@0.1.3
|
lai:collection-extensions@0.2.1_1
|
||||||
launch-screen@1.0.2
|
launch-screen@1.1.0
|
||||||
less@1.0.14
|
less@2.7.9
|
||||||
livedata@1.0.13
|
livedata@1.0.18
|
||||||
localstorage@1.0.3
|
localstorage@1.0.12
|
||||||
logging@1.0.7
|
logging@1.1.16
|
||||||
matb33:collection-hooks@0.7.13
|
matb33:collection-hooks@0.8.4
|
||||||
meteor@1.1.6
|
mdg:validation-error@0.5.1
|
||||||
meteor-platform@1.2.2
|
meteor@1.6.0
|
||||||
minifiers@1.1.5
|
meteor-base@1.0.4
|
||||||
minimongo@1.0.8
|
meteorhacks:subs-manager@1.6.4
|
||||||
mobile-status-bar@1.0.3
|
minifier-css@1.2.16
|
||||||
momentjs:moment@2.10.3
|
minifier-js@1.2.17
|
||||||
mongo@1.1.0
|
minimongo@1.0.19
|
||||||
npm-bcrypt@0.7.8_2
|
mobile-experience@1.0.4
|
||||||
oauth@1.1.4
|
mobile-status-bar@1.0.13
|
||||||
oauth2@1.1.3
|
modules@0.7.7
|
||||||
observe-sequence@1.0.6
|
modules-runtime@0.7.8
|
||||||
ordered-dict@1.0.3
|
momentjs:moment@2.17.1
|
||||||
percolate:migrations@0.7.5
|
mongo@1.1.14
|
||||||
random@1.0.3
|
mongo-id@1.0.6
|
||||||
reactive-dict@1.1.0
|
nikogosovd:multiple-uihooks@0.1.8
|
||||||
reactive-var@1.0.5
|
npm-bcrypt@0.9.2
|
||||||
reload@1.1.3
|
npm-mongo@2.2.16_1
|
||||||
retry@1.0.3
|
oauth@1.1.12
|
||||||
routepolicy@1.0.5
|
oauth2@1.1.11
|
||||||
service-configuration@1.0.4
|
observe-sequence@1.0.14
|
||||||
session@1.1.0
|
ordered-dict@1.0.9
|
||||||
sha@1.0.3
|
percolate:migrations@0.9.8
|
||||||
softwarerero:accounts-t9n@1.0.9
|
promise@0.8.8
|
||||||
spacebars@1.0.6
|
raix:eventemitter@0.1.3
|
||||||
spacebars-compiler@1.0.6
|
random@1.0.10
|
||||||
|
rate-limit@1.0.6
|
||||||
|
reactive-dict@1.1.8
|
||||||
|
reactive-var@1.0.11
|
||||||
|
reload@1.1.11
|
||||||
|
retry@1.0.9
|
||||||
|
reywood:iron-router-ga@0.7.1
|
||||||
|
routepolicy@1.0.12
|
||||||
|
seba:minifiers-autoprefixer@1.0.1
|
||||||
|
service-configuration@1.0.11
|
||||||
|
session@1.1.7
|
||||||
|
sha@1.0.9
|
||||||
|
shell-server@0.2.1
|
||||||
|
softwarerero:accounts-t9n@1.3.7
|
||||||
|
spacebars@1.0.13
|
||||||
|
spacebars-compiler@1.1.0
|
||||||
splendido:accounts-emails-field@1.2.0
|
splendido:accounts-emails-field@1.2.0
|
||||||
splendido:accounts-meld@1.3.0
|
splendido:accounts-meld@1.3.1
|
||||||
srp@1.0.3
|
srp@1.0.10
|
||||||
templating@1.1.1
|
standard-minifier-js@1.2.2
|
||||||
tracker@1.0.7
|
templates:array@1.0.3
|
||||||
ui@1.0.6
|
templating@1.3.0
|
||||||
underscore@1.0.3
|
templating-compiler@1.3.0
|
||||||
url@1.0.4
|
templating-runtime@1.3.0
|
||||||
useraccounts:core@1.9.1
|
templating-tools@1.1.0
|
||||||
useraccounts:polymer@1.9.1
|
tracker@1.1.1
|
||||||
webapp@1.2.0
|
ui@1.0.12
|
||||||
webapp-hashing@1.0.3
|
underscore@1.0.10
|
||||||
wolves:bourbon@1.0.0
|
url@1.0.11
|
||||||
zimme:collection-behaviours@1.0.4
|
useraccounts:core@1.14.2
|
||||||
zimme:collection-softremovable@1.0.4
|
useraccounts:iron-routing@1.14.2
|
||||||
|
useraccounts:polymer@1.14.2
|
||||||
|
webapp@1.3.12
|
||||||
|
webapp-hashing@1.0.9
|
||||||
|
wizonesolutions:canonical@0.0.5
|
||||||
|
zimme:collection-behaviours@1.1.3
|
||||||
|
zimme:collection-softremovable@1.0.5
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ Schemas.Action = new SimpleSchema({
|
|||||||
charId: {
|
charId: {
|
||||||
type: String,
|
type: String,
|
||||||
regEx: SimpleSchema.RegEx.Id,
|
regEx: SimpleSchema.RegEx.Id,
|
||||||
|
index: 1,
|
||||||
},
|
},
|
||||||
name: {
|
name: {
|
||||||
type: String,
|
type: String,
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ Schemas.Attack = new SimpleSchema({
|
|||||||
charId: {
|
charId: {
|
||||||
type: String,
|
type: String,
|
||||||
regEx: SimpleSchema.RegEx.Id,
|
regEx: SimpleSchema.RegEx.Id,
|
||||||
|
index: 1,
|
||||||
},
|
},
|
||||||
name: {
|
name: {
|
||||||
type: String,
|
type: String,
|
||||||
@@ -69,5 +70,17 @@ Attacks.attachSchema(Schemas.Attack);
|
|||||||
Attacks.attachBehaviour("softRemovable");
|
Attacks.attachBehaviour("softRemovable");
|
||||||
makeChild(Attacks, ["name", "enabled"]); //children of lots of things
|
makeChild(Attacks, ["name", "enabled"]); //children of lots of things
|
||||||
|
|
||||||
|
Attacks.after.insert(function (userId, attack) {
|
||||||
|
//Check to see if this attack's parent is a spell, if so, mirror prepared state to enabled
|
||||||
|
if (attack.parent.collection === "Spells") {
|
||||||
|
var parentSpell = Spells.findOne(attack.parent.id);
|
||||||
|
if (parentSpell.prepared === "unprepared") {
|
||||||
|
Attacks.update(attack._id, {$set: {enabled: false}});
|
||||||
|
} else if (parentSpell.prepared === "prepared" || "always") {
|
||||||
|
Attacks.update(attack._id, {$set: {enabled: true}});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
Attacks.allow(CHARACTER_SUBSCHEMA_ALLOW);
|
Attacks.allow(CHARACTER_SUBSCHEMA_ALLOW);
|
||||||
Attacks.deny(CHARACTER_SUBSCHEMA_DENY);
|
Attacks.deny(CHARACTER_SUBSCHEMA_DENY);
|
||||||
|
|||||||
@@ -1,28 +1,52 @@
|
|||||||
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,
|
||||||
|
index: 1,
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: String,
|
||||||
|
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",
|
||||||
},
|
},
|
||||||
//expiry time
|
|
||||||
expiry: {type: Number, optional: true},
|
|
||||||
duration: {type: Number},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
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);
|
||||||
|
|||||||
@@ -3,16 +3,17 @@ Characters = new Mongo.Collection("characters");
|
|||||||
|
|
||||||
Schemas.Character = new SimpleSchema({
|
Schemas.Character = new SimpleSchema({
|
||||||
//strings
|
//strings
|
||||||
name: {type: String, defaultValue: "", trim: false},
|
name: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
alignment: {type: String, defaultValue: "", trim: false},
|
alignment: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
gender: {type: String, defaultValue: "", trim: false},
|
gender: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
race: {type: String, defaultValue: "", trim: false},
|
race: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
description: {type: String, defaultValue: "", trim: false},
|
picture: {type: String, defaultValue: "", trim: true, optional: true},
|
||||||
personality: {type: String, defaultValue: "", trim: false},
|
description: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
ideals: {type: String, defaultValue: "", trim: false},
|
personality: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
bonds: {type: String, defaultValue: "", trim: false},
|
ideals: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
flaws: {type: String, defaultValue: "", trim: false},
|
bonds: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
backstory: {type: String, defaultValue: "", trim: false},
|
flaws: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
|
backstory: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
|
|
||||||
//attributes
|
//attributes
|
||||||
//ability scores
|
//ability scores
|
||||||
@@ -32,6 +33,7 @@ Schemas.Character = new SimpleSchema({
|
|||||||
age: {type: Schemas.Attribute},
|
age: {type: Schemas.Attribute},
|
||||||
ageRate: {type: Schemas.Attribute},
|
ageRate: {type: Schemas.Attribute},
|
||||||
armor: {type: Schemas.Attribute},
|
armor: {type: Schemas.Attribute},
|
||||||
|
carryMultiplier: {type: Schemas.Attribute},
|
||||||
|
|
||||||
//resources
|
//resources
|
||||||
level1SpellSlots: {type: Schemas.Attribute},
|
level1SpellSlots: {type: Schemas.Attribute},
|
||||||
@@ -159,6 +161,7 @@ Schemas.Character = new SimpleSchema({
|
|||||||
deathSave: {type: Schemas.DeathSave},
|
deathSave: {type: Schemas.DeathSave},
|
||||||
|
|
||||||
//permissions
|
//permissions
|
||||||
|
party: {type: String, regEx: SimpleSchema.RegEx.Id, optional: true},
|
||||||
owner: {type: String, regEx: SimpleSchema.RegEx.Id},
|
owner: {type: String, regEx: SimpleSchema.RegEx.Id},
|
||||||
readers: {type: [String], regEx: SimpleSchema.RegEx.Id, defaultValue: []},
|
readers: {type: [String], regEx: SimpleSchema.RegEx.Id, defaultValue: []},
|
||||||
writers: {type: [String], regEx: SimpleSchema.RegEx.Id, defaultValue: []},
|
writers: {type: [String], regEx: SimpleSchema.RegEx.Id, defaultValue: []},
|
||||||
@@ -168,61 +171,122 @@ 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},
|
||||||
|
//hide spellcasting
|
||||||
|
"settings.hideSpellcasting": {type: Boolean, defaultValue: false},
|
||||||
|
//show to anyone with link
|
||||||
|
"settings.viewPermission": {
|
||||||
|
type: String,
|
||||||
|
defaultValue: "whitelist",
|
||||||
|
allowedValues: ["whitelist", "public"],
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Characters.attachSchema(Schemas.Character);
|
Characters.attachSchema(Schemas.Character);
|
||||||
|
|
||||||
var attributeBase = function(charId, statName){
|
var attributeBase = preventLoop(function(charId, statName){
|
||||||
check(statName, String);
|
check(statName, String);
|
||||||
var effects = Effects.find(
|
//if it's a damage multiplier, we treat it specially
|
||||||
{charId: charId, stat: statName, enabled: true}
|
if (_.contains(DAMAGE_MULTIPLIERS, statName)){
|
||||||
).fetch();
|
var invulnerabilityCount = Effects.find({
|
||||||
effects = _.groupBy(effects, "operation");
|
charId: charId,
|
||||||
var value = _.contains(DAMAGE_MULTIPLIERS, statName) ? 1 : 0;
|
stat: statName,
|
||||||
|
enabled: true,
|
||||||
|
operation: "mul",
|
||||||
|
value: 0,
|
||||||
|
}).count();
|
||||||
|
if (invulnerabilityCount) return 0;
|
||||||
|
var resistCount = Effects.find({
|
||||||
|
charId: charId,
|
||||||
|
stat: statName,
|
||||||
|
enabled: true,
|
||||||
|
operation: "mul",
|
||||||
|
value: 0.5,
|
||||||
|
}).count();
|
||||||
|
var vulnCount = Effects.find({
|
||||||
|
charId: charId,
|
||||||
|
stat: statName,
|
||||||
|
enabled: true,
|
||||||
|
operation: "mul",
|
||||||
|
value: 2,
|
||||||
|
}).count();
|
||||||
|
if (!resistCount && !vulnCount){
|
||||||
|
return 1;
|
||||||
|
} else if (resistCount && !vulnCount){
|
||||||
|
return 0.5;
|
||||||
|
} else if (!resistCount && vulnCount){
|
||||||
|
return 2;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var value;
|
||||||
|
var base = 0;
|
||||||
|
var add = 0;
|
||||||
|
var mul = 1;
|
||||||
|
var min = Number.NEGATIVE_INFINITY;
|
||||||
|
var max = Number.POSITIVE_INFINITY;
|
||||||
|
|
||||||
//start with the highest base value
|
Effects.find({
|
||||||
_.each(effects.base, function(effect){
|
charId: charId,
|
||||||
var efv = evaluateEffect(charId, effect);
|
stat: statName,
|
||||||
if (efv > value){
|
enabled: true,
|
||||||
value = efv;
|
operation: {$in: ["base", "add", "mul", "min", "max"]},
|
||||||
|
}).forEach(function(effect) {
|
||||||
|
value = evaluateEffect(charId, effect);
|
||||||
|
if (effect.operation === "base"){
|
||||||
|
if (value > base) base = value;
|
||||||
|
} else if (effect.operation === "add"){
|
||||||
|
add += value;
|
||||||
|
} else if (effect.operation === "mul"){
|
||||||
|
mul *= value;
|
||||||
|
} else if (effect.operation === "min"){
|
||||||
|
if (value > min) min = value;
|
||||||
|
} else if (effect.operation === "max"){
|
||||||
|
if (value < max) max = value;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
//add all the add values
|
var result = (base + add) * mul;
|
||||||
_.each(effects.add, function(effect){
|
if (result < min) result = min;
|
||||||
value += evaluateEffect(charId, effect);
|
if (result > max) result = max;
|
||||||
});
|
|
||||||
|
|
||||||
//multiply all the mul values
|
return Math.floor(result);
|
||||||
_.each(effects.mul, function(effect){
|
});
|
||||||
value *= evaluateEffect(charId, effect);
|
|
||||||
});
|
|
||||||
|
|
||||||
//ensure value is >= all mins
|
if (Meteor.isClient) {
|
||||||
_.each(effects.min, function(effect){
|
Template.registerHelper("characterCalculate", function(func, charId, input) {
|
||||||
var min = evaluateEffect(charId, effect);
|
try {
|
||||||
value = value > min ? value : min;
|
return Characters.calculate[func](charId, input);
|
||||||
|
} catch (e){
|
||||||
|
if (!Characters.calculate[func]){
|
||||||
|
throw new Error(func + "is not a function name");
|
||||||
|
} else {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
//ensure value is <= all maxes
|
//create a local memoize with a argument concatenating hash function
|
||||||
_.each(effects.max, function(effect){
|
var memoize = function(f) {
|
||||||
var max = evaluateEffect(charId, effect);
|
return Tracker.memoize(f, function() {
|
||||||
value = value < max ? value : max;
|
return _.reduce(arguments, function(memo, arg) {
|
||||||
|
return memo + arg;
|
||||||
|
}, "");
|
||||||
});
|
});
|
||||||
return value;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//functions and calculated values.
|
//memoize funcitons that have finds and slow loops
|
||||||
//These functions can only rely on this._id since no other
|
Characters.calculate = {
|
||||||
//field is likely to be attached to all returned characters
|
getField: function(charId, fieldName) {
|
||||||
Characters.helpers({
|
|
||||||
//returns the value stored in the field requested
|
|
||||||
//will set up dependencies on just that field
|
|
||||||
getField : function(fieldName){
|
|
||||||
var fieldSelector = {};
|
var fieldSelector = {};
|
||||||
fieldSelector[fieldName] = 1;
|
fieldSelector[fieldName] = 1;
|
||||||
var char = Characters.findOne(this._id, {fields: fieldSelector});
|
var char = Characters.findOne(charId, {fields: fieldSelector});
|
||||||
var field = char[fieldName];
|
var field = char[fieldName];
|
||||||
if (field === undefined){
|
if (field === undefined){
|
||||||
throw new Meteor.Error(
|
throw new Meteor.Error(
|
||||||
@@ -235,8 +299,7 @@ Characters.helpers({
|
|||||||
}
|
}
|
||||||
return field;
|
return field;
|
||||||
},
|
},
|
||||||
//returns the value of a field
|
fieldValue: function(charId, fieldName) {
|
||||||
fieldValue : function(fieldName){
|
|
||||||
if (!Schemas.Character.schema(fieldName)){
|
if (!Schemas.Character.schema(fieldName)){
|
||||||
throw new Meteor.Error(
|
throw new Meteor.Error(
|
||||||
"Field not found",
|
"Field not found",
|
||||||
@@ -246,102 +309,92 @@ Characters.helpers({
|
|||||||
//duck typing to get the right value function
|
//duck typing to get the right value function
|
||||||
//.ability implies skill
|
//.ability implies skill
|
||||||
if (Schemas.Character.schema(fieldName + ".ability")){
|
if (Schemas.Character.schema(fieldName + ".ability")){
|
||||||
return this.skillMod(fieldName);
|
return Characters.calculate.skillMod(charId, fieldName);
|
||||||
}
|
}
|
||||||
//adjustment implies attribute
|
//adjustment implies attribute
|
||||||
if (Schemas.Character.schema(fieldName + ".adjustment")){
|
if (Schemas.Character.schema(fieldName + ".adjustment")){
|
||||||
return this.attributeValue(fieldName);
|
return Characters.calculate.attributeValue(charId, fieldName);
|
||||||
}
|
}
|
||||||
//fall back to just returning the field itself
|
//fall back to just returning the field itself
|
||||||
return this.getField(fieldName);
|
return Characters.calculate.getField(charId, fieldName);
|
||||||
},
|
},
|
||||||
|
attributeValue: memoize(function(charId, attributeName){
|
||||||
attributeValue: function(attributeName){
|
var attribute = Characters.calculate.getField(charId, attributeName);
|
||||||
var charId = this._id;
|
|
||||||
var attribute = this.getField(attributeName);
|
|
||||||
//base value
|
//base value
|
||||||
var value = this.attributeBase(attributeName);
|
var value = Characters.calculate.attributeBase(charId, attributeName);
|
||||||
//plus adjustment
|
//plus adjustment
|
||||||
value += attribute.adjustment;
|
value += attribute.adjustment;
|
||||||
return value;
|
return value;
|
||||||
},
|
}),
|
||||||
|
attributeBase: memoize(function(charId, attributeName){
|
||||||
attributeBase: preventLoop(function(attributeName){
|
|
||||||
var charId = this._id;
|
|
||||||
//base value
|
|
||||||
return attributeBase(charId, attributeName);
|
return attributeBase(charId, attributeName);
|
||||||
}),
|
}),
|
||||||
|
skillMod: memoize(preventLoop(function(charId, skillName){
|
||||||
skillMod: preventLoop(function(skillName){
|
var skill = Characters.calculate.getField(charId, skillName);
|
||||||
var charId = this._id;
|
|
||||||
var skill = this.getField(skillName);
|
|
||||||
//get the final value of the ability score
|
//get the final value of the ability score
|
||||||
var ability = this.attributeValue(skill.ability);
|
var ability = Characters.calculate.attributeValue(charId, skill.ability);
|
||||||
|
|
||||||
//base modifier
|
//base modifier
|
||||||
var mod = +getMod(ability);
|
var mod = +getMod(ability);
|
||||||
|
|
||||||
//multiply proficiency bonus by largest value in proficiency array
|
//multiply proficiency bonus by largest value in proficiency array
|
||||||
var prof = this.proficiency(skillName);
|
var prof = Characters.calculate.proficiency(charId, skillName);
|
||||||
|
|
||||||
//add multiplied proficiency bonus to modifier
|
//add multiplied proficiency bonus to modifier
|
||||||
mod += prof * this.attributeValue("proficiencyBonus");
|
mod += prof * Characters.calculate.attributeValue(charId, "proficiencyBonus");
|
||||||
|
|
||||||
//apply all effects
|
//apply all effects
|
||||||
var rawEffects = Effects.find(
|
var value;
|
||||||
{charId: charId, stat: skillName, enabled: true}
|
var add = 0;
|
||||||
).fetch();
|
var mul = 1;
|
||||||
var effects = _.groupBy(rawEffects, "operation");
|
var min = Number.NEGATIVE_INFINITY;
|
||||||
_.forEach(effects.add, function(effect){
|
var max = Number.POSITIVE_INFINITY;
|
||||||
mod += evaluateEffect(charId, effect);
|
|
||||||
});
|
|
||||||
_.forEach(effects.mul, function(effect){
|
|
||||||
mod *= evaluateEffect(charId, effect);
|
|
||||||
});
|
|
||||||
_.forEach(effects.min, function(effect){
|
|
||||||
var min = evaluateEffect(charId, effect);
|
|
||||||
mod = mod > min ? mod : min;
|
|
||||||
});
|
|
||||||
_.forEach(effects.max, function(effect){
|
|
||||||
var max = evaluateEffect(charId, effect);
|
|
||||||
mod = mod < max ? mod : max;
|
|
||||||
});
|
|
||||||
return signedString(mod);
|
|
||||||
}),
|
|
||||||
|
|
||||||
proficiency: function(skillName){
|
Effects.find({
|
||||||
var charId = this._id;
|
charId: charId,
|
||||||
//return largest value in proficiency array
|
stat: skillName,
|
||||||
var prof = 0;
|
enabled: true,
|
||||||
Proficiencies.find(
|
operation: {$in: ["base", "add", "mul", "min", "max"]},
|
||||||
{charId: charId, name: skillName, enabled: true}
|
}).forEach(function(effect) {
|
||||||
).forEach(function(proficiency){
|
value = evaluateEffect(charId, effect);
|
||||||
var newProf = proficiency.value;
|
if (effect.operation === "add"){
|
||||||
if (newProf > prof){
|
add += value;
|
||||||
prof = newProf;
|
} else if (effect.operation === "mul"){
|
||||||
|
mul *= value;
|
||||||
|
} else if (effect.operation === "min"){
|
||||||
|
if (value > min) min = value;
|
||||||
|
} else if (effect.operation === "max"){
|
||||||
|
if (value < max) max = value;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return prof;
|
var result = (mod + add) * mul;
|
||||||
},
|
if (result < min) result = min;
|
||||||
|
if (result > max) result = max;
|
||||||
|
|
||||||
passiveSkill: function(skillName){
|
return Math.floor(result);
|
||||||
if (_.isString(skillName)){
|
})),
|
||||||
var skill = this.getField(skillName);
|
proficiency: memoize(function(charId, skillName){
|
||||||
}
|
//return largest value in proficiency array
|
||||||
var charId = this._id;
|
var prof = Proficiencies.findOne(
|
||||||
var mod = +this.skillMod(skillName);
|
{charId: charId, name: skillName, enabled: true},
|
||||||
|
{sort: {value: -1}}
|
||||||
|
);
|
||||||
|
return prof && prof.value || 0;
|
||||||
|
}),
|
||||||
|
passiveSkill: memoize(function(charId, skillName){
|
||||||
|
var skill = Characters.calculate.getField(charId, skillName);
|
||||||
|
var mod = +Characters.calculate.skillMod(charId, skillName);
|
||||||
var value = 10 + mod;
|
var value = 10 + mod;
|
||||||
Effects.find(
|
Effects.find(
|
||||||
{charId: charId, stat: skillName, enabled: true, operation: "passiveAdd"}
|
{charId: charId, stat: skillName, enabled: true, operation: "passiveAdd"}
|
||||||
).forEach(function(effect){
|
).forEach(function(effect){
|
||||||
value += evaluateEffect(charId, effect);
|
value += evaluateEffect(charId, effect);
|
||||||
});
|
});
|
||||||
return value;
|
var advantage = Characters.calculate.advantage(charId, skillName);
|
||||||
//TODO decide whether (dis)advantage gives (-)+5 to passive checks
|
value += 5 * advantage;
|
||||||
},
|
return Math.floor(value);
|
||||||
|
}),
|
||||||
advantage: function(skillName){
|
advantage: memoize(function(charId, skillName){
|
||||||
var charId = this._id;
|
|
||||||
var advantage = Effects.find(
|
var advantage = Effects.find(
|
||||||
{charId: charId, stat: skillName, enabled: true, operation: "advantage"}
|
{charId: charId, stat: skillName, enabled: true, operation: "advantage"}
|
||||||
).count();
|
).count();
|
||||||
@@ -351,19 +404,18 @@ Characters.helpers({
|
|||||||
if (advantage && !disadvantage) return 1;
|
if (advantage && !disadvantage) return 1;
|
||||||
if (disadvantage && !advantage) return -1;
|
if (disadvantage && !advantage) return -1;
|
||||||
return 0;
|
return 0;
|
||||||
|
}),
|
||||||
|
abilityMod: function(charId, attribute){
|
||||||
|
return getMod(
|
||||||
|
Characters.calculate.attributeValue(charId, attribute)
|
||||||
|
);
|
||||||
},
|
},
|
||||||
|
passiveAbility: function(charId, attribute){
|
||||||
abilityMod: function(attribute){
|
var mod = +getMod(Characters.calculate.attributeValue(charId, attribute));
|
||||||
return signedString(getMod(this.attributeValue(attribute)));
|
|
||||||
},
|
|
||||||
|
|
||||||
passiveAbility: function(attribute){
|
|
||||||
var mod = +getMod(this.attributeValue(attribute));
|
|
||||||
return 10 + mod;
|
return 10 + mod;
|
||||||
},
|
},
|
||||||
|
xpLevel: function(charId){
|
||||||
xpLevel: function(){
|
var xp = Characters.calculate.experience(charId);
|
||||||
var xp = this.experience();
|
|
||||||
for (var i = 0; i < 19; i++){
|
for (var i = 0; i < 19; i++){
|
||||||
if (xp < XP_TABLE[i]){
|
if (xp < XP_TABLE[i]){
|
||||||
return i;
|
return i;
|
||||||
@@ -372,30 +424,103 @@ Characters.helpers({
|
|||||||
if (xp > 355000) return 20;
|
if (xp > 355000) return 20;
|
||||||
return 0;
|
return 0;
|
||||||
},
|
},
|
||||||
|
level: memoize(function(charId){
|
||||||
level: function(){
|
|
||||||
var level = 0;
|
var level = 0;
|
||||||
Classes.find({charId: this._id}).forEach(function(cls){
|
Classes.find({charId: charId}).forEach(function(cls){
|
||||||
level += cls.level;
|
level += cls.level;
|
||||||
});
|
});
|
||||||
return level;
|
return level;
|
||||||
},
|
}),
|
||||||
|
experience: memoize(function(charId){
|
||||||
experience: function(){
|
|
||||||
var xp = 0;
|
var xp = 0;
|
||||||
Experiences.find(
|
Experiences.find(
|
||||||
{charId: this._id},
|
{charId: charId},
|
||||||
{fields: {value: 1}}
|
{fields: {value: 1}}
|
||||||
).forEach(function(e){
|
).forEach(function(e){
|
||||||
xp += e.value;
|
xp += e.value;
|
||||||
});
|
});
|
||||||
return xp;
|
return xp;
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
|
||||||
|
var deprecated = function() {
|
||||||
|
//var err = new Error("this function has been deprecated");
|
||||||
|
var name = "";
|
||||||
|
if (Template.instance()){
|
||||||
|
name = Template.instance().view.name;
|
||||||
|
}
|
||||||
|
var logString = "this function has been deprecated \n";
|
||||||
|
if (name){
|
||||||
|
logString += "View: " + name + "\n\n";
|
||||||
|
}
|
||||||
|
//logString += err.stack + "\n\n---------------------\n\n";
|
||||||
|
console.log(logString);
|
||||||
|
};
|
||||||
|
|
||||||
|
//functions and calculated values.
|
||||||
|
//These functions can only rely on this._id since no other
|
||||||
|
//field is likely to be attached to all returned characters
|
||||||
|
Characters.helpers({
|
||||||
|
//returns the value stored in the field requested
|
||||||
|
//will set up dependencies on just that field
|
||||||
|
getField : function(fieldName){
|
||||||
|
deprecated();
|
||||||
|
return Characters.calculate.getField(this._id, fieldName);
|
||||||
|
},
|
||||||
|
//returns the value of a field
|
||||||
|
fieldValue : function(fieldName){
|
||||||
|
deprecated();
|
||||||
|
return Characters.calculate.fieldValue(this._id, fieldName);
|
||||||
|
},
|
||||||
|
attributeValue: function(attributeName){
|
||||||
|
deprecated();
|
||||||
|
return Characters.calculate.attributeValue(this._id, attributeName);
|
||||||
|
},
|
||||||
|
attributeBase: function(attributeName){
|
||||||
|
deprecated();
|
||||||
|
return Characters.calculate.attributeBase(this._id, attributeName);
|
||||||
|
},
|
||||||
|
skillMod: function(skillName){
|
||||||
|
deprecated();
|
||||||
|
return Characters.calculate.skillMod(this._id, skillName);
|
||||||
|
},
|
||||||
|
proficiency: function(skillName){
|
||||||
|
deprecated();
|
||||||
|
return Characters.calculate.proficiency(this._id, skillName);
|
||||||
|
},
|
||||||
|
passiveSkill: function(skillName){
|
||||||
|
deprecated();
|
||||||
|
return Characters.calculate.passiveSkill(this._id, skillName);
|
||||||
|
},
|
||||||
|
advantage: function(skillName){
|
||||||
|
deprecated();
|
||||||
|
return Characters.calculate.advantage(this._id, skillName);
|
||||||
|
},
|
||||||
|
abilityMod: function(attribute){
|
||||||
|
deprecated();
|
||||||
|
return Characters.calculate.abilityMod(this._id, attribute);
|
||||||
|
},
|
||||||
|
passiveAbility: function(attribute){
|
||||||
|
deprecated();
|
||||||
|
return Characters.calculate.passiveAbility(this._id, attribute);
|
||||||
|
},
|
||||||
|
xpLevel: function(){
|
||||||
|
deprecated();
|
||||||
|
return Characters.calculate.xpLevel(this._id);
|
||||||
|
},
|
||||||
|
level: function(){
|
||||||
|
deprecated();
|
||||||
|
return Characters.calculate.level(this._id);
|
||||||
|
},
|
||||||
|
experience: function(){
|
||||||
|
deprecated();
|
||||||
|
return Characters.calculate.experience(this._id);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
//clean up all data related to that character before removing it
|
//clean up all data related to that character before removing it
|
||||||
Characters.after.remove(function(userId, character) {
|
if (Meteor.isServer){
|
||||||
if (Meteor.isServer){
|
Characters.after.remove(function(userId, character) {
|
||||||
Actions .remove({charId: character._id});
|
Actions .remove({charId: character._id});
|
||||||
Attacks .remove({charId: character._id});
|
Attacks .remove({charId: character._id});
|
||||||
Buffs .remove({charId: character._id});
|
Buffs .remove({charId: character._id});
|
||||||
@@ -408,8 +533,8 @@ Characters.after.remove(function(userId, character) {
|
|||||||
SpellLists .remove({charId: character._id});
|
SpellLists .remove({charId: character._id});
|
||||||
Items .remove({charId: character._id});
|
Items .remove({charId: character._id});
|
||||||
Containers .remove({charId: character._id});
|
Containers .remove({charId: character._id});
|
||||||
}
|
});
|
||||||
});
|
}
|
||||||
|
|
||||||
Characters.allow({
|
Characters.allow({
|
||||||
insert: function(userId, doc) {
|
insert: function(userId, doc) {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
Classes = new Mongo.Collection("classes");
|
Classes = new Mongo.Collection("classes");
|
||||||
|
|
||||||
Schemas.Class = new SimpleSchema({
|
Schemas.Class = new SimpleSchema({
|
||||||
charId: {type: String, regEx: SimpleSchema.RegEx.Id},
|
charId: {type: String, regEx: SimpleSchema.RegEx.Id, index: 1},
|
||||||
name: {type: String, trim: false},
|
name: {type: String, trim: false},
|
||||||
level: {type: Number},
|
level: {type: Number},
|
||||||
createdAt: {
|
createdAt: {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ Schemas.Effect = new SimpleSchema({
|
|||||||
charId: {
|
charId: {
|
||||||
type: String,
|
type: String,
|
||||||
regEx: SimpleSchema.RegEx.Id,
|
regEx: SimpleSchema.RegEx.Id,
|
||||||
|
index: 1,
|
||||||
},
|
},
|
||||||
name: {
|
name: {
|
||||||
type: String,
|
type: String,
|
||||||
@@ -58,59 +59,74 @@ Schemas.Effect = new SimpleSchema({
|
|||||||
|
|
||||||
Effects.attachSchema(Schemas.Effect);
|
Effects.attachSchema(Schemas.Effect);
|
||||||
|
|
||||||
if (Meteor.isServer) Characters.after.insert(function(userId, char) {
|
|
||||||
Effects.insert({
|
|
||||||
charId: char._id,
|
|
||||||
name: "Constitution modifier for each level",
|
|
||||||
stat: "hitPoints",
|
|
||||||
operation: "add",
|
|
||||||
calculation: "level * constitutionMod",
|
|
||||||
parent: {
|
|
||||||
id: char._id,
|
|
||||||
collection: "Characters",
|
|
||||||
group: "Inate",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
Effects.insert({
|
|
||||||
charId: char._id,
|
|
||||||
name: "Proficiency bonus by level",
|
|
||||||
stat: "proficiencyBonus",
|
|
||||||
operation: "add",
|
|
||||||
calculation: "floor(level / 4 + 1.75)",
|
|
||||||
parent: {
|
|
||||||
id: char._id,
|
|
||||||
collection: "Characters",
|
|
||||||
group: "Inate",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
Effects.insert({
|
|
||||||
charId: char._id,
|
|
||||||
name: "Dexterity Armor Bonus",
|
|
||||||
stat: "armor",
|
|
||||||
operation: "add",
|
|
||||||
calculation: "dexterityArmor",
|
|
||||||
parent: {
|
|
||||||
id: char._id,
|
|
||||||
collection: "Characters",
|
|
||||||
group: "Inate",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
Effects.insert({
|
|
||||||
charId: char._id,
|
|
||||||
name: "Natural Armor",
|
|
||||||
stat: "armor",
|
|
||||||
operation: "base",
|
|
||||||
value: 10,
|
|
||||||
parent: {
|
|
||||||
id: char._id,
|
|
||||||
collection: "Characters",
|
|
||||||
group: "Inate",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
Effects.attachBehaviour("softRemovable");
|
Effects.attachBehaviour("softRemovable");
|
||||||
makeChild(Effects, ["enabled"]); //children of lots of things
|
makeChild(Effects, ["enabled"]); //children of lots of things
|
||||||
|
|
||||||
Effects.allow(CHARACTER_SUBSCHEMA_ALLOW);
|
Effects.allow(CHARACTER_SUBSCHEMA_ALLOW);
|
||||||
Effects.deny(CHARACTER_SUBSCHEMA_DENY);
|
Effects.deny(CHARACTER_SUBSCHEMA_DENY);
|
||||||
|
|
||||||
|
//give characters default character effects
|
||||||
|
Characters.after.insert(function(userId, char) {
|
||||||
|
if (Meteor.isServer) {
|
||||||
|
Effects.insert({
|
||||||
|
charId: char._id,
|
||||||
|
name: "Constitution modifier for each level",
|
||||||
|
stat: "hitPoints",
|
||||||
|
operation: "add",
|
||||||
|
calculation: "level * constitutionMod",
|
||||||
|
parent: {
|
||||||
|
id: char._id,
|
||||||
|
collection: "Characters",
|
||||||
|
group: "Inate",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
Effects.insert({
|
||||||
|
charId: char._id,
|
||||||
|
name: "Proficiency bonus by level",
|
||||||
|
stat: "proficiencyBonus",
|
||||||
|
operation: "add",
|
||||||
|
calculation: "floor(level / 4 + 1.75)",
|
||||||
|
parent: {
|
||||||
|
id: char._id,
|
||||||
|
collection: "Characters",
|
||||||
|
group: "Inate",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
Effects.insert({
|
||||||
|
charId: char._id,
|
||||||
|
name: "Dexterity Armor Bonus",
|
||||||
|
stat: "armor",
|
||||||
|
operation: "add",
|
||||||
|
calculation: "dexterityArmor",
|
||||||
|
parent: {
|
||||||
|
id: char._id,
|
||||||
|
collection: "Characters",
|
||||||
|
group: "Inate",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
Effects.insert({
|
||||||
|
charId: char._id,
|
||||||
|
name: "Natural Armor",
|
||||||
|
stat: "armor",
|
||||||
|
operation: "base",
|
||||||
|
value: 10,
|
||||||
|
parent: {
|
||||||
|
id: char._id,
|
||||||
|
collection: "Characters",
|
||||||
|
group: "Inate",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
Effects.insert({
|
||||||
|
charId: char._id,
|
||||||
|
name: "Natural Carrying Capacity",
|
||||||
|
stat: "carryMultiplier",
|
||||||
|
operation: "base",
|
||||||
|
value: "1",
|
||||||
|
parent: {
|
||||||
|
id: char._id,
|
||||||
|
collection: "Characters",
|
||||||
|
group: "Inate",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
Experiences = new Mongo.Collection("experience");
|
Experiences = new Mongo.Collection("experience");
|
||||||
|
|
||||||
Schemas.Experience = new SimpleSchema({
|
Schemas.Experience = new SimpleSchema({
|
||||||
charId: {type: String, regEx: SimpleSchema.RegEx.Id},
|
charId: {type: String, regEx: SimpleSchema.RegEx.Id, index: 1},
|
||||||
name: {type: String, defaultValue: "New Experience", trim: false},
|
name: {type: String, defaultValue: "New Experience", trim: false},
|
||||||
description: {type: String, optional: true, trim: false},
|
description: {type: String, optional: true, trim: false},
|
||||||
value: {type: Number, defaultValue: 0},
|
value: {type: Number, defaultValue: 0},
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
Features = new Mongo.Collection("features");
|
Features = new Mongo.Collection("features");
|
||||||
|
|
||||||
Schemas.Feature = new SimpleSchema({
|
Schemas.Feature = new SimpleSchema({
|
||||||
charId: {type: String, regEx: SimpleSchema.RegEx.Id},
|
charId: {type: String, regEx: SimpleSchema.RegEx.Id, index: 1},
|
||||||
name: {type: String, trim: false},
|
name: {type: String, trim: false},
|
||||||
description: {type: String, optional: true, trim: false},
|
description: {type: String, optional: true, trim: false},
|
||||||
uses: {type: String, optional: true, trim: false},
|
uses: {type: String, optional: true, trim: false},
|
||||||
@@ -35,3 +35,81 @@ makeParent(Features, ["name", "enabled"]); //parents of effects and attacks
|
|||||||
|
|
||||||
Features.allow(CHARACTER_SUBSCHEMA_ALLOW);
|
Features.allow(CHARACTER_SUBSCHEMA_ALLOW);
|
||||||
Features.deny(CHARACTER_SUBSCHEMA_DENY);
|
Features.deny(CHARACTER_SUBSCHEMA_DENY);
|
||||||
|
|
||||||
|
//give characters default feature of base ability scores of 10
|
||||||
|
Characters.after.insert(function(userId, char) {
|
||||||
|
if (Meteor.isServer){
|
||||||
|
var featureId = Features.insert({
|
||||||
|
name: "Base Ability Scores",
|
||||||
|
charId: char._id,
|
||||||
|
enabled: true,
|
||||||
|
alwaysEnabled: true,
|
||||||
|
});
|
||||||
|
Effects.insert({
|
||||||
|
stat: "strength",
|
||||||
|
charId: char._id,
|
||||||
|
parent: {
|
||||||
|
id: featureId,
|
||||||
|
collection: "Features",
|
||||||
|
},
|
||||||
|
operation: "base",
|
||||||
|
value: 10,
|
||||||
|
enabled: true,
|
||||||
|
});
|
||||||
|
Effects.insert({
|
||||||
|
stat: "dexterity",
|
||||||
|
charId: char._id,
|
||||||
|
parent: {
|
||||||
|
id: featureId,
|
||||||
|
collection: "Features",
|
||||||
|
},
|
||||||
|
operation: "base",
|
||||||
|
value: 10,
|
||||||
|
enabled: true,
|
||||||
|
});
|
||||||
|
Effects.insert({
|
||||||
|
stat: "constitution",
|
||||||
|
charId: char._id,
|
||||||
|
parent: {
|
||||||
|
id: featureId,
|
||||||
|
collection: "Features",
|
||||||
|
},
|
||||||
|
operation: "base",
|
||||||
|
value: 10,
|
||||||
|
enabled: true,
|
||||||
|
});
|
||||||
|
Effects.insert({
|
||||||
|
stat: "intelligence",
|
||||||
|
charId: char._id,
|
||||||
|
parent: {
|
||||||
|
id: featureId,
|
||||||
|
collection: "Features",
|
||||||
|
},
|
||||||
|
operation: "base",
|
||||||
|
value: 10,
|
||||||
|
enabled: true,
|
||||||
|
});
|
||||||
|
Effects.insert({
|
||||||
|
stat: "wisdom",
|
||||||
|
charId: char._id,
|
||||||
|
parent: {
|
||||||
|
id: featureId,
|
||||||
|
collection: "Features",
|
||||||
|
},
|
||||||
|
operation: "base",
|
||||||
|
value: 10,
|
||||||
|
enabled: true,
|
||||||
|
});
|
||||||
|
Effects.insert({
|
||||||
|
stat: "charisma",
|
||||||
|
charId: char._id,
|
||||||
|
parent: {
|
||||||
|
id: featureId,
|
||||||
|
collection: "Features",
|
||||||
|
},
|
||||||
|
operation: "base",
|
||||||
|
value: 10,
|
||||||
|
enabled: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
Notes = new Mongo.Collection("notes");
|
Notes = new Mongo.Collection("notes");
|
||||||
|
|
||||||
Schemas.Note = new SimpleSchema({
|
Schemas.Note = new SimpleSchema({
|
||||||
charId: {type: String, regEx: SimpleSchema.RegEx.Id},
|
charId: {type: String, regEx: SimpleSchema.RegEx.Id, index: 1},
|
||||||
name: {type: String, trim: false},
|
name: {type: String, trim: false},
|
||||||
description: {type: String, optional: true, trim: false},
|
description: {type: String, optional: true, trim: false},
|
||||||
color: {
|
color: {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ Schemas.Proficiency = new SimpleSchema({
|
|||||||
charId: {
|
charId: {
|
||||||
type: String,
|
type: String,
|
||||||
regEx: SimpleSchema.RegEx.Id,
|
regEx: SimpleSchema.RegEx.Id,
|
||||||
|
index: 1,
|
||||||
},
|
},
|
||||||
name: {
|
name: {
|
||||||
type: String,
|
type: String,
|
||||||
@@ -30,7 +31,7 @@ Schemas.Proficiency = new SimpleSchema({
|
|||||||
Proficiencies.attachSchema(Schemas.Proficiency);
|
Proficiencies.attachSchema(Schemas.Proficiency);
|
||||||
|
|
||||||
Proficiencies.attachBehaviour("softRemovable");
|
Proficiencies.attachBehaviour("softRemovable");
|
||||||
makeChild(Proficiencies);
|
makeChild(Proficiencies, ["enabled"]);
|
||||||
|
|
||||||
Proficiencies.allow(CHARACTER_SUBSCHEMA_ALLOW);
|
Proficiencies.allow(CHARACTER_SUBSCHEMA_ALLOW);
|
||||||
Proficiencies.deny(CHARACTER_SUBSCHEMA_DENY);
|
Proficiencies.deny(CHARACTER_SUBSCHEMA_DENY);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
SpellLists = new Mongo.Collection("spellLists");
|
SpellLists = new Mongo.Collection("spellLists");
|
||||||
|
|
||||||
Schemas.SpellLists = new SimpleSchema({
|
Schemas.SpellLists = new SimpleSchema({
|
||||||
charId: {type: String, regEx: SimpleSchema.RegEx.Id},
|
charId: {type: String, regEx: SimpleSchema.RegEx.Id, index: 1},
|
||||||
name: {type: String, trim: false},
|
name: {type: String, trim: false},
|
||||||
description: {type: String, optional: true, trim: false},
|
description: {type: String, optional: true, trim: false},
|
||||||
saveDC: {type: String, optional: true, trim: false},
|
saveDC: {type: String, optional: true, trim: false},
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
Spells = new Mongo.Collection("spells");
|
Spells = new Mongo.Collection("spells");
|
||||||
|
|
||||||
Schemas.Spell = new SimpleSchema({
|
Schemas.Spell = new SimpleSchema({
|
||||||
charId: {type: String, regEx: SimpleSchema.RegEx.Id},
|
charId: {type: String, regEx: SimpleSchema.RegEx.Id, index: 1},
|
||||||
prepared: {
|
prepared: {
|
||||||
type: String,
|
type: String,
|
||||||
defaultValue: "prepared",
|
defaultValue: "prepared",
|
||||||
@@ -62,6 +62,23 @@ Spells.attachSchema(Schemas.Spell);
|
|||||||
|
|
||||||
Spells.attachBehaviour("softRemovable");
|
Spells.attachBehaviour("softRemovable");
|
||||||
makeChild(Spells); //children of spell lists
|
makeChild(Spells); //children of spell lists
|
||||||
|
makeParent(Spells, ["name", "enabled"]); //parents of attacks
|
||||||
|
|
||||||
|
Spells.after.update(function (userId, spell, fieldNames) {
|
||||||
|
//Update prepared state of spell and child attacks to be enabled or not
|
||||||
|
if (_.contains(fieldNames, "prepared")) {
|
||||||
|
var childAttacks = Attacks.find({"parent.id": spell._id}).fetch();
|
||||||
|
if (spell.prepared === "unprepared") {
|
||||||
|
_.each(childAttacks, function(attack){
|
||||||
|
Attacks.update(attack._id, {$set: {enabled: false}});
|
||||||
|
});
|
||||||
|
} else if (spell.prepared === "prepared" || "always") {
|
||||||
|
_.each(childAttacks, function(attack){
|
||||||
|
Attacks.update(attack._id, {$set: {enabled: true}});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
Spells.allow(CHARACTER_SUBSCHEMA_ALLOW);
|
Spells.allow(CHARACTER_SUBSCHEMA_ALLOW);
|
||||||
Spells.deny(CHARACTER_SUBSCHEMA_DENY);
|
Spells.deny(CHARACTER_SUBSCHEMA_DENY);
|
||||||
|
|||||||
@@ -3,10 +3,6 @@
|
|||||||
* Damage, healing and resource cost/recovery are all adjustments
|
* Damage, healing and resource cost/recovery are all adjustments
|
||||||
*/
|
*/
|
||||||
Schemas.Adjustment = new SimpleSchema({
|
Schemas.Adjustment = new SimpleSchema({
|
||||||
name: {
|
|
||||||
type: String,
|
|
||||||
optional: true,
|
|
||||||
},
|
|
||||||
//which stat the adjustment is applied to
|
//which stat the adjustment is applied to
|
||||||
stat: {
|
stat: {
|
||||||
type: String,
|
type: String,
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
TemporaryHitPoints = new Mongo.Collection("temporaryHitPoints");
|
TemporaryHitPoints = new Mongo.Collection("temporaryHitPoints");
|
||||||
|
|
||||||
Schemas.TemporaryHitPoints = new SimpleSchema({
|
Schemas.TemporaryHitPoints = new SimpleSchema({
|
||||||
charId: {type: String, regEx: SimpleSchema.RegEx.Id},
|
charId: {type: String, regEx: SimpleSchema.RegEx.Id, index: 1},
|
||||||
name: {type: String, optional: true},
|
name: {type: String, optional: true},
|
||||||
maximum: {type: Number, defaultValue: 0},
|
maximum: {type: Number, defaultValue: 0, min: 0, max: 500},
|
||||||
used: {type: Number, defaultValue: 0},
|
used: {type: Number, defaultValue: 0, min: 0, max: 500},
|
||||||
deleteOnZero:{type: Boolean, defaultValue: true},
|
deleteOnZero:{type: Boolean, defaultValue: false},
|
||||||
dateAdded: {
|
dateAdded: {
|
||||||
type: Date,
|
type: Date,
|
||||||
autoValue: function() {
|
autoValue: function() {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ Containers = new Mongo.Collection("containers");
|
|||||||
|
|
||||||
Schemas.Container = new SimpleSchema({
|
Schemas.Container = new SimpleSchema({
|
||||||
name: {type: String, trim: false},
|
name: {type: String, trim: false},
|
||||||
charId: {type: String, regEx: SimpleSchema.RegEx.Id},
|
charId: {type: String, regEx: SimpleSchema.RegEx.Id, index: 1},
|
||||||
isCarried: {type: Boolean},
|
isCarried: {type: Boolean},
|
||||||
weight: {type: Number, min: 0, defaultValue: 0, decimal: true},
|
weight: {type: Number, min: 0, defaultValue: 0, decimal: true},
|
||||||
value: {type: Number, min: 0, defaultValue: 0, decimal: true},
|
value: {type: Number, min: 0, defaultValue: 0, decimal: true},
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Schemas.Item = new SimpleSchema({
|
|||||||
name: {type: String, defaultValue: "New Item", trim: false},
|
name: {type: String, defaultValue: "New Item", trim: false},
|
||||||
plural: {type: String, optional: true, trim: false},
|
plural: {type: String, optional: true, trim: false},
|
||||||
description:{type: String, optional: true, trim: false},
|
description:{type: String, optional: true, trim: false},
|
||||||
charId: {type: String, regEx: SimpleSchema.RegEx.Id}, //id of owner
|
charId: {type: String, regEx: SimpleSchema.RegEx.Id, index: 1}, //id of owner
|
||||||
quantity: {type: Number, min: 0, defaultValue: 1},
|
quantity: {type: Number, min: 0, defaultValue: 1},
|
||||||
weight: {type: Number, min: 0, defaultValue: 0, decimal: true},
|
weight: {type: Number, min: 0, defaultValue: 0, decimal: true},
|
||||||
value: {type: Number, min: 0, defaultValue: 0, decimal: true},
|
value: {type: Number, min: 0, defaultValue: 0, decimal: true},
|
||||||
@@ -228,6 +228,9 @@ Characters.after.insert(function(userId, char) {
|
|||||||
id: containerId,
|
id: containerId,
|
||||||
collection: "Containers",
|
collection: "Containers",
|
||||||
},
|
},
|
||||||
|
settings: {
|
||||||
|
showIncrement: true,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
Items.insert({
|
Items.insert({
|
||||||
name: "Silver piece",
|
name: "Silver piece",
|
||||||
@@ -241,6 +244,9 @@ Characters.after.insert(function(userId, char) {
|
|||||||
id: containerId,
|
id: containerId,
|
||||||
collection: "Containers",
|
collection: "Containers",
|
||||||
},
|
},
|
||||||
|
settings: {
|
||||||
|
showIncrement: true,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
Items.insert({
|
Items.insert({
|
||||||
name: "Copper piece",
|
name: "Copper piece",
|
||||||
@@ -254,6 +260,9 @@ Characters.after.insert(function(userId, char) {
|
|||||||
id: containerId,
|
id: containerId,
|
||||||
collection: "Containers",
|
collection: "Containers",
|
||||||
},
|
},
|
||||||
|
settings: {
|
||||||
|
showIncrement: true,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -17,8 +17,8 @@ Schemas.Report = new SimpleSchema({
|
|||||||
},
|
},
|
||||||
type: {
|
type: {
|
||||||
type: String,
|
type: String,
|
||||||
allowedValues: ["bug", "change", "feature", "general"],
|
allowedValues: ["General Feedback", "Bug", "Suggested Change", "Feature Request"],
|
||||||
defaultValue: "bug",
|
defaultValue: "General Feedback",
|
||||||
},
|
},
|
||||||
//the immediate impact of doing this action (eg. -1 rages)
|
//the immediate impact of doing this action (eg. -1 rages)
|
||||||
severity: {
|
severity: {
|
||||||
@@ -45,7 +45,26 @@ Meteor.methods({
|
|||||||
metaData: Object,
|
metaData: Object,
|
||||||
});
|
});
|
||||||
report.owner = this.userId;
|
report.owner = this.userId;
|
||||||
Reports.insert(report);
|
var id = Reports.insert(report);
|
||||||
|
var user = Meteor.users.findOne(this.userId);
|
||||||
|
var sender = user &&
|
||||||
|
user.emails &&
|
||||||
|
user.emails[0] &&
|
||||||
|
user.emails[0].address ||
|
||||||
|
user.services &&
|
||||||
|
user.services.google &&
|
||||||
|
user.services.google.email ||
|
||||||
|
"reports@dicecloud.com";
|
||||||
|
var bodyText = "Report ID: " + id +
|
||||||
|
"\nSeverity: " + report.severity +
|
||||||
|
"\nType: " + report.type +
|
||||||
|
"\n\n" + report.description;
|
||||||
|
Email.send({
|
||||||
|
from: sender,
|
||||||
|
to: "stefan.zermatten@gmail.com",
|
||||||
|
subject: "DiceCloud feedback - " + report.title,
|
||||||
|
text: bodyText,
|
||||||
|
});
|
||||||
},
|
},
|
||||||
deleteReport: function(id) {
|
deleteReport: function(id) {
|
||||||
var user = Meteor.users.findOne(this.userId);
|
var user = Meteor.users.findOne(this.userId);
|
||||||
|
|||||||
@@ -1,20 +1,13 @@
|
|||||||
Router.configure({
|
Router.configure({
|
||||||
loadingTemplate: "loading",
|
loadingTemplate: "loading",
|
||||||
layoutTemplate: "layout",
|
layoutTemplate: "layout",
|
||||||
|
trackPageView: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
Router.plugin("ensureSignedIn", {
|
Router.plugin("ensureSignedIn", {
|
||||||
except: [
|
only: [
|
||||||
"home",
|
"profile",
|
||||||
"atSignIn",
|
"characterList",
|
||||||
"atSignUp",
|
|
||||||
"atForgotPassword",
|
|
||||||
"atResetPwd",
|
|
||||||
"atEnrollAccount",
|
|
||||||
"atVerifyEmail",
|
|
||||||
"atResendVerificationEmail",
|
|
||||||
"loginButtons",
|
|
||||||
"notFound",
|
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -31,23 +24,19 @@ Router.map(function() {
|
|||||||
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: {
|
|
||||||
characters: function(){
|
|
||||||
return Characters.find({}, {fields: {_id: 1}});
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
onAfterAction: function() {
|
onAfterAction: function() {
|
||||||
document.title = appName;
|
document.title = appName + " - Characters";
|
||||||
},
|
},
|
||||||
|
fastRender: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
this.route("characterSheet", {
|
this.route("characterSheet", {
|
||||||
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() {
|
||||||
@@ -64,6 +53,13 @@ Router.map(function() {
|
|||||||
document.title = name;
|
document.title = name;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
//analytics
|
||||||
|
trackPageView: false,
|
||||||
|
onRun: function() {
|
||||||
|
window.ga && window.ga("send", "pageview", "/character");
|
||||||
|
this.next();
|
||||||
|
},
|
||||||
|
fastRender: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
this.route("loading", {
|
this.route("loading", {
|
||||||
@@ -81,7 +77,7 @@ Router.map(function() {
|
|||||||
name: "changeLog",
|
name: "changeLog",
|
||||||
waitOn: function() {
|
waitOn: function() {
|
||||||
return [
|
return [
|
||||||
Meteor.subscribe("changeLog"),
|
subsManager.subscribe("changeLog"),
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
data: {
|
data: {
|
||||||
@@ -92,5 +88,13 @@ Router.map(function() {
|
|||||||
onAfterAction: function() {
|
onAfterAction: function() {
|
||||||
document.title = appName;
|
document.title = appName;
|
||||||
},
|
},
|
||||||
|
fastRender: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.route("/guide", {
|
||||||
|
name: "guide",
|
||||||
|
onAfterAction: function() {
|
||||||
|
document.title = appName;
|
||||||
|
},
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,7 +2,9 @@
|
|||||||
"name": "RPG Docs",
|
"name": "RPG Docs",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"homepage": "",
|
"homepage": "",
|
||||||
"authors": ["Stefan Zermatten"],
|
"authors": [
|
||||||
|
"Stefan Zermatten"
|
||||||
|
],
|
||||||
"license": "none",
|
"license": "none",
|
||||||
"private": true,
|
"private": true,
|
||||||
"ignore": [
|
"ignore": [
|
||||||
@@ -13,13 +15,16 @@
|
|||||||
"tests"
|
"tests"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"polymer": "Polymer/polymer#~0.5.5",
|
"polymer": "Polymer/polymer#^1.0.0",
|
||||||
"core-elements": "Polymer/core-elements#~0.5.5",
|
"iron-elements": "PolymerElements/iron-elements#^1.0.0",
|
||||||
"paper-elements": "Polymer/paper-elements#~0.5.5"
|
"platinum-elements": "PolymerElements/platinum-elements#^1.0.1",
|
||||||
|
"neon-elements": "PolymerElements/neon-elements#^1.0.0",
|
||||||
|
"paper-elements": "PolymerElements/paper-elements#^1.0.7",
|
||||||
|
"app-elements": "PolymerElements/app-elements#^0.10.1",
|
||||||
|
"marked-element": "PolymerElements/marked-element#^1.2.0",
|
||||||
|
"paper-swatch-picker": "PolymerElements/paper-swatch-picker#~1.0.2"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"core-component-page": "^0.5.0",
|
"webcomponentsjs": "0.7.24"
|
||||||
"polymer": "^0.5.0",
|
|
||||||
"webcomponentsjs": "^0.5.0"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,17 @@
|
|||||||
this.GlobalUI = (function() {
|
this.GlobalUI = (function() {
|
||||||
function GlobalUI() {}
|
function GlobalUI() {}
|
||||||
|
var toast;
|
||||||
GlobalUI.dialog = {};
|
|
||||||
|
|
||||||
GlobalUI.toast = function(opts) {
|
GlobalUI.toast = function(opts) {
|
||||||
var toast;
|
if (!toast) toast = $("#global-toast")[0];
|
||||||
toast = $("[global-toast]")[0];
|
if (_.isObject(opts)){
|
||||||
toast.text = opts.text;
|
toast.text = opts.text;
|
||||||
Session.set("global.ui.toastTemplate", opts.template);
|
Session.set("global.ui.toastTemplate", opts.template);
|
||||||
Session.set("global.ui.toastData", opts.data);
|
Session.set("global.ui.toastData", opts.data);
|
||||||
|
} else {
|
||||||
|
toast.text = opts;
|
||||||
|
Session.set("global.ui.toastTemplate");
|
||||||
|
Session.set("global.ui.toastData");
|
||||||
|
}
|
||||||
return toast.show();
|
return toast.show();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -18,147 +21,18 @@ this.GlobalUI = (function() {
|
|||||||
template: "undoToast",
|
template: "undoToast",
|
||||||
data: {
|
data: {
|
||||||
id: id,
|
id: id,
|
||||||
collection: collection
|
collection: collection,
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
GlobalUI.setDialog = function(opts) {
|
|
||||||
this.dialog = $("[global-dialog]")[0];
|
|
||||||
Session.set("global.ui.dialogHeader", opts.heading);
|
|
||||||
Session.set("global.ui.dialogData", opts.data);
|
|
||||||
Session.set("global.ui.dialogTemplate", opts.template);
|
|
||||||
Session.set("global.ui.dialogFullOnMobile", opts.fullOnMobile !== null);
|
|
||||||
};
|
|
||||||
|
|
||||||
GlobalUI.showDialog = function(opts) {
|
|
||||||
this.dialog = $("[global-dialog]")[0];
|
|
||||||
Session.set("global.ui.dialogHeader", opts.heading);
|
|
||||||
Session.set("global.ui.dialogData", opts.data);
|
|
||||||
Session.set("global.ui.dialogTemplate", opts.template);
|
|
||||||
Session.set("global.ui.dialogFullOnMobile", opts.fullOnMobile !== null);
|
|
||||||
return Tracker.afterFlush((function(_this) {
|
|
||||||
return function() {
|
|
||||||
return _this.dialog.open();
|
|
||||||
};
|
|
||||||
})(this));
|
|
||||||
};
|
|
||||||
|
|
||||||
GlobalUI.closeDialog = function() {
|
|
||||||
return this.dialog.close();
|
|
||||||
};
|
|
||||||
|
|
||||||
//To show a detail, first animate the click, with raising z-depth
|
|
||||||
//then call this function with a template and data
|
|
||||||
//the element should have a hero-id of detail-main
|
|
||||||
GlobalUI.showDetail = function(opts) {
|
|
||||||
Session.set("global.ui.detailData", opts.data);
|
|
||||||
Session.set("global.ui.detailTemplate", opts.template);
|
|
||||||
Session.set("global.ui.detailHeroId", opts.heroId);
|
|
||||||
Session.set("global.ui.detailShow", true);
|
|
||||||
};
|
|
||||||
|
|
||||||
//if setting the detail rather than showing it,
|
|
||||||
//the template should contain the following in template.rendered
|
|
||||||
//
|
|
||||||
//if (!this.alreadyRendered){
|
|
||||||
// Session.set("global.ui.detailShow", true);
|
|
||||||
// this.alreadyRendered = true;
|
|
||||||
//}
|
|
||||||
GlobalUI.setDetail = function(opts) {
|
|
||||||
Session.set("global.ui.detailData", opts.data);
|
|
||||||
Session.set("global.ui.detailTemplate", opts.template);
|
|
||||||
Session.set("global.ui.detailHeroId", opts.heroId);
|
|
||||||
if (window.history && window.history.pushState) {
|
|
||||||
history.replaceState({detail: "closed", opts: opts}, "Detail Dialog");
|
|
||||||
history.pushState({detail: "opened", opts: opts}, "Detail Dialog");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var throttleBack = _.throttle(function() {
|
|
||||||
history.back();
|
|
||||||
}, 800, {trailing: false});
|
|
||||||
|
|
||||||
GlobalUI.closeDetail = function() {
|
|
||||||
if (!!(window.history && window.history.pushState)) {
|
|
||||||
throttleBack();
|
|
||||||
} else {
|
|
||||||
Session.set("global.ui.detailShow", false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
GlobalUI.popStateHandler = function(e) {
|
|
||||||
var state = e.originalEvent.state;
|
|
||||||
if (state) {
|
|
||||||
if (state.detail === "closed") {
|
|
||||||
Session.set("global.ui.detailShow", false);
|
|
||||||
} else if (state.detail === "opened") {
|
|
||||||
var opts = state.opts;
|
|
||||||
Session.set("global.ui.detailData", opts.data);
|
|
||||||
Session.set("global.ui.detailTemplate", opts.template);
|
|
||||||
Session.set("global.ui.detailHeroId", opts.heroId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return GlobalUI;
|
return GlobalUI;
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|
||||||
Template.layout.helpers({
|
Template.layout.helpers({
|
||||||
globalDialogTemplate: function() {
|
|
||||||
return Session.get("global.ui.dialogTemplate");
|
|
||||||
},
|
|
||||||
globalDialogData: function() {
|
|
||||||
return Session.get("global.ui.dialogData");
|
|
||||||
},
|
|
||||||
globalDialogFullOnMobile: function() {
|
|
||||||
return Session.get("global.ui.dialogFullOnMobile");
|
|
||||||
},
|
|
||||||
globalDialogHeader: function() {
|
|
||||||
return Session.get("global.ui.dialogHeader");
|
|
||||||
},
|
|
||||||
globalDetailSelected: function() {
|
|
||||||
return Session.get("global.ui.detailShow") ? 1 : 0;
|
|
||||||
},
|
|
||||||
globalDetailTemplate: function() {
|
|
||||||
return Session.get("global.ui.detailTemplate");
|
|
||||||
},
|
|
||||||
globalDetailData: function() {
|
|
||||||
return Session.get("global.ui.detailData");
|
|
||||||
},
|
|
||||||
globalToastTemplate: function() {
|
globalToastTemplate: function() {
|
||||||
return Session.get("global.ui.toastTemplate");
|
return Session.get("global.ui.toastTemplate");
|
||||||
},
|
},
|
||||||
globalToastData: function() {
|
globalToastData: function() {
|
||||||
return Session.get("global.ui.toastData");
|
return Session.get("global.ui.toastData");
|
||||||
}
|
},
|
||||||
});
|
|
||||||
|
|
||||||
Template.layout.events({
|
|
||||||
"core-overlay-close-completed [global-dialog]": function(e) {
|
|
||||||
Session.set("global.ui.dialogTemplate", null);
|
|
||||||
Session.set("global.ui.dialogData", null);
|
|
||||||
return Session.set("global.ui.dialogFullOnMobile", null);
|
|
||||||
},
|
|
||||||
"core-animated-pages-transition-end [detail-pages]": function(e) {
|
|
||||||
var detailOpened = Session.get("global.ui.detailShow");
|
|
||||||
if (!detailOpened) {
|
|
||||||
Session.set("global.ui.detailData", null);
|
|
||||||
Session.set("global.ui.detailTemplate", null);
|
|
||||||
Session.set("global.ui.detailHeroId", null);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"core-animated-pages-transition-prepare": function(e) {
|
|
||||||
var detailOpened = Session.get("global.ui.detailShow");
|
|
||||||
if (detailOpened) {
|
|
||||||
//set up the transition
|
|
||||||
} else {
|
|
||||||
//undo hack
|
|
||||||
$("#mainContentSection").removeClass("fake-selected");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tap #screenDim": function(e) {
|
|
||||||
GlobalUI.closeDetail();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
Template.registerHelper("canEditCharacter", function(charId) {
|
Template.registerHelper("canEditCharacter", function(charId) {
|
||||||
|
return canEditCharacter(charId);
|
||||||
|
});
|
||||||
|
|
||||||
|
canEditCharacter = function(charId) {
|
||||||
var char = Characters.findOne(charId)
|
var char = Characters.findOne(charId)
|
||||||
var userId = Meteor.userId();
|
var userId = Meteor.userId();
|
||||||
return char.owner === userId ||
|
return char.owner === userId ||
|
||||||
_.contains(char.writers, userId);
|
_.contains(char.writers, userId);
|
||||||
});
|
};
|
||||||
|
|||||||
@@ -23,3 +23,11 @@ Template.registerHelper("evaluateSignedSpaced", function(charId, string) {
|
|||||||
Template.registerHelper("evaluateString", function(charId, string) {
|
Template.registerHelper("evaluateString", function(charId, string) {
|
||||||
return evaluateString(charId, string);
|
return evaluateString(charId, string);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Template.registerHelper("evaluateShortString", function(charId, string) {
|
||||||
|
if (_.isString(string)){
|
||||||
|
return evaluateString(
|
||||||
|
charId, string.split(/^( *[-*_]){3,} *(?:\n+|$)/m)[0]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,27 +1,23 @@
|
|||||||
openParentDialog = function(parent, charId, heroId) {
|
openParentDialog = function({
|
||||||
var detail;
|
parent, charId, element, returnElement, callback,
|
||||||
|
}) {
|
||||||
|
let template;
|
||||||
|
let data;
|
||||||
if (parent.collection === "Characters" && parent.group === "racial") {
|
if (parent.collection === "Characters" && parent.group === "racial") {
|
||||||
detail = {
|
template = "raceDialog";
|
||||||
template: "raceDialog",
|
data = {charId: parent.id};
|
||||||
data: {charId: parent.id},
|
|
||||||
};
|
|
||||||
} else if (parent.collection === "Features") {
|
} else if (parent.collection === "Features") {
|
||||||
detail = {
|
template = "featureDialog";
|
||||||
template: "featureDialog",
|
data = {featureId: parent.id};
|
||||||
data: {featureId: parent.id},
|
|
||||||
};
|
|
||||||
} else if (parent.collection === "Classes") {
|
} else if (parent.collection === "Classes") {
|
||||||
detail = {
|
template = "classDialog";
|
||||||
template: "classDialog",
|
data = {classId: parent.id};
|
||||||
data: {classId: parent.id},
|
|
||||||
};
|
|
||||||
} else if (parent.collection === "Items") {
|
} else if (parent.collection === "Items") {
|
||||||
detail = {
|
template = "itemDialog";
|
||||||
template: "itemDialog",
|
data = {itemId: parent.id};
|
||||||
data: {itemId: parent.id},
|
} else if (parent.collection === "Spells") {
|
||||||
};
|
template = "spellDialog";
|
||||||
|
data = {spellId: parent.id};
|
||||||
}
|
}
|
||||||
detail.heroId = heroId;
|
pushDialogStack({template, data, element, returnElement, callback});
|
||||||
detail.charId = charId;
|
|
||||||
GlobalUI.setDetail(detail);
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,25 +1,27 @@
|
|||||||
Template.registerHelper("valueString", function(value) {
|
Template.registerHelper("valueString", function(value) {
|
||||||
|
var intValue = Math.round(value * 100);
|
||||||
|
var cp = intValue % 10;
|
||||||
|
intValue -= cp;
|
||||||
|
cp = Math.round(cp);
|
||||||
|
sp = intValue % 100;
|
||||||
|
intValue -= sp;
|
||||||
|
sp = Math.round(sp / 10)
|
||||||
|
gp = Math.floor(value);
|
||||||
|
|
||||||
var resultArray = [];
|
var resultArray = [];
|
||||||
//sp
|
|
||||||
var gp = Math.floor(value);
|
|
||||||
if (gp > 0) {
|
if (gp > 0) {
|
||||||
resultArray.push(gp + "gp");
|
resultArray.push(gp + "gp");
|
||||||
}
|
}
|
||||||
//sp
|
|
||||||
var sp = Math.floor(10 * (value % 1));
|
|
||||||
if (sp > 0) {
|
if (sp > 0) {
|
||||||
resultArray.push(sp + "sp");
|
resultArray.push(sp + "sp");
|
||||||
}
|
}
|
||||||
//cp
|
|
||||||
var cp = 10 * ((value * 10) % 1);
|
|
||||||
cp = Math.round(cp * 1000) / 1000;
|
|
||||||
if (cp > 0) {
|
if (cp > 0) {
|
||||||
resultArray.push(cp + "cp");
|
resultArray.push(cp + "cp");
|
||||||
}
|
}
|
||||||
|
|
||||||
//build string with correct spacing
|
//build string with correct spacing
|
||||||
var result = "";
|
var result = "";
|
||||||
for (var i = 0; i < resultArray.length; i++) {
|
for (var i = 0, l = resultArray.length; i < l; i++) {
|
||||||
//add a space between values
|
//add a space between values
|
||||||
if (i !== 0) {
|
if (i !== 0) {
|
||||||
result += " ";
|
result += " ";
|
||||||
|
|||||||
24
rpg-docs/client/lib/bindProperty.js
Normal file
24
rpg-docs/client/lib/bindProperty.js
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/**
|
||||||
|
* Take in a map like this:
|
||||||
|
* {
|
||||||
|
* "#someId": {
|
||||||
|
* proprty1() { return someReactiveValue()}
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* and bind the properties to the DOM on autorun.
|
||||||
|
*
|
||||||
|
* Useful for polymer components where you need to set the order of property updating
|
||||||
|
* or alter properties that don't bind well to their attributes
|
||||||
|
*/
|
||||||
|
Blaze.Template.prototype.binding = function(bindingMap){
|
||||||
|
this.onRendered(function(){
|
||||||
|
_.each(bindingMap, (propertyMap, cssPattern) => {
|
||||||
|
node = this.find(cssPattern);
|
||||||
|
_.each(propertyMap, (func, property) => {
|
||||||
|
this.autorun(() => {
|
||||||
|
node[property] = func && func.call && func.call(this, node);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
85
rpg-docs/client/style/cards.css
Normal file
85
rpg-docs/client/style/cards.css
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
/*Column layout*/
|
||||||
|
.column-container {
|
||||||
|
column-fill: balance;
|
||||||
|
column-gap: 0px;
|
||||||
|
column-width: 304px;
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.column-container.thin-columns {
|
||||||
|
column-count: 4;
|
||||||
|
column-width: 240px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.column-container > div {
|
||||||
|
padding: 4px;
|
||||||
|
-webkit-column-break-inside: avoid;
|
||||||
|
page-break-inside: avoid;
|
||||||
|
break-inside: avoid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Cards*/
|
||||||
|
.card {
|
||||||
|
background: white;
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card .top {
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 16px;
|
||||||
|
border-radius: 2px 2px 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card .top.white {
|
||||||
|
cursor: auto;
|
||||||
|
padding: 16px;
|
||||||
|
border-bottom: rgba(0,0,0,0.12) solid 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card .bottom {
|
||||||
|
padding: 16px;
|
||||||
|
border-radius: 0 0 2px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card .bottom.list {
|
||||||
|
padding: 16px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card .bottom.list .paper-font-subhead {
|
||||||
|
color: rgba(0,0,0,0.54);
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 500;
|
||||||
|
letter-spacing: 0.010em;
|
||||||
|
padding: 12px 16px 12px 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card .bottom.text {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card .left {
|
||||||
|
padding: 16px;
|
||||||
|
border-radius: 2px 0 0 2px;
|
||||||
|
text-align: center;
|
||||||
|
min-width: 72px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card .right {
|
||||||
|
padding: 16px;
|
||||||
|
border-radius: 0 2px 2px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.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 img, .card iron-image {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
@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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -74,10 +74,14 @@
|
|||||||
background-color: #607D8B;
|
background-color: #607D8B;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.app-grey {
|
||||||
|
background-color: #424242;
|
||||||
|
}
|
||||||
|
|
||||||
.white {
|
.white {
|
||||||
background-color: #ffffff;
|
background-color: #ffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.black {
|
.black {
|
||||||
background-color: #262626;
|
background-color: #262626;
|
||||||
}
|
}
|
||||||
43
rpg-docs/client/style/listItem.css
Normal file
43
rpg-docs/client/style/listItem.css
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item > .itemName {
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item.small {
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item.tall {
|
||||||
|
height: 56px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item.flexible {
|
||||||
|
height: auto;
|
||||||
|
padding-top: 16px;
|
||||||
|
padding-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item iron-icon, .item paper-icon-button {
|
||||||
|
color: #747474;
|
||||||
|
color: rgba(0,0,0,0.54);
|
||||||
|
}
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
115
rpg-docs/client/style/main.css
Normal file
115
rpg-docs/client/style/main.css
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
/*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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Paragraphs*/
|
||||||
|
p {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Horizontal rule
|
||||||
|
hr {
|
||||||
|
background-color: #444;
|
||||||
|
opacity: 0.12;
|
||||||
|
border-width: 0;
|
||||||
|
color: #444;
|
||||||
|
height: 1px;
|
||||||
|
line-height: 0;
|
||||||
|
margin: 16px 0;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.avatar {
|
||||||
|
display: inline-block;
|
||||||
|
box-sizing: border-box;
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
border-radius: 50%;
|
||||||
|
font-size: 26px;
|
||||||
|
font-color: rgba(255, 255, 255, 0.58) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
temporary fix for https://github.com/PolymerElements/paper-item/issues/71
|
||||||
|
*/
|
||||||
|
paper-icon-item::shadow #contentIcon {
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*FABs*/
|
||||||
|
.floatyButton {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 24px;
|
||||||
|
right: 24px;
|
||||||
|
/* stop the fab from flashing during animation */
|
||||||
|
transform: scale(1) translateZ(0px);
|
||||||
|
z-index: 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
paper-fab {
|
||||||
|
background-color: #d13b2e;
|
||||||
|
}
|
||||||
|
|
||||||
|
paper-fab.keyboard-focus {
|
||||||
|
background: #630c05;
|
||||||
|
}
|
||||||
|
|
||||||
|
.red-button:not([disabled]) {
|
||||||
|
background: #d23f31;
|
||||||
|
color: #fff;
|
||||||
|
margin-top: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*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;
|
||||||
|
}
|
||||||
|
|
||||||
|
dicecloud-selector paper-item {
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*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;
|
||||||
|
}
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
@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;
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
.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;
|
|
||||||
}
|
|
||||||
15
rpg-docs/client/style/tables.css
Normal file
15
rpg-docs/client/style/tables.css
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
td {
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.strengthTable{
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.strengthTable td:nth-child(2){
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.summaryTable td:nth-child(3){
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
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,68 +0,0 @@
|
|||||||
#detailScreenFiller {
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
z-index: 2;
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
#screenDim {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
background-color: grey;
|
|
||||||
background-color: rgba(0,0,0,0.35);
|
|
||||||
}
|
|
||||||
|
|
||||||
#fadeDummy {
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detailContent {
|
|
||||||
padding: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
html /deep/ .red-button:not([disabled]) {
|
|
||||||
background: #d23f31;
|
|
||||||
color: #fff;
|
|
||||||
margin-top: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#globalDetail {
|
|
||||||
background-color: white;
|
|
||||||
width: 624px;
|
|
||||||
height: 500px;
|
|
||||||
border-radius: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#globalDetail core-toolbar {
|
|
||||||
border-radius: 2px 2px 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 640px) {
|
|
||||||
#globalDetail core-toolbar {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 640px) {
|
|
||||||
#globalDetail {
|
|
||||||
top: 0 !important;
|
|
||||||
left: 0 !important;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
margin: 0;
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.not-selected [hero] {
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
@@ -1,113 +1,64 @@
|
|||||||
.display2 {
|
.white-text {
|
||||||
font-size: 45px;
|
color: #dedede;
|
||||||
font-weight: 400;
|
color: rgba(255,255,255,0.87);
|
||||||
color: #000;
|
|
||||||
color: rgba(0,0,0,0.54);
|
|
||||||
letter-spacing: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.white-text .display2{
|
.white-text .paper-font-display2{
|
||||||
|
color: #8a8a8a;
|
||||||
color: rgba(255,255,255,0.54);
|
color: rgba(255,255,255,0.54);
|
||||||
}
|
}
|
||||||
|
|
||||||
.display1 {
|
.white-text .paper-font-display1, .white-text.paper-font-display1{
|
||||||
font-size: 34px;
|
color: #8a8a8a;
|
||||||
font-weight: 400;
|
|
||||||
color: #000;
|
|
||||||
color: rgba(0,0,0,0.54);
|
|
||||||
letter-spacing: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.white-text .display1, .white-text.display1{
|
|
||||||
color: rgba(255,255,255,0.54);
|
color: rgba(255,255,255,0.54);
|
||||||
}
|
}
|
||||||
|
|
||||||
h1, .headline {
|
.white-text h1, .white-text .paper-font-headline, .white-text.paper-font-headline{
|
||||||
font-size: 24px;
|
color: #dedede;
|
||||||
font-weight: 400;
|
|
||||||
margin: 0;
|
|
||||||
color: #000;
|
|
||||||
color: rgba(0,0,0,0.87);
|
|
||||||
letter-spacing: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.white-text h1, .white-text .headline, .white-text.headline{
|
|
||||||
color: rgba(255,255,255,0.87);
|
color: rgba(255,255,255,0.87);
|
||||||
}
|
}
|
||||||
|
|
||||||
h2, .title {
|
.white-text h2, .white-text .paper-font-title, .white-text.paper-font-title{
|
||||||
font-size: 20px;
|
color: #dedede;
|
||||||
font-weight: 500;
|
|
||||||
margin: 0;
|
|
||||||
color: #000;
|
|
||||||
color: rgba(0,0,0,0.87);
|
|
||||||
letter-spacing: 0.005em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.white-text h2, .white-text .title, .white-text.title{
|
|
||||||
color: rgba(255,255,255,0.87);
|
color: rgba(255,255,255,0.87);
|
||||||
}
|
}
|
||||||
|
|
||||||
h3, .subhead {
|
.white-text h3, .white-text .paper-font-subhead{
|
||||||
font-size: 16px;
|
color: #dedede;
|
||||||
font-weight: 400;
|
|
||||||
margin: 0;
|
|
||||||
color: #000;
|
|
||||||
color: rgba(0,0,0,0.87);
|
|
||||||
letter-spacing: 0.010em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.white-text h3, .white-text .subhead{
|
|
||||||
color: rgba(255,255,255,0.87);
|
color: rgba(255,255,255,0.87);
|
||||||
}
|
}
|
||||||
|
|
||||||
.body2 {
|
.white-text .paper-font-body2{
|
||||||
font-size: 14px;
|
color: #dedede;
|
||||||
font-weight: 500;
|
|
||||||
color: #000;
|
|
||||||
color: rgba(0,0,0,0.87);
|
|
||||||
letter-spacing: 0.010em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.white-text .body2{
|
|
||||||
color: rgba(255,255,255,0.87);
|
color: rgba(255,255,255,0.87);
|
||||||
}
|
}
|
||||||
|
|
||||||
p, .body1, body {
|
.white-text p, .white-text .paper-font-body1{
|
||||||
font-size: 14px;
|
color: #dedede;
|
||||||
font-weight: 400;
|
|
||||||
margin: 0;
|
|
||||||
color: #000;
|
|
||||||
color: rgba(0,0,0,0.87);
|
|
||||||
letter-spacing: 0.010em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.white-text p, .white-text .body1{
|
|
||||||
color: rgba(255,255,255,0.87);
|
color: rgba(255,255,255,0.87);
|
||||||
}
|
}
|
||||||
|
|
||||||
.caption{
|
.white-text .paper-font-caption{
|
||||||
font-size: 12px;
|
color: #8a8a8a;
|
||||||
font-weight: 400;
|
|
||||||
color: #000;
|
|
||||||
color: rgba(0,0,0,0.54);
|
|
||||||
letter-spacing: 0.020em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.white-text .caption{
|
|
||||||
color: rgba(255,255,255,0.54);
|
color: rgba(255,255,255,0.54);
|
||||||
}
|
}
|
||||||
|
|
||||||
html /deep/ .white-text{
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.black54 {
|
.black54 {
|
||||||
color: #444;
|
color: #757575;
|
||||||
color: rgba(0,0,0,0.54);
|
color: rgba(0,0,0,0.54);
|
||||||
}
|
}
|
||||||
|
|
||||||
.white54 {
|
.white54 {
|
||||||
color: #eee;
|
color: #8a8a8a;
|
||||||
color: rgba(255,255,255,0.54);
|
color: rgba(255,255,255,0.54);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.black87 {
|
||||||
|
color: #212121;
|
||||||
|
color: rgba(0,0,0,0.87);
|
||||||
|
}
|
||||||
|
|
||||||
|
.white87 {
|
||||||
|
color: #dedede;
|
||||||
|
color: rgba(255,255,255,0.87);
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,39 +1,33 @@
|
|||||||
<template name="attackEdit">
|
<template name="attackEdit">
|
||||||
<div layout horizontal>
|
<div class="layout horizontal">
|
||||||
<div layout vertical flex>
|
<div class="layout vertical flex">
|
||||||
<div layout horizontal>
|
<div class="layout horizontal wrap">
|
||||||
<!--attackBonus-->
|
<!--attackBonus-->
|
||||||
<paper-input id="attackBonusInput"
|
<paper-input class="attackBonusInput flex" label="Attack Bonus" value={{attackBonus}}
|
||||||
label="Attack Bonus"
|
style="flex-basis: 200px; margin-right: 16px;">
|
||||||
floatinglabel
|
{{> formulaSuffix}}
|
||||||
value={{attackBonus}}
|
</paper-input>
|
||||||
flex></paper-input>
|
|
||||||
<!--details-->
|
<!--details-->
|
||||||
<paper-input id="detailInput"
|
<paper-input class="detailInput" label="Details" value={{details}} style="flex-basis: 200px;">
|
||||||
label="Details"
|
</paper-input>
|
||||||
floatinglabel
|
|
||||||
value={{details}}></paper-input>
|
|
||||||
</div>
|
</div>
|
||||||
<div layout horizontal>
|
<div class="layout horizontal wrap">
|
||||||
<!--damageBonus-->
|
<!--damageBonus-->
|
||||||
<paper-input id="damageInput"
|
<paper-input class="damageInput flex" label="Damage" value={{damage}}
|
||||||
label="Damage"
|
style="flex-basis: 200px; margin-right: 16px;">
|
||||||
floatinglabel
|
{{> bracketSuffix}}
|
||||||
value={{damage}}
|
</paper-input>
|
||||||
flex></paper-input>
|
|
||||||
<!--DamageType-->
|
<!--DamageType-->
|
||||||
<paper-dropdown-menu id="damageTypeDropdown" label="Damage Type">
|
<paper-dropdown-menu label="Damage Type" dynamic-align>
|
||||||
<paper-dropdown layered class="dropdown">
|
<dicecloud-selector class="dropdown-content damageTypeDropdown" selected={{damageType}}>
|
||||||
<core-menu class="menu" selected={{damageType}}>
|
{{#each damageTypes}}
|
||||||
{{#each damageTypes}}
|
<paper-item name={{this}} class="containerMenuItem">{{this}}</paper-item>
|
||||||
<paper-item name={{this}} class="containerMenuItem">{{this}}</paper-item>
|
{{/each}}
|
||||||
{{/each}}
|
</dicecloud-selector>
|
||||||
</core-menu>
|
|
||||||
</paper-dropdown>
|
|
||||||
</paper-dropdown-menu>
|
</paper-dropdown-menu>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!--Delete Button-->
|
<!--Delete Button-->
|
||||||
<paper-icon-button id="deleteAttack" role="button" tabindex="0" icon="delete" aria-label="Delete"></paper-icon-button>
|
<paper-icon-button class="deleteAttack" icon="delete"></paper-icon-button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -15,25 +15,24 @@ var damageTypes = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
Template.attackEdit.events({
|
Template.attackEdit.events({
|
||||||
"tap #deleteAttack": function(event, instance) {
|
"click .deleteAttack": function(event, instance) {
|
||||||
Attacks.softRemoveNode(this._id);
|
Attacks.softRemoveNode(this._id);
|
||||||
GlobalUI.deletedToast(this._id, "Attacks", "Attack");
|
GlobalUI.deletedToast(this._id, "Attacks", "Attack");
|
||||||
},
|
},
|
||||||
"change #attackBonusInput": function(event) {
|
"change .attackBonusInput": function(event) {
|
||||||
var value = event.currentTarget.value;
|
var value = event.currentTarget.value;
|
||||||
Attacks.update(this._id, {$set: {attackBonus: value}});
|
Attacks.update(this._id, {$set: {attackBonus: value}});
|
||||||
},
|
},
|
||||||
"change #damageInput": function(event) {
|
"change .damageInput": function(event) {
|
||||||
var value = event.currentTarget.value;
|
var value = event.currentTarget.value;
|
||||||
Attacks.update(this._id, {$set: {damage: 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;
|
||||||
Attacks.update(this._id, {$set: {details: value}});
|
Attacks.update(this._id, {$set: {details: value}});
|
||||||
},
|
},
|
||||||
"core-select #damageTypeDropdown": function(event) {
|
"iron-select .damageTypeDropdown": function(event) {
|
||||||
var detail = event.originalEvent.detail;
|
var detail = event.originalEvent.detail;
|
||||||
if (!detail.isSelected) return;
|
|
||||||
var value = detail.item.getAttribute("name");
|
var value = detail.item.getAttribute("name");
|
||||||
if (value == this.damageType) return;
|
if (value == this.damageType) return;
|
||||||
Attacks.update(this._id, {$set: {damageType: value}});
|
Attacks.update(this._id, {$set: {damageType: value}});
|
||||||
@@ -44,7 +43,4 @@ Template.attackEdit.helpers({
|
|||||||
damageTypes: function() {
|
damageTypes: function() {
|
||||||
return damageTypes;
|
return damageTypes;
|
||||||
},
|
},
|
||||||
DAMAGE_DICE: function() {
|
|
||||||
return DAMAGE_DICE;
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
{{#if attacks.count}}
|
{{#if attacks.count}}
|
||||||
<hr style="margin: 16px 0 16px 0;">
|
<hr style="margin: 16px 0 16px 0;">
|
||||||
<div id="attacks">
|
<div id="attacks">
|
||||||
<h2>Attacks</h2>
|
<div class="paper-font-title">Attacks</div>
|
||||||
{{#each attacks}}
|
{{#each attacks}}
|
||||||
{{>attackEdit}}
|
{{>attackEdit}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
<template name="attackView">
|
<template name="attackView">
|
||||||
<div class="attackView" layout horizontal>
|
<div class="attackView layout horizontal">
|
||||||
<div class="headline" style="margin-right: 16px;" layout horizontal center>
|
<div class="paper-font-headline layout horizontal center" style="margin-right: 16px;">
|
||||||
{{evaluateSigned charId attackBonus}}
|
{{evaluateSigned charId attackBonus}}
|
||||||
</div>
|
</div>
|
||||||
<div layout vertical>
|
<div class="layout vertical">
|
||||||
<div>
|
<div>
|
||||||
{{evaluateString charId damage}} {{damageType}}
|
{{evaluateString charId damage}} {{damageType}}
|
||||||
</div>
|
</div>
|
||||||
{{#if details}}
|
{{#if details}}
|
||||||
<div class="caption">
|
<div class="paper-font-caption">
|
||||||
{{details}}
|
{{details}}
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|||||||
@@ -2,10 +2,10 @@
|
|||||||
{{#if attacks.count}}
|
{{#if attacks.count}}
|
||||||
<hr style="margin: 16px 0 16px 0;">
|
<hr style="margin: 16px 0 16px 0;">
|
||||||
<div class="attacks">
|
<div class="attacks">
|
||||||
<h2 class="spaceAfter">Attacks</h2>
|
<div class="spaceAfter paper-font-title">Attacks</div>
|
||||||
{{#each attacks}}
|
{{#each attacks}}
|
||||||
{{> attackView}}
|
{{> attackView}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -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,24 @@
|
|||||||
<template name="characterSettings">
|
<template name="characterSettings">
|
||||||
|
{{#with character}}
|
||||||
|
<div class="fit layout vertical">
|
||||||
|
<app-header-layout has-scrolling-region class="feedback flex">
|
||||||
|
<app-header fixed effects="waterfall">
|
||||||
|
<app-toolbar>
|
||||||
|
<div main-title>Character Settings</div>
|
||||||
|
</app-toolbar>
|
||||||
|
</app-header>
|
||||||
|
<div class="form flex">
|
||||||
|
<paper-toggle-button id="hideSpellcasting" checked={{settings.hideSpellcasting}}>
|
||||||
|
Hide Spells tab
|
||||||
|
</paper-toggle-button>
|
||||||
|
<paper-toggle-button id="variantEncumbrance" checked={{settings.useVariantEncumbrance}}>
|
||||||
|
Use variant encumbrance
|
||||||
|
</paper-toggle-button>
|
||||||
|
</div>
|
||||||
|
</app-header-layout>
|
||||||
|
<div class="buttons layout horizontal end-justified">
|
||||||
|
<paper-button class="doneButton"> Done </paper-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/with}}
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,3 +1,29 @@
|
|||||||
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}}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"change #hideSpellcasting": function(event, instance){
|
||||||
|
var value = instance.find("#hideSpellcasting").checked;
|
||||||
|
if (this.settings.hideSpellcasting !== value){
|
||||||
|
Characters.update(
|
||||||
|
this._id,
|
||||||
|
{$set: {"settings.hideSpellcasting": value}}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"click .doneButton": function(event, instance){
|
||||||
|
popDialogStack();
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,9 +1,20 @@
|
|||||||
<template name="deleteCharacterConfirmation">
|
<template name="deleteCharacterConfirmation">
|
||||||
<div>
|
<div class="fit layout vertical">
|
||||||
Deleting a character cannot be undone.<br>
|
<app-header-layout has-scrolling-region class="feedback flex">
|
||||||
To continue type "{{name}}" into the box below.<br>
|
<app-header fixed effects="waterfall">
|
||||||
<paper-input id="nameInput" label="type the characters's name here" style="width: 100%;"></paper-input><br>
|
<app-toolbar>
|
||||||
<paper-button id="deleteButton" style={{getStyle}} disabled={{cantDelete}}>Delete Character</paper-button>
|
<div main-title>Delete Character</div>
|
||||||
|
</app-toolbar>
|
||||||
|
</app-header>
|
||||||
|
<div class="form flex">
|
||||||
|
Deleting a character cannot be undone.<br>
|
||||||
|
To continue type "{{name}}" into the box below.<br>
|
||||||
|
<paper-input id="nameInput" label="type the characters's name here" style="width: 100%;"></paper-input><br>
|
||||||
|
<paper-button id="deleteButton" style={{getStyle}} disabled={{cantDelete}}>Delete Character</paper-button>
|
||||||
|
</div>
|
||||||
|
</app-header-layout>
|
||||||
|
<div class="buttons layout horizontal end-justified">
|
||||||
|
<paper-button class="cancelButton"> Cancel </paper-button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<paper-button id="cancelButton" affirmative> Cancel </paper-button>
|
</template>
|
||||||
</template>
|
|
||||||
|
|||||||
@@ -18,11 +18,14 @@ Template.deleteCharacterConfirmation.events({
|
|||||||
var canDel = instance.find("#nameInput").value === this.name;
|
var canDel = instance.find("#nameInput").value === this.name;
|
||||||
instance.canDelete.set(canDel);
|
instance.canDelete.set(canDel);
|
||||||
},
|
},
|
||||||
"tap #deleteButton": function(event, instance) {
|
"click #deleteButton": function(event, instance) {
|
||||||
if (instance.find("#nameInput").value === this.name) {
|
if (instance.find("#nameInput").value === this.name) {
|
||||||
GlobalUI.closeDialog();
|
popDialogStack();
|
||||||
Router.go("/");
|
Router.go("/characterList");
|
||||||
Characters.remove(this._id);
|
Characters.remove(this._id);
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"click .cancelButton": function(event, instance){
|
||||||
|
popDialogStack();
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,42 +1,65 @@
|
|||||||
<template name="shareDialog">
|
<template name="shareDialog">
|
||||||
<div style="width: 360px;">
|
<div class="fit layout vertical">
|
||||||
<div>
|
<app-header-layout has-scrolling-region class="feedback flex">
|
||||||
{{#if readers.count}}
|
<app-header fixed effects="waterfall">
|
||||||
<div style="font-weight: 500;">
|
<app-toolbar>
|
||||||
Can View
|
<div main-title>Share</div>
|
||||||
</div>
|
</app-toolbar>
|
||||||
{{#each readers}}
|
</app-header>
|
||||||
<div layout horizontal center>
|
<div class="form flex">
|
||||||
<div flex>{{username}}</div>
|
<paper-dropdown-menu label="Who can view this character">
|
||||||
<paper-icon-button class="deleteShare" icon="delete"></paper-icon-button>
|
<dicecloud-selector class="visibilityDropdown dropdown-content" selected={{viewPermission}}>
|
||||||
</div>
|
<paper-item name="whitelist">Only people I share with</paper-item>
|
||||||
{{/each}}
|
<paper-item name="public">Anyone with link</paper-item>
|
||||||
{{/if}}
|
</dicecloud-selector>
|
||||||
{{#if writers.count}}
|
</paper-dropdown-menu>
|
||||||
<div style="font-weight: 500;">
|
<div class="layout horizontal center wrap">
|
||||||
Can Edit
|
<paper-input class="flex" id="userNameOrEmailInput" label="Share with username or email" floatinglabel></paper-input>
|
||||||
</div>
|
<paper-button id="shareButton"
|
||||||
{{#each writers}}
|
class="red-button"
|
||||||
<div layout horizontal center>
|
style="width: 80px; height: 37px; margin-top: 16px;"
|
||||||
<div flex>{{username}}</div>
|
raised
|
||||||
<paper-icon-button class="deleteShare" icon="delete"></paper-icon-button>
|
disabled={{shareButtonDisabled}}>Share</paper-button>
|
||||||
</div>
|
<paper-radio-group id="accessLevelMenu" selected="read">
|
||||||
{{/each}}
|
<paper-radio-button name="read">View Only</paper-radio-button>
|
||||||
{{/if}}
|
<paper-radio-button name="write">Can Edit</paper-radio-button>
|
||||||
|
</paper-radio-group>
|
||||||
|
</div>
|
||||||
|
<p style="color: red;">{{userFindError}}</p>
|
||||||
|
<div>
|
||||||
|
{{#if readers.length}}
|
||||||
|
<div class="paper-font-subhead">
|
||||||
|
Can View
|
||||||
|
</div>
|
||||||
|
{{#each id in readers}}
|
||||||
|
<div class="layout horizontal center">
|
||||||
|
{{#with id=id}}
|
||||||
|
<paper-icon-button class="deleteShare" icon="delete">
|
||||||
|
</paper-icon-button>
|
||||||
|
{{/with}}
|
||||||
|
<div class="flex">{{username id}}</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
{{/if}}
|
||||||
|
{{#if writers.length}}
|
||||||
|
<div class="paper-font-subhead">
|
||||||
|
Can Edit
|
||||||
|
</div>
|
||||||
|
{{#each id in writers}}
|
||||||
|
<div class="layout horizontal center">
|
||||||
|
{{#with id=id}}
|
||||||
|
<paper-icon-button class="deleteShare" icon="delete">
|
||||||
|
</paper-icon-button>
|
||||||
|
{{/with}}
|
||||||
|
<div class="flex">{{username id}}</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</app-header-layout>
|
||||||
|
<div class="buttons layout horizontal end-justified">
|
||||||
|
<paper-button class="doneButton"> Done </paper-button>
|
||||||
</div>
|
</div>
|
||||||
<div layout horizontal center>
|
|
||||||
<paper-input flex id="userNameOrEmailInput" label="Username or email" floatinglabel></paper-input>
|
|
||||||
<paper-button id="shareButton"
|
|
||||||
class="red-button"
|
|
||||||
style="width: 80px; height: 37px; margin-top: 16px;"
|
|
||||||
raised
|
|
||||||
disabled={{shareButtonDisabled}}>Share</paper-button>
|
|
||||||
</div>
|
|
||||||
<p style="color: red;">{{userFindError}}</p>
|
|
||||||
<paper-radio-group id="accessLevelMenu" selected="read">
|
|
||||||
<paper-radio-button name="read" label="View Only"></paper-radio-button>
|
|
||||||
<paper-radio-button name="write" label="Can Edit"></paper-radio-button>
|
|
||||||
</paper-radio-group>
|
|
||||||
</div>
|
</div>
|
||||||
<paper-button id="doneButton" affirmative> Done </paper-button>
|
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,15 +1,38 @@
|
|||||||
Template.shareDialog.onCreated(function(){
|
Template.shareDialog.onCreated(function(){
|
||||||
this.userId = new ReactiveVar();
|
this.userId = new ReactiveVar();
|
||||||
|
this.autorun(() => {
|
||||||
|
var char = Characters.findOne(Template.currentData()._id, {
|
||||||
|
fields: {readers: 1, writers: 1}
|
||||||
|
});
|
||||||
|
if (!char) return;
|
||||||
|
this.subscribe("userNames", _.union(char.readers, char.writers));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.shareDialog.onRendered(function(){
|
||||||
|
// Polymer not mirroring selected attribute properly
|
||||||
|
this.$("paper-listbox").each(function(){
|
||||||
|
this.selected = this.getAttribute("selected");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.shareDialog.helpers({
|
Template.shareDialog.helpers({
|
||||||
|
viewPermission: function() {
|
||||||
|
var char = Characters.findOne(this._id, {fields: {settings: 1}});
|
||||||
|
return char.settings.viewPermission || "whitelist";
|
||||||
|
},
|
||||||
readers: function(){
|
readers: function(){
|
||||||
var char = Characters.findOne(this._id, {fields: {readers: 1}});
|
var char = Characters.findOne(this._id, {fields: {readers: 1}});
|
||||||
return Meteor.users.find({_id: {$in: char.readers}});
|
return char.readers;
|
||||||
},
|
},
|
||||||
writers: function(){
|
writers: function(){
|
||||||
var char = Characters.findOne(this._id, {fields: {writers: 1}});
|
var char = Characters.findOne(this._id, {fields: {writers: 1}});
|
||||||
return Meteor.users.find({_id: {$in: char.writers}});
|
//Meteor.users.find({_id: {$in: char.writers}});
|
||||||
|
return char.writers
|
||||||
|
},
|
||||||
|
username: function(id){
|
||||||
|
const user = Meteor.users.findOne(id);
|
||||||
|
return user && user.username || "user: " + id;
|
||||||
},
|
},
|
||||||
shareButtonDisabled: function(){
|
shareButtonDisabled: function(){
|
||||||
return !Template.instance().userId.get();
|
return !Template.instance().userId.get();
|
||||||
@@ -22,6 +45,13 @@ Template.shareDialog.helpers({
|
|||||||
});
|
});
|
||||||
|
|
||||||
Template.shareDialog.events({
|
Template.shareDialog.events({
|
||||||
|
"iron-select .visibilityDropdown": function(event){
|
||||||
|
var detail = event.originalEvent.detail;
|
||||||
|
var value = detail.item.getAttribute("name");
|
||||||
|
var char = Characters.findOne(this._id, {fields: {settings: 1}});
|
||||||
|
if (value == char.settings.viewPermission) return;
|
||||||
|
Characters.update(this._id, {$set: {"settings.viewPermission": value}});
|
||||||
|
},
|
||||||
"input #userNameOrEmailInput":
|
"input #userNameOrEmailInput":
|
||||||
function(event, instance){
|
function(event, instance){
|
||||||
var userName = instance.find("#userNameOrEmailInput").value;
|
var userName = instance.find("#userNameOrEmailInput").value;
|
||||||
@@ -35,7 +65,7 @@ Template.shareDialog.events({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap #shareButton": function(event, instance){
|
"click #shareButton": function(event, instance){
|
||||||
var self = this;
|
var self = this;
|
||||||
var permission = instance.find("#accessLevelMenu").selected;
|
var permission = instance.find("#accessLevelMenu").selected;
|
||||||
if (!permission) throw "no permission set";
|
if (!permission) throw "no permission set";
|
||||||
@@ -53,9 +83,12 @@ Template.shareDialog.events({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tap .deleteShare": function(event, instance) {
|
"click .deleteShare": function(event, instance) {
|
||||||
Characters.update(instance.data._id, {
|
Characters.update(instance.data._id, {
|
||||||
$pull: {writers: this._id, readers: this._id}
|
$pull: {writers: this.id, readers: this.id}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
"click .doneButton": function(event, instance){
|
||||||
|
popDialogStack();
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,28 +1,24 @@
|
|||||||
paper-tabs, core-toolbar {
|
app-toolbar.medium-tall {
|
||||||
box-shadow: 0px 3px 2px rgba(0, 0, 0, 0.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
core-toolbar paper-tabs {
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
paper-tabs[noink][nobar] paper-tab.core-selected {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
paper-tabs /deep/ #selectionBar, #onRadio {
|
|
||||||
background-color: #d50000;
|
|
||||||
}
|
|
||||||
|
|
||||||
paper-tabs ::shadow #ink {
|
|
||||||
color: #b22 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
paper-tabs.transparent-brown {
|
|
||||||
background-color: transparent;
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
core-toolbar.medium-tall {
|
|
||||||
height: 108px;
|
height: 108px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.character-name {
|
||||||
|
padding-left: 16px;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.character-menu paper-icon-item{
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.character-sheet app-header {
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.character-sheet iron-pages > div {
|
||||||
|
overflow-y: auto;
|
||||||
|
overflow-x: hidden;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,47 +1,58 @@
|
|||||||
<template name="characterSheet">
|
<template name="characterSheet">
|
||||||
<!--<div tool horizontal layout flex end-justified class="bottom">Title-bottom</div>-->
|
<div class="fit layout vertical character-sheet">
|
||||||
<core-toolbar class="medium-tall {{colorClass}}">
|
<app-header fixed effects="waterfall">
|
||||||
<core-icon-button icon="menu" core-drawer-toggle></core-icon-button>
|
<app-toolbar class="medium-tall {{colorClass}}">
|
||||||
<div flex>
|
<div top-item class="layout horizontal center">
|
||||||
{{name}}
|
<paper-icon-button icon="menu" drawer-toggle></paper-icon-button>
|
||||||
|
<div class="flex character-name">
|
||||||
|
{{name}}
|
||||||
|
</div>
|
||||||
|
{{#if canEditCharacter _id}}
|
||||||
|
{{> colorDropdown}}
|
||||||
|
<paper-menu-button class="character-menu" horizontal-align="right">
|
||||||
|
<paper-icon-button icon="more-vert" class="dropdown-trigger"></paper-icon-button>
|
||||||
|
<paper-menu class="dropdown-content black87">
|
||||||
|
<paper-icon-item id="deleteCharacter">
|
||||||
|
<iron-icon icon="delete" item-icon></iron-icon>
|
||||||
|
Delete
|
||||||
|
</paper-icon-item>
|
||||||
|
<paper-icon-item id="shareCharacter">
|
||||||
|
<iron-icon icon="social:share" item-icon></iron-icon>
|
||||||
|
Share
|
||||||
|
</paper-icon-item>
|
||||||
|
<paper-icon-item id="characterSettings">
|
||||||
|
<iron-icon icon="settings" item-icon></iron-icon>
|
||||||
|
Settings
|
||||||
|
</paper-icon-item>
|
||||||
|
</paper-menu>
|
||||||
|
</paper-menu-button>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
<div bottom-item>
|
||||||
|
<paper-tabs id="characterSheetTabs" selected={{selectedTab}} class="{{colorClass}}">
|
||||||
|
<paper-tab name="stats">Stats</paper-tab>
|
||||||
|
<paper-tab name="features">Features</paper-tab>
|
||||||
|
<paper-tab name="inventory">Inventory</paper-tab>
|
||||||
|
{{#unless hideSpellcasting}}
|
||||||
|
<paper-tab name="spells">Spells</paper-tab>
|
||||||
|
{{/unless}}
|
||||||
|
<paper-tab name="persona">Persona</paper-tab>
|
||||||
|
<paper-tab name="journal">Journal</paper-tab>
|
||||||
|
</paper-tabs>
|
||||||
|
</div>
|
||||||
|
</app-toolbar>
|
||||||
|
</app-header>
|
||||||
|
<div class="flex" style="position: relative;">
|
||||||
|
<iron-pages id="tabPages" class="fit" selected={{selectedTab}}>
|
||||||
|
<div name="stats" class="tab-page fit">{{> stats}}</div>
|
||||||
|
<div name="features" class="tab-page fit">{{> features}}</div>
|
||||||
|
<div name="inventory" class="tab-page fit">{{> inventory}}</div>
|
||||||
|
{{#unless hideSpellcasting}}
|
||||||
|
<div name="spells" class="tab-page fit">{{> spells}}</div>
|
||||||
|
{{/unless}}
|
||||||
|
<div name="persona" class="tab-page fit">{{> persona}}</div>
|
||||||
|
<div name="journal" class="tab-page fit">{{> journal}}</div>
|
||||||
|
</iron-pages>
|
||||||
</div>
|
</div>
|
||||||
{{#if canEditCharacter _id}}
|
|
||||||
<div>
|
|
||||||
{{> colorDropdown}}
|
|
||||||
</div>
|
|
||||||
<paper-menu-button>
|
|
||||||
<paper-icon-button icon="more-vert" noink></paper-icon-button>
|
|
||||||
<paper-dropdown class="dropdown" halign="right">
|
|
||||||
<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="shareCharacter">
|
|
||||||
<core-icon icon="social:share"></core-icon>Share
|
|
||||||
</paper-item>
|
|
||||||
</core-menu>
|
|
||||||
</paper-dropdown>
|
|
||||||
</paper-menu-button>
|
|
||||||
{{/if}}
|
|
||||||
<div class="bottom fit" horizontal layout>
|
|
||||||
<paper-tabs flex horizontal center layout id="characterSheetTabs" selected={{selectedTab}} class="{{colorClass}}">
|
|
||||||
<paper-tab name="stats">Stats</paper-tab>
|
|
||||||
<paper-tab name="features">Features</paper-tab>
|
|
||||||
<paper-tab name="inventory">Inventory</paper-tab>
|
|
||||||
<paper-tab name="spells">Spells</paper-tab>
|
|
||||||
<paper-tab name="persona">Persona</paper-tab>
|
|
||||||
<paper-tab name="journal">Journal</paper-tab>
|
|
||||||
</paper-tabs>
|
|
||||||
</div>
|
|
||||||
</core-toolbar>
|
|
||||||
<div fit>
|
|
||||||
<core-animated-pages id="tabPages" selected={{selectedTab}} transitions="slide-from-right" fit>
|
|
||||||
<section flex name="stats">{{> stats}}</section>
|
|
||||||
<section flex name="features">{{> features}}</section>
|
|
||||||
<section flex name="inventory">{{> inventory}}</section>
|
|
||||||
<section flex name="spells">{{> spells}}</section>
|
|
||||||
<section flex name="persona">{{> persona}}</section>
|
|
||||||
<section flex name="journal">{{> journal}}</section>
|
|
||||||
</core-animated-pages>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,8 +1,162 @@
|
|||||||
Template.characterSheet.created = function(){
|
let tabPages, tabSliders, tabFabs, tabFabMenus;
|
||||||
Session.setDefault(this.data._id + ".selectedTab", "stats");
|
Template.characterSheet.onRendered(function() {
|
||||||
};
|
//default to the stats tab
|
||||||
|
Session.setDefault(this.data._id + ".selectedTab", "0");
|
||||||
|
|
||||||
|
// Keep the header's scroll target up to date with the currently selected tab
|
||||||
|
let header;
|
||||||
|
this.autorun(() => {
|
||||||
|
const tab = getTab(Template.currentData()._id);
|
||||||
|
header = header || this.find("app-header");
|
||||||
|
if (!header) return;
|
||||||
|
Tracker.afterFlush(() => {
|
||||||
|
header.scrollTarget = this.find("#tabPages .iron-selected");
|
||||||
|
header._scrollHandler && header._scrollHandler();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
_.defer(() => {
|
||||||
|
// Store all the tab page components for use in animations
|
||||||
|
tabPages = _.times(6, (n) =>
|
||||||
|
this.$(`.tab-page:nth-child(${n + 1})`)
|
||||||
|
);
|
||||||
|
tabSliders = _.times(6, (n) =>
|
||||||
|
tabPages[n].find(".animation-slider")
|
||||||
|
);
|
||||||
|
tabFabs = _.times(6, (n) =>
|
||||||
|
tabPages[n].find(".floatyButton")
|
||||||
|
);
|
||||||
|
tabFabMenus = _.times(6, (n) =>
|
||||||
|
tabPages[n].find(".mini-holder")
|
||||||
|
);
|
||||||
|
})
|
||||||
|
|
||||||
|
//watch this character and make sure their encumbrance is updated
|
||||||
|
//trackEncumbranceConditions(this.data._id, this);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Page change animations that suck less than neon-animated-pages
|
||||||
|
*/
|
||||||
|
const tabAnimation = ({oldTab, newTab, duration}) => {
|
||||||
|
if (newTab === oldTab) return;
|
||||||
|
duration = duration || 400;
|
||||||
|
const delay = (element, f) => {
|
||||||
|
element.on(
|
||||||
|
"transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd",
|
||||||
|
(event) => {
|
||||||
|
if (event.target == event.currentTarget){
|
||||||
|
f();
|
||||||
|
$(this).off(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
const isForward = newTab > oldTab;
|
||||||
|
const entryAnimation = {
|
||||||
|
before: {
|
||||||
|
transform: isForward ? "translateX(100%)" : "translateX(-100%)",
|
||||||
|
},
|
||||||
|
during: {
|
||||||
|
transition: `transform ${duration}ms ease`,
|
||||||
|
transform: "",
|
||||||
|
},
|
||||||
|
after: {
|
||||||
|
transition: "",
|
||||||
|
transform: "",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
const exitAnimation = {
|
||||||
|
before: {
|
||||||
|
transform: "translateZ(0)",
|
||||||
|
},
|
||||||
|
during: {
|
||||||
|
transition: `transform ${duration}ms ease`,
|
||||||
|
transform: isForward ? "translateX(-100%)" : "translateX(100%)",
|
||||||
|
},
|
||||||
|
after: {
|
||||||
|
transition: "",
|
||||||
|
transform: "",
|
||||||
|
display: "",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
const oldPage = tabPages[oldTab];
|
||||||
|
const newPage = tabPages[newTab];
|
||||||
|
if (oldPage.length && newPage.length){
|
||||||
|
oldPage[0].style.setProperty("display", "initial", "important");
|
||||||
|
oldPage.css({zIndex: "1"});
|
||||||
|
newPage.css({zIndex: "0"});
|
||||||
|
_.defer(() => {
|
||||||
|
oldPage.css({
|
||||||
|
transition: `z-index ${duration}ms linear`,
|
||||||
|
zIndex: "0",
|
||||||
|
});
|
||||||
|
newPage.css({
|
||||||
|
transition: `z-index ${duration}ms linear`,
|
||||||
|
zIndex: "1",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
delay(oldPage, () => oldPage.css({
|
||||||
|
display: "",
|
||||||
|
transition: "",
|
||||||
|
zIndex: "",
|
||||||
|
}));
|
||||||
|
delay(newPage, () => newPage.css({
|
||||||
|
transition: "",
|
||||||
|
zIndex: "",
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
const oldSlider = tabSliders[oldTab];
|
||||||
|
if (oldSlider.length){
|
||||||
|
oldSlider.css(exitAnimation.before);
|
||||||
|
_.defer(() => oldSlider.css(exitAnimation.during));
|
||||||
|
delay(oldSlider, () => oldSlider.css(exitAnimation.after));
|
||||||
|
}
|
||||||
|
const newSlider = tabSliders[newTab];
|
||||||
|
if (newSlider.length){
|
||||||
|
newSlider.css(entryAnimation.before);
|
||||||
|
_.defer(() => newSlider.css(entryAnimation.during));
|
||||||
|
delay(newSlider, () => newSlider.css(entryAnimation.after));
|
||||||
|
}
|
||||||
|
slideDown = ({element, reverse}) => {
|
||||||
|
element.css({
|
||||||
|
transform: reverse ? "translateY(80px)" : "",
|
||||||
|
});
|
||||||
|
const fraction = duration / 4;
|
||||||
|
_.defer(() => element.css({
|
||||||
|
transition: reverse ?
|
||||||
|
`transform ${fraction}ms ease-out ${duration - fraction}ms` :
|
||||||
|
`transform ${fraction}ms ease-in`,
|
||||||
|
transform: reverse ? "" : "translateY(80px)",
|
||||||
|
}));
|
||||||
|
delay(element, () => element.css({
|
||||||
|
transition: "",
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
const oldFab = tabFabs[oldTab];
|
||||||
|
const newFab = tabFabs[newTab];
|
||||||
|
if (oldFab.length && !newFab.length){
|
||||||
|
slideDown({element: oldFab});
|
||||||
|
}
|
||||||
|
if (newFab.length && !oldFab.length){
|
||||||
|
slideDown({element: newFab, reverse: true});
|
||||||
|
}
|
||||||
|
if (newFab.length && oldFab.length){
|
||||||
|
newFab.css({transform: ""});
|
||||||
|
}
|
||||||
|
|
||||||
|
const oldFabMenu = tabFabMenus[oldTab];
|
||||||
|
if (oldFabMenu.length) {
|
||||||
|
Blaze.getView(oldFabMenu[0]).templateInstance().active.set(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var setTab = function(charId, tab){
|
var setTab = function(charId, tab){
|
||||||
|
tabAnimation({
|
||||||
|
oldTab: +Session.get(charId + ".selectedTab"),
|
||||||
|
newTab: +tab,
|
||||||
|
});
|
||||||
return Session.set(charId + ".selectedTab", tab);
|
return Session.set(charId + ".selectedTab", tab);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -14,30 +168,39 @@ Template.characterSheet.helpers({
|
|||||||
selectedTab: function(){
|
selectedTab: function(){
|
||||||
return getTab(this._id);
|
return getTab(this._id);
|
||||||
},
|
},
|
||||||
|
hideSpellcasting: function() {
|
||||||
|
var char = Characters.findOne(this._id);
|
||||||
|
return char && char.settings.hideSpellcasting;
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.characterSheet.events({
|
Template.characterSheet.events({
|
||||||
"core-animated-pages-transition-end #tabPages": function(event) {
|
"iron-select #characterSheetTabs": function(event, instance){
|
||||||
event.stopPropagation();
|
setTab(this._id, event.target.selected);
|
||||||
},
|
|
||||||
"tap #characterSheetTabs paper-tab": function(event, instance){
|
|
||||||
setTab(this._id, event.currentTarget.getAttribute("name"));
|
|
||||||
},
|
},
|
||||||
"color-change": function(event, instance){
|
"color-change": function(event, instance){
|
||||||
|
console.log("character color change")
|
||||||
Characters.update(this._id, {$set: {color: event.color}});
|
Characters.update(this._id, {$set: {color: event.color}});
|
||||||
},
|
},
|
||||||
"tap #deleteCharacter": function(event, instance){
|
"click #deleteCharacter": function(event, instance){
|
||||||
GlobalUI.showDialog({
|
pushDialogStack({
|
||||||
heading: "Delete " + this.name,
|
|
||||||
data: this,
|
data: this,
|
||||||
template: "deleteCharacterConfirmation",
|
template: "deleteCharacterConfirmation",
|
||||||
|
element: event.currentTarget.parentElement.parentElement,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap #shareCharacter": function(event, instance){
|
"click #shareCharacter": function(event, instance){
|
||||||
GlobalUI.showDialog({
|
pushDialogStack({
|
||||||
heading: "Share " + this.name,
|
|
||||||
data: this,
|
data: this,
|
||||||
template: "shareDialog",
|
template: "shareDialog",
|
||||||
|
element: event.currentTarget.parentElement.parentElement,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
"click #characterSettings": function(event, instance){
|
||||||
|
pushDialogStack({
|
||||||
|
data: this,
|
||||||
|
template: "characterSettings",
|
||||||
|
element: event.currentTarget.parentElement.parentElement,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,29 +1,15 @@
|
|||||||
body /deep/ #statGroupDropDown {
|
.effectEdit .operationDropDown {
|
||||||
width: 120px;
|
width: 152px;
|
||||||
}
|
}
|
||||||
|
|
||||||
body /deep/ #statDropDown {
|
.effectEdit .statDropDown {
|
||||||
width: 120px;
|
width: 152px;
|
||||||
}
|
}
|
||||||
|
|
||||||
body /deep/ #operationDropDown {
|
.effectEdit .damageMultiplierDropDown {
|
||||||
width: 100px;
|
width: 152px;
|
||||||
}
|
}
|
||||||
|
|
||||||
body /deep/ #damageMultiplierDropDown {
|
.effectEdit .deleteEffect {
|
||||||
width: 120px;
|
flex-shrink: 0;
|
||||||
}
|
|
||||||
|
|
||||||
body /deep/ #proficiencyDropDown {
|
|
||||||
width: 120px;
|
|
||||||
}
|
|
||||||
|
|
||||||
html /deep/ .effectEdit paper-input {
|
|
||||||
position: relative;
|
|
||||||
bottom: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
html /deep/ .effectEdit {
|
|
||||||
display: flex;
|
|
||||||
align-items: flex-end;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,54 +1,55 @@
|
|||||||
<template name="effectEdit">
|
<template name="effectEdit">
|
||||||
<div class="effectEdit" layout horizontal center>
|
<div class="effectEdit layout horizontal center">
|
||||||
<paper-dropdown-menu class="statGroupDropDown" label="Stat Group" flex>
|
<paper-dropdown-menu label="Stat" class="statDropDown" dynamic-align>
|
||||||
<paper-dropdown layered class="dropdown">
|
<dicecloud-selector class="statMenu dropdown-content" selected={{stat}} selectable="paper-item">
|
||||||
<core-menu class="menu statGroupMenu" selected={{selectedStatGroup}}>
|
{{#each statGroups}}
|
||||||
{{#each statGroups}}
|
<div style="font-weight: bold; margin-top: 16px; padding-left: 8px;">
|
||||||
<paper-item class="statGroupSelect" name={{this}}>{{this}}</paper-item>
|
{{this}}
|
||||||
|
</div>
|
||||||
|
{{#each stats}}
|
||||||
|
<paper-item name={{stat}}>{{name}}</paper-item>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</core-menu>
|
{{/each}}
|
||||||
</paper-dropdown>
|
</dicecloud-selector>
|
||||||
</paper-dropdown-menu>
|
</paper-dropdown-menu>
|
||||||
{{#if stats}}
|
|
||||||
<paper-dropdown-menu class="statDropDown" label="Stat" flex>
|
|
||||||
<paper-dropdown layered class="dropdown">
|
|
||||||
<core-menu class="menu statMenu" selected={{stat}} on-tap="onStatMenuTap">
|
|
||||||
{{#each stats}}
|
|
||||||
<paper-item name={{stat}}>{{name}}</paper-item>
|
|
||||||
{{/each}}
|
|
||||||
</core-menu>
|
|
||||||
</paper-dropdown>
|
|
||||||
</paper-dropdown-menu>
|
|
||||||
{{/if}}
|
|
||||||
{{#if operations}}
|
{{#if operations}}
|
||||||
<paper-dropdown-menu class="operationDropDown" label="Operation" flex>
|
<paper-dropdown-menu class="operationDropDown" label="Operation" dynamic-align>
|
||||||
<paper-dropdown layered class="dropdown">
|
<dicecloud-selector class="dropdown-content operationMenu" selected={{operation}}>
|
||||||
<core-menu class="menu operationMenu" selected={{operation}}>
|
{{#each operations}}
|
||||||
{{#each operations}}
|
<paper-item name={{operation}}>{{name}}</paper-item>
|
||||||
<paper-item name={{operation}}>{{name}}</paper-item>
|
{{/each}}
|
||||||
{{/each}}
|
</dicecloud-selector>
|
||||||
</core-menu>
|
|
||||||
</paper-dropdown>
|
|
||||||
</paper-dropdown-menu>
|
</paper-dropdown-menu>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{> Template.dynamic template=effectValueTemplate}}
|
{{#if effectValueTemplate}}
|
||||||
<paper-icon-button class="deleteEffect" role="button" tabindex="0" icon="delete" aria-label="Delete"></paper-icon-button>
|
{{> Template.dynamic template=effectValueTemplate}}
|
||||||
|
{{else}}
|
||||||
|
<div class="flex"></div>
|
||||||
|
{{/if}}
|
||||||
|
<paper-icon-button class="deleteEffect"
|
||||||
|
icon="delete">
|
||||||
|
</paper-icon-button>
|
||||||
<br>
|
<br>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="regularEffectValue">
|
<template name="regularEffectValue">
|
||||||
<paper-input class="effectValueInput" label="Value" floatinglabel value={{effectValue}} flex></paper-input>
|
<paper-input class="effectValueInput flex"
|
||||||
|
label="Value"
|
||||||
|
floatinglabel
|
||||||
|
value={{effectValue}}
|
||||||
|
style="flex-basis: 100px;">
|
||||||
|
</paper-input>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="multiplierEffectValue">
|
<template name="multiplierEffectValue">
|
||||||
<paper-dropdown-menu class="damageMultiplierDropDown" label="Damage Multiplier" flex>
|
<paper-dropdown-menu class="damageMultiplierDropDown" label="Damage Multiplier" dynamic-align>
|
||||||
<paper-dropdown layered class="dropdown">
|
<dicecloud-selector class="menu multiplierMenu dropdown-content"
|
||||||
<core-menu class="menu multiplierMenu" selected={{value}}>
|
selected={{value}}>
|
||||||
<paper-item name="0.5">Resistance</paper-item>
|
<paper-item name="0.5">Resistance</paper-item>
|
||||||
<paper-item name="2">Vulnerability</paper-item>
|
<paper-item name="2">Vulnerability</paper-item>
|
||||||
<paper-item name="0">Immunity</paper-item>
|
<paper-item name="0">Immunity</paper-item>
|
||||||
</core-menu>
|
</dicecloud-selector>
|
||||||
</paper-dropdown>
|
|
||||||
</paper-dropdown-menu>
|
</paper-dropdown-menu>
|
||||||
|
<div class="flex"></div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
//TODO add dexterity armor
|
//TODO add dexterity armor
|
||||||
|
// jscs:disable maximumLineLength
|
||||||
var stats = [
|
var stats = [
|
||||||
{stat: "strength", name: "Strength", group: "Ability Scores"},
|
{stat: "strength", name: "Strength", group: "Ability Scores"},
|
||||||
{stat: "dexterity", name: "Dexterity", group: "Ability Scores"},
|
{stat: "dexterity", name: "Dexterity", group: "Ability Scores"},
|
||||||
@@ -42,6 +43,7 @@ var stats = [
|
|||||||
{stat: "rageDamage", name: "Rage Damage", group: "Stats"},
|
{stat: "rageDamage", name: "Rage Damage", group: "Stats"},
|
||||||
{stat: "expertiseDice", name: "Expertise Dice", group: "Stats"},
|
{stat: "expertiseDice", name: "Expertise Dice", group: "Stats"},
|
||||||
{stat: "superiorityDice", name: "Superiority Dice", group: "Stats"},
|
{stat: "superiorityDice", name: "Superiority Dice", group: "Stats"},
|
||||||
|
{stat: "carryMultiplier", name: "Carry Capacity Multiplier", group: "Stats"},
|
||||||
{stat: "level1SpellSlots", name: "level 1", group: "Spell Slots"},
|
{stat: "level1SpellSlots", name: "level 1", group: "Spell Slots"},
|
||||||
{stat: "level2SpellSlots", name: "level 2", group: "Spell Slots"},
|
{stat: "level2SpellSlots", name: "level 2", group: "Spell Slots"},
|
||||||
{stat: "level3SpellSlots", name: "level 3", group: "Spell Slots"},
|
{stat: "level3SpellSlots", name: "level 3", group: "Spell Slots"},
|
||||||
@@ -67,9 +69,11 @@ var stats = [
|
|||||||
{stat: "psychicMultiplier", name: "Psychic", group: "Weakness/Resistance"},
|
{stat: "psychicMultiplier", name: "Psychic", group: "Weakness/Resistance"},
|
||||||
{stat: "radiantMultiplier", name: "Radiant", group: "Weakness/Resistance"},
|
{stat: "radiantMultiplier", name: "Radiant", group: "Weakness/Resistance"},
|
||||||
{stat: "slashingMultiplier", name: "Slashing", group: "Weakness/Resistance"},
|
{stat: "slashingMultiplier", name: "Slashing", group: "Weakness/Resistance"},
|
||||||
{stat: "thunderMultiplier", name: "Thunder", group: "Weakness/Resistance"}
|
{stat: "thunderMultiplier", name: "Thunder", group: "Weakness/Resistance"},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// jscs:enable maximumLineLength
|
||||||
|
|
||||||
var statsDict = _.indexBy(stats, "stat");
|
var statsDict = _.indexBy(stats, "stat");
|
||||||
var statGroups = _.groupBy(stats, "group");
|
var statGroups = _.groupBy(stats, "group");
|
||||||
var statGroupNames = _.keys(statGroups);
|
var statGroupNames = _.keys(statGroups);
|
||||||
@@ -79,7 +83,7 @@ var attributeOperations = [
|
|||||||
{name: "Add", operation: "add"},
|
{name: "Add", operation: "add"},
|
||||||
{name: "Multiply", operation: "mul"},
|
{name: "Multiply", operation: "mul"},
|
||||||
{name: "Min", operation: "min"},
|
{name: "Min", operation: "min"},
|
||||||
{name: "Max", operation: "max"}
|
{name: "Max", operation: "max"},
|
||||||
];
|
];
|
||||||
var skillOperations = [
|
var skillOperations = [
|
||||||
{name: "Add", operation: "add"},
|
{name: "Add", operation: "add"},
|
||||||
@@ -90,27 +94,20 @@ var skillOperations = [
|
|||||||
{name: "Disadvantage", operation: "disadvantage"},
|
{name: "Disadvantage", operation: "disadvantage"},
|
||||||
{name: "Passive Bonus", operation: "passiveAdd"},
|
{name: "Passive Bonus", operation: "passiveAdd"},
|
||||||
{name: "Automatically Fail", operation: "fail"},
|
{name: "Automatically Fail", operation: "fail"},
|
||||||
{name: "Conditional Benefit", operation: "conditional"}
|
{name: "Conditional Benefit", operation: "conditional"},
|
||||||
];
|
];
|
||||||
|
|
||||||
Template.effectEdit.created = function(){
|
|
||||||
var statGroup = statsDict[this.data.stat] && statsDict[this.data.stat].group;
|
|
||||||
this.selectedStatGroup = new ReactiveVar(statGroup);
|
|
||||||
};
|
|
||||||
|
|
||||||
Template.effectEdit.helpers({
|
Template.effectEdit.helpers({
|
||||||
selectedStatGroup: function(){
|
|
||||||
return Template.instance().selectedStatGroup.get();
|
|
||||||
},
|
|
||||||
statGroups: function(){
|
statGroups: function(){
|
||||||
return statGroupNames;
|
return statGroupNames;
|
||||||
},
|
},
|
||||||
stats: function(){
|
stats: function(){
|
||||||
var group = Template.instance().selectedStatGroup.get();
|
var group = this;
|
||||||
return statGroups[group];
|
return statGroups[group];
|
||||||
},
|
},
|
||||||
operations: function(){
|
operations: function(){
|
||||||
var group = Template.instance().selectedStatGroup.get();
|
var stat = statsDict[this.stat];
|
||||||
|
var group = stat && stat.group;
|
||||||
if (group === "Weakness/Resistance") return null;
|
if (group === "Weakness/Resistance") return null;
|
||||||
if (group === "Saving Throws" || group === "Skills"){
|
if (group === "Saving Throws" || group === "Skills"){
|
||||||
return skillOperations;
|
return skillOperations;
|
||||||
@@ -120,7 +117,8 @@ Template.effectEdit.helpers({
|
|||||||
},
|
},
|
||||||
effectValueTemplate: function(){
|
effectValueTemplate: function(){
|
||||||
//resistance/vulnerability template
|
//resistance/vulnerability template
|
||||||
var group = Template.instance().selectedStatGroup.get();
|
var stat = statsDict[this.stat];
|
||||||
|
var group = stat && stat.group;
|
||||||
if (group === "Weakness/Resistance") return "multiplierEffectValue";
|
if (group === "Weakness/Resistance") return "multiplierEffectValue";
|
||||||
|
|
||||||
var op = this.operation;
|
var op = this.operation;
|
||||||
@@ -130,7 +128,7 @@ Template.effectEdit.helpers({
|
|||||||
|
|
||||||
//default template
|
//default template
|
||||||
return "regularEffectValue";
|
return "regularEffectValue";
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.regularEffectValue.helpers({
|
Template.regularEffectValue.helpers({
|
||||||
@@ -140,52 +138,30 @@ Template.regularEffectValue.helpers({
|
|||||||
});
|
});
|
||||||
|
|
||||||
Template.effectEdit.events({
|
Template.effectEdit.events({
|
||||||
"tap .deleteEffect": function(event){
|
"click .deleteEffect": function(event){
|
||||||
Effects.softRemoveNode(this._id);
|
Effects.softRemoveNode(this._id);
|
||||||
GlobalUI.deletedToast(this._id, "Effects", "Effect");
|
GlobalUI.deletedToast(this._id, "Effects", "Effect");
|
||||||
},
|
},
|
||||||
"core-select .statGroupDropDown": function(event, instance){
|
"iron-select .statDropDown": function(event){
|
||||||
var detail = event.originalEvent.detail;
|
var detail = event.originalEvent.detail;
|
||||||
if (!detail.isSelected) return;
|
|
||||||
var groupName = detail.item.getAttribute("name");
|
|
||||||
var oldName = Template.instance().selectedStatGroup.get();
|
|
||||||
if (oldName != groupName){
|
|
||||||
instance.selectedStatGroup.set(groupName);
|
|
||||||
if (groupName === "Weakness/Resistance"){
|
|
||||||
Effects.update(this._id, {$set: {
|
|
||||||
value: 0.5,
|
|
||||||
calculation: "",
|
|
||||||
operation: "mul"}, $unset: {stat: ""}});
|
|
||||||
} else {
|
|
||||||
Effects.update(this._id,
|
|
||||||
{$set: {operation: "add"},
|
|
||||||
$unset: {stat: "", value: "", calculation: ""}});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"core-select .statDropDown": function(event){
|
|
||||||
var detail = event.originalEvent.detail;
|
|
||||||
if (!detail.isSelected) return;
|
|
||||||
var statName = detail.item.getAttribute("name");
|
var statName = detail.item.getAttribute("name");
|
||||||
if (statName == this.stat) return;
|
if (statName == this.stat) return;
|
||||||
Effects.update(this._id, {$set: {stat: statName}});
|
Effects.update(this._id, {$set: {stat: statName}});
|
||||||
},
|
},
|
||||||
"core-select .operationDropDown": function(event){
|
"iron-select .operationDropDown": function(event){
|
||||||
var detail = event.originalEvent.detail;
|
var detail = event.originalEvent.detail;
|
||||||
if (!detail.isSelected) return;
|
|
||||||
var opName = detail.item.getAttribute("name");
|
var opName = detail.item.getAttribute("name");
|
||||||
if (opName == this.operation) return;
|
if (opName == this.operation) return;
|
||||||
Effects.update(this._id, {$set: {operation: opName}});
|
Effects.update(this._id, {$set: {operation: opName}});
|
||||||
},
|
},
|
||||||
"core-select .damageMultiplierDropDown": function(event){
|
"iron-select .damageMultiplierDropDown": function(event){
|
||||||
var detail = event.originalEvent.detail;
|
var detail = event.originalEvent.detail;
|
||||||
if (!detail.isSelected) return;
|
|
||||||
var value = +detail.item.getAttribute("name");
|
var value = +detail.item.getAttribute("name");
|
||||||
if (value == this.value) return;
|
if (value == this.value) return;
|
||||||
Effects.update(this._id, {$set: {
|
Effects.update(this._id, {$set: {
|
||||||
value: value,
|
value: value,
|
||||||
calculation: "",
|
calculation: "",
|
||||||
operation: "mul"
|
operation: "mul",
|
||||||
}});
|
}});
|
||||||
},
|
},
|
||||||
"change .effectValueInput": function(event){
|
"change .effectValueInput": function(event){
|
||||||
@@ -198,5 +174,5 @@ Template.effectEdit.events({
|
|||||||
if (this.calculation === value) return;
|
if (this.calculation === value) return;
|
||||||
Effects.update(this._id, {$set: {value: "", calculation: value}});
|
Effects.update(this._id, {$set: {value: "", calculation: value}});
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ var stats = {
|
|||||||
"rageDamage":{"name":"Rage Damage"},
|
"rageDamage":{"name":"Rage Damage"},
|
||||||
"expertiseDice":{"name":"Expertise Dice"},
|
"expertiseDice":{"name":"Expertise Dice"},
|
||||||
"superiorityDice":{"name":"Superiority Dice"},
|
"superiorityDice":{"name":"Superiority Dice"},
|
||||||
|
"carryMultiplier": {"name": "Carry Capacity Multiplier"},
|
||||||
"level1SpellSlots":{"name":"level 1 Spell Slots"},
|
"level1SpellSlots":{"name":"level 1 Spell Slots"},
|
||||||
"level2SpellSlots":{"name":"level 2 Spell Slots"},
|
"level2SpellSlots":{"name":"level 2 Spell Slots"},
|
||||||
"level3SpellSlots":{"name":"level 3 Spell Slots"},
|
"level3SpellSlots":{"name":"level 3 Spell Slots"},
|
||||||
@@ -57,40 +58,40 @@ var stats = {
|
|||||||
"d12HitDice":{"name":"d12 Hit Dice"},
|
"d12HitDice":{"name":"d12 Hit Dice"},
|
||||||
"acidMultiplier":{"name":"Acid damage", "group": "Weakness/Resistance"},
|
"acidMultiplier":{"name":"Acid damage", "group": "Weakness/Resistance"},
|
||||||
"bludgeoningMultiplier":{
|
"bludgeoningMultiplier":{
|
||||||
"name":"Bludgeoning damage", "group": "Weakness/Resistance"
|
"name":"Bludgeoning damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"coldMultiplier":{
|
"coldMultiplier":{
|
||||||
"name":"Cold damage", "group": "Weakness/Resistance"
|
"name":"Cold damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"fireMultiplier":{
|
"fireMultiplier":{
|
||||||
"name":"Fire damage", "group": "Weakness/Resistance"
|
"name":"Fire damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"forceMultiplier":{
|
"forceMultiplier":{
|
||||||
"name":"Force damage", "group": "Weakness/Resistance"
|
"name":"Force damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"lightningMultiplier":{
|
"lightningMultiplier":{
|
||||||
"name":"Lightning damage", "group": "Weakness/Resistance"
|
"name":"Lightning damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"necroticMultiplier":{
|
"necroticMultiplier":{
|
||||||
"name":"Necrotic damage", "group": "Weakness/Resistance"
|
"name":"Necrotic damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"piercingMultiplier":{
|
"piercingMultiplier":{
|
||||||
"name":"Piercing damage", "group": "Weakness/Resistance"
|
"name":"Piercing damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"poisonMultiplier":{
|
"poisonMultiplier":{
|
||||||
"name":"Poison damage", "group": "Weakness/Resistance"
|
"name":"Poison damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"psychicMultiplier":{
|
"psychicMultiplier":{
|
||||||
"name":"Psychic damage", "group": "Weakness/Resistance"
|
"name":"Psychic damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"radiantMultiplier":{
|
"radiantMultiplier":{
|
||||||
"name":"Radiant damage", "group": "Weakness/Resistance"
|
"name":"Radiant damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"slashingMultiplier":{
|
"slashingMultiplier":{
|
||||||
"name":"Slashing damage", "group": "Weakness/Resistance"
|
"name":"Slashing damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"thunderMultiplier":{
|
"thunderMultiplier":{
|
||||||
"name":"Thunder damage", "group": "Weakness/Resistance"
|
"name":"Thunder damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -98,7 +99,7 @@ var operations = {
|
|||||||
base: {name: "Base Value: "},
|
base: {name: "Base Value: "},
|
||||||
proficiency: {name: "Proficiency"},
|
proficiency: {name: "Proficiency"},
|
||||||
add: {name: "+"},
|
add: {name: "+"},
|
||||||
mul: {name: "x"},
|
mul: {name: "×"},
|
||||||
min: {name: "Min: "},
|
min: {name: "Min: "},
|
||||||
max: {name: "Max: "},
|
max: {name: "Max: "},
|
||||||
advantage: {name: "Advantage"},
|
advantage: {name: "Advantage"},
|
||||||
@@ -110,8 +111,8 @@ var operations = {
|
|||||||
Template.effectView.helpers({
|
Template.effectView.helpers({
|
||||||
sourceName: function(){
|
sourceName: function(){
|
||||||
var id = this.parent.id;
|
var id = this.parent.id;
|
||||||
if(!id) return;
|
if (!id) return;
|
||||||
switch(this.parent.collection){
|
switch (this.parent.collection){
|
||||||
case "Features":
|
case "Features":
|
||||||
return "Feature - " + Features.findOne(id, {fields: {name: 1}}).name;
|
return "Feature - " + Features.findOne(id, {fields: {name: 1}}).name;
|
||||||
case "Classes":
|
case "Classes":
|
||||||
@@ -130,33 +131,39 @@ Template.effectView.helpers({
|
|||||||
return stats[this.stat] && stats[this.stat].name || "No Stat";
|
return stats[this.stat] && stats[this.stat].name || "No Stat";
|
||||||
},
|
},
|
||||||
operationName: function(){
|
operationName: function(){
|
||||||
if(this.operation === "proficiency" ||
|
if (this.operation === "proficiency" ||
|
||||||
this.operation === "conditional") return null;
|
this.operation === "conditional") return null;
|
||||||
if(stats[this.stat].group === "Weakness/Resistance") return null;
|
if (stats[this.stat] && stats[this.stat].group === "Weakness/Resistance")
|
||||||
if(this.operation === "add" && evaluateEffect(this.charId, this) < 0) return null;
|
return null;
|
||||||
return operations[this.operation] && operations[this.operation].name || "No Operation";
|
if (this.operation === "add" && evaluateEffect(this.charId, this) < 0)
|
||||||
|
return null;
|
||||||
|
return operations[this.operation] &&
|
||||||
|
operations[this.operation].name || "No Operation";
|
||||||
},
|
},
|
||||||
statValue: function(){
|
statValue: function(){
|
||||||
if(this.operation === "advantage" ||
|
if (this.operation === "advantage" ||
|
||||||
this.operation === "disadvantage" ||
|
this.operation === "disadvantage" ||
|
||||||
this.operation === "fail"){
|
this.operation === "fail"){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if(this.operation === "proficiency"){
|
if (this.operation === "proficiency"){
|
||||||
if(this.value == 0.5 || this.calculation == 0.5) return "Half Proficiency";
|
if (this.value == 0.5 || this.calculation == 0.5)
|
||||||
if(this.value == 1 || this.calculation == 1) return "Proficiency";
|
return "Half Proficiency";
|
||||||
if(this.value == 2 || this.calculation == 2) return "Double Proficiency";
|
if (this.value == 1 || this.calculation == 1)
|
||||||
|
return "Proficiency";
|
||||||
|
if (this.value == 2 || this.calculation == 2)
|
||||||
|
return "Double Proficiency";
|
||||||
}
|
}
|
||||||
if(this.operation === "conditional"){
|
if (this.operation === "conditional"){
|
||||||
return this.calculation || this.value;
|
return this.calculation || this.value;
|
||||||
}
|
}
|
||||||
if(stats[this.stat].group === "Weakness/Resistance"){
|
if (stats[this.stat] && stats[this.stat].group === "Weakness/Resistance"){
|
||||||
if(this.value === 0.5) return "Resistance";
|
if (this.value === 0.5) return "Resistance";
|
||||||
if(this.value === 2) return "Vulnerability";
|
if (this.value === 2) return "Vulnerability";
|
||||||
if(this.value === 0) return "Immunity";
|
if (this.value === 0) return "Immunity";
|
||||||
}
|
}
|
||||||
var value = evaluateEffect(this.charId, this);
|
var value = evaluateEffect(this.charId, this);
|
||||||
if(_.isNumber(value)) return value;
|
if (_.isNumber(value)) return value;
|
||||||
return this.calculation || this.value;
|
return this.calculation || this.value;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
<!--needs to be given charId, parentId and parentCollection-->
|
<!--needs to be given charId, parentId and parentCollection-->
|
||||||
<template name="effectsEditList">
|
<template name="effectsEditList">
|
||||||
{{#if effects.count}}
|
{{#if effects.count}}
|
||||||
<hr class="vertMargin">
|
|
||||||
<div id="effects">
|
<div id="effects">
|
||||||
<h2>Effects</h2>
|
<div class="paper-font-title">Effects</div>
|
||||||
{{#each effects}}
|
{{#each effects}}
|
||||||
{{>effectEdit}}
|
{{>effectEdit}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<paper-button id="addEffectButton" class="red-button" raised>Add Effect</paper-button>
|
<paper-button id="addEffectButton" class="red-button" raised>Add Effect</paper-button>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
<!--needs to be given charId, (parentId or stat) and type-->
|
<!--needs to be given charId, (parentId or stat) and type-->
|
||||||
<template name="effectsViewList">
|
<template name="effectsViewList">
|
||||||
{{#if effects.count}}
|
{{#if effects.count}}
|
||||||
<hr style="margin: 16px 0 16px 0;">
|
|
||||||
<div class="effects">
|
<div class="effects">
|
||||||
<h2 class="spaceAfter">Effects</h2>
|
<div class="spaceAfter paper-font-title">Effects</div>
|
||||||
<table class="wideTable">
|
<table class="wideTable">
|
||||||
{{#each effects}}
|
{{#each effects}}
|
||||||
{{>effectView}}
|
{{>effectView}}
|
||||||
|
|||||||
@@ -10,10 +10,9 @@
|
|||||||
|
|
||||||
<template name="featureDetails">
|
<template name="featureDetails">
|
||||||
{{#if or canEnable hasUses}}
|
{{#if or canEnable hasUses}}
|
||||||
<div layout horizontal center justified wrap>
|
<div class="layout horizontal center justified wrap">
|
||||||
{{#if canEnable}}
|
{{#if canEnable}}
|
||||||
<div>enabled:</div>
|
<paper-checkbox class="sideMargin" checked={{enabled}}>enabled</paper-checkbox>
|
||||||
<paper-checkbox class="sideMargin" checked={{enabled}}></paper-checkbox>
|
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#if hasUses}}
|
{{#if hasUses}}
|
||||||
<div class="subhead" style="margin-right: 16px">
|
<div class="subhead" style="margin-right: 16px">
|
||||||
@@ -21,7 +20,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#if hasUses}}
|
{{#if hasUses}}
|
||||||
<div layout horizontal>
|
<div class="layout horizontal">
|
||||||
<paper-button class="useFeature" disabled={{noUsesLeft}}>Use</paper-button>
|
<paper-button class="useFeature" disabled={{noUsesLeft}}>Use</paper-button>
|
||||||
<paper-button class="resetFeature" disabled={{usesFull}}>Reset</paper-button>
|
<paper-button class="resetFeature" disabled={{usesFull}}>Reset</paper-button>
|
||||||
</div>
|
</div>
|
||||||
@@ -32,7 +31,7 @@
|
|||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{#if description}}
|
{{#if description}}
|
||||||
<div class="pre-wrap">{{evaluateString charId description}}</div>
|
<div>{{#markdown}}{{evaluateString charId description}}{{/markdown}}</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{> effectsViewList charId=charId parentId=_id}}
|
{{> effectsViewList charId=charId parentId=_id}}
|
||||||
@@ -41,44 +40,36 @@
|
|||||||
|
|
||||||
<template name="featureEdit">
|
<template name="featureEdit">
|
||||||
<!--name-->
|
<!--name-->
|
||||||
<paper-input id="featureNameInput" class="fullwidth" label="Name" floatinglabel value={{name}}></paper-input>
|
<paper-input id="featureNameInput" class="fullwidth" label="Name" value={{name}}></paper-input>
|
||||||
|
|
||||||
<hr class="vertMargin">
|
<div class="layout horizontal center wrap justified">
|
||||||
|
<paper-dropdown-menu class=flex label="Enable Feature" style="flex-basis: 150px; max-width: 200px;">
|
||||||
<div layout horizontal center style="height: 60px;">
|
<dicecloud-selector selected={{enabledSelection}} class="dropdown-content enabled-dropdown">
|
||||||
<paper-dropdown-menu id="enabledDropdown" label="Enable Feature">
|
<paper-item name="alwaysEnabled" style="width: 150px;">
|
||||||
<paper-dropdown layered class="dropdown">
|
Always Enabled
|
||||||
<core-menu id="enabledMenu" class="menu" selected={{enabledSelection}} on-tap="onStatMenuTap">
|
</paper-item>
|
||||||
<paper-item name="alwaysEnabled"> Always Enabled </paper-item>
|
<paper-item name="enabled">
|
||||||
<paper-item name="enabled"> Enabled </paper-item>
|
Enabled
|
||||||
<paper-item name="disabled"> Disabled </paper-item>
|
</paper-item>
|
||||||
</core-menu>
|
<paper-item name="disabled">
|
||||||
</paper-dropdown>
|
Disabled
|
||||||
|
</paper-item>
|
||||||
|
</dicecloud-selector>
|
||||||
</paper-dropdown-menu>
|
</paper-dropdown-menu>
|
||||||
<div layout horizontal center class="sideMargin">
|
<paper-toggle-button id="limitUseCheck" checked={{usesSet}} style="margin: 0 16px; height: 62px;">
|
||||||
<div>Limit Uses: </div>
|
Limit uses
|
||||||
<paper-toggle-button id="limitUseCheck"
|
</paper-toggle-button>
|
||||||
class="sideMargin"
|
|
||||||
checked={{usesSet}}
|
|
||||||
role="button"
|
|
||||||
aria-pressed="false"
|
|
||||||
tabindex="0"
|
|
||||||
touch-action="pan-y">
|
|
||||||
</paper-toggle-button>
|
|
||||||
</div>
|
|
||||||
{{#if usesSet}}
|
{{#if usesSet}}
|
||||||
<paper-input flex id="usesInput" label="Uses" floatinglabel value={{uses}}></paper-input>
|
<paper-input id="usesInput" type="number" allowed-pattern="[0-9]" class="flex"
|
||||||
|
label="Uses" value={{uses}} style="flex-basis: 100px; max-width: 200px">
|
||||||
|
</paper-input>
|
||||||
|
{{else}}
|
||||||
|
<div class="flex" style="flex-basis: 100px; max-width: 200px"></div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr class="vertMargin">
|
|
||||||
|
|
||||||
<!--description-->
|
<!--description-->
|
||||||
<paper-input-decorator label="Description" floatinglabel layout vertical>
|
<paper-textarea label="Description" id="featureDescriptionInput" value={{description}}></paper-textarea>
|
||||||
<paper-autogrow-textarea>
|
|
||||||
<textarea id="featureDescriptionInput" placeholder aria-label="Description" value={{description}}></textarea>
|
|
||||||
</paper-autogrow-textarea>
|
|
||||||
</paper-input-decorator>
|
|
||||||
|
|
||||||
{{> effectsEditList parentId=_id parentCollection="Features" charId=charId name=name enabled=enabled}}
|
{{> effectsEditList parentId=_id parentCollection="Features" charId=charId name=name enabled=enabled}}
|
||||||
{{> proficiencyEditList parentId=_id parentCollection="Features" charId=charId enabled=enabled}}
|
{{> proficiencyEditList parentId=_id parentCollection="Features" charId=charId enabled=enabled}}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ Template.featureDialog.events({
|
|||||||
"tap #deleteButton": function(event, instance){
|
"tap #deleteButton": function(event, instance){
|
||||||
Features.softRemoveNode(instance.data.featureId);
|
Features.softRemoveNode(instance.data.featureId);
|
||||||
GlobalUI.deletedToast(instance.data.featureId, "Features", "Feature");
|
GlobalUI.deletedToast(instance.data.featureId, "Features", "Feature");
|
||||||
GlobalUI.closeDetail();
|
popDialogStack();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -31,11 +31,11 @@ Template.featureDetails.helpers({
|
|||||||
});
|
});
|
||||||
|
|
||||||
Template.featureDetails.events({
|
Template.featureDetails.events({
|
||||||
"tap .useFeature": function(event){
|
"click .useFeature": function(event){
|
||||||
var featureId = this._id;
|
var featureId = this._id;
|
||||||
Features.update(featureId, {$inc: {used: 1}});
|
Features.update(featureId, {$inc: {used: 1}});
|
||||||
},
|
},
|
||||||
"tap .resetFeature": function(event){
|
"click .resetFeature": function(event){
|
||||||
var featureId = this._id;
|
var featureId = this._id;
|
||||||
Features.update(featureId, {$set: {used: 0}});
|
Features.update(featureId, {$set: {used: 0}});
|
||||||
},
|
},
|
||||||
@@ -46,10 +46,6 @@ Template.featureDetails.events({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.featureEdit.onRendered(function(){
|
|
||||||
updatePolymerInputs(this);
|
|
||||||
});
|
|
||||||
|
|
||||||
Template.featureEdit.helpers({
|
Template.featureEdit.helpers({
|
||||||
usesSet: function(){
|
usesSet: function(){
|
||||||
return _.isString(this.uses);
|
return _.isString(this.uses);
|
||||||
@@ -67,32 +63,60 @@ Template.featureEdit.helpers({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const debounce = (f) => _.debounce(f, 300);
|
||||||
|
|
||||||
Template.featureEdit.events({
|
Template.featureEdit.events({
|
||||||
"change #featureNameInput": function(event){
|
"input #featureNameInput": debounce(function(event){
|
||||||
var name = Template.instance().find("#featureNameInput").value;
|
const input = event.currentTarget;
|
||||||
Features.update(this._id, {$set: {name: name}});
|
var name = input.value;
|
||||||
},
|
if (!name){
|
||||||
"change #featureDescriptionInput": function(event){
|
input.invalid = true;
|
||||||
var description = Template.instance().find("#featureDescriptionInput").value;
|
input.errorMessage = "Name is required";
|
||||||
Features.update(this._id, {$set: {description: description}});
|
} else {
|
||||||
},
|
input.invalid = false;
|
||||||
"change #limitUseCheck": function(event){
|
Features.update(this._id, {
|
||||||
|
$set: {name: name}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
trimStrings: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
"input #featureDescriptionInput": debounce(function(event){
|
||||||
|
var description = event.currentTarget.value;
|
||||||
|
Features.update(this._id, {
|
||||||
|
$set: {description: description}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
trimStrings: false,
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
"change #limitUseCheck": debounce(function(event){
|
||||||
var currentUses = this.uses;
|
var currentUses = this.uses;
|
||||||
var featureId = this._id;
|
var featureId = this._id;
|
||||||
if (event.target.checked && !_.isString(currentUses)){
|
if (event.target.checked && !_.isString(currentUses)){
|
||||||
Features.update(featureId, {$set: {uses: ""}}, {removeEmptyStrings: false});
|
Features.update(featureId, {
|
||||||
|
$set: {uses: ""}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false
|
||||||
|
});
|
||||||
} else if (!event.target.checked && _.isString(currentUses)){
|
} else if (!event.target.checked && _.isString(currentUses)){
|
||||||
Features.update(featureId, {$unset: {uses: ""}});
|
Features.update(featureId, {
|
||||||
|
$unset: {uses: ""}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
},
|
}),
|
||||||
"change #usesInput, input #quantityInput": function(event){
|
"input #usesInput, input #quantityInput": debounce(function(event){
|
||||||
var value = event.target.value;
|
var value = event.currentTarget.value;
|
||||||
var featureId = this._id;
|
var featureId = this._id;
|
||||||
Features.update(featureId, {$set: {uses: value}});
|
Features.update(featureId, {
|
||||||
},
|
$set: {uses: value}
|
||||||
"core-select #enabledDropdown": function(event){
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
"iron-select .enabled-dropdown": function(event){
|
||||||
var detail = event.originalEvent.detail;
|
var detail = event.originalEvent.detail;
|
||||||
if (!detail.isSelected) return;
|
|
||||||
var value = detail.item.getAttribute("name");
|
var value = detail.item.getAttribute("name");
|
||||||
var setter;
|
var setter;
|
||||||
if (value === "enabled"){
|
if (value === "enabled"){
|
||||||
|
|||||||
@@ -2,14 +2,6 @@
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.features {
|
|
||||||
display: flex !important;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: stretch;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
padding: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.featureCardTop {
|
.featureCardTop {
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
}
|
}
|
||||||
@@ -18,7 +10,7 @@
|
|||||||
white-space: pre-line;
|
white-space: pre-line;
|
||||||
}
|
}
|
||||||
|
|
||||||
.resourceCards paper-shadow.healthCard {
|
.resourceCards paper-material.healthCard {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,43 +1,41 @@
|
|||||||
<template name="features">
|
<template name="features">
|
||||||
<div fit>
|
<div class="features">
|
||||||
<div class="scroll-y" fit>
|
<div class="column-container animation-slider">
|
||||||
<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-->
|
{{>resource name="ki" title="Ki Points" color="teal" char=this}}
|
||||||
{{>resource name="ki" title="Ki Points" color="teal" char=this}}
|
<!--rages-->
|
||||||
<!--rages-->
|
{{>resource name="rages" title="Rages" color="teal" char=this}}
|
||||||
{{>resource name="rages" title="Rages" color="teal" char=this}}
|
<!--sorceryPoints-->
|
||||||
<!--sorceryPoints-->
|
{{>resource name="sorceryPoints" title="Sorcery Points" color="teal" char=this}}
|
||||||
{{>resource name="sorceryPoints" title="Sorcery Points" color="teal" char=this}}
|
<!--superiorityDice-->
|
||||||
<!--superiorityDice-->
|
{{>resource name="superiorityDice" title="Superiority Dice" color="teal" char=this}}
|
||||||
{{>resource name="superiorityDice" title="Superiority Dice" color="teal" char=this}}
|
|
||||||
|
<!--Attacks-->
|
||||||
<!--Attacks-->
|
<div>
|
||||||
<paper-shadow class="card">
|
<paper-material class="card">
|
||||||
<div class="top white">
|
<div class="top white">
|
||||||
Attacks
|
Attacks
|
||||||
</div>
|
</div>
|
||||||
<div class="bottom list">
|
<div class="bottom list">
|
||||||
{{#each attacks}}
|
{{#each attacks}}
|
||||||
<div class="item-slot">
|
<div class="item-slot">
|
||||||
<div class="flexible attack item"
|
<div class="flexible attack item">
|
||||||
hero-id="main" {{detailHero}}>
|
<div class="layout horizontal">
|
||||||
<div layout horizontal>
|
<div class="paper-font-headline layout horizontal center"
|
||||||
<div class="headline"
|
style="margin-right: 16px;">
|
||||||
style="margin-right: 16px;"
|
|
||||||
layout horizontal center>
|
|
||||||
{{evaluateSigned ../_id attackBonus}}
|
{{evaluateSigned ../_id attackBonus}}
|
||||||
</div>
|
</div>
|
||||||
<div flex layout vertical>
|
<div class="flex layout vertical">
|
||||||
<div class="body2">
|
<div class="paper-font-body2">
|
||||||
{{name}}
|
{{name}}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{{evaluateString ../_id damage}} {{damageType}}
|
{{evaluateString ../_id damage}} {{damageType}}
|
||||||
</div>
|
</div>
|
||||||
{{#if details}}
|
{{#if details}}
|
||||||
<div class="caption">
|
<div>
|
||||||
{{details}}
|
{{details}}
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
@@ -47,43 +45,44 @@
|
|||||||
</div>
|
</div>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
</paper-shadow>
|
</paper-material>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!--Proficiencies-->
|
<!--Proficiencies-->
|
||||||
<paper-shadow class="card">
|
<div>
|
||||||
|
<paper-material class="card">
|
||||||
<div class="white top">
|
<div class="white top">
|
||||||
Proficiencies
|
Proficiencies
|
||||||
</div>
|
</div>
|
||||||
<div flex class="bottom list">
|
<div flex class="bottom list">
|
||||||
{{#if weaponProfs.count}}
|
{{#if weaponProfs.count}}
|
||||||
<div class="subhead">Weapons</div>
|
<div class="paper-font-subhead">Weapons</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#each weaponProfs}}
|
{{#each weaponProfs}}
|
||||||
{{> proficiencyListItem}}
|
{{> proficiencyListItem}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
{{#if armorProfs.count}}
|
{{#if armorProfs.count}}
|
||||||
<div class="subhead">Armor</div>
|
<div class="paper-font-subhead">Armor</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#each armorProfs}}
|
{{#each armorProfs}}
|
||||||
{{> proficiencyListItem}}
|
{{> proficiencyListItem}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
{{#if toolProfs.count}}
|
{{#if toolProfs.count}}
|
||||||
<div class="subhead">Tools</div>
|
<div class="paper-font-subhead">Tools</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#each toolProfs}}
|
{{#each toolProfs}}
|
||||||
{{> proficiencyListItem}}
|
{{> proficiencyListItem}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
</paper-shadow>
|
</paper-material>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!--features-->
|
<!--features-->
|
||||||
{{#each features}}
|
{{#each features}}
|
||||||
<paper-shadow class="card featureCard"
|
<div>
|
||||||
hero-id="main" {{detailHero}}>
|
<paper-material class="card featureCard" data-id={{_id}}>
|
||||||
<div class="top {{colorClass}} subhead"
|
<div class="top {{colorClass}} paper-font-subhead layout horizontal">
|
||||||
layout horizontal
|
<div class="flex">
|
||||||
hero-id="toolbar" {{detailHero}}>
|
|
||||||
<div flex hero-id="title" {{detailHero}}>
|
|
||||||
{{name}}
|
{{name}}
|
||||||
</div>
|
</div>
|
||||||
{{#if hasUses}}
|
{{#if hasUses}}
|
||||||
@@ -92,59 +91,54 @@
|
|||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#if canEnable}}
|
{{#if canEnable}}
|
||||||
<core-tooltip label="Feature enabled"
|
<div>
|
||||||
position="left">
|
<paper-checkbox class="enabledCheckbox"
|
||||||
<paper-checkbox class="enabledCheckbox"
|
checked={{enabled}}
|
||||||
checked={{enabled}}>
|
disabled={{#unless canEditCharacter charId}}true{{/unless}}>
|
||||||
</paper-checkbox>
|
</paper-checkbox>
|
||||||
</core-tooltip>
|
<paper-tooltip position="left">Feature enabled</paper-tooltip>
|
||||||
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
{{#if description}}
|
{{#if description}}
|
||||||
<div flex class="bottom text"
|
<div class="bottom flex">
|
||||||
>{{evaluateString charId description}}</div>
|
{{#markdown}}{{evaluateShortString charId description}}{{/markdown}}
|
||||||
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#if hasUses}}
|
{{#if hasUses}}
|
||||||
<div layout horizontal center end-justified>
|
<div class="layout horizontal center end-justified">
|
||||||
<paper-button class="useFeature"
|
<paper-button class="useFeature"
|
||||||
disabled={{noUsesLeft}}>
|
disabled={{noUsesLeft}}>
|
||||||
Use
|
Use
|
||||||
</paper-button>
|
</paper-button>
|
||||||
<paper-button class="resetFeature"
|
<paper-button class="resetFeature"
|
||||||
disabled={{usesFull}}>
|
disabled={{usesFull}}>
|
||||||
Reset
|
Reset
|
||||||
</paper-button>
|
</paper-button>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</paper-shadow>
|
</paper-material>
|
||||||
{{/each}}
|
</div>
|
||||||
</div>
|
{{/each}}
|
||||||
<div class="fab-buffer"></div>
|
|
||||||
</div>
|
</div>
|
||||||
{{#if canEditCharacter _id}}
|
{{#if canEditCharacter _id}}
|
||||||
<paper-fab id="addFeature"
|
<paper-fab id="addFeature"
|
||||||
class="floatyButton"
|
class="floatyButton"
|
||||||
icon="add"
|
icon="add">
|
||||||
title="Add"
|
<paper-tooltip position="left">Add Feature</paper-tooltip>
|
||||||
role="button"
|
</paper-fab>
|
||||||
tabindex="0"
|
|
||||||
aria-label="Add"
|
|
||||||
hero-id="main"></paper-fab>
|
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="resource">
|
<template name="resource">
|
||||||
{{#if char.attributeBase name}}
|
{{#if characterCalculate "attributeBase" char._id name}}
|
||||||
<paper-shadow class="card"
|
<div>
|
||||||
hero-id="main" {{detailHero name char._id}}
|
<paper-material class="card layout horizontal">
|
||||||
layout horizontal>
|
<div class="left {{getColor}} paper-font-display1 white-text layout horizontal center">
|
||||||
<div class="left {{getColor}} display1 white-text"
|
|
||||||
hero-id="toolbar" {{detailHero name char._id}}
|
|
||||||
layout horizontal center>
|
|
||||||
<div style="margin-right: 8px;">
|
<div style="margin-right: 8px;">
|
||||||
<paper-icon-button class="resourceUp"
|
<paper-icon-button class="resourceUp"
|
||||||
icon="arrow-drop-up"
|
icon="arrow-drop-up"
|
||||||
disabled={{cantIncrement}}>
|
disabled={{cantIncrement}}>
|
||||||
</paper-icon-button>
|
</paper-icon-button>
|
||||||
<paper-icon-button class="resourceDown"
|
<paper-icon-button class="resourceDown"
|
||||||
@@ -152,13 +146,13 @@
|
|||||||
disabled={{cantDecrement}}>
|
disabled={{cantDecrement}}>
|
||||||
</paper-icon-button>
|
</paper-icon-button>
|
||||||
</div>
|
</div>
|
||||||
<div>{{char.attributeValue name}}</div>
|
<div>{{characterCalculate "attributeValue" char._id name}}</div>
|
||||||
<!--<div>/{{char.attributeBase name}}</div>-->
|
<!--<div>/{{char.attributeBase name}}</div>-->
|
||||||
</div>
|
</div>
|
||||||
<div class="right clickable"
|
<div class="right clickable flex layout horizontal center">
|
||||||
flex layout horizontal center>
|
|
||||||
{{title}}
|
{{title}}
|
||||||
</div>
|
</div>
|
||||||
</paper-shadow>
|
</paper-material>
|
||||||
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -7,10 +7,10 @@ Template.features.helpers({
|
|||||||
return this.usesValue() > 0;
|
return this.usesValue() > 0;
|
||||||
},
|
},
|
||||||
noUsesLeft: function(){
|
noUsesLeft: function(){
|
||||||
return this.usesLeft() <= 0;
|
return this.usesLeft() <= 0 || !canEditCharacter(this.charId);
|
||||||
},
|
},
|
||||||
usesFull: function(){
|
usesFull: function(){
|
||||||
return this.usesLeft() >= this.usesValue();
|
return this.usesLeft() >= this.usesValue() || !canEditCharacter(this.charId);
|
||||||
},
|
},
|
||||||
colorClass: function(){
|
colorClass: function(){
|
||||||
return getColorClass(this.color);
|
return getColorClass(this.color);
|
||||||
@@ -38,54 +38,45 @@ Template.features.helpers({
|
|||||||
});
|
});
|
||||||
|
|
||||||
Template.features.events({
|
Template.features.events({
|
||||||
"tap #addFeature": function(event){
|
"click #addFeature": function(event, instance){
|
||||||
var featureId = Features.insert({
|
var featureId = Features.insert({
|
||||||
name: "New Feature",
|
name: "New Feature",
|
||||||
charId: this._id,
|
charId: this._id,
|
||||||
enabled: true,
|
enabled: true,
|
||||||
alwaysEnabled: true,
|
alwaysEnabled: true,
|
||||||
});
|
});
|
||||||
GlobalUI.setDetail({
|
pushDialogStack({
|
||||||
template: "featureDialog",
|
template: "featureDialog",
|
||||||
data: {featureId: featureId, charId: this._id, startEditing: true},
|
data: {featureId: featureId, charId: this._id, startEditing: true},
|
||||||
heroId: featureId,
|
element: event.currentTarget,
|
||||||
|
returnElement: () => instance.find(`.featureCard[data-id='${featureId}']`),
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap #addAttackButton": function(event){
|
"click .featureCard .top": function(event){
|
||||||
var charId = this._id;
|
|
||||||
Attacks.insert({
|
|
||||||
charId: charId
|
|
||||||
}, function(error, id){
|
|
||||||
if (!error){
|
|
||||||
GlobalUI.setDetail({
|
|
||||||
template: "attackDialog",
|
|
||||||
data: {attackId: id, charId: charId},
|
|
||||||
heroId: id,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
"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({
|
pushDialogStack({
|
||||||
template: "featureDialog",
|
template: "featureDialog",
|
||||||
data: {featureId: featureId, charId: charId},
|
data: {featureId: featureId, charId: charId},
|
||||||
heroId: featureId,
|
element: event.currentTarget.parentElement,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap .attack": function(event){
|
"click .attack": function(event){
|
||||||
openParentDialog(this.parent, this.charId, this._id);
|
openParentDialog({
|
||||||
|
parent: this.parent,
|
||||||
|
charId: this.charId,
|
||||||
|
element: event.currentTarget,
|
||||||
|
});
|
||||||
},
|
},
|
||||||
"tap .useFeature": function(event){
|
"click .useFeature": function(event){
|
||||||
var featureId = this._id;
|
var featureId = this._id;
|
||||||
Features.update(featureId, {$inc: {used: 1}});
|
Features.update(featureId, {$inc: {used: 1}});
|
||||||
},
|
},
|
||||||
"tap .resetFeature": function(event){
|
"click .resetFeature": function(event){
|
||||||
var featureId = this._id;
|
var featureId = this._id;
|
||||||
Features.update(featureId, {$set: {used: 0}});
|
Features.update(featureId, {$set: {used: 0}});
|
||||||
},
|
},
|
||||||
"tap .enabledCheckbox": function(event){
|
"click .enabledCheckbox": function(event){
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
},
|
},
|
||||||
"change .enabledCheckbox": function(event){
|
"change .enabledCheckbox": function(event){
|
||||||
@@ -96,16 +87,19 @@ Template.features.events({
|
|||||||
|
|
||||||
Template.resource.helpers({
|
Template.resource.helpers({
|
||||||
cantIncrement: function(){
|
cantIncrement: function(){
|
||||||
var baseBigger = this.char.attributeValue(this.name) <
|
var value = Characters.calculate.attributeValue(this.char._id, this.name);
|
||||||
this.char.attributeBase(this.name);
|
var base = Characters.calculate.attributeBase(this.char._id, this.name);
|
||||||
return !baseBigger;
|
var baseBigger = value < base;
|
||||||
|
return !baseBigger || !canEditCharacter(this.char._id);
|
||||||
},
|
},
|
||||||
cantDecrement: function(){
|
cantDecrement: function(){
|
||||||
var valuePositive = this.char.attributeValue(this.name) > 0;
|
var value = Characters.calculate.attributeValue(this.char._id, this.name);
|
||||||
return !valuePositive;
|
var valuePositive = value > 0;
|
||||||
|
return !valuePositive || !canEditCharacter(this.char._id);
|
||||||
},
|
},
|
||||||
getColor: function(){
|
getColor: function(){
|
||||||
if (this.char.attributeValue(this.name) > 0){
|
var value = Characters.calculate.attributeValue(this.char._id, this.name);
|
||||||
|
if (value > 0){
|
||||||
return this.color;
|
return this.color;
|
||||||
} else {
|
} else {
|
||||||
return "grey";
|
return "grey";
|
||||||
@@ -114,25 +108,28 @@ Template.resource.helpers({
|
|||||||
});
|
});
|
||||||
|
|
||||||
Template.resource.events({
|
Template.resource.events({
|
||||||
"tap .resourceUp": function(event){
|
"click .resourceUp": function(event){
|
||||||
if (this.char.attributeValue(this.name) < this.char.attributeBase(this.name)){
|
var value = Characters.calculate.attributeValue(this.char._id, this.name);
|
||||||
|
var base = Characters.calculate.attributeBase(this.char._id, this.name);
|
||||||
|
if (value < base){
|
||||||
var modifier = {$inc: {}};
|
var modifier = {$inc: {}};
|
||||||
modifier.$inc[this.name + ".adjustment"] = 1;
|
modifier.$inc[this.name + ".adjustment"] = 1;
|
||||||
Characters.update(this.char._id, modifier, {validate: false});
|
Characters.update(this.char._id, modifier, {validate: false});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tap .resourceDown": function(event){
|
"click .resourceDown": function(event){
|
||||||
if (this.char.attributeValue(this.name) > 0){
|
var value = Characters.calculate.attributeValue(this.char._id, this.name);
|
||||||
|
if (value > 0){
|
||||||
var modifier = {$inc: {}};
|
var modifier = {$inc: {}};
|
||||||
modifier.$inc[this.name + ".adjustment"] = -1;
|
modifier.$inc[this.name + ".adjustment"] = -1;
|
||||||
Characters.update(this.char._id, modifier, {validate: false});
|
Characters.update(this.char._id, modifier, {validate: false});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tap .right": function(event, instance) {
|
"click .right": function(event, instance) {
|
||||||
GlobalUI.setDetail({
|
pushDialogStack({
|
||||||
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},
|
||||||
heroId: this.char._id + this.name,
|
element: event.currentTarget.parentElement,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
.carryCapacityBar {
|
||||||
|
background-color: #7DC580;
|
||||||
|
background-color: rgba(255,255,255,0.27);
|
||||||
|
position: relative;
|
||||||
|
height: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.carryCapacityBar div{
|
||||||
|
height: 100%;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
.carryCapacityBar .tick {
|
||||||
|
border-right: solid 2px #E5E5E5;
|
||||||
|
border-right-color: rgba(255,255,255,0.54);
|
||||||
|
}
|
||||||
@@ -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,67 @@
|
|||||||
|
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 = Characters.calculate.attributeValue(char._id, "strength");
|
||||||
|
var carryMultiplier = Characters.calculate
|
||||||
|
.attributeValue(char._id, "carryMultiplier");
|
||||||
|
var capacity = strength * 15 * carryMultiplier;
|
||||||
|
return weight / capacity;
|
||||||
|
};
|
||||||
|
|
||||||
|
Template.carryCapacityBar.onCreated(function() {
|
||||||
|
var self = this;
|
||||||
|
self.carriedFraction = new ReactiveVar(0);
|
||||||
|
self.autorun(function() {
|
||||||
|
self.carriedFraction.set(getFractionCarried(Template.currentData()));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
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,17 @@
|
|||||||
|
<template name="carryDialog">
|
||||||
|
{{#baseDialog title="Weight Carried" class=color hideEdit=true}}
|
||||||
|
<div class="layout horizontal center-justified end">
|
||||||
|
<div class="paper-font-display2">
|
||||||
|
{{round carriedWeight 1}}
|
||||||
|
</div>
|
||||||
|
<div class="paper-font-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";
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -11,36 +11,30 @@
|
|||||||
<template name="containerEdit">
|
<template name="containerEdit">
|
||||||
<paper-input id="containerNameInput"
|
<paper-input id="containerNameInput"
|
||||||
label="Name"
|
label="Name"
|
||||||
floatinglabel
|
|
||||||
value={{name}}></paper-input>
|
value={{name}}></paper-input>
|
||||||
<div layout horizontal around-justified wrap>
|
<div class="layout horizontal around-justified wrap">
|
||||||
<paper-input-decorator label="Weight" floatinglabel>
|
<paper-input id="weightInput" label="Weight" type="number" value={{weight}}>
|
||||||
<input id="weightInput" type="number" value={{weight}}>
|
</paper-input>
|
||||||
</paper-input-decorator>
|
<paper-input id="valueInput" label="Value" type="number" value={{value}}>
|
||||||
<paper-input-decorator label="Value" floatinglabel>
|
</paper-input>
|
||||||
<input id="valueInput" type="number" value={{value}}>
|
|
||||||
</paper-input-decorator>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr class="vertMargin">
|
<hr class="vertMargin">
|
||||||
|
|
||||||
<paper-input-decorator label="Description" floatinglabel layout vertical>
|
<paper-textarea label="Description" id="containerDescriptionInput" value={{description}}>
|
||||||
<paper-autogrow-textarea>
|
</paper-textarea>
|
||||||
<textarea id="containerDescriptionInput" placeholder aria-label="Description" value={{description}}></textarea>
|
|
||||||
</paper-autogrow-textarea>
|
|
||||||
</paper-input-decorator>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="containerView">
|
<template name="containerView">
|
||||||
<div layout horizontal wrap center justified>
|
<div class="layout horizontal wrap center justified">
|
||||||
<table class="summaryTable fullwidth">
|
<table class="summaryTable fullwidth">
|
||||||
<tr><td>Container</td><td>{{weight}}lbs</td><td>{{longValueString value}}</td></tr>
|
<tr><td>Container</td><td>{{round weight}}lbs</td><td>{{longValueString value}}</td></tr>
|
||||||
<tr><td>Contents</td><td>{{contentsWeight}}lbs</td><td>{{longValueString contentsValue}}</td></tr>
|
<tr><td>Contents</td><td>{{round contentsWeight}}lbs</td><td>{{longValueString contentsValue}}</td></tr>
|
||||||
<tr class="body2"><td>Total</td><td>{{totalWeight}}lbs</td><td>{{longValueString totalValue}}</td></tr>
|
<tr class="paper-font-body2"><td>Total</td><td>{{round totalWeight}}lbs</td><td>{{longValueString totalValue}}</td></tr>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
{{#if description}}
|
{{#if description}}
|
||||||
<hr class="vertMargin">
|
<hr class="vertMargin">
|
||||||
<div class="pre-wrap">{{evaluateString charId description}}</div>
|
<div>{{#markdown}}{{evaluateString charId description}}{{/markdown}}</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -14,30 +14,44 @@ Template.containerDialog.events({
|
|||||||
instance.data.containerId,
|
instance.data.containerId,
|
||||||
"Containers", "Container and contents"
|
"Containers", "Container and contents"
|
||||||
);
|
);
|
||||||
GlobalUI.closeDetail();
|
popDialogStack();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.containerEdit.onRendered(function(){
|
|
||||||
updatePolymerInputs(this);
|
|
||||||
});
|
|
||||||
|
|
||||||
Template.containerEdit.events({
|
Template.containerEdit.events({
|
||||||
//TODO validate input (integer, non-negative, etc) for these inputs and give validation errors
|
//TODO validate input (integer, non-negative, etc) for these inputs and give validation errors
|
||||||
"change #containerNameInput": function(event){
|
"input #containerNameInput": function(event){
|
||||||
var name = Template.instance().find("#containerNameInput").value;
|
var name = Template.instance().find("#containerNameInput").value;
|
||||||
Containers.update(this._id, {$set: {name: name}});
|
Containers.update(this._id, {
|
||||||
|
$set: {name: name}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
trimStrings: false,
|
||||||
|
});
|
||||||
},
|
},
|
||||||
"change #weightInput, input #weightInput": function(event){
|
"change #weightInput, input #weightInput": function(event){
|
||||||
var weight = +Template.instance().find("#weightInput").value;
|
var weight = +Template.instance().find("#weightInput").value;
|
||||||
Containers.update(this._id, {$set: {weight: weight}});
|
Containers.update(this._id, {
|
||||||
|
$set: {weight: weight}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
});
|
||||||
},
|
},
|
||||||
"change #valueInput, input #valueInput": function(event){
|
"change #valueInput, input #valueInput": function(event){
|
||||||
var value = +Template.instance().find("#valueInput").value;
|
var value = +Template.instance().find("#valueInput").value;
|
||||||
Containers.update(this._id, {$set: {value: value}});
|
Containers.update(this._id, {
|
||||||
|
$set: {value: value}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
});
|
||||||
},
|
},
|
||||||
"change #containerDescriptionInput": function(event, instance){
|
"input #containerDescriptionInput": function(event, instance){
|
||||||
var description = instance.find("#containerDescriptionInput").value;
|
var description = instance.find("#containerDescriptionInput").value;
|
||||||
Containers.update(this._id, {$set: {description: description}});
|
Containers.update(this._id, {
|
||||||
|
$set: {description: description}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
trimStrings: false,
|
||||||
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,133 +1,163 @@
|
|||||||
<template name="inventory">
|
<template name="inventory">
|
||||||
<div fit>
|
<div id="inventory" class="animation-slider">
|
||||||
<div id="inventory" class="scroll-y" fit>
|
<div class="column-container">
|
||||||
<div class="column-container">
|
<!--Net Worth-->
|
||||||
<!--Net Worth-->
|
<div>
|
||||||
<paper-shadow class="card" layout horizontal>
|
<paper-material class="card">
|
||||||
<div class="indigo white-text subhead left">
|
<div class="white top layout horizontal center">
|
||||||
|
<div class="paper-font-subhead flex">
|
||||||
Net Worth
|
Net Worth
|
||||||
</div>
|
</div>
|
||||||
<div class="right" flex>
|
<div>
|
||||||
{{valueString netWorth}}
|
{{valueString netWorth}}
|
||||||
</div>
|
</div>
|
||||||
</paper-shadow>
|
</div>
|
||||||
<!--Weight Carried-->
|
</paper-material>
|
||||||
<paper-shadow class="card" layout horizontal>
|
</div>
|
||||||
<div class="green white-text subhead left">
|
<!--Weight Carried-->
|
||||||
|
<div>
|
||||||
|
<paper-material class="card">
|
||||||
|
<div class="top green white-text weightCarried layout horizontal center">
|
||||||
|
<div class="paper-font-subhead" flex>
|
||||||
Weight Carried
|
Weight Carried
|
||||||
</div>
|
</div>
|
||||||
<div class="right" flex>
|
<div>
|
||||||
{{round weightCarried}}lbs
|
{{round weightCarried}}lbs
|
||||||
</div>
|
</div>
|
||||||
</paper-shadow>
|
</div>
|
||||||
<!--Equipment-->
|
<div class="bottom green" style="padding: 0;">
|
||||||
<paper-shadow class="card equipmentContainer">
|
{{> carryCapacityBar}}
|
||||||
<div class="white top" layout horizontal center>
|
</div>
|
||||||
<div class="subhead" flex>
|
{{#if encumberedBuffs.count}}
|
||||||
Equipment
|
<div class="bottom list">
|
||||||
</div>
|
{{#each encumberedBuffs}}
|
||||||
<div class="caption" style="margin-right: 8px">
|
<div class="item-slot">
|
||||||
{{valueString equipmentValue}}
|
<div class="item buff layout horizontal center">
|
||||||
</div>
|
<div class="flex">
|
||||||
<div class="caption">
|
<iron-icon icon="work"
|
||||||
{{round equipmentWeight}}lbs
|
style="margin-right: 16px">
|
||||||
</div>
|
</iron-icon>
|
||||||
</div>
|
|
||||||
<div flex class="bottom list">
|
|
||||||
{{#if attuned.count}}
|
|
||||||
<div class="subhead">Attuned</div>
|
|
||||||
{{/if}}
|
|
||||||
{{#each attuned}}
|
|
||||||
{{>inventoryItem}}
|
|
||||||
{{/each}}
|
|
||||||
{{#if attuned.count}}
|
|
||||||
<div class="subhead">Equipment</div>
|
|
||||||
{{/if}}
|
|
||||||
{{#each equipment}}
|
|
||||||
{{>inventoryItem}}
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
</paper-shadow>
|
|
||||||
<!--Carried Items-->
|
|
||||||
<paper-shadow class="card carriedContainer">
|
|
||||||
<div class="white top" layout horizontal center>
|
|
||||||
<div class="subhead">
|
|
||||||
Carried
|
|
||||||
</div>
|
|
||||||
<div class="caption" style="margin-right: 8px">
|
|
||||||
{{valueString carriedValue}}
|
|
||||||
</div>
|
|
||||||
<div class="caption">
|
|
||||||
{{round carriedWeight}}lbs
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div flex class="bottom list">
|
|
||||||
{{#each carriedItems}}
|
|
||||||
{{>inventoryItem}}
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
</paper-shadow>
|
|
||||||
{{#each containers}}
|
|
||||||
<paper-shadow class="card itemContainer"
|
|
||||||
hero-id="main" {{detailHero}}>
|
|
||||||
<div class="top {{colorClass}}"
|
|
||||||
hero-id="toolbar" {{detailHero}}
|
|
||||||
layout horizontal center>
|
|
||||||
<div class="subhead" flex
|
|
||||||
hero-id="title" {{detailHero}}>
|
|
||||||
{{name}}
|
{{name}}
|
||||||
</div>
|
</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">
|
|
||||||
<paper-checkbox class="carriedCheckbox"
|
|
||||||
checked={{isCarried}}>
|
|
||||||
</paper-checkbox>
|
|
||||||
</core-tooltip>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="bottom list">
|
</div>
|
||||||
{{#each items ../_id _id}}
|
{{/each}}
|
||||||
{{>inventoryItem}}
|
</div>
|
||||||
{{/each}}
|
{{/if}}
|
||||||
</div>
|
</paper-material>
|
||||||
</paper-shadow>
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
</div>
|
||||||
<div class="fab-buffer"></div>
|
<!--Equipment-->
|
||||||
|
<div>
|
||||||
|
<paper-material class="card equipmentContainer">
|
||||||
|
<div class="white top layout horizontal center">
|
||||||
|
<div class="paper-font-subhead flex">
|
||||||
|
Equipment
|
||||||
|
</div>
|
||||||
|
<div class="paper-font-caption" style="margin-right: 8px">
|
||||||
|
{{valueString equipmentValue}}
|
||||||
|
</div>
|
||||||
|
<div class="paper-font-caption">
|
||||||
|
{{round equipmentWeight}}lbs
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div flex class="bottom list">
|
||||||
|
{{#if attuned.count}}
|
||||||
|
<div class="paper-font-subhead">Attuned</div>
|
||||||
|
{{/if}}
|
||||||
|
{{#each attuned}}
|
||||||
|
{{>inventoryItem}}
|
||||||
|
{{/each}}
|
||||||
|
{{#if attuned.count}}
|
||||||
|
<div class="paper-font-subhead">Equipment</div>
|
||||||
|
{{/if}}
|
||||||
|
{{#each equipment}}
|
||||||
|
{{>inventoryItem}}
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</paper-material>
|
||||||
|
</div>
|
||||||
|
<!--Carried Items-->
|
||||||
|
<div>
|
||||||
|
<paper-material class="card carriedContainer">
|
||||||
|
<div class="white top layout horizontal center">
|
||||||
|
<div class="paper-font-subhead flex">
|
||||||
|
Carried
|
||||||
|
</div>
|
||||||
|
<div class="paper-font-caption" style="margin-right: 8px">
|
||||||
|
{{valueString carriedValue}}
|
||||||
|
</div>
|
||||||
|
<div class="paper-font-caption">
|
||||||
|
{{round carriedWeight}}lbs
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div flex class="bottom list">
|
||||||
|
{{#each carriedItems}}
|
||||||
|
{{>inventoryItem}}
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</paper-material>
|
||||||
|
</div>
|
||||||
|
{{#each containers}}
|
||||||
|
<div>
|
||||||
|
<paper-material class="card itemContainer" data-id={{_id}}>
|
||||||
|
<div class="top {{colorClass}} layout horizontal center">
|
||||||
|
<div class="paper-font-subhead flex">
|
||||||
|
{{name}}
|
||||||
|
</div>
|
||||||
|
<div class="paper-font-caption" style="margin-right: 8px">
|
||||||
|
{{valueString totalValue}}
|
||||||
|
</div>
|
||||||
|
<div class="paper-font-caption" style="margin-right: 8px">
|
||||||
|
{{round totalWeight}}lbs
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<paper-checkbox class="carriedCheckbox"
|
||||||
|
disabled={{#unless canEditCharacter charId}}true{{/unless}}
|
||||||
|
checked={{isCarried}}>
|
||||||
|
</paper-checkbox>
|
||||||
|
<paper-tooltip position="left"> Container carried</paper-tooltip>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="bottom list">
|
||||||
|
{{#each items ../_id _id}}
|
||||||
|
{{>inventoryItem}}
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</paper-material>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
{{#if canEditCharacter _id}}
|
<div class="fab-buffer"></div>
|
||||||
{{#fabMenu}}
|
|
||||||
<core-tooltip label="New container" position="left">
|
|
||||||
<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>
|
||||||
|
{{#if canEditCharacter _id}}
|
||||||
|
{{#fabMenu}}
|
||||||
|
<div>
|
||||||
|
<paper-fab icon="work"
|
||||||
|
class="addContainer"
|
||||||
|
mini>
|
||||||
|
</paper-fab>
|
||||||
|
<paper-tooltip position="left"> New container </paper-tooltip>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<paper-fab icon="note-add"
|
||||||
|
class="addItem"
|
||||||
|
mini>
|
||||||
|
</paper-fab>
|
||||||
|
<paper-tooltip position="left"> New item </paper-tooltip>
|
||||||
|
</div>
|
||||||
|
{{/fabMenu}}
|
||||||
|
{{/if}}
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="inventoryItem">
|
<template name="inventoryItem">
|
||||||
<div class="item-slot">
|
<div class="item-slot">
|
||||||
<div class="item {{hidden}} inventoryItem"
|
<div class="item {{hidden}} inventoryItem layout horizontal center"
|
||||||
hero-id="main" {{detailHero}}
|
draggable={{canEditCharacter charId}}
|
||||||
layout horizontal center
|
data-id={{_id}}>
|
||||||
draggable="true">
|
<div class="itemName flex">
|
||||||
<div flex class="itemName">
|
|
||||||
{{#if ne1 quantity}}{{quantity}} {{/if}}{{pluralName}}
|
{{#if ne1 quantity}}{{quantity}} {{/if}}{{pluralName}}
|
||||||
</div>
|
</div>
|
||||||
{{#if settings.showIncrement}}
|
{{#if settings.showIncrement}}{{#if canEditCharacter charId}}
|
||||||
<div class="incrementButtons">
|
<div class="incrementButtons">
|
||||||
<paper-icon-button class="addItemQuantity"
|
<paper-icon-button class="addItemQuantity"
|
||||||
icon="add"
|
icon="add"
|
||||||
@@ -137,7 +167,7 @@
|
|||||||
icon="remove"
|
icon="remove"
|
||||||
style="margin-right: -8px"></paper-icon-button>
|
style="margin-right: -8px"></paper-icon-button>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -44,6 +44,12 @@ Template.inventory.helpers({
|
|||||||
).forEach(function(item){
|
).forEach(function(item){
|
||||||
worth += item.totalValue();
|
worth += item.totalValue();
|
||||||
});
|
});
|
||||||
|
Containers.find(
|
||||||
|
{charId: this._id},
|
||||||
|
{fields: {value : 1}}
|
||||||
|
).forEach(function(container) {
|
||||||
|
if (container.value) worth += container.value;
|
||||||
|
});
|
||||||
return worth;
|
return worth;
|
||||||
},
|
},
|
||||||
weightCarried: function(){
|
weightCarried: function(){
|
||||||
@@ -61,6 +67,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(
|
||||||
@@ -73,9 +91,11 @@ Template.inventory.helpers({
|
|||||||
},
|
},
|
||||||
equipmentWeight: function(){
|
equipmentWeight: function(){
|
||||||
var weight = 0;
|
var weight = 0;
|
||||||
Items.find({charId: this._id, enabled: true},
|
Items.find({
|
||||||
{fields: {weight : 1, quantity: 1}}
|
charId: this._id, enabled: true,
|
||||||
).forEach(function(item){
|
}, {
|
||||||
|
fields: {weight : 1, quantity: 1}
|
||||||
|
}).forEach(function(item){
|
||||||
weight += item.totalWeight();
|
weight += item.totalWeight();
|
||||||
});
|
});
|
||||||
return weight;
|
return weight;
|
||||||
@@ -103,70 +123,88 @@ Template.inventory.helpers({
|
|||||||
});
|
});
|
||||||
|
|
||||||
Template.inventory.events({
|
Template.inventory.events({
|
||||||
"tap .addItem": function(event){
|
"click .addItem": function(event, instance){
|
||||||
var charId = this._id;
|
var charId = this._id;
|
||||||
Items.insert({
|
var itemId = Items.insert({
|
||||||
charId: charId,
|
charId: charId,
|
||||||
parent:{
|
parent:{
|
||||||
id: charId,
|
id: charId,
|
||||||
collection: "Characters",
|
collection: "Characters",
|
||||||
},
|
},
|
||||||
}, function(err, itemId){
|
});
|
||||||
if (err) throw err;
|
pushDialogStack({
|
||||||
GlobalUI.setDetail({
|
template: "itemDialog",
|
||||||
template: "itemDialog",
|
data: {itemId: itemId, charId: charId, startEditing: true},
|
||||||
data: {itemId: itemId, charId: charId, startEditing: true},
|
element: event.currentTarget,
|
||||||
heroId: itemId,
|
returnElement: () => $(`[data-id='${itemId}']`).get(0),
|
||||||
});
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap .addContainer": function(event){
|
"click .addContainer": function(event, instance){
|
||||||
var containerId = Containers.insert({
|
var containerId = Containers.insert({
|
||||||
name: "New Container",
|
name: "New Container",
|
||||||
isCarried: true,
|
isCarried: true,
|
||||||
charId: this._id,
|
charId: this._id,
|
||||||
});
|
});
|
||||||
GlobalUI.setDetail({
|
pushDialogStack({
|
||||||
template: "containerDialog",
|
template: "containerDialog",
|
||||||
data: {
|
data: {
|
||||||
containerId: containerId,
|
containerId: containerId,
|
||||||
charId: this.charId,
|
charId: this.charId,
|
||||||
startEditing: true,
|
startEditing: true,
|
||||||
},
|
},
|
||||||
heroId: containerId,
|
element: event.currentTarget,
|
||||||
|
returnElement: instance.find(`.itemContainer[data-id='${containerId}']`),
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap .inventoryItem": function(event){
|
"click .weightCarried": function(event, instance) {
|
||||||
|
var charId = this._id;
|
||||||
|
pushDialogStack({
|
||||||
|
template: "carryDialog",
|
||||||
|
data: {charId: charId, color: "green"},
|
||||||
|
element: event.currentTarget.parentElement,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
"click .buff": function(event, instance){
|
||||||
|
var buffId = this._id;
|
||||||
|
var charId = Template.parentData()._id;
|
||||||
|
pushDialogStack({
|
||||||
|
template: "buffDialog",
|
||||||
|
data: {buffId: buffId, charId: charId},
|
||||||
|
element: event.currentTarget,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
"click .inventoryItem": function(event, instance){
|
||||||
var itemId = this._id;
|
var itemId = this._id;
|
||||||
var charId = Template.parentData()._id;
|
var charId = Template.parentData()._id;
|
||||||
GlobalUI.setDetail({
|
pushDialogStack({
|
||||||
template: "itemDialog",
|
template: "itemDialog",
|
||||||
data: {itemId: itemId, charId: charId},
|
data: {itemId: itemId, charId: charId},
|
||||||
heroId: itemId,
|
element: event.currentTarget,
|
||||||
|
returnElement: () => $(`[data-id='${itemId}']`).get(0),
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap .incrementButtons": function(event) {
|
"click .incrementButtons": function(event, instance) {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
},
|
},
|
||||||
"tap .addItemQuantity": function(event) {
|
"click .addItemQuantity": function(event, instance) {
|
||||||
var itemId = this._id;
|
var itemId = this._id;
|
||||||
Items.update(itemId, {$set: {quantity: this.quantity + 1}});
|
Items.update(itemId, {$set: {quantity: this.quantity + 1}});
|
||||||
},
|
},
|
||||||
"tap .subItemQuantity": function(event) {
|
"click .subItemQuantity": function(event, instance) {
|
||||||
var itemId = this._id;
|
var itemId = this._id;
|
||||||
Items.update(itemId, {$set: {quantity: this.quantity - 1}});
|
Items.update(itemId, {$set: {quantity: this.quantity - 1}});
|
||||||
},
|
},
|
||||||
"tap .itemContainer .top": function(event){
|
"click .itemContainer .top": function(event, instance){
|
||||||
GlobalUI.setDetail({
|
pushDialogStack({
|
||||||
template: "containerDialog",
|
template: "containerDialog",
|
||||||
data: {containerId: this._id, charId: this.charId},
|
data: {containerId: this._id, charId: this.charId},
|
||||||
heroId: this._id,
|
element: event.currentTarget.parentElement,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap .carriedCheckbox": function(event){
|
"click .carriedCheckbox": function(event, instance){
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
},
|
},
|
||||||
"change .carriedCheckbox": function(event){
|
"change .carriedCheckbox": function(event, instance){
|
||||||
var carried;
|
var carried;
|
||||||
if (this.isCarried) carried = false;
|
if (this.isCarried) carried = false;
|
||||||
else carried = true;
|
else carried = true;
|
||||||
@@ -222,7 +260,7 @@ Template.layout.events({
|
|||||||
var itemId = event.originalEvent.dataTransfer.getData("dicecloud-id/items");
|
var itemId = event.originalEvent.dataTransfer.getData("dicecloud-id/items");
|
||||||
if (event.ctrlKey){
|
if (event.ctrlKey){
|
||||||
//split the stack to the container
|
//split the stack to the container
|
||||||
GlobalUI.showDialog({
|
pushDialogStack({
|
||||||
template: "splitStackDialog",
|
template: "splitStackDialog",
|
||||||
data: {
|
data: {
|
||||||
id: itemId,
|
id: itemId,
|
||||||
@@ -245,12 +283,11 @@ Template.layout.events({
|
|||||||
var itemId = event.originalEvent.dataTransfer.getData("dicecloud-id/items");
|
var itemId = event.originalEvent.dataTransfer.getData("dicecloud-id/items");
|
||||||
if (event.ctrlKey){
|
if (event.ctrlKey){
|
||||||
//split the stack to the container
|
//split the stack to the container
|
||||||
GlobalUI.showDialog({
|
pushDialogStack({
|
||||||
template: "splitStackDialog",
|
template: "splitStackDialog",
|
||||||
data: {
|
data: {
|
||||||
id: itemId,
|
id: itemId,
|
||||||
parentCollection: "Characters",
|
parentCollection: "Characters",
|
||||||
parentId: this._id,
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@@ -263,7 +300,7 @@ Template.layout.events({
|
|||||||
var itemId = event.originalEvent.dataTransfer.getData("dicecloud-id/items");
|
var itemId = event.originalEvent.dataTransfer.getData("dicecloud-id/items");
|
||||||
if (event.ctrlKey){
|
if (event.ctrlKey){
|
||||||
//split the stack to the container
|
//split the stack to the container
|
||||||
GlobalUI.showDialog({
|
pushDialogStack({
|
||||||
template: "splitStackDialog",
|
template: "splitStackDialog",
|
||||||
data: {
|
data: {
|
||||||
id: itemId,
|
id: itemId,
|
||||||
|
|||||||
@@ -9,91 +9,64 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="itemDetails">
|
<template name="itemDetails">
|
||||||
<div layout horizontal wrap center justified class="headline">
|
<div class="paper-font-headline layout horizontal wrap center justified">
|
||||||
{{#if weight}}<div class="sideMargin">{{round 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 class="paper-font-caption layout horizontal wrap">
|
||||||
{{#if enabled}}<div class="vertMargin" style="margin-right: 16px">Equipped</div>{{/if}}
|
{{#if enabled}}<div class="vertMargin" style="margin-right: 16px">Equipped</div>{{/if}}
|
||||||
{{#if requiresAttunement}}<div class="vertMargin">Requires Attunement</div>{{/if}}
|
{{#if requiresAttunement}}<div class="vertMargin">Requires Attunement</div>{{/if}}
|
||||||
</div>
|
</div>
|
||||||
{{#if description}}
|
{{#if description}}
|
||||||
<hr class="vertMargin">
|
<hr style="margin: 16px 0 16px 0;">
|
||||||
<div class="pre-wrap">{{evaluateString charId description}}</div>
|
<div>{{#markdown}}{{evaluateString charId description}}{{/markdown}}</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{> effectsViewList charId=charId parentId=_id}}
|
{{> effectsViewList charId=charId parentId=_id}}
|
||||||
{{> attacksViewList charId=charId parentId=_id}}
|
{{> attacksViewList charId=charId parentId=_id}}
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<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" value={{name}}></paper-input>
|
||||||
<div layout horizontal wrap>
|
<div class="layout horizontal center wrap">
|
||||||
<paper-input-decorator label="Quantity"
|
<paper-input id="quantityInput" type="number" label="Quantity" style="width: 80px" value={{quantity}}>
|
||||||
floatinglabel
|
</paper-input>
|
||||||
style="width: 80px">
|
|
||||||
<input id="quantityInput"
|
|
||||||
type="number"
|
|
||||||
value={{quantity}}>
|
|
||||||
</paper-input-decorator>
|
|
||||||
{{# if ne1 quantity}}
|
{{# if ne1 quantity}}
|
||||||
<paper-input flex id="itemPluralInput"
|
<paper-input class="flex" id="itemPluralInput" label="Plural Name" value={{plural}} style="flex-basis: 182px;">
|
||||||
label="Plural Name"
|
</paper-input>
|
||||||
floatinglabel
|
{{else}}
|
||||||
value={{plural}}></paper-input>
|
<div class="flex" style="flex-basis: 182px;">
|
||||||
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
<paper-checkbox id="incrementCheckbox" checked={{settings.showIncrement}}>
|
||||||
<div center horizontal layout>
|
Show increment buttons
|
||||||
<div class="padded">Show increment buttons</div>
|
|
||||||
<paper-checkbox id="incrementCheckbox"
|
|
||||||
checked={{settings.showIncrement}}>
|
|
||||||
</paper-checkbox>
|
</paper-checkbox>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr class="vertMargin">
|
<div class="layout horizontal center wrap justified" style="margin-top: 16px;">
|
||||||
|
{{> containerDropdown}}
|
||||||
<div layout horizontal wrap justified>
|
<paper-toggle-button id="equippedInput" checked={{enabled}}>
|
||||||
<div center horizontal layout>
|
Equipped
|
||||||
<div class="padded">Container</div>
|
</paper-toggle-button>
|
||||||
{{> containerDropdown}}
|
<paper-checkbox id="attunementCheckbox" checked={{requiresAttunement}}>
|
||||||
</div>
|
Requires Attunement
|
||||||
<div center horizontal layout>
|
</paper-checkbox>
|
||||||
<div class="padded">Equipped</div>
|
|
||||||
<paper-toggle-button id="equippedInput"
|
|
||||||
checked={{enabled}}
|
|
||||||
role="button"
|
|
||||||
aria-pressed="false"
|
|
||||||
tabindex="0"
|
|
||||||
touch-action="pan-y">
|
|
||||||
</paper-toggle-button>
|
|
||||||
</div>
|
|
||||||
<div center horizontal layout>
|
|
||||||
<div class="padded">Requires Attunement</div>
|
|
||||||
<paper-checkbox id="attunementCheckbox"
|
|
||||||
checked={{requiresAttunement}}>
|
|
||||||
</paper-checkbox>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr class="vertMargin">
|
<div class="layout horizontal around-justified" style="margin-top: 16px;">
|
||||||
|
<paper-input id="weightInput" type="number" value={{weight}} label="Weight Each (lbs)">
|
||||||
<div layout horizontal around-justified>
|
</paper-input>
|
||||||
<paper-input-decorator label="Weight Each (lbs)" floatinglabel>
|
|
||||||
<input id="weightInput" type="number" value={{weight}}>
|
|
||||||
</paper-input-decorator>
|
|
||||||
<!--Value-->
|
<!--Value-->
|
||||||
<paper-input-decorator label="Value Each (GP)" floatinglabel>
|
<paper-input id="valueInput" type="number" value={{value}} label="Value Each (GP)">
|
||||||
<input id="valueInput" type="number" value={{value}}>
|
</paper-input>
|
||||||
</paper-input-decorator>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr class="vertMargin">
|
|
||||||
|
|
||||||
<!--Description-->
|
<!--Description-->
|
||||||
<paper-input-decorator label="Description" floatinglabel layout vertical>
|
<paper-textarea id="itemDescriptionInput" label="Description" value={{description}}>
|
||||||
<paper-autogrow-textarea>
|
<div suffix>
|
||||||
<textarea id="itemDescriptionInput" placeholder aria-label="Description" value={{description}}></textarea>
|
<paper-tooltip position="left" animation-delay="0">This field accepts formulae in {curly brackets}</paper-tooltip>
|
||||||
</paper-autogrow-textarea>
|
<iron-icon icon="dicecloud:code-braces"></iron-icon>
|
||||||
</paper-input-decorator>
|
</div>
|
||||||
|
</paper-textarea>
|
||||||
<!--Effects-->
|
<!--Effects-->
|
||||||
{{> effectsEditList parentId=_id parentCollection="Items" charId=charId enabled=equipped name=name}}
|
{{> effectsEditList parentId=_id parentCollection="Items" charId=charId enabled=equipped name=name}}
|
||||||
<!--Attacks-->
|
<!--Attacks-->
|
||||||
@@ -101,13 +74,11 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="containerDropdown">
|
<template name="containerDropdown">
|
||||||
<paper-dropdown-menu id="containerDropDown" label="Container">
|
<paper-dropdown-menu label="Container">
|
||||||
<paper-dropdown layered class="dropdown">
|
<dicecloud-selector class="dropdown-content" id="containerDropDown" selected={{parent.id}}>
|
||||||
<core-menu class="menu" selected={{parent.id}}>
|
{{#each containers}}
|
||||||
{{#each containers}}
|
<paper-item name={{_id}} class="containerMenuItem">{{name}}</paper-item>
|
||||||
<paper-item name={{_id}} class="containerMenuItem">{{name}}</paper-item>
|
{{/each}}
|
||||||
{{/each}}
|
</dicecloud-selector>
|
||||||
</core-menu>
|
|
||||||
</paper-dropdown>
|
|
||||||
</paper-dropdown-menu>
|
</paper-dropdown-menu>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -27,60 +27,95 @@ Template.itemDialog.helpers({
|
|||||||
});
|
});
|
||||||
|
|
||||||
Template.itemDialog.events({
|
Template.itemDialog.events({
|
||||||
"tap #editButton": function(event, instance){
|
"click #editButton": function(event, instance){
|
||||||
instance.editing.set(true);
|
instance.editing.set(true);
|
||||||
},
|
},
|
||||||
"tap #doneEditingButton": function(event, instance){
|
"click #doneEditingButton": function(event, instance){
|
||||||
instance.editing.set(false);
|
instance.editing.set(false);
|
||||||
},
|
},
|
||||||
"color-change": function(event, instance){
|
"color-change": function(event, instance){
|
||||||
Items.update(instance.data.itemId, {$set: {color: event.color}});
|
Items.update(instance.data.itemId, {$set: {color: event.color}});
|
||||||
},
|
},
|
||||||
"tap #deleteButton": function(event, instance){
|
"click #deleteButton": function(event, instance){
|
||||||
Items.softRemoveNode(instance.data.itemId);
|
Items.softRemoveNode(instance.data.itemId);
|
||||||
GlobalUI.deletedToast(instance.data.itemId, "Items", "Item");
|
GlobalUI.deletedToast(instance.data.itemId, "Items", "Item");
|
||||||
GlobalUI.closeDetail();
|
popDialogStack();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.itemEdit.onRendered(function(){
|
|
||||||
updatePolymerInputs(this);
|
|
||||||
});
|
|
||||||
|
|
||||||
Template.itemEdit.helpers({
|
Template.itemEdit.helpers({
|
||||||
ne1: function(num){
|
ne1: function(num){
|
||||||
return num != 1;
|
return num != 1;
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const debounce = (f) => _.debounce(f, 200);
|
||||||
|
|
||||||
Template.itemEdit.events({
|
Template.itemEdit.events({
|
||||||
//TODO validate input (integer, non-negative, etc) for these inputs and give validation errors
|
//TODO validate input (integer, non-negative, etc) for these inputs and give validation errors
|
||||||
"change #itemNameInput": function(event){
|
"input #itemNameInput": debounce(function(event, instance){
|
||||||
var name = Template.instance().find("#itemNameInput").value;
|
const input = event.currentTarget;
|
||||||
Items.update(this._id, {$set: {name: name}});
|
var name = input.value;
|
||||||
},
|
if (!name){
|
||||||
"change #itemPluralInput": function(event){
|
input.invalid = true;
|
||||||
var plural = Template.instance().find("#itemPluralInput").value;
|
input.errorMessage = "Name is required";
|
||||||
Items.update(this._id, {$set: {plural: plural}});
|
} else {
|
||||||
},
|
input.invalid = false;
|
||||||
"change #quantityInput": function(event){
|
Items.update(this._id, {
|
||||||
var quantity = +Template.instance().find("#quantityInput").value;
|
$set: {name: name}
|
||||||
Items.update(this._id, {$set: {quantity: quantity}});
|
}, {
|
||||||
},
|
removeEmptyStrings: false,
|
||||||
"change #weightInput": function(event){
|
trimStrings: false,
|
||||||
var weight = +Template.instance().find("#weightInput").value;
|
});
|
||||||
Items.update(this._id, {$set: {weight: weight}});
|
}
|
||||||
},
|
}),
|
||||||
"change #valueInput": function(event){
|
"input #itemPluralInput": debounce(function(event, instance){
|
||||||
var value = +Template.instance().find("#valueInput").value;
|
var plural = event.currentTarget.value;
|
||||||
Items.update(this._id, {$set: {value: value}});
|
Items.update(this._id, {
|
||||||
},
|
$set: {plural: plural}
|
||||||
"change #itemDescriptionInput": function(event){
|
}, {
|
||||||
var description = Template.instance().find("#itemDescriptionInput").value;
|
removeEmptyStrings: false,
|
||||||
Items.update(this._id, {$set: {description: description}});
|
trimStrings: false,
|
||||||
},
|
});
|
||||||
|
}),
|
||||||
|
"input #quantityInput": debounce(function(event, instance){
|
||||||
|
var quantity = +event.currentTarget.value;
|
||||||
|
Items.update(this._id, {
|
||||||
|
$set: {quantity: quantity}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
trimStrings: false,
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
"input #weightInput": debounce(function(event, instance){
|
||||||
|
var weight = +event.currentTarget.value;
|
||||||
|
Items.update(this._id, {
|
||||||
|
$set: {weight: weight}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
trimStrings: false,
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
"input #valueInput": debounce(function(event, instance){
|
||||||
|
var value = +event.currentTarget.value;
|
||||||
|
Items.update(this._id, {
|
||||||
|
$set: {value: value}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
trimStrings: false,
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
"input #itemDescriptionInput": debounce(function(event, instance){
|
||||||
|
var description = event.currentTarget.value;
|
||||||
|
Items.update(this._id, {
|
||||||
|
$set: {description: description}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
trimStrings: false,
|
||||||
|
});
|
||||||
|
}),
|
||||||
"change #equippedInput": function(event){
|
"change #equippedInput": function(event){
|
||||||
var equipped = Template.instance().find("#equippedInput").checked;
|
var equipped = event.currentTarget.checked;
|
||||||
if (equipped){
|
if (equipped){
|
||||||
Meteor.call("equipItem", this._id, this.charId);
|
Meteor.call("equipItem", this._id, this.charId);
|
||||||
} else {
|
} else {
|
||||||
@@ -104,9 +139,8 @@ Template.containerDropdown.helpers({
|
|||||||
});
|
});
|
||||||
|
|
||||||
Template.containerDropdown.events({
|
Template.containerDropdown.events({
|
||||||
"core-select #containerDropDown": function(event){
|
"iron-select #containerDropDown": function(event){
|
||||||
var detail = event.originalEvent.detail;
|
var detail = event.originalEvent.detail;
|
||||||
if (!detail.isSelected) return;
|
|
||||||
var containerId = detail.item.getAttribute("name");
|
var containerId = detail.item.getAttribute("name");
|
||||||
Meteor.call("moveItemToContainer", Template.currentData()._id, containerId);
|
Meteor.call("moveItemToContainer", Template.currentData()._id, containerId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
html /deep/ .moveItemDialog paper-tabs::shadow #selectionBar {
|
||||||
|
background-color: #D50000;
|
||||||
|
}
|
||||||
|
|
||||||
|
html /deep/ .moveItemDialog paper-tab::shadow #ink {
|
||||||
|
color: #D50000;
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
<template name="moveItemDialog">
|
||||||
|
<div class="moveItemDialog">
|
||||||
|
<paper-tabs selected="{{selectedTab}}">
|
||||||
|
<paper-tab name="containers"
|
||||||
|
class="clickable">
|
||||||
|
Containers
|
||||||
|
</paper-tab>
|
||||||
|
<paper-tab name="characters"
|
||||||
|
class="clickable">
|
||||||
|
Characters
|
||||||
|
</paper-tab>
|
||||||
|
</paper-tabs>
|
||||||
|
<core-animated-pages selected="{{selectedTab}}"
|
||||||
|
transitions="slide-from-right"
|
||||||
|
style="width: 250px;
|
||||||
|
height: 200px;
|
||||||
|
overflow-y: auto;
|
||||||
|
overflow-x: hidden;">
|
||||||
|
<section name="containers">
|
||||||
|
<core-menu id="containerMenu" style="margin: 0;">
|
||||||
|
{{#each containers}}
|
||||||
|
<paper-item name={{_id}}
|
||||||
|
layout horizontal center>
|
||||||
|
<iron-icon icon="image:brightness-1"
|
||||||
|
style="color: {{hexColor color}};
|
||||||
|
margin-right: 16px;">
|
||||||
|
</iron-icon>
|
||||||
|
<div>{{name}}</div>
|
||||||
|
</paper-item>
|
||||||
|
{{/each}}
|
||||||
|
</core-menu>
|
||||||
|
</section>
|
||||||
|
<section name="characters">
|
||||||
|
<core-menu id="characterMenu" style="margin: 0;">
|
||||||
|
{{#each characters}}
|
||||||
|
<paper-item name={{_id}}
|
||||||
|
layout horizontal center>
|
||||||
|
<div class="item small">
|
||||||
|
{{name}}
|
||||||
|
</div>
|
||||||
|
</paper-item>
|
||||||
|
{{/each}}
|
||||||
|
</core-menu>
|
||||||
|
</section>
|
||||||
|
</core-animated-pages>
|
||||||
|
</div>
|
||||||
|
<paper-button id="cancelButton" affirmative> Cancel </paper-button>
|
||||||
|
<paper-button id="moveButton" affirmative> Move </paper-button>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
Template.moveItemDialog.onCreated(function() {
|
||||||
|
Session.setDefault("moveItemDialogTab", "containers");
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.moveItemDialog.helpers({
|
||||||
|
selectedTab: function() {
|
||||||
|
return Session.get("moveItemDialogTab");
|
||||||
|
},
|
||||||
|
characters: function() {
|
||||||
|
var userId = Meteor.userId();
|
||||||
|
return Characters.find(
|
||||||
|
{
|
||||||
|
$or: [
|
||||||
|
{readers: userId},
|
||||||
|
{writers: userId},
|
||||||
|
{owner: userId},
|
||||||
|
],
|
||||||
|
_id: {$ne: this.charId},
|
||||||
|
},
|
||||||
|
{fields: {name: 1}}
|
||||||
|
);
|
||||||
|
},
|
||||||
|
containers: function(){
|
||||||
|
return Containers.find(
|
||||||
|
{
|
||||||
|
charId: this.charId,
|
||||||
|
_id: {$ne: this.containerId},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fields: {color: 1, name: 1},
|
||||||
|
sort: {color: 1, name: 1},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.moveItemDialog.events({
|
||||||
|
"tap paper-tab": function(event) {
|
||||||
|
Session.set("moveItemDialogTab", event.currentTarget.getAttribute("name"));
|
||||||
|
},
|
||||||
|
"tap #moveButton": function(event, instance) {
|
||||||
|
var tab = Session.get("moveItemDialogTab");
|
||||||
|
if (tab === "containers"){
|
||||||
|
var containerId = instance.find("#containerMenu").selected;
|
||||||
|
if (!containerId) throw "no menu selection";
|
||||||
|
Meteor.call("moveItemToContainer", this.itemId, containerId);
|
||||||
|
} else if (tab === "characters"){
|
||||||
|
var characterId = instance.find("#characterMenu").selected;
|
||||||
|
if (!characterId) throw "no menu selection";
|
||||||
|
Meteor.call("moveItemToCharacter", this.itemId, characterId);
|
||||||
|
} else {
|
||||||
|
throw "Move item dialog tab is not set to containers or character," +
|
||||||
|
" it is set to " + tab;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -1,13 +1,29 @@
|
|||||||
<!-- data needs to include id of item, parentCollection, parentId -->
|
<!-- data needs to include id of item, parentCollection, parentId -->
|
||||||
<template name="splitStackDialog">
|
<template name="splitStackDialog">
|
||||||
<div style="width: 300px; height: 110px;">
|
<div class="fit layout vertical">
|
||||||
<paper-input-decorator label="Quantity" floatinglabel>
|
<app-header-layout has-scrolling-region class="feedback flex">
|
||||||
<input autoFocus id="quantityInput" type="number" value={{quantity}}>
|
<app-header fixed effects="waterfall">
|
||||||
</paper-input-decorator>
|
<app-toolbar>
|
||||||
<paper-button id="oneButton"> One </paper-button>
|
Split Stack
|
||||||
<paper-button id="halfButton"> Half </paper-button>
|
</app-toolbar>
|
||||||
<paper-button id="allButton"> All </paper-button>
|
</app-header>
|
||||||
|
<div class="form flex">
|
||||||
|
<paper-input autoFocus label="Quantity" id="quantityInput" type="number" value={{quantity}}>
|
||||||
|
</paper-input>
|
||||||
|
<div class="layout horizontal justified">
|
||||||
|
<paper-button id="oneButton"> One </paper-button>
|
||||||
|
<paper-button id="halfButton"> Half </paper-button>
|
||||||
|
<paper-button id="allButton"> All </paper-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</app-header-layout>
|
||||||
|
<div class="buttons layout horizontal end-justified">
|
||||||
|
<paper-button id="cancelButton">
|
||||||
|
Cancel
|
||||||
|
</paper-button>
|
||||||
|
<paper-button id="moveButton">
|
||||||
|
move
|
||||||
|
</paper-button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<paper-button id="cancelButton" affirmative> Cancel </paper-button>
|
|
||||||
<paper-button id="moveButton" affirmative> Move </paper-button>
|
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
Template.splitStackDialog.onRendered(function(){
|
||||||
|
this.find("#quantityInput").focus();
|
||||||
|
});
|
||||||
|
|
||||||
Template.splitStackDialog.helpers({
|
Template.splitStackDialog.helpers({
|
||||||
quantity: function(){
|
quantity: function(){
|
||||||
var item = Items.findOne(this.id);
|
var item = Items.findOne(this.id);
|
||||||
@@ -6,22 +10,26 @@ Template.splitStackDialog.helpers({
|
|||||||
});
|
});
|
||||||
|
|
||||||
Template.splitStackDialog.events({
|
Template.splitStackDialog.events({
|
||||||
"tap #moveButton": function(event, instance){
|
"click #moveButton": function(event, instance){
|
||||||
Meteor.call(
|
Meteor.call(
|
||||||
"splitItemToParent",
|
"splitItemToParent",
|
||||||
this.id,
|
this.id,
|
||||||
+instance.find("#quantityInput").value,
|
+instance.find("#quantityInput").value,
|
||||||
{collection: this.parentCollection , id: this.parentId}
|
{collection: this.parentCollection , id: this.parentId}
|
||||||
);
|
);
|
||||||
|
popDialogStack();
|
||||||
},
|
},
|
||||||
"tap #oneButton":function(event, instance){
|
"click #cancelButton": function(event, instance){
|
||||||
|
popDialogStack();
|
||||||
|
},
|
||||||
|
"click #oneButton":function(event, instance){
|
||||||
instance.find("#quantityInput").value = 1;
|
instance.find("#quantityInput").value = 1;
|
||||||
},
|
},
|
||||||
"tap #halfButton":function(event, instance){
|
"click #halfButton":function(event, instance){
|
||||||
var val = Math.round(Items.findOne(this.id).quantity / 2);
|
var val = Math.round(Items.findOne(this.id).quantity / 2);
|
||||||
instance.find("#quantityInput").value = val;
|
instance.find("#quantityInput").value = val;
|
||||||
},
|
},
|
||||||
"tap #allButton":function(event, instance){
|
"click #allButton":function(event, instance){
|
||||||
instance.find("#quantityInput").value = Items.findOne(this.id).quantity;
|
instance.find("#quantityInput").value = Items.findOne(this.id).quantity;
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<template name="classDialog">
|
<template name="classDialog">
|
||||||
{{#with class}}
|
{{#with class}}
|
||||||
{{#baseDialog title=name class=colorClass startEditing=../startEditing}}
|
{{#baseDialog title=name class=colorClass startEditing=../startEditing}}
|
||||||
<div layout vertical center>
|
<div class="layout vertical center">
|
||||||
<div class="display2">
|
<div class="paper-font-display2">
|
||||||
{{level}}
|
{{level}}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
@@ -14,12 +14,12 @@
|
|||||||
{{> proficiencyViewList charId=charId parentId=_id}}
|
{{> proficiencyViewList charId=charId parentId=_id}}
|
||||||
{{else}}
|
{{else}}
|
||||||
<!--Name-->
|
<!--Name-->
|
||||||
<paper-input id="classNameInput" label="Class Name" floatinglabel value={{name}}></paper-input>
|
<paper-input id="classNameInput" label="Class Name" value={{name}}></paper-input>
|
||||||
<!--Level-->
|
<!--Level-->
|
||||||
<paper-input id="levelValueInput" label="Level" floatinglabel value={{level}}></paper-input>
|
<paper-input id="levelValueInput" label="Level" value={{level}}></paper-input>
|
||||||
<!--Effects-->
|
<!--Effects-->
|
||||||
{{> effectsEditList parentId=_id parentCollection="Classes" charId=charId}}
|
{{> effectsEditList parentId=_id parentCollection="Classes" charId=charId}}
|
||||||
{{> proficiencyEditList parentId=_id parentCollection="Classes" charId=charId}}
|
{{> proficiencyEditList parentId=_id parentCollection="Classes" charId=charId}}
|
||||||
{{/baseDialog}}
|
{{/baseDialog}}
|
||||||
{{/with}}
|
{{/with}}
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,28 +1,35 @@
|
|||||||
Template.classDialog.onRendered(function(){
|
const debounce = (f) => _.debounce(f, 300);
|
||||||
updatePolymerInputs(this);
|
|
||||||
});
|
|
||||||
|
|
||||||
Template.classDialog.events({
|
|
||||||
"color-change": function(event, instance){
|
|
||||||
Classes.update(instance.data.classId, {$set: {color: event.color}});
|
|
||||||
},
|
|
||||||
"tap #deleteButton": function(event, instance){
|
|
||||||
Classes.softRemoveNode(instance.data.classId);
|
|
||||||
GlobalUI.deletedToast(instance.data.classId, "Classes", "Class");
|
|
||||||
GlobalUI.closeDetail();
|
|
||||||
},
|
|
||||||
"change #classNameInput": function(event){
|
|
||||||
var value = event.currentTarget.value;
|
|
||||||
Classes.update(this._id, {$set: {name: value}});
|
|
||||||
},
|
|
||||||
"change #levelValueInput": function(event){
|
|
||||||
var value = event.currentTarget.value;
|
|
||||||
Classes.update(this._id, {$set: {level: value}});
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
Template.classDialog.helpers({
|
Template.classDialog.helpers({
|
||||||
class: function(){
|
class: function(){
|
||||||
return Classes.findOne(this.classId);
|
return Classes.findOne(this.classId);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Template.classDialog.events({
|
||||||
|
"color-change": function(event, instance){
|
||||||
|
Classes.update(instance.data.classId, {$set: {color: event.color}});
|
||||||
|
},
|
||||||
|
"click #deleteButton": function(event, instance){
|
||||||
|
Classes.softRemoveNode(instance.data.classId);
|
||||||
|
GlobalUI.deletedToast(instance.data.classId, "Classes", "Class");
|
||||||
|
popDialogStack();
|
||||||
|
},
|
||||||
|
"input #classNameInput, change #classNameInput": debounce(function(event){
|
||||||
|
var value = event.currentTarget.value;
|
||||||
|
Classes.update(this._id, {
|
||||||
|
$set: {name: value}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
trimStrings: false,
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
"input #levelValueInput, change #levelValueInput": debounce(function(event){
|
||||||
|
var value = event.currentTarget.value;
|
||||||
|
Classes.update(this._id, {
|
||||||
|
$set: {level: value}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,28 +1,26 @@
|
|||||||
<template name="experienceDialog">
|
<template name="experienceDialog">
|
||||||
{{#with experience}}
|
{{#with experience}}
|
||||||
{{#baseDialog title=name class=color hideColor="true" startEditing=../startEditing}}
|
{{#baseDialog title=name class=color hideColor="true" startEditing=../startEditing}}
|
||||||
<div horizontal layout center-justified class= "display2">
|
<div class="horizontal layout center-justified paper-font-display2">
|
||||||
{{value}}
|
{{value}}
|
||||||
</div>
|
</div>
|
||||||
{{#if description}}
|
{{#if description}}
|
||||||
<hr class="vertMargin">
|
<hr class="vertMargin">
|
||||||
<div class="pre-wrap">{{description}}</div>
|
<div>{{#markdown}}{{description}}{{/markdown}}</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{else}}
|
{{else}}
|
||||||
<div horizontal layout>
|
{{> experienceEdit}}
|
||||||
<!--Name-->
|
|
||||||
<paper-input id="experienceNameInput" label="Name" floatinglabel value={{name}} flex></paper-input>
|
|
||||||
<!--Value-->
|
|
||||||
<paper-input-decorator label="Value" floatinglabel>
|
|
||||||
<input id="valueInput" type="number" value={{value}}>
|
|
||||||
</paper-input-decorator>
|
|
||||||
</div>
|
|
||||||
<!--Description-->
|
|
||||||
<paper-input-decorator label="Description" floatinglabel layout vertical>
|
|
||||||
<paper-autogrow-textarea>
|
|
||||||
<textarea id="experienceDescriptionInput" placeholder value={{description}}></textarea>
|
|
||||||
</paper-autogrow-textarea>
|
|
||||||
</paper-input-decorator>
|
|
||||||
{{/baseDialog}}
|
{{/baseDialog}}
|
||||||
{{/with}}
|
{{/with}}
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<template name="experienceEdit">
|
||||||
|
<div class="horizontal layout">
|
||||||
|
<!--Name-->
|
||||||
|
<paper-input id="experienceNameInput" label="Name" value={{name}} class="flex"></paper-input>
|
||||||
|
<!--Value-->
|
||||||
|
<paper-input id="valueInput" type="number" value={{value}} label="Value"></paper-input>
|
||||||
|
</div>
|
||||||
|
<!--Description-->
|
||||||
|
<paper-textarea id="experienceDescriptionInput" label="Description" value={{description}}></paper-textarea>
|
||||||
|
</template>
|
||||||
|
|||||||
@@ -16,19 +16,40 @@ Template.experienceDialog.events({
|
|||||||
instance.data.experienceId,
|
instance.data.experienceId,
|
||||||
"Experiences", "Experience"
|
"Experiences", "Experience"
|
||||||
);
|
);
|
||||||
GlobalUI.closeDetail();
|
popDialogStack();
|
||||||
},
|
|
||||||
//TODO validate input (integer, non-negative, etc) for these inputs and give validation errors
|
|
||||||
"change #experienceNameInput, input #experienceNameInput": function(event){
|
|
||||||
var value = event.currentTarget.value;
|
|
||||||
Experiences.update(this._id, {$set: {name: value}});
|
|
||||||
},
|
|
||||||
"change #valueInput": function(event){
|
|
||||||
var value = +event.currentTarget.value;
|
|
||||||
Experiences.update(this._id, {$set: {value: value}});
|
|
||||||
},
|
|
||||||
"change #experienceDescriptionInput": function(event){
|
|
||||||
var value = event.currentTarget.value;
|
|
||||||
Experiences.update(this._id, {$set: {description: value}});
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const debounce = (f) => _.debounce(f, 300);
|
||||||
|
|
||||||
|
Template.experienceEdit.events({
|
||||||
|
"input #experienceNameInput, change #experienceNameInput":
|
||||||
|
debounce(function(event){
|
||||||
|
var value = event.currentTarget.value;
|
||||||
|
Experiences.update(this._id, {
|
||||||
|
$set: {name: value}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
trimStrings: false,
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
"input #valueInput, change #valueInput":
|
||||||
|
debounce(function(event){
|
||||||
|
var value = +event.currentTarget.value;
|
||||||
|
Experiences.update(this._id, {
|
||||||
|
$set: {value: value}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
"input #experienceDescriptionInput":
|
||||||
|
debounce(function(event){
|
||||||
|
var value = event.currentTarget.value;
|
||||||
|
Experiences.update(this._id, {
|
||||||
|
$set: {description: value}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
trimStrings: false,
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,104 +1,91 @@
|
|||||||
<template name="journal">
|
<template name="journal">
|
||||||
<div fit>
|
<div class="column-container animation-slider">
|
||||||
<div id="journal" class="scroll-y" fit>
|
<!--Experience Table-->
|
||||||
<div class="column-container">
|
<div>
|
||||||
<!--Experience Table-->
|
<paper-material class="card experiencesCard">
|
||||||
<paper-shadow class="card experiencesCard"
|
<div class="top white subhead layout horizontal center">
|
||||||
hero-id="main" {{detailHero}}>
|
<div class="flex">Experience</div>
|
||||||
<div class="top white subhead"
|
<div>{{characterCalculate "experience" _id}} XP</div>
|
||||||
hero-id="toolbar" {{detailHero}}
|
<paper-icon-button class="black54" id="addXP" icon="add"
|
||||||
layout horizontal center>
|
disabled={{#unless canEditCharacter _id}}true{{/unless}}></paper-icon-button>
|
||||||
<div flex>Experience</div>
|
</div>
|
||||||
<div >{{experience}} XP</div>
|
<div class="bottom list">
|
||||||
<paper-icon-button class="black54" id="addXP" icon="add"></paper-icon-button>
|
{{#each experiences}}
|
||||||
</div>
|
|
||||||
<div class="bottom list">
|
|
||||||
{{#each experiences}}
|
|
||||||
<div class="item-slot">
|
|
||||||
<div class="item experience"
|
|
||||||
hero-id="main" {{detailHero}}
|
|
||||||
layout horizontal center>
|
|
||||||
<div flex>{{name}}</div>
|
|
||||||
<div class="xpValue">{{value}}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
{{#if moreExperiencesOrCollapse}}
|
|
||||||
<div layout horizontal center end-justified>
|
|
||||||
<paper-button id="moreExperiences"
|
|
||||||
disabled={{notMoreExperiences}}>
|
|
||||||
Load More
|
|
||||||
</paper-button>
|
|
||||||
<paper-button id="lessExperiences"
|
|
||||||
disabled={{cantCollapse}}>
|
|
||||||
Collapse
|
|
||||||
</paper-button>
|
|
||||||
</div>
|
|
||||||
{{/if}}
|
|
||||||
</paper-shadow>
|
|
||||||
<!--Class Table-->
|
|
||||||
<paper-shadow class="card"
|
|
||||||
hero-id="main" {{detailHero}}>
|
|
||||||
<div class="white top"
|
|
||||||
hero-id="toolbar" {{detailHero}}
|
|
||||||
layout horizontal center>
|
|
||||||
<div flex>
|
|
||||||
<div class="containerName subhead">
|
|
||||||
Level {{level}}
|
|
||||||
</div>
|
|
||||||
{{#if nextLevelXP}}
|
|
||||||
<div class="caption">
|
|
||||||
Next Level: {{nextLevelXP}}XP
|
|
||||||
</div>
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
|
||||||
<paper-icon-button class="black54"
|
|
||||||
id="addClassButton"
|
|
||||||
icon="add">
|
|
||||||
</paper-icon-button>
|
|
||||||
</div>
|
|
||||||
<div class="bottom list">
|
|
||||||
<div class="item-slot">
|
<div class="item-slot">
|
||||||
<div class="item race"
|
<div class="item experience layout horizontal center" data-id={{_id}}>
|
||||||
hero-id="main" {{detailHero "race" _id}}
|
<div class="flex">{{name}}</div>
|
||||||
layout horizontal center>
|
<div class="xpValue">{{value}}</div>
|
||||||
{{race}}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{#each classes}}
|
{{/each}}
|
||||||
<div class="item-slot">
|
</div>
|
||||||
<div class="item class"
|
{{#if moreExperiencesOrCollapse}}
|
||||||
hero-id="main" {{detailHero}}
|
<div class="layout horizontal center end-justified">
|
||||||
layout horizontal center>
|
<paper-button id="moreExperiences" disabled={{notMoreExperiences}}>
|
||||||
{{name}} {{level}}
|
Load More
|
||||||
</div>
|
</paper-button>
|
||||||
</div>
|
<paper-button id="lessExperiences" disabled={{cantCollapse}}>
|
||||||
{{/each}}
|
Collapse
|
||||||
|
</paper-button>
|
||||||
</div>
|
</div>
|
||||||
</paper-shadow>
|
{{/if}}
|
||||||
<!--Notes-->
|
</paper-material>
|
||||||
{{#each notes}}
|
|
||||||
<paper-shadow class="card" hero-id="main" {{detailHero}}>
|
|
||||||
<div class="top {{colorClass}} noteTop subhead"
|
|
||||||
hero-id="toolbar" {{detailHero}}
|
|
||||||
layout horizontal center>
|
|
||||||
{{name}}
|
|
||||||
</div>
|
|
||||||
<div class="bottom text">{{description}}</div>
|
|
||||||
</paper-shadow>
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
<div class="fab-buffer"></div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<!--Class Table-->
|
||||||
|
<div>
|
||||||
|
<paper-material class="card">
|
||||||
|
<div class="white top layout horizontal center">
|
||||||
|
<div class="flex">
|
||||||
|
<div class="containerName paper-font-subhead">
|
||||||
|
Level {{characterCalculate "level" _id}}
|
||||||
|
</div>
|
||||||
|
{{#if nextLevelXP}}
|
||||||
|
<div class="paper-font-caption">
|
||||||
|
Next Level: {{nextLevelXP}}XP
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
<paper-icon-button class="black54"
|
||||||
|
id="addClassButton"
|
||||||
|
icon="add"
|
||||||
|
disabled={{#unless canEditCharacter _id}}true{{/unless}}>
|
||||||
|
</paper-icon-button>
|
||||||
|
</div>
|
||||||
|
<div class="bottom list">
|
||||||
|
<div class="item-slot">
|
||||||
|
<div class="item race layout horizontal center">
|
||||||
|
{{race}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{#each classes}}
|
||||||
|
<div class="item-slot">
|
||||||
|
<div class="item class layout horizontal center" data-id={{_id}}>
|
||||||
|
{{name}} {{level}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</paper-material>
|
||||||
|
</div>
|
||||||
|
<!--Notes-->
|
||||||
|
{{#each notes}}
|
||||||
|
<div>
|
||||||
|
<paper-material class="card note" data-id={{_id}}>
|
||||||
|
<div class="top {{colorClass}} noteTop paper-font-subhead layout horizontal center">
|
||||||
|
{{name}}
|
||||||
|
</div>
|
||||||
|
<div class="bottom">
|
||||||
|
{{#markdown}}{{evaluateShortString charId description}}{{/markdown}}
|
||||||
|
</div>
|
||||||
|
</paper-material>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
|
<div class="fab-buffer"></div>
|
||||||
{{#if canEditCharacter _id}}
|
{{#if canEditCharacter _id}}
|
||||||
<paper-fab id="addNote"
|
<paper-fab id="addNote"
|
||||||
class="floatyButton"
|
class="floatyButton"
|
||||||
icon="add"
|
icon="add"
|
||||||
title="Add"
|
title="Add"></paper-fab>
|
||||||
role="button"
|
|
||||||
tabindex="0"
|
|
||||||
hero-id="main"></paper-fab>
|
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ Template.journal.helpers({
|
|||||||
return Levels.find({charId: charId, classId: this._id}, {sort: {value: 1}});
|
return Levels.find({charId: charId, classId: this._id}, {sort: {value: 1}});
|
||||||
},
|
},
|
||||||
nextLevelXP: function(){
|
nextLevelXP: function(){
|
||||||
var currentLevel = this.level();
|
var currentLevel = Characters.calculate.level(this._id);
|
||||||
if (currentLevel < 20){
|
if (currentLevel < 20){
|
||||||
return XP_TABLE[currentLevel];
|
return XP_TABLE[currentLevel];
|
||||||
}
|
}
|
||||||
@@ -53,101 +53,93 @@ Template.journal.helpers({
|
|||||||
});
|
});
|
||||||
|
|
||||||
Template.journal.events({
|
Template.journal.events({
|
||||||
"tap .noteTop": function(event){
|
"click .noteTop": function(event){
|
||||||
GlobalUI.setDetail({
|
pushDialogStack({
|
||||||
template: "noteDialog",
|
template: "noteDialog",
|
||||||
data: {noteId: this._id, charId: this.charId},
|
data: {noteId: this._id, charId: this.charId},
|
||||||
heroId: this._id,
|
element: event.currentTarget.parentElement,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap .experience": function(event){
|
"click .experience": function(event){
|
||||||
GlobalUI.setDetail({
|
pushDialogStack({
|
||||||
template: "experienceDialog",
|
template: "experienceDialog",
|
||||||
data: {experienceId: this._id, charId: this.charId},
|
data: {experienceId: this._id, charId: this.charId},
|
||||||
heroId: this._id,
|
element: event.currentTarget,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap .class": function(event){
|
"click .class": function(event){
|
||||||
GlobalUI.setDetail({
|
pushDialogStack({
|
||||||
template: "classDialog",
|
template: "classDialog",
|
||||||
data: {classId: this._id, charId: this.charId},
|
data: {classId: this._id, charId: this.charId},
|
||||||
heroId: this._id,
|
element: event.currentTarget,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap .race": function(event){
|
"click .race": function(event){
|
||||||
GlobalUI.setDetail({
|
pushDialogStack({
|
||||||
template: "raceDialog",
|
template: "raceDialog",
|
||||||
data: {charId: this._id},
|
data: {charId: this._id},
|
||||||
heroId: this._id + "race",
|
element: event.currentTarget,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap #addNote": function(event){
|
"click #addNote": function(event, instance){
|
||||||
var charId = this._id;
|
var charId = this._id;
|
||||||
Notes.insert({
|
var noteId = Notes.insert({
|
||||||
name: "New Note",
|
name: "New Note",
|
||||||
charId: charId,
|
charId: charId,
|
||||||
}, function(error, id){
|
});
|
||||||
if (!error){
|
pushDialogStack({
|
||||||
GlobalUI.setDetail({
|
template: "noteDialog",
|
||||||
template: "noteDialog",
|
data: {noteId: noteId, charId: charId, startEditing: true},
|
||||||
data: {noteId: id, charId: charId, startEditing: true},
|
element: event.currentTarget,
|
||||||
heroId: id,
|
returnElement: () => instance.find(`.note[data-id='${noteId}']`),
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap #addXP": function(event){
|
"click #addXP": function(event, instance){
|
||||||
var charId = this._id;
|
var charId = this._id;
|
||||||
Experiences.insert({
|
var expId = Experiences.insert({
|
||||||
charId: charId
|
charId: charId
|
||||||
}, function(error, id){
|
});
|
||||||
if (!error){
|
pushDialogStack({
|
||||||
GlobalUI.setDetail({
|
template: "experienceDialog",
|
||||||
template: "experienceDialog",
|
data: {experienceId: expId, charId: charId, startEditing: true},
|
||||||
data: {experienceId: id, charId: charId, startEditing: true},
|
element: event.currentTarget,
|
||||||
heroId: id,
|
returnElement: () => instance.find(`.experience[data-id='${expId}']`),
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap #addClassButton":function(event){
|
"click #addClassButton":function(event, instance){
|
||||||
var charId = this._id;
|
var charId = this._id;
|
||||||
Classes.insert({
|
var classId = Classes.insert({
|
||||||
charId: charId,
|
charId: charId,
|
||||||
name: "new Class",
|
name: "new Class",
|
||||||
level: 1,
|
level: 1,
|
||||||
}, function(error, id){
|
});
|
||||||
if (!error){
|
pushDialogStack({
|
||||||
GlobalUI.setDetail({
|
template: "classDialog",
|
||||||
template: "classDialog",
|
data: {classId: classId, charId: charId, startEditing: true},
|
||||||
data: {classId: id, charId: charId, startEditing: true},
|
element: event.currentTarget,
|
||||||
heroId: id,
|
returnElement: () => instance.find(`.class[data-id='${classId}']`),
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap #moreExperiences": function(event){
|
"click #moreExperiences": function(event, instance){
|
||||||
var inst = Template.instance();
|
instance.experiencesLimit.set(
|
||||||
inst.experiencesLimit.set(
|
instance.experiencesLimit.get() +
|
||||||
inst.experiencesLimit.get() +
|
|
||||||
(this.settings && this.settings.experiencesInc || 10)
|
(this.settings && this.settings.experiencesInc || 10)
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
"tap #lessExperiences": function(event){
|
"click #lessExperiences": function(event, instance){
|
||||||
var inst = Template.instance();
|
instance.experiencesLimit.set(
|
||||||
inst.experiencesLimit.set(
|
|
||||||
this.settings && this.settings.experiencesInc || 10
|
this.settings && this.settings.experiencesInc || 10
|
||||||
);
|
);
|
||||||
//scroll to the top of the div
|
// Scroll to the top of the div
|
||||||
inst.$(".scroll-y").animate({
|
instance.$(".scroll-y").animate({
|
||||||
scrollTop: (
|
scrollTop: (
|
||||||
inst.$(".scroll-y").scrollTop() +
|
instance.$(".scroll-y").scrollTop() +
|
||||||
inst.$(".experiencesCard").position().top -
|
instance.$(".experiencesCard").position().top -
|
||||||
8
|
8
|
||||||
)
|
)
|
||||||
}, 300);
|
}, 300);
|
||||||
//HACK giggle the columns :( to workaround chrome bug that stops .containers height from updating
|
// HACK jiggle the columns :( to workaround chrome bug that stops .containers height from updating
|
||||||
var cs = inst.$(".containers").removeClass("containers");
|
var cs = instance.$(".containers").removeClass("containers");
|
||||||
_.defer(function(){cs.addClass("containers");});
|
_.defer(function(){cs.addClass("containers");});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<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="pre-wrap">{{description}}</div>
|
<div>{{#markdown}}{{evaluateString charId description}}{{/markdown}}</div>
|
||||||
{{else}}
|
{{else}}
|
||||||
{{> noteDialogEdit}}
|
{{> noteDialogEdit}}
|
||||||
{{/baseDialog}}
|
{{/baseDialog}}
|
||||||
@@ -10,21 +10,13 @@
|
|||||||
|
|
||||||
<template name="noteDialogEdit">
|
<template name="noteDialogEdit">
|
||||||
<!--Name-->
|
<!--Name-->
|
||||||
<div horizontal layout>
|
<div class="horizontal layout">
|
||||||
<paper-input id="noteNameInput"
|
<paper-input id="noteNameInput"
|
||||||
label="Name"
|
label="Name"
|
||||||
floatinglabel
|
|
||||||
value={{name}}
|
value={{name}}
|
||||||
flex>
|
class="flex">
|
||||||
</paper-input>
|
</paper-input>
|
||||||
</div>
|
</div>
|
||||||
<!--Description, formatting this nicely breaks it, leave it as is-->
|
<!--Description, formatting this nicely breaks it, leave it as is-->
|
||||||
<paper-input-decorator label="Description"
|
<paper-textarea id="noteDescriptionInput" label="Description" value={{description}}></paper-textarea>
|
||||||
floatinglabel
|
</template>
|
||||||
layout vertical>
|
|
||||||
<paper-autogrow-textarea>
|
|
||||||
<textarea id="noteDescriptionInput"
|
|
||||||
value={{description}}></textarea>
|
|
||||||
</paper-autogrow-textarea>
|
|
||||||
</paper-input-decorator>
|
|
||||||
</template>
|
|
||||||
|
|||||||
@@ -11,21 +11,36 @@ Template.noteDialog.events({
|
|||||||
"tap #deleteButton": function(event, instance){
|
"tap #deleteButton": function(event, instance){
|
||||||
Notes.softRemove(instance.data.noteId);
|
Notes.softRemove(instance.data.noteId);
|
||||||
GlobalUI.deletedToast(instance.data.noteId, "Notes", "Note");
|
GlobalUI.deletedToast(instance.data.noteId, "Notes", "Note");
|
||||||
GlobalUI.closeDetail();
|
popDialogStack();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.noteDialogEdit.onRendered(function(){
|
const debounce = (f) => _.debounce(f, 300);
|
||||||
updatePolymerInputs(this);
|
|
||||||
});
|
|
||||||
|
|
||||||
Template.noteDialogEdit.events({
|
Template.noteDialogEdit.events({
|
||||||
"change #noteNameInput, input #noteNameInput": function(event){
|
"change #noteNameInput, input #noteNameInput": debounce(function(event){
|
||||||
|
const input = event.currentTarget;
|
||||||
|
var name = input.value;
|
||||||
|
if (!name){
|
||||||
|
input.invalid = true;
|
||||||
|
input.errorMessage = "Name is required";
|
||||||
|
} else {
|
||||||
|
input.invalid = false;
|
||||||
|
Notes.update(this._id, {
|
||||||
|
$set: {name: name}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
trimStrings: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
"input #noteDescriptionInput": debounce(function(event){
|
||||||
var value = event.currentTarget.value;
|
var value = event.currentTarget.value;
|
||||||
Notes.update(this._id, {$set: {name: value}});
|
Notes.update(this._id, {
|
||||||
},
|
$set: {description: value}
|
||||||
"change #noteDescriptionInput": function(event){
|
}, {
|
||||||
var value = event.currentTarget.value;
|
removeEmptyStrings: false,
|
||||||
Notes.update(this._id, {$set: {description: value}});
|
trimStrings: false,
|
||||||
},
|
});
|
||||||
|
}),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
<template name="raceDialog">
|
<template name="raceDialog">
|
||||||
{{#baseDialog title="Race" class=color hideColor="true" hideDelete="true" startEditing=startEditing}}
|
{{#baseDialog title="Race" class=color hideColor="true" hideDelete="true" startEditing=startEditing}}
|
||||||
<div horizontal layout center-justified class= "display2">
|
<div class="horizontal layout center-justified paper-font-display2">
|
||||||
{{race}}
|
{{race}}
|
||||||
</div>
|
</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}}
|
||||||
<paper-input id="raceInput" label="Race" floatinglabel value={{race}}></paper-input>
|
<paper-input id="raceInput" label="Race" value={{race}}></paper-input>
|
||||||
{{> effectsEditList parentId=charId parentCollection="Characters" charId=charId parentGroup="racial"}}
|
{{> effectsEditList parentId=charId parentCollection="Characters" charId=charId parentGroup="racial"}}
|
||||||
{{> proficiencyEditList parentId=charId parentCollection="Characters" charId=charId parentGroup="racial"}}
|
{{> proficiencyEditList parentId=charId parentCollection="Characters" charId=charId parentGroup="racial"}}
|
||||||
{{/baseDialog}}
|
{{/baseDialog}}
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
Template.raceDialog.onRendered(function(){
|
|
||||||
updatePolymerInputs(this);
|
|
||||||
});
|
|
||||||
|
|
||||||
Template.raceDialog.events({
|
Template.raceDialog.events({
|
||||||
"change #raceInput": function(event){
|
"input #raceInput, change #raceInput": _.debounce(function(event){
|
||||||
var value = event.currentTarget.value;
|
var value = event.currentTarget.value;
|
||||||
Characters.update(this.charId, {$set: {race: value}});
|
Characters.update(this.charId, {
|
||||||
}
|
$set: {race: value}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
trimStrings: false,
|
||||||
|
});
|
||||||
|
}, 300),
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.raceDialog.helpers({
|
Template.raceDialog.helpers({
|
||||||
|
|||||||
@@ -1,40 +1,27 @@
|
|||||||
<template name="newCharacterDialog">
|
<template name="newCharacterDialog">
|
||||||
<div>
|
<div class="fit layout vertical">
|
||||||
<paper-input id="nameInput" label="Name"></paper-input><br>
|
<app-header-layout has-scrolling-region class="new-character-dialog flex">
|
||||||
<paper-input id="genderInput" label="Gender"></paper-input><br>
|
<app-header fixed effects="waterfall">
|
||||||
<paper-input id="raceInput" label="Race"></paper-input>
|
<app-toolbar>
|
||||||
<!--
|
<div main-title>New Character</div>
|
||||||
<div>
|
</app-toolbar>
|
||||||
<div layout horizontal center-justified>
|
</app-header>
|
||||||
{{pointsUsed}}/<paper-input-decorator><input type="number" value="27"></paper-input-decorator>
|
<div class="form">
|
||||||
</div>
|
<p>
|
||||||
<div layout horizontal wrap>
|
Input the basics of your character, but don't worry, you can always change these values later
|
||||||
<div>Strength</div>
|
</p>
|
||||||
<paper-slider id="strSlider" min="8" max="15" value="8" secondaryProgress={{secondaryProgress}}></paper-slider>
|
<paper-input class="nameInput" label="Name" {{errorAtts "name"}}></paper-input><br>
|
||||||
</div>
|
<paper-input class="genderInput" label="Gender" {{errorAtts "gender"}}></paper-input><br>
|
||||||
<div layout horizontal wrap>
|
<paper-input class="raceInput" label="Race" {{errorAtts "race"}}></paper-input>
|
||||||
<div>Dexterity</div>
|
|
||||||
<paper-slider id="dexSlider" min="8" max="15" value="8" secondaryProgress={{secondaryProgress}}></paper-slider>
|
|
||||||
</div>
|
|
||||||
<div layout horizontal wrap>
|
|
||||||
<div>Constitution</div>
|
|
||||||
<paper-slider id="conSlider" min="8" max="15" value="8" secondaryProgress={{secondaryProgress}}></paper-slider>
|
|
||||||
</div>
|
|
||||||
<div layout horizontal wrap>
|
|
||||||
<div>Intelligence</div>
|
|
||||||
<paper-slider id="intSlider" min="8" max="15" value="8" secondaryProgress={{secondaryProgress}}></paper-slider>
|
|
||||||
</div>
|
|
||||||
<div layout horizontal wrap>
|
|
||||||
<div>Wisdom</div>
|
|
||||||
<paper-slider id="wisSlider" min="8" max="15" value="8" secondaryProgress={{secondaryProgress}}></paper-slider>
|
|
||||||
</div>
|
|
||||||
<div layout horizontal wrap>
|
|
||||||
<div>Charisma</div>
|
|
||||||
<paper-slider id="chaSlider" min="8" max="15" value="8" secondaryProgress={{secondaryProgress}}></paper-slider>
|
|
||||||
</div>
|
</div>
|
||||||
|
</app-header-layout>
|
||||||
|
<div class="buttons layout horizontal end-justified">
|
||||||
|
<paper-button class="cancelButton">
|
||||||
|
Cancel
|
||||||
|
</paper-button>
|
||||||
|
<paper-button class="addButton" disabled={{invalid}}>
|
||||||
|
Add
|
||||||
|
</paper-button>
|
||||||
</div>
|
</div>
|
||||||
-->
|
|
||||||
</div>
|
</div>
|
||||||
<paper-button id="cancelButton" affirmative> Cancel </paper-button>
|
</template>
|
||||||
<paper-button id="addButton" affirmative> Add </paper-button>
|
|
||||||
</template>
|
|
||||||
|
|||||||
@@ -1,13 +1,50 @@
|
|||||||
Template.newCharacterDialog.events({
|
Template.newCharacterDialog.onCreated(function(){
|
||||||
"tap #addButton": function(event, instance){
|
this.character = {};
|
||||||
Characters.insert({
|
this.schema = new SimpleSchema({
|
||||||
name: instance.find("#nameInput").value,
|
//strings
|
||||||
gender: instance.find("#genderInput").value,
|
name: {type: String},
|
||||||
race: instance.find("#raceInput").value,
|
gender: {type: String, optional: true},
|
||||||
owner: Meteor.userId(),
|
race: {type: String, optional: true},
|
||||||
}, function(err, id){
|
});
|
||||||
if (err) throw err;
|
this.context = this.schema.newContext();
|
||||||
Router.go("characterSheet", {_id: id});
|
this.context.runOnce = new ReactiveVar(false);
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
Template.newCharacterDialog.helpers({
|
||||||
|
invalid(){
|
||||||
|
let context = Template.instance().context;
|
||||||
|
let valid = context.isValid() && context.runOnce.get();
|
||||||
|
return !valid;
|
||||||
|
},
|
||||||
|
errorAtts(key){
|
||||||
|
let error = Template.instance().context.keyErrorMessage(key);
|
||||||
|
if (error){
|
||||||
|
return {
|
||||||
|
invalid: true,
|
||||||
|
["error-message"]: error,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
changeFunction = function(field){
|
||||||
|
return _.debounce(function(event, instance){
|
||||||
|
console.log({field, event})
|
||||||
|
instance.character[field] = event.currentTarget.value;
|
||||||
|
instance.schema.clean(instance.character);
|
||||||
|
instance.context.validate(instance.character);
|
||||||
|
if (!instance.context.runOnce.get()) instance.context.runOnce.set(true);
|
||||||
|
}, 200);
|
||||||
|
};
|
||||||
|
|
||||||
|
Template.newCharacterDialog.events({
|
||||||
|
"input .nameInput": changeFunction("name"),
|
||||||
|
"input .genderInput": changeFunction("gender"),
|
||||||
|
"input .raceInput": changeFunction("race"),
|
||||||
|
"click .cancelButton": function(event, instance){
|
||||||
|
popDialogStack();
|
||||||
|
},
|
||||||
|
"click .addButton": function(event, instance){
|
||||||
|
popDialogStack(instance.character);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user