APIs

Show:
  1. /**
  2. * @namespace flexygo.ui.wc
  3. */
  4. var flexygo;
  5. (function (flexygo) {
  6. var ui;
  7. (function (ui) {
  8. var wc;
  9. (function (wc) {
  10. /**
  11. * Library for the FlxScheduler web component.
  12. *
  13. * @class FlxScheduler
  14. * @constructor
  15. * @return {FlxScheduler}
  16. */
  17. class FlxScheduler extends HTMLElement {
  18. constructor() {
  19. //If a constructor is defined, is REQUIRED call the super constructor
  20. super();
  21. this.objects = new Array();
  22. this.checkObjects = new Array();
  23. /**
  24. * Set when component is attached to DOM
  25. * @property connected {boolean}
  26. */
  27. this.connected = false;
  28. this.moduleName = null;
  29. this.n = 0;
  30. this.additionalWhere = null;
  31. this.dayClick = false;
  32. this.events = new Array();
  33. this.allDay = false;
  34. this.eventsRefresh = true;
  35. this.hasPendingRefresh = false;
  36. }
  37. /**
  38. * Array of observed attributes.
  39. * @property observedAttributes {Array}
  40. */
  41. static get observedAttributes() {
  42. return ['ObjectName', 'ObjectWhere', 'ModuleName'];
  43. }
  44. /**
  45. * Refresh de webcomponent.
  46. * @method refresh
  47. */
  48. connectedCallback() {
  49. let element = $(this);
  50. this.connected = true;
  51. this.objectName = element.attr("ObjectName");
  52. this.objectWhere = element.attr("ObjectWhere");
  53. this.moduleName = element.attr("ModuleName");
  54. if (element.attr('manualInit') != 'true') {
  55. this.init();
  56. }
  57. }
  58. /**
  59. * Init the webcomponent.
  60. * @method init
  61. */
  62. init() {
  63. let ctx = this;
  64. let me = $(this);
  65. let activeMode;
  66. let SQLValueField;
  67. let SQLDisplayField;
  68. let SQLFilterField;
  69. let directTemplate;
  70. let objectName;
  71. let viewName;
  72. let maxTime;
  73. let minTime;
  74. let onClickEvent;
  75. let tokenDefault;
  76. let allDaySlot;
  77. let slotDuration;
  78. let pageType;
  79. let target;
  80. let eventLimit;
  81. me.removeAttr('manualInit');
  82. let parentModule = me.closest('flx-module');
  83. let wcModule = parentModule[0];
  84. if (parentModule && wcModule) {
  85. wcModule.moduleLoaded(this);
  86. }
  87. let options = new Array();
  88. let schedulerParams = {
  89. ModuleName: ctx.moduleName
  90. };
  91. flexygo.ajax.post('~/api/Scheduler', 'GetSchedulerTemplate', schedulerParams, (response) => {
  92. if (response) {
  93. activeMode = response.ActiveMode;
  94. SQLValueField = response.SQLValueField;
  95. SQLDisplayField = response.SQLDisplayField;
  96. SQLFilterField = response.SQLFilterField;
  97. directTemplate = response.DirectTemplate;
  98. objectName = response.ObjectName;
  99. viewName = response.ViewName;
  100. maxTime = response.MaxTime;
  101. minTime = response.MinTime;
  102. onClickEvent = response.OnClickEvent;
  103. tokenDefault = response.TokenDefault;
  104. allDaySlot = response.AllDaySlot;
  105. slotDuration = response.SlotDuration;
  106. pageType = response.PageType;
  107. target = response.Target;
  108. eventLimit = response.EventLimit;
  109. if (response.MonthView == "True") {
  110. options.push("month");
  111. }
  112. if (response.AgendaWeekView == "True") {
  113. options.push("agendaWeek");
  114. }
  115. if (response.AgendaDayView == "True") {
  116. options.push("agendaDay");
  117. }
  118. if (response.ListWeekView == "True") {
  119. options.push("listWeek");
  120. }
  121. var objectParams = {
  122. Scheduler: response.SchedulerName
  123. };
  124. //Distintos objetos
  125. flexygo.ajax.post('~/api/Scheduler', 'GetSchedulerConfig', objectParams, (response) => {
  126. if (response) {
  127. me.append('<div id="loading"></div><div id="calendar" style="margin:1%;"></div>');
  128. for (var i in response) {
  129. ctx.objects.push({
  130. SchedulerName: response[i].SchedulerName,
  131. ObjectName: response[i].ObjectName,
  132. StartDateField: response[i].StartDateField,
  133. EndDateField: response[i].EndDateField,
  134. EndTimeField: response[i].EndTimeField,
  135. StartTimeField: response[i].StartTimeField,
  136. DurationField: response[i].DurationField,
  137. ViewName: response[i].ViewName,
  138. ColorField: response[i].ColorField,
  139. DescripTemplate: response[i].DescripTemplate,
  140. key: response[i].key,
  141. table: response[i].table,
  142. Icon: response[i].Icon,
  143. UserIdField: response[i].UserIdField,
  144. Filter: "",
  145. TextColorField: response[i].TextColorField,
  146. TokenDefault: tokenDefault,
  147. CanInsert: response[i].CanInsert,
  148. CanView: response[i].CanView,
  149. CanEdit: response[i].CanEdit,
  150. AllDayField: response[i].AllDayField
  151. });
  152. ctx.checkObjects.push(response[i].ObjectName);
  153. }
  154. if (ctx.objects.length > 0) {
  155. ctx.render(options, activeMode, maxTime, minTime, onClickEvent, allDaySlot, slotDuration, pageType, target, eventLimit);
  156. //$('.fc-left').addClass('col-lg-5');
  157. //$('.fc-left').addClass('col-md-6');
  158. if (objectName != '') {
  159. $('#calendar').prepend('<div class="fc-toolbar fc-header-toolbar filter"><div class="a" style="text-align:left;" id="filters"><flx-multicombo class="combo" ObjectName="' + objectName + '" ViewName="' + viewName + '" IconClass="flx-icon icon-role" SQLValueField="' + SQLValueField + '" SQLDisplayField="' + SQLDisplayField + '" SQLFilter="' + SQLFilterField + '" filtertype="dbcombo"><template>' + directTemplate + '</template></flx-multicombo></div></div>');
  160. //$('.fc-left').append('<div id="filters"><flx-multicombo style="width:250px" ObjectName="' + objectName + '" ViewName="' + viewName + '" IconClass="flx-icon icon-role" SQLValueField="' + SQLValueField + '" SQLDisplayField="' + SQLDisplayField + '" filtertype="dbcombo"><template>' + directTemplate + '</template></flx-multicombo></div>');
  161. $('.fc-left').css("margin-left", "10px");
  162. }
  163. if (ctx.objects.length > 1) {
  164. $('.fc-left').append("<div style='margin-right: .75em;' class='fc-button'><div style='width: 140px;'><div class='panel panel-default objects' style='margin-bottom: 0px;background-color: #f5f5f5;'><div style='padding: 3.5px 10px;'><div><div class='fa fa-filter'></div><a data-toggle='collapse' href='#collapse1' style='color: #777;'> " + flexygo.localization.translate('flxscheduler.objects') + "</a></div></div><div id='collapse1' class='panel-collapse collapse'></div></div></div></div>");
  165. for (var x = 0; x < ctx.objects.length; x++) {
  166. $('#collapse1').append("<div class='panel-footer'><i style='float:left;margin-top: 2px;margin-right: 5px;' class='" + ctx.objects[x].Icon + "'></i>" + ctx.objects[x].ObjectName + "<flx-check style='float:right;' id='" + ctx.objects[x].ObjectName + "' property='" + ctx.objects[x].ObjectName + "' checked></flx-check>");
  167. }
  168. $('#collapse1').on('show.bs.collapse', function () {
  169. $(".objects").css("position", "absolute");
  170. //$(".fc-left").addClass("margin-filter");
  171. });
  172. $('#collapse1').on('hide.bs.collapse', function () {
  173. $(".objects").css("position", "static");
  174. //$(".fc-left").removeClass("margin-filter");
  175. });
  176. $('#mainContent').on('scroll', function () {
  177. $("#collapse1").removeClass("in");
  178. $(".objects").css("position", "static");
  179. });
  180. //Cambiar por me.find
  181. $("flx-check input[type=checkbox]").click(function () {
  182. if (this.checked) {
  183. ctx.checkObjects.push(this.parentElement.parentElement.id);
  184. }
  185. else {
  186. for (var i in ctx.checkObjects) {
  187. if (ctx.checkObjects[i] == this.parentElement.parentElement.id) {
  188. ctx.checkObjects.splice(ctx.checkObjects.indexOf(ctx.checkObjects[i]), 1);
  189. }
  190. }
  191. }
  192. if (ctx.checkObjects.length != 0) {
  193. ctx.checkPanelObjects(ctx.additionalWhere);
  194. }
  195. else {
  196. var myCalendar = me.find('#calendar');
  197. myCalendar.fullCalendar('removeEvents');
  198. }
  199. });
  200. }
  201. }
  202. else {
  203. me.append('<div class="box-danger"><i class="flx-icon icon-close icon-lg icon-margin-right"></i><span><strong>Error</strong> No scheduler objects configurations are found</span></div>');
  204. }
  205. $('flx-multicombo[viewname="' + viewName + '"]').find('div').on('change', function () {
  206. let filtros = this.closest('flx-multicombo').getValue();
  207. let where = '';
  208. for (var i in ctx.checkObjects) {
  209. ctx.objects[i].Filter = filtros.split('|').join('\',\'');
  210. }
  211. ctx.checkPanelObjects(ctx.additionalWhere);
  212. });
  213. }
  214. });
  215. }
  216. });
  217. }
  218. /**
  219. * Refresh de webcomponent.
  220. * @method refresh
  221. */
  222. refresh() {
  223. if ($(this).attr('manualInit') != 'true') {
  224. let ctx = this;
  225. if (ctx.eventsRefresh) {
  226. let me = $(this);
  227. var myCalendar = me.find('#calendar');
  228. myCalendar.fullCalendar('removeEvents');
  229. ctx.checkPanelObjects(this.additionalWhere);
  230. }
  231. else {
  232. ctx.hasPendingRefresh = true;
  233. }
  234. }
  235. }
  236. /**
  237. * Initialize Scheduler.
  238. * @method render
  239. */
  240. render(options, activeMode, maxTime, minTime, onClickEvent, allDaySlot, slotDuration, pageType, target, eventLimit) {
  241. let ctx = this;
  242. let me = $(this);
  243. let right = '';
  244. let navLinks = false;
  245. let defaultDate;
  246. flexygo.events.on(this, "dialog", "closed", (e) => {
  247. for (var i = 0; i < ctx.objects.length; i++) {
  248. if (e.sender.objectname && e.sender.objectname.toLowerCase() === ctx.objects[i].ObjectName.toLowerCase()) {
  249. ctx.checkPanelObjects(ctx.additionalWhere);
  250. }
  251. }
  252. });
  253. if (options.indexOf("agendaDay") > -1) {
  254. navLinks = true;
  255. }
  256. for (var i in options) {
  257. right += options[i] + ',';
  258. }
  259. right = right.substring(0, right.length - 1);
  260. let myCalendar = me.find('#calendar');
  261. if (minTime == '') {
  262. minTime = '00:00:00';
  263. }
  264. else {
  265. minTime += ':00';
  266. }
  267. if (maxTime == '') {
  268. maxTime = '24:00:00';
  269. }
  270. else {
  271. maxTime += ':00';
  272. }
  273. if (slotDuration == '') {
  274. slotDuration = '00:30:00';
  275. }
  276. else {
  277. slotDuration += ':00';
  278. }
  279. if (allDaySlot == "True") {
  280. ctx.allDay = true;
  281. }
  282. if (me.attr('dateInit')) {
  283. defaultDate = new Date($(this).attr('dateInit'));
  284. }
  285. else {
  286. defaultDate = Date.now();
  287. }
  288. //Calendario//
  289. myCalendar.fullCalendar({
  290. header: {
  291. left: 'prev,next today',
  292. center: 'title',
  293. right: right
  294. },
  295. firstDay: 1,
  296. locale: flexygo.profiles.langKey.toLowerCase().slice(0, 2),
  297. allDaySlot: ctx.allDay,
  298. defaultDate: defaultDate,
  299. defaultView: activeMode,
  300. timeFormat: 'HH:mm',
  301. nextDayThreshold: '00:00:00',
  302. minTime: minTime,
  303. maxTime: maxTime,
  304. navLinks: navLinks,
  305. height: 'auto',
  306. slotEventOverlap: false,
  307. editable: true,
  308. eventLimit: eventLimit,
  309. slotDuration: slotDuration,
  310. eventDrop: function (event, delta, revertFunc) {
  311. let obj = new flexygo.obj.Entity(event.objectName, ctx.getObjectWhere(event.table, event.key, event.id));
  312. obj.read();
  313. if (event.startDate != '' && event.start != null) {
  314. obj.data[event.startDate].Value = event.start.format();
  315. }
  316. if (event.endDate != '' && event.end != null) {
  317. if (event.allDay && ctx.allDay) {
  318. var date = moment(event.end.format()).add('days', -1).format("YYYY-MM-DD");
  319. obj.data[event.endDate].Value = date + " 23:59:00";
  320. }
  321. else {
  322. obj.data[event.endDate].Value = event.end.format();
  323. }
  324. }
  325. if (event.startTime != '' && event.start != null) {
  326. if (event.allDay && ctx.allDay) {
  327. obj.data[event.startTime].Value = "00:00";
  328. }
  329. else {
  330. obj.data[event.startTime].Value = event.start.format().slice(11, 16);
  331. }
  332. }
  333. if (event.endTime != '' && event.end != null) {
  334. if (event.allDay && ctx.allDay) {
  335. obj.data[event.endTime].Value = "23:59";
  336. }
  337. else {
  338. obj.data[event.endTime].Value = event.end.format().slice(11, 16);
  339. }
  340. }
  341. if (obj.update()) {
  342. flexygo.msg.success('Saved');
  343. }
  344. },
  345. eventResize: function (event, delta, revertFunc) {
  346. let obj = new flexygo.obj.Entity(event.objectName, ctx.getObjectWhere(event.table, event.key, event.id));
  347. obj.read();
  348. if (event.endDate != '' && event.end != null) {
  349. if (event.allDay && ctx.allDay) {
  350. var date = moment(event.end.format()).add('days', -1).format("YYYY-MM-DD");
  351. obj.data[event.endDate].Value = date + " 23:59:00";
  352. }
  353. else {
  354. obj.data[event.endDate].Value = event.end.format();
  355. }
  356. }
  357. if (event.endTime != '' && event.end != null) {
  358. if (event.allDay && ctx.allDay) {
  359. obj.data[event.endTime].Value = "23:59";
  360. }
  361. else {
  362. obj.data[event.endTime].Value = event.end.format().slice(11, 16);
  363. }
  364. }
  365. if (event.duration != '') {
  366. let start = new Date(event.start.format()).getTime();
  367. let end = new Date(event.end.format()).getTime();
  368. let diffMs = (end - start);
  369. let diffMins = Math.round(diffMs / 60000);
  370. obj.data[event.duration].Value = diffMins;
  371. }
  372. if (obj.update()) {
  373. flexygo.msg.success('Saved');
  374. }
  375. },
  376. eventClick: function (calEvent, jsEvent, view) {
  377. if (onClickEvent == "True") {
  378. if (pageType == "view" && calEvent.canView) {
  379. flexygo.nav.openPage(pageType, calEvent.objectName, ctx.getObjectWhere(calEvent.table, calEvent.key, calEvent.id), null, target, false, $(this));
  380. }
  381. if (pageType == "edit" && calEvent.canEdit) {
  382. flexygo.nav.openPage(pageType, calEvent.objectName, ctx.getObjectWhere(calEvent.table, calEvent.key, calEvent.id), null, target, false, $(this));
  383. }
  384. }
  385. },
  386. eventRender: function (event, element, view) {
  387. let el = $(element);
  388. switch (view.name) {
  389. case 'month':
  390. element.find('span.fc-title').html(element.find('span.fc-title').text());
  391. el.addClass("test");
  392. if (el.find('flx-tooltip').length === 0) {
  393. var text = element.find('span.fc-title').clone();
  394. text.find('.hidden').remove();
  395. el.tooltip({
  396. title: text.text(),
  397. delay: { show: 1000 },
  398. placement: "top",
  399. trigger: 'hover'
  400. });
  401. }
  402. break;
  403. case 'agendaWeek':
  404. element.find('div.fc-content').find('.fc-title').html(element.find('div.fc-content').find('.fc-title').text());
  405. el.addClass("test");
  406. if (el.find('flx-tooltip').length === 0) {
  407. var text = element.find('div.fc-title').clone();
  408. text.find('.hidden').remove();
  409. el.tooltip({
  410. title: text.text(),
  411. delay: { show: 1000 },
  412. placement: "top",
  413. trigger: 'hover'
  414. });
  415. }
  416. break;
  417. case 'agendaDay':
  418. element.find('div.fc-content').find('.fc-title').html(element.find('div.fc-content').find('.fc-title').text());
  419. el.addClass("test");
  420. el.addClass("fc-day-size");
  421. if (el.find('flx-tooltip').length === 0) {
  422. var text = element.find('div.fc-title').clone();
  423. text.find('.hidden').remove();
  424. el.tooltip({
  425. title: text.text(),
  426. delay: { show: 1000 },
  427. placement: "top",
  428. trigger: 'hover'
  429. });
  430. }
  431. break;
  432. case 'listWeek':
  433. element.find('td.fc-list-item-title').html(element.find('td.fc-list-item-title').text());
  434. el.addClass("test");
  435. if (el.find('flx-tooltip').length === 0) {
  436. var text = element.find('td.fc-list-item-title').clone();
  437. text.find('.hidden').remove();
  438. el.tooltip({
  439. title: text.text(),
  440. delay: { show: 1000 },
  441. placement: "top",
  442. trigger: 'hover'
  443. });
  444. }
  445. break;
  446. }
  447. },
  448. dayClick: function (date, jsEvent, view) {
  449. if (!ctx.dayClick) {
  450. ctx.dayClick = true;
  451. let hasTime = date.hasTime();
  452. if (ctx.objects.length > 1) {
  453. let myButtons = new Object();
  454. let buttons = '';
  455. for (var i = 0; i < ctx.objects.length; i++) {
  456. myButtons[ctx.objects[i].ObjectName] = {
  457. 'class': 'btn btn-default',
  458. text: ctx.objects[i].ObjectName,
  459. SchedulerName: ctx.objects[i].SchedulerName,
  460. ObjectName: ctx.objects[i].ObjectName,
  461. StartDateField: ctx.objects[i].StartDateField,
  462. EndDateField: ctx.objects[i].EndDateField,
  463. StartTimeField: ctx.objects[i].StartTimeField,
  464. EndTimeField: ctx.objects[i].EndTimeField,
  465. DurationField: ctx.objects[i].DurationField,
  466. closeOnClick: true,
  467. Icon: ctx.objects[i].Icon
  468. };
  469. if (ctx.objects[i].CanInsert) {
  470. buttons += '<a style="padding: 0.7em;margin-right: 3%;margin-bottom: 3%;" class="btn btn-default bg-outstanding modalButton"><i style="margin-right:4px;" class="' + ctx.objects[i].Icon + '"></i>' + ctx.objects[i].ObjectName + '</a>';
  471. }
  472. }
  473. if (buttons != '') {
  474. $.sweetModal({
  475. title: flexygo.localization.translate('flxscheduler.chooseobjects'),
  476. content: '<div>' + buttons + '</div>',
  477. theme: $.sweetModal.THEME_MIXED,
  478. width: '31%'
  479. });
  480. $(".modalButton").click(function () {
  481. let object = myButtons[this.text];
  482. ctx.openEvent(object.ObjectName, object.StartDateField, object.EndDateField, object.StartTimeField, object.EndTimeField, object.DurationField, date.format("YYYY-MM-DD"), date.format("HH:mm"), object.AllDayField, hasTime);
  483. $('.sweet-modal-overlay').remove();
  484. });
  485. }
  486. }
  487. else {
  488. if (ctx.objects[0].CanInsert) {
  489. ctx.openEvent(ctx.objects[0].ObjectName, ctx.objects[0].StartDateField, ctx.objects[0].EndDateField, ctx.objects[0].StartTimeField, ctx.objects[0].EndTimeField, ctx.objects[0].DurationField, date.format("YYYY-MM-DD"), date.format("HH:mm"), ctx.objects[0].AllDayField, hasTime);
  490. }
  491. }
  492. }
  493. }
  494. });
  495. ctx.checkPanelObjects(ctx.additionalWhere);
  496. //Datepicker
  497. $('.fc-center').append('<div class="col-6 col-m-12"><div id="datepicker" style="display:none;position:absolute;z-index: 4;" class="cute-calendar"></div></div>');
  498. let dp1 = $('#datepicker');
  499. $('.fc-center').click(function () {
  500. dp1.show();
  501. });
  502. dp1.datepicker({
  503. onSelect: function (dateText, inst) {
  504. dp1.hide();
  505. myCalendar.fullCalendar('gotoDate', dateText);
  506. ctx.checkPanelObjects(ctx.additionalWhere);
  507. }, firstDay: 1
  508. });
  509. //Events
  510. $('.fc-prev-button').click(function () {
  511. ctx.checkPanelObjects(ctx.additionalWhere);
  512. });
  513. $('.fc-next-button').click(function () {
  514. ctx.checkPanelObjects(ctx.additionalWhere);
  515. });
  516. $('.fc-agendaWeek-button').click(function () {
  517. ctx.checkPanelObjects(ctx.additionalWhere);
  518. });
  519. $('.fc-month-button').click(function () {
  520. ctx.checkPanelObjects(ctx.additionalWhere);
  521. });
  522. $('.fc-listWeek-button').click(function () {
  523. ctx.checkPanelObjects(ctx.additionalWhere);
  524. });
  525. $('.fc-agendaDay-button').click(function () {
  526. ctx.checkPanelObjects(ctx.additionalWhere);
  527. });
  528. $('.fc-today-button').click(function () {
  529. ctx.checkPanelObjects(ctx.additionalWhere);
  530. });
  531. $('#mainContent').on('scroll', function () {
  532. dp1.hide();
  533. });
  534. $(document).mouseup(function (e) {
  535. if (!dp1.is(e.target) && dp1.has(e.target).length === 0) {
  536. dp1.hide();
  537. }
  538. });
  539. }
  540. /**
  541. * Check Objects.
  542. * @method checkPanelObjects
  543. */
  544. checkPanelObjects(additionalWhere) {
  545. let ctx = this;
  546. let me = $(this);
  547. //Panel de objetos
  548. /*Empieza a cargar*/
  549. me.find('#loading').html(flexygo.utils.loadingMsg());
  550. ctx.eventsRefresh = false;
  551. //me.find('.fc-view-container').css('display','none');
  552. for (var x in ctx.checkObjects) {
  553. for (var i = 0; i < ctx.objects.length; i++) {
  554. if (ctx.checkObjects[x] == ctx.objects[i].ObjectName) {
  555. ctx.changeEvents(ctx.objects[i].ObjectName, ctx.objects[i].ViewName, ctx.objects[i].ColorField, ctx.objects[i].StartDateField, ctx.objects[i].EndDateField, ctx.objects[i].StartTimeField, ctx.objects[i].EndTimeField, ctx.objects[i].DurationField, ctx.objects[i].DescripTemplate, ctx.objects[i].key, ctx.objects[i].table, ctx.objects[i].UserIdField, ctx.objects[i].Filter, ctx.objects[i].TextColorField, additionalWhere, ctx.objects[i].TokenDefault, ctx.objects[i].CanEdit, ctx.objects[i].CanView, ctx.objects[i].AllDayField);
  556. }
  557. }
  558. }
  559. }
  560. /**
  561. * Open Event.
  562. * @method openEvent
  563. */
  564. openEvent(objectName, startDate, endDate, startTime, endTime, duration, date, time, allday, hasTime) {
  565. let ctx = this;
  566. let displayTimeEnd = new Date();
  567. let hour = time.slice(0, 2);
  568. let minutes = time.slice(3, 5);
  569. let localDate = date + " " + time;
  570. displayTimeEnd.setHours(parseInt(hour));
  571. displayTimeEnd.setMinutes(parseInt(minutes));
  572. displayTimeEnd.setMinutes(displayTimeEnd.getMinutes() + 15);
  573. let timeEnd = displayTimeEnd.toTimeString();
  574. let defaults = {};
  575. defaults[startDate] = localDate;
  576. if (startTime) {
  577. defaults[startTime] = time;
  578. }
  579. if (endDate) {
  580. defaults[endDate] = localDate;
  581. }
  582. if (endTime) {
  583. defaults[endTime] = timeEnd.slice(0, 5);
  584. }
  585. if (duration) {
  586. defaults[duration] = '15';
  587. }
  588. if (allday) {
  589. if (hasTime) {
  590. defaults[allday] = false;
  591. }
  592. else {
  593. defaults[allday] = true;
  594. }
  595. }
  596. flexygo.nav.openPage('edit', objectName, null, JSON.stringify(defaults), 'modal1024x768', false, $(this));
  597. ctx.dayClick = false;
  598. }
  599. /**
  600. * Change Events.
  601. * @method changeEvents
  602. */
  603. changeEvents(objectName, viewName, color, startDate, endDate, startTime, endTime, duration, descripTemplate, key, table, userIdField, filter, textColor, additionalWhere, tokenDefault, canEdit, canView, allDayField) {
  604. let ctx = this;
  605. let me = $(this);
  606. let myCalendar = me.find('#calendar');
  607. myCalendar.fullCalendar('removeEvents');
  608. let moment = myCalendar.fullCalendar('getDate');
  609. let date = new Date(moment);
  610. let dateStartWeek = ctx.getStartWeek(new Date(moment));
  611. let dateWeek = new Date(dateStartWeek.getTime() + (7 * 24 * 60 * 60 * 1000));
  612. let dateDay = new Date(date.getTime() + (1 * 24 * 60 * 60 * 1000));
  613. let view = myCalendar.fullCalendar('getView');
  614. let start = '';
  615. let end = '';
  616. let dp1 = $('#datepicker');
  617. dp1.datepicker("setDate", (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear());
  618. switch (view.name) {
  619. case 'month':
  620. start = ctx.formatDate(date, '' + (date.getMonth() + 1), '01', date.getFullYear());
  621. if (date.getMonth() + 1 == 12) {
  622. end = ctx.formatDate(date, '01', '01', date.getFullYear() + 1);
  623. }
  624. else {
  625. end = ctx.formatDate(date, '' + (date.getMonth() + 2), '01', date.getFullYear());
  626. }
  627. break;
  628. case 'agendaWeek':
  629. case 'listWeek':
  630. start = ctx.formatDate(dateStartWeek, '' + (dateStartWeek.getMonth() + 1), '' + (dateStartWeek.getDate()), dateStartWeek.getFullYear());
  631. end = ctx.formatDate(dateWeek, '' + (dateWeek.getMonth() + 1), '' + (dateWeek.getDate()), dateWeek.getFullYear());
  632. break;
  633. case 'agendaDay':
  634. start = ctx.formatDate(date, '' + (date.getMonth() + 1), '' + (date.getDate()), date.getFullYear());
  635. end = ctx.formatDate(dateDay, '' + (dateDay.getMonth() + 1), '' + (dateDay.getDate()), dateDay.getFullYear());
  636. break;
  637. }
  638. ctx.schedulerResult(objectName, viewName, start, end, color, startDate, endDate, startTime, endTime, duration, descripTemplate, key, table, userIdField, filter, textColor, additionalWhere, tokenDefault, canEdit, canView, allDayField);
  639. }
  640. /**
  641. * Results.
  642. * @method schedulerResult
  643. */
  644. schedulerResult(objectName, viewName, start, end, color, startDate, endDate, startTime, endTime, duration, descripTemplate, key, table, userIdField, filter, textColor, additionalWhere, tokenDefault, canEdit, canView, allDayField) {
  645. let ctx = this;
  646. let me = $(this);
  647. let myCalendar = me.find('#calendar');
  648. me.find('#loading').css('display', '');
  649. let params = {
  650. "ObjectName": objectName,
  651. "ViewName": viewName,
  652. "Start": start,
  653. "End": end,
  654. "StartDate": startDate,
  655. "EndDate": endDate,
  656. "StartTime": startTime,
  657. "EndTime": endTime,
  658. "Duration": duration,
  659. "DescripTemplate": descripTemplate,
  660. "Keys": key,
  661. "Color": color,
  662. "UserIdField": userIdField,
  663. "Filter": filter,
  664. "TextColor": textColor,
  665. "AdditionalWhere": additionalWhere,
  666. "TokenDefault": tokenDefault,
  667. "AllDayField": allDayField
  668. };
  669. flexygo.ajax.post('~/api/Scheduler', 'GetSchedulerResult', params, (response) => {
  670. ctx.n = ctx.n + 1;
  671. if (response) {
  672. for (var i in response) {
  673. let st = response[i].StartTime;
  674. let et = response[i].EndTime;
  675. if (st.length == 5) {
  676. st = st + ':00';
  677. }
  678. if (et.length == 5) {
  679. et = et + ':00';
  680. }
  681. let descrip = flexygo.utils.parser.recursiveCompile(response[i].Row, response[i].Descrip);
  682. let newEvent = {
  683. id: response[i].Id,
  684. color: response[i].Color,
  685. textColor: response[i].TextColor,
  686. title: descrip,
  687. start: response[i].StartDate.slice(0, 10) + ' ' + st,
  688. end: response[i].EndDate.slice(0, 10) + ' ' + et,
  689. objectName: objectName,
  690. startDate: startDate,
  691. endDate: endDate,
  692. startTime: startTime,
  693. endTime: endTime,
  694. duration: duration,
  695. key: key,
  696. table: table,
  697. canEdit: canEdit,
  698. canView: canView,
  699. allDay: false
  700. };
  701. if (response[i].AllDayField && ctx.allDay) {
  702. newEvent.allDay = response[i].AllDayField;
  703. var date = moment(response[i].EndDate.slice(0, 10) + ' ' + et).add('days', 1).format("YYYY-MM-DD HH:MM:SS");
  704. newEvent.end = date;
  705. }
  706. ctx.events.push(newEvent);
  707. }
  708. }
  709. if (ctx.n == ctx.checkObjects.length) {
  710. myCalendar.fullCalendar('addEventSource', ctx.events);
  711. me.find('.fc-view-container').css('display', '');
  712. me.find('#loading').css('display', 'none');
  713. ctx.n = 0;
  714. ctx.events = [];
  715. }
  716. ctx.eventsRefresh = true;
  717. if (ctx.hasPendingRefresh) {
  718. ctx.hasPendingRefresh = false;
  719. ctx.refresh();
  720. }
  721. });
  722. }
  723. formatDate(date, month, day, year) {
  724. if (month.length < 2)
  725. month = '0' + month;
  726. if (day.length < 2)
  727. day = '0' + day;
  728. return [year, month, day].join('');
  729. }
  730. getStartWeek(d) {
  731. let day = d.getDay(), diff = d.getDate() - day + (day == 0 ? -6 : 1); // adjust when day is sunday
  732. return new Date(d.setDate(diff));
  733. }
  734. getObjectWhere(table, key, id) {
  735. let where = "";
  736. let last = 0;
  737. for (var i = 0; i < key.length; i++) {
  738. where += table + "." + key[i] + " = \'" + id[i] + "\'";
  739. if (++last < key.length) {
  740. where += " and ";
  741. }
  742. }
  743. return where;
  744. }
  745. /**
  746. * Fires when element is detached to DOM
  747. * @method disconnectedCallback
  748. */
  749. disconnectedCallback() {
  750. //Remove event handler
  751. flexygo.events.off(this, "dialog", "closed");
  752. }
  753. }
  754. wc.FlxScheduler = FlxScheduler;
  755. class FlxSchedulerElement extends HTMLElement {
  756. /**
  757. * Fires when element is attached to DOM
  758. * @method attachedCallback
  759. */
  760. attachedCallback() {
  761. let element = $(this);
  762. let ctl = new FlxScheduler();
  763. ctl.webControl = element;
  764. ctl.objectName = element.attr("ObjectName");
  765. ctl.objectWhere = element.attr("ObjectWhere");
  766. ctl.moduleName = element.attr("ModuleName");
  767. ctl.pageName = element.attr("PageName");
  768. element.data("controller", ctl);
  769. ctl.init();
  770. }
  771. /**
  772. * Fires when the attribute value of the element is changed.
  773. * @method attributeChangedCallback
  774. */
  775. attributeChangedCallback(attrName, oldVal, newVal) {
  776. let element = $(this);
  777. let ctl = element.data('controller');
  778. let needInit = false;
  779. if (ctl && attrName.toLowerCase() == 'modulename' && newVal && newVal != '') {
  780. ctl.moduleName = newVal;
  781. needInit = true;
  782. }
  783. else if (ctl && attrName.toLowerCase() == 'objectname' && newVal && newVal != '') {
  784. ctl.objectName = newVal;
  785. needInit = true;
  786. }
  787. else if (ctl && attrName.toLowerCase() == 'objectwhere' && newVal && newVal != '') {
  788. ctl.objectWhere = newVal;
  789. needInit = true;
  790. }
  791. else if (ctl && attrName.toLowerCase() == 'pagename' && newVal && newVal != '') {
  792. ctl.pageName = newVal;
  793. needInit = true;
  794. }
  795. if (needInit) {
  796. ctl.init();
  797. }
  798. }
  799. }
  800. wc.FlxSchedulerElement = FlxSchedulerElement;
  801. })(wc = ui.wc || (ui.wc = {}));
  802. })(ui = flexygo.ui || (flexygo.ui = {}));
  803. })(flexygo || (flexygo = {}));
  804. window.customElements.define("flx-scheduler", flexygo.ui.wc.FlxScheduler);
  805. //# sourceMappingURL=flx-scheduler.js.map