Gantt diagrams (диаграммы Ганта)

  • Диаграмма Ганта - это тип гистограммы, который иллюстрирует график проекта и количество времени, необходимое для его завершения. Диаграмма Ганта иллюстрирует количество дней между датами начала и окончания конечных элементов и сводных элементов проекта.

Информация для пользователей

  • Диаграммы Ганта визуализируют каждую запланированную задачу в виде одной непрерывной полосы, которая расположена слева направо. Ось x представляет время, а ось y записывает различные задачи и порядок, в котором они должны быть выполнены.
  • Когда дата, день или набор дат, специфичных для задачи, “исключены”, диаграмма Ганта учтет эти изменения, увеличив равное количество дней вправо, не создавая пробел внутри задачи, как показано ниже.



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



  • Диаграмма Ганта удобна для отслеживания количества времени, которое потребуется до завершения проекта, но ее также можно использовать для графического представления “нерабочих дней” с некоторыми изменениями.
  • Mermaid отображает диаграммы Ганта в формате SVG, PNG или ссылку MarkDown, которую можно вставить в документы.



Синтаксис диаграммы

  • Ниже представлен пример полного синтаксиса диаграммы по проекту.
gantt
    dateFormat  YYYY-MM-DD
    title       Adding GANTT diagram functionality to mermaid
    excludes    weekends
    %% (`excludes` accepts specific dates in YYYY-MM-DD format, days of the week ("sunday") or "weekends", but not the word "weekdays".)

    section A section
    Completed task            :done,    des1, 2014-01-06,2014-01-08
    Active task               :active,  des2, 2014-01-09, 3d
    Future task               :         des3, after des2, 5d
    Future task2              :         des4, after des3, 5d

    section Critical tasks
    Completed task in the critical line :crit, done, 2014-01-06,24h
    Implement parser and jison          :crit, done, after des1, 2d
    Create tests for parser             :crit, active, 3d
    Future task in critical line        :crit, 5d
    Create tests for renderer           :2d
    Add to mermaid                      :1d
    Functionality added                 :milestone, 2014-01-25, 0d

    section Documentation
    Describe gantt syntax               :active, a1, after des1, 3d
    Add gantt diagram to demo page      :after a1  , 20h
    Add another diagram to demo page    :doc1, after a1  , 48h

    section Last section
    Describe gantt syntax               :after doc1, 3d
    Add gantt diagram to demo page      :20h
    Add another diagram to demo page    :48h
  • Так выглядит диаграмма, с предложенным выше синтаксисом:



  • Можно установить несколько зависимостей, разделенных пробелом:



Заголовки (раздел)



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



Определение разделов



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

Обратите внимание, что в отличие от заголовка для всей диаграммы, это имя является обязательным.

  • Кроме названия секций, разделы выделяются различными цветами, как можно увидеть на диаграмме ниже.



Основные этапы (вехи)

  • Существует возможность добавлять контрольные точки к диаграммам. Этапы отличаются от задач тем, что они представляют один момент времени и идентифицируются ключевым словом milestone.
  • Ниже приведен пример использования контрольных точек. Точное местоположение контрольной точки определяется начальной датой для контрольной точки и “продолжительностью” задачи следующим образом: inital date+duration.



Установление дат

  • Оператор dateFormat определяет формат ввода даты для элементов на диаграмме. То, как эти даты будут представлены в выводе отображаемой диаграммы, определяется оператором axisFormat.

Формат даты ввода

  • Формат даты и времени устанавливается в первой строке синтаксиса диаграммы.



  • Формат даты ввода по умолчанию ГГГГ-ММ-ДД. Можно установить свой пользовательский формат даты, при помощи синтаксиса, представленного ниже:
dateFormat YYYY-MM-DD
  • Поддерживаются следующие параметры форматирования даты:
Input       Example             Description:
YYYY        2014               4-х значный год
YY          14                 2 -х значный год
Q           1..4               Квартал (четверть года). Устанавливает месяц в первый месяц квартала. 
M MM        1..12              Номер месяца
MMM MMMM    January..Dec       Название месяца, заданное в moment.locale()
D DD        1..31              День месяца
Do          1st..31st          День месяца с порядковым номером
DDD DDDD    1..365             Номер дня в году
X           1410715640.579     Временная метка Unix
x           1410715640579      Временная метка Unix ms
H HH        0..23              24-х часовое время
h hh        1..12              12-ти часовое время, используемое с a A.
a A         am pm              Вечернее или утреннее время
m mm        0..59              Минуты
s ss        0..59              Секунды
S           0..9               Десятые доли секунды
SS          0..99              Сотые доли секунды
SSS         0..999             Тысячные доли секунды
Z ZZ        +12:00             Смещение от UTC в виде +-HH:mm, +-HHmm, или Z
  • Более подробную информацию можно посмотреть здесь.

Формат даты вывода на оси

  • Формат выходной даты по умолчанию - ГГГГ-ММ-ДД. Можно изменить свой пользовательский формат axisFormat, например, 2020-Q1 для первого квартала 2020 года.
axisFormat  %Y-%m-%d
  • Поддерживаются следующие строки форматирования:
%a - сокращенное название дня недели.
%A - полное название дня недели.
%b - сокращенное название месяца.
%B - полное название месяца.
%c - дата и время,как "%a %b %e %H:%M:%S %Y".
%d - день месяца, с добавлением нуля в виде десятичного числа [01,31].
%e - день месяца, заполненный пробелом, в виде десятичного числа [ 1,31]; эквивалентно %_d.
%H - час (24-часовые часы) в виде десятичного числа [00,23].
%I - час (12-часовые часы) в виде десятичного числа [01,12].
%j - день года в виде десятичного числа [001,366].
%m - месяц в виде десятичного числа [01,12].
%M - минута в виде десятичного числа [00,59].
%L - миллисекунды в виде десятичного числа [000, 999].
%p - утреннее (AM) или вечернее (PM) время.
%S - секунда в виде десятичного числа [00,61].
%U - номер недели года (воскресенье как первый день недели) в виде десятичного числа [00,53].
%w - день недели в виде десятичного числа [0(Воскресенье),6].
%W - номер недели года (понедельник как первый день недели) в виде десятичного числа [00,53].
%x - дата, как "%m/%d/%Y".
%X - время, как "%H:%M:%S".
%y - год без столетия в виде десятичного числа [00,99].
%Y - год с веком в виде десятичного числа.
%Z - смещение часового пояса, напрмер: "-0700".
%% - символ %.

Комментарии

  • Комментарии могут быть введены в диаграмму, которые будут проигнорирована синтаксическим анализатором.
  •  Комментарии должны быть записаны в отдельной строке и начинаться с %% (двойные знаки процента). Любой текст после начала комментария к следующей новой строке будет рассматриваться как комментарий, включая любой синтаксис диаграммы.
gantt
    title A Gantt Diagram
    %% this is a comment
    dateFormat  YYYY-MM-DD
    section Section
    A task           :a1, 2014-01-01, 30d
    Another task     :after a1  , 20d
    section Another
    Task in sec      :2014-01-12  , 12d
    another task      : 24d

Стиль

Css - язык описания внешнего вида документа, написанный с помощью языка разметки.

  • Стилизация диаграммы выполняется путем определения ряда классов css. Во время визуализации эти классы извлекаются из файла, расположенного по адресу src/themes/gantt.scss.

    Используемые классы

    Класс Описание
    grid.tick Оформление линий сетки
    grid.path Оформление границ сетки
    .taskText Стилизация текста задачи
    .taskTextOutsideRight Стиль для текста задачи, который превышает панель действий справа
    .taskTextOutsideLeft Стиль для текста задачи, который превышает панель действий слева
    todayMarker Переключение и стиль для “Маркера сегодняшнего дня” (“Today Marker”)

Пример синтаксиса таблицы стилей

.grid .tick {
    stroke: lightgrey;
    opacity: 0.3;
    shape-rendering: crispEdges;
}
.grid path {
    stroke-width: 0;
}

#tag {
    color: white;
    background: #FA283D;
    width: 150px;
    position: absolute;
    display: none;
    padding:3px 6px;
    margin-left: -80px;
    font-size: 11px;
}

#tag:before {
    border: solid transparent;
    content: ' ';
    height: 0;
    left: 50%;
    margin-left: -5px;
    position: absolute;
    width: 0;
    border-width: 10px;
    border-bottom-color: #FA283D;
    top: -20px;
}
.taskText {
    fill:white;
    text-anchor:middle;
}
.taskTextOutsideRight {
    fill:black;
    text-anchor:start;
}
.taskTextOutsideLeft {
    fill:black;
    text-anchor:end;
}

Взаимодействие

  • Можно привязать событие к узлу, нажатие может привести либо к обратному вызову JavaScript, либо к ссылке, которая будет открыта в новой вкладке браузера.

Эта функция отключена при использовании securityLevel='strict' и включена при использовании securityLevel='loose'.

click taskId call callback(arguments)
click taskId href URL
  • taskId - это идентификатор задачи;

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

    Полный пример использования интерактивных ссылок в контексте html:

<body>
  <div class="mermaid">
    gantt
      dateFormat  YYYY-MM-DD

      section Clickable
      Visit mermaidjs           :active, cl1, 2014-01-07, 3d
      Print arguments         :cl2, after cl1, 3d
      Print task              :cl3, after cl2, 3d

      click cl1 href "https://mermaidjs.github.io/"
      click cl2 call printArguments("test1", "test2", test3)
      click cl3 call printTask()
  </div>

  <script>
    var printArguments = function(arg1, arg2, arg3) {
      alert('printArguments called with arguments: ' + arg1 + ', ' + arg2 + ', ' + arg3);
    }
    var printTask = function(taskId) {
      alert('taskId: ' + taskId);
    }
    var config = {
      startOnLoad:true,
      securityLevel:'loose',
    };
    mermaid.initialize(config);
  </script>
</body>