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
data/lib/appt/configuration.rb
CHANGED
@@ -1,18 +1,30 @@
|
|
1
1
|
module Appt
|
2
2
|
# Defines constants and methods related to configuration
|
3
3
|
module Configuration
|
4
|
-
VALID_OPTIONS_KEYS = [
|
5
|
-
].freeze
|
6
|
-
|
7
4
|
UNKNOWN_CLASSES = {
|
8
|
-
parent_mailer: ->
|
9
|
-
parent_controller: ->
|
10
|
-
user_class: ->
|
5
|
+
parent_mailer: ->{ ActionMailer::Base },
|
6
|
+
parent_controller: ->{ ::ApplicationController },
|
7
|
+
user_class: ->{ nil },
|
11
8
|
}
|
12
9
|
|
13
|
-
|
10
|
+
UNKNOWN_CLASSES.each do |key, _default|
|
11
|
+
attr_accessor key.to_sym
|
12
|
+
|
13
|
+
define_method(key) do
|
14
|
+
value = instance_variable_get("@#{key}") || UNKNOWN_CLASSES[key.to_sym]
|
15
|
+
value = value.call if value.respond_to?(:call)
|
16
|
+
c = force_to_constant(value)
|
17
|
+
c
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
VALID_OPTIONS_KEYS = [
|
22
|
+
].freeze
|
23
|
+
|
24
|
+
attr_accessor(*VALID_OPTIONS_KEYS)
|
14
25
|
|
15
|
-
# When this module is extended, set all configuration options to their
|
26
|
+
# When this module is extended, set all configuration options to their
|
27
|
+
# default values
|
16
28
|
def self.extended(base)
|
17
29
|
base.reset
|
18
30
|
end
|
@@ -27,28 +39,17 @@ module Appt
|
|
27
39
|
self
|
28
40
|
end
|
29
41
|
|
30
|
-
|
31
|
-
attr_accessor key.to_sym
|
32
|
-
end
|
42
|
+
private
|
33
43
|
|
34
|
-
|
35
|
-
|
36
|
-
value =
|
37
|
-
|
38
|
-
|
39
|
-
c
|
44
|
+
def force_to_constant(value)
|
45
|
+
if value.is_a?(Class)
|
46
|
+
value = value.name
|
47
|
+
elsif value.is_a?(Symbol)
|
48
|
+
value = value.to_s
|
40
49
|
end
|
41
|
-
end
|
42
|
-
|
43
|
-
private
|
44
|
-
def force_to_constant(value)
|
45
|
-
if value.is_a?(Class)
|
46
|
-
value = value.name
|
47
|
-
elsif value.is_a?(Symbol)
|
48
|
-
value = value.to_s
|
49
|
-
end
|
50
50
|
|
51
|
-
|
52
|
-
|
51
|
+
value.try(:constantize)
|
52
|
+
end
|
53
53
|
end
|
54
54
|
end
|
55
|
+
|
data/lib/appt/engine.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
module Appt
|
2
|
-
class Engine < ::Rails::Engine
|
3
|
-
isolate_namespace Appt
|
4
|
-
end
|
5
|
-
end
|
1
|
+
module Appt
|
2
|
+
class Engine < ::Rails::Engine
|
3
|
+
isolate_namespace Appt
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Appt
|
2
|
+
class IcalendarExpander
|
3
|
+
attr_reader :timezone, :calendars, :include_transparent
|
4
|
+
alias_method :include_transparent?, :include_transparent
|
5
|
+
|
6
|
+
def initialize(timezone, calendars, options = {})
|
7
|
+
@timezone = timezone
|
8
|
+
@calendars = calendars
|
9
|
+
@include_transparent = options.delete(:include_transparent) || false
|
10
|
+
end
|
11
|
+
|
12
|
+
def events(min_date, max_date, &block)
|
13
|
+
return enum_for(:events, min_date, max_date) unless block_given?
|
14
|
+
|
15
|
+
@calendars.each do |cal|
|
16
|
+
cal.events.each do |event|
|
17
|
+
event.occurrences_between(min_date, max_date).each do |occurrence|
|
18
|
+
normalize_event(event, occurrence, min_date, max_date, &block)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
|
26
|
+
def all_day?(event)
|
27
|
+
event.dtstart.is_a?(Icalendar::Values::Date) &&
|
28
|
+
event.dtend.is_a?(Icalendar::Values::Date)
|
29
|
+
end
|
30
|
+
|
31
|
+
def normalize_datetime(datetime, all_day)
|
32
|
+
if all_day
|
33
|
+
datetime.to_date
|
34
|
+
else
|
35
|
+
datetime.in_time_zone(@timezone).to_datetime
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def normalize_event(event, occurrence, min_date, max_date, &block)
|
40
|
+
return if event.transp == 'TRANSPARENT' && !@include_transparent
|
41
|
+
|
42
|
+
all_day = all_day?(event)
|
43
|
+
|
44
|
+
s = normalize_datetime(occurrence.start_time, all_day)
|
45
|
+
e = normalize_datetime(occurrence.end_time, all_day)
|
46
|
+
|
47
|
+
days = (s..e).map(&:to_date).select{ |d| d >= min_date && d < max_date }
|
48
|
+
|
49
|
+
days.each_with_index do |day, i|
|
50
|
+
block.call(
|
51
|
+
name: event.summary.to_s,
|
52
|
+
day: day,
|
53
|
+
start: i == 0 ? s.to_time_of_day : Tod::TimeOfDay.parse('midnight'),
|
54
|
+
end: i == days.size - 1 ? e.to_time_of_day : Tod::TimeOfDay.parse('midnight'),
|
55
|
+
external_id: event.uid.to_s,
|
56
|
+
)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
data/lib/appt/version.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
-
module Appt
|
2
|
-
VERSION =
|
3
|
-
end
|
1
|
+
module Appt
|
2
|
+
VERSION = '0.0.1.beta.3'
|
3
|
+
end
|
4
|
+
|
@@ -1,5 +1,5 @@
|
|
1
1
|
class BootstrapMonthCalendar < SimpleCalendar::MonthCalendar
|
2
|
-
def initialize_with_bootstrap(view_context, opts={})
|
2
|
+
def initialize_with_bootstrap(view_context, opts = {})
|
3
3
|
opts.reverse_merge!(
|
4
4
|
table: { class: 'table calendar' },
|
5
5
|
header: { class: 'pagination' },
|
@@ -12,7 +12,7 @@ class BootstrapMonthCalendar < SimpleCalendar::MonthCalendar
|
|
12
12
|
alias_method_chain :initialize, :bootstrap
|
13
13
|
|
14
14
|
def default_title_with_bootstrap
|
15
|
-
->(start_date)
|
15
|
+
->(start_date){ content_tag(:li, content_tag(:span, month_name(start_date)), class: 'disabled') }
|
16
16
|
end
|
17
17
|
alias_method_chain :default_title, :bootstrap
|
18
18
|
|
@@ -28,10 +28,11 @@ class BootstrapMonthCalendar < SimpleCalendar::MonthCalendar
|
|
28
28
|
alias_method_chain :render_header, :bootstrap
|
29
29
|
|
30
30
|
def bootstrap_previous_link
|
31
|
-
->(param, date_range)
|
31
|
+
->(param, date_range){ content_tag :li, link_to(raw('«'), param => date_range.first - 1.day) }
|
32
32
|
end
|
33
33
|
|
34
34
|
def bootstrap_next_link
|
35
|
-
->(param, date_range)
|
35
|
+
->(param, date_range){ content_tag :li, link_to(raw('»'), param => date_range.last + 1.day) }
|
36
36
|
end
|
37
37
|
end
|
38
|
+
|
data/lib/tasks/appt_tasks.rake
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
# desc "Explaining what the task does"
|
2
|
-
# task :appt do
|
3
|
-
# # Task goes here
|
4
|
-
# end
|
1
|
+
# desc "Explaining what the task does"
|
2
|
+
# task :appt do
|
3
|
+
# # Task goes here
|
4
|
+
# end
|
5
|
+
|
data/lib/workhours_serializer.rb
CHANGED
data/test/appt_test.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class ApptTest < ActiveSupport::TestCase
|
4
|
-
test
|
5
|
-
assert_kind_of Module, Appt
|
6
|
-
end
|
7
|
-
end
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ApptTest < ActiveSupport::TestCase
|
4
|
+
test 'truth' do
|
5
|
+
assert_kind_of Module, Appt
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
@@ -1,13 +1,14 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
module Appt
|
4
|
-
class CalendarsControllerTest < ActionController::TestCase
|
5
|
-
setup do
|
6
|
-
@routes = Engine.routes
|
7
|
-
end
|
8
|
-
|
9
|
-
# test "the truth" do
|
10
|
-
# assert true
|
11
|
-
# end
|
12
|
-
end
|
13
|
-
end
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Appt
|
4
|
+
class CalendarsControllerTest < ActionController::TestCase
|
5
|
+
setup do
|
6
|
+
@routes = Engine.routes
|
7
|
+
end
|
8
|
+
|
9
|
+
# test "the truth" do
|
10
|
+
# assert true
|
11
|
+
# end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
data/test/dummy/README.rdoc
CHANGED
@@ -1,28 +1,28 @@
|
|
1
|
-
== README
|
2
|
-
|
3
|
-
This README would normally document whatever steps are necessary to get the
|
4
|
-
application up and running.
|
5
|
-
|
6
|
-
Things you may want to cover:
|
7
|
-
|
8
|
-
* Ruby version
|
9
|
-
|
10
|
-
* System dependencies
|
11
|
-
|
12
|
-
* Configuration
|
13
|
-
|
14
|
-
* Database creation
|
15
|
-
|
16
|
-
* Database initialization
|
17
|
-
|
18
|
-
* How to run the test suite
|
19
|
-
|
20
|
-
* Services (job queues, cache servers, search engines, etc.)
|
21
|
-
|
22
|
-
* Deployment instructions
|
23
|
-
|
24
|
-
* ...
|
25
|
-
|
26
|
-
|
27
|
-
Please feel free to use a different markup language if you do not plan to run
|
28
|
-
<tt>rake doc:app</tt>.
|
1
|
+
== README
|
2
|
+
|
3
|
+
This README would normally document whatever steps are necessary to get the
|
4
|
+
application up and running.
|
5
|
+
|
6
|
+
Things you may want to cover:
|
7
|
+
|
8
|
+
* Ruby version
|
9
|
+
|
10
|
+
* System dependencies
|
11
|
+
|
12
|
+
* Configuration
|
13
|
+
|
14
|
+
* Database creation
|
15
|
+
|
16
|
+
* Database initialization
|
17
|
+
|
18
|
+
* How to run the test suite
|
19
|
+
|
20
|
+
* Services (job queues, cache servers, search engines, etc.)
|
21
|
+
|
22
|
+
* Deployment instructions
|
23
|
+
|
24
|
+
* ...
|
25
|
+
|
26
|
+
|
27
|
+
Please feel free to use a different markup language if you do not plan to run
|
28
|
+
<tt>rake doc:app</tt>.
|
data/test/dummy/Rakefile
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
2
|
-
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
3
|
-
|
4
|
-
require File.expand_path('../config/application', __FILE__)
|
5
|
-
|
6
|
-
Rails.application.load_tasks
|
1
|
+
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
2
|
+
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
3
|
+
|
4
|
+
require File.expand_path('../config/application', __FILE__)
|
5
|
+
|
6
|
+
Rails.application.load_tasks
|
7
|
+
|
@@ -1,14 +1,14 @@
|
|
1
|
-
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
-
// listed below.
|
3
|
-
//
|
4
|
-
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
-
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
|
6
|
-
//
|
7
|
-
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
-
// compiled file.
|
9
|
-
//
|
10
|
-
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
|
11
|
-
// about supported directives.
|
12
|
-
//
|
13
|
-
//= require appt/application
|
14
|
-
//= require_tree .
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file.
|
9
|
+
//
|
10
|
+
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
|
11
|
+
// about supported directives.
|
12
|
+
//
|
13
|
+
//= require appt/application
|
14
|
+
//= require_tree .
|
@@ -1,16 +1,16 @@
|
|
1
|
-
/*
|
2
|
-
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
-
* listed below.
|
4
|
-
*
|
5
|
-
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
-
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
-
*
|
8
|
-
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
-
* compiled file so the styles you add here take precedence over styles defined in any styles
|
10
|
-
* defined in the other CSS/SCSS files in this directory. It is generally better to create a new
|
11
|
-
* file per style scope.
|
12
|
-
*
|
13
|
-
*= require appt/application
|
14
|
-
*= require_tree .
|
15
|
-
*= require_self
|
16
|
-
*/
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any styles
|
10
|
+
* defined in the other CSS/SCSS files in this directory. It is generally better to create a new
|
11
|
+
* file per style scope.
|
12
|
+
*
|
13
|
+
*= require appt/application
|
14
|
+
*= require_tree .
|
15
|
+
*= require_self
|
16
|
+
*/
|
@@ -1,5 +1,6 @@
|
|
1
|
-
class ApplicationController < ActionController::Base
|
2
|
-
# Prevent CSRF attacks by raising an exception.
|
3
|
-
# For APIs, you may want to use :null_session instead.
|
4
|
-
protect_from_forgery with: :exception
|
5
|
-
end
|
1
|
+
class ApplicationController < ActionController::Base
|
2
|
+
# Prevent CSRF attacks by raising an exception.
|
3
|
+
# For APIs, you may want to use :null_session instead.
|
4
|
+
protect_from_forgery with: :exception
|
5
|
+
end
|
6
|
+
|
@@ -1,2 +1,3 @@
|
|
1
|
-
module ApplicationHelper
|
2
|
-
end
|
1
|
+
module ApplicationHelper
|
2
|
+
end
|
3
|
+
|
@@ -1,14 +1,14 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<title>Dummy</title>
|
5
|
-
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
|
6
|
-
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
|
7
|
-
<%= csrf_meta_tags %>
|
8
|
-
</head>
|
9
|
-
<body>
|
10
|
-
|
11
|
-
<%= yield %>
|
12
|
-
|
13
|
-
</body>
|
14
|
-
</html>
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Dummy</title>
|
5
|
+
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
|
6
|
+
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
|
7
|
+
<%= csrf_meta_tags %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<%= yield %>
|
12
|
+
|
13
|
+
</body>
|
14
|
+
</html>
|