diff --git a/vendor/built_in_modules/calendar_new/app/assets/javascripts/calendar_frontend.js b/vendor/built_in_modules/calendar_new/app/assets/javascripts/calendar_frontend.js new file mode 100644 index 00000000..c26576a0 --- /dev/null +++ b/vendor/built_in_modules/calendar_new/app/assets/javascripts/calendar_frontend.js @@ -0,0 +1,503 @@ +var Calendar = function(dom){ + + c = this; + this.title = $("#current_title"); + this.calendar = $(dom); + this.nextBtn = $("#next_month_btn"); + this.prevBtn = $("#prev_month_btn"); + this.todayBtn = $("#today_btn"); + this.modeBtns = $(".calendar_mode button"); + this.refreshBtn = $("#refresh_btn"); + this.dialog = new EventDialog(c); + this.loading = $('#calendar-loading'); + this.agenda_space = $("#calendar_agenda"); + this.currentView = "month"; + this.navigation = $("#navigation"); + this.rangeSelection = $("#range_selection"); + var agendaView = new AgendaView(c); + var loadeventsonviewchange = false; + + this.initialize = function(){ + var date = new Date(); + var d = date.getDate(); + var m = date.getMonth(); + var y = date.getFullYear(); + var dview = (c.currentView == "agenda" ? "month" : c.currentView); + c.calendar.fullCalendar({ + editable: false, + selectable: false, + events: "/panel/calendar_new/back_end/events/", + header: false, + default: dview, + height: $("body").height() - 141, + loading: function(bool) { + if (bool) c.loading.css("left",($(window).width()/2 - 60) + "px").show(); + else c.loading.hide(); + }, + windowResize : function(view){ + view.setHeight($("body").height() - 141); + c.calendar.fullCalendar("refetchEvents"); + }, + viewDisplay: function(view) { + c.title.html(view.title); + }, + eventClick: function(calEvent, e, view) { + c.dialog.dismiss(); + c.dialog.inflate(calEvent); + c.dialog.show({"x":e.originalEvent.clientX,"y":e.originalEvent.clientY}); + } + }); + + c.nextBtn.click(function(){ + c.dialog.dismiss(); + c.calendar.fullCalendar('next'); + }); + c.prevBtn.click(function(){ + c.dialog.dismiss(); + c.calendar.fullCalendar('prev'); + }); + c.todayBtn.click(function(){ + c.dialog.dismiss(); + c.calendar.fullCalendar('today'); + }); + c.modeBtns.click(function(){ + c.dialog.dismiss(); + toggleViews($(this).data("mode")); + }); + c.refreshBtn.click(function(){ + c.dialog.dismiss(); + if(c.currentView == "agenda") + agendaView.refresh(); + else + c.calendar.fullCalendar("refetchEvents"); + }); + + var toggleViews = function(view){ + c.modeBtns.removeClass("active"); + c.modeBtns.each(function(){ + if ($(this).data("mode") == view) + $(this).addClass("active"); + }) + if(view != "agenda"){ + if(c.currentView == "agenda"){ + $("#sec1").addClass("span3").removeClass("span7"); + $("#sec2").show(); + $("#sec3").addClass("span4").removeClass("span5"); + agendaView.hide(); + } + c.calendar.fullCalendar('changeView',view); + }else{ + $("#sec1").addClass("span7").removeClass("span3"); + $("#sec2").hide(); + $("#sec3").addClass("span5").removeClass("span4"); + agendaView.inflate(); + } + c.currentView = view; + if(loadeventsonviewchange){ + c.calendar.fullCalendar("refetchEvents"); + loadeventsonviewchange = false; + } + } + if(c.currentView == "agenda"){toggleViews("agenda");loadeventsonviewchange = true;} + + } + + this.renderEvent = function(eventStick){ + if(eventStick.recurring == true) + c.calendar.fullCalendar("refetchEvents"); + else + c.calendar.fullCalendar("renderEvent",eventStick); + } + + + $(document).ready(function() { + c.initialize(); + }); +} + +var EventDialog = function(calendar,event){ + _t = this; + var event_quick_view = null; + var template = ""; + var _this_event = null; + this.inflate = function(_event){ + if(!_event) throw new UserException("EventStick can't be null!"); + _this_event = _event; + var start_time = "", + end_time = "", + time_string = null; + + if(_event.allDay){ + start_time = (/00:00:00/i.test(_event._start.toLocaleString()) ? $.fullCalendar.formatDate(_event._start,"ddd MMM dd, yyyy") : $.fullCalendar.formatDate(_event._start,"ddd MMM dd, yyyy hh:mm")); + if(_event._end) + end_time = (/00:00:00/i.test(_event._end.toLocaleString()) ? $.fullCalendar.formatDate(_event._end,"ddd MMM dd, yyyy") : $.fullCalendar.formatDate(_event._end,"ddd MMM dd, yyyy hh:mm")); + time_string = (_event._start === _event._end || !_event._end ? start_time : start_time + " - " + end_time); + }else{ + var reg = new RegExp(/ [0-9][0-9]:[0-9][0-9]:[0-9][0-9]/), + stime = _event._start.toLocaleString().match(reg).toString(), + etime = _event._end.toLocaleString().match(reg).toString(); + + start_time = _event._start.toLocaleString().replace(stime,","); + end_time = _event._end.toLocaleString().replace(etime,","); + + stime = stime.substr(0,stime.length - 3); + etime = etime.substr(0,etime.length - 3); + + time_string = (start_time === end_time ? start_time + " " + stime + " - " + etime : start_time + " " + stime + " - " + end_time + " " +etime ); + } + event_quick_view = $(''); + template = ''; + } + + this.show = function(pos){ + if(pos){ + var pos = getPosition(pos); + event_quick_view.css({"left":pos.x+"px","top":pos.y+"px"}); + } + event_quick_view.html(template).appendTo("body").show(); + 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;}); + } + + this.dismiss = function(){ + if(event_quick_view) + event_quick_view.remove(); + } + + var getPosition = function(pos){ + var x = pos.x, + y = pos.y, + winheight = $(window).height(); + if((x + event_quick_view.width()) > $(window).width()){ + x = x - event_quick_view.width(); + } + if((y + event_quick_view.height()) > winheight){ + y = y - event_quick_view.height(); + } + return {"x":x,"y":y}; + } + + if(event) + _t.inflate(event); +} + +var UserException = function(message) { + this.message = message; + this.name = "UserException"; + this.toString = function(){ + return this.message; + } +} + +var AgendaView = function(calendar){ + var av = this; + var _calendar = calendar; + var agenda_space = _calendar.agenda_space; + var today = new Date(); + var minDifference = 6; + var start_month = today.getMonth(); + var start_year = today.getFullYear(); + var end_month = ((start_month + minDifference) > 11 ? (start_month + minDifference) - 11 : start_month + minDifference); + var end_year = ((start_month + minDifference) > 11 ? start_year+1 : start_year); + var monthNames = ['January','February','March','April','May','June','July','August','September','October','November','December']; + var month_template = '

SunMonTueWedThuFriSat
'; + + var event_list_template = '
No events for this month.
'; + + var head_template = '
'; + + var event_template = "
"; + + var cache = false; + var show_event_clicked = false; + + this.refresh = function(){ + av.inflate(true); + } + + this.inflate = function(forceInflation){ + loading(true); + _calendar.calendar.hide(); + _calendar.navigation.hide(); + + if(!forceInflation){ + if(cache){ + av.show(); + loading(false); + return; + } + } + + agenda_space.empty(); + if(!show_event_clicked){ + _calendar.rangeSelection.empty(); + _calendar.rangeSelection.append(renderHead().html()).show(); + _calendar.rangeSelection.find("button#show_events").click(function(){ + show_event_clicked = true; + start_month = parseInt($("select[name=start_month]").val()); + end_month = parseInt($("select[name=end_month]").val()); + start_year = parseInt($("select[name=start_year]").val()); + end_year = parseInt($("select[name=end_year]").val()); + av.inflate(true); + }) + } + show_event_clicked = false; + eventsManager(); + var s = start_month, + e = end_month + y = start_year; + e = (e > s && start_year == end_year? e : e + 11); + if(end_year > start_year) + e = e + ((end_year - start_year -1) * 12); + else e--; + for(var i = s;i <= e+1; i++){ + var m = new Month(s,y); + s++; + if(s > 11){ + s = 0; + y++; + } + if(e == 0) + agenda_space.text("Invalid Range of Dates.") + else + agenda_space.append(m.monthDom); + } + + loading(false); + } + + this.hide = function(){ + cache = true; + _calendar.rangeSelection.hide(); + agenda_space.hide(); + _calendar.navigation.show(); + _calendar.calendar.show(); + } + + this.show = function(){ + _calendar.rangeSelection.show(); + agenda_space.show(); + } + var copyObject = function(x){ + return x.clone(); + } + var eventsManager = function(){ + var url = "/panel/calendar_new/back_end/events/agenda", + sd = new Date(start_year,start_month,1), + ed = new Date(end_year,end_month+1,0); + $.ajax({ + type : "get", + url : url, + data : {"agenda_start":sd.toLocaleString(),"agenda_end":ed.toLocaleString()}, + success : function(events){ + $.each(events,function(i,e){ + var ed = eventDom(e), + s = new Date(e.start), + e = new Date(e.end), + e_m = ((e.getMonth() > s.getMonth() || s.getMonth() == e.getMonth()) && s.getFullYear() == e.getFullYear() ? e.getMonth() : e.getMonth() + 12) + s_m = s.getMonth(), + s_y = s.getFullYear(); + if(e.getFullYear() > s.getFullYear()) + e_m = e_m + ((e.getFullYear() - s.getFullYear() -1) * 12); + for(var i = s_m; i < e_m + 1; i++){ + var temp_ed = copyObject(ed); + var list = agenda_space.find("div[data-month="+s_m+"][data-year="+s_y+"] table.event_list tbody"); + list.append(temp_ed); + s_m++; + if(s_m > 11){ + s_m = 0; + s_y++; + } + } + if(s.getDate() == e.getDate() && s.getMonth() == s.getMonth() && e.getFullYear() == e.getFullYear()){ + var td = agenda_space.find("td[data-date-node="+s.getDate()+"-"+s.getMonth()+"-"+s.getFullYear()+"]"); + td.addClass("has_event"); + }else{ + var timeDiff = Math.abs(e.getTime() - s.getTime()), + diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24)), + c_m = s.getMonth(), + c_d = s.getDate(), + c_y = s.getFullYear(), + end_of_c_month = new Date(s.getFullYear(),s.getMonth()+1,0).getDate(); + + for(var i = 0; i <= diffDays; i++){ + var td = agenda_space.find("td[data-date-node="+c_d+"-"+c_m+"-"+c_y+"]"); + td.addClass("has_event"); + c_d++; + if(c_d > end_of_c_month){ + c_d = 1; + c_m++; + if(c_m > 11){ + c_m = 0; + c_y++; + } + } + } + } + }) + agenda_space.find("table.event_list tbody").each(function(){ + if($(this).find("tr").length > 1) + $(this).find("td.no_events").parent().remove(); + }) + } + }) + var eventDom = function(event){ + var e_t = $(event_template), + s = new Date(event.start), + e = new Date(event.end), + dateFormat = ""; + if(s.getDate() == e.getDate() && s.getMonth() == s.getMonth() && e.getFullYear() == e.getFullYear()) + dateFormat = $.fullCalendar.formatDate(s, "ddd dd"); + else + dateFormat = $.fullCalendar.formatDates(s, e, "ddd dd, MMM - {ddd dd, MMM}"); + e_t.find("th").text(dateFormat); + e_t.find("td.event_time").text((event.allDay ? "All Day" : $.fullCalendar.formatDate(s, "hh:mm"))); + e_t.find("div.event").text(event.title).css("color",event.color); + return e_t; + } + + } + + var loading = function(bool) { + if (bool) _calendar.loading.css("left",($(window).width()/2 - 60) + "px").show(); + else _calendar.loading.hide(); + } + + var renderHead = function(){ + var head = $(head_template); + var start_month_select = head.find("select[name=start_month]"); + for(var i = 0; i < 12; i++){ + var option = $(""); + if(i == start_month) + option.attr("selected","selected"); + start_month_select.append(option); + } + var end_month_select = head.find("select[name=end_month]"); + for(var i = 0; i < 12; i++){ + var option = $(""); + if(i == end_month) + option.attr("selected","selected"); + end_month_select.append(option); + } + + var start_year_select = head.find("select[name=start_year]"); + var y = start_year - 5; + for(var i = 0; i < 10; i++){ + var option = $(""); + if(y == start_year) + option.attr("selected","selected"); + start_year_select.append(option); + y++; + } + var end_year_select = head.find("select[name=end_year]"); + y = start_year - 5; + for(var i = 0; i < 10; i++){ + var option = $(""); + if(y == end_year) + option.attr("selected","selected"); + end_year_select.append(option); + y++; + } + return head; + } + + var Month = function(month,year){ + _this = this; + this.monthDom = $("
"); + var template = $(month_template); + var list_template = $(event_list_template); + var firstDay = new Date(year,month,1); + var lastDay = new Date(year,month+1,0); + + var last_inserted_date = 1; + + var renderMonth = function(){ + for(var i = 0; i < 5; i++){ + var tr = null; + if(i == 0) + tr = makeRow("first"); + else if(i == 4){ + tr = makeRow("last"); + }else{ + tr = makeRow("middle"); + } + template.find("table.table tbody").append(tr); + template.find("h4").text(monthNames[firstDay.getMonth()] + " - " + firstDay.getFullYear()); + } + _this.monthDom.append(template); + _this.monthDom.append(list_template); + } + + var makeRow = function(position){ + var row = $(""); + switch (position){ + case "first": + for(var i = 0;i < 7;i++){ + var td = $(""); + if(i >= firstDay.getDay()){ + td.text(last_inserted_date); + td.attr("data-date-node",last_inserted_date+"-"+firstDay.getMonth()+"-"+firstDay.getFullYear()); + last_inserted_date++; + } + row.append(td); + } + break; + case "middle": + for(var i = 0;i < 7;i++){ + var td = $(""); + td.text(last_inserted_date); + td.attr("data-date-node",last_inserted_date+"-"+firstDay.getMonth()+"-"+firstDay.getFullYear()); + last_inserted_date++; + row.append(td); + } + break; + case "last": + for(var i = 0;i < 7;i++){ + var td = $(""); + if(i <= lastDay.getDay()){ + td.text(last_inserted_date); + td.attr("data-date-node",last_inserted_date+"-"+firstDay.getMonth()+"-"+firstDay.getFullYear()); + last_inserted_date++; + } + row.append(td); + } + break; + } + return row; + } + + renderMonth(); + } + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/built_in_modules/calendar_new/app/controllers/panel/calendar_new/back_end/events_controller.rb b/vendor/built_in_modules/calendar_new/app/controllers/panel/calendar_new/back_end/events_controller.rb index 1cb702b2..5b98404f 100644 --- a/vendor/built_in_modules/calendar_new/app/controllers/panel/calendar_new/back_end/events_controller.rb +++ b/vendor/built_in_modules/calendar_new/app/controllers/panel/calendar_new/back_end/events_controller.rb @@ -34,6 +34,7 @@ class Panel::CalendarNew::BackEnd::EventsController < OrbitBackendController agenda_end = Date.parse(params[:agenda_end]) @events = Event.agenda_events(agenda_start,agenda_end) render :json=>@events.to_json + end # GET /events/new diff --git a/vendor/built_in_modules/calendar_new/app/models/event.rb b/vendor/built_in_modules/calendar_new/app/models/event.rb index 2fefe7b4..5494aa04 100644 --- a/vendor/built_in_modules/calendar_new/app/models/event.rb +++ b/vendor/built_in_modules/calendar_new/app/models/event.rb @@ -42,7 +42,7 @@ class Event :allDay => self.all_day, :recurring => self.recurring, :calendar => self.category_id, - :color => Category.find(self.category_id).custom_value, + :color => (Category.find(self.category_id).custom_value rescue nil), :edit_url => Rails.application.routes.url_helpers.edit_panel_calendar_new_back_end_event_path(self.id), :delete_url => Rails.application.routes.url_helpers.panel_calendar_new_back_end_event_path(self.id) } diff --git a/vendor/built_in_modules/calendar_new/app/views/panel/calendar_new/front_end/events/index.html.erb b/vendor/built_in_modules/calendar_new/app/views/panel/calendar_new/front_end/events/index.html.erb index b9b694c6..683858c5 100644 --- a/vendor/built_in_modules/calendar_new/app/views/panel/calendar_new/front_end/events/index.html.erb +++ b/vendor/built_in_modules/calendar_new/app/views/panel/calendar_new/front_end/events/index.html.erb @@ -1,6 +1,6 @@ <%= javascript_include_tag 'fullcalendar' %> -<%= javascript_include_tag 'calendar' %> +<%= javascript_include_tag 'calendar_frontend' %> <%= javascript_include_tag 'bootstrap-datetimepicker' %> <%= stylesheet_link_tag "fullcalendar"%> @@ -41,7 +41,6 @@ -
Loading...