2012-04-04 10 views
20

मैं एक वेबपैप विकसित कर रहा हूं और jQuery fullcalendar plugin का उपयोग कर रहा हूं।jQuery पूर्णकेंडर प्लगइन में टाइम्सलॉट श्रेणियों को अक्षम करें

मुझे कुछ समय-स्लॉट अक्षम करने की आवश्यकता है।

वर्तमान विधि का उपयोग मैं समय-स्लॉट के लिए ईवेंट जोड़ना चाहता हूं जिसे मैं अक्षम करना चाहता हूं और ईवेंट ओवरलैपिंग को अस्वीकार करना चाहता हूं।

क्या ऐसा करने का कोई बेहतर तरीका है? मैं घटना ओवरलैपिंग की अनुमति नहीं देता हूं।

मैं उपरोक्त समस्या के समाधान के साथ रह सकता हूं: काले टाइम्सलॉट जोड़ना और उन क्षेत्रों में टाइम्सलॉट जोड़ने की अनुमति देना।


फिर भी मुझे एक और दबदबा समस्या है। मुझे कुछ समय सीमाओं के लिए स्लॉट के पृष्ठभूमि रंग को बदलने में सक्षम होना चाहिए। आदर्श रूप से मैं इस तरह का उपयोग घटना स्रोतों के समान ही करूँगा; बस एक यूआरएल को इंगित करें और रंगीन श्रेणियों को AJAX/Json के साथ वापस भेजें।

मैं जो आखिरी समस्या जोड़ने जा रहा हूं वह इस आखिरी समस्या (रंगीन स्लॉट रेंज, साथ ही दिन और सप्ताह के दृश्य में) के लिए है। अगर कोई मुझे किसी अन्य समाधान के लिए सुझाव दे सकता है तो पूरा कैलेंडर जो यह कर सकता है, यह भी ठीक है।

+0

अभी तक कोई बेहतर विचार नहीं है; मैंने ब्लैक टाइम्सलॉट्स को जोड़ा और घटनाओं को पकड़ने की योजना बनाई जब कोई समय-समय पर बनाता है या विस्तार करता है और उन्हें काले (अक्षम) स्लॉट के साथ ओवरलैप करने की अनुमति देता है। अगर मुझे एक बेहतर तरीका मिल जाए, तो मैं निश्चित रूप से इसे यहां पोस्ट करूंगा। वर्तमान समाधान के बारे में – Tom

+0

। सप्ताह के दृश्य में जब आप एक समय स्लॉट अक्षम करते हैं, तो यह पूरे सप्ताह के लिए अक्षम हो जाता है। आप 6/8/2012 के लिए केवल 6 am-7am अक्षम नहीं कर सकते हैं। सही ? –

+0

हाँ आप कर सकते हैं; मैं सिर्फ एक दी गई अवधि के लिए टाइम्सलॉट बना देता हूं (यदि मुझे न्यूनतम गलती नहीं है तो 15 मिनट है)। आगे, यदि कोई इसके साथ टाइमलॉट ओवरलैपिंग करने का प्रयास करता है, तो मैं इसे ईवेंट हैंडलर में अस्वीकार कर दूंगा। मैं सर्वर की तरफ जांचने की योजना बना रहा हूं और इसके लिए AJAX का उपयोग कर रहा हूं। जैसा कि आपने शायद देखा है; यह परियोजना अभी तक समाप्त नहीं हुई है, टीबीएच में मेरे हाथों में कुछ देरी है, लेकिन जल्द ही मैं आपको जो कुछ भी बता रहा हूं उसे लागू कर दूंगा; मैंने अवधारणा के प्रमाण के रूप में पहले ही कुछ गंभीर परीक्षण किया है। – Tom

उत्तर

-1

मैं एक कैलेंडर का उपयोग करके एक समाधान मिल गया।

इस कैलेंडर में फ्रीब्यूसी नामक एक सुविधा है। यह व्यस्त और नि: शुल्क टाइमलॉट श्रेणियों के लिए उपयोग किया जाने वाला है, लेकिन स्रोत कोड को थोड़ा सा बदलकर, मैं टाइम्सलॉट श्रेणियों में पृष्ठभूमि रंग जोड़ सकता हूं। मैं विधि freeBusyRender इस प्रकार बदल दिया है:

freeBusyRender: function(freeBusy, $freeBusy, calendar) { 
    if(freeBusy.free == 't_red') { 
     $freeBusy.css("backgroundColor", "red"); 
    } else if(freeBusy.free == 't_green') { 
     $freeBusy.css("backgroundColor", "green"); 
    } else if(freeBusy.free == 't_blue') { 
     $freeBusy.css("backgroundColor", "blue"); 
    } else if(freeBusy.free == 't_black') { 
     $freeBusy.css("backgroundColor", "black"); 
    } 
    $freeBusy.addClass('free-busy-free'); 
    return $freeBusy; 
} 

फिर, इस प्रकार मैं कैलेंडर को प्रारंभ कर सकते हैं:

(function($) { 
    d = new Date(); 
    d.setDate(d.getDate() - (d.getDay() - 3)); 
    year = d.getFullYear(); 
    month = d.getMonth(); 
    day = d.getDate(); 
    var eventData2 = { 
     options: { 
      timeslotsPerHour: 4, 
      timeslotHeight: 12, 
      defaultFreeBusy: { free: true } 
     }, 
     events: [ 
      { 'id': 1, 'start': new Date(year, month, day, 12), 'end': new Date(year, month, day, 13, 00), 'title': 'Lunch with Sarah'}, 
      { 'id': 2, 'start': new Date(year, month, day, 14), 'end': new Date(year, month, day, 14, 40), 'title': 'Team Meeting'}, 
      { 'id': 3, 'start': new Date(year, month, day + 1, 18), 'end': new Date(year, month, day + 1, 18, 40), 'title': 'Meet with Joe'}, 
      { 'id': 4, 'start': new Date(year, month, day - 1, 8), 'end': new Date(year, month, day - 1, 9, 20), 'title': 'Coffee with Alison'}, 
      { 'id': 5, 'start': new Date(year, month, day + 1, 14), 'end': new Date(year, month, day + 1, 15, 00), 'title': 'Product showcase'} 
     ], 
     freebusys: [ 
      { 'start': new Date(year, month, day - 1, 8), 'end': new Date(year, month, day - 1, 18), 'free': 't_red'}, 
      { 'start': new Date(year, month, day, 8), 'end': new Date(year, month, day + 0, 18), 'free': 't_green' }, 
      { 'start': new Date(year, month, day + 1, 8), 'end': new Date(year, month, day + 1, 18), 'free': 't_blue' }, 
      { 'start': new Date(year, month, day + 2, 14), 'end': new Date(year, month, day + 2, 18), 'free': 't_black'}, 
      { 'start': new Date(year, month, day + 3, 8), 'end': new Date(year, month, day + 3, 18), 'free': 't_red' } 
     ] 
    }; 
    $(document).ready(function() { 
     var $calendar = $('#calendar').weekCalendar({ 

     allowCalEventOverlap: true, 
     overlapEventsSeparate: true, 
     totalEventsWidthPercentInOneColumn: 95, 

     timeslotsPerHour: 4, 
     scrollToHourMillis: 0, 
     height: function($calendar) { 
      return $(window).height() - $('h1').outerHeight(true); 
     }, 
     eventRender: function(calEvent, $event) { 
      if (calEvent.end.getTime() < new Date().getTime()) { 
       $event.css('backgroundColor', '#aaa'); 
       $event.find('.wc-time').css({ 
        backgroundColor: '#999', 
        border: '1px solid #888' 
       }); 
      } 
     }, 
     eventNew: function(calEvent, $event, FreeBusyManager, calendar) { 
        calEvent.id = calEvent.userId + '_' + calEvent.start.getTime(); 
     }, 
     data: function(start, end, callback) { 
        callback(eventData2); 
     }, 
     displayFreeBusys: true, 
     daysToShow: 7, 
     switchDisplay: { '1 day': 1, '3 next days': 3, 'work week': 5, 'full week': 7 }, 
     headerSeparator: ' ', 
     useShortDayNames: true 
     }); 
    }); 
})(jQuery); 

जो मेरा पीछा परिणाम देता है:

calendar

मैं इस शर्त सुधारा जा सकता है; मुझे लगता है कि मैंने फ्रीबसी फीचर तोड़ दिया, लेकिन मुझे इसकी आवश्यकता नहीं है।

7

बीटीडब्ल्यू, आप इसे Select कॉलबैक में क्यों नहीं देखते हैं? jQuery सप्ताह कैलेंडर (https://github.com/themouette/jquery-week-calendar):

select: function(start, end, allDay, jsEvent, view) { 
    if(/*start is the disabled time*/) 
     return false; 
    else{ 
     // Proceed with the normal flow of your application 
     // You might show a popup to get info from user to create 
     // a new event here 
    } 
} 
+2

आदिल, आपके सुझाव के लिए धन्यवाद। मैं पहले से ही ऐसा कुछ करने की योजना बना रहा हूं। जो मैं खोज रहा हूं वह यह है कि उपयोगकर्ता को यह स्पष्ट रूप से स्पष्ट करने का एक तरीका है कि कुछ टाइमलॉट अक्षम हैं, इसलिए वे इसे क्लिक करने से पहले इसे देखते हैं। अब तक इसका समाधान काला घटनाएं बनाना है। – Tom

+0

हालांकि एक उत्तर ** अभी तक नहीं मिला **, आपको बाउंटी मिली क्योंकि आपने बाउंटी अवधि के दौरान भाग लिया था। इस प्रायोजित बाउंटी का उद्देश्य अब पूरा हो गया है, जो ध्यान आकर्षित करना था जो एक व्यवहार्य उत्तर का कारण बन सकता है। चीयर्स! – arttronics

+0

@arttronics धन्यवाद :) –

5

Fullcalender का उपयोग करना, मेरी कोड में मैं कुछ इस तरह है:

var availablePeriods = [["8:00", "12:00"], ["13:00", "17:00"]]; //these are the time intervals when the slots are OPEN 

if (availablePeriods !== undefined) { 
    slots = $element.find('.fc-agenda-slots tr'); 

    /* first add 'closed' class to all slots, and then remove class from 'open' slotts */ 
    slots.addClass('experdscheduler_closedSlot'); 
    if (jQuery.isArray(availablePeriods)) { 
    /* only in weekview and dayview */ 
    currentView = plugin.getView(); 

    if (currentView === 'agendaWeek' || currentView === 'agendaDay') { 
     numberOfAvailablePeriods = availablePeriods.length; 

     scheduleStartTime = timeToFloat($element.fullCalendar('option', 'minTime'));    
     scheduleSlotSize = $element.fullCalendar('option', 'slotMinutes') /60; 

     /* function to calculate slotindex for a certain time (e.g. '8:00') */  
     getSlotIndex = function(time) { 
     time = timeToFloat(time);    
     return Math.round((time-scheduleStartTime)/scheduleSlotSize); 
     } 


     /* remove 'closed' class of open slots */     
     for (i=0; i<numberOfAvailablePeriods; i++) {    
     startOfPeriodSlot = getSlotIndex(timeToFloat(availablePeriods[i][0])); 
     endOfPeriodSlot = getSlotIndex(timeToFloat(availablePeriods[i][1])); 

     for (j=startOfPeriodSlot; j<endOfPeriodSlot; j++) { 
      slots.eq(j).removeClass('experdscheduler_closedSlot'); 
     } 
     }   
    } 
    }   
} 

/** 
* Helper function: Converts a given time to a float, e.g. '8:15' becomes 8.25 
* @param mixed time A integer, float or a string. Valid strings: '8:15', '20:15', '8:15am', '8:15pm', '8.15', etc. 
* @license http://opensource.org/licenses/gpl-license.php GNU Public License 
* @author Koos van der Kolk <koosvdkolk at gmail dot com> 
* @return float 
**/ 
function timeToFloat(time) {  
    var returnValue, timeAsArray, separator, i, timeSeparators = [':', '.'], numberOfSeparators; 

    /* is time an integer or a float? */ 
    if (parseInt(time, 10) === time || parseFloat(time) === time) { 
    returnValue = time; 
    } else { 
    /* time will be considered a string, parse it */ 
    time = time.toString(); 

    numberOfSeparators = timeSeparators.length; 

    for (i = 0; i < numberOfSeparators; i = i + 1) { 
     separator = timeSeparators[i]; 

     if (time.indexOf(separator) > 0) { 
     timeAsArray = time.split(separator); 

     returnValue = parseInt(timeAsArray[0], 10) + parseInt(timeAsArray[1], 10)/60; 

     /* does string contain 'p' or 'pm'? */ 
     if (time.indexOf('p') > 0 && returnValue <= 12) { 
      returnValue = returnValue + 12; 
     } 
     } 
    } 
    } 
    return returnValue; 
} 

ऊपर कोड मैंने एक प्लगइन के कुछ हिस्सों का एक संकलन है, तो यह सीधे काम न करे। आप मुझसे कभी भी संपर्क कर सकते हैं।

+0

इससे कुछ अवधि के लिए खुले और बंद स्लॉट हो सकते हैं, है ना? – Tom

+0

ठीक है, वास्तव में नहीं: यह एक वर्ग को 'बंद' स्लॉट में जोड़ता है, इसलिए वे उदा। एक ग्रे पृष्ठभूमि रंग दिया जाना चाहिए। लेकिन यह वही है जो आप चाहते थे, या नहीं? – koosvdkolk

+0

स्क्रीनशॉट के लिए http://nl.picturepush.com/public/8749184 देखें (अजीब, मैं इसे अपनी मूल पोस्ट में नहीं जोड़ सकता ...) – koosvdkolk

3

This thread Google कोड में इस तरह के मुद्दे के विकास का पालन करने की अनुमति देता है।वास्तव में यह व्यस्तता घंटे रंगों के बारे में है, लेकिन यह सीधा जुड़ा है

इसके अलावा this guy

$('#calendar').fullCalendar({ 
    .... 
    events: [ 
     { 
      title: 'All Day Event', 
      start: new Date(y, m, 1) 
     } 
    ], 
    annotations: [{ 
     start: new Date(y, m, d, 13, 0), 
     end: new Date(y, m, d, 15, 30), 
     title: 'My 1st annotation', // optional 
     cls: 'open', // optional 
     color: '#777777', // optional 
     background: '#eeeeff' // optional 
    }]  
}); 

screenshot

+0

हाय, स्क्रीनशॉट अद्भुत लग रहा है, और मैं आपका कोड लागू करने की कोशिश कर रहा हूं, लेकिन मैं प्रबंधित नहीं करता हूं। मैंने एक जेएसफ़िल्ड बनाया। मैं क्या गलत कर रहा हूं? http://jsfiddle.net/sebababi/g5gtG/2/ – Sebastian

4

की जाँच करें इस उद्देश्य के प्रबंधन के लिए एक बहुत ही आसान तरीका अभी भी कोड के इस प्रकार के साथ FullCalendar का उपयोग कर लागू किया गया है अंत में मुझे यह उपलब्ध स्लॉट प्रति दिन काम करने के लिए मिला। बस फोन

function adjustWorkHourSlotSize(day_num) { 
     $(".day"+day_num+"slot").width($(".fc-col"+day_num).width()-2); 

    } 

    function addWorkHours2(availablePeriods, calendar_element) { 
     if (availablePeriods !== undefined) { 
      numberOfAvailablePeriods = availablePeriods.length; 

      //slots.addClass('nySchedule_unavailable_slots'); 
      //iterate trough days and get avail periods for each day of week 
      currentView = calendar_element.fullCalendar('getView'); 
      currentView = currentView.name; 
      if (currentView === 'agendaWeek' || currentView === 'agendaDay') { 



      scheduleStartTime = timeToFloat(calendar_element.fullCalendar('option', 'minTime'));    
      scheduleSlotSize = calendar_element.fullCalendar('option', 'slotMinutes') /60; 
      /* function to calculate slotindex for a certain time (e.g. '8:00') */  
      getSlotIndex = function(time) { 
       time = timeToFloat(time);    
       return Math.round((time-scheduleStartTime)/scheduleSlotSize); 
      } 

      slots_content = calendar_element.find('.fc-agenda-slots tr .ui-widget-content div'); 
      for (var i=0; i!=numberOfAvailablePeriods; i++) { 
       if (currentView === 'agendaWeek') { 

       slots_content.append("<div class='day"+i+"slot dayslot'></div>"); 
       $(".day"+i+"slot").addClass('unavailable'); 
       adjustWorkHourSlotSize(i); 
       } 


       dayPeriodsLength=availablePeriods[i].length; 
       for (var j=0; j!=dayPeriodsLength; j++) { 
       start=availablePeriods[i][j][0]; 
       end=availablePeriods[i][j][1]; 

       startOfPeriodSlot = getSlotIndex(timeToFloat(start)); 
       endOfPeriodSlot = getSlotIndex(timeToFloat(end)); 
       for (k=startOfPeriodSlot; k<endOfPeriodSlot; k++) { 
        $(".day"+i+"slot").eq(k).removeClass("unavailable"); 
       } 
       }     
      } 
      } 
     } 
    } 

अब:

koosvdkolk के जवाब के समायोजन दिन प्रति अलग समयावधि उपलब्ध नहीं है करने के लिए

var availablePeriods = [ [["8:00", "16:00"],["3:00", "5:00"]], [["9:00", "14:00"]] ]; 
addWorkHours2(availablePeriods, $("#calendar")); 

और सीएसएस वर्गों भूल न:

.dayslot { 
    float: left; 
    margin-left: 2px; 
} 

.fc-agenda-slots .unavailable{ 
    background-color: #e6e6e6; 

} 
+0

हाय, मैंने आपके कोड को लागू करने का प्रयास किया, लेकिन मैं इसे काम करने के लिए प्रबंधन नहीं करता, मैंने एक जेएसफ़िल्ड बनाया, क्या आप मेरी मदद कर सकते हैं? http://jsfiddle.net/sebababi/w64Hd/ – Sebastian

+0

उसका कोड थोड़ा पुराना है, और इस बिंदु पर अपूर्ण है। अगर आपको अभी भी सहायता की ज़रूरत है, तो शायद मैं आपको सेबेस्टियन की मदद कर सकता हूं। हालांकि, यह उपलब्ध अवधि के केवल एक दृश्य संकेतक है। –

-6

एक और है dhtmlx से अधिक विकसित और समर्थित कैलेंडर प्रकार प्लगइन यहां शेड्यूलर कहलाता है: http://dhtmlx.com/docs/products/dhtmlxScheduler/

यह टाइम्सलॉट्स, पृष्ठभूमि रंगों और बहुत कुछ को अक्षम करने का समर्थन करता है। मैंने इसे पहले इस्तेमाल किया है और पाया है कि यह मुझे आवश्यक सबकुछ प्रदान करता है।

enter image description here

0

Fullcalendar अंतर्निहित समारोह businessHours जो कैलेंडर पर कुछ समय स्लॉट पर जोर देती है है।

businessHours: [ // specify an array instead 
{ 
    dow: [ 1, 2, 3 ], // Monday, Tuesday, Wednesday 
    start: '08:00', // 8am 
    end: '18:00' // 6pm 
}, 
{ 
    dow: [ 4, 5 ], // Thursday, Friday 
    start: '10:00', // 10am 
    end: '16:00' // 4pm 
} 
] 
संबंधित मुद्दे