diff --git a/app/assets/javascripts/calendar.js b/app/assets/javascripts/calendar.js index cf921a4..c2e2fc9 100644 --- a/app/assets/javascripts/calendar.js +++ b/app/assets/javascripts/calendar.js @@ -634,6 +634,7 @@ var EventDialog = function(calendar,event){ template += ''; } } @@ -654,6 +655,40 @@ var EventDialog = function(calendar,event){ event_quick_view.find(".event-close-btn").one("click",function(){_t.dismiss();}); event_quick_view.find("a.delete").one("click",function(){calendar.deleteEvent(_this_event.delete_url,_this_event._id);return false;}); event_quick_view.find("a.edit").one("click",function(){calendar.editEvent(_this_event.edit_url,_this_event.allDay);return false;}); + event_quick_view.find("a.hide_event").off("click").on("click", function(){ + var _this = $(this); + var new_hide = _this.attr('data-new-hide'); + if(new_hide == "true"){ + if(!(window.confirm(I18n.locale == 'zh_tw' ? "您確定要隱藏該事件嗎?" : "Are you sure to hide event?"))){ + return false; + } + } + $.get(_this.attr('href') + "&hide="+ new_hide).done(function(data){ + if(data["success"]){ + if(new_hide == "true"){ + if($('#display_hide').length != 0 && $('#display_hide').prop('checked')){ + _this.removeClass('btn-danger').addClass('btn-success'); + _this.text("Show"); + _this.attr('data-new-hide', "false"); + _this_event.event.setProp('color', _this_event.hide_color); + _this_event.event.setExtendedProp('hide', true); + }else{ + _this_event.event.remove(); + } + }else{ + _this.removeClass('btn-success').addClass('btn-danger'); + _this.text("Hide"); + _this.attr('data-new-hide', "true"); + _this_event.event.setProp('color', _this_event.org_color); + _this_event.event.setExtendedProp('hide', false); + } + event_quick_view.remove(); + }else{ + alert("Something went wrong!") + } + }) + return false; + }) var window_width = $(window).width(), window_height = $(window).height(); var dialog_width = event_quick_view.width(), diff --git a/app/controllers/admin/calendars_controller.rb b/app/controllers/admin/calendars_controller.rb index d44d40d..ae413c8 100644 --- a/app/controllers/admin/calendars_controller.rb +++ b/app/controllers/admin/calendars_controller.rb @@ -15,15 +15,12 @@ class Admin::CalendarsController < OrbitAdminController if params[:start].present? && params[:end].present? sdt = Time.at(params[:start].to_i) edt = Time.at(params[:end].to_i) - @monthly_events = Event.monthly_event(sdt,edt).with_categories(filters("category")) - .with_tags(filters("tag")).convert_front - @re = Event.with_categories(filters("category")).with_tags(filters("tag")).recurring_event(sdt,edt) - allevents = @monthly_events.inject(@re, :<<).sort_by{|e| e[:start]} - events = allevents.to_json - events = JSON.parse(events) - events.each_with_index do |e,i| - e["can_edit"] = can_edit_or_delete_event?(allevents[i]) - @events << e + allevents = Event.with_categories(filters("category")) + .with_tags(filters("tag")).agenda_events(sdt,edt, params[:display_hide] == 'true') + allevents.each do |e| + event_json = e.as_json + event_json["can_edit"] = can_edit_or_delete_event?(e) + @events << event_json end end if request.xhr? @@ -94,17 +91,29 @@ class Admin::CalendarsController < OrbitAdminController # GET /events/1/edit def edit @event = Event.find(params[:id]) - categories = user_authenticated_categories rescue [] - if categories.first == "all" - @categories = CalendarType.all + if params[:hide] + hide_mode = (params[:hide] == 'true') + start = params[:start] + if hide_mode + @event.hide_start << start + else + @event.hide_start.delete(start) + end + @event.save + render :json => {:success=>true}.to_json else - @categories = CalendarType.where(:category_id.in => categories) rescue [] + categories = user_authenticated_categories rescue [] + if categories.first == "all" + @categories = CalendarType.all + else + @categories = CalendarType.where(:category_id.in => categories) rescue [] + end + @end_d_t = @event.end.strftime("%Y/%m/%d %H:%M").to_s + @start_d_t = @event.start.strftime("%Y/%m/%d %H:%M").to_s + @all_day = @event.all_day + @recurring = @event.recurring + render :layout => false end - @end_d_t = @event.end.strftime("%Y/%m/%d %H:%M").to_s - @start_d_t = @event.start.strftime("%Y/%m/%d %H:%M").to_s - @all_day = @event.all_day - @recurring = @event.recurring - render :layout => false end # POST /events @@ -138,8 +147,7 @@ class Admin::CalendarsController < OrbitAdminController bulletin.update_attributes(calendar_start_date: p1[:start],calendar_end_date: p1[:end],calendar_all_day: p1[:all_day],calendar_type_id: p1[:calendar_type_id]) end if @event.update_attributes(p1) - e = @event.to_json - e = JSON.parse(e) + e = @event.as_json({}, true) e["can_edit"] = true render json: e.to_json else diff --git a/app/models/event.rb b/app/models/event.rb index c8d749d..573cfd1 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -29,6 +29,7 @@ class Event belongs_to :calendar_type field :url field :url_translations, type: Hash, default: {} + field :hide_start, type: Array, default: [] # store date string, ex: ["2022-07-29"] def get_module_url page = !self.model_page_id.blank? ? Page.find(self.model_page_id): Page.where(:module => self.module_key).where(:categories.in => Array(self.model_cat)+[[]],:tags.in=>Array(self.model_tags)+[[]]).first page.nil? ? '' : (page.url+'/'+eval(self.model_class).where(:id=>self.model_id).first.to_calendar_param) @@ -66,11 +67,15 @@ class Event self['title'] = self.title self['note'] = self.note self['url'] = self.url + if self.hide_start_changed? + self.hide_start.sort! + end if self.is_weekdays self.weekdays = (1..5).to_a #平日 else self.weekdays = self.weekdays.map{|s| s.to_i}.sort end + true end ######################################## validates_presence_of :title, :message => "Please fill the title of the Event", :if => lambda { self['title_translations'].blank? } @@ -108,7 +113,7 @@ class Event "Yearly" ] - def as_json(options = {}) + def as_json(options = {}, preserve_hide = false) tmp_note = self.note || "" if self.recurring freq = self.frequency.to_i @@ -149,55 +154,72 @@ class Event tmp_note = I18n.t("calendar.every_year_day", {:every_n_years=>every_n_years,:date=>date}) + "
" + tmp_note end end + hide = false if options["frontend"] - { - :id => self.id.to_s, - :title => self.title, - :note => tmp_note, - :start => self.start.to_json.gsub('"',''), - :end => (self.all_day ? [self.start, self.end - 1.day].max : self.end).to_json.gsub('"',''), - :allDay => self.all_day, - :recurring => self.recurring, - :calendar => self.calendar_type_id.to_s, - :color => (self.calendar_type.color rescue nil), - :diff_day => self.all_day - } + if (self.recurring && self.hide_start.include?(self.start)) + hide = true + nil + else + { + :id => self.id.to_s, + :title => self.title, + :note => tmp_note, + :start => self.start.to_json.gsub('"',''), + :end => (self.all_day ? [self.start, self.end - 1.day].max : self.end).to_json.gsub('"',''), + :allDay => self.all_day, + :recurring => self.recurring, + :calendar => self.calendar_type_id.to_s, + :color => (self.calendar_type.color rescue nil), + :diff_day => self.all_day + } + end else - { - :id => self.id.to_s, - :title => self.title, - :note => tmp_note, - :start => self.start.to_json.gsub('"',''), - :end => (self.all_day ? [self.start, self.end - 1.day].max : self.end).to_json.gsub('"',''), - :allDay => self.all_day, - :recurring => self.recurring, - :calendar => self.calendar_type_id.to_s, - :color => (self.calendar_type.color rescue nil), - :diff_day => self.all_day, - :edit_url => Rails.application.routes.url_helpers.edit_admin_calendar_path(:locale=>I18n.locale, :id=>self.id), - :delete_url => Rails.application.routes.url_helpers.admin_calendar_path(:locale=>I18n.locale, :id=>self.id) - } + need_hide = (self.recurring && self.hide_start.include?(self.start.strftime("%Y-%m-%d"))) + unless preserve_hide + hide = need_hide + end + if hide + nil + else + org_color = (self.calendar_type.color rescue nil) + { + :id => self.id.to_s, + :title => self.title, + :note => tmp_note, + :start => self.start.to_json.gsub('"',''), + :end => (self.all_day ? [self.start, self.end - 1.day].max : self.end).to_json.gsub('"',''), + :allDay => self.all_day, + :recurring => self.recurring, + :calendar => self.calendar_type_id.to_s, + :color => (need_hide ? "#c0c0c0" : org_color), + :diff_day => self.all_day, + :edit_url => Rails.application.routes.url_helpers.edit_admin_calendar_path(:locale=>I18n.locale, :id=>self.id), + :delete_url => Rails.application.routes.url_helpers.admin_calendar_path(:locale=>I18n.locale, :id=>self.id), + :hide => need_hide, + :org_color => org_color, + :hide_color => "#c0c0c0" + } + end end - end def self.monthly_event(start_date,end_date) self.any_of({:start.lte => start_date,:end.gte => start_date},{:start.gte => start_date,:end.lte => end_date},{:start.lte => end_date,:end.gte => end_date}).asc(:start) end - def self.convert_front + def self.convert_front(preserve_hide=false) self.all.collect do |re| - re.as_json - end + re.as_json({}, preserve_hide) + end.compact end def self.get_diff_month(date1,date2) (date2.year-date1.year)*12+(date2.month-date1.month) end - def self.recurring_event(start_date,end_date) + def self.recurring_event(start_date, end_date, preserve_hide=false) @recurring_events = self.where(:recurring => true).any_of({:recurring_end_date=>nil}, {:recurring_end_date.gte=>start_date.utc}) @recurring = [] @recurring_events.each do |re| has_recurring_end_date = re.recurring_end_date.present? - data = re.as_json + data = re.as_json({}, true) period_str = nil is_month = false is_year = false @@ -228,6 +250,7 @@ class Event @end_date = (re.all_day ? [re.start, re.end - 1.day].max : re.end) freq = re.frequency.to_i interval = freq.send(period_str) + tmp_hide_start = re.hide_start.clone if is_month add_interval = ((start_date.year * 12 + start_date.month) - (@start_date.year * 12 + @start_date.month) - 1) elsif is_year @@ -252,21 +275,60 @@ class Event @start_date += add_interval @end_date += add_interval new_end_date = has_recurring_end_date ? [re.recurring_end_date,end_date].min : end_date + need_check_hide = false + if tmp_hide_start.count != 0 + tmp = @start_date.strftime("%Y-%m-%d") + st_idx = tmp_hide_start.index{|s| s >= tmp} + if st_idx.nil? + tmp_hide_start = [] + else + tmp_hide_start = tmp_hide_start[st_idx..-1] + end + need_check_hide = true + else + need_check_hide = false + end while @start_date <= new_end_date do if weekdays + if need_check_hide + tmp_hide_start2 = tmp_hide_start[0..-1] #clone array + end_check = (@start_date + 6.day).strftime("%Y-%m-%d") + last_idx = tmp_hide_start2.index{|s| s > end_check} + if last_idx + tmp_hide_start2 = tmp_hide_start2[0...last_idx] + tmp_hide_start = tmp_hide_start[last_idx..-1] + need_check_hide = tmp_hide_start.count != 0 + end + else + tmp_hide_start2 = [] + end weekdays.each do |w| new_start = (@start_date + w.day) if need_check_start && new_start < start_date next end if new_start != org_start - @recurring << data.merge({:start => new_start.to_json.gsub('"',''), :end => (@end_date + w.day).to_json.gsub('"','')}) + hide = need_check_hide && tmp_hide_start2.include?(new_start.strftime("%Y-%m-%d")) + if hide + if preserve_hide + @recurring << data.merge({:start => new_start.to_json.gsub('"',''), :end => (@end_date + w.day).to_json.gsub('"',''), :hide=>true, :color=>"#c0c0c0"}) + end + else + @recurring << data.merge({:start => new_start.to_json.gsub('"',''), :end => (@end_date + w.day).to_json.gsub('"',''), :hide=>false, :color => data[:org_color]}) + end end end need_check_start = false else if @start_date != org_start - @recurring << data.merge({:start => @start_date.to_json.gsub('"',''), :end => @end_date.to_json.gsub('"','')}) + hide = need_check_hide && tmp_hide_start.include?(@start_date.strftime("%Y-%m-%d")) + if hide + if preserve_hide + @recurring << data.merge({:start => @start_date.to_json.gsub('"',''), :end => @end_date.to_json.gsub('"',''), :hide=>true, :color=>"#c0c0c0"}) + end + else + @recurring << data.merge({:start => @start_date.to_json.gsub('"',''), :end => @end_date.to_json.gsub('"',''), :hide=>false, :color => data[:org_color]}) + end end end @start_date += interval @@ -280,9 +342,9 @@ class Event @recurring end - def self.agenda_events(agenda_start, agenda_end) - recurring = self.recurring_event(agenda_start,agenda_end) - events = self.monthly_event(agenda_start, agenda_end).convert_front + def self.agenda_events(agenda_start, agenda_end, preserve_hide=false) + recurring = self.recurring_event(agenda_start,agenda_end, preserve_hide) + events = self.monthly_event(agenda_start, agenda_end).convert_front(preserve_hide) recurring = recurring.concat(events) recurring end diff --git a/app/views/admin/calendars/index.html.erb b/app/views/admin/calendars/index.html.erb index 8e55b2c..924cae4 100644 --- a/app/views/admin/calendars/index.html.erb +++ b/app/views/admin/calendars/index.html.erb @@ -15,6 +15,20 @@ margin-left: 0; } +
" method="get"> + <% CGI.parse(request.query_string).each do |k,v| %> + <% if k != 'display_hide' %> + <% if v.class == Array %> + <% v.each do |vv| %> + + <% end %> + <% else %> + + <% end %> + <% end %> + <% end %> + ><%= t('calendar.display_hide_events') %> +
@@ -61,4 +75,9 @@
<%= link_to "Add", new_admin_calendar_path, :class => "btn btn-primary", :id=>"create_event_btn", :ref=>"add-btn" %> -
\ No newline at end of file +
+ \ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index 7539f55..6e5befa 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1,5 +1,6 @@ en: calendar: + display_hide_events: Display hide events conj: ", " and: " and " every_n_years: "Every %{num} years" diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index 45ec323..7eb174c 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -1,5 +1,6 @@ zh_tw: calendar: + display_hide_events: 顯示隱藏事件 conj: "、" and: "與" every_n_years: "每%{num}年"