FullCalendar-এর রিসোর্স টাইমলাইন ও রিসোর্স কলাম Premium-এর অংশ: বাণিজ্যিক অ্যাপের জন্য একটি পেইড লাইসেন্স কী লাগে। এর লাইসেন্স পেজে বিনামূল্যের বিকল্পগুলো দেওয়া আছে: পুরোপুরি AGPL অ্যাপের জন্য, আর নিবন্ধিত অলাভজনক প্রতিষ্ঠানের জন্য। Needless UI শিডিউলারে দুটোই আছে MIT লাইসেন্সে, সঙ্গে পুনরাবৃত্ত ইভেন্ট আর iCalendar ফাইল। এই গাইড একটি Angular অ্যাপকে একটি থেকে অন্যটিতে নিয়ে যায়: কী একইভাবে চলে আসে, কী আসে না, আর কোন ডেটা রূপান্তর করতে হয়।

এখানে FullCalendar 7-এর নাম ব্যবহার করা হয়েছে, আর যেখানে ভার্সন 6-এর নাম আলাদা, সেগুলো তৃতীয় বন্ধনীতে দেওয়া আছে। FullCalendar-এর Angular কানেক্টর Angular 16 থেকে 22 সাপোর্ট করে; Needless UI-এর দরকার Angular 22।

আপনি কী পাবেন

FullCalendar ও Needless UI শিডিউলার
ফিচারFullCalendarNeedless UI
রিসোর্স টাইমলাইন: প্রতিটি রুম বা ব্যক্তির জন্য একটি সারিPremiumহ্যাঁ: একটি দিন, সপ্তাহ বা মাস
দিন ও সপ্তাহের ভিউতে কলাম হিসেবে রিসোর্সPremiumহ্যাঁ
মাস, সপ্তাহ ও দিনের ভিউবিনামূল্যেহ্যাঁ
ড্র্যাগ করে সরানো ও রিসাইজ করাবিনামূল্যে; অন্য রিসোর্সে সরাতে Premium লাগেহ্যাঁ, অন্য রিসোর্সেও। শেষ প্রান্ত টেনে রিসাইজ করা যায়, শুরুরটা নয়।
ইভেন্ট তৈরির জন্য সময় বেছে নেওয়াবিনামূল্যেহ্যাঁ, পয়েন্টার, লং প্রেস বা কীবোর্ড দিয়ে
ওভারল্যাপ না হওয়ার মতো নিয়মবিনামূল্যে: ওভারল্যাপ ও কনস্ট্রেইন্টের অপশনহ্যাঁ: একটিই allow ফাংশন, প্রতিটি পরিবর্তনের আগে যাকে জিজ্ঞেস করা হয়
কীবোর্ড দিয়ে ইভেন্ট সরানো ও রিসাইজ করাএর অ্যাক্সেসিবিলিটি ডকুমেন্টেশনে নেই, যেখানে ARIA লেবেল আর Tab ফোকাসের কথা আছেহ্যাঁ, স্ক্রিন রিডারে ঘোষণাসহ
পুনরাবৃত্ত ইভেন্টবিনামূল্যে, rrule প্লাগইন ও লাইব্রেরি দিয়েবিল্ট-ইন: RFC 5545 নিয়ম, তবে EXRULE, RDATE বা ঘণ্টাভিত্তিক নিয়ম ছাড়া
iCalendar (.ics)বিনামূল্যে: একটি ফিড পড়ে.ics ফাইল পড়ে ও লেখে
লিস্ট ও বছরের ভিউবিনামূল্যেসামনের দিনগুলোর একটি এজেন্ডা; বছরের ভিউ নেই
টাইম জোনবিনামূল্যে: লোকাল, UTC বা নামসহ জোননা: যে সময় পায়, ঘড়ির সেই সময়ই দেখায়
গ্রুপ করা, নেস্টেড বা একাধিক কলামের রিসোর্সPremiumনা: একটি কলাম, যা আপনার টেমপ্লেট আঁকে
বাইরে থেকে ড্র্যাগ অ্যান্ড ড্রপ, ব্যাকগ্রাউন্ড ইভেন্টবিনামূল্যেনা
প্রিন্টিং, ভার্চুয়াল রেন্ডারিংPremiumনা
ফ্রেমওয়ার্কAngular 16 থেকে 22, React, Vue, সাধারণ JavaScript ও আরওAngular 22 ও React 19

কোনটির বদলে কোনটি

FullCalendar-এর অপশন ও Needless UI-তে সেগুলোর বিকল্প
FullCalendarNeedless UI শিডিউলার
<full-calendar [options]>, plugins, schedulerLicenseKey<nui-scheduler>, প্রতিটি অপশনের জন্য একটি ইনপুটসহ; কোনো প্লাগইন বা কী নেই
initialView: 'resourceTimelineDay'view="timeline", আর সপ্তাহ বা মাসের জন্য timelineSpan
initialView: 'timeGridWeek'view="week"; [(view)] দুই দিকেই বাইন্ড হয়
resources, events[resources], [events]
resourceId, extendedPropsresource, data
editable, selectableeditable, selectable
select(slotSelect): { start, end, allDay, resource }
eventDrop, eventResize(eventChange): আপনি events আপডেট না করা পর্যন্ত কিছুই সরে না
eventClick(eventClick)
eventOverlap, selectOverlap, eventAllow[allow]: সরানো, রিসাইজ ও বাছাইয়ের জন্য একটিই ফাংশন
slotDuration, snapDurationslotMinutes, snapMinutes, মিনিটে
slotMinTime, slotMaxTime, scrollTimedayStart, dayEnd, scrollHour, ঘণ্টায়
businessHours[businessHours], সপ্তাহের দিন 1 (সোমবার) থেকে 7
datesSet(rangeChange)
eventContent, resourceCellContent [resourceLabelContent]nuiSchedulerEvent ও nuiSchedulerResource টেমপ্লেট
locale, firstDaylocale (যেকোনো BCP 47 ট্যাগ), 1 থেকে 7 পর্যন্ত firstDay, আর এর লেখাগুলোর জন্য labels

রুম বুকিংয়ের টাইমলাইন, দুইভাবেই

রুম হলো রিসোর্স, আর বুকিং হলো ইভেন্ট। কোনো রুমের সারি জুড়ে ড্র্যাগ করলে রুমটি বুক হয়, কোনো বুকিং ড্র্যাগ করলে সেটি সরে যায়, আর একটি রুমে একসময়ে একটিই বুকিং থাকতে পারে। FullCalendar 7 ও তার Premium রিসোর্স টাইমলাইন দিয়ে:

Needless UI শিডিউলার দিয়ে:

দুটি জিনিস আলাদাভাবে কাজ করে। FullCalendar নিজেই বুকিং সরিয়ে দেয়, আর অ্যাপ সেই পরিবর্তন নিজের ডেটায় কপি করে নেয়; Needless UI শিডিউলার শুধু সেটি জানায়, আর আপনি events আপডেট করলে তবেই পরিবর্তনটি থাকে, তাই আপনার ডেটাই থাকে একমাত্র উৎস। আর allow সাধারণ কোড, পয়েন্টার বা কীবোর্ড থেকে আসা প্রতিটি পরিবর্তনের আগে যাকে জিজ্ঞেস করা হয়, তাই নিয়মটি আপনি নিজেই টেস্ট করতে পারেন। রুম বুকিংয়ের গাইড ধাপে ধাপে এই অ্যাপটি তৈরি করে দেখায়।

ডেটা রূপান্তর

FullCalendar-এর ডেটা আর শিডিউলার যা আশা করে
FullCalendarNeedless UI
সারাদিনের ইভেন্টের end হলো ইভেন্টের পরের দিনসারাদিনের ইভেন্টের end হলো তার শেষ দিন: এক দিন বাদ দিন
সময়ের শেষে Z বা +02:00-এর মতো অফসেট থাকতে পারেঅফসেট ছাড়া ঘড়ির সময়, যেমন 2026-11-02T09:30
সপ্তাহের দিন 0 (রবিবার) থেকে 6, businessHours ও firstDay-তেসপ্তাহের দিন 1 (সোমবার) থেকে 7 (রবিবার)
স্ট্রিং হিসেবে সময়কাল, যেমন '00:30'সংখ্যা: মিনিট বা ঘণ্টা
রিসোর্স সাজানো হয় id, তারপর শিরোনাম অনুযায়ীরিসোর্স থাকে অ্যারের ক্রমে
অবজেক্ট হিসেবে rrule, আর exruleRFC 5545 স্ট্রিং, যেমন FREQ=WEEKLY;BYDAY=MO,FR, আর exdate
America/New_York-এর মতো টাইম জোনআগে সময়গুলো রূপান্তর করুন। nuiSchedulerFromIcs(text, { timeZone }) .ics ফাইল পড়ার সময়ই রূপান্তর করে।

যা নেই, তা দরকার হলে

আপনার অ্যাপ যদি টাইম জোন, গ্রুপ করা রিসোর্স, বাইরে থেকে ড্র্যাগ অ্যান্ড ড্রপ বা প্রিন্টিংয়ের ওপর নির্ভর করে, তাহলে শিডিউলার এখনো FullCalendar-এর জায়গা নিতে পারবে না। আপনার যা দরকার, তার জন্য একটি issue খুলুন। বাকি সবকিছুর জন্য শিডিউলারের পেজে প্রতিটি ইনপুট, আউটপুট ও উদাহরণ আছে।