date_book 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (203) hide show
  1. checksums.yaml +7 -0
  2. data/.idea/vcs.xml +6 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +23 -0
  5. data/.rubocop_todo.yml +7 -0
  6. data/.ruby-gemset +1 -0
  7. data/.ruby-version +1 -0
  8. data/.travis.yml +3 -0
  9. data/Gemfile +94 -0
  10. data/Gemfile.lock +385 -0
  11. data/LICENSE.txt +20 -0
  12. data/README.md +64 -0
  13. data/Rakefile +30 -0
  14. data/VERSION +1 -0
  15. data/app/assets/images/date_book/.keep +0 -0
  16. data/app/assets/javascripts/date_book.js +21 -0
  17. data/app/assets/javascripts/date_book/calendar_events.js +57 -0
  18. data/app/assets/javascripts/date_book/event_form.js +31 -0
  19. data/app/assets/javascripts/date_book/popovers.js +3 -0
  20. data/app/assets/javascripts/date_book/wysiwyg.js +8 -0
  21. data/app/assets/stylesheets/date_book.css.scss +46 -0
  22. data/app/controllers/date_book/calendars_controller.rb +60 -0
  23. data/app/controllers/date_book/date_book_controller.rb +24 -0
  24. data/app/controllers/date_book/events_controller.rb +105 -0
  25. data/app/controllers/date_book/graphql_controller.rb +35 -0
  26. data/app/graphql/date_book_schema.rb +18 -0
  27. data/app/graphql/types/calendar_type.rb +14 -0
  28. data/app/graphql/types/date_time_type.rb +7 -0
  29. data/app/graphql/types/event_occurrence_type.rb +11 -0
  30. data/app/graphql/types/event_type.rb +19 -0
  31. data/app/graphql/types/mutation_type.rb +5 -0
  32. data/app/graphql/types/profile_type.rb +7 -0
  33. data/app/graphql/types/query_type.rb +57 -0
  34. data/app/helpers/date_book/application_helper.rb +35 -0
  35. data/app/helpers/date_book/calendar_helper.rb +4 -0
  36. data/app/helpers/date_book/events_helper.rb +42 -0
  37. data/app/jobs/date_book/application_job.rb +6 -0
  38. data/app/mailers/date_book/application_mailer.rb +9 -0
  39. data/app/views/date_book/application/_all_day_checkbox.html.haml +1 -0
  40. data/app/views/date_book/application/_date_range.html.haml +8 -0
  41. data/app/views/date_book/application/_wysiwyg.html.haml +65 -0
  42. data/app/views/date_book/calendars/_form.html.haml +6 -0
  43. data/app/views/date_book/calendars/edit.html.haml +5 -0
  44. data/app/views/date_book/calendars/index.html.haml +28 -0
  45. data/app/views/date_book/calendars/new.html.haml +5 -0
  46. data/app/views/date_book/calendars/show.html.haml +28 -0
  47. data/app/views/date_book/events/_event.json.jbuilder +12 -0
  48. data/app/views/date_book/events/_form.html.haml +16 -0
  49. data/app/views/date_book/events/_occurrence_dates.html.haml +11 -0
  50. data/app/views/date_book/events/edit.html.haml +5 -0
  51. data/app/views/date_book/events/fields/_date.html.haml +1 -0
  52. data/app/views/date_book/events/fields/_day.html.haml +1 -0
  53. data/app/views/date_book/events/fields/_day_of_week.html.haml +19 -0
  54. data/app/views/date_book/events/fields/_duration.html.haml +6 -0
  55. data/app/views/date_book/events/fields/_interval.html.haml +1 -0
  56. data/app/views/date_book/events/fields/_time.html.haml +1 -0
  57. data/app/views/date_book/events/index.html.haml +16 -0
  58. data/app/views/date_book/events/new.html.haml +5 -0
  59. data/app/views/date_book/events/popover.html.haml +7 -0
  60. data/app/views/date_book/events/rules/_daily.html.haml +4 -0
  61. data/app/views/date_book/events/rules/_monthly.html.haml +5 -0
  62. data/app/views/date_book/events/rules/_singular.html.haml +4 -0
  63. data/app/views/date_book/events/rules/_weekly.html.haml +5 -0
  64. data/app/views/date_book/events/show.html.haml +16 -0
  65. data/app/views/layouts/_date_book_scripts.html.haml +4 -0
  66. data/app/views/layouts/blank.html.haml +1 -0
  67. data/bin/rails +15 -0
  68. data/config/locales/en.yml +44 -0
  69. data/config/routes.rb +12 -0
  70. data/date_book.gemspec +337 -0
  71. data/db/migrate/20170807133845_create_calendars.rb +11 -0
  72. data/db/migrate/20170807133846_create_events.rb +20 -0
  73. data/db/migrate/20170807133847_create_schedules.rb +25 -0
  74. data/db/migrate/20170807133848_add_fields_to_schedule.rb +6 -0
  75. data/db/migrate/20170807133849_create_event_occurrences.rb +16 -0
  76. data/db/migrate/20170807133850_add_fields_to_event_occurrences.rb +5 -0
  77. data/lib/date_book.rb +40 -0
  78. data/lib/date_book/concerns/ability.rb +27 -0
  79. data/lib/date_book/concerns/acts_as_calendar.rb +29 -0
  80. data/lib/date_book/concerns/acts_as_event.rb +66 -0
  81. data/lib/date_book/concerns/acts_as_event_occurrence.rb +67 -0
  82. data/lib/date_book/concerns/acts_as_ownable.rb +29 -0
  83. data/lib/date_book/concerns/acts_as_owner.rb +18 -0
  84. data/lib/date_book/concerns/acts_as_schedule.rb +44 -0
  85. data/lib/date_book/configuration.rb +43 -0
  86. data/lib/date_book/engine.rb +40 -0
  87. data/lib/date_book/localization.rb +32 -0
  88. data/lib/date_book/version.rb +8 -0
  89. data/lib/generators/date_book/install/install_generator.rb +110 -0
  90. data/lib/generators/date_book/install/templates/app/models/ability.rb +16 -0
  91. data/lib/generators/date_book/install/templates/app/models/calendar.rb +3 -0
  92. data/lib/generators/date_book/install/templates/app/models/event.rb +3 -0
  93. data/lib/generators/date_book/install/templates/app/models/event_occurrence.rb +3 -0
  94. data/lib/generators/date_book/install/templates/app/models/schedule.rb +3 -0
  95. data/lib/generators/date_book/install/templates/config/initializers/date_book.rb +5 -0
  96. data/lib/generators/date_book/utils.rb +25 -0
  97. data/lib/tasks/date_book_tasks.rake +5 -0
  98. data/spec/abilities/calendar_spec.rb +39 -0
  99. data/spec/abilities/event_spec.rb +44 -0
  100. data/spec/controllers/date_book/calendars_controller_spec.rb +259 -0
  101. data/spec/controllers/date_book/events_controller_spec.rb +283 -0
  102. data/spec/dummy/Rakefile +9 -0
  103. data/spec/dummy/app/assets/config/manifest.js +5 -0
  104. data/spec/dummy/app/assets/images/.keep +0 -0
  105. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  106. data/spec/dummy/app/assets/stylesheets/application.css.scss +4 -0
  107. data/spec/dummy/app/assets/stylesheets/bootstrap-everything.scss +54 -0
  108. data/spec/dummy/app/controllers/application_controller.rb +21 -0
  109. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  110. data/spec/dummy/app/helpers/application_helper.rb +4 -0
  111. data/spec/dummy/app/mailers/application_mailer.rb +6 -0
  112. data/spec/dummy/app/models/ability.rb +16 -0
  113. data/spec/dummy/app/models/application_record.rb +5 -0
  114. data/spec/dummy/app/models/calendar.rb +3 -0
  115. data/spec/dummy/app/models/concerns/.keep +0 -0
  116. data/spec/dummy/app/models/event.rb +3 -0
  117. data/spec/dummy/app/models/event_occurrence.rb +3 -0
  118. data/spec/dummy/app/models/role.rb +13 -0
  119. data/spec/dummy/app/models/schedule.rb +3 -0
  120. data/spec/dummy/app/models/user.rb +9 -0
  121. data/spec/dummy/app/views/application/403.html.haml +9 -0
  122. data/spec/dummy/app/views/application/404.html.haml +9 -0
  123. data/spec/dummy/app/views/layouts/application.html.haml +43 -0
  124. data/spec/dummy/app/views/pages/index.html.haml +1 -0
  125. data/spec/dummy/bin/bundle +5 -0
  126. data/spec/dummy/bin/rails +6 -0
  127. data/spec/dummy/bin/rake +6 -0
  128. data/spec/dummy/bin/setup +36 -0
  129. data/spec/dummy/bin/update +31 -0
  130. data/spec/dummy/config.ru +7 -0
  131. data/spec/dummy/config/application.rb +38 -0
  132. data/spec/dummy/config/boot.rb +7 -0
  133. data/spec/dummy/config/cable.yml +9 -0
  134. data/spec/dummy/config/database.yml +25 -0
  135. data/spec/dummy/config/environment.rb +7 -0
  136. data/spec/dummy/config/environments/development.rb +60 -0
  137. data/spec/dummy/config/environments/test.rb +45 -0
  138. data/spec/dummy/config/initializers/application_controller_renderer.rb +7 -0
  139. data/spec/dummy/config/initializers/assets.rb +14 -0
  140. data/spec/dummy/config/initializers/backtrace_silencers.rb +10 -0
  141. data/spec/dummy/config/initializers/bootstrap_leather.rb +9 -0
  142. data/spec/dummy/config/initializers/cookies_serializer.rb +7 -0
  143. data/spec/dummy/config/initializers/date_book.rb +5 -0
  144. data/spec/dummy/config/initializers/devise.rb +277 -0
  145. data/spec/dummy/config/initializers/filter_parameter_logging.rb +6 -0
  146. data/spec/dummy/config/initializers/high_voltage.rb +3 -0
  147. data/spec/dummy/config/initializers/inflections.rb +17 -0
  148. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  149. data/spec/dummy/config/initializers/new_framework_defaults.rb +29 -0
  150. data/spec/dummy/config/initializers/rolify.rb +7 -0
  151. data/spec/dummy/config/initializers/session_store.rb +5 -0
  152. data/spec/dummy/config/initializers/wrap_parameters.rb +17 -0
  153. data/spec/dummy/config/locales/devise.en.yml +64 -0
  154. data/spec/dummy/config/locales/en.yml +23 -0
  155. data/spec/dummy/config/puma.rb +49 -0
  156. data/spec/dummy/config/routes.rb +15 -0
  157. data/spec/dummy/config/secrets.yml +22 -0
  158. data/spec/dummy/config/spring.rb +8 -0
  159. data/spec/dummy/db/migrate/20170728171103_create_users_table.rb +7 -0
  160. data/spec/dummy/db/migrate/20170807134122_add_devise_to_users.rb +49 -0
  161. data/spec/dummy/db/migrate/20170807134128_rolify_create_roles.rb +19 -0
  162. data/spec/dummy/db/migrate/20170807134137_create_calendars.date_book.rb +12 -0
  163. data/spec/dummy/db/migrate/20170807134138_create_events.date_book.rb +21 -0
  164. data/spec/dummy/db/migrate/20170807134139_create_schedules.date_book.rb +26 -0
  165. data/spec/dummy/db/migrate/20170807134140_add_fields_to_schedule.date_book.rb +7 -0
  166. data/spec/dummy/db/migrate/20170807134141_create_event_occurrences.date_book.rb +17 -0
  167. data/spec/dummy/db/migrate/20170807134142_add_fields_to_event_occurrences.date_book.rb +6 -0
  168. data/spec/dummy/db/schema.rb +101 -0
  169. data/spec/dummy/db/seeds.rb +0 -0
  170. data/spec/dummy/db/seeds/calendars.seeds.rb +22 -0
  171. data/spec/dummy/db/seeds/events.seeds.rb +89 -0
  172. data/spec/dummy/db/seeds/users.seeds.rb +16 -0
  173. data/spec/dummy/lib/assets/.keep +0 -0
  174. data/spec/dummy/lib/basic_benchmark.rb +9 -0
  175. data/spec/dummy/log/.keep +0 -0
  176. data/spec/factories/calendars.rb +11 -0
  177. data/spec/factories/events.rb +12 -0
  178. data/spec/factories/roles.rb +5 -0
  179. data/spec/factories/users.rb +9 -0
  180. data/spec/features/calendars_spec.rb +185 -0
  181. data/spec/features/events_spec.rb +201 -0
  182. data/spec/helpers/date_book/calendar_helper_spec.rb +17 -0
  183. data/spec/helpers/date_book/events_helper_spec.rb +17 -0
  184. data/spec/models/calendar_spec.rb +26 -0
  185. data/spec/models/event_spec.rb +67 -0
  186. data/spec/models/role_spec.rb +5 -0
  187. data/spec/rails_helper.rb +116 -0
  188. data/spec/requests/date_book/events_spec.rb +56 -0
  189. data/spec/routing/date_book/calendars_routing_spec.rb +49 -0
  190. data/spec/routing/date_book/events_routing_spec.rb +54 -0
  191. data/spec/spec_helper.rb +102 -0
  192. data/spec/support/controller_behaviors.rb +101 -0
  193. data/spec/support/controller_macros.rb +25 -0
  194. data/spec/support/factory_girl.rb +3 -0
  195. data/spec/support/feature_behaviors.rb +150 -0
  196. data/spec/support/loaded_site.rb +5 -0
  197. data/spec/support/loaded_site/calendars.rb +5 -0
  198. data/spec/support/loaded_site/events.rb +6 -0
  199. data/spec/support/loaded_site/users.rb +5 -0
  200. data/spec/support/request_behaviors.rb +89 -0
  201. data/spec/support/shared_connection.rb +14 -0
  202. data/spec/support/utilities.rb +53 -0
  203. metadata +817 -0
@@ -0,0 +1,35 @@
1
+ module DateBook
2
+ class GraphqlController < DateBookController
3
+ def execute
4
+ variables = ensure_hash(params[:variables])
5
+ query = params[:query]
6
+ operation_name = params[:operationName]
7
+ context = {
8
+ # Query context goes here, for example:
9
+ current_user: current_user,
10
+ }
11
+ result = DateBookSchema.execute(query, variables: variables, context: context, operation_name: operation_name)
12
+ render json: result
13
+ end
14
+
15
+ private
16
+
17
+ # Handle form data, JSON body, or a blank value
18
+ def ensure_hash(ambiguous_param)
19
+ case ambiguous_param
20
+ when String
21
+ if ambiguous_param.present?
22
+ ensure_hash(JSON.parse(ambiguous_param))
23
+ else
24
+ {}
25
+ end
26
+ when Hash, ActionController::Parameters
27
+ ambiguous_param
28
+ when nil
29
+ {}
30
+ else
31
+ raise ArgumentError, "Unexpected parameter: #{ambiguous_param}"
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,18 @@
1
+ DateBookSchema = GraphQL::Schema.define do
2
+ # mutation(Types::MutationType)
3
+ query(Types::QueryType)
4
+ resolve_type ->(type, obj, ctx) do
5
+ case obj
6
+ when Profile
7
+ Types::ProfileType
8
+ when Calendar
9
+ Types::CalendarType
10
+ when Event
11
+ Types::EventType
12
+ when EventOccurrence
13
+ Types::EventOccurrenceType
14
+ else
15
+ raise("Unexpected object: #{obj}")
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ Types::CalendarType = GraphQL::ObjectType.define do
2
+ name "Calendar"
3
+ description "DateBook Calendars"
4
+
5
+ field :id, types.ID
6
+ field :name, types.String
7
+ field :slug, !types.String
8
+ field :description, types.String
9
+ field :css_class, types.String
10
+ field :created_at, Types::DateTimeType
11
+ field :updated_at, Types::DateTimeType
12
+ field :events, types[Types::EventType]
13
+ field :event_occurrences, types[Types::EventOccurrenceType]
14
+ end
@@ -0,0 +1,7 @@
1
+ Types::DateTimeType = GraphQL::ScalarType.define do
2
+ name "DateTime"
3
+ description "Date with Time"
4
+
5
+ coerce_input ->(value, ctx) { Time.at(Float(value)) }
6
+ coerce_result ->(value, ctx) { "#{value.to_date} #{value.strftime('%I:%M %p')}" }
7
+ end
@@ -0,0 +1,11 @@
1
+ Types::EventOccurrenceType = GraphQL::ObjectType.define do
2
+ name "Event Occurrences"
3
+ description "DateBook Event Occurrences"
4
+
5
+ field :id, !types.ID
6
+ field :event, Types::EventType
7
+ field :url, types.String
8
+ field :popover_url, types.String
9
+ field :start, types.String
10
+ field :end, types.String
11
+ end
@@ -0,0 +1,19 @@
1
+ Types::EventType = GraphQL::ObjectType.define do
2
+ name "Event"
3
+ description "DateBook Events"
4
+
5
+ field :id, !types.ID
6
+ field :calendar, Types::CalendarType
7
+ field :name, types.String
8
+ field :slug, types.String
9
+ field :url, types.String
10
+ field :description, types.String
11
+ field :css_class, types.String
12
+ field :start, types.String
13
+ field :end, types.String
14
+ field :duration, types.String
15
+ field :all_day, types.Boolean
16
+
17
+ field :created_at, Types::DateTimeType
18
+ field :updated_at, Types::DateTimeType
19
+ end
@@ -0,0 +1,5 @@
1
+ Types::MutationType = GraphQL::ObjectType.define do
2
+ name "Mutation"
3
+
4
+ # TODO: Add Mutations as fields
5
+ end
@@ -0,0 +1,7 @@
1
+ Types::ProfileType = GraphQL::ObjectType.define do
2
+ name "Profile"
3
+ field :id, types.ID
4
+ field :name, types.String
5
+ field :email, types.String
6
+ field :calendars, types[Types::CalendarType]
7
+ end
@@ -0,0 +1,57 @@
1
+ Types::QueryType = GraphQL::ObjectType.define do
2
+ name "Date Book API"
3
+ # Add root-level fields here.
4
+ # They will be entry points for queries on your schema.
5
+
6
+ # Current user hack // Check GraphQL controller
7
+ field :profile do
8
+ type Types::ProfileType
9
+ description "Current signed in User"
10
+ resolve -> (obj, args, ctx) {
11
+ ctx[:current_user] ? ctx[:current_user] : User.new
12
+ }
13
+ end
14
+
15
+ field :event_occurrences do
16
+ type types[Types::EventOccurrenceType]
17
+ description "Find all event occurrences in range"
18
+ argument :ending_after, types.String # Start date
19
+ argument :starting_before, types.String # End date
20
+ resolve ->(obj, args, ctx) {
21
+ ending_after = (
22
+ args[:ending_after]&.to_datetime ||
23
+ Time.now.beginning_of_month
24
+ )
25
+ starting_before = (
26
+ args[:starting_before]&.to_datetime ||
27
+ Time.now.beginning_of_month.next_month
28
+ )
29
+ Event
30
+ .readable_by(ctx[:current_user])
31
+ .as_occurrences
32
+ .starting_before(starting_before)
33
+ .ending_after(ending_after)
34
+ }
35
+ end
36
+
37
+ field :calendar do
38
+ type Types::CalendarType
39
+ description "Find a calendar by slug"
40
+ argument :slug, types.String
41
+ resolve ->(obj, args, ctx) {
42
+ Calendar
43
+ .readable_by(ctx[:current_user])
44
+ .friendly
45
+ .find(args[:slug])
46
+ }
47
+ end
48
+
49
+ field :user do
50
+ type Types::ProfileType
51
+ description "Find user by name"
52
+ argument :name, types.String
53
+ resolve -> (obj, args, ctx) {
54
+ User.find_by_name(args[:name])
55
+ }
56
+ end
57
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DateBook
4
+ module ApplicationHelper
5
+ def date_book_scripts
6
+ render partial: 'layouts/date_book_scripts'
7
+ end
8
+
9
+ def render_date_range(start_date, end_date, all_day, duration)
10
+ render partial: 'date_book/application/date_range', locals: {
11
+ start_date: start_date,
12
+ end_date: end_date,
13
+ all_day: all_day,
14
+ duration: duration
15
+ }
16
+ end
17
+
18
+ def render_date(date, all_day = false)
19
+ format = if all_day
20
+ :human_date
21
+ else
22
+ :human_datetime
23
+ end
24
+ I18n.localize date, format: format
25
+ end
26
+
27
+ def render_time(date)
28
+ I18n.localize date, format: :human_time
29
+ end
30
+
31
+ def render_all_day_checkbox(schedule)
32
+ render partial: 'date_book/application/all_day_checkbox', locals: { schedule: schedule }
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,4 @@
1
+ module DateBook
2
+ module CalendarHelper
3
+ end
4
+ end
@@ -0,0 +1,42 @@
1
+ module DateBook
2
+ module EventsHelper
3
+ def event_occurrence_dates(event)
4
+ render partial: 'date_book/events/occurrence_dates', locals: { event: event }
5
+ end
6
+
7
+ def event_popover(event)
8
+ render partial: 'date_book/events/popover', locals: {
9
+ event: event
10
+ }, formats: :html
11
+ end
12
+
13
+ def render_rule_form_section(rule, schedule)
14
+ render partial: "date_book/events/rules/#{rule}", locals: { schedule: schedule }
15
+ end
16
+
17
+ def render_date_field(schedule)
18
+ render partial: "date_book/events/fields/date", locals: { schedule: schedule }
19
+ end
20
+
21
+ def render_time_field(schedule)
22
+ render partial: "date_book/events/fields/time", locals: { schedule: schedule }
23
+ end
24
+
25
+ def render_duration_field(schedule)
26
+ render partial: "date_book/events/fields/duration", locals: { schedule: schedule }
27
+ end
28
+
29
+ def render_interval_field(unit, schedule)
30
+ render partial: "date_book/events/fields/interval", locals: { schedule: schedule, unit: unit }
31
+ end
32
+
33
+ def render_day_field(schedule)
34
+ render partial: "date_book/events/fields/day", locals: { schedule: schedule }
35
+ end
36
+
37
+ def render_day_of_week_field(schedule)
38
+ render partial: "date_book/events/fields/day_of_week", locals: { schedule: schedule }
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DateBook
4
+ class ApplicationJob < ActiveJob::Base
5
+ end
6
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DateBook
4
+ # Some documentation goes here
5
+ class ApplicationMailer < ActionMailer::Base
6
+ default from: 'from@example.com'
7
+ layout 'mailer'
8
+ end
9
+ end
@@ -0,0 +1 @@
1
+ = schedule.check_box :all_day, inline: true, class: 'all-day'
@@ -0,0 +1,8 @@
1
+ = render_date start_date, all_day
2
+ - unless (all_day && duration == 1.day)
3
+ &mdash;
4
+ - if start_date.to_date === end_date.to_date
5
+ = render_time end_date
6
+ - else
7
+ = render_date end_date, all_day
8
+
@@ -0,0 +1,65 @@
1
+ .btn-toolbar{ data: { role: 'editor-toolbar', target: "##{css_id}" } }
2
+ .btn-group
3
+ %a.btn.dropdown-toggle{ data: { toggle: 'dropdown' }, title: 'Font'}
4
+ %i.icon-font
5
+ %b.caret
6
+ %ul.dropdown-menu
7
+ .btn-group
8
+ %a.btn.dropdown-toggle{ data: { toggle: 'dropdown' }, title: 'Font Size'}
9
+ %i.icon-text-height
10
+ %b.caret
11
+ %ul.dropdown-menu
12
+ %li
13
+ %a{data: { edit: 'fontSize 5' }}
14
+ %font{:size => '5'} Huge
15
+ %li
16
+ %a{data: { edit: 'fontSize 3' }}
17
+ %font{:size => '3'} Normal
18
+ %li
19
+ %a{data: { edit: 'fontSize 1' }}
20
+ %font{:size => '1'} Small
21
+ .btn-group
22
+ %a.btn{data: { edit: 'bold' }, title: 'Bold (Ctrl/Cmd+B)'}
23
+ %i.icon-bold
24
+ %a.btn{data: { edit: 'italic' }, title: 'Italic (Ctrl/Cmd+I)'}
25
+ %i.icon-italic
26
+ %a.btn{data: { edit: 'strikethrough' }, title: 'Strikethrough'}
27
+ %i.icon-strikethrough
28
+ %a.btn{data: { edit: 'underline' }, title: 'Underline (Ctrl/Cmd+U)'}
29
+ %i.icon-underline
30
+ .btn-group
31
+ %a.btn{data: { edit: 'insertunorderedlist' }, title: 'Bullet list'}
32
+ %i.icon-list-ul
33
+ %a.btn{data: { edit: 'insertorderedlist' }, title: 'Number list'}
34
+ %i.icon-list-ol
35
+ %a.btn{data: { edit: 'outdent' }, title: 'Reduce indent (Shift+Tab)'}
36
+ %i.icon-indent-left
37
+ %a.btn{data: { edit: 'indent' }, title: 'Indent (Tab)'}
38
+ %i.icon-indent-right
39
+ .btn-group
40
+ %a.btn{data: { edit: 'justifyleft' }, title: 'Align Left (Ctrl/Cmd+L)'}
41
+ %i.icon-align-left
42
+ %a.btn{data: { edit: 'justifycenter' }, title: 'Center (Ctrl/Cmd+E)'}
43
+ %i.icon-align-center
44
+ %a.btn{data: { edit: 'justifyright' }, title: 'Align Right (Ctrl/Cmd+R)'}
45
+ %i.icon-align-right
46
+ %a.btn{data: { edit: 'justifyfull' }, title: 'Justify (Ctrl/Cmd+J)'}
47
+ %i.icon-align-justify
48
+ .btn-group
49
+ %a.btn.dropdown-toggle{ data: { toggle: 'dropdown' }, title: 'Hyperlink'}
50
+ %i.icon-link
51
+ .dropdown-menu.input-append
52
+ %input.span2{data: { edit: 'createLink' }, :placeholder => 'URL', :type => 'text'}/
53
+ %button.btn{type: 'button'} Add
54
+ %a.btn{data: { edit: 'unlink' }, title: 'Remove Hyperlink'}
55
+ %i.icon-cut
56
+ .btn-group
57
+ %a#picture-btn.btn{title: 'Insert picture (or just drag drop)'}
58
+ %i.icon-picture
59
+ %input{data: { edit: 'insertImage', role: 'magic-overlay', target: '#picture-btn' }, :type => 'file'}
60
+ .btn-group
61
+ %a.btn{data: { edit: 'undo' }, title: 'Undo (Ctrl/Cmd+Z)'}
62
+ %i.icon-undo
63
+ %a.btn{data: { edit: 'redo' }, title: 'Redo (Ctrl/Cmd+Y)'}
64
+ %i.icon-repeat
65
+ %input#voiceBtn{data: { edit: 'inserttext' }, :type => 'text', 'x-webkit-speech' => ''}
@@ -0,0 +1,6 @@
1
+ = bootstrap_form_for @calendar, layout: :horizontal, label_col: 'col-sm-2', control_col: 'col-sm-10', class: 'calendar-form' do |f|
2
+ .col-sm-10.col-sm-offset-2.required= :indicates_required_field.l
3
+ = f.text_field :name
4
+ = f.text_area :description, class: 'date-book--wysiwyg'
5
+ = f.text_field :css_class
6
+ = f.submit :save_model.l(model: Calendar.model_name.human)
@@ -0,0 +1,5 @@
1
+ - add_title :editing_item_model.l(item: @calendar.name, model: Calendar.model_name.human)
2
+ = date_book_scripts
3
+ = link_to :show_item_model.l(item: @calendar.name, model: Calendar.model_name.human), @calendar
4
+ = render 'form'
5
+
@@ -0,0 +1,28 @@
1
+ - add_title Calendar.model_name.human.pluralize
2
+ = date_book_scripts
3
+ .row
4
+ .col-md-9
5
+ #calendar-display
6
+ .col-md-3
7
+ %ul.calendars
8
+ - @calendars.each do |calendar|
9
+ %li.calendar
10
+ = link_to calendar.name, calendar
11
+ - add_footer_javascript do
12
+ :javascript
13
+ $(function() {
14
+ $('#calendar-display').fullCalendar({
15
+ events: {
16
+ url: '#{date_book.api_path format: :json}',
17
+ type: 'POST',
18
+ data: { query: calendarEventsQuery },
19
+ success: function(data, status, xhr) {
20
+ data = data.data.event_occurrences;
21
+ new_data = $.map(data, formatEventOccurrence);
22
+ return new_data;
23
+ }
24
+ },
25
+ eventRender: calendarEventRender,
26
+ header: calendarEventHeader,
27
+ });
28
+ });
@@ -0,0 +1,5 @@
1
+ - add_title :new_model.l(model: Calendar.model_name.human)
2
+ = date_book_scripts
3
+ = link_to Calendar.model_name.human.pluralize, date_book.calendars_path
4
+ = render 'form'
5
+
@@ -0,0 +1,28 @@
1
+ - add_title @calendar.name
2
+ = date_book_scripts
3
+ .calendar
4
+ = link_to :calendar_events.l(calendar: @calendar.name), date_book.calendar_events_path(@calendar)
5
+ - if can? :create, @calendar.events.new
6
+ %p.float-right.margin-left= icon_link_to 'plus', :add_event.l, date_book.new_calendar_event_path(@calendar), class: 'btn btn-success'
7
+ = @calendar.description.html_safe
8
+ %hr
9
+ #calendar-display
10
+ - add_footer_javascript do
11
+ :javascript
12
+ $(function() {
13
+ $('#calendar-display').fullCalendar({
14
+ events: {
15
+ url: '#{date_book.api_path format: :json}',
16
+ type: 'POST',
17
+ data: { query: calendarBySlugQuery('#{@calendar.slug}') },
18
+ success: function(data, status, xhr) {
19
+ data = data.data.calendar.event_occurrences;
20
+ new_data = $.map(data, formatEventOccurrence);
21
+ console.log(new_data);
22
+ return new_data;
23
+ }
24
+ },
25
+ eventRender: calendarEventRender,
26
+ header: calendarEventHeader,
27
+ });
28
+ });