या मार्गदर्शकात मीटिंग रूम्स बुक करण्यासाठी एक कॅलेंडर तयार केले आहे: प्रत्येक रूमसाठी एक ओळ असलेली टाइमलाइन, ड्रॅग करून योग्य जागी ठेवता येणारी बुकिंग्ज, एकाच रूमचे दुहेरी बुकिंग होऊ न देणारा नियम, आणि बुकिंग कोणत्याही कॅलेंडरमध्ये जोडणारी फाइल. यात @needless-ui/angular मधील शेड्यूलर वापरले आहे, जे संपूर्ण Needless UI प्रमाणेच MIT लायसन्ससह आहे, त्यामुळे रिसोर्स टाइमलाइन कोणत्याही ॲपसाठी मोफत आहे.
रूम्स आणि बुकिंग्ज
रूम्स म्हणजे रिसोर्स: एक id, एक title, आणि बाकी सर्व काही data मध्ये. बुकिंग्ज म्हणजे साध्या ISO वेळा असलेले इव्हेंट, जसे 2026-10-23T09:00, आणि त्यांच्या रूमचा id resource मध्ये. एका बुकिंगमध्ये यादीच्या स्वरूपात अनेक रूम्स, किंवा लोक, असू शकतात.
प्रत्येक रूमसाठी एक ओळ
दोन्ही view="timeline" सह nui-scheduler ला पास करा. dayStart आणि dayEnd दिवस रूम्स उघड्या असतात त्या तासांपुरता मर्यादित ठेवतात, snapMinutes बुकिंग्ज 15 मिनिटांच्या स्टेपने हलवते, आणि businessHours रूम्स बंद असतात ती वेळ छायांकित करतात. nuiSchedulerResource प्रत्येक ओळीचे हेडर काढते.
<nui-scheduler
[events]="bookings()"
[resources]="rooms"
view="timeline"
dayStart="8"
dayEnd="19"
snapMinutes="15"
[businessHours]="hours"
editable
selectable
[allow]="free"
(slotSelect)="book($event)"
(eventChange)="move($event)"
(rangeChange)="range.set($event)"
>
<ng-template nuiSchedulerResource let-room>{{ room.title }}</ng-template>
</nui-scheduler>
<button nuiButton type="button" (click)="download()">Add to calendar</button>बुक करा आणि हलवा
शेड्यूलर आपला डेटा स्वतः कधीच बदलत नाही: लोकांनी काय केले, एवढेच ते कळवते. एखाद्या रूमच्या ओळीवर ड्रॅग केल्यावर वेळ निवडली जाते, आणि slotSelect ती रूमसह कळवते. एखादे बुकिंग, किंवा त्याचा शेवट, ड्रॅग केल्यावर eventChange त्याच्या नव्या वेळा कळवते, आणि ते दुसऱ्या रूममध्ये हलवले असल्यास त्याची नवी रूमही. सिग्नल अपडेट करा, आणि टाइमलाइनही त्यानुसार बदलते.
import { Component, signal } from '@angular/core';
import { NuiButton } from '@needless-ui/angular/button';
import {
NuiScheduler,
type NuiSchedulerChange,
type NuiSchedulerEvent,
NuiSchedulerResourceTemplate,
type NuiSchedulerSlot,
} from '@needless-ui/angular/scheduler';
import { downloadIcs } from './booking-ics';
@Component({
selector: 'app-bookings',
imports: [NuiButton, NuiScheduler, NuiSchedulerResourceTemplate],
templateUrl: './booking.html',
})
export class Bookings {
/** Rooms are resources; bookings are events, with their room in `resource`. */
protected readonly rooms = [
{ id: 'atlas', title: 'Atlas' },
{ id: 'boreal', title: 'Boreal' },
];
protected readonly bookings = signal<NuiSchedulerEvent[]>([]);
/** Open on weekdays from 8:00 to 19:00: other time is shaded. */
protected readonly hours = [{ days: [1, 2, 3, 4, 5], start: '08:00', end: '19:00' }];
/** The days on screen: load their bookings when it changes. */
protected readonly range = signal<{ start: string; end: string } | null>(null);
protected book({ start, end, resource }: NuiSchedulerSlot): void {
const booking = { id: crypto.randomUUID(), title: 'New booking', start, end, resource };
this.bookings.update((all) => [...all, booking]);
}
protected move({ event, start, end, resource }: NuiSchedulerChange): void {
this.bookings.update((all) =>
all.map((b) =>
b.id === event.id ? { ...b, start, end, resource: resource ?? b.resource } : b,
),
);
}
/** A room holds one booking at a time. */
protected readonly free = (time: NuiSchedulerChange | NuiSchedulerSlot): boolean => {
const id = 'event' in time ? time.event.id : null;
const room = 'event' in time ? (time.resource ?? time.event.resource) : time.resource;
return !this.bookings().some(
(b) => b.id !== id && b.resource === room && b.start < time.end && b.end > time.start,
);
};
protected download(): void {
downloadIcs(this.bookings(), 'bookings');
}
}दुहेरी बुकिंग नाही
बुकिंग तयार होण्यापूर्वी किंवा हलवण्यापूर्वी allow ला विचारले जाते. त्याने false परत केल्यास ड्रॅग लाल दिसतो आणि सोडल्यावर काहीच होत नाही, आणि कीबोर्डने प्रयत्न केल्यास ती वेळ उपलब्ध नसल्याचे शेड्यूलर जाहीर करते. उदाहरण त्या रूमची इतर बुकिंग्ज तपासते; आपल्या सर्व्हरवरही पुन्हा तपासा, कारण अंतिम निर्णय त्याचाच असतो.
स्क्रीनवरील दिवस लोड करा
rangeChange दाखवलेले पहिले आणि शेवटचे दिवस कळवते, एकदा सुरुवातीला आणि नंतर प्रत्येक वेळी लोक पेज बदलतात तेव्हा, जेणेकरून आपण फक्त त्याच दिवसांची बुकिंग्ज आणू शकाल, httpResource ने किंवा आपल्याला हव्या त्या कोणत्याही रिक्वेस्टने.
कॅलेंडरमध्ये जोडा
nuiSchedulerToIcs() बुकिंग्ज iCalendar फाइल म्हणून लिहिते, जी Google Calendar, Outlook आणि Apple Calendar इम्पोर्ट करतात. nuiSchedulerFromIcs() अशी फाइल परत वाचते, आणि इतर टाइम झोनमधील वेळा वापरकर्त्याच्या टाइम झोनमध्ये आणते.
import { type NuiSchedulerEvent, nuiSchedulerToIcs } from '@needless-ui/angular/scheduler';
/** Saves events as an .ics file, which Google Calendar, Outlook and Apple Calendar import. */
export function downloadIcs(events: readonly NuiSchedulerEvent[], name: string): void {
const file = new Blob([nuiSchedulerToIcs(events, { name })], { type: 'text/calendar' });
const link = document.createElement('a');
link.href = URL.createObjectURL(file);
link.download = `${name}.ics`;
link.click();
URL.revokeObjectURL(link.href);
}कीबोर्ड आणि स्क्रीन रीडर
हे सर्व माउसशिवाय चालते. टाइमलाइन एकच टॅब स्टॉप आहे: ॲरो कळांनी वेळा आणि रूम्समधून फिरता येते, Shift सह ॲरो वेळ निवडतात, आणि Enter ती बुक करते. एखाद्या बुकिंगवर, Alt सह ॲरो ते दुसऱ्या वेळेवर किंवा रूमवर हलवतात. प्रत्येक बुकिंग हे एक बटण आहे, ज्याचे नाव त्याचे शीर्षक, रूम, दिवस आणि वेळ असते.
दिवस व्ह्यूमधील शेजारी-शेजारी रूम्स, वारंवार होणारी बुकिंग्ज आणि इतर सर्व पर्यायांसाठी शेड्यूलरचे पेज आणि API पाहा.