Bootstrap + TodoList = Trello
Трелло — удобная штука для ведения проектов. Там все задачи представлены в виде колонок, а каждая колонка отвечает за что-то своё. Давайте сделаем нечто подобное, тем более что всё для этого у нас уже есть:
- Bootstrap, с которым мы познакомились, пока создавали страницы с котиками;
- список задач, где можно добавлять новые и удалять ненужные пункты.
Если это объединить, получится что-то похожее на Trello. Логика такая:
- у нас будет несколько колонок на странице (за это отвечает Bootstrap);
- каждая колонка будет отвечать за свои задачи и называться по-своему;
- в каждой колонке можно добавлять и удалять задачи независимо от остальных (а за это отвечает скрипт из прошлого списка задач).
Мы сделаем 4 колонки, но вы для себя можете сделать их столько, сколько нужно. Единственное ограничение — Bootstrap не позволяет делать больше 12 колонок. Надеемся, вам этого хватит.
Готовим колонки и настраиваем стили
За основу возьмём страницу из статьи про котиков и сделаем с ней следующее:
- перенесём в неё стили из страницы со списком задач;
- добавим недостающие стили для заголовков колонок и всей страницы;
- подготовим пустые 4 колонки и настроим их размер под разную ширину экрана.
Если мы всё сделаем правильно, то получится следующее:
Наполняем колонки
У каждой колонки должно быть своё название, поэтому назовём их «Сделать», «Позвонить», «Написать» и «Идеи».
Мы помним, что в каждой колонке должен быть отдельный список задач, поэтому возьмём кусок кода из прошлого материала. Главное, что нам нужно учесть, — что у каждого списка должно быть своё уникальное имя, чтобы мы их не перепутали в процессе. Для этого мы просто добавим цифры от одного до четырёх к названию каждого списка. Например, было «tldDiv», а стало «tld1Div, «tld2Div» и так далее.
В итоге колонки будут выглядеть так:
Переносим и расширяем скрипт
Теперь наша задача — взять прошлый скрипт и адаптировать его под наши цели. Нам нужно, чтобы каждая колонка с задачами работала автономно и не зависела от других, поэтому сейчас скрипт увеличится в 4 раза — для каждого списка будет свой код.
Сразу скажем: это плохое решение. Копипаст кода для расширения функциональности — это путь к долгой мучительной смерти под завалами спагетти-кода. По-хорошему нужно заворачивать это приложение в классы, делать объекты и работать с ними.
Мы всё это понимаем.
Но копипаста быстрее.
Если собрать все изменения, которые нам понадобятся, то получится такой список:
- В самом начале, когда мы заводим переменные под наши задачи, у нас теперь не просто List и Mask, а List1, Mask1, List2, Mask2 и так далее. Это нужно для того, чтобы не смешивать списки задач.
- Поменялось и содержимое этих переменных — теперь там есть цифры, которые показывают, к какому списку они относятся. Важный момент — у нас длина префикса «tdl_» увеличилась на один символ и стала, например, «tdl1_». Это нам нужно будет учесть в середине скрипта.
- Так как списки должны быть автономны, то и индексы, которые мы добавляем к каждому элементу, тоже должны не зависеть друг от друга. Отсюда и переменные вида element_Id_1 и number_Id_1.
Единственное, что осталось прежним, — обработка удаления задачи. В обработчике всё уже изначально организовано так, что скрипт сразу получает все данные, которые ему нужны, независимо от колонки и порядкового номера задачи.
Сам скрипт получается таким:
Собираем готовую страницу
Нам осталось собрать всё вместе и проверить, как это работает. Если будете добавлять колонки — не забудьте про новые названия для переменных и про имена элементов в самих колонках. На текущем этапе мы добавляем всё вручную, но в будущей версии сделаем генератор нужного числа колонок.
Что дальше
Чтобы этот продукт стал ближе к идеалу, можно сделать так:
- с помощью классов и объектов упорядочить создание новых колонок — не копипастить код, а делать всё через объекты;
- добавить возможность перетаскивать задачи между колонками;
- сделать комментарии к каждой задаче;
- разрешить изменение заголовков у колонок прямо на странице (contentEditable нам в помощь);
- настроить фон.
Скоро доберёмся и до этого! Подписывайтесь на наш канал!