From 010645903c1ea106bc0f7a1ee17db279d549c3c1 Mon Sep 17 00:00:00 2001
From: Tyler Lemburg <trlemburg@gmail.com>
Date: Mon, 27 Jun 2016 09:56:55 -0500
Subject: [PATCH] Add ranges to minutes

---
 .../20160608140300_add_space_permissions.rb   |  2 +-
 .../20160623134800_add_minutes_ranges.rb      | 10 +++++++
 routes/admin/resources.rb                     |  8 ++++++
 routes/resources.rb                           |  8 +++---
 utils/language.rb                             |  8 ++++++
 views/admin/edit_resource.erb                 | 13 ++++++----
 views/reserve.erb                             | 26 ++++++++++++-------
 7 files changed, 56 insertions(+), 19 deletions(-)
 create mode 100644 db/migrate/20160623134800_add_minutes_ranges.rb

diff --git a/db/migrate/20160608140300_add_space_permissions.rb b/db/migrate/20160608140300_add_space_permissions.rb
index 0fe2f83..96291a3 100644
--- a/db/migrate/20160608140300_add_space_permissions.rb
+++ b/db/migrate/20160608140300_add_space_permissions.rb
@@ -9,7 +9,7 @@ class AddSpacePermissions < ActiveRecord::Migration
 	end
 
 	def down
-		remove_column :user_has_permissions, :service_space_id, :integer, :default => 1
+		remove_column :user_has_permissions, :service_space_id
 
 		Permission.find_by(:id => 8).delete
 	end
diff --git a/db/migrate/20160623134800_add_minutes_ranges.rb b/db/migrate/20160623134800_add_minutes_ranges.rb
new file mode 100644
index 0000000..43df8e4
--- /dev/null
+++ b/db/migrate/20160623134800_add_minutes_ranges.rb
@@ -0,0 +1,10 @@
+require 'active_record'
+
+class AddMinutesRanges < ActiveRecord::Migration
+	def change
+		add_column :resources, :time_slot_type, :string, :default => 'exact'
+		add_column :resources, :min_minutes_per_reservation, :integer
+		add_column :resources, :max_minutes_per_reservation, :integer
+		add_column :resources, :increment_minutes_per_reservation, :integer
+	end
+end
\ No newline at end of file
diff --git a/routes/admin/resources.rb b/routes/admin/resources.rb
index 4da73e8..a645db6 100644
--- a/routes/admin/resources.rb
+++ b/routes/admin/resources.rb
@@ -32,7 +32,11 @@ post '/:service_space_url_name/admin/resources/create/?' do
 	resource.service_space_id = @space.id
 	resource.needs_authorization = true
 	resource.is_reservable = params.checked?('is_reservable')
+	resource.time_slot_type = params[:time_slot_type]
 	resource.minutes_per_reservation = params[:minutes_per_reservation]
+	resource.min_minutes_per_reservation = params[:min_minutes_per_reservation]
+	resource.max_minutes_per_reservation = params[:max_minutes_per_reservation]
+	resource.increment_minutes_per_reservation = params[:increment_minutes_per_reservation]
 	resource.needs_approval = false
 	resource.max_reservations_per_slot = 5
 	resource.save
@@ -68,7 +72,11 @@ post '/:service_space_url_name/admin/resources/:resource_id/edit/?' do
 	resource.model = params[:model]
 	resource.description = params[:description]
 	resource.is_reservable = params.checked?('is_reservable')
+	resource.time_slot_type = params[:time_slot_type]
 	resource.minutes_per_reservation = params[:minutes_per_reservation]
+	resource.min_minutes_per_reservation = params[:min_minutes_per_reservation]
+	resource.max_minutes_per_reservation = params[:max_minutes_per_reservation]
+	resource.increment_minutes_per_reservation = params[:increment_minutes_per_reservation]
 	resource.save
 
 	flash(:success, 'Resource Updated', "Your resource #{resource.name} has been updated.")
diff --git a/routes/resources.rb b/routes/resources.rb
index 2a6582e..a0e344c 100644
--- a/routes/resources.rb
+++ b/routes/resources.rb
@@ -47,17 +47,17 @@ get '/:service_space_url_name/resources/:resource_id/reserve/?' do
 	# calculate the available start times for reservation
 	if space_hour.nil?
 		start = 0
-		while start + (resource.minutes_per_reservation || 15) <= 1440
+		while start + (resource.minutes_per_reservation || resource.min_minutes_per_reservation || 15) <= 1440
 			available_start_times << start
-			start += (resource.minutes_per_reservation || 15)
+			start += (resource.minutes_per_reservation || resource.min_minutes_per_reservation || 15)
 		end
 	else
 		space_hour.hours.sort{|x,y| x[:start] <=> y[:start]}.each do |record|
 			if record[:status] == 'open'
 				start = record[:start]
-				while start + (resource.minutes_per_reservation || 15) <= record[:end]
+				while start + (resource.minutes_per_reservation || resource.min_minutes_per_reservation || 15) <= record[:end]
 					available_start_times << start
-					start += (resource.minutes_per_reservation || 15)
+					start += (resource.minutes_per_reservation || resource.min_minutes_per_reservation || 15)
 				end
 			end
 		end
diff --git a/utils/language.rb b/utils/language.rb
index f878cca..c267ce1 100644
--- a/utils/language.rb
+++ b/utils/language.rb
@@ -30,6 +30,14 @@ class Integer
     "$#{self / 100.0}"
   end
 
+  def minutes_output
+    if self < 60
+      "#{self} minutes"
+    else
+      "#{(self / 60)} hours #{self % 60} minutes"
+    end
+  end
+
   alias_method :second, :seconds
   alias_method :minute, :minutes
   alias_method :hour, :hours
diff --git a/views/admin/edit_resource.erb b/views/admin/edit_resource.erb
index 720c247..b967df1 100644
--- a/views/admin/edit_resource.erb
+++ b/views/admin/edit_resource.erb
@@ -6,9 +6,6 @@
 	<label for="name">Name</label>
 	<input type="text" name="name" id="name" value='<%= resource.name %>'/>
 
-	<label for="model">Model</label>
-	<input type="text" name="model" id="model" value='<%= resource.model %>'/>
-
 	<label for="description">Description</label>
 	<textarea id="description" name="description"><%= resource.description %></textarea>
 
@@ -17,8 +14,14 @@
 		<label for="is-reservable">Requires Reservation?</label>
 	</div>
 	<div>
-		<label for="minutes-per-reservation">Minutes Per Reservation</label>
-		<input type="number" name="minutes_per_reservation" id="minutes-per-reservation" value="<%= resource.minutes_per_reservation %>">
+		<label for="minutes-per-reservation">Minutes Per Reservation</label><br>
+		<input type="radio" name="time_slot_type" id="time-slot-type-exact" value="exact" <%= 'checked="checked"' if resource.time_slot_type == 'exact' %>>
+		<label for="time-slot-type-exact">Exactly:</label> <input type="number" name="minutes_per_reservation" id="minutes-per-reservation" value="<%= resource.minutes_per_reservation %>"><br><br>
+		<input type="radio" name="time_slot_type" id="time-slot-type-range" value="range" <%= 'checked="checked"' if resource.time_slot_type == 'range' %>>
+		<label for="time-slot-type-range">Range:</label>
+		<label for="min-minutes-per-reservation">Min:</label> <input style="width: 100px" type="number" name="min_minutes_per_reservation" id="min-minutes-per-reservation" value="<%= resource.min_minutes_per_reservation %>">
+		<label for="max-minutes-per-reservation">Max:</label> <input style="width: 100px" type="number" name="max_minutes_per_reservation" id="max-minutes-per-reservation" value="<%= resource.max_minutes_per_reservation %>">
+		<label for="increment-minutes-per-reservation">Increment:</label> <input style="width: 100px" type="number" name="increment_minutes_per_reservation" id="increment-minutes-per-reservation" value="<%= resource.increment_minutes_per_reservation %>">
 	</div>
 	<br>
 
diff --git a/views/reserve.erb b/views/reserve.erb
index ec07065..b791fe3 100644
--- a/views/reserve.erb
+++ b/views/reserve.erb
@@ -155,17 +155,25 @@ end %>
         </div>
 
         <label for="reservation-length">Reserve resource for:</label><br>
-        <% if resource.minutes_per_reservation.nil? %>
+        <% if resource.time_slot_type == 'exact' %>
+            <input style="width: 50px" disabled="disabled" value="<%= resource.minutes_per_reservation %>" />&nbsp;&nbsp;<label>minutes</label>
+            <input type="hidden" name="length" value="<%= resource.minutes_per_reservation %>" />
+        <% elsif resource.time_slot_type == 'range' %>
+            <select id="reservation-length" name="length">
+                <% i = resource.min_minutes_per_reservation %>
+                <% while i <= resource.max_minutes_per_reservation %>
+                <option value="<%= i %>"><%= i.minutes_output %></option>
+                <% i += resource.increment_minutes_per_reservation %>
+                <% end %>
+            </select>
+        <% else resource.minutes_per_reservation.nil? %>
         <select id="reservation-length" name="length">
-        	<% (1..4).each do |i| %>
-        	<option value="<%=i*15%>"><%=i*15%> minutes</option>
-        	<% end %>
-        	<option value="90">1.5 hours</option>
-        	<option value="120">2 hours</option>
+            <% (1..4).each do |i| %>
+            <option value="<%=i*15%>"><%=i*15%> minutes</option>
+            <% end %>
+            <option value="90">1.5 hours</option>
+            <option value="120">2 hours</option>
         </select>
-        <% else %>
-        <input style="width: 50px" disabled="disabled" value="<%= resource.minutes_per_reservation %>" />&nbsp;&nbsp;<label>minutes</label>
-        <input type="hidden" name="length" value="<%= resource.minutes_per_reservation %>" />
         <% end %>
         <br><br>
         <button type="submit" class="wdn-button wdn-button-brand"><%= reservation.nil? ? 'Reserve' : 'Update' %></button>
-- 
GitLab