TaskManager.php.task.js 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978
  1. // @required var BASE_URL
  2. // @required var TASK
  3. // @required var USER
  4. // @required var TYPE
  5. // @required var ProblemsTableId
  6. // @required var ProjectsTableId
  7. var activeCount = 0;
  8. var allCount = 0;
  9. var acceptedCount = 0;
  10. var picker;
  11. var position = 0;
  12. var wordLen = 0;
  13. var projectId;
  14. var author;
  15. var state = [];
  16. var loaded;
  17. renderForm();
  18. /*$(document).on('click', '#save', function() {
  19. $("#save").prop('disabled', true);
  20. save();
  21. });*/
  22. function setSort() {
  23. var req = `
  24. <Transaction
  25. xmlns="http://www.opengis.net/wfs"
  26. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  27. version="1.0.0"
  28. service="WFS"
  29. xmlns:p5_default_db="` + BASE_WFS_URL + `/default_db/"
  30. xmlns:gml="http://www.opengis.net/gml">
  31. `;
  32. var i = 0;
  33. var idx = [];
  34. $("#sortable").children(".singleTask").each(function() {
  35. i++;
  36. req += `
  37. <Insert xmlns="http://www.opengis.net/wfs">
  38. <PROBLEMS xmlns="` + BASE_WFS_URL + `/default_db/">
  39. <ID xmlns="` + BASE_WFS_URL + `/default_db/">` + $(this).data("id") + `</ID>
  40. <SORT_PRIO xmlns="` + BASE_WFS_URL + `/default_db/">` + i + `</SORT_PRIO>
  41. </PROBLEMS>
  42. </Insert>
  43. `;
  44. idx.push($(this).data("id"));
  45. });
  46. req += `</Transaction>`;
  47. var link = BASE_URL + 'wfs-data.php/default_db/?SERVICE=WFS&VERSION=1.0.0&SRSNAME=EPSG:3003&';
  48. $.ajax({
  49. url: link,
  50. data: req,
  51. type: 'POST',
  52. contentType: "text/xml",
  53. dataType: "xml",
  54. success: function(data) {
  55. if ($(data).find("ServiceException").text() == "") {
  56. $.notify("Sortowanie zsynchronizowane", "success");
  57. } else {
  58. $.notify($(data).find("ServiceException").text(), "danger");
  59. $.notify("Błąd. Skontaktuj się z administratorem", "error");
  60. }
  61. }
  62. });
  63. var temp = [];
  64. $.each(idx, function(i, e) {
  65. var index = getIndexById(e);
  66. temp.push(state[index]);
  67. });
  68. $.each(state, function(i, e) {
  69. if (e['percent'] == "100%")
  70. temp.push(e);
  71. });
  72. state = [];
  73. state = temp;
  74. render();
  75. }
  76. function createLink(name, id) {
  77. if (TYPE == "PROBLEM") return 'index.php?_route=ViewTableAjax&namespace=default_db/' + "PROBLEMS" + '#EDIT/' + id
  78. if (TYPE == "PROJECT") return 'index.php?_route=ViewTableAjax&namespace=default_db/' + "IN7_MK_BAZA_DYSTRYBUCJI" + '#EDIT/' + id
  79. return '#'
  80. }
  81. function getDetails(value) {
  82. var date = false;
  83. var worker = false;
  84. $.each(value.split(" "), function(i, e) {
  85. if (e.substr(0, 1) == "@") {
  86. var query = e.substr(1);
  87. if (query != "" && isNaN(query.substr(0, 1)) && !worker) {
  88. worker = query;
  89. }
  90. if (query != "" && !isNaN(query.substr(0, 1)) && !date) {
  91. date = moment(query).format('YYYY-MM-DD HH:mm:ss');
  92. }
  93. }
  94. });
  95. return {
  96. worker: worker,
  97. date: date
  98. };
  99. }
  100. function updateProgress() {
  101. var proc;
  102. var procAcc;
  103. allCount = state.length;
  104. activeCount = 0;
  105. acceptedCount = 0;
  106. $.each(state, function(i, e) {
  107. if (e["percent"] != "100%") {
  108. activeCount++;
  109. }
  110. if (e["status"] == "OFF_HARD") {
  111. acceptedCount++;
  112. }
  113. });
  114. if (allCount != 0) {
  115. proc = Math.round((allCount - activeCount) / allCount * 100 / 10) * 10;
  116. procAcc = Math.round((acceptedCount) / allCount * 100 / 10) * 10;
  117. } else {
  118. proc = 0;
  119. procAcc = 0;
  120. }
  121. $("#completed").css('width', proc - procAcc + "%").attr('aria-valuenow', proc - procAcc).text(proc + '%');
  122. $("#accepted").css('width', procAcc + "%").attr('aria-valuenow', procAcc).text(procAcc + '%');
  123. if (proc == 0) {
  124. $("#completed").text("");
  125. }
  126. if (procAcc == 0) {
  127. $("#accepted").text("");
  128. }
  129. if (proc == procAcc) {
  130. $("#completed").text("");
  131. }
  132. }
  133. function getCaretPosition(ctrl) {
  134. var start, end;
  135. if (ctrl.setSelectionRange) {
  136. start = ctrl.selectionStart;
  137. end = ctrl.selectionEnd;
  138. } else if (document.selection && document.selection.createRange) {
  139. var range = document.selection.createRange();
  140. start = 0 - range.duplicate().moveStart('character', -100000);
  141. end = start + range.text.length;
  142. }
  143. return {
  144. start: start,
  145. end: end
  146. }
  147. }
  148. $(document).on('dblclick', '#sortable li', function(e) { //
  149. var link = BASE_URL + 'wfs-data.php/default_db/?SERVICE=WFS&VERSION=1.0.0&SRSNAME=EPSG:3003&';
  150. var index = getIndexById($(this).data("id"));
  151. var req = `
  152. <Transaction
  153. xmlns="http://www.opengis.net/wfs"
  154. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  155. version="1.0.0"
  156. service="WFS"
  157. xmlns:p5_default_db="` + BASE_WFS_URL + `/default_db/"
  158. xmlns:gml="http://www.opengis.net/gml">
  159. `;
  160. req += `
  161. <Insert xmlns="http://www.opengis.net/wfs">
  162. <PROBLEMS xmlns="` + BASE_WFS_URL + `/default_db/">
  163. <ID xmlns="` + BASE_WFS_URL + `/default_db/">` + $(this).data("id") + `</ID>`;
  164. if (state[index]["status"] == "NORMAL") {
  165. state[index]["status"] = "WAITING";
  166. req += '<A_STATUS xmlns="' + BASE_WFS_URL + '/default_db/">WAITING</A_STATUS>';
  167. } else if (state[index]["status"] == "WAITING") {
  168. state[index]["status"] = "NORMAL";
  169. req += '<A_STATUS xmlns="' + BASE_WFS_URL + '/default_db/">NORMAL</A_STATUS>';
  170. }
  171. req += `</PROBLEMS>
  172. </Insert>
  173. </Transaction>`;
  174. render();
  175. $.ajax({
  176. url: link,
  177. data: req,
  178. type: 'POST',
  179. contentType: "text/xml",
  180. dataType: "text",
  181. success: function(data) {}
  182. });
  183. });
  184. function autoCom() {
  185. var hide = true;
  186. $(".eInput").autocomplete({
  187. source: function(request, response) {
  188. $.ajax({
  189. url: BASE_URL + 'wfs-data.php/default_db/?SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=p5_default_db:ADMIN_USERS&SRSNAME=EPSG:3003&Filter=<ogc:Filter><ogc:PropertyIsLike wildCard="*" singleChar="^" escapeChar="!"><ogc:PropertyName>ADM_ACCOUNT</ogc:PropertyName><ogc:Literal>*' + request.term + '*</ogc:Literal></ogc:PropertyIsLike></ogc:Filter>&maxFeatures=10',
  190. dataType: "xml",
  191. success: function(xmlResponse) {
  192. var data = $("featureMember", xmlResponse).map(function() {
  193. if ($("ID", this).text() != 0)
  194. return {
  195. value: $("ADM_ACCOUNT", this).text(),
  196. id: $("ID", this).text()
  197. };
  198. });
  199. response(data);
  200. }
  201. });
  202. },
  203. search: function() {
  204. if (hide) return false;
  205. },
  206. select: function(event, ui) {
  207. var text = this.value;
  208. this.value = text.substring(0, position) + " @" +
  209. ui.item.value + " " + text.substring(position + wordLen + 2);
  210. return false;
  211. },
  212. focus: function() {
  213. return false;
  214. },
  215. minLength: 0
  216. }).bind("keyup", function() {
  217. hide = true;
  218. $(this).autocomplete("close");
  219. var caret = getCaretPosition(this);
  220. var val = this.value;
  221. val += " ";
  222. var result = /\S+$/.exec(val.slice(0, val.indexOf(' ', caret.end)));
  223. var lastWord = result ? result[0] : null;
  224. if (lastWord != null && lastWord.substring(0, 1) == "@") {
  225. wordLen = lastWord.length;
  226. var query = lastWord.substr(1);
  227. if (isNaN(query.substring(0, 1)) && query != "") {
  228. hide = false;
  229. if (val.substr(0, caret.end).lastIndexOf(" ") > 0) {
  230. position = val.substr(0, caret.end).lastIndexOf(" ");
  231. } else {
  232. position = 0;
  233. }
  234. }
  235. if (!isNaN(query.substring(0, 1)) && query != "") {
  236. if (val.substr(0, caret.end).lastIndexOf(" ") > 0) {
  237. position = val.substr(0, caret.end).lastIndexOf(" ");
  238. } else {
  239. position = 0;
  240. }
  241. $(picker).data("DateTimePicker").show();
  242. }
  243. }
  244. $(this).autocomplete("search", query);
  245. });
  246. }
  247. $(document).on('keydown', '.hours', function(e) {
  248. var textarea = this;
  249. if (e.which == 13) {
  250. $(textarea).prop("disabled", true);
  251. var req = `
  252. <Transaction
  253. xmlns="http://www.opengis.net/wfs"
  254. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  255. version="1.0.0"
  256. service="WFS"
  257. xmlns:p5_default_db="` + BASE_WFS_URL + `/default_db/"
  258. xsi:schemaLocation="` + BASE_WFS_URL + `/default_db/` + BASE_URL + `dev-pl/se-feature-api/wfs.php/xml/wfs/default_db/PROBLEMS/?SERVICE=WFS&amp;VERSION=1.0.0&amp;REQUEST=DescribeFeatureType&amp;TYPENAME=p5_default_db:PROBLEMS&amp;SRSNAME=EPSG:4326&amp;"
  259. xmlns:gml="http://www.opengis.net/gml">
  260. `;
  261. req += `
  262. <Insert xmlns="http://www.opengis.net/wfs">
  263. <PROBLEMS xmlns="` + BASE_WFS_URL + `/default_db">
  264. <ID xmlns="` + BASE_WFS_URL + `/default_db">` + $(this).parents("li").data('id') + `</ID>
  265. <L_APPOITMENT_PERIOD xmlns="` + BASE_WFS_URL + `/default_db">` + $(textarea).val() + `</L_APPOITMENT_PERIOD>
  266. </PROBLEMS>
  267. </Insert>`;
  268. req += '</Transaction>';
  269. var ids = [];
  270. var tab = getObjOfElement(this, ids);
  271. var period = $(this).val();
  272. var link = BASE_URL + 'wfs-data.php/default_db/?SERVICE=WFS&VERSION=1.0.0&SRSNAME=EPSG:3003&';
  273. $.ajax({
  274. url: link,
  275. data: req,
  276. type: 'POST',
  277. contentType: "text/xml",
  278. dataType: "xml",
  279. success: function(data) {
  280. $.notify("Zapisano!", "success");
  281. tab["period"] = period;
  282. console.log(ids)
  283. $.each(ids, function(i, e){
  284. var result = getObjOfElement($('.singleTask[data-id="'+e+'"]').children(".editable"));
  285. console.log(result)
  286. var period = 0;
  287. var count = 0;
  288. $.each(result["childs"], function(i2,e2){
  289. count++;
  290. period += parseInt(e2["period"])
  291. })
  292. if(count != 0)
  293. result["period"] = period
  294. })
  295. render();
  296. }
  297. });
  298. }
  299. });
  300. $(document).on('keydown', '.editable', function(e) {
  301. var textarea = this;
  302. if (e.keyCode == 13) {
  303. $(textarea).prop("disabled", true);
  304. var details = getDetails($(this).val());
  305. var req = `
  306. <Transaction
  307. xmlns="http://www.opengis.net/wfs"
  308. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  309. version="1.0.0"
  310. service="WFS"
  311. xmlns:p5_default_db="` + BASE_WFS_URL + `/default_db/"
  312. xmlns:gml="http://www.opengis.net/gml">
  313. `;
  314. req += `
  315. <Insert xmlns="http://www.opengis.net/wfs">
  316. <PROBLEMS xmlns="` + BASE_WFS_URL + `/default_db/">
  317. <ID xmlns="` + BASE_WFS_URL + `/default_db/">` + $(this).parents("li").data('id') + `</ID>`;
  318. if (details.worker != false)
  319. req += '<L_APPOITMENT_USER xmlns="' + BASE_WFS_URL + '/default_db/">' + details.worker + '</L_APPOITMENT_USER>';
  320. else
  321. req += '<L_APPOITMENT_USER xmlns="' + BASE_WFS_URL + '/default_db/">' + USER + '</L_APPOITMENT_USER>';
  322. if (details.date != false)
  323. req += '<A_PROBLEM_DATE xmlns="' + BASE_WFS_URL + '/default_db/">' + details.date + '</A_PROBLEM_DATE>';
  324. else
  325. req += '<A_PROBLEM_DATE xmlns="' + BASE_WFS_URL + '/default_db/">' + moment().format('YYYY-MM-DD HH:mm:ss') + '</A_PROBLEM_DATE>';
  326. req += `<A_PROBLEM_DESC xmlns="` + BASE_WFS_URL + `/default_db/">` + $(this).val() + `</A_PROBLEM_DESC>
  327. <CUSTOMER_ADMIN_USER xmlns="` + BASE_WFS_URL + `/default_db/">BRAK</CUSTOMER_ADMIN_USER>
  328. </PROBLEMS>
  329. </Insert>`;
  330. req += '</Transaction>';
  331. var tab = getObjOfElement(this);
  332. var desc = $(this).val();
  333. var link = BASE_URL + 'wfs-data.php/default_db/?SERVICE=WFS&VERSION=1.0.0&SRSNAME=EPSG:3003&';
  334. $.ajax({
  335. url: link,
  336. data: req,
  337. type: 'POST',
  338. contentType: "text/xml",
  339. dataType: "xml",
  340. success: function(data) {
  341. tab["desc"] = desc;
  342. if (details.worker != false) {
  343. tab["worker"] = details.worker
  344. } else {
  345. tab["worker"] = USER;
  346. }
  347. render();
  348. $.notify("Zapisano!", "success");
  349. }
  350. });
  351. return false;
  352. }
  353. });
  354. $(document).on('keydown', '.eInput', function(e) {
  355. if (e.keyCode == 13) {
  356. if ($(this).val() != "") {
  357. var details = getDetails($(this).val());
  358. var req = `
  359. <Transaction
  360. xmlns="http://www.opengis.net/wfs"
  361. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  362. version="1.0.0"
  363. service="WFS"
  364. xmlns:p5_default_db="` + BASE_WFS_URL + `/default_db/"
  365. xmlns:gml="http://www.opengis.net/gml">
  366. `;
  367. req += `
  368. <Insert xmlns="http://www.opengis.net/wfs">
  369. <PROBLEMS xmlns="` + BASE_WFS_URL + `/default_db/">`;
  370. if (TYPE == "PROBLEM") {
  371. req += `<PARENT_ID xmlns="` + BASE_WFS_URL + `/default_db/">` + TASK + `</PARENT_ID>`;
  372. }
  373. if (TYPE == "PROJECT") {
  374. req += `<PARENT_ID xmlns="` + BASE_WFS_URL + `/default_db/">0</PARENT_ID>`;
  375. }
  376. if (details.worker != false) {
  377. req += '<L_APPOITMENT_USER xmlns="' + BASE_WFS_URL + '/default_db/">' + details.worker + '</L_APPOITMENT_USER>';
  378. } else {
  379. req += '<L_APPOITMENT_USER xmlns="' + BASE_WFS_URL + '/default_db/">' + USER + '</L_APPOITMENT_USER>';
  380. }
  381. if (details.date != false) {
  382. req += '<A_PROBLEM_DATE xmlns="' + BASE_WFS_URL + '/default_db/">' + details.date + '</A_PROBLEM_DATE>';
  383. } else {
  384. req += '<A_PROBLEM_DATE xmlns="' + BASE_WFS_URL + '/default_db/">' + moment().format('YYYY-MM-DD HH:mm:ss') + '</A_PROBLEM_DATE>';
  385. }
  386. req += `<ID_PROJECT xmlns="` + BASE_WFS_URL + `/default_db">` + ProjectId + `</ID_PROJECT>`;
  387. req += `<L_APPOITMENT_PERIOD xmlns="` + BASE_WFS_URL + `/default_db">0</L_APPOITMENT_PERIOD>`;
  388. req += `<A_PROBLEM_DESC xmlns="` + BASE_WFS_URL + `/default_db">` + $(this).val() + `</A_PROBLEM_DESC>
  389. <CUSTOMER_ADMIN_USER xmlns="` + BASE_WFS_URL + `/default_db">BRAK</CUSTOMER_ADMIN_USER>
  390. </PROBLEMS>
  391. </Insert>`;
  392. req += '</Transaction>';
  393. var link = BASE_URL + 'wfs-data.php/default_db/?SERVICE=WFS&VERSION=1.0.0&SRSNAME=EPSG:3003&';
  394. var info = this;
  395. $.ajax({
  396. url: link,
  397. data: req,
  398. type: 'POST',
  399. contentType: "text/xml",
  400. dataType: "xml",
  401. success: function(data) {
  402. if ($(data).find("ServiceException").text() != "") {
  403. $.notify("Błąd API: Prawdopodobnie nie masz uprawnień. Skontaktuj się z administratorem.", "error");
  404. $.notify($(data).find("ServiceException").text(), "danger");
  405. } else {
  406. var temp = {};
  407. temp["id"] = $(data).find("FeatureId").attr("fid").substr($(data).find("FeatureId").attr("fid").indexOf('.') + 1);
  408. temp["desc"] = $(info).val();
  409. temp["percent"] = "0%";
  410. temp["period"] = "0";
  411. temp["childs"] = false;
  412. temp["expand"] = false;
  413. temp["status"] = "WAITING";
  414. temp["worker"] = (details.worker != false ? details.worker : USER);
  415. temp["owner"] = USER;
  416. state.push(temp);
  417. $(".eInput").val("");
  418. updateProgress();
  419. render();
  420. setSort();
  421. }
  422. }
  423. });
  424. }
  425. return false;
  426. }
  427. });
  428. function getObjOfElement(el, ids = []) {
  429. var acc = $(el).parent().closest(".singleTask")
  430. while ($(acc).length > 0) {
  431. ids.unshift($(acc).data("id"));
  432. acc = $(acc).parent().closest(".singleTask")
  433. }
  434. var tab = state;
  435. $.each(ids, function(i, e) {
  436. var index;
  437. if (i == 0) {
  438. index = getIndexById(e, tab);
  439. tab = tab[index];
  440. } else {
  441. index = getIndexById(e, tab["childs"]);
  442. tab = tab["childs"][index];
  443. }
  444. });
  445. ids.reverse();
  446. return tab;
  447. }
  448. $(document).on('click', '.expand', function() {
  449. var tab = getObjOfElement(this);
  450. if (!$(this).data("state")) {
  451. tab["expand"] = true;
  452. if (tab["childs"] === true) {
  453. tab["childs"] = [];
  454. getData("PROBLEM", tab["id"], tab["childs"])
  455. }
  456. } else {
  457. tab["expand"] = false;
  458. }
  459. render();
  460. });
  461. $(document).on('click', '.delTask', function() {
  462. var id = $(this).closest(".singleTask").data("id");
  463. var tab = getObjOfElement(this);
  464. if ($(this).closest(".singleTask").find(".aCheck").data("state") == "1") {
  465. $.notify("Nie możesz zmieniać stanu zatwierdzonych zadań", "danger");
  466. return true;
  467. }
  468. if (tab['childs'] != false) {
  469. $.notify("Zmieniać status można tylko wtedy, jeżeli zadanie nie ma podzadań.", "danger");
  470. return;
  471. }
  472. if ($(this).closest(".singleTask").data("step") == 2) {
  473. allCount--;
  474. } else {
  475. allCount--;
  476. activeCount--;
  477. }
  478. var req = `
  479. <Transaction
  480. xmlns="http://www.opengis.net/wfs"
  481. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  482. version="1.0.0"
  483. service="WFS"
  484. xmlns:p5_default_db="` + BASE_WFS_URL + `/default_db/"
  485. xmlns:gml="http://www.opengis.net/gml">
  486. `;
  487. req += `
  488. <Insert xmlns="http://www.opengis.net/wfs">
  489. <PROBLEMS xmlns="` + BASE_WFS_URL + `/default_db/">`;
  490. req += `<ID xmlns="` + BASE_WFS_URL + `/default_db/">` + id + `</ID>`;
  491. req += `<A_STATUS xmlns="` + BASE_WFS_URL + `/default_db/">DELETED</A_STATUS>
  492. </PROBLEMS>
  493. </Insert>`;
  494. req += '</Transaction>';
  495. var link = BASE_URL + 'wfs-data.php/default_db/?SERVICE=WFS&VERSION=1.0.0&SRSNAME=EPSG:3003&';
  496. $.ajax({
  497. url: link,
  498. data: req,
  499. type: 'POST',
  500. contentType: "text/xml",
  501. dataType: "xml",
  502. success: function(data) {}
  503. });
  504. state.splice(index, 1);
  505. render();
  506. });
  507. $(document).on('click', '#showMore', function() {
  508. if ($("#doneList").is(":visible")) {
  509. $("#doneList").slideUp("fast");
  510. $(this).html("Pokaż wykonane zadania <span class='glyphicon glyphicon-chevron-down'></span>");
  511. } else {
  512. $("#doneList").slideDown("fast");
  513. $(this).html("Ukryj wykonane zadania <span class='glyphicon glyphicon-chevron-up'></span>");
  514. }
  515. });
  516. $(document).on('click', '.aCheck', function() {
  517. var node = this;
  518. var tab = getObjOfElement(this);
  519. if (tab["owner"] != USER) {
  520. $.notify("Tylko zleceniodawca może zatwierdzać postęp prac.", "danger");
  521. return true;
  522. }
  523. var link = BASE_URL + 'wfs-data.php/default_db/?SERVICE=WFS&VERSION=1.0.0&SRSNAME=EPSG:3003&';
  524. var req = `
  525. <Transaction
  526. xmlns="http://www.opengis.net/wfs"
  527. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  528. version="1.0.0"
  529. service="WFS"
  530. xmlns:p5_default_db="` + BASE_WFS_URL + `/default_db"
  531. xmlns:gml="http://www.opengis.net/gml">
  532. `;
  533. req += `
  534. <Insert xmlns="http://www.opengis.net/wfs">
  535. <PROBLEMS xmlns="` + BASE_WFS_URL + `/default_db">
  536. <ID xmlns="` + BASE_WFS_URL + `/default_db">` + $(node).closest("li").data("id") + `</ID>`;
  537. if (tab['status'] != "OFF_HARD") {
  538. req += '<A_STATUS xmlns="' + BASE_WFS_URL + '/default_db">OFF_HARD</A_STATUS>';
  539. tab['status'] = "OFF_HARD";
  540. } else {
  541. req += '<A_STATUS xmlns="' + BASE_WFS_URL + '/default_db">WAITING</A_STATUS>';
  542. tab['status'] = "WAITING";
  543. }
  544. req += `</PROBLEMS>
  545. </Insert>
  546. </Transaction>`;
  547. $.ajax({
  548. url: link,
  549. data: req,
  550. type: 'POST',
  551. contentType: "text/xml",
  552. dataType: "text",
  553. success: function(data) {
  554. setSort();
  555. updateProgress();
  556. render();
  557. }
  558. });
  559. });
  560. function getIndexById(id, arr = state) {
  561. for (var i = 0; i < arr.length; i++) {
  562. if (arr[i]['id'] == id) {
  563. return i;
  564. }
  565. }
  566. return false;
  567. }
  568. $(document).on('click', '.check', function() {
  569. var node = this;
  570. var id = $(node).closest("li").data("id");
  571. var ids = [];
  572. var tab = getObjOfElement(this, ids);
  573. if (tab['status'] == "OFF_HARD") {
  574. $.notify("Nie możesz zmieniać stanu zatwierdzonych zadań", "danger");
  575. return true;
  576. }
  577. if (tab['childs'] != false) {
  578. $.notify("Zmieniać status można tylko wtedy, jeżeli zadanie nie ma podzadań.", "danger");
  579. return;
  580. }
  581. var link = BASE_URL + 'wfs-data.php/default_db/?SERVICE=WFS&VERSION=1.0.0&SRSNAME=EPSG:3003&';
  582. var req = `
  583. <Transaction
  584. xmlns="http://www.opengis.net/wfs"
  585. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  586. version="1.0.0"
  587. service="WFS"
  588. xmlns:p5_default_db="` + BASE_WFS_URL + `/default_db"
  589. xmlns:gml="http://www.opengis.net/gml">
  590. `;
  591. req += `
  592. <Insert xmlns="http://www.opengis.net/wfs">
  593. <PROBLEMS xmlns="` + BASE_URL + `/default_db">
  594. <ID xmlns="` + BASE_WFS_URL + `/default_db">` + $(node).closest("li").data("id") + `</ID>`;
  595. if (tab['percent'] != "100%") {
  596. req += '<A_PROBLEM_COMPLETE_PERCENT xmlns="' + BASE_WFS_URL + '/default_db/PROBLEMS">100%</A_PROBLEM_COMPLETE_PERCENT>';
  597. tab['percent'] = "100%";
  598. } else {
  599. req += '<A_PROBLEM_COMPLETE_PERCENT xmlns="' + BASE_WFS_URL + '/default_db/PROBLEMS">0%</A_PROBLEM_COMPLETE_PERCENT>';
  600. tab['percent'] = "0%";
  601. }
  602. req += `</PROBLEMS>
  603. </Insert>
  604. </Transaction>`;
  605. $.ajax({
  606. url: link,
  607. data: req,
  608. type: 'POST',
  609. contentType: "text/xml",
  610. dataType: "text",
  611. success: function(data) {
  612. setSort();
  613. }
  614. });
  615. console.log(ids)
  616. $.each(ids, function(i, e){
  617. var result = getObjOfElement($('.singleTask[data-id="'+e+'"]').children(".editable"));
  618. console.log(result)
  619. var percent = 0;
  620. var count = 0;
  621. $.each(result["childs"], function(i2,e2){
  622. count++;
  623. percent += parseInt(e2["percent"])
  624. })
  625. if(count != 0)
  626. result["percent"] = (percent/count)+"%"
  627. })
  628. updateProgress();
  629. render();
  630. });
  631. function stripHTML(dirtyString) {
  632. var container = document.createElement('div');
  633. var text = document.createTextNode(dirtyString);
  634. container.appendChild(text);
  635. return container.innerHTML;
  636. }
  637. function renderForm() {
  638. $("#left").empty();
  639. var link, link2;
  640. if (TYPE == "PROBLEM") {
  641. link = BASE_URL + "wfs-data.php/default_db/?SERVICE=WFS&VERSION=1.0.0&TYPENAME=p5_default_db:PROBLEMS&REQUEST=DescribeFeatureTypeAdvanced";
  642. link2 = BASE_URL + "wfs-data.php/default_db/?SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=p5_default_db:PROBLEMS&SRSNAME=EPSG:3003&Filter=<ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>ID</ogc:PropertyName><ogc:Literal>" + TASK + "</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter>";
  643. }
  644. if (TYPE == "PROJECT") {
  645. link = BASE_URL + "wfs-data.php/default_db/?SERVICE=WFS&VERSION=1.0.0&TYPENAME=p5_default_db:IN7_MK_BAZA_DYSTRYBUCJI&REQUEST=DescribeFeatureTypeAdvanced";
  646. link2 = BASE_URL + "wfs-data.php/default_db/?SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=p5_default_db:IN7_MK_BAZA_DYSTRYBUCJI&SRSNAME=EPSG:3003&Filter=<ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>ID</ogc:PropertyName><ogc:Literal>" + TASK + "</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter>";
  647. }
  648. var field = '';
  649. $.get(link, function(fields) {
  650. $.get(link2, function(data) {
  651. author = $(data).find("A_RECORD_CREATE_AUTHOR").text();
  652. if (TYPE == "PROBLEM") {
  653. ProjectId = $(data).find("ID_PROJECT").text();
  654. }
  655. if (TYPE == "PROJECT") {
  656. ProjectId = TASK;
  657. }
  658. if (TYPE == "PROBLEM") {
  659. var breadcrumb = `
  660. <ol class="breadcrumb">
  661. ` + ($(data).find("ID_PROJECT").text() != 0 ? "<li><a href='" + BASE_URL + "index.php?_route=UrlAction_TaskManager&ID_PROJECT=" + $(data).find("ID_PROJECT").text() + "'> Projekt " + $(data).find("ID_PROJECT").text() + "</a></li>" : "") + `
  662. ` + ($(data).find("PARENT_ID").text() != 0 ? "<li><a href='" + BASE_URL + "index.php?_route=UrlAction_TaskManager&ID_PROBLEM=" + $(data).find("PARENT_ID").text() + "'> Zadanie " + $(data).find("PARENT_ID").text() + "</a></li>" : "") + `
  663. <li class="active">Zadanie ` + $(data).find("ID").text() + ` </li>
  664. </ol>`;
  665. }
  666. if (TYPE == "PROJECT") {
  667. var breadcrumb = `
  668. <ol class="breadcrumb">
  669. <li class=active> Projekt ` + TASK + `</li>
  670. </ol>`;
  671. }
  672. $("#left").append(breadcrumb);
  673. field += '';
  674. $(fields).find("sequence").find("element").each(function() {
  675. var show = true;
  676. if ($(this).attr('name') == "ID") {
  677. show = false;
  678. }
  679. if (show) {
  680. field += '<span style="font-weight:bold;" data-toggle="popover" data-trigger="hover" title="" data-content="' + stripHTML($(this).attr('p5:description')) + '" data-original-title="' + $(this).attr('name') + '">'
  681. if ($(this).attr('p5:label')) {
  682. field += $(this).attr('p5:label');
  683. } else {
  684. field += $(this).attr('name');
  685. }
  686. field += "</span>: "
  687. var value = $(data).find($(this).attr('name')).text();
  688. field += $(data).find($(this).attr('name')).text();
  689. field += '<div class=clearfix></div></div>';
  690. }
  691. });
  692. field += '<div class="col-xs-offset-0 col-xs-12 col-sm-offset-3 col-sm-9 col-md-offset-2 col-md-10">';
  693. field += '</div></div>';
  694. field += '<a class="btn btn-primary" href="' + createLink("PROBLEMS", TASK) + '">Edytuj</a>';
  695. $("#left").append(field);
  696. $("#left").append("<div class=clearfix></div>");
  697. createLink("PROBLEMS", TASK, $("#save").parents("a"));
  698. //renderTaskManager();
  699. getData(TYPE, TASK, state);
  700. renderTaskManager();
  701. });
  702. });
  703. }
  704. function getData(type, parent_id, target) {
  705. if (type == "PROBLEM") {
  706. link = BASE_URL + 'wfs-data.php/default_db/?SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=p5_default_db:PROBLEMS&SRSNAME=EPSG:3003&Filter=<ogc:Filter><ogc:And><ogc:PropertyIsEqualTo><ogc:PropertyName>PARENT_ID</ogc:PropertyName><ogc:Literal>' + parent_id + '</ogc:Literal></ogc:PropertyIsEqualTo><ogc:Not><ogc:PropertyIsEqualTo><ogc:PropertyName>A_STATUS</ogc:PropertyName><ogc:Literal>Deleted</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Not></ogc:And></ogc:Filter>&sortBy=ID+D'; //SORT_PRIO+A';
  707. }
  708. if (type == "PROJECT") {
  709. link = BASE_URL + 'wfs-data.php/default_db/?SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=p5_default_db:PROBLEMS&SRSNAME=EPSG:3003&Filter=<ogc:Filter><ogc:And><ogc:PropertyIsEqualTo><ogc:PropertyName>ID_PROJECT</ogc:PropertyName><ogc:Literal>' + parent_id + '</ogc:Literal></ogc:PropertyIsEqualTo><ogc:PropertyIsEqualTo><ogc:PropertyName>PARENT_ID</ogc:PropertyName><ogc:Literal>0</ogc:Literal></ogc:PropertyIsEqualTo><ogc:Not><ogc:PropertyIsEqualTo><ogc:PropertyName>A_STATUS</ogc:PropertyName><ogc:Literal>DELETED</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Not></ogc:And></ogc:Filter>&sortBy=ID+D'; //SORT_PRIO+A
  710. }
  711. $.get(link, function(data) {
  712. var count = $(data).find("featureMember").length;
  713. $(data).find("featureMember").each(function(e) {
  714. if ($(this).find("ID").text() == 0) {
  715. return;
  716. }
  717. var temp = {};
  718. temp["id"] = $(this).find("ID").text();
  719. temp["desc"] = $(this).find("A_PROBLEM_DESC").text();
  720. temp["percent"] = $(this).find("A_PROBLEM_COMPLETE_PERCENT").text();
  721. if (temp["percent"] === "") {
  722. $.notify("Błąd krytyczny. Brak uprawnień do komórki: `A_PROBLEM_COMPLETE_PERCENT` w tabeli `PROBLEMS`", "error");
  723. loaded = true;
  724. return false;
  725. }
  726. temp["status"] = $(this).find("A_STATUS").text();
  727. temp["worker"] = $(this).find("L_APPOITMENT_USER").text();
  728. temp["period"] = $(this).find("L_APPOITMENT_PERIOD").text();
  729. temp["owner"] = $(this).find("A_RECORD_CREATE_AUTHOR").text();
  730. temp["childs"] = false;
  731. temp["expand"] = false;
  732. target.push(temp);
  733. var lastId = target.length - 1;
  734. var linkChilds = BASE_URL + "wfs-data.php/default_db/?SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=p5_default_db:PROBLEMS&SRSNAME=EPSG:3003&Filter=<ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>PARENT_ID</ogc:PropertyName><ogc:Literal>" + temp["id"] + "</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter>";
  735. $.get(linkChilds, function(data) {
  736. if ($(data).find("ID").text() != '') {
  737. target[lastId]["childs"] = true;
  738. render();
  739. }
  740. });
  741. });
  742. render();
  743. });
  744. }
  745. function renderTasks(arr, ret = false) {
  746. var resultActive = "";
  747. var resultDone = "";
  748. $.each(arr, function(i, e) {
  749. var result = "";
  750. var css = "";
  751. var css3 = "";
  752. if (e["percent"] != "100%") {
  753. if (e['status'] == "NORMAL") {
  754. css = "background: linear-gradient(to right, #73fb73 0%, #73fb73 " + e["percent"] + ", #bdefbd " + e["percent"] + ", #bdefbd 100%);";
  755. } else if (e['status'] == "WAITING") {
  756. css = "background: linear-gradient(to right, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.1) " + e["percent"] + ", transparent " + e["percent"] + ", transparent 100%);";
  757. }
  758. if (ret)
  759. css = "background-color:#fffabe;";
  760. } else {
  761. if (ret)
  762. css = "background-color:#e6e6e6;";
  763. }
  764. var css2 = "border-left-style:solid;border-left-width:6px;border-left-color:" + (e['percent'] == "100%" ? "#202020" : "#00FF00") + ";";
  765. css2 += "border-right-style:solid;border-right-width:6px;border-right-color:" + (e['percent'] == "100%" ? "#202020" : "#00FF00") + ";";
  766. result += "<li class=singleTask data-id=" + e["id"] + " style='" + css + css2 + "'>";
  767. if (e["percent"] == "100%") {
  768. result += "<span class=check style='background-color:#333333' data-toggle='popover' data-trigger='hover' title='' data-content='Kliknij teraz, aby zmienić status na niewykonane.' data-original-title='Zadanie wykonane'></span>";
  769. if (e['status'] != "OFF_HARD") {
  770. result += "<span class=aCheck data-toggle='popover' data-trigger='hover' title='' data-content='Wykonawca oznaczył zadanie jako wykonane, ale zleceniodawca jeszcze go nie zatwierdził.' data-original-title='Wykonanie zadania niezatwierdzone.'></span>";
  771. } else {
  772. result += "<span class=aCheck style=background-color:#2ecc71; data-toggle='popover' data-trigger='hover' title='' data-content='Zleceniodawca zatwierdził wykonanie zadania. Kliknij, aby cofnąć zatwierdzenie.' data-original-title='Zadanie zatwierdzone'></span>";
  773. }
  774. } else {
  775. if (!ret)
  776. result += "<span class='glyphicon glyphicon-option-vertical ico cursorClick' style=float:left;cursor:grab; data-toggle='popover' data-trigger='hover' title='' data-content='Złap tutaj, aby zmienić pozycje tego zadania.' data-original-title='Sortowanie'></span>";
  777. result += "<span class=check data-toggle='popover' data-trigger='hover' title='' data-content='Oznacz zadanie jako wykonane. Podwójne kliknięcie gdziekolwiek na zadanie spowoduje oznaczenie go jako aktualnie wykonywane.' data-original-title='Zadanie niewykonane'></span>";
  778. }
  779. if (e["childs"] !== false)
  780. result += "<span class='glyphicon " + (!e["expand"] ? "glyphicon-chevron-down" : "glyphicon-chevron-up") + " cursorClick expand' data-state=" + e["expand"] + " style=float:left;padding-right:5px;></span>";
  781. result += "<input type=text " + (e["childs"] ? "DISABLED" : "") + " placeholder='czas' class='form-control hours' value='" + e["period"] + "' style=width:40px;float:left;padding:0px;height:25px; data-toggle='popover' data-trigger='hover' title='' data-content='Wpisz tutaj czas, który zostanie/został przeznaczony na to zadanie i zatwierdź ENTER. ' data-original-title='Czas przeznaczony na zadanie'>"
  782. result += "<textarea " + (USER != e["owner"] || e['status'] == "OFF_HARD" ? "DISABLED" : "") + ' class="editable" style="font-size:small" >' + e['desc'] + "</textarea>";
  783. result += `<div class="dropdown" style=display:inline;float:right;>
  784. <span class="glyphicon glyphicon glyphicon-menu-hamburger cursorClick" style="vertical-align: top;float:right;" data-toggle="dropdown"></span>
  785. <ul class="dropdown-menu dropdown-menu-right">
  786. <li><a href=` + BASE_URL + `index.php?_route=UrlAction_TaskManager&ID_PROBLEM=` + e['id'] + `>Szczegóły</a></li>`;
  787. if (!ret)
  788. result += '<li><p style="cursor:pointer;padding:3px 20px;" class=delTask>Usuń</p></li>';
  789. result += "</ul></div>";
  790. if (e["childs"] !== false && e["childs"] !== true && e["expand"]) {
  791. result += "<ul class=notSortable >";
  792. result += renderTasks(e["childs"], true)
  793. result += "</ul>";
  794. }
  795. result += "</li>"
  796. //result += ((e['owner'] != USER) ? " <span class='glyphicon glyphicon-user user' title='Zlecone przez inną osobę'></span>" : "") + "</li>";
  797. if (e['percent'] == "100%") {
  798. resultDone += result;
  799. } else {
  800. resultActive += result;
  801. }
  802. updateProgress()
  803. });
  804. resultActive += "<div class=clearfix></div>";
  805. resultDone += "<div class=clearfix></div>";
  806. if (ret) return resultActive + resultDone;
  807. $("#sortable").html(resultActive);
  808. $("#doneList").html(resultDone);
  809. }
  810. function render() {
  811. renderTasks(state)
  812. $('.editable').autosize();
  813. $('[data-toggle="popover"]').popover();
  814. }
  815. function loadStats() {
  816. var link;
  817. if (TYPE == "PROBLEM") {
  818. link = BASE_URL + "index.php?_route=UrlAction_TaskManager&_task=getStatsAjax&TYPE=PROBLEM&ID=" + TASK;
  819. } else {
  820. link = BASE_URL + "index.php?_route=UrlAction_TaskManager&_task=getStatsAjax&TYPE=PROBLEM&ID=" + TASK;
  821. }
  822. $.get(link, function(data) {
  823. data = data[0];
  824. var result = "<td>L. wykonanych podzadań: " + data["CHILDS_DONE_COUNT"] + "/" + data["CHILDS_COUNT"] + "</td><td></td>";
  825. $("#line1", ".stats").html(result);
  826. });
  827. }
  828. function renderTaskManager() {
  829. $("#right").append("<div class=taskList ></div>");
  830. if (false) { // TODO
  831. $("#right").append("<h2>Statystyki</h2><div class=stats></div>");
  832. $(".stats").append("<div class=table-responsive><table class=table><tr id=line1></tr><tr id=line2></tr></table></div>");
  833. loadStats();
  834. }
  835. $(".taskList").append("<div class=progress></div>");
  836. $(".progress").append("<div id=accepted class='progress-bar progress-bar-success progress-bar-striped' role=progressbar style=width:9% data-toggle='popover' data-trigger='hover' title='' data-content='Wskazuje na procent całości jakie stanowią zatwierdzone zadania.' data-html='true' data-original-title='% zatwierdzonych zadań' data-placement='bottom'>0%</div>");
  837. $(".progress").append("<div id=completed class='progress-bar progress-bar-info progress-bar-striped' role=progressbar style=width:9% data-toggle='popover' data-trigger='hover' title='' data-content='Wskazuje na procent całości jakie stanowią wykonane zadania.' data-html='true' data-original-title='% wykonanych zadań' data-placement='bottom'>0%</div>");
  838. picker = $("<input/>", {
  839. type: 'text',
  840. style: 'width:0px;height:0px;outline:none;overflow:0;border:0;margin:0px;padding:0px;',
  841. id: "date",
  842. }).datetimepicker({
  843. defaultDate: false,
  844. useCurrent: false,
  845. widgetPositioning: {
  846. horizontal: 'auto',
  847. vertical: 'bottom'
  848. }
  849. })
  850. $('.taskList').append(picker);
  851. $(".taskList").append('<div id="add" style="font-size:small;">' +
  852. '<span class="glyphicon glyphicon-plus addIco" style="padding-top:3px;margin-left:65px;"></span> ' +
  853. '<textarea class="eInput" style="font-size:small" data-toggle="popover" data-trigger="hover" title="" data-content="Wpisz treść i zatwierdź <b>ENTER</b>.<br> Użyj tagów:<br> @nazwauzytkownika -> wykonawca <br> @RRRR-MM-DD -> Termin wykonania <br> np. <br>`@janKowalski @2017-03-12 Nadać przesyłkę`" data-html="true" data-original-title="Dodaj zadanie" data-placement="top" id="datepicker" placeholder="Dodaj zadanie"></textarea>' +
  854. '<div class="clearfix"></div>' + '</div>');
  855. $(".taskList").append("<ul id='sortable'></ul>");
  856. // $("#sortable").append("<li><span class='glyphicon glyphicon-option-vertical ico'></span><span class=check data-step=0></span> <div class=editable contentEditable='true'>Zaprojektować podstawowy layout skryptu</div></li>");
  857. // $("#sortable").append("<li><span class='glyphicon glyphicon-option-vertical ico'></span><span class=check data-step=0></span> <div class=editable contentEditable='true'>Stworzyć tasklistę, dodać przesuwaunie i flagowanie</div></li>");
  858. // $("#sortable").append("<li><span class='glyphicon glyphicon-option-vertical ico'></span><span class=check data-step=0></span> <div class=editable contentEditable='true'>Dodać po lewej stronie formularz</div></li>");
  859. // $("#sortable").append("<li><span class='glyphicon glyphicon-option-vertical ico'></span><span class=check data-step=0></span> <div class=editable contentEditable='true'>Połączyć z API</div></li>");
  860. $(".taskList").append("<div id=showMore >Pokaż wykonane zadania <span class='glyphicon glyphicon-chevron-down'></span></div>");
  861. $(".taskList").append("<ul id='doneList'></ul>");
  862. var link;
  863. $("#doneList").hide();
  864. updateProgress();
  865. $(picker).on("dp.change", function(e) {
  866. var date = e.date;
  867. date = date.format('YYYY-MM-DD');
  868. var text = $(".eInput").val();
  869. var result = text.substring(0, position) + " @" + date + " " + text.substring(position + wordLen + 2);
  870. $(".eInput").val(result);
  871. $(picker).data("DateTimePicker").hide();
  872. });
  873. $(function() {
  874. $("#sortable").sortable({
  875. stop: function(event, ui) {
  876. setSort();
  877. },
  878. handle: ".ico"
  879. });
  880. autoCom();
  881. $('.eInput').autosize();
  882. });
  883. render();
  884. }