1/*! 2 * fullcalendar-rightclick v2.1 3 * Docs & License: https://github.com/mherrmann/fullcalendar-rightclick 4 * (c) 2015 Michael Herrmann 5 */ 6 7(function($) { 8 function monkeyPatchViewClass(View) { 9 View = View.class || View; 10 var renderFn = 'render' in View.prototype ? 'render' : 'renderDates'; 11 var originalRender = View.prototype[renderFn]; 12 View.prototype[renderFn] = function() { 13 originalRender.call(this); 14 if (! this.el.data('fullcalendar-rightclick')) { 15 this.registerRightclickListener(); 16 this.el.data('fullcalendar-rightclick', true); 17 } 18 }; 19 function trigger() { 20 throw new Error("trigger not detected"); 21 } 22 function oldTrigger(triggerFn) { 23 return function trigger(that, jsEventName, view, dateOrEvent, jsEvent) { 24 return that[triggerFn](jsEventName, view, dateOrEvent, jsEvent) 25 }; 26 } 27 if (typeof View.prototype.publiclyTrigger === 'function') { 28 if (View.prototype.publiclyTrigger.toString().match(/name, thisObj/)) { 29 // FullCalendar >= 3.1.0 && < 3.5.0: 30 trigger = oldTrigger('publiclyTrigger'); 31 } 32 else { 33 // FullCalendar >= 3.5.0: 34 trigger = function (that, jsEventName, view, dateOrEvent, jsEvent) { 35 return that.publiclyTrigger(jsEventName, [ dateOrEvent, jsEvent, view ]); 36 }; 37 } 38 } else { 39 // FullCalendar < 3.1.0: 40 trigger = oldTrigger('trigger'); 41 } 42 View.prototype.registerRightclickListener = function() { 43 var that = this; 44 // FullCalendar > 3.0.1: 45 this.el.on('contextmenu', function(ev) { 46 var eventElt = $(ev.target).closest('.fc-event'); 47 if (eventElt.length) { 48 var seg = eventElt.data('fc-seg'); 49 var event; 50 if (typeof seg.event === 'object') { 51 event = seg.event; 52 } else { 53 event = seg.footprint.eventDef; 54 } 55 return trigger(that, 'eventRightclick', this, event, ev); 56 } else { 57 // Users of this library may add custom content inside 58 // FullCalendar's DOM structure, eg. popovers. We don't want 59 // to catch rightclicks on these custom elements, so we 60 // check that the clicked element actually lies inside one 61 // of FullCalendars default containers: 62 var fcContainer = $(ev.target).closest( 63 '.fc-bg, .fc-slats, .fc-content-skeleton, ' + 64 '.fc-bgevent-skeleton, .fc-highlight-skeleton' 65 ); 66 if (fcContainer.length) { 67 var cell; 68 if (that.coordMap) { 69 // FullCalendar < 2.5.0: 70 that.coordMap.build(); 71 cell = that.coordMap.getCell(ev.pageX, ev.pageY); 72 } else { 73 // FullCalendar >= 2.5.0: 74 that.prepareHits(); 75 var hit = that.queryHit(ev.pageX, ev.pageY); 76 if (typeof that.getHitSpan === 'function') { 77 // FullCalendar >= 2.5.0 && < 3.5.0: 78 cell = that.getHitSpan(hit); 79 } else { 80 // FullCalendar >= 3.5.0: 81 if (hit.row) { 82 cell = hit.component.getCellRange(hit.row, hit.col); 83 } else { 84 var componentFootprint = hit.component.getSafeHitFootprint(hit); 85 if (componentFootprint) { 86 cell = that.calendar.footprintToDateProfile(componentFootprint); 87 } 88 } 89 } 90 } 91 if (cell) 92 return trigger(that, 'dayRightclick', null, cell.start, ev); 93 } 94 } 95 }); 96 }; 97 } 98 var fc = $.fullCalendar; 99 monkeyPatchViewClass(fc.views.agenda); 100 monkeyPatchViewClass(fc.views.basic); 101})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.