TaskManager.php.task.js 39 KB

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