date_book 0.0.1

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.
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
+ });