Создание календаря-расписания

Сегодня, дорогие читатели, я хочу поделиться с вами процессом создания несложного календаря. Может быть, кому-нибудь пригодиться готовый вариант.

Задача: сделать недельный календарик, каждый час которого может быть двух состояний: вкл или выкл.

Использовать его можно для учета работы (работал - не работал) или учета занятости человека: свободен или занят, этакий гугл-календарь для бедных.

Начнем с HTML. Календарь завернем в див "Schedule".

Как видите, для каждой строчки тела таблицы мы назначаем класс, который и будет определять, на каком часу мы находимся. Я использовал именно класс, а не АйДи, чтобы была возможность вставлять несколько подобных расписаний на страницу.

Одна ячейка таблицы - это див внутри td.

Именно для него мы и будем писать стили и назначать js-ивенты.

Для этой ячейки предполагаются всего три состояния:

Теперь взглянем на CSS.

Многие верстальщики старой закалки, стараясь обеспечить поддержку IE6 избегали использовать псевдоклассы, вроде :first-child, вместо этого первым элементам дописывали дополнительные классы или использовали js, и поэтому забыли их напрочь. Сегодня многие заказчики уже не требуют поддержки шестого ослика, а так как в седьмом Эксплорере многие псевдоклассы работают, можно не стесняться их использовать.

Мы хотим несколько вещей:

При наведении на блок-ячейку, менялся стиль его оформления (в заголовке и в теле таблицы):

#Schedule table tbody tr td div:hover {
     border-color: #ccc;
     background: url(../images/ggrad2.png) left bottom repeat-x;
}
#Schedule table thead tr td div:hover {
     color: #555;
     border-color: #bfbfbf;
     background: url(../images/gradRev.png) left bottom repeat-x;
} 

Первая ячейка строки (та, в которой время должна иметь свой стиль:

#Schedule table tbody tr td:first-child div {
     padding: 1px 3px;
     vertical-align: top;
     font-size: 9pt;
     cursor: default;
     text-align: right;
     margin: 0;
     border: solid 1px White;
     font-weight: bold;
     color: #777;
} 

И так далее.

Теперь поговорим о необходимом jQuery коде, который нам нужен.

Основное: при клике на ячейку она должна выделиться. Для этого присвоим ячейке класс selected

$('#Schedule table tbody tr td div').click(
         function() { $(this).toggleClass('selected') });  

При наведении на ячейку, должны подсвечиваться время и день, чтобы было понятно, где мы находимся. Для этого соответствующей строчке и ячейке в заголовке будем добавлять класс hover:

$('#Schedule table tr').hover(
         function() { $(this).addClass('hovered') },
         function() { $(this).removeClass('hovered') });
$('#Schedule table tbody tr .d0').hover(
         function() { $('#Schedule table thead tr td.d0').addClass('hovered') },
         function() { $('#Schedule table thead tr td.d0').removeClass('hovered') });
 

Еще нам может захотеться добавить возможность выделить сразу все часы конкретного дня, кликнув по заголовку. Но для начала сделаем соответствующую подсветку при наведении на заголовок:

$('#Schedule table thead tr .d0').hover(
         function() { $('#Schedule table td.d0').addClass('hovered') },
         function() { $('#Schedule table td.d0').removeClass('hovered') }) 

А событие на клик будет таким:

$('#Schedule table thead tr .d0').click(
 	.click(function() { DayClick('0', this) }); 

Код немаленький, и повторяться он должен для каждого дня, поэтому я решил вынести его в отдельную функцию. Сама функция определяет, выделен ли полностью конкретный день, или же нет, и уже на основании этой информации, решает, выделять все ячейки дня или наоборот, убрать все выделения.

function DayClick(dayNum,obj) {
     if ($(obj).hasClass('selected') && ($('#Schedule table tbody tr td.d' + dayNum + ' div.selected').length)) {
         $('#Schedule table tbody tr td.d'+dayNum+' div').removeClass('selected');
         $(obj).removeClass('selected');
     }
     else {
         $('#Schedule table tbody tr td.d' + dayNum + ' div').addClass('selected');
         $(obj).addClass('selected');
     };
 } 

После манипуляций с расписанием, нам надо в каком-то приличном виде отправить это на сервер. Самое простое - пройдя все ячейки, составить XML, который будет содержать всю нужную нам информацию.
Формат:

Функция, которая все для нас сделает:

function SubmitSchedule() {
     var XMLSchedule = "";
      for (var d = 0; d < 7; d++) {
         XMLSchedule += ''
         for (var h = 7; h < 21; h++) {
             if ($('#Schedule table tbody tr.h' + h + ' td.d' + d + ' div').hasClass('selected')) {
                 XMLSchedule += '1';
             }
             else {
                 XMLSchedule += '0';
             };
         }
         XMLSchedule += '';
     }
     XMLSchedule += "";
     $('#output').text(XMLSchedule);
 } 

Надеюсь вы нашли для себя что-нибудь интересное. Все ваши мысли приветствуются в комментах.

Веселых выходных!




Рекомендуем почитать

 

Добавить комментарий


Ваше имя:


Комментарий:


Введите: Картинка