1
0
mirror of https://github.com/fspc/Yellow-Bike-Database.git synced 2025-04-04 09:33:24 -04:00

Compare commits

...

369 Commits
v1.0 ... devel

Author SHA1 Message Date
Jonathan Rosenbaum
fa728818c4 Closes #87 2019-04-17 07:38:28 +00:00
Jonathan Rosenbaum
70c8a37e48 Removes phpconsole test! :) 2019-03-14 06:36:30 +00:00
Jonathan Rosenbaum
4f26664388 Closes #86 using regexp solution.
Should work well as long as the network doesn't change. I considered doing a straight-out IP swap during the 24hr period for such an unusual scenario, however, that would not allow for any separation of location if a shop is opened somewhere else.
2019-03-14 06:31:00 +00:00
Jonathan Rosenbaum
3c3e4a0bf3 Adds if( !defined( '*' ) ) to avoid E_NOTICE and redefining.
* Improves error output when using phpconsole (transaction.log) to stop output of E_DEPRECATED.

* The main objective is to better view phpconsole's output. E_NOTICE and E_WARNING are important, regardless.
2019-03-14 05:12:16 +00:00
Jonathan Rosenbaum
824435a35f This fixes a minor bug that occurs if there is only 1 deposit for previous year.
If no min is found this makes it the same as max, only a problem for non transaction_log pages using transaction.js if there is only one deposit for the last year, not sure what will happen with 0 deposits for the last year.
2019-01-22 06:30:38 +00:00
Jonathan Rosenbaum
db93ad1103 Closes #85
Also, counts returned transactions for both stats_monthlysalestax.php and stats_shoptransactiontotals.php .. no more guessing required.
2019-01-22 06:25:40 +00:00
Jonathan Rosenbaum
288521ce2e Fixes #84 - show only paid 2018-12-29 04:51:07 +00:00
Jonathan Rosenbaum
85011402a5 This adds more detail (title) for volunteers in the member metric report.
* Could be modifed further.
* Currently shows color when all hours redeemed.
2018-12-22 06:08:54 +00:00
Jonathan Rosenbaum
306a09fc58 This improves the explanation in the notes about the history of the eab equity. 2018-12-22 04:27:35 +00:00
Jonathan Rosenbaum
2380d6a6d4 This closes #78 and closes #80.
What I thought was a desired equitable behavior for eab was actually a bug.  Now behavior is predictable. Only checks for 0.00 and 0, so 0.0 would create an issue, but unlikely to happen.
2018-12-21 07:26:42 +00:00
Jonathan Rosenbaum
ca4085109c This closes #83 adding probation status to shop_log for contact_id. 2018-12-20 22:04:55 +00:00
Jonathan Rosenbaum
23ce8ffaca Cleans up the code in relation to ec886a9 . 2018-10-28 02:11:24 +00:00
Jonathan Rosenbaum
ec886a967d When membership expires, date turns red. Noted in #1. 2018-10-27 21:17:46 +00:00
Jonathan Rosenbaum
97f02b6788 This should close #42. 2018-10-26 21:48:43 +00:00
Jonathan Rosenbaum
c050b5c0a4 Corrects the report math for stats_userhours.php as pointed out at #42. 2018-10-26 21:22:20 +00:00
Jonathan Rosenbaum
a06c8e091c Replaces the rest of the subtimes per 10d63ae and #42. 2018-10-26 21:04:36 +00:00
Jonathan Rosenbaum
10d63ae286 Corrects the report math for stats_userhours_season and stats_userhours_year as pointed out at #42. 2018-10-26 20:51:13 +00:00
Jonathan Rosenbaum
46f165d13b Corrects the report math for members.php as pointed out at #42. 2018-10-26 20:38:55 +00:00
Jonathan Rosenbaum
330735ff61 Bug fix for #77 enhancment:
* Only counts transactions that are paid
* Quick hack to show all transactions; defaults to 500 for record_count
2018-09-04 00:56:46 +00:00
Jonathan Rosenbaum
da1a063a0a Closes #77. Currently search capability specific to report(s);
Could be integrated into transaction_log page search.
2018-09-04 00:21:43 +00:00
Jonathan Rosenbaum
01293db335 Closes #76. Shows actual visits by contact_id, rather than visitations for each shop_visit_id. 2018-09-03 23:17:35 +00:00
Jonathan Rosenbaum
b8a42f11a0 Fixes #75
Yes, NaN in new year was the culprit.
2018-07-14 22:09:09 +00:00
Jonathan Rosenbaum
3be493fc62 Fixes a bug with #35.
* nulls work in mysql query which allows for unusual sitations to work
2018-05-18 07:40:44 +00:00
Jonathan Rosenbaum
11480e8fd3 In regards to #35, limits contacts to 200 for performance. 2018-05-18 06:44:59 +00:00
Jonathan Rosenbaum
bc2ea843e4 Closes #35. Will need to experiment with colors. 2018-05-18 06:25:42 +00:00
Jonathan Rosenbaum
4de11ee547 Closes #71, shows if member in individual history. 2018-05-16 21:27:06 +00:00
Jonathan Rosenbaum
b18cf97f7c Cleaning up the regexp for #69. 2018-05-14 23:13:08 +00:00
Jonathan Rosenbaum
d0828bc80b Closes #69 adding word search capability for transaction_log. 2018-05-14 22:28:46 +00:00
Jonathan Rosenbaum
59fdb375c5 Closes #54 - more info for csv
* Adds (O:?; P:?; R:?) .. Original Price, Paid and Redeemed Hours, keeping Paid even no redundant for history.
2018-05-14 04:33:32 +00:00
Jonathan Rosenbaum
f1d85b2060 Another #62 enhancement.
* Show displayed transaction number
2018-05-13 19:48:07 +00:00
Jonathan Rosenbaum
940b6c52b3 More enhancements in regards to #62.
* Now shows name with link to individual history for folk who never had an transactions, as well as who have

* Link from individual history back to transaction_log with max results count.
2018-05-13 18:51:00 +00:00
Jonathan Rosenbaum
78102f3600 Related to #62, better behavior on submit:
* Checks that transaction is not a Deposite, and that transation is paid.
2018-05-13 04:29:28 +00:00
Jonathan Rosenbaum
dbcfbd67e0 Another enhancement related to #62.
* Shows total for amounts
2018-05-13 04:05:15 +00:00
Jonathan Rosenbaum
28f8bf464e Prevents wrapping of the table row. Noticed this after enhancement #enhancement #62. 2018-05-13 03:11:26 +00:00
Jonathan Rosenbaum
305ebee833 Closes #62.
* Provides contact search in transaction_log
* future: may improve calendar search with PickMeUp?
2018-05-13 00:03:01 +00:00
Jonathan Rosenbaum
46be9fa887 Closes #67. 2018-05-12 21:27:33 +00:00
Jonathan Rosenbaum
17684f6e10 Fixes #61. Redundant named constant. 2018-05-11 05:18:22 +00:00
Jonathan Rosenbaum
8810c7f3f1 This fixes #65.
* Hadn't updated populate.sql to take advantage of the new change, and demo it out of the box. Nice default.

* show_soldto_not_signed_in = 1 & show_soldto_signed_in = 0
2018-05-09 07:32:19 +00:00
Jonathan Rosenbaum
b6e416a416 Improves instructions 2018-05-09 07:11:45 +00:00
Jonathan Rosenbaum
e149a86d01
update demo link 2018-05-05 21:45:04 -04:00
Jonathan Rosenbaum
0b56dea180 Closes #68 2018-04-27 07:33:33 +00:00
Jonathan Rosenbaum
df31281ef8 If volunteer has no hours for new year and is a member, this assings 0 to remaining.
* otherwise spinner spins infinitely, and membership discount is not applied.
2018-04-27 05:42:18 +00:00
Jonathan Rosenbaum
3e76e145c6 Adds autogrow library (pulling with git) version 1.16 2018-03-21 21:51:23 +00:00
Jonathan Rosenbaum
914d15f98c Closes #63 with https://github.com/ro31337/jquery.ns-autogrow 2018-03-21 21:44:15 +00:00
Jonathan Rosenbaum
6bda47b485 Points out possible file name for virtual host file. 2018-03-21 21:40:58 +00:00
Jonathan Rosenbaum
31c785ed13 New website! 2018-02-15 04:24:04 +00:00
Jonathan Rosenbaum
eff1e61dd4 Added some new knowledge. 2018-01-08 06:46:35 +00:00
Jonathan Rosenbaum
5b490e18e7 Adds more detail about fine tuning access, and improves apache setup instructions. 2018-01-06 07:36:49 +00:00
Jonathan Rosenbaum
5edc4f97c2 Adds several items:
* BIOS / UEFI
* GRUB2 PASSWORD PROTECT
* SSD or HD ENCRYPTION
2018-01-06 07:10:42 +00:00
Jonathan Rosenbaum
0bcd6e881f More clarity. 2018-01-05 08:37:46 +00:00
Jonathan Rosenbaum
44aa25412b Better security explanation. 2018-01-05 01:11:38 +00:00
Jonathan Rosenbaum
4d65085be5 revert 2018-01-04 10:03:42 +00:00
Jonathan Rosenbaum
2026bddaec More info about secret-tool. 2018-01-04 07:40:32 +00:00
Jonathan Rosenbaum
33cc14cdb0 format 2018-01-04 06:32:48 +00:00
Jonathan Rosenbaum
38d66155c8 Updates self-signed certificates for more recent browsers. 2018-01-04 06:30:55 +00:00
Jonathan Rosenbaum
b961002595 format 2018-01-04 01:41:05 +00:00
Jonathan Rosenbaum
9612e4aa6f format 2018-01-04 01:40:13 +00:00
Jonathan Rosenbaum
eba20c3da6 Another update 2018-01-04 01:38:57 +00:00
Jonathan Rosenbaum
c7adb7867f More changies 2018-01-04 01:21:41 +00:00
Jonathan Rosenbaum
195f7bee3f Another addition: fine-tuning 2018-01-04 00:33:16 +00:00
Jonathan Rosenbaum
39c8bbc946 More layout improvment. 2018-01-04 00:01:52 +00:00
Jonathan Rosenbaum
1d952049b7 Improving the layout a little
* probably should make this a *MD
2018-01-04 00:00:49 +00:00
Jonathan Rosenbaum
e67302b991 Documentation updates for secure terminals! 2018-01-03 23:48:27 +00:00
Jonathan Rosenbaum
f384c3b7ed Fixes #59. 2018-01-02 19:28:21 +00:00
Jonathan Rosenbaum
e388bd5358 This closes #58. 2018-01-02 07:36:17 +00:00
Jonathan Rosenbaum
b08a2387a0 Avoids unnecessary error, related to #56. 2018-01-02 06:54:26 +00:00
Jonathan Rosenbaum
8ffb51e20a Fixes #57, happy New Years! 2018-01-01 22:46:29 +00:00
Jonathan Rosenbaum
28f836597f Closes New Years bug closes #56 :) 2018-01-01 11:01:09 +00:00
Jonathan Rosenbaum
c69181048f Partial fix for #56. 2018-01-01 10:45:18 +00:00
Jonathan Rosenbaum
68e835d74b This fixes #43 and fixes #47. 2017-12-26 09:42:40 +00:00
Jonathan Rosenbaum
588cbe7580 Sends update interests to _parent, avoiding 2x etherpad. 2017-12-25 09:03:54 +00:00
Jonathan Rosenbaum
91e11655d8 Closes #50
* works for Up, Down, Update
* Close works when etherpad isn't open, otherwise scrolls to top
2017-12-24 09:03:23 +00:00
Jonathan Rosenbaum
97ae064a5f Improves css:
* removes unneccessary horizonal scrolling at the bottom
* sets up a grid for the header
2017-12-23 06:37:55 +00:00
Jonathan Rosenbaum
07ee1b27bd Improving the css a little, noticed this issue when using monitor with less width. 2017-12-22 07:50:34 +00:00
Jonathan Rosenbaum
39234f9b10 A similar bug was fixed in d0028b57790
* With new SQL logic volunteer obj is empty for non-volunteers, this corrects this by creating false empty data in an new temp. object.
2017-12-19 04:58:49 +00:00
Jonathan Rosenbaum
937bf5adff Fixes #51; a matter of SQL. 2017-12-19 04:39:30 +00:00
Jonathan Rosenbaum
d802552d7f Adds examine_shop class for future changes: #43 & #47 2017-12-16 09:19:56 +00:00
Jonathan Rosenbaum
d0028b5779 Adds performance improvements for volunteer_benefits closing #46
* Major changes, will test more, but appears to be working very well.
2017-12-16 09:15:50 +00:00
Jonathan Rosenbaum
33c5e60969 Combines result1 with result2 in prep to address volunteer for #46. 2017-12-15 20:36:30 +00:00
Jonathan Rosenbaum
e61cbba5c5 Only changes cursor non-allowed in Paid Membership td, bug introduced with last change. 2017-12-15 05:29:38 +00:00
Jonathan Rosenbaum
f59020a823 membership_benefits now just one call as desired for issue #46
* now need to do the same thing for volunteer_benefits
2017-12-15 05:22:18 +00:00
Jonathan Rosenbaum
6baadda5ef This reverts one change in #46, contact.js does initiate chosen. 2017-12-15 05:18:35 +00:00
Jonathan Rosenbaum
140ba1938e Partially addresses performance issue noted in #46
* removes uncessary use of contact.js
* removes duplicate code in shop.js
2017-12-14 21:14:29 +00:00
Jonathan Rosenbaum
0eed1328b5 Now that iframes are used in shop_log this fixes #45, thanks to Matt Marino for observing this issue. 2017-12-13 05:39:21 +00:00
Jonathan Rosenbaum
8aae19686b This partially addresses #43. 2017-12-11 06:38:56 +00:00
Jonathan Rosenbaum
49157e3341 Closes #39; major record changing improvement to YBDB!
* shop_log.php becomes shop_log_iframe.php
* shop_log.php now controls the iframe logic
2017-12-11 02:21:49 +00:00
Jonathan Rosenbaum
29212e5ae4 Added a missing ; 2017-12-11 02:21:08 +00:00
Jonathan Rosenbaum
90e643544f New call for global_pad for #39. 2017-12-11 02:18:58 +00:00
Jonathan Rosenbaum
5f6505a016 For #39, links for shop_log.php changed to shop_log_iframe.php 2017-12-11 02:17:06 +00:00
Jonathan Rosenbaum
a960dbda55 Adds the new prefix conf for etherpad which also was added for individual reports, part of #39. 2017-12-11 02:15:10 +00:00
Jonathan Rosenbaum
8789a289b7 New configurations for etherpad; more documentation on the wiki coming. 2017-12-11 02:13:58 +00:00
Jonathan Rosenbaum
5d6a1ab384 One of the steps for #39 - include header behavior
* getting 2 iframes to behave properly so that etherpad isn't constantly reloading at the front sign-in was a little tricky and required slight alteration of some of the include headers.
2017-12-11 02:05:39 +00:00
Jonathan Rosenbaum
77be1aa86e Adds etherpad.js plugin library for #39! 2017-12-09 07:19:13 +00:00
Jonathan Rosenbaum
959fc08092 This implements etherpad (#39) for individual_history_log! 2017-12-09 07:09:35 +00:00
Jonathan Rosenbaum
655d009766 Fixes #38 with TIMEDIFF. 2017-12-09 00:38:33 +00:00
Jonathan Rosenbaum
a7decc5735 Closes #29! 2017-11-26 05:35:50 +00:00
Jonathan Rosenbaum
e99d2863b8 This fixes a bug introduced by the 34650c9be fix.
* There is an issue if the spinner is used, when the transaction is complete, the function is called infinitely.
2017-11-26 04:44:27 +00:00
Jonathan Rosenbaum
a56ec4d9ff
GPLv3!
FLOSS daily!
2017-11-18 04:02:38 -05:00
Jonathan Rosenbaum
16c6b39d02 Fixes #36, swap intval with floatval. 2017-11-18 05:41:30 +00:00
Jonathan Rosenbaum
8ba910b37b Adds better error output, fixes #34. 2017-11-17 02:54:44 +00:00
Jonathan Rosenbaum
a2a0b10077 Actually no for #23, doesen't resolve seconds or even ti/to. 2017-11-16 03:27:53 +00:00
Jonathan Rosenbaum
4574410744 Fixes #23 - time skewed by one step! 2017-11-16 02:13:43 +00:00
Jonathan Rosenbaum
34650c9be0 Mozilla, not chrome, picked up on the strict javascript requirement.
* some javascript libraries failed, but not all
* put volunteer_hours_to_membership_discount() in the right place, right above redeemable().
* Fixed!
2017-11-15 02:53:25 +00:00
Jonathan Rosenbaum
f471c24339 Had to comment out disabled of amount as introduced with 956faaa2795
* amount.val was saved because input was disabled
2017-11-14 08:02:51 +00:00
Jonathan Rosenbaum
956faaa279 Because #4 creates a special type of transaction, amount is disabled.
* enabled on sold_to.change
2017-11-14 06:32:57 +00:00
Jonathan Rosenbaum
2e0568c107 This fixes #4 with option 1, but introduces #29. 2017-11-14 05:06:06 +00:00
Jonathan Rosenbaum
beeab5e775 Fixes #28. 2017-11-13 22:34:33 +00:00
Jonathan Rosenbaum
62a51320e3 This fixes #21, and cleans up the code a little. 2017-11-13 22:00:18 +00:00
Jonathan Rosenbaum
cc41801975 Just a spelling correction. 2017-11-13 08:07:13 +00:00
Jonathan Rosenbaum
69b9c5e433 Two minor fixes.
* If sum is really large it is fixed(2) so that difference in transaction_log is correct and it turns green, etc.
* typeof amount.val() is check for undefined to avoid unneccesary error output.
2017-11-13 07:27:44 +00:00
Jonathan Rosenbaum
98965c8b19 If redeemed hours in NaN, converted to 0. 2017-11-13 07:25:40 +00:00
Jonathan Rosenbaum
52069d9b52 Fixes a bug introduced by adding datetime with enh #26.
* links for shop_log weren't opening up the latest shop, or any shop.
2017-11-13 05:45:59 +00:00
Jonathan Rosenbaum
104de44dc5 This closes #25!
* Requires mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
2017-11-13 00:38:01 +00:00
Jonathan Rosenbaum
68061f3408 CanEdit now proper for change from date to datetime. 2017-11-12 16:50:45 +00:00
Jonathan Rosenbaum
463a54a951 Closes #26, date to datetime, much nicer! 2017-11-12 16:14:56 +00:00
Jonathan Rosenbaum
57ecbab44a Modifies date in shops from date to datetime for #26. 2017-11-12 16:13:25 +00:00
Jonathan Rosenbaum
d7aefb1416 This allows you to update in place without closing. Nice. 2017-11-12 08:57:18 +00:00
Jonathan Rosenbaum
d8ddb34d1f This mostly closes #15, not all the enhancements, but nice enough. 2017-11-12 08:18:46 +00:00
Jonathan Rosenbaum
7fd089809f Enh: Added day of the week at the top. 2017-11-12 06:45:37 +00:00
Jonathan Rosenbaum
6b79915686 Corrects a spelling mistake. 2017-11-12 06:30:27 +00:00
Jonathan Rosenbaum
5928a936d2 Adds sold_to field in regards to #19.
* Sold By or
* Performed by
2017-11-12 06:28:47 +00:00
Jonathan Rosenbaum
f7d389551a This resolves #23
* Adds LIST_MINUTE_INTERVAL
* Creates a new generic function from list_min15() .. list_min() with one new arguement, the minute interval that 60 should divide by cleanly.
* May clean up the $elapsed_hours, but currently have LIST_MINUTE_INTERVAL set to 1, so we are happy!
2017-11-12 04:21:35 +00:00
Jonathan Rosenbaum
d065279477 Amount breakdown now being properly displayed for donations / monetary donation.
* basically, there isn't a breakdown.
2017-11-12 03:30:04 +00:00
Jonathan Rosenbaum
3f870cf60e Fixes #24. 2017-11-12 03:05:10 +00:00
Jonathan Rosenbaum
424c279e9e Fixes #22 with escape() 2017-11-12 02:35:42 +00:00
Jonathan Rosenbaum
3e9c23c676 Provides more information in amount title if has paid history.
* Original Price
* Paid
* Redeemed Hours
2017-11-11 22:47:50 +00:00
Jonathan Rosenbaum
3d02473e03 This should fix #22. 2017-11-11 22:46:04 +00:00
Jonathan Rosenbaum
080357c2f3 Resolves #17 2017-11-08 09:17:51 +00:00
Jonathan Rosenbaum
adeb4f8854 Adds moment library to stats header. 2017-11-05 01:18:18 +00:00
Jonathan Rosenbaum
8be7a8a9b3 Removes unneccesary code. 2017-11-05 01:16:52 +00:00
Jonathan Rosenbaum
44748ca740 Changing Sale Date to Donation Date for all Donations. 2017-11-03 03:12:57 +00:00
Jonathan Rosenbaum
a26ab11123 Temporary solution for #14. 2017-11-01 08:42:58 +00:00
Jonathan Rosenbaum
1f38eb1f9a Closes #13 by removing unncessary logic check.
* Hopefully, no reason for checking for new account.
2017-11-01 08:03:06 +00:00
Jonathan Rosenbaum
8396b66a76 Corrects a bug where comparisons req. Number cast. 2017-10-31 07:54:34 +00:00
Jonathan Rosenbaum
bc3c7450fd Handles when contact_id exceeds greatest or least contact_id.
* will go to the closest contact_id, nice behavior.
2017-10-31 07:03:00 +00:00
Jonathan Rosenbaum
b63df15721 Closes #12 enhancement. 2017-10-31 06:06:22 +00:00
Jonathan Rosenbaum
28ded7650e Adds placeholder ShopId to tabulator header. 2017-10-31 05:23:11 +00:00
Jonathan Rosenbaum
f742fc9621 Adds prev next buttons as req in enhancement #12 2017-10-31 05:20:47 +00:00
Jonathan Rosenbaum
3dff971ac9 Adds accurate sorting for time_in, time_out, and total.
* uses moment.js
* changed from formatter to mutator for time_in and time_out.
2017-10-30 03:15:29 +00:00
Jonathan Rosenbaum
c622cee563 Minor sytax fix. 2017-10-30 03:06:44 +00:00
Jonathan Rosenbaum
c466ae0927 Adds moment to header. 2017-10-30 03:04:39 +00:00
Jonathan Rosenbaum
7b65374c13 Adds moment dot files. 2017-10-30 03:03:26 +00:00
Jonathan Rosenbaum
4bb9b043ad This adds moment to perfect date/time sorting with tabulator! 2017-10-30 03:01:55 +00:00
Jonathan Rosenbaum
f15d312e5a Turns off cell editing, add "" for status. 2017-10-30 00:16:48 +00:00
Jonathan Rosenbaum
9cc6cb20be A complete redo with tabulator! 2017-10-29 23:49:12 +00:00
Jonathan Rosenbaum
68431826f3 Adds reports{js,php} for modern reporting with tabulator!
* and integration
2017-10-29 23:46:41 +00:00
Jonathan Rosenbaum
58a3e00f70 Adds tabulator and reports.js to this header. 2017-10-29 23:45:04 +00:00
Jonathan Rosenbaum
5e5899160a This cleans up the html a little for the last fix #10 2017-10-19 08:33:24 +00:00
Jonathan Rosenbaum
e08708b66a Show signed-in patrons with distinct color for list_donation_locations_withheade
* closes #10
* combines signed-in with everyone else
* everyone should be put in alphabetical order in the future
2017-10-19 08:08:00 +00:00
Jonathan Rosenbaum
821009e0ad Turns patron name into a link in transaction_log. 2017-10-19 07:27:26 +00:00
Jonathan Rosenbaum
57c7bcd615 This closes #11 by turning shop_id into a link.
* transaction.css was too low a priority so added style in transaction_log.
2017-10-19 05:12:35 +00:00
Jonathan Rosenbaum
3c5eea235a This fixes #9 by allowing two behaviors via REDEEM_ONE_TO_ONE:
* based on the SWEAT_EQUITY_LIMIT with discounts applied,
* based on 1 to 1 (1hr of volunteering === 1hr of free stand time) regardless of the SWEAT_EQUITY_LIMIT
2017-10-19 04:27:44 +00:00
Jonathan Rosenbaum
28ff8f5fd6 Removed a td: Closes #3 2017-10-18 07:10:15 +00:00
Jonathan Rosenbaum
8ded4fa995 Minor change to show closes #8 Matt Marino enhancement request. 2017-10-11 08:19:54 +00:00
Jonathan Rosenbaum
b9e17872ac Shows if banned.
* tr becomes red
* title becomes banned
* not all td currently change, however, it is sufficient to get the message across, and let the greeter know there is an issue.
2017-10-11 08:05:43 +00:00
Jonathan Rosenbaum
6eba0250d6 Returns banned list. 2017-10-11 06:18:00 +00:00
Jonathan Rosenbaum
5695fe8b07 This resolves the issue with user defined arrays (local_configurations) not carrying over.
* include works, too, and in this paticular code would not provide a disadvantage
2017-10-11 05:38:57 +00:00
Jonathan Rosenbaum
814a2bc4b6 Some long overdue major changes. 2017-10-10 03:49:05 +00:00
Jonathan Rosenbaum
b4f1ca18de Little spelling change. 2017-10-10 03:34:10 +00:00
Jonathan Rosenbaum
a3b2188e27 Provides an explanation for all the header include files. 2017-10-10 03:32:52 +00:00
Jonathan Rosenbaum
6a464d29be Adds tabulator capability to reports. 2017-10-10 03:19:10 +00:00
Jonathan Rosenbaum
407893b872 Adds the nice tabulator library! 2017-10-10 03:18:06 +00:00
Jonathan Rosenbaum
cc6346a1b7 Simplified include_headers by removing include_header_start_shop.
* No important changes with shop_log.
2017-10-10 03:15:47 +00:00
Jonathan Rosenbaum
6fcf67c0c1 Changed season to shop season as recommended by Jonathan Nellis. 2017-09-20 07:13:53 +00:00
Jonathan Rosenbaum
28e290ba48 More text decoration improvements. 2017-09-19 08:02:00 +00:00
Jonathan Rosenbaum
d3ed149289 Improves the update interests css a little bit. 2017-09-19 07:42:50 +00:00
Jonathan Rosenbaum
6846165297 Changes the color coding for volunteers who have redeemed all their hours. 2017-09-19 05:56:02 +00:00
Jonathan Rosenbaum
7b1e3f0545 Makes status font smaller to avoid overruns. 2017-09-19 05:40:03 +00:00
Jonathan Rosenbaum
7696b05dc9 Adds Update Interests to the Volunteer Hours column! 2017-09-19 04:51:49 +00:00
Jonathan Rosenbaum
cc44575d2a More awesome improvements. 2017-09-18 04:08:36 +00:00
Jonathan Rosenbaum
f5a5deb214 url correction 2017-09-17 20:25:29 +00:00
Jonathan Rosenbaum
5af92d5fe1 More expansion. 2017-09-17 20:22:31 +00:00
Jonathan Rosenbaum
8c33f95022 More improvements. 2017-09-17 20:12:53 +00:00
Jonathan Rosenbaum
1710842deb More policy additions. 2017-09-17 20:07:05 +00:00
Jonathan Rosenbaum
21a8447d54 Added some more important information in the 1st paragraph. 2017-09-17 09:19:05 +00:00
Jonathan Rosenbaum
b2b306502b Improving verbiage. 2017-09-17 06:02:45 +00:00
Jonathan Rosenbaum
0e56e1b269 Long overdue update of shop welcome page.
* updates with new policies
* simplifies somewhat
* changes the color
2017-09-17 05:34:31 +00:00
Jonathan Rosenbaum
2ee0d57dc4 Changes from loud red, to cool blue (experiment). 2017-09-17 05:12:57 +00:00
Jonathan Rosenbaum
7c21381fef Adds include_footer so people have links to report bugs, etc. 2017-09-17 05:11:47 +00:00
Jonathan Rosenbaum
800205cbdd Changes margin-left from 170 to 80px to avoid run-overs. 2017-09-17 01:51:17 +00:00
Jonathan Rosenbaum
d98c033348 Changes id to class for more than one row with same contact_id. 2017-09-17 01:29:02 +00:00
Jonathan Rosenbaum
c356cb9aaf Adds Volunteer Hours and Paid Membership Columns to shop log:
* shows Summary for Volunteer hours
* show whether membership is current or not
* a little css magic in shop.js
2017-09-17 01:20:18 +00:00
Jonathan Rosenbaum
798ae356b6 Fixes Membership discount for non-member (EAB (all hours) and Volunteer) #2 2017-09-03 00:00:54 +00:00
Jonathan Rosenbaum
367f9707d5 Changes Statistics to Reports. Lots of header include files. 2017-08-14 03:53:18 +00:00
Jonathan Rosenbaum
f95febd851 Realized that having readonly on membership may prevent a patron from renewing slightly earlier, so reverted.
* Could allow renewal perhaps 2 months before, and turn off readonly, as a feature.
2017-08-11 07:38:39 +00:00
Jonathan Rosenbaum
2b5c07665b Fixes another introduced bug so that readonly is only on for paid members for Memberships transactions. 2017-08-11 06:55:36 +00:00
Jonathan Rosenbaum
7b84256a39 Turns off input for membership transaction if patron is a paid member. 2017-08-11 06:36:17 +00:00
Jonathan Rosenbaum
79e8baf0b7 Fixes a bug where paid member was not showing for someone with a valid membership. 2017-08-11 06:24:31 +00:00
Jonathan Rosenbaum
f889eccc71 Turns off quantity (community_bike) for Memberships. 2017-08-11 05:54:33 +00:00
Jonathan Rosenbaum
b72ce46423 Introduced a bug with the last commit, fixed! 2017-08-11 05:46:51 +00:00
Jonathan Rosenbaum
9ef3efe15c Improves documentation for local_configurations.php. 2017-08-10 23:53:33 +00:00
Jonathan Rosenbaum
1eb5982595 Cleans up the code a little bit. 2017-08-09 07:48:26 +00:00
Jonathan Rosenbaum
a2ae9907e4 Fixes a bug with then newest introduced volunteer benefits math. 2017-08-09 05:48:56 +00:00
Jonathan Rosenbaum
3f195f358b Comments out console.log. 2017-08-09 05:30:27 +00:00
Jonathan Rosenbaum
e37a0ec2f7 Redeemable now properly adds discount when there has been previous transactions .
* some fun math!
2017-08-09 05:25:23 +00:00
Jonathan Rosenbaum
8f45c94cd8 Turns off all console.log. 2017-08-08 05:42:31 +00:00
Jonathan Rosenbaum
d450864bdf Displays original price for membership discount transaction. 2017-08-08 05:29:47 +00:00
Jonathan Rosenbaum
2c05f7e768 Properly reflects membership discount in amount on save. 2017-08-08 04:50:43 +00:00
Jonathan Rosenbaum
1b56a37859 Adds membership_discount_price span that will not be displayed. 2017-08-08 03:39:50 +00:00
Jonathan Rosenbaum
8da2bb24eb Switches to membership discount when there are no remaining volunteer hours to redeem for volunteers who are also paid members. 2017-08-08 03:32:04 +00:00
Jonathan Rosenbaum
6bd1742c54 Improves the code be expanding the scope of the volunteer benefits object, and providing correct calculations in Stand Time so that the stand time transaction is properly rendered on select change. 2017-08-07 22:42:55 +00:00
Jonathan Rosenbaum
609078a60d Removes an uncessary function call and callback return that was used to Stand Time which was replaced by accurate code in transactions.js. 2017-08-07 22:41:48 +00:00
Jonathan Rosenbaum
c814e49031 Adds Stand Time to membership benefits definition. 2017-08-07 22:40:44 +00:00
Jonathan Rosenbaum
945428b0c9 amount.one didn't hack it, back to amount.on. 2017-08-07 20:17:43 +00:00
Jonathan Rosenbaum
6f3fc83a0b Adds a few additional transactions to the membership benefits definition. 2017-08-07 20:08:36 +00:00
Jonathan Rosenbaum
de853b5da0 Adds membership discount span. 2017-08-07 20:08:02 +00:00
Jonathan Rosenbaum
dd6a77f1d8 Adds membership discount to volunteer benefits css. 2017-08-07 20:07:17 +00:00
Jonathan Rosenbaum
eaa1d18788 Assigns a value if transaction tests true for membership discount. 2017-08-07 20:06:08 +00:00
Jonathan Rosenbaum
f040988854 This changes on to one which is a better strategy when it is only necessary for the handler to fire once and empty the results for the membership discount. 2017-08-07 18:00:34 +00:00
Jonathan Rosenbaum
137cc27ca1 Properly displays discounted price in #membership_discount. 2017-08-07 17:33:47 +00:00
Jonathan Rosenbaum
a0f3e74165 This improves the math for membership discount and shows it in the original price element. 2017-08-07 03:40:15 +00:00
Jonathan Rosenbaum
20741bd9d6 Provides membership discount value on callback. 2017-08-07 01:29:53 +00:00
Jonathan Rosenbaum
f69c4d49c9 Defines Membership discount. 2017-08-07 01:22:06 +00:00
Jonathan Rosenbaum
1f73ed2a2e Changed to allow unlimited hour-to-hour Stand Time. 2017-08-06 19:03:39 +00:00
Jonathan Rosenbaum
2d264773ed This properly records orginal price when redeeming volunteer hours for Stand Time when input is already pre-filled. 2017-08-06 08:22:55 +00:00
Jonathan Rosenbaum
09cc2893a4 Improves the output feedback. 2017-08-06 07:16:55 +00:00
Jonathan Rosenbaum
a084161d03 Free stand time for bike purchases is now working. 2017-08-06 07:00:52 +00:00
Jonathan Rosenbaum
ff0bb290e2 Tests the free stand time callback. 2017-08-06 05:18:53 +00:00
Jonathan Rosenbaum
fc694c4a87 Adds new stand time definition for free stand time period. 2017-08-06 05:17:58 +00:00
Jonathan Rosenbaum
aab521eb6b Improves the max bike earned logic. 2017-08-05 22:01:02 +00:00
Jonathan Rosenbaum
e852af5e5f Max Bike Earned logic now working. 2017-08-05 21:15:20 +00:00
Jonathan Rosenbaum
fb0e9cfbfb Corrects some human introduced bugs by returned code to earlier state. 2017-08-05 19:22:02 +00:00
Jonathan Rosenbaum
3e18f89e65 Discount works properly when redeemable value is not greater than sweat equity limit.
* Also, improved tabbing to take into account the spinner.
2017-08-05 19:05:16 +00:00
Jonathan Rosenbaum
27ff8f87d2 Corrects an introduced bug where max is assigned a value, but obj.volunteer does not have a value assigned, yet. 2017-08-05 18:28:16 +00:00
Jonathan Rosenbaum
165b81adc5 Gives a 0 value when there is no vhr & vhr 2017-08-05 18:13:57 +00:00
Jonathan Rosenbaum
2f33f8eef8 If volunteer hours remaining is 0, spinner is disabled on spin or zeroed on input. 2017-08-05 06:44:59 +00:00
Jonathan Rosenbaum
17573c20e4 Adds new value to redeemable function, and comments unneccesary code in function. 2017-08-05 06:13:59 +00:00
Jonathan Rosenbaum
5e80aedca7 Fills in the blanks for volunteer hours remaining and redeemed in mouseover. 2017-08-05 05:49:25 +00:00
Jonathan Rosenbaum
bc747c90a2 Creates new object when year changes. 2017-08-05 04:41:55 +00:00
Jonathan Rosenbaum
9e8ea84a0e Assigns 0.00 if redeemable_hours are NaN, and runs a test so info isn't shown esessentially for a non-volunteer. 2017-08-05 03:42:21 +00:00
Jonathan Rosenbaum
5047f59996 This uses tradition declaration notation rather than emacscript 6 notation, just for compatibility with older browsers. 2017-08-05 03:08:18 +00:00
Jonathan Rosenbaum
b7f128feca Creates the object, and adds redeemed hours together. 2017-08-04 06:25:27 +00:00
Jonathan Rosenbaum
aeb6b23889 Adds volunteer history update. 2017-08-04 06:24:54 +00:00
Jonathan Rosenbaum
a48fb518f7 Saves redeemed hour value properly if previous edited transaction is saved again. 2017-08-03 21:39:08 +00:00
Jonathan Rosenbaum
f95f2d2b2c This gets volunteer history select working correctly. 2017-08-03 21:23:13 +00:00
Jonathan Rosenbaum
e6b05b4eab Callback to query Volunteer benefits history. 2017-08-03 21:10:25 +00:00
Jonathan Rosenbaum
086a87900a Adds delete_transaction id so that delete can be turned off for completed / saved transactions. 2017-08-03 21:09:33 +00:00
Jonathan Rosenbaum
8ed0677750 Now a previous saved transaction cannot be deleted. 2017-08-03 21:08:28 +00:00
Jonathan Rosenbaum
34e91b07bd Adds original_price span. 2017-08-03 20:28:34 +00:00
Jonathan Rosenbaum
c1bde007b4 Minor text edit. 2017-08-03 20:27:53 +00:00
Jonathan Rosenbaum
63cecfc678 Fixes a minor bug introduced on first transaction for benefit transactions. 2017-08-03 20:26:47 +00:00
Jonathan Rosenbaum
daf885cc4a Shows original price and redeemed volunteer hours for saved transaction when edit button is pressed. 2017-08-03 20:03:27 +00:00
Jonathan Rosenbaum
7147ea6213 Adds to new values (original_price and redeemed_hours) to the history for benefit transactions. 2017-08-03 19:44:38 +00:00
Jonathan Rosenbaum
04846ae362 Uses a new type for the volunteer column. 2017-08-03 03:29:35 +00:00
Jonathan Rosenbaum
d0e88bac58 Turns off/on spinner for membership based on choices in functions. 2017-08-03 00:15:38 +00:00
Jonathan Rosenbaum
d4cb86b3c0 Adds transactions_with_volunteer_benefits and transactions_with_membership_benefits.
* Allows transactions to provide volunter and/or membership benefits
* Volunteer benefits take precedent for patrons with both types of benefits if a tranaction offers both.
2017-08-02 22:27:39 +00:00
Jonathan Rosenbaum
c214c48a3d Adds an additional check for Stand Time or nothing else works. 2017-08-02 22:07:03 +00:00
Jonathan Rosenbaum
2508653fef Shows amount if expired membership & status is stand time. 2017-08-02 21:27:34 +00:00
Jonathan Rosenbaum
23d8bcf60e Adds the correct conversion for Stand Time transactions, still limited like normal transactions. 2017-08-02 21:15:11 +00:00
Jonathan Rosenbaum
bd00d498f1 Corrects a bug, by returning a deleted value. 2017-08-02 20:27:13 +00:00
Jonathan Rosenbaum
1c6508abd0 This corrects the math for all situations. 2017-08-02 20:16:17 +00:00
Jonathan Rosenbaum
a225aacda4 Adds the discount math. One unimportant bug created which will be fixed. 2017-08-02 09:15:11 +00:00
Jonathan Rosenbaum
76b73352dc Adds VOLUNTEER_DISCOUNT. 2017-08-02 06:18:46 +00:00
Jonathan Rosenbaum
cf7bcd5103 Function redeemable added to handle duplicate logic for volunteer hours spinner. 2017-08-02 05:13:43 +00:00
Jonathan Rosenbaum
35c3a69f73 This doesn't allow a value > current_year_volunteer_values on input. 2017-08-01 05:57:34 +00:00
Jonathan Rosenbaum
38286d280a Now uses stand_time_value for "Stand Time" transactions. 2017-08-01 05:34:49 +00:00
Jonathan Rosenbaum
6a89e5d675 Adds a new definition, stand_time_value. 2017-08-01 05:15:20 +00:00
Jonathan Rosenbaum
0ef4138aa4 Changes the logic so that price is read for stand time transactions. 2017-07-31 21:58:58 +00:00
Jonathan Rosenbaum
6b8cdbe0af Adds logic to keyboard input, and makes incremental true. Nice stuff. 2017-07-31 21:27:12 +00:00
Jonathan Rosenbaum
52ba58d805 Changes the model suggestion for volunteer table. 2017-07-31 21:07:51 +00:00
Jonathan Rosenbaum
157cb8474d This gets some of the basic logic working for redeeming volunteer hours. 2017-07-31 21:06:40 +00:00
Jonathan Rosenbaum
7fb848f7d4 The corrects a hereunto unknown very minor bug where data is not being check for value in the deposit calculator function. 2017-07-30 20:02:25 +00:00
Jonathan Rosenbaum
a557e2b8f5 This sets up some of the math framework to redeem volunteer hours from amount. 2017-07-29 20:56:45 +00:00
Jonathan Rosenbaum
4feb5022eb Puts all volunteer data into one column called "volunteer".
* Reflects the changes in json, and adds more definition to the json callback.
2017-07-29 20:29:18 +00:00
Jonathan Rosenbaum
81e261bc6a Finally have the values rendering properly. 2017-07-28 01:26:54 +00:00
Jonathan Rosenbaum
793fcb42e1 Adds a better regexp thanks to this:
https://stackoverflow.com/questions/12643009/regular-expression-for-floating-point-numbers
2017-07-27 19:27:19 +00:00
Jonathan Rosenbaum
21125249ea Makes it even nicer thanks to this good read:
https://stackoverflow.com/questions/16791940/jquery-ui-spinner-able-to-exceed-max-by-keyboard
2017-07-27 19:12:19 +00:00
Jonathan Rosenbaum
1202c4909a This cleans up things a bit for spinner. 2017-07-27 18:47:16 +00:00
Jonathan Rosenbaum
e663006698 Some experimentation making sure the spinner is working.
* Need to improve the css
* Need to link everything togther, the fun part!
2017-07-27 18:01:53 +00:00
Jonathan Rosenbaum
960296c856 Adds the spinner libraries to the code, and adds some css values. 2017-07-27 17:58:53 +00:00
Jonathan Rosenbaum
9f263a68d6 Adds the jQuery UI spinner. 2017-07-27 17:44:35 +00:00
Jonathan Rosenbaum
670d27432b Add MAX_BIKE_EARNED definition. 2017-07-26 19:19:28 +00:00
Jonathan Rosenbaum
c6f68ff19b Fixes a presentation bug for paid member in Stand Time. 2017-07-24 05:30:36 +00:00
Jonathan Rosenbaum
7a09ccfead Won't charge stand time if a member. Simplified callback reusing funtion. 2017-07-24 05:02:21 +00:00
Jonathan Rosenbaum
f1daa79213 Fixes a bug, and adds membership_benefits function for easier querying. 2017-07-24 04:45:51 +00:00
Jonathan Rosenbaum
ff0142aa30 Improves logic for multiple logins and real sign out. 2017-07-24 01:26:50 +00:00
Jonathan Rosenbaum
55620576dd Adds styling for stand time info. 2017-07-24 01:25:57 +00:00
Jonathan Rosenbaum
a05575999c Improves the presentation. 2017-07-23 19:57:43 +00:00
Jonathan Rosenbaum
eaefff480c Figures out stand time amount with optional grace period. 2017-07-23 19:06:52 +00:00
Jonathan Rosenbaum
7969da316c Adds a missing ; in new definition. 2017-07-23 17:13:48 +00:00
Jonathan Rosenbaum
e724e8d9cb The beginnings of Stand Time logic. 2017-07-23 16:57:23 +00:00
Jonathan Rosenbaum
3087e5d21f Adds Stand Time transaction type. 2017-07-23 16:56:12 +00:00
Jonathan Rosenbaum
ea3390354c Adds Stand Time definitions. 2017-07-23 16:55:08 +00:00
Jonathan Rosenbaum
40a2a6abab Tests if volunteer_hours exists. 2017-07-20 22:47:37 +00:00
Jonathan Rosenbaum
1805449b50 Changes Personal to Stand Time and many other things:
* Updates populate
* Makes Stand Time a special transaction_type_id
* Adds new definitions to database_functions
2017-07-20 22:29:33 +00:00
Jonathan Rosenbaum
df15b6933f Adds some improvements:
* Adds Stand Time Transaction
* Turns off Build Your Own Bike Transaction
* Improves documentation
2017-07-20 20:29:47 +00:00
Jonathan Rosenbaum
c70bac75f7 The corrects a logic error for show_description.
Now working properly when changed in SQL
2017-07-20 20:12:36 +00:00
Jonathan Rosenbaum
3c734a60e2 Fixes active flag for transation_type pulldowns. 2017-07-20 19:09:18 +00:00
Jonathan Rosenbaum
79e246246d Now carries over the current year volunteer hours data. 2017-07-18 05:02:44 +00:00
Jonathan Rosenbaum
e9da500848 This adds SQL logic for current year volunteer hours and visits. 2017-07-18 04:42:34 +00:00
Jonathan Rosenbaum
f782cb90fc This adds the current year to the title for volunteer hours. 2017-07-18 04:40:01 +00:00
Jonathan Rosenbaum
9d07e9a740 Improves the presentation logic. 2017-07-17 20:50:12 +00:00
Jonathan Rosenbaum
787fff74d6 Adds initial Volunteer Hour logic and displays in transactions with title. 2017-07-17 20:38:23 +00:00
Jonathan Rosenbaum
3a0a83cd37 Adds same SQL logic as with paid_membership stats. 2017-07-17 19:16:21 +00:00
Jonathan Rosenbaum
be7155de5d Improves the text in the headers. 2017-07-17 19:12:16 +00:00
Jonathan Rosenbaum
8a8009c1f1 Removes an unintentional copy/paste bug. 2017-07-17 19:10:31 +00:00
Jonathan Rosenbaum
7ce6389cd6 Adds another MAX so newest expiration date is reflected. 2017-07-17 19:06:48 +00:00
Jonathan Rosenbaum
8089b40f19 Changed to show only the most recent membership. 2017-07-17 18:45:20 +00:00
Jonathan Rosenbaum
afb64b7420 Adds title in span with email, phone, exp. date for membership.
Ofcourse, ask for ID, too.  May add membership # in the future.
2017-07-17 09:16:46 +00:00
Jonathan Rosenbaum
fb422fcc3b This returns the latest expiration date for membership.
Future proofing when people have had more than 1 paid membership!
2017-07-17 07:11:21 +00:00
Jonathan Rosenbaum
69ea453461 Changes the language from members to metrics
The reason is because Positive Spin policies have changed.  These metrics give you a better idea of who has actually been at the shop based on metrics:

Days and Hours (currently 2 / 8)
2017-07-17 06:39:15 +00:00
Jonathan Rosenbaum
072313ffc3 Adds constants for membership and volunteers. 2017-07-17 06:03:43 +00:00
Jonathan Rosenbaum
b9497ac7c3 Show whether a patron is a paid member or not. 2017-07-17 06:02:32 +00:00
Jonathan Rosenbaum
ac54744d20 Removes debugging code. 2017-07-17 06:01:02 +00:00
Jonathan Rosenbaum
60a63e360a This creates divs spans to show data about membership / volunteers. 2017-07-17 05:58:53 +00:00
Jonathan Rosenbaum
aee1543b0c Gets rid of debug and unnecessary code. 2017-07-17 00:31:56 +00:00
Jonathan Rosenbaum
1c7d28dd36 Working properly, was borrowing some volunteer metric query before. 2017-07-17 00:28:31 +00:00
Jonathan Rosenbaum
447f7afd61 Now properly finds paid members who are volunteers by metric. 2017-07-17 00:16:44 +00:00
Jonathan Rosenbaum
d1c4b91a1f Header description improvement. 2017-07-15 23:41:42 +00:00
Jonathan Rosenbaum
f44c6d2bb3 Adds stats for paid members. 2017-07-15 23:38:49 +00:00
Jonathan Rosenbaum
29eefefd39 Nicer than using exclude in .git 2017-07-15 22:51:52 +00:00
Jonathan Rosenbaum
2fd156e66e More for DHHR. 2017-07-15 22:45:23 +00:00
Jonathan Rosenbaum
8f7f737068 Adds a link to dhhr.php
This file is currently not in devel, but it is being used for Positive Spin.
2017-07-15 22:43:05 +00:00
Jonathan Rosenbaum
7286fc8c3e Adds a link to dhhr.php
This file is currently not in devel, but it is being used for Positive Spin.
2017-07-15 22:39:12 +00:00
Jonathan Rosenbaum
2617c008c0 Improves the header information with days/hours. 2017-07-15 22:30:00 +00:00
Jonathan Rosenbaum
461bddac81 Improves the output. 2017-07-15 22:20:46 +00:00
Jonathan Rosenbaum
163645a329 This corrects the sql membership logic. 2017-07-15 22:08:09 +00:00
Jonathan Rosenbaum
2c78a54486 You can now use local_configuations.php for configuration. 2017-07-15 19:12:20 +00:00
Jonathan Rosenbaum
ce921e8169 Added realpath so that included files work properly. 2017-07-15 18:48:34 +00:00
Jonathan Rosenbaum
2d12b59786 You may now use Connections/local_configurations.php for configurations. 2017-07-15 18:14:44 +00:00
Jonathan Rosenbaum
c54bd12f16 Added a little css magic for the footer. 2017-07-15 06:04:35 +00:00
Jonathan Rosenbaum
57f3a2b9ef Reverse wiki link. 2017-07-15 05:53:07 +00:00
Jonathan Rosenbaum
d2c5e518c7 Wiki link. 2017-07-15 05:51:41 +00:00
Jonathan Rosenbaum
ad9cb37cd4 Adds Bugs, Wiki, and Development info in the footer! 2017-07-15 05:49:15 +00:00
Jonathan Rosenbaum
d8d16af935 Checking if adding a space after # in Markdown brings back the header. 2017-07-15 04:39:15 +00:00
Jonathan Rosenbaum
51f91ddbad Add a deposit to initialize the POS 2017-07-14 03:21:33 +00:00
Jonathan Rosenbaum
bb89cba8ba Thought it would be a good idea to add the database schema. 2017-07-13 19:45:14 +00:00
Jonathan Rosenbaum
dfc8bd477a Changes length of description shown. Allows for lazy searches in the browser. 2017-07-13 19:03:40 +00:00
Jonathan Rosenbaum
dc228a84ca Adds full Desciption for each description when hoving over column. 2017-07-02 21:46:00 +00:00
Jonathan Rosenbaum
aa0f870d28 Provides error checking when sold_to or sold_by are not logged-in. 2016-10-10 07:32:54 +00:00
Jonathan Rosenbaum
2d3a184e84 Corrects error checking for middle name.
When and existing contact was updated it would produce an error that the
contact already existed, and a new middle name needed to be used, also when
created a contact without adding a first and/or last name the same error was
produced.  This fix corrects that bug.
2016-05-09 04:19:05 +00:00
Jonathan Rosenbaum
e7120a042a Fixing bug created by previous commit.
Only increasing max_name_length for the one known affected function.  In the
future will need to explore this even further, since there are names a lot
longer than 20 characters.
2016-03-26 07:13:10 +00:00
Jonathan Rosenbaum
6d4585b804 $max_name_length is now globally controlled.
20 was too short for some names, increased it to 30, not sure why this variable
was historically necessary.
2016-03-26 07:02:23 +00:00
Jonathan Rosenbaum
8ed593e4d5 This adds WAIVER_LABEL so that it can be user defined.
The button changes to "Show Complete Text".
2016-03-26 05:37:52 +00:00
Jonathan Rosenbaum
f783891e95 The first stage of allowing the waiver label to be modified in
database_functions; the next step will be testing changes to
contact_add_edit.php on the test system.
2016-03-26 05:12:31 +00:00
Jonathan Rosenbaum
4c6622440f Adds proper comparison for unique visitors. CAST can be used, too. 2016-02-03 08:31:01 +00:00
Jonathan Rosenbaum
f0263359f2 Changed a title. 2016-01-30 20:44:43 +00:00
Jonathan Rosenbaum
7d2372dc15 Adds paid membership period in days. 2016-01-30 03:26:02 +00:00
Jonathan Rosenbaum
92fe18644d Adds membership stats. An important addition.
Currently, searches ranges for volunteer specs for membership, and notes paid
member when they also qualify as a volunteer member.
2016-01-30 03:19:01 +00:00
Jonathan Rosenbaum
16e0bbcbf9 Adds documentation for Memberships transaction_type_id. 2016-01-30 03:16:50 +00:00
Jonathan Rosenbaum
ff3e59e2d0 The beginnings. Looking forward to this one, and linking to paid members. 2016-01-29 10:59:02 +00:00
Jonathan Rosenbaum
8eac9b6dd5 Stat totals for shop types. In the future a graph would be nice. 2016-01-29 10:38:55 +00:00
Jonathan Rosenbaum
4a77289b2f Adds mysql free specific to the query. 2016-01-29 10:37:15 +00:00
Jonathan Rosenbaum
2fba96db94 This fine tunes the searching to one day. 2016-01-29 07:47:44 +00:00
Jonathan Rosenbaum
9b9fbe6d55 Minor changes. Make button text green. 2016-01-29 07:10:33 +00:00
Jonathan Rosenbaum
a8ffd9fdf1 Applies new css changes (stats.css). 2016-01-27 23:11:11 +00:00
Jonathan Rosenbaum
78ef360e1b New link for Community Service hours! 2016-01-27 23:10:12 +00:00
Jonathan Rosenbaum
0e9a91eb69 Adds date range serach for community service hours. A much needed feature. 2016-01-27 23:08:11 +00:00
Jonathan Rosenbaum
b3734d6591 This creates a unified file for stats css. 2016-01-27 23:07:15 +00:00
Jonathan Rosenbaum
d26dc1cef1 Adds a Calendar Date Picker (PickMeUp).
This is nice stuff, always a delight to utilize ajax.  More stat pages may have
this change with stats.js operated globally.
2016-01-27 10:36:27 +00:00
Jonathan Rosenbaum
e54836d09a Adds statuses for volunteers and visitors, totals, and total combined. Pretty interesting stats. Will add date range submit next. 2016-01-26 06:22:28 +00:00
Jonathan Rosenbaum
3456b069f0 Corrects the paths. 2016-01-26 06:16:39 +00:00
Jonathan Rosenbaum
7a451c3002 This makes shop_log a class, too. Probably transactions.css isn't the most logical place for these classes but it works for now. 2016-01-26 06:14:59 +00:00
Jonathan Rosenbaum
3358af425f Added documentation for other_volunteer. 2016-01-26 04:23:34 +00:00
Jonathan Rosenbaum
9ff3b1219f Makes css correct, and allows fine control for stats. 2016-01-25 08:52:09 +00:00
Jonathan Rosenbaum
8522c0e985 As it turns out, adding base was not such a great idea. 2016-01-25 08:15:52 +00:00
Jonathan Rosenbaum
91ede32f80 Adds other_volunteer to the table. Useful for treating community volunteer hours differently in stats, etc. 2016-01-25 08:04:40 +00:00
Jonathan Rosenbaum
a0f974ee58 This adds the base tag href="/" that corrects several issues for finding resources in the head. Things look different. 2016-01-25 07:44:28 +00:00
Jonathan Rosenbaum
baa196ab39 This adds a Status Totals by Date Range link. 2016-01-25 07:42:42 +00:00
Jonathan Rosenbaum
1e5cec042a Merge branch 'devel' of https://github.com/fspc/Yellow-Bike-Database into devel
Hopefully, no issues merging.
2016-01-19 08:54:10 +00:00
Jonathan Rosenbaum
72da7e96d9 BUG Fix: When the year changed from 2015 to 2016, there was a javascript error
due to coding that affected noUiSlider, and also caused payment_type not to be
recorded in the database because of the correlating javascript issue.  Also,
this caused the Deposit Range not to work correctly.
2016-01-19 08:39:37 +00:00
Jonathan Rosenbaum
818caf32da And here is the important file for 90c93eb. 2015-12-27 19:40:21 +00:00
Jonathan Rosenbaum
90c93eb996 Improves the css a little (in transaction.css) for shop_log now that table is relative to take into account longer statuses. 2015-12-27 19:36:07 +00:00
Jonathan Rosenbaum
6d1bb2ad8b Modifies Student Volunteer to Student Volunteer/Community Service
Changes fixed size in shop_log to relative for sign-in display
Changes Donations to the accounting group Donations
2015-12-27 01:29:46 +00:00
Jonathan Rosenbaum
263e6ceb69 Simply changes positivespin.org/home2 to positivespin.org. In the future this should be unhardwired. 2015-12-26 06:22:13 +00:00
Jonathan Rosenbaum
c5755bcddf Added the change, not just documentation, for parent 3234faa46. 2015-12-03 02:25:22 +00:00
Jonathan Rosenbaum
3234faa464 This tiny change fixes the Bookkeeping Reports. What threw me off was the caveat concerning the purpose of "Accounting Group", basically is used to group together similar types of transactions, like Sales, Deposits, and Receivables. 2015-12-03 02:16:57 +00:00
Jonathan Rosenbaum
e02e1b74d4 Tests to find out if a Patron's name already exists in the database.
If so, this error is produced:  Your name already exists, please choose a different middle initial.
2015-12-02 09:53:58 +00:00
Jonathan Rosenbaum
5737b195f9 Brings back date_created in contacts after inadvertently removing it when improving contact creation. Originally, this code
$insertSQL = sprintf("INSERT INTO contacts (date_created) VALUES (%s)",
						   GetSQLValueString('current_time', "date"));

instantly created a contact, which was very annoying.
2015-11-30 23:20:41 +00:00
744 changed files with 229039 additions and 857 deletions

15
.gitignore vendored Normal file
View File

@ -0,0 +1,15 @@
*~
*swp
csv/*
js/chosen
js/nouislider
CBDB/
php-console/
examples/cert.pem
Connections/local_configurations.php
js/PickMeUp-2.8.0/
json/shop.php
sql/populate-private.sql
stats/dhhr.php
temp/
test.php

View File

@ -1,4 +1,6 @@
<?php <?php
// DO NOT EDIT - USE Connections/local_configurations instead
# FileName="Connection_php_mysql.htm" # FileName="Connection_php_mysql.htm"
# Type="MYSQL" # Type="MYSQL"
# HTTP="true" # HTTP="true"
@ -6,5 +8,8 @@ $hostname_YBDB = "enter_hostname";
$database_YBDB = "enter_schema"; $database_YBDB = "enter_schema";
$username_YBDB = "enter_username"; $username_YBDB = "enter_username";
$password_YBDB = "enter_password"; $password_YBDB = "enter_password";
if(file_exists( realpath($_SERVER["DOCUMENT_ROOT"]) . "/Connections/local_configurations.php")) {
require_once('local_configurations.php');
}
$YBDB = mysql_pconnect($hostname_YBDB, $username_YBDB, $password_YBDB) or trigger_error(mysql_error(),E_USER_ERROR); $YBDB = mysql_pconnect($hostname_YBDB, $username_YBDB, $password_YBDB) or trigger_error(mysql_error(),E_USER_ERROR);
?> ?>

View File

@ -2,6 +2,9 @@
require_once('YBDB.php'); require_once('YBDB.php');
// DO NOT EDIT - USE Connections/local_configurations.php instead with definitions between
// <?php (no space between ? and >) ? >
/* /*
Choose your timezone from http://php.net/manual/en/timezones.php Choose your timezone from http://php.net/manual/en/timezones.php
@ -15,20 +18,126 @@ require_once('YBDB.php');
Hawaii no DST ..... Pacific/Honolulu Hawaii no DST ..... Pacific/Honolulu
*/ */
define("TIMEZONE", "America/New_York"); if( !defined( 'TIMEZONE' ) ) define("TIMEZONE", "America/New_York");
/***
DHCP
****/
// The public IP address of the device which has opened a shop determines the ownership of that shop.
// In that way, more than one shop can run without conflicting with each other from different locations.
// However, in some cases the IP changes frequently due to DHCP during a 24hr shop.
// Definitions:
// default (use full IP address assigned)
// or
// Enter the numbers that defines a Class (A|B|C) Network, eg. 73.79;
// 73.79 would match a Class B network with an IP range of 73.79.*.*
// For additional info, read https://www.webopedia.com/DidYouKnow/Internet/IPaddressing.asp
if( !defined( 'IP' ) ) define("IP", "default");
/********* /*********
MEMBERSHIP MEMBERSHIP
**********/ **********/
// Define when a volunteer becomes a member based hours and days for the calendar year vs a paid membership // Define when a volunteer becomes a member based hours and days for the calendar year vs a paid membership
// This can also be used as a metric.
/*
At Positive Spin
Actual memberships begin on the day they are purchased
Memberships - $60/year
Memberships include unlimited access to an available work stand during open shop hours and a 10% discount on new parts.
*/
// Needs to volunteer at least this amount of defined hours before being considered a member // Needs to volunteer at least this amount of defined hours before being considered a member
define("MEMBERSHIP_HOURS",8); // Note: used only as a metric for reports
if( !defined( 'MEMBERSHIP_HOURS' ) ) define("MEMBERSHIP_HOURS",8);
// Needs to volunteer at least this number of days before being considered a member // Needs to volunteer at least this number of days before being considered a member
define("MEMBERSHIP_DAYS",2); // Note: used only as a metric for reports
if( !defined( 'MEMBERSHIP_DAYS' ) ) define("MEMBERSHIP_DAYS",2);
// Define how long a patron remains a member if they purchase a membership.
if( !defined( 'PURCHASED_MEMBERSHIP_DAYS' ) ) define("PURCHASED_MEMBERSHIP_DAYS",365);
// Define discount for paid members (applies when volunteer benefits do not)
if( !defined( 'MEMBERSHIP_DISCOUNT' ) ) define("MEMBERSHIP_DISCOUNT",10); // PERCENTAGE
/*********
STAND TIME
**********/
// Determines the hourly cost for Stand Time (transaction_type_id)
if( !defined( 'STAND_TIME_HOURLY_RATE' ) ) define("STAND_TIME_HOURLY_RATE",10); // IN DOLLARS
// Define how much time over 1hr is allowed before charging for the next hour.
if( !defined( 'STAND_TIME_GRACE_PERIOD' ) ) define("STAND_TIME_GRACE_PERIOD",15); // IN MINUTES 1 - 59
// Define how many free days of stand time are allotted after purchase of a bike
if( !defined( 'FREE_STAND_TIME_PERIOD' ) ) define("FREE_STAND_TIME_PERIOD",30); // IN DAYS
/********************************
SWEAT EQUITY / VOLUNTEER BENEFITS
*********************************/
// For example:
// The settings below are specific to Positive Spin Policies
// Calendar Year = January 1 .. December 31 (366 for leap years)
/*
These hours can only be used to purchase used parts, bicycles and stand time.
Volunteers may only purchase one bike with volunteer hours per calendar year.
If you would like to spend more than $100 in volunteer hours during a calendar year,
75% of every dollar spent over $100 must be paid for with cash/credit card/check/etc
for volunteers who have volunteered fewer than 100 hours. For volunteers who have
donated more than 100 hours of their time in the past 365 days, this match can be reduced to 50%.
(Sweat Equity / Volunteer Benefits can't be combined with Membership Benefits.)
*/
if( !defined( 'SWEAT_EQUITY_LIMIT' ) ) define("SWEAT_EQUITY_LIMIT",100); // IN DOLLARS
if( !defined( 'MAX_BIKE_EARNED' ) ) define("MAX_BIKE_EARNED",1); // AMOUNT OF BIKES
if( !defined( 'VOLUNTEER_HOUR_VALUE' ) ) define("VOLUNTEER_HOUR_VALUE",8); // IN DOLLARS
if( !defined( 'VOLUNTEER_DISCOUNT' ) ) define("VOLUNTEER_DISCOUNT",25); // PERCENTAGE
if( !defined( 'SPECIAL_VOLUNTEER_HOURS_QUALIFICATION' ) ) define("SPECIAL_VOLUNTEER_HOURS_QUALIFICATION",100); // IN HOURS
if( !defined( 'SPECIAL_VOLUNTEER_DISCOUNT' ) ) define("SPECIAL_VOLUNTEER_DISCOUNT",50); // PERCENTAGE
// Customized sweat equity limit per contact_id
// e.g. for sweat equity limit of $200 for contact_id 500: array(500 => 200)
$custom_sweat_equity_limit = array();
// Determine if stand time behaviour will be based on the SWEAT_EQUITY_LIMIT with discounts applied,
// or 1 to 1 (1hr of volunteering === 1hr of free stand time) regardless of the SWEAT_EQUITY_LIMIT
define("REDEEM_ONE_TO_ONE", true);
// Map transaction_type_id for transaction to benefits;
// Bicycles and Stand Time are special transaction types for volunteers, but they should still be mapped if benefits are desired.
$transactions_with_volunteer_benefits = array( "Bicycles" => true,
"Stand Time" => true,
"Used Parts" => true
);
// Volunteer benefits take priority over membership benefits if patron qualifies for both
$transactions_with_membership_benefits = array( "Stand Time" => true,
"Used Parts" => true,
"New Parts" => true,
"Helmets" => true,
"Cargo Related" => true,
"Car Racks" => true
);
/*********
BANNED IDS
**********/
// Ban those pesky individuals who continually refuse to follow policies and safer space agreements by contact_id
$banned_individuals = array();
/************
PROBATION IDS
************/
// Put individuals under probation by contact_id. Probation could be used for a variety of scenarios,
// an individual who may potentially become banned, or who has been deemed as worthy of coming out of a ban,
// or someone who IOU's volunteer time for a bike they earned (generally, people should not be allowed to do
// this in the first place), etc.
$probation_individuals = array();
/******* /*******
CONTACTS CONTACTS
@ -36,10 +145,12 @@ CONTACTS
// Allow waiver (recommended) in Add/Edit Contacts; 1 = yes, 0 = no // Allow waiver (recommended) in Add/Edit Contacts; 1 = yes, 0 = no
// Waiver text may be modified in Connections/waiver.txt // Waiver text may be modified in Connections/waiver.txt
define("WAIVER", 1); if( !defined( 'WAIVER' ) ) define("WAIVER", 1);
if( !defined( 'WAIVER_LABEL' ) ) define("WAIVER_LABEL","Waiver of Liability and Safer Spaces Agreement:");
// Allow email_list option in Add/Edit Contacts; 1 = yes, 0 = no // Allow email_list option in Add/Edit Contacts; 1 = yes, 0 = no
define("EMAIL_LIST", 1); if( !defined( 'EMAIL_LIST' ) ) define("EMAIL_LIST", 1);
// Define a url for an email connector that will connect to an email list. // Define a url for an email connector that will connect to an email list.
// The url can be a server:port, program, etc. // The url can be a server:port, program, etc.
@ -48,20 +159,20 @@ define("EMAIL_LIST", 1);
// The purpose of email connectors is to provide autonomy in the choice // The purpose of email connectors is to provide autonomy in the choice
// of email services and programs. E.g. mailman, googlegroups // of email services and programs. E.g. mailman, googlegroups
// See ./examples for an example mailman connector // See ./examples for an example mailman connector
define("EMAIL_LIST_CONNECTOR","https://wvcompletestreets.org:9987"); if( !defined( 'EMAIL_LIST_CONNECTOR' ) ) define("EMAIL_LIST_CONNECTOR","https://wvcompletestreets.org:9987");
// Define the password that is unique to the connector. // Define the password that is unique to the connector.
define("EMAIL_LIST_CONNECTOR_PASSWORD","bikebike"); if( !defined( 'EMAIL_LIST_CONNECTOR_PASSWORD' ) ) define("EMAIL_LIST_CONNECTOR_PASSWORD","bikebike");
// If a self-signed ssl certificate that is associated with the email connector is being provided, // If a self-signed ssl certificate that is associated with the email connector is being provided,
// designate an absolute path, if not, change to false. // designate an absolute path, if not, change to false.
define("SSL_CERTIFICATE", "/var/www/html/examples/cert.pem"); if( !defined( 'SSL_CERTIFICATE' ) ) define("SSL_CERTIFICATE", "/var/www/html/examples/cert.pem");
//// "Volunteer Interest" form //// //// "Volunteer Interest" form ////
define("VOLUNTEER_INTEREST_FORM", true); if( !defined( 'VOLUNTEER_INTEREST_FORM' ) ) define("VOLUNTEER_INTEREST_FORM", true);
// Form name // Form name
define("VOLUNTEER_INTEREST_FORM_NAME","Volunteer Interests"); if( !defined( 'VOLUNTEER_INTEREST_FORM_NAME' ) ) define("VOLUNTEER_INTEREST_FORM_NAME","Volunteer Interests");
// NOTE: Introductory text can be modified in Connections/volunteer_interest_form_introduction.txt // NOTE: Introductory text can be modified in Connections/volunteer_interest_form_introduction.txt
@ -83,7 +194,7 @@ $volunteer_interests = array(
); );
// Provide a comment box - true of false // Provide a comment box - true of false
define("VOLUNTEER_INTEREST_COMMENTS", true); if( !defined( 'VOLUNTEER_INTEREST_COMMENTS' ) ) define("VOLUNTEER_INTEREST_COMMENTS", true);
// NOTE: The 2 variables ($volunteer_interest_changename & $volunteer_interests_deletename) // NOTE: The 2 variables ($volunteer_interest_changename & $volunteer_interests_deletename)
// below allow you to change or delete an interest. // below allow you to change or delete an interest.
@ -116,37 +227,40 @@ TRANSACTIONS
************/ ************/
// User defined constants - read sql/populate.sql for an explanation // User defined constants - read sql/populate.sql for an explanation
define("STORAGE_PERIOD", 14); if( !defined( 'STORAGE_PERIOD' ) ) define("STORAGE_PERIOD", 14);
define("ACCOUNTING_GROUP", "Sales"); if( !defined( 'ACCOUNTING_GROUP' ) ) define("ACCOUNTING_GROUP", "Sales");
define("DEFAULT_TRANSACTION_TYPE", "Sale - Used Parts"); if( !defined( 'DEFAULT_TRANSACTION_TYPE' ) ) define("DEFAULT_TRANSACTION_TYPE", "Sale - Used Parts");
// shop_user_role // shop_user_role
define("DEFAULT_SHOP_USER", "Personal"); if( !defined( 'DEFAULT_SHOP_USER' ) ) define("DEFAULT_SHOP_USER", "Stand Time");
/* Change Fund - A specific amount of money for the purpose of making change. /* Change Fund - A specific amount of money for the purpose of making change.
The amount on hand should remain the same at all times; The amount on hand should remain the same at all times;
therefore a change funds does not require replenishment. therefore a change funds does not require replenishment.
*/ */
define("CHANGE_FUND", 20); if( !defined( 'CHANGE_FUND' ) ) define("CHANGE_FUND", 20);
// How many hours should the shop be open from the time a person logins? Hours display in pulldown in shop_log.php // How many hours should the shop be open from the time a person logins? Hours display in pulldown in shop_log.php
// No overtime for volunteers. :) // No overtime for volunteers. :)
// shop will be current shop for the 24hr day yyyy-mm-dd (currently no check for hrs, only date) // shop will be current shop for the 24hr day yyyy-mm-dd (currently no check for hrs, only date)
define("SHOP_HOURS_LENGTH", 10); if( !defined( 'SHOP_HOURS_LENGTH' ) ) define("SHOP_HOURS_LENGTH", 10);
// What minute interval should be displayed for list_time()? In other words, the time_in and time_out pulldown lists.
// choose an interval that is divisible by 60 minutes, 1, 5, 15, 30 etc.
if( !defined( 'LIST_MINUTE_INTERVAL' ) ) define("LIST_MINUTE_INTERVAL", 1);
/* If you elect to keep records for non-shop hours, decide which shop should be used for that purpose. /* If you elect to keep records for non-shop hours, decide which shop should be used for that purpose.
The first shop created, 1, makes sense. A link will show in start_shop.php. The first shop created, 1, makes sense. A link will show in start_shop.php.
If you do not want this functionality at all, choose 0. If you do not want this functionality at all, choose 0.
*/ */
define("NONSHOP", 0); if( !defined( 'NONSHOP' ) ) define("NONSHOP", 0);
// How many transactions do you want shown by default // How many transactions do you want shown by default
define("NUMBER_OF_TRANSACTIONS", 11); if( !defined( 'NUMBER_OF_TRANSACTIONS' ) ) define("NUMBER_OF_TRANSACTIONS", 11);
// Define csv directory (see directions below for creating it) // Define csv directory (see directions below for creating it)
define("CSV_DIRECTORY","csv"); if( !defined( 'CSV_DIRECTORY' ) ) define("CSV_DIRECTORY","csv");
// Make a directory to store csv accounting files. Currently used for GnuCash format. // Make a directory to store csv accounting files. Currently used for GnuCash format.
// Assuming the root of the website, and directory is called csv, and a Debian-based distribution: // Assuming the root of the website, and directory is called csv, and a Debian-based distribution:
@ -156,7 +270,7 @@ define("CSV_DIRECTORY","csv");
// Define array mapping for Accounts. Usually Asset Accounts since Income is generally the main type of transaction. // Define array mapping for Accounts. Usually Asset Accounts since Income is generally the main type of transaction.
// Currently four types of accounts are supported: checking, credit, account_receivable, donation // Currently there are four types of accounts with checking and credit being supported (working): checking, credit, account_receivable, donation
// checking/credit = transaction has been 1) paid and is 2) cash & check [checking] or a credit card [credit] and 3) deposited // checking/credit = transaction has been 1) paid and is 2) cash & check [checking] or a credit card [credit] and 3) deposited
// note: checking type may include $0 transactions, e.g. earn-a-bike // note: checking type may include $0 transactions, e.g. earn-a-bike
// account_receivable = there is an 1). account receivable invoice and it has been 2) paid and 3) deposited // account_receivable = there is an 1). account receivable invoice and it has been 2) paid and 3) deposited
@ -180,24 +294,79 @@ $gnucash_accounts = array( "Assets:Current Assets:Checking Account" => "checking
// Note: Remote shops function independently via their IP identification. // Note: Remote shops function independently via their IP identification.
// //
// Normally, you will want this set at 0. // Normally, you will want this set at 0.
define('SHOW_SHOP_ID',0); if( !defined( 'SHOW_SHOP_ID' ) ) define('SHOW_SHOP_ID',0);
/*************
ETHERPAD LITE
**************/
// Allow comments/feedback/notes to be added per individual_history_log in reports,
// and globally in shop_log. An etherpad host has to be defined for this to work.
// See wiki for instructions on how to setup an etherpad docker instance or just go to
// https://github.com/fspc/etherpad-and-draw-node-alpine
//
// prefix allows you to set a prefix to the name of the autogenerated padId:
// etherpad = prefix + "pad_contact_id_" + contact_id;
// etherpad_global = prefix_ + "global_pad"
// See https://github.com/ether/etherpad-lite-jquery-plugin for information about other configurations.
$etherpad = array(
"host" => "",
"userName" => "PositiveSpin",
"noColors" => true,
"height" => "75%",
"plugins" => array()
);
$etherpad_global = array(
"host" => "",
"userName" => "PositiveSpin",
"noColors" => true,
"height" => "100%",
"plugins" => array()
);
// END OF USER DEFINED CONFIGURATIONS
if(file_exists( realpath($_SERVER["DOCUMENT_ROOT"]) . "/Connections/local_configurations.php")) {
require('local_configurations.php');
}
// other constants // other constants
define("PAGE_START_SHOP", "/start_shop.php"); if( !defined( 'PAGE_START_SHOP' ) ) define("PAGE_START_SHOP", "/start_shop.php");
define("PAGE_SHOP_LOG", "/shop_log.php"); if( !defined( 'PAGE_SHOP_LOG' ) ) define("PAGE_SHOP_LOG", "/shop_log.php");
define("PAGE_EDIT_CONTACT", "/contact_add_edit.php"); if( !defined( 'PAGE_EDIT_CONTACT' ) ) define("PAGE_EDIT_CONTACT", "/contact_add_edit.php");
define("PAGE_SELECT_CONTACT", "/contact_add_edit_select.php"); if( !defined( 'PAGE_SELECT_CONTACT' ) ) define("PAGE_SELECT_CONTACT", "/contact_add_edit_select.php");
define("PAGE_SHOP_LOG_DELETE_VISIT", "/shop_log_delete_shopvisitid.php"); if( !defined( 'PAGE_SHOP_LOG_DELETE_VISIT' ) ) define("PAGE_SHOP_LOG_DELETE_VISIT", "/shop_log_delete_shopvisitid.php");
define("INDIVIDUAL_HOURS_LOG", "/individual_hours_log.php"); if( !defined( 'INDIVIDUAL_HOURS_LOG' ) ) define("INDIVIDUAL_HOURS_LOG", "/individual_hours_log.php");
define("INDIVIDUAL_HISTORY_LOG", "/individual_history_log.php"); if( !defined( 'INDIVIDUAL_HISTORY_LOG' ) ) define("INDIVIDUAL_HISTORY_LOG", "/individual_history_log.php");
define("PAGE_SALE_LOG", "/transaction_log.php"); if( !defined( 'PAGE_SALE_LOG' ) ) define("PAGE_SALE_LOG", "/transaction_log.php");
define("PAGE_EDIT_LOCATION", "/location_add_edit.php"); if( !defined( 'PAGE_EDIT_LOCATION' ) ) define("PAGE_EDIT_LOCATION", "/location_add_edit.php");
define("PAGE_SELECT_LOCATION", "/location_add_edit_select.php"); if( !defined( 'PAGE_SELECT_LOCATION' ) ) define("PAGE_SELECT_LOCATION", "/location_add_edit_select.php");
// Highlight search results in transaction_log
function highlightKeywords($text, $keyword) {
$wordsAry = explode(" ", $keyword);
$wordsCount = count($wordsAry);
// Using REGEXP, this removes regex from search
$find = array('/[\*\.\$\^\?\+\[\]\|\(\)\,\{\}\:\\\]/');
$replace = array('');
for($i=0;$i<$wordsCount;$i++) {
$wordsAry[$i] = preg_replace($find, $replace, $wordsAry[$i]);
$highlighted_text = "<span style='color:black; background:#ffeb3bc7; box-shadow:2px 0 #ffeb3bc7, -2px 0 0 #ffeb3bc7; padding: 0px 0;'>$wordsAry[$i]</span>";
$text = str_ireplace($wordsAry[$i], $highlighted_text, $text);
//$text = str_replace($wordsAry[$i], $highlighted_text, $text);
}
return $text;
}
//This is a general function to generate the contents of a list box based on a MySQL query. All necessary parameters for the query are passed //This is a general function to generate the contents of a list box based on a MySQL query. All necessary parameters for the query are passed
function generate_list($querySQL,$list_value,$list_text, $form_name, $default_value) function generate_list($querySQL,$list_value,$list_text, $form_name, $default_value, $color)
{ {
global $database_YBDB, $YBDB; global $database_YBDB, $YBDB;
mysql_select_db($database_YBDB, $YBDB); mysql_select_db($database_YBDB, $YBDB);
@ -218,7 +387,8 @@ function generate_list($querySQL,$list_value,$list_text, $form_name, $default_va
if( $default_value == $row_recordset[$list_value]){ if( $default_value == $row_recordset[$list_value]){
$default_delimiter = 'selected="selected"'; $default_delimiter = 'selected="selected"';
} else { $default_delimiter = '';} } else { $default_delimiter = '';}
echo '<option value="' . $row_recordset[$list_value] . '"' . $default_delimiter .'>' . $row_recordset[$list_text] . '</option>\n'; echo '<option style="color:' . $color . ';" value="' . $row_recordset[$list_value] . '" ' . $default_delimiter . '>' .
$row_recordset[$list_text] . '</option>';
} while ($row_recordset = mysql_fetch_assoc($recordset)); } while ($row_recordset = mysql_fetch_assoc($recordset));
$rows = mysql_num_rows($recordset); $rows = mysql_num_rows($recordset);
if($rows > 0) { if($rows > 0) {
@ -232,7 +402,7 @@ function generate_list($querySQL,$list_value,$list_text, $form_name, $default_va
} }
function list_CurrentShopUsers($form_name = "none", $default_value = "", $max_name_length = 20){ function list_CurrentShopUsers($form_name = "none", $default_value = "", $max_name_length = 20 ){
$current_shop = current_shop_by_ip(); $current_shop = current_shop_by_ip();
$querySQL = "SELECT DISTINCT full_name, shop_hours.contact_id ,hidden FROM shop_hours $querySQL = "SELECT DISTINCT full_name, shop_hours.contact_id ,hidden FROM shop_hours
LEFT JOIN (SELECT LEFT(CONCAT(last_name, ', ', first_name, ' ',middle_initial),$max_name_length) LEFT JOIN (SELECT LEFT(CONCAT(last_name, ', ', first_name, ' ',middle_initial),$max_name_length)
@ -248,7 +418,7 @@ function list_CurrentShopUsers($form_name = "none", $default_value = "", $max_na
// Drop down list queries - functions below could be made into one function if query, $list_value and $list_text parameters were passed // Drop down list queries - functions below could be made into one function if query, $list_value and $list_text parameters were passed
// Function provides specific MySQL parameters to the function that generates the list box code // Function provides specific MySQL parameters to the function that generates the list box code
function list_contacts($form_name = "none", $default_value = "", $max_name_length = 20){ function list_contacts($form_name = "none", $default_value = "", $max_name_length = 30 ){
$querySQL = "SELECT LEFT(CONCAT(last_name, ', ', first_name, ' ',middle_initial),$max_name_length) AS full_name, contact_id, hidden FROM contacts WHERE (first_name <> '' OR last_name <> '') AND hidden <> 1 ORDER BY last_name, first_name, middle_initial"; $querySQL = "SELECT LEFT(CONCAT(last_name, ', ', first_name, ' ',middle_initial),$max_name_length) AS full_name, contact_id, hidden FROM contacts WHERE (first_name <> '' OR last_name <> '') AND hidden <> 1 ORDER BY last_name, first_name, middle_initial";
$list_value = "contact_id"; $list_value = "contact_id";
$list_text = "full_name"; $list_text = "full_name";
@ -256,7 +426,7 @@ function list_contacts($form_name = "none", $default_value = "", $max_name_lengt
} }
function list_coordinators($form_name = "none", $default_value = "", $max_name_length = 20){ function list_coordinators($form_name = "none", $default_value = "", $max_name_length = 20 ){
$querySQL = "SELECT LEFT(CONCAT(last_name, ', ', first_name, ' ',middle_initial),40) AS full_name, contacts.contact_id, hidden, shop_user_role FROM contacts $querySQL = "SELECT LEFT(CONCAT(last_name, ', ', first_name, ' ',middle_initial),40) AS full_name, contacts.contact_id, hidden, shop_user_role FROM contacts
LEFT JOIN (SELECT contact_id, shop_user_role, sales FROM shop_hours LEFT JOIN (SELECT contact_id, shop_user_role, sales FROM shop_hours
LEFT JOIN shop_user_roles ON shop_user_roles.shop_user_role_id = shop_hours.shop_user_role LEFT JOIN shop_user_roles ON shop_user_roles.shop_user_role_id = shop_hours.shop_user_role
@ -269,7 +439,7 @@ ORDER BY last_name, first_name, middle_initial;";
generate_list($querySQL,$list_value,$list_text,$form_name, $default_value); generate_list($querySQL,$list_value,$list_text,$form_name, $default_value);
} }
function list_current_coordinators($form_name = "none", $default_value = "", $max_name_length = 20){ function list_current_coordinators($form_name = "none", $default_value = "", $max_name_length = 20 ){
$current_shop = current_shop_by_ip(); $current_shop = current_shop_by_ip();
$querySQL = "SELECT LEFT(CONCAT(last_name, ', ', first_name, ' ',middle_initial),40) AS full_name, contacts.contact_id, hidden, shop_user_role FROM contacts $querySQL = "SELECT LEFT(CONCAT(last_name, ', ', first_name, ' ',middle_initial),40) AS full_name, contacts.contact_id, hidden, shop_user_role FROM contacts
LEFT JOIN (SELECT contact_id, shop_user_role, sales FROM shop_hours LEFT JOIN shop_user_roles ON shop_user_roles.shop_user_role_id = shop_hours.shop_user_role WHERE shop_user_roles.sales = 1 AND shop_id = $current_shop GROUP BY contact_id) as shop_hours ON shop_hours.contact_id=contacts.contact_id LEFT JOIN (SELECT contact_id, shop_user_role, sales FROM shop_hours LEFT JOIN shop_user_roles ON shop_user_roles.shop_user_role_id = shop_hours.shop_user_role WHERE shop_user_roles.sales = 1 AND shop_id = $current_shop GROUP BY contact_id) as shop_hours ON shop_hours.contact_id=contacts.contact_id
@ -323,7 +493,7 @@ function list_shop_locations($form_name = "none", $default_value = ""){
// Function provides specific MySQL parameters to the function that generates the list box code // Function provides specific MySQL parameters to the function that generates the list box code
function list_transaction_types($form_name = "none", $default_value = ""){ function list_transaction_types($form_name = "none", $default_value = ""){
$querySQL = "SELECT transaction_type_id FROM transaction_types ORDER BY rank + 0;"; $querySQL = "SELECT transaction_type_id FROM transaction_types WHERE active = 1 ORDER BY rank + 0;";
$list_value = "transaction_type_id"; $list_value = "transaction_type_id";
$list_text = "transaction_type_id"; $list_text = "transaction_type_id";
generate_list($querySQL,$list_value,$list_text,$form_name, $default_value); generate_list($querySQL,$list_value,$list_text,$form_name, $default_value);
@ -336,7 +506,19 @@ function list_donation_types($form_name = "none", $default_value = ""){
generate_list($querySQL,$list_value,$list_text,$form_name, $default_value); generate_list($querySQL,$list_value,$list_text,$form_name, $default_value);
} }
function list_donation_locations($form_name = "none", $default_value = "", $max_name_length = 20){ // now combined with list_CurrentShopUsers
function list_donation_locations($form_name = "none", $default_value = "", $max_name_length = 20 ){
$current_shop = current_shop_by_ip();
$querySQL = "SELECT DISTINCT full_name, shop_hours.contact_id ,hidden FROM shop_hours
LEFT JOIN (SELECT LEFT(CONCAT(last_name, ', ', first_name, ' ',middle_initial),$max_name_length)
AS full_name, contact_id, hidden FROM contacts) as contacts ON shop_hours.contact_id=contacts.contact_id
WHERE shop_hours.shop_id = $current_shop
ORDER BY full_name;";
$list_value = "contact_id";
$list_text = "full_name";
$color = "blue";
generate_list($querySQL,$list_value,$list_text,$form_name, $default_value, $color);
$querySQL = "SELECT LEFT(CONCAT(last_name, ', ', first_name, ' ',middle_initial),$max_name_length) AS full_name, $querySQL = "SELECT LEFT(CONCAT(last_name, ', ', first_name, ' ',middle_initial),$max_name_length) AS full_name,
location_name, contact_id FROM contacts WHERE location_type IS NULL ORDER BY location_name"; location_name, contact_id FROM contacts WHERE location_type IS NULL ORDER BY location_name";
$list_value = "contact_id"; $list_value = "contact_id";
@ -370,6 +552,28 @@ function currency_format($value, $places = 2){
else echo number_format($value,$places); else echo number_format($value,$places);
} }
// function to set time zone in mysql.
// Time zones must be setup in mysql for this to work: mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
set_time_zone();
function set_time_zone() {
global $database_YBDB, $YBDB;
mysql_select_db($database_YBDB, $YBDB);
$query = "SET time_zone='" . TIMEZONE . "';";
$Recordset1 = mysql_query($query, $YBDB);
$error = "<p>YBDB relies heavily on accurate time calculations.</p>" .
"<p>Make sure you have installed time zone support for mysql or mariadb as explained " .
'<a href="https://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html">here</a>.<br> ' .
"In GNU/Linux you run the mysql_tzinfo_to_sql program from the commandline:</p>" .
"<code>mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql.</code>";
if(!$Recordset1) {
echo mysql_error() . "\n" . $error;
}
}
//function to convert server time to local time. To be used by all other current date / time requests. //function to convert server time to local time. To be used by all other current date / time requests.
function local_datetime(){ function local_datetime(){
date_default_timezone_set(TIMEZONE); date_default_timezone_set(TIMEZONE);
@ -463,12 +667,53 @@ function list_15min($start_time, $start_offset_min, $form_name, $hours, $display
} }
// replacement for the hardwired list_min15()
// $start_time = time_in
// $start_offset_min = 0
// $form_name = time_out
// $hours = 0
// $display_elapsed_hours = 1
// $default_value = $row_Recordset1['time_out']
function list_min($start_time, $start_offset_min, $form_name, $hours, $display_elapsed_hours, $default_value, $min=15){
list($date, $time) = split('[ ]', $start_time);
list($Y, $m, $d) = split('[-]', $date);
list($H, $i, $s) = split('[:]', $time);
//$min_inc is used to round round to nearest 15min
$min_inc = $min - intval($i) % $min;
$start_time = mktime($H, $i, 0, $m,$d,$Y) + $min_inc * 60 + $start_offset_min*60 ;
//$start_time_am = date("H:i a", mktime($H, $i, $s, 1,1,2000));
echo "<select name=\"$form_name\">";
if($default_value <> "none" && $default_value <> "0000-00-00 00:00:00"){
//if a default value is requested it is displayed at the top of the list
echo '<option value="' . $default_value . '">' . date_to_time($default_value) . '</option>';
}
if (current_date() == $date) {
// if current date does not match shop date current date will no be an option
echo '<option value="current_time">Current Time</option>';
echo '<option value="current_time">--------------------</option>';
}
for ($j = 0; $j <= $hours* (60 / $min); $j++) {
$list_time = $start_time + $j*$min*60;
if ($display_elapsed_hours == 1) {
$elapsed_hours = " &nbsp;&nbsp;[" . date("G:i",mktime(0, 0, 0, 1,1,2000) + ($j+1)*$min*60). " hrs]";
} else {
$elapsed_hours = "";
}
$list_time_return = date("Y-m-d H:i:s", $list_time);
$list_time_display = date("g:i a", $list_time). $elapsed_hours;
echo "<option value=\"". $list_time_return ."\">" . $list_time_display . "</option>";
}
echo "</select>";
}
function list_time($time_list_start, $time, $form_name = "none", $start_offset_min = 0 , $display_elapsed_hours = 0, $default_value = "none", $hours_listed = 8, $et = ""){ function list_time($time_list_start, $time, $form_name = "none", $start_offset_min = 0 , $display_elapsed_hours = 0, $default_value = "none", $hours_listed = 8, $et = ""){
if($time == "0000-00-00 00:00:00" || $default_value <> "none"){ if($time == "0000-00-00 00:00:00" || $default_value <> "none"){
//create drop down //create drop down
//echo list_15min("0000-00-00 01:20:00", 4, "frm_time_out" ); //echo list_15min("0000-00-00 01:20:00", 4, "frm_time_out" );
echo list_15min($time_list_start,$start_offset_min, $form_name, $hours_listed, $display_elapsed_hours, $default_value ); echo list_min($time_list_start,$start_offset_min, $form_name, $hours_listed, $display_elapsed_hours, $default_value, LIST_MINUTE_INTERVAL);
} else { } else {
//list time out //list time out
echo date_to_time($time) . "&nbsp;&nbsp;[{$et} hrs]"; echo date_to_time($time) . "&nbsp;&nbsp;[{$et} hrs]";
@ -478,7 +723,7 @@ function list_time($time_list_start, $time, $form_name = "none", $start_offset_m
function sign_out($time_out, $first_name){ function sign_out($time_out, $first_name){
if($time_out == "0000-00-00 00:00:00"){ if($time_out == "0000-00-00 00:00:00"){
echo '<input type="submit" name="submit" value="Sign Out: ' . $first_name . '" />'; echo '<input type="submit" name="submit" class="sign_out" value="Sign Out: ' . $first_name . '" />';
} }
} }
@ -521,6 +766,13 @@ function dateandtimein($date, $time){
// Drop-Down lists // Drop-Down lists
function list_contacts_select_contact($form_name = "contact_id", $default_value = "")
{
echo "<select name={$form_name} class='yb_standard'>\n";
echo "<option value='everyone'>Everyone</option>\n";
list_contacts("none",$default_value);
echo "</select>\n";
}
function list_contacts_edit_add($form_name = "contact_id", $default_value = "") function list_contacts_edit_add($form_name = "contact_id", $default_value = "")
{ {
@ -633,16 +885,26 @@ function max_shop_id(){
} }
// Is there currently a shop? // Is there currently a shop?
// curl https://ipinfo.io/ip
function current_shop_by_ip(){ function current_shop_by_ip(){
global $database_YBDB, $YBDB; global $database_YBDB, $YBDB;
$IP = $_SERVER['REMOTE_ADDR']; $IP = $_SERVER['REMOTE_ADDR'];
$current_date = current_date(); $current_date = current_date();
mysql_select_db($database_YBDB, $YBDB); mysql_select_db($database_YBDB, $YBDB);
$query_Recordset1 = "SELECT shop_id FROM shops WHERE ip_address = '{$IP}' AND date = '{$current_date}' ORDER BY shop_id DESC;";
if( IP == "default") {
$query_Recordset1 = "SELECT shop_id FROM shops WHERE ip_address = '{$IP}' AND date REGEXP '^{$current_date} ' ORDER BY shop_id DESC;";
$Recordset1 = mysql_query($query_Recordset1, $YBDB) or die(mysql_error()); $Recordset1 = mysql_query($query_Recordset1, $YBDB) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1); $row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1); $totalRows_Recordset1 = mysql_num_rows($Recordset1);
} else {
$ip = IP;
$query_Recordset1 = "SELECT shop_id FROM shops WHERE ip_address REGEXP '^{$ip}' AND date REGEXP '^{$current_date} ' ORDER BY shop_id DESC;";
$Recordset1 = mysql_query($query_Recordset1, $YBDB) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
}
return $row_Recordset1['shop_id']; return $row_Recordset1['shop_id'];
} }

View File

@ -1,7 +1,9 @@
I, and my heirs, in consideration of my participation with Positive Spin <h2>Waiver of Liability</h2>
<p>I, and my heirs, in consideration of my participation with Positive Spin
Incorporated hereby release Positive Spin Incorporated, its officers, directors Incorporated hereby release Positive Spin Incorporated, its officers, directors
and agents, and any other people officially connected with this organization, and agents, and any other people officially connected with this organization,
from any and all liability for damage to or loss of personal property, sickness, or injury from whatever source, legal entanglements, imprisonment, death, or from any and all liability for damage to or loss of personal property, sickness,
or injury from whatever source, legal entanglements, imprisonment, death, or
loss of money, which might occur while participating in said loss of money, which might occur while participating in said
event/activity/class. Specifically, I release Positive Spin Incorporated from event/activity/class. Specifically, I release Positive Spin Incorporated from
any liability or responsibility for my personal well-being, condition of tools any liability or responsibility for my personal well-being, condition of tools
@ -15,3 +17,17 @@ participation in this program is strictly voluntary and I freely chose to
participate. I understand Positive Spin Incorporated does not provide medical participate. I understand Positive Spin Incorporated does not provide medical
coverage for me. I verify that I will be responsible for any medical costs I coverage for me. I verify that I will be responsible for any medical costs I
incur as a result of my participation. incur as a result of my participation.
</p>
<h2>Positive Spin's Safer Space Agreement</h2>
<p>As visitors or volunteers at Positive Spin, we agree to maintain a safer space.
A safer space is an inclusive environment in which everyone can feel welcome,
where no one is shown favoritism, and everyone can feel safe from oppressive,
discriminatory and hateful behavior and language. This includes, but is not limited to,
physical and verbal abuse, sexual harassment, or discrimination based on race, culture,
age, sex, gender identity, sexual orientation, religion, political beliefs, physical characteristics, disabilities, social or economic background.
</p>
<p>If you feel anyone is not abiding by this agreement, please tell a volunteer or
constructively confront the individual yourself. If behavior that violates this agreement persists,
it can potentially lead to being banned from Positive Spin.
</p>

674
LICENSE Normal file
View File

@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

View File

@ -1,7 +1,14 @@
#Yellow-Bike-Database # Yellow-Bike-Database
**Development Branch of Yellow Bike Project Hours and Transaction Database** Yellow Bike Database (YBDB) is a specialized software for Community Bike Shops (CBS). It is one of the most, if not the most mature solutions currently available for CBSes. Originally, developed for the Austin Yellow Bike Project, this software fork has taken on a life of its own, borrowing on the simplicity of the original software but adding many enhancements to lessen the learning curve, and bring it into the 21st century!
The basic objective here since Yellow Bike Project does not host their own version control repository, at least until recently (on December 29, 2014 a repository was [setup](https://github.com/nwilkes2/CommunityBikeShopDB)), is to keep Main pristine, and do development work here, on the assumption that they may want to commit new changes. This branch is being used by [YBDB](https://github.com/fspc/ybdb), the BikeBike Docker image. In 2014, Positive Spin of Morgantown, WV in the USA was looking for a way to replace the messy, ineffective, and highly error-prone paper based record system used by the shop. Docker images were created to
[test out and explore](https://bike.bikelover.org) what few projects could be found at the time. YBDB stood out, not because of its appearance, but because of how closely its approach mirrored the paper based recording system used by Positive Spin.
There is a demo at [http://ybdb.wvcompletestreets.org](http://ybdb.wvcompletestreets.org). Try it out! It was a successful choice, and continues to improve! You can read more about the FLOSS process at [bikecollectives.org in this presentation](https://www.bikecollectives.org/wiki/images/1/1e/2017-SE-BikeBike-Libre-slides.pdf).
There is a demo at [https://ybdb.bikelover.org](https://ybdb.bikelover.org). Try it out!
Docker Development is at [https://github.com/fspc/ybdb](https://github.com/fspc/ybdb).
Check out the [Wiki](https://github.com/fspc/Yellow-Bike-Database/wiki)!

View File

@ -10,6 +10,7 @@ $handler->start();*/
$waiver = WAIVER; $waiver = WAIVER;
$waiver_label = WAIVER_LABEL;
$email_list = EMAIL_LIST; $email_list = EMAIL_LIST;
$volunteer_interest_form = VOLUNTEER_INTEREST_FORM; $volunteer_interest_form = VOLUNTEER_INTEREST_FORM;
$volunteer_interest_form_name = VOLUNTEER_INTEREST_FORM_NAME; $volunteer_interest_form_name = VOLUNTEER_INTEREST_FORM_NAME;
@ -103,10 +104,11 @@ if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
$sql = mysql_query($query, $YBDB) or die(mysql_error()); $sql = mysql_query($query, $YBDB) or die(mysql_error());
$result = mysql_fetch_assoc($sql); $result = mysql_fetch_assoc($sql);
$submitted_contact_id = $result['contact_id'] + 1; $submitted_contact_id = $result['contact_id'] + 1;
$current_date_time = GetSQLValueString('current_time', "date");
// Insert new contact information into a new record // Insert new contact information into a new record
$updateSQL = 'INSERT INTO contacts (contact_id, first_name, middle_initial, last_name, email,' . $updateSQL = 'INSERT INTO contacts (contact_id, first_name, middle_initial, last_name, email,' .
' phone, address1, address2, city, state, DOB, receive_newsletter, waiver, pass, zip)' . ' phone, address1, address2, city, state, DOB, receive_newsletter, waiver, pass, zip, date_created)' .
' VALUES (' . ' VALUES (' .
$submitted_contact_id . ', ' . $submitted_contact_id . ', ' .
'"' . $_POST['first_name'] . '", ' . '"' . $_POST['first_name'] . '", ' .
@ -122,7 +124,8 @@ if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
'"' . $_POST['email_list'] . '", ' . '"' . $_POST['email_list'] . '", ' .
1 . ', ' . 1 . ', ' .
'ENCODE("' . $_POST['password'] . '",' . '"yblcatx"), ' . 'ENCODE("' . $_POST['password'] . '",' . '"yblcatx"), ' .
'"' . $_POST['zip'] . '");'; '"' . $_POST['zip'] . '", ' .
$current_date_time . ');';
} else { } else {
// Update existing contact record // Update existing contact record
@ -270,7 +273,8 @@ $totalRows_Recordset1 = mysql_num_rows($Recordset1);
<td><label class="contacts">Name:</label></td> <td><label class="contacts">Name:</label></td>
<td><input id="first_name" type="text" name="first_name" value="<?php echo $row_Recordset1['first_name']; ?>" size="32"> <td><input id="first_name" type="text" name="first_name" value="<?php echo $row_Recordset1['first_name']; ?>" size="32">
<span id="first_name_error"></span> <span id="first_name_error"></span>
<input name="middle_initial" type="text" value="<?php echo $row_Recordset1['middle_initial']; ?>" size="1" maxlength="1"> <input id="middle_initial" name="middle_initial" type="text" value="<?php echo $row_Recordset1['middle_initial']; ?>" size="1" maxlength="1">
<span id="middle_initial_error"></span>
<input id="last_name" type="text" name="last_name" value="<?php echo $row_Recordset1['last_name']; ?>" size="32"> <input id="last_name" type="text" name="last_name" value="<?php echo $row_Recordset1['last_name']; ?>" size="32">
<span id="last_name_error"></span> <span id="last_name_error"></span>
</td> </td>
@ -329,14 +333,14 @@ $totalRows_Recordset1 = mysql_num_rows($Recordset1);
</tr> </tr>
<?php if($waiver) { ?> <?php if($waiver) { ?>
<tr> <tr>
<td><label class="contacts">Waiver of Liability:</label></td> <td><label class="contacts"><?php echo $waiver_label; ?></label></td>
<td> <div id="waiver"> <td> <div id="waiver">
<p> <p>
<?php include("Connections/waiver.txt"); ?> <?php include("Connections/waiver.txt"); ?>
<br /> <br />
</p> </p>
</div><input id="waiver_checkbox" name="waiver_checkbox" type="checkbox"> I agree <span id="waiver_error"></span> </div><input id="waiver_checkbox" name="waiver_checkbox" type="checkbox"> I agree <span id="waiver_error"></span>
<input type="submit" id="waiver_button" value="Show Waiver" \> <input type="submit" id="waiver_button" value="Show Complete Text" \>
</td> </td>
</tr> </tr>

View File

@ -96,3 +96,5 @@ if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
</tr> </tr>
</table> </table>
<?php include("include_footer.html"); ?>

View File

@ -41,7 +41,8 @@
font-weight: bold; font-weight: bold;
} }
.yb_heading3red { .yb_heading3red {
color: #FF0000; //color: #FF0000;
color: blue;
background-color: #FFFFFF; background-color: #FFFFFF;
font-weight: bold; font-weight: bold;
} }
@ -79,3 +80,19 @@
color: #FF0000; color: #FF0000;
background-color: #FFFFFF; background-color: #FFFFFF;
} }
.footer {
text-align: center;
margin: 20px 0 5px;
font-size: 85%;
color: #999;
}
.footer-line a {
text-decoration: none;
color: #cc3334;
}
.footer-line a:hover {
text-decoration: underline;
}

86
css/pickmeup.css Normal file
View File

@ -0,0 +1,86 @@
/**
* @package PickMeUp - jQuery datepicker plugin
* @author Nazar Mokrynskyi <nazar@mokrynskyi.com>
* @author Stefan Petre <www.eyecon.ro>
* @copyright Copyright (c) 2013-2015, Nazar Mokrynskyi
* @copyright Copyright (c) 2008-2009, Stefan Petre
* @license MIT License, see license.txt
*/
.pickmeup {
background: #000;
border-radius: 0.4em;
-moz-box-sizing: content-box;
box-sizing: content-box;
display: none;
position: absolute; }
.pickmeup * {
-moz-box-sizing: border-box;
box-sizing: border-box; }
.pickmeup .pmu-instance {
display: inline-block;
height: 13.8em;
padding: .5em;
text-align: center;
width: 15em; }
.pickmeup .pmu-instance .pmu-button {
color: #eee;
cursor: pointer;
outline: none;
text-decoration: none; }
.pickmeup .pmu-instance .pmu-today {
background: #17384d;
color: #88c5eb; }
.pickmeup .pmu-instance .pmu-button:hover {
background: "transparent";
color: #88c5eb; }
.pickmeup .pmu-instance .pmu-not-in-month {
color: #666; }
.pickmeup .pmu-instance .pmu-disabled,
.pickmeup .pmu-instance .pmu-disabled:hover {
color: #333;
cursor: default; }
.pickmeup .pmu-instance .pmu-selected {
background: #136a9f;
color: #eee; }
.pickmeup .pmu-instance .pmu-not-in-month.pmu-selected {
background: #17384d; }
.pickmeup .pmu-instance nav {
color: #eee;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
line-height: 2em; }
.pickmeup .pmu-instance nav *:first-child :hover {
color: #88c5eb; }
.pickmeup .pmu-instance nav .pmu-prev,
.pickmeup .pmu-instance nav .pmu-next {
display: none;
height: 2em;
width: 1em; }
.pickmeup .pmu-instance nav .pmu-month {
width: 14em; }
.pickmeup .pmu-instance .pmu-years *,
.pickmeup .pmu-instance .pmu-months * {
display: inline-block;
line-height: 3.6em;
width: 3.5em; }
.pickmeup .pmu-instance .pmu-day-of-week {
color: #999;
cursor: default; }
.pickmeup .pmu-instance .pmu-day-of-week *,
.pickmeup .pmu-instance .pmu-days * {
display: inline-block;
line-height: 1.5em;
width: 2em; }
.pickmeup .pmu-instance .pmu-day-of-week * {
line-height: 1.8em; }
.pickmeup .pmu-instance:first-child .pmu-prev,
.pickmeup .pmu-instance:last-child .pmu-next {
display: block; }
.pickmeup .pmu-instance:first-child .pmu-month,
.pickmeup .pmu-instance:last-child .pmu-month {
width: 13em; }
.pickmeup .pmu-instance:first-child:last-child .pmu-month {
width: 12em; }
.pickmeup:not(.pmu-view-days) .pmu-days, .pickmeup:not(.pmu-view-days) .pmu-day-of-week, .pickmeup:not(.pmu-view-months) .pmu-months, .pickmeup:not(.pmu-view-years) .pmu-years {
display: none; }

69
css/stats.css Normal file
View File

@ -0,0 +1,69 @@
.stats td {
padding: 0px 10px 0px 10px;
}
#status_totals, #community_service_hours, #shops, #members, #dhhr_hours{
height: 36px;
width: 98px;
font-size: x-large;
color:green;
}
.stats-clear:after,.stats-clear:before,.stats-bar {
content:"";
display:table;
clear:both;
}
.nextprev a {
font-size:17px;
border:1px solid #cccccc;
}
.nextprev a:link,.nextprev a:visited {
background-color:#ffffff;
color:#000000;
}
.nextprev a.stats-right {
background-color:#4CAF50;
color:#ffffff;
border-color:#4CAF50
}
.stats-btn,.stats-button {
border:none;
display:inline-block;
outline:0;
padding:8px 16px;
vertical-align:middle;
overflow:hidden;
text-decoration:none;
color:inherit;
background-color:inherit;
text-align:center;
cursor:pointer;
white-space:nowrap
}
.stats-btn:hover {
box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19);
}
.stats-btn,.stats-button {
-webkit-touch-callout:none;
-webkit-user-select:none;
-khtml-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none;
}
.stats-disabled,.stats-btn:disabled,.stats-button:disabled {
cursor:not-allowed;opacity:0.3;
}
.stats-disabled *,:disabled *{
pointer-events:none;
}
.stats-btn.stats-disabled:hover,.stats-btn:disabled:hover {
box-shadow:none;
}
/*
.stats-left{float:left!important}
.stats-right{float:right!important}
*/

View File

@ -0,0 +1,574 @@
/* Tabulator v3.3.1 (c) Oliver Folkerd */
.tabulator {
position: relative;
background-color: #fff;
overflow: hidden;
font-size: 14px;
text-align: left;
width: 100%;
max-width: 100%;
margin-bottom: 20px;
-ms-transform: translatez(0);
transform: translatez(0);
}
.tabulator[tabulator-layout="fitDataFill"] .tabulator-tableHolder .tabulator-table {
min-width: 100%;
}
.tabulator.tabulator-block-select {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.tabulator .tabulator-header {
position: relative;
box-sizing: border-box;
width: 100%;
border-bottom: 2px solid #ddd;
background-color: #fff;
font-weight: bold;
white-space: nowrap;
overflow: hidden;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
}
.tabulator .tabulator-header .tabulator-col {
display: inline-block;
position: relative;
box-sizing: border-box;
background-color: #fff;
text-align: left;
vertical-align: bottom;
overflow: hidden;
}
.tabulator .tabulator-header .tabulator-col.tabulator-moving {
position: absolute;
border: 1px solid #ddd;
background: #e6e6e6;
pointer-events: none;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content {
position: relative;
padding: 8px;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title {
box-sizing: border-box;
width: 100%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
vertical-align: bottom;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title .tabulator-title-editor {
box-sizing: border-box;
width: 100%;
border: 1px solid #999;
padding: 1px;
background: #fff;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-arrow {
display: inline-block;
position: absolute;
top: 14px;
right: 8px;
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid #bbb;
}
.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols {
position: relative;
display: -ms-flexbox;
display: flex;
border-top: 1px solid #ddd;
overflow: hidden;
}
.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols .tabulator-col:last-child {
margin-right: -1px;
}
.tabulator .tabulator-header .tabulator-col:first-child .tabulator-col-resize-handle.prev {
display: none;
}
.tabulator .tabulator-header .tabulator-col.ui-sortable-helper {
position: absolute;
background-color: #e6e6e6 !important;
border: 1px solid #ddd;
}
.tabulator .tabulator-header .tabulator-col .tabulator-header-filter {
position: relative;
box-sizing: border-box;
margin-top: 2px;
width: 100%;
text-align: center;
}
.tabulator .tabulator-header .tabulator-col .tabulator-header-filter textarea {
height: auto !important;
}
.tabulator .tabulator-header .tabulator-col .tabulator-header-filter svg {
margin-top: 3px;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title {
padding-right: 25px;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable:hover {
cursor: pointer;
background-color: #e6e6e6;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="none"] .tabulator-col-content .tabulator-arrow {
border-top: none;
border-bottom: 6px solid #bbb;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="asc"] .tabulator-col-content .tabulator-arrow {
border-top: none;
border-bottom: 6px solid #666;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="desc"] .tabulator-col-content .tabulator-arrow {
border-top: 6px solid #666;
border-bottom: none;
}
.tabulator .tabulator-header .tabulator-frozen {
display: inline-block;
position: absolute;
z-index: 10;
}
.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left {
border-right: 2px solid #ddd;
}
.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-right {
border-left: 2px solid #ddd;
}
.tabulator .tabulator-header .tabulator-calcs-holder {
box-sizing: border-box;
width: 100%;
background: white !important;
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
overflow: hidden;
}
.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row {
background: white !important;
}
.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle {
display: none;
}
.tabulator .tabulator-tableHolder {
position: relative;
width: 100%;
white-space: nowrap;
overflow: auto;
-webkit-overflow-scrolling: touch;
}
.tabulator .tabulator-tableHolder:focus {
outline: none;
}
.tabulator .tabulator-tableHolder .tabulator-placeholder {
position: absolute;
box-sizing: border-box;
display: -ms-flexbox;
display: flex;
-ms-flex-align: center;
align-items: center;
top: 0;
left: 0;
height: 100%;
width: 100%;
}
.tabulator .tabulator-tableHolder .tabulator-placeholder span {
display: inline-block;
margin: 0 auto;
padding: 10px;
color: #000;
font-weight: bold;
font-size: 20px;
}
.tabulator .tabulator-tableHolder .tabulator-table {
position: relative;
display: inline-block;
background-color: #fff;
white-space: nowrap;
overflow: visible;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs {
font-weight: bold;
background: #ececec !important;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-top {
border-bottom: 2px solid #ddd;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-bottom {
border-top: 2px solid #ddd;
}
.tabulator .tabulator-row {
position: relative;
box-sizing: border-box;
min-height: 30px;
background-color: #fff;
border-bottom: 1px solid #ddd;
}
.tabulator .tabulator-row.tabulator-selectable:hover {
background-color: #f5f5f5 !important;
cursor: pointer;
}
.tabulator .tabulator-row.tabulator-selected {
background-color: #9ABCEA;
}
.tabulator .tabulator-row.tabulator-selected:hover {
background-color: #769BCC;
cursor: pointer;
}
.tabulator .tabulator-row.tabulator-moving {
position: absolute;
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
pointer-events: none !important;
z-index: 15;
}
.tabulator .tabulator-row .tabulator-frozen {
display: inline-block;
position: absolute;
background-color: inherit;
z-index: 10;
}
.tabulator .tabulator-row .tabulator-frozen.tabulator-frozen-left {
border-right: 2px solid #ddd;
}
.tabulator .tabulator-row .tabulator-frozen.tabulator-frozen-right {
border-left: 2px solid #ddd;
}
.tabulator .tabulator-row .tabulator-cell {
display: inline-block;
position: relative;
box-sizing: border-box;
padding: 8px;
vertical-align: middle;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.tabulator .tabulator-row .tabulator-cell:last-of-type {
border-right: none;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-editing {
border: 1px solid #1D68CD;
padding: 0;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-editing input, .tabulator .tabulator-row .tabulator-cell.tabulator-editing select {
border: 1px;
background: transparent;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-validation-fail {
border: 1px solid #dd0000;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-validation-fail input, .tabulator .tabulator-row .tabulator-cell.tabulator-validation-fail select {
border: 1px;
background: transparent;
color: #dd0000;
}
.tabulator .tabulator-row .tabulator-cell:first-child .tabulator-col-resize-handle.prev {
display: none;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-row-handle {
display: -ms-inline-flexbox;
display: inline-flex;
-ms-flex-align: center;
align-items: center;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box {
width: 80%;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box .tabulator-row-handle-bar {
width: 100%;
height: 3px;
margin: 2px 10% 0 10%;
background: #666;
}
.tabulator .tabulator-row.tabulator-group {
box-sizing: border-box;
border-bottom: 1px solid #999;
border-right: 1px solid #ddd;
border-top: 1px solid #999;
padding: 5px;
padding-left: 10px;
background: #fafafa;
font-weight: bold;
min-width: 100%;
}
.tabulator .tabulator-row.tabulator-group:hover {
cursor: pointer;
background-color: rgba(0, 0, 0, 0.1);
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-visible .tabulator-arrow {
margin-right: 10px;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-top: 6px solid #666;
border-bottom: 0;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-1 .tabulator-arrow {
margin-left: 20px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-2 .tabulator-arrow {
margin-left: 40px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-3 .tabulator-arrow {
margin-left: 60px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-4 .tabulator-arrow {
margin-left: 80px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-5 .tabulator-arrow {
margin-left: 1000px;
}
.tabulator .tabulator-row.tabulator-group .tabulator-arrow {
display: inline-block;
width: 0;
height: 0;
margin-right: 16px;
border-top: 6px solid transparent;
border-bottom: 6px solid transparent;
border-right: 0;
border-left: 6px solid #666;
vertical-align: middle;
}
.tabulator .tabulator-row.tabulator-group span {
margin-left: 10px;
color: #666;
}
.tabulator .tabulator-col-resize-handle {
position: absolute;
right: 0;
top: 0;
bottom: 0;
width: 5px;
}
.tabulator .tabulator-col-resize-handle.prev {
left: 0;
right: auto;
}
.tabulator .tabulator-col-resize-handle:hover {
cursor: ew-resize;
}
.tabulator .tabulator-footer {
padding: 5px 10px;
border-top: 2px solid #ddd;
text-align: right;
font-weight: bold;
white-space: nowrap;
-ms-user-select: none;
user-select: none;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
}
.tabulator .tabulator-footer .tabulator-calcs-holder {
box-sizing: border-box;
width: calc("100% + 20px");
margin: -5px -10px 5px -10px;
text-align: left;
background: white !important;
border-bottom: 1px solid #ddd;
border-top: 1px solid #ddd;
overflow: hidden;
}
.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row {
background: white !important;
}
.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle {
display: none;
}
.tabulator .tabulator-footer .tabulator-calcs-holder:only-child {
margin-bottom: -5px;
border-bottom: none;
}
.tabulator .tabulator-footer .tabulator-pages {
margin: 0 7px;
}
.tabulator .tabulator-footer .tabulator-page {
display: inline-block;
margin: 0 2px;
border: 1px solid #ddd;
border-radius: 3px;
padding: 2px 5px;
background: rgba(255, 255, 255, 0.2);
font-family: inherit;
font-weight: inherit;
font-size: inherit;
}
.tabulator .tabulator-footer .tabulator-page.active {
color: #d00;
}
.tabulator .tabulator-footer .tabulator-page:disabled {
opacity: .5;
}
.tabulator .tabulator-footer .tabulator-page:not(.disabled):hover {
cursor: pointer;
background: rgba(0, 0, 0, 0.2);
color: #fff;
}
.tabulator .tablulator-loader {
position: absolute;
display: -ms-flexbox;
display: flex;
-ms-flex-align: center;
align-items: center;
top: 0;
left: 0;
z-index: 100;
height: 100%;
width: 100%;
background: rgba(0, 0, 0, 0.4);
text-align: center;
}
.tabulator .tablulator-loader .tabulator-loader-msg {
display: inline-block;
margin: 0 auto;
padding: 10px 20px;
border-radius: 10px;
background: #fff;
font-weight: bold;
font-size: 16px;
}
.tabulator .tablulator-loader .tabulator-loader-msg.tabulator-loading {
border: 4px solid #333;
color: #000;
}
.tabulator .tablulator-loader .tabulator-loader-msg.tabulator-error {
border: 4px solid #D00;
color: #590000;
}
.tabulator.table-striped .tabulator-row:nth-child(even) {
background-color: #f9f9f9;
}
.tabulator.table-bordered {
border: 1px solid #ddd;
}
.tabulator.table-bordered .tabulator-header .tabulator-col {
border-right: 1px solid #ddd;
}
.tabulator.table-bordered .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell {
border-right: 1px solid #ddd;
}
.tabulator.table-condensed .tabulator-header .tabulator-col .tabulator-col-content {
padding: 5px;
}
.tabulator.table-condensed .tabulator-tableHolder .tabulator-table .tabulator-row {
min-height: 24px;
}
.tabulator.table-condensed .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell {
padding: 5px;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.active {
background: #f5f5f5 !important;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.success {
background: #dff0d8 !important;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.info {
background: #d9edf7 !important;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.warning {
background: #fcf8e3 !important;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.danger {
background: #f2dede !important;
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

535
css/tabulator/tabulator.css Normal file
View File

@ -0,0 +1,535 @@
/* Tabulator v3.3.1 (c) Oliver Folkerd */
.tabulator {
position: relative;
border: 1px solid #999;
background-color: #888;
font-size: 14px;
text-align: left;
overflow: hidden;
-ms-transform: translatez(0);
transform: translatez(0);
}
.tabulator[tabulator-layout="fitDataFill"] .tabulator-tableHolder .tabulator-table {
min-width: 100%;
}
.tabulator.tabulator-block-select {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.tabulator .tabulator-header {
position: relative;
box-sizing: border-box;
width: 100%;
border-bottom: 1px solid #999;
background-color: #e6e6e6;
color: #555;
font-weight: bold;
white-space: nowrap;
overflow: hidden;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
}
.tabulator .tabulator-header .tabulator-col {
display: inline-block;
position: relative;
box-sizing: border-box;
border-right: 1px solid #aaa;
background: #e6e6e6;
text-align: left;
vertical-align: bottom;
overflow: hidden;
}
.tabulator .tabulator-header .tabulator-col.tabulator-moving {
position: absolute;
border: 1px solid #999;
background: #cdcdcd;
pointer-events: none;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content {
position: relative;
padding: 4px;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title {
box-sizing: border-box;
width: 100%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
vertical-align: bottom;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title .tabulator-title-editor {
box-sizing: border-box;
width: 100%;
border: 1px solid #999;
padding: 1px;
background: #fff;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-arrow {
display: inline-block;
position: absolute;
top: 9px;
right: 8px;
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid #bbb;
}
.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols {
position: relative;
display: -ms-flexbox;
display: flex;
border-top: 1px solid #aaa;
overflow: hidden;
}
.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols .tabulator-col:last-child {
margin-right: -1px;
}
.tabulator .tabulator-header .tabulator-col:first-child .tabulator-col-resize-handle.prev {
display: none;
}
.tabulator .tabulator-header .tabulator-col.ui-sortable-helper {
position: absolute;
background-color: #e6e6e6 !important;
border: 1px solid #aaa;
}
.tabulator .tabulator-header .tabulator-col .tabulator-header-filter {
position: relative;
box-sizing: border-box;
margin-top: 2px;
width: 100%;
text-align: center;
}
.tabulator .tabulator-header .tabulator-col .tabulator-header-filter textarea {
height: auto !important;
}
.tabulator .tabulator-header .tabulator-col .tabulator-header-filter svg {
margin-top: 3px;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title {
padding-right: 25px;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable:hover {
cursor: pointer;
background-color: #cdcdcd;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="none"] .tabulator-col-content .tabulator-arrow {
border-top: none;
border-bottom: 6px solid #bbb;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="asc"] .tabulator-col-content .tabulator-arrow {
border-top: none;
border-bottom: 6px solid #666;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="desc"] .tabulator-col-content .tabulator-arrow {
border-top: 6px solid #666;
border-bottom: none;
}
.tabulator .tabulator-header .tabulator-frozen {
display: inline-block;
position: absolute;
z-index: 10;
}
.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left {
border-right: 2px solid #aaa;
}
.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-right {
border-left: 2px solid #aaa;
}
.tabulator .tabulator-header .tabulator-calcs-holder {
box-sizing: border-box;
min-width: 200%;
background: #f3f3f3 !important;
border-top: 1px solid #aaa;
border-bottom: 1px solid #aaa;
overflow: hidden;
}
.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row {
background: #f3f3f3 !important;
}
.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle {
display: none;
}
.tabulator .tabulator-tableHolder {
position: relative;
width: 100%;
white-space: nowrap;
overflow: auto;
-webkit-overflow-scrolling: touch;
}
.tabulator .tabulator-tableHolder:focus {
outline: none;
}
.tabulator .tabulator-tableHolder .tabulator-placeholder {
position: absolute;
box-sizing: border-box;
display: -ms-flexbox;
display: flex;
-ms-flex-align: center;
align-items: center;
top: 0;
left: 0;
height: 100%;
width: 100%;
}
.tabulator .tabulator-tableHolder .tabulator-placeholder span {
display: inline-block;
margin: 0 auto;
padding: 10px;
color: #ccc;
font-weight: bold;
font-size: 20px;
}
.tabulator .tabulator-tableHolder .tabulator-table {
position: relative;
display: inline-block;
background-color: #fff;
white-space: nowrap;
overflow: visible;
color: #333;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs {
font-weight: bold;
background: #e2e2e2 !important;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-top {
border-bottom: 2px solid #aaa;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-bottom {
border-top: 2px solid #aaa;
}
.tabulator .tabulator-row {
position: relative;
box-sizing: border-box;
min-height: 22px;
background-color: #fff;
}
.tabulator .tabulator-row.tabulator-row-even {
background-color: #EFEFEF;
}
.tabulator .tabulator-row.tabulator-selectable:hover {
background-color: #bbb;
cursor: pointer;
}
.tabulator .tabulator-row.tabulator-selected {
background-color: #9ABCEA;
}
.tabulator .tabulator-row.tabulator-selected:hover {
background-color: #769BCC;
cursor: pointer;
}
.tabulator .tabulator-row.tabulator-row-moving {
border: 1px solid #000;
background: #fff;
}
.tabulator .tabulator-row.tabulator-moving {
position: absolute;
border-top: 1px solid #aaa;
border-bottom: 1px solid #aaa;
pointer-events: none;
z-index: 15;
}
.tabulator .tabulator-row .tabulator-frozen {
display: inline-block;
position: absolute;
background-color: inherit;
z-index: 10;
}
.tabulator .tabulator-row .tabulator-frozen.tabulator-frozen-left {
border-right: 2px solid #aaa;
}
.tabulator .tabulator-row .tabulator-frozen.tabulator-frozen-right {
border-left: 2px solid #aaa;
}
.tabulator .tabulator-row .tabulator-cell {
display: inline-block;
position: relative;
box-sizing: border-box;
padding: 4px;
border-right: 1px solid #aaa;
vertical-align: middle;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-editing {
border: 1px solid #1D68CD;
padding: 0;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-editing input, .tabulator .tabulator-row .tabulator-cell.tabulator-editing select {
border: 1px;
background: transparent;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-validation-fail {
border: 1px solid #dd0000;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-validation-fail input, .tabulator .tabulator-row .tabulator-cell.tabulator-validation-fail select {
border: 1px;
background: transparent;
color: #dd0000;
}
.tabulator .tabulator-row .tabulator-cell:first-child .tabulator-col-resize-handle.prev {
display: none;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-row-handle {
display: -ms-inline-flexbox;
display: inline-flex;
-ms-flex-align: center;
align-items: center;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box {
width: 80%;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box .tabulator-row-handle-bar {
width: 100%;
height: 3px;
margin: 2px 10% 0 10%;
background: #666;
}
.tabulator .tabulator-row.tabulator-group {
box-sizing: border-box;
border-bottom: 1px solid #999;
border-right: 1px solid #aaa;
border-top: 1px solid #999;
padding: 5px;
padding-left: 10px;
background: #ccc;
font-weight: bold;
min-width: 100%;
}
.tabulator .tabulator-row.tabulator-group:hover {
cursor: pointer;
background-color: rgba(0, 0, 0, 0.1);
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-visible .tabulator-arrow {
margin-right: 10px;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-top: 6px solid #666;
border-bottom: 0;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-1 .tabulator-arrow {
margin-left: 20px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-2 .tabulator-arrow {
margin-left: 40px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-3 .tabulator-arrow {
margin-left: 60px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-4 .tabulator-arrow {
margin-left: 80px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-5 .tabulator-arrow {
margin-left: 1000px;
}
.tabulator .tabulator-row.tabulator-group .tabulator-arrow {
display: inline-block;
width: 0;
height: 0;
margin-right: 16px;
border-top: 6px solid transparent;
border-bottom: 6px solid transparent;
border-right: 0;
border-left: 6px solid #666;
vertical-align: middle;
}
.tabulator .tabulator-row.tabulator-group span {
margin-left: 10px;
color: #d00;
}
.tabulator .tabulator-footer {
padding: 5px 10px;
border-top: 1px solid #999;
background-color: #e6e6e6;
text-align: right;
color: #555;
font-weight: bold;
white-space: nowrap;
-ms-user-select: none;
user-select: none;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
}
.tabulator .tabulator-footer .tabulator-calcs-holder {
box-sizing: border-box;
width: calc("100% + 20px");
margin: -5px -10px 5px -10px;
text-align: left;
background: #f3f3f3 !important;
border-bottom: 1px solid #aaa;
border-top: 1px solid #aaa;
overflow: hidden;
}
.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row {
background: #f3f3f3 !important;
}
.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle {
display: none;
}
.tabulator .tabulator-footer .tabulator-calcs-holder:only-child {
margin-bottom: -5px;
border-bottom: none;
}
.tabulator .tabulator-footer .tabulator-pages {
margin: 0 7px;
}
.tabulator .tabulator-footer .tabulator-page {
display: inline-block;
margin: 0 2px;
padding: 2px 5px;
border: 1px solid #aaa;
border-radius: 3px;
background: rgba(255, 255, 255, 0.2);
color: #555;
font-family: inherit;
font-weight: inherit;
font-size: inherit;
}
.tabulator .tabulator-footer .tabulator-page.active {
color: #d00;
}
.tabulator .tabulator-footer .tabulator-page:disabled {
opacity: .5;
}
.tabulator .tabulator-footer .tabulator-page:not(.disabled):hover {
cursor: pointer;
background: rgba(0, 0, 0, 0.2);
color: #fff;
}
.tabulator .tabulator-col-resize-handle {
position: absolute;
right: 0;
top: 0;
bottom: 0;
width: 5px;
}
.tabulator .tabulator-col-resize-handle.prev {
left: 0;
right: auto;
}
.tabulator .tabulator-col-resize-handle:hover {
cursor: ew-resize;
}
.tabulator .tablulator-loader {
position: absolute;
display: -ms-flexbox;
display: flex;
-ms-flex-align: center;
align-items: center;
top: 0;
left: 0;
z-index: 100;
height: 100%;
width: 100%;
background: rgba(0, 0, 0, 0.4);
text-align: center;
}
.tabulator .tablulator-loader .tabulator-loader-msg {
display: inline-block;
margin: 0 auto;
padding: 10px 20px;
border-radius: 10px;
background: #fff;
font-weight: bold;
font-size: 16px;
}
.tabulator .tablulator-loader .tabulator-loader-msg.tabulator-loading {
border: 4px solid #333;
color: #000;
}
.tabulator .tablulator-loader .tabulator-loader-msg.tabulator-error {
border: 4px solid #D00;
color: #590000;
}

3
css/tabulator/tabulator.min.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,539 @@
/* Tabulator v3.3.1 (c) Oliver Folkerd */
.tabulator {
position: relative;
border: 1px solid #333;
background-color: #222;
overflow: hidden;
font-size: 14px;
text-align: left;
-ms-transform: translatez(0);
transform: translatez(0);
}
.tabulator[tabulator-layout="fitDataFill"] .tabulator-tableHolder .tabulator-table {
min-width: 100%;
}
.tabulator.tabulator-block-select {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.tabulator .tabulator-header {
position: relative;
box-sizing: border-box;
width: 100%;
border-bottom: 1px solid #999;
background-color: #333;
color: #fff;
font-weight: bold;
white-space: nowrap;
overflow: hidden;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
}
.tabulator .tabulator-header .tabulator-col {
display: inline-block;
position: relative;
box-sizing: border-box;
border-right: 1px solid #aaa;
background-color: #333;
text-align: left;
vertical-align: bottom;
overflow: hidden;
}
.tabulator .tabulator-header .tabulator-col.tabulator-moving {
position: absolute;
border: 1px solid #999;
background: #1a1a1a;
pointer-events: none;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content {
position: relative;
padding: 4px;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title {
box-sizing: border-box;
width: 100%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
vertical-align: bottom;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title .tabulator-title-editor {
box-sizing: border-box;
width: 100%;
border: 1px solid #999;
padding: 1px;
background: #444;
color: #fff;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-arrow {
display: inline-block;
position: absolute;
top: 9px;
right: 8px;
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid #bbb;
}
.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols {
position: relative;
display: -ms-flexbox;
display: flex;
border-top: 1px solid #aaa;
overflow: hidden;
}
.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols .tabulator-col:last-child {
margin-right: -1px;
}
.tabulator .tabulator-header .tabulator-col:first-child .tabulator-col-resize-handle.prev {
display: none;
}
.tabulator .tabulator-header .tabulator-col.ui-sortable-helper {
position: absolute;
background-color: #1a1a1a !important;
border: 1px solid #aaa;
}
.tabulator .tabulator-header .tabulator-col .tabulator-header-filter {
position: relative;
box-sizing: border-box;
margin-top: 2px;
width: 100%;
text-align: center;
}
.tabulator .tabulator-header .tabulator-col .tabulator-header-filter textarea {
height: auto !important;
}
.tabulator .tabulator-header .tabulator-col .tabulator-header-filter svg {
margin-top: 3px;
}
.tabulator .tabulator-header .tabulator-col .tabulator-header-filter input, .tabulator .tabulator-header .tabulator-col .tabulator-header-filter select {
border: 1px solid #999;
background: #444;
color: #fff;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title {
padding-right: 25px;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable:hover {
cursor: pointer;
background-color: #1a1a1a;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="none"] .tabulator-col-content .tabulator-arrow {
border-top: none;
border-bottom: 6px solid #bbb;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="asc"] .tabulator-col-content .tabulator-arrow {
border-top: none;
border-bottom: 6px solid #666;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="desc"] .tabulator-col-content .tabulator-arrow {
border-top: 6px solid #666;
border-bottom: none;
}
.tabulator .tabulator-header .tabulator-frozen {
display: inline-block;
position: absolute;
z-index: 10;
}
.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left {
border-right: 2px solid #888;
}
.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-right {
border-left: 2px solid #888;
}
.tabulator .tabulator-header .tabulator-calcs-holder {
box-sizing: border-box;
min-width: 200%;
background: #1a1a1a !important;
border-top: 1px solid #888;
border-bottom: 1px solid #aaa;
overflow: hidden;
}
.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row {
background: #1a1a1a !important;
}
.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle {
display: none;
}
.tabulator .tabulator-tableHolder {
position: relative;
width: 100%;
white-space: nowrap;
overflow: auto;
-webkit-overflow-scrolling: touch;
}
.tabulator .tabulator-tableHolder:focus {
outline: none;
}
.tabulator .tabulator-tableHolder .tabulator-placeholder {
position: absolute;
box-sizing: border-box;
display: -ms-flexbox;
display: flex;
-ms-flex-align: center;
align-items: center;
top: 0;
left: 0;
height: 100%;
width: 100%;
}
.tabulator .tabulator-tableHolder .tabulator-placeholder span {
display: inline-block;
margin: 0 auto;
padding: 10px;
color: #eee;
font-weight: bold;
font-size: 20px;
}
.tabulator .tabulator-tableHolder .tabulator-table {
position: relative;
display: inline-block;
background-color: #666;
white-space: nowrap;
overflow: visible;
color: #fff;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs {
font-weight: bold;
background: #373737 !important;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-top {
border-bottom: 2px solid #888;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-bottom {
border-top: 2px solid #888;
}
.tabulator .tabulator-row {
position: relative;
box-sizing: border-box;
min-height: 22px;
background-color: #666;
}
.tabulator .tabulator-row:nth-child(even) {
background-color: #444;
}
.tabulator .tabulator-row.tabulator-selectable:hover {
background-color: #999;
cursor: pointer;
}
.tabulator .tabulator-row.tabulator-selected {
background-color: #000;
}
.tabulator .tabulator-row.tabulator-selected:hover {
background-color: #888;
cursor: pointer;
}
.tabulator .tabulator-row.tabulator-moving {
position: absolute;
border-top: 1px solid #888;
border-bottom: 1px solid #888;
pointer-events: none !important;
z-index: 15;
}
.tabulator .tabulator-row .tabulator-frozen {
display: inline-block;
position: absolute;
background-color: inherit;
z-index: 10;
}
.tabulator .tabulator-row .tabulator-frozen.tabulator-frozen-left {
border-right: 2px solid #888;
}
.tabulator .tabulator-row .tabulator-frozen.tabulator-frozen-right {
border-left: 2px solid #888;
}
.tabulator .tabulator-row .tabulator-cell {
display: inline-block;
position: relative;
box-sizing: border-box;
padding: 4px;
border-right: 1px solid #888;
vertical-align: middle;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-editing {
border: 1px solid #999;
padding: 0;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-editing input, .tabulator .tabulator-row .tabulator-cell.tabulator-editing select {
border: 1px;
background: transparent;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-validation-fail {
border: 1px solid #dd0000;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-validation-fail input, .tabulator .tabulator-row .tabulator-cell.tabulator-validation-fail select {
border: 1px;
background: transparent;
color: #dd0000;
}
.tabulator .tabulator-row .tabulator-cell:first-child .tabulator-col-resize-handle.prev {
display: none;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-row-handle {
display: -ms-inline-flexbox;
display: inline-flex;
-ms-flex-align: center;
align-items: center;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box {
width: 80%;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box .tabulator-row-handle-bar {
width: 100%;
height: 3px;
margin: 2px 10% 0 10%;
background: #666;
}
.tabulator .tabulator-row.tabulator-group {
box-sizing: border-box;
border-bottom: 1px solid #999;
border-right: 1px solid #888;
border-top: 1px solid #999;
padding: 5px;
padding-left: 10px;
background: #ccc;
font-weight: bold;
color: #333;
min-width: 100%;
}
.tabulator .tabulator-row.tabulator-group:hover {
cursor: pointer;
background-color: rgba(0, 0, 0, 0.1);
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-visible .tabulator-arrow {
margin-right: 10px;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-top: 6px solid #666;
border-bottom: 0;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-1 .tabulator-arrow {
margin-left: 20px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-2 .tabulator-arrow {
margin-left: 40px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-3 .tabulator-arrow {
margin-left: 60px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-4 .tabulator-arrow {
margin-left: 80px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-5 .tabulator-arrow {
margin-left: 1000px;
}
.tabulator .tabulator-row.tabulator-group .tabulator-arrow {
display: inline-block;
width: 0;
height: 0;
margin-right: 16px;
border-top: 6px solid transparent;
border-bottom: 6px solid transparent;
border-right: 0;
border-left: 6px solid #666;
vertical-align: middle;
}
.tabulator .tabulator-row.tabulator-group span {
margin-left: 10px;
color: #666;
}
.tabulator .tabulator-col-resize-handle {
position: absolute;
right: 0;
top: 0;
bottom: 0;
width: 5px;
}
.tabulator .tabulator-col-resize-handle.prev {
left: 0;
right: auto;
}
.tabulator .tabulator-col-resize-handle:hover {
cursor: ew-resize;
}
.tabulator .tabulator-footer {
padding: 5px 10px;
border-top: 1px solid #999;
background-color: #333;
text-align: right;
color: #333;
font-weight: bold;
white-space: nowrap;
-ms-user-select: none;
user-select: none;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
}
.tabulator .tabulator-footer .tabulator-calcs-holder {
box-sizing: border-box;
width: calc("100% + 20px");
margin: -5px -10px 5px -10px;
text-align: left;
background: #262626 !important;
border-bottom: 1px solid #888;
border-top: 1px solid #888;
overflow: hidden;
}
.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row {
background: #262626 !important;
color: #fff;
}
.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle {
display: none;
}
.tabulator .tabulator-footer .tabulator-calcs-holder:only-child {
margin-bottom: -5px;
border-bottom: none;
}
.tabulator .tabulator-footer .tabulator-pages {
margin: 0 7px;
}
.tabulator .tabulator-footer .tabulator-page {
display: inline-block;
margin: 0 2px;
border: 1px solid #aaa;
border-radius: 3px;
padding: 2px 5px;
background: rgba(255, 255, 255, 0.2);
color: #333;
font-family: inherit;
font-weight: inherit;
font-size: inherit;
}
.tabulator .tabulator-footer .tabulator-page.active {
color: #fff;
}
.tabulator .tabulator-footer .tabulator-page:disabled {
opacity: .5;
}
.tabulator .tabulator-footer .tabulator-page:not(.disabled):hover {
cursor: pointer;
background: rgba(0, 0, 0, 0.2);
color: #fff;
}
.tabulator .tablulator-loader {
position: absolute;
display: -ms-flexbox;
display: flex;
-ms-flex-align: center;
align-items: center;
top: 0;
left: 0;
z-index: 100;
height: 100%;
width: 100%;
background: rgba(0, 0, 0, 0.4);
text-align: center;
}
.tabulator .tablulator-loader .tabulator-loader-msg {
display: inline-block;
margin: 0 auto;
padding: 10px 20px;
border-radius: 10px;
background: #fff;
font-weight: bold;
font-size: 16px;
}
.tabulator .tablulator-loader .tabulator-loader-msg.tabulator-loading {
border: 4px solid #333;
color: #000;
}
.tabulator .tablulator-loader .tabulator-loader-msg.tabulator-error {
border: 4px solid #D00;
color: #590000;
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,562 @@
/* Tabulator v3.3.1 (c) Oliver Folkerd */
.tabulator {
position: relative;
border: 1px solid #fff;
background-color: #fff;
overflow: hidden;
font-size: 16px;
text-align: left;
-ms-transform: translatez(0);
transform: translatez(0);
}
.tabulator[tabulator-layout="fitDataFill"] .tabulator-tableHolder .tabulator-table {
min-width: 100%;
}
.tabulator.tabulator-block-select {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.tabulator .tabulator-header {
position: relative;
box-sizing: border-box;
width: 100%;
border-bottom: 3px solid #3759D7;
margin-bottom: 4px;
background-color: #fff;
color: #3759D7;
font-weight: bold;
white-space: nowrap;
overflow: hidden;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
padding-left: 10px;
font-size: 1.1em;
}
.tabulator .tabulator-header .tabulator-col {
display: inline-block;
position: relative;
box-sizing: border-box;
border-right: 2px solid #fff;
background-color: #fff;
text-align: left;
vertical-align: bottom;
overflow: hidden;
}
.tabulator .tabulator-header .tabulator-col.tabulator-moving {
position: absolute;
border: 1px solid #3759D7;
background: #e6e6e6;
pointer-events: none;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content {
position: relative;
padding: 4px;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title {
box-sizing: border-box;
width: 100%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
vertical-align: bottom;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title .tabulator-title-editor {
box-sizing: border-box;
width: 100%;
border: 1px solid #3759D7;
padding: 1px;
background: #fff;
font-size: 1em;
color: #3759D7;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-arrow {
display: inline-block;
position: absolute;
top: 9px;
right: 8px;
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid #b7c3f1;
}
.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols {
position: relative;
display: -ms-flexbox;
display: flex;
border-top: 2px solid #3759D7;
overflow: hidden;
}
.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols .tabulator-col:last-child {
margin-right: -1px;
}
.tabulator .tabulator-header .tabulator-col:first-child .tabulator-col-resize-handle.prev {
display: none;
}
.tabulator .tabulator-header .tabulator-col.ui-sortable-helper {
position: absolute;
background-color: #e6e6e6 !important;
border: 1px solid #fff;
}
.tabulator .tabulator-header .tabulator-col .tabulator-header-filter {
position: relative;
box-sizing: border-box;
margin-top: 2px;
width: 100%;
text-align: center;
}
.tabulator .tabulator-header .tabulator-col .tabulator-header-filter textarea {
height: auto !important;
}
.tabulator .tabulator-header .tabulator-col .tabulator-header-filter svg {
margin-top: 3px;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title {
padding-right: 25px;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable:hover {
cursor: pointer;
background-color: #e6e6e6;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="none"] .tabulator-col-content .tabulator-arrow {
border-top: none;
border-bottom: 6px solid #b7c3f1;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="asc"] .tabulator-col-content .tabulator-arrow {
border-top: none;
border-bottom: 6px solid #3759D7;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="desc"] .tabulator-col-content .tabulator-arrow {
border-top: 6px solid #3759D7;
border-bottom: none;
}
.tabulator .tabulator-header .tabulator-frozen {
display: inline-block;
position: absolute;
z-index: 10;
}
.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left {
padding-left: 10px;
border-right: 2px solid #fff;
}
.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-right {
border-left: 2px solid #fff;
}
.tabulator .tabulator-header .tabulator-calcs-holder {
box-sizing: border-box;
min-width: 200%;
border-top: 2px solid #3759D7 !important;
background: white !important;
border-top: 1px solid #fff;
border-bottom: 1px solid #fff;
overflow: hidden;
}
.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row {
padding-left: 0 !important;
background: white !important;
}
.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle {
display: none;
}
.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row .tabulator-cell {
background: none;
}
.tabulator .tabulator-tableHolder {
position: relative;
width: 100%;
white-space: nowrap;
overflow: auto;
-webkit-overflow-scrolling: touch;
}
.tabulator .tabulator-tableHolder:focus {
outline: none;
}
.tabulator .tabulator-tableHolder .tabulator-placeholder {
position: absolute;
box-sizing: border-box;
display: -ms-flexbox;
display: flex;
-ms-flex-align: center;
align-items: center;
top: 0;
left: 0;
height: 100%;
width: 100%;
}
.tabulator .tabulator-tableHolder .tabulator-placeholder span {
display: inline-block;
margin: 0 auto;
padding: 10px;
color: #3759D7;
font-weight: bold;
font-size: 20px;
}
.tabulator .tabulator-tableHolder .tabulator-table {
position: relative;
display: inline-block;
background-color: #f3f3f3;
white-space: nowrap;
overflow: visible;
color: #333;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs {
font-weight: bold;
background: #f2f2f2 !important;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-top {
border-bottom: 2px solid #3759D7;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-bottom {
border-top: 2px solid #3759D7;
}
.tabulator .tabulator-row {
position: relative;
box-sizing: border-box;
box-sizing: border-box;
min-height: 24px;
background-color: #3759D7;
padding-left: 10px !important;
margin-bottom: 2px;
}
.tabulator .tabulator-row:nth-child(even) {
background-color: #627ce0;
}
.tabulator .tabulator-row:nth-child(even) .tabulator-cell {
background-color: #fff;
}
.tabulator .tabulator-row.tabulator-selectable:hover {
cursor: pointer;
}
.tabulator .tabulator-row.tabulator-selectable:hover .tabulator-cell {
background-color: #bbb;
}
.tabulator .tabulator-row.tabulator-selected .tabulator-cell {
background-color: #9ABCEA;
}
.tabulator .tabulator-row.tabulator-selected:hover .tabulator-cell {
background-color: #769BCC;
cursor: pointer;
}
.tabulator .tabulator-row.tabulator-moving {
position: absolute;
border-top: 1px solid #fff;
border-bottom: 1px solid #fff;
pointer-events: none !important;
z-index: 15;
}
.tabulator .tabulator-row .tabulator-frozen {
display: inline-block;
position: absolute;
background-color: inherit;
z-index: 10;
}
.tabulator .tabulator-row .tabulator-frozen.tabulator-frozen-left {
padding-left: 10px;
border-right: 2px solid #fff;
}
.tabulator .tabulator-row .tabulator-frozen.tabulator-frozen-right {
border-left: 2px solid #fff;
}
.tabulator .tabulator-row .tabulator-cell {
display: inline-block;
position: relative;
box-sizing: border-box;
padding: 6px 4px;
border-right: 2px solid #fff;
vertical-align: middle;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
background-color: #f3f3f3;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-editing {
border: 1px solid #1D68CD;
padding: 0;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-editing input, .tabulator .tabulator-row .tabulator-cell.tabulator-editing select {
border: 1px;
background: transparent;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-validation-fail {
border: 1px solid #dd0000;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-validation-fail input, .tabulator .tabulator-row .tabulator-cell.tabulator-validation-fail select {
border: 1px;
background: transparent;
color: #dd0000;
}
.tabulator .tabulator-row .tabulator-cell:first-child .tabulator-col-resize-handle.prev {
display: none;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-row-handle {
display: -ms-inline-flexbox;
display: inline-flex;
-ms-flex-align: center;
align-items: center;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box {
width: 80%;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box .tabulator-row-handle-bar {
width: 100%;
height: 3px;
margin: 2px 10% 0 10%;
background: #666;
}
.tabulator .tabulator-row.tabulator-group {
box-sizing: border-box;
border-bottom: 2px solid #3759D7;
border-top: 2px solid #3759D7;
padding: 5px;
padding-left: 10px;
background: #8ca0e8;
font-weight: bold;
color: fff;
margin-bottom: 2px;
min-width: 100%;
}
.tabulator .tabulator-row.tabulator-group:hover {
cursor: pointer;
background-color: rgba(0, 0, 0, 0.1);
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-visible .tabulator-arrow {
margin-right: 10px;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-top: 6px solid #3759D7;
border-bottom: 0;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-1 .tabulator-arrow {
margin-left: 20px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-2 .tabulator-arrow {
margin-left: 40px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-3 .tabulator-arrow {
margin-left: 60px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-4 .tabulator-arrow {
margin-left: 80px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-5 .tabulator-arrow {
margin-left: 1000px;
}
.tabulator .tabulator-row.tabulator-group .tabulator-arrow {
display: inline-block;
width: 0;
height: 0;
margin-right: 16px;
border-top: 6px solid transparent;
border-bottom: 6px solid transparent;
border-right: 0;
border-left: 6px solid #3759D7;
vertical-align: middle;
}
.tabulator .tabulator-row.tabulator-group span {
margin-left: 10px;
color: #3759D7;
}
.tabulator .tabulator-col-resize-handle {
position: absolute;
right: 0;
top: 0;
bottom: 0;
width: 5px;
}
.tabulator .tabulator-col-resize-handle.prev {
left: 0;
right: auto;
}
.tabulator .tabulator-col-resize-handle:hover {
cursor: ew-resize;
}
.tabulator .tabulator-footer {
padding: 5px 10px;
border-top: 1px solid #999;
background-color: #fff;
text-align: right;
color: #3759D7;
font-weight: bold;
white-space: nowrap;
-ms-user-select: none;
user-select: none;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
}
.tabulator .tabulator-footer .tabulator-calcs-holder {
box-sizing: border-box;
width: calc("100% + 20px");
margin: -5px -10px 5px -10px;
text-align: left;
background: white !important;
border-top: 3px solid #3759D7 !important;
border-bottom: 2px solid #3759D7 !important;
border-bottom: 1px solid #fff;
border-top: 1px solid #fff;
overflow: hidden;
}
.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row {
background: white !important;
}
.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle {
display: none;
}
.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row .tabulator-cell {
background: none;
}
.tabulator .tabulator-footer .tabulator-calcs-holder:only-child {
margin-bottom: -5px;
border-bottom: none;
border-bottom: none !important;
}
.tabulator .tabulator-footer .tabulator-pages {
margin: 0 7px;
}
.tabulator .tabulator-footer .tabulator-page {
display: inline-block;
margin: 0 2px;
border: 1px solid #aaa;
border-radius: 3px;
padding: 2px 5px;
background: rgba(255, 255, 255, 0.2);
color: #3759D7;
font-family: inherit;
font-weight: inherit;
font-size: inherit;
}
.tabulator .tabulator-footer .tabulator-page.active {
color: #3759D7;
}
.tabulator .tabulator-footer .tabulator-page:disabled {
opacity: .5;
}
.tabulator .tabulator-footer .tabulator-page:not(.disabled):hover {
cursor: pointer;
background: rgba(0, 0, 0, 0.2);
color: #fff;
}
.tabulator .tablulator-loader {
position: absolute;
display: -ms-flexbox;
display: flex;
-ms-flex-align: center;
align-items: center;
top: 0;
left: 0;
z-index: 100;
height: 100%;
width: 100%;
background: rgba(0, 0, 0, 0.4);
text-align: center;
}
.tabulator .tablulator-loader .tabulator-loader-msg {
display: inline-block;
margin: 0 auto;
padding: 10px 20px;
border-radius: 10px;
background: #fff;
font-weight: bold;
font-size: 16px;
}
.tabulator .tablulator-loader .tabulator-loader-msg.tabulator-loading {
border: 4px solid #333;
color: #000;
}
.tabulator .tablulator-loader .tabulator-loader-msg.tabulator-error {
border: 4px solid #D00;
color: #590000;
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,534 @@
/* Tabulator v3.3.1 (c) Oliver Folkerd */
.tabulator {
position: relative;
background-color: #fff;
overflow: hidden;
font-size: 14px;
text-align: left;
-ms-transform: translatez(0);
transform: translatez(0);
}
.tabulator[tabulator-layout="fitDataFill"] .tabulator-tableHolder .tabulator-table {
min-width: 100%;
}
.tabulator.tabulator-block-select {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.tabulator .tabulator-header {
position: relative;
box-sizing: border-box;
width: 100%;
border-bottom: 1px solid #999;
background-color: #fff;
color: #555;
font-weight: bold;
white-space: nowrap;
overflow: hidden;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
}
.tabulator .tabulator-header .tabulator-col {
display: inline-block;
position: relative;
box-sizing: border-box;
border-right: 1px solid #ddd;
background-color: #fff;
text-align: left;
vertical-align: bottom;
overflow: hidden;
}
.tabulator .tabulator-header .tabulator-col.tabulator-moving {
position: absolute;
border: 1px solid #999;
background: #e6e6e6;
pointer-events: none;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content {
position: relative;
padding: 4px;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title {
box-sizing: border-box;
width: 100%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
vertical-align: bottom;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title .tabulator-title-editor {
box-sizing: border-box;
width: 100%;
border: 1px solid #999;
padding: 1px;
background: #fff;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-arrow {
display: inline-block;
position: absolute;
top: 9px;
right: 8px;
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid #bbb;
}
.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols {
position: relative;
display: -ms-flexbox;
display: flex;
border-top: 1px solid #ddd;
overflow: hidden;
}
.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols .tabulator-col:last-child {
margin-right: -1px;
}
.tabulator .tabulator-header .tabulator-col:first-child .tabulator-col-resize-handle.prev {
display: none;
}
.tabulator .tabulator-header .tabulator-col.ui-sortable-helper {
position: absolute;
background-color: #e6e6e6 !important;
border: 1px solid #ddd;
}
.tabulator .tabulator-header .tabulator-col .tabulator-header-filter {
position: relative;
box-sizing: border-box;
margin-top: 2px;
width: 100%;
text-align: center;
}
.tabulator .tabulator-header .tabulator-col .tabulator-header-filter textarea {
height: auto !important;
}
.tabulator .tabulator-header .tabulator-col .tabulator-header-filter svg {
margin-top: 3px;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title {
padding-right: 25px;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable:hover {
cursor: pointer;
background-color: #e6e6e6;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="none"] .tabulator-col-content .tabulator-arrow {
border-top: none;
border-bottom: 6px solid #bbb;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="asc"] .tabulator-col-content .tabulator-arrow {
border-top: none;
border-bottom: 6px solid #666;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="desc"] .tabulator-col-content .tabulator-arrow {
border-top: 6px solid #666;
border-bottom: none;
}
.tabulator .tabulator-header .tabulator-frozen {
display: inline-block;
position: absolute;
z-index: 10;
}
.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left {
border-right: 2px solid #ddd;
}
.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-right {
border-left: 2px solid #ddd;
}
.tabulator .tabulator-header .tabulator-calcs-holder {
box-sizing: border-box;
min-width: 200%;
background: #f2f2f2 !important;
border-top: 1px solid #ddd;
border-bottom: 1px solid #999;
overflow: hidden;
}
.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row {
background: #f2f2f2 !important;
}
.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle {
display: none;
}
.tabulator .tabulator-tableHolder {
position: relative;
width: 100%;
white-space: nowrap;
overflow: auto;
-webkit-overflow-scrolling: touch;
}
.tabulator .tabulator-tableHolder:focus {
outline: none;
}
.tabulator .tabulator-tableHolder .tabulator-placeholder {
position: absolute;
box-sizing: border-box;
display: -ms-flexbox;
display: flex;
-ms-flex-align: center;
align-items: center;
top: 0;
left: 0;
height: 100%;
width: 100%;
}
.tabulator .tabulator-tableHolder .tabulator-placeholder span {
display: inline-block;
margin: 0 auto;
padding: 10px;
color: #000;
font-weight: bold;
font-size: 20px;
}
.tabulator .tabulator-tableHolder .tabulator-table {
position: relative;
display: inline-block;
background-color: #fff;
white-space: nowrap;
overflow: visible;
color: #333;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs {
font-weight: bold;
background: #f2f2f2 !important;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-top {
border-bottom: 2px solid #ddd;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-bottom {
border-top: 2px solid #ddd;
}
.tabulator .tabulator-row {
position: relative;
box-sizing: border-box;
min-height: 22px;
background-color: #fff;
border-bottom: 1px solid #ddd;
}
.tabulator .tabulator-row:nth-child(even) {
background-color: #fff;
}
.tabulator .tabulator-row.tabulator-selectable:hover {
background-color: #bbb;
cursor: pointer;
}
.tabulator .tabulator-row.tabulator-selected {
background-color: #9ABCEA;
}
.tabulator .tabulator-row.tabulator-selected:hover {
background-color: #769BCC;
cursor: pointer;
}
.tabulator .tabulator-row.tabulator-moving {
position: absolute;
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
pointer-events: none !important;
z-index: 15;
}
.tabulator .tabulator-row .tabulator-frozen {
display: inline-block;
position: absolute;
background-color: inherit;
z-index: 10;
}
.tabulator .tabulator-row .tabulator-frozen.tabulator-frozen-left {
border-right: 2px solid #ddd;
}
.tabulator .tabulator-row .tabulator-frozen.tabulator-frozen-right {
border-left: 2px solid #ddd;
}
.tabulator .tabulator-row .tabulator-cell {
display: inline-block;
position: relative;
box-sizing: border-box;
padding: 4px;
border-right: 1px solid #ddd;
vertical-align: middle;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.tabulator .tabulator-row .tabulator-cell:last-of-type {
border-right: none;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-editing {
border: 1px solid #1D68CD;
padding: 0;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-editing input, .tabulator .tabulator-row .tabulator-cell.tabulator-editing select {
border: 1px;
background: transparent;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-validation-fail {
border: 1px solid #dd0000;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-validation-fail input, .tabulator .tabulator-row .tabulator-cell.tabulator-validation-fail select {
border: 1px;
background: transparent;
color: #dd0000;
}
.tabulator .tabulator-row .tabulator-cell:first-child .tabulator-col-resize-handle.prev {
display: none;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-row-handle {
display: -ms-inline-flexbox;
display: inline-flex;
-ms-flex-align: center;
align-items: center;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box {
width: 80%;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box .tabulator-row-handle-bar {
width: 100%;
height: 3px;
margin: 2px 10% 0 10%;
background: #666;
}
.tabulator .tabulator-row.tabulator-group {
box-sizing: border-box;
border-bottom: 1px solid #999;
border-right: 1px solid #ddd;
border-top: 1px solid #999;
padding: 5px;
padding-left: 10px;
background: #fafafa;
font-weight: bold;
min-width: 100%;
}
.tabulator .tabulator-row.tabulator-group:hover {
cursor: pointer;
background-color: rgba(0, 0, 0, 0.1);
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-visible .tabulator-arrow {
margin-right: 10px;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-top: 6px solid #666;
border-bottom: 0;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-1 .tabulator-arrow {
margin-left: 20px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-2 .tabulator-arrow {
margin-left: 40px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-3 .tabulator-arrow {
margin-left: 60px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-4 .tabulator-arrow {
margin-left: 80px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-5 .tabulator-arrow {
margin-left: 1000px;
}
.tabulator .tabulator-row.tabulator-group .tabulator-arrow {
display: inline-block;
width: 0;
height: 0;
margin-right: 16px;
border-top: 6px solid transparent;
border-bottom: 6px solid transparent;
border-right: 0;
border-left: 6px solid #666;
vertical-align: middle;
}
.tabulator .tabulator-row.tabulator-group span {
margin-left: 10px;
color: #666;
}
.tabulator .tabulator-col-resize-handle {
position: absolute;
right: 0;
top: 0;
bottom: 0;
width: 5px;
}
.tabulator .tabulator-col-resize-handle.prev {
left: 0;
right: auto;
}
.tabulator .tabulator-col-resize-handle:hover {
cursor: ew-resize;
}
.tabulator .tabulator-footer {
padding: 5px 10px;
border-top: 1px solid #999;
background-color: #fff;
text-align: right;
color: #555;
font-weight: bold;
white-space: nowrap;
-ms-user-select: none;
user-select: none;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
}
.tabulator .tabulator-footer .tabulator-calcs-holder {
box-sizing: border-box;
width: calc("100% + 20px");
margin: -5px -10px 5px -10px;
text-align: left;
background: #f2f2f2 !important;
border-bottom: 1px solid #fff;
border-top: 1px solid #ddd;
overflow: hidden;
}
.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row {
background: #f2f2f2 !important;
}
.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle {
display: none;
}
.tabulator .tabulator-footer .tabulator-calcs-holder:only-child {
margin-bottom: -5px;
border-bottom: none;
}
.tabulator .tabulator-footer .tabulator-pages {
margin: 0 7px;
}
.tabulator .tabulator-footer .tabulator-page {
display: inline-block;
margin: 0 2px;
border: 1px solid #aaa;
border-radius: 3px;
padding: 2px 5px;
background: rgba(255, 255, 255, 0.2);
color: #555;
font-family: inherit;
font-weight: inherit;
font-size: inherit;
}
.tabulator .tabulator-footer .tabulator-page.active {
color: #d00;
}
.tabulator .tabulator-footer .tabulator-page:disabled {
opacity: .5;
}
.tabulator .tabulator-footer .tabulator-page:not(.disabled):hover {
cursor: pointer;
background: rgba(0, 0, 0, 0.2);
color: #fff;
}
.tabulator .tablulator-loader {
position: absolute;
display: -ms-flexbox;
display: flex;
-ms-flex-align: center;
align-items: center;
top: 0;
left: 0;
z-index: 100;
height: 100%;
width: 100%;
background: rgba(0, 0, 0, 0.4);
text-align: center;
}
.tabulator .tablulator-loader .tabulator-loader-msg {
display: inline-block;
margin: 0 auto;
padding: 10px 20px;
border-radius: 10px;
background: #fff;
font-weight: bold;
font-size: 16px;
}
.tabulator .tablulator-loader .tabulator-loader-msg.tabulator-loading {
border: 4px solid #333;
color: #000;
}
.tabulator .tablulator-loader .tabulator-loader-msg.tabulator-error {
border: 4px solid #D00;
color: #590000;
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,533 @@
/* Tabulator v3.3.1 (c) Oliver Folkerd */
.tabulator {
position: relative;
border-bottom: 5px solid #222;
background-color: #fff;
font-size: 14px;
text-align: left;
overflow: hidden;
-ms-transform: translatez(0);
transform: translatez(0);
}
.tabulator[tabulator-layout="fitDataFill"] .tabulator-tableHolder .tabulator-table {
min-width: 100%;
}
.tabulator[tabulator-layout="fitColumns"] .tabulator-row .tabulator-cell:last-of-type {
border-right: none;
}
.tabulator.tabulator-block-select {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.tabulator .tabulator-header {
position: relative;
box-sizing: border-box;
width: 100%;
border-bottom: 3px solid #3FB449;
background-color: #222;
color: #fff;
font-weight: bold;
white-space: nowrap;
overflow: hidden;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
}
.tabulator .tabulator-header .tabulator-col {
display: inline-block;
position: relative;
box-sizing: border-box;
border-right: 1px solid #aaa;
background-color: #222;
text-align: left;
vertical-align: bottom;
overflow: hidden;
}
.tabulator .tabulator-header .tabulator-col.tabulator-moving {
position: absolute;
border: 1px solid #3FB449;
background: #090909;
pointer-events: none;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content {
position: relative;
padding: 8px;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title {
box-sizing: border-box;
width: 100%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
vertical-align: bottom;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title .tabulator-title-editor {
box-sizing: border-box;
width: 100%;
border: 1px solid #999;
padding: 1px;
background: #fff;
}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-arrow {
display: inline-block;
position: absolute;
top: 14px;
right: 8px;
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid #bbb;
}
.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols {
position: relative;
display: -ms-flexbox;
display: flex;
border-top: 1px solid #aaa;
overflow: hidden;
}
.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols .tabulator-col:last-child {
margin-right: -1px;
}
.tabulator .tabulator-header .tabulator-col:first-child .tabulator-col-resize-handle.prev {
display: none;
}
.tabulator .tabulator-header .tabulator-col.ui-sortable-helper {
position: absolute;
background-color: #222 !important;
border: 1px solid #aaa;
}
.tabulator .tabulator-header .tabulator-col .tabulator-header-filter {
position: relative;
box-sizing: border-box;
margin-top: 2px;
width: 100%;
text-align: center;
}
.tabulator .tabulator-header .tabulator-col .tabulator-header-filter textarea {
height: auto !important;
}
.tabulator .tabulator-header .tabulator-col .tabulator-header-filter svg {
margin-top: 3px;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title {
padding-right: 25px;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable:hover {
cursor: pointer;
background-color: #090909;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="none"] .tabulator-col-content .tabulator-arrow {
border-top: none;
border-bottom: 6px solid #bbb;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="asc"] .tabulator-col-content .tabulator-arrow {
border-top: none;
border-bottom: 6px solid #3FB449;
}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="desc"] .tabulator-col-content .tabulator-arrow {
border-top: 6px solid #3FB449;
border-bottom: none;
}
.tabulator .tabulator-header .tabulator-frozen {
display: inline-block;
position: absolute;
z-index: 10;
}
.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left {
border-right: 2px solid #aaa;
}
.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-right {
border-left: 2px solid #aaa;
}
.tabulator .tabulator-header .tabulator-calcs-holder {
box-sizing: border-box;
min-width: 200%;
background: #3c3c3c !important;
border-top: 1px solid #aaa;
overflow: hidden;
}
.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row {
background: #3c3c3c !important;
}
.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle {
display: none;
}
.tabulator .tabulator-tableHolder {
position: relative;
width: 100%;
white-space: nowrap;
overflow: auto;
-webkit-overflow-scrolling: touch;
}
.tabulator .tabulator-tableHolder:focus {
outline: none;
}
.tabulator .tabulator-tableHolder .tabulator-placeholder {
position: absolute;
box-sizing: border-box;
display: -ms-flexbox;
display: flex;
-ms-flex-align: center;
align-items: center;
top: 0;
left: 0;
height: 100%;
width: 100%;
}
.tabulator .tabulator-tableHolder .tabulator-placeholder span {
display: inline-block;
margin: 0 auto;
padding: 10px;
color: #3FB449;
font-weight: bold;
font-size: 20px;
}
.tabulator .tabulator-tableHolder .tabulator-table {
position: relative;
display: inline-block;
background-color: #fff;
white-space: nowrap;
overflow: visible;
color: #333;
}
.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs {
font-weight: bold;
background: #484848 !important;
color: #fff;
}
.tabulator .tabulator-row {
position: relative;
box-sizing: border-box;
min-height: 22px;
background-color: #fff;
}
.tabulator .tabulator-row.tabulator-row-even {
background-color: #EFEFEF;
}
.tabulator .tabulator-row.tabulator-selectable:hover {
background-color: #bbb;
cursor: pointer;
}
.tabulator .tabulator-row.tabulator-selected {
background-color: #9ABCEA;
}
.tabulator .tabulator-row.tabulator-selected:hover {
background-color: #769BCC;
cursor: pointer;
}
.tabulator .tabulator-row.tabulator-row-moving {
border: 1px solid #000;
background: #fff;
}
.tabulator .tabulator-row.tabulator-moving {
position: absolute;
border-top: 1px solid #aaa;
border-bottom: 1px solid #aaa;
pointer-events: none !important;
z-index: 15;
}
.tabulator .tabulator-row .tabulator-frozen {
display: inline-block;
position: absolute;
background-color: inherit;
z-index: 10;
}
.tabulator .tabulator-row .tabulator-frozen.tabulator-frozen-left {
border-right: 2px solid #aaa;
}
.tabulator .tabulator-row .tabulator-frozen.tabulator-frozen-right {
border-left: 2px solid #aaa;
}
.tabulator .tabulator-row .tabulator-cell {
display: inline-block;
position: relative;
box-sizing: border-box;
padding: 6px;
border-right: 1px solid #aaa;
vertical-align: middle;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-editing {
border: 1px solid #1D68CD;
padding: 0;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-editing input, .tabulator .tabulator-row .tabulator-cell.tabulator-editing select {
border: 1px;
background: transparent;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-validation-fail {
border: 1px solid #dd0000;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-validation-fail input, .tabulator .tabulator-row .tabulator-cell.tabulator-validation-fail select {
border: 1px;
background: transparent;
color: #dd0000;
}
.tabulator .tabulator-row .tabulator-cell:first-child .tabulator-col-resize-handle.prev {
display: none;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-row-handle {
display: -ms-inline-flexbox;
display: inline-flex;
-ms-flex-align: center;
align-items: center;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box {
width: 80%;
}
.tabulator .tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box .tabulator-row-handle-bar {
width: 100%;
height: 3px;
margin: 2px 10% 0 10%;
background: #666;
}
.tabulator .tabulator-row.tabulator-group {
box-sizing: border-box;
border-right: 1px solid #aaa;
border-top: 1px solid #000;
border-bottom: 2px solid #3FB449;
padding: 5px;
padding-left: 10px;
background: #222;
color: #fff;
font-weight: bold;
min-width: 100%;
}
.tabulator .tabulator-row.tabulator-group:hover {
cursor: pointer;
background-color: #090909;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-visible .tabulator-arrow {
margin-right: 10px;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-top: 6px solid #3FB449;
border-bottom: 0;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-1 .tabulator-arrow {
margin-left: 20px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-2 .tabulator-arrow {
margin-left: 40px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-3 .tabulator-arrow {
margin-left: 60px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-4 .tabulator-arrow {
margin-left: 80px;
}
.tabulator .tabulator-row.tabulator-group.tabulator-group-level-5 .tabulator-arrow {
margin-left: 1000px;
}
.tabulator .tabulator-row.tabulator-group .tabulator-arrow {
display: inline-block;
width: 0;
height: 0;
margin-right: 16px;
border-top: 6px solid transparent;
border-bottom: 6px solid transparent;
border-right: 0;
border-left: 6px solid #3FB449;
vertical-align: middle;
}
.tabulator .tabulator-row.tabulator-group span {
margin-left: 10px;
color: #3FB449;
}
.tabulator .tabulator-footer {
padding: 5px 10px;
padding-top: 8px;
border-top: 3px solid #3FB449;
background-color: #222;
text-align: right;
color: #222;
font-weight: bold;
white-space: nowrap;
-ms-user-select: none;
user-select: none;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
}
.tabulator .tabulator-footer .tabulator-calcs-holder {
box-sizing: border-box;
width: calc("100% + 20px");
margin: -8px -10px 8px -10px;
text-align: left;
background: #3c3c3c !important;
border-bottom: 1px solid #aaa;
overflow: hidden;
}
.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row {
background: #3c3c3c !important;
color: #fff !important;
}
.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle {
display: none;
}
.tabulator .tabulator-footer .tabulator-calcs-holder:only-child {
margin-bottom: -5px;
border-bottom: none;
}
.tabulator .tabulator-footer .tabulator-pages {
margin: 0 7px;
}
.tabulator .tabulator-footer .tabulator-page {
display: inline-block;
margin: 0 2px;
padding: 2px 5px;
border: 1px solid #aaa;
border-radius: 3px;
background: #fff;
color: #222;
font-family: inherit;
font-weight: inherit;
font-size: inherit;
}
.tabulator .tabulator-footer .tabulator-page.active {
color: #3FB449;
}
.tabulator .tabulator-footer .tabulator-page:disabled {
opacity: .5;
}
.tabulator .tabulator-footer .tabulator-page:not(.disabled):hover {
cursor: pointer;
background: rgba(0, 0, 0, 0.2);
color: #fff;
}
.tabulator .tabulator-col-resize-handle {
position: absolute;
right: 0;
top: 0;
bottom: 0;
width: 5px;
}
.tabulator .tabulator-col-resize-handle.prev {
left: 0;
right: auto;
}
.tabulator .tabulator-col-resize-handle:hover {
cursor: ew-resize;
}
.tabulator .tablulator-loader {
position: absolute;
display: -ms-flexbox;
display: flex;
-ms-flex-align: center;
align-items: center;
top: 0;
left: 0;
z-index: 100;
height: 100%;
width: 100%;
background: rgba(0, 0, 0, 0.4);
text-align: center;
}
.tabulator .tablulator-loader .tabulator-loader-msg {
display: inline-block;
margin: 0 auto;
padding: 10px 20px;
border-radius: 10px;
background: #fff;
font-weight: bold;
font-size: 16px;
}
.tabulator .tablulator-loader .tabulator-loader-msg.tabulator-loading {
border: 4px solid #333;
color: #000;
}
.tabulator .tablulator-loader .tabulator-loader-msg.tabulator-error {
border: 4px solid #D00;
color: #590000;
}

3
css/tabulator/tabulator_site.min.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -85,3 +85,64 @@ input[value=Save]:focus, input[value=Close]:focus {
#quantity_error, #anonymous_error { #quantity_error, #anonymous_error {
color: red; color: red;
} }
/* for shop_log */
#shop_log td {
padding: 0px 10px 0px 10px;
}
/* for memberships */
#expired_membership {
color: orchid;
margin-left: 10px;
}
#paid_member {
color: blue;
margin-left: 10px;
}
/* for volunteers */
#volunteer_hours {
color: blueviolet;
margin-left: 10px;
}
/* for stand time */
#stand_time_total {
color: green;
margin-left: 10px;
}
/* spinner for volunteer hour redemption */
#redeemable_hours {
display: none;
margin-left: 10px;
font-size: .9em;
width: 82px;
height: 23px;
}
.ui-spinner {
display: none;
margin-left: 10px;
width: 85px;
height: 26px;
}
}
.ui-widget input {
font-size: .9em;
}
#original_price, #membership_discount, #membership_discount_price, #volunteer_hours_to_membership_discount {
display: none;
color: blueviolet;
}
//.css({color: "#1b691e", textDecoration: "none", cursor: "crosshair"});
.shop_id a {
background-color: #1b691e;
cursor: crosshair;
text-decoration: none;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

713
css/ui/jquery-ui.css vendored Normal file
View File

@ -0,0 +1,713 @@
/*! jQuery UI - v1.12.1 - 2017-07-27
* http://jqueryui.com
* Includes: core.css, button.css, controlgroup.css, checkboxradio.css, spinner.css, theme.css
* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif
* Copyright jQuery Foundation and other contributors; Licensed MIT */
/* Layout helpers
----------------------------------*/
.ui-helper-hidden {
display: none;
}
.ui-helper-hidden-accessible {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
.ui-helper-reset {
margin: 0;
padding: 0;
border: 0;
outline: 0;
line-height: 1.3;
text-decoration: none;
font-size: 100%;
list-style: none;
}
.ui-helper-clearfix:before,
.ui-helper-clearfix:after {
content: "";
display: table;
border-collapse: collapse;
}
.ui-helper-clearfix:after {
clear: both;
}
.ui-helper-zfix {
width: 100%;
height: 100%;
top: 0;
left: 0;
position: absolute;
opacity: 0;
filter:Alpha(Opacity=0); /* support: IE8 */
}
.ui-front {
z-index: 100;
}
/* Interaction Cues
----------------------------------*/
.ui-state-disabled {
cursor: default !important;
pointer-events: none;
}
/* Icons
----------------------------------*/
.ui-icon {
display: inline-block;
vertical-align: middle;
margin-top: -.25em;
position: relative;
text-indent: -99999px;
overflow: hidden;
background-repeat: no-repeat;
}
.ui-widget-icon-block {
left: 50%;
margin-left: -8px;
display: block;
}
/* Misc visuals
----------------------------------*/
/* Overlays */
.ui-widget-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.ui-button {
padding: .4em 1em;
display: inline-block;
position: relative;
line-height: normal;
margin-right: .1em;
cursor: pointer;
vertical-align: middle;
text-align: center;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
/* Support: IE <= 11 */
overflow: visible;
}
.ui-button,
.ui-button:link,
.ui-button:visited,
.ui-button:hover,
.ui-button:active {
text-decoration: none;
}
/* to make room for the icon, a width needs to be set here */
.ui-button-icon-only {
width: 2em;
box-sizing: border-box;
text-indent: -9999px;
white-space: nowrap;
}
/* no icon support for input elements */
input.ui-button.ui-button-icon-only {
text-indent: 0;
}
/* button icon element(s) */
.ui-button-icon-only .ui-icon {
position: absolute;
top: 50%;
left: 50%;
margin-top: -8px;
margin-left: -8px;
}
.ui-button.ui-icon-notext .ui-icon {
padding: 0;
width: 2.1em;
height: 2.1em;
text-indent: -9999px;
white-space: nowrap;
}
input.ui-button.ui-icon-notext .ui-icon {
width: auto;
height: auto;
text-indent: 0;
white-space: normal;
padding: .4em 1em;
}
/* workarounds */
/* Support: Firefox 5 - 40 */
input.ui-button::-moz-focus-inner,
button.ui-button::-moz-focus-inner {
border: 0;
padding: 0;
}
.ui-controlgroup {
vertical-align: middle;
display: inline-block;
}
.ui-controlgroup > .ui-controlgroup-item {
float: left;
margin-left: 0;
margin-right: 0;
}
.ui-controlgroup > .ui-controlgroup-item:focus,
.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
z-index: 9999;
}
.ui-controlgroup-vertical > .ui-controlgroup-item {
display: block;
float: none;
width: 100%;
margin-top: 0;
margin-bottom: 0;
text-align: left;
}
.ui-controlgroup-vertical .ui-controlgroup-item {
box-sizing: border-box;
}
.ui-controlgroup .ui-controlgroup-label {
padding: .4em 1em;
}
.ui-controlgroup .ui-controlgroup-label span {
font-size: 80%;
}
.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
border-left: none;
}
.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
border-top: none;
}
.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
border-right: none;
}
.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
border-bottom: none;
}
/* Spinner specific style fixes */
.ui-controlgroup-vertical .ui-spinner-input {
/* Support: IE8 only, Android < 4.4 only */
width: 75%;
width: calc( 100% - 2.4em );
}
.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
border-top-style: solid;
}
.ui-checkboxradio-label .ui-icon-background {
box-shadow: inset 1px 1px 1px #ccc;
border-radius: .12em;
border: none;
}
.ui-checkboxradio-radio-label .ui-icon-background {
width: 16px;
height: 16px;
border-radius: 1em;
overflow: visible;
border: none;
}
.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
background-image: none;
width: 8px;
height: 8px;
border-width: 4px;
border-style: solid;
}
.ui-checkboxradio-disabled {
pointer-events: none;
}
.ui-spinner {
position: relative;
display: inline-block;
overflow: hidden;
padding: 0;
vertical-align: middle;
}
.ui-spinner-input {
border: none;
background: none;
color: inherit;
padding: .222em 0;
margin: .2em 0;
vertical-align: middle;
margin-left: .4em;
margin-right: 2em;
}
.ui-spinner-button {
width: 1.6em;
height: 50%;
font-size: .5em;
padding: 0;
margin: 0;
text-align: center;
position: absolute;
cursor: default;
display: block;
overflow: hidden;
right: 0;
}
/* more specificity required here to override default borders */
.ui-spinner a.ui-spinner-button {
border-top-style: none;
border-bottom-style: none;
border-right-style: none;
}
.ui-spinner-up {
top: 0;
}
.ui-spinner-down {
bottom: 0;
}
/* Component containers
----------------------------------*/
.ui-widget {
font-family: Arial,Helvetica,sans-serif;
font-size: 1em;
}
.ui-widget .ui-widget {
font-size: 1em;
}
.ui-widget input,
.ui-widget select,
.ui-widget textarea,
.ui-widget button {
font-family: Arial,Helvetica,sans-serif;
font-size: 1em;
}
.ui-widget.ui-widget-content {
border: 1px solid #c5c5c5;
}
.ui-widget-content {
border: 1px solid #dddddd;
background: #ffffff;
color: #333333;
}
.ui-widget-content a {
color: #333333;
}
.ui-widget-header {
border: 1px solid #dddddd;
background: #e9e9e9;
color: #333333;
font-weight: bold;
}
.ui-widget-header a {
color: #333333;
}
/* Interaction states
----------------------------------*/
.ui-state-default,
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default,
.ui-button,
/* We use html here because we need a greater specificity to make sure disabled
works properly when clicked or hovered */
html .ui-button.ui-state-disabled:hover,
html .ui-button.ui-state-disabled:active {
border: 1px solid #c5c5c5;
background: #f6f6f6;
font-weight: normal;
color: #454545;
}
.ui-state-default a,
.ui-state-default a:link,
.ui-state-default a:visited,
a.ui-button,
a:link.ui-button,
a:visited.ui-button,
.ui-button {
color: #454545;
text-decoration: none;
}
.ui-state-hover,
.ui-widget-content .ui-state-hover,
.ui-widget-header .ui-state-hover,
.ui-state-focus,
.ui-widget-content .ui-state-focus,
.ui-widget-header .ui-state-focus,
.ui-button:hover,
.ui-button:focus {
border: 1px solid #cccccc;
background: #ededed;
font-weight: normal;
color: #2b2b2b;
}
.ui-state-hover a,
.ui-state-hover a:hover,
.ui-state-hover a:link,
.ui-state-hover a:visited,
.ui-state-focus a,
.ui-state-focus a:hover,
.ui-state-focus a:link,
.ui-state-focus a:visited,
a.ui-button:hover,
a.ui-button:focus {
color: #2b2b2b;
text-decoration: none;
}
.ui-visual-focus {
box-shadow: 0 0 3px 1px rgb(94, 158, 214);
}
.ui-state-active,
.ui-widget-content .ui-state-active,
.ui-widget-header .ui-state-active,
a.ui-button:active,
.ui-button:active,
.ui-button.ui-state-active:hover {
border: 1px solid #003eff;
background: #007fff;
font-weight: normal;
color: #ffffff;
}
.ui-icon-background,
.ui-state-active .ui-icon-background {
border: #003eff;
background-color: #ffffff;
}
.ui-state-active a,
.ui-state-active a:link,
.ui-state-active a:visited {
color: #ffffff;
text-decoration: none;
}
/* Interaction Cues
----------------------------------*/
.ui-state-highlight,
.ui-widget-content .ui-state-highlight,
.ui-widget-header .ui-state-highlight {
border: 1px solid #dad55e;
background: #fffa90;
color: #777620;
}
.ui-state-checked {
border: 1px solid #dad55e;
background: #fffa90;
}
.ui-state-highlight a,
.ui-widget-content .ui-state-highlight a,
.ui-widget-header .ui-state-highlight a {
color: #777620;
}
.ui-state-error,
.ui-widget-content .ui-state-error,
.ui-widget-header .ui-state-error {
border: 1px solid #f1a899;
background: #fddfdf;
color: #5f3f3f;
}
.ui-state-error a,
.ui-widget-content .ui-state-error a,
.ui-widget-header .ui-state-error a {
color: #5f3f3f;
}
.ui-state-error-text,
.ui-widget-content .ui-state-error-text,
.ui-widget-header .ui-state-error-text {
color: #5f3f3f;
}
.ui-priority-primary,
.ui-widget-content .ui-priority-primary,
.ui-widget-header .ui-priority-primary {
font-weight: bold;
}
.ui-priority-secondary,
.ui-widget-content .ui-priority-secondary,
.ui-widget-header .ui-priority-secondary {
opacity: .7;
filter:Alpha(Opacity=70); /* support: IE8 */
font-weight: normal;
}
.ui-state-disabled,
.ui-widget-content .ui-state-disabled,
.ui-widget-header .ui-state-disabled {
opacity: .35;
filter:Alpha(Opacity=35); /* support: IE8 */
background-image: none;
}
.ui-state-disabled .ui-icon {
filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
}
/* Icons
----------------------------------*/
/* states and images */
.ui-icon {
width: 16px;
height: 16px;
}
.ui-icon,
.ui-widget-content .ui-icon {
background-image: url("images/ui-icons_444444_256x240.png");
}
.ui-widget-header .ui-icon {
background-image: url("images/ui-icons_444444_256x240.png");
}
.ui-state-hover .ui-icon,
.ui-state-focus .ui-icon,
.ui-button:hover .ui-icon,
.ui-button:focus .ui-icon {
background-image: url("images/ui-icons_555555_256x240.png");
}
.ui-state-active .ui-icon,
.ui-button:active .ui-icon {
background-image: url("images/ui-icons_ffffff_256x240.png");
}
.ui-state-highlight .ui-icon,
.ui-button .ui-state-highlight.ui-icon {
background-image: url("images/ui-icons_777620_256x240.png");
}
.ui-state-error .ui-icon,
.ui-state-error-text .ui-icon {
background-image: url("images/ui-icons_cc0000_256x240.png");
}
.ui-button .ui-icon {
background-image: url("images/ui-icons_777777_256x240.png");
}
/* positioning */
.ui-icon-blank { background-position: 16px 16px; }
.ui-icon-caret-1-n { background-position: 0 0; }
.ui-icon-caret-1-ne { background-position: -16px 0; }
.ui-icon-caret-1-e { background-position: -32px 0; }
.ui-icon-caret-1-se { background-position: -48px 0; }
.ui-icon-caret-1-s { background-position: -65px 0; }
.ui-icon-caret-1-sw { background-position: -80px 0; }
.ui-icon-caret-1-w { background-position: -96px 0; }
.ui-icon-caret-1-nw { background-position: -112px 0; }
.ui-icon-caret-2-n-s { background-position: -128px 0; }
.ui-icon-caret-2-e-w { background-position: -144px 0; }
.ui-icon-triangle-1-n { background-position: 0 -16px; }
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
.ui-icon-triangle-1-e { background-position: -32px -16px; }
.ui-icon-triangle-1-se { background-position: -48px -16px; }
.ui-icon-triangle-1-s { background-position: -65px -16px; }
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
.ui-icon-triangle-1-w { background-position: -96px -16px; }
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
.ui-icon-arrow-1-n { background-position: 0 -32px; }
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
.ui-icon-arrow-1-e { background-position: -32px -32px; }
.ui-icon-arrow-1-se { background-position: -48px -32px; }
.ui-icon-arrow-1-s { background-position: -65px -32px; }
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
.ui-icon-arrow-1-w { background-position: -96px -32px; }
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
.ui-icon-arrow-4 { background-position: 0 -80px; }
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
.ui-icon-extlink { background-position: -32px -80px; }
.ui-icon-newwin { background-position: -48px -80px; }
.ui-icon-refresh { background-position: -64px -80px; }
.ui-icon-shuffle { background-position: -80px -80px; }
.ui-icon-transfer-e-w { background-position: -96px -80px; }
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
.ui-icon-folder-collapsed { background-position: 0 -96px; }
.ui-icon-folder-open { background-position: -16px -96px; }
.ui-icon-document { background-position: -32px -96px; }
.ui-icon-document-b { background-position: -48px -96px; }
.ui-icon-note { background-position: -64px -96px; }
.ui-icon-mail-closed { background-position: -80px -96px; }
.ui-icon-mail-open { background-position: -96px -96px; }
.ui-icon-suitcase { background-position: -112px -96px; }
.ui-icon-comment { background-position: -128px -96px; }
.ui-icon-person { background-position: -144px -96px; }
.ui-icon-print { background-position: -160px -96px; }
.ui-icon-trash { background-position: -176px -96px; }
.ui-icon-locked { background-position: -192px -96px; }
.ui-icon-unlocked { background-position: -208px -96px; }
.ui-icon-bookmark { background-position: -224px -96px; }
.ui-icon-tag { background-position: -240px -96px; }
.ui-icon-home { background-position: 0 -112px; }
.ui-icon-flag { background-position: -16px -112px; }
.ui-icon-calendar { background-position: -32px -112px; }
.ui-icon-cart { background-position: -48px -112px; }
.ui-icon-pencil { background-position: -64px -112px; }
.ui-icon-clock { background-position: -80px -112px; }
.ui-icon-disk { background-position: -96px -112px; }
.ui-icon-calculator { background-position: -112px -112px; }
.ui-icon-zoomin { background-position: -128px -112px; }
.ui-icon-zoomout { background-position: -144px -112px; }
.ui-icon-search { background-position: -160px -112px; }
.ui-icon-wrench { background-position: -176px -112px; }
.ui-icon-gear { background-position: -192px -112px; }
.ui-icon-heart { background-position: -208px -112px; }
.ui-icon-star { background-position: -224px -112px; }
.ui-icon-link { background-position: -240px -112px; }
.ui-icon-cancel { background-position: 0 -128px; }
.ui-icon-plus { background-position: -16px -128px; }
.ui-icon-plusthick { background-position: -32px -128px; }
.ui-icon-minus { background-position: -48px -128px; }
.ui-icon-minusthick { background-position: -64px -128px; }
.ui-icon-close { background-position: -80px -128px; }
.ui-icon-closethick { background-position: -96px -128px; }
.ui-icon-key { background-position: -112px -128px; }
.ui-icon-lightbulb { background-position: -128px -128px; }
.ui-icon-scissors { background-position: -144px -128px; }
.ui-icon-clipboard { background-position: -160px -128px; }
.ui-icon-copy { background-position: -176px -128px; }
.ui-icon-contact { background-position: -192px -128px; }
.ui-icon-image { background-position: -208px -128px; }
.ui-icon-video { background-position: -224px -128px; }
.ui-icon-script { background-position: -240px -128px; }
.ui-icon-alert { background-position: 0 -144px; }
.ui-icon-info { background-position: -16px -144px; }
.ui-icon-notice { background-position: -32px -144px; }
.ui-icon-help { background-position: -48px -144px; }
.ui-icon-check { background-position: -64px -144px; }
.ui-icon-bullet { background-position: -80px -144px; }
.ui-icon-radio-on { background-position: -96px -144px; }
.ui-icon-radio-off { background-position: -112px -144px; }
.ui-icon-pin-w { background-position: -128px -144px; }
.ui-icon-pin-s { background-position: -144px -144px; }
.ui-icon-play { background-position: 0 -160px; }
.ui-icon-pause { background-position: -16px -160px; }
.ui-icon-seek-next { background-position: -32px -160px; }
.ui-icon-seek-prev { background-position: -48px -160px; }
.ui-icon-seek-end { background-position: -64px -160px; }
.ui-icon-seek-start { background-position: -80px -160px; }
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
.ui-icon-seek-first { background-position: -80px -160px; }
.ui-icon-stop { background-position: -96px -160px; }
.ui-icon-eject { background-position: -112px -160px; }
.ui-icon-volume-off { background-position: -128px -160px; }
.ui-icon-volume-on { background-position: -144px -160px; }
.ui-icon-power { background-position: 0 -176px; }
.ui-icon-signal-diag { background-position: -16px -176px; }
.ui-icon-signal { background-position: -32px -176px; }
.ui-icon-battery-0 { background-position: -48px -176px; }
.ui-icon-battery-1 { background-position: -64px -176px; }
.ui-icon-battery-2 { background-position: -80px -176px; }
.ui-icon-battery-3 { background-position: -96px -176px; }
.ui-icon-circle-plus { background-position: 0 -192px; }
.ui-icon-circle-minus { background-position: -16px -192px; }
.ui-icon-circle-close { background-position: -32px -192px; }
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
.ui-icon-circle-zoomin { background-position: -176px -192px; }
.ui-icon-circle-zoomout { background-position: -192px -192px; }
.ui-icon-circle-check { background-position: -208px -192px; }
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
.ui-icon-circlesmall-close { background-position: -32px -208px; }
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
.ui-icon-squaresmall-close { background-position: -80px -208px; }
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
/* Misc visuals
----------------------------------*/
/* Corner radius */
.ui-corner-all,
.ui-corner-top,
.ui-corner-left,
.ui-corner-tl {
border-top-left-radius: 3px;
}
.ui-corner-all,
.ui-corner-top,
.ui-corner-right,
.ui-corner-tr {
border-top-right-radius: 3px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-left,
.ui-corner-bl {
border-bottom-left-radius: 3px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-right,
.ui-corner-br {
border-bottom-right-radius: 3px;
}
/* Overlays */
.ui-widget-overlay {
background: #aaaaaa;
opacity: .3;
filter: Alpha(Opacity=30); /* support: IE8 */
}
.ui-widget-shadow {
-webkit-box-shadow: 0px 0px 5px #666666;
box-shadow: 0px 0px 5px #666666;
}

7
css/ui/jquery-ui.min.css vendored Normal file

File diff suppressed because one or more lines are too long

287
css/ui/jquery-ui.structure.css vendored Normal file
View File

@ -0,0 +1,287 @@
/*!
* jQuery UI CSS Framework 1.12.1
* http://jqueryui.com
*
* Copyright jQuery Foundation and other contributors
* Released under the MIT license.
* http://jquery.org/license
*
* http://api.jqueryui.com/category/theming/
*/
/* Layout helpers
----------------------------------*/
.ui-helper-hidden {
display: none;
}
.ui-helper-hidden-accessible {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
.ui-helper-reset {
margin: 0;
padding: 0;
border: 0;
outline: 0;
line-height: 1.3;
text-decoration: none;
font-size: 100%;
list-style: none;
}
.ui-helper-clearfix:before,
.ui-helper-clearfix:after {
content: "";
display: table;
border-collapse: collapse;
}
.ui-helper-clearfix:after {
clear: both;
}
.ui-helper-zfix {
width: 100%;
height: 100%;
top: 0;
left: 0;
position: absolute;
opacity: 0;
filter:Alpha(Opacity=0); /* support: IE8 */
}
.ui-front {
z-index: 100;
}
/* Interaction Cues
----------------------------------*/
.ui-state-disabled {
cursor: default !important;
pointer-events: none;
}
/* Icons
----------------------------------*/
.ui-icon {
display: inline-block;
vertical-align: middle;
margin-top: -.25em;
position: relative;
text-indent: -99999px;
overflow: hidden;
background-repeat: no-repeat;
}
.ui-widget-icon-block {
left: 50%;
margin-left: -8px;
display: block;
}
/* Misc visuals
----------------------------------*/
/* Overlays */
.ui-widget-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.ui-button {
padding: .4em 1em;
display: inline-block;
position: relative;
line-height: normal;
margin-right: .1em;
cursor: pointer;
vertical-align: middle;
text-align: center;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
/* Support: IE <= 11 */
overflow: visible;
}
.ui-button,
.ui-button:link,
.ui-button:visited,
.ui-button:hover,
.ui-button:active {
text-decoration: none;
}
/* to make room for the icon, a width needs to be set here */
.ui-button-icon-only {
width: 2em;
box-sizing: border-box;
text-indent: -9999px;
white-space: nowrap;
}
/* no icon support for input elements */
input.ui-button.ui-button-icon-only {
text-indent: 0;
}
/* button icon element(s) */
.ui-button-icon-only .ui-icon {
position: absolute;
top: 50%;
left: 50%;
margin-top: -8px;
margin-left: -8px;
}
.ui-button.ui-icon-notext .ui-icon {
padding: 0;
width: 2.1em;
height: 2.1em;
text-indent: -9999px;
white-space: nowrap;
}
input.ui-button.ui-icon-notext .ui-icon {
width: auto;
height: auto;
text-indent: 0;
white-space: normal;
padding: .4em 1em;
}
/* workarounds */
/* Support: Firefox 5 - 40 */
input.ui-button::-moz-focus-inner,
button.ui-button::-moz-focus-inner {
border: 0;
padding: 0;
}
.ui-controlgroup {
vertical-align: middle;
display: inline-block;
}
.ui-controlgroup > .ui-controlgroup-item {
float: left;
margin-left: 0;
margin-right: 0;
}
.ui-controlgroup > .ui-controlgroup-item:focus,
.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
z-index: 9999;
}
.ui-controlgroup-vertical > .ui-controlgroup-item {
display: block;
float: none;
width: 100%;
margin-top: 0;
margin-bottom: 0;
text-align: left;
}
.ui-controlgroup-vertical .ui-controlgroup-item {
box-sizing: border-box;
}
.ui-controlgroup .ui-controlgroup-label {
padding: .4em 1em;
}
.ui-controlgroup .ui-controlgroup-label span {
font-size: 80%;
}
.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
border-left: none;
}
.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
border-top: none;
}
.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
border-right: none;
}
.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
border-bottom: none;
}
/* Spinner specific style fixes */
.ui-controlgroup-vertical .ui-spinner-input {
/* Support: IE8 only, Android < 4.4 only */
width: 75%;
width: calc( 100% - 2.4em );
}
.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
border-top-style: solid;
}
.ui-checkboxradio-label .ui-icon-background {
box-shadow: inset 1px 1px 1px #ccc;
border-radius: .12em;
border: none;
}
.ui-checkboxradio-radio-label .ui-icon-background {
width: 16px;
height: 16px;
border-radius: 1em;
overflow: visible;
border: none;
}
.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
background-image: none;
width: 8px;
height: 8px;
border-width: 4px;
border-style: solid;
}
.ui-checkboxradio-disabled {
pointer-events: none;
}
.ui-spinner {
position: relative;
display: inline-block;
overflow: hidden;
padding: 0;
vertical-align: middle;
}
.ui-spinner-input {
border: none;
background: none;
color: inherit;
padding: .222em 0;
margin: .2em 0;
vertical-align: middle;
margin-left: .4em;
margin-right: 2em;
}
.ui-spinner-button {
width: 1.6em;
height: 50%;
font-size: .5em;
padding: 0;
margin: 0;
text-align: center;
position: absolute;
cursor: default;
display: block;
overflow: hidden;
right: 0;
}
/* more specificity required here to override default borders */
.ui-spinner a.ui-spinner-button {
border-top-style: none;
border-bottom-style: none;
border-right-style: none;
}
.ui-spinner-up {
top: 0;
}
.ui-spinner-down {
bottom: 0;
}

5
css/ui/jquery-ui.structure.min.css vendored Normal file
View File

@ -0,0 +1,5 @@
/*! jQuery UI - v1.12.1 - 2017-07-27
* http://jqueryui.com
* Copyright jQuery Foundation and other contributors; Licensed MIT */
.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}

443
css/ui/jquery-ui.theme.css vendored Normal file
View File

@ -0,0 +1,443 @@
/*!
* jQuery UI CSS Framework 1.12.1
* http://jqueryui.com
*
* Copyright jQuery Foundation and other contributors
* Released under the MIT license.
* http://jquery.org/license
*
* http://api.jqueryui.com/category/theming/
*
* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif
*/
/* Component containers
----------------------------------*/
.ui-widget {
font-family: Arial,Helvetica,sans-serif;
font-size: 1em;
}
.ui-widget .ui-widget {
font-size: 1em;
}
.ui-widget input,
.ui-widget select,
.ui-widget textarea,
.ui-widget button {
font-family: Arial,Helvetica,sans-serif;
font-size: 1em;
}
.ui-widget.ui-widget-content {
border: 1px solid #c5c5c5;
}
.ui-widget-content {
border: 1px solid #dddddd;
background: #ffffff;
color: #333333;
}
.ui-widget-content a {
color: #333333;
}
.ui-widget-header {
border: 1px solid #dddddd;
background: #e9e9e9;
color: #333333;
font-weight: bold;
}
.ui-widget-header a {
color: #333333;
}
/* Interaction states
----------------------------------*/
.ui-state-default,
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default,
.ui-button,
/* We use html here because we need a greater specificity to make sure disabled
works properly when clicked or hovered */
html .ui-button.ui-state-disabled:hover,
html .ui-button.ui-state-disabled:active {
border: 1px solid #c5c5c5;
background: #f6f6f6;
font-weight: normal;
color: #454545;
}
.ui-state-default a,
.ui-state-default a:link,
.ui-state-default a:visited,
a.ui-button,
a:link.ui-button,
a:visited.ui-button,
.ui-button {
color: #454545;
text-decoration: none;
}
.ui-state-hover,
.ui-widget-content .ui-state-hover,
.ui-widget-header .ui-state-hover,
.ui-state-focus,
.ui-widget-content .ui-state-focus,
.ui-widget-header .ui-state-focus,
.ui-button:hover,
.ui-button:focus {
border: 1px solid #cccccc;
background: #ededed;
font-weight: normal;
color: #2b2b2b;
}
.ui-state-hover a,
.ui-state-hover a:hover,
.ui-state-hover a:link,
.ui-state-hover a:visited,
.ui-state-focus a,
.ui-state-focus a:hover,
.ui-state-focus a:link,
.ui-state-focus a:visited,
a.ui-button:hover,
a.ui-button:focus {
color: #2b2b2b;
text-decoration: none;
}
.ui-visual-focus {
box-shadow: 0 0 3px 1px rgb(94, 158, 214);
}
.ui-state-active,
.ui-widget-content .ui-state-active,
.ui-widget-header .ui-state-active,
a.ui-button:active,
.ui-button:active,
.ui-button.ui-state-active:hover {
border: 1px solid #003eff;
background: #007fff;
font-weight: normal;
color: #ffffff;
}
.ui-icon-background,
.ui-state-active .ui-icon-background {
border: #003eff;
background-color: #ffffff;
}
.ui-state-active a,
.ui-state-active a:link,
.ui-state-active a:visited {
color: #ffffff;
text-decoration: none;
}
/* Interaction Cues
----------------------------------*/
.ui-state-highlight,
.ui-widget-content .ui-state-highlight,
.ui-widget-header .ui-state-highlight {
border: 1px solid #dad55e;
background: #fffa90;
color: #777620;
}
.ui-state-checked {
border: 1px solid #dad55e;
background: #fffa90;
}
.ui-state-highlight a,
.ui-widget-content .ui-state-highlight a,
.ui-widget-header .ui-state-highlight a {
color: #777620;
}
.ui-state-error,
.ui-widget-content .ui-state-error,
.ui-widget-header .ui-state-error {
border: 1px solid #f1a899;
background: #fddfdf;
color: #5f3f3f;
}
.ui-state-error a,
.ui-widget-content .ui-state-error a,
.ui-widget-header .ui-state-error a {
color: #5f3f3f;
}
.ui-state-error-text,
.ui-widget-content .ui-state-error-text,
.ui-widget-header .ui-state-error-text {
color: #5f3f3f;
}
.ui-priority-primary,
.ui-widget-content .ui-priority-primary,
.ui-widget-header .ui-priority-primary {
font-weight: bold;
}
.ui-priority-secondary,
.ui-widget-content .ui-priority-secondary,
.ui-widget-header .ui-priority-secondary {
opacity: .7;
filter:Alpha(Opacity=70); /* support: IE8 */
font-weight: normal;
}
.ui-state-disabled,
.ui-widget-content .ui-state-disabled,
.ui-widget-header .ui-state-disabled {
opacity: .35;
filter:Alpha(Opacity=35); /* support: IE8 */
background-image: none;
}
.ui-state-disabled .ui-icon {
filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
}
/* Icons
----------------------------------*/
/* states and images */
.ui-icon {
width: 16px;
height: 16px;
}
.ui-icon,
.ui-widget-content .ui-icon {
background-image: url("images/ui-icons_444444_256x240.png");
}
.ui-widget-header .ui-icon {
background-image: url("images/ui-icons_444444_256x240.png");
}
.ui-state-hover .ui-icon,
.ui-state-focus .ui-icon,
.ui-button:hover .ui-icon,
.ui-button:focus .ui-icon {
background-image: url("images/ui-icons_555555_256x240.png");
}
.ui-state-active .ui-icon,
.ui-button:active .ui-icon {
background-image: url("images/ui-icons_ffffff_256x240.png");
}
.ui-state-highlight .ui-icon,
.ui-button .ui-state-highlight.ui-icon {
background-image: url("images/ui-icons_777620_256x240.png");
}
.ui-state-error .ui-icon,
.ui-state-error-text .ui-icon {
background-image: url("images/ui-icons_cc0000_256x240.png");
}
.ui-button .ui-icon {
background-image: url("images/ui-icons_777777_256x240.png");
}
/* positioning */
.ui-icon-blank { background-position: 16px 16px; }
.ui-icon-caret-1-n { background-position: 0 0; }
.ui-icon-caret-1-ne { background-position: -16px 0; }
.ui-icon-caret-1-e { background-position: -32px 0; }
.ui-icon-caret-1-se { background-position: -48px 0; }
.ui-icon-caret-1-s { background-position: -65px 0; }
.ui-icon-caret-1-sw { background-position: -80px 0; }
.ui-icon-caret-1-w { background-position: -96px 0; }
.ui-icon-caret-1-nw { background-position: -112px 0; }
.ui-icon-caret-2-n-s { background-position: -128px 0; }
.ui-icon-caret-2-e-w { background-position: -144px 0; }
.ui-icon-triangle-1-n { background-position: 0 -16px; }
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
.ui-icon-triangle-1-e { background-position: -32px -16px; }
.ui-icon-triangle-1-se { background-position: -48px -16px; }
.ui-icon-triangle-1-s { background-position: -65px -16px; }
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
.ui-icon-triangle-1-w { background-position: -96px -16px; }
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
.ui-icon-arrow-1-n { background-position: 0 -32px; }
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
.ui-icon-arrow-1-e { background-position: -32px -32px; }
.ui-icon-arrow-1-se { background-position: -48px -32px; }
.ui-icon-arrow-1-s { background-position: -65px -32px; }
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
.ui-icon-arrow-1-w { background-position: -96px -32px; }
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
.ui-icon-arrow-4 { background-position: 0 -80px; }
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
.ui-icon-extlink { background-position: -32px -80px; }
.ui-icon-newwin { background-position: -48px -80px; }
.ui-icon-refresh { background-position: -64px -80px; }
.ui-icon-shuffle { background-position: -80px -80px; }
.ui-icon-transfer-e-w { background-position: -96px -80px; }
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
.ui-icon-folder-collapsed { background-position: 0 -96px; }
.ui-icon-folder-open { background-position: -16px -96px; }
.ui-icon-document { background-position: -32px -96px; }
.ui-icon-document-b { background-position: -48px -96px; }
.ui-icon-note { background-position: -64px -96px; }
.ui-icon-mail-closed { background-position: -80px -96px; }
.ui-icon-mail-open { background-position: -96px -96px; }
.ui-icon-suitcase { background-position: -112px -96px; }
.ui-icon-comment { background-position: -128px -96px; }
.ui-icon-person { background-position: -144px -96px; }
.ui-icon-print { background-position: -160px -96px; }
.ui-icon-trash { background-position: -176px -96px; }
.ui-icon-locked { background-position: -192px -96px; }
.ui-icon-unlocked { background-position: -208px -96px; }
.ui-icon-bookmark { background-position: -224px -96px; }
.ui-icon-tag { background-position: -240px -96px; }
.ui-icon-home { background-position: 0 -112px; }
.ui-icon-flag { background-position: -16px -112px; }
.ui-icon-calendar { background-position: -32px -112px; }
.ui-icon-cart { background-position: -48px -112px; }
.ui-icon-pencil { background-position: -64px -112px; }
.ui-icon-clock { background-position: -80px -112px; }
.ui-icon-disk { background-position: -96px -112px; }
.ui-icon-calculator { background-position: -112px -112px; }
.ui-icon-zoomin { background-position: -128px -112px; }
.ui-icon-zoomout { background-position: -144px -112px; }
.ui-icon-search { background-position: -160px -112px; }
.ui-icon-wrench { background-position: -176px -112px; }
.ui-icon-gear { background-position: -192px -112px; }
.ui-icon-heart { background-position: -208px -112px; }
.ui-icon-star { background-position: -224px -112px; }
.ui-icon-link { background-position: -240px -112px; }
.ui-icon-cancel { background-position: 0 -128px; }
.ui-icon-plus { background-position: -16px -128px; }
.ui-icon-plusthick { background-position: -32px -128px; }
.ui-icon-minus { background-position: -48px -128px; }
.ui-icon-minusthick { background-position: -64px -128px; }
.ui-icon-close { background-position: -80px -128px; }
.ui-icon-closethick { background-position: -96px -128px; }
.ui-icon-key { background-position: -112px -128px; }
.ui-icon-lightbulb { background-position: -128px -128px; }
.ui-icon-scissors { background-position: -144px -128px; }
.ui-icon-clipboard { background-position: -160px -128px; }
.ui-icon-copy { background-position: -176px -128px; }
.ui-icon-contact { background-position: -192px -128px; }
.ui-icon-image { background-position: -208px -128px; }
.ui-icon-video { background-position: -224px -128px; }
.ui-icon-script { background-position: -240px -128px; }
.ui-icon-alert { background-position: 0 -144px; }
.ui-icon-info { background-position: -16px -144px; }
.ui-icon-notice { background-position: -32px -144px; }
.ui-icon-help { background-position: -48px -144px; }
.ui-icon-check { background-position: -64px -144px; }
.ui-icon-bullet { background-position: -80px -144px; }
.ui-icon-radio-on { background-position: -96px -144px; }
.ui-icon-radio-off { background-position: -112px -144px; }
.ui-icon-pin-w { background-position: -128px -144px; }
.ui-icon-pin-s { background-position: -144px -144px; }
.ui-icon-play { background-position: 0 -160px; }
.ui-icon-pause { background-position: -16px -160px; }
.ui-icon-seek-next { background-position: -32px -160px; }
.ui-icon-seek-prev { background-position: -48px -160px; }
.ui-icon-seek-end { background-position: -64px -160px; }
.ui-icon-seek-start { background-position: -80px -160px; }
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
.ui-icon-seek-first { background-position: -80px -160px; }
.ui-icon-stop { background-position: -96px -160px; }
.ui-icon-eject { background-position: -112px -160px; }
.ui-icon-volume-off { background-position: -128px -160px; }
.ui-icon-volume-on { background-position: -144px -160px; }
.ui-icon-power { background-position: 0 -176px; }
.ui-icon-signal-diag { background-position: -16px -176px; }
.ui-icon-signal { background-position: -32px -176px; }
.ui-icon-battery-0 { background-position: -48px -176px; }
.ui-icon-battery-1 { background-position: -64px -176px; }
.ui-icon-battery-2 { background-position: -80px -176px; }
.ui-icon-battery-3 { background-position: -96px -176px; }
.ui-icon-circle-plus { background-position: 0 -192px; }
.ui-icon-circle-minus { background-position: -16px -192px; }
.ui-icon-circle-close { background-position: -32px -192px; }
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
.ui-icon-circle-zoomin { background-position: -176px -192px; }
.ui-icon-circle-zoomout { background-position: -192px -192px; }
.ui-icon-circle-check { background-position: -208px -192px; }
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
.ui-icon-circlesmall-close { background-position: -32px -208px; }
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
.ui-icon-squaresmall-close { background-position: -80px -208px; }
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
/* Misc visuals
----------------------------------*/
/* Corner radius */
.ui-corner-all,
.ui-corner-top,
.ui-corner-left,
.ui-corner-tl {
border-top-left-radius: 3px;
}
.ui-corner-all,
.ui-corner-top,
.ui-corner-right,
.ui-corner-tr {
border-top-right-radius: 3px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-left,
.ui-corner-bl {
border-bottom-left-radius: 3px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-right,
.ui-corner-br {
border-bottom-right-radius: 3px;
}
/* Overlays */
.ui-widget-overlay {
background: #aaaaaa;
opacity: .3;
filter: Alpha(Opacity=30); /* support: IE8 */
}
.ui-widget-shadow {
-webkit-box-shadow: 0px 0px 5px #666666;
box-shadow: 0px 0px 5px #666666;
}

5
css/ui/jquery-ui.theme.min.css vendored Normal file

File diff suppressed because one or more lines are too long

121
examples/headers.txt Normal file
View File

@ -0,0 +1,121 @@
# Just a document to keep track about what all the included header files do, and why there are so many.
include_header.html is in:
contact_add_edit_select.php
individual_history_log.php
individual_hours_log.php
location_add_edit.php
location_add_edit.php
location_add_edit_select.php
shop_welcome.php
stats.php
transaction_log.php
[Identical to include_header_shop with the exception of jquery-ui .. no big advantage]
<link href="css/transactions.css" rel="stylesheet" type="text/css" />
<link href="css/contacts.css" rel="stylesheet" type="text/css" />
<link href="css/css_yb_standard.css" rel="stylesheet" type="text/css" />
<link href="css/jquery.nouislider.css" rel="stylesheet" type="text/css" />
<link href="css/chosen.css" rel="stylesheet" type="text/css" />
<link href="css/ui/jquery-ui.css" rel="stylesheet" type="text/css" />
<script src="js/jquery-2.1.1.js"></script>
<script src="js/transaction.js"></script>
<script src="js/contact.js"></script>
<script src="js/shop.js"></script>
<script src="js/jquery.mask.js"></script>
<script src="js/jquery.jeditable.js"></script>
<script src="js/jquery.nouislider.js"></script>
<script src="js/chosen.jquery.js"></script>
<script src="js/jquery.liblink.js"></script>
<script src="js/wNumb.js"></script>
<script src="js/ui/jquery-ui.js"></script>
include_header_shop.html is in:
shop_log.php
start_shop.php
[Because it has different body layout, namely the inclusion of About/Help]
<link href="css/transactions.css" rel="stylesheet" type="text/css" />
<link href="css/contacts.css" rel="stylesheet" type="text/css" />
<link href="css/css_yb_standard.css" rel="stylesheet" type="text/css" />
<link href="css/jquery.nouislider.css" rel="stylesheet" type="text/css" />
<link href="css/chosen.css" rel="stylesheet" type="text/css" />
<script src="js/jquery-2.1.1.js"></script>
<script src="js/transaction.js"></script>
<script src="js/contact.js"></script>
<script src="js/shop.js"></script>
<script src="js/jquery.mask.js"></script>
<script src="js/jquery.jeditable.js"></script>
<script src="js/jquery.nouislider.js"></script>
<script src="js/chosen.jquery.js"></script>
<script src="js/jquery.liblink.js"></script>
<script src="js/wNumb.js"></script>
include_header_contacts.html is in:
contact_add_edit.php
[Identical to include_header_shop with the exception of transactions.css, transactions.js and shop.js,
if these files are included the slider gets slightly messed up in appearance.]
<link href="css/contacts.css" rel="stylesheet" type="text/css" />
<link href="css/css_yb_standard.css" rel="stylesheet" type="text/css" />
<link href="css/jquery.nouislider.contacts.css" rel="stylesheet" type="text/css" />
<link href="css/chosen.css" rel="stylesheet" type="text/css" />
<script src="js/jquery-2.1.1.js"></script>
<script src="js/contact.js"></script>
<script src="js/jquery.mask.js"></script>
<script src="js/jquery.jeditable.js"></script>
<script src="js/jquery.nouislider.js"></script>
<script src="js/chosen.jquery.js"></script>
<script src="js/jquery.liblink.js"></script>
<script src="js/wNumb.js"></script>
include_header_stats.html is in:
stats/*
[important because it defines correct path]
<link href="../css/css_yb_standard.css" rel="stylesheet" type="text/css" />
<link href="../css/pickmeup.css" rel="stylesheet" type="text/css" />
<link href="../css/stats.css" rel="stylesheet" type="text/css" />
<script src="../js/jquery-2.1.1.js"></script>
<script src="../js/jquery.pickmeup.js"></script>
<script src="../js/stats.js"></script>
REMOVED:
include_header_start_shop.html is in:
start_shop.php
[identical to include_header_shop.html]
<link href="css/transactions.css" rel="stylesheet" type="text/css" />
<link href="css/contacts.css" rel="stylesheet" type="text/css" />
<link href="css/css_yb_standard.css" rel="stylesheet" type="text/css" />
<link href="css/jquery.nouislider.css" rel="stylesheet" type="text/css" />
<link href="css/chosen.css" rel="stylesheet" type="text/css" />
<script src="js/jquery-2.1.1.js"></script>
<script src="js/transaction.js"></script>
<script src="js/contact.js"></script>
<script src="js/shop.js"></script>
<script src="js/jquery.mask.js"></script>
<script src="js/jquery.jeditable.js"></script>
<script src="js/jquery.nouislider.js"></script>
<script src="js/chosen.jquery.js"></script>
<script src="js/jquery.liblink.js"></script>
<script src="js/wNumb.js"></script>

View File

@ -8,28 +8,97 @@ B. htpasswd -Bc -C 10 htpasswd test (note that bcrypt is used)
C. chown www-data:www-data /var/htpasswd; chmod 0400 /var/htpasswd; \ C. chown www-data:www-data /var/htpasswd; chmod 0400 /var/htpasswd; \
D. <Directory /var/www/html> D. In associated virtual host file, e.g. default-ssl.conf:
<Directory /var/www/html>
Authtype Basic Authtype Basic
Authname "Amazing Community Bike Shop Login" Authname "Amazing Community Bike Shop Login"
Require user someuser Require user someuser
AuthUserFile /var/htpasswd AuthUserFile /var/htpasswd
</Directory> </Directory>
SSL (do not settle for anything less) SSL (do not settle for anything less)
Under Debian: - SELF-SIGNED
A. openssl req -new -x509 -nodes -out ssl-cert-snakeoil.pem -days 36500 -keyout ssl-cert-snakeoil.key (100 year certificate) Under Debian (updated for Chrome 58 or greater):
B. cp ssl-cert-snakeoil.key /etc/ssl/private/
cp ssl-cert-snakeoil.pem /etc/ssl/certs/
C. a2enmod ssl;
a2ensite default-ssl.conf; (standard on debian-based distributions .. add <Directory> stanza above)
a2dissite 000-default.conf;
I.
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 36500 -out rootCA.pem
create this file - v3.ext:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = %%DOMAIN%%
Run this script in same directory as v3.ext file:
if [ -z "$1" ]
then
echo "Please supply a domain to create a certificate for";
echo "e.g. mysite.com"
exit;
fi
# Create a new private key if one doesnt exist, or use the existing one if it does
if [ -f device.key ]; then
KEY_OPT="-key"
else
KEY_OPT="-keyout"
fi
DOMAIN=$1
COMMON_NAME=${2:-*.$1}
SUBJECT="/C=CA/ST=None/L=NB/O=None/CN=$COMMON_NAME"
NUM_OF_DAYS=36500
openssl req -new -newkey rsa:2048 -sha256 -nodes $KEY_OPT device.key -subj "$SUBJECT" -out device.csr
cat v3.ext | sed s/%%DOMAIN%%/$COMMON_NAME/g > /tmp/__v3.ext
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days $NUM_OF_DAYS -sha256 -extfile /tmp/__v3.ext
# move output files to final filenames
mv device.csr $DOMAIN.csr
cp device.crt $DOMAIN.crt
# remove temp file
rm -f device.crt;
echo
echo "###########################################################################"
echo Done!
echo "###########################################################################"
echo "To use these files on your server, simply copy both $DOMAIN.csr and"
echo "device.key to your webserver, and use like so (if Apache, for example)"
echo
echo " SSLCertificateFile /path_to_your_files/$DOMAIN.crt"
echo " SSLCertificateKeyFile /path_to_your_files/device.key"
II. cp device.key /etc/ssl/private/ssl-cert-snakeoil.key
cp mysite.com.csr /etc/ssl/certs/ssl-cert-snakeoil.pem
III. a2enmod ssl;
a2ensite default-ssl.conf; (standard on debian-based distributions)
add certs to the SSLCertificateFile and SSLCertificateKeyFile directives in default-ssl.conf
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
a2dissite 000-default.conf;
service apache2 restart
In the Chromium broswer: chrome://settings/certificates
Choose IMPORT in AUTHORITIES
Upload the public certificate you created, e.g. rootCA.key
check "Trust this certificate for identifying websites"
- LETSENCRYPT
A preferable alternative would be to use letsencrypt. If you are using a reverse proxy, usually nginx-proxy,
make certain that HTTP_X_FORWARDED_FOR is used for identifying the originating IP address,
because YBDB shops keep track of their unique ip.
TERMINAL AUTOMATION AND SECURITY TERMINAL AUTOMATION AND SECURITY
Firefox (IceWeasel): Firefox (IceWeasel); note that Chrome below, provides the most recent instructions:
1. Download KeePass v2 zip - http://keepass.info/download.html 1. Download KeePass v2 zip - http://keepass.info/download.html
2. Unzip in ~/KeePass 2. Unzip in ~/KeePass
3. sudo chown root:root ~/KeePass; sudo chmod 0755 ~/KeePass; 3. sudo chown root:root ~/KeePass; sudo chmod 0755 ~/KeePass;
@ -37,9 +106,8 @@ Firefox (IceWeasel):
5. run .. mono KeePass.exe, create database and a key file in ~/KeePass 5. run .. mono KeePass.exe, create database and a key file in ~/KeePass
6. mv KeePass.config.xml KeePass.config.enforced.xml 6. mv KeePass.config.xml KeePass.config.enforced.xml
7. sudo chown root:root KeePass.config.enforced.xml (and database/key file) 7. sudo chown root:root KeePass.config.enforced.xml (and database/key file)
8. sudo chmod 0444 KeePass.config.enforced.xml 8. sudo chmod 0400 KeePass.config.enforced.xml
9. Most importantly in KeePass.config.enforced.xml between <Security> change true to 9. See Chrome for KeePass.config.enforced.xml policy changes.
<Policy><UnhidePasswords>false</UnhidePasswords></Policy> so that passwords cannot be seen.
10. In Debian/Ubuntu: apt-get install mono-runtime mono-devel 10. In Debian/Ubuntu: apt-get install mono-runtime mono-devel
11. Install KeeFox extension from https://addons.mozilla.org/en-us/firefox/addon/keefox/ 11. Install KeeFox extension from https://addons.mozilla.org/en-us/firefox/addon/keefox/
12. KeeFox will tell you where to copy KeePassRPC.plgx from into the plugins directory 12. KeeFox will tell you where to copy KeePassRPC.plgx from into the plugins directory
@ -50,50 +118,218 @@ Firefox (IceWeasel):
the whole process can be completely automated in KeeFox options. the whole process can be completely automated in KeeFox options.
16. In Firefox (IceWeasel) Preferences -> General use "When IceWeasel starts: Show my windows and tabs from the last time" 16. In Firefox (IceWeasel) Preferences -> General use "When IceWeasel starts: Show my windows and tabs from the last time"
17. Afterwards, you can sudo chown -R root:root ~/KeePass/* 17. Afterwards, you can sudo chown -R root:root ~/KeePass/*
sudo chmod 0400 ~/KeePass/*
You may need to make adjustments for plugins. You may need to make adjustments for plugins.
Then run with sudo, see "Chrome (visudo)" to learn how to do this.
Chrome: Chrome:
1. Download KeePass zip - http://keepass.info/download.html 1. Install keepass2: sudo apt-get install keepass2
2. Unzip in ~/KeePass
3. sudo chown root:root ~/KeePass; sudo chmod 0755 ~/KeePass;
4. run .. mono KeePass.exe, create database and a key file in ~/KeePass
5. mv KeePass.config.xml KeePass.config.enforced.xml
6. sudo chown root:root KeePass.config.enforced.xml (and database/key file)
7. sudo chmod 0444 KeePass.config.enforced.xml
8. Most importantly in KeePass.config.enforced.xml between <Security> change true to
<Policy><UnhidePasswords>false</UnhidePasswords></Policy> so that passwords cannot be seen.
9. When setting up password database for KeePass use only a key file.
10. Add the url along with username and password in the database.
11. In Debian/Ubuntu: apt-get install mono-runtime mono-devel
12. Install extension chromeIPass
13. Install keepasshttp as explained at https://github.com/pfn/keepasshttp/ (put KeePassHttp.plgx in ~/KeePass)
14. Follow the directions chromeIPass gives you, creating an identifier
15. Good idea to restart chrome.
16. In Chrome Settings "On Startup Continue where you left off"
17. Afterwards, you can sudo chown -R root:root ~/KeePass/*
You may need to make adjustments for plugins.
2. Optional: Install libsecret-tools: sudo apt-get install libsecret-tools
secret-tool store --label="PositiveSpin" keepass pos (remember password)
(Depending on your distribution) Open Menu -> Control Menu -> Security -> Password and Keys
Right-click on the "login" keyring
Select "Change password"
Enter your old password and leave the new password blank
Press ok
You may want to remove Password and Keys from the menu,
E.g. see https://wiki.lxde.org/en/Main_Menu if using lxde:
- sudo mv seahorse.desktop /root; lxpanelctl restart
3. run keepass2;
create new password database in ~/keepass
assign password created with secret-tool to Master password
create key file in ~/keepass, or even better, in a secret place
In the password datatase, add the url for YBDB, username and password (created with htpasswd)
close keepass2
sudo chown -R root:root ~/keepass
sudo chmod -R 0400 ~/keepass (change to 0600 if you want to change password, then back to 0400 when done)
4. SECURITY - The easiest ways to learn about the name of policies which can be disabled are simply
to unclick them in Tools -> Options -> Policy, and then look at the additions to <Security></Security> in
/usr/lib/keepass2/KeePass.config.xml after exiting the program; security changes don't apply
until restarting the program. Caveat, make sure that the xml is properly formed.
These policies can be added between <Policy> in KeePass.config.enforced.xml. Independently of
using KeePass.config.enforced.xml, the key database could be looked at, however,
the owner (root), 0400 permissions, and KeePass.config.enforced.xml prevent the database
from being copied anywhere, and the key file would be required as well to gain access.
Secret tools only provides a low-level layer of security with a master password passed by stdin,
and is optional (and may be a liability on a public computer). Keepass has auditing capability
via triggers, see https://keepass.info/help/kb/trigger_examples.html#audit, if your want to monitor events.
It should be noted that keepassxc does not provide the rich set of policies that keepass does,
which rules out this newer program.
cd /usr/lib/keepass2; \
sudo touch KeePass.config.enforced.xml
edit file and add between <Configuration></Configuration>
<?xml version="1.0" encoding="utf-8"?>
<Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Meta>
<PreferUserConfiguration>false</PreferUserConfiguration>
</Meta>
<Security>
<Policy>
<UnhidePasswords>false</UnhidePasswords>
<NewFile>false</NewFile>
<SaveFile>false</SaveFile>
<Export>false</Export>
<Import>false</Import>
<Copy>false</Copy>
<Print>false</Print>
<ChangeMasterKey>false</ChangeMasterKey>
<Delete>false</Delete>
</Policy>
<WorkspaceLocking>
<AlwaysExitInsteadOfLocking>true</AlwaysExitInsteadOfLocking>
</WorkspaceLocking>
</Security>
</Configuration>
sudo chmod 0400 KeePass.config.enforced.xml
[doc: https://keepass.info/help/base/configuration.htm]
5. Install keepasshttp from https://github.com/pfn/keepasshttp/ by putting KeePassHttp.plgx in /usr/lib/keepass2;
sudo chmod 0644 /usr/lib/keepass2/KeePassHttp.plgx
sudo apt-get install libmono-system-xml-linq4.0-cil libmono-system-data-datasetextensions4.0-cil \
libmono-system-runtime-serialization4.0-cil mono-mcs
6. Install chrome extension chromeIPass
You may have to uncheck:
Activate password generator.
Automatically fill-in single credentials entry.
Activate autocomplete for username fields
7. Follow the directions chromeIPass gives you, creating an identifier
https://github.com/pfn/passifox/blob/master/documentation/chromeIPass.md goes into more detail
8. sudo su; visudo
after: %sudo ALL=(ALL:ALL) ALL
add: pos ALL=(ALL) NOPASSWD: /usr/bin/keepass2 (note pos is an example user account being used for X11)
9. In Chrome Settings "On Startup Continue where you left off" or
"Open a specific page or set of pages" and add the YBDB POS url as one of those specific pages
10. Add to desktop startup (see below). Test changes by logging out, and logging back into the WM.
DESKTOP STARTUP DESKTOP STARTUP
1. LXDE - put a file with this format in ~/.config/auto with name of *desktop, e.g. keepass.desktop: 1. LXDE - put a file with this format in ~/.config/autostart with name of *desktop, e.g. keepass.desktop:
[Desktop Entry] [Desktop Entry]
Type=Application Type=Application
Exec=/usr/bin/mono /home/ps/KeePass/KeePass.exe Exec=bash -c "secret-tool lookup keepass pos | sudo keepass2 /home/pos/keepass/PositiveSpin.kdbx -pw-stdin -keyfile:/home/pos/keepass/PositiveSpin.key"
Where keepass2 is a file in /usr/bin (0755 perms)
#!/bin/sh
# e.g. in this case KeePass.exe was intalled in users home, rather than /usr/lib/keepass2
exec /usr/bin/cli /home/pos/KeePass/KeePass.exe "$@"
2. Gnome based Window manager, e.g. Mate - open gnome-session-properties from commandline, 2. Gnome based Window manager, e.g. Mate - open gnome-session-properties from commandline,
and add startup application. and add startup application.
SPECIAL NOTES
With the combination of keepass2 and httpasswd, it is possible to fine tune access. For instance, there could be a
sign-in computer allowing access only to shop_log.php, shop_welcome.php, contact_add_edit_select.php, and
contact_add_edit.php, and another computer for volunteer staff allowing access to almost everything,
including transaction_log.php, perhaps with the exclusion of certain reports that should only be available
to the volunteer coordinator.
https://wiki.apache.org/httpd/BypassAuthenticationOrAuthorizationRequirements provides good details how this is done:
E.g., we want paid_members.php to be accessible via a completely different password under Apache for our paid members team:
<FilesMatch "\.(php|paid_members\.php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /var/www/html/js>
Order allow,deny
Allow from all
Satisfy any
</Directory>
<Directory /var/www/html/css>
Order allow,deny
Allow from all
Satisfy any
</Directory>
<Directory /var/www/html>
Authtype Basic
Authname "Amazing Community Bike Shop Login"
Require user someuser
AuthUserFile /var/htpasswd
</Directory>
<Files "paid_members.php">
Authtype Basic
Authname "Paid Members Login"
Require user paid_members_team
AuthUserFile /var/htpasswd
</Files>
How to get that working with keepass2 should be obvious.
SUSPENDING COMPUTER SUSPENDING COMPUTER
Example commands that bring up the gui setting tool: Example commands that bring up the gui setting tool:
1. xfce4-power-manager-settings (eg., used by wattos for LXDE) 1. xfce4-power-manager-settings (eg., used by wattos for LXDE)
2. mate-power-manager-settings or mate-power-preferences 2. mate-power-manager-settings or mate-power-preferences
BIOS / UEFI (recommended)
Turn off booting of external devices; disable unnecessary external ports; password protect BIOS setup.
Remember the password. There are some ways to reset passwords, if forgotten, but depending on the hardware,
it is not always straight-forward, e.g., resetting the CMOS.
GRUB2 PASSWORD PROTECT (mandatory)
In order to prevent individuals from casually booting into single mode or a shell,
password protecting GRUB with an encrypted password is mandatory.
https://help.ubuntu.com/community/Grub2/Passwords gives good instructions
1. In /etc/grub.d/10_linux change
CLASS="--class gnu-linux --class gnu --class os"
to
CLASS="--class gnu-linux --class gnu --class os --unrestricted"
2. Create an encrypted password with grub-mkpasswd-pbkdf2, producing something like
grub.pbkdf2.sha512.10000.80E702585F80C8D70D4BC75
3. In /etc/grub.d/40_custom add:
set superusers="MyUserName"
password_pbkdf2 MyUserName grub.pbkdf2.sha512.10000.80E702585F80C8D70D4BC75
# if you are using GRUB 2 1.99 the next line needs to be uncommented
# export superusers
4. sudo chmod 0700 40_custom
5. update-grub2
SSD or HD ENCRYPTION (optional)
If a sign-in computers unencrypted drive goes missing (or is stolen), it should (in most cases)
be pretty obvious, and you would want to change YBDB's htpasswd and root password for the computer. However, if you
want to "help" prevent a detached drive from being accessed, utilitizing an encrypted partition or file container,
for the keepass2 system discussed above, would be one way to go, although, even that can be accessed with a few steps,
and some forensics (https://dfir.science/2014/08/how-to-brute-forcing-password-cracking.html). While most modern
distributions provide an option to encrypt the whole installation, some good reasons for not wanting to do this
include a performance hit, and a more complex recovery. When deciding to go the encryption route, you need to weigh
in the advantages and disadvantages for encrypting while factoring into the equation the nature of the environment
the computer will be located within.
SUMMARY SUMMARY
There are other things that can be done within the terminal to prevent tampering, e.g., read-only environment, There are other things that can be done within the terminal to prevent tampering, e.g., kiosk or read-only environment,
an expect or curl script, etc. rather than KeePass, but what is above protects the password from hacking, eavesdropping, an expect or curl script, etc. rather than KeePass, but what is above protects the password from hacking, eavesdropping,
and from regular users in the shop, basically, only the sysadmin and bookkeeper should have remote access via the password. and from regular users in the shop, basically, only the sysadmin and bookkeeper should have remote access via the password.
So while YBDB is on the internet, it will only be available to the terminal(s) you allow it to be on, and So while YBDB is on the internet, it will only be available to the terminal(s) you allow it to be on, and
@ -101,9 +337,3 @@ the Point of Sale will be at the proper location which is usually the front of t
walk-in/walk-out. walk-in/walk-out.
Word of wisdom: It is always good practice to occasionally change the password. Word of wisdom: It is always good practice to occasionally change the password.

View File

@ -1,3 +1,11 @@
<div class="footer">
Send feedback about YBDB
<span class="footer-line">
<a href="https://github.com/fspc/Yellow-Bike-Database/issues" target="_blank">Bugs</a> |
<a href="https://github.com/fspc/Yellow-Bike-Database/wiki" target="_blank">Wiki</a> |
<a href="https://github.com/fspc/Yellow-Bike-Database/wiki/Development" target="_blank">Contribute</a>
</span>
</div>
</td> </td>
</tr> </tr>
</table> </table>

View File

@ -23,27 +23,72 @@ function resetTimer()
<title>YBDB</title> <title>YBDB</title>
<link href="css/transactions.css" rel="stylesheet" type="text/css" /> <link href="css/transactions.css" rel="stylesheet" type="text/css" />
<link href="css/contacts.css" rel="stylesheet" type="text/css" /> <link href="css/contacts.css" rel="stylesheet" type="text/css" />
<link href="css/stats.css" rel="stylesheet" type="text/css" />
<link href="css/css_yb_standard.css" rel="stylesheet" type="text/css" /> <link href="css/css_yb_standard.css" rel="stylesheet" type="text/css" />
<link href="css/jquery.nouislider.css" rel="stylesheet" type="text/css" /> <link href="css/jquery.nouislider.css" rel="stylesheet" type="text/css" />
<link href="css/chosen.css" rel="stylesheet" type="text/css" /> <link href="css/chosen.css" rel="stylesheet" type="text/css" />
<link href="css/ui/jquery-ui.css" rel="stylesheet" type="text/css" />
<link href="css/tabulator/tabulator_site.min.css" rel="stylesheet" type="text/css" />
<script src="js/jquery-2.1.1.js"></script> <script src="js/jquery-2.1.1.js"></script>
<script src="js/transaction.js"></script> <script src="js/transaction.js"></script>
<script src="js/contact.js"></script> <script src="js/contact.js"></script>
<script src="js/shop.js"></script> <script src="js/shop.js"></script>
<script src="js/reports.js"></script>
<script src="js/jquery.mask.js"></script> <script src="js/jquery.mask.js"></script>
<script src="js/jquery.jeditable.js"></script> <script src="js/jquery.jeditable.js"></script>
<script src="js/jquery.nouislider.js"></script> <script src="js/jquery.nouislider.js"></script>
<script src="js/chosen.jquery.js"></script> <script src="js/chosen.jquery.js"></script>
<script src="js/jquery.liblink.js"></script> <script src="js/jquery.liblink.js"></script>
<script src="js/wNumb.js"></script> <script src="js/wNumb.js"></script>
<script src="js/ui/jquery-ui.js"></script>
<script src="js/moment/moment.js"></script>
<script src="js/tabulator/dist/js/tabulator.min.js"></script>
<script src="js/etherpad.js"></script>
<script src="js/jquery.ns-autogrow/dist/jquery.ns-autogrow.js"></script>
<script>
$(function() {
// prevent a double etherpad if shop_log_iframe is clicked on after a shop closes
$("#shop_log_link").on("click keypress", function(e) {
$.post("json/transaction.php", {shop_exist: 1}, function(data) {
if (data === "no_shop") {
window.top.location.href = "./start_shop.php";
}
});
});
if ( document.location.pathname.match(/shop_welcome\.php$/) ) {
$("#shop_log_link").attr("href","/shop_log_iframe.php");
} else {
$("#shop_log_link").attr("href","/shop_log.php");
}
});
</script>
</head> </head>
<body class="yb_standard"> <body class="yb_standard">
<table align="center" width="1000" border="0" cellpadding="1" cellspacing="0"> <table align="center" width="1000" border="0" cellpadding="1" cellspacing="0">
<tr valign="top"> <tr valign="top">
<td height="40" align="right"><a href="/shop_log.php">Current Shop</a> | <a href="/start_shop.php"> All Shops</a> | <a href="/contact_add_edit_select.php">Add/Edit Contact</a> | <a href="/stats.php">Statistics</a> | <a href="/transaction_log.php">Transaction Log</a> | <a href="http://www.positivespin.org/home2/" target="_blank">PS Home</a></td> <td height="40" align="right"><a id="shop_log_link" href="/shop_log.php">Current Shop</a> | <a href="/start_shop.php" target="_parent"> All Shops</a> | <a href="/contact_add_edit_select.php" target="_parent">Add/Edit Contact</a> | <a href="/stats.php" target="_parent">Reports</a> | <a href="/transaction_log.php" target="_parent">Transaction Log</a> | <a href="http://www.positivespin.org" target="_blank">PS Home</a></td>
</tr> </tr>
<tr> <tr>
<td> <td>
<!--
<div style="float: left; width: 12.5%; height: 40px; display: inline-block;"></div>
<div style="float: left; align-content: center; width: 75%; height: 40px; display: inline-block;">
<div align="right"><a id="shop_log_link" href="/shop_log.php">Current Shop</a> |
<a href="/start_shop.php" target="_parent"> All Shops</a> |
<a href="/contact_add_edit_select.php" target="_parent">Add/Edit Contact</a> |
<a href="/stats.php" target="_parent">Reports</a> |
<a href="/transaction_log.php" target="_parent">Transaction Log</a> |
<a href="http://www.positivespin.org" target="_blank">PS Home</a></div>
</div>
<div style="float: left; width: 12.5%; height: 40px; display: inline-block;"></div>
<div style="float: left; width: 12.5%; height: 100%; display: inline-block;"></div>
<table style="float: left; width: 75%; display: inline-block;" align="center" border="0" cellpadding="1" cellspacing="0"><tr><td>
-->

View File

@ -40,7 +40,7 @@ function resetTimer()
<body class="yb_standard"> <body class="yb_standard">
<table align="center" width="1000" border="0" cellpadding="1" cellspacing="0"> <table align="center" width="1000" border="0" cellpadding="1" cellspacing="0">
<tr valign="top"> <tr valign="top">
<td height="40" align="right"><a href="/shop_log.php">Current Shop</a> | <a href="/start_shop.php"> All Shops</a> | <a href="/contact_add_edit_select.php">Add/Edit Contact</a> | <a href="/stats.php">Statistics</a> | <a href="/transaction_log.php">Transaction Log</a> | <a href="http://www.positivespin.org/home2/" target="_blank">PS Home</a></td> <td height="40" align="right"><a href="/shop_log.php">Current Shop</a> | <a href="/start_shop.php"> All Shops</a> | <a href="/contact_add_edit_select.php">Add/Edit Contact</a> | <a href="/stats.php">Reports</a> | <a href="/transaction_log.php">Transaction Log</a> | <a href="http://www.positivespin.org" target="_blank">PS Home</a></td>
</tr> </tr>
<tr> <tr>
<td> <td>

View File

@ -19,7 +19,7 @@ function resetTimer()
<html xmlns="http://www.w3.org/1999/xhtml"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>YBDB</title> <title>YBDB</title>
<link href="css/transactions.css" rel="stylesheet" type="text/css" /> <link href="css/transactions.css" rel="stylesheet" type="text/css" />
<link href="css/contacts.css" rel="stylesheet" type="text/css" /> <link href="css/contacts.css" rel="stylesheet" type="text/css" />
@ -37,14 +37,103 @@ function resetTimer()
<script src="js/chosen.jquery.js"></script> <script src="js/chosen.jquery.js"></script>
<script src="js/jquery.liblink.js"></script> <script src="js/jquery.liblink.js"></script>
<script src="js/wNumb.js"></script> <script src="js/wNumb.js"></script>
<script>
$(function() {
// prevent a double etherpad if shop_log_iframe is clicked on after a shop closes
$("#shop_log_link").on("click keypress", function(e) {
if (window.location.pathname === '/shop_log_iframe.php') {
e.preventDefault(); // hack to prevent open shop from reopening in same page
}
$.post("json/transaction.php", {shop_exist: 1}, function(data) {
if (data === "no_shop") {
window.top.location.href = "./start_shop.php";
}
});
});
// scroll back to same location when up, down, or updated are selected
$(".down").on("click keypress", function(e) {
var hash = document.body.scrollTop + 25;
var query = window.location.search;
query = query.split("&");
var visit_id = query[1].split("=")[1] - 1;
var new_query = query[0] + "&visit_id=" + visit_id;
var new_url = window.location.origin + window.location.pathname + new_query + "&#" + hash;
window.location = new_url;
});
$(".up").on("click keypress", function(e) {
var hash = document.body.scrollTop - 25;
var query = window.location.search;
query = query.split("&");
var visit_id = parseInt(query[1].split("=")[1]) + 1;
var new_query = query[0] + "&visit_id=" + visit_id;
var new_url = window.location.origin + window.location.pathname + new_query + "&#" + hash;
window.location = new_url;
});
$(".close").on("click keypress", function(e) {
var hash = document.body.scrollTop;
var query = window.location.search;
query = query.split("&");
var new_query = query[0];
var new_url = window.location.origin + window.location.pathname + new_query + "&#" + hash;
window.location = new_url;
});
// have to do this a little differently because it is a submit, not a button
$(".update_changes").on("click keypress", function(e) {
var hash = parseInt(document.body.scrollTop);
var query = window.location.search;
query = query.split("&");
var visit_id = parseInt(query[1].split("=")[1]);
var add_hash = "&#" + hash;
var action = $("[name=FormUpdate_" + visit_id).attr("action");
$("[name=FormUpdate_" + visit_id).attr("action", action + add_hash);
});
// end scroll back to same location when up, down, updated are selected
});
$( window ).on( "load", function() {
if(window.location.hash != "") {
document.body.scrollTop = window.location.hash.replace("#", "") * 1;
}
});
</script>
</head> </head>
<body class="yb_standard"> <body class="yb_standard">
<table align="center" width="1000" border="0" cellpadding="1" cellspacing="0">
<tr valign="top"> <div style="float: left; width: 12.5%; height: 40px;"></div>
<td height="40" align="left"><a href="/shop_welcome.php">About/Help</a></td> <div style="align-content: center; height: 40px; float: left; width: 75%">
<td height="40" align="right"><a href="/shop_log.php">Sign In/Sign Out</a> | <a href="/start_shop.php"> All Shops</a> | <a href="/contact_add_edit_select.php">Add/Edit Contact</a> | <a href="/stats.php">Statistics</a> | <a href="/transaction_log.php">Transaction Log</a> | <a href="http://www.positivespin.org/home2/" target="_blank">PS Home</a></td> <div style="float: left; width: auto;"><a href="/shop_welcome.php">About/Help</a></div>
</tr> <div style="float: right; width: auto;"><a id="shop_log_link" href="/shop_log.php">Sign In/Sign Out</a> |
</table> <a href="/start_shop.php" target="_parent"> All Shops</a> |
<a href="/contact_add_edit_select.php" target="_parent">Add/Edit Contact</a> |
<a href="/stats.php" target="_parent">Reports</a> |
<a href="/transaction_log.php" target="_parent">Transaction Log</a> |
<a href="http://www.positivespin.org" target="_blank">PS Home</a></div>
</div>
<div style="float: left; width: 12.5%; height: 40px;"></div>

View File

@ -1,50 +0,0 @@
<script type="text/javascript">
var t;
window.onload=resetTimer;
document.onmousedown=resetTimer;
document.onkeypress=resetTimer;
function logout()
{
location.href='shop_welcome.php'
}
function resetTimer()
{
clearTimeout(t);
t=setTimeout(logout,1000*240) //Shop welcome after 240 seconds of inactivity
}
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>YBDB</title>
<link href="css/transactions.css" rel="stylesheet" type="text/css" />
<link href="css/contacts.css" rel="stylesheet" type="text/css" />
<link href="css/css_yb_standard.css" rel="stylesheet" type="text/css" />
<link href="css/jquery.nouislider.css" rel="stylesheet" type="text/css" />
<link href="css/chosen.css" rel="stylesheet" type="text/css" />
<script src="js/jquery-2.1.1.js"></script>
<script src="js/transaction.js"></script>
<script src="js/contact.js"></script>
<script src="js/shop.js"></script>
<script src="js/jquery.mask.js"></script>
<script src="js/jquery.jeditable.js"></script>
<script src="js/jquery.nouislider.js"></script>
<script src="js/chosen.jquery.js"></script>
<script src="js/jquery.liblink.js"></script>
<script src="js/wNumb.js"></script>
</head>
<body class="yb_standard">
<table align="center" width="1000" border="0" cellpadding="1" cellspacing="0">
<tr valign="top">
<td height="40" align="left"><a href="/shop_welcome.php">About/Help</a></td>
<td height="40" align="right"><a href="/shop_log.php">Current Shop</a> | <a href="/start_shop.php"> All Shops</a> | <a href="/contact_add_edit_select.php">Add/Edit Contact</a> | <a href="/stats.php">Statistics</a> | <a href="/transaction_log.php">Transaction Log</a> | <a href="http://www.positivespin.org/home2/" target="_blank">PS Home</a></td>
</tr>
</table>

47
include_header_stats.html Normal file
View File

@ -0,0 +1,47 @@
<script type="text/javascript">
var t;
window.onload=resetTimer;
document.onmousedown=resetTimer;
document.onkeypress=resetTimer;
function logout()
{
location.href='shop_welcome.php'
}
function resetTimer()
{
clearTimeout(t);
//t=setTimeout(logout,1000*240) //Shop welcome after 240 seconds of inactivity
}
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>YBDB</title>
<link href="../css/css_yb_standard.css" rel="stylesheet" type="text/css" />
<link href="../css/pickmeup.css" rel="stylesheet" type="text/css" />
<link href="../css/stats.css" rel="stylesheet" type="text/css" />
<link href="../css/ui/jquery-ui.css" rel="stylesheet" type="text/css" />
<link href="../css/tabulator/tabulator_site.min.css" rel="stylesheet" type="text/css" />
<script src="../js/jquery-2.1.1.js"></script>
<script src="../js/reports.js"></script>
<script src="../js/jquery.pickmeup.js"></script>
<script src="../js/stats.js"></script>
<script src="../js/ui/jquery-ui.js"></script>
<script src="../js/moment/moment.js"></script>
<script src="../js/tabulator/dist/js/tabulator.min.js"></script>
</head>
<body class="yb_standard">
<table align="center" width="1000" border="0" cellpadding="1" cellspacing="0">
<tr valign="top">
<td height="40" align="right"><a href="/shop_log.php">Current Shop</a> | <a href="/start_shop.php"> All Shops</a> | <a href="/contact_add_edit_select.php">Add/Edit Contact</a> | <a href="/stats.php">Reports</a> | <a href="/transaction_log.php">Transaction Log</a> | <a href="http://www.positivespin.org" target="_blank">PS Home</a></td>
</tr>
<tr>
<td>

View File

@ -1,257 +1,30 @@
<?php <?php
require_once('Connections/YBDB.php'); // new logic
require_once('Connections/database_functions.php');
$page_edit_contact = PAGE_EDIT_CONTACT;
$page_shop_log = PAGE_SHOP_LOG;
$individual_shop_id = 90;
mysql_select_db($database_YBDB, $YBDB);
if($_GET['visit_id']>0){ if($_GET['visit_id']>0){
$visit_id = $_GET['visit_id']; $visit_id = $_GET['visit_id'];
} else { } else {
$visit_id =-1;} $visit_id =-1;}
if($_GET['new_user_id']>0){
$new_user_id = $_GET['new_user_id'];
} else {
$new_user_id = -1;
}
if($_GET['contact_id']>0){ if($_GET['contact_id']>0){
$contact_id = $_GET['contact_id']; $contact_id = $_GET['contact_id'];
} else { } else {
$contact_id = -1; $contact_id = -1;
} }
include("include_header.html");
//shop_date
if(ISSET($_GET['shop_date'])){
$shop_date_filter = $_GET['shop_date'];
} else {
$shop_date_filter = current_date();}
//dayname
if($_GET['shop_dayname']=='alldays'){
$shop_dayname = '';
} elseif(isset($_GET['shop_dayname'])) {
$shop_dayname = "AND DAYNAME(DATE(time_in)) = '" . $_GET['shop_dayname'] . "'";
} else {
$shop_dayname = '';
}
//record_count
if($_GET['record_count']>0){
$record_count = $_GET['record_count'];
} else {
$record_count = 40;}
$query_Recordset1 = "SELECT shop_id, shop_hours.shop_visit_id, shop_hours.contact_id, shop_hours.shop_user_role,
shop_hours.project_id, DATE(shop_hours.time_in)
AS date, DAYNAME(shop_hours.time_in)
AS dayname, shop_hours.time_in, shop_hours.time_out,
TIME_FORMAT(TIMEDIFF(time_out, time_in),'%k:%i')
AS et, shop_hours.comment,
CONCAT(contacts.last_name, ', ', contacts.first_name, ' ',contacts.middle_initial)
AS full_name, contacts.first_name
FROM shop_hours
LEFT JOIN shop_user_roles ON shop_hours.shop_user_role=shop_user_roles.shop_user_role_id
LEFT JOIN contacts ON shop_hours.contact_id=contacts.contact_id
WHERE shop_hours.contact_id = {$contact_id}
AND DATE(shop_hours.time_in) <= '{$shop_date_filter}' {$shop_dayname}
ORDER BY time_in DESC LIMIT 0, {$record_count};";
$Recordset1 = mysql_query($query_Recordset1, $YBDB) or die(mysql_error());
//$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
mysql_select_db($database_YBDB, $YBDB);
$query_Recordset2 = "SELECT * FROM shops WHERE shop_id = $individual_shop_id;";
$Recordset2 = mysql_query($query_Recordset2, $YBDB) or die(mysql_error());
$row_Recordset2 = mysql_fetch_assoc($Recordset2);
$totalRows_Recordset2 = mysql_num_rows($Recordset2);
$shop_date = $row_Recordset2['date'];
$shop_location = $row_Recordset2['shop_location'];
$shop_type = $row_Recordset2['shop_type'];
//sets the default time for users to sign in
$shop_start_time = current_datetime();
$current_date = current_date();
//Action on form update
//shop_log2.php?shop_id=2&amp;visit_id=4
$editFormAction = $_SERVER['PHP_SELF'] . "?contact_id=$contact_id&visit_id=$visit_id";
$editFormAction_novisit = $_SERVER['PHP_SELF'] . "?contact_id=$contact_id";
//if (isset($_SERVER['QUERY_STRING'])) {
// $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
//}
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form_new") && ($_POST["contact_id"] == "no_selection")){
//if no contact is selected
$error_message = '<span class="yb_heading3red">Please Select a User</span><br />';
} elseif ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form_new")) {
$insertSQL = sprintf("INSERT INTO shop_hours (contact_id, shop_id, shop_user_role, time_in, comment, project_id)
VALUES (%s, %s, %s, %s, %s, %s)",
GetSQLValueString($_POST['contact_id'], "int"),
GetSQLValueString($individual_shop_id, "int"),
GetSQLValueString($_POST['user_role'], "text"),
GetSQLValueString(dateandtimein($_POST['date'], $_POST['time_in']), "date"),
GetSQLValueString($_POST['comment'], "text"),
GetSQLValueString($_POST['project'], "text"));
mysql_select_db($database_YBDB, $YBDB);
$Result1 = mysql_query($insertSQL, $YBDB) or die(mysql_error());
$insertGoTo = "shop_log2.php";
if (isset($_SERVER['QUERY_STRING'])) {
$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
$insertGoTo .= $_SERVER['QUERY_STRING'];
}
header(sprintf("Location: %s", $editFormAction_novisit));
}
//$_POST["MM_insert"] is in the form: FormUpdate_$VisitID OR FormUpdate_142. This line seperates the visit id from the
//list($is_UpdateForm, $visit_id) = split('[_]', $_POST["MM_insert"]);
//Update Record isset($_POST["MM_update"])
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "FormUpdate")) {
$updateSQL = sprintf("UPDATE shop_hours SET time_out=%s WHERE shop_visit_id=%s",
GetSQLValueString($_POST['time_out'], "date"),
GetSQLValueString($_POST['shop_visit_id'], "int"));
//"2006-10-12 18:15:00"
mysql_select_db($database_YBDB, $YBDB);
$Result1 = mysql_query($updateSQL, $YBDB) or die(mysql_error());
$gotopage = "index.html";
header(sprintf("Location: %s",$editFormAction )); //$editFormAction
}
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "FormEdit")) {
$updateSQL = sprintf("UPDATE shop_hours SET contact_id=%s, shop_user_role=%s, project_id=%s, time_in=%s, time_out=%s, comment=%s WHERE shop_visit_id=%s",
GetSQLValueString($_POST['contact_id'], "int"),
GetSQLValueString($_POST['user_role'], "text"),
GetSQLValueString($_POST['project'], "text"),
GetSQLValueString(dateandtimein($_POST['date'], $_POST['time_in']), "date"),
GetSQLValueString($_POST['time_out'], "date"),
GetSQLValueString($_POST['comment'], "text"),
GetSQLValueString($_POST['shop_visit_id'], "int"));
//"2006-10-12 18:15:00"
mysql_select_db($database_YBDB, $YBDB);
$Result1 = mysql_query($updateSQL, $YBDB) or die(mysql_error());
header(sprintf("Location: %s",$editFormAction_novisit )); //$editFormAction
}
//Change Date isset($_POST["MM_update"])
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "ChangeDate")) {
$editFormAction = $_SERVER['PHP_SELF'] . "?contact_id=$contact_id&shop_date={$_POST['shop_date']}&shop_dayname={$_POST['dayname']}&record_count={$_POST['record_count']}";
header(sprintf("Location: %s",$editFormAction )); //$editFormAction
}
?> ?>
<div id="contact_id" style="display:none;"><?php echo $contact_id; ?></div>
<div style="text-align:center;"><div id="name" style="align-content:center; font-size:2em;"></div><div id="membership_status"></div></div>
<div id="individual_history"></div>
<?php include("include_header.html"); ?> <div class="stats-clear nextprev" style="text-align:center; display:block; margin-top:9px;">
<a class="stats-left stats-btn" href="#">&#10094; Previous</a>
<a class="stats-right stats-btn" href="#">Next &#10095;</a>
</div>
<table border="0" cellpadding="1" cellspacing="0"> <?php include("include_footer.html"); ?>
<tr>
<td align="left" valign="bottom"><?php echo $error_message;?>
</td>
</tr>
<tr>
<td>
<table border="1" cellpadding="1" cellspacing="0" bordercolor="#CCCCCC">
<tr bordercolor="#CCCCCC" bgcolor="#99CC33" class="yb_heading3">
<td height="35">Shop User </td>
<td>Date</td>
<td>ShopID</td>
<td height="35">Status</td>
<td height="35">Time In </td>
<td height="35" bgcolor="#99CC33">Time Out </td>
<td height="35">Edit Data </td>
</tr>
<form method="post" name="form_new" action="<?php echo $editFormAction; ?>">
<input type="hidden" name="MM_insert" value="form_new">
</form>
<?php while ($row_Recordset1 = mysql_fetch_assoc($Recordset1)) { //do { <div id="individual_history_pad"></div>
if($visit_id == $row_Recordset1['shop_visit_id']) {?>
<form method="post" name="FormUpdate_<?php echo $row_Recordset1['shop_visit_id']; ?>" action="<?php echo $editFormAction; ?>">
<tr valign="bottom" bordercolor="#CCCCCC" bgcolor="#CCCC33">
<td>Edit Record: <br>
<?php list_contacts('contact_id', $row_Recordset1['contact_id']); ?></td>
<td><input name="date" type="text" value="<?php echo $row_Recordset1['date']; ?>" size="10" maxlength="10" /></td>
<td>&nbsp;</td>
<td><?php list_shop_user_roles('user_role', $row_Recordset1['shop_user_role']); ?></td>
<td><?php list_time("{$current_date} 08:00:00",'0000-00-00 00:00:00','time_in',-60,0,$row_Recordset1['time_in'],16); ?></td>
<td><?php
if ($row_Recordset1['time_out'] <> '0000-00-00 00:00:00'){
list_time($row_Recordset1['time_in'],$row_Recordset1['time_out'],'time_out',0,1,$row_Recordset1['time_out']);
} ?></td>
<td><input type="submit" name="Submit" value="Update Changes" /></td>
</tr>
<tr bordercolor="#CCCCCC" bgcolor="#CCCC33">
<td colspan="7"><table border="0" cellspacing="0" cellpadding="1">
<tr>
<td width="125"><div align="right">Project:</div></td>
<td><?php list_projects_collective('project', $row_Recordset1['project_id']); ?></td>
</tr>
<tr>
<td><div align="right">Comment:</div></td>
<td><input name="comment" type="text" value="<?php echo $row_Recordset1['comment']; ?>" size="90" /></td>
</tr>
<tr>
<td><div align="right">Delete:</div></td>
<td>Click to Delete this Shop User's Visit: <a href="<?php echo PAGE_SHOP_LOG_DELETE_VISIT . "?visit_id={$visit_id}&shop_id={$individual_shop_id}";?>">Delete</a> </td>
</tr>
</table> </td>
</tr>
<input type="hidden" name="MM_insert" value="FormEdit">
<input type="hidden" name="shop_visit_id" value="<?php echo $row_Recordset1['shop_visit_id']; ?>">
</form>
<?php } else { //This section executes if it is not the visit_id selected NOT FOR EDIT ?>
<form method="post" name="FormUpdate_<?php echo $row_Recordset1['shop_visit_id']; ?>" action="<?php echo $editFormAction; ?>">
<tr bordercolor="#CCCCCC">
<td><?php echo $row_Recordset1['full_name']; ?></td>
<td><?php echo $row_Recordset1['date'] . " (" . $row_Recordset1['dayname'] . ")"; ?></td>
<td><?php echo "<a href=\"{$page_shop_log}?shop_id={$row_Recordset1['shop_id']}\">{$row_Recordset1['shop_id']}</a>";?></td>
<td><?php echo $row_Recordset1['shop_user_role']; ?></td>
<td><?php echo date_to_time($row_Recordset1['time_in']); ?></td>
<td><?php echo list_time($row_Recordset1['time_in'],$row_Recordset1['time_out'],'time_out',0,1,'none', 8,$row_Recordset1['et']); ?></td>
<td><?php echo "<a href=\"{$_SERVER['PHP_SELF']}?contact_id={$contact_id}&visit_id={$row_Recordset1['shop_visit_id']}\">edit</a>"; ?></td>
</tr>
<input type="hidden" name="MM_insert" value="FormUpdate">
<input type="hidden" name="shop_visit_id" value="<?php echo $row_Recordset1['shop_visit_id']; ?>">
</form>
<?php } // if
} //while ($row_Recordset1 = mysql_fetch_assoc($Recordset1)); // while Recordset1 ?>
</table> </tr>
</table>
<form id="form1" name="form1" method="post" action="">
<br />
Show
<input name="record_count" type="text" value="10" size="3" maxlength="3" />
shops on or before:
<input name="shop_date" type="text" id="shop_date" value="<?php echo current_date(); ?>" size="10" maxlength="10" />
Day of week:
<select name="dayname">
<option value="alldays" selected="selected">All Days</option>
<option value="Monday">Monday</option>
<option value="Tuesday">Tuesday</option>
<option value="Wednesday">Wednesday</option>
<option value="Thursday">Thursday</option>
<option value="Friday">Friday</option>
<option value="Saturday">Saturday</option>
<option value="Sunday">Sunday</option>
</select>
<input type="submit" name="Submit" value="Submit" />
(date format YYYY-MM-DD)
<input type="hidden" name="MM_insert" value="ChangeDate" />
</form>
<p>&nbsp;</p>
<?php include("../include_footer.html"); ?>
<?php
mysql_free_result($Recordset1);
?>

BIN
js/2.19.1.tar.gz Normal file

Binary file not shown.

View File

@ -8,6 +8,7 @@ $(function(){
var birth_date = $("#birth_date"); var birth_date = $("#birth_date");
var waiver_checkbox = $("#waiver_checkbox"), waiver_error = $("#waiver_error"); var waiver_checkbox = $("#waiver_checkbox"), waiver_error = $("#waiver_error");
var first_name = $("#first_name"), first_name_error = $("#first_name_error"); var first_name = $("#first_name"), first_name_error = $("#first_name_error");
var middle_initial = $("#middle_initial"), middle_initial_error = $("#middle_name_error");
var last_name = $("#last_name"), last_name_error = $("#last_name_error"); var last_name = $("#last_name"), last_name_error = $("#last_name_error");
var phone = $("#phone"), phone_error = $("#phone_error"); var phone = $("#phone"), phone_error = $("#phone_error");
var email = $("#email"), email_error = $("#email_error"); var email = $("#email"), email_error = $("#email_error");
@ -58,7 +59,7 @@ $(function(){
// check for errors // check for errors
//error_handler(input,error_span,error,error_text,event); //error_handler(input,error_span,error,error_text,event);
var err0 = 0, err1 = 0, err2 = 0, err3 = 0, err4 = 0, err5 = 0; var err0 = 0, err1 = 0, err2 = 0, err3 = 0, err4 = 0, err5 = 0, err6 = 0;
// if it is showing // if it is showing
$("#email_list_error").hide(); $("#email_list_error").hide();
@ -67,6 +68,18 @@ $(function(){
err0 = error_handler(first_name.val(), first_name_error, "","*Required",e); err0 = error_handler(first_name.val(), first_name_error, "","*Required",e);
err1 = error_handler(last_name.val(), last_name_error, "","*Required",e); err1 = error_handler(last_name.val(), last_name_error, "","*Required",e);
// test whether patron's name already exists
// and if name matches a different contact_i
$.post("json/contact.php", {first_name: first_name.val(), middle_initial: middle_initial.val(),
last_name: last_name.val(), contact_id: contact_id, test_name: 1 }, function(data) {
if(data === "1") {
err6 = error_handler(0, last_name_error, "","*Your name already exists, please choose a different middle initial.",e);
}
} );
// email and phone input // email and phone input
if (email.val() === "" && phone.val() === "") { if (email.val() === "" && phone.val() === "") {
@ -106,7 +119,7 @@ $(function(){
// waiver checkbox // waiver checkbox
err5 = error_handler(waiver_checkbox.prop("checked"),waiver_error,false,"*Required",e); err5 = error_handler(waiver_checkbox.prop("checked"),waiver_error,false,"*Required",e);
if ((err0 + err1 + err2 + err3 + err4 + err5) > 0 ) { if ((err0 + err1 + err2 + err3 + err4 + err5 + err6) > 0 ) {
} else { } else {
//e.preventDefault(); //e.preventDefault();

113
js/etherpad.js Normal file
View File

@ -0,0 +1,113 @@
(function( $ ){
$.fn.pad = function( options ) {
var settings = {
'host' : 'http://beta.etherpad.org',
'baseUrl' : '/p/',
'showControls' : false,
'showChat' : false,
'showLineNumbers' : false,
'userName' : 'unnamed',
'lang' : '',
'useMonospaceFont' : false,
'noColors' : false,
'userColor' : false,
'hideQRCode' : false,
'alwaysShowChat' : false,
'width' : 100,
'height' : 100,
'border' : 0,
'borderStyle' : 'solid',
'toggleTextOn' : 'Disable Rich-text',
'toggleTextOff' : 'Enable Rich-text',
'plugins' : {},
'rtl' : false
};
var $self = this;
if (!$self.length) return;
if (!$self.attr('id')) throw new Error('No "id" attribute');
var useValue = $self[0].tagName.toLowerCase() == 'textarea';
var selfId = $self.attr('id');
var epframeId = 'epframe'+ selfId;
// This writes a new frame if required
if ( !options.getContents ) {
if ( options ) {
$.extend( settings, options );
}
var pluginParams = '';
for(var option in settings.plugins) {
pluginParams += '&' + option + '=' + settings.plugins[option]
}
var iFrameLink = '<iframe id="'+epframeId;
iFrameLink = iFrameLink +'" name="' + epframeId;
iFrameLink = iFrameLink +'" src="' + settings.host+settings.baseUrl+settings.padId;
iFrameLink = iFrameLink + '?showControls=' + settings.showControls;
iFrameLink = iFrameLink + '&showChat=' + settings.showChat;
iFrameLink = iFrameLink + '&showLineNumbers=' + settings.showLineNumbers;
iFrameLink = iFrameLink + '&useMonospaceFont=' + settings.useMonospaceFont;
iFrameLink = iFrameLink + '&userName=' + settings.userName;
if (settings.lang) {
iFrameLink = iFrameLink + '&lang=' + settings.lang;
}
iFrameLink = iFrameLink + '&noColors=' + settings.noColors;
iFrameLink = iFrameLink + '&userColor=' + settings.userColor;
iFrameLink = iFrameLink + '&hideQRCode=' + settings.hideQRCode;
iFrameLink = iFrameLink + '&alwaysShowChat=' + settings.alwaysShowChat;
iFrameLink = iFrameLink + '&rtl=' + settings.rtl;
iFrameLink = iFrameLink + pluginParams;
iFrameLink = iFrameLink +'" style="border:' + settings.border;
iFrameLink = iFrameLink +'; border-style:' + settings.borderStyle;
iFrameLink = iFrameLink +';" width="' + '100%';//settings.width;
iFrameLink = iFrameLink +'" height="' + settings.height;
iFrameLink = iFrameLink +'"></iframe>';
var $iFrameLink = $(iFrameLink);
if (useValue) {
var $toggleLink = $('<a href="#'+ selfId +'">'+ settings.toggleTextOn +'</a>').click(function(){
var $this = $(this);
$this.toggleClass('active');
if ($this.hasClass('active')) $this.text(settings.toggleTextOff);
$self.pad({getContents: true});
return false;
});
$self
.hide()
.after($toggleLink)
.after($iFrameLink)
;
}
else {
$self.html(iFrameLink);
}
}
// This reads the etherpad contents if required
else {
var frameUrl = $('#'+ epframeId).attr('src').split('?')[0];
var contentsUrl = frameUrl + "/export/html";
var target = $('#'+ options.getContents);
// perform an ajax call on contentsUrl and write it to the parent
$.get(contentsUrl, function(data) {
if (target.is(':input')) {
target.val(data).show();
}
else {
target.html(data);
}
$('#'+ epframeId).remove();
});
}
return $self;
};
})( jQuery );

1
js/jquery.ns-autogrow/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
node_modules

View File

@ -0,0 +1,7 @@
bower_components/
bower.json
node_modules/
npm-debug.log
gulpfile.cofee
src/
.github

View File

@ -0,0 +1,89 @@
### Automatically adjust textarea width/height based on user input.
#### Non-sucking version, still works great and used by a lot of people with no issues!
The only reason I wrote this jQuery plugin is that other plugins suck. They are wide-spread, but outdated and buggy.
Advantages of jquery.ns-autogrow:
* Grows vertically, horizontally or both
* Correctly handles 2 or more spaces
* Copies more css and font styles to shadow div
* Correctly handles long words on one line
* Flickering can be disabled on Enter
* Doesn't add more than one handler to textarea
* Handles textarea scrollbar if any
* Improved support of special characters
## Download
Run one of these commands in your bash according to your needs.
`git clone https://github.com/ro31337/jquery.ns-autogrow.git`
`bower install jquery.ns-autogrow`
`npm install jquery.ns-autogrow`
Or download the latest version from the [releases](https://github.com/ro31337/jquery.ns-autogrow/releases) page.
### Options
You can provide multiple options to autogrow like:
```
$('.example2 textarea').autogrow({vertical: true, horizontal: false});
```
List of options:
Option | Description
-------|------------
vertical | (true/false) - Enable/Disable vertical autogrow (true by default)
horizontal | (true/false) - Enable/Disable horizontal autogrow (true by default)
postGrowCallback | Post grow callback. Executes after dimensions of textarea have been adjusted.
flickering | (true/false) - Enable/Disable flickering. If flickering is disabled, extra line will be added to textarea. Flickering is _enabled_ by default.
There are few more options reserved for debugging purposes. All debugging options start with `debug` prefix:
Option | Description
-------|------------
debugx | X position of shadow element (-10000 by default)
debugy | Y position of shadow element (-10000 by default)
debugcolor | Color of shadow element (yellow by default)
### Demo
[Click here](http://htmlpreview.github.io/?https://raw.githubusercontent.com/ro31337/jquery.ns-autogrow/master/demo/index.html)
### Plans:
* Test and support arabic languages
### :heart: Like it? :heart:
:star: Star it! :star:
### The MIT License (MIT)
The MIT License (MIT)
Copyright (c) 2015 Roman Pushkin
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -0,0 +1,29 @@
{
"name": "jquery.ns-autogrow",
"description": "Automatically adjust textarea height based on user input. Non-sucking version.",
"main": "dist/jquery.ns-autogrow.js",
"keywords": [
"autogrow",
"textarea",
"form",
"autosize",
"ui",
"jquery-plugin",
"ecosystem:jquery"
],
"author": "Roman Pushkin <roman.pushkin@gmail.com>",
"homepage": "https://github.com/ro31337/jquery.ns-autogrow",
"license": "MIT",
"ignore": [
"**/.*",
"bower_components",
"node_modules",
"npm-debug.log",
"gulpfile.coffee",
"package.json",
"src"
],
"dependencies": {
"jquery": "1"
}
}

View File

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html>
<head>
<script data-require="jquery@2.1.4" data-semver="2.1.4" src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
<script src="../dist/jquery.ns-autogrow.min.js"></script>
<link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css" />
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
</head>
<body>
<div class="example1">
<textarea placeholder="horizontal and vertical"></textarea>
</div>
<div class="example2">
<textarea placeholder="vertical only"></textarea>
</div>
<div class="example3">
<textarea placeholder="horizontal only"></textarea>
</div>
<div class="example4">
<textarea placeholder="horizontal and vertical, no flickering"></textarea>
</div>
</body>
</html>

View File

@ -0,0 +1,6 @@
$(function(){
$('.example1 textarea').autogrow();
$('.example2 textarea').autogrow({vertical: true, horizontal: false});
$('.example3 textarea').autogrow({vertical: false, horizontal: true});
$('.example4 textarea').autogrow({flickering: false});
});

View File

@ -0,0 +1,3 @@
body { padding: 20px; }
textarea { min-width: 240px; font-size: 18px; }
.example3 textarea { min-height: 50px; }

View File

@ -0,0 +1,139 @@
/*!
Non-Sucking Autogrow 1.1.6
license: MIT
author: Roman Pushkin
https://github.com/ro31337/jquery.ns-autogrow
*/
(function() {
var getVerticalScrollbarWidth;
(function($, window) {
return $.fn.autogrow = function(options) {
if (options == null) {
options = {};
}
if (options.horizontal == null) {
options.horizontal = true;
}
if (options.vertical == null) {
options.vertical = true;
}
if (options.debugx == null) {
options.debugx = -10000;
}
if (options.debugy == null) {
options.debugy = -10000;
}
if (options.debugcolor == null) {
options.debugcolor = 'yellow';
}
if (options.flickering == null) {
options.flickering = true;
}
if (options.postGrowCallback == null) {
options.postGrowCallback = function() {};
}
if (options.verticalScrollbarWidth == null) {
options.verticalScrollbarWidth = getVerticalScrollbarWidth();
}
if (options.horizontal === false && options.vertical === false) {
return;
}
return this.filter('textarea').each(function() {
var $e, $shadow, fontSize, heightPadding, minHeight, minWidth, update;
$e = $(this);
if ($e.data('autogrow-enabled')) {
return;
}
$e.data('autogrow-enabled');
minHeight = $e.height();
minWidth = $e.width();
heightPadding = $e.css('lineHeight') * 1 || 0;
$e.hasVerticalScrollBar = function() {
return $e[0].clientHeight < $e[0].scrollHeight;
};
$shadow = $('<div class="autogrow-shadow"></div>').css({
position: 'absolute',
display: 'inline-block',
'background-color': options.debugcolor,
top: options.debugy,
left: options.debugx,
'max-width': $e.css('max-width'),
'padding': $e.css('padding'),
fontSize: $e.css('fontSize'),
fontFamily: $e.css('fontFamily'),
fontWeight: $e.css('fontWeight'),
lineHeight: $e.css('lineHeight'),
resize: 'none',
'word-wrap': 'break-word'
}).appendTo(document.body);
if (options.horizontal === false) {
$shadow.css({
'width': $e.width()
});
} else {
fontSize = $e.css('font-size');
$shadow.css('padding-right', '+=' + fontSize);
$shadow.normalPaddingRight = $shadow.css('padding-right');
}
update = (function(_this) {
return function(event) {
var height, val, width;
val = _this.value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\n /g, '<br/>&nbsp;').replace(/"/g, '&quot;').replace(/'/g, '&#39;').replace(/\n$/, '<br/>&nbsp;').replace(/\n/g, '<br/>').replace(/ {2,}/g, function(space) {
return Array(space.length - 1).join('&nbsp;') + ' ';
});
if (/(\n|\r)/.test(_this.value)) {
val += '<br />';
if (options.flickering === false) {
val += '<br />';
}
}
$shadow.html(val);
if (options.vertical === true) {
height = Math.max($shadow.height() + heightPadding, minHeight);
$e.height(height);
}
if (options.horizontal === true) {
$shadow.css('padding-right', $shadow.normalPaddingRight);
if (options.vertical === false && $e.hasVerticalScrollBar()) {
$shadow.css('padding-right', "+=" + options.verticalScrollbarWidth + "px");
}
width = Math.max($shadow.outerWidth(), minWidth);
$e.width(width);
}
return options.postGrowCallback($e);
};
})(this);
$e.change(update).keyup(update).keydown(update);
$(window).resize(update);
return update();
});
};
})(window.jQuery, window);
getVerticalScrollbarWidth = function() {
var inner, outer, w1, w2;
inner = document.createElement('p');
inner.style.width = "100%";
inner.style.height = "200px";
outer = document.createElement('div');
outer.style.position = "absolute";
outer.style.top = "0px";
outer.style.left = "0px";
outer.style.visibility = "hidden";
outer.style.width = "200px";
outer.style.height = "150px";
outer.style.overflow = "hidden";
outer.appendChild(inner);
document.body.appendChild(outer);
w1 = inner.offsetWidth;
outer.style.overflow = 'scroll';
w2 = inner.offsetWidth;
if (w1 === w2) {
w2 = outer.clientWidth;
}
document.body.removeChild(outer);
return w1 - w2;
};
}).call(this);

View File

@ -0,0 +1,7 @@
/*!
Non-Sucking Autogrow 1.1.6
license: MIT
author: Roman Pushkin
https://github.com/ro31337/jquery.ns-autogrow
*/
(function(){var e;!function(t,l){return t.fn.autogrow=function(i){if(null==i&&(i={}),null==i.horizontal&&(i.horizontal=!0),null==i.vertical&&(i.vertical=!0),null==i.debugx&&(i.debugx=-1e4),null==i.debugy&&(i.debugy=-1e4),null==i.debugcolor&&(i.debugcolor="yellow"),null==i.flickering&&(i.flickering=!0),null==i.postGrowCallback&&(i.postGrowCallback=function(){}),null==i.verticalScrollbarWidth&&(i.verticalScrollbarWidth=e()),i.horizontal!==!1||i.vertical!==!1)return this.filter("textarea").each(function(){var e,n,r,o,a,c,d;if(e=t(this),!e.data("autogrow-enabled"))return e.data("autogrow-enabled"),a=e.height(),c=e.width(),o=1*e.css("lineHeight")||0,e.hasVerticalScrollBar=function(){return e[0].clientHeight<e[0].scrollHeight},n=t('<div class="autogrow-shadow"></div>').css({position:"absolute",display:"inline-block","background-color":i.debugcolor,top:i.debugy,left:i.debugx,"max-width":e.css("max-width"),padding:e.css("padding"),fontSize:e.css("fontSize"),fontFamily:e.css("fontFamily"),fontWeight:e.css("fontWeight"),lineHeight:e.css("lineHeight"),resize:"none","word-wrap":"break-word"}).appendTo(document.body),i.horizontal===!1?n.css({width:e.width()}):(r=e.css("font-size"),n.css("padding-right","+="+r),n.normalPaddingRight=n.css("padding-right")),d=function(t){return function(l){var r,d,s;return d=t.value.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\n /g,"<br/>&nbsp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/\n$/,"<br/>&nbsp;").replace(/\n/g,"<br/>").replace(/ {2,}/g,function(e){return Array(e.length-1).join("&nbsp;")+" "}),/(\n|\r)/.test(t.value)&&(d+="<br />",i.flickering===!1&&(d+="<br />")),n.html(d),i.vertical===!0&&(r=Math.max(n.height()+o,a),e.height(r)),i.horizontal===!0&&(n.css("padding-right",n.normalPaddingRight),i.vertical===!1&&e.hasVerticalScrollBar()&&n.css("padding-right","+="+i.verticalScrollbarWidth+"px"),s=Math.max(n.outerWidth(),c),e.width(s)),i.postGrowCallback(e)}}(this),e.change(d).keyup(d).keydown(d),t(l).resize(d),d()})}}(window.jQuery,window),e=function(){var e,t,l,i;return e=document.createElement("p"),e.style.width="100%",e.style.height="200px",t=document.createElement("div"),t.style.position="absolute",t.style.top="0px",t.style.left="0px",t.style.visibility="hidden",t.style.width="200px",t.style.height="150px",t.style.overflow="hidden",t.appendChild(e),document.body.appendChild(t),l=e.offsetWidth,t.style.overflow="scroll",i=e.offsetWidth,l===i&&(i=t.clientWidth),document.body.removeChild(t),l-i}}).call(this);

View File

@ -0,0 +1,54 @@
gulp = require 'gulp'
del = require 'del'
coffee = require 'gulp-coffee'
coffeelint = require 'gulp-coffeelint'
header = require 'gulp-header'
uglify = require 'gulp-uglify'
rename = require 'gulp-rename'
pjson = require './package.json'
copyright = """
/*!
Non-Sucking Autogrow #{pjson.version}
license: #{pjson.license}
author: Roman Pushkin
#{pjson.homepage}
*/
"""
dest = 'dist/'
source = 'src/'
code =
in: "#{source}*.coffee"
out: "#{dest}"
gulp.task 'clean', ->
del [dest + '*']
gulp.task 'build', ->
gulp
.src code.in
.pipe coffeelint()
.pipe coffeelint.reporter() # Show coffeelint errors
.pipe coffeelint.reporter('fail') # Make sure it fails in case of error
.pipe coffee()
.pipe header copyright
.pipe gulp.dest(code.out)
gulp
.src code.in
.pipe coffeelint()
.pipe coffeelint.reporter() # Show coffeelint errors
.pipe coffeelint.reporter('fail') # Make sure it fails in case of error
.pipe coffee()
.pipe uglify()
.pipe rename({ suffix: '.min' })
.pipe header copyright
.pipe gulp.dest(code.out)
gulp.task 'watch', ->
gulp
.watch code.in, ['build']
gulp.task 'default', ['clean', 'build', 'watch'], ->

View File

@ -0,0 +1,45 @@
{
"name": "jquery.ns-autogrow",
"version": "1.1.6",
"description": "Automatically adjust textarea height based on user input. Non-sucking version.",
"main": "dist/jquery.ns-autogrow.js",
"keywords": [
"autogrow",
"textarea",
"form",
"autosize",
"ui",
"jquery-plugin",
"ecosystem:jquery"
],
"author": "Roman Pushkin <roman.pushkin@gmail.com>",
"homepage": "https://github.com/ro31337/jquery.ns-autogrow",
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/ro31337/jquery.ns-autogrow.git"
},
"files": [
"demo",
"dist"
],
"directories": {
"example": "demo"
},
"bugs": {
"url": "https://github.com/ro31337/jquery.ns-autogrow/issues"
},
"dependencies": {
"jquery": "^1.12.4"
},
"devDependencies": {
"coffee-script": "^1.10.0",
"del": "^2.0.2",
"gulp": "^3.9.0",
"gulp-coffee": "^2.3.1",
"gulp-coffeelint": "^0.5.0",
"gulp-header": "^1.7.1",
"gulp-rename": "^1.2.2",
"gulp-uglify": "^1.4.1"
}
}

View File

@ -0,0 +1,131 @@
(($, window) ->
$.fn.autogrow = (options) ->
options ?= {}
options.horizontal ?= true
options.vertical ?= true
options.debugx ?= -10000
options.debugy ?= -10000
options.debugcolor ?= 'yellow'
options.flickering ?= true
options.postGrowCallback ?= ->
options.verticalScrollbarWidth ?= getVerticalScrollbarWidth()
if options.horizontal is false and options.vertical is false
return
@.filter('textarea').each ->
$e = $(@)
return if $e.data 'autogrow-enabled'
$e.data 'autogrow-enabled'
minHeight = $e.height()
minWidth = $e.width()
heightPadding = $e.css('lineHeight') * 1 || 0
$e.hasVerticalScrollBar = ->
$e[0].clientHeight < $e[0].scrollHeight
$shadow = $('<div class="autogrow-shadow"></div>')
.css (
position: 'absolute'
display: 'inline-block'
'background-color': options.debugcolor
top: options.debugy
left: options.debugx
'max-width': $e.css 'max-width'
'padding': $e.css 'padding'
fontSize: $e.css 'fontSize'
fontFamily: $e.css 'fontFamily'
fontWeight: $e.css 'fontWeight'
lineHeight: $e.css 'lineHeight'
resize: 'none'
'word-wrap': 'break-word' )
.appendTo document.body
if options.horizontal is false
# fix width of shadow div, so it will remain unchanged
$shadow.css({'width': $e.width()})
else
# make sure we have right padding to avoid flickering
fontSize = $e.css 'font-size' # => 20px
$shadow.css('padding-right', '+=' + fontSize)
$shadow.normalPaddingRight = $shadow.css 'padding-right'
update = (event) =>
val = @
.value
.replace /&/g, '&amp;'
.replace /</g, '&lt;'
.replace />/g, '&gt;'
.replace /\n /g, '<br/>&nbsp;'
.replace /"/g, '&quot;'
.replace /'/g, '&#39;'
.replace /\n$/, '<br/>&nbsp;'
.replace /\n/g, '<br/>'
.replace(
/ {2,}/g
(space) -> Array(space.length - 1).join('&nbsp;') + ' '
)
if /(\n|\r)/.test @.value
val += '<br />'
# no flickering, but one extra line will be added
if options.flickering is false
val += '<br />'
$shadow.html val
if options.vertical is true
height = Math.max($shadow.height() + heightPadding, minHeight)
$e.height height
if options.horizontal is true
$shadow.css 'padding-right', $shadow.normalPaddingRight
# if it should not grow vertically and if we have scrollbar,
# add additional padding to shadow div to emulate the scrollbar
if options.vertical is false and $e.hasVerticalScrollBar()
$shadow.css 'padding-right', "+=#{options.verticalScrollbarWidth}px"
# outerWidth is width with padding
width = Math.max $shadow.outerWidth(), minWidth
$e.width width
options.postGrowCallback $e
$e.change update
.keyup update
.keydown update
$(window).resize update
update()
) window.jQuery, window
getVerticalScrollbarWidth = ->
inner = document.createElement('p')
inner.style.width = "100%"
inner.style.height = "200px"
outer = document.createElement('div')
outer.style.position = "absolute"
outer.style.top = "0px"
outer.style.left = "0px"
outer.style.visibility = "hidden"
outer.style.width = "200px"
outer.style.height = "150px"
outer.style.overflow = "hidden"
outer.appendChild (inner)
document.body.appendChild (outer)
w1 = inner.offsetWidth
outer.style.overflow = 'scroll'
w2 = inner.offsetWidth
if w1 is w2
w2 = outer.clientWidth
document.body.removeChild (outer)
w1 - w2

1141
js/jquery.pickmeup.js Normal file

File diff suppressed because it is too large Load Diff

17
js/moment/.editorconfig Normal file
View File

@ -0,0 +1,17 @@
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
[*.{js,json}]
indent_size = 4
[*.{yml}]
indent_size = 2
[*.md]
trim_trailing_whitespace = false

4
js/moment/.gitattributes vendored Normal file
View File

@ -0,0 +1,4 @@
# we don't have non-text files, don't take chances with git's text=auto
* text
# this file is read by nuget (Windows) tooling, lets keep it happy
Moment.js.nuspec eol=crlf

15
js/moment/.gitignore vendored Normal file
View File

@ -0,0 +1,15 @@
node_modules/
.DS_Store
min/moment+customlangs.js
min/moment+customlangs.min.js
sauce_connect.log
.sauce-labs.creds
npm-debug.log
.build*
build
coverage
nyc_output
.nyc_output
.coveralls.yml
.vscode/
.idea

65
js/moment/.jscs.json Normal file
View File

@ -0,0 +1,65 @@
{
"requireCurlyBraces": [
"if",
"else",
"for",
"while",
"do",
"try",
"catch"
],
"requireSpaceAfterKeywords": [
"if",
"else",
"for",
"while",
"do",
"switch",
"return",
"try",
"catch"
],
"requireSpaceBeforeBlockStatements": true,
"requireParenthesesAroundIIFE": true,
"requireSpacesInConditionalExpression": true,
"requireSpacesInAnonymousFunctionExpression": {
"beforeOpeningRoundBrace": true,
"beforeOpeningCurlyBrace": true
},
"requireSpacesInNamedFunctionExpression": {
"beforeOpeningCurlyBrace": true
},
"disallowSpacesInNamedFunctionExpression": {
"beforeOpeningRoundBrace": true
},
"requireBlocksOnNewline": true,
"disallowPaddingNewlinesInBlocks": true,
"disallowEmptyBlocks": true,
"disallowSpacesInsideObjectBrackets": true,
"disallowSpacesInsideArrayBrackets": true,
"disallowSpacesInsideParentheses": true,
"requireCommaBeforeLineBreak": true,
"disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
"disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
"requireSpaceBeforeBinaryOperators": [
"=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=",
"&=", "|=", "^=",
"+", "-", "*", "/", "%", "<<", ">>", ">>>", "&",
"|", "^", "&&", "||", "===", "==", ">=",
"<=", "<", ">", "!=", "!=="
],
"requireSpaceAfterBinaryOperators": true,
"requireCamelCaseOrUpperCaseIdentifiers": "ignoreProperties",
"disallowKeywords": ["with"],
"disallowMultipleLineStrings": true,
"validateIndentation": 4,
"disallowTrailingWhitespace": true,
"disallowTrailingComma": true,
"requireLineFeedAtFileEnd": true,
"requireCapitalizedConstructors": true,
"validateQuoteMarks": {
"mark": "'",
"escape": true
}
}

31
js/moment/.jshintrc Normal file
View File

@ -0,0 +1,31 @@
{
"node" : true,
"browser" : true,
"boss" : false,
"curly" : true,
"debug" : false,
"devel" : false,
"eqeqeq" : true,
"eqnull" : true,
"esnext" : true,
"evil" : false,
"forin" : false,
"immed" : false,
"laxbreak" : false,
"newcap" : true,
"noarg" : true,
"noempty" : false,
"nonew" : false,
"onevar" : true,
"plusplus" : false,
"regexp" : false,
"undef" : true,
"sub" : true,
"strict" : false,
"white" : true,
"es3" : false,
"camelcase" : true,
"globals": {
"define": false
}
}

3
js/moment/.npmignore Normal file
View File

@ -0,0 +1,3 @@
test
min/tests.js
.npmignore

8
js/moment/.spmignore Normal file
View File

@ -0,0 +1,8 @@
benchmarks
bower_components
meteor
min
node_modules
scripts
tasks
test

25
js/moment/.travis.yml Normal file
View File

@ -0,0 +1,25 @@
language: node_js
node_js:
- "node"
- "7"
- "6"
- "5"
- "4"
sudo: false
env:
global:
- secure: "M4STT2TOZxjzv3cZOgSVi0J4j6enrGjgE+p5YTNUw+S6Dg6FS5pTIPeafu1kGhfm7F0uk7xPVwGKYb+3uWNO9IhkKXz8jySMMQ2iKISHwECGNNuFNjSMD1vIjbIkLwV8TyPO/PurQg2s+WtYz+DoAZsDFKpdaRUtif64OjdQ3vQ="
- secure: "V+i7kHoGe7VXWGplPNqJz+aDtgDF9Dh9/guoaf2BPyXLvkFW6VgMjJyoNUW7JVsakrWzAz2ubb734vAPDt7BCcFQ2BqfatOmabdFogviCaXC6IqVaEkYS2eSP7MIUPIeWJgnTrDGzkFMDk4K7y5SiVJ8UmYwZxe+tJV7kbb0Yig="
install:
- npm install
- npm install -g grunt-cli
script: grunt build:travis
git:
depth: 10
# TODO: Fix problem with coveralls.io not displaying autogenerated files
# after_success: npm run coveralls

799
js/moment/CHANGELOG.md Normal file
View File

@ -0,0 +1,799 @@
Changelog
=========
### 2.19.1
* Release Oct 11, 2017
Make react native and webpack both work
* #4225 #4226 #4232
### 2.19.0 [See full changelog](https://gist.github.com/ichernev/5f3f4eb02761b4f765a0cccf02cec603)
* Release Oct 10, 2017
## Fix React Native 0.49+ crash
* [#4213](https://github.com/moment/moment/pull/4213) [critical] Rename dynamic
require to avoid React Native crash
* [#4214](https://github.com/moment/moment/pull/4214) [fixup] Move require
rename inside try/catch, fixes
[#4213](https://github.com/moment/moment/issues/4213)
## Features
* [#3735](https://github.com/moment/moment/pull/3735) [feature] Ignore NaN values in setters
* [#4106](https://github.com/moment/moment/pull/4106) [fixup] Drop isNumeric utility fn, fixes [#3735](https://github.com/moment/moment/issues/3735)
* [#4080](https://github.com/moment/moment/pull/4080) [feature] Implement a clone method for durations, fixes [#4078](https://github.com/moment/moment/issues/4078)
* [#4215](https://github.com/moment/moment/pull/4215) [misc] TS: Add duration.clone(), for [#4080](https://github.com/moment/moment/issues/4080)
## Packaging
* [#4003](https://github.com/moment/moment/pull/4003) [pkg] bower: Remove tests from package
* [#3904](https://github.com/moment/moment/pull/3904) [pkg] jsnext:main -> module in package.json
* [#4060](https://github.com/moment/moment/pull/4060) [pkg] Account for new rollup interface
Bugfixes, new locales, locale fixes etc...
### 2.18.1
* Release Mar 22, 2017
* [#3853](https://github.com/moment/moment/pull/3853) [misc] Fix invalid whitespace character causing inability to parse
moment.js
### 2.18.0 [See full changelog](https://gist.github.com/ichernev/78920c5a1e419fb28c6e4546d1b7235c)
* Release Mar 18, 2017
## Features
* [#3708](https://github.com/moment/moment/pull/3708) [feature] RFC2822 parsing
* [#3611](https://github.com/moment/moment/pull/3611) [feature] Durations gain validity
* [#3738](https://github.com/moment/moment/pull/3738) [feature] Enable relative time for multiple seconds, request [#2558](https://github.com/moment/moment/issues/2558)
* [#3766](https://github.com/moment/moment/pull/3766) [feature] Add support for k and kk format parsing
## Bugfixes
* [#3643](https://github.com/moment/moment/pull/3643) [bugfix] Fixes [#3520](https://github.com/moment/moment/issues/3520), parseZone incorrectly handled minutes under 16
* [#3710](https://github.com/moment/moment/pull/3710) [bugfix] Fixes [#3632](https://github.com/moment/moment/issues/3632), toISOString returns null for invalid date
* [#3787](https://github.com/moment/moment/pull/3787) [bugfix] Fixes [#3717](https://github.com/moment/moment/issues/3717), ensure day-of-year is non-zero
* [#3780](https://github.com/moment/moment/pull/3780) [bugfix] Fixes [#3765](https://github.com/moment/moment/issues/3765): Ensure year 0 is formatted with YYYY
* [#3806](https://github.com/moment/moment/pull/3806) [bugfix] Fixes [#3805](https://github.com/moment/moment/issues/3805), fix locale month getters for standalone/format cases
7 new locales, many locale improvements and some misc changes
### 2.17.1 [Also available here](https://gist.github.com/ichernev/f38280b2b29c4932914a6d3a4e50bfb2)
* Release Dec 03, 2016
* [#3638](https://github.com/moment/moment/pull/3638) [misc] TS: Make typescript definitions work with 1.x
* [#3628](https://github.com/moment/moment/pull/3628) [misc] Adds "sign CLA" link to `CONTRIBUTING.md`
* [#3640](https://github.com/moment/moment/pull/3640) [misc] Fix locale issues
### 2.17.0 [Also available here](https://gist.github.com/ichernev/ed58f76fb95205eeac653d719972b90c)
* Release Nov 22, 2016
* [#3435](https://github.com/moment/moment/pull/3435) [new locale] yo: Yoruba (Nigeria) locale
* [#3595](https://github.com/moment/moment/pull/3595) [bugfix] Fix accidental reference to global "value" variable
* [#3506](https://github.com/moment/moment/pull/3506) [bugfix] Fix invalid moments returning valid dates to method calls
* [#3563](https://github.com/moment/moment/pull/3563) [locale] ca: Change future relative time
* [#3504](https://github.com/moment/moment/pull/3504) [tests] Fixes [#3463](https://github.com/moment/moment/issues/3463), parseZone not handling Z correctly (tests only)
* [#3591](https://github.com/moment/moment/pull/3591) [misc] typescript: update typescript to 2.0.8, add strictNullChecks=true
* [#3597](https://github.com/moment/moment/pull/3597) [misc] Fixed capitalization in nuget spec
### 2.16.0 [See full changelog](https://gist.github.com/ichernev/17bffc1005a032cb1a8ac4c1558b4994)
* Release Nov 9, 2016
## Features
* [#3530](https://github.com/moment/moment/pull/3530) [feature] Check whether input is date before checking if format is array
* [#3515](https://github.com/moment/moment/pull/3515) [feature] Fix [#2300](https://github.com/moment/moment/issues/2300): Default to current week.
## Bugfixes
* [#3546](https://github.com/moment/moment/pull/3546) [bugfix] Implement lazy-loading of child locales with missing prents
* [#3523](https://github.com/moment/moment/pull/3523) [bugfix] parseZone should handle UTC
* [#3502](https://github.com/moment/moment/pull/3502) [bugfix] Fix [#3500](https://github.com/moment/moment/issues/3500): ISO 8601 parsing should match the full string, not the beginning of the string.
* [#3581](https://github.com/moment/moment/pull/3581) [bugfix] Fix parseZone, redo [#3504](https://github.com/moment/moment/issues/3504), fix [#3463](https://github.com/moment/moment/issues/3463)
## New Locales
* [#3416](https://github.com/moment/moment/pull/3416) [new locale] nl-be: Dutch (Belgium) locale
* [#3393](https://github.com/moment/moment/pull/3393) [new locale] ar-dz: Arabic (Algeria) locale
* [#3342](https://github.com/moment/moment/pull/3342) [new locale] tet: Tetun Dili (East Timor) locale
And more locale, build and typescript improvements
### 2.15.2
* Release Oct 23, 2016
* [#3525](https://github.com/moment/moment/pull/3525) Speedup month standalone/format regexes **(IMPORTANT)**
* [#3466](https://github.com/moment/moment/pull/3466) Fix typo of Javanese
### 2.15.1
* Release Sept 20, 2016
* [#3438](https://github.com/moment/moment/pull/3438) Fix locale autoload, revert [#3344](https://github.com/moment/moment/pull/3344)
### 2.15.0 [See full changelog](https://gist.github.com/ichernev/10e1c5bf647545c72ca30e9628a09ed3)
- Release Sept 12, 2016
## New Locales
* [#3255](https://github.com/moment/moment/pull/3255) [new locale] mi: Maori language
* [#3267](https://github.com/moment/moment/pull/3267) [new locale] ar-ly: Arabic (Libya) locale
* [#3333](https://github.com/moment/moment/pull/3333) [new locale] zh-hk: Chinese (Hong Kong) locale
## Bugfixes
* [#3276](https://github.com/moment/moment/pull/3276) [bugfix] duration: parser: Support ms durations in .NET syntax
* [#3312](https://github.com/moment/moment/pull/3312) [bugfix] locales: Enable locale-data getters without moment (fixes [#3284](https://github.com/moment/moment/issues/3284))
* [#3381](https://github.com/moment/moment/pull/3381) [bugfix] parsing: Fix parseZone without timezone in string, fixes [#3083](https://github.com/moment/moment/issues/3083)
* [#3383](https://github.com/moment/moment/pull/3383) [bugfix] toJSON: Fix isValid so that toJSON works after a moment is frozen
* [#3427](https://github.com/moment/moment/pull/3427) [bugfix] ie8: Fix IE8 (regression in 2.14.x)
## Packaging
* [#3299](https://github.com/moment/moment/pull/3299) [pkg] npm: Do not include .npmignore in npm package
* [#3273](https://github.com/moment/moment/pull/3273) [pkg] jspm: Include moment.d.ts file in package
* [#3344](https://github.com/moment/moment/pull/3344) [pkg] exports: use module.require for nodejs
Also some locale and typescript improvements
### 2.14.1
- Release July 20, 2016
* [#3280](https://github.com/moment/moment/pull/3280) Fix typescript definitions
### 2.14.0 [See full changelog](https://gist.github.com/ichernev/812e79ac36a7829a22598fe964bfc18a)
- Release July 20, 2016
## New Features
* [#3233](https://github.com/moment/moment/pull/3233) Introduce month.isFormat for format/standalone discovery
* [#2848](https://github.com/moment/moment/pull/2848) Allow user to get/set the rounding method used when calculating relative time
* [#3112](https://github.com/moment/moment/pull/3112) optimize configFromStringAndFormat
* [#3147](https://github.com/moment/moment/pull/3147) Call calendar format function with moment context
* [#3160](https://github.com/moment/moment/pull/3160) deprecate isDSTShifted
* [#3175](https://github.com/moment/moment/pull/3175) make moment calendar extensible with ad-hoc options
* [#3191](https://github.com/moment/moment/pull/3191) toDate returns a copy of the internal date object
* [#3192](https://github.com/moment/moment/pull/3192) Adding support for rollup import.
* [#3238](https://github.com/moment/moment/pull/3238) Handle empty object and empty array for creation as now
* [#3082](https://github.com/moment/moment/pull/3082) Use relative AMD moment dependency
## Bugfixes
* [#3241](https://github.com/moment/moment/pull/3241) Escape all 24 mixed pieces, not only first 12 in computeMonthsParse
* [#3008](https://github.com/moment/moment/pull/3008) Object setter orders sets based on size of unit
* [#3177](https://github.com/moment/moment/pull/3177) Bug Fix [#2704](https://github.com/moment/moment/pull/2704) - isoWeekday(String) inconsistent with isoWeekday(Number)
* [#3230](https://github.com/moment/moment/pull/3230) fix passing date with format string to ignore format string
* [#3232](https://github.com/moment/moment/pull/3232) Fix negative 0 in certain diff cases
* [#3235](https://github.com/moment/moment/pull/3235) Use proper locale inheritance for the base locale, fixes [#3137](https://github.com/moment/moment/pull/3137)
Plus es-do locale and locale bugfixes
### 2.13.0 [See full changelog](https://gist.github.com/ichernev/0132fcf5b61f7fc140b0bb0090480d49)
- Release April 18, 2016
## Enhancements:
* [#2982](https://github.com/moment/moment/pull/2982) Add 'date' as alias to 'day' for startOf() and endOf().
* [#2955](https://github.com/moment/moment/pull/2955) Add parsing negative components in durations when ISO 8601
* [#2991](https://github.com/moment/moment/pull/2991) isBetween support for both open and closed intervals
* [#3105](https://github.com/moment/moment/pull/3105) Add localeSorted argument to weekday listers
* [#3102](https://github.com/moment/moment/pull/3102) Add k and kk formatting tokens
## Bugfixes
* [#3109](https://github.com/moment/moment/pull/3109) Fix [#1756](https://github.com/moment/moment/issues/1756) Resolved thread-safe issue on server side.
* [#3078](https://github.com/moment/moment/pull/3078) Fix parsing for months/weekdays with weird characters
* [#3098](https://github.com/moment/moment/pull/3098) Use Z suffix when in UTC mode ([#3020](https://github.com/moment/moment/issues/3020))
* [#2995](https://github.com/moment/moment/pull/2995) Fix floating point rounding errors in durations
* [#3059](https://github.com/moment/moment/pull/3059) fix bug where diff returns -0 in month-related diffs
* [#3045](https://github.com/moment/moment/pull/3045) Fix mistaking any input for 'a' token
* [#2877](https://github.com/moment/moment/pull/2877) Use explicit .valueOf() calls instead of coercion
* [#3036](https://github.com/moment/moment/pull/3036) Year setter should keep time when DST changes
Plus 3 new locales and locale fixes.
### 2.12.0 [See full changelog](https://gist.github.com/ichernev/6e5bfdf8d6522fc4ac73)
- Release March 7, 2016
## Enhancements:
* [#2932](https://github.com/moment/moment/pull/2932) List loaded locales
* [#2818](https://github.com/moment/moment/pull/2818) Parse ISO-8061 duration containing both day and week values
* [#2774](https://github.com/moment/moment/pull/2774) Implement locale inheritance and locale updating
## Bugfixes:
* [#2970](https://github.com/moment/moment/pull/2970) change add subtract to handle decimal values by rounding
* [#2887](https://github.com/moment/moment/pull/2887) Fix toJSON casting of invalid moment
* [#2897](https://github.com/moment/moment/pull/2897) parse string arguments for month() correctly, closes #2884
* [#2946](https://github.com/moment/moment/pull/2946) Fix usage suggestions for min and max
## New locales:
* [#2917](https://github.com/moment/moment/pull/2917) Locale Punjabi(Gurmukhi) India format conversion
And more
### 2.11.2 (Fix ReDoS attack vector)
- Release February 7, 2016
* [#2939](https://github.com/moment/moment/pull/2939) use full-string match to speed up aspnet regex match
### 2.11.1 [See full changelog](https://gist.github.com/ichernev/8ec3ee25b749b4cff3c2)
- Release January 9, 2016
## Bugfixes:
* [#2881](https://github.com/moment/moment/pull/2881) Revert "Merge pull request #2746 from mbad0la:develop" Sep->Sept
* [#2868](https://github.com/moment/moment/pull/2868) Add format and parse token Y, so it actually works
* [#2865](https://github.com/moment/moment/pull/2865) Use typeof checks for undefined for global variables
* [#2858](https://github.com/moment/moment/pull/2858) Fix Date mocking regression introduced in 2.11.0
* [#2864](https://github.com/moment/moment/pull/2864) Include changelog in npm release
* [#2830](https://github.com/moment/moment/pull/2830) dep: add grunt-cli
* [#2869](https://github.com/moment/moment/pull/2869) Fix months parsing for some locales
### 2.11.0 [See full changelog](https://gist.github.com/ichernev/6594bc29719dde6b2f66)
- Release January 4, 2016
* [#2624](https://github.com/moment/moment/pull/2624) Proper handling of invalid moments
* [#2634](https://github.com/moment/moment/pull/2634) Fix strict month parsing issue in cs,ru,sk
* [#2735](https://github.com/moment/moment/pull/2735) Reset the locale back to 'en' after defining all locales in min/locales.js
* [#2702](https://github.com/moment/moment/pull/2702) Week rework
* [#2746](https://github.com/moment/moment/pull/2746) Changed September Abbreviation to "Sept" in locale-specific english
files and default locale file
* [#2646](https://github.com/moment/moment/pull/2646) Fix [#2645](https://github.com/moment/moment/pull/2645) - invalid dates pre-1970
* [#2641](https://github.com/moment/moment/pull/2641) Implement basic format and comma as ms separator in ISO 8601
* [#2665](https://github.com/moment/moment/pull/2665) Implement stricter weekday parsing
* [#2700](https://github.com/moment/moment/pull/2700) Add [Hh]mm and [Hh]mmss formatting tokens, so you can parse 123 with
hmm for example
* [#2565](https://github.com/moment/moment/pull/2565) [#2835](https://github.com/moment/moment/pull/2835) Expose arguments used for moment creation with creationData
(fix [#2443](https://github.com/moment/moment/pull/2443))
* [#2648](https://github.com/moment/moment/pull/2648) fix issue [#2640](https://github.com/moment/moment/pull/2640): support instanceof operator
* [#2709](https://github.com/moment/moment/pull/2709) Add isSameOrAfter and isSameOrBefore comparison methods
* [#2721](https://github.com/moment/moment/pull/2721) Fix moment creation from object with strings values
* [#2740](https://github.com/moment/moment/pull/2740) Enable 'd hh:mm:ss.sss' format for durations
* [#2766](https://github.com/moment/moment/pull/2766) [#2833](https://github.com/moment/moment/pull/2833) Alternate Clock Source Support
### 2.10.6
- Release July 28, 2015
[#2515](https://github.com/moment/moment/pull/2515) Fix regression introduced
in `2.10.5` related to `moment.ISO_8601` parsing.
### 2.10.5 [See full changelog](https://gist.github.com/ichernev/6ec13ac7efc396da44b2)
- Release July 26, 2015
Important changes:
* [#2357](https://github.com/moment/moment/pull/2357) Improve unit bubbling for ISO dates
this fixes day to year conversions to work around end-of-year (~365 days). As
a side effect 365 days is 11 months and 30 days, and 366 days is one year.
* [#2438](https://github.com/moment/moment/pull/2438) Fix inconsistent moment.min and moment.max results
Return invalid result if any of the inputs is invalid
* [#2494](https://github.com/moment/moment/pull/2494) Fix two digit year parsing with YYYY format
This brings the benefits of YY to YYYY
* [#2368](https://github.com/moment/moment/pull/2368) perf: use faster form of copying dates, across the board improvement
### 2.10.3 [See full changelog](https://gist.github.com/ichernev/f264b9bed5b00f8b1b7f)
- Release May 13, 2015
* add `moment.fn.to` and `moment.fn.toNow` (similar to `from` and `fromNow`)
* new locales (Sinhalese (si), Montenegrin (me), Javanese (ja))
* performance improvements
### 2.10.2
- Release April 9, 2015
* fixed moment-with-locales in browser env caused by esperanto change
### 2.10.1
* regression: Add moment.duration.fn back
### 2.10.0
Ported code to es6 modules.
### 2.9.0 [See full changelog](https://gist.github.com/ichernev/0c9a9b49951111a27ce7)
- Release January 8, 2015
languages:
* [2104](https://github.com/moment/moment/issues/2104) Frisian (fy) language file with unit test
* [2097](https://github.com/moment/moment/issues/2097) add ar-tn locale
deprecations:
* [2074](https://github.com/moment/moment/issues/2074) Implement `moment.fn.utcOffset`, deprecate `moment.fn.zone`
features:
* [2088](https://github.com/moment/moment/issues/2088) add moment.fn.isBetween
* [2054](https://github.com/moment/moment/issues/2054) Call updateOffset when creating moment (needed for default timezone in
moment-timezone)
* [1893](https://github.com/moment/moment/issues/1893) Add moment.isDate method
* [1825](https://github.com/moment/moment/issues/1825) Implement toJSON function on Duration
* [1809](https://github.com/moment/moment/issues/1809) Allowing moment.set() to accept a hash of units
* [2128](https://github.com/moment/moment/issues/2128) Add firstDayOfWeek, firstDayOfYear locale getters
* [2131](https://github.com/moment/moment/issues/2131) Add quarter diff support
Some bugfixes and language improvements -- [full changelog](https://gist.github.com/ichernev/0c9a9b49951111a27ce7)
### 2.8.4 [See full changelog](https://gist.github.com/ichernev/a4fcb0a46d74e4b9b996)
- Release November 19, 2014
Features:
* [#2000](https://github.com/moment/moment/issues/2000) Add LTS localised format that includes seconds
* [#1960](https://github.com/moment/moment/issues/1960) added formatToken 'x' for unix offset in milliseconds #1938
* [#1965](https://github.com/moment/moment/issues/1965) Support 24:00:00.000 to mean next day, at midnight.
* [#2002](https://github.com/moment/moment/issues/2002) Accept 'date' key when creating moment with object
* [#2009](https://github.com/moment/moment/issues/2009) Use native toISOString when we can
Some bugfixes and language improvements -- [full changelog](https://gist.github.com/ichernev/a4fcb0a46d74e4b9b996)
### 2.8.3
- Release September 5, 2014
Bugfixes:
* [#1801](https://github.com/moment/moment/issues/1801) proper pluralization for Arabic
* [#1833](https://github.com/moment/moment/issues/1833) improve spm integration
* [#1871](https://github.com/moment/moment/issues/1871) fix zone bug caused by Firefox 24
* [#1882](https://github.com/moment/moment/issues/1882) Use hh:mm in Czech
* [#1883](https://github.com/moment/moment/issues/1883) Fix 2.8.0 regression in duration as conversions
* [#1890](https://github.com/moment/moment/issues/1890) Faster travis builds
* [#1892](https://github.com/moment/moment/issues/1892) Faster isBefore/After/Same
* [#1848](https://github.com/moment/moment/issues/1848) Fix flaky month diffs
* [#1895](https://github.com/moment/moment/issues/1895) Fix 2.8.0 regression in moment.utc with format array
* [#1896](https://github.com/moment/moment/issues/1896) Support setting invalid instance locale (noop)
* [#1897](https://github.com/moment/moment/issues/1897) Support moment([str]) in addition to moment([int])
### 2.8.2
- Release August 22, 2014
Minor bugfixes:
* [#1874](https://github.com/moment/moment/issues/1874) use `Object.prototype.hasOwnProperty`
instead of `obj.hasOwnProperty` (ie8 bug)
* [#1873](https://github.com/moment/moment/issues/1873) add `duration#toString()`
* [#1859](https://github.com/moment/moment/issues/1859) better month/weekday names in norwegian
* [#1812](https://github.com/moment/moment/issues/1812) meridiem parsing for greek
* [#1804](https://github.com/moment/moment/issues/1804) spanish del -> de
* [#1800](https://github.com/moment/moment/issues/1800) korean LT improvement
### 2.8.1
- Release August 1, 2014
* bugfix [#1813](https://github.com/moment/moment/issues/1813): fix moment().lang([key]) incompatibility
### 2.8.0 [See changelog](https://gist.github.com/ichernev/ac3899324a5fa6c8c9b4)
- Release July 31, 2014
* incompatible changes
* [#1761](https://github.com/moment/moment/issues/1761): moments created without a language are no longer following the global language, in case it changes. Only newly created moments take the global language by default. In case you're affected by this, wait, comment on [#1797](https://github.com/moment/moment/issues/1797) and wait for a proper reimplementation
* [#1642](https://github.com/moment/moment/issues/1642): 45 days is no longer "a month" according to humanize, cutoffs for month, and year have changed. Hopefully your code does not depend on a particular answer from humanize (which it shouldn't anyway)
* [#1784](https://github.com/moment/moment/issues/1784): if you use the human readable English datetime format in a weird way (like storing them in a database) that would break when the format changes you're at risk.
* deprecations (old behavior will be dropped in 3.0)
* [#1761](https://github.com/moment/moment/issues/1761) `lang` is renamed to `locale`, `langData` -> `localeData`. Also there is now `defineLocale` that should be used when creating new locales
* [#1763](https://github.com/moment/moment/issues/1763) `add(unit, value)` and `subtract(unit, value)` are now deprecated. Use `add(value, unit)` and `subtract(value, unit)` instead.
* [#1759](https://github.com/moment/moment/issues/1759) rename `duration.toIsoString` to `duration.toISOString`. The js standard library and moment's `toISOString` follow that convention.
* new locales
* [#1789](https://github.com/moment/moment/issues/1789) Tibetan (bo)
* [#1786](https://github.com/moment/moment/issues/1786) Africaans (af)
* [#1778](https://github.com/moment/moment/issues/1778) Burmese (my)
* [#1727](https://github.com/moment/moment/issues/1727) Belarusian (be)
* bugfixes, locale bugfixes, performance improvements, features
### 2.7.0 [See changelog](https://gist.github.com/ichernev/b0a3d456d5a84c9901d7)
- Release June 12, 2014
* new languages
* [#1678](https://github.com/moment/moment/issues/1678) Bengali (bn)
* [#1628](https://github.com/moment/moment/issues/1628) Azerbaijani (az)
* [#1633](https://github.com/moment/moment/issues/1633) Arabic, Saudi Arabia (ar-sa)
* [#1648](https://github.com/moment/moment/issues/1648) Austrian German (de-at)
* features
* [#1663](https://github.com/moment/moment/issues/1663) configurable relative time thresholds
* [#1554](https://github.com/moment/moment/issues/1554) support anchor time in moment.calendar
* [#1693](https://github.com/moment/moment/issues/1693) support moment.ISO_8601 as parsing format
* [#1637](https://github.com/moment/moment/issues/1637) add moment.min and moment.max and deprecate min/max instance methods
* [#1704](https://github.com/moment/moment/issues/1704) support string value in add/subtract
* [#1647](https://github.com/moment/moment/issues/1647) add spm support (package manager)
* bugfixes
### 2.6.0 [See changelog](https://gist.github.com/ichernev/10544682)
- Release April 12 , 2014
* languages
* [#1529](https://github.com/moment/moment/issues/1529) Serbian-Cyrillic (sr-cyr)
* [#1544](https://github.com/moment/moment/issues/1544), [#1546](https://github.com/moment/moment/issues/1546) Khmer Cambodia (km)
* features
* [#1419](https://github.com/moment/moment/issues/1419), [#1468](https://github.com/moment/moment/issues/1468), [#1467](https://github.com/moment/moment/issues/1467), [#1546](https://github.com/moment/moment/issues/1546) better handling of timezone-d moments around DST
* [#1462](https://github.com/moment/moment/issues/1462) add weeksInYear and isoWeeksInYear
* [#1475](https://github.com/moment/moment/issues/1475) support ordinal parsing
* [#1499](https://github.com/moment/moment/issues/1499) composer support
* [#1577](https://github.com/moment/moment/issues/1577), [#1604](https://github.com/moment/moment/issues/1604) put Date parsing in moment.createFromInputFallback so it can be properly deprecated and controlled in the future
* [#1545](https://github.com/moment/moment/issues/1545) extract two-digit year parsing in moment.parseTwoDigitYear, so it can be overwritten
* [#1590](https://github.com/moment/moment/issues/1590) (see [#1574](https://github.com/moment/moment/issues/1574)) set AMD global before module definition to better support non AMD module dependencies used in AMD environment
* [#1589](https://github.com/moment/moment/issues/1589) remove global in Node.JS environment (was not working before, nobody complained, was scheduled for removal anyway)
* [#1586](https://github.com/moment/moment/issues/1586) support quarter setting and parsing
* 18 bugs fixed
### 2.5.1
- Release January 22, 2014
* languages
* [#1392](https://github.com/moment/moment/issues/1392) Armenian (hy-am)
* bugfixes
* [#1429](https://github.com/moment/moment/issues/1429) fixes [#1423](https://github.com/moment/moment/issues/1423) weird chrome-32 bug with js object creation
* [#1421](https://github.com/moment/moment/issues/1421) remove html entities from Welsh
* [#1418](https://github.com/moment/moment/issues/1418) fixes [#1401](https://github.com/moment/moment/issues/1401) improved non-padded tokens in strict matching
* [#1417](https://github.com/moment/moment/issues/1417) fixes [#1404](https://github.com/moment/moment/issues/1404) handle buggy moment object created by property cloning
* [#1398](https://github.com/moment/moment/issues/1398) fixes [#1397](https://github.com/moment/moment/issues/1397) fix Arabic-like week number parsing
* [#1396](https://github.com/moment/moment/issues/1396) add leftZeroFill(4) to GGGG and gggg formats
* [#1373](https://github.com/moment/moment/issues/1373) use lowercase for months and days in Catalan
* testing
* [#1374](https://github.com/moment/moment/issues/1374) run tests on multiple browser/os combos via SauceLabs and Travis
### 2.5.0 [See changelog](https://gist.github.com/ichernev/8104451)
- Release Dec 24, 2013
* New languages
* Luxemburish (lb) [1247](https://github.com/moment/moment/issues/1247)
* Serbian (rs) [1319](https://github.com/moment/moment/issues/1319)
* Tamil (ta) [1324](https://github.com/moment/moment/issues/1324)
* Macedonian (mk) [1337](https://github.com/moment/moment/issues/1337)
* Features
* [1311](https://github.com/moment/moment/issues/1311) Add quarter getter and format token `Q`
* [1303](https://github.com/moment/moment/issues/1303) strict parsing now respects number of digits per token (fix [1196](https://github.com/moment/moment/issues/1196))
* 0d30bb7 add jspm support
* [1347](https://github.com/moment/moment/issues/1347) improve zone parsing
* [1362](https://github.com/moment/moment/issues/1362) support merideam parsing in Korean
* 22 bugfixes
### 2.4.0
- Release Oct 27, 2013
* **Deprecate** globally exported moment, will be removed in next major
* New languages
* Farose (fo) [#1206](https://github.com/moment/moment/issues/1206)
* Tagalog/Filipino (tl-ph) [#1197](https://github.com/moment/moment/issues/1197)
* Welsh (cy) [#1215](https://github.com/moment/moment/issues/1215)
* Bugfixes
* properly handle Z at the end of iso RegExp [#1187](https://github.com/moment/moment/issues/1187)
* chinese meridian time improvements [#1076](https://github.com/moment/moment/issues/1076)
* fix language tests [#1177](https://github.com/moment/moment/issues/1177)
* remove some failing tests (that should have never existed :))
[#1185](https://github.com/moment/moment/issues/1185)
[#1183](https://github.com/moment/moment/issues/1183)
* handle russian noun cases in weird cases [#1195](https://github.com/moment/moment/issues/1195)
### 2.3.1
- Release Oct 9, 2013
Removed a trailing comma [1169] and fixed a bug with `months`, `weekdays` getters [#1171](https://github.com/moment/moment/issues/1171).
### 2.3.0 [See changelog](https://gist.github.com/ichernev/6864354)
- Release Oct 7, 2013
Changed isValid, added strict parsing.
Week tokens parsing.
### 2.2.1
- Release Sep 12, 2013
Fixed bug in string prototype test.
Updated authors and contributors.
### 2.2.0 [See changelog](https://gist.github.com/ichernev/00f837a9baf46a3565e4)
- Release Sep 11, 2013
Added bower support.
Language files now use UMD.
Creating moment defaults to current date/month/year.
Added a bundle of moment and all language files.
### 2.1.0 [See changelog](https://gist.github.com/timrwood/b8c2d90d528eddb53ab5)
- Release Jul 8, 2013
Added better week support.
Added ability to set offset with `moment#zone`.
Added ability to set month or weekday from a string.
Added `moment#min` and `moment#max`
### 2.0.0 [See changelog](https://gist.github.com/timrwood/e72f2eef320ed9e37c51)
- Release Feb 9, 2013
Added short form localized tokens.
Added ability to define language a string should be parsed in.
Added support for reversed add/subtract arguments.
Added support for `endOf('week')` and `startOf('week')`.
Fixed the logic for `moment#diff(Moment, 'months')` and `moment#diff(Moment, 'years')`
`moment#diff` now floors instead of rounds.
Normalized `moment#toString`.
Added `isSame`, `isAfter`, and `isBefore` methods.
Added better week support.
Added `moment#toJSON`
Bugfix: Fixed parsing of first century dates
Bugfix: Parsing 10Sep2001 should work as expected
Bugfix: Fixed weirdness with `moment.utc()` parsing.
Changed language ordinal method to return the number + ordinal instead of just the ordinal.
Changed two digit year parsing cutoff to match strptime.
Removed `moment#sod` and `moment#eod` in favor of `moment#startOf` and `moment#endOf`.
Removed `moment.humanizeDuration()` in favor of `moment.duration().humanize()`.
Removed the lang data objects from the top level namespace.
Duplicate `Date` passed to `moment()` instead of referencing it.
### 1.7.2 [See discussion](https://github.com/timrwood/moment/issues/456)
- Release Oct 2, 2012
Bugfixes
### 1.7.1 [See discussion](https://github.com/timrwood/moment/issues/384)
- Release Oct 1, 2012
Bugfixes
### 1.7.0 [See discussion](https://github.com/timrwood/moment/issues/288)
- Release Jul 26, 2012
Added `moment.fn.endOf()` and `moment.fn.startOf()`.
Added validation via `moment.fn.isValid()`.
Made formatting method 3x faster. http://jsperf.com/momentjs-cached-format-functions
Add support for month/weekday callbacks in `moment.fn.format()`
Added instance specific languages.
Added two letter weekday abbreviations with the formatting token `dd`.
Various language updates.
Various bugfixes.
### 1.6.0 [See discussion](https://github.com/timrwood/moment/pull/268)
- Release Apr 26, 2012
Added Durations.
Revamped parser to support parsing non-separated strings (YYYYMMDD vs YYYY-MM-DD).
Added support for millisecond parsing and formatting tokens (S SS SSS)
Added a getter for `moment.lang()`
Various bugfixes.
There are a few things deprecated in the 1.6.0 release.
1. The format tokens `z` and `zz` (timezone abbreviations like EST CST MST etc) will no longer be supported. Due to inconsistent browser support, we are unable to consistently produce this value. See [this issue](https://github.com/timrwood/moment/issues/162) for more background.
2. The method `moment.fn.native` is deprecated in favor of `moment.fn.toDate`. There continue to be issues with Google Closure Compiler throwing errors when using `native`, even in valid instances.
3. The way to customize am/pm strings is being changed. This would only affect you if you created a custom language file. For more information, see [this issue](https://github.com/timrwood/moment/pull/222).
### 1.5.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=10&page=1&state=closed)
- Release Mar 20, 2012
Added UTC mode.
Added automatic ISO8601 parsing.
Various bugfixes.
### 1.4.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=8&state=closed)
- Release Feb 4, 2012
Added `moment.fn.toDate` as a replacement for `moment.fn.native`.
Added `moment.fn.sod` and `moment.fn.eod` to get the start and end of day.
Various bugfixes.
### 1.3.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=7&state=closed)
- Release Jan 5, 2012
Added support for parsing month names in the current language.
Added escape blocks for parsing tokens.
Added `moment.fn.calendar` to format strings like 'Today 2:30 PM', 'Tomorrow 1:25 AM', and 'Last Sunday 4:30 AM'.
Added `moment.fn.day` as a setter.
Various bugfixes
### 1.2.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=4&state=closed)
- Release Dec 7, 2011
Added timezones to parser and formatter.
Added `moment.fn.isDST`.
Added `moment.fn.zone` to get the timezone offset in minutes.
### 1.1.2 [See milestone](https://github.com/timrwood/moment/issues?milestone=6&state=closed)
- Release Nov 18, 2011
Various bugfixes
### 1.1.1 [See milestone](https://github.com/timrwood/moment/issues?milestone=5&state=closed)
- Release Nov 12, 2011
Added time specific diffs (months, days, hours, etc)
### 1.1.0
- Release Oct 28, 2011
Added `moment.fn.format` localized masks. 'L LL LLL LLLL' [issue 29](https://github.com/timrwood/moment/pull/29)
Fixed [issue 31](https://github.com/timrwood/moment/pull/31).
### 1.0.1
- Release Oct 18, 2011
Added `moment.version` to get the current version.
Removed `window !== undefined` when checking if module exists to support browserify. [issue 25](https://github.com/timrwood/moment/pull/25)
### 1.0.0
- Release
Added convenience methods for getting and setting date parts.
Added better support for `moment.add()`.
Added better lang support in NodeJS.
Renamed library from underscore.date to Moment.js
### 0.6.1
- Release Oct 12, 2011
Added Portuguese, Italian, and French language support
### 0.6.0
- Release Sep 21, 2011
Added _date.lang() support.
Added support for passing multiple formats to try to parse a date. _date("07-10-1986", ["MM-DD-YYYY", "YYYY-MM-DD"]);
Made parse from string and single format 25% faster.
### 0.5.2
- Release Jul 11, 2011
Bugfix for [issue 8](https://github.com/timrwood/underscore.date/pull/8) and [issue 9](https://github.com/timrwood/underscore.date/pull/9).
### 0.5.1
- Release Jun 17, 2011
Bugfix for [issue 5](https://github.com/timrwood/underscore.date/pull/5).
### 0.5.0
- Release Jun 13, 2011
Dropped the redundant `_date.date()` in favor of `_date()`.
Removed `_date.now()`, as it is a duplicate of `_date()` with no parameters.
Removed `_date.isLeapYear(yearNumber)`. Use `_date([yearNumber]).isLeapYear()` instead.
Exposed customization options through the `_date.relativeTime`, `_date.weekdays`, `_date.weekdaysShort`, `_date.months`, `_date.monthsShort`, and `_date.ordinal` variables instead of the `_date.customize()` function.
### 0.4.1
- Release May 9, 2011
Added date input formats for input strings.
### 0.4.0
- Release May 9, 2011
Added underscore.date to npm. Removed dependencies on underscore.
### 0.3.2
- Release Apr 9, 2011
Added `'z'` and `'zz'` to `_.date().format()`. Cleaned up some redundant code to trim off some bytes.
### 0.3.1
- Release Mar 25, 2011
Cleaned up the namespace. Moved all date manipulation and display functions to the _.date() object.
### 0.3.0
- Release Mar 25, 2011
Switched to the Underscore methodology of not mucking with the native objects' prototypes.
Made chaining possible.
### 0.2.1
- Release
Changed date names to be a more pseudo standardized 'dddd, MMMM Do YYYY, h:mm:ss a'.
Added `Date.prototype` functions `add`, `subtract`, `isdst`, and `isleapyear`.
### 0.2.0
- Release
Changed function names to be more concise.
Changed date format from php date format to custom format.
### 0.1.0
- Release
Initial release

100
js/moment/CONTRIBUTING.md Normal file
View File

@ -0,0 +1,100 @@
Submitting Issues
=================
If you are submitting a bug, please create a [jsfiddle](http://jsfiddle.net/) demonstrating the issue.
Read before submitting Pull Requests
====================================
* **Pull requests to the `master` branch will be closed.** Please submit all pull requests to the `develop` branch.
* **You will be required to sign a JS Foundation CLA before your pull request can be merged.** [Sign it right now](https://cla.js.foundation/moment/moment).
* **Locale translations will not be merged without unit tests.** See [the British English unit tests](https://github.com/moment/moment/blob/develop/src/test/locale/en-gb.js) for an example.
* **Do not include the minified files in your pull request.** These are
`moment.js`, `locale/*.js`, `min/*.js`. Don't worry, we'll build them when
we cut a release.
Code organization
=================
Starting from version 2.10.0 the code is placed under `src/`.
`moment.js`, `locale/*.js`, `min/*.js` are generated only on release.
**DO NOT** submit changes to the generated files. Instead only change
`src/**/*.js` and run the tests.
* `src/lib/**/*.js` moment core files
* `src/locale/*.js` locale files
* `src/test/moment/*.js` moment core tests
* `src/test/locale/*.js` locale tests
We're using ES6 module system, but nothing else ES6, because of performance
considerations (added code by the transpiler, less than optimal translation to
ES5). So please do not use that fancy new ES6 feature in your patch, it won't
be accepted.
Setting up development environment
==================================
To contribute, fork the library and install grunt and dependencies. You need
[git](http://git-scm.com/) and
[node](http://nodejs.org/); you might use
[nvm](https://github.com/creationix/nvm) or
[nenv](https://github.com/ryuone/nenv) to install node.
```bash
git clone https://github.com/moment/moment.git
cd moment
npm install -g grunt-cli
npm install
git checkout develop # all patches against develop branch, please!
grunt # this runs tests and jshint
```
Changing locale files
=====================
If you have any changes to existing locale files, `@mention` the original
author in the pull request (check the top of the language file), and ask if
he/she approves of your changes. Because I don't know any languages I can't
judge your locale changes, only the original author can :)
In order for your pull request to get merged it must have approval of original
author, or at least one other native speaker has to approve of the change
(happens rarely).
Grunt tasks
===========
We use Grunt for managing the build. Here are some useful Grunt tasks:
* `grunt` The default task lints the code and runs the tests. You should make sure you do this before submitting a PR.
* `grunt test` run the tests.
* `grunt release` Build everything, including minified files (do not include
those in Pull Requests)
* `grunt transpile:fr,ru` Build custom locale bundles `moment-with-locales.custom.js` and `locales.custom.js` inside `build/umd/min` containing just French and Russian.
* `grunt size` Print size statistics.
Becoming a moment team member
=============================
Moment's team members have extra powers and responsibilities. If you want to
become one -- be active in our repositories by answering issues, reviewing PRs,
discussing changes, submitting PRs for open bugs. Any help on
[moment/moment](https://github.com/moment/moment),
[moment/momentjs.com](https://github.com/moment/momentjs.com),
[moment/moment-timezone](https://github.com/moment/moment-timezone) will be
noticed.
Once you've proven to be trustworthy, submit your request to the
[gitter chat](https://gitter.im/moment/moment), and it will be reviewed by the
existing team.
Once you become a member:
* you can tell your friends
* you can close issues submitted by others
But also:
* be active in the repositories
* pick up work nobody else wants to
* attend a monthly meeting
* participate in the internal slack group

212
js/moment/Gruntfile.js Normal file
View File

@ -0,0 +1,212 @@
module.exports = function (grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
env : {
sauceLabs : (grunt.file.exists('.sauce-labs.creds') ?
grunt.file.readJSON('.sauce-labs.creds') : {})
},
karma : {
options: {
browserNoActivityTimeout: 60000,
browserDisconnectTimeout: 10000,
browserDisconnectTolerance: 2,
frameworks: ['qunit'],
files: [
'min/moment-with-locales.js',
'min/tests.js'
],
sauceLabs: {
startConnect: true,
testName: 'MomentJS'
},
customLaunchers: {
slChromeWinXp: {
base: 'SauceLabs',
browserName: 'chrome',
platform: 'Windows XP'
},
slIe10Win7: {
base: 'SauceLabs',
browserName: 'internet explorer',
platform: 'Windows 7',
version: '10'
},
slIe9Win7: {
base: 'SauceLabs',
browserName: 'internet explorer',
platform: 'Windows 7',
version: '9'
},
slIe8Win7: {
base: 'SauceLabs',
browserName: 'internet explorer',
platform: 'Windows 7',
version: '8'
},
slIe11Win10: {
base: 'SauceLabs',
browserName: 'internet explorer',
platform: 'Windows 10',
version: '11'
},
slME25Win10: {
base: 'SauceLabs',
browserName: 'MicrosoftEdge',
platform: 'Windows 10',
version: '20.10240'
},
slFfLinux: {
base: 'SauceLabs',
browserName: 'firefox',
platform: 'Linux'
},
slSafariOsx: {
base: 'SauceLabs',
browserName: 'safari',
platform: 'OS X 10.8'
},
slSafariOsx11: {
base: 'SauceLabs',
browserName: 'safari',
platform: 'OS X 10.11'
}
}
},
server: {
browsers: []
},
chrome: {
singleRun: true,
browsers: ['Chrome']
},
firefox: {
singleRun: true,
browsers: ['Firefox']
},
sauce: {
options: {
reporters: ['dots']
},
singleRun: true,
browsers: [
'slChromeWinXp',
'slIe10Win7',
'slIe9Win7',
'slIe8Win7',
'slIe11Win10',
'slME25Win10',
'slFfLinux',
'slSafariOsx'
]
}
},
uglify : {
main: {
files: {
'min/moment-with-locales.min.js' : 'min/moment-with-locales.js',
'min/locales.min.js' : 'min/locales.js',
'min/moment.min.js' : 'moment.js'
}
},
options: {
mangle: true,
compress: {
dead_code: false // jshint ignore:line
},
output: {
ascii_only: true // jshint ignore:line
},
report: 'min',
preserveComments: /^!|@preserve|@license|@cc_on/i
}
},
jshint: {
all: [
'Gruntfile.js',
'tasks/**.js',
'src/**/*.js'
],
options: {
jshintrc: true
}
},
jscs: {
all: [
'Gruntfile.js',
'tasks/**.js',
'src/**/*.js'
],
options: {
config: '.jscs.json'
}
},
watch : {
test : {
files : [
'src/**/*.js'
],
tasks: ['test']
},
jshint : {
files : '<%= jshint.all %>',
tasks: ['jshint']
}
},
benchmark: {
all: {
src: ['benchmarks/*.js']
}
},
exec: {
'meteor-init': {
// Make sure Meteor is installed, per https://meteor.com/install.
// The curl'ed script is safe; takes 2 minutes to read source & check.
command: 'type meteor >/dev/null 2>&1 || { curl https://install.meteor.com/ | sh; }'
},
'meteor-test': {
command: 'spacejam --mongo-url mongodb:// test-packages ./meteor'
},
'meteor-publish': {
command: 'cd meteor && meteor publish'
},
'typescript-test': {
command: 'npm run typescript-test'
}
}
});
grunt.loadTasks('tasks');
// These plugins provide necessary tasks.
require('load-grunt-tasks')(grunt);
// Default task.
grunt.registerTask('default', ['lint', 'test']);
// linting
grunt.registerTask('lint', ['jshint', 'jscs']);
// test tasks
grunt.registerTask('test', ['test:node', 'test:typescript']);
grunt.registerTask('test:node', ['transpile', 'qtest']);
grunt.registerTask('test:typescript', ['exec:typescript-test']);
// TODO: For some weird reason karma doesn't like the files in
// build/umd/min/* but works with min/*, so update-index, then git checkout
grunt.registerTask('test:server', ['transpile', 'update-index', 'karma:server']);
grunt.registerTask('test:browser', ['transpile', 'update-index', 'karma:chrome', 'karma:firefox']);
grunt.registerTask('test:sauce-browser', ['transpile', 'update-index', 'env:sauceLabs', 'karma:sauce']);
grunt.registerTask('test:meteor', ['exec:meteor-init', 'exec:meteor-test', 'exec:meteor-cleanup']);
// travis build task
grunt.registerTask('build:travis', ['default']);
grunt.registerTask('meteor-publish', ['exec:meteor-init', 'exec:meteor-publish', 'exec:meteor-cleanup']);
// Task to be run when releasing a new version
grunt.registerTask('release', [
'default',
'update-index',
'component',
'uglify:main'
]);
};

View File

@ -0,0 +1,25 @@
**Description of the Issue and Steps to Reproduce:**
*Please include the values of all variables used.*
**Environment:**
*Examples: Chrome 49 on OSX, Internet Explorer 10 on Windows 7, Node.JS 4.4.4 on Ubuntu 16.0.4*
*Both the browser and the OS are important to us, particularly if you have an unsual environment like an IOT application.*
**Other information that may be helpful:**
* The time zone setting of the machine the code is running on
* The time and date at which the code was run
* Other libraries in use (TypeScript, Immutable.js, etc)
If you are reporting an issue, please run the following code in the environment you are using and include the output:
```js
console.log( (new Date()).toString())
console.log((new Date()).toLocaleString())
console.log( (new Date()).getTimezoneOffset())
console.log( navigator.userAgent)
console.log(moment.version)
```
*Ensure your issue is isolated to moment. Issues involving third party tools will be closed unless submitted by the tool's author/maintainer.*

22
js/moment/LICENSE Normal file
View File

@ -0,0 +1,22 @@
Copyright (c) JS Foundation and other contributors
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

View File

@ -0,0 +1,26 @@
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>Moment.js</id>
<version>2.19.1</version>
<authors>Tim Wood, Iskren Chernev, Moment.js contributors</authors>
<owners>Cory Deppen, Iskren Chernev</owners>
<description>A lightweight JavaScript date library for parsing, manipulating, and formatting dates.</description>
<releaseNotes>
* Release Oct 11, 2017
Make react native and webpack both work
* #4225 #4226 #4232
</releaseNotes>
<projectUrl>http://momentjs.com/</projectUrl>
<iconUrl>http://pbs.twimg.com/profile_images/482670411402858496/Xrtdc94q_normal.png</iconUrl>
<licenseUrl>https://raw.github.com/timrwood/moment/master/LICENSE</licenseUrl>
<tags>JavaScript date time browser node.js</tags>
</metadata>
<files>
<file src="moment.js" target="Content\Scripts" />
<file src="min/moment.min.js" target="Content\Scripts" />
<file src="min/moment-with-locales.js" target="Content\Scripts" />
<file src="min/moment-with-locales.min.js" target="Content\Scripts" />
</files>
</package>

61
js/moment/README.md Normal file
View File

@ -0,0 +1,61 @@
[![Join the chat at https://gitter.im/moment/moment](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/moment/moment?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[![NPM version][npm-version-image]][npm-url] [![NPM downloads][npm-downloads-image]][npm-url] [![MIT License][license-image]][license-url] [![Build Status][travis-image]][travis-url]
[![Coverage Status](https://coveralls.io/repos/moment/moment/badge.svg?branch=develop)](https://coveralls.io/r/moment/moment?branch=develop)
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fmoment%2Fmoment.svg?type=shield)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fmoment%2Fmoment?ref=badge_shield)
A lightweight JavaScript date library for parsing, validating, manipulating, and formatting dates.
**[Documentation](http://momentjs.com/docs/)**
## Port to ECMAScript 6 (version 2.10.0)
Moment 2.10.0 does not bring any new features, but the code is now written in
ECMAScript 6 modules and placed inside `src/`. Previously `moment.js`, `locale/*.js` and
`test/moment/*.js`, `test/locale/*.js` contained the source of the project. Now
the source is in `src/`, temporary build (ECMAScript 5) files are placed under
`build/umd/` (for running tests during development), and the `moment.js` and
`locale/*.js` files are updated only on release.
If you want to use a particular revision of the code, make sure to run
`grunt transpile update-index`, so `moment.js` and `locales/*.js` are synced
with `src/*`. We might place that in a commit hook in the future.
## Upgrading to 2.0.0
There are a number of small backwards incompatible changes with version 2.0.0. [See the full descriptions here](https://gist.github.com/timrwood/e72f2eef320ed9e37c51#backwards-incompatible-changes)
* Changed language ordinal method to return the number + ordinal instead of just the ordinal.
* Changed two digit year parsing cutoff to match strptime.
* Removed `moment#sod` and `moment#eod` in favor of `moment#startOf` and `moment#endOf`.
* Removed `moment.humanizeDuration()` in favor of `moment.duration().humanize()`.
* Removed the lang data objects from the top level namespace.
* Duplicate `Date` passed to `moment()` instead of referencing it.
## [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md)
## [Contributing](https://github.com/moment/moment/blob/develop/CONTRIBUTING.md)
We're looking for co-maintainers! If you want to become a master of time please
write to [ichernev](https://github.com/ichernev).
## License
Moment.js is freely distributable under the terms of the [MIT license](https://github.com/moment/moment/blob/develop/LICENSE).
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fmoment%2Fmoment.svg?type=large)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fmoment%2Fmoment?ref=badge_large)
[license-image]: http://img.shields.io/badge/license-MIT-blue.svg?style=flat
[license-url]: LICENSE
[npm-url]: https://npmjs.org/package/moment
[npm-version-image]: http://img.shields.io/npm/v/moment.svg?style=flat
[npm-downloads-image]: http://img.shields.io/npm/dm/moment.svg?style=flat
[travis-url]: http://travis-ci.org/moment/moment
[travis-image]: http://img.shields.io/travis/moment/moment/develop.svg?style=flat

View File

@ -0,0 +1,22 @@
var Benchmark = require('benchmark'),
moment = require("./../moment.js"),
base = moment('2013-05-25');
var unitsUnderTest = ["milliseconds", "seconds", "minutes", "hours", "days", "weeks", "months", "quarters", "years"];
var tests = unitsUnderTest.reduce(function (testsSoFar, unit) {
testsSoFar["add " + unit] = generateTestForUnit(unit);
return testsSoFar;
}, {});
function generateTestForUnit(unit) {
return {
setup: function(){var base = base; var unit = unit;},
fn: function(){base.add(8, unit);},
async: true
};
}
module.exports = {
name: 'add',
tests: tests
};

View File

@ -0,0 +1,10 @@
var Benchmark = require('benchmark'),
moment = require("./../moment.js"),
base = moment('2013-05-25');
module.exports = {
name: 'clone',
onComplete: function(){},
fn: function(){base.clone();},
async: true
};

View File

@ -0,0 +1,22 @@
var Benchmark = require('benchmark'),
moment = require("./../moment.js"),
base = moment('2013-05-25');
var unitsUnderTest = ["second", "minute", "hour", "date", "day", "isoWeek", "week", "month", "quarter", "year"];
var tests = unitsUnderTest.reduce(function (testsSoFar, unit) {
testsSoFar["endOf " + unit] = generateTestForUnit(unit);
return testsSoFar;
}, {});
function generateTestForUnit(unit) {
return {
setup: function(){var base = base; var unit = unit;},
fn: function(){base.endOf(unit);},
async: true
};
}
module.exports = {
name: 'endOf',
tests: tests
};

View File

@ -0,0 +1,12 @@
var Benchmark = require('benchmark'),
moment = require('./../moment.js'),
base = new Date();
module.exports = {
name: 'fromDate',
onComplete: function(){},
fn: function(){
moment(base);
},
async: true
};

View File

@ -0,0 +1,12 @@
var Benchmark = require('benchmark'),
moment = require('./../moment.js'),
base = new Date();
module.exports = {
name: 'fromDateUtc',
onComplete: function(){},
fn: function(){
moment.utc(base);
},
async: true
};

View File

@ -0,0 +1,67 @@
var Benchmark = require('benchmark'),
moment = require("./../moment.js");
var isObjectEmpty_getOwnPropertyNames = function(obj) {
if (Object.getOwnPropertyNames) {
return (Object.getOwnPropertyNames(obj).length === 0);
} else {
var k;
for (k in obj) {
if (obj.hasOwnProperty(k)) {
return false;
}
}
return true;
}
};
var isObjectEmpty_keys = function(obj) {
if (Object.keys) {
return (Object.keys(obj).length === 0);
} else {
var k;
for (k in obj) {
if (obj.hasOwnProperty(k)) {
return false;
}
}
return true;
}
};
var isObjectEmpty_forIn = function(obj) {
var k;
for (k in obj) {
if (obj.hasOwnProperty(k)) {
return false;
}
}
return true;
};
module.exports = {
name: 'isObjectEmpty',
tests: {
"isObjectEmpty -> for..in": {
onComplete: function(){},
fn: function(){
isObjectEmpty_forIn(moment());
},
async: false
},
"isObjectEmpty -> Object.keys": {
onComplete: function(){},
fn: function(){
isObjectEmpty_keys(moment());
},
async: false
},
"isObjectEmpty -> Object.getOwnPropertyNames": {
onComplete: function(){},
fn: function(){
isObjectEmpty_getOwnPropertyNames(moment());
},
async: false
}
}
};

View File

@ -0,0 +1,11 @@
var Benchmark = require('benchmark'),
moment = require('./../moment.js');
module.exports = {
name: 'makeDuration',
onComplete: function(){},
fn: function(){
moment.duration(5, 'years');
},
async: true
};

View File

@ -0,0 +1,40 @@
var Benchmark = require('benchmark'),
moment = require("./../moment.js"),
base = moment('2013-05-25');
module.exports = {
name: 'clone',
tests: {
isBefore_true: {
onComplete: function(){},
fn: function(){base.isBefore('2013-06-25');},
async: true
},
isBefore_self: {
onComplete: function(){},
fn: function(){base.isBefore('2013-05-25');},
async: true
},
isBefore_false: {
onComplete: function(){},
fn: function(){base.isBefore('2013-04-25');},
async: true
},
isAfter_true: {
onComplete: function(){},
fn: function(){base.isAfter('2013-04-25');},
async: true
},
isAfter_self: {
onComplete: function(){},
fn: function(){base.isAfter('2013-05-25');},
async: true
},
isAfter_false: {
onComplete: function(){},
fn: function(){base.isAfter('2013-06-25');},
async: true
}
}
};

View File

@ -0,0 +1,22 @@
var Benchmark = require('benchmark'),
moment = require("./../moment.js"),
base = moment('2013-05-25');
var unitsUnderTest = ["second", "minute", "hour", "date", "day", "isoWeek", "week", "month", "quarter", "year"];
var tests = unitsUnderTest.reduce(function (testsSoFar, unit) {
testsSoFar["startOf " + unit] = generateTestForUnit(unit);
return testsSoFar;
}, {});
function generateTestForUnit(unit) {
return {
setup: function(){var base = base; var unit = unit;},
fn: function(){base.startOf(unit);},
async: true
};
}
module.exports = {
name: 'startOf',
tests: tests
};

View File

@ -0,0 +1,22 @@
var Benchmark = require('benchmark'),
moment = require("./../moment.js"),
base = moment('2013-05-25');
var unitsUnderTest = ["milliseconds", "seconds", "minutes", "hours", "days", "weeks", "months", "quarters", "years"];
var tests = unitsUnderTest.reduce(function (testsSoFar, unit) {
testsSoFar["subtract " + unit] = generateTestForUnit(unit);
return testsSoFar;
}, {});
function generateTestForUnit(unit) {
return {
setup: function(){var base = base; var unit = unit;},
fn: function(){base.subtract(8, unit);},
async: true
};
}
module.exports = {
name: 'subtract',
tests: tests
};

View File

@ -0,0 +1,43 @@
var Benchmark = require('benchmark');
module.exports = {
name: 'zeroFill',
tests: {
zeroFillMath: {
setup: function() {
var zeroFillMath = function(number, targetLength, forceSign) {
var absNumber = '' + Math.abs(number),
zerosToFill = targetLength - absNumber.length,
sign = number >= 0;
return (sign ? (forceSign ? '+' : '') : '-') +
Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;
}
},
fn: function() {
zeroFillMath(Math.random() * 1e5 | 0, 5);
zeroFillMath(Math.random() * 1e5 | 0, 10);
zeroFillMath(Math.random() * 1e10 | 0, 20);
},
async: true
},
zeroFillWhile: {
setup: function() {
var zeroFillWhile = function(number, targetLength, forceSign) {
var output = '' + Math.abs(number),
sign = number >= 0;
while (output.length < targetLength) {
output = '0' + output;
}
return (sign ? (forceSign ? '+' : '') : '-') + output;
}
},
fn: function() {
zeroFillWhile(Math.random() * 1e5 | 0, 5);
zeroFillWhile(Math.random() * 1e5 | 0, 10);
zeroFillWhile(Math.random() * 1e10 | 0, 20);
},
async: true
}
}
};

26
js/moment/bower.json Normal file
View File

@ -0,0 +1,26 @@
{
"name": "moment",
"license": "MIT",
"main": "moment.js",
"ignore": [
"**/.*",
"benchmarks",
"bower_components",
"meteor",
"node_modules",
"scripts",
"tasks",
"test",
"component.json",
"composer.json",
"CONTRIBUTING.md",
"ender.js",
"Gruntfile.js",
"Moment.js.nuspec",
"package.js",
"package.json",
"ISSUE_TEMPLATE.md",
"typing-tests",
"min/tests.js"
]
}

130
js/moment/component.json Normal file
View File

@ -0,0 +1,130 @@
{
"name": "moment",
"version": "2.19.1",
"main": "moment.js",
"description": "Parse, validate, manipulate, and display dates in JavaScript.",
"files": [
"moment.js",
"locale/af.js",
"locale/ar-dz.js",
"locale/ar-kw.js",
"locale/ar-ly.js",
"locale/ar-ma.js",
"locale/ar-sa.js",
"locale/ar-tn.js",
"locale/ar.js",
"locale/az.js",
"locale/be.js",
"locale/bg.js",
"locale/bm.js",
"locale/bn.js",
"locale/bo.js",
"locale/br.js",
"locale/bs.js",
"locale/ca.js",
"locale/cs.js",
"locale/cv.js",
"locale/cy.js",
"locale/da.js",
"locale/de-at.js",
"locale/de-ch.js",
"locale/de.js",
"locale/dv.js",
"locale/el.js",
"locale/en-au.js",
"locale/en-ca.js",
"locale/en-gb.js",
"locale/en-ie.js",
"locale/en-nz.js",
"locale/eo.js",
"locale/es-do.js",
"locale/es-us.js",
"locale/es.js",
"locale/et.js",
"locale/eu.js",
"locale/fa.js",
"locale/fi.js",
"locale/fo.js",
"locale/fr-ca.js",
"locale/fr-ch.js",
"locale/fr.js",
"locale/fy.js",
"locale/gd.js",
"locale/gl.js",
"locale/gom-latn.js",
"locale/gu.js",
"locale/he.js",
"locale/hi.js",
"locale/hr.js",
"locale/hu.js",
"locale/hy-am.js",
"locale/id.js",
"locale/is.js",
"locale/it.js",
"locale/ja.js",
"locale/jv.js",
"locale/ka.js",
"locale/kk.js",
"locale/km.js",
"locale/kn.js",
"locale/ko.js",
"locale/ky.js",
"locale/lb.js",
"locale/lo.js",
"locale/lt.js",
"locale/lv.js",
"locale/me.js",
"locale/mi.js",
"locale/mk.js",
"locale/ml.js",
"locale/mr.js",
"locale/ms-my.js",
"locale/ms.js",
"locale/my.js",
"locale/nb.js",
"locale/ne.js",
"locale/nl-be.js",
"locale/nl.js",
"locale/nn.js",
"locale/pa-in.js",
"locale/pl.js",
"locale/pt-br.js",
"locale/pt.js",
"locale/ro.js",
"locale/ru.js",
"locale/sd.js",
"locale/se.js",
"locale/si.js",
"locale/sk.js",
"locale/sl.js",
"locale/sq.js",
"locale/sr-cyrl.js",
"locale/sr.js",
"locale/ss.js",
"locale/sv.js",
"locale/sw.js",
"locale/ta.js",
"locale/te.js",
"locale/tet.js",
"locale/th.js",
"locale/tl-ph.js",
"locale/tlh.js",
"locale/tr.js",
"locale/tzl.js",
"locale/tzm-latn.js",
"locale/tzm.js",
"locale/uk.js",
"locale/ur.js",
"locale/uz-latn.js",
"locale/uz.js",
"locale/vi.js",
"locale/x-pseudo.js",
"locale/yo.js",
"locale/zh-cn.js",
"locale/zh-hk.js",
"locale/zh-tw.js"
],
"scripts": [
"moment.js"
]
}

33
js/moment/composer.json Normal file
View File

@ -0,0 +1,33 @@
{
"name": "moment/moment",
"description": "Parse, validate, manipulate, and display dates in JavaScript.",
"keywords": [
"moment",
"date",
"time",
"parse",
"format",
"validate",
"i18n",
"l10n",
"ender"
],
"homepage": "https://github.com/moment/moment",
"authors": [{"name": "Tim Wood", "email": "washwithcare@gmail.com"}],
"license": "MIT",
"type": "component",
"require": {
"robloach/component-installer": "*"
},
"extra": {
"component": {
"scripts": [
"moment.js"
],
"files": [
"min/*.js",
"locale/*.js"
]
}
}
}

1
js/moment/ender.js Normal file
View File

@ -0,0 +1 @@
$.ender({ moment: require('moment') })

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