Redesigned the querying for the sale duplicates screen to use aggregation; Finished the styling of the sale duplicate screen; Tested the functionality of sale duplicates; Added a way to show hidden (ignored) duplicates.

This commit is contained in:
Wynne Crisman
2017-05-26 11:17:32 -07:00
parent e1b0b19589
commit 210517a5c2
42 changed files with 15153 additions and 8505 deletions

View File

@@ -10,6 +10,7 @@
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="meteor-packages-auto-import-npm" level="project" />
<orderEntry type="library" name="meteor-packages-auto-import-npm" level="project" />
<orderEntry type="library" name="meteor-packages-auto-import-browser" level="project" />
</component>
</module>

View File

@@ -7,10 +7,17 @@
<item url="file://C:/Tools/.meteor/packages/meteortoys_listen/3.0.0/web.browser/config/config.css" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_listen/3.0.0/web.browser/config/config.js" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_method/3.0.4/web.browser/lib/main.js" />
<item url="file://C:/Tools/.meteor/packages/rate-limit/1.0.8/web.browser/rate-limit.js" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_method/3.0.4/web.browser/client/main.css" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_method/3.0.4/web.browser/client/main.js" />
<item url="file://C:/Tools/.meteor/packages/observe-sequence/1.0.16/web.browser/observe_sequence.js" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_method/3.0.4/web.browser/ToyKit/main.css" />
<item url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.1.1/web.browser/codegen.js" />
<item url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.1.1/web.browser/templatetag.js" />
<item url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.1.1/web.browser/compiler.js" />
<item url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.1.1/web.browser/react.js" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_method/3.0.4/web.browser/ToyKit/main.js" />
<item url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.1.1/web.browser/optimizer.js" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_pub/3.0.4/web.browser/lib/main.js" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_pub/3.0.4/web.browser/client/main.css" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_pub/3.0.4/web.browser/client/main.js" />
@@ -31,73 +38,67 @@
<item url="file://C:/Tools/.meteor/packages/meteortoys_shell/3.0.0/web.browser/client/main.js" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_shell/3.0.0/web.browser/config/config.css" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_shell/3.0.0/web.browser/config/config.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.2.9/web.browser/sockjs-0.3.4.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.2.9/web.browser/random_stream.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.2.9/web.browser/stream_client_common.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.2.9/web.browser/livedata_connection.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.2.9/web.browser/stream_client_sockjs.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.2.9/web.browser/namespace.js" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_status/3.0.0/web.browser/client/main.css" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.2.9/web.browser/livedata_common.js" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_status/3.0.0/web.browser/client/main.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.2.9/web.browser/client_convenience.js" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_status/3.0.0/web.browser/config/config.css" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.2.9/web.browser/id_map.js" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_status/3.0.0/web.browser/config/config.js" />
<item url="file://C:/Tools/.meteor/packages/momentjs_moment/2.17.1/web.browser/moment.js" />
<item url="file://C:/Tools/.meteor/packages/momentjs_moment/2.17.1/web.browser/export.js" />
<item url="file://C:/Tools/.meteor/packages/tomwasd_history-polyfill/0.0.1/web.browser/packages/tomwasd_history-polyfill.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/dombackend.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/view.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/materializer.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/template.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/exceptions.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-replaces.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/attrs.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-instance-get.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/backcompat.js" />
<item url="file://C:/Tools/.meteor/packages/templating-tools/1.1.1/web.browser/html-scanner-tests.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-clear-event-maps.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/events.js" />
<item url="file://C:/Tools/.meteor/packages/templating-tools/1.1.1/web.browser/html-scanner.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-for-each-instance.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/lookup.js" />
<item url="file://C:/Tools/.meteor/packages/templating-tools/1.1.1/web.browser/compile-tags-with-spacebars.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-inherits-hooks-from.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/builtins.js" />
<item url="file://C:/Tools/.meteor/packages/templating-tools/1.1.1/web.browser/templating-tools.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-for-each.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/preamble.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-copy-as.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/domrange.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-inherits-helpers-from.js" />
<item url="file://C:/Tools/.meteor/packages/templating-tools/1.1.1/web.browser/code-generation.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-register-helpers.js" />
<item url="file://C:/Tools/.meteor/packages/templating-tools/1.1.1/web.browser/throw-compile-error.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-instance-parent.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/hooks.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-parent-data-function.js" />
<item url="file://C:/Tools/.meteor/packages/blaze-tools/1.0.10/web.browser/tokens.js" />
<item url="file://C:/Tools/.meteor/packages/tracker/1.1.3/web.browser/tracker.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-hooks.js" />
<item url="file://C:/Tools/.meteor/packages/blaze-tools/1.0.10/web.browser/tojs.js" />
<item url="file://C:/Tools/.meteor/packages/tracker/1.1.3/web.browser/deprecated.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-inherits-events-from.js" />
<item url="file://C:/Tools/.meteor/packages/blaze-tools/1.0.10/web.browser/preamble.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n.coffee" />
<item url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-global-hooks.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/ko.coffee" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/pt_PT.coffee" />
<item url="file://C:/Tools/.meteor/packages/url/1.1.0/web.browser/url_client.js" />
<item url="file://C:/Tools/.meteor/packages/arillo_flow-router-helpers/0.5.2/web.browser/client/helpers.coffee" />
<item url="file://C:/Tools/.meteor/packages/caching-compiler/1.1.9/web.browser/multi-file-caching-compiler.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/et.coffee" />
<item url="file://C:/Tools/.meteor/packages/url/1.1.0/web.browser/url_common.js" />
<item url="file://C:/Tools/.meteor/packages/caching-compiler/1.1.9/web.browser/caching-compiler.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/no_NB.coffee" />
<item url="file://C:/Tools/.meteor/packages/webapp/1.3.15/web.browser/webapp_client.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/fr.coffee" />
<item url="file://C:/Tools/.meteor/packages/webapp/1.3.15/web.browser/webapp_cordova.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/es.coffee" />
<item url="file://C:/Tools/.meteor/packages/webapp/1.3.15/web.browser/webapp_tests.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/kh.coffee" />
<item url="file://C:/Tools/.meteor/packages/webapp/1.3.15/web.browser/webapp_client_tests.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/sk.coffee" />
<item url="file://C:/Tools/.meteor/packages/mizzao_bootboxjs/4.4.0/web.browser/packages/mizzao_bootboxjs.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/sv.coffee" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/sl.coffee" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/es_ES.coffee" />
<item url="file://C:/Tools/.meteor/packages/webapp/1.3.15/web.browser/webapp_server.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/it.coffee" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/uk.coffee" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/hu.coffee" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/hr.coffee" />
<item url="file://C:/Tools/.meteor/packages/momentjs_moment/2.18.1/web.browser/moment.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/id.coffee" />
<item url="file://C:/Tools/.meteor/packages/momentjs_moment/2.18.1/web.browser/export.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/tr.coffee" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/ja.coffee" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/zh_TW.coffee" />
@@ -110,42 +111,66 @@
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/en.coffee" />
<item url="file://C:/Tools/.meteor/packages/zimme_active-route/2.3.2/web.browser/packages/zimme_active-route.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/ru.coffee" />
<item url="file://C:/Tools/.meteor/packages/accounts-password/1.3.6/web.browser/password_server.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/ro.coffee" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/fa.coffee" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/zh_CN.coffee" />
<item url="file://C:/Tools/.meteor/packages/autoupdate/1.3.12/web.browser/autoupdate_client.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/cs.coffee" />
<item url="file://C:/Tools/.meteor/packages/accounts-password/1.3.6/web.browser/email_templates.js" />
<item url="file://C:/Tools/.meteor/packages/caching-html-compiler/1.0.7/web.browser/caching-html-compiler.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/pl.coffee" />
<item url="file://C:/Tools/.meteor/packages/accounts-password/1.3.6/web.browser/email_tests_setup.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/de.coffee" />
<item url="file://C:/Tools/.meteor/packages/accounts-password/1.3.6/web.browser/password_client.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/da.coffee" />
<item url="file://C:/Tools/.meteor/packages/accounts-password/1.3.6/web.browser/password_tests.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-common/1.2.8/web.browser/random_stream.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/nl.coffee" />
<item url="file://C:/Tools/.meteor/packages/ddp-common/1.2.8/web.browser/method_invocation.js" />
<item url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/ca.coffee" />
<item url="file://C:/Tools/.meteor/packages/ddp-common/1.2.8/web.browser/namespace.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-password/1.3.6/web.browser/password_tests_setup.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-common/1.2.8/web.browser/utils.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-password/1.3.6/web.browser/email_tests.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-common/1.2.8/web.browser/heartbeat.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/accounts_client_tests.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/accounts_client.js" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/methods.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/accounts_rate_limit.js" />
<item url="file://C:/Tools/.meteor/packages/fastclick/1.0.13/web.browser/pre.js" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/field.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/accounts_server.js" />
<item url="file://C:/Tools/.meteor/packages/fastclick/1.0.13/web.browser/post.js" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/utils.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/accounts_tests_setup.js" />
<item url="file://C:/Tools/.meteor/packages/fastclick/1.0.13/web.browser/fastclick.js" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/client.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/accounts_reconnect_tests.js" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/core.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/accounts_tests.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/accounts_url_tests.js" />
<item url="file://C:/Tools/.meteor/packages/html-tools/1.0.11/web.browser/scanner.js" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_oauth.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/client_tests.js" />
<item url="file://C:/Tools/.meteor/packages/html-tools/1.0.11/web.browser/templatetag.js" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_form.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/localstorage_token.js" />
<item url="file://C:/Tools/.meteor/packages/html-tools/1.0.11/web.browser/tokenize.js" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_sep.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/accounts_common.js" />
<item url="file://C:/Tools/.meteor/packages/html-tools/1.0.11/web.browser/utils.js" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_message.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/url_server.js" />
<item url="file://C:/Tools/.meteor/packages/html-tools/1.0.11/web.browser/charref.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/client_main.js" />
<item url="file://C:/Tools/.meteor/packages/html-tools/1.0.11/web.browser/parse.js" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_pwd_form.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/server_main.js" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_nav_button.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/server_tests.js" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_pwd_form_btn.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/url_client.js" />
<item url="file://C:/Tools/.meteor/packages/htmljs/1.0.11/web.browser/html.js" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_social.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_collection2-core/1.2.0/web.browser/lib/collection2.js" />
@@ -161,13 +186,14 @@
<item url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_title.js" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_reCaptcha.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_schema-index/1.1.1/web.browser/lib/indexing.js" />
<item url="file://C:/Tools/.meteor/packages/ostrio_loggermongo/1.1.3/web.browser/loggermongo.coffee" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_input.js" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_resend_verification_email_link.js" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_signup_link.js" />
<item url="file://C:/Tools/.meteor/packages/ostrio_logger/1.1.2/web.browser/logger.coffee" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_flow-routing/1.14.2/web.browser/lib/core.js" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_flow-routing/1.14.2/web.browser/lib/client/client.js" />
<item url="file://C:/Tools/.meteor/packages/useraccounts_flow-routing/1.14.2/web.browser/lib/client/templates_helpers/at_input.js" />
<item url="file://C:/Tools/.meteor/packages/observe-sequence/1.0.14/web.browser/observe_sequence.js" />
<item url="file://C:/Tools/.meteor/packages/reload/1.1.11/web.browser/deprecated.js" />
<item url="file://C:/Tools/.meteor/packages/reload/1.1.11/web.browser/reload.js" />
<item url="file://C:/Tools/.meteor/packages/retry/1.0.9/web.browser/retry.js" />
@@ -175,21 +201,8 @@
<item url="file://C:/Tools/.meteor/packages/fortawesome_fontawesome/4.7.0/web.browser/upstream/css/font-awesome.css" />
<item url="file://C:/Tools/.meteor/packages/spacebars/1.0.13/web.browser/spacebars-runtime.js" />
<item url="file://C:/Tools/.meteor/packages/poorvavyas_es6-shim/0.21.1/web.browser/es6-shim.js" />
<item url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.0.13/web.browser/react.js" />
<item url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.0.13/web.browser/compiler.js" />
<item url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.0.13/web.browser/templatetag.js" />
<item url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.0.13/web.browser/codegen.js" />
<item url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.0.13/web.browser/optimizer.js" />
<item url="file://C:/Tools/.meteor/packages/templating-runtime/1.2.15/web.browser/dynamic.js" />
<item url="file://C:/Tools/.meteor/packages/templating-runtime/1.2.15/web.browser/templating.js" />
<item url="file://C:/Tools/.meteor/packages/templating-tools/1.0.5/web.browser/templating-tools.js" />
<item url="file://C:/Tools/.meteor/packages/templating-tools/1.0.5/web.browser/compile-tags-with-spacebars.js" />
<item url="file://C:/Tools/.meteor/packages/templating-tools/1.0.5/web.browser/html-scanner.js" />
<item url="file://C:/Tools/.meteor/packages/templating-tools/1.0.5/web.browser/html-scanner-tests.js" />
<item url="file://C:/Tools/.meteor/packages/templating-tools/1.0.5/web.browser/throw-compile-error.js" />
<item url="file://C:/Tools/.meteor/packages/templating-tools/1.0.5/web.browser/code-generation.js" />
<item url="file://C:/Tools/.meteor/packages/url/1.0.11/web.browser/url_common.js" />
<item url="file://C:/Tools/.meteor/packages/url/1.0.11/web.browser/url_client.js" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_sub/3.0.0/web.browser/client/main.css" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_sub/3.0.0/web.browser/client/main.js" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_sub/3.0.0/web.browser/config/config.css" />
@@ -200,10 +213,7 @@
<item url="file://C:/Tools/.meteor/packages/meteortoys_throttle/3.0.0/web.browser/config/config.css" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_throttle/3.0.0/web.browser/config/config.js" />
<item url="file://C:/Tools/.meteor/packages/callback-hook/1.0.10/web.browser/hook.js" />
<item url="file://C:/Tools/.meteor/packages/check/1.2.4/web.browser/match.js" />
<item url="file://C:/Tools/.meteor/packages/check/1.2.4/web.browser/isPlainObject.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_simple-schema/1.5.3/web.browser/simple-schema-utility.js" />
<item url="file://C:/Tools/.meteor/packages/check/1.2.4/web.browser/match_test.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_simple-schema/1.5.3/web.browser/string-humanize.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_simple-schema/1.5.3/web.browser/simple-schema-validation-new.js" />
<item url="file://C:/Tools/.meteor/packages/aldeed_simple-schema/1.5.3/web.browser/simple-schema.js" />
@@ -215,18 +225,55 @@
<item url="file://C:/Tools/.meteor/packages/meteortoys_toykit/3.0.4/web.browser/lib/privateAPI.js" />
<item url="file://C:/Tools/.meteor/packages/mdg_validation-error/0.2.0/web.browser/validation-error.js" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_toykit/3.0.4/web.browser/style/toykit.css" />
<item url="file://C:/Tools/.meteor/packages/launch-screen/1.1.1/web.browser/mobile-launch-screen.js" />
<item url="file://C:/Tools/.meteor/packages/launch-screen/1.1.1/web.browser/default-behavior.js" />
<item url="file://C:/Tools/.meteor/packages/logging/1.1.17/web.browser/logging_cordova.js" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_toykit/3.0.4/web.browser/client/main.js" />
<item url="file://C:/Tools/.meteor/packages/logging/1.1.17/web.browser/logging.js" />
<item url="file://C:/Tools/.meteor/packages/logging/1.1.17/web.browser/logging_test.js" />
<item url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/style/JetSetter.css" />
<item url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/main.js" />
<item url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/functions.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/materializer.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/view.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/dombackend.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/backcompat.js" />
<item url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/row/main.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/attrs.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/exceptions.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/template.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/preamble.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/builtins.js" />
<item url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/row_dict/main.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/lookup.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/events.js" />
<item url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/_component/component.js" />
<item url="file://C:/Tools/.meteor/packages/check/1.2.5/web.browser/match.js" />
<item url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/domrange.js" />
<item url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/row_editor/JetSetter_editor.js" />
<item url="file://C:/Tools/.meteor/packages/check/1.2.5/web.browser/match_test.js" />
<item url="file://C:/Tools/.meteor/packages/check/1.2.5/web.browser/isPlainObject.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/stream_client_sockjs.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/stream_client_tests.js" />
<item url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/row_header/JetSetter_header.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/stream_client_common.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/sockjs-0.3.4.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/random_stream_tests.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/stub_stream.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/client_convenience.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/livedata_common.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/livedata_tests.js" />
<item url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/dirtySession/main.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/livedata_connection_tests.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/livedata_test_service.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/random_stream.js" />
<item url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/dirtySession/create/main.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/stream_tests.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/namespace.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/livedata_connection.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/stream_client_nodejs.js" />
<item url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/dirtySession/editor/main.js" />
<item url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/id_map.js" />
<item url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/dirtySession/session/main.js" />
<item url="file://C:/Tools/.meteor/packages/msavin_mongol/2.0.1/web.browser/lib/common.js" />
<item url="file://C:/Tools/.meteor/packages/msavin_mongol/2.0.1/web.browser/style/Mongol.css" />
@@ -243,14 +290,8 @@
<item url="file://C:/Tools/.meteor/packages/msavin_mongol/2.0.1/web.browser/client/row_account/account.js" />
<item url="file://C:/Tools/.meteor/packages/msavin_mongol/2.0.1/web.browser/client/row_account/accountViewer.js" />
<item url="file://C:/Tools/.meteor/packages/msavin_mongol/2.0.1/web.browser/client/doc_controls/docControls.js" />
<item url="file://C:/Tools/.meteor/packages/http/1.1.8/web.browser/deprecated.js" />
<item url="file://C:/Tools/.meteor/packages/http/1.1.8/web.browser/test_responder.js" />
<item url="file://C:/Tools/.meteor/packages/msavin_mongol/2.0.1/web.browser/client/row_collection/collections.js" />
<item url="file://C:/Tools/.meteor/packages/http/1.1.8/web.browser/httpcall_tests.js" />
<item url="file://C:/Tools/.meteor/packages/http/1.1.8/web.browser/httpcall_common.js" />
<item url="file://C:/Tools/.meteor/packages/http/1.1.8/web.browser/httpcall_server.js" />
<item url="file://C:/Tools/.meteor/packages/msavin_mongol/2.0.1/web.browser/client/row_subscriptions/main.js" />
<item url="file://C:/Tools/.meteor/packages/http/1.1.8/web.browser/httpcall_client.js" />
<item url="file://C:/Tools/.meteor/packages/msavin_mongol/2.0.1/web.browser/client/row_collection_notFound/notFound.js" />
<item url="file://C:/Tools/.meteor/packages/kadira_flow-router/2.12.1/web.browser/lib/router.js" />
<item url="file://C:/Tools/.meteor/packages/ordered-dict/1.0.9/web.browser/ordered_dict.js" />
@@ -266,38 +307,30 @@
<item url="file://C:/Tools/.meteor/packages/kadira_flow-router/2.12.1/web.browser/client/route.js" />
<item url="file://C:/Tools/.meteor/packages/kadira_flow-router/2.12.1/web.browser/test/client/_helpers.js" />
<item url="file://C:/Tools/.meteor/packages/diff-sequence/1.0.7/web.browser/diff.js" />
<item url="file://C:/Tools/.meteor/packages/modules/0.8.2/web.browser/process.js" />
<item url="file://C:/Tools/.meteor/packages/kadira_flow-router/2.12.1/web.browser/test/client/triggers.js" />
<item url="file://C:/Tools/.meteor/packages/modules/0.8.2/web.browser/install-packages.js" />
<item url="file://C:/Tools/.meteor/packages/kadira_flow-router/2.12.1/web.browser/test/common/fast_render_route.js" />
<item url="file://C:/Tools/.meteor/packages/modules/0.8.2/web.browser/css.js" />
<item url="file://C:/Tools/.meteor/packages/ecmascript-runtime/0.3.15/web.browser/runtime-tests.js" />
<item url="file://C:/Tools/.meteor/packages/modules/0.8.2/web.browser/client.js" />
<item url="file://C:/Tools/.meteor/packages/ecmascript-runtime/0.3.15/web.browser/runtime.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/client_main.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/server_main.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/server_tests.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/url_client.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/client_tests.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/localstorage_token.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/accounts_common.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/url_server.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/accounts_reconnect_tests.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/accounts_tests.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/accounts_url_tests.js" />
<item url="file://C:/Tools/.meteor/packages/modules/0.8.2/web.browser/stubs.js" />
<item url="file://C:/Tools/.meteor/packages/modules/0.8.2/web.browser/reify.js" />
<item url="file://C:/Tools/.meteor/packages/modules/0.8.2/web.browser/server.js" />
<item url="file://C:/Tools/.meteor/packages/modules/0.8.2/web.browser/buffer.js" />
<item url="file://C:/Tools/.meteor/packages/random/1.0.10/web.browser/deprecated.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/accounts_client.js" />
<item url="file://C:/Tools/.meteor/packages/random/1.0.10/web.browser/random_tests.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/accounts_rate_limit.js" />
<item url="file://C:/Tools/.meteor/packages/random/1.0.10/web.browser/random.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/accounts_server.js" />
<item url="file://C:/Tools/.meteor/packages/rate-limit/1.0.6/web.browser/rate-limit.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-password/1.3.3/web.browser/password_tests_setup.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-password/1.3.3/web.browser/email_tests.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-password/1.3.3/web.browser/email_templates.js" />
<item url="file://C:/Tools/.meteor/packages/http/1.2.12/web.browser/httpcall_tests.js" />
<item url="file://C:/Tools/.meteor/packages/http/1.2.12/web.browser/test_responder.js" />
<item url="file://C:/Tools/.meteor/packages/http/1.2.12/web.browser/deprecated.js" />
<item url="file://C:/Tools/.meteor/packages/reactive-dict/1.1.8/web.browser/reactive-dict-tests.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-password/1.3.3/web.browser/email_tests_setup.js" />
<item url="file://C:/Tools/.meteor/packages/http/1.2.12/web.browser/httpcall_client.js" />
<item url="file://C:/Tools/.meteor/packages/reactive-dict/1.1.8/web.browser/reactive-dict.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-password/1.3.3/web.browser/password_client.js" />
<item url="file://C:/Tools/.meteor/packages/http/1.2.12/web.browser/httpcall_server.js" />
<item url="file://C:/Tools/.meteor/packages/http/1.2.12/web.browser/httpcall_common.js" />
<item url="file://C:/Tools/.meteor/packages/reactive-dict/1.1.8/web.browser/migration.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-password/1.3.3/web.browser/password_tests.js" />
<item url="file://C:/Tools/.meteor/packages/accounts-password/1.3.3/web.browser/password_server.js" />
<item url="file://C:/Tools/.meteor/packages/juliancwirko_s-alert/3.2.0/web.browser/client/s-alert-collection.js" />
<item url="file://C:/Tools/.meteor/packages/juliancwirko_s-alert/3.2.0/web.browser/client/s-alert-template.js" />
<item url="file://C:/Tools/.meteor/packages/juliancwirko_s-alert/3.2.0/web.browser/client/s-alert-default.css" />
@@ -309,23 +342,15 @@
<item url="file://C:/Tools/.meteor/packages/allow-deny/1.0.5/web.browser/allow-deny-tests.js" />
<item url="file://C:/Tools/.meteor/packages/srp/1.0.10/web.browser/srp.js" />
<item url="file://C:/Tools/.meteor/packages/srp/1.0.10/web.browser/biginteger.js" />
<item url="file://C:/Tools/.meteor/packages/tracker/1.1.1/web.browser/deprecated.js" />
<item url="file://C:/Tools/.meteor/packages/tracker/1.1.1/web.browser/tracker.js" />
<item url="file://C:/Tools/.meteor/packages/underscore/1.0.10/web.browser/underscore.js" />
<item url="file://C:/Tools/.meteor/packages/underscore/1.0.10/web.browser/pre.js" />
<item url="file://C:/Tools/.meteor/packages/underscore/1.0.10/web.browser/post.js" />
<item url="file://C:/Tools/.meteor/packages/webapp/1.3.12/web.browser/webapp_client_tests.js" />
<item url="file://C:/Tools/.meteor/packages/webapp/1.3.12/web.browser/webapp_tests.js" />
<item url="file://C:/Tools/.meteor/packages/webapp/1.3.12/web.browser/webapp_cordova.js" />
<item url="file://C:/Tools/.meteor/packages/webapp/1.3.12/web.browser/webapp_client.js" />
<item url="file://C:/Tools/.meteor/packages/webapp/1.3.12/web.browser/webapp_server.js" />
<item url="file://C:/Tools/.meteor/packages/modules-runtime/0.7.10/web.browser/modules-runtime.js" />
<item url="file://C:/Tools/.meteor/packages/id-map/1.0.9/web.browser/id-map.js" />
<item url="file://C:/Tools/.meteor/packages/jquery/1.11.10/web.browser/jquery.js" />
<item url="file://C:/Tools/.meteor/packages/jquery/1.11.10/web.browser/main.js" />
<item url="file://C:/Tools/.meteor/packages/localstorage/1.0.12/web.browser/localstorage.js" />
<item url="file://C:/Tools/.meteor/packages/logging/1.1.16/web.browser/logging_test.js" />
<item url="file://C:/Tools/.meteor/packages/logging/1.1.16/web.browser/logging.js" />
<item url="file://C:/Tools/.meteor/packages/logging/1.1.16/web.browser/logging_cordova.js" />
<item url="file://C:/Tools/.meteor/packages/modules-runtime/0.7.10/web.browser/.npm/package/node_modules/install/install.js" />
<item url="file://C:/Tools/.meteor/packages/ejson/1.0.13/web.browser/stringify.js" />
<item url="file://C:/Tools/.meteor/packages/ejson/1.0.13/web.browser/ejson.js" />
<item url="file://C:/Tools/.meteor/packages/es5-shim/4.6.15/web.browser/export_globals.js" />
@@ -333,23 +358,12 @@
<item url="file://C:/Tools/.meteor/packages/es5-shim/4.6.15/web.browser/console.js" />
<item url="file://C:/Tools/.meteor/packages/es5-shim/4.6.15/web.browser/client.js" />
<item url="file://C:/Tools/.meteor/packages/es5-shim/4.6.15/web.browser/server.js" />
<item url="file://C:/Tools/.meteor/packages/modules/0.7.7/web.browser/install-packages.js" />
<item url="file://C:/Tools/.meteor/packages/modules/0.7.7/web.browser/process.js" />
<item url="file://C:/Tools/.meteor/packages/modules/0.7.7/web.browser/stubs.js" />
<item url="file://C:/Tools/.meteor/packages/modules/0.7.7/web.browser/client.js" />
<item url="file://C:/Tools/.meteor/packages/modules/0.7.7/web.browser/css.js" />
<item url="file://C:/Tools/.meteor/packages/modules/0.7.7/web.browser/buffer.js" />
<item url="file://C:/Tools/.meteor/packages/modules/0.7.7/web.browser/server.js" />
<item url="file://C:/Tools/.meteor/packages/geojson-utils/1.0.10/web.browser/geojson-utils.js" />
<item url="file://C:/Tools/.meteor/packages/geojson-utils/1.0.10/web.browser/main.js" />
<item url="file://C:/Tools/.meteor/packages/kadira_blaze-layout/2.3.0/web.browser/lib/client/namespace.js" />
<item url="file://C:/Tools/.meteor/packages/kadira_blaze-layout/2.3.0/web.browser/lib/client/layout.js" />
<item url="file://C:/Tools/.meteor/packages/raix_eventemitter/0.1.3/web.browser/packages/raix_eventemitter.js" />
<item url="file://C:/Tools/.meteor/packages/modules-runtime/0.7.7/web.browser/modules-runtime.js" />
<item url="file://C:/Tools/.meteor/packages/modules-runtime/0.7.7/web.browser/.npm/package/node_modules/install/install.js" />
<item url="file://C:/Tools/.meteor/packages/mongo-id/1.0.6/web.browser/id.js" />
<item url="file://C:/Tools/.meteor/packages/launch-screen/1.0.12/web.browser/default-behavior.js" />
<item url="file://C:/Tools/.meteor/packages/launch-screen/1.0.12/web.browser/mobile-launch-screen.js" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_allthings/3.0.0/web.browser/main.js" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_authenticate/3.0.0/web.browser/client/main.css" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_authenticate/3.0.0/web.browser/client/main.js" />
@@ -400,7 +414,6 @@
<item url="file://C:/Tools/.meteor/packages/meteortoys_hotreload/3.0.0/web.browser/client/main.js" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_hotreload/3.0.0/web.browser/config/config.css" />
<item url="file://C:/Tools/.meteor/packages/meteortoys_hotreload/3.0.0/web.browser/config/config.js" />
<item url="file://C:/Tools/.meteor/packages/autoupdate/1.2.11/web.browser/autoupdate_client.js" />
</sourceFilesUrls>
</properties>
<CLASSES>
@@ -409,10 +422,17 @@
<root url="file://C:/Tools/.meteor/packages/meteortoys_listen/3.0.0/web.browser/config/config.css" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_listen/3.0.0/web.browser/config/config.js" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_method/3.0.4/web.browser/lib/main.js" />
<root url="file://C:/Tools/.meteor/packages/rate-limit/1.0.8/web.browser/rate-limit.js" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_method/3.0.4/web.browser/client/main.css" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_method/3.0.4/web.browser/client/main.js" />
<root url="file://C:/Tools/.meteor/packages/observe-sequence/1.0.16/web.browser/observe_sequence.js" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_method/3.0.4/web.browser/ToyKit/main.css" />
<root url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.1.1/web.browser/codegen.js" />
<root url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.1.1/web.browser/templatetag.js" />
<root url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.1.1/web.browser/compiler.js" />
<root url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.1.1/web.browser/react.js" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_method/3.0.4/web.browser/ToyKit/main.js" />
<root url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.1.1/web.browser/optimizer.js" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_pub/3.0.4/web.browser/lib/main.js" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_pub/3.0.4/web.browser/client/main.css" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_pub/3.0.4/web.browser/client/main.js" />
@@ -433,73 +453,67 @@
<root url="file://C:/Tools/.meteor/packages/meteortoys_shell/3.0.0/web.browser/client/main.js" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_shell/3.0.0/web.browser/config/config.css" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_shell/3.0.0/web.browser/config/config.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.2.9/web.browser/sockjs-0.3.4.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.2.9/web.browser/random_stream.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.2.9/web.browser/stream_client_common.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.2.9/web.browser/livedata_connection.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.2.9/web.browser/stream_client_sockjs.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.2.9/web.browser/namespace.js" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_status/3.0.0/web.browser/client/main.css" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.2.9/web.browser/livedata_common.js" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_status/3.0.0/web.browser/client/main.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.2.9/web.browser/client_convenience.js" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_status/3.0.0/web.browser/config/config.css" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.2.9/web.browser/id_map.js" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_status/3.0.0/web.browser/config/config.js" />
<root url="file://C:/Tools/.meteor/packages/momentjs_moment/2.17.1/web.browser/moment.js" />
<root url="file://C:/Tools/.meteor/packages/momentjs_moment/2.17.1/web.browser/export.js" />
<root url="file://C:/Tools/.meteor/packages/tomwasd_history-polyfill/0.0.1/web.browser/packages/tomwasd_history-polyfill.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/dombackend.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/view.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/materializer.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/template.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/exceptions.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-replaces.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/attrs.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-instance-get.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/backcompat.js" />
<root url="file://C:/Tools/.meteor/packages/templating-tools/1.1.1/web.browser/html-scanner-tests.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-clear-event-maps.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/events.js" />
<root url="file://C:/Tools/.meteor/packages/templating-tools/1.1.1/web.browser/html-scanner.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-for-each-instance.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/lookup.js" />
<root url="file://C:/Tools/.meteor/packages/templating-tools/1.1.1/web.browser/compile-tags-with-spacebars.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-inherits-hooks-from.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/builtins.js" />
<root url="file://C:/Tools/.meteor/packages/templating-tools/1.1.1/web.browser/templating-tools.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-for-each.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/preamble.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-copy-as.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.1.9/web.browser/domrange.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-inherits-helpers-from.js" />
<root url="file://C:/Tools/.meteor/packages/templating-tools/1.1.1/web.browser/code-generation.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-register-helpers.js" />
<root url="file://C:/Tools/.meteor/packages/templating-tools/1.1.1/web.browser/throw-compile-error.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-instance-parent.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/hooks.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-parent-data-function.js" />
<root url="file://C:/Tools/.meteor/packages/blaze-tools/1.0.10/web.browser/tokens.js" />
<root url="file://C:/Tools/.meteor/packages/tracker/1.1.3/web.browser/tracker.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-hooks.js" />
<root url="file://C:/Tools/.meteor/packages/blaze-tools/1.0.10/web.browser/tojs.js" />
<root url="file://C:/Tools/.meteor/packages/tracker/1.1.3/web.browser/deprecated.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-inherits-events-from.js" />
<root url="file://C:/Tools/.meteor/packages/blaze-tools/1.0.10/web.browser/preamble.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n.coffee" />
<root url="file://C:/Tools/.meteor/packages/aldeed_template-extension/4.0.0/web.browser/lib/template-global-hooks.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/ko.coffee" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/pt_PT.coffee" />
<root url="file://C:/Tools/.meteor/packages/url/1.1.0/web.browser/url_client.js" />
<root url="file://C:/Tools/.meteor/packages/arillo_flow-router-helpers/0.5.2/web.browser/client/helpers.coffee" />
<root url="file://C:/Tools/.meteor/packages/caching-compiler/1.1.9/web.browser/multi-file-caching-compiler.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/et.coffee" />
<root url="file://C:/Tools/.meteor/packages/url/1.1.0/web.browser/url_common.js" />
<root url="file://C:/Tools/.meteor/packages/caching-compiler/1.1.9/web.browser/caching-compiler.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/no_NB.coffee" />
<root url="file://C:/Tools/.meteor/packages/webapp/1.3.15/web.browser/webapp_client.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/fr.coffee" />
<root url="file://C:/Tools/.meteor/packages/webapp/1.3.15/web.browser/webapp_cordova.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/es.coffee" />
<root url="file://C:/Tools/.meteor/packages/webapp/1.3.15/web.browser/webapp_tests.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/kh.coffee" />
<root url="file://C:/Tools/.meteor/packages/webapp/1.3.15/web.browser/webapp_client_tests.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/sk.coffee" />
<root url="file://C:/Tools/.meteor/packages/mizzao_bootboxjs/4.4.0/web.browser/packages/mizzao_bootboxjs.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/sv.coffee" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/sl.coffee" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/es_ES.coffee" />
<root url="file://C:/Tools/.meteor/packages/webapp/1.3.15/web.browser/webapp_server.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/it.coffee" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/uk.coffee" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/hu.coffee" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/hr.coffee" />
<root url="file://C:/Tools/.meteor/packages/momentjs_moment/2.18.1/web.browser/moment.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/id.coffee" />
<root url="file://C:/Tools/.meteor/packages/momentjs_moment/2.18.1/web.browser/export.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/tr.coffee" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/ja.coffee" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/zh_TW.coffee" />
@@ -512,42 +526,66 @@
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/en.coffee" />
<root url="file://C:/Tools/.meteor/packages/zimme_active-route/2.3.2/web.browser/packages/zimme_active-route.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/ru.coffee" />
<root url="file://C:/Tools/.meteor/packages/accounts-password/1.3.6/web.browser/password_server.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/ro.coffee" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/fa.coffee" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/zh_CN.coffee" />
<root url="file://C:/Tools/.meteor/packages/autoupdate/1.3.12/web.browser/autoupdate_client.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/cs.coffee" />
<root url="file://C:/Tools/.meteor/packages/accounts-password/1.3.6/web.browser/email_templates.js" />
<root url="file://C:/Tools/.meteor/packages/caching-html-compiler/1.0.7/web.browser/caching-html-compiler.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/pl.coffee" />
<root url="file://C:/Tools/.meteor/packages/accounts-password/1.3.6/web.browser/email_tests_setup.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/de.coffee" />
<root url="file://C:/Tools/.meteor/packages/accounts-password/1.3.6/web.browser/password_client.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/da.coffee" />
<root url="file://C:/Tools/.meteor/packages/accounts-password/1.3.6/web.browser/password_tests.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-common/1.2.8/web.browser/random_stream.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/nl.coffee" />
<root url="file://C:/Tools/.meteor/packages/ddp-common/1.2.8/web.browser/method_invocation.js" />
<root url="file://C:/Tools/.meteor/packages/softwarerero_accounts-t9n/1.3.6/web.browser/t9n/ca.coffee" />
<root url="file://C:/Tools/.meteor/packages/ddp-common/1.2.8/web.browser/namespace.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-password/1.3.6/web.browser/password_tests_setup.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-common/1.2.8/web.browser/utils.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-password/1.3.6/web.browser/email_tests.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-common/1.2.8/web.browser/heartbeat.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/accounts_client_tests.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/accounts_client.js" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/methods.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/accounts_rate_limit.js" />
<root url="file://C:/Tools/.meteor/packages/fastclick/1.0.13/web.browser/pre.js" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/field.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/accounts_server.js" />
<root url="file://C:/Tools/.meteor/packages/fastclick/1.0.13/web.browser/post.js" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/utils.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/accounts_tests_setup.js" />
<root url="file://C:/Tools/.meteor/packages/fastclick/1.0.13/web.browser/fastclick.js" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/client.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/accounts_reconnect_tests.js" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/core.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/accounts_tests.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/accounts_url_tests.js" />
<root url="file://C:/Tools/.meteor/packages/html-tools/1.0.11/web.browser/scanner.js" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_oauth.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/client_tests.js" />
<root url="file://C:/Tools/.meteor/packages/html-tools/1.0.11/web.browser/templatetag.js" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_form.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/localstorage_token.js" />
<root url="file://C:/Tools/.meteor/packages/html-tools/1.0.11/web.browser/tokenize.js" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_sep.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/accounts_common.js" />
<root url="file://C:/Tools/.meteor/packages/html-tools/1.0.11/web.browser/utils.js" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_message.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/url_server.js" />
<root url="file://C:/Tools/.meteor/packages/html-tools/1.0.11/web.browser/charref.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/client_main.js" />
<root url="file://C:/Tools/.meteor/packages/html-tools/1.0.11/web.browser/parse.js" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_pwd_form.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/server_main.js" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_nav_button.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/server_tests.js" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_pwd_form_btn.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.17/web.browser/url_client.js" />
<root url="file://C:/Tools/.meteor/packages/htmljs/1.0.11/web.browser/html.js" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_social.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_collection2-core/1.2.0/web.browser/lib/collection2.js" />
@@ -563,13 +601,14 @@
<root url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_title.js" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_reCaptcha.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_schema-index/1.1.1/web.browser/lib/indexing.js" />
<root url="file://C:/Tools/.meteor/packages/ostrio_loggermongo/1.1.3/web.browser/loggermongo.coffee" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_input.js" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_resend_verification_email_link.js" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_core/1.14.2/web.browser/lib/templates_helpers/at_signup_link.js" />
<root url="file://C:/Tools/.meteor/packages/ostrio_logger/1.1.2/web.browser/logger.coffee" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_flow-routing/1.14.2/web.browser/lib/core.js" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_flow-routing/1.14.2/web.browser/lib/client/client.js" />
<root url="file://C:/Tools/.meteor/packages/useraccounts_flow-routing/1.14.2/web.browser/lib/client/templates_helpers/at_input.js" />
<root url="file://C:/Tools/.meteor/packages/observe-sequence/1.0.14/web.browser/observe_sequence.js" />
<root url="file://C:/Tools/.meteor/packages/reload/1.1.11/web.browser/deprecated.js" />
<root url="file://C:/Tools/.meteor/packages/reload/1.1.11/web.browser/reload.js" />
<root url="file://C:/Tools/.meteor/packages/retry/1.0.9/web.browser/retry.js" />
@@ -577,21 +616,8 @@
<root url="file://C:/Tools/.meteor/packages/fortawesome_fontawesome/4.7.0/web.browser/upstream/css/font-awesome.css" />
<root url="file://C:/Tools/.meteor/packages/spacebars/1.0.13/web.browser/spacebars-runtime.js" />
<root url="file://C:/Tools/.meteor/packages/poorvavyas_es6-shim/0.21.1/web.browser/es6-shim.js" />
<root url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.0.13/web.browser/react.js" />
<root url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.0.13/web.browser/compiler.js" />
<root url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.0.13/web.browser/templatetag.js" />
<root url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.0.13/web.browser/codegen.js" />
<root url="file://C:/Tools/.meteor/packages/spacebars-compiler/1.0.13/web.browser/optimizer.js" />
<root url="file://C:/Tools/.meteor/packages/templating-runtime/1.2.15/web.browser/dynamic.js" />
<root url="file://C:/Tools/.meteor/packages/templating-runtime/1.2.15/web.browser/templating.js" />
<root url="file://C:/Tools/.meteor/packages/templating-tools/1.0.5/web.browser/templating-tools.js" />
<root url="file://C:/Tools/.meteor/packages/templating-tools/1.0.5/web.browser/compile-tags-with-spacebars.js" />
<root url="file://C:/Tools/.meteor/packages/templating-tools/1.0.5/web.browser/html-scanner.js" />
<root url="file://C:/Tools/.meteor/packages/templating-tools/1.0.5/web.browser/html-scanner-tests.js" />
<root url="file://C:/Tools/.meteor/packages/templating-tools/1.0.5/web.browser/throw-compile-error.js" />
<root url="file://C:/Tools/.meteor/packages/templating-tools/1.0.5/web.browser/code-generation.js" />
<root url="file://C:/Tools/.meteor/packages/url/1.0.11/web.browser/url_common.js" />
<root url="file://C:/Tools/.meteor/packages/url/1.0.11/web.browser/url_client.js" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_sub/3.0.0/web.browser/client/main.css" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_sub/3.0.0/web.browser/client/main.js" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_sub/3.0.0/web.browser/config/config.css" />
@@ -602,10 +628,7 @@
<root url="file://C:/Tools/.meteor/packages/meteortoys_throttle/3.0.0/web.browser/config/config.css" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_throttle/3.0.0/web.browser/config/config.js" />
<root url="file://C:/Tools/.meteor/packages/callback-hook/1.0.10/web.browser/hook.js" />
<root url="file://C:/Tools/.meteor/packages/check/1.2.4/web.browser/match.js" />
<root url="file://C:/Tools/.meteor/packages/check/1.2.4/web.browser/isPlainObject.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_simple-schema/1.5.3/web.browser/simple-schema-utility.js" />
<root url="file://C:/Tools/.meteor/packages/check/1.2.4/web.browser/match_test.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_simple-schema/1.5.3/web.browser/string-humanize.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_simple-schema/1.5.3/web.browser/simple-schema-validation-new.js" />
<root url="file://C:/Tools/.meteor/packages/aldeed_simple-schema/1.5.3/web.browser/simple-schema.js" />
@@ -617,18 +640,55 @@
<root url="file://C:/Tools/.meteor/packages/meteortoys_toykit/3.0.4/web.browser/lib/privateAPI.js" />
<root url="file://C:/Tools/.meteor/packages/mdg_validation-error/0.2.0/web.browser/validation-error.js" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_toykit/3.0.4/web.browser/style/toykit.css" />
<root url="file://C:/Tools/.meteor/packages/launch-screen/1.1.1/web.browser/mobile-launch-screen.js" />
<root url="file://C:/Tools/.meteor/packages/launch-screen/1.1.1/web.browser/default-behavior.js" />
<root url="file://C:/Tools/.meteor/packages/logging/1.1.17/web.browser/logging_cordova.js" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_toykit/3.0.4/web.browser/client/main.js" />
<root url="file://C:/Tools/.meteor/packages/logging/1.1.17/web.browser/logging.js" />
<root url="file://C:/Tools/.meteor/packages/logging/1.1.17/web.browser/logging_test.js" />
<root url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/style/JetSetter.css" />
<root url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/main.js" />
<root url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/functions.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/materializer.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/view.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/dombackend.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/backcompat.js" />
<root url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/row/main.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/attrs.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/exceptions.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/template.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/preamble.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/builtins.js" />
<root url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/row_dict/main.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/lookup.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/events.js" />
<root url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/_component/component.js" />
<root url="file://C:/Tools/.meteor/packages/check/1.2.5/web.browser/match.js" />
<root url="file://C:/Tools/.meteor/packages/blaze/2.3.2/web.browser/domrange.js" />
<root url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/row_editor/JetSetter_editor.js" />
<root url="file://C:/Tools/.meteor/packages/check/1.2.5/web.browser/match_test.js" />
<root url="file://C:/Tools/.meteor/packages/check/1.2.5/web.browser/isPlainObject.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/stream_client_sockjs.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/stream_client_tests.js" />
<root url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/row_header/JetSetter_header.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/stream_client_common.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/sockjs-0.3.4.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/random_stream_tests.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/stub_stream.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/client_convenience.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/livedata_common.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/livedata_tests.js" />
<root url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/dirtySession/main.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/livedata_connection_tests.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/livedata_test_service.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/random_stream.js" />
<root url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/dirtySession/create/main.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/stream_tests.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/namespace.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/livedata_connection.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/stream_client_nodejs.js" />
<root url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/dirtySession/editor/main.js" />
<root url="file://C:/Tools/.meteor/packages/ddp-client/1.3.4/web.browser/id_map.js" />
<root url="file://C:/Tools/.meteor/packages/msavin_jetsetter/2.0.0/web.browser/client/dirtySession/session/main.js" />
<root url="file://C:/Tools/.meteor/packages/msavin_mongol/2.0.1/web.browser/lib/common.js" />
<root url="file://C:/Tools/.meteor/packages/msavin_mongol/2.0.1/web.browser/style/Mongol.css" />
@@ -645,14 +705,8 @@
<root url="file://C:/Tools/.meteor/packages/msavin_mongol/2.0.1/web.browser/client/row_account/account.js" />
<root url="file://C:/Tools/.meteor/packages/msavin_mongol/2.0.1/web.browser/client/row_account/accountViewer.js" />
<root url="file://C:/Tools/.meteor/packages/msavin_mongol/2.0.1/web.browser/client/doc_controls/docControls.js" />
<root url="file://C:/Tools/.meteor/packages/http/1.1.8/web.browser/deprecated.js" />
<root url="file://C:/Tools/.meteor/packages/http/1.1.8/web.browser/test_responder.js" />
<root url="file://C:/Tools/.meteor/packages/msavin_mongol/2.0.1/web.browser/client/row_collection/collections.js" />
<root url="file://C:/Tools/.meteor/packages/http/1.1.8/web.browser/httpcall_tests.js" />
<root url="file://C:/Tools/.meteor/packages/http/1.1.8/web.browser/httpcall_common.js" />
<root url="file://C:/Tools/.meteor/packages/http/1.1.8/web.browser/httpcall_server.js" />
<root url="file://C:/Tools/.meteor/packages/msavin_mongol/2.0.1/web.browser/client/row_subscriptions/main.js" />
<root url="file://C:/Tools/.meteor/packages/http/1.1.8/web.browser/httpcall_client.js" />
<root url="file://C:/Tools/.meteor/packages/msavin_mongol/2.0.1/web.browser/client/row_collection_notFound/notFound.js" />
<root url="file://C:/Tools/.meteor/packages/kadira_flow-router/2.12.1/web.browser/lib/router.js" />
<root url="file://C:/Tools/.meteor/packages/ordered-dict/1.0.9/web.browser/ordered_dict.js" />
@@ -668,38 +722,30 @@
<root url="file://C:/Tools/.meteor/packages/kadira_flow-router/2.12.1/web.browser/client/route.js" />
<root url="file://C:/Tools/.meteor/packages/kadira_flow-router/2.12.1/web.browser/test/client/_helpers.js" />
<root url="file://C:/Tools/.meteor/packages/diff-sequence/1.0.7/web.browser/diff.js" />
<root url="file://C:/Tools/.meteor/packages/modules/0.8.2/web.browser/process.js" />
<root url="file://C:/Tools/.meteor/packages/kadira_flow-router/2.12.1/web.browser/test/client/triggers.js" />
<root url="file://C:/Tools/.meteor/packages/modules/0.8.2/web.browser/install-packages.js" />
<root url="file://C:/Tools/.meteor/packages/kadira_flow-router/2.12.1/web.browser/test/common/fast_render_route.js" />
<root url="file://C:/Tools/.meteor/packages/modules/0.8.2/web.browser/css.js" />
<root url="file://C:/Tools/.meteor/packages/ecmascript-runtime/0.3.15/web.browser/runtime-tests.js" />
<root url="file://C:/Tools/.meteor/packages/modules/0.8.2/web.browser/client.js" />
<root url="file://C:/Tools/.meteor/packages/ecmascript-runtime/0.3.15/web.browser/runtime.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/client_main.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/server_main.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/server_tests.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/url_client.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/client_tests.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/localstorage_token.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/accounts_common.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/url_server.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/accounts_reconnect_tests.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/accounts_tests.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/accounts_url_tests.js" />
<root url="file://C:/Tools/.meteor/packages/modules/0.8.2/web.browser/stubs.js" />
<root url="file://C:/Tools/.meteor/packages/modules/0.8.2/web.browser/reify.js" />
<root url="file://C:/Tools/.meteor/packages/modules/0.8.2/web.browser/server.js" />
<root url="file://C:/Tools/.meteor/packages/modules/0.8.2/web.browser/buffer.js" />
<root url="file://C:/Tools/.meteor/packages/random/1.0.10/web.browser/deprecated.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/accounts_client.js" />
<root url="file://C:/Tools/.meteor/packages/random/1.0.10/web.browser/random_tests.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/accounts_rate_limit.js" />
<root url="file://C:/Tools/.meteor/packages/random/1.0.10/web.browser/random.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-base/1.2.14/web.browser/accounts_server.js" />
<root url="file://C:/Tools/.meteor/packages/rate-limit/1.0.6/web.browser/rate-limit.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-password/1.3.3/web.browser/password_tests_setup.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-password/1.3.3/web.browser/email_tests.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-password/1.3.3/web.browser/email_templates.js" />
<root url="file://C:/Tools/.meteor/packages/http/1.2.12/web.browser/httpcall_tests.js" />
<root url="file://C:/Tools/.meteor/packages/http/1.2.12/web.browser/test_responder.js" />
<root url="file://C:/Tools/.meteor/packages/http/1.2.12/web.browser/deprecated.js" />
<root url="file://C:/Tools/.meteor/packages/reactive-dict/1.1.8/web.browser/reactive-dict-tests.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-password/1.3.3/web.browser/email_tests_setup.js" />
<root url="file://C:/Tools/.meteor/packages/http/1.2.12/web.browser/httpcall_client.js" />
<root url="file://C:/Tools/.meteor/packages/reactive-dict/1.1.8/web.browser/reactive-dict.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-password/1.3.3/web.browser/password_client.js" />
<root url="file://C:/Tools/.meteor/packages/http/1.2.12/web.browser/httpcall_server.js" />
<root url="file://C:/Tools/.meteor/packages/http/1.2.12/web.browser/httpcall_common.js" />
<root url="file://C:/Tools/.meteor/packages/reactive-dict/1.1.8/web.browser/migration.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-password/1.3.3/web.browser/password_tests.js" />
<root url="file://C:/Tools/.meteor/packages/accounts-password/1.3.3/web.browser/password_server.js" />
<root url="file://C:/Tools/.meteor/packages/juliancwirko_s-alert/3.2.0/web.browser/client/s-alert-collection.js" />
<root url="file://C:/Tools/.meteor/packages/juliancwirko_s-alert/3.2.0/web.browser/client/s-alert-template.js" />
<root url="file://C:/Tools/.meteor/packages/juliancwirko_s-alert/3.2.0/web.browser/client/s-alert-default.css" />
@@ -711,23 +757,15 @@
<root url="file://C:/Tools/.meteor/packages/allow-deny/1.0.5/web.browser/allow-deny-tests.js" />
<root url="file://C:/Tools/.meteor/packages/srp/1.0.10/web.browser/srp.js" />
<root url="file://C:/Tools/.meteor/packages/srp/1.0.10/web.browser/biginteger.js" />
<root url="file://C:/Tools/.meteor/packages/tracker/1.1.1/web.browser/deprecated.js" />
<root url="file://C:/Tools/.meteor/packages/tracker/1.1.1/web.browser/tracker.js" />
<root url="file://C:/Tools/.meteor/packages/underscore/1.0.10/web.browser/underscore.js" />
<root url="file://C:/Tools/.meteor/packages/underscore/1.0.10/web.browser/pre.js" />
<root url="file://C:/Tools/.meteor/packages/underscore/1.0.10/web.browser/post.js" />
<root url="file://C:/Tools/.meteor/packages/webapp/1.3.12/web.browser/webapp_client_tests.js" />
<root url="file://C:/Tools/.meteor/packages/webapp/1.3.12/web.browser/webapp_tests.js" />
<root url="file://C:/Tools/.meteor/packages/webapp/1.3.12/web.browser/webapp_cordova.js" />
<root url="file://C:/Tools/.meteor/packages/webapp/1.3.12/web.browser/webapp_client.js" />
<root url="file://C:/Tools/.meteor/packages/webapp/1.3.12/web.browser/webapp_server.js" />
<root url="file://C:/Tools/.meteor/packages/modules-runtime/0.7.10/web.browser/modules-runtime.js" />
<root url="file://C:/Tools/.meteor/packages/id-map/1.0.9/web.browser/id-map.js" />
<root url="file://C:/Tools/.meteor/packages/jquery/1.11.10/web.browser/jquery.js" />
<root url="file://C:/Tools/.meteor/packages/jquery/1.11.10/web.browser/main.js" />
<root url="file://C:/Tools/.meteor/packages/localstorage/1.0.12/web.browser/localstorage.js" />
<root url="file://C:/Tools/.meteor/packages/logging/1.1.16/web.browser/logging_test.js" />
<root url="file://C:/Tools/.meteor/packages/logging/1.1.16/web.browser/logging.js" />
<root url="file://C:/Tools/.meteor/packages/logging/1.1.16/web.browser/logging_cordova.js" />
<root url="file://C:/Tools/.meteor/packages/modules-runtime/0.7.10/web.browser/.npm/package/node_modules/install/install.js" />
<root url="file://C:/Tools/.meteor/packages/ejson/1.0.13/web.browser/stringify.js" />
<root url="file://C:/Tools/.meteor/packages/ejson/1.0.13/web.browser/ejson.js" />
<root url="file://C:/Tools/.meteor/packages/es5-shim/4.6.15/web.browser/export_globals.js" />
@@ -735,23 +773,12 @@
<root url="file://C:/Tools/.meteor/packages/es5-shim/4.6.15/web.browser/console.js" />
<root url="file://C:/Tools/.meteor/packages/es5-shim/4.6.15/web.browser/client.js" />
<root url="file://C:/Tools/.meteor/packages/es5-shim/4.6.15/web.browser/server.js" />
<root url="file://C:/Tools/.meteor/packages/modules/0.7.7/web.browser/install-packages.js" />
<root url="file://C:/Tools/.meteor/packages/modules/0.7.7/web.browser/process.js" />
<root url="file://C:/Tools/.meteor/packages/modules/0.7.7/web.browser/stubs.js" />
<root url="file://C:/Tools/.meteor/packages/modules/0.7.7/web.browser/client.js" />
<root url="file://C:/Tools/.meteor/packages/modules/0.7.7/web.browser/css.js" />
<root url="file://C:/Tools/.meteor/packages/modules/0.7.7/web.browser/buffer.js" />
<root url="file://C:/Tools/.meteor/packages/modules/0.7.7/web.browser/server.js" />
<root url="file://C:/Tools/.meteor/packages/geojson-utils/1.0.10/web.browser/geojson-utils.js" />
<root url="file://C:/Tools/.meteor/packages/geojson-utils/1.0.10/web.browser/main.js" />
<root url="file://C:/Tools/.meteor/packages/kadira_blaze-layout/2.3.0/web.browser/lib/client/namespace.js" />
<root url="file://C:/Tools/.meteor/packages/kadira_blaze-layout/2.3.0/web.browser/lib/client/layout.js" />
<root url="file://C:/Tools/.meteor/packages/raix_eventemitter/0.1.3/web.browser/packages/raix_eventemitter.js" />
<root url="file://C:/Tools/.meteor/packages/modules-runtime/0.7.7/web.browser/modules-runtime.js" />
<root url="file://C:/Tools/.meteor/packages/modules-runtime/0.7.7/web.browser/.npm/package/node_modules/install/install.js" />
<root url="file://C:/Tools/.meteor/packages/mongo-id/1.0.6/web.browser/id.js" />
<root url="file://C:/Tools/.meteor/packages/launch-screen/1.0.12/web.browser/default-behavior.js" />
<root url="file://C:/Tools/.meteor/packages/launch-screen/1.0.12/web.browser/mobile-launch-screen.js" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_allthings/3.0.0/web.browser/main.js" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_authenticate/3.0.0/web.browser/client/main.css" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_authenticate/3.0.0/web.browser/client/main.js" />
@@ -802,7 +829,6 @@
<root url="file://C:/Tools/.meteor/packages/meteortoys_hotreload/3.0.0/web.browser/client/main.js" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_hotreload/3.0.0/web.browser/config/config.css" />
<root url="file://C:/Tools/.meteor/packages/meteortoys_hotreload/3.0.0/web.browser/config/config.js" />
<root url="file://C:/Tools/.meteor/packages/autoupdate/1.2.11/web.browser/autoupdate_client.js" />
</CLASSES>
<SOURCES />
</library>

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +1,3 @@
<component name="MarkdownNavigator.ProfileManager">
<settings default="" />
<settings default="" pdf-export="" />
</component>

916
.idea/workspace.xml generated

File diff suppressed because it is too large Load Diff

View File

@@ -13,3 +13,4 @@ notices-for-facebook-graph-api-2
1.3.0-split-minifiers-package
1.4.0-remove-old-dev-bundle-link
1.4.1-add-shell-server-package
1.4.3-split-account-service-packages

View File

@@ -6,24 +6,24 @@
meteor-base@1.0.4 # Packages every Meteor app needs to have
mobile-experience@1.0.4 # Packages for a great mobile UX
mongo@1.1.14 # The database Meteor supports right now
mongo@1.1.17 # The database Meteor supports right now
blaze-html-templates@1.0.4 # Compile .html files into Meteor Blaze views
reactive-var@1.0.11 # Reactive variable for tracker
reactive-dict@1.1.8 # ???
jquery@1.11.10 # Helpful client-side library
tracker@1.1.1 # Meteor's client-side reactive programming library
tracker@1.1.3 # Meteor's client-side reactive programming library
tomwasd:history-polyfill # Adds IE 8/9 support for HTML5 history.
email@1.1.18 # Adds the Meteor/Email package for sending lost password emails
email@1.2.1 # Adds the Meteor/Email package for sending lost password emails
standard-minifier-css@1.3.2 # CSS minifier run for production mode
standard-minifier-js@1.2.1 # JS minifier run for production mode
standard-minifier-css@1.3.4 # CSS minifier run for production mode
standard-minifier-js@2.0.0 # JS minifier run for production mode
es5-shim@4.6.15 # ECMAScript 5 compatibility for older browsers.
poorvavyas:es6-shim
ecmascript@0.6.1 # Enable ECMAScript2015+ syntax in app code
ecmascript@0.7.3 # Enable ECMAScript2015+ syntax in app code
#accounts-ui
#accounts-base
accounts-password@1.3.3
accounts-password@1.3.6
useraccounts:core
useraccounts:bootstrap
useraccounts:flow-routing # Configures email flows. Used for AccountsTemplates class.
@@ -34,12 +34,12 @@ arillo:flow-router-helpers # Provides various template helpers such as {{pathFo
#tomwasd:flow-router-seo
kadira:blaze-layout
shell-server@0.2.1 # ???
shell-server@0.2.3 # ???
meteortoys:allthings
stylus@2.513.8
stylus@2.513.9
session@1.1.7
##browser-policy # Adds support for specifying browser level security rules related to content and what's allowed to laod on the page.
check@1.2.4 # Allows for checking the structure and types of arguments passed to Meteor methods and publications.
check@1.2.5 # Allows for checking the structure and types of arguments passed to Meteor methods and publications.
#audit-argument-checks # Used in combination with the Check package for checking the structure and types of arguments passed to Meteor methods and publications. Automatically alerts when a method or publication does not use a check() call.
aldeed:simple-schema@1.5.3
@@ -59,4 +59,6 @@ momentjs:moment
mizzao:bootboxjs # ???
aldeed:template-extension
juliancwirko:s-alert # Client error/alert handling
jcbernack:reactive-aggregate
jcbernack:reactive-aggregate # Allows us to create a new client collection (from the server) with the contents being an aggregate of server data. Note that aggregation can only be done on the server currently as mini-mongo does not support it.
ostrio:logger
ostrio:loggermongo

View File

@@ -1 +1 @@
METEOR@1.4.2.7
METEOR@1.4.4.2

View File

@@ -1,5 +1,5 @@
accounts-base@1.2.14
accounts-password@1.3.3
accounts-base@1.2.17
accounts-password@1.3.6
alanning:roles@1.2.15
aldeed:collection2@2.10.0
aldeed:collection2-core@1.2.0
@@ -9,31 +9,31 @@ aldeed:simple-schema@1.5.3
aldeed:template-extension@4.0.0
allow-deny@1.0.5
arillo:flow-router-helpers@0.5.2
autoupdate@1.2.11
babel-compiler@6.13.0
autoupdate@1.3.12
babel-compiler@6.18.2
babel-runtime@1.0.1
base64@1.0.10
binary-heap@1.0.10
blaze@2.1.9
blaze@2.3.2
blaze-html-templates@1.0.5
blaze-tools@1.0.10
boilerplate-generator@1.0.11
caching-compiler@1.1.9
caching-html-compiler@1.0.7
callback-hook@1.0.10
check@1.2.4
check@1.2.5
coffeescript@1.0.17
ddp@1.2.5
ddp-client@1.2.9
ddp-client@1.3.4
ddp-common@1.2.8
ddp-rate-limiter@1.0.6
ddp-server@1.2.10
ddp-rate-limiter@1.0.7
ddp-server@1.3.14
deps@1.0.12
diff-sequence@1.0.7
ecmascript@0.6.1
ecmascript@0.7.3
ecmascript-runtime@0.3.15
ejson@1.0.13
email@1.1.18
email@1.2.1
es5-shim@4.6.15
fastclick@1.0.13
fortawesome:fontawesome@4.7.0
@@ -41,19 +41,19 @@ geojson-utils@1.0.10
hot-code-push@1.0.4
html-tools@1.0.11
htmljs@1.0.11
http@1.1.8
http@1.2.12
id-map@1.0.9
jcbernack:reactive-aggregate@0.7.0
jquery@1.11.10
juliancwirko:s-alert@3.2.0
kadira:blaze-layout@2.3.0
kadira:flow-router@2.12.1
launch-screen@1.0.12
launch-screen@1.1.1
livedata@1.0.18
localstorage@1.0.12
logging@1.1.16
logging@1.1.17
mdg:validation-error@0.2.0
meteor@1.6.0
meteor@1.6.1
meteor-base@1.0.4
meteorhacks:aggregate@1.3.0
meteorhacks:collection-utils@1.2.0
@@ -72,29 +72,31 @@ meteortoys:status@3.0.0
meteortoys:sub@3.0.0
meteortoys:throttle@3.0.0
meteortoys:toykit@3.0.4
minifier-css@1.2.15
minifier-js@1.2.15
minimongo@1.0.19
minifier-css@1.2.16
minifier-js@2.0.0
minimongo@1.0.23
mizzao:bootboxjs@4.4.0
mobile-experience@1.0.4
mobile-status-bar@1.0.13
modules@0.7.7
modules-runtime@0.7.7
momentjs:moment@2.17.1
mongo@1.1.14
mobile-status-bar@1.0.14
modules@0.8.2
modules-runtime@0.7.10
momentjs:moment@2.18.1
mongo@1.1.17
mongo-id@1.0.6
mongo-livedata@1.0.12
msavin:jetsetter@2.0.0
msavin:mongol@2.0.1
npm-bcrypt@0.9.2
npm-mongo@2.2.11_2
observe-sequence@1.0.14
npm-mongo@2.2.24
observe-sequence@1.0.16
ordered-dict@1.0.9
ostrio:logger@1.1.2
ostrio:loggermongo@1.1.3
poorvavyas:es6-shim@0.21.1
promise@0.8.8
raix:eventemitter@0.1.3
random@1.0.10
rate-limit@1.0.6
rate-limit@1.0.8
reactive-dict@1.1.8
reactive-var@1.0.11
reload@1.1.11
@@ -103,26 +105,26 @@ routepolicy@1.0.12
service-configuration@1.0.11
session@1.1.7
sha@1.0.9
shell-server@0.2.1
shell-server@0.2.3
softwarerero:accounts-t9n@1.3.6
spacebars@1.0.13
spacebars-compiler@1.0.13
spacebars-compiler@1.1.1
srp@1.0.10
standard-minifier-css@1.3.2
standard-minifier-js@1.2.1
stylus@2.513.8
standard-minifier-css@1.3.4
standard-minifier-js@2.0.0
stylus@2.513.9
templating@1.2.15
templating-compiler@1.2.15
templating-runtime@1.2.15
templating-tools@1.0.5
templating-tools@1.1.1
tomwasd:history-polyfill@0.0.1
tracker@1.1.1
tracker@1.1.3
ui@1.0.12
underscore@1.0.10
url@1.0.11
url@1.1.0
useraccounts:bootstrap@1.14.2
useraccounts:core@1.14.2
useraccounts:flow-routing@1.14.2
webapp@1.3.12
webapp@1.3.15
webapp-hashing@1.0.9
zimme:active-route@2.3.2

View File

@@ -168,11 +168,13 @@ body
@import "../imports/ui/layouts/Full.import.styl"
@import "../imports/ui/UserManagement.import.styl"
@import "../imports/ui/MiscManagement.import.styl"
@import "../imports/ui/Measures.import.styl"
@import "../imports/ui/Venues.import.styl"
@import "../imports/ui/Products.import.styl"
@import "../imports/ui/ProductTags.import.styl"
@import "../imports/ui/Sales.import.styl"
@import "../imports/ui/SaleDuplicates.import.styl"
@import "../imports/ui/SalesSheets.import.styl"
@import "../imports/ui/SalesSheetForm.import.styl"
@import "../imports/ui/SalesSheetEditor.import.styl"

44
imports/api/Logs.js Normal file
View File

@@ -0,0 +1,44 @@
import { Meteor } from 'meteor/meteor';
import { Mongo } from 'meteor/mongo';
// The logging tool is primarily for managing administrative functions such that administrators can view the app logs and issue commands that might generate administrative logging.
Meteor.log = new Logger();
Logs = new Mongo.Collection('Logs');
let logMongo = new LoggerMongo(Meteor.log, {
collection: Logs
});
logMongo.enable({
enable: true,
client: false, /* Client calls are not executed on the client. */
server: true /* Calls from the client will be executed on the server. */
});
if(Meteor.isServer) {
Logs._ensureIndex({'date': 1}, {expireAfterSeconds: 86400});
Meteor.publish('logs', function() {
return Logs.find({}, {limit: 10000});
});
Meteor.methods({
clearLogs: function() {
return Logs.remove({}, function(err) {
if(err) Meteor.log.error(err);
});
}
});
}
Logs.allow({
insert: () => false,
update: () => false,
remove: () => false
});
Logs.deny({
insert: () => true,
update: () => true,
remove: () => true
});
export default Logs;

View File

@@ -3,6 +3,13 @@ import { Mongo } from 'meteor/mongo';
import { check } from 'meteor/check';
import {SimpleSchema} from 'meteor/aldeed:simple-schema';
/**
* Notes:
* The Product object has a prices field which is an object whose fields names are Measure ID's. Each field value (for each Measure ID) is an object that has a 'price', 'effectiveDate', and 'previousPrice'.
* The effectiveDate field stores the date as a number in the format YYYYMMDD. Converting this number into a local date is done with moment(sale.date.toString(), "YYYYMMDD").toDate(), and converting it to a number from a date can be accomplished with ~~(moment(date).format("YYYYMMDD")), where the ~~ is a bitwise not and converts a string to a number quickly and reliably.
* Because the structure of the Product object is so complicated, the normal checking that is done by the framework cannot be used.
*/
Products = new Mongo.Collection('Products');
const ProductsSchema = new SimpleSchema({
@@ -237,7 +244,7 @@ if(Meteor.isServer) {
check(measureId, String);
check(price, Number);
if(setPrevious) check(setPrevious, Boolean);
if(effectiveDate) check(effectiveDate, Date);
if(effectiveDate) check(effectiveDate, Number); // TODO: Check that the format is YYYYMMDD
if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) {
let products = Products.find({_id: {$in: productIds}}, {fields: {prices: 1}}).fetch();

View File

@@ -3,10 +3,15 @@ import { Mongo } from 'meteor/mongo';
import { check } from 'meteor/check';
import {SimpleSchema} from 'meteor/aldeed:simple-schema';
/**
* Notes:
* The Sale object has a date field which stores the date as a number in the format YYYYMMDD. Converting this number into a local date is done with moment(sale.date.toString(), "YYYYMMDD").toDate(), and converting it to a number from a date can be accomplished with ~~(moment(date).format("YYYYMMDD")), where the ~~ is a bitwise not and converts a string to a number quickly and reliably.
*/
Sales = new Mongo.Collection('Sales');
let SalesSchema = new SimpleSchema({
date: {
type: Date,
type: Number, // A number in the format of YYYYMMDD to allow for searching using greater and less than, and to prevent timezones from messing everything up.
label: "Date",
optional: false,
index: 1
@@ -58,6 +63,19 @@ let SalesSchema = new SimpleSchema({
trim: false,
optional: true
},
ignoreDuplicates: {
type: Boolean,
optional: true
},
isDuplicateOf: {
type: String,
trim: false,
optional: true
},
duplicateCount: {
type: Number,
optional: true
},
createdAt: {
type: Date,
label: "Created On",
@@ -71,14 +89,22 @@ if(Meteor.isServer) {
let dbQuery = [];
if(query) {
// _.each(_.keys(query), function(key) {
// if(_.isObject(query[key])) dbQuery[key] = query[key];
// else if(_.isNumber(query[key])) dbQuery[key] = query[key];
// else dbQuery[key] = {$regex: RegExp.escape(query[key]), $options: 'i'};
// });
_.each(_.keys(query), function(key) {
if(_.isObject(query[key])) dbQuery.push({[key]: query[key]});
//if(_.isObject(query[key])) dbQuery.push({[key]: query[key]});
if(_.isObject(query[key])) {
if(query[key].type === 'dateRange') {
if(query[key].start && query[key].end)
dbQuery.push({[key]: {$gte: query[key].start, $lte: query[key].end}});
else if(query[key].start)
dbQuery.push({[key]: {$gte: query[key].start}});
else if(query[key].end)
dbQuery.push({[key]: {$lte: query[key].end}});
// Do nothing if a start and/or end are not provided.
}
else {
dbQuery.push({[key]: query[key]});
}
}
else if(_.isNumber(query[key])) dbQuery.push({[key]: query[key]});
else {
let searchValue = query[key];
@@ -97,6 +123,65 @@ if(Meteor.isServer) {
dbQuery = dbQuery.length > 0 ? {$and: dbQuery} : {};
return Meteor.collections.Sales.find(dbQuery, {limit: limit, sort, skip: skipCount});
});
Meteor.publish('duplicateSales', function(query, includeIgnoredDuplicates) {
// Start with the duplicate count needing to be greater than zero, and with duplicates marked as ignored not included.
let dbQuery = [{duplicateCount: {$gt: 0}}];
// If we should include ignored duplicates than add it to the query as a requirement.
if(!includeIgnoredDuplicates) {
dbQuery.push({$or: [{ignoreDuplicates: {$exists: false}}, {ignoreDuplicates: false}]});
}
//if(query) {
// // Add each query requirement sent by the client.
// _.each(_.keys(query), function(key) {
// //if(_.isObject(query[key])) dbQuery.push({[key]: query[key]});
// if(_.isObject(query[key])) {
// if(query[key].type === 'dateRange') {
// if(query[key].start && query[key].end)
// dbQuery.push({[key]: {$gte: query[key].start, $lte: query[key].end}});
// else if(query[key].start)
// dbQuery.push({[key]: {$gte: query[key].start}});
// else if(query[key].end)
// dbQuery.push({[key]: {$lte: query[key].end}});
// // Do nothing if a start and/or end are not provided.
// }
// else {
// dbQuery.push({[key]: query[key]});
// }
// }
// else if(_.isNumber(query[key])) dbQuery.push({[key]: query[key]});
// else {
// let searchValue = query[key];
// let searches = searchValue && searchValue.length > 0 ? searchValue.split(/\s+/) : undefined;
//
// for(let search of searches) {
// dbQuery.push({[key]: {$regex: '\\b' + search, $options: 'i'}});
// }
// }
// });
//}
// Wrap the array of requirements with an $and, or remove the single requirement from the array (if there is only a single requirement).
if(dbQuery.length === 1) dbQuery = dbQuery[0];
else dbQuery = {$and: dbQuery};
// Find all Sale objects marked as having at least one duplicate.
//return Meteor.collections.Sales.find(dbQuery);
let pipeline = [
{$match: dbQuery},
{$lookup: {from: "Products", localField: "productId", foreignField: "_id", as: "product"}},
{$lookup: {from: "Measures", localField: "measureId", foreignField: "_id", as: "measure"}},
{$lookup: {from: "Venues", localField: "venueId", foreignField: "_id", as: "venue"}},
{$unwind: "$product"},
{$unwind: "$measure"},
{$unwind: "$venue"},
{$project: {_id: 1, date: 1, amount: 1, price: 1, venueId: 1, productId: 1, measureId: 1, duplicateCount: 1, ignoreDuplicates: 1, 'productName': '$product.name', 'measureName': '$measure.name', 'venueName': '$venue.name'}}
];
ReactiveAggregate(this, Sales, pipeline, {clientCollection: 'duplicateSales'});
});
// time: expects either undefined, 'weekly', or 'monthly'
// options: expects either undefined, 'markets', or 'types'
Meteor.publish('salesTotals', function(time, options) {
@@ -185,7 +270,7 @@ if(Meteor.isServer) {
},
insertSale: function(sale) {
check(sale, {
date: Date,
date: Number, // TODO: Check that the format is YYYYMMDD
amount: Match.Where(function(x) {
check(x, Number);
return x > 0;
@@ -199,7 +284,7 @@ if(Meteor.isServer) {
venueId: String,
comment: Match.Optional(String)
});
//TODO: Check the structure of sale. Use: check(sale, {name: String, ...});
sale.createdAt = new Date();
if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) {
@@ -242,7 +327,7 @@ if(Meteor.isServer) {
},
updateSale: function(id, date, venueId, price, amount) {
check(id, String);
check(date, Date);
check(date, Number); // TODO: Check that the format is YYYYMMDD
check(venueId, String);
check(price, Number);
check(amount, Number);
@@ -252,7 +337,152 @@ if(Meteor.isServer) {
if(err) console.log(err);
}, {bypassCollection2: true});
}
else throw new Meteor.Error(403, "Not authorized.");
},
countSales: function() {
if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) {
return Sales.find({}).count();
}
else throw new Meteor.Error(403, "Not authorized.");
},
removeDuplicateSales: function(id, justOne) { // Expects the id of the sale that has duplicates and an optional boolean flag (justOne) indicating whether just one duplicate should be removed, or all of them (default).
if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) {
// Remove either one or all of the duplicates of the Sale with the given ID.
if(justOne) {
let sale = Sales.findOne({isDuplicateOf: id});
if(sale) {
Sales.remove({_id: sale._id});
}
}
else {
Sales.remove({isDuplicateOf: id});
}
}
},
ignoreDuplicateSales: function(id) { // Expects the id of the sale that has duplicates. Will mark this sale and all duplicates to be ignored in future duplicate checks.
if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) {
// Mark to ignore duplicates for this Sale (id) and all its duplicates, and clear any duplicate counts and references.
//Sales.update({$or: [{_id: id}, {isDuplicateOf: id}]}, {$set: {ignoreDuplicates: true}, $unset: {isDuplicateOf: "", duplicateCount: ""}});
// Mark to ignore duplicates for this Sale (id). We will leave the duplicate count and references so that the duplicates will show in a query if we want to revisit those marked as ignored.
Sales.update({$or: [{_id: id}, {isDuplicateOf: id}]}, {$set: {ignoreDuplicates: true}});
}
},
markDuplicateSales: function() {
if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) {
let sales = Sales.find({}, {sort: {date: 1, venueId: 1, productId: 1, price: 1, amount: 1, measureId: 1, createdAt: 1}}).fetch();
// Iterate over all the sales looking for sales that have duplicates.
// Since the sales are sorted by sale date, venueId, productId, price, amount, and measureId which all must be identical to be considered a possible duplicate sale, we only have to check subsequent sales until a non-duplicate is found.
for(let i = 0; i < sales.length;) {
let sale = sales[i];
// If this is marked as a duplicate of another sale, but we got to this point in the loop then the sale it is a duplicate of must have been removed or marked to ignore duplicates.
if(sale.isDuplicateOf) {
delete sale.isDuplicateOf;
Sales.update(sale._id, {$unset: {isDuplicateOf: ""}}, function(err, id) {
if(err) console.log(err);
}, {bypassCollection2: true});
}
//Skip this one if it is marked to ignore duplicates.
//if(sale.ignoreDuplicates) {
// i++;
//}
//else {
let keepChecking = true;
let duplicateCount = 0;
// Keep checking subsequent sales until a non-duplicate is found. Ignore anything marked to ignore duplicates. Count the number of duplicates and also mark duplicates to reference the Sale we are currently checking.
while(keepChecking) {
let checkSale = sales[++i]; // Increment the index to the next Sale object.
// Since it is possible to exceed the length of the array, we will check for an undefined next sale and set the flag to stop checking if one is found.
if(checkSale && sale.productId === checkSale.productId && sale.venueId === checkSale.venueId && sale.price === checkSale.price && sale.amount === checkSale.amount && sale.measureId === checkSale.measureId) {
// Mark the next sale as a duplicate of the currently examined sale.
checkSale.isDuplicateOf = sale._id;
Sales.update(checkSale._id, {$set: {isDuplicateOf: checkSale.isDuplicateOf}}, function(err, id) {
if(err) console.log(err);
}, {bypassCollection2: true});
duplicateCount++;
}
else {
// Stop checking.
keepChecking = false;
}
}
// Make sure the currently checked sale has a proper duplicate count before moving on in the search.
if(duplicateCount > 0) {
if(sale.duplicateCount !== duplicateCount) {
// Update the sale's duplicate count.
sale.duplicateCount = duplicateCount;
Sales.update(sale._id, {$set: {duplicateCount: sale.duplicateCount}}, function(err, id) {
if(err) console.log(err);
}, {bypassCollection2: true});
}
}
else if(sale.duplicateCount) {
// Remove the duplicate count if it is set.
delete sale.duplicateCount;
Sales.update(sale._id, {$unset: {duplicateCount: ""}}, function(err, id) {
if(err) console.log(err);
}, {bypassCollection2: true});
}
//}
}
}
else throw new Meteor.Error(403, "Not authorized.");
}
/*
countDuplicateSales: function() {
if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_MANAGE])) {
let sales = Sales.find({}, {sort: {date: 1, venueId: 1, productId: 1, price: 1, amount: 1, measureId: 1}}).fetch();
let salesByDate = {};
let lastDate = undefined;
let lastDateCollection;
let duplicates = [];
//Create a map of Sale arrays by sale date.
for(let i = 0; i < sales.length; i++) {
let date = sales[i].date;
if(date) {
if(date === lastDate) {
lastDateCollection.push(sales[i]);
}
else {
lastDate = date;
salesByDate[date] = lastDateCollection = [sales[i]];
}
}
else {
Meteor.log.error("Found a sale without a date!!!");
}
}
for(let date in salesByDate) {
let sales = salesByDate[date];
for(let i = 0; i < sales.length - 1; i++) {
if(sales[i].productId === sales[i+1].productId && sales[i].venueId === sales[i+1].venueId && sales[i].price === sales[i+1].price && sales[i].amount === sales[i+1].amount && sales[i].measureId === sales[i+1].amount) {
duplicates.push([sales[i], sales[i+1]]);
}
}
}
return duplicates;
}
else throw new Meteor.Error(403, "Not authorized.");
},
deleteDuplicateSales: function() {
if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_MANAGE])) {
}
else throw new Meteor.Error(403, "Not authorized.");
}
*/
});
}

View File

@@ -4,11 +4,12 @@ import Products from "./Product.js";
import ProductTags from "./ProductTag.js";
import Sales from "./Sale.js";
import SalesSheets from "./SalesSheet.js";
import Logs from "./Logs.js";
import Users from "./User.js";
import UserRoles from "./Roles.js";
//Save the collections in the Meteor.collections property for easy access without name conflicts.
Meteor.collections = {Measures, Venues, Products, ProductTags, Sales, SalesSheets, Users, UserRoles};
Meteor.collections = {Measures, Venues, Products, ProductTags, Sales, SalesSheets, Logs, Users, UserRoles};
//If this is the server then setup the default admin user if none exist.
if(Meteor.isServer) {

View File

@@ -36,6 +36,13 @@ pri.route('/userManagement', {
BlazeLayout.render('Body', {content: 'UserManagement'});
}
});
pri.route('/miscManagement', {
name: 'MiscManagement',
action: function(params, queryParams) {
require("/imports/ui/MiscManagement.js");
BlazeLayout.render('Body', {content: 'MiscManagement'});
}
});
pri.route('/sales', {
name: 'Sales',
action: function(params, queryParams) {
@@ -44,6 +51,14 @@ pri.route('/sales', {
BlazeLayout.render('Body', {content: 'Sales'});
}
});
pri.route('/saleDuplicates', {
name: 'SaleDuplicates',
action: function(params, queryParams) {
require("/imports/ui/SaleDuplicates.js");
BlazeLayout.render('Body', {content: 'SaleDuplicates'});
}
});
pri.route('/salesSheets', {
name: 'SalesSheets',
action: function(params, queryParams) {

View File

@@ -1,37 +1,44 @@
<template name="Measures">
<div id="measures">
<div class="tableControls">
<span class="controlLabel">Show Hidden</span>
<div class="toggleShowHidden checkbox checkbox-slider--b-flat">
<label>
<input type="checkbox" name="showHidden"><span></span>
</label>
{{#if Template.subscriptionsReady}}
<div class="tableControls">
<span class="controlLabel">Show Hidden</span>
<div class="toggleShowHidden checkbox checkbox-slider--b-flat">
<label>
<input type="checkbox" name="showHidden"><span></span>
</label>
</div>
<span class="pagination">
<span class="prevMeasures noselect {{#if disablePrev}}disabled{{/if}}"><i class="fa fa-long-arrow-left" aria-hidden="true"></i> Prev</span>
<span class="nextMeasures noselect {{#if disableNext}}disabled{{/if}}">Next <i class="fa fa-long-arrow-right" aria-hidden="true"></i></span>
</span>
</div>
<span class="pagination">
<span class="prevMeasures noselect {{#if disablePrev}}disabled{{/if}}"><i class="fa fa-long-arrow-left" aria-hidden="true"></i> Prev</span>
<span class="nextMeasures noselect {{#if disableNext}}disabled{{/if}}">Next <i class="fa fa-long-arrow-right" aria-hidden="true"></i></span>
</span>
</div>
<div class="tableContainer">
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="name">Name {{>MeasureSearch columnName='name'}}</th>
<th class="postfix">Postfix {{>MeasureSearch columnName='postfix'}}</th>
<th class="actions">Actions <span class="newMeasureButton btn btn-success"><i class="fa fa-plus-circle" aria-hidden="true"></i><i class="fa fa-times-circle" aria-hidden="true"></i></span></th>
</tr>
<!--<button type="button" name="newMeasureButton"><i class="fa fa-plus-circle" aria-hidden="true"></i></button>-->
</thead>
<tbody>
{{#if displayNewMeasure}}
{{> MeasureEditor isNew=true}}
{{/if}}
{{#each measures}}
{{> Measure}}
{{/each}}
</tbody>
</table>
</div>
<div class="listRow">
<div class="listCell">
<div class="tableContainer">
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="name">Name {{>MeasureSearch columnName='name'}}</th>
<th class="postfix">Postfix {{>MeasureSearch columnName='postfix'}}</th>
<th class="actions">Actions <span class="newMeasureButton btn btn-success"><i class="fa fa-plus-circle" aria-hidden="true"></i><i class="fa fa-times-circle" aria-hidden="true"></i></span></th>
</tr>
<!--<button type="button" name="newMeasureButton"><i class="fa fa-plus-circle" aria-hidden="true"></i></button>-->
</thead>
<tbody>
{{#if displayNewMeasure}}
{{> MeasureEditor isNew=true}}
{{/if}}
{{#each measures}}
{{> Measure}}
{{/each}}
</tbody>
</table>
</div>
</div>
</div>
{{else}}
{{/if}}
</div>
</template>

View File

@@ -1,6 +1,9 @@
#measures
margin: 20px 20px
display: table
content-box: border-box
padding: 10px 20px
height: 100%
width: 100%
text-align: left
.tableControls
@@ -18,77 +21,89 @@
top: -4px
display: inline-block
.tableContainer
width: 100%
margin-bottom: 20px
border: 0
font-size: 12.5px
table
table-layout: fixed
.listRow
display: table-row
.listCell
display: table-cell
position: relative
height: 100%
width: 100%
.measureSearch
margin: 3px 0 2px 1px
.measureEditorTd
background: #deeac0
input[name="name"], input[name="postfix"]
width: 100%
.editorDiv
margin: 4px 0
label
font-family: "Arial Black", "Arial Bold", Gadget, sans-serif
font-size: .9em
padding-bottom: 4px
select2
font-size: .4em
> thead
> tr
> th.name
width: auto
> th.postfix
width: auto
> th.actions
width: 90px
text-align: center
.newMeasureButton
margin-top: 4px
padding: 0px 12px
.fa-plus-circle
display: inline-block
.fa-times-circle
display: none
.newMeasureButton.active
background-color: #fb557b
color: black
.fa-times-circle
display: inline-block
.fa-plus-circle
display: none
> tbody
> tr
.actionRemove
color: #F77
.actionEdit
color: #44F
.editorApply
color: green
.editorCancel
color: red
> tr.deactivated
background-color: #fac0d1
.actionActivate
color: #158b18
.actionHide
color: #6a0707
.actionEdit
color: #0101e4
> tr.deactivated:hover
background-color: #ffcadb
> tr.hidden
background-color: #e995ff
.actionEdit
color: #0101e4
.actionShow
color: #027905
> tr.hidden:hover
background-color: #ffb5ff
.tableContainer
position: absolute
top: 0
bottom: 0
left: 0
right: 0
width: auto
height: auto
border: 0
font-size: 12.5px
overflow-y: auto
table
table-layout: fixed
width: 100%
.measureSearch
margin: 3px 0 2px 1px
.measureEditorTd
background: #deeac0
input[name="name"], input[name="postfix"]
width: 100%
.editorDiv
margin: 4px 0
label
font-family: "Arial Black", "Arial Bold", Gadget, sans-serif
font-size: .9em
padding-bottom: 4px
select2
font-size: .4em
> thead
> tr
> th.name
width: auto
> th.postfix
width: auto
> th.actions
width: 90px
text-align: center
.newMeasureButton
margin-top: 4px
padding: 0px 12px
.fa-plus-circle
display: inline-block
.fa-times-circle
display: none
.newMeasureButton.active
background-color: #fb557b
color: black
.fa-times-circle
display: inline-block
.fa-plus-circle
display: none
> tbody
> tr
.actionRemove
color: #F77
.actionEdit
color: #44F
.editorApply
color: green
.editorCancel
color: red
> tr.deactivated
background-color: #fac0d1
.actionActivate
color: #158b18
.actionHide
color: #6a0707
.actionEdit
color: #0101e4
> tr.deactivated:hover
background-color: #ffcadb
> tr.hidden
background-color: #e995ff
.actionEdit
color: #0101e4
.actionShow
color: #027905
> tr.hidden:hover
background-color: #ffb5ff

View File

@@ -0,0 +1,27 @@
<template name="MiscManagement">
<div id="miscManagement">
{{#if Template.subscriptionsReady}}
<div class="controls">
<a href="javascript:" class="cleanDates">Clean Dates (removes time components)</a><br/>
<!--<a href="javascript:" class="importMissingSalesData">Import Sales Data (JSON)</a><br/>-->
<a href="javascript:" class="clearLogs">Clear Logs</a><br/>
<a href="javascript:" class="countDuplicateSales">Count Duplicate Sales</a><br/>
<a href="javascript:" class="deleteDuplicateSales">Delete Duplicate Sales</a><br/>
<div class="logCount">{{logCount}}</div>
</div>
<div class="pageContentRow">
<div class="pageContentCell">
<div class="pageContentContainer">
<ul class="logs">
{{#each logs}}
<li>{{message}}</li>
{{/each}}
</ul>
</div>
</div>
</div>
{{else}}
{{/if}}
</div>
</template>

35
imports/ui/MiscManagement.import.styl vendored Normal file
View File

@@ -0,0 +1,35 @@
#miscManagement
display: table
content-box: border-box
padding: 10px 20px
height: 100%
width: 100%
text-align: left
.controls
text-align: right
margin-right: 20px
.pageContentRow
display: table-row
.pageContentCell
display: table-cell
position: relative
height: 100%
width: 100%
.pageContentContainer
position: absolute
top: 0
bottom: 0
left: 0
right: 0
width: auto
height: auto
border: 0
font-size: 12.5px
overflow-y: auto
.logs
list-style-type: none
height: 100%
:hover
background: #CCC

View File

@@ -0,0 +1,76 @@
import './MiscManagement.html';
import '/imports/util/selectize/selectize.js'
let PREFIX = "MiscManagement";
Meteor.subscribe("logs");
Meteor.subscribe("products");
Meteor.subscribe("venues");
Meteor.subscribe("measures");
Template.MiscManagement.helpers({
logs: function() {
return Meteor.collections.Logs.find({}, {sort: {date: 1}});
},
logCount: function() {
return Meteor.collections.Logs.find({}).count();
}
});
Template.MiscManagement.events({
"click .cleanDates": function(event, template) {
Meteor.call("cleanDates");
},
"click .importMissingSalesData": function(event, template) {
console.log("Calling importMissingSales");
Meteor.call("importMissingSales");
},
"click .clearLogs": function(event, template) {
Meteor.call("clearLogs");
},
"click .countDuplicateSales": function(event, template) {
Meteor.log.info("Starting to count duplicates...");
let products = Meteor.collections.Products.find({}).fetch();
let venues = Meteor.collections.Venues.find({}).fetch();
let measures = Meteor.collections.Measures.find({}).fetch();
let productNameMap = {};
let venueNameMap = {};
let measureNameMap = {};
for(let i = 0; i < products.length; i++) {
productNameMap[products[i]._id] = products[i].name;
}
for(let i = 0; i < venues.length; i++) {
venueNameMap[venues[i]._id] = venues[i].name;
}
for(let i = 0; i < measures.length; i++) {
measureNameMap[measures[i]._id] = measures[i].name;
}
Meteor.call("countSales", function(err, result) {
if(err) Meteor.log.error(err);
else {
let salesCount = result;
Meteor.call("countDuplicateSales", function(err, result) {
if(err) Meteor.log.error(err);
else {
Meteor.log.info("Duplicate Sales Counted: " + result.length + " out of " + salesCount + " total sales.");
for(let i = 0; i < result.length; i++) {
let sale = result[i][0];
Meteor.log.info("\tdate: " + sale.date + " product: " + productNameMap[sale.productId] + " venue: " + venueNameMap[sale.venueId] + " measure" + measureNameMap[sale.measureId] + " price: " + sale.price.toFixed(2) + " amount: " + sale.amount + " id: " + sale._id);
sale = result[i][1];
Meteor.log.info("\tdate: " + sale.date + " product: " + productNameMap[sale.productId] + " venue: " + venueNameMap[sale.venueId] + " measure" + measureNameMap[sale.measureId] + " price: " + sale.price.toFixed(2) + " amount: " + sale.amount + " id: " + sale._id);
Meteor.log.info(" -- ");
}
}
});
}
});
},
"click .deleteDuplicateSales": function(event, template) {
Meteor.call("deleteDuplicateSales");
}
});

View File

@@ -1,54 +1,61 @@
<template name="Pricing">
<div id="pricing">
<div class="controls">
<div class="measureGroup" style="vertical-align: bottom">
<label class='controlLabel'>Selected Measure: </label>
<select name="measures">
{{#each measures}}
<option value="{{_id}}">{{name}}</option>
{{/each}}
</select>
</div>
<div class="controlGroup" style="text-align: center">
<label class='controlLabel'>New Price: </label>
<input type="number" class="price" name="price" min="0" data-schema-key='currency' value="{{price}}" required>
<input type="button" class="btn btn-success applyButton" title="Applies the price to selected products." value="Apply">
<input type="button" class="btn btn-danger resetButton" title="Resets this form." value="Reset">
<br/>
<!--<span class="toggleUpdateHistory toggleButton clickable">Set Prev</span>-->
<div class="previousSettings outline">
<span class="controlLabel">Set Previous:</span>
<div class="toggleUpdateHistory checkbox checkbox-slider--b-flat">
<label>
<input type="checkbox" name="setPrevious" checked><span></span>
</label>
{{#if Template.subscriptionsReady}}
<div class="controls">
<div class="measureGroup" style="vertical-align: bottom">
<label class='controlLabel'>Selected Measure: </label>
<select name="measures">
{{#each measures}}
<option value="{{_id}}">{{name}}</option>
{{/each}}
</select>
</div>
<div class="controlGroup" style="text-align: center">
<label class='controlLabel'>New Price: </label>
<input type="number" class="price" name="price" min="0" data-schema-key='currency' value="{{price}}" required>
<input type="button" class="btn btn-success applyButton" title="Applies the price to selected products." value="Apply">
<input type="button" class="btn btn-danger resetButton" title="Resets this form." value="Reset">
<br/>
<!--<span class="toggleUpdateHistory toggleButton clickable">Set Prev</span>-->
<div class="previousSettings outline">
<span class="controlLabel">Set Previous:</span>
<div class="toggleUpdateHistory checkbox checkbox-slider--b-flat">
<label>
<input type="checkbox" name="setPrevious" checked><span></span>
</label>
</div>
<label class='controlLabel' style="margin-left: 10px">Effective: </label>
<input type="date" class="form-control" name="date" data-schema-key='date' required>
</div>
</div>
<span class="pagination">
<span class="prevProducts noselect {{#if disablePrev}}disabled{{/if}}"><i class="fa fa-long-arrow-left" aria-hidden="true"></i> Prev</span>
<span class="nextProducts noselect {{#if disableNext}}disabled{{/if}}">Next <i class="fa fa-long-arrow-right" aria-hidden="true"></i></span>
</span>
</div>
<div class="listRow">
<div class="listCell">
<div class="tableContainer">
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="name">Name</th>
<th class="current">Current</th>
<th class="changeDate">Change Date</th>
<th class="previous">Previous</th>
</tr>
</thead>
<tbody>
{{#each product}}
{{> PricingForProduct}}
{{/each}}
</tbody>
</table>
</div>
<label class='controlLabel' style="margin-left: 10px">Effective: </label>
<input type="date" class="form-control" name="date" data-schema-key='date' required>
</div>
</div>
<span class="pagination">
<span class="prevProducts noselect {{#if disablePrev}}disabled{{/if}}"><i class="fa fa-long-arrow-left" aria-hidden="true"></i> Prev</span>
<span class="nextProducts noselect {{#if disableNext}}disabled{{/if}}">Next <i class="fa fa-long-arrow-right" aria-hidden="true"></i></span>
</span>
</div>
<div class="tableContainer">
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="name">Name</th>
<th class="current">Current</th>
<th class="changeDate">Change Date</th>
<th class="previous">Previous</th>
</tr>
</thead>
<tbody>
{{#each product}}
{{> PricingForProduct}}
{{/each}}
</tbody>
</table>
</div>
{{else}}
{{/if}}
</div>
</template>

View File

@@ -1,6 +1,9 @@
#pricing
margin: 20px 20px
display: table
content-box: border-box
padding: 10px 20px
height: 100%
width: 100%
text-align: left
.controls
@@ -60,26 +63,39 @@
.resetButton
margin-left: 20px
.tableContainer
width: 100%
margin-bottom: 20px
border: 0
font-size: 12.5px
table
table-layout: fixed
.listRow
display: table-row
.listCell
display: table-cell
position: relative
height: 100%
width: 100%
> thead
> tr
> th.name
width: auto
> th.current
width: 200px
> th.previous
width: 200px
> th.changeDate
width: 200px
> tbody
> tr.deactivated
background-color: #fac0d1
> tr.deactivated:hover
background-color: #ffcadb
.tableContainer
position: absolute
top: 0
bottom: 0
left: 0
right: 0
width: auto
height: auto
border: 0
font-size: 12.5px
overflow-y: auto
table
table-layout: fixed
width: 100%
> thead
> tr
> th.name
width: auto
> th.current
width: 200px
> th.previous
width: 200px
> th.changeDate
width: 200px
> tbody
> tr.deactivated
background-color: #fac0d1
> tr.deactivated:hover
background-color: #ffcadb

View File

@@ -1,6 +1,13 @@
import './Pricing.html';
/**
* Notes:
* The Product object has a prices field which is an object whose fields names are Measure ID's. Each field value (for each Measure ID) is an object that has a 'price', 'effectiveDate', and 'previousPrice'.
* The effectiveDate field stores the date as a number in the format YYYYMMDD. Converting this number into a local date is done with moment(sale.date.toString(), "YYYYMMDD").toDate(), and converting it to a number from a date can be accomplished with ~~(moment(date).format("YYYYMMDD")), where the ~~ is a bitwise not and converts a string to a number quickly and reliably.
* Because the structure of the Product object is so complicated, the normal checking that is done by the framework cannot be used.
*/
let QUERY_LIMIT = 20;
let PREFIX = "Pricing.";
@@ -70,7 +77,7 @@ Template.Pricing.events({
Meteor.call("clearProductPrice", productIds, measureId)
}
else {
date = moment(date ? date : new Date().toDateInputValue(), "YYYY-MM-DD").toDate();
date = ~~(moment(date ? date : new Date().toDateInputValue(), "YYYY-MM-DD").format("YYYYMMDD")); // The ~~ is a bitwise not which converts the string into a number in the format of YYYYMMDD for storage in the database; to avoid timezone issues.
setPrevious = setPrevious == true || setPrevious == 'on' || setPrevious == "true" || setPrevious == "yes";
if(setPrevious == true && !date) {
@@ -117,9 +124,8 @@ Template.PricingForProduct.helpers({
},
priceChangeDate: function() {
let measureId = Session.get(PREFIX + "selectedMeasure");
let date = this.prices && measureId && this.prices[measureId] && this.prices[measureId].effectiveDate ? this.prices[measureId].effectiveDate : undefined;
return date ? moment(date).format("MM/DD/YYYY (w)") : "-";
return this.prices && measureId && this.prices[measureId] && this.prices[measureId].effectiveDate ? moment(this.prices[measureId].effectiveDate.toString(), "YYYYMMDD").format("MM/DD/YYYY (w)") : "-";
},
rowClass: function() {
return this.deactivated ? "deactivated" : "";

View File

@@ -26,20 +26,24 @@
</span>
</div>
</div>
<div class="tableContainer">
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="name">Name {{>ProductTag_ProductSearch columnName='name'}}</th>
<th class="tags">Tags {{>ProductTag_ProductSearch columnName='tags' collectionQueryColumnName='name' collection='ProductTags' collectionResultColumnName='_id'}}</th>
</tr>
</thead>
<tbody>
{{#each products}}
{{> ProductTag_Product}}
{{/each}}
</tbody>
</table>
<div class="listRow">
<div class="listCell">
<div class="tableContainer">
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="name">Name {{>ProductTag_ProductSearch columnName='name'}}</th>
<th class="tags">Tags {{>ProductTag_ProductSearch columnName='tags' collectionQueryColumnName='name' collection='ProductTags' collectionResultColumnName='_id'}}</th>
</tr>
</thead>
<tbody>
{{#each products}}
{{> ProductTag_Product}}
{{/each}}
</tbody>
</table>
</div>
</div>
</div>
{{else}}
{{/if}}

View File

@@ -1,6 +1,9 @@
#productTags
margin: 20px 20px
display: table
content-box: border-box
padding: 10px 20px
height: 100%
width: 100%
text-align: left
.tagInfo
@@ -107,25 +110,38 @@
display: table-cell
width: 240px
vertical-align: bottom;
.tableContainer
width: 100%
margin-bottom: 20px
border: 0
font-size: 12.5px
table
table-layout: fixed
.listRow
display: table-row
.listCell
display: table-cell
position: relative
height: 100%
width: 100%
> thead
> tr
> th.name
width: auto
> th.tags
width: auto
> tbody
> tr.deactivated
background-color: #fac0d1
> tr.deactivated:hover
background-color: #ffcadb
.tableContainer
position: absolute
top: 0
bottom: 0
left: 0
right: 0
width: auto
height: auto
border: 0
font-size: 12.5px
overflow-y: auto
table
table-layout: fixed
width: 100%
> thead
> tr
> th.name
width: auto
> th.tags
width: auto
> tbody
> tr.deactivated
background-color: #fac0d1
> tr.deactivated:hover
background-color: #ffcadb
td.roles
.role
padding: 4px 4px

View File

@@ -1,39 +1,46 @@
<template name="Products">
<div id="products">
<div class="tableControls">
<span class="controlLabel">Show Hidden</span>
<div class="toggleShowHidden checkbox checkbox-slider--b-flat">
<label>
<input type="checkbox" name="showHidden"><span></span>
</label>
{{#if Template.subscriptionsReady}}
<div class="tableControls">
<span class="controlLabel">Show Hidden</span>
<div class="toggleShowHidden checkbox checkbox-slider--b-flat">
<label>
<input type="checkbox" name="showHidden"><span></span>
</label>
</div>
<span class="pagination">
<span class="prevProducts noselect {{#if disablePrev}}disabled{{/if}}"><i class="fa fa-long-arrow-left" aria-hidden="true"></i> Prev</span>
<span class="nextProducts noselect {{#if disableNext}}disabled{{/if}}">Next <i class="fa fa-long-arrow-right" aria-hidden="true"></i></span>
</span>
</div>
<span class="pagination">
<span class="prevProducts noselect {{#if disablePrev}}disabled{{/if}}"><i class="fa fa-long-arrow-left" aria-hidden="true"></i> Prev</span>
<span class="nextProducts noselect {{#if disableNext}}disabled{{/if}}">Next <i class="fa fa-long-arrow-right" aria-hidden="true"></i></span>
</span>
</div>
<div class="tableContainer">
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="name">Name {{>ProductSearch columnName='name'}}</th>
<th class="tags">Tags {{>ProductSearch columnName='tags' collectionQueryColumnName='name' collection='ProductTags' collectionResultColumnName='_id'}}</th>
<th class="aliases">Aliases {{>ProductSearch columnName='aliases'}}</th>
<th class="measures">Measures {{>ProductSearch columnName='measures' collectionQueryColumnName='name' collection='Measures' collectionResultColumnName='_id'}}</th>
<th class="actions">Actions <span class="newProductButton btn btn-success"><i class="fa fa-plus-circle" aria-hidden="true"></i><i class="fa fa-times-circle" aria-hidden="true"></i></span></th>
</tr>
<!--<button type="button" name="newProductButton"><i class="fa fa-plus-circle" aria-hidden="true"></i></button>-->
</thead>
<tbody>
{{#if displayNewProduct}}
{{> ProductEditor isNew=true}}
{{/if}}
{{#each products}}
{{> Product}}
{{/each}}
</tbody>
</table>
</div>
<div class="listRow">
<div class="listCell">
<div class="tableContainer">
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="name">Name {{>ProductSearch columnName='name'}}</th>
<th class="tags">Tags {{>ProductSearch columnName='tags' collectionQueryColumnName='name' collection='ProductTags' collectionResultColumnName='_id'}}</th>
<th class="aliases">Aliases {{>ProductSearch columnName='aliases'}}</th>
<th class="measures">Measures {{>ProductSearch columnName='measures' collectionQueryColumnName='name' collection='Measures' collectionResultColumnName='_id'}}</th>
<th class="actions">Actions <span class="newProductButton btn btn-success"><i class="fa fa-plus-circle" aria-hidden="true"></i><i class="fa fa-times-circle" aria-hidden="true"></i></span></th>
</tr>
<!--<button type="button" name="newProductButton"><i class="fa fa-plus-circle" aria-hidden="true"></i></button>-->
</thead>
<tbody>
{{#if displayNewProduct}}
{{> ProductEditor isNew=true}}
{{/if}}
{{#each products}}
{{> Product}}
{{/each}}
</tbody>
</table>
</div>
</div>
</div>
{{else}}
{{/if}}
</div>
</template>

View File

@@ -1,6 +1,9 @@
#products
margin: 20px 20px
display: table
content-box: border-box
padding: 10px 20px
height: 100%
width: 100%
text-align: left
.tableControls
@@ -18,81 +21,93 @@
top: -4px
display: inline-block
.tableContainer
width: 100%
margin-bottom: 20px
border: 0
font-size: 12.5px
table
table-layout: fixed
.listRow
display: table-row
.listCell
display: table-cell
position: relative
height: 100%
width: 100%
.productSearch
margin: 3px 0 2px 1px
.productEditorTd
background: #deeac0
input[name="name"], .productTagsEditor, .productAliasesEditor, .productMeasuresEditor
width: 100%
.editorDiv
margin: 4px 0
label
font-family: "Arial Black", "Arial Bold", Gadget, sans-serif
font-size: .9em
padding-bottom: 4px
select2
font-size: .4em
> thead
> tr
> th.name
width: auto
> th.tags
width: 220px
> th.aliases
width: 220px
> th.measures
width: 220px
> th.actions
width: 90px
text-align: center
.newProductButton
margin-top: 4px
padding: 0px 12px
.fa-plus-circle
display: inline-block
.fa-times-circle
display: none
.newProductButton.active
background-color: #fb557b
color: black
.fa-times-circle
display: inline-block
.fa-plus-circle
display: none
> tbody
> tr
.actionRemove
color: #F77
.actionEdit
color: #44F
.editorApply
color: green
.editorCancel
color: red
> tr.deactivated
background-color: #fac0d1
.actionActivate
color: #158b18
.actionHide
color: #6a0707
.actionEdit
color: #0101e4
> tr.deactivated:hover
background-color: #ffcadb
> tr.hidden
background-color: #e995ff
.actionEdit
color: #0101e4
.actionShow
color: #027905
> tr.hidden:hover
background-color: #ffb5ff
.tableContainer
position: absolute
top: 0
bottom: 0
left: 0
right: 0
width: auto
height: auto
border: 0
font-size: 12.5px
overflow-y: auto
table
table-layout: fixed
width: 100%
.productSearch
margin: 3px 0 2px 1px
.productEditorTd
background: #deeac0
input[name="name"], .productTagsEditor, .productAliasesEditor, .productMeasuresEditor
width: 100%
.editorDiv
margin: 4px 0
label
font-family: "Arial Black", "Arial Bold", Gadget, sans-serif
font-size: .9em
padding-bottom: 4px
select2
font-size: .4em
> thead
> tr
> th.name
width: auto
> th.tags
width: 220px
> th.aliases
width: 220px
> th.measures
width: 220px
> th.actions
width: 90px
text-align: center
.newProductButton
margin-top: 4px
padding: 0px 12px
.fa-plus-circle
display: inline-block
.fa-times-circle
display: none
.newProductButton:active
background-color: #fb557b
color: black
.fa-times-circle
display: inline-block
.fa-plus-circle
display: none
> tbody
> tr
.actionRemove
color: #F77
.actionEdit
color: #44F
.editorApply
color: green
.editorCancel
color: red
> tr.deactivated
background-color: #fac0d1
.actionActivate
color: #158b18
.actionHide
color: #6a0707
.actionEdit
color: #0101e4
> tr.deactivated:hover
background-color: #ffcadb
> tr.hidden
background-color: #e995ff
.actionEdit
color: #0101e4
.actionShow
color: #027905
> tr.hidden:hover
background-color: #ffb5ff

View File

@@ -0,0 +1,61 @@
<template name="SaleDuplicates">
<div id="saleDuplicates">
<div class="controls">
<div class="pageControls">
<input class="duplicateScan btn btn-info" type="button" value="Scan For Duplicates"/>
</div>
<div class="tableControls">
<span class="controlLabel">Show Hidden</span>
<div class="toggleShowHidden checkbox checkbox-slider--b-flat">
<label>
<input type="checkbox" name="showHidden" {{showHidden}}><span></span>
</label>
</div>
</div>
</div>
<div class="listRow">
<div class="listCell">
<div class="tableContainer">
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="amount noselect nonclickable">Duplicates</th>
<th class="amount noselect nonclickable">Amount</th>
<th class="product noselect nonclickable">Product <br/>{{>SaleDuplicateSearch columnName='productName' width='90%'}}</th>
<th class="price noselect nonclickable">Price</th>
<th class="measure noselect nonclickable">Measure</th>
<th class="saleDate noselect nonclickable">Date (Week)</th>
<th class="createdDate noselect nonclickable">Created On</th>
<th class="venue noselect nonclickable">Venue</th>
<th class="actions noselect nonclickable">Actions</th>
</tr>
</thead>
<tbody>
{{#each sales}}
{{> SaleDuplicate}}
{{/each}}
</tbody>
</table>
</div>
</div>
</div>
</div>
</template>
<template name="SaleDuplicate">
<tr class="{{duplicateClasses}}">
<td class="tdLarge noselect nonclickable center">{{duplicateCount}}</td>
<td class="tdLarge noselect nonclickable center">{{amount}}</td>
<td class="tdLarge noselect nonclickable left">{{productName}}</td>
<td class="tdLarge noselect nonclickable left">{{formatPrice price}}{{#if showTotalPrice amount}} ({{formatTotalPrice price amount}}){{/if}}</td>
<td class="tdLarge noselect nonclickable left">{{measureName}}</td> <!-- measureName measureId -->
<td class="tdLarge noselect nonclickable left">{{formatDateAndWeek date}}</td>
<td class="tdLarge noselect nonclickable left">{{formatDateTime createdAt}}</td>
<td class="tdLarge noselect nonclickable left">{{venueName}}</td>
<td class="tdLarge noselect left actions"><i class="fa fa-check fa-lg clickable ignoreDuplicatesButton {{#if ignoreDuplicates}}hidden{{/if}}" title="Ignore All Duplicates" aria-hidden="true"></i> <i class="fa fa-minus-circle fa-lg clickable removeAllDuplicatesButton" title="Remove All Duplicates" aria-hidden="true"></i> <span class="clickable removeOneDuplicateButton" title="Remove One Duplicate"><i class="fa fa-minus-circle fa-lg" aria-hidden="true"></i><sup>1</sup></span></td>
</tr>
</template>
<template name="SaleDuplicateSearch">
<input type="text" class="searchInput" placeholder="Filter..." value="{{searchValue}}" style="padding-right: 10px; width: {{width}}"/>
</template>

149
imports/ui/SaleDuplicates.import.styl vendored Normal file
View File

@@ -0,0 +1,149 @@
#saleDuplicates
display: table
content-box: border-box
padding: 10px 20px
height: 100%
width: 100%
text-align: left
.controls
text-align: left
display: table
width: 100%
.pageControls
padding: 4px 8px
margin: 4px 8px
display: table-cell
width: 240px
.tableControls
text-align: right
padding: 4px 8px
margin: 4px 12px 4px 8px
display: table-cell
.toggleShowHidden
margin: 0 40px 0 0
position: relative
top: -4px
display: inline-block
.listRow
display: table-row
.listCell
display: table-cell
position: relative
height: 100%
width: 100%
.tableContainer
position: absolute
top: 0
bottom: 0
left: 0
right: 0
width: auto
height: auto
//width: 100%
//margin-bottom: 20px
border: 0
font-size: 12.5px
overflow-y: auto
//height: 100%
label
font-size: 10px
font-weight: 800
table
table-layout: fixed
min-width: 100%
.saleRemove
color: red
margin-left: 8px
.saleEdit
color: darkblue
margin-right: 8px
.editorApply
color: green
.editorCancel
color: red
thead
> tr
> th.amount
width: 90px
> th.product
width: auto
min-width: 140px
> th.price
width: 140px
> th.measure
width: 100px
> th.saleDate
width: 140px
> th.createdDate
width: 100px
> th.venue
width: 160px
> th.actions
width: 90px
tbody
> tr
> td.actions
.ignoreDuplicatesButton
padding: 0 2px
color: green
.ignoreDuplicatesButton:hover
color: #00bb00
.ignoreDuplicatesButton:active
color: black
.ignoreDuplicatesButton.hidden
visibility: hidden
.removeAllDuplicatesButton, .removeOneDuplicateButton
padding: 0 2px
color: #a00000
.removeAllDuplicatesButton:hover, .removeOneDuplicateButton:hover
color: red
.removeAllDuplicatesButton:active, .removeOneDuplicateButton:active
color: black
> tr.hidden:nth-child(odd)
background-color: #f4f0ab
> tr.hidden:nth-child(even)
background-color: #fff6c0
> tr.hidden:hover
background-color: #ded
.editComment
color: grey
.hasComment
color: black
.actionEdit
margin-right: 6px
color: #44F
.saleEditor
.heading
font-size: 2em
font-family: verdana, arial, helvetica, sans-serif
text-transform: uppercase
font-weight: 800
margin: 6px 0 14px 0
.priceContainer
display: table
width: 100%
.price
display: table-cell
padding-right: 10px
.priceButtons
display: table-cell
width: 1.5em
.setDefaultPrice
font-size: 1.5em
padding: 6px 8px
margin-left: 8px
border-radius: 8px
.setDefaultPrice:hover
text-shadow: 0px 0px 6px #00b900
.setDefaultPrice:active
text-shadow: 0px 0px 6px grey
.insertSaleForm
.form-group, label
text-align: left
.formGroupHeading
font-size: 1.6em
font-family: "Arial Black", "Arial Bold", Gadget, sans-serif
font-style: normal
font-variant: normal
font-weight: 500

View File

@@ -0,0 +1,212 @@
import './SaleDuplicates.html';
import '/imports/util/selectize/selectize.js';
import swal from 'sweetalert2';
/**
* Notes:
* The Sale object has a date field which stores the date as a number in the format YYYYMMDD. Converting this number into a local date is done with moment(sale.date.toString(), "YYYYMMDD").toDate(), and converting it to a number from a date can be accomplished with ~~(moment(date).format("YYYYMMDD")), where the ~~ is a bitwise not and converts a string to a number quickly and reliably.
*/
let PREFIX = "SaleDuplicates.";
let DuplicateSales = new Meteor.Collection("duplicateSales");
let duplicateSalesSubscription;
Template.SaleDuplicates.onCreated(function() {
let template = Template.instance();
//Tracker.autorun(function() {
// let query = _.clone(Session.get(PREFIX + 'searchQuery'));
//
// duplicateSalesSubscription = template.subscribe("duplicateSales", query, Session.get(PREFIX + "showHidden"));
//});
Tracker.autorun(function() {
duplicateSalesSubscription = template.subscribe("duplicateSales", null, Session.get(PREFIX + "showHidden"));
});
});
Template.SaleDuplicates.onDestroyed(function() {
if(duplicateSalesSubscription) {
duplicateSalesSubscription.stop();
}
});
Template.SaleDuplicates.helpers({
sales: function() {
let dbQuery = [];
let query = _.clone(Session.get(PREFIX + 'searchQuery'));
if(query) {
// Add each query requirement sent by the client.
_.each(_.keys(query), function(key) {
//if(_.isObject(query[key])) dbQuery.push({[key]: query[key]});
if(_.isObject(query[key])) {
if(query[key].type === 'dateRange') {
if(query[key].start && query[key].end)
dbQuery.push({[key]: {$gte: query[key].start, $lte: query[key].end}});
else if(query[key].start)
dbQuery.push({[key]: {$gte: query[key].start}});
else if(query[key].end)
dbQuery.push({[key]: {$lte: query[key].end}});
// Do nothing if a start and/or end are not provided.
}
else {
dbQuery.push({[key]: query[key]});
}
}
else if(_.isNumber(query[key])) dbQuery.push({[key]: query[key]});
else {
let searchValue = query[key];
let searches = searchValue && searchValue.length > 0 ? searchValue.split(/\s+/) : undefined;
for(let search of searches) {
dbQuery.push({[key]: {$regex: '\\b' + search, $options: 'i'}});
}
}
});
}
if(dbQuery.length > 1) dbQuery = {$and: dbQuery};
else if(dbQuery.length == 1) dbQuery = dbQuery[0];
else dbQuery = {};
return DuplicateSales.find(dbQuery, {sort: {date: -1, productName: 1}});
},
showHidden: function() {
return Session.get(PREFIX + "showHidden") ? "checked": "";
}
});
Template.SaleDuplicates.events({
'click .duplicateScan': function(event, template) {
Meteor.call("markDuplicateSales", function(err, result) {
Meteor.log.error(err);
});
},
'change input[name="showHidden"]': function(event, template) {
//console.log("changed " + $(event.target).prop('checked'));
Session.set(PREFIX + "showHidden", $(event.target).prop('checked'));
}
});
Template.SaleDuplicate.helpers({
//measureName: function(id) {
// return Meteor.collections.Measures.findOne({_id: id}, {fields: {name: 1}}).name;
//},
//venueName: function(id) {
// return Meteor.collections.Venues.findOne({_id: id}, {fields: {name: 1}}).name;
//},
//productName: function(id) {
// return Meteor.collections.Products.findOne({_id: id}, {fields: {name: 1}}).name;
//},
formatDateAndWeek: function(date) {
return moment.utc(date.toString(), "YYYYMMDD").utc().format("MM/DD/YYYY (w)");
},
formatDateTime: function(date) {
return moment.utc(date).format("MM/DD/YYYY");
},
formatPrice: function(price) {
return price.toLocaleString("en-US", {style: 'currency', currency: 'USD', minimumFractionDigits: 2});
},
formatTotalPrice: function(price, amount) {
return (price * amount).toLocaleString("en-US", {style: 'currency', currency: 'USD', minimumFractionDigits: 2});
},
showTotalPrice: function(amount) {
return amount > 1;
},
duplicateClasses: function() {
return this.ignoreDuplicates ? "hidden" : "";
}
});
Template.SaleDuplicate.events({
"click .ignoreDuplicatesButton": function(event, template) {
Meteor.call('ignoreDuplicateSales', this._id, function(err, result) {
if(err) sAlert.error(err);
//else sAlert.success("Duplicates Ignored");
});
},
"click .removeAllDuplicatesButton": function(event, template) {
let _this = this;
swal({
title: "Are you sure?",
text: "This will permanently remove ALL duplicate sales.",
type: "question",
showCancelButton: true,
confirmButtonColor: "#DD6B55",
confirmButtonText: "Yes"
}).then(
function(isConfirm) {
if(isConfirm) {
Meteor.call('removeDuplicateSales', _this._id, function(err, result) {
if(err) sAlert.error(err);
//else sAlert.success("Duplicates Removed");
});
}
},
function(dismiss) {
}
);
},
"click .removeOneDuplicateButton": function(event, template) {
let _this = this;
swal({
title: "Are you sure?",
text: "This will permanently remove ONE duplicate sale.",
type: "question",
showCancelButton: true,
confirmButtonColor: "#DD6B55",
confirmButtonText: "Yes"
}).then(
function(isConfirm) {
if(isConfirm) {
Meteor.call('removeDuplicateSales', _this._id, true, function(err, result) {
if(err) sAlert.error(err);
//else sAlert.success("Duplicates Removed");
});
}
},
function(dismiss) {
}
);
}
});
Template.SaleDuplicateSearch.helpers({
searchValue: function() {
let searchFields = Session.get(PREFIX + 'searchFields');
return (searchFields && searchFields[this.columnName]) ? searchFields[this.columnName] : '';
}
});
Template.SaleDuplicateSearch.events({
"keyup .searchInput": _.throttle(function(event, template) {
let searchQuery = Session.get(PREFIX + 'searchQuery') || {};
let searchFields = Session.get(PREFIX + 'searchFields') || {};
let searchValue = template.$(event.target).val();
if(searchValue) {
if(this.number) searchValue = parseFloat(searchValue);
// A collection name will be provided if there is a related table of data that will contain the text provided and will map to an ID that is then searched for in the current table of data.
// For example we are displaying a table of Sales which has the ID of a Product. The Product table has a Name field and the search box searches for Product Names. The ID's of the Products found should be used to filter the Sales by Product ID.
if(this.collection) {
let ids = Meteor.collections[this.collection].find({[this.collectionQueryColumnName]: {$regex: searchValue, $options: 'i'}}, {fields: {[this.collectionResultColumnName]: 1}}).fetch();
//Convert the ids to an array of ids instead of an array of objects containing an id.
for(let i = 0; i < ids.length; i++) {ids[i] = ids[i]._id;}
searchQuery[this.columnName] = {$in: ids};
searchFields[this.columnName] = searchValue;
}
else {
searchFields[this.columnName] = searchQuery[this.columnName] = searchValue;
}
}
else {
//Remove columns from the search query whose values are empty so we don't bother the database with them.
delete searchQuery[this.columnName];
delete searchFields[this.columnName];
}
Session.set(PREFIX + 'searchQuery', searchQuery);
Session.set(PREFIX + 'searchFields', searchFields);
Session.set(PREFIX + 'skipCount', 0); //Reset the paging of the results.
}, 500)
});

View File

@@ -1,18 +1,23 @@
<template name="Sales">
<div id="salesMain">
{{#if Template.subscriptionsReady}}
<div class="tableControls">
<select name="sortSelect">
<option value="date" selected>Sale Date</option>
<option value="createdAt">Data Entry Date</option>
</select>
<div class="pagination">
<span class="prevButton noselect {{#if disablePrev}}disabled{{/if}}"><i class="fa fa-long-arrow-left" aria-hidden="true"></i> Prev</span>
<span class="nextButton noselect {{#if disableNext}}disabled{{/if}}">Next <i class="fa fa-long-arrow-right" aria-hidden="true"></i></span>
<div class="controls">
<div class="pageControls">
<input type="button" class="showDuplicates btn btn-info" style="margin-right: 30px" value="Duplicate Analysis"/>
</div>
<div class="tableControls">
<select name="sortSelect" class="form-control" style="width: auto; display: inline;">
<option value="date" selected>Sale Date</option>
<option value="createdAt">Data Entry Date</option>
</select>
<div class="pagination">
<span class="prevButton noselect {{#if disablePrev}}disabled{{/if}}"><i class="fa fa-long-arrow-left" aria-hidden="true"></i> Prev</span>
<span class="nextButton noselect {{#if disableNext}}disabled{{/if}}">Next <i class="fa fa-long-arrow-right" aria-hidden="true"></i></span>
</div>
</div>
</div>
<div class="salesListRow">
<div class="salesListCell">
<div class="listRow">
<div class="listCell">
<div class="tableContainer">
<table class="table table-striped table-hover">
<thead>
@@ -21,7 +26,7 @@
<th class="product noselect nonclickable">Product <br/>{{>SaleSearch columnName='productId' collectionQueryColumnName='name' collection='Products' collectionResultColumnName='_id' width='90%'}}</th>
<th class="price noselect nonclickable">Price {{>SaleSearch columnName='price' width='90%'}}</th>
<th class="measure noselect nonclickable">Measure {{>SaleSearch columnName='measureId' collectionQueryColumnName='name' collection='Measures' collectionResultColumnName='_id' width='90%'}}</th>
<th class="saleDate noselect nonclickable">Date (Week)</th>
<th class="saleDate noselect nonclickable">Date (Week) {{>DateRangeSearch columnName='date' width='90%'}}</th>
<th class="createdDate noselect nonclickable">Created On</th>
<th class="venue noselect nonclickable">Venue {{>SaleSearch columnName='venueId' collectionQueryColumnName='name' collection='Venues' collectionResultColumnName='_id' width='90%'}}</th>
<th class="actions noselect nonclickable">Actions <span class="newSaleButton btn btn-success" title="Create Sale"><i class="fa fa-plus-circle" aria-hidden="true"></i><i class="fa fa-times-circle" aria-hidden="true"></i></span> <i class="fa fa-commenting fa-lg showOnlyComments clickable" title="Show Commented Sales" aria-hidden="true"></i></th>
@@ -55,7 +60,7 @@
<td class="tdLarge noselect nonclickable left">{{formatPrice price}}{{#if showTotalPrice amount}} ({{formatTotalPrice price amount}}){{/if}}</td>
<td class="tdLarge noselect nonclickable left">{{measureName measureId}}</td>
<td class="tdLarge noselect nonclickable left">{{formatDateAndWeek date}}</td>
<td class="tdLarge noselect nonclickable left">{{formatDate createdAt}}</td>
<td class="tdLarge noselect nonclickable left">{{formatDateTime createdAt}}</td>
<td class="tdLarge noselect nonclickable left">{{venueName venueId}}</td>
<td class="tdLarge noselect left"><i class="fa fa-pencil-square-o fa-lg actionEdit noselect clickable" title="Edit" aria-hidden="true"></i> <i class="fa fa-commenting fa-lg editComment noselect clickable {{commentClass}}" aria-hidden="true"></i> <i class="fa fa-times-circle fa-lg saleRemove noselect clickable" aria-hidden="true"></i></td>
</tr>
@@ -72,7 +77,7 @@
<div class="editorDiv"><label>Venue</label><input name="venue" class="form-control" type="text" required/></div>
</div>
<div class="col-6-12">
<div class="editorDiv"><label>Amount</label><input type="number" class="form-control amount" name="amount" min="0" step="0.01" data-schema-key='amount' value="{{amount}}" required></div>
<div class="editorDiv"><label>Amount</label><input type="number" class="form-control amount" name="amount" min="0" step="1" data-schema-key='amount' value="{{amount}}" required></div>
<div class="editorDiv"><label>Price</label><div class="priceContainer"><input type="number" class="form-control price" name="price" min="0" step="0.01" data-schema-key='currency' value="{{price}}" required><div class="priceButtons"><i class="fa fa-cogs setDefaultPrice noselect clickable" title="Calculate Default Price" aria-hidden="true"></i></div></div></div>
<div class="editorDiv"><label>Total</label><input type="number" class="form-control total" name="total" data-schema-key='currency' value="{{total}}" tabindex="-1" readonly></div>
</div>
@@ -87,6 +92,10 @@
<input type="text" class="searchInput" placeholder="Filter..." value="{{searchValue}}" style="padding-right: 10px; width: {{width}}"/>
</template>
<template name="DateRangeSearch">
<div style="padding-right: 10px; width: {{width}};"><input type="date" class="searchDateStartInput" value="{{startDate}}" data-schema-key='date' required> - <input type="date" class="searchDateEndInput" value="{{endDate}}" data-schema-key='date' required></div>
</template>
<template name="InsertSale">
<tr>
<td colspan="8">

View File

@@ -5,12 +5,23 @@
height: 100%
width: 100%
text-align: left
.tableControls
text-align: right
margin-right: 20px
.salesListRow
.controls
text-align: left
display: table
width: 100%
.pageControls
padding: 4px 8px
margin: 4px 8px
display: table-cell
width: 240px
.tableControls
text-align: right
padding: 4px 8px
margin: 4px 12px 4px 8px
display: table-cell
.listRow
display: table-row
.salesListCell
.listCell
display: table-cell
position: relative
height: 100%
@@ -70,7 +81,7 @@
display: inline-block
.fa-times-circle
display: none
.newSaleButton.active
.newSaleButton:active
background-color: #fb557b
color: black
.fa-times-circle

View File

@@ -3,30 +3,41 @@ import './Sales.html';
import '/imports/util/selectize/selectize.js';
import swal from 'sweetalert2';
/**
* Notes:
* The Sale object has a date field which stores the date as a number in the format YYYYMMDD. Converting this number into a local date is done with moment(sale.date.toString(), "YYYYMMDD").toDate(), and converting it to a number from a date can be accomplished with ~~(moment(date).format("YYYYMMDD")), where the ~~ is a bitwise not and converts a string to a number quickly and reliably.
*/
let QUERY_LIMIT = 20;
let PREFIX = "Sales.";
Meteor.subscribe("products");
Session.set(PREFIX + "sortOption", "date");
Session.set(PREFIX + "showOnlyComments", false);
Tracker.autorun(function() {
let sortOption = Session.get(PREFIX + "sortOption");
let sort = sortOption == 'createdAt' ? {createdAt: -1} : {date: -1, createdAt: -1};
let showOnlyComments = Session.get(PREFIX + "showOnlyComments");
let query = _.clone(Session.get(PREFIX + 'searchQuery'));
if(showOnlyComments) {
if(!query) query = {};
query.comment = {$exists: true};
}
Meteor.subscribe("sales", query, sort, QUERY_LIMIT, Session.get(PREFIX + 'skipCount'));
Session.set(PREFIX + 'saleCount', Meteor.call('getSalesCount', Session.get(PREFIX + 'searchQuery')));
});
Template.Sales.onCreated(function() {
Session.set(PREFIX + "displayNewSale", false);
Meteor.subscribe("products");
Session.set(PREFIX + "sortOption", "date");
Session.set(PREFIX + "showOnlyComments", false);
Tracker.autorun(function() {
let sortOption = Session.get(PREFIX + "sortOption");
let sort = sortOption == 'createdAt' ? {createdAt: -1} : {date: -1, createdAt: -1};
let showOnlyComments = Session.get(PREFIX + "showOnlyComments");
let query = _.clone(Session.get(PREFIX + 'searchQuery'));
if(showOnlyComments) {
if(!query) query = {};
query.comment = {$exists: true};
}
//if(Template.Sales.salesSubscription) Template.Sales.salesSubscription.stop();
Template.Sales.salesSubscription = Meteor.subscribe("sales", query, sort, QUERY_LIMIT, Session.get(PREFIX + 'skipCount'));
Session.set(PREFIX + 'saleCount', Meteor.call('getSalesCount', Session.get(PREFIX + 'searchQuery')));
});
});
Template.Sales.onDestroyed(function() {
if(Template.Sales.salesSubscription) {
Template.Sales.salesSubscription.stop();
}
});
Template.Sales.helpers({
displayNewSale: function() {
@@ -77,6 +88,9 @@ Template.Sales.events({
Session.set(PREFIX + "showOnlyComments", !$button.hasClass('on'));
$button.toggleClass('on');
},
'click .showDuplicates': function(event, template) {
FlowRouter.go('SaleDuplicates');
}
});
@@ -93,10 +107,10 @@ Template.Sale.helpers({
return Meteor.collections.Products.findOne({_id: id}, {fields: {name: 1}}).name;
},
formatDateAndWeek: function(date) {
return moment(date).format("MM/DD/YYYY (w)");
return moment.utc(date.toString(), "YYYYMMDD").utc().format("MM/DD/YYYY (w)");
},
formatDate: function(date) {
return moment(date).format("MM/DD/YYYY");
formatDateTime: function(date) {
return moment.utc(date).format("MM/DD/YYYY");
},
formatPrice: function(price) {
return price.toLocaleString("en-US", {style: 'currency', currency: 'USD', minimumFractionDigits: 2});
@@ -162,10 +176,8 @@ Template.Sale.events({
});
Template.SaleEditor.onCreated(function() {
let _this = this;
this.product = Meteor.collections.Products.findOne({_id: this.data.productId});
this.selectedDate = new ReactiveVar(this.data.date);
this.selectedDate = new ReactiveVar(moment(this.data.date.toString(), "YYYYMMDD").toDate());
this.selectedVenue = new ReactiveVar(Meteor.collections.Venues.findOne({_id: this.data.venueId}));
this.price = new ReactiveVar(this.data.price);
this.amount = new ReactiveVar(this.data.amount);
@@ -207,7 +219,7 @@ Template.SaleEditor.events({
//If this product has pricing data for the given measure, then either use the price, or the previousPrice (if there is one and the effectiveDate is after the sale date).
if(priceData) {
if(priceData.effectiveDate && date && moment(priceData.effectiveDate).isAfter(date))
if(priceData.effectiveDate && date && moment.utc(priceData.effectiveDate.toString(), "YYYYMMDD").isAfter(date))
price = priceData.previousPrice;
else
price = priceData.price
@@ -231,7 +243,7 @@ Template.SaleEditor.events({
template.$('form[name="editSaleForm"]').data('bs.validator').validate(function(isValid) {
if(isValid) {
let id = template.data._id;
let date = template.selectedDate.get();
let date = ~~(moment(template.selectedDate.get()).format("YYYYMMDD")); // Note: The ~~ is a bitwise not that is a fast method of converting a string to a number.
let venue = template.selectedVenue.get();
let price = template.price.get();
let amount = template.amount.get();
@@ -245,36 +257,6 @@ Template.SaleEditor.events({
});
}
});
//let name = template.$("input[name='name']").val().trim();
//let tags = template.$(".productTagsEditor").select2('data');
//let aliases = template.$(".productAliasesEditor").select2('data');
//let measures = template.$(".productMeasuresEditor").select2('data');
//
//tags = tags.map((n)=>n.id);
//aliases = aliases.map((n)=>n.id);
//measures = measures.map((n)=>n.id);
//
//if(Session.get(PREFIX + 'displayNewProduct')) {
// Meteor.call("createProduct", name, tags, aliases, measures, function(error, result) {
// if(error) sAlert.error(error);
// else {
// sAlert.success("Product created.");
// Session.set(PREFIX + 'displayNewProduct', false);
// template.parentTemplate().$('.newProductButton').removeClass('active');
// }
// });
//}
//else {
// Meteor.call("updateProduct", this._id, name, tags, aliases, measures, function(error, result) {
// if(error) sAlert.error(error);
// else {
// sAlert.success("Product updated.");
// Session.set(PREFIX + "editedProduct", undefined);
// template.parentTemplate().$('.newProductButton').removeClass('active');
// }
// });
//}
}
});
@@ -289,11 +271,13 @@ Template.SaleSearch.events({
"keyup .searchInput": _.throttle(function(event, template) {
let searchQuery = Session.get(PREFIX + 'searchQuery') || {};
let searchFields = Session.get(PREFIX + 'searchFields') || {};
let searchValue = template.$('.searchInput').val();
let searchValue = template.$(event.target).val();
if(searchValue) {
if(this.number) searchValue = parseFloat(searchValue);
// A collection name will be provided if there is a related table of data that will contain the text provided and will map to an ID that is then searched for in the current table of data.
// For example we are displaying a table of Sales which has the ID of a Product. The Product table has a Name field and the search box searches for Product Names. The ID's of the Products found should be used to filter the Sales by Product ID.
if(this.collection) {
let ids = Meteor.collections[this.collection].find({[this.collectionQueryColumnName]: {$regex: searchValue, $options: 'i'}}, {fields: {[this.collectionResultColumnName]: 1}}).fetch();
@@ -313,11 +297,70 @@ Template.SaleSearch.events({
}
Session.set(PREFIX + 'searchQuery', searchQuery);
Session.set(PREFIX + 'searchFields', searchFields)
Session.set(PREFIX + 'searchFields', searchFields);
Session.set(PREFIX + 'skipCount', 0); //Reset the paging of the results.
}, 500)
});
Template.DateRangeSearch.helpers({
startDate: function() {
let searchFields = Session.get(PREFIX + 'searchFields');
let searchValue = (searchFields && searchFields[this.columnName]) ? searchFields[this.columnName] : {};
return searchValue.start ? moment(searchValue.start.toString(), "YYYYMMDD").format("MM/DD/YYYY") : "";
},
endDate: function() {
let searchFields = Session.get(PREFIX + 'searchFields');
let searchValue = (searchFields && searchFields[this.columnName]) ? searchFields[this.columnName] : {};
return searchValue.end ? moment(searchValue.end.toString(), "YYYYMMDD").format("MM/DD/YYYY") : "";
}
});
Template.DateRangeSearch.events({
"change .searchDateStartInput": function(event, template) {Template.DateRangeSearch.dateChanged(true, event, template)},
"keyup .searchDateStartInput": _.throttle(function(event, template) {Template.DateRangeSearch.dateChanged(true, event, template)}, 500),
"change .searchDateEndInput": function(event, template) {Template.DateRangeSearch.dateChanged(false, event, template)},
"keyup .searchDateEndInput": _.throttle(function(event, template) {Template.DateRangeSearch.dateChanged(false, event, template)}, 500)
});
Template.DateRangeSearch.dateChanged = function(isStart, event, template) {
let searchQuery = Session.get(PREFIX + 'searchQuery') || {};
let searchFields = Session.get(PREFIX + 'searchFields') || {};
let searchValue = template.$(event.target).val();
let columnName = template.data.columnName;
if(searchValue) {
let search = searchQuery[columnName];
// Create a search object and attach it to the searchFields and searchQuery objects if needed.
if(!search) {
search = {type: 'dateRange'};
searchFields[columnName] = searchQuery[columnName] = search;
}
// Use moment to parse date and convert it to YYYYMMDD for searching the database.
searchValue = ~~(moment(searchValue, searchValue.includes("-") ? "YYYY-MM-DD" : "MM/DD/YYYY").format("YYYYMMDD")); // Note: ~~ performs a bitwise not which is a fast method of converting a string to a number.
// Save the search ending date.
isStart ? search.start = searchValue : search.end = searchValue;
}
else {
if(searchQuery[columnName]) {
// Remove columns from the search query whose values are empty so we don't bother the database with them.
if(isStart) {
delete searchQuery[columnName].start;
delete searchFields[columnName].start;
}
else {
delete searchQuery[columnName].end;
delete searchFields[columnName].end;
}
}
}
Session.set(PREFIX + 'searchQuery', searchQuery);
Session.set(PREFIX + 'searchFields', searchFields);
Session.set(PREFIX + 'skipCount', 0); //Reset the paging of the results.
};
Template.InsertSale.onCreated(function() {
this.selectedDate = new ReactiveVar();
this.selectedProduct = new ReactiveVar();
@@ -351,7 +394,7 @@ Template.InsertSale.events({
let insertSaleMeasures = template.$(".insertSaleMeasure");
let sale = {
date: moment(template.find("[name='date']").value, "YYYY-MM-DD").toDate(),
date: ~~(moment(template.find("[name='date']").value, "YYYY-MM-DD").format("YYYYMMDD")), // Note: ~~ performs a bitwise not which is a fast method of converting a string to a number.
productId: template.selectedProduct.get()._id,
venueId: template.selectedVenue.get()._id
};
@@ -381,6 +424,7 @@ Template.InsertSale.events({
if(error) sAlert.error("Failed to insert the sale!\n" + error);
else {
sAlert.success("Sale Created");
nextMeasure.find(".amount").val(0);
//Clear the measure quantity fields so the user can enter another sale without the quantities already set.
for(let next = 0; next < insertSaleMeasures.length; next++) {

View File

@@ -1,37 +1,44 @@
<template name="Venues">
<div id="venues">
<div class="tableControls">
<span class="controlLabel">Show Hidden</span>
<div class="toggleShowHidden checkbox checkbox-slider--b-flat">
<label>
<input type="checkbox" name="showHidden"><span></span>
</label>
{{#if Template.subscriptionsReady}}
<div class="tableControls">
<span class="controlLabel">Show Hidden</span>
<div class="toggleShowHidden checkbox checkbox-slider--b-flat">
<label>
<input type="checkbox" name="showHidden"><span></span>
</label>
</div>
<span class="pagination">
<span class="prevVenues noselect {{#if disablePrev}}disabled{{/if}}"><i class="fa fa-long-arrow-left" aria-hidden="true"></i> Prev</span>
<span class="nextVenues noselect {{#if disableNext}}disabled{{/if}}">Next <i class="fa fa-long-arrow-right" aria-hidden="true"></i></span>
</span>
</div>
<span class="pagination">
<span class="prevVenues noselect {{#if disablePrev}}disabled{{/if}}"><i class="fa fa-long-arrow-left" aria-hidden="true"></i> Prev</span>
<span class="nextVenues noselect {{#if disableNext}}disabled{{/if}}">Next <i class="fa fa-long-arrow-right" aria-hidden="true"></i></span>
</span>
</div>
<div class="tableContainer">
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="name">Name {{>VenueSearch columnName='name'}}</th>
<th class="type">Type {{>VenueSearch columnName='type'}}</th>
<th class="actions">Actions <span class="newVenueButton btn btn-success"><i class="fa fa-plus-circle" aria-hidden="true"></i><i class="fa fa-times-circle" aria-hidden="true"></i></span></th>
</tr>
<!--<button type="button" name="newVenueButton"><i class="fa fa-plus-circle" aria-hidden="true"></i></button>-->
</thead>
<tbody>
{{#if displayNewVenue}}
{{> VenueEditor isNew=true}}
{{/if}}
{{#each venues}}
{{> Venue}}
{{/each}}
</tbody>
</table>
</div>
<div class="listRow">
<div class="listCell">
<div class="tableContainer">
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="name">Name {{>VenueSearch columnName='name'}}</th>
<th class="type">Type {{>VenueSearch columnName='type'}}</th>
<th class="actions">Actions <span class="newVenueButton btn btn-success"><i class="fa fa-plus-circle" aria-hidden="true"></i><i class="fa fa-times-circle" aria-hidden="true"></i></span></th>
</tr>
<!--<button type="button" name="newVenueButton"><i class="fa fa-plus-circle" aria-hidden="true"></i></button>-->
</thead>
<tbody>
{{#if displayNewVenue}}
{{> VenueEditor isNew=true}}
{{/if}}
{{#each venues}}
{{> Venue}}
{{/each}}
</tbody>
</table>
</div>
</div>
</div>
{{else}}
{{/if}}
</div>
</template>

View File

@@ -1,6 +1,9 @@
#venues
margin: 20px 20px
display: table
content-box: border-box
padding: 10px 20px
height: 100%
width: 100%
text-align: left
.tableControls
@@ -18,77 +21,89 @@
top: -4px
display: inline-block
.tableContainer
width: 100%
margin-bottom: 20px
border: 0
font-size: 12.5px
table
table-layout: fixed
.listRow
display: table-row
.listCell
display: table-cell
position: relative
height: 100%
width: 100%
.venueSearch
margin: 3px 0 2px 1px
.venueEditorTd
background: #deeac0
input[name="name"], input[name="type"]
width: 100%
.editorDiv
margin: 4px 0
label
font-family: "Arial Black", "Arial Bold", Gadget, sans-serif
font-size: .9em
padding-bottom: 4px
select2
font-size: .4em
> thead
> tr
> th.name
width: auto
> th.type
width: auto
> th.actions
width: 90px
text-align: center
.newVenueButton
margin-top: 4px
padding: 0px 12px
.fa-plus-circle
display: inline-block
.fa-times-circle
display: none
.newVenueButton.active
background-color: #fb557b
color: black
.fa-times-circle
display: inline-block
.fa-plus-circle
display: none
> tbody
> tr
.actionRemove
color: #F77
.actionEdit
color: #44F
.editorApply
color: green
.editorCancel
color: red
> tr.deactivated
background-color: #fac0d1
.actionActivate
color: #158b18
.actionHide
color: #6a0707
.actionEdit
color: #0101e4
> tr.deactivated:hover
background-color: #ffcadb
> tr.hidden
background-color: #e995ff
.actionEdit
color: #0101e4
.actionShow
color: #027905
> tr.hidden:hover
background-color: #ffb5ff
.tableContainer
position: absolute
top: 0
bottom: 0
left: 0
right: 0
width: auto
height: auto
border: 0
font-size: 12.5px
overflow-y: auto
table
table-layout: fixed
width: 100%
.venueSearch
margin: 3px 0 2px 1px
.venueEditorTd
background: #deeac0
input[name="name"], input[name="type"]
width: 100%
.editorDiv
margin: 4px 0
label
font-family: "Arial Black", "Arial Bold", Gadget, sans-serif
font-size: .9em
padding-bottom: 4px
select2
font-size: .4em
> thead
> tr
> th.name
width: auto
> th.type
width: auto
> th.actions
width: 90px
text-align: center
.newVenueButton
margin-top: 4px
padding: 0px 12px
.fa-plus-circle
display: inline-block
.fa-times-circle
display: none
.newVenueButton.active
background-color: #fb557b
color: black
.fa-times-circle
display: inline-block
.fa-plus-circle
display: none
> tbody
> tr
.actionRemove
color: #F77
.actionEdit
color: #44F
.editorApply
color: green
.editorCancel
color: red
> tr.deactivated
background-color: #fac0d1
.actionActivate
color: #158b18
.actionHide
color: #6a0707
.actionEdit
color: #0101e4
> tr.deactivated:hover
background-color: #ffcadb
> tr.hidden
background-color: #e995ff
.actionEdit
color: #0101e4
.actionShow
color: #027905
> tr.hidden:hover
background-color: #ffb5ff

View File

@@ -17,6 +17,11 @@
User Management
</a>
</li>
<li class="{{isActiveRoute 'MiscManagement'}}">
<a href="{{pathFor 'MiscManagement'}}">
Misc Management
</a>
</li>
{{/if}}
<li class="{{isActiveRoute 'Sales'}}">
<a href="{{pathFor 'Sales'}}">

View File

@@ -6,6 +6,7 @@
"build": "npm install --product && meteor build --architecture os.linux.x86_64 --server-only ../"
},
"dependencies": {
"1.0": "^1.0.2",
"babel-runtime": "^6.18.0",
"csv-parse": "latest",
"d3": "^4.4.2",

57
server/cleanDates.js Normal file
View File

@@ -0,0 +1,57 @@
Meteor.methods({
// Cleans up all Date objects that don't have a time component. Removes any time component.
"cleanDates": function() {
// Update the sales dates.
let sales = Sales.find({}).fetch();
for(let i = 0; i < sales.length; i++) {
if(sales[i].date && _.isDate(sales[i].date)) {
let date = ~~(moment(sales[i].date).format("YYYYMMDD"));
console.log("Converted " + sales[i].date + " to " + date);
// Save to the database.
Sales.update(sales[i]._id, {$set: {date}}, function(err, id) {
if(err) console.log(err);
}, {bypassCollection2: true});
}
}
console.log("+++++++++++++++++++++++++++++++ FINISHED Sales +++++++++++++++++++++++++++++");
// Update the product price effective dates.
let products = Products.find({}).fetch();
for(let i = 0; i < products.length; i++) {
let product = products[i];
let hasChanges = false;
let prices = product.prices;
if(prices) {
for(let prop in prices) {
if(prices[prop] && prices[prop].effectiveDate) {
if(_.isDate(prices[prop].effectiveDate)) {
let oldDate = prices[prop].effectiveDate;
prices[prop].effectiveDate = ~~(moment(prices[prop].effectiveDate).format("YYYYMMDD"));
console.log("Converted " + oldDate + " to " + prices[prop].effectiveDate + " for the product " + product.name);
hasChanges = true;
}
}
}
}
// Save the changes.
if(hasChanges) {
Products.update(product._id, {$set: {prices}}, function(err, id) {
if(err) console.log(err);
}, {validate: false, bypassCollection2: true});
}
}
}
});

48
server/exportMissing.js Normal file
View File

@@ -0,0 +1,48 @@
let fs = require('fs');
Meteor.methods({
"exportMissingSales": function() {
try {
let products = Products.find({}).fetch();
let venues = Venues.find({}).fetch();
let measures = Measures.find({}).fetch();
let productNameMap = {};
let venueNameMap = {};
let measureNameMap = {};
let sales = Sales.find({createdAt: {$gte: moment.utc("2017-01-28", "YYYY-MM-DD").toDate(), $lt: moment.utc("2017-01-29", "YYYY-MM-DD").toDate()}}).fetch();
let output = "";
for(let i = 0; i < products.length; i++) {
productNameMap[products[i]._id] = products[i].name;
}
for(let i = 0; i < venues.length; i++) {
venueNameMap[venues[i]._id] = venues[i].name;
}
for(let i = 0; i < measures.length; i++) {
measureNameMap[measures[i]._id] = measures[i].name;
}
for(let i = 0; i < sales.length; i++) {
let sale = sales[i];
let saleOutput = '{\n\t"date": ' + sale.date + ',\n\t "amount": ' + sale.amount + ',\n\t "price": ' + sale.price + ',\n\t "venue": "' + venueNameMap[sale.venueId] + '",\n\t "product": "' + productNameMap[sale.productId] + '",\n\t "measure": "' + measureNameMap[sale.measureId] + '",\n\t "createdAt": "' + sale.createdAt + '"\n}';
if(output.length > 0) {
output += ",\n";
}
else {
output = "[";
}
output += saleOutput;
}
fs.writeFile("./exportedMissingSales.json", output, function(err) {
if(err) console.log(err);
});
output += "]";
console.log(output);
} catch(err) {
console.log(err);
}
}
});

View File

@@ -0,0 +1,24 @@
Meteor.methods({
"checkDuplicateSales": function() {
try {
let sales = Sales.find({}).fetch();
let duplicateCount = 0;
for(let i = 0; i < sales.length; i++) {
let next = missingData[i];
let count = Sales.find({date: next.date, measureId: next.measureId, productId: next.productId, venueId: next.venueId, price: next.price, amount: next.amount}).count();
if(count > 1) {
console.log("This sale has a duplicate:");
console.log(next);
}
}
console.log("Total Duplicate Count: " + duplicateCount);
console.log("Finished Checking Duplicates");
Meteor.log.info("xxx");
} catch(err) {
console.log(err);
}
}
});

5469
server/importMissing.js Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -17,3 +17,5 @@ if (!process.env.MAIL_URL) {
}
// console.log("Mail settings: " + process.env.MAIL_URL);
if(Meteor.log) Meteor.log.info("Server Started");