Задание 2.

Пример реализации библиотеки, предоставляющую API для работы с расписанием из первого задания ШРИ.


Принцип работы:

Библиотека выполнена в виде модуля с точкой входа sked.

Лекции, школы и аудитории хранятся в виде объектов в массивах lectures, schools и halls.
Расписание лекций также хранится в отдельном массиве events и состоит из объектов, содержащих:
дату, время, продолжительность, а также ссылки на объекты в массивах lectures, schools и halls.

Управление происходит через объекты lecture, school, hall и event.
Для event имеется возможность работать по принципу стека или создать несколько экземляров с помощью конструкции: sked.newEvent('global_var_name');
После чего можно обращаться не к sked, а к global_var_name.

Добавив необходимые лекции, школы и аудитории их нужно прикрепить к event,
после чего можно записать объект event в массив events с помощью метода .save().

Такой подход даёт возможность хранить массивы в сериализованном виде, к примеру, в LocalStorage
и в дальнейшем заполнять их оттуда, а также отправлять их для синхронизации на сервер.

Пример использования можно увидеть на странице example.html
Также в примере добавлен вариант фильтрации из первого задания - для сравнения :)

Подключение:

<script src="path/to/sked.js"></script>
Также, на страницу необходимо добавить два блока:
<div id="filters"></div>
<div id="schedule"></div>
Далее необходимо добавить нужные школы/аудитории/лекции.
После этого можно добавлять новое событие в расписание.

Добавление данных:

sked.school.add('Название школы', Число_студентов);
sked.lecture.add('Название лекции', 'Имя лектора');
sked.hall.add('Название аудитории', Вместимость, 'Описание, н-р, где она находится');

Изменение данных:

sked.school.editTitle('Название школы' или id, 'Новое значение');
sked.school.editQuantity('Название школы' или id, Новое_значение);
sked.school.editDescription('Название школы' или id, 'Новое значение');
По аналогии со school, объекты hall и lecture имеют следующие методы:
sked.lecture.editTitle(search, value);
sked.lecture.editSpeaker(search, value);
sked.hall.editTitle(search, value);
sked.hall.editCapacity(search, value);
sked.hall.editDescription(search, value);
* search - может быть как искомой строкой, так и числом, равным порядковому номеру объекта в массиве.
Также стоит помнить, что нумерация начинается с 0.

Отображение данных:

sked.school.render;	// отобразить/обновить школы
sked.event.render;	// отобразить/обновить расписание
sked.render();		// отобразить/обновить всё

Создание события

Создание объекта расписания, используя объект sked.

sked.event.setLecture().<цепочка вызовов>.save();

Создание объекта расписания, используя переменную:

var event = sked.event.setDate('1/1/16').setTime('10:00');
    event.setDuration(1.5)
	.setHall(1) /* Установим аудиторию */
	.setSchool(1) /* Установим школу */
	.setSchool(sked.school.editTitle(2,"ШМР")) /* Добавим ещё одну школу и сразу отредактируем её название */
	.setLecture(sked.lecture.add("Новая лекция","Фамилия лектора")) /* Добавить лекцию и сразу привязать её к событию */
	.save(); /* Сохраняем событие в расписание */
* Важно понимать, что переменная ссылается на конкретный объект sked и при создании второй переменной, она всё равно будет указывать на тот же объект.

Создание нескольких объектов расписания по отдельности:

sked.newEvent('event_1'); // создаст новую глобальную переменную event_1
sked.newEvent('event_2'); // создаст новую глобальную переменную event_2
event_1.setHall(1); 	  // по аналогии с одиночным созданием
event_2.setHall(2);

Пометить лекцию как прошедшую (setter):

sked.event.done = id;

Фильтрация

Очистить фильтр:

sked.filter();

Вывести лекции за определённый интервал:

sked.filter('13/12/2016', '15/12/2016');	// все лекции за выбранный интервал
sked.filter().school("Школа мобильного дизайна");	// все лекции для указанной школы
sked.filter('13/12/2016', '15/12/2016').school("Школа мобильной разработки");  // лекции для указанный школы за выбранный интервал
sked.filter('15/06/2016', '15/06/2016').hall(2);  // все лекции в аудитории с индексом 2 за 15.06.2016

Вспомогательные методы

Включить отладку:

sked.debugging(true);

Просмотр данных через консоль (getter):

sked.school.show;
sked.lecture.show;
sked.hall.show;
sked.event.show;