diff --git a/app/controllers/admin/property_hires_controller.rb b/app/controllers/admin/property_hires_controller.rb index 380106e..d716a4d 100644 --- a/app/controllers/admin/property_hires_controller.rb +++ b/app/controllers/admin/property_hires_controller.rb @@ -1,20 +1,38 @@ class Admin::PropertyHiresController < OrbitAdminController include Admin::PropertyHiresHelper + def index + if PropertyHireSortOrder.count == 0 + PropertyHireSortOrder.create('sort_order' => false) + end + + if !(params['order_asc'].nil?) + if params['order_asc'] == 'true' + PropertyHireSortOrder.first.update_attributes('sort_order' => true) + elsif params['order_asc'] == 'false' + PropertyHireSortOrder.first.update_attributes('sort_order' => false) + end + + sort_direction = PropertyHireSortOrder.first['sort_order'] ? 1 : -1 + Property.recalc_sort_number(sort_direction) + end + + @choose = PropertyHireSortOrder.first['sort_order'] @tags = @module_app.tags @categories = @module_app.categories.enabled @filter_fields = filter_fields(@categories, @tags) @table_fields = ["property_hire.title", :category, "property_hire.location", "property_hire.available_for_hire"] - @properties = Property.order_by(order_position: :asc) + @properties = Property.order_by(tmp_sort_number: :asc) .with_categories(filters("category")) .with_tags(filters("tag")) + @properties = search_data(@properties, [:title]).page(params[:page]).per(10) - @properties = search_data(@properties,[:title]).page(params[:page]).per(10) if request.xhr? render :partial => "index" end end + def fields_display_order uid = params[:id].split("-").last @property = Property.find_by(:uid=>uid) diff --git a/app/controllers/property_hires_controller.rb b/app/controllers/property_hires_controller.rb index a51b306..069e99b 100644 --- a/app/controllers/property_hires_controller.rb +++ b/app/controllers/property_hires_controller.rb @@ -2,7 +2,7 @@ class PropertyHiresController < ApplicationController include Admin::PropertyHiresHelper FrontendMethods = ["hire", "view_calendar", "hire_success"] def index - properties = Property.can_display.filter_by_categories.order_by(order_position: :asc) + properties = Property.can_display.filter_by_categories.order_by(tmp_sort_number: :asc) url = "/#{I18n.locale}#{OrbitHelper.page.get_url}" data = index_data(properties, url) filterprops = data.dup @@ -364,10 +364,26 @@ class PropertyHiresController < ApplicationController end def check_availability - time_setting_id = params[:time_setting_id] - data = check_for_availability params[:stime], params[:etime], params[:property_id], params[:interval], params[:recurring_end_date], time_setting_id - render :json => data.to_json + property = Property.find(params[:property_id]) + + if !check_if_user_is_manager? + # 1. 取得預約日期並歸零時間 (設為該日 00:00:00) + book_date = Time.zone.parse(params[:stime]).beginning_of_day + + # 2. 取得「今天」的凌晨 00:00:00,再加 7 天 + # 這樣判定會變成:只要是 7 天後的「那一天」就准許 + limit_day = Time.zone.now.beginning_of_day + property.need_hire_before.send(property.need_hire_before_unit) + + if book_date < limit_day + msg = "預約失敗:此項目最快僅能預約 #{limit_day.strftime('%Y-%m-%d')} 之後的時段。" + render json: { success: false, msg: msg } + return + end end + time_setting_id = params[:time_setting_id] + data = check_for_availability params[:stime], params[:etime], params[:property_id], params[:interval], params[:recurring_end_date], time_setting_id + render :json => data.to_json +end @@ -482,7 +498,11 @@ class PropertyHiresController < ApplicationController start_wday = startt.wday start_date = startt.to_date @start_date = start_date - end_date = endt.to_date + if endt > endt.beginning_of_day + end_date = endt.to_date + 1.day + else + end_date = endt.to_date + end @end_date = end_date @first_check_time = startt.strftime("%H:%M") @all_day_settings = all_day_settings.sort_by { |k, _| k.to_i }.to_h @@ -513,7 +533,7 @@ class PropertyHiresController < ApplicationController if i != -1 check_events = @need_check_events[0..i] end - @need_check_events = @need_check_events[(i+1)..-1] + #@need_check_events = @need_check_events[(i+1)..-1] settings = @all_day_settings[wday_str] if check_events.count != 0 @@ -580,7 +600,7 @@ class PropertyHiresController < ApplicationController @start_date += 7.day end end - all_days = (end_date-start_date).to_i + all_days = (end_date-start_date).to_i end_wday = 6 end_date_wday = end_date.wday only_first_week = false diff --git a/app/models/property.rb b/app/models/property.rb index ff9c229..f4e82fd 100644 --- a/app/models/property.rb +++ b/app/models/property.rb @@ -895,4 +895,42 @@ class Property end emails.select{|email| email.present?} end + def self.check_sort_number + ph_sort_order = PropertyHireSortOrder.first + if ph_sort_order && ph_sort_order.need_update_sort + self.recalc_sort_number(ph_sort_order.sort_order) + end + end + + def self.recalc_sort_number(sort_order=nil) + if sort_order.nil? + sort_order = (PropertyHireSortOrder.first['sort_order'] rescue false) ? 1 : -1 + end + sorted_hires = self.all.to_a.sort_by{|k| [ + (k["is_top"] ? 0 : 1), + (k["order_position"].nil? ? Float::INFINITY : sort_order * k["order_position"].to_i), + -k["created_at"].to_i + ]} + + sorted_hires.each_with_index do |a, i| + a.instance_variable_set(:@skip_callback, true) + self.where(:id => a.id).update_all(:tmp_sort_number => i) + end + + min_pos, max_pos = (sorted_hires.count != 0) ? (sorted_hires.map{|a| a.order_position.to_i}.minmax) : [0, 0] + PropertyHireSortOrder.update_all( + :min_sort_number => min_pos, + :max_sort_number => max_pos, + :need_update_sort => false + ) + + self.create_indexes + return max_pos + end + after_create :trigger_recalc + + def trigger_recalc + order_status = PropertyHireSortOrder.first.try(:sort_order) + self.class.recalc_sort_number(order_status ? 1 : -1) + end end diff --git a/app/models/property_hire_sort_order.rb b/app/models/property_hire_sort_order.rb new file mode 100644 index 0000000..2df21ba --- /dev/null +++ b/app/models/property_hire_sort_order.rb @@ -0,0 +1,53 @@ +class PropertyHireSortOrder + include Mongoid::Document + field :sort_order, :type => Boolean + field :need_update_sort, :type => Boolean, :default => true + field :min_sort_number, :type => Integer, :default => 0 + field :max_sort_number, :type => Integer, :default => 0 + + after_initialize do |record| + if(!record.new_record? && record.sort_order.nil?) + record.sort_order = true + record.save + elsif(!record.new_record?) + @module_app = ModuleApp.where(:key=>'property_hire').first + if !@module_app.nil? + @asc = @module_app.asc rescue nil + if !@asc.nil? + record.sort_order = @asc + record.save + end + end + end + end + + after_save do |record| + unless record.instance_variable_get(:@skip_callback) + if record.sort_order_changed? + @module_app = ModuleApp.where(:key=>'property_hire').first + if !@module_app.nil? + @sort_order = record.sort_order rescue nil + if !@sort_order.nil? + if !@module_app.attributes[:asc].nil? + @module_app.asc = @sort_order + @module_app.save + end + end + end + record.instance_variable_set(:@skip_callback, true) + record.update(:need_update_sort=>true) + if record.need_update_sort + Thread.new do + sort_order = record.sort_order ? 1 : -1 + PHire.recalc_sort_number(sort_order) + record.instance_variable_set(:@skip_callback, false) + end + end + end + end + end + + def get_default_order + self.sort_order ? self.min_sort_number : self.max_sort_number + end +end \ No newline at end of file diff --git a/app/views/admin/property_hires/_sort_order_choose.html.erb b/app/views/admin/property_hires/_sort_order_choose.html.erb new file mode 100644 index 0000000..17c0e9c --- /dev/null +++ b/app/views/admin/property_hires/_sort_order_choose.html.erb @@ -0,0 +1,18 @@ + +
\ No newline at end of file diff --git a/app/views/admin/property_hires/index.html.erb b/app/views/admin/property_hires/index.html.erb index 132d56e..3facc10 100644 --- a/app/views/admin/property_hires/index.html.erb +++ b/app/views/admin/property_hires/index.html.erb @@ -1,4 +1,5 @@ <%= render_filter @filter_fields, "index_table" %> +<%= render 'sort_order_choose' %> <%= render 'index'%>