calendar.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // @require DOMParser - browser
  2. // @require jQuery, moment, p5UI__notifyAjaxCallback
  3. if ('undefined' === typeof BASE_URL) throw "Missing BASE_URL"
  4. if ('undefined' === typeof USER) throw "Missing USER"
  5. if ('undefined' === typeof CALENDAR_NODE_ID) throw "Missing CALENDAR_NODE_ID"
  6. jQuery(document).ready(function() {
  7. var cached = {};
  8. jQuery('#' + CALENDAR_NODE_ID).fullCalendar({
  9. header: {
  10. left: 'prev,next today',
  11. center: 'title',
  12. right: ''
  13. },
  14. editable: false,
  15. lang: "pl",
  16. titleFormat: "MMMM YYYY [("+USER+")]",
  17. editable: false,
  18. viewRender: function (view, element) {
  19. getWorkingHours(moment(view.intervalStart).format("YYYY-MM"));
  20. },
  21. eventLimit: true, // allow "more" link when too many events
  22. /*events: [
  23. {
  24. title: '10:00 - 16:00',
  25. start: '2016-08-01',
  26. className: 'workingHours'
  27. }
  28. ],*/
  29. });
  30. function parseWfsFeatureMember(featureMember) { // HTMLCollection.children @returns event { id, start_work_hour, end_work_hour, date }
  31. // gml:featureMember / p5_default_db:GRAFIK_PRACY / p5_default_db:ID
  32. // gml:featureMember / p5_default_db:GRAFIK_PRACY / p5_default_db:START_WORK_HOUR
  33. // gml:featureMember / p5_default_db:GRAFIK_PRACY / p5_default_db:END_WORK_HOUR
  34. // gml:featureMember / p5_default_db:GRAFIK_PRACY / p5_default_db:DATE
  35. if (!featureMember) return null
  36. if (!featureMember.children.length) return null
  37. var grafik = featureMember.children[0]
  38. if (!grafik) return null
  39. if (!grafik.children.length) return null
  40. var calendarItem = {
  41. id: null,
  42. start_work_hour: null,
  43. end_work_hour: null,
  44. date: null,
  45. }
  46. var i = 0
  47. for (i = 0; i < grafik.children.length; i++) {
  48. var field = grafik.children[i]
  49. switch (field.localName) {
  50. case 'ID': calendarItem.id = field.textContent; break;
  51. case 'START_WORK_HOUR': calendarItem.start_work_hour = field.textContent; break;
  52. case 'END_WORK_HOUR': calendarItem.end_work_hour = field.textContent; break;
  53. case 'DATE': calendarItem.date = field.textContent; break;
  54. }
  55. }
  56. if (!calendarItem.id) return null
  57. if (!calendarItem.start_work_hour) return null
  58. if (!calendarItem.end_work_hour) return null
  59. if (!calendarItem.date) return null
  60. return calendarItem
  61. }
  62. function getWorkingHours(date) {
  63. if (cached[date] != true) {
  64. cached[date] = true;
  65. var link = BASE_URL + 'wfs-data.php/default_db/?SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=p5_default_db:GRAFIK_PRACY&SRSNAME=EPSG:3003&Filter=<ogc:Filter><ogc:And><ogc:PropertyIsLike wildCard="*" singleChar="^" escapeChar="!"><ogc:PropertyName>DATE</ogc:PropertyName><ogc:Literal>'+date+'-*</ogc:Literal></ogc:PropertyIsLike><ogc:PropertyIsEqualTo><ogc:PropertyName>L_APPOITMENT_USER</ogc:PropertyName><ogc:Literal>' + USER + '</ogc:Literal></ogc:PropertyIsEqualTo></ogc:And></ogc:Filter>';
  66. //console.log(link);
  67. if (DBG) console.log('DBG API fetch', link);
  68. window.fetch(link, {
  69. method: 'GET',
  70. credentials: 'same-origin',
  71. }).then(function (response) {
  72. return response.text()
  73. }).then(function (txtResponse) {
  74. // return jQuery.parseXML(txtResponse)
  75. var xmlParser = new DOMParser();
  76. return xmlParser.parseFromString(txtResponse, "text/xml");
  77. }).then(function (xmlResponse) {
  78. if (!xmlResponse.children.length) throw "Missing response xml root element"
  79. return xmlResponse.children[0]
  80. }).then(function (wfsFeatureCollection) {
  81. if ('wfs:FeatureCollection' !== wfsFeatureCollection.tagName) throw "Missing wfs:FeatureCollection element"
  82. var events = []
  83. for (var i = 0; i < wfsFeatureCollection.children.length; i++) {
  84. events.push(parseWfsFeatureMember(wfsFeatureCollection.children[i]))
  85. }
  86. return events.filter(function (item) { return !!item; })
  87. }).then(function __eventsRender(events) {
  88. if (DBG) console.table(events);
  89. var calJqNode = jQuery('#' + CALENDAR_NODE_ID)
  90. events.forEach(function(item) {
  91. var source = {};
  92. if (moment(item.start_work_hour, "HH:mm:ss").format("HH:mm") != "00:00") {
  93. source["title"] = moment(item.start_work_hour, "HH:mm:ss").format("HH:mm")+" - "+moment(item.end_work_hour, "HH:mm:ss").format("HH:mm");
  94. source["className"] = 'workingHours';
  95. } else {
  96. source["title"] = "Uzupełnij";
  97. source["className"] = 'empty';
  98. }
  99. source["start"] = item.date;
  100. source["url"] = BASE_URL + 'index.php?_route=ViewTableAjax&namespace=default_db/GRAFIK_PRACY#EDIT/'+item.id;
  101. calJqNode.fullCalendar('renderEvent', source, true);
  102. })
  103. }).catch(function (e) {
  104. p5UI__notifyAjaxCallback({ type: 'error', msg: e })
  105. console.warn(e)
  106. })
  107. }
  108. }
  109. });