//TOSDO_TS
/**
* @namespace flexygo.ui.wc
*/
var flexygo;
(function (flexygo) {
var ui;
(function (ui) {
var wc;
(function (wc) {
/**
* Library for the FlxSchedulerViewElement web component.
*
* @class FlxSchedulerViewElement
* @constructor
* @return {FlxSchedulerViewElement}
*/
class FlxSchedulerViewElement extends HTMLElement {
constructor() {
super();
/**
* Set when component is attached to DOM
* @property connected {boolean}
*/
this.connected = false;
this.moduleName = null;
this.options = null;
this.me = $(this);
this.today = moment();
this.additionalWhere = null;
}
/**
* Fires when element is attached to DOM
* @method connectedCallback
*/
connectedCallback() {
let element = $(this);
this.connected = true;
this.moduleName = element.attr("modulename");
this.data = element.attr('value');
if (element.attr('manualInit') != 'true') {
this.init();
}
}
/**
* Array of observed attributes.
* @property observedAttributes {Array}
*/
static get observedAttributes() {
return ['modulename', 'value'];
}
/**
* Fires when the attribute value of the element is changed.
* @method attributeChangedCallback
*/
attributeChangedCallback(attrName, oldVal, newVal) {
if (!this.connected) {
return;
}
if (attrName.toLowerCase() == 'modulename' && newVal && newVal != '') {
this.moduleName = newVal;
if (this.moduleName) {
this.refresh();
}
}
if (attrName.toLowerCase() == 'value' && newVal && newVal != '') {
this.data = newVal;
if (this.data) {
this.refresh();
}
}
}
refresh() {
if ($(this).attr('manualInit') != 'true') {
let ctx = this;
ctx.render('.schedulerView');
}
}
init() {
let ctx = this;
let me = $(this);
me.removeAttr('manualInit');
ctx.me.append('<div class="schedulerView" ></div>');
let parentModule = me.closest('flx-module');
let wcModule = parentModule[0];
if (parentModule && wcModule) {
wcModule.moduleLoaded(this);
}
ctx.render('.schedulerView');
}
render(selector) {
let ctx = this;
ctx.me.el = $(ctx).find(selector)[0];
ctx.me.current = moment().date(1);
ctx.me.current.locale(flexygo.profiles.langKey.toLowerCase().slice(0, 2));
ctx.changeEvents(ctx.additionalWhere); //Recoger eventos
}
changeEvents(additionalWhere) {
let ctx = this;
let me = $(this);
let datepicker = new Date(ctx.me.current);
let date = new Date(ctx.me.current.date(1));
let start = ctx.formatDate(date, '' + (date.getMonth() + 1), '01', date.getFullYear());
let end = '';
let dp1 = me.find('#datepicker');
dp1.datepicker("setDate", (datepicker.getMonth() + 1) + '/' + datepicker.getDate() + '/' + datepicker.getFullYear());
if (date.getMonth() + 1 == 12) {
end = ctx.formatDate(date, '01', '01', date.getFullYear() + 1);
}
else {
end = ctx.formatDate(date, '' + (date.getMonth() + 2), '01', date.getFullYear());
}
let paramsConfig = {
ModuleName: ctx.moduleName
};
flexygo.ajax.post('~/api/SchedulerView', 'GetSchedulerConfig', paramsConfig, (response) => {
if (response) {
ctx.me.conf = response;
let params = {
ObjName: me.attr('objectname'),
ObjectWhere: me.attr('objectwhere'),
ModuleName: ctx.moduleName,
Start: start,
End: end,
AdditionalWhere: additionalWhere,
SchedulerConfig: response
};
flexygo.ajax.post('~/api/SchedulerView', 'GetSchedulerViewConfig', params, (response) => {
if (response) {
ctx.me.events = response;
ctx.draw();
var current = document.querySelector('.today');
if (current) {
window.setTimeout(function () {
ctx.openDay(current);
}, 500);
}
}
});
}
});
}
draw() {
let ctx = this;
let me = $(this);
//Create Header
ctx.drawHeader();
//Draw Month
ctx.drawMonth();
//Draw Legend
//ctx.drawLegend();
//Datepicker
$('.h1-datepicker').append('<div class="col-6 col-m-12"><div id="datepicker" style="display:none;position:absolute;z-index: 2;" class="cute-calendar"></div></div>');
let dp1 = me.find('#datepicker');
$('.h1-datepicker').click(function () {
dp1.show();
});
dp1.datepicker({
onSelect: function (dateText, inst) {
dp1.hide();
var date = new Date(dateText);
ctx.me.current = moment(date);
ctx.me.current.locale(flexygo.profiles.langKey.toLowerCase().slice(0, 2));
ctx.changeEvents(ctx.additionalWhere);
}, firstDay: 1
});
$('#mainContent').on('scroll', function () {
dp1.hide();
});
$(document).mouseup(function (e) {
if (!dp1.is(e.target) && dp1.has(e.target).length === 0) {
dp1.hide();
}
});
}
drawHeader() {
let ctx = this;
if (!ctx.me.header) {
//Create the header elements
ctx.me.header = ctx.createElement('div', 'header', '', '');
$(ctx.me.header).addClass('header');
ctx.me.datepicker = ctx.createElement('div', 'h1-datepicker', '', '');
ctx.me.title = ctx.createElement('h1', '', '', '');
var right = ctx.createElement('div', 'right', '', '');
$(right).click(function () {
ctx.nextMonth();
});
var left = ctx.createElement('div', 'left', '', '');
$(left).click(function () {
ctx.prevMonth();
});
//Append the Elements
$(ctx.me.datepicker).append(ctx.me.title);
$(ctx.me.header).append(ctx.me.datepicker);
$(ctx.me.header).append(right);
$(ctx.me.header).append(left);
$(ctx.me.el).append(ctx.me.header);
}
$(ctx.me.title).html(ctx.me.current.format('MMMM YYYY'));
}
drawMonth() {
let ctx = this;
let me = $(this);
ctx.me.events.forEach(function (ev) {
ev.date = moment(ev.Date);
ev.eventName = flexygo.utils.parser.recursiveCompile(ev.Row, ev.eventName);
});
if (ctx.me.month) {
ctx.me.oldMonth = ctx.me.month;
$(ctx.me.oldMonth).addClass('month out ' + (ctx.me.next ? 'next' : 'prev'));
$(ctx.me.oldMonth).on('webkitAnimationEnd', function () {
$(ctx.me.oldMonth).remove();
ctx.me.month = ctx.createElement('div', 'month', '', '');
ctx.backFill();
ctx.currentMonth();
ctx.fowardFill();
$(ctx.me.el).append(ctx.me.month);
window.setTimeout(function () {
$(ctx.me.month).addClass('month in ' + (ctx.me.next ? 'next' : 'prev'));
me.find('.month').not('.in').remove();
}, 16);
});
}
else {
ctx.me.month = ctx.createElement('div', 'month', '', '');
$(ctx.me.el).append(ctx.me.month);
ctx.backFill();
ctx.currentMonth();
ctx.fowardFill();
$(ctx.me.month).addClass('month new');
}
}
createElement(tagName, className, innerText, backgroundColor) {
var ele = document.createElement(tagName);
if (className) {
$(ele).addClass(className);
}
if (innerText) {
$(ele).text(innerText);
}
if (backgroundColor) {
$(ele).css("background-color", backgroundColor);
}
return ele;
}
backFill() {
let ctx = this;
var clone = ctx.me.current.clone();
var dayOfWeek = clone.day();
if (!dayOfWeek) {
dayOfWeek = 6;
}
clone.subtract('days', dayOfWeek + 1);
for (var i = dayOfWeek; i > 0; i--) {
ctx.drawDay(clone.add('days', 1));
}
}
getWeek(day) {
let ctx = this;
if (day.day() === 1) {
ctx.me.week = ctx.createElement('div', 'week', '', '');
$(ctx.me.month).append(ctx.me.week);
}
}
fowardFill() {
let ctx = this;
var clone = ctx.me.current.clone().add('months', 1).subtract('days', 1);
var dayOfWeek = clone.day();
if (dayOfWeek > 6) {
return;
}
for (var i = dayOfWeek; i <= 6; i++) {
ctx.drawDay(clone.add('days', 1));
}
}
currentMonth() {
let ctx = this;
var clone = ctx.me.current.clone();
while (clone.month() === ctx.me.current.month()) {
ctx.drawDay(clone);
clone.add('days', 1);
}
}
drawDay(day) {
let ctx = this;
ctx.getWeek(day);
//Outer Day
var outer = ctx.createElement('div', ctx.getDayClass(day), '', '');
//var outer = ctx.createElement('div', 'day', '');
$(outer).attr('currentdate', day.format('YYYYMMDD'));
if ($(outer).attr("class") != 'day other') {
$(outer).click(function () {
ctx.openDay(this);
let ev = {
class: "module",
type: "selected",
sender: ctx,
masterIdentity: $(this).attr('currentdate'),
detailIdentity: null
};
flexygo.events.trigger(ev);
});
}
else {
$(outer).click(function () {
let ev = {
class: "module",
type: "selected",
sender: ctx,
masterIdentity: $(this).attr('currentdate'),
detailIdentity: null
};
flexygo.events.trigger(ev);
});
}
//Day Name
var name = ctx.createElement('div', 'day-name', day.format('ddd'), '');
//Day Number
var number = ctx.createElement('div', 'day-number', day.format('DD'), '');
//Events
var events = ctx.createElement('div', 'day-events', '', '');
ctx.drawEvents(day, events);
$(outer).append(name);
$(outer).append(number);
$(outer).append(events);
$(ctx.me.week).append(outer);
}
drawEvents(day, element) {
let ctx = this;
if (day.month() === ctx.me.current.month()) {
var todaysEvents = ctx.me.events.reduce(function (memo, ev) {
if (ev.date.isSame(day, 'day')) {
memo.push(ev);
}
return memo;
}, []);
todaysEvents.forEach(function (ev) {
var evSpan = ctx.createElement('span', '', '', ev.color);
$(element).append(evSpan);
});
}
}
getDayClass(day) {
let ctx = this;
var classes;
classes = ['day'];
if (day.month() !== ctx.me.current.month()) {
classes.push('other');
}
else if (ctx.today.isSame(day, 'day')) {
classes.push('today');
}
return classes.join(' ');
}
openDay(el) {
let ctx = this;
var defaultDate = $(el).attr('currentdate');
var details, arrow;
var dayNumber = +$(el).find('.day-number').text();
var day = ctx.me.current.clone().date(dayNumber);
var currentOpened = $(document).find('.details')[0];
//Check to see if there is an open detais box on the current row
if (currentOpened && $(currentOpened).parent()[0] === $(el).parent()[0]) {
details = currentOpened;
arrow = $(document).find('.arrow')[0];
}
else {
//Close the open events on differnt week row
//currentOpened && currentOpened.parentNode.removeChild(currentOpened);
if (currentOpened) {
$(currentOpened).on('webkitAnimationEnd', function () {
$(currentOpened).remove();
});
$(currentOpened).on('oanimationend', function () {
$(currentOpened).remove();
});
$(currentOpened).on('msAnimationEnd', function () {
$(currentOpened).remove();
});
$(currentOpened).on('animationend', function () {
$(currentOpened).remove();
});
$(currentOpened).addClass('details out');
}
//Create the Details Container
details = ctx.createElement('div', 'details in', '', '');
//Create the arrow
arrow = ctx.createElement('div', 'arrow', '', '');
//Create the event wrapper
$(details).append(arrow);
$(el).parent().append(details);
}
var todaysEvents = ctx.me.events.reduce(function (memo, ev) {
if (ev.date.isSame(day, 'day')) {
memo.push(ev);
}
return memo;
}, []);
ctx.renderEvents(todaysEvents, details, defaultDate);
var arrowWidth = (50 * $(el).width() / 100) + 7;
$(arrow).css("left", $(el).offset().left - $(el).parent().offset().left + arrowWidth + 'px');
}
renderEvents(events, ele, defaultDate) {
let ctx = this;
//Remove any events in the current details element
var currentWrapper = ele.querySelector('.events');
var wrapper = ctx.createElement('div', 'events in' + (currentWrapper ? ' new' : ''), '', '');
var addNew = ctx.createElement('i', 'clickable padding-right-l addnew icon-15x flx-icon icon-add-icon txt-notify', '', '');
$(addNew).click(function () {
if (ctx.me.conf.length > 1) {
let myButtons = new Object();
let buttons = '';
for (var i = 0; i < ctx.me.conf.length; i++) {
myButtons[ctx.me.conf[i].ObjectName] = {
ObjectName: ctx.me.conf[i].ObjectName,
StartDateField: ctx.me.conf[i].StartDateField,
Icon: ctx.me.conf[i].Icon,
Target: ctx.me.conf[i].Target
};
if (ctx.me.conf[i].CanInsert) {
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.me.conf[i].Icon + '"></i>' + ctx.me.conf[i].ObjectName + '</a>';
}
}
if (buttons != '') {
$.sweetModal({
title: flexygo.localization.translate('flxscheduler.chooseobjects'),
content: '<div>' + buttons + '</div>',
theme: $.sweetModal.THEME_MIXED,
width: '31%'
});
$(".modalButton").click(function () {
let object = myButtons[this.text];
let defaults = {};
defaults[ctx.me.conf[0].StartDateField] = defaultDate.substring(0, 4) + '-' + defaultDate.substring(4, 6) + '-' + defaultDate.substring(6, 8);
flexygo.nav.openPage('edit', object.ObjectName, null, JSON.stringify(defaults), object.Target, false, $(this));
$('.sweet-modal-overlay').remove();
});
}
}
else {
if (ctx.me.conf[0].CanInsert) {
let defaults = {};
defaults[ctx.me.conf[0].StartDateField] = defaultDate.substring(0, 4) + '-' + defaultDate.substring(4, 6) + '-' + defaultDate.substring(6, 8);
flexygo.nav.openPage('edit', ctx.me.conf[0].ObjectName, null, JSON.stringify(defaults), ctx.me.conf[0].Target, false, $(this));
}
}
});
$(wrapper).append(addNew);
events.forEach(function (ev) {
var div = ctx.createElement('div', 'event', '', '');
var square = ctx.createElement('div', 'event-category ', '', ev.color);
var span = $('<span />').html(ev.eventName)[0];
if (ev.pageType == "edit" && ev.canEdit) {
$(div).click(function () {
flexygo.nav.openPage(ev.pageType, ev.calendar, ctx.getObjectWhere(ev.table, ev.key, ev.id), null, ev.target, false, $(this));
});
}
if (ev.pageType == "view" && ev.canView) {
$(div).click(function () {
flexygo.nav.openPage(ev.pageType, ev.calendar, ctx.getObjectWhere(ev.table, ev.key, ev.id), null, ev.target, false, $(this));
});
}
$(div).append(square);
$(div).append(span);
$(wrapper).append(div);
});
if (!events.length) {
var div = ctx.createElement('div', 'event empty', '', '');
var span = ctx.createElement('span', '', 'No Events', '');
$(div).append(span);
$(wrapper).append(div);
}
if (currentWrapper) {
$(currentWrapper).addClass('events out');
$(currentWrapper).on('webkitAnimationEnd', function () {
$(currentWrapper).remove();
$(ele).append(wrapper);
});
$(currentWrapper).on('oanimationend', function () {
$(currentWrapper).remove();
$(ele).append(wrapper);
});
$(currentWrapper).on('msAnimationEnd', function () {
$(currentWrapper).remove();
$(ele).append(wrapper);
});
$(currentWrapper).on('animationend', function () {
$(currentWrapper).remove();
$(ele).append(wrapper);
});
}
else {
$(ele).append(wrapper);
}
}
drawLegend() {
let ctx = this;
var legend = ctx.createElement('div', 'legend', '', '');
ctx.me.events.map(function (e) {
return e.calendar + '|' + e.color;
}).reduce(function (memo, e) {
if (memo.indexOf(e) === -1) {
memo.push(e);
}
return memo;
}, []).forEach(function (e) {
var parts = e.split('|');
var entry = ctx.createElement('span', 'entry', parts[0], '');
var evSpan = ctx.createElement('span', 'colorLegend', '', parts[1]);
$(entry).prepend(evSpan);
$(legend).append(entry);
});
$(ctx.me.el).append(legend);
}
getObjectWhere(table, key, id) {
let where = "";
let last = 0;
for (var i = 0; i < key.length; i++) {
where += table + "." + key[i] + " = \'" + id[i] + "\'";
if (++last < key.length) {
where += " and ";
}
}
return where;
}
nextMonth() {
let ctx = this;
ctx.me.current.add('months', 1);
ctx.me.next = true;
ctx.changeEvents(ctx.additionalWhere);
}
prevMonth() {
let ctx = this;
ctx.me.current.subtract('months', 1);
ctx.me.next = false;
ctx.changeEvents(ctx.additionalWhere);
}
formatDate(date, month, day, year) {
if (month.length < 2)
month = '0' + month;
if (day.length < 2)
day = '0' + day;
return [year, month, day].join('');
}
translate(str) {
return flexygo.localization.translate(str);
}
startLoading() {
if ($(this).parents('flx-module').length > 0) {
$(this).parents('flx-module')[0].startLoading();
}
}
stopLoading() {
if ($(this).parents('flx-module').length > 0) {
$(this).parents('flx-module')[0].stopLoading();
}
}
}
wc.FlxSchedulerViewElement = FlxSchedulerViewElement;
})(wc = ui.wc || (ui.wc = {}));
})(ui = flexygo.ui || (flexygo.ui = {}));
})(flexygo || (flexygo = {}));
window.customElements.define('flx-schedulerview', flexygo.ui.wc.FlxSchedulerViewElement);
//# sourceMappingURL=flx-schedulerview.js.map