simple_calendar 2.4.3 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +5 -4
  3. data/.gitignore +4 -0
  4. data/Appraisals +5 -5
  5. data/CHANGELOG.md +11 -0
  6. data/Gemfile +6 -1
  7. data/Gemfile.lock +164 -136
  8. data/README.md +23 -16
  9. data/Rakefile +29 -5
  10. data/app/assets/stylesheets/simple_calendar.scss +4 -0
  11. data/{lib/simple_calendar/view_helpers.rb → app/helpers/simple_calendar/calendar_helper.rb} +4 -4
  12. data/app/views/simple_calendar/_calendar.html.erb +7 -7
  13. data/app/views/simple_calendar/_month_calendar.html.erb +8 -8
  14. data/app/views/simple_calendar/_week_calendar.html.erb +14 -12
  15. data/bin/rails +16 -0
  16. data/gemfiles/rails_6_1.gemfile +4 -1
  17. data/gemfiles/rails_6_1.gemfile.lock +166 -131
  18. data/gemfiles/rails_7_0.gemfile +12 -0
  19. data/gemfiles/rails_7_0.gemfile.lock +229 -0
  20. data/gemfiles/{rails_master.gemfile → rails_main.gemfile} +4 -1
  21. data/gemfiles/rails_main.gemfile.lock +253 -0
  22. data/lib/simple_calendar/calendar.rb +27 -14
  23. data/lib/simple_calendar/engine.rb +4 -0
  24. data/lib/simple_calendar/month_calendar.rb +4 -0
  25. data/lib/simple_calendar/version.rb +1 -1
  26. data/lib/simple_calendar/week_calendar.rb +5 -1
  27. data/lib/simple_calendar.rb +7 -6
  28. data/simple_calendar.gemspec +1 -3
  29. data/test/calendars/calendar_test.rb +154 -0
  30. data/test/calendars/month_calendar_test.rb +16 -0
  31. data/test/dummy/Rakefile +6 -0
  32. data/test/dummy/app/assets/config/manifest.js +1 -0
  33. data/test/dummy/app/assets/images/.keep +0 -0
  34. data/test/dummy/app/assets/stylesheets/application.css +1 -0
  35. data/test/dummy/app/calendars/business_week_calendar.rb +9 -0
  36. data/test/dummy/app/channels/application_cable/channel.rb +4 -0
  37. data/test/dummy/app/channels/application_cable/connection.rb +4 -0
  38. data/test/dummy/app/controllers/application_controller.rb +2 -0
  39. data/test/dummy/app/controllers/concerns/.keep +0 -0
  40. data/test/dummy/app/controllers/meetings_controller.rb +63 -0
  41. data/test/dummy/app/helpers/application_helper.rb +2 -0
  42. data/test/dummy/app/helpers/meetings_helper.rb +2 -0
  43. data/test/dummy/app/jobs/application_job.rb +7 -0
  44. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  45. data/test/dummy/app/models/application_record.rb +7 -0
  46. data/test/dummy/app/models/concerns/.keep +0 -0
  47. data/test/dummy/app/models/meeting.rb +2 -0
  48. data/test/dummy/app/views/layouts/application.html.erb +15 -0
  49. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  50. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  51. data/test/dummy/app/views/meetings/_business_week_calendar.html.erb +33 -0
  52. data/test/dummy/app/views/meetings/_form.html.erb +32 -0
  53. data/test/dummy/app/views/meetings/_meeting.html.erb +17 -0
  54. data/test/dummy/app/views/meetings/business_week.html.erb +24 -0
  55. data/test/dummy/app/views/meetings/edit.html.erb +10 -0
  56. data/test/dummy/app/views/meetings/index.html.erb +24 -0
  57. data/test/dummy/app/views/meetings/new.html.erb +9 -0
  58. data/test/dummy/app/views/meetings/show.html.erb +10 -0
  59. data/test/dummy/bin/rails +4 -0
  60. data/test/dummy/bin/rake +4 -0
  61. data/test/dummy/bin/setup +33 -0
  62. data/test/dummy/config/application.rb +22 -0
  63. data/test/dummy/config/boot.rb +5 -0
  64. data/test/dummy/config/cable.yml +10 -0
  65. data/test/dummy/config/database.yml +25 -0
  66. data/test/dummy/config/environment.rb +5 -0
  67. data/test/dummy/config/environments/development.rb +67 -0
  68. data/test/dummy/config/environments/production.rb +87 -0
  69. data/test/dummy/config/environments/test.rb +60 -0
  70. data/test/dummy/config/initializers/content_security_policy.rb +25 -0
  71. data/test/dummy/config/initializers/filter_parameter_logging.rb +8 -0
  72. data/test/dummy/config/initializers/inflections.rb +16 -0
  73. data/test/dummy/config/initializers/permissions_policy.rb +11 -0
  74. data/test/dummy/config/locales/en.yml +33 -0
  75. data/test/dummy/config/puma.rb +43 -0
  76. data/test/dummy/config/routes.rb +11 -0
  77. data/test/dummy/config/storage.yml +34 -0
  78. data/test/dummy/config.ru +6 -0
  79. data/test/dummy/db/migrate/20220930184313_create_meetings.rb +11 -0
  80. data/test/dummy/db/schema.rb +21 -0
  81. data/test/dummy/lib/assets/.keep +0 -0
  82. data/test/dummy/log/.keep +0 -0
  83. data/test/dummy/public/404.html +67 -0
  84. data/test/dummy/public/422.html +67 -0
  85. data/test/dummy/public/500.html +66 -0
  86. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  87. data/test/dummy/public/apple-touch-icon.png +0 -0
  88. data/test/dummy/public/favicon.ico +0 -0
  89. data/test/dummy/storage/.keep +0 -0
  90. data/test/fixtures/meetings.yml +36 -0
  91. data/test/integrations/custom_calendar_test.rb +31 -0
  92. data/test/integrations/month_calendar_test.rb +58 -0
  93. data/test/simple_calendar_test.rb +7 -0
  94. data/test/test_helper.rb +14 -0
  95. metadata +79 -40
  96. data/gemfiles/rails_6.gemfile +0 -9
  97. data/gemfiles/rails_6.gemfile.lock +0 -195
  98. data/gemfiles/rails_master.gemfile.lock +0 -207
  99. data/lib/simple_calendar/railtie.rb +0 -9
  100. data/spec/calendar_spec.rb +0 -176
  101. data/spec/calendars/month_calendar_spec.rb +0 -25
  102. data/spec/simple_calendar_spec.rb +0 -9
  103. data/spec/spec_helper.rb +0 -96
  104. data/spec/support/fake_event.rb +0 -9
  105. data/spec/support/view_context.rb +0 -20
  106. data/spec/views_generators_spec.rb +0 -7
@@ -0,0 +1,154 @@
1
+ require "test_helper"
2
+
3
+ class CalendarTest < ActionView::TestCase
4
+ attr_reader :calendar
5
+
6
+ setup do
7
+ @calendar = SimpleCalendar::Calendar.new(view)
8
+ end
9
+
10
+ test "renders a partial with the same name as the class" do
11
+ assert_equal "simple_calendar/calendar", calendar.partial_name
12
+ end
13
+
14
+ test "has start_time as the default attribute" do
15
+ assert_equal :start_time, calendar.attribute
16
+ end
17
+
18
+ test "allows you to override the default attribute" do
19
+ assert_equal :starts_at, SimpleCalendar::Calendar.new(view, attribute: :starts_at).attribute
20
+ end
21
+
22
+ test "set a default when `partial` option isn't present" do
23
+ assert_equal "simple_calendar/calendar", SimpleCalendar::Calendar.new(view).partial_name
24
+ assert_equal "simple_calendar/month_calendar", SimpleCalendar::MonthCalendar.new(view).partial_name
25
+ assert_equal "simple_calendar/week_calendar", SimpleCalendar::WeekCalendar.new(view).partial_name
26
+ end
27
+
28
+ test "allows to override the default partial" do
29
+ assert_equal "simple_calendar/custom_calendar", SimpleCalendar::Calendar.new(view, partial: "simple_calendar/custom_calendar").partial_name
30
+ end
31
+
32
+ test "converts an array of events to a hash sorted by days" do
33
+ today, tomorrow = Date.today, Date.tomorrow
34
+
35
+ event1 = Meeting.new(start_time: today.at_midnight)
36
+ event2 = Meeting.new(start_time: today.at_noon)
37
+ event3 = Meeting.new(start_time: tomorrow.at_noon)
38
+
39
+ events = [event1, event2, event3].shuffle
40
+ calendar = SimpleCalendar::Calendar.new(view, events: events)
41
+
42
+ sorted_events = calendar.sorted_events
43
+
44
+ assert_equal [event1, event2], sorted_events[today]
45
+ assert_equal [event3], sorted_events[tomorrow]
46
+ end
47
+
48
+ test "converts an array of multi-day events to a hash sorted by days" do
49
+ today, tomorrow = Date.today, Date.tomorrow
50
+
51
+ event1 = Meeting.new(start_time: today.at_midnight, end_time: tomorrow.at_midnight)
52
+ event2 = Meeting.new(start_time: today.at_noon)
53
+ event3 = Meeting.new(start_time: tomorrow.at_noon)
54
+
55
+ events = [event1, event2, event3].shuffle
56
+ calendar = SimpleCalendar::Calendar.new(view, events: events)
57
+
58
+ assert_equal [event1, event2], calendar.sorted_events[today]
59
+ assert_equal [event1, event3], calendar.sorted_events[tomorrow]
60
+ end
61
+
62
+ test "handles events without a start time" do
63
+ event = Meeting.new(start_time: nil)
64
+ calendar = SimpleCalendar::Calendar.new(view, events: [event])
65
+
66
+ assert_nothing_raised do
67
+ calendar.sorted_events
68
+ end
69
+ end
70
+
71
+ test "defaults to today's date" do
72
+ calendar = SimpleCalendar::Calendar.new(view)
73
+ assert_equal Date.today, calendar.start_date
74
+ end
75
+
76
+ test "uses the view context's params start_date to override" do
77
+ params[:start_date] = Date.yesterday
78
+ calendar = SimpleCalendar::Calendar.new(view)
79
+ assert_equal Date.yesterday, calendar.start_date
80
+ end
81
+
82
+ test "uses the optional argument's start_date to override view_context's start_date" do
83
+ params[:start_date] = Date.yesterday
84
+ calendar = SimpleCalendar::Calendar.new(view, start_date: Date.tomorrow)
85
+ assert_equal Date.tomorrow, calendar.start_date
86
+ end
87
+
88
+ test "takes an option to override the start_date parameter" do
89
+ params[:date] = Date.yesterday
90
+ calendar = SimpleCalendar::Calendar.new(view, start_date_param: :date)
91
+ assert_equal Date.yesterday, calendar.start_date
92
+ end
93
+
94
+ test "should have the current week" do
95
+ calendar = SimpleCalendar::Calendar.new(view)
96
+ week = calendar.date_range.each_slice(7).to_a[0]
97
+ assert_includes calendar.tr_classes_for(week), "current-week"
98
+ end
99
+
100
+ test "should not have the current week if it does not contain today" do
101
+ params[:start_date] = 6.months.ago
102
+ calendar = SimpleCalendar::MonthCalendar.new(view)
103
+ week = calendar.date_range.each_slice(7).to_a[0]
104
+ assert_not_includes calendar.tr_classes_for(week), "current-week"
105
+ end
106
+
107
+ test "has a param that determines the start date of the calendar" do
108
+ calendar = SimpleCalendar::Calendar.new(view)
109
+ rendering_variables = calendar.locals
110
+ assert_not_nil rendering_variables[:start_date]
111
+ end
112
+
113
+ test "generates a default date if no start date is present" do
114
+ calendar = SimpleCalendar::Calendar.new(view)
115
+ calendar_start_date = calendar.locals[:start_date]
116
+ assert_not_nil calendar_start_date
117
+ assert_kind_of Date, calendar_start_date
118
+ end
119
+
120
+ test "has a range of dates" do
121
+ calendar = SimpleCalendar::Calendar.new(view)
122
+ calendar_date_range = calendar.date_range
123
+ assert_kind_of Array, calendar_date_range
124
+ calendar_date_range.each do |date|
125
+ assert_kind_of Date, date
126
+ end
127
+ end
128
+
129
+ test "accepts an array of events" do
130
+ first_event = Meeting.new(name: "event1", start_time: Date.today)
131
+ second_event = Meeting.new(name: "event2", start_time: Date.today + 1.day)
132
+ events = [first_event, second_event]
133
+ calendar = SimpleCalendar::Calendar.new(view, events: events)
134
+ calendar_sorted_events = calendar.locals[:sorted_events]
135
+
136
+ assert_equal 2, calendar_sorted_events.length
137
+ end
138
+
139
+ test "sorts the events" do
140
+ first_event = Meeting.new(name: "event1", start_time: Date.today + 2.days)
141
+ second_event = Meeting.new(name: "event2", start_time: Date.today + 1.day)
142
+ third_event = Meeting.new(name: "event3", start_time: Date.today)
143
+ events = [first_event, third_event, second_event]
144
+ calendar = SimpleCalendar::Calendar.new(view, events: events)
145
+ calendar_sorted_events = calendar.locals[:sorted_events]
146
+ first_key = calendar_sorted_events.keys[0]
147
+ second_key = calendar_sorted_events.keys[1]
148
+ third_key = calendar_sorted_events.keys[2]
149
+
150
+ assert_equal third_event, calendar_sorted_events[first_key][0]
151
+ assert_equal second_event, calendar_sorted_events[second_key][0]
152
+ assert_equal first_event, calendar_sorted_events[third_key][0]
153
+ end
154
+ end
@@ -0,0 +1,16 @@
1
+ require "test_helper"
2
+
3
+ class MonthCalendarTest < ActionView::TestCase
4
+ test "date_range returns a full calendar month" do
5
+ today = Date.today
6
+ calendar = SimpleCalendar::MonthCalendar.new(view, start_date: today)
7
+ assert calendar.date_range.min <= today.beginning_of_month
8
+ assert calendar.date_range.max >= today.end_of_month
9
+ end
10
+
11
+ test "date_range returns the days of next and previous months on the edges of the calendar" do
12
+ calendar = SimpleCalendar::MonthCalendar.new(view, start_date: Date.new(2018, 8, 1))
13
+ assert_equal Date.new(2018, 7, 30), calendar.date_range.first
14
+ assert_equal Date.new(2018, 9, 2), calendar.date_range.last
15
+ end
16
+ end
@@ -0,0 +1,6 @@
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_relative "config/application"
5
+
6
+ Rails.application.load_tasks
@@ -0,0 +1 @@
1
+ //= link_directory ../stylesheets
File without changes
@@ -0,0 +1 @@
1
+ /* Application styles */
@@ -0,0 +1,9 @@
1
+ class BusinessWeekCalendar < SimpleCalendar::Calendar
2
+ private
3
+
4
+ def date_range
5
+ beginning = start_date.beginning_of_week + 1.day
6
+ ending = start_date.end_of_week - 1.day
7
+ (beginning..ending).to_a
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ module ApplicationCable
2
+ class Channel < ActionCable::Channel::Base
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module ApplicationCable
2
+ class Connection < ActionCable::Connection::Base
3
+ end
4
+ end
@@ -0,0 +1,2 @@
1
+ class ApplicationController < ActionController::Base
2
+ end
File without changes
@@ -0,0 +1,63 @@
1
+ class MeetingsController < ApplicationController
2
+ before_action :set_meeting, only: %i[show edit update destroy]
3
+
4
+ # GET /meetings
5
+ def index
6
+ @meetings = Meeting.all
7
+ end
8
+
9
+ def business_week
10
+ @meetings = Meeting.all
11
+ end
12
+
13
+ # GET /meetings/1
14
+ def show
15
+ end
16
+
17
+ # GET /meetings/new
18
+ def new
19
+ @meeting = Meeting.new
20
+ end
21
+
22
+ # GET /meetings/1/edit
23
+ def edit
24
+ end
25
+
26
+ # POST /meetings
27
+ def create
28
+ @meeting = Meeting.new(meeting_params)
29
+
30
+ if @meeting.save
31
+ redirect_to @meeting, notice: "Meeting was successfully created."
32
+ else
33
+ render :new, status: :unprocessable_entity
34
+ end
35
+ end
36
+
37
+ # PATCH/PUT /meetings/1
38
+ def update
39
+ if @meeting.update(meeting_params)
40
+ redirect_to @meeting, notice: "Meeting was successfully updated."
41
+ else
42
+ render :edit, status: :unprocessable_entity
43
+ end
44
+ end
45
+
46
+ # DELETE /meetings/1
47
+ def destroy
48
+ @meeting.destroy
49
+ redirect_to meetings_url, notice: "Meeting was successfully destroyed."
50
+ end
51
+
52
+ private
53
+
54
+ # Use callbacks to share common setup or constraints between actions.
55
+ def set_meeting
56
+ @meeting = Meeting.find(params[:id])
57
+ end
58
+
59
+ # Only allow a list of trusted parameters through.
60
+ def meeting_params
61
+ params.require(:meeting).permit(:name, :start_time, :end_time)
62
+ end
63
+ end
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module MeetingsHelper
2
+ end
@@ -0,0 +1,7 @@
1
+ class ApplicationJob < ActiveJob::Base
2
+ # Automatically retry jobs that encountered a deadlock
3
+ # retry_on ActiveRecord::Deadlocked
4
+
5
+ # Most jobs are safe to ignore if the underlying records are no longer available
6
+ # discard_on ActiveJob::DeserializationError
7
+ end
@@ -0,0 +1,4 @@
1
+ class ApplicationMailer < ActionMailer::Base
2
+ default from: "from@example.com"
3
+ layout "mailer"
4
+ end
@@ -0,0 +1,7 @@
1
+ class ApplicationRecord < ActiveRecord::Base
2
+ if Rails.gem_version >= Gem::Version.new("7.0")
3
+ primary_abstract_class
4
+ else
5
+ self.abstract_class = true
6
+ end
7
+ end
File without changes
@@ -0,0 +1,2 @@
1
+ class Meeting < ApplicationRecord
2
+ end
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Dummy</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <%= csrf_meta_tags %>
7
+ <%= csp_meta_tag %>
8
+
9
+ <%= stylesheet_link_tag "application" %>
10
+ </head>
11
+
12
+ <body>
13
+ <%= yield %>
14
+ </body>
15
+ </html>
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <style>
6
+ /* Email styles need to be inline */
7
+ </style>
8
+ </head>
9
+
10
+ <body>
11
+ <%= yield %>
12
+ </body>
13
+ </html>
@@ -0,0 +1 @@
1
+ <%= yield %>
@@ -0,0 +1,33 @@
1
+ <div class="simple-calendar">
2
+ <div class="calendar-heading">
3
+ <span class="calendar-title"><%= t('date.month_names')[start_date.month] %> <%= start_date.year %></span>
4
+
5
+ <nav>
6
+ <%= link_to t('simple_calendar.previous', default: 'Previous'), calendar.url_for_previous_view %>
7
+ <%= link_to t('simple_calendar.today', default: 'Today'), calendar.url_for_today_view %>
8
+ <%= link_to t('simple_calendar.next', default: 'Next'), calendar.url_for_next_view %>
9
+ </nav>
10
+ </div>
11
+
12
+ <table class="table table-striped">
13
+ <thead>
14
+ <tr>
15
+ <% date_range.slice(0, 7).each do |day| %>
16
+ <th><%= t('date.abbr_day_names')[day.wday] %></th>
17
+ <% end %>
18
+ </tr>
19
+ </thead>
20
+
21
+ <tbody>
22
+ <% date_range.each_slice(7) do |week| %>
23
+ <%= content_tag :tr, class: calendar.tr_classes_for(week) do %>
24
+ <% week.each do |day| %>
25
+ <%= content_tag :td, class: calendar.td_classes_for(day) do %>
26
+ <% instance_exec(day, calendar.sorted_events_for(day), &passed_block) %>
27
+ <% end %>
28
+ <% end %>
29
+ <% end %>
30
+ <% end %>
31
+ </tbody>
32
+ </table>
33
+ </div>
@@ -0,0 +1,32 @@
1
+ <%= form_with(model: meeting) do |form| %>
2
+ <% if meeting.errors.any? %>
3
+ <div style="color: red">
4
+ <h2><%= pluralize(meeting.errors.count, "error") %> prohibited this meeting from being saved:</h2>
5
+
6
+ <ul>
7
+ <% meeting.errors.each do |error| %>
8
+ <li><%= error.full_message %></li>
9
+ <% end %>
10
+ </ul>
11
+ </div>
12
+ <% end %>
13
+
14
+ <div>
15
+ <%= form.label :name, style: "display: block" %>
16
+ <%= form.text_field :name %>
17
+ </div>
18
+
19
+ <div>
20
+ <%= form.label :start_time, style: "display: block" %>
21
+ <%= form.datetime_field :start_time %>
22
+ </div>
23
+
24
+ <div>
25
+ <%= form.label :end_time, style: "display: block" %>
26
+ <%= form.datetime_field :end_time %>
27
+ </div>
28
+
29
+ <div>
30
+ <%= form.submit %>
31
+ </div>
32
+ <% end %>
@@ -0,0 +1,17 @@
1
+ <div id="<%= dom_id meeting %>">
2
+ <p>
3
+ <strong>Name:</strong>
4
+ <%= meeting.name %>
5
+ </p>
6
+
7
+ <p>
8
+ <strong>Start time:</strong>
9
+ <%= meeting.start_time %>
10
+ </p>
11
+
12
+ <p>
13
+ <strong>End time:</strong>
14
+ <%= meeting.end_time %>
15
+ </p>
16
+
17
+ </div>
@@ -0,0 +1,24 @@
1
+ <p style="color: green"><%= notice %></p>
2
+
3
+ <h1>Meetings</h1>
4
+ <%= render BusinessWeekCalendar.new(self, events: @meetings) do |date, meetings| %>
5
+ <%= date %>
6
+
7
+ <% meetings.each do |meeting| %>
8
+ <div>
9
+ <%= meeting.name %>
10
+ </div>
11
+ <% end %>
12
+ <% end %>
13
+
14
+ <div id="meetings">
15
+ <% @meetings.each do |meeting| %>
16
+ <%= render meeting %>
17
+ <p>
18
+ <%= link_to "Show this meeting", meeting %>
19
+ </p>
20
+ <% end %>
21
+ </div>
22
+
23
+ <%= link_to "New meeting", new_meeting_path %>
24
+ <%= Time.current.beginning_of_month %>
@@ -0,0 +1,10 @@
1
+ <h1>Editing meeting</h1>
2
+
3
+ <%= render "form", meeting: @meeting %>
4
+
5
+ <br>
6
+
7
+ <div>
8
+ <%= link_to "Show this meeting", @meeting %> |
9
+ <%= link_to "Back to meetings", meetings_path %>
10
+ </div>
@@ -0,0 +1,24 @@
1
+ <p style="color: green"><%= notice %></p>
2
+
3
+ <h1>Meetings</h1>
4
+ <%= month_calendar(events: @meetings) do |date, meetings| %>
5
+ <%= date %>
6
+
7
+ <% meetings.each do |meeting| %>
8
+ <div>
9
+ <%= meeting.name %>
10
+ </div>
11
+ <% end %>
12
+ <% end %>
13
+
14
+ <div id="meetings">
15
+ <% @meetings.each do |meeting| %>
16
+ <%= render meeting %>
17
+ <p>
18
+ <%= link_to "Show this meeting", meeting %>
19
+ </p>
20
+ <% end %>
21
+ </div>
22
+
23
+ <%= link_to "New meeting", new_meeting_path %>
24
+ <%= Time.current.beginning_of_month %>
@@ -0,0 +1,9 @@
1
+ <h1>New meeting</h1>
2
+
3
+ <%= render "form", meeting: @meeting %>
4
+
5
+ <br>
6
+
7
+ <div>
8
+ <%= link_to "Back to meetings", meetings_path %>
9
+ </div>
@@ -0,0 +1,10 @@
1
+ <p style="color: green"><%= notice %></p>
2
+
3
+ <%= render @meeting %>
4
+
5
+ <div>
6
+ <%= link_to "Edit this meeting", edit_meeting_path(@meeting) %> |
7
+ <%= link_to "Back to meetings", meetings_path %>
8
+
9
+ <%= button_to "Destroy this meeting", @meeting, method: :delete %>
10
+ </div>
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ APP_PATH = File.expand_path("../config/application", __dir__)
3
+ require_relative "../config/boot"
4
+ require "rails/commands"
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative "../config/boot"
3
+ require "rake"
4
+ Rake.application.run
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+ require "fileutils"
3
+
4
+ # path to your application root.
5
+ APP_ROOT = File.expand_path("..", __dir__)
6
+
7
+ def system!(*args)
8
+ system(*args) || abort("\n== Command #{args} failed ==")
9
+ end
10
+
11
+ FileUtils.chdir APP_ROOT do
12
+ # This script is a way to set up or update your development environment automatically.
13
+ # This script is idempotent, so that you can run it at any time and get an expectable outcome.
14
+ # Add necessary setup steps to this file.
15
+
16
+ puts "== Installing dependencies =="
17
+ system! "gem install bundler --conservative"
18
+ system("bundle check") || system!("bundle install")
19
+
20
+ # puts "\n== Copying sample files =="
21
+ # unless File.exist?("config/database.yml")
22
+ # FileUtils.cp "config/database.yml.sample", "config/database.yml"
23
+ # end
24
+
25
+ puts "\n== Preparing database =="
26
+ system! "bin/rails db:prepare"
27
+
28
+ puts "\n== Removing old logs and tempfiles =="
29
+ system! "bin/rails log:clear tmp:clear"
30
+
31
+ puts "\n== Restarting application server =="
32
+ system! "bin/rails restart"
33
+ end
@@ -0,0 +1,22 @@
1
+ require_relative "boot"
2
+
3
+ require "rails/all"
4
+
5
+ # Require the gems listed in Gemfile, including any gems
6
+ # you've limited to :test, :development, or :production.
7
+ Bundler.require(*Rails.groups)
8
+ require "simple_calendar"
9
+
10
+ module Dummy
11
+ class Application < Rails::Application
12
+ config.load_defaults Rails::VERSION::STRING.to_f
13
+
14
+ # Configuration for the application, engines, and railties goes here.
15
+ #
16
+ # These settings can be overridden in specific environments using the files
17
+ # in config/environments, which are processed later.
18
+ #
19
+ # config.time_zone = "Central Time (US & Canada)"
20
+ # config.eager_load_paths << Rails.root.join("extras")
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ # Set up gems listed in the Gemfile.
2
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../../Gemfile", __dir__)
3
+
4
+ require "bundler/setup" if File.exist?(ENV["BUNDLE_GEMFILE"])
5
+ $LOAD_PATH.unshift File.expand_path("../../../lib", __dir__)
@@ -0,0 +1,10 @@
1
+ development:
2
+ adapter: async
3
+
4
+ test:
5
+ adapter: test
6
+
7
+ production:
8
+ adapter: redis
9
+ url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %>
10
+ channel_prefix: dummy_production
@@ -0,0 +1,25 @@
1
+ # SQLite. Versions 3.8.0 and up are supported.
2
+ # gem install sqlite3
3
+ #
4
+ # Ensure the SQLite 3 gem is defined in your Gemfile
5
+ # gem "sqlite3"
6
+ #
7
+ default: &default
8
+ adapter: sqlite3
9
+ pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
10
+ timeout: 5000
11
+
12
+ development:
13
+ <<: *default
14
+ database: db/development.sqlite3
15
+
16
+ # Warning: The database defined as "test" will be erased and
17
+ # re-generated from your development database when you run "rake".
18
+ # Do not set this db to the same as development or production.
19
+ test:
20
+ <<: *default
21
+ database: db/test.sqlite3
22
+
23
+ production:
24
+ <<: *default
25
+ database: db/production.sqlite3
@@ -0,0 +1,5 @@
1
+ # Load the Rails application.
2
+ require_relative "application"
3
+
4
+ # Initialize the Rails application.
5
+ Rails.application.initialize!