Compare commits

..

101 Commits

Author SHA1 Message Date
Stefan Zermatten
2540278787 Bumped version 2017-03-09 08:40:21 +02:00
Stefan Zermatten
5ed1977082 Fixed dragging items to characters in the drawer 2017-03-09 08:40:15 +02:00
Stefan Zermatten
a750101765 Fixed app drawer appearing behind content 2017-03-09 08:39:59 +02:00
Stefan Zermatten
aa08a9b57a Fixed links not closing drawer automatically 2017-03-09 08:39:39 +02:00
Stefan Zermatten
a8960e26ec Fixed issue with health bars clamping to 100 2017-03-06 14:50:46 +02:00
Stefan Zermatten
eefb3895ad Bumped version to 1.0.0 2017-03-06 11:37:15 +02:00
Stefan Zermatten
5b1caa7e95 Merge pull request #57 from ThaumRystra/update-meteor-1.4-polymer-1.0
Update to polymer 1.0, Meteor 1.4
2017-03-06 10:36:03 +02:00
Stefan Zermatten
21fdad1054 Added resolution for webcomponentsjs 2017-02-21 09:37:32 +02:00
Stefan Zermatten
c482395426 Fixed FABs not reappearing after dialog close 2017-02-13 09:22:17 +02:00
Stefan Zermatten
cb493a9f16 Firefox now works... mostly 2017-02-13 09:21:55 +02:00
Stefan Zermatten
576c1f953b Firefox now works... barely 2017-02-10 14:01:06 +02:00
Stefan Zermatten
eb4336b3e9 Moved back to differential:vulcanize for imports 2017-01-31 15:26:05 +02:00
Stefan Zermatten
03cb32bf34 Updated color dropdown to Polymer 1 paper-swatch-picker 2017-01-31 13:36:15 +02:00
Stefan Zermatten
a869772238 Updated journal page to Polymer 1 2017-01-31 11:09:57 +02:00
Stefan Zermatten
9c61493a12 Updated persona tab to Polymer 1 2017-01-31 09:58:35 +02:00
Stefan Zermatten
7af3b8e06e Upgraded spells page to Polymer 1 2017-01-30 13:02:22 +02:00
Stefan Zermatten
fd21f4f7d7 Fixed some dialog animation edge cases 2017-01-27 15:34:59 +02:00
Stefan Zermatten
3530eefb2a Added custom tab pages animations 2017-01-27 15:34:09 +02:00
Stefan Zermatten
d710579025 Updated inventory to Polymer 1 2017-01-26 10:23:27 +02:00
Stefan Zermatten
f7a3929c05 Fixed toast 2017-01-25 08:40:30 +02:00
Stefan Zermatten
1af15eff3c Small style and event fixes 2017-01-23 15:08:19 +02:00
Stefan Zermatten
33ca60c2e6 Migrated the Feature page to Polymer 1 2017-01-20 15:45:18 +02:00
Stefan Zermatten
4261776d8c Removed SCSS, using CSS only now
SCSS wasn't being utilized enough to add much value to the build times
2017-01-20 09:06:24 +02:00
Stefan Zermatten
b44fe33b30 Finished upgrading stat tab to Polymer 1 2017-01-20 09:05:16 +02:00
Stefan Zermatten
c4a488a176 Updated useraccounts, character settings to Polymer 1 2017-01-19 15:43:48 +02:00
Stefan Zermatten
137a94f251 Began moving character sheet and related menus to Polymer 1 2017-01-18 15:04:09 +02:00
Stefan Zermatten
817020bea8 Updated hitpoint / temporary hitpoint box to Polymer 1 2017-01-18 11:19:03 +02:00
Stefan Zermatten
420de9b005 Migrated stats tab to Polymer 1.0 2017-01-17 15:01:11 +02:00
Stefan Zermatten
b8fdc27df9 Rebuilt dialog animations with cross-fade effect 2017-01-17 15:00:05 +02:00
Stefan Zermatten
bdc64dfb10 Updated the new character dialog to Polymer 1 2017-01-16 15:34:23 +02:00
Stefan Zermatten
d4bec4f5e7 Cleaned up dialogStack 2017-01-16 15:34:03 +02:00
Stefan Zermatten
041186059c Updated static pages to Polymer 1 2017-01-16 13:48:43 +02:00
Stefan Zermatten
01535a414c Updated character lists to Polymer 1 2017-01-16 13:48:18 +02:00
Stefan Zermatten
d9e180bac0 Simplified toast to just take text 2017-01-13 15:35:08 +02:00
Stefan Zermatten
235089e790 Fixed typos of the app name 2017-01-13 15:34:51 +02:00
Stefan Zermatten
c560d80c26 Updated front page to Polymer 1 2017-01-13 15:34:28 +02:00
Stefan Zermatten
a67b13f659 Updated feedback form to Polymer 1 2017-01-13 13:21:42 +02:00
Stefan Zermatten
c416adc85b Improved the dialog stack animations 2017-01-13 13:21:05 +02:00
Stefan Zermatten
dbbb3739d0 Added a new animated dialog stack
This is to replace the animated-pages hack with Blaze component built for purpose
2017-01-12 15:30:06 +02:00
Stefan Zermatten
38ea89995a Moved views out of private folder 2017-01-12 15:28:59 +02:00
Stefan Zermatten
37268495ae Got some Polymer 1.0 elements working with 1.4
Character sheets now visible, but vulcanize broke, using raw head imports instead
2016-12-22 11:15:30 +02:00
Stefan Zermatten
042b67dd77 Fixed merge conflict 2016-12-20 13:58:32 +02:00
Stefan Zermatten
07cb3859db Merge branch 'update-meteor-1.4' into update-meteor-1.4-polymer-1.0 2016-12-20 13:57:56 +02:00
Stefan Zermatten
b1fdaa726c Removed useless Kadira 2016-12-08 13:52:04 +02:00
Stefan Zermatten
a333b0bdc8 Fixed broken drawer swiping 2016-12-08 13:51:54 +02:00
Stefan Zermatten
c32680a15a Upgraded meteor 2016-12-08 13:51:35 +02:00
Stefan Zermatten
d1950b4598 Bumped changelog for webcomponentsjs update 2016-12-08 09:55:07 +02:00
Greg Williams
af20eb4f3c Updated webcomponentsjs to v0.7.23 2016-11-23 22:03:09 -08:00
Stefan Zermatten
be0283a342 Chrome 54 broke transitions again 2016-10-17 14:51:24 +02:00
Stefan Zermatten
e05561dcf9 Trying a different version of webcomponents 2016-10-03 14:27:57 +02:00
Stefan Zermatten
3c776ed018 added webcomponent dependency resolution 2016-10-03 14:19:48 +02:00
Stefan Zermatten
ebecb46935 Fixed drop-down bug, for now
Expect it to break again in Chrome 54
2016-10-03 14:05:30 +02:00
Stefan Zermatten
7af2e80ec1 Removed Polymer 0.5, started implementing Polymer 1.0 2016-10-03 13:00:27 +02:00
Stefan Zermatten
d83fe917d0 Fixed change logs version numbers 2016-09-19 10:02:25 +02:00
Stefan Zermatten
f526de88a7 Fixed invisible dropdown boxes in Chrome 52. Bumped version 2016-09-08 14:40:47 +02:00
Stefan Zermatten
55adca36d5 Added bower 2016-09-07 10:04:21 +02:00
Stefan Zermatten
be6f54e53a Added Package.json to get Scalingo working 2016-09-07 09:52:14 +02:00
Stefan Zermatten
d41c27c86d Bumped version 2016-06-03 14:49:04 +02:00
Stefan Zermatten
f4397e65ab Global update of packages 2016-06-03 14:43:11 +02:00
Stefan Zermatten
c00c69a0c7 Merge pull request #54 from ThaumRystra/fix-bug-156
closes #54
2016-05-20 09:42:25 +02:00
Robert Perce
6737983782 [#156] add "ritual" after the school in the spell detail view if the spell is, in fact, a ritual. 2016-05-13 11:40:39 -05:00
Stefan Zermatten
78441439c3 Merge pull request #52 from ThaumRystra/user-story-127
Added 'if' function for math.js to use whenever eval-ing input, closes #32
2016-05-04 07:43:21 +02:00
Robert Perce
9b72e1aea2 Added 'if' function for math.js to use whenever eval-ing input 2016-05-03 14:44:40 -05:00
Stefan Zermatten
684eca8603 Merge pull request #51 from ThaumRystra/fix-bug-163
[#163] Changed the x to a × in effectView.js
2016-05-03 11:13:32 +02:00
Stefan Zermatten
868e5f96a4 Update README.md 2016-05-03 09:03:26 +02:00
Stefan Zermatten
6fe368cde7 Updated bourbon and scss 2016-05-03 08:12:44 +02:00
Stefan Zermatten
2ffacb88e0 Included custom vulcanize package in repo 2016-05-03 07:50:12 +02:00
Stefan Zermatten
af3af0e550 Fixed missing bower dependency 2016-05-03 07:48:14 +02:00
Robert Perce
81f50d94c1 [#163] Changed the x to a × in effectView.js 2016-04-22 15:20:32 -05:00
Stefan Zermatten
49e6d51b95 Merge pull request #40 from ThaumRystra/feature-coins-inc-default
Make coins incrementable by default, closes #27
2016-03-09 14:17:23 +02:00
Stefan Zermatten
1e4e1a3b11 Merge pull request #38 from ThaumRystra/feature-base-ability-scores-10
Base ability scores default to 10, closes #36
2016-03-09 13:56:36 +02:00
Stefan Zermatten
4440c88417 Removed grouping from effects
Grouping is currently only used to differentiate effects that have the same parent, but are ambiguous as to which part of that parent they come from, like race or background. Features do not need grouped effects, because there can be no ambiguity.
2016-03-09 12:57:23 +02:00
Connor Petersen
98047ca806 Moved base-10 default to Features.js, cleaned up default Effects, and Features code to be consistent. 2016-03-07 23:21:42 -08:00
Connor Petersen
051cabc712 Cleaned up a little more 2016-03-07 22:53:27 -08:00
Connor Petersen
636fa504f1 Updated to not require caching the id or making a separate update call 2016-03-07 22:51:41 -08:00
Connor Petersen
ff9fc916f6 Added a call to adding a feature and 6 related effects to the newCharacterDialog event handler 2016-02-11 23:29:27 -08:00
Connor Petersen
2206a607b2 Added an update call to default Item adding function to update the showIncrement field to true for coins 2016-02-10 22:11:41 -08:00
Stefan Zermatten
ce224301b2 Fixed layout on chrome 49+, made character names into links 2016-02-01 09:34:22 +02:00
Stefan Zermatten
e6a9911dfc Replaced the head that was accidentally deleted 2015-11-19 12:44:11 +02:00
Stefan Zermatten
8a1871ee18 Fixed character list FAB not staying put 2015-11-19 12:43:54 +02:00
Stefan Zermatten
402f885f85 Specified thaum:vulcanize at 0.5 2015-11-18 08:52:52 +02:00
Stefan Zermatten
d07c118d47 Removed useless public items, removed Appcache, fixed vulcanize 2015-11-17 15:20:33 +02:00
Stefan Zermatten
103d44eeec Merge branch 'feature-fast-render' 2015-11-17 13:59:22 +02:00
Stefan Zermatten
33196c6771 Bumped change log 2015-11-17 13:58:50 +02:00
Stefan Zermatten
80dc862047 Added Appcache 2015-11-17 12:26:55 +02:00
Stefan Zermatten
314da14ad1 Added indexes to charId on character fields 2015-11-02 09:35:05 +02:00
Stefan Zermatten
e5dbe81ac1 Added fast render support to routes which have subscriptions
Closes #18
2015-10-13 08:22:00 +02:00
Stefan Zermatten
7e68ef64cc Merge pull request #16 from ThaumRystra/bugfix-encumberance-meter-swapping
Change character reference to be reactive based on the active, undestroyed template
2015-10-09 08:58:53 +02:00
Connor Petersen
c9d71cad52 Change character reference to be reactive based on the active, undestroyed template 2015-10-08 23:05:57 -07:00
Stefan Zermatten
d79a808c81 Bumped Version 2015-10-05 08:59:25 +02:00
Stefan Zermatten
1016c39bdf Merge branch 'fix-www-route' 2015-10-05 08:59:07 +02:00
Stefan Zermatten
5f4923e049 Added canonical URL 2015-10-05 08:57:50 +02:00
Stefan Zermatten
e83237a728 Added demeteorized to gitignore 2015-10-05 08:57:33 +02:00
Stefan Zermatten
9f323738bf Renamed custom useraccount-polymer package to be more obvious 2015-10-05 08:34:43 +02:00
Stefan Zermatten
1fc76fa50d Removed Vulcanize entirely
There is no version compatible with both Meteor 1.2 and Polymer 0.5, so screw it, clients can deal with a few ms more load time.
2015-10-05 08:34:18 +02:00
Stefan Zermatten
36d5ff0a88 Update Meteor to 1.2
This requires local copies of packages that are broken or not Polymer 0.5

Closes #15
2015-10-03 22:40:04 +02:00
Stefan Zermatten
d05874ed13 Bumped version 2015-10-01 08:06:29 +02:00
Stefan Zermatten
df2521e69c Merge pull request #5 from ThaumRystra/bugfix-unprepared-spell-attacks
Spell child attacks now set their enabled state to match the parent spell prepared state
2015-10-01 08:03:30 +02:00
Stefan Zermatten
3c6a685fe8 Fixed reference to parentId which should be parent.id 2015-10-01 07:45:38 +02:00
Connor Petersen
a77e560284 Spell attacks correctly enable based on preparedness, Model correction with collection hooks 2015-09-30 13:30:59 -07:00
Stefan Zermatten
4cec83918f Updated README.md to remove out of date info 2015-09-28 07:35:10 +02:00
216 changed files with 5803 additions and 4457 deletions

View File

@@ -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
} }

View File

@@ -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)

5
rpg-docs/.gitignore vendored
View File

@@ -1,6 +1,9 @@
.meteor/local .meteor/local
.meteor/meteorite .meteor/meteorite
.demeteorized
settings.json settings.json
public/components public/components
public/_imports.html
nohup.out nohup.out
dump node_modules
dump

View File

@@ -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

View File

@@ -1 +0,0 @@

View File

@@ -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,12 +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
wolves:bourbon
meteorhacks:subs-manager meteorhacks:subs-manager
meteorhacks:kadira
chuangbo:marked chuangbo:marked
reywood:iron-router-ga 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

View File

@@ -1 +1 @@
METEOR@1.1.0.2 METEOR@1.4.2.6

View File

@@ -1,96 +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
chuangbo:marked@0.3.5 binary-heap@1.0.10
coffeescript@1.0.6 blaze@2.3.0
dburles:collection-helpers@1.0.3 blaze-html-templates@1.1.0
dburles:mongo-collection-instances@0.3.3 blaze-tools@1.0.10
ddp@1.1.0 boilerplate-generator@1.0.11
deps@1.0.7 caching-compiler@1.1.9
differential:vulcanize@0.0.5 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
meteorhacks:kadira@2.21.0 meteor-base@1.0.4
meteorhacks:meteorx@1.3.1 meteorhacks:subs-manager@1.6.4
meteorhacks:subs-manager@1.3.0 minifier-css@1.2.16
minifiers@1.1.5 minifier-js@1.2.17
minimongo@1.0.8 minimongo@1.0.19
mobile-status-bar@1.0.3 mobile-experience@1.0.4
momentjs:moment@2.10.3 mobile-status-bar@1.0.13
mongo@1.1.0 modules@0.7.7
mongo-livedata@1.0.8 modules-runtime@0.7.8
npm-bcrypt@0.7.8_2 momentjs:moment@2.17.1
oauth@1.1.4 mongo@1.1.14
oauth2@1.1.3 mongo-id@1.0.6
observe-sequence@1.0.6 nikogosovd:multiple-uihooks@0.1.8
ordered-dict@1.0.3 npm-bcrypt@0.9.2
percolate:migrations@0.7.5 npm-mongo@2.2.16_1
random@1.0.3 oauth@1.1.12
reactive-dict@1.1.0 oauth2@1.1.11
reactive-var@1.0.5 observe-sequence@1.0.14
reload@1.1.3 ordered-dict@1.0.9
retry@1.0.3 percolate:migrations@0.9.8
reywood:iron-router-ga@0.6.0 promise@0.8.8
routepolicy@1.0.5 raix:eventemitter@0.1.3
service-configuration@1.0.4 random@1.0.10
session@1.1.0 rate-limit@1.0.6
sha@1.0.3 reactive-dict@1.1.8
softwarerero:accounts-t9n@1.0.9 reactive-var@1.0.11
spacebars@1.0.6 reload@1.1.11
spacebars-compiler@1.0.6 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

View File

@@ -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,

View File

@@ -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);

View File

@@ -4,6 +4,7 @@ Schemas.Buff = new SimpleSchema({
charId: { charId: {
type: String, type: String,
regEx: SimpleSchema.RegEx.Id, regEx: SimpleSchema.RegEx.Id,
index: 1,
}, },
name: { name: {
type: String, type: String,

View File

@@ -443,13 +443,13 @@ Characters.calculate = {
}), }),
}; };
var depreciated = function() { var deprecated = function() {
//var err = new Error("this function has been depreciated"); //var err = new Error("this function has been deprecated");
var name = ""; var name = "";
if (Template.instance()){ if (Template.instance()){
name = Template.instance().view.name; name = Template.instance().view.name;
} }
var logString = "this function has been depreciated \n"; var logString = "this function has been deprecated \n";
if (name){ if (name){
logString += "View: " + name + "\n\n"; logString += "View: " + name + "\n\n";
} }
@@ -464,56 +464,56 @@ Characters.helpers({
//returns the value stored in the field requested //returns the value stored in the field requested
//will set up dependencies on just that field //will set up dependencies on just that field
getField : function(fieldName){ getField : function(fieldName){
depreciated(); deprecated();
return Characters.calculate.getField(this._id, fieldName); return Characters.calculate.getField(this._id, fieldName);
}, },
//returns the value of a field //returns the value of a field
fieldValue : function(fieldName){ fieldValue : function(fieldName){
depreciated(); deprecated();
return Characters.calculate.fieldValue(this._id, fieldName); return Characters.calculate.fieldValue(this._id, fieldName);
}, },
attributeValue: function(attributeName){ attributeValue: function(attributeName){
depreciated(); deprecated();
return Characters.calculate.attributeValue(this._id, attributeName); return Characters.calculate.attributeValue(this._id, attributeName);
}, },
attributeBase: function(attributeName){ attributeBase: function(attributeName){
depreciated(); deprecated();
return Characters.calculate.attributeBase(this._id, attributeName); return Characters.calculate.attributeBase(this._id, attributeName);
}, },
skillMod: function(skillName){ skillMod: function(skillName){
depreciated(); deprecated();
return Characters.calculate.skillMod(this._id, skillName); return Characters.calculate.skillMod(this._id, skillName);
}, },
proficiency: function(skillName){ proficiency: function(skillName){
depreciated(); deprecated();
return Characters.calculate.proficiency(this._id, skillName); return Characters.calculate.proficiency(this._id, skillName);
}, },
passiveSkill: function(skillName){ passiveSkill: function(skillName){
depreciated(); deprecated();
return Characters.calculate.passiveSkill(this._id, skillName); return Characters.calculate.passiveSkill(this._id, skillName);
}, },
advantage: function(skillName){ advantage: function(skillName){
depreciated(); deprecated();
return Characters.calculate.advantage(this._id, skillName); return Characters.calculate.advantage(this._id, skillName);
}, },
abilityMod: function(attribute){ abilityMod: function(attribute){
depreciated(); deprecated();
return Characters.calculate.abilityMod(this._id, attribute); return Characters.calculate.abilityMod(this._id, attribute);
}, },
passiveAbility: function(attribute){ passiveAbility: function(attribute){
depreciated(); deprecated();
return Characters.calculate.passiveAbility(this._id, attribute); return Characters.calculate.passiveAbility(this._id, attribute);
}, },
xpLevel: function(){ xpLevel: function(){
depreciated(); deprecated();
return Characters.calculate.xpLevel(this._id); return Characters.calculate.xpLevel(this._id);
}, },
level: function(){ level: function(){
depreciated(); deprecated();
return Characters.calculate.level(this._id); return Characters.calculate.level(this._id);
}, },
experience: function(){ experience: function(){
depreciated(); deprecated();
return Characters.calculate.experience(this._id); return Characters.calculate.experience(this._id);
}, },
}); });

View File

@@ -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: {

View File

@@ -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,71 +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.insert({
charId: char._id,
name: "Natural Carrying Capacity",
stat: "carryMultiplier",
operation: "base",
value: "1",
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",
},
});
}
});

View File

@@ -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},

View File

@@ -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,
});
}
});

View File

@@ -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: {

View File

@@ -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,

View File

@@ -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},

View File

@@ -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",
@@ -64,5 +64,21 @@ Spells.attachBehaviour("softRemovable");
makeChild(Spells); //children of spell lists makeChild(Spells); //children of spell lists
makeParent(Spells, ["name", "enabled"]); //parents of attacks 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);

View File

@@ -1,7 +1,7 @@
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, min: 0, max: 500}, maximum: {type: Number, defaultValue: 0, min: 0, max: 500},
used: {type: Number, defaultValue: 0, min: 0, max: 500}, used: {type: Number, defaultValue: 0, min: 0, max: 500},

View File

@@ -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},

View File

@@ -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,
},
}); });
} }
}); });

View File

@@ -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: {

View File

@@ -26,14 +26,10 @@ Router.map(function() {
waitOn: function(){ waitOn: function(){
return subsManager.subscribe("characterList", Meteor.userId()); return subsManager.subscribe("characterList", Meteor.userId());
}, },
data: {
characters: function(){
return Characters.find({}, {fields: {_id: 1}, sort: {name: 1}});
}
},
onAfterAction: function() { onAfterAction: function() {
document.title = appName; document.title = appName + " - Characters";
}, },
fastRender: true,
}); });
this.route("characterSheet", { this.route("characterSheet", {
@@ -63,6 +59,7 @@ Router.map(function() {
window.ga && window.ga("send", "pageview", "/character"); window.ga && window.ga("send", "pageview", "/character");
this.next(); this.next();
}, },
fastRender: true,
}); });
this.route("loading", { this.route("loading", {
@@ -91,6 +88,7 @@ Router.map(function() {
onAfterAction: function() { onAfterAction: function() {
document.title = appName; document.title = appName;
}, },
fastRender: true,
}); });
this.route("/guide", { this.route("/guide", {

View File

@@ -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"
} }
} }

View File

@@ -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();
}, 100, {trailing: false});
GlobalUI.closeDetail = function() {
if (window.history && history.pushState && history.state.detail === "opened") {
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();
}
}); });

View File

@@ -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]
);
}
});

View File

@@ -1,32 +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") { } else if (parent.collection === "Spells") {
detail = { template = "spellDialog";
template: "spellDialog", data = {spellId: parent.id};
data: {spellId: parent.id},
};
} }
detail.heroId = heroId; pushDialogStack({template, data, element, returnElement, callback});
detail.charId = charId;
GlobalUI.setDetail(detail);
}; };

View 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);
});
});
});
});
};

View 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%;
}

View File

@@ -1,89 +0,0 @@
@import "bourbon/bourbon";
$thickColumnWidth: 304px;
$thinColumnWidth: 240px;
//Column layout
.column-container {
@include column-fill(balance);
@include column-gap(0px);
@include column-width($thickColumnWidth);
padding: 4px;
&.thin-columns {
@include column-count(4);
@include column-width($thinColumnWidth);
}
& > div {
padding: 4px;
//stop divs breaking over multiple columns
-webkit-column-break-inside: avoid;
page-break-inside: avoid;
break-inside: avoid;
}
}
//Cards
.card {
background: white;
border-radius: 2px;
.top {
cursor: pointer;
padding: 16px;
border-radius: 2px 2px 0 0;
&.white {
cursor: auto;
padding: 16px;
border-bottom: rgba(0,0,0,0.12) solid 1px;
}
paper-checkbox::shadow #ink[checked] {
color: #ffffff;
}
paper-checkbox::shadow #ink {
color: #ffffff;
}
paper-checkbox::shadow #checkbox.checked {
background-color: #ffffff;
background-color: rgba(255,255,255,0.27);
border-color: #ffffff;
border-color: rgba(255,255,255,0.27);
}
paper-checkbox::shadow #checkbox {
border-color: #ffffff;
border-color: rgba(255,255,255,0.54);
}
}
.bottom {
padding: 16px;
border-radius: 0 0 2px 2px;
&.list {
padding: 0 0 16px 0;
.subhead {
color: rgba(0,0,0,0.54);
font-size: 14px;
font-weight: 500;
letter-spacing: 0.010em;
padding: 12px 16px 12px 16px;
}
}
&.text {
white-space: pre-wrap;
}
}
.left {
padding: 16px;
border-radius: 2px 0 0 2px;
text-align: center;
min-width: 72px;
}
.right {
padding: 16px;
border-radius: 0 2px 2px 0;
}
}
/* undo pointer cursor on detail box heading */
#globalDetail.card .top {
cursor: auto;
}

View File

@@ -70,6 +70,10 @@
background-color: #9E9E9E; background-color: #9E9E9E;
} }
.blue-grey {
background-color: #607D8B;
}
.app-grey { .app-grey {
background-color: #424242; background-color: #424242;
} }
@@ -80,4 +84,4 @@
.black { .black {
background-color: #262626; background-color: #262626;
} }

View 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);
}

View File

@@ -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);
}
}

View File

@@ -1,7 +1,4 @@
@import "bourbon/bourbon"; /*apply a natural box layout model to all elements*/
@import "colors";
//apply a natural box layout model to all elements
*, *:before, *:after { *, *:before, *:after {
-moz-box-sizing: border-box; -moz-box-sizing: border-box;
-webkit-box-sizing: border-box; -webkit-box-sizing: border-box;
@@ -19,17 +16,7 @@ body {
background-color: #E0E0E0; background-color: #E0E0E0;
} }
//fix tabs and core-toolbar having box shadow /*Paragraphs*/
core-toolbar {
box-shadow: none;
}
//give drawer panel a shadow always
core-header-panel[drawer] {
box-shadow: 2px 0px 5px 0px rgba(0,0,0,0.2);
}
//Paragraphs
p { p {
margin-bottom: 8px; margin-bottom: 8px;
} }
@@ -46,14 +33,48 @@ hr {
text-align: center; text-align: center;
} }
//FABs .avatar {
.floatyButton { display: inline-block;
position: absolute; box-sizing: border-box;
bottom: 24px; width: 40px;
right: 24px; height: 40px;
border-radius: 50%;
font-size: 26px;
font-color: rgba(255, 255, 255, 0.58) !important;
} }
//Buttons /*
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 { paper-button {
color: #000; color: #000;
color: rgba(0,0,0,0.87); color: rgba(0,0,0,0.87);
@@ -63,7 +84,12 @@ paper-button {
text-transform: uppercase; text-transform: uppercase;
} }
//Style shortcuts dicecloud-selector paper-item {
white-space: nowrap;
overflow: hidden;
}
/*Style shortcuts*/
.scroll-y { .scroll-y {
overflow-y: auto; overflow-y: auto;
} }

View File

@@ -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;
}

View 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;
}

View File

@@ -1,21 +0,0 @@
td {
padding: 8px;
}
.strengthTable{
width: 100%;
td{
&:nth-child(2) {
text-align: right;
}
&:nth-child(3) {
width: 250px;
}
}
}
.summaryTable {
&:nth-child(3){
text-align: right;
}
}

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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 class="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 class="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 class="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 class="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 class="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>

View File

@@ -15,7 +15,7 @@ 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");
}, },
@@ -31,9 +31,8 @@ Template.attackEdit.events({
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;
},
}); });

View File

@@ -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}}

View File

@@ -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}}&nbsp;{{damageType}} {{evaluateString charId damage}}&nbsp;{{damageType}}
</div> </div>
{{#if details}} {{#if details}}
<div class="caption"> <div class="paper-font-caption">
{{details}} {{details}}
</div> </div>
{{/if}} {{/if}}

View File

@@ -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>

View File

@@ -1,27 +1,24 @@
<template name="characterSettings"> <template name="characterSettings">
{{#with character}} {{#with character}}
<div style="height: 100px;"> <div class="fit layout vertical">
<table style="width: 100%;"> <app-header-layout has-scrolling-region class="feedback flex">
<tr> <app-header fixed effects="waterfall">
<td>Hide Spells tab</td> <app-toolbar>
<td> <div main-title>Character Settings</div>
<paper-toggle-button id="hideSpellcasting" </app-toolbar>
checked={{settings.hideSpellcasting}} </app-header>
touch-action="pan-y"> <div class="form flex">
</paper-toggle-button> <paper-toggle-button id="hideSpellcasting" checked={{settings.hideSpellcasting}}>
</td> Hide Spells tab
</tr> </paper-toggle-button>
<tr> <paper-toggle-button id="variantEncumbrance" checked={{settings.useVariantEncumbrance}}>
<td>Use variant encumbrance</td> Use variant encumbrance
<td> </paper-toggle-button>
<paper-toggle-button id="variantEncumbrance" </div>
checked={{settings.useVariantEncumbrance}} </app-header-layout>
touch-action="pan-y"> <div class="buttons layout horizontal end-justified">
</paper-toggle-button> <paper-button class="doneButton"> Done </paper-button>
</td> </div>
</tr>
</table>
</div> </div>
{{/with}} {{/with}}
<paper-button id="doneButton" affirmative> Done </paper-button>
</template> </template>

View File

@@ -23,4 +23,7 @@ Template.characterSettings.events({
); );
} }
}, },
"click .doneButton": function(event, instance){
popDialogStack();
},
}); });

View File

@@ -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>

View File

@@ -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();
},
}); });

View File

@@ -1,54 +1,65 @@
<template name="shareDialog"> <template name="shareDialog">
<div style="width: 360px;"> <div class="fit layout vertical">
<div layout horizontal center> <app-header-layout has-scrolling-region class="feedback flex">
<div>Who can view this character: </div> <app-header fixed effects="waterfall">
<paper-dropdown-menu class="visibilityDropdown" <app-toolbar>
label="Visibility"> <div main-title>Share</div>
<paper-dropdown layered class="dropdown"> </app-toolbar>
<core-menu class="menu visibilityMenu" selected={{viewPermission}}> </app-header>
<paper-item name="whitelist">Only people I share with</paper-item> <div class="form flex">
<paper-item name="public">Anyone with link</paper-item> <paper-dropdown-menu label="Who can view this character">
</core-menu> <dicecloud-selector class="visibilityDropdown dropdown-content" selected={{viewPermission}}>
</paper-dropdown> <paper-item name="whitelist">Only people I share with</paper-item>
</paper-dropdown-menu> <paper-item name="public">Anyone with link</paper-item>
</dicecloud-selector>
</paper-dropdown-menu>
<div class="layout horizontal center wrap">
<paper-input class="flex" id="userNameOrEmailInput" label="Share with 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>
<paper-radio-group id="accessLevelMenu" selected="read">
<paper-radio-button name="read">View Only</paper-radio-button>
<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>
{{#if readers.count}}
<div style="font-weight: 500;">
Can View
</div>
{{#each readers}}
<div layout horizontal center>
<div flex>{{getUserName}}</div>
<paper-icon-button class="deleteShare" icon="delete"></paper-icon-button>
</div>
{{/each}}
{{/if}}
{{#if writers.count}}
<div style="font-weight: 500;">
Can Edit
</div>
{{#each writers}}
<div layout horizontal center>
<div flex>{{username}}</div>
<paper-icon-button class="deleteShare" icon="delete"></paper-icon-button>
</div>
{{/each}}
{{/if}}
</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>

View File

@@ -1,5 +1,19 @@
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({
@@ -9,11 +23,16 @@ Template.shareDialog.helpers({
}, },
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();
@@ -23,15 +42,11 @@ Template.shareDialog.helpers({
return "User not found"; return "User not found";
} }
}, },
getUserName: function() {
return this.username || "user: " + this._id;
}
}); });
Template.shareDialog.events({ Template.shareDialog.events({
"core-select .visibilityDropdown": function(event){ "iron-select .visibilityDropdown": 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 char = Characters.findOne(this._id, {fields: {settings: 1}}); var char = Characters.findOne(this._id, {fields: {settings: 1}});
if (value == char.settings.viewPermission) return; if (value == char.settings.viewPermission) return;
@@ -50,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";
@@ -68,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();
},
}); });

View File

@@ -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;
}

View File

@@ -1,54 +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> <div class="flex character-name">
{{#if canEditCharacter _id}} {{name}}
<div> </div>
{{> colorDropdown}} {{#if canEditCharacter _id}}
</div> {{> colorDropdown}}
<paper-menu-button> <paper-menu-button class="character-menu" horizontal-align="right">
<paper-icon-button icon="more-vert" noink></paper-icon-button> <paper-icon-button icon="more-vert" class="dropdown-trigger"></paper-icon-button>
<paper-dropdown class="dropdown" halign="right"> <paper-menu class="dropdown-content black87">
<core-menu class="menu" style="color: black; color: rgba(0,0,0,0.87);"> <paper-icon-item id="deleteCharacter">
<paper-item id="deleteCharacter"> <iron-icon icon="delete" item-icon></iron-icon>
<core-icon icon="delete"></core-icon>Delete Delete
</paper-item> </paper-icon-item>
<paper-item id="shareCharacter"> <paper-icon-item id="shareCharacter">
<core-icon icon="social:share"></core-icon>Share <iron-icon icon="social:share" item-icon></iron-icon>
</paper-item> Share
<paper-item id="characterSettings"> </paper-icon-item>
<core-icon icon="settings"></core-icon>Settings <paper-icon-item id="characterSettings">
</paper-item> <iron-icon icon="settings" item-icon></iron-icon>
</core-menu> Settings
</paper-dropdown> </paper-icon-item>
</paper-menu-button> </paper-menu>
{{/if}} </paper-menu-button>
<div class="bottom fit" horizontal layout> {{/if}}
<paper-tabs flex horizontal center layout id="characterSheetTabs" selected={{selectedTab}} class="{{colorClass}}"> </div>
<paper-tab name="stats">Stats</paper-tab> <div bottom-item>
<paper-tab name="features">Features</paper-tab> <paper-tabs id="characterSheetTabs" selected={{selectedTab}} class="{{colorClass}}">
<paper-tab name="inventory">Inventory</paper-tab> <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}} {{#unless hideSpellcasting}}
<paper-tab name="spells">Spells</paper-tab> <div name="spells" class="tab-page fit">{{> spells}}</div>
{{/unless}} {{/unless}}
<paper-tab name="persona">Persona</paper-tab> <div name="persona" class="tab-page fit">{{> persona}}</div>
<paper-tab name="journal">Journal</paper-tab> <div name="journal" class="tab-page fit">{{> journal}}</div>
</paper-tabs> </iron-pages>
</div> </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>
{{#unless hideSpellcasting}}
<section flex name="spells">{{> spells}}</section>
{{/unless}}
<section flex name="persona">{{> persona}}</section>
<section flex name="journal">{{> journal}}</section>
</core-animated-pages>
</div> </div>
</template> </template>

View File

@@ -1,11 +1,162 @@
Template.characterSheet.onCreated(function() { let tabPages, tabSliders, tabFabs, tabFabMenus;
//default to the first tab Template.characterSheet.onRendered(function() {
Session.setDefault(this.data._id + ".selectedTab", "stats"); //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 //watch this character and make sure their encumbrance is updated
trackEncumbranceConditions(this.data._id, this); //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);
}; };
@@ -24,34 +175,32 @@ Template.characterSheet.helpers({
}); });
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,
}); });
}, },
"tap #characterSettings": function(event, instance){ "click #characterSettings": function(event, instance){
GlobalUI.showDialog({ pushDialogStack({
heading: this.name + " Settings",
data: this, data: this,
template: "characterSettings", template: "characterSettings",
element: event.currentTarget.parentElement.parentElement,
}); });
}, },
}); });

View File

@@ -1,22 +1,15 @@
html /deep/ .operationDropDown { .effectEdit .operationDropDown {
width: 152px; width: 152px;
} }
html /deep/ .statDropDown { .effectEdit .statDropDown {
width: 152px; width: 152px;
} }
html /deep/ .damageMultiplierDropDown { .effectEdit .damageMultiplierDropDown {
width: 152px; width: 152px;
} }
html /deep/ .effectEdit paper-input { .effectEdit .deleteEffect {
position: relative; flex-shrink: 0;
bottom: 5px;
}
html /deep/ .effectEdit {
height: 64px;
display: flex;
align-items: flex-end;
} }

View File

@@ -1,36 +1,30 @@
<template name="effectEdit"> <template name="effectEdit">
<div class="effectEdit" layout horizontal center> <div class="effectEdit layout horizontal center">
<paper-dropdown-menu class="statDropDown" <paper-dropdown-menu label="Stat" class="statDropDown" dynamic-align>
label="Stat"> <dicecloud-selector class="statMenu dropdown-content" selected={{stat}} selectable="paper-item">
<paper-dropdown layered {{#each statGroups}}
class="dropdown"> <div style="font-weight: bold; margin-top: 16px; padding-left: 8px;">
<core-menu class="menu statMenu" selected={{stat}}> {{this}}
{{#each statGroups}} </div>
<div style="font-weight: bold; {{#each stats}}
margin-top: 16px;">{{this}}</div> <paper-item name={{stat}}>{{name}}</paper-item>
{{#each stats}} {{/each}}
<paper-item name={{stat}}>{{name}}</paper-item> {{/each}}
{{/each}} </dicecloud-selector>
{{/each}}
</core-menu>
</paper-dropdown>
</paper-dropdown-menu> </paper-dropdown-menu>
{{#if operations}} {{#if operations}}
<paper-dropdown-menu class="operationDropDown" <paper-dropdown-menu class="operationDropDown" label="Operation" dynamic-align>
label="Operation"> <dicecloud-selector class="dropdown-content operationMenu" selected={{operation}}>
<paper-dropdown layered class="dropdown"> {{#each operations}}
<core-menu class="menu operationMenu" selected={{operation}}> <paper-item name={{operation}}>{{name}}</paper-item>
{{#each operations}} {{/each}}
<paper-item name={{operation}}>{{name}}</paper-item> </dicecloud-selector>
{{/each}}
</core-menu>
</paper-dropdown>
</paper-dropdown-menu> </paper-dropdown-menu>
{{/if}} {{/if}}
{{#if effectValueTemplate}} {{#if effectValueTemplate}}
{{> Template.dynamic template=effectValueTemplate}} {{> Template.dynamic template=effectValueTemplate}}
{{else}} {{else}}
<div flex></div> <div class="flex"></div>
{{/if}} {{/if}}
<paper-icon-button class="deleteEffect" <paper-icon-button class="deleteEffect"
icon="delete"> icon="delete">
@@ -40,27 +34,22 @@
</template> </template>
<template name="regularEffectValue"> <template name="regularEffectValue">
<paper-input class="effectValueInput" <paper-input class="effectValueInput flex"
label="Value" label="Value"
floatinglabel floatinglabel
value={{effectValue}} value={{effectValue}}
flex
style="flex-basis: 100px;"> style="flex-basis: 100px;">
</paper-input> </paper-input>
</template> </template>
<template name="multiplierEffectValue"> <template name="multiplierEffectValue">
<paper-dropdown-menu class="damageMultiplierDropDown" <paper-dropdown-menu class="damageMultiplierDropDown" label="Damage Multiplier" dynamic-align>
label="Damage Multiplier"> <dicecloud-selector class="menu multiplierMenu dropdown-content"
<paper-dropdown layered
class="dropdown">
<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 flex></div> <div class="flex"></div>
</template> </template>

View File

@@ -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"},
@@ -68,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);
@@ -80,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"},
@@ -91,7 +94,7 @@ 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.helpers({ Template.effectEdit.helpers({
@@ -125,7 +128,7 @@ Template.effectEdit.helpers({
//default template //default template
return "regularEffectValue"; return "regularEffectValue";
} },
}); });
Template.regularEffectValue.helpers({ Template.regularEffectValue.helpers({
@@ -135,33 +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 .statDropDown": function(event){ "iron-select .statDropDown": function(event){
var detail = event.originalEvent.detail; 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){
@@ -174,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}});
} }
} },
}); });

View File

@@ -99,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"},

View File

@@ -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>

View File

@@ -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}}

View File

@@ -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>
@@ -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}}

View File

@@ -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"){

View File

@@ -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%;
} }

View File

@@ -1,44 +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> <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}}&nbsp;{{damageType}} {{evaluateString ../_id damage}}&nbsp;{{damageType}}
</div> </div>
{{#if details}} {{#if details}}
<div class="caption"> <div>
{{details}} {{details}}
</div> </div>
{{/if}} {{/if}}
@@ -48,47 +45,44 @@
</div> </div>
{{/each}} {{/each}}
</div> </div>
</paper-shadow> </paper-material>
</div> </div>
<!--Proficiencies--> <!--Proficiencies-->
<div> <div>
<paper-shadow class="card"> <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> </div>
<!--features--> <!--features-->
{{#each features}} {{#each features}}
<div> <div>
<paper-shadow class="card featureCard" <paper-material class="card featureCard" data-id={{_id}}>
hero-id="main" {{detailHero}}> <div class="top {{colorClass}} paper-font-subhead layout horizontal">
<div class="top {{colorClass}} subhead" <div class="flex">
layout horizontal
hero-id="toolbar" {{detailHero}}>
<div flex hero-id="title" {{detailHero}}>
{{name}} {{name}}
</div> </div>
{{#if hasUses}} {{#if hasUses}}
@@ -97,22 +91,22 @@
</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}}> 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"> <div class="bottom flex">
{{#markdown}}{{evaluateString charId shortDescription}}{{/markdown}} {{#markdown}}{{evaluateShortString charId description}}{{/markdown}}
</div> </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
@@ -123,21 +117,16 @@
</paper-button> </paper-button>
</div> </div>
{{/if}} {{/if}}
</paper-shadow> </paper-material>
</div> </div>
{{/each}} {{/each}}
</div>
<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>
@@ -145,12 +134,8 @@
<template name="resource"> <template name="resource">
{{#if characterCalculate "attributeBase" char._id name}} {{#if characterCalculate "attributeBase" char._id name}}
<div> <div>
<paper-shadow class="card" <paper-material class="card layout horizontal">
hero-id="main" {{detailHero name char._id}} <div class="left {{getColor}} paper-font-display1 white-text layout horizontal center">
layout horizontal>
<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"
@@ -164,11 +149,10 @@
<div>{{characterCalculate "attributeValue" char._id 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> </div>
{{/if}} {{/if}}
</template> </template>

View File

@@ -3,11 +3,6 @@ Template.features.helpers({
var features = Features.find({charId: this._id}, {sort: {color: 1, name: 1}}); var features = Features.find({charId: this._id}, {sort: {color: 1, name: 1}});
return features; return features;
}, },
shortDescription: function() {
if (_.isString(this.description)){
return this.description.split(/^( *[-*_]){3,} *(?:\n+|$)/m)[0];
}
},
hasUses: function(){ hasUses: function(){
return this.usesValue() > 0; return this.usesValue() > 0;
}, },
@@ -43,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){
@@ -122,7 +108,7 @@ Template.resource.helpers({
}); });
Template.resource.events({ Template.resource.events({
"tap .resourceUp": function(event){ "click .resourceUp": function(event){
var value = Characters.calculate.attributeValue(this.char._id, this.name); var value = Characters.calculate.attributeValue(this.char._id, this.name);
var base = Characters.calculate.attributeBase(this.char._id, this.name); var base = Characters.calculate.attributeBase(this.char._id, this.name);
if (value < base){ if (value < base){
@@ -131,7 +117,7 @@ Template.resource.events({
Characters.update(this.char._id, modifier, {validate: false}); Characters.update(this.char._id, modifier, {validate: false});
} }
}, },
"tap .resourceDown": function(event){ "click .resourceDown": function(event){
var value = Characters.calculate.attributeValue(this.char._id, this.name); var value = Characters.calculate.attributeValue(this.char._id, this.name);
if (value > 0){ if (value > 0){
var modifier = {$inc: {}}; var modifier = {$inc: {}};
@@ -139,11 +125,11 @@ Template.resource.events({
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,
}); });
}, },
}); });

View File

@@ -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);
}

View File

@@ -24,7 +24,7 @@ Template.carryCapacityBar.onCreated(function() {
var self = this; var self = this;
self.carriedFraction = new ReactiveVar(0); self.carriedFraction = new ReactiveVar(0);
self.autorun(function() { self.autorun(function() {
self.carriedFraction.set(getFractionCarried(self.data)); self.carriedFraction.set(getFractionCarried(Template.currentData()));
}); });
}); });

View File

@@ -1,14 +0,0 @@
.carryCapacityBar {
background-color: #7DC580;
background-color: rgba(255,255,255,0.27);
position: relative;
height: 4px;
div{
height: 100%;
position: absolute;
}
.tick {
border-right: solid 2px #E5E5E5;
border-right-color: rgba(255,255,255,0.54);
}
}

View File

@@ -1,17 +1,17 @@
<template name="carryDialog"> <template name="carryDialog">
{{#baseDialog title="Weight Carried" class=color hideEdit=true}} {{#baseDialog title="Weight Carried" class=color hideEdit=true}}
<div layout horizontal center-justified end> <div class="layout horizontal center-justified end">
<div class="display2"> <div class="paper-font-display2">
{{round carriedWeight 1}} {{round carriedWeight 1}}
</div> </div>
<div class="display1"> <div class="paper-font-display1">
lbs lbs
</div> </div>
</div> </div>
<hr class="vertMargin"> <hr class="vertMargin">
{{> carryCapacityTable}} {{> carryCapacityTable}}
{{/baseDialog}} {{/baseDialog}}
</template> </template>

View File

@@ -11,32 +11,26 @@
<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>{{round 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>{{round 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>{{round 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}}

View File

@@ -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,
});
}, },
}); });

View File

@@ -1,169 +1,160 @@
<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>
<div> <paper-material class="card">
<paper-shadow class="card"> <div class="white top layout horizontal center">
<div class="white top" layout horizontal center> <div class="paper-font-subhead flex">
<div class="subhead" flex> Net Worth
Net Worth
</div>
<div>
{{valueString netWorth}}
</div>
</div> </div>
</paper-shadow>
</div>
<!--Weight Carried-->
<div>
<paper-shadow class="card"
hero-id="main" {{detailHero "weightCarried" _id}}>
<div class="top green white-text weightCarried"
hero-id="toolbar" {{detailHero "weightCarried" _id}}
layout horizontal center>
<div class="subhead" flex>
Weight Carried
</div>
<div>
{{round weightCarried}}lbs
</div>
</div>
<div class="bottom green" style="padding: 0;">
{{> carryCapacityBar}}
</div>
{{#if encumberedBuffs.count}}
<div class="bottom list">
{{#each encumberedBuffs}}
<div class="item-slot">
<div class="item buff"
hero-id="main" {{detailHero}}
layout horizontal center>
<div flex>
<core-icon icon="work"
style="margin-right: 16px">
</core-icon>
{{name}}
</div>
</div>
</div>
{{/each}}
</div>
{{/if}}
</paper-shadow>
</div>
<!--Equipment-->
<div>
<paper-shadow class="card equipmentContainer">
<div class="white top" layout horizontal center>
<div class="subhead" flex>
Equipment
</div>
<div class="caption" style="margin-right: 8px">
{{valueString equipmentValue}}
</div>
<div class="caption">
{{round equipmentWeight}}lbs
</div>
</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>
</div>
<!--Carried Items-->
<div>
<paper-shadow class="card carriedContainer">
<div class="white top" layout horizontal center>
<div class="subhead" flex>
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>
</div>
{{#each containers}}
<div> <div>
<paper-shadow class="card itemContainer" {{valueString netWorth}}
hero-id="main" {{detailHero}}> </div>
<div class="top {{colorClass}}" </div>
hero-id="toolbar" {{detailHero}} </paper-material>
layout horizontal center> </div>
<div class="subhead" flex <!--Weight Carried-->
hero-id="title" {{detailHero}}> <div>
<paper-material class="card">
<div class="top green white-text weightCarried layout horizontal center">
<div class="paper-font-subhead" flex>
Weight Carried
</div>
<div>
{{round weightCarried}}lbs
</div>
</div>
<div class="bottom green" style="padding: 0;">
{{> carryCapacityBar}}
</div>
{{#if encumberedBuffs.count}}
<div class="bottom list">
{{#each encumberedBuffs}}
<div class="item-slot">
<div class="item buff layout horizontal center">
<div class="flex">
<iron-icon icon="work"
style="margin-right: 16px">
</iron-icon>
{{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"
disabled={{#unless canEditCharacter charId}}true{{/unless}}
checked={{isCarried}}>
</paper-checkbox>
</core-tooltip>
</div> </div>
<div class="bottom list">
{{#each items ../_id _id}}
{{>inventoryItem}}
{{/each}}
</div>
</paper-shadow>
</div> </div>
{{/each}} {{/each}}
</div>
{{/if}}
</paper-material>
</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={{canEditCharacter charId}}> <div class="itemName flex">
<div flex class="itemName">
{{#if ne1 quantity}}{{quantity}}&nbsp;{{/if}}{{pluralName}} {{#if ne1 quantity}}{{quantity}}&nbsp;{{/if}}{{pluralName}}
</div> </div>
{{#if settings.showIncrement}}{{#if canEditCharacter charId}} {{#if settings.showIncrement}}{{#if canEditCharacter charId}}

View File

@@ -91,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;
@@ -121,101 +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 .weightCarried": function(event) { "click .weightCarried": function(event, instance) {
var charId = this._id; var charId = this._id;
GlobalUI.setDetail({ pushDialogStack({
template: "carryDialog", template: "carryDialog",
data: {charId: charId, color: "green"}, data: {charId: charId, color: "green"},
heroId: charId + "weightCarried", element: event.currentTarget.parentElement,
}); });
}, },
"tap .buff": function(event){ "click .buff": function(event, instance){
var buffId = this._id; var buffId = this._id;
var charId = Template.parentData()._id; var charId = Template.parentData()._id;
GlobalUI.setDetail({ pushDialogStack({
template: "buffDialog", template: "buffDialog",
data: {buffId: buffId, charId: charId}, data: {buffId: buffId, charId: charId},
heroId: buffId, element: event.currentTarget,
}); });
}, },
"tap .inventoryItem": function(event){ "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),
}); });
}, },
"hold .inventoryItem": function(event, instance) { "click .incrementButtons": function(event, instance) {
var itemId = this._id;
var charId = Template.parentData()._id;
var containerId = this.parent.id;
GlobalUI.showDialog({
template: "moveItemDialog",
data: {
charId: charId,
itemId: itemId,
containerId: containerId,
},
heading: "Move " + this.pluralName(),
});
},
"tap .incrementButtons": function(event) {
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;
@@ -271,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,
@@ -294,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 {
@@ -312,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,

View File

@@ -9,11 +9,11 @@
</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>
@@ -26,74 +26,47 @@
</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>

View File

@@ -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);
} }

View File

@@ -21,10 +21,10 @@
{{#each containers}} {{#each containers}}
<paper-item name={{_id}} <paper-item name={{_id}}
layout horizontal center> layout horizontal center>
<core-icon icon="image:brightness-1" <iron-icon icon="image:brightness-1"
style="color: {{hexColor color}}; style="color: {{hexColor color}};
margin-right: 16px;"> margin-right: 16px;">
</core-icon> </iron-icon>
<div>{{name}}</div> <div>{{name}}</div>
</paper-item> </paper-item>
{{/each}} {{/each}}

View File

@@ -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>

View File

@@ -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;
}, },
}); });

View File

@@ -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>

View File

@@ -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,
});
}),
});

View File

@@ -1,7 +1,7 @@
<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}}
@@ -15,18 +15,12 @@
</template> </template>
<template name="experienceEdit"> <template name="experienceEdit">
<div horizontal layout> <div class="horizontal layout">
<!--Name--> <!--Name-->
<paper-input id="experienceNameInput" label="Name" floatinglabel value={{name}} flex></paper-input> <paper-input id="experienceNameInput" label="Name" value={{name}} class="flex"></paper-input>
<!--Value--> <!--Value-->
<paper-input-decorator label="Value" floatinglabel> <paper-input id="valueInput" type="number" value={{value}} label="Value"></paper-input>
<input id="valueInput" type="number" value={{value}}>
</paper-input-decorator>
</div> </div>
<!--Description--> <!--Description-->
<paper-input-decorator label="Description" floatinglabel layout vertical> <paper-textarea id="experienceDescriptionInput" label="Description" value={{description}}></paper-textarea>
<paper-autogrow-textarea>
<textarea id="experienceDescriptionInput" placeholder value={{description}}></textarea>
</paper-autogrow-textarea>
</paper-input-decorator>
</template> </template>

View File

@@ -1,7 +1,3 @@
Template.experienceEdit.onRendered(function(){
updatePolymerInputs(this);
});
Template.experienceDialog.helpers({ Template.experienceDialog.helpers({
experience: function(){ experience: function(){
Experiences.findOne(this.experienceId); Experiences.findOne(this.experienceId);
@@ -20,21 +16,40 @@ Template.experienceDialog.events({
instance.data.experienceId, instance.data.experienceId,
"Experiences", "Experience" "Experiences", "Experience"
); );
GlobalUI.closeDetail(); popDialogStack();
}, },
}); });
const debounce = (f) => _.debounce(f, 300);
Template.experienceEdit.events({ Template.experienceEdit.events({
"change #experienceNameInput": function(event){ "input #experienceNameInput, change #experienceNameInput":
debounce(function(event){
var value = event.currentTarget.value; var value = event.currentTarget.value;
Experiences.update(this._id, {$set: {name: value}}); Experiences.update(this._id, {
}, $set: {name: value}
"change #valueInput": function(event){ }, {
removeEmptyStrings: false,
trimStrings: false,
});
}),
"input #valueInput, change #valueInput":
debounce(function(event){
var value = +event.currentTarget.value; var value = +event.currentTarget.value;
Experiences.update(this._id, {$set: {value: value}}); Experiences.update(this._id, {
}, $set: {value: value}
"change #experienceDescriptionInput": function(event){ }, {
removeEmptyStrings: false,
});
}),
"input #experienceDescriptionInput":
debounce(function(event){
var value = event.currentTarget.value; var value = event.currentTarget.value;
Experiences.update(this._id, {$set: {description: value}}); Experiences.update(this._id, {
}, $set: {description: value}
}, {
removeEmptyStrings: false,
trimStrings: false,
});
}),
}); });

View File

@@ -1,108 +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">
<div><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 >{{characterCalculate "experience" _id}} XP</div>
<paper-icon-button class="black54" id="addXP" icon="add"
disabled={{#unless canEditCharacter _id}}true{{/unless}}></paper-icon-button>
</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></div>
<!--Class Table-->
<div><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 {{characterCalculate "level" _id}}
</div>
{{#if nextLevelXP}}
<div class="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"
hero-id="main" {{detailHero "race" _id}}
layout horizontal center>
{{race}}
</div>
</div>
{{#each classes}}
<div class="item-slot">
<div class="item class"
hero-id="main" {{detailHero}}
layout horizontal center>
{{name}}&nbsp;{{level}}
</div>
</div>
{{/each}}
</div>
</paper-shadow></div>
<!--Notes-->
{{#each notes}}
<div>
<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">{{#markdown}}{{description}}{{/markdown}}</div>
</paper-shadow>
</div> </div>
{{/each}} <div class="bottom list">
</div> {{#each experiences}}
<div class="fab-buffer"></div> <div class="item-slot">
<div class="item experience layout horizontal center" data-id={{_id}}>
<div class="flex">{{name}}</div>
<div class="xpValue">{{value}}</div>
</div>
</div>
{{/each}}
</div>
{{#if moreExperiencesOrCollapse}}
<div class="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-material>
</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}}&nbsp;{{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>

View File

@@ -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");});
}, },
}); });

View File

@@ -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>{{#markdown}}{{description}}{{/markdown}}</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>

View File

@@ -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,
}, });
}),
}); });

View File

@@ -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>

View File

@@ -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({

View File

@@ -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>

View File

@@ -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);
},
}); });

View File

@@ -2,10 +2,9 @@
{{#baseDialog title=name class="deep-purple white-text" hideColor="true" hideDelete="true" startEditing=startEditing}} {{#baseDialog title=name class="deep-purple white-text" hideColor="true" hideDelete="true" startEditing=startEditing}}
{{#with char}} {{#with char}}
<div>{{alignment}} {{gender}} {{race}}</div> <div>{{alignment}} {{gender}} {{race}}</div>
<core-image style="width: 350px; height: 350px; margin-top: 8px;" <iron-image style="width: 350px; height: 350px; margin-top: 8px;"
sizing="cover" sizing="contain"
hero-id="image" hero src={{picture}}></iron-image>
src={{picture}}></core-image>
{{/with}} {{/with}}
{{else}} {{else}}
{{#with char}} {{#with char}}
@@ -15,22 +14,21 @@
</template> </template>
<template name="personaDetailsEdit"> <template name="personaDetailsEdit">
<div layout horizontal center-justified> <div class="layout horizontal center-justified">
<div flex style="max-width: 350px;" layout vertical> <div class="flex layout vertical" style="max-width: 400px;">
<!--Name--> <!--Name-->
<paper-input id="nameInput" label="Name" floatinglabel value={{name}}></paper-input> <paper-input id="nameInput" label="Name" value={{name}}></paper-input>
<!--Alignment--> <!--Alignment-->
<paper-input id="alignmentInput" label="Alignment" floatinglabel value={{alignment}}></paper-input> <paper-input id="alignmentInput" label="Alignment" value={{alignment}}></paper-input>
<!--Gender--> <!--Gender-->
<paper-input id="genderInput" label="Gender" floatinglabel value={{gender}}></paper-input> <paper-input id="genderInput" label="Gender" value={{gender}}></paper-input>
<!--Race--> <!--Race-->
<paper-input id="raceInput" label="Race" floatinglabel value={{race}}></paper-input> <paper-input id="raceInput" label="Race" value={{race}}></paper-input>
<!--Picture--> <!--Picture-->
<paper-input id="pictureInput" label="Picture URL" floatinglabel value={{picture}}></paper-input> <paper-input id="pictureInput" label="Picture URL" value={{picture}}></paper-input>
<core-image style="height:350px; width: 100%; margin-top: 8px;" <iron-image style="margin-top: 8px; width: 100%; height: 400px;"
sizing="cover" sizing="contain"
hero-id="image" hero src={{picture}}></iron-image>
src={{picture}}></core-image>
</div> </div>
</div> </div>
</template> </template>

View File

@@ -1,7 +1,3 @@
Template.personaDetailsEdit.onRendered(function(){
updatePolymerInputs(this);
});
Template.personaDetailsDialog.helpers({ Template.personaDetailsDialog.helpers({
char: function() { char: function() {
return Characters.findOne( return Characters.findOne(
@@ -11,25 +7,20 @@ Template.personaDetailsDialog.helpers({
} }
}); });
inputHandler = (field) => _.debounce(function(event){
var input = event.currentTarget.value;
Characters.update(this._id, {
$set: {[field]: input}
}, {
removeEmptyStrings: false,
trimStrings: false,
});
}, 300);
Template.personaDetailsEdit.events({ Template.personaDetailsEdit.events({
"change #nameInput": function(event){ "input #nameInput, change #nameInput": inputHandler("name"),
var input = event.currentTarget.value; "input #alignmentInput, change #alignmentInput": inputHandler("alignment"),
Characters.update(this._id, {$set: {name: input}}); "input #genderInput, change #genderInput": inputHandler("gender"),
}, "input #raceInput, change #raceInput": inputHandler("race"),
"change #alignmentInput": function(event){ "input #pictureInput, change #pictureInput": inputHandler("picture"),
var input = event.currentTarget.value;
Characters.update(this._id, {$set: {alignment: input}});
},
"change #genderInput": function(event){
var input = event.currentTarget.value;
Characters.update(this._id, {$set: {gender: input}});
},
"change #raceInput": function(event){
var input = event.currentTarget.value;
Characters.update(this._id, {$set: {race: input}});
},
"change #pictureInput": function(event){
var input = event.currentTarget.value;
Characters.update(this._id, {$set: {picture: input}});
},
}); });

View File

@@ -1,77 +1,66 @@
<template name="persona"> <template name="persona">
<div fit> <div class="column-container animation-slider">
<div id="persona" class="scroll-y" fit> {{#with characterDetails}}
<div class="column-container"> <div>
{{#with characterDetails}} <paper-material class="card">
<div> {{#unless picture}}
<paper-shadow class="card" <div class="top paper-font-subhead characterField {{colorClass}}">
hero-id="main" {{detailHero "details" _id}}> <div class="paper-font-subhead flex">
{{#unless picture}} {{name}}
<div class="top subhead characterField {{colorClass}}"
hero-id="toolbar" {{detailHero "details" _id}}>
<div class="subhead" flex
hero-id="title" {{detailHero "details" _id}}>
{{name}}
</div>
</div>
{{else}}
<core-image class="characterField clickable"
style="height:350px; width: 100%;
background-color: #e8e8e8;"
sizing="cover"
hero-id="image" {{detailHero "details" _id}}
src={{picture}}></core-image>
{{/unless}}
<div class="bottom">
{{#if picture}}
<div class="title" hero-id="title" {{detailHero "details" _id}}>
{{name}}
</div>
{{/if}}
<div class="subhead">
{{alignment}} {{gender}} {{race}}
</div> </div>
</div> </div>
</paper-shadow> {{else}}
</div> <iron-image class="characterField clickable"
{{/with}} style="height:350px; width: 100%;
<div>{{> containerCard characterField "description" "Description"}}</div> background-color: #424242;"
<div>{{> containerCard characterField "personality" "Personality Traits"}}</div> sizing="contain"
<div>{{> containerCard characterField "ideals" "Ideals"}}</div> src={{picture}}></iron-image>
<div>{{> containerCard characterField "bonds" "Bonds"}}</div> {{/unless}}
<div>{{> containerCard characterField "flaws" "Flaws"}}</div> <div class="bottom">
<div>{{> containerCard characterField "backstory" "Background"}}</div> {{#if picture}}
<div> <div class="paper-font-title">
<paper-shadow class="card"> {{name}}
<div class="white top subhead"> </div>
Languages {{/if}}
<div class="paper-font-subhead">
{{alignment}} {{gender}} {{race}}
</div>
</div> </div>
<div class="bottom list"> </paper-material>
{{#each languages}}
{{> proficiencyListItem}}
{{/each}}
</div>
</paper-shadow>
</div>
</div> </div>
{{/with}}
<div>{{> containerCard characterField "description" "Description"}}</div>
<div>{{> containerCard characterField "personality" "Personality Traits"}}</div>
<div>{{> containerCard characterField "ideals" "Ideals"}}</div>
<div>{{> containerCard characterField "bonds" "Bonds"}}</div>
<div>{{> containerCard characterField "flaws" "Flaws"}}</div>
<div>{{> containerCard characterField "backstory" "Background"}}</div>
<div>
<paper-material class="card">
<div class="white top paper-font-subhead">
Languages
</div>
<div class="bottom list">
{{#each languages}}
{{> proficiencyListItem}}
{{/each}}
</div>
</paper-material>
</div> </div>
</div> </div>
</template> </template>
<template name="containerCard"> <template name="containerCard">
{{#containerCardHelper this}}{{evaluateString _id body}}{{/containerCardHelper}} {{#containerCardHelper this}}{{evaluateShortString _id body}}{{/containerCardHelper}}
</template> </template>
<template name="containerCardHelper"> <template name="containerCardHelper">
<paper-shadow class="card {{class}}" <paper-material class="card {{class}}">
hero-id="main" {{detailHero field ../_id}}> <div class="top paper-font-subhead {{colorClass}} {{topClass}}">
<div class="top subhead {{colorClass}} {{topClass}}" <div class="paper-font-subhead flex">
hero-id="toolbar" {{detailHero field ../_id}}>
<div class="subhead" flex
hero-id="title" {{detailHero field ../_id}}>
{{title}} {{title}}
</div> </div>
</div> </div>
<div class="bottom">{{#markdown}}{{> UI.contentBlock}}{{/markdown}}</div> <div class="bottom">{{#markdown}}{{> UI.contentBlock}}{{/markdown}}</div>
</paper-shadow> </paper-material>
</template> </template>

View File

@@ -16,7 +16,6 @@ Template.persona.helpers({
char.field = "details"; char.field = "details";
char.title = char.name; char.title = char.name;
char.color = "d"; char.color = "d";
char.startEditing = true;
return char; return char;
}, },
characterField: function(field, title){ characterField: function(field, title){
@@ -39,28 +38,27 @@ Template.persona.helpers({
}); });
Template.persona.events({ Template.persona.events({
"tap .characterField": function(event){ "click .characterField": function(event){
if (this.field == "details"){ if (this.field == "details"){
this.charId = Template.parentData()._id; this.charId = Template.parentData()._id;
GlobalUI.setDetail({ pushDialogStack({
template: "personaDetailsDialog", template: "personaDetailsDialog",
data: this, data: this,
heroId: this._id + this.field, element: event.currentTarget.parentElement,
}); });
} else { } else {
var template = "textDialog"; var template = "textDialog";
if (this.field === "backstory") template = "backgroundDialog"; if (this.field === "backstory") template = "backgroundDialog";
var charId = Template.parentData()._id; var charId = Template.parentData()._id;
GlobalUI.setDetail({ pushDialogStack({
template: template, template: template,
data: { data: {
charId: charId, charId: charId,
field: this.field, field: this.field,
title: this.title, title: this.title,
color: this.color, color: this.color,
startEditing: true,
}, },
heroId: this._id + this.field, element: event.currentTarget.parentElement,
}); });
} }
} }

View File

@@ -1,5 +1,5 @@
<template name="textDialog"> <template name="textDialog">
{{#baseDialog title=title class=colorClass hideColor="true" hideDelete="true" startEditing=startEditing}} {{#baseDialog title=title class=colorClass hideColor="true" hideDelete="true"}}
<div>{{#markdown}}{{evaluateString charId value}}{{/markdown}}</div> <div>{{#markdown}}{{evaluateString charId value}}{{/markdown}}</div>
{{else}} {{else}}
{{> textDialogEdit}} {{> textDialogEdit}}
@@ -7,9 +7,6 @@
</template> </template>
<template name="textDialogEdit"> <template name="textDialogEdit">
<paper-input-decorator label={{title}} floatinglabel layout vertical> <paper-textarea label={{title}} id="textInput" value={{value}}>
<paper-autogrow-textarea> </paper-textarea>
<textarea id="textInput" placeholder value={{value}}></textarea>
</paper-autogrow-textarea>
</paper-input-decorator>
</template> </template>

View File

@@ -7,10 +7,6 @@ Template.textDialog.helpers({
} }
}); });
Template.textDialogEdit.onRendered(function(){
updatePolymerInputs(this);
});
Template.textDialogEdit.helpers({ Template.textDialogEdit.helpers({
value: function(){ value: function(){
var fieldSelector = {fields: {}}; var fieldSelector = {fields: {}};
@@ -21,10 +17,13 @@ Template.textDialogEdit.helpers({
}); });
Template.textDialogEdit.events({ Template.textDialogEdit.events({
"change #textInput": function(event){ "input #textInput": _.debounce(function(event){
var input = event.currentTarget.value; var input = event.currentTarget.value;
var setter = {$set: {}}; Characters.update(this.charId, {
setter.$set[this.field] = input; $set: {[this.field]: input}
Characters.update(this.charId, setter); }, {
} removeEmptyStrings: false,
trimStrings: false,
});
}, 300),
}); });

View File

@@ -1,23 +1,19 @@
<template name="proficiencyEdit"> <template name="proficiencyEdit">
<div layout horizontal around-justified> <div class="layout horizontal around-justified">
<paper-dropdown-menu class="typeDropDown" label="Stat Group" flex> <paper-dropdown-menu class="typeDropDown flex" label="Stat Group">
<paper-dropdown layered class="dropdown"> <dicecloud-selector class="typeMenu dropdown-content" selected={{type}}>
<core-menu class="menu typeMenu" selected={{type}}> {{#each proficiencyTypes}}
{{#each proficiencyTypes}}
<paper-item class="statGroupSelect" name={{type}}>{{name}}</paper-item> <paper-item class="statGroupSelect" name={{type}}>{{name}}</paper-item>
{{/each}} {{/each}}
</core-menu> </dicecloud-selector>
</paper-dropdown>
</paper-dropdown-menu> </paper-dropdown-menu>
{{> UI.dynamic template=nameInputTemplate}} {{> UI.dynamic template=nameInputTemplate}}
<paper-dropdown-menu class="valueDropDown" label="Proficiency" flex> <paper-dropdown-menu class="valueDropDown flex" label="Proficiency">
<paper-dropdown layered class="dropdown"> <dicecloud-selector class="valueMenu dropdown-content" selected={{value}}>
<core-menu class="menu valueMenu" selected={{value}}> <paper-item name="1">Proficient</paper-item>
<paper-item name="1">Proficient</paper-item> <paper-item name="0.5">Half Prof. Bonus</paper-item>
<paper-item name="0.5">Half Prof. Bonus</paper-item> <paper-item name="2">Double Prof. Bonus</paper-item>
<paper-item name="2">Double Prof. Bonus</paper-item> </dicecloud-selector>
</core-menu>
</paper-dropdown>
</paper-dropdown-menu> </paper-dropdown-menu>
<paper-icon-button class="deleteProficiency" <paper-icon-button class="deleteProficiency"
icon="delete"> icon="delete">
@@ -26,14 +22,12 @@
</template> </template>
<template name="nameDropdown"> <template name="nameDropdown">
<paper-dropdown-menu class="nameDropDown sideMargin" label="Proficiency" flex> <paper-dropdown-menu class="nameDropDown sideMargin flex" label="Proficiency">
<paper-dropdown layered class="dropdown"> <dicecloud-selector class="nameMenu dropdown-content" selected={{name}}>
<core-menu class="menu nameMenu" selected={{name}}> {{#each nameDropdownItems}}
{{#each nameDropdownItems}} <paper-item name={{stat}}>{{name}}</paper-item>
<paper-item name={{stat}}>{{name}}</paper-item> {{/each}}
{{/each}} </dicecloud-selector>
</core-menu>
</paper-dropdown>
</paper-dropdown-menu> </paper-dropdown-menu>
</template> </template>

View File

@@ -51,27 +51,24 @@ Template.proficiencyEdit.helpers({
}); });
Template.proficiencyEdit.events({ Template.proficiencyEdit.events({
"tap .deleteProficiency": function(event){ "click .deleteProficiency": function(event){
Proficiencies.softRemoveNode(this._id); Proficiencies.softRemoveNode(this._id);
GlobalUI.deletedToast(this._id, "Proficiencies", "Proficiency"); GlobalUI.deletedToast(this._id, "Proficiencies", "Proficiency");
}, },
"core-select .typeDropDown": function(event){ "iron-select .typeDropDown": function(event){
var detail = event.originalEvent.detail; var detail = event.originalEvent.detail;
if (!detail.isSelected) return;
var type = detail.item.getAttribute("name"); var type = detail.item.getAttribute("name");
if (type == this.type) return; if (type == this.type) return;
Proficiencies.update(this._id, {$set: {type: type}}); Proficiencies.update(this._id, {$set: {type: type}});
}, },
"core-select .valueDropDown": function(event){ "iron-select .valueDropDown": 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;
Proficiencies.update(this._id, {$set: {value: value}}); Proficiencies.update(this._id, {$set: {value: value}});
}, },
"core-select .nameDropDown": function(event){ "iron-select .nameDropDown": function(event){
var detail = event.originalEvent.detail; var detail = event.originalEvent.detail;
if (!detail.isSelected) return;
var name = detail.item.getAttribute("name"); var name = detail.item.getAttribute("name");
if (name == this.name) return; if (name == this.name) return;
Proficiencies.update(this._id, {$set: {name: name}}); Proficiencies.update(this._id, {$set: {name: name}});

View File

@@ -1,10 +1,8 @@
<!--needs to be given charId, parentId and parentCollection--> <!--needs to be given charId, parentId and parentCollection-->
<template name="proficiencyEditList"> <template name="proficiencyEditList">
{{#if proficiencies.count}} {{#if proficiencies.count}}
<hr class="vertMargin">
<div id="proficiencies"> <div id="proficiencies">
<h2>Proficiencies</h2> <div class="paper-font-title">Proficiencies</div>
{{#each proficiencies}} {{#each proficiencies}}
{{>proficiencyEdit}} {{>proficiencyEdit}}
{{/each}} {{/each}}
@@ -15,4 +13,4 @@
raised> raised>
Add Proficiency Add Proficiency
</paper-button> </paper-button>
</template> </template>

Some files were not shown because too many files have changed in this diff Show More