Конструирование динамически настроенного недельного календаря

Я создаю динамический гибкий недельный календарь, используя Twitter Bootstrap.

Здесь моя текущая реализация: http://jsfiddle.net/dvirazulay/Lhe7C/ (было немного длиннее, чтобы вставить здесь полностью)

И вот текущий скриншот:

enter image description here

То, что я пытаюсь достичь, - это дизайн, который будет полностью динамичным - генерация исходного представления из моего back-end не проблема, но немного сложна, так как моя текущая реализация использует таблицы. Я боюсь, что будет трудно поддерживать его на стороне JavaScript, т.е. Удалить события/добавить их на лету.

Очевидно, я выбрал таблицы, поскольку это имело смысл для меня - недельный календарь - это в основном таблица. Я опишу свой дизайн:

  • Событие может занимать более 30 минут, поэтому я использую rowspan, чтобы определить, сколько часов он должен охватывать.
  • Может быть два конфликтующих события (я не допускаю больше двух). Как и в настоящее время, они отображаются рядом друг с другом, каждый из которых занимает 50% от ширины события и занимает столько же высоты, сколько и должен представлять конечное время.
  • На внутренней стороне, я вычисляю, сколько td мне нужно пропустить, чтобы не иметь дополнительных столбцов в конце таблицы (поскольку rowspan подталкивает некоторые вправо)

Я задаю следующие вопросы:

  • Это правильный подход?
  • Должен ли я применять одну и ту же внутреннюю логику к интерфейсу и пересчитать сумму tr/td для отображения в соответствии с количеством событий, которые у меня есть, или есть лучшее решение для это?

В идеале, хороший ответ должен описывать, как обрабатывать события на стороне интерфейса без осложнений или альтернативный (отзывчивый!) дизайн для этой проблемы.

Я не хочу использовать существующий плагин, так как я искал и пробовал несколько из них, и я хочу, чтобы он был очень легким, но если у вас есть большое предложение для тех, кто выполняет требования - я бы люблю проверять! (jQuery недельный календарь слишком медленный и загроможден, например)

Примечание. Я не намерен поддерживать браузеры старше IE9.

Ответы

Ответ 1

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

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

Важно отметить, что этот подход делает гибкость графика тривиальным качеством.

Ответ 2

Использование таблицы - хороший подход.

Хорошо, это решение на основе jQuery для проблемы с "рядами". Происхождение проблемы - неправильная генерация таблицы в бэкэнд.

Например, если отображается td с rowspan = "3", то td в той же позиции индекса столбца в следующих двух строках будет затронута и сдвинута вправо. Это нежелательно.

<table border="1">
<tr>
    <td>07:30</td>
    <td rowspan="3">Event 07:30 to 09:00</td>
</tr>
<tr>
    <td>08:00</td>
    <td>Should not be rendered.</td>
</tr>
<tr>
    <td>08:30</td>
    <td>Should not be rendered.</td>
</tr>
<tr>
    <td>09:00</td>
    <td>C</td>
</tr>

Правильное решение - правильная генерация таблицы в бэкэнд. Рендеринг td после строки rowspan просто не произойдет. Если вы знаете, что вы создаете rowspan = "3", тогда действуйте соответствующим образом.:)

В любом случае, если невозможно изменить рендеринг таблицы, используйте jQuery для его исправления:

http://jsfiddle.net/9tQvu/3/

Ответ 3

Это вполне приемлемый способ сделать это.

Если бы я был вами, я бы, вероятно, использовал divs, потому что они более управляемы и проще в использовании CSS и являются более стандартными.

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

Что касается обработки событий, я бы просто сортировал divs по типу с использованием классов, а затем использовал обработчики событий с типами событий, которые вы хотите использовать (я не знаю, что вы хотите, кроме клика, хотя) на этих соответствующих классах,

Ответ 4

что происходит, когда событие перекрывается только частично с другим, я имею в виду, что 2 перекрывающиеся события занимают 50% от witdh, но если один из них закончит раньше, а другой позже, тот, который продолжается, все это займет все ширину "следующей" строки или продолжить с 50% ширины? что произойдет, если событие A с 8:00 до 8:30, а событие B - с 8:00 до 18:00? должно быть хорошо, что событие B будет заполнять ширину до тех пор, пока не произойдет другое перекрывающееся событие... но я предполагаю, что это может быть немного сложнее. просто мысль. Счастливое кодирование, это действительно хороший проект.

Ответ 5

Использование CSS и divs вместо ячеек таблицы может быть более точным и, безусловно, будет легче рассчитать клиентскую сторону и сохранить отзывчивость. Здесь пример pseduo-CSS/JS для первого события:

.event:first-child {
    height: `(1.5/24)*100`%; /* 6.25%, based on duration */
    position: absolute;
    top: `(10/24)*100`%; /* 41.7%, based on event start */
}

Ответ 6

dhtmlxScheduler - Календарь событий Ajax/JavaScript

dhtmlxScheduler - это календарь событий JavaScript, который позволяет вам добавить планировщик, похожий на Google, на веб-приложение или веб-сайт. Интуитивно понятный интерфейс перетаскивания позволяет конечным пользователям быстро управлять событиями и встречами в разных представлениях: День, Неделя, Месяц, Год, Повестка, Временная шкала и т.д. Очень легкий (около 20 Кб gzipped), очень настраиваемый и быстрый, dhtmlxScheduler обеспечивает быстрый способ добавления календаря событий на основе Ajax на веб-странице.