hourglass 0.0.1-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.rbenv-version +1 -0
- data/Gemfile +19 -0
- data/Gemfile.lock +59 -0
- data/Guardfile +6 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +19 -0
- data/Rakefile +111 -0
- data/VERSION +1 -0
- data/bin/hourglass +7 -0
- data/db/.gitignore +3 -0
- data/db/migrate/001_create_projects.rb +8 -0
- data/db/migrate/002_create_activity.rb +11 -0
- data/db/migrate/003_create_settings.rb +10 -0
- data/db/migrate/004_create_tags.rb +12 -0
- data/hourglass.gemspec +882 -0
- data/lib/hourglass.rb +74 -0
- data/lib/hourglass/activity.rb +286 -0
- data/lib/hourglass/application.rb +134 -0
- data/lib/hourglass/database.rb +25 -0
- data/lib/hourglass/project.rb +5 -0
- data/lib/hourglass/runner.rb +183 -0
- data/lib/hourglass/setting.rb +4 -0
- data/lib/hourglass/tag.rb +4 -0
- data/log/.gitignore +1 -0
- data/public/css/base/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/public/css/base/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/public/css/base/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/public/css/base/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/public/css/base/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/public/css/base/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/public/css/base/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/public/css/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/public/css/base/images/ui-icons_222222_256x240.png +0 -0
- data/public/css/base/images/ui-icons_2e83ff_256x240.png +0 -0
- data/public/css/base/images/ui-icons_454545_256x240.png +0 -0
- data/public/css/base/images/ui-icons_888888_256x240.png +0 -0
- data/public/css/base/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/public/css/base/jquery-ui.css +563 -0
- data/public/css/base/jquery.ui.accordion.css +19 -0
- data/public/css/base/jquery.ui.all.css +11 -0
- data/public/css/base/jquery.ui.autocomplete.css +53 -0
- data/public/css/base/jquery.ui.base.css +21 -0
- data/public/css/base/jquery.ui.button.css +38 -0
- data/public/css/base/jquery.ui.core.css +38 -0
- data/public/css/base/jquery.ui.datepicker.css +68 -0
- data/public/css/base/jquery.ui.dialog.css +21 -0
- data/public/css/base/jquery.ui.progressbar.css +11 -0
- data/public/css/base/jquery.ui.resizable.css +20 -0
- data/public/css/base/jquery.ui.selectable.css +10 -0
- data/public/css/base/jquery.ui.slider.css +24 -0
- data/public/css/base/jquery.ui.tabs.css +18 -0
- data/public/css/base/jquery.ui.theme.css +247 -0
- data/public/css/base/minified/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/public/css/base/minified/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/public/css/base/minified/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/public/css/base/minified/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/public/css/base/minified/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/public/css/base/minified/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/public/css/base/minified/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/public/css/base/minified/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/public/css/base/minified/images/ui-icons_222222_256x240.png +0 -0
- data/public/css/base/minified/images/ui-icons_2e83ff_256x240.png +0 -0
- data/public/css/base/minified/images/ui-icons_454545_256x240.png +0 -0
- data/public/css/base/minified/images/ui-icons_888888_256x240.png +0 -0
- data/public/css/base/minified/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/public/css/base/minified/jquery-ui.min.css +10 -0
- data/public/css/base/minified/jquery.ui.accordion.min.css +10 -0
- data/public/css/base/minified/jquery.ui.all.min.css +10 -0
- data/public/css/base/minified/jquery.ui.autocomplete.min.css +10 -0
- data/public/css/base/minified/jquery.ui.base.min.css +10 -0
- data/public/css/base/minified/jquery.ui.button.min.css +10 -0
- data/public/css/base/minified/jquery.ui.core.min.css +10 -0
- data/public/css/base/minified/jquery.ui.datepicker.min.css +10 -0
- data/public/css/base/minified/jquery.ui.dialog.min.css +10 -0
- data/public/css/base/minified/jquery.ui.progressbar.min.css +10 -0
- data/public/css/base/minified/jquery.ui.resizable.min.css +10 -0
- data/public/css/base/minified/jquery.ui.selectable.min.css +10 -0
- data/public/css/base/minified/jquery.ui.slider.min.css +10 -0
- data/public/css/base/minified/jquery.ui.tabs.min.css +10 -0
- data/public/css/base/minified/jquery.ui.theme.min.css +12 -0
- data/public/css/black-tie/images/ui-bg_diagonals-thick_8_333333_40x40.png +0 -0
- data/public/css/black-tie/images/ui-bg_flat_65_ffffff_40x100.png +0 -0
- data/public/css/black-tie/images/ui-bg_glass_40_111111_1x400.png +0 -0
- data/public/css/black-tie/images/ui-bg_glass_55_1c1c1c_1x400.png +0 -0
- data/public/css/black-tie/images/ui-bg_highlight-hard_100_f9f9f9_1x100.png +0 -0
- data/public/css/black-tie/images/ui-bg_highlight-hard_40_aaaaaa_1x100.png +0 -0
- data/public/css/black-tie/images/ui-bg_highlight-soft_50_aaaaaa_1x100.png +0 -0
- data/public/css/black-tie/images/ui-bg_inset-hard_45_cd0a0a_1x100.png +0 -0
- data/public/css/black-tie/images/ui-bg_inset-hard_55_ffeb80_1x100.png +0 -0
- data/public/css/black-tie/images/ui-icons_222222_256x240.png +0 -0
- data/public/css/black-tie/images/ui-icons_4ca300_256x240.png +0 -0
- data/public/css/black-tie/images/ui-icons_bbbbbb_256x240.png +0 -0
- data/public/css/black-tie/images/ui-icons_ededed_256x240.png +0 -0
- data/public/css/black-tie/images/ui-icons_ffcf29_256x240.png +0 -0
- data/public/css/black-tie/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/css/black-tie/jquery-ui.css +565 -0
- data/public/css/black-tie/jquery.ui.accordion.css +19 -0
- data/public/css/black-tie/jquery.ui.all.css +11 -0
- data/public/css/black-tie/jquery.ui.autocomplete.css +53 -0
- data/public/css/black-tie/jquery.ui.base.css +11 -0
- data/public/css/black-tie/jquery.ui.button.css +38 -0
- data/public/css/black-tie/jquery.ui.core.css +38 -0
- data/public/css/black-tie/jquery.ui.datepicker.css +68 -0
- data/public/css/black-tie/jquery.ui.dialog.css +21 -0
- data/public/css/black-tie/jquery.ui.progressbar.css +11 -0
- data/public/css/black-tie/jquery.ui.resizable.css +20 -0
- data/public/css/black-tie/jquery.ui.selectable.css +10 -0
- data/public/css/black-tie/jquery.ui.slider.css +24 -0
- data/public/css/black-tie/jquery.ui.tabs.css +18 -0
- data/public/css/black-tie/jquery.ui.theme.css +249 -0
- data/public/css/blitzer/images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png +0 -0
- data/public/css/blitzer/images/ui-bg_dots-small_65_a6a6a6_2x2.png +0 -0
- data/public/css/blitzer/images/ui-bg_flat_0_333333_40x100.png +0 -0
- data/public/css/blitzer/images/ui-bg_flat_65_ffffff_40x100.png +0 -0
- data/public/css/blitzer/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/public/css/blitzer/images/ui-bg_glass_55_fbf8ee_1x400.png +0 -0
- data/public/css/blitzer/images/ui-bg_highlight-hard_100_eeeeee_1x100.png +0 -0
- data/public/css/blitzer/images/ui-bg_highlight-hard_100_f6f6f6_1x100.png +0 -0
- data/public/css/blitzer/images/ui-bg_highlight-soft_15_cc0000_1x100.png +0 -0
- data/public/css/blitzer/images/ui-icons_004276_256x240.png +0 -0
- data/public/css/blitzer/images/ui-icons_cc0000_256x240.png +0 -0
- data/public/css/blitzer/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/css/blitzer/jquery-ui.css +565 -0
- data/public/css/blitzer/jquery.ui.accordion.css +19 -0
- data/public/css/blitzer/jquery.ui.all.css +11 -0
- data/public/css/blitzer/jquery.ui.autocomplete.css +53 -0
- data/public/css/blitzer/jquery.ui.base.css +11 -0
- data/public/css/blitzer/jquery.ui.button.css +38 -0
- data/public/css/blitzer/jquery.ui.core.css +38 -0
- data/public/css/blitzer/jquery.ui.datepicker.css +68 -0
- data/public/css/blitzer/jquery.ui.dialog.css +21 -0
- data/public/css/blitzer/jquery.ui.progressbar.css +11 -0
- data/public/css/blitzer/jquery.ui.resizable.css +20 -0
- data/public/css/blitzer/jquery.ui.selectable.css +10 -0
- data/public/css/blitzer/jquery.ui.slider.css +24 -0
- data/public/css/blitzer/jquery.ui.tabs.css +18 -0
- data/public/css/blitzer/jquery.ui.theme.css +249 -0
- data/public/css/cupertino/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png +0 -0
- data/public/css/cupertino/images/ui-bg_flat_15_cd0a0a_40x100.png +0 -0
- data/public/css/cupertino/images/ui-bg_glass_100_e4f1fb_1x400.png +0 -0
- data/public/css/cupertino/images/ui-bg_glass_50_3baae3_1x400.png +0 -0
- data/public/css/cupertino/images/ui-bg_glass_80_d7ebf9_1x400.png +0 -0
- data/public/css/cupertino/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png +0 -0
- data/public/css/cupertino/images/ui-bg_highlight-hard_70_000000_1x100.png +0 -0
- data/public/css/cupertino/images/ui-bg_highlight-soft_100_deedf7_1x100.png +0 -0
- data/public/css/cupertino/images/ui-bg_highlight-soft_25_ffef8f_1x100.png +0 -0
- data/public/css/cupertino/images/ui-icons_2694e8_256x240.png +0 -0
- data/public/css/cupertino/images/ui-icons_2e83ff_256x240.png +0 -0
- data/public/css/cupertino/images/ui-icons_3d80b3_256x240.png +0 -0
- data/public/css/cupertino/images/ui-icons_72a7cf_256x240.png +0 -0
- data/public/css/cupertino/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/css/cupertino/jquery-ui.css +565 -0
- data/public/css/cupertino/jquery.ui.accordion.css +19 -0
- data/public/css/cupertino/jquery.ui.all.css +11 -0
- data/public/css/cupertino/jquery.ui.autocomplete.css +53 -0
- data/public/css/cupertino/jquery.ui.base.css +11 -0
- data/public/css/cupertino/jquery.ui.button.css +38 -0
- data/public/css/cupertino/jquery.ui.core.css +38 -0
- data/public/css/cupertino/jquery.ui.datepicker.css +68 -0
- data/public/css/cupertino/jquery.ui.dialog.css +21 -0
- data/public/css/cupertino/jquery.ui.progressbar.css +11 -0
- data/public/css/cupertino/jquery.ui.resizable.css +20 -0
- data/public/css/cupertino/jquery.ui.selectable.css +10 -0
- data/public/css/cupertino/jquery.ui.slider.css +24 -0
- data/public/css/cupertino/jquery.ui.tabs.css +18 -0
- data/public/css/cupertino/jquery.ui.theme.css +249 -0
- data/public/css/dark-hive/images/ui-bg_flat_30_cccccc_40x100.png +0 -0
- data/public/css/dark-hive/images/ui-bg_flat_50_5c5c5c_40x100.png +0 -0
- data/public/css/dark-hive/images/ui-bg_glass_40_ffc73d_1x400.png +0 -0
- data/public/css/dark-hive/images/ui-bg_highlight-hard_20_0972a5_1x100.png +0 -0
- data/public/css/dark-hive/images/ui-bg_highlight-soft_33_003147_1x100.png +0 -0
- data/public/css/dark-hive/images/ui-bg_highlight-soft_35_222222_1x100.png +0 -0
- data/public/css/dark-hive/images/ui-bg_highlight-soft_44_444444_1x100.png +0 -0
- data/public/css/dark-hive/images/ui-bg_highlight-soft_80_eeeeee_1x100.png +0 -0
- data/public/css/dark-hive/images/ui-bg_loop_25_000000_21x21.png +0 -0
- data/public/css/dark-hive/images/ui-icons_222222_256x240.png +0 -0
- data/public/css/dark-hive/images/ui-icons_4b8e0b_256x240.png +0 -0
- data/public/css/dark-hive/images/ui-icons_a83300_256x240.png +0 -0
- data/public/css/dark-hive/images/ui-icons_cccccc_256x240.png +0 -0
- data/public/css/dark-hive/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/css/dark-hive/jquery-ui.css +565 -0
- data/public/css/dark-hive/jquery.ui.accordion.css +19 -0
- data/public/css/dark-hive/jquery.ui.all.css +11 -0
- data/public/css/dark-hive/jquery.ui.autocomplete.css +53 -0
- data/public/css/dark-hive/jquery.ui.base.css +11 -0
- data/public/css/dark-hive/jquery.ui.button.css +38 -0
- data/public/css/dark-hive/jquery.ui.core.css +38 -0
- data/public/css/dark-hive/jquery.ui.datepicker.css +68 -0
- data/public/css/dark-hive/jquery.ui.dialog.css +21 -0
- data/public/css/dark-hive/jquery.ui.progressbar.css +11 -0
- data/public/css/dark-hive/jquery.ui.resizable.css +20 -0
- data/public/css/dark-hive/jquery.ui.selectable.css +10 -0
- data/public/css/dark-hive/jquery.ui.slider.css +24 -0
- data/public/css/dark-hive/jquery.ui.tabs.css +18 -0
- data/public/css/dark-hive/jquery.ui.theme.css +249 -0
- data/public/css/dot-luv/images/ui-bg_diagonals-thick_15_0b3e6f_40x40.png +0 -0
- data/public/css/dot-luv/images/ui-bg_dots-medium_30_0b58a2_4x4.png +0 -0
- data/public/css/dot-luv/images/ui-bg_dots-small_20_333333_2x2.png +0 -0
- data/public/css/dot-luv/images/ui-bg_dots-small_30_a32d00_2x2.png +0 -0
- data/public/css/dot-luv/images/ui-bg_dots-small_40_00498f_2x2.png +0 -0
- data/public/css/dot-luv/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/public/css/dot-luv/images/ui-bg_flat_40_292929_40x100.png +0 -0
- data/public/css/dot-luv/images/ui-bg_gloss-wave_20_111111_500x100.png +0 -0
- data/public/css/dot-luv/images/ui-icons_00498f_256x240.png +0 -0
- data/public/css/dot-luv/images/ui-icons_98d2fb_256x240.png +0 -0
- data/public/css/dot-luv/images/ui-icons_9ccdfc_256x240.png +0 -0
- data/public/css/dot-luv/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/css/dot-luv/jquery-ui.css +565 -0
- data/public/css/dot-luv/jquery.ui.accordion.css +19 -0
- data/public/css/dot-luv/jquery.ui.all.css +11 -0
- data/public/css/dot-luv/jquery.ui.autocomplete.css +53 -0
- data/public/css/dot-luv/jquery.ui.base.css +11 -0
- data/public/css/dot-luv/jquery.ui.button.css +38 -0
- data/public/css/dot-luv/jquery.ui.core.css +38 -0
- data/public/css/dot-luv/jquery.ui.datepicker.css +68 -0
- data/public/css/dot-luv/jquery.ui.dialog.css +21 -0
- data/public/css/dot-luv/jquery.ui.progressbar.css +11 -0
- data/public/css/dot-luv/jquery.ui.resizable.css +20 -0
- data/public/css/dot-luv/jquery.ui.selectable.css +10 -0
- data/public/css/dot-luv/jquery.ui.slider.css +24 -0
- data/public/css/dot-luv/jquery.ui.tabs.css +18 -0
- data/public/css/dot-luv/jquery.ui.theme.css +249 -0
- data/public/css/eggplant/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/public/css/eggplant/images/ui-bg_flat_0_eeeeee_40x100.png +0 -0
- data/public/css/eggplant/images/ui-bg_flat_55_994d53_40x100.png +0 -0
- data/public/css/eggplant/images/ui-bg_flat_55_fafafa_40x100.png +0 -0
- data/public/css/eggplant/images/ui-bg_gloss-wave_30_3d3644_500x100.png +0 -0
- data/public/css/eggplant/images/ui-bg_highlight-soft_100_dcd9de_1x100.png +0 -0
- data/public/css/eggplant/images/ui-bg_highlight-soft_100_eae6ea_1x100.png +0 -0
- data/public/css/eggplant/images/ui-bg_highlight-soft_25_30273a_1x100.png +0 -0
- data/public/css/eggplant/images/ui-bg_highlight-soft_45_5f5964_1x100.png +0 -0
- data/public/css/eggplant/images/ui-icons_454545_256x240.png +0 -0
- data/public/css/eggplant/images/ui-icons_734d99_256x240.png +0 -0
- data/public/css/eggplant/images/ui-icons_8d78a5_256x240.png +0 -0
- data/public/css/eggplant/images/ui-icons_a8a3ae_256x240.png +0 -0
- data/public/css/eggplant/images/ui-icons_ebccce_256x240.png +0 -0
- data/public/css/eggplant/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/css/eggplant/jquery-ui.css +565 -0
- data/public/css/eggplant/jquery.ui.accordion.css +19 -0
- data/public/css/eggplant/jquery.ui.all.css +11 -0
- data/public/css/eggplant/jquery.ui.autocomplete.css +53 -0
- data/public/css/eggplant/jquery.ui.base.css +11 -0
- data/public/css/eggplant/jquery.ui.button.css +38 -0
- data/public/css/eggplant/jquery.ui.core.css +38 -0
- data/public/css/eggplant/jquery.ui.datepicker.css +68 -0
- data/public/css/eggplant/jquery.ui.dialog.css +21 -0
- data/public/css/eggplant/jquery.ui.progressbar.css +11 -0
- data/public/css/eggplant/jquery.ui.resizable.css +20 -0
- data/public/css/eggplant/jquery.ui.selectable.css +10 -0
- data/public/css/eggplant/jquery.ui.slider.css +24 -0
- data/public/css/eggplant/jquery.ui.tabs.css +18 -0
- data/public/css/eggplant/jquery.ui.theme.css +249 -0
- data/public/css/excite-bike/images/ui-bg_diagonals-small_25_c5ddfc_40x40.png +0 -0
- data/public/css/excite-bike/images/ui-bg_diagonals-thick_20_e69700_40x40.png +0 -0
- data/public/css/excite-bike/images/ui-bg_diagonals-thick_22_1484e6_40x40.png +0 -0
- data/public/css/excite-bike/images/ui-bg_diagonals-thick_26_2293f7_40x40.png +0 -0
- data/public/css/excite-bike/images/ui-bg_flat_0_e69700_40x100.png +0 -0
- data/public/css/excite-bike/images/ui-bg_flat_0_e6b900_40x100.png +0 -0
- data/public/css/excite-bike/images/ui-bg_highlight-soft_100_f9f9f9_1x100.png +0 -0
- data/public/css/excite-bike/images/ui-bg_inset-hard_100_eeeeee_1x100.png +0 -0
- data/public/css/excite-bike/images/ui-icons_0a82eb_256x240.png +0 -0
- data/public/css/excite-bike/images/ui-icons_0b54d5_256x240.png +0 -0
- data/public/css/excite-bike/images/ui-icons_5fa5e3_256x240.png +0 -0
- data/public/css/excite-bike/images/ui-icons_fcdd4a_256x240.png +0 -0
- data/public/css/excite-bike/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/css/excite-bike/jquery-ui.css +565 -0
- data/public/css/excite-bike/jquery.ui.accordion.css +19 -0
- data/public/css/excite-bike/jquery.ui.all.css +11 -0
- data/public/css/excite-bike/jquery.ui.autocomplete.css +53 -0
- data/public/css/excite-bike/jquery.ui.base.css +11 -0
- data/public/css/excite-bike/jquery.ui.button.css +38 -0
- data/public/css/excite-bike/jquery.ui.core.css +38 -0
- data/public/css/excite-bike/jquery.ui.datepicker.css +68 -0
- data/public/css/excite-bike/jquery.ui.dialog.css +21 -0
- data/public/css/excite-bike/jquery.ui.progressbar.css +11 -0
- data/public/css/excite-bike/jquery.ui.resizable.css +20 -0
- data/public/css/excite-bike/jquery.ui.selectable.css +10 -0
- data/public/css/excite-bike/jquery.ui.slider.css +24 -0
- data/public/css/excite-bike/jquery.ui.tabs.css +18 -0
- data/public/css/excite-bike/jquery.ui.theme.css +249 -0
- data/public/css/flick/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/public/css/flick/images/ui-bg_flat_0_eeeeee_40x100.png +0 -0
- data/public/css/flick/images/ui-bg_flat_55_ffffff_40x100.png +0 -0
- data/public/css/flick/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/public/css/flick/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/public/css/flick/images/ui-bg_highlight-soft_100_f6f6f6_1x100.png +0 -0
- data/public/css/flick/images/ui-bg_highlight-soft_25_0073ea_1x100.png +0 -0
- data/public/css/flick/images/ui-bg_highlight-soft_50_dddddd_1x100.png +0 -0
- data/public/css/flick/images/ui-icons_0073ea_256x240.png +0 -0
- data/public/css/flick/images/ui-icons_454545_256x240.png +0 -0
- data/public/css/flick/images/ui-icons_666666_256x240.png +0 -0
- data/public/css/flick/images/ui-icons_ff0084_256x240.png +0 -0
- data/public/css/flick/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/css/flick/jquery-ui.css +565 -0
- data/public/css/flick/jquery.ui.accordion.css +19 -0
- data/public/css/flick/jquery.ui.all.css +11 -0
- data/public/css/flick/jquery.ui.autocomplete.css +53 -0
- data/public/css/flick/jquery.ui.base.css +11 -0
- data/public/css/flick/jquery.ui.button.css +38 -0
- data/public/css/flick/jquery.ui.core.css +38 -0
- data/public/css/flick/jquery.ui.datepicker.css +68 -0
- data/public/css/flick/jquery.ui.dialog.css +21 -0
- data/public/css/flick/jquery.ui.progressbar.css +11 -0
- data/public/css/flick/jquery.ui.resizable.css +20 -0
- data/public/css/flick/jquery.ui.selectable.css +10 -0
- data/public/css/flick/jquery.ui.slider.css +24 -0
- data/public/css/flick/jquery.ui.tabs.css +18 -0
- data/public/css/flick/jquery.ui.theme.css +249 -0
- data/public/css/hot-sneaks/images/ui-bg_diagonals-small_40_db4865_40x40.png +0 -0
- data/public/css/hot-sneaks/images/ui-bg_diagonals-small_50_93c3cd_40x40.png +0 -0
- data/public/css/hot-sneaks/images/ui-bg_diagonals-small_50_ff3853_40x40.png +0 -0
- data/public/css/hot-sneaks/images/ui-bg_diagonals-small_75_ccd232_40x40.png +0 -0
- data/public/css/hot-sneaks/images/ui-bg_dots-medium_80_ffff38_4x4.png +0 -0
- data/public/css/hot-sneaks/images/ui-bg_dots-small_35_35414f_2x2.png +0 -0
- data/public/css/hot-sneaks/images/ui-bg_flat_75_ba9217_40x100.png +0 -0
- data/public/css/hot-sneaks/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/public/css/hot-sneaks/images/ui-bg_white-lines_85_f7f7ba_40x100.png +0 -0
- data/public/css/hot-sneaks/images/ui-icons_454545_256x240.png +0 -0
- data/public/css/hot-sneaks/images/ui-icons_88a206_256x240.png +0 -0
- data/public/css/hot-sneaks/images/ui-icons_c02669_256x240.png +0 -0
- data/public/css/hot-sneaks/images/ui-icons_e1e463_256x240.png +0 -0
- data/public/css/hot-sneaks/images/ui-icons_ffeb33_256x240.png +0 -0
- data/public/css/hot-sneaks/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/css/hot-sneaks/jquery-ui.css +565 -0
- data/public/css/hot-sneaks/jquery.ui.accordion.css +19 -0
- data/public/css/hot-sneaks/jquery.ui.all.css +11 -0
- data/public/css/hot-sneaks/jquery.ui.autocomplete.css +53 -0
- data/public/css/hot-sneaks/jquery.ui.base.css +11 -0
- data/public/css/hot-sneaks/jquery.ui.button.css +38 -0
- data/public/css/hot-sneaks/jquery.ui.core.css +38 -0
- data/public/css/hot-sneaks/jquery.ui.datepicker.css +68 -0
- data/public/css/hot-sneaks/jquery.ui.dialog.css +21 -0
- data/public/css/hot-sneaks/jquery.ui.progressbar.css +11 -0
- data/public/css/hot-sneaks/jquery.ui.resizable.css +20 -0
- data/public/css/hot-sneaks/jquery.ui.selectable.css +10 -0
- data/public/css/hot-sneaks/jquery.ui.slider.css +24 -0
- data/public/css/hot-sneaks/jquery.ui.tabs.css +18 -0
- data/public/css/hot-sneaks/jquery.ui.theme.css +249 -0
- data/public/css/humanity/images/ui-bg_flat_75_aaaaaa_40x100.png +0 -0
- data/public/css/humanity/images/ui-bg_glass_100_f5f0e5_1x400.png +0 -0
- data/public/css/humanity/images/ui-bg_glass_25_cb842e_1x400.png +0 -0
- data/public/css/humanity/images/ui-bg_glass_70_ede4d4_1x400.png +0 -0
- data/public/css/humanity/images/ui-bg_highlight-hard_100_f4f0ec_1x100.png +0 -0
- data/public/css/humanity/images/ui-bg_highlight-hard_65_fee4bd_1x100.png +0 -0
- data/public/css/humanity/images/ui-bg_highlight-hard_75_f5f5b5_1x100.png +0 -0
- data/public/css/humanity/images/ui-bg_inset-soft_100_f4f0ec_1x100.png +0 -0
- data/public/css/humanity/images/ui-icons_c47a23_256x240.png +0 -0
- data/public/css/humanity/images/ui-icons_cb672b_256x240.png +0 -0
- data/public/css/humanity/images/ui-icons_f08000_256x240.png +0 -0
- data/public/css/humanity/images/ui-icons_f35f07_256x240.png +0 -0
- data/public/css/humanity/images/ui-icons_ff7519_256x240.png +0 -0
- data/public/css/humanity/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/css/humanity/jquery-ui.css +565 -0
- data/public/css/humanity/jquery.ui.accordion.css +19 -0
- data/public/css/humanity/jquery.ui.all.css +11 -0
- data/public/css/humanity/jquery.ui.autocomplete.css +53 -0
- data/public/css/humanity/jquery.ui.base.css +11 -0
- data/public/css/humanity/jquery.ui.button.css +38 -0
- data/public/css/humanity/jquery.ui.core.css +38 -0
- data/public/css/humanity/jquery.ui.datepicker.css +68 -0
- data/public/css/humanity/jquery.ui.dialog.css +21 -0
- data/public/css/humanity/jquery.ui.progressbar.css +11 -0
- data/public/css/humanity/jquery.ui.resizable.css +20 -0
- data/public/css/humanity/jquery.ui.selectable.css +10 -0
- data/public/css/humanity/jquery.ui.slider.css +24 -0
- data/public/css/humanity/jquery.ui.tabs.css +18 -0
- data/public/css/humanity/jquery.ui.theme.css +249 -0
- data/public/css/le-frog/images/ui-bg_diagonals-small_0_aaaaaa_40x40.png +0 -0
- data/public/css/le-frog/images/ui-bg_diagonals-thick_15_444444_40x40.png +0 -0
- data/public/css/le-frog/images/ui-bg_diagonals-thick_95_ffdc2e_40x40.png +0 -0
- data/public/css/le-frog/images/ui-bg_glass_55_fbf5d0_1x400.png +0 -0
- data/public/css/le-frog/images/ui-bg_highlight-hard_30_285c00_1x100.png +0 -0
- data/public/css/le-frog/images/ui-bg_highlight-soft_33_3a8104_1x100.png +0 -0
- data/public/css/le-frog/images/ui-bg_highlight-soft_50_4eb305_1x100.png +0 -0
- data/public/css/le-frog/images/ui-bg_highlight-soft_60_4ca20b_1x100.png +0 -0
- data/public/css/le-frog/images/ui-bg_inset-soft_10_285c00_1x100.png +0 -0
- data/public/css/le-frog/images/ui-icons_4eb305_256x240.png +0 -0
- data/public/css/le-frog/images/ui-icons_72b42d_256x240.png +0 -0
- data/public/css/le-frog/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/public/css/le-frog/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/css/le-frog/jquery-ui.css +565 -0
- data/public/css/le-frog/jquery.ui.accordion.css +19 -0
- data/public/css/le-frog/jquery.ui.all.css +11 -0
- data/public/css/le-frog/jquery.ui.autocomplete.css +53 -0
- data/public/css/le-frog/jquery.ui.base.css +11 -0
- data/public/css/le-frog/jquery.ui.button.css +38 -0
- data/public/css/le-frog/jquery.ui.core.css +38 -0
- data/public/css/le-frog/jquery.ui.datepicker.css +68 -0
- data/public/css/le-frog/jquery.ui.dialog.css +21 -0
- data/public/css/le-frog/jquery.ui.progressbar.css +11 -0
- data/public/css/le-frog/jquery.ui.resizable.css +20 -0
- data/public/css/le-frog/jquery.ui.selectable.css +10 -0
- data/public/css/le-frog/jquery.ui.slider.css +24 -0
- data/public/css/le-frog/jquery.ui.tabs.css +18 -0
- data/public/css/le-frog/jquery.ui.theme.css +249 -0
- data/public/css/mint-choc/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/public/css/mint-choc/images/ui-bg_glass_15_5f391b_1x400.png +0 -0
- data/public/css/mint-choc/images/ui-bg_gloss-wave_20_1c160d_500x100.png +0 -0
- data/public/css/mint-choc/images/ui-bg_gloss-wave_25_453326_500x100.png +0 -0
- data/public/css/mint-choc/images/ui-bg_gloss-wave_30_44372c_500x100.png +0 -0
- data/public/css/mint-choc/images/ui-bg_highlight-soft_20_201913_1x100.png +0 -0
- data/public/css/mint-choc/images/ui-bg_highlight-soft_20_619226_1x100.png +0 -0
- data/public/css/mint-choc/images/ui-bg_inset-soft_10_201913_1x100.png +0 -0
- data/public/css/mint-choc/images/ui-icons_222222_256x240.png +0 -0
- data/public/css/mint-choc/images/ui-icons_9bcc60_256x240.png +0 -0
- data/public/css/mint-choc/images/ui-icons_add978_256x240.png +0 -0
- data/public/css/mint-choc/images/ui-icons_e3ddc9_256x240.png +0 -0
- data/public/css/mint-choc/images/ui-icons_f1fd86_256x240.png +0 -0
- data/public/css/mint-choc/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/css/mint-choc/jquery-ui.css +565 -0
- data/public/css/mint-choc/jquery.ui.accordion.css +19 -0
- data/public/css/mint-choc/jquery.ui.all.css +11 -0
- data/public/css/mint-choc/jquery.ui.autocomplete.css +53 -0
- data/public/css/mint-choc/jquery.ui.base.css +11 -0
- data/public/css/mint-choc/jquery.ui.button.css +38 -0
- data/public/css/mint-choc/jquery.ui.core.css +38 -0
- data/public/css/mint-choc/jquery.ui.datepicker.css +68 -0
- data/public/css/mint-choc/jquery.ui.dialog.css +21 -0
- data/public/css/mint-choc/jquery.ui.progressbar.css +11 -0
- data/public/css/mint-choc/jquery.ui.resizable.css +20 -0
- data/public/css/mint-choc/jquery.ui.selectable.css +10 -0
- data/public/css/mint-choc/jquery.ui.slider.css +24 -0
- data/public/css/mint-choc/jquery.ui.tabs.css +18 -0
- data/public/css/mint-choc/jquery.ui.theme.css +249 -0
- data/public/css/overcast/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/public/css/overcast/images/ui-bg_flat_0_eeeeee_40x100.png +0 -0
- data/public/css/overcast/images/ui-bg_flat_55_c0402a_40x100.png +0 -0
- data/public/css/overcast/images/ui-bg_flat_55_eeeeee_40x100.png +0 -0
- data/public/css/overcast/images/ui-bg_glass_100_f8f8f8_1x400.png +0 -0
- data/public/css/overcast/images/ui-bg_glass_35_dddddd_1x400.png +0 -0
- data/public/css/overcast/images/ui-bg_glass_60_eeeeee_1x400.png +0 -0
- data/public/css/overcast/images/ui-bg_inset-hard_75_999999_1x100.png +0 -0
- data/public/css/overcast/images/ui-bg_inset-soft_50_c9c9c9_1x100.png +0 -0
- data/public/css/overcast/images/ui-icons_3383bb_256x240.png +0 -0
- data/public/css/overcast/images/ui-icons_454545_256x240.png +0 -0
- data/public/css/overcast/images/ui-icons_70b2e1_256x240.png +0 -0
- data/public/css/overcast/images/ui-icons_999999_256x240.png +0 -0
- data/public/css/overcast/images/ui-icons_fbc856_256x240.png +0 -0
- data/public/css/overcast/jquery-ui.css +565 -0
- data/public/css/overcast/jquery.ui.accordion.css +19 -0
- data/public/css/overcast/jquery.ui.all.css +11 -0
- data/public/css/overcast/jquery.ui.autocomplete.css +53 -0
- data/public/css/overcast/jquery.ui.base.css +11 -0
- data/public/css/overcast/jquery.ui.button.css +38 -0
- data/public/css/overcast/jquery.ui.core.css +38 -0
- data/public/css/overcast/jquery.ui.datepicker.css +68 -0
- data/public/css/overcast/jquery.ui.dialog.css +21 -0
- data/public/css/overcast/jquery.ui.progressbar.css +11 -0
- data/public/css/overcast/jquery.ui.resizable.css +20 -0
- data/public/css/overcast/jquery.ui.selectable.css +10 -0
- data/public/css/overcast/jquery.ui.slider.css +24 -0
- data/public/css/overcast/jquery.ui.tabs.css +18 -0
- data/public/css/overcast/jquery.ui.theme.css +249 -0
- data/public/css/pepper-grinder/images/ui-bg_diagonal-maze_20_6e4f1c_10x10.png +0 -0
- data/public/css/pepper-grinder/images/ui-bg_diagonal-maze_40_000000_10x10.png +0 -0
- data/public/css/pepper-grinder/images/ui-bg_fine-grain_10_eceadf_60x60.png +0 -0
- data/public/css/pepper-grinder/images/ui-bg_fine-grain_10_f8f7f6_60x60.png +0 -0
- data/public/css/pepper-grinder/images/ui-bg_fine-grain_15_eceadf_60x60.png +0 -0
- data/public/css/pepper-grinder/images/ui-bg_fine-grain_15_f7f3de_60x60.png +0 -0
- data/public/css/pepper-grinder/images/ui-bg_fine-grain_15_ffffff_60x60.png +0 -0
- data/public/css/pepper-grinder/images/ui-bg_fine-grain_65_654b24_60x60.png +0 -0
- data/public/css/pepper-grinder/images/ui-bg_fine-grain_68_b83400_60x60.png +0 -0
- data/public/css/pepper-grinder/images/ui-icons_222222_256x240.png +0 -0
- data/public/css/pepper-grinder/images/ui-icons_3572ac_256x240.png +0 -0
- data/public/css/pepper-grinder/images/ui-icons_8c291d_256x240.png +0 -0
- data/public/css/pepper-grinder/images/ui-icons_b83400_256x240.png +0 -0
- data/public/css/pepper-grinder/images/ui-icons_fbdb93_256x240.png +0 -0
- data/public/css/pepper-grinder/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/css/pepper-grinder/jquery-ui.css +565 -0
- data/public/css/pepper-grinder/jquery.ui.accordion.css +19 -0
- data/public/css/pepper-grinder/jquery.ui.all.css +11 -0
- data/public/css/pepper-grinder/jquery.ui.autocomplete.css +53 -0
- data/public/css/pepper-grinder/jquery.ui.base.css +11 -0
- data/public/css/pepper-grinder/jquery.ui.button.css +38 -0
- data/public/css/pepper-grinder/jquery.ui.core.css +38 -0
- data/public/css/pepper-grinder/jquery.ui.datepicker.css +68 -0
- data/public/css/pepper-grinder/jquery.ui.dialog.css +21 -0
- data/public/css/pepper-grinder/jquery.ui.progressbar.css +11 -0
- data/public/css/pepper-grinder/jquery.ui.resizable.css +20 -0
- data/public/css/pepper-grinder/jquery.ui.selectable.css +10 -0
- data/public/css/pepper-grinder/jquery.ui.slider.css +24 -0
- data/public/css/pepper-grinder/jquery.ui.tabs.css +18 -0
- data/public/css/pepper-grinder/jquery.ui.theme.css +249 -0
- data/public/css/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/public/css/redmond/images/ui-bg_flat_55_fbec88_40x100.png +0 -0
- data/public/css/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png +0 -0
- data/public/css/redmond/images/ui-bg_glass_85_dfeffc_1x400.png +0 -0
- data/public/css/redmond/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/public/css/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png +0 -0
- data/public/css/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png +0 -0
- data/public/css/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png +0 -0
- data/public/css/redmond/images/ui-icons_217bc0_256x240.png +0 -0
- data/public/css/redmond/images/ui-icons_2e83ff_256x240.png +0 -0
- data/public/css/redmond/images/ui-icons_469bdd_256x240.png +0 -0
- data/public/css/redmond/images/ui-icons_6da8d5_256x240.png +0 -0
- data/public/css/redmond/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/public/css/redmond/images/ui-icons_d8e7f3_256x240.png +0 -0
- data/public/css/redmond/images/ui-icons_f9bd01_256x240.png +0 -0
- data/public/css/redmond/jquery-ui.css +565 -0
- data/public/css/redmond/jquery.ui.accordion.css +19 -0
- data/public/css/redmond/jquery.ui.all.css +11 -0
- data/public/css/redmond/jquery.ui.autocomplete.css +53 -0
- data/public/css/redmond/jquery.ui.base.css +11 -0
- data/public/css/redmond/jquery.ui.button.css +38 -0
- data/public/css/redmond/jquery.ui.core.css +38 -0
- data/public/css/redmond/jquery.ui.datepicker.css +68 -0
- data/public/css/redmond/jquery.ui.dialog.css +21 -0
- data/public/css/redmond/jquery.ui.progressbar.css +11 -0
- data/public/css/redmond/jquery.ui.resizable.css +20 -0
- data/public/css/redmond/jquery.ui.selectable.css +10 -0
- data/public/css/redmond/jquery.ui.slider.css +24 -0
- data/public/css/redmond/jquery.ui.tabs.css +18 -0
- data/public/css/redmond/jquery.ui.theme.css +249 -0
- data/public/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/public/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/public/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/public/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/public/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/public/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/public/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/public/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/public/css/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/public/css/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/public/css/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/public/css/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/public/css/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/public/css/smoothness/jquery-ui.css +565 -0
- data/public/css/smoothness/jquery.ui.accordion.css +19 -0
- data/public/css/smoothness/jquery.ui.all.css +11 -0
- data/public/css/smoothness/jquery.ui.autocomplete.css +53 -0
- data/public/css/smoothness/jquery.ui.base.css +11 -0
- data/public/css/smoothness/jquery.ui.button.css +38 -0
- data/public/css/smoothness/jquery.ui.core.css +38 -0
- data/public/css/smoothness/jquery.ui.datepicker.css +68 -0
- data/public/css/smoothness/jquery.ui.dialog.css +21 -0
- data/public/css/smoothness/jquery.ui.progressbar.css +11 -0
- data/public/css/smoothness/jquery.ui.resizable.css +20 -0
- data/public/css/smoothness/jquery.ui.selectable.css +10 -0
- data/public/css/smoothness/jquery.ui.slider.css +24 -0
- data/public/css/smoothness/jquery.ui.tabs.css +18 -0
- data/public/css/smoothness/jquery.ui.theme.css +249 -0
- data/public/css/south-street/images/ui-bg_glass_55_fcf0ba_1x400.png +0 -0
- data/public/css/south-street/images/ui-bg_gloss-wave_100_ece8da_500x100.png +0 -0
- data/public/css/south-street/images/ui-bg_highlight-hard_100_f5f3e5_1x100.png +0 -0
- data/public/css/south-street/images/ui-bg_highlight-hard_100_fafaf4_1x100.png +0 -0
- data/public/css/south-street/images/ui-bg_highlight-hard_15_459e00_1x100.png +0 -0
- data/public/css/south-street/images/ui-bg_highlight-hard_95_cccccc_1x100.png +0 -0
- data/public/css/south-street/images/ui-bg_highlight-soft_25_67b021_1x100.png +0 -0
- data/public/css/south-street/images/ui-bg_highlight-soft_95_ffedad_1x100.png +0 -0
- data/public/css/south-street/images/ui-bg_inset-soft_15_2b2922_1x100.png +0 -0
- data/public/css/south-street/images/ui-icons_808080_256x240.png +0 -0
- data/public/css/south-street/images/ui-icons_847e71_256x240.png +0 -0
- data/public/css/south-street/images/ui-icons_8dc262_256x240.png +0 -0
- data/public/css/south-street/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/public/css/south-street/images/ui-icons_eeeeee_256x240.png +0 -0
- data/public/css/south-street/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/css/south-street/jquery-ui.css +565 -0
- data/public/css/south-street/jquery.ui.accordion.css +19 -0
- data/public/css/south-street/jquery.ui.all.css +11 -0
- data/public/css/south-street/jquery.ui.autocomplete.css +53 -0
- data/public/css/south-street/jquery.ui.base.css +11 -0
- data/public/css/south-street/jquery.ui.button.css +38 -0
- data/public/css/south-street/jquery.ui.core.css +38 -0
- data/public/css/south-street/jquery.ui.datepicker.css +68 -0
- data/public/css/south-street/jquery.ui.dialog.css +21 -0
- data/public/css/south-street/jquery.ui.progressbar.css +11 -0
- data/public/css/south-street/jquery.ui.resizable.css +20 -0
- data/public/css/south-street/jquery.ui.selectable.css +10 -0
- data/public/css/south-street/jquery.ui.slider.css +24 -0
- data/public/css/south-street/jquery.ui.tabs.css +18 -0
- data/public/css/south-street/jquery.ui.theme.css +249 -0
- data/public/css/start/images/ui-bg_flat_55_999999_40x100.png +0 -0
- data/public/css/start/images/ui-bg_flat_75_aaaaaa_40x100.png +0 -0
- data/public/css/start/images/ui-bg_glass_45_0078ae_1x400.png +0 -0
- data/public/css/start/images/ui-bg_glass_55_f8da4e_1x400.png +0 -0
- data/public/css/start/images/ui-bg_glass_75_79c9ec_1x400.png +0 -0
- data/public/css/start/images/ui-bg_gloss-wave_45_e14f1c_500x100.png +0 -0
- data/public/css/start/images/ui-bg_gloss-wave_50_6eac2c_500x100.png +0 -0
- data/public/css/start/images/ui-bg_gloss-wave_75_2191c0_500x100.png +0 -0
- data/public/css/start/images/ui-bg_inset-hard_100_fcfdfd_1x100.png +0 -0
- data/public/css/start/images/ui-icons_0078ae_256x240.png +0 -0
- data/public/css/start/images/ui-icons_056b93_256x240.png +0 -0
- data/public/css/start/images/ui-icons_d8e7f3_256x240.png +0 -0
- data/public/css/start/images/ui-icons_e0fdff_256x240.png +0 -0
- data/public/css/start/images/ui-icons_f5e175_256x240.png +0 -0
- data/public/css/start/images/ui-icons_f7a50d_256x240.png +0 -0
- data/public/css/start/images/ui-icons_fcd113_256x240.png +0 -0
- data/public/css/start/jquery-ui.css +565 -0
- data/public/css/start/jquery.ui.accordion.css +19 -0
- data/public/css/start/jquery.ui.all.css +11 -0
- data/public/css/start/jquery.ui.autocomplete.css +53 -0
- data/public/css/start/jquery.ui.base.css +11 -0
- data/public/css/start/jquery.ui.button.css +38 -0
- data/public/css/start/jquery.ui.core.css +38 -0
- data/public/css/start/jquery.ui.datepicker.css +68 -0
- data/public/css/start/jquery.ui.dialog.css +21 -0
- data/public/css/start/jquery.ui.progressbar.css +11 -0
- data/public/css/start/jquery.ui.resizable.css +20 -0
- data/public/css/start/jquery.ui.selectable.css +10 -0
- data/public/css/start/jquery.ui.slider.css +24 -0
- data/public/css/start/jquery.ui.tabs.css +18 -0
- data/public/css/start/jquery.ui.theme.css +249 -0
- data/public/css/style.css +190 -0
- data/public/css/sunny/images/ui-bg_diagonals-medium_20_d34d17_40x40.png +0 -0
- data/public/css/sunny/images/ui-bg_flat_30_cccccc_40x100.png +0 -0
- data/public/css/sunny/images/ui-bg_flat_50_5c5c5c_40x100.png +0 -0
- data/public/css/sunny/images/ui-bg_gloss-wave_45_817865_500x100.png +0 -0
- data/public/css/sunny/images/ui-bg_gloss-wave_60_fece2f_500x100.png +0 -0
- data/public/css/sunny/images/ui-bg_gloss-wave_70_ffdd57_500x100.png +0 -0
- data/public/css/sunny/images/ui-bg_gloss-wave_90_fff9e5_500x100.png +0 -0
- data/public/css/sunny/images/ui-bg_highlight-soft_100_feeebd_1x100.png +0 -0
- data/public/css/sunny/images/ui-bg_inset-soft_30_ffffff_1x100.png +0 -0
- data/public/css/sunny/images/ui-icons_3d3d3d_256x240.png +0 -0
- data/public/css/sunny/images/ui-icons_bd7b00_256x240.png +0 -0
- data/public/css/sunny/images/ui-icons_d19405_256x240.png +0 -0
- data/public/css/sunny/images/ui-icons_eb990f_256x240.png +0 -0
- data/public/css/sunny/images/ui-icons_ed9f26_256x240.png +0 -0
- data/public/css/sunny/images/ui-icons_fadc7a_256x240.png +0 -0
- data/public/css/sunny/images/ui-icons_ffe180_256x240.png +0 -0
- data/public/css/sunny/jquery-ui.css +565 -0
- data/public/css/sunny/jquery.ui.accordion.css +19 -0
- data/public/css/sunny/jquery.ui.all.css +11 -0
- data/public/css/sunny/jquery.ui.autocomplete.css +53 -0
- data/public/css/sunny/jquery.ui.base.css +11 -0
- data/public/css/sunny/jquery.ui.button.css +38 -0
- data/public/css/sunny/jquery.ui.core.css +38 -0
- data/public/css/sunny/jquery.ui.datepicker.css +68 -0
- data/public/css/sunny/jquery.ui.dialog.css +21 -0
- data/public/css/sunny/jquery.ui.progressbar.css +11 -0
- data/public/css/sunny/jquery.ui.resizable.css +20 -0
- data/public/css/sunny/jquery.ui.selectable.css +10 -0
- data/public/css/sunny/jquery.ui.slider.css +24 -0
- data/public/css/sunny/jquery.ui.tabs.css +18 -0
- data/public/css/sunny/jquery.ui.theme.css +249 -0
- data/public/css/swanky-purse/images/ui-bg_diamond_10_4f4221_10x8.png +0 -0
- data/public/css/swanky-purse/images/ui-bg_diamond_20_372806_10x8.png +0 -0
- data/public/css/swanky-purse/images/ui-bg_diamond_25_675423_10x8.png +0 -0
- data/public/css/swanky-purse/images/ui-bg_diamond_25_d5ac5d_10x8.png +0 -0
- data/public/css/swanky-purse/images/ui-bg_diamond_8_261803_10x8.png +0 -0
- data/public/css/swanky-purse/images/ui-bg_diamond_8_443113_10x8.png +0 -0
- data/public/css/swanky-purse/images/ui-bg_flat_75_ddd4b0_40x100.png +0 -0
- data/public/css/swanky-purse/images/ui-bg_highlight-hard_65_fee4bd_1x100.png +0 -0
- data/public/css/swanky-purse/images/ui-icons_070603_256x240.png +0 -0
- data/public/css/swanky-purse/images/ui-icons_e8e2b5_256x240.png +0 -0
- data/public/css/swanky-purse/images/ui-icons_e9cd86_256x240.png +0 -0
- data/public/css/swanky-purse/images/ui-icons_efec9f_256x240.png +0 -0
- data/public/css/swanky-purse/images/ui-icons_f2ec64_256x240.png +0 -0
- data/public/css/swanky-purse/images/ui-icons_f9f2bd_256x240.png +0 -0
- data/public/css/swanky-purse/images/ui-icons_ff7519_256x240.png +0 -0
- data/public/css/swanky-purse/jquery-ui.css +565 -0
- data/public/css/swanky-purse/jquery.ui.accordion.css +19 -0
- data/public/css/swanky-purse/jquery.ui.all.css +11 -0
- data/public/css/swanky-purse/jquery.ui.autocomplete.css +53 -0
- data/public/css/swanky-purse/jquery.ui.base.css +11 -0
- data/public/css/swanky-purse/jquery.ui.button.css +38 -0
- data/public/css/swanky-purse/jquery.ui.core.css +38 -0
- data/public/css/swanky-purse/jquery.ui.datepicker.css +68 -0
- data/public/css/swanky-purse/jquery.ui.dialog.css +21 -0
- data/public/css/swanky-purse/jquery.ui.progressbar.css +11 -0
- data/public/css/swanky-purse/jquery.ui.resizable.css +20 -0
- data/public/css/swanky-purse/jquery.ui.selectable.css +10 -0
- data/public/css/swanky-purse/jquery.ui.slider.css +24 -0
- data/public/css/swanky-purse/jquery.ui.tabs.css +18 -0
- data/public/css/swanky-purse/jquery.ui.theme.css +249 -0
- data/public/css/trontastic/images/ui-bg_diagonals-small_50_262626_40x40.png +0 -0
- data/public/css/trontastic/images/ui-bg_flat_0_303030_40x100.png +0 -0
- data/public/css/trontastic/images/ui-bg_flat_0_4c4c4c_40x100.png +0 -0
- data/public/css/trontastic/images/ui-bg_glass_40_0a0a0a_1x400.png +0 -0
- data/public/css/trontastic/images/ui-bg_glass_55_f1fbe5_1x400.png +0 -0
- data/public/css/trontastic/images/ui-bg_glass_60_000000_1x400.png +0 -0
- data/public/css/trontastic/images/ui-bg_gloss-wave_55_000000_500x100.png +0 -0
- data/public/css/trontastic/images/ui-bg_gloss-wave_85_9fda58_500x100.png +0 -0
- data/public/css/trontastic/images/ui-bg_gloss-wave_95_f6ecd5_500x100.png +0 -0
- data/public/css/trontastic/images/ui-icons_000000_256x240.png +0 -0
- data/public/css/trontastic/images/ui-icons_1f1f1f_256x240.png +0 -0
- data/public/css/trontastic/images/ui-icons_9fda58_256x240.png +0 -0
- data/public/css/trontastic/images/ui-icons_b8ec79_256x240.png +0 -0
- data/public/css/trontastic/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/public/css/trontastic/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/css/trontastic/jquery-ui.css +565 -0
- data/public/css/trontastic/jquery.ui.accordion.css +19 -0
- data/public/css/trontastic/jquery.ui.all.css +11 -0
- data/public/css/trontastic/jquery.ui.autocomplete.css +53 -0
- data/public/css/trontastic/jquery.ui.base.css +11 -0
- data/public/css/trontastic/jquery.ui.button.css +38 -0
- data/public/css/trontastic/jquery.ui.core.css +38 -0
- data/public/css/trontastic/jquery.ui.datepicker.css +68 -0
- data/public/css/trontastic/jquery.ui.dialog.css +21 -0
- data/public/css/trontastic/jquery.ui.progressbar.css +11 -0
- data/public/css/trontastic/jquery.ui.resizable.css +20 -0
- data/public/css/trontastic/jquery.ui.selectable.css +10 -0
- data/public/css/trontastic/jquery.ui.slider.css +24 -0
- data/public/css/trontastic/jquery.ui.tabs.css +18 -0
- data/public/css/trontastic/jquery.ui.theme.css +249 -0
- data/public/css/ui-darkness/images/ui-bg_flat_30_cccccc_40x100.png +0 -0
- data/public/css/ui-darkness/images/ui-bg_flat_50_5c5c5c_40x100.png +0 -0
- data/public/css/ui-darkness/images/ui-bg_glass_20_555555_1x400.png +0 -0
- data/public/css/ui-darkness/images/ui-bg_glass_40_0078a3_1x400.png +0 -0
- data/public/css/ui-darkness/images/ui-bg_glass_40_ffc73d_1x400.png +0 -0
- data/public/css/ui-darkness/images/ui-bg_gloss-wave_25_333333_500x100.png +0 -0
- data/public/css/ui-darkness/images/ui-bg_highlight-soft_80_eeeeee_1x100.png +0 -0
- data/public/css/ui-darkness/images/ui-bg_inset-soft_25_000000_1x100.png +0 -0
- data/public/css/ui-darkness/images/ui-bg_inset-soft_30_f58400_1x100.png +0 -0
- data/public/css/ui-darkness/images/ui-icons_222222_256x240.png +0 -0
- data/public/css/ui-darkness/images/ui-icons_4b8e0b_256x240.png +0 -0
- data/public/css/ui-darkness/images/ui-icons_a83300_256x240.png +0 -0
- data/public/css/ui-darkness/images/ui-icons_cccccc_256x240.png +0 -0
- data/public/css/ui-darkness/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/css/ui-darkness/jquery-ui.css +565 -0
- data/public/css/ui-darkness/jquery.ui.accordion.css +19 -0
- data/public/css/ui-darkness/jquery.ui.all.css +11 -0
- data/public/css/ui-darkness/jquery.ui.autocomplete.css +53 -0
- data/public/css/ui-darkness/jquery.ui.base.css +11 -0
- data/public/css/ui-darkness/jquery.ui.button.css +38 -0
- data/public/css/ui-darkness/jquery.ui.core.css +38 -0
- data/public/css/ui-darkness/jquery.ui.datepicker.css +68 -0
- data/public/css/ui-darkness/jquery.ui.dialog.css +21 -0
- data/public/css/ui-darkness/jquery.ui.progressbar.css +11 -0
- data/public/css/ui-darkness/jquery.ui.resizable.css +20 -0
- data/public/css/ui-darkness/jquery.ui.selectable.css +10 -0
- data/public/css/ui-darkness/jquery.ui.slider.css +24 -0
- data/public/css/ui-darkness/jquery.ui.tabs.css +18 -0
- data/public/css/ui-darkness/jquery.ui.theme.css +249 -0
- data/public/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- data/public/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- data/public/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
- data/public/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- data/public/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- data/public/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/public/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- data/public/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- data/public/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- data/public/css/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
- data/public/css/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
- data/public/css/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
- data/public/css/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
- data/public/css/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/css/ui-lightness/jquery-ui.css +565 -0
- data/public/css/ui-lightness/jquery.ui.accordion.css +19 -0
- data/public/css/ui-lightness/jquery.ui.all.css +11 -0
- data/public/css/ui-lightness/jquery.ui.autocomplete.css +53 -0
- data/public/css/ui-lightness/jquery.ui.base.css +11 -0
- data/public/css/ui-lightness/jquery.ui.button.css +38 -0
- data/public/css/ui-lightness/jquery.ui.core.css +38 -0
- data/public/css/ui-lightness/jquery.ui.datepicker.css +68 -0
- data/public/css/ui-lightness/jquery.ui.dialog.css +21 -0
- data/public/css/ui-lightness/jquery.ui.progressbar.css +11 -0
- data/public/css/ui-lightness/jquery.ui.resizable.css +20 -0
- data/public/css/ui-lightness/jquery.ui.selectable.css +10 -0
- data/public/css/ui-lightness/jquery.ui.slider.css +24 -0
- data/public/css/ui-lightness/jquery.ui.tabs.css +18 -0
- data/public/css/ui-lightness/jquery.ui.theme.css +249 -0
- data/public/css/vader/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/public/css/vader/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/public/css/vader/images/ui-bg_gloss-wave_16_121212_500x100.png +0 -0
- data/public/css/vader/images/ui-bg_highlight-hard_15_888888_1x100.png +0 -0
- data/public/css/vader/images/ui-bg_highlight-hard_55_555555_1x100.png +0 -0
- data/public/css/vader/images/ui-bg_highlight-soft_35_adadad_1x100.png +0 -0
- data/public/css/vader/images/ui-bg_highlight-soft_60_dddddd_1x100.png +0 -0
- data/public/css/vader/images/ui-bg_inset-soft_15_121212_1x100.png +0 -0
- data/public/css/vader/images/ui-icons_666666_256x240.png +0 -0
- data/public/css/vader/images/ui-icons_aaaaaa_256x240.png +0 -0
- data/public/css/vader/images/ui-icons_bbbbbb_256x240.png +0 -0
- data/public/css/vader/images/ui-icons_c98000_256x240.png +0 -0
- data/public/css/vader/images/ui-icons_cccccc_256x240.png +0 -0
- data/public/css/vader/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/public/css/vader/images/ui-icons_f29a00_256x240.png +0 -0
- data/public/css/vader/jquery-ui.css +565 -0
- data/public/css/vader/jquery.ui.accordion.css +19 -0
- data/public/css/vader/jquery.ui.all.css +11 -0
- data/public/css/vader/jquery.ui.autocomplete.css +53 -0
- data/public/css/vader/jquery.ui.base.css +11 -0
- data/public/css/vader/jquery.ui.button.css +38 -0
- data/public/css/vader/jquery.ui.core.css +38 -0
- data/public/css/vader/jquery.ui.datepicker.css +68 -0
- data/public/css/vader/jquery.ui.dialog.css +21 -0
- data/public/css/vader/jquery.ui.progressbar.css +11 -0
- data/public/css/vader/jquery.ui.resizable.css +20 -0
- data/public/css/vader/jquery.ui.selectable.css +10 -0
- data/public/css/vader/jquery.ui.slider.css +24 -0
- data/public/css/vader/jquery.ui.tabs.css +18 -0
- data/public/css/vader/jquery.ui.theme.css +249 -0
- data/public/images/ui-anim_basic_16x16.gif +0 -0
- data/public/js/autocomplete.js +183 -0
- data/public/js/dictionary.js +93 -0
- data/public/js/index.js +217 -0
- data/public/js/jquery-1.7.1.min.js +4 -0
- data/public/js/jquery-ui-1.8.18.custom.min.js +356 -0
- data/test/helper.rb +30 -0
- data/test/unit/test_activity.rb +287 -0
- data/test/unit/test_application.rb +126 -0
- data/test/unit/test_database.rb +21 -0
- data/test/unit/test_hourglass.rb +9 -0
- data/views/_activity.erb +17 -0
- data/views/_current.erb +19 -0
- data/views/_today.erb +5 -0
- data/views/_week.erb +15 -0
- data/views/form.erb +35 -0
- data/views/index.erb +39 -0
- data/views/layout.erb +21 -0
- data/views/popup.erb +48 -0
- metadata +1012 -0
data/lib/hourglass.rb
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
require 'pathname'
|
|
2
|
+
require 'rbconfig'
|
|
3
|
+
require 'delegate'
|
|
4
|
+
require 'sinatra/base'
|
|
5
|
+
require 'json'
|
|
6
|
+
require 'swt'
|
|
7
|
+
require 'sequel'
|
|
8
|
+
require 'sequel/extensions/migration'
|
|
9
|
+
require 'logger'
|
|
10
|
+
|
|
11
|
+
module Hourglass
|
|
12
|
+
def self.root
|
|
13
|
+
File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.root_path
|
|
17
|
+
@root_path ||= Pathname.new(root)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.environment
|
|
21
|
+
@environment ||= ENV['HOURGLASS_ENV'] || :production
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.db_path
|
|
25
|
+
File.join(data_path, 'db', environment.to_s)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.data_path
|
|
29
|
+
if !defined? @data_path
|
|
30
|
+
dir =
|
|
31
|
+
if ENV['HOURGLASS_HOME']
|
|
32
|
+
ENV['HOURGLASS_HOME']
|
|
33
|
+
else
|
|
34
|
+
case Config::CONFIG['host_os']
|
|
35
|
+
when /mswin|windows/i
|
|
36
|
+
# Windows
|
|
37
|
+
File.join(ENV['APPDATA'], "hourglass")
|
|
38
|
+
else
|
|
39
|
+
if ENV['HOME']
|
|
40
|
+
File.join(ENV['HOME'], ".hourglass")
|
|
41
|
+
else
|
|
42
|
+
raise "Can't figure out where Hourglass lives! Try setting the HOURGLASS_HOME environment variable"
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
if !File.exist?(dir)
|
|
47
|
+
begin
|
|
48
|
+
Dir.mkdir(dir)
|
|
49
|
+
rescue SystemCallError
|
|
50
|
+
raise "Can't create Hourglass directory (#{dir})! Is the parent directory accessible?"
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
if !File.writable?(dir)
|
|
54
|
+
raise "Hourglass directory (#{dir}) is not writable!"
|
|
55
|
+
end
|
|
56
|
+
@data_path = File.expand_path(dir)
|
|
57
|
+
end
|
|
58
|
+
@data_path
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
path = root_path + 'lib' + 'hourglass'
|
|
62
|
+
autoload :Project, (path + 'project').to_s
|
|
63
|
+
autoload :Activity, (path + 'activity').to_s
|
|
64
|
+
autoload :Tag, (path + 'tag').to_s
|
|
65
|
+
autoload :Setting, (path + 'setting').to_s
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
path = Hourglass.root_path + 'lib' + 'hourglass'
|
|
69
|
+
require path + 'database'
|
|
70
|
+
require path + 'application'
|
|
71
|
+
require path + 'runner'
|
|
72
|
+
|
|
73
|
+
Sequel::Model.plugin :json_serializer, :naked => true
|
|
74
|
+
Sequel::Model.plugin :validation_helpers
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
module Hourglass
|
|
2
|
+
class Activity < Sequel::Model
|
|
3
|
+
many_to_one :project
|
|
4
|
+
many_to_many :tags
|
|
5
|
+
|
|
6
|
+
plugin :json_serializer, :naked => true, :include => [:tags, :project]
|
|
7
|
+
plugin :nested_attributes
|
|
8
|
+
nested_attributes :project
|
|
9
|
+
plugin :dirty
|
|
10
|
+
|
|
11
|
+
def_dataset_method(:full) { eager(:tags, :project) }
|
|
12
|
+
|
|
13
|
+
subset(:current, :ended_at => nil)
|
|
14
|
+
def_dataset_method(:current_e) { current.full.order(:started_at) }
|
|
15
|
+
|
|
16
|
+
subset(:today) { started_at >= Date.today }
|
|
17
|
+
def_dataset_method(:today_e) { today.full.order(:started_at) }
|
|
18
|
+
|
|
19
|
+
subset(:week) do
|
|
20
|
+
today = Date.today
|
|
21
|
+
sunday = today - today.wday
|
|
22
|
+
(started_at >= sunday) & (started_at < (sunday + 7))
|
|
23
|
+
end
|
|
24
|
+
def_dataset_method(:week_e) { week.full.order(:started_at) }
|
|
25
|
+
|
|
26
|
+
subset(:sub_minute) do
|
|
27
|
+
ended_at != nil &&
|
|
28
|
+
:datediff.sql_function("second", :started_at, :ended_at) < 60
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def_dataset_method(:uniq) do
|
|
32
|
+
# figure out if the projects table has already been joined
|
|
33
|
+
ds =
|
|
34
|
+
if (opts[:join] || []).collect(&:table).include?(:projects)
|
|
35
|
+
self
|
|
36
|
+
else
|
|
37
|
+
join(:projects, :id => :project_id)
|
|
38
|
+
end
|
|
39
|
+
ds = ds.naked.
|
|
40
|
+
select(:min.sql_function(:activities__id).as(:id)).
|
|
41
|
+
group(:activities__name, :projects__name)
|
|
42
|
+
|
|
43
|
+
ids = ds.collect { |row| row[:id] }
|
|
44
|
+
filter(:activities__id => ids)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def self.stop_current_activities
|
|
48
|
+
current.update(:ended_at => Time.now)
|
|
49
|
+
ids = sub_minute.select_map(:id)
|
|
50
|
+
if !ids.empty?
|
|
51
|
+
db[:activities_tags].filter(:activity_id => ids).delete
|
|
52
|
+
sub_minute.delete
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def running=(value)
|
|
57
|
+
modified!
|
|
58
|
+
@running = value
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def started_at_date
|
|
62
|
+
t = started_at
|
|
63
|
+
Date.new(t.year, t.month, t.day)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def started_at_mdy
|
|
67
|
+
started_at ? started_at.strftime("%m/%d/%Y") : ""
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def started_at_mdy=(value)
|
|
71
|
+
modified!
|
|
72
|
+
@started_at_mdy = value
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def started_at_hm
|
|
76
|
+
started_at ? started_at.strftime("%H:%M") : ""
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def started_at_hm=(value)
|
|
80
|
+
modified!
|
|
81
|
+
@started_at_hm = value
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def ended_at_mdy
|
|
85
|
+
ended_at ? ended_at.strftime("%m/%d/%Y") : ""
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def ended_at_mdy=(value)
|
|
89
|
+
modified!
|
|
90
|
+
@ended_at_mdy = value
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def ended_at_hm
|
|
94
|
+
ended_at ? ended_at.strftime("%H:%M") : ""
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def ended_at_hm=(value)
|
|
98
|
+
modified!
|
|
99
|
+
@ended_at_hm = value
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def duration
|
|
103
|
+
(ended_at ? ended_at - started_at : Time.now - started_at).floor
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def duration_in_words
|
|
107
|
+
total_minutes = duration / 60
|
|
108
|
+
if total_minutes == 0
|
|
109
|
+
"0min"
|
|
110
|
+
else
|
|
111
|
+
minutes = total_minutes % 60
|
|
112
|
+
total_hours = total_minutes / 60
|
|
113
|
+
hours = total_hours % 24
|
|
114
|
+
days = total_hours / 24
|
|
115
|
+
|
|
116
|
+
strings = []
|
|
117
|
+
strings << "#{days}d" if days > 0
|
|
118
|
+
strings << "#{hours}h" if hours > 0
|
|
119
|
+
strings << "#{minutes}min" if minutes > 0
|
|
120
|
+
strings.join(" ")
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def running?
|
|
125
|
+
if new?
|
|
126
|
+
@running
|
|
127
|
+
else
|
|
128
|
+
ended_at.nil?
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def tag_names
|
|
133
|
+
if @tag_names
|
|
134
|
+
@tag_names
|
|
135
|
+
else
|
|
136
|
+
new? ? "" : tags_dataset.select_map(:name).join(", ")
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def tag_names=(value)
|
|
141
|
+
modified!
|
|
142
|
+
@tag_names = value
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def name_with_project
|
|
146
|
+
if project
|
|
147
|
+
"#{name}@#{project.name}"
|
|
148
|
+
else
|
|
149
|
+
name
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def name_with_project=(value)
|
|
154
|
+
activity_name, project_name = value ? value.strip.split("@", 2) : [nil, nil]
|
|
155
|
+
self.name = activity_name
|
|
156
|
+
|
|
157
|
+
if !project_name.nil? && !project_name.empty?
|
|
158
|
+
project = Project.filter(:name => project_name).first
|
|
159
|
+
if project.nil?
|
|
160
|
+
self.project_attributes = {:name => project_name}
|
|
161
|
+
else
|
|
162
|
+
self.project = project
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def changes
|
|
168
|
+
@changes || {}
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
private
|
|
172
|
+
|
|
173
|
+
def before_validation
|
|
174
|
+
super
|
|
175
|
+
if @started_at_mdy && @started_at_hm
|
|
176
|
+
md_1 = @started_at_mdy.match(%r{^(\d{1,2})/(\d{1,2})/(\d{4})$})
|
|
177
|
+
md_2 = @started_at_hm.match(%r{^(\d{1,2}):(\d{2})$})
|
|
178
|
+
if md_1 && md_2
|
|
179
|
+
self.started_at = Time.local(md_1[3].to_i, md_1[1].to_i, md_1[2].to_i, md_2[1].to_i, md_2[2].to_i)
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
if @ended_at_mdy && @ended_at_hm
|
|
184
|
+
md_1 = @ended_at_mdy.match(%r{^(\d{1,2})/(\d{1,2})/(\d{4})$})
|
|
185
|
+
md_2 = @ended_at_hm.match(%r{^(\d{1,2}):(\d{2})$})
|
|
186
|
+
if md_1 && md_2
|
|
187
|
+
self.ended_at = Time.local(md_1[3].to_i, md_1[1].to_i, md_1[2].to_i, md_2[1].to_i, md_2[2].to_i)
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def validate
|
|
193
|
+
super
|
|
194
|
+
validates_presence([:name, :started_at])
|
|
195
|
+
if (new? && !@running)
|
|
196
|
+
validates_presence([:ended_at])
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def before_save
|
|
201
|
+
@changes = {}
|
|
202
|
+
|
|
203
|
+
if project && project.new?
|
|
204
|
+
@changes['new_project'] = project.name
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
super
|
|
208
|
+
|
|
209
|
+
if @running
|
|
210
|
+
self.ended_at = nil
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
if Activity.filter(:name => name, :project_id => project_id).count == 0
|
|
214
|
+
@changes['new_activity'] = name_with_project
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
if !new?
|
|
218
|
+
name_changed = changed_columns.include?(:name)
|
|
219
|
+
project_changed =
|
|
220
|
+
changed_columns.include?(:project_id) ||
|
|
221
|
+
(project && project.id != project_id)
|
|
222
|
+
|
|
223
|
+
if name_changed || project_changed
|
|
224
|
+
# check to see if this was the last activity named this
|
|
225
|
+
previous_name = initial_value(:name)
|
|
226
|
+
previous_project_id = initial_value(:project_id)
|
|
227
|
+
ds = Activity.
|
|
228
|
+
filter(:name => previous_name).
|
|
229
|
+
filter(:project_id => previous_project_id).
|
|
230
|
+
filter(~{:id => id})
|
|
231
|
+
|
|
232
|
+
if ds.count == 0
|
|
233
|
+
@changes['delete_activity'] =
|
|
234
|
+
if previous_project_id
|
|
235
|
+
previous_name + "@" + Project[previous_project_id].name
|
|
236
|
+
else
|
|
237
|
+
previous_name
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def after_save
|
|
245
|
+
super
|
|
246
|
+
new_tags = []
|
|
247
|
+
if !@tag_names.nil? && !@tag_names.empty?
|
|
248
|
+
remove_all_tags
|
|
249
|
+
tag_names.split(/,\s*/).each do |tag_name|
|
|
250
|
+
tag_name = tag_name.strip
|
|
251
|
+
tag = Tag.filter(:name => tag_name).first
|
|
252
|
+
if tag.nil?
|
|
253
|
+
tag = Tag.create(:name => tag_name)
|
|
254
|
+
new_tags << tag_name
|
|
255
|
+
end
|
|
256
|
+
add_tag(tag)
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
if !new_tags.empty?
|
|
260
|
+
@changes['new_tags'] = new_tags
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
@tag_names = @started_at_mdy = @started_at_hm = @ended_at_mdy =
|
|
264
|
+
@ended_at_hm = @running = nil
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
def before_destroy
|
|
268
|
+
super
|
|
269
|
+
remove_all_tags
|
|
270
|
+
|
|
271
|
+
@changes = {}
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
def after_destroy
|
|
275
|
+
super
|
|
276
|
+
|
|
277
|
+
# NOTE: this doesn't work if someone changes an activity, then
|
|
278
|
+
# deletes it without saving, but this isn't really that critical.
|
|
279
|
+
if Activity.filter(:name => name, :project_id => project_id).count == 0
|
|
280
|
+
@changes['delete_activity'] = name_with_project
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
# TODO: Project.prune
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
end
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
module Hourglass
|
|
2
|
+
class Application < Sinatra::Base
|
|
3
|
+
set :root, Hourglass.root
|
|
4
|
+
set :erb, :trim => '-'
|
|
5
|
+
|
|
6
|
+
if development?
|
|
7
|
+
use Rack::CommonLogger
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
helpers do
|
|
11
|
+
def activity_tags(activity)
|
|
12
|
+
result = "<ul>"
|
|
13
|
+
activity.tags.each do |tag|
|
|
14
|
+
result << %{<li class="tag-#{tag.id}">#{tag.name}</li>}
|
|
15
|
+
end
|
|
16
|
+
result + "</ul>"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def all_partials
|
|
20
|
+
{
|
|
21
|
+
'today' => erb(:_today, {
|
|
22
|
+
:layout => false,
|
|
23
|
+
:locals => {:activities => Activity.today_e.all}
|
|
24
|
+
}),
|
|
25
|
+
'week' => erb(:_week, {
|
|
26
|
+
:layout => false,
|
|
27
|
+
:locals => {:activities => Activity.week_e.all}
|
|
28
|
+
}),
|
|
29
|
+
'current' => erb(:_current, {
|
|
30
|
+
:layout => false,
|
|
31
|
+
:locals => {:activity => Activity.current_e.first}
|
|
32
|
+
})
|
|
33
|
+
}
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def validate_and_save_activity(activity, was_running = false)
|
|
37
|
+
if activity.valid?
|
|
38
|
+
if !was_running && activity.running?
|
|
39
|
+
Activity.stop_current_activities
|
|
40
|
+
end
|
|
41
|
+
activity.save
|
|
42
|
+
if request.xhr?
|
|
43
|
+
all_partials.merge('changes' => activity.changes).to_json
|
|
44
|
+
else
|
|
45
|
+
redirect '/'
|
|
46
|
+
end
|
|
47
|
+
else
|
|
48
|
+
if request.xhr?
|
|
49
|
+
{'errors' => activity.errors}.to_json
|
|
50
|
+
else
|
|
51
|
+
erb :popup
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
before do
|
|
58
|
+
@user_agent = request.user_agent
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
get '/' do
|
|
62
|
+
if request.xhr?
|
|
63
|
+
all_partials.to_json
|
|
64
|
+
else
|
|
65
|
+
@activities = {
|
|
66
|
+
'today' => Activity.today_e.all,
|
|
67
|
+
'week' => Activity.week_e.all,
|
|
68
|
+
'current' => Activity.current_e.first
|
|
69
|
+
}
|
|
70
|
+
erb :index
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
get '/activities/new' do
|
|
75
|
+
@activity = Activity.new(:started_at => Time.now, :running => true)
|
|
76
|
+
erb :popup
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
post '/activities' do
|
|
80
|
+
@activity = Activity.new(params['activity'] || {})
|
|
81
|
+
@activity.started_at ||= Time.now
|
|
82
|
+
validate_and_save_activity(@activity)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
get '/activities/:id/edit' do
|
|
86
|
+
@activity = Activity[params[:id]]
|
|
87
|
+
erb :popup
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
post '/activities/:id' do
|
|
91
|
+
@activity = Activity[params[:id]]
|
|
92
|
+
was_running = @activity.running?
|
|
93
|
+
@activity.set_fields(params[:activity], [
|
|
94
|
+
:name_with_project, :tag_names, :running,
|
|
95
|
+
:started_at_mdy, :started_at_hm,
|
|
96
|
+
:ended_at_mdy, :ended_at_hm
|
|
97
|
+
])
|
|
98
|
+
validate_and_save_activity(@activity, was_running)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
get '/activities/:id/delete' do
|
|
102
|
+
activity = Activity[params[:id]]
|
|
103
|
+
activity.destroy
|
|
104
|
+
all_partials.merge('changes' => activity.changes).to_json
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
get '/activities' do
|
|
108
|
+
ds = Activity.naked.distinct.
|
|
109
|
+
select(:activities__name.as(:activity_name), :projects__name.as(:project_name)).
|
|
110
|
+
left_join(:projects, :id => :project_id).
|
|
111
|
+
order(:activities__name, :projects__name)
|
|
112
|
+
ds.collect do |row|
|
|
113
|
+
if row[:project_name]
|
|
114
|
+
"#{row[:activity_name]}@#{row[:project_name]}"
|
|
115
|
+
else
|
|
116
|
+
row[:activity_name]
|
|
117
|
+
end
|
|
118
|
+
end.to_json
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
get '/activities/current/stop' do
|
|
122
|
+
Activity.stop_current_activities
|
|
123
|
+
all_partials.to_json
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
get '/tags' do
|
|
127
|
+
Tag.naked.distinct.order(:name).select_map(:name).to_json
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
get '/projects' do
|
|
131
|
+
Project.naked.distinct.order(:name).select_map(:name).to_json
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|