виджет, только сторона клиента (JS, JQUery, работа с датами, масштабирование)
Диаграмма Ганта - продолжить разработку. Описание текущего кода и его работу можете увидеть в задании. Сам код - в
http://jsfiddle.net/PWvL5/
Стоимость: 1500 руб. за проект.
Описание работы скрипта:
Работает в общем-то банально. В общем используются три вида функций:
1) функция для определения числа дней в месяце getDaysinMonth().
2) функция для определения начала предыдущего/последующего периода prevNextPeriod().
(аргументы дата, для которой нужно определить предыдущий период, dir – направление (предыдущий или последующий), значения prev, prev+, next, next+. Разница с плюсом в том, что если дата, для которой нужно определить предыдущий период, итак является началом периода, то при prev она же и возвращается, а при prev+ возвращается дата периода, идущего перед этим периодом. То же самое с next и next+).
3) функция для определения формата вывода названия периода (формат вывода даты) – getUnit().
Они иногда присутствуют в нескольких модификациях (отдельно для дней недели, отдельно для месяцев и т.д.).
Есть 10 шкал (1 шкала это объект) в массиве. Каждая шкала состоит из двух кусков: мелкие деления (mainUnit) и крупные деления (unit). Т.е. в одном крупном делении несколько мелких. Ну и помимо этого навешано несколько методов: (prevNextPeriod() – отдельно для мелких и крупных делений, getUnit()– отдельно для мелких и крупных делений) и т.п. Также есть полезное свойство/метод unitLength – для мелких делений оно содержит примитив – ширину для их отображения на экране в px. А для крупных делений это метод, который возвращает расчётную ширину в px для их отражения на экране (а сделать это пришлось из-за того, что у месяцев разная длина).
Ну а дальше нарисовать любую шкалу (<table><td>) не проблема: берём заданную дату начала шкалы, вставляем <td>, затем берём с помощью prevNextPeriod следующий период и снова рисуем <td>, пока следующий период не станет больше заданной даты окончания шкалы.
(код длиной в пять строчек)
Ну и осталось добавить в масштабе выбранной шкалы задачи - activities (есть дата начала и дата конца задачи). Вычисляю разницу в милисекундах от заданного начала шкалы до даты начала задачи, затем, зная отображаемую ширину мелких делений, посредством деления, перевожу дату начала в координату left задачи в масштабе данной шкалы. Тоже самое с датой конца задачи. Добавляю задачу.
(код длиной в 8 строчек)
Чего хочу:
0) я в коде поизлишествовал (не сразу у меня сложилось такое мнение и есть лишние кусочки), буду рад если его перепишете короче и нагляднее и правильнее
(тут цена по договорённости)
1) сделайте модификацию prevNextPeriod() для квартала, полугодия, года и подключите к соответствующим объектам шкалы
(времени Вам на это потребуется 30-60 минут с отладкой).
1,5) среднюю горизонтальную border между шкалой крупных и мелких делений уберите (см. скришоты)
1,7) сделайте, чтобы не по двойному клику переключались шкалы, а по ctrl+колёсико мыши вверх/вниз.
2) ниже сетки добавить столбцы, обозначающие рабочее время (оно берётся из функции– смотри пункт 5 ниже и получается округлением до ближайшего периода) - С 9 до 18-00, С 13-00 до 14-00 перерыв на обед. В предпраздничные дни – до 17-00. СКРИНШОТЫ ПРИЛОЖЕНЫ (0-3 – для шкал 0-3 соответственно, а далее серые столбцы не рисуются у всех шкал далее будет просто белое поле – смотри скриншот 4).
3) дату старта диаграммы и дату окончания диаграммы устанавливать автоматически, исходя из списка задач (от начала самой ранней задачи, до конца самой поздней задачи);
(15-30 минут)
4) высоту задач и отступов (кстати, это класс .gantChartBar) между ними сделать в виде переменной;
(5-10 минут)
5) сделать функцию для определения по дате: рабочий день, предпраздничный или выходной/праздничный. Ну и для выдачи расписания рабочего времени по дате, выдача в виде массива – что то вроде: индекс 0 значение 9-13-00, индекс 1 значение 14-00-18-00.
6) ну и наконец, сделать так, чтобы дата конца задачи считалась с использованием функции с -аргументами: дата начала, длительность задачи – на выходе получаем дату окончания. При этом:
- Если длительность задана в днях, часах, минутах – считаются только рабочие дни, часы, минуты (см. п.5 функция определения рабочего времени).
- Если длительность задана в месяцах, кварталах, полугодиях, годах – календарное время используется.
7) Ну и всё это описать – ещё подробнее, чем я здесь описал + комментариев поболее чем я в коде сделал.
Это ещё не всё – остальное – за отдельную оплату.
Разумеется, права на разработку и код принадлежат мне ).