ಈ ಮಾರ್ಗದರ್ಶಿ ಸಭಾ ಕೊಠಡಿಗಳನ್ನು ಬುಕ್ ಮಾಡಲು ಒಂದು ಕ್ಯಾಲೆಂಡರ್ ನಿರ್ಮಿಸುತ್ತದೆ: ಪ್ರತಿ ಕೊಠಡಿಗೆ ಒಂದು ಸಾಲು ಇರುವ ಟೈಮ್ಲೈನ್, ಎಳೆದು ಸರಿಯಾದ ಜಾಗದಲ್ಲಿ ಇಡಬಹುದಾದ ಬುಕಿಂಗ್ಗಳು, ಒಂದೇ ಕೊಠಡಿ ಎರಡು ಬಾರಿ ಬುಕ್ ಆಗದಂತೆ ತಡೆಯುವ ನಿಯಮ, ಮತ್ತು ಬುಕಿಂಗ್ ಅನ್ನು ಯಾವುದೇ ಕ್ಯಾಲೆಂಡರ್ಗೆ ಸೇರಿಸುವ ಫೈಲ್. ಇದು @needless-ui/angular ನ ಶೆಡ್ಯೂಲರ್ ಅನ್ನು ಬಳಸುತ್ತದೆ, ಅದು ಇಡೀ Needless UI ನಂತೆಯೇ MIT ಪರವಾನಗಿಯ ಅಡಿಯಲ್ಲಿದೆ, ಹಾಗಾಗಿ ಸಂಪನ್ಮೂಲ ಟೈಮ್ಲೈನ್ ಯಾವುದೇ ಆ್ಯಪ್ಗೆ ಉಚಿತ.
ಕೊಠಡಿಗಳು ಮತ್ತು ಬುಕಿಂಗ್ಗಳು
ಕೊಠಡಿಗಳು ಸಂಪನ್ಮೂಲಗಳು: ಒಂದು id, ಒಂದು title, ಮತ್ತು ಬೇರೆ ಏನಾದರೂ data ನಲ್ಲಿ. ಬುಕಿಂಗ್ಗಳು 2026-10-23T09:00 ನಂತಹ ಸರಳ ISO ಸಮಯಗಳಿರುವ ಈವೆಂಟ್ಗಳು, ಮತ್ತು ಅವುಗಳ ಕೊಠಡಿಯ id resource ನಲ್ಲಿ ಇರುತ್ತದೆ. ಒಂದು ಬುಕಿಂಗ್ಗೆ ಹಲವು ಕೊಠಡಿಗಳನ್ನು, ಅಥವಾ ಜನರನ್ನು, ಪಟ್ಟಿಯಾಗಿ ನೀಡಬಹುದು.
ಪ್ರತಿ ಕೊಠಡಿಗೆ ಒಂದು ಸಾಲು
ಎರಡನ್ನೂ view="timeline" ಜೊತೆ nui-scheduler ಗೆ ಪಾಸ್ ಮಾಡಿ. dayStart ಮತ್ತು dayEnd ದಿನವನ್ನು ಕೊಠಡಿಗಳು ತೆರೆದಿರುವ ಸಮಯಕ್ಕೆ ಸೀಮಿತಗೊಳಿಸುತ್ತವೆ, snapMinutes ಬುಕಿಂಗ್ಗಳನ್ನು ಕಾಲು ಗಂಟೆಯ ಹೆಜ್ಜೆಯಲ್ಲಿ ಸರಿಸುತ್ತದೆ, ಮತ್ತು 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 ನೋಡಿ.