appt 0.0.1.beta.2 → 0.0.1.beta.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/MIT-LICENSE +20 -20
- data/Rakefile +34 -37
- data/app/assets/javascripts/appt/application.js +2 -2
- data/app/assets/stylesheets/appt/application.scss +1 -0
- data/app/assets/stylesheets/appt/calendar.scss +20 -0
- data/app/controllers/appt/appointment_types_controller.rb +7 -0
- data/app/controllers/appt/base_controller.rb +1 -0
- data/app/controllers/appt/calendars_controller.rb +56 -6
- data/app/controllers/appt/external_calendars_controller.rb +72 -0
- data/app/controllers/appt/home_controller.rb +2 -1
- data/app/helpers/appt/application_helper.rb +39 -20
- data/app/helpers/appt/calendars_helper.rb +5 -4
- data/app/mailers/base_mailer.rb +2 -1
- data/app/models/appt/appointment.rb +5 -4
- data/app/models/appt/appointment_type.rb +6 -0
- data/app/models/appt/block.rb +8 -4
- data/app/models/appt/calendar.rb +38 -4
- data/app/models/appt/calendar_event.rb +40 -5
- data/app/models/appt/external_calendar.rb +40 -0
- data/app/views/appt/blocks/_table.html.haml +26 -0
- data/app/views/appt/calendars/_form.html.haml +12 -0
- data/app/views/appt/calendars/_table.html.haml +17 -0
- data/app/views/appt/calendars/edit.html.haml +6 -0
- data/app/views/appt/calendars/index.html.haml +6 -0
- data/app/views/appt/calendars/new.html.haml +6 -0
- data/app/views/appt/calendars/show.html.haml +14 -0
- data/app/views/appt/external_calendars/_form.html.haml +7 -0
- data/app/views/appt/external_calendars/_table.html.haml +10 -0
- data/app/views/appt/external_calendars/edit.html.haml +6 -0
- data/app/views/appt/external_calendars/index.html.haml +7 -0
- data/app/views/appt/external_calendars/new.html.haml +6 -0
- data/app/views/appt/external_calendars/show.html.haml +26 -0
- data/app/views/appt/shared/_navbar.html.haml +2 -1
- data/config/initializers/user_class_extensions.rb +1 -0
- data/config/routes.rb +9 -7
- data/config/secrets.yml +1 -0
- data/db/migrate/20150804002016_create_appt_calendars.rb +16 -9
- data/db/migrate/20150804003348_create_appt_blocks.rb +16 -8
- data/db/migrate/20150804003846_create_appt_appointments.rb +17 -8
- data/db/migrate/20150804234748_create_appt_appointment_types.rb +13 -0
- data/db/migrate/20150805114046_create_appt_external_calendars.rb +10 -0
- data/lib/appt.rb +27 -23
- data/lib/appt/configuration.rb +29 -28
- data/lib/appt/engine.rb +6 -5
- data/lib/appt/icalendar_expander.rb +61 -0
- data/lib/appt/version.rb +4 -3
- data/lib/bootstrap_month_calendar.rb +5 -4
- data/lib/tasks/appt_tasks.rake +5 -4
- data/lib/workhours_serializer.rb +2 -5
- data/test/appt_test.rb +8 -7
- data/test/controllers/appt/appointment_types_controller_test.rb +14 -0
- data/test/controllers/appt/calendars_controller_test.rb +14 -13
- data/test/controllers/appt/external_calendars_controller_test.rb +14 -0
- data/test/dummy/README.rdoc +28 -28
- data/test/dummy/Rakefile +7 -6
- data/test/dummy/app/assets/javascripts/application.js +14 -14
- data/test/dummy/app/assets/stylesheets/application.css +16 -16
- data/test/dummy/app/controllers/application_controller.rb +6 -5
- data/test/dummy/app/helpers/application_helper.rb +3 -2
- data/test/dummy/app/views/layouts/application.html.erb +14 -14
- data/test/dummy/bin/bundle +3 -3
- data/test/dummy/bin/rails +4 -4
- data/test/dummy/bin/rake +4 -4
- data/test/dummy/bin/setup +29 -29
- data/test/dummy/config.ru +5 -4
- data/test/dummy/config/application.rb +29 -29
- data/test/dummy/config/boot.rb +6 -5
- data/test/dummy/config/database.yml +28 -28
- data/test/dummy/config/environment.rb +6 -5
- data/test/dummy/config/environments/development.rb +52 -41
- data/test/dummy/config/environments/production.rb +80 -79
- data/test/dummy/config/environments/test.rb +43 -42
- data/test/dummy/config/initializers/assets.rb +12 -11
- data/test/dummy/config/initializers/backtrace_silencers.rb +8 -7
- data/test/dummy/config/initializers/cookies_serializer.rb +4 -3
- data/test/dummy/config/initializers/filter_parameter_logging.rb +5 -4
- data/test/dummy/config/initializers/inflections.rb +17 -16
- data/test/dummy/config/initializers/mime_types.rb +5 -4
- data/test/dummy/config/initializers/session_store.rb +4 -3
- data/test/dummy/config/initializers/wrap_parameters.rb +15 -14
- data/test/dummy/config/locales/en.yml +33 -33
- data/test/dummy/config/routes.rb +6 -6
- data/test/dummy/config/secrets.yml +22 -22
- data/test/dummy/db/schema.rb +72 -35
- data/test/dummy/db/seeds.rb +18 -0
- data/test/dummy/log/bullet.log +7 -0
- data/test/dummy/log/development.log +14702 -0
- data/test/dummy/log/test.log +1135 -0
- data/test/dummy/public/404.html +67 -67
- data/test/dummy/public/422.html +67 -67
- data/test/dummy/public/500.html +66 -66
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/16dl9CdObHclmKoFXc2zQh9rW-KLDulBg9znI-eRIRA.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/2__llMaILi6GIGs0Ud--MoJ_q52Ma04wDCAakl-ciVQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/3W93pks8dviNiXPZszlyU0a3-UE6-QNPnwd9of1laVI.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/3d_B_YYvHmtlJ8mBxPSIBB0RqOS74VO_QtWUQbk-ngk.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/56CdkjUr49A5C7KcR5h5IUt4XeVO74F-GwfY4sHbEOA.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/6FuEXiynto7KSfrY1ziT5WzWMq6hqDNBQ9hesvk27Jc.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/6PmV7DYX7QXLP7g1r1YFHkKv4UbAtm5zuucs8dxjv1o.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/72B7YeiVJA3FGFbsBjK8CYoJnnMXeFdsSF7O6hq2K6g.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/78b7p_RRYPNiUO4wEIFyW53LAs9D_l0gSZDbEJLEZ78.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/7xkYVoPwhhEGUvpD0XjXgu2MkVVn8JtOjsWHqSrYZVg.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/8K4zfT11J6ORkijFMakOfQQ1Gnf_fGTeHQWrWXlW_OQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/91oKKpcrF9-IEZyOEK8YhZDdHg_FhrVa0z2jeUFRBPE.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/98-R4wiwBf7qvdPOM9Au_WrsfFKGiA7vdNxCrpLyvDE.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9LPwJ1u8ZBJDRotUp4C7ICJ2fzAgnQaHh6iTxAElgh4.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9yZNL-Dnn_jptlcXDI-O7p8Y4NwxlDYxgJuHKBgM1dU.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/AtCeTliTtRQr_XhEIFKbNI8STS4puMdjFmx5o5stjnQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/BylU07F4ZHT9Ar6X_KvUvW1CNMNdU_KJtYjXT0czATA.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/C1Zy92VD2Xpzq7HBuHvD3xeputd7_lQSxPo2UtX1W5Q.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/CQpbYts2MA51RR2I9ERmDY0dY30z00jELh2xuJovD3Q.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/D5WYJAXL5-u3RVbFGxwq7J2gD4sYZVwQPWhJFofAipo.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Dw-DuyBJusMgXWmVGSVfGsRU-RosOLzzxTIiyATsTbc.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/DzY9vPV5Lh7Ii_ihokzMXw1Dy9c6tL3YS2-Cdw5j-wg.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/EpURBuSSQ_bzmVbeiAI6QNKn23FF3uC_sHlP8Y6K1hc.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/GVsdL_8CB04VraAQejZ5yHyWYoODwJ-PiDyw_VnWw90.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/GruhA1tMkU4vAvUkmmWXlXslzc8SIG2Ng8iLkGbkfa4.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HRAwJVW86bSUGC4rLf3pfE-T00Qcf7IfP0o352fIXg0.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HWqpPokMZX7-F8pZ_R0Pz2DIwcLaS3lzlbPmJaQn8yw.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/J26Jo3IqNb_QKailyi1A62-8sg-FnDwUKNVaVr0jKjk.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/JRQfyuYiAcF7KmqYR-FhZqhm9TBHg7yW5wXHi8vZztA.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/KIlEFNTqcscnUTymCqB5vGCVIMvbAk7aS26txbx88VY.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LAtwVyUTpAWlgERdMnu98Evv9p_sjFGeyTLEM7DXCgQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LKGqJkoPsV6hUu21PAZb_xrc14OELdJKzVlQjt0Uzm0.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/MFWF_Cz7iSxrlrFqm0HESTvCJk_XcgbgHPT3YOoClJA.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/MGxUMp74x2lSe7bOz9rIqbFB6pcCBojXlH8-vKPVbuU.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/MaXf6MpY4KWsBmX5Sovz40v_wIgRigE8PUz9KsV_xGc.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/NEzFaE5Y7t-wiP_ly0OaKcuXFf8SzzdVf2ZhvlEnckA.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/NFZcSv_g5zKRMCYnX8jIyPP5OXXL8818m75c2QJoK_c.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/NdGQ0O17pVnmrEIkOOewA2SPFXQ7so_qk9ZEZdMTaYg.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/NePX2QhdKEwt6UcpUKh1Pt4kUEiQ3ADOXTuJXkBAY7M.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/OfqWg5SoCpHOR8XVJbnf1o17iJTyVdOkcu0aWJ4necw.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/PY5erDfbWJ7v0MpSQl6Lx9C1DZnjATDPKdzjs3v02GU.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/PjzOCx9qa-CNgtm8PFv0lCcRexooD6MlBF4XZ-PHXdo.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/QC4SCuhZeFrJrutxIeNamdltRIB8x8cTZPdLVXlOkX4.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Q_AVKunF7KBB-iiZ8P_9wjqUOo6o-HDzPosGrGrxpXs.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/QpYeSirw33TrEHJwSyW8u_CY183Suu4Wmpvgip4FhAY.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/RbfwLchr_l-LtAM7gk9onOTVY3qQyChUrzo6w9q6an8.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/V5nnfAivxLHBkF21PAP624OS99Df1EJxTAWTttoUXlQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/VMnt2oNeViJzWKWH0s9aqRNfvO7GqoUCfH15SBKUkxM.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/VapeKF0n0myzk8VN-BNMW4qCe93e1879mkEkocG7ymI.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/X3gNcJy85CGLFf_W10hnLOZHvBy2qxA3IHDoCTMBsy4.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Y4rbu-IcL54gklNHGlgaxcqs_iQgE2smBZ6ZPmEDK78.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Z-lByEJf_u2hqGATHTwdLzdLpDqqMFenWI01JXE_PGE.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZhqD-EKl_U1S1mkDWYcW423a3-49GhN9ekGaoghKGJc.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Ztm_GA835w0FeRS-Mjfk45ssKFydDebau0-mMccLv4Q.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/aext7yQ1tC6DW30jToxnq87sklGqlhlZWflZ3Dgdczw.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/bPhvH2L4lJk0dVvrsLBlvdcJhdKt8x9RhIzM6TdZK1I.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/bWdBbSJ-8yTmfQhuCNtVgHTr_5t1BjhrJF-6dvot9K8.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/bfJcyXtvEs7I6u_NHWVqANdUOsjdtyCsl3kQf8slSNg.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/cGOON7qWTmVb0CU79sYn4JdFiT71tIfJW7nkEExmOiE.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/dV3jTWklLN0vWvAwOalDF3-iO8_1ZaSXyPBftH7Zajk.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/dc2uLeO68ChQlyAv515rJm6cJuH3yluSicQfKTnXBTE.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/eDvdPBf0aDgNvfIkB1-dvQYfVuHbG2Pbo3Uk8Sg0nag.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/enqaXWMrpgXgsGodQZKC1uRgauDSUxbos0J9o_4Yt3I.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/fFt3rC4wH8cMsnvQUcAT1rx2FX9b-j4fhn4Z1fkT42s.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/gvlm0vmUeN9tRyyRNaWCztvTq2pafE3NVjBLMHBBCUY.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/j51wtYtrCUs4R5RtoLM6BFDLJCGtwjPyVxvrghVwCKc.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/kNc92xE_8hJB758tIoM9xUiF1HcJPTCZRORiBxs7hKI.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/kmN-qohaDNpU8X8rq03ju50g_o09-49trJ9W95bEsBk.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ktLG9BYQe4im4JsFUtf3V14tWGTv6nt9hTAyreqDHQw.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/l5JxjRujcL8oPdN99DJBnVM7PObhk9VgvPZ0pK61X8E.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/lGMutj_qyEaM3x1QdjTK93OeQ6DKvCcTj5jLLlwUUEA.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/lX3IvOvo4Uc0-CbzNwocsDA5YA0pCFzyidNNAILARLQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/mQhyR98m5F6JlyhPFEQMkBs19ycMnZxAfTppltk7yZs.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/mjELJvJ-Mfd-MkPOrFfwf-qBOAkrHQSicYOdbeMDTAU.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/nqWnjOVamRDs6M_szDI7UFPQL7qwt1kjpphbw3OlaVM.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/oxSZRmCfjRs_xcXVLwHDP97lPMXLnUy1XzE2iSDJmf4.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pvDSvxSg9ZUtIpHcDvJNLuGL1PY-c4i3QgtpBz_MDKU.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/q2LCL-IdFXv0QYy7zINFVS9AZiy-zevl9KzahK1HhPQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/qQIozQLMZWLon-Z_PsiNtWElU9NXdgorUh-69NwsjLk.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/qtCrDrCCgh5_kcZlXTWOotnUExoY1A08cXu69IsWxjQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/rk9iZYWQrjxawGjUdnPbzE0wP8PgCK4ZrUsqRnYQo_s.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/s0DvAZOohy3BLrrBdYLBFaTI1zuPYmLSp8_0p-kpaSg.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/sXytxfuO9aNBLY8A1RLWrFxw-ltOmIjBtVBRlxJp94Y.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/sh0H7OdNcHH0toZiNOxTWcleR3PMgENZ5jEsxV2IOfM.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/stB1cMvEiJ0p6wwgTu85fkuQJlVGVsNJ9BIY6CcV-Xc.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tdTD0IXwaELTmpKcXyGiDGPX1MOOqLshrcTAejT0-rg.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/trNThGe9QEdWorvOlYHuY-q7ZowRU0pBL9h_C7tmow8.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tvuuof25WSYmy6ovpL7o74pHKBKk3lX0Mvgi_mjP8Pc.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/uGHVhvpno292scQRlBP4c4DWSWtTy_f3s-vB6KMISXM.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/uK5XBFLkyQv9ciZDP-xaEFCFHM7TAfaO8W0PaXaUHoU.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ue89xOUCuBT_QFBZrwyGU4542ZeJjwzBgvqa-3IDM1Y.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/vk1Ef3fC_iwVqn_zrfaSbgSI0fC3c54G80iYq2iMOuY.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/vqklEDA4aB8n_x061GyuUp5MQNfIWoox_-dh-7C_Qgw.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/vxQDA-heflbDCBbymrvO6u3R1Qro8P4s-UWDDloBfNc.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/w0iqNBPl2PXb1i9rQK9jbyX22ZSipTNJcMsqUpHYihA.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/w_fIw1xAo2ncIjDFQSCpbj-24IIjj6ghtW6_lSR02bk.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zDnd-vkdSFnhkbJL00kKfvnxK2PQ7MM3tszAsQWtIZI.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zJpXEKLmLBLsx2vRnaVOJJ6ourdoqR0t0AF7rvG1gVk.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zZi6jm7vzlkFBhziu-76n61qUzU4_TvtHZ4G9WlK_UA.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/z_n6U0juStmQsvliwcmAyoAL_c79T35cAp1aAKG7OFQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zjeDxrvxlto6suepUXrhQ_zbjzxXIhih-z3jT4QgiQA.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zn9cgZG1VFaoAT1Fpb7IwJ0pPPAJ23OycKdf1JOcFT8.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zrnmM9rBa9CBCEP1mA8bx-cFFCz_zaX3jPoj0MYDfyk.cache +1 -0
- data/test/integration/navigation_test.rb +10 -10
- data/test/models/appt/appointment_test.rb +10 -9
- data/test/models/appt/appointment_type_test.rb +10 -0
- data/test/models/appt/block_test.rb +10 -9
- data/test/models/appt/calendar_event_test.rb +10 -9
- data/test/models/appt/calendar_test.rb +10 -9
- data/test/models/appt/external_calendar_test.rb +10 -0
- data/test/support/ics/all-day.ics +39 -0
- data/test/support/ics/free-busy.ics +34 -0
- data/test/support/ics/multi-day.ics +40 -0
- data/test/support/ics/recurrence.ics +40 -0
- data/test/support/ics/singular.ics +38 -0
- data/test/test_helper.rb +23 -22
- data/test/unit/icalendar_expander_test.rb +95 -0
- metadata +394 -125
- data/README.rdoc +0 -3
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/fixtures/appt/appointments.yml +0 -11
- data/test/fixtures/appt/blocks.yml +0 -11
- data/test/fixtures/appt/calendars.yml +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bd9d3c238759831b0e0b2e11b649487dde4fa52a
|
4
|
+
data.tar.gz: 20aff14f606eabddb17ce5312651c565f354d8cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c205ea92a9ea93884a39fc715f65960a66766badc0985ef02257677e6874f92124ea5dee73417380e63f7f0f4c4bdd8545e6d502482ac389dbab8e8136bbbed
|
7
|
+
data.tar.gz: e126822c965078e80c7988921a10bc1fb08d24feac98fc7b966deb5f418d370a15ee27d9ed3bfded5f6c9265c8941f3b2edab4cb8abbaaa4e3be050ebc4ca834
|
data/MIT-LICENSE
CHANGED
@@ -1,20 +1,20 @@
|
|
1
|
-
Copyright 2015
|
2
|
-
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
-
a copy of this software and associated documentation files (the
|
5
|
-
"Software"), to deal in the Software without restriction, including
|
6
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
-
permit persons to whom the Software is furnished to do so, subject to
|
9
|
-
the following conditions:
|
10
|
-
|
11
|
-
The above copyright notice and this permission notice shall be
|
12
|
-
included in all copies or substantial portions of the Software.
|
13
|
-
|
14
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
1
|
+
Copyright 2015
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
CHANGED
@@ -1,37 +1,34 @@
|
|
1
|
-
begin
|
2
|
-
require 'bundler/setup'
|
3
|
-
rescue LoadError
|
4
|
-
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
-
end
|
6
|
-
|
7
|
-
require 'rdoc/task'
|
8
|
-
|
9
|
-
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
-
rdoc.rdoc_dir = 'rdoc'
|
11
|
-
rdoc.title = 'Appt'
|
12
|
-
rdoc.options << '--line-numbers'
|
13
|
-
rdoc.rdoc_files.include('README.rdoc')
|
14
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
-
end
|
16
|
-
|
17
|
-
APP_RAKEFILE = File.expand_path(
|
18
|
-
load 'rails/tasks/engine.rake'
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
t.
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
task default: :test
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'Appt'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.rdoc')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
APP_RAKEFILE = File.expand_path('../test/dummy/Rakefile', __FILE__)
|
18
|
+
load 'rails/tasks/engine.rake'
|
19
|
+
|
20
|
+
load 'rails/tasks/statistics.rake'
|
21
|
+
|
22
|
+
Bundler::GemHelper.install_tasks
|
23
|
+
|
24
|
+
require 'rake/testtask'
|
25
|
+
|
26
|
+
Rake::TestTask.new(:test) do |t|
|
27
|
+
t.libs << 'lib'
|
28
|
+
t.libs << 'test'
|
29
|
+
t.pattern = 'test/**/*_test.rb'
|
30
|
+
t.verbose = false
|
31
|
+
end
|
32
|
+
|
33
|
+
task default: :test
|
34
|
+
|
@@ -1,2 +1,2 @@
|
|
1
|
-
//= require jquery
|
2
|
-
//= require bootstrap-sprockets
|
1
|
+
//= require jquery
|
2
|
+
//= require bootstrap-sprockets
|
@@ -0,0 +1,20 @@
|
|
1
|
+
.calendar {
|
2
|
+
table-layout: fixed;
|
3
|
+
|
4
|
+
th,td {
|
5
|
+
width: 14.2857%;
|
6
|
+
h3 {
|
7
|
+
margin: 0 10px 10px 0;
|
8
|
+
}
|
9
|
+
}
|
10
|
+
|
11
|
+
.prev-month, .next-month {
|
12
|
+
background-color: #f5f5f5;
|
13
|
+
color: #cccccc;
|
14
|
+
}
|
15
|
+
|
16
|
+
.today {
|
17
|
+
background-color: $state-info-bg;
|
18
|
+
color: $state-info-text;
|
19
|
+
}
|
20
|
+
}
|
@@ -1,6 +1,56 @@
|
|
1
|
-
require_dependency
|
2
|
-
|
3
|
-
module Appt
|
4
|
-
class CalendarsController < BaseController
|
5
|
-
|
6
|
-
|
1
|
+
require_dependency 'appt/base_controller'
|
2
|
+
|
3
|
+
module Appt
|
4
|
+
class CalendarsController < BaseController
|
5
|
+
before_action :set_new_calendar, only: [:new, :create]
|
6
|
+
before_action :set_calendar, only: [:show, :edit, :update]
|
7
|
+
|
8
|
+
def index
|
9
|
+
@calendars = Calendar.order(name: :asc).page(params[:page])
|
10
|
+
end
|
11
|
+
|
12
|
+
def new
|
13
|
+
end
|
14
|
+
|
15
|
+
def create
|
16
|
+
@calendar.attributes = calendar_params
|
17
|
+
|
18
|
+
if @calendar.save
|
19
|
+
redirect_to calendar_path(@calendar), notice: 'Your calendar was created.'
|
20
|
+
else
|
21
|
+
render :new
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def show
|
26
|
+
end
|
27
|
+
|
28
|
+
def edit
|
29
|
+
end
|
30
|
+
|
31
|
+
def update
|
32
|
+
@calendar.attributes = calendar_params
|
33
|
+
|
34
|
+
if @calendar.save
|
35
|
+
redirect_to calendar_path(@location), notice: 'Your calendar was updated.'
|
36
|
+
else
|
37
|
+
render :edit
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def calendar_params
|
44
|
+
params[:calendar].try(:permit, :name, :availability_text, :timezone_name) || {}
|
45
|
+
end
|
46
|
+
|
47
|
+
def set_new_calendar
|
48
|
+
@calendar = Calendar.new
|
49
|
+
end
|
50
|
+
|
51
|
+
def set_calendar
|
52
|
+
@calendar = Calendar.find(params[:id])
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require_dependency 'appt/base_controller'
|
2
|
+
|
3
|
+
module Appt
|
4
|
+
class ExternalCalendarsController < BaseController
|
5
|
+
before_action :set_external_calendar, only: [:show, :edit, :update]
|
6
|
+
|
7
|
+
def new
|
8
|
+
@external_calendar = ExternalCalendar.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def create
|
12
|
+
@external_calendar = ExternalCalendar.new(create_params)
|
13
|
+
@external_calendar.sync_metadata
|
14
|
+
if @external_calendar.save
|
15
|
+
redirect_to external_calendar_path(@external_calendar), notice: 'Your external calendar was created.'
|
16
|
+
else
|
17
|
+
render :new
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def show
|
22
|
+
@calendars = @external_calendar.calendars.order(:name).page(params[:calendars_page])
|
23
|
+
@blocks = @external_calendar.blocks.includes(:calendar).order(:day, :start, :end).page(params[:blocks_page])
|
24
|
+
end
|
25
|
+
|
26
|
+
def edit
|
27
|
+
end
|
28
|
+
|
29
|
+
def update
|
30
|
+
method = params[:method]
|
31
|
+
notice = 'Your external calendar was updated.'
|
32
|
+
|
33
|
+
case method
|
34
|
+
when 'sync'
|
35
|
+
@target_calendar = Calendar.find_by_id(params[:external_calendar_sync][:calendar_id])
|
36
|
+
|
37
|
+
if @target_calendar
|
38
|
+
@external_calendar.sync @target_calendar
|
39
|
+
notice = "Your external calendar's blocks were refreshed."
|
40
|
+
else
|
41
|
+
flash.alert = 'You must select a target calendar.'
|
42
|
+
end
|
43
|
+
when 'sync_metadata'
|
44
|
+
@external_calendar.sync_metadata
|
45
|
+
notice = "Your external calendar's metadata was refreshed."
|
46
|
+
else
|
47
|
+
@external_calendar = update_params
|
48
|
+
end
|
49
|
+
|
50
|
+
if @external_calendar.save
|
51
|
+
redirect_to external_calendar_path(@external_calendar), notice: notice
|
52
|
+
else
|
53
|
+
render :show
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def index
|
58
|
+
@external_calendars = ExternalCalendar.order(name: :asc).page(params[:page])
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def set_external_calendar
|
64
|
+
@external_calendar = ExternalCalendar.find(params[:id])
|
65
|
+
end
|
66
|
+
|
67
|
+
def create_params
|
68
|
+
params.require(:external_calendar).permit(:url, :name)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
@@ -1,20 +1,39 @@
|
|
1
|
-
module Appt
|
2
|
-
module ApplicationHelper
|
3
|
-
def title(title = nil)
|
4
|
-
if title
|
5
|
-
content_for(:title)
|
6
|
-
else
|
7
|
-
content_for?(:title) ? content_for(:title) : nil
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
1
|
+
module Appt
|
2
|
+
module ApplicationHelper
|
3
|
+
def title(title = nil)
|
4
|
+
if title
|
5
|
+
content_for(:title){ title }
|
6
|
+
else
|
7
|
+
content_for?(:title) ? content_for(:title) : nil
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def breadcrumbs(&block)
|
12
|
+
content_for(:breadcrumbs) do
|
13
|
+
capture do
|
14
|
+
content_tag(:ol, class: 'breadcrumb') do
|
15
|
+
concat breadcrumb 'Home', root_path
|
16
|
+
concat capture(&block) if block_given?
|
17
|
+
concat content_tag(:li, title, class: 'active')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def breadcrumb(name, options, html_options = nil, &block)
|
24
|
+
content_tag(:li) do
|
25
|
+
concat link_to name, options, html_options, &block
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def time_ago_tag(value)
|
30
|
+
if value.nil?
|
31
|
+
nil
|
32
|
+
else
|
33
|
+
# TODO: i18n?
|
34
|
+
time_tag(value, "#{time_ago_in_words(value)} ago", title: value.strftime('%m/%d/%Y %I:%M%p'))
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -1,4 +1,5 @@
|
|
1
|
-
module Appt
|
2
|
-
module CalendarsHelper
|
3
|
-
end
|
4
|
-
end
|
1
|
+
module Appt
|
2
|
+
module CalendarsHelper
|
3
|
+
end
|
4
|
+
end
|
5
|
+
|
data/app/mailers/base_mailer.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
module Appt
|
2
|
-
class Appointment <
|
3
|
-
end
|
4
|
-
end
|
1
|
+
module Appt
|
2
|
+
class Appointment < CalendarEvent
|
3
|
+
end
|
4
|
+
end
|
5
|
+
|
data/app/models/appt/block.rb
CHANGED
data/app/models/appt/calendar.rb
CHANGED
@@ -1,4 +1,38 @@
|
|
1
|
-
module Appt
|
2
|
-
class Calendar < ActiveRecord::Base
|
3
|
-
|
4
|
-
|
1
|
+
module Appt
|
2
|
+
class Calendar < ActiveRecord::Base
|
3
|
+
serialize :availability, WorkhoursSerializer
|
4
|
+
|
5
|
+
has_many :appointments, dependent: :destroy
|
6
|
+
has_many :blocks, dependent: :destroy
|
7
|
+
has_many :external_calendars, ->{ distinct }, through: :blocks
|
8
|
+
|
9
|
+
validates :timezone_name, presence: true, inclusion: { in: ActiveSupport::TimeZone.all.map(&:name).freeze }
|
10
|
+
validates :name, :availability, presence: true
|
11
|
+
|
12
|
+
def availability_text
|
13
|
+
availability.try(:export).try(:[], :hours).try(:join, "\n")
|
14
|
+
end
|
15
|
+
|
16
|
+
def availability_text=(value)
|
17
|
+
value ||= ''
|
18
|
+
self.availability = Workhours::Week.new(hours: value.split("\n").reject(&:blank?).map(&:strip))
|
19
|
+
end
|
20
|
+
|
21
|
+
def timezone
|
22
|
+
ActiveSupport::TimeZone[timezone_name]
|
23
|
+
end
|
24
|
+
|
25
|
+
def local_time_of_day(date, tod)
|
26
|
+
date.at(tod, timezone)
|
27
|
+
end
|
28
|
+
|
29
|
+
def now
|
30
|
+
timezone.now
|
31
|
+
end
|
32
|
+
|
33
|
+
def today
|
34
|
+
now.to_date
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|