Current Path : /home/bitrix/ext_www/school1535.yacl.site/gantt_old/ |
Current File : /home/bitrix/ext_www/school1535.yacl.site/gantt_old/index.php |
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); $APPLICATION->SetTitle("Новый гантт"); Bitrix\Main\Page\Asset::getInstance()->addCss('/gantt/platform.css'); Bitrix\Main\Page\Asset::getInstance()->addCss('/gantt/libs/jquery/dateField/jquery.dateField.css'); Bitrix\Main\Page\Asset::getInstance()->addCss('/gantt/gantt.css'); Bitrix\Main\Page\Asset::getInstance()->addCss('/gantt/libs/jquery/valueSlider/mb.slider.css'); Bitrix\Main\Page\Asset::getInstance()->addJs('/gantt/libs/jquery/jquery.livequery.1.1.1.min.js'); Bitrix\Main\Page\Asset::getInstance()->addJs('/gantt/libs/jquery/jquery.timers.js'); Bitrix\Main\Page\Asset::getInstance()->addJs('/gantt/libs/utilities.js'); Bitrix\Main\Page\Asset::getInstance()->addJs('/gantt/libs/forms.js'); Bitrix\Main\Page\Asset::getInstance()->addJs('/gantt/libs/date.js'); Bitrix\Main\Page\Asset::getInstance()->addJs('/gantt/libs/dialogs.js'); Bitrix\Main\Page\Asset::getInstance()->addJs('/gantt/libs/layout.js'); Bitrix\Main\Page\Asset::getInstance()->addJs('/gantt/libs/i18nJs.js'); Bitrix\Main\Page\Asset::getInstance()->addJs('/gantt/libs/jquery/dateField/jquery.dateField.js'); Bitrix\Main\Page\Asset::getInstance()->addJs('/gantt/libs/jquery/JST/jquery.JST.js'); Bitrix\Main\Page\Asset::getInstance()->addJs('/gantt/libs/jquery/valueSlider/jquery.mb.slider.js'); Bitrix\Main\Page\Asset::getInstance()->addJs('/gantt/libs/jquery/svg/jquery.svg.min.js'); Bitrix\Main\Page\Asset::getInstance()->addJs('/gantt/libs/jquery/svg/jquery.svgdom.1.8.js'); Bitrix\Main\Page\Asset::getInstance()->addJs('/gantt/ganttUtilities.js'); Bitrix\Main\Page\Asset::getInstance()->addJs('/gantt/ganttTask.js'); Bitrix\Main\Page\Asset::getInstance()->addJs('/gantt/ganttDrawerSVG.js'); Bitrix\Main\Page\Asset::getInstance()->addJs('/gantt/ganttZoom.js'); Bitrix\Main\Page\Asset::getInstance()->addJs('/gantt/ganttGridEditor.js'); Bitrix\Main\Page\Asset::getInstance()->addJs('/gantt/ganttMaster.js'); ?> <div id="workSpace" style="overflow-y: auto; overflow-x: hidden; position: relative;"></div> <form id="gimmeBack" style="display: none;" action="../gimmeBack.jsp" method="post" target="_blank"> <input type="hidden" name="prj" id="gimBaPrj" /> </form> <script type="text/javascript"> let ge; $(function () { // here starts gantt initialization ge = new GanttMaster(); ge.set100OnClose = true; ge.shrinkParent = true; setTimeout(() => { ge.init($("#workSpace")); loadI18n(); //overwrite with localized ones //in order to force compute the best-fitting zoom level delete ge.gantt.zoom; ge.loadProject({ tasks: [ { id: -1, name: "1 \u041f\u0420\u0415\u0414\u0412\u0410\u0420\u0418\u0422\u0415\u041b\u042c\u041d\u042b\u0419 \u042d\u0422\u0410\u041f", progress: 0, progressByWorklog: false, relevance: 0, type: "", typeId: "", description: "", code: "", level: 0, status: "STATUS_ACTIVE", depends: "", canWrite: true, start: 1658468629000, duration: 30, startPlan: 1657950229000, durationPlan: 15, startIsMilestone: false, endIsMilestone: false, collapsed: false, assigs: [], hasChild: true, }, { id: -2, name: "1.1 \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u044d\u0442\u0430\u043f - \u0413\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u044b", progress: 0, progressByWorklog: false, relevance: 0, type: "", typeId: "", description: "", code: "", level: 1, status: "STATUS_ACTIVE", depends: "", canWrite: true, start: 1658468629000, duration: 10, startPlan: 1657950229000, durationPlan: 9, startIsMilestone: false, endIsMilestone: false, collapsed: false, assigs: [], hasChild: true, }, { id: -3, name: "1.1.1 \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0414\u041e \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u044f \u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0439 \u043d\u043e\u0432\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u041d\u0422\u0421 \u0438 \u0434\u0430\u0442\u043e\u0439", progress: 0, progressByWorklog: false, relevance: 0, type: "", typeId: "", description: "", code: "", level: 2, status: "STATUS_ACTIVE", depends: "", canWrite: true, start: 1659159829000, duration: 2, startPlan: 1659073429000, durationPlan: 3, startIsMilestone: false, endIsMilestone: false, collapsed: false, assigs: [], hasChild: false, }, { id: -4, name: "1.1.2 \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0432 \u0414\u041e", progress: 0, progressByWorklog: false, relevance: 0, type: "", typeId: "", description: "", code: "", level: 2, status: "STATUS_ACTIVE", depends: "3", canWrite: true, start: 1659332629000, duration: 4, startPlan: 1659419029000, durationPlan: 2, startIsMilestone: false, endIsMilestone: false, collapsed: false, assigs: [], hasChild: false, }, { id: -5, name: "1.2.1 \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0439 \u0432 \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0422\u041f\u0418 \u0420\u043e\u0441\u043d\u0435\u0434\u0440\u0430", progress: 0, progressByWorklog: false, relevance: 0, type: "", typeId: "", description: "", code: "", level: 1, status: "STATUS_ACTIVE", depends: "2", canWrite: true, start: 1659159829000, duration: 5, startPlan: 1659159829000, durationPlan: 6, startIsMilestone: false, endIsMilestone: false, collapsed: false, assigs: [], hasChild: true, }, { id: -6, name: "1.2.2 \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0439 \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u0435 \u0420\u043e\u0441\u043d\u0435\u0434\u0440\u0430", progress: 0, progressByWorklog: false, relevance: 0, type: "", typeId: "", description: "", code: "", level: 2, status: "STATUS_ACTIVE", depends: "", canWrite: true, start: 1659159829000, duration: 4, startPlan: 1659159829000, durationPlan: 3, startIsMilestone: false, endIsMilestone: false, collapsed: false, assigs: [], hasChild: false, }, { id: -7, name: "1.2.3 \u0414\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 \u0420\u043e\u0441\u043d\u0435\u0434\u0440\u0430", progress: 0, progressByWorklog: false, relevance: 0, type: "", typeId: "", description: "", code: "", level: 2, status: "STATUS_ACTIVE", depends: "", canWrite: true, start: 1659419029000, duration: 3, startPlan: 1659332629000, durationPlan: 3, startIsMilestone: false, endIsMilestone: false, collapsed: false, assigs: [], hasChild: false, }, { id: -8, name: "1.2.4 \u0418\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043a\u0430\u0437\u0430 \u0420\u043e\u0441\u043d\u0435\u0434\u0440\u0430 \u043e \u043d\u043e\u0432\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u0445 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043d\u0430 \u0433\u043e\u0434", progress: 0, progressByWorklog: false, relevance: 0, type: "", typeId: "", description: "", code: "", level: 2, status: "STATUS_ACTIVE", depends: "", canWrite: true, start: 1659591829000, duration: 2, startPlan: 1659419029000, durationPlan: 5, startIsMilestone: false, endIsMilestone: false, collapsed: false, assigs: [], hasChild: false, }, ], canWrite: true, canDelete: true, canWriteOnParent: true, canAdd: true, }); }, 0) }); </script> <div id="gantEditorTemplates" style="display: none"> <div class="__template__" type="GANTBUTTONS"> <!-- <div class="ganttButtonBar noprint"> <div class="buttons"> <button onclick="$('#workSpace').trigger('zoomMinus.gantt'); return false;" class="" title="zoom out"><span class="teamworkIcon">)</span></button> <button onclick="$('#workSpace').trigger('zoomPlus.gantt');return false;" class="" title="zoom in"><span class="teamworkIcon">(</span></button> <button onclick="ge.gantt.showCriticalPath=!ge.gantt.showCriticalPath; ge.redraw();return false;" class="requireCanSeeCriticalPath" title="CRITICAL_PATH"><span class="teamworkIcon">£</span></button> </div> --> </div> <div class="__template__" type="TASKSEDITHEAD"> <!-- <table class="gdfTable" cellspacing="0" cellpadding="0"> <thead> <tr style="height: 48px;"> <th class="gdfColHeader" style="width: 45px;">№<br />н.н.</th> <th class="gdfColHeader gdfResizable" style="width: 250px;">Этап/Задача</th> <th class="gdfColHeader gdfResizable" style="width: 150px;">Вид работ</th> <th class="gdfColHeader gdfResizable" style="width: 94px;">План нач.<br /><span class="green">Факт нач.</span></th> <th class="gdfColHeader gdfResizable" style="width: 94px;">План окон.<br /><span class="green">Факт окон.</span></th> <th class="gdfColHeader gdfResizable" style="width: 150px;">Ответственный</th> <th class="gdfColHeader gdfResizable" style="width: 56px;">Дней</th> <th class="gdfColHeader gdfResizable" style="width: 144px;">План объем работ<br /><span class="red">Факт объем работ</span></th> <th class="gdfColHeader gdfResizable" style="width: 500px; text-align: left; padding-left: 10px;">Процент<br />выполнения</th> </tr> </thead> </table> --> </div> <div class="__template__" type="TASKROW"> <!-- <tr id="tid_(#=obj.id#)" taskId="(#=obj.id#)" class="taskEditRow (#=obj.isParent()?'isParent':''#) (#=obj.collapsed?'collapsed':''#)" level="(#=level#)"> <td class="gdfCell"><span class="taskRowIndex">(#=obj.getRow()+1#)</span></td> <td class="gdfCell indentCell" style="padding-left:(#=obj.level*10+18#)px;"> <div class="exp-controller" align="center"></div> <input type="text" name="name" value="(#=obj.name#)" placeholder="name"> </td> <td class="gdfCell"> <select name="works_type" class="select2"> <option value="">Не выбрано</option> <option value="1">Вид работ 1</option> <option value="2">Вид работ 2</option> <option value="3">Вид работ 3</option> </select> </td> <td class="gdfCell"> <input type="text" name="startPlan" value="" class="date"> <input type="text" name="start" value="" class="date green"> </td> <td class="gdfCell"> <input type="text" name="endPlan" value="" class="date"> <input type="text" name="end" value="" class="date green"> </td> <td class="gdfCell"></td> <td class="gdfCell"><input type="text" name="duration" autocomplete="off" value="(#=obj.duration#)"></td> <td class="gdfCell"></td> <td class="gdfCell"><input type="text" name="progress" class="validated" entrytype="PERCENTILE" autocomplete="off" value="(#=obj.progress?obj.progress:''#)" (#=obj.progressByWorklog?"readOnly":""#)></td> </tr> --> </div> <div class="__template__" type="TASKEMPTYROW"> <!-- <tr class="taskEditRow emptyRow" > <th class="gdfCell"></th> <td class="gdfCell"></td> <td class="gdfCell"></td> <td class="gdfCell"></td> <td class="gdfCell"></td> <td class="gdfCell"></td> <td class="gdfCell"></td> <td class="gdfCell"></td> <td class="gdfCell"></td> </tr> --> </div> </div> <script type="text/javascript"> setTimeout(() => { $.JST.loadDecorator("RESOURCE_ROW", function (resTr, res) { resTr.find(".delRes").click(function () { $(this).closest("tr").remove(); }); }); $.JST.loadDecorator("ASSIGNMENT_ROW", function (assigTr, taskAssig) { var resEl = assigTr.find("[name=resourceId]"); var opt = $("<option>"); resEl.append(opt); for (var i = 0; i < taskAssig.task.master.resources.length; i++) { var res = taskAssig.task.master.resources[i]; opt = $("<option>"); opt.val(res.id).html(res.name); if (taskAssig.assig.resourceId == res.id) opt.attr("selected", "true"); resEl.append(opt); } var roleEl = assigTr.find("[name=roleId]"); for (var i = 0; i < taskAssig.task.master.roles.length; i++) { var role = taskAssig.task.master.roles[i]; var optr = $("<option>"); optr.val(role.id).html(role.name); if (taskAssig.assig.roleId == role.id) optr.attr("selected", "true"); roleEl.append(optr); } if ( taskAssig.task.master.permissions.canWrite && taskAssig.task.canWrite ) { assigTr.find(".delAssig").click(function () { var tr = $(this) .closest("[assId]") .fadeOut(200, function () { $(this).remove(); }); }); } }); }, 0) function loadI18n() { GanttMaster.messages = { CANNOT_WRITE: "No permission to change the following task:", CHANGE_OUT_OF_SCOPE: "Project update not possible as you lack rights for updating a parent project.", START_IS_MILESTONE: "Start date is a milestone.", END_IS_MILESTONE: "End date is a milestone.", TASK_HAS_CONSTRAINTS: "Task has constraints.", GANTT_ERROR_DEPENDS_ON_OPEN_TASK: "Error: there is a dependency on an open task.", GANTT_ERROR_DESCENDANT_OF_CLOSED_TASK: "Error: due to a descendant of a closed task.", TASK_HAS_EXTERNAL_DEPS: "This task has external dependencies.", GANNT_ERROR_LOADING_DATA_TASK_REMOVED: "GANNT_ERROR_LOADING_DATA_TASK_REMOVED", CIRCULAR_REFERENCE: "Circular reference.", CANNOT_DEPENDS_ON_ANCESTORS: "Cannot depend on ancestors.", INVALID_DATE_FORMAT: "The data inserted are invalid for the field format.", GANTT_ERROR_LOADING_DATA_TASK_REMOVED: "An error has occurred while loading the data. A task has been trashed.", CANNOT_CLOSE_TASK_IF_OPEN_ISSUE: "Cannot close a task with open issues", TASK_MOVE_INCONSISTENT_LEVEL: "You cannot exchange tasks of different depth.", CANNOT_MOVE_TASK: "CANNOT_MOVE_TASK", PLEASE_SAVE_PROJECT: "PLEASE_SAVE_PROJECT", GANTT_SEMESTER: "Semester", GANTT_SEMESTER_SHORT: "s.", GANTT_QUARTER: "Quarter", GANTT_QUARTER_SHORT: "q.", GANTT_WEEK: "Week", GANTT_WEEK_SHORT: "w.", }; } </script> <?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>