'use strict'; var sProgramId = getProgramId(), isAdmin = parent.UserInfo.roles.toLowerCase().indexOf('admin') > -1, AddedTip = false, oCalendar = null, fnPageInit = function() { var saCalType = [], saOpenMent = ['P', 'G', 'D', 'C'], /** * 表單驗證 * @param {Object}iframe form表單 */ fnValidate = function(iframe) { iframe.find('[name=OpenMent]').click(function() { var sVal = this.value; if (sVal === 'G') { iframe.find('#trGroupMembers').show(); } else { iframe.find('#trGroupMembers').hide(); iframe.find('#GroupMembers').val('').data('value', ''); } }); $.validator.addMethod("compardatetime", function(value, element, parms) { if (new Date(value) <= new Date(iframe.find('#StartDate').val())) { return false; } return true; }); $.validator.addMethod("groupmember", function(value, element, parms) { if (iframe.find('[name=OpenMent]:checked').val() === 'G' && !$(element).data('value')) { return false; } return true; }); return iframe.find("#form_calendar").validate({ showErrors: function() { this.defaultShowErrors(); transLang(iframe); } }); // //表單欄位驗證 }, /** * 修改資料 * @param {Object} event 事件 * @param {Object} newevent 最新的事件 */ fnUpdData = function(event, newevent) { CallAjax(ComFn.W_Com, ComFn.GetUpd, { Params: { calendar: { values: newevent, keys: { NO: event.id } } } }, function(res) { if (res.d > 0) { showMsg(i18next.t("message.Modify_Success"), 'success'); //╠message.Modify_Success⇒修改成功╣ } else { showMsg(i18next.t("message.Modify_Failed"), 'error'); //╠message.Modify_Failed⇒修改失敗╣ } oCalendar.fullCalendar('refetchEvents'); if (parent.Outklook) { outlookAPI(outlook.Calendar_Upd, { NO: event.id }) } }, function() { showMsg(i18next.t("message.Modify_Failed"), 'error'); //╠message.Modify_Failed⇒修改失敗╣ }); }, /** * pop視窗 * @param {Object} iframe 表單 */ fnRegisterEvent = function(iframe, action) { iframe.find('.add-on').click(function() { fnGetSetUserGroups({ Action: action, Callback: function(data) { if (data.length > 0) { var saId = [], saName = []; $.each(data, function(idx, item) { saId.push(item.UserID); saName.push(item.UserName); }); iframe.find('#GroupMembers').data('value', saId.join(',')).val(saName.join(',')); } } }); }); }, /** * pop資料新增 * @param {Object} start 開始時間 * @param {Object} end 結束時間 */ fnAdd = function(start, end) { var oValidator = null; layer.open({ type: 2, title: '新增行程', shade: 0.75, maxmin: true, //开启最大化最小化按钮 area: ['800px', '580px'], content: '/Page/Pop/CalanderPop.html', success: function(layero, index) { var iframe = $('iframe').contents(); fnSetArgDrop([{ ArgClassID: 'CalType', Select: iframe.find('#CalType'), ShowId: true, CallBack: function(data) { var bAllDay = true; iframe.find('#CurrentDate').val(start); iframe.find('#AllDay')[0].checked = bAllDay = typeof start._i === 'string'; iframe.find('#StartDate').val(bAllDay ? start._d.formate('yyyy/MM/dd 00:00') : newDate(start)); iframe.find('#EndDate').val(bAllDay ? end._d.formate('yyyy/MM/dd 00:00') : newDate(end)); oValidator = fnValidate(iframe); fnRegisterEvent(iframe, 'add'); } }]); }, btn: [i18next.t('common.Confirm'), i18next.t('common.Cancel')], //╠common.Confirm⇒確定╣╠common.Cancel⇒取消╣ yes: function(index, layero) { var iframe = $('iframe').contents(); iframe.find('#GroupMembers').removeAttr('readonly'); if (!iframe.find("#form_calendar").valid()) { oValidator.focusInvalid(); iframe.find('#GroupMembers').attr('readonly', 'readonly'); return false; } var data = getFormSerialize(iframe.find('#form_calendar')); data = packParams(data); data.OrgID = parent.OrgID; data.UserID = parent.UserID; data.Color = parent.UserInfo.CalColor; data.AllDay = data.AllDay || '0'; g_api.ConnectLite(sProgramId, ComFn.GetAdd, data, function(res) { if (res.RESULT) { var sNo = res.DATA.rel; showMsg(i18next.t("message.Save_Success"), 'success'); // ╠message.Save_Success⇒新增成功╣ oCalendar.fullCalendar('refetchEvents'); if (parent.Outklook) { outlookAPI(outlook.Calendar_Add, { NO: sNo, ResponseRequested: true }); } } else { showMsg(i18next.t("message.Save_Failed"), 'error'); // ╠message.Save_Failed⇒新增失敗╣ } }); layer.close(index); } }); }, /** * 資料修改 * @param {Object} event 事件 */ fnUpd = function(event) { var oValidator = null, bEdit = (event.UserID === parent.UserID && event.Memo !== 'outlook'), saBtns = [], layerOption = { type: 2, title: '修改日程', shade: 0.75, maxmin: true, //开启最大化最小化按钮 area: ['800px', '580px'], content: '/Page/Pop/CalanderPop.html', success: function(layero, index) { var iframe = $('iframe').contents(); fnSetArgDrop([{ ArgClassID: 'CalType', Select: iframe.find('#CalType'), ShowId: true, CallBack: function(data) { oValidator = fnValidate(iframe); iframe.find('#CalType').val(event.CalType); iframe.find('#Title').val(event.title); iframe.find('#Description').val(event.content); iframe.find('#GroupMembers').data('value', event.GroupMembers); iframe.find('[name=OpenMent][value=' + event.OpenMent + ']').click(); iframe.find('[name=Importment][value=' + event.Importment + ']').click(); iframe.find('#AllDay')[0].checked = event.AllDay; iframe.find('#CurrentDate').val(newDate(event.start, 1)); iframe.find('#StartDate').val(newDate(event.StartDate)); iframe.find('#EndDate').val(newDate(event.EndDate)); if (event.GroupMembers) { fnSetUserDrop([{ UserIDs: event.GroupMembers, CallBack: function(data) { var saList = data, saName = []; $.each(saList, function(idx, item) { saName.push(item.MemberName); }); iframe.find('#GroupMembers').val(saName); } }]); } if (bEdit) { fnRegisterEvent(iframe, 'upd'); } else { disableInput(iframe); } } }]); layero.find('.layui-layer-btn1').css({ 'border-color': 'red', 'background-color': 'red', 'color': '#fff' }); } }; if (bEdit) { saBtns = [i18next.t('common.Confirm'), i18next.t('common.Toolbar_Del'), i18next.t('common.Cancel')]; //╠common.Confirm⇒確定╣ ╠common.Toolbar_Del⇒刪除╣ ╠common.Cancel⇒取消╣ layerOption.yes = function(index, layero) { var iframe = $('iframe').contents(); iframe.find('#GroupMembers').removeAttr('readonly'); if (!iframe.find("#form_calendar").valid()) { oValidator.focusInvalid(); iframe.find('#GroupMembers').attr('readonly', 'readonly'); return false; } var data = getFormSerialize(iframe.find('#form_calendar')); data = packParams(data, 'upd'); data.UserID = parent.UserInfo.MemberID; data.Description = data.Description || ''; data.Color = parent.UserInfo.CalColor; data.AllDay = data.AllDay || '0'; fnUpdData(event, data); layer.close(index); }; layerOption.btn2 = function() { CallAjax(ComFn.W_Com, ComFn.GetDel, { Params: { calendar: { NO: event.id } } }, function(res) { if (res.d > 0) { showMsg(i18next.t("message.Delete_Success"), 'success'); // ╠message.Delete_Success⇒刪除成功╣ oCalendar.fullCalendar('removeEvents', event.id); if (parent.Outklook) { outlookAPI(outlook.Calendar_Del, { OutlookEventId: event.OutlookEventId }); } } else { showMsg(i18next.t("message.Delete_Failed"), 'error'); // ╠message.Delete_Failed⇒刪除失敗╣ } }); }; } else { saBtns = [i18next.t('common.Cancel')]; } layerOption.btn = saBtns; layer.open(layerOption); }, /** * 選擇分組成員 * @param {Object} option 配置 */ fnGetSetUserGroups = function(option) { option = option || {}; var oGrid = null, saItems = [], saProfileGets = [], fnGetSetlectOptions = function(el) { var saSetlectOptions = []; el.find('#lstRight option').each(function() { var sId = this.value, oItems = {}, sEmail = $(this).attr('data-email'); if (sEmail) { oItems = { UserID: sId, UserName: $(this).text(), OutlookEmail: sEmail }; } else { oItems = $.map(saItems, function(item) { if (sId === item.MemberID) { return { UserID: item.MemberID, UserName: item.MemberName, OutlookEmail: item.OutlookAccount }; } })[0]; } saSetlectOptions.push(oItems); }); return saSetlectOptions; }, fnSetProfileDrop = function(handle) { return CallAjax(ComFn.W_Com, ComFn.GetList, { Type: '', Params: { profiles: { ProfileType: 'UserGroups', OrgID: parent.OrgID, UserID: parent.UserID }, sort: { SN: 'asc' } } }, function(res) { if (res.d) { saProfileGets = JSON.parse(res.d); handle.html(createOptions(saProfileGets, 'SN', 'ProfileName')); } }); }, fnAddProfile = function(layero) { var oAddPm = {}; oAddPm.OrgID = parent.OrgID; oAddPm.UserID = parent.UserID; oAddPm.ProfileType = 'UserGroups'; oAddPm.ProfileName = layero.find('#ProfileName').val(); oAddPm.ProfileSet = fnGetSetlectOptions(layero); oAddPm.ProfileSet = JSON.stringify(oAddPm.ProfileSet); oAddPm = packParams(oAddPm); if (!oAddPm.ProfileName) { showMsg(i18next.t("message.ProfileFeesClassName_Required")); //╠message.ProfileFeesClassName_Required⇒請填寫個人化費用類別名稱╣ return false; } CallAjax(ComFn.W_Com, ComFn.GetAdd, { Params: { profiles: oAddPm } }, function(res) { if (res.d > 0) { fnSetProfileDrop(layero.find('#ProfileClass')).done(function() { layero.find('#ProfileClass option').each(function() { if ($(this).text() === oAddPm.ProfileName) { layero.find('#ProfileClass').val(this.value); return false; } }); }); showMsg(i18next.t("message.Save_Success"), 'success'); // ╠message.Save_Success⇒新增成功╣ } else { showMsg(i18next.t("message.Save_Failed"), 'error'); // ╠message.Save_Failed⇒新增失敗╣ } }, function() { showMsg(i18next.t("message.Save_Failed"), 'error'); // ╠message.Save_Failed⇒新增失敗╣ }); }, fnUpdProfile = function(layero) { var oUpdPm = {}, sId = layero.find('#ProfileClass').val(); oUpdPm.ProfileName = layero.find('#ProfileName').val(); oUpdPm.ProfileSet = []; oUpdPm.ProfileSet = fnGetSetlectOptions(layero); oUpdPm.ProfileSet = JSON.stringify(oUpdPm.ProfileSet); oUpdPm = packParams(oUpdPm, 'upd'); if (!oUpdPm.ProfileName) { showMsg(i18next.t("message.ProfileFeesClassName_Required")); // 請填寫個人化費用類別名稱 return false; } CallAjax(ComFn.W_Com, ComFn.GetUpd, { Params: { profiles: { values: oUpdPm, keys: { SN: sId } } } }, function(res) { if (res.d > 0) { fnSetProfileDrop(layero.find('#ProfileClass')).done(function() { layero.find('#ProfileClass').val(sId); }); showMsg(i18next.t("message.Modify_Success"), 'success'); //╠message.Modify_Success⇒修改成功╣ } else { showMsg(i18next.t("message.Modify_Failed"), 'error'); //╠message.Modify_Failed⇒修改失敗╣ } }, function() { showMsg(i18next.t("message.Modify_Failed"), 'error'); //╠message.Modify_Failed⇒修改失敗╣ }); }, fnDelProfile = function(layero) { var sId = layero.find('#ProfileClass').val(); if (!sId) { showMsg(i18next.t("message.DeleteItem_Required")); //╠message.DeleteItem_Required⇒請選擇要刪除的項目╣ return false; } CallAjax(ComFn.W_Com, ComFn.GetDel, { Params: { profiles: { SN: sId } } }, function(res) { if (res.d > 0) { fnSetProfileDrop(layero.find('#ProfileClass')); layero.find('#ProfileName').val(''); layero.find('#lstRight').html(''); layero.find('#lstLeft').html(createOptions(saItems, 'MemberID', 'MemberName', true)); layero.find('#lstLeft').find('option:first').remove(); showMsg(i18next.t("message.Delete_Success"), 'success'); // ╠message.Delete_Success⇒刪除成功╣ } else { showMsg(i18next.t("message.Delete_Failed"), 'error'); // ╠message.Delete_Failed⇒刪除失敗╣ } }, function() { showMsg(i18next.t("message.Delete_Failed"), 'error'); // ╠message.Delete_Failed⇒刪除失敗╣ }); }; getHtmlTmp('/Page/Pop/UserGroups.html').done(function(html) { layer.open({ type: 1, title: i18next.t('common.ProfileFees'), // ╠common.ProfileFees⇒個人化費用項目╣ shadeClose: false, shade: 0.1, maxmin: true, //开启最大化最小化按钮 area: ['600px', '590px'], content: html, success: function(layero, index) { var elIistLeft = layero.find('#lstLeft'), elListRight = layero.find('#lstRight'); fnSetProfileDrop(layero.find('#ProfileClass')); fnSetUserDrop([{ Select: elIistLeft, ShowId: true, Action: option.Action, //傳入action來判斷是新增或是修改 CallBack: function(data) { saItems = data; } }]).done(function() { elIistLeft.find('option:first').remove(); optionListSearch(elIistLeft, elListRight, layero.find('#ProfileFilter')); }); layero.find('#ProfileClass').on('change', function() { var sProfile = this.value, saProfileSet = []; if (sProfile) { var oProfileGet = $.grep(saProfileGets, function(e) { return e.SN.toString() == sProfile; })[0]; saProfileSet = JSON.parse(oProfileGet.ProfileSet || '[]'); layero.find('#ProfileName').val(oProfileGet.ProfileName); } else { layero.find('#ProfileName').val(''); } elListRight.html(''); elIistLeft.html(createOptions(saItems, 'MemberID', 'MemberName', true)).find('option:first').remove(); elIistLeft.find('option').each(function() { var _option = this, sId = $(_option).val(); $.each(saProfileSet, function(index, item) { if (sId === item.UserID) { $(_option).appendTo(elListRight); item.IsMove = true; return false; } }); }); $.each(saProfileSet, function(index, item) { if (!item.IsMove) { $('', { value: item.UserID, text: item.UserName, 'data-email': item.OutlookEmail, class: 'outer' }).appendTo(elListRight); } }); }); layero.find('#AddOutGroupUser').on('click', function() { var sOutUserName = $('#OutUserName').val(), sOutEmail = $('#OutEmail').val(), sGuid = guid(); if (!sOutUserName || !OutEmail) { showMsg(i18next.t("message.OutUserNameAndOutEmail_Required")); // ╠message.OutUserNameAndOutEmail_Required⇒請填寫姓名和郵箱地址╣ return false; } if (!isEmail(sOutEmail)) { showMsg(i18next.t("message.IncorrectEmail")); // ╠message.IncorrectEmail⇒郵箱格式不正確╣ return false; } $('', { value: sGuid, text: sOutUserName, 'data-email': sOutEmail, class: 'outer' }).appendTo(elListRight); var oAddPm = { Guid: sGuid, UserName: sOutUserName, Email: sOutEmail }; oAddPm = packParams(oAddPm); CallAjax(ComFn.W_Com, ComFn.GetAdd, { Params: { outerusers: oAddPm } }); }); layero.find('.cusclass-add').on('click', function() { fnAddProfile(layero); }); layero.find('.cusclass-upd').on('click', function() { fnUpdProfile(layero); }); layero.find('.cusclass-del').on('click', function() { fnDelProfile(layero); }); layero.find('#btnToRight').on('click', function() { optionListMove(elIistLeft, elListRight); }); layero.find('#btnToLeft').on('click', function() { optionListMove(elListRight, elIistLeft); }); layero.find('#btnToUp').on('click', function() { optionListOrder(elListRight, true); }); layero.find('#btnToDown').on('click', function() { optionListOrder(elListRight, false); }); transLang(layero); }, btn: [i18next.t('common.Confirm'), i18next.t('common.Cancel')], //╠common.Confirm⇒確定╣╠common.Cancel⇒取消╣ yes: function(index, layero) { var saRetn = fnGetSetlectOptions(layero); if (typeof option.Callback === 'function') option.Callback(saRetn); layer.close(index); }, cancel: function() { if (typeof option.CancelCallback === 'function') option.CancelCallback(); } }); }); }, /** * ToolBar 按鈕事件 function * @param {Object} inst 按鈕物件對象 * @param {Object} e 事件對象 */ fnButtonHandler = function(inst, e) { var sId = inst.id; switch (sId) { case "Toolbar_Qry": break; case "Toolbar_Save": break; case "Toolbar_ReAdd": break; case "Toolbar_Clear": break; case "Toolbar_Leave": break; case "Toolbar_Add": break; case "Toolbar_Upd": break; case "Toolbar_Copy": break; case "Toolbar_Del": break; case "Toolbar_Exp": break; case "Toolbar_SynChronousOutlook": { var index = layer.load(0, { time: 10 * 1000 }); ////同步開啟loading,并且设定最长等待10秒 outlookAPI(outlook.SynChronous, { flag: "once", memo: index }); } break; default: alert("No handle '" + sId + "'"); break; } }, saCusBtns = []; if (parent.Outklook) { saCusBtns.push({ id: 'Toolbar_SynChronousOutlook', value: 'common.SynChronousOutlook' // ╠common.SynChronousOutlook⇒同步Outlook╣ }); } commonInit({ PrgId: sProgramId, ButtonHandler: fnButtonHandler, Buttons: saCusBtns, GoTop: true }); fnSetArgDrop([{ ArgClassID: 'CalType', CallBack: function(data) { var saHeaderShow = [], oCustomButtons = { addevent: { text: '新增日程', click: function() { fnAdd(new Date(), new Date().dateAdd('h', 1)); } } }, elCalType = $('
'); $.grep(data, function(item, index) { var sBtnId = 'cusbtn_' + item.id, sCalType = ''; saHeaderShow.push(sBtnId); oCustomButtons[sBtnId] = { text: item.text, click: function(el) { var sId = $(this).attr('data-id').replace('cusbtn_', ''); if ($(this).hasClass('selected')) { $(this).removeClass('selected'); saCalType.remove(sId); } else { $(this).addClass('selected'); saCalType.push(sId); } oCalendar.fullCalendar('refetchEvents'); } }; saCalType.push(item.id); elCalType.append(sCalType); }); oCalendar = $('#calendar').fullCalendar({ locale: 'zh-tw', timezone: 'local', schedulerLicenseKey: 'GPL-My-Project-Is-Open-Source', theme: true, weekends: true, // will hide Saturdays and Sundays firstDay: 0, isRTL: false, defaultView: 'month', defaultDate: new Date().formate("yyyy-MM-dd"), navLinks: true, // can click iDay/week names to navigate views editable: true, droppable: true, // this allows things to be dropped onto the calendar(允許將事件拖動到日曆上) eventLimit: true, // allow "more" link when too many events(允許出現更多圖標) selectable: true, selectHelper: true, weekNumbers: true, weekNumbersWithinDays: true, weekNumberCalculation: 'ISO', nowIndicator: true, displayEventTime: true, fixedWeekCount: false, header: { left: 'prev,next today addevent ', //saHeaderShow.join(' ') center: 'title', right: 'month1,month2,month,agendaWeek,agendaDay,listMonth' }, buttonIcons: { prev: 'left-single-arrow', next: 'right-single-arrow', prevYear: 'left-double-arrow', nextYear: 'right-double-arrow' }, themeButtonIcons: { prev: 'circle-triangle-w', next: 'circle-triangle-e', prevYear: 'seek-prev', nextYear: 'seek-next' }, businessHours: [ // specify an array instead { dow: [1, 2, 3, 4, 5], // Monday, Tuesday, Wednesday start: '09:00', // 8am end: '18:30' // 6pm } ], customButtons: oCustomButtons, select: function(start, end) { fnAdd(start, end); }, eventClick: function (calEvent) { if (!!calEvent.show && calEvent.show) { fnUpd(calEvent); } }, eventDrop: function(event) { var data = {}; data.StartDate = newDate(event.start); data.EndDate = newDate(event.end); fnUpdData(event, data); }, eventResize: function(event) { var data = {}; data.StartDate = newDate(event.start); data.EndDate = newDate(event.end); fnUpdData(event, data); }, eventMouseover: function (event, jsEvent, view) { addTips($('[tooltips]')); }, events: function(start, end, timezone, callback) { g_api.ConnectLite(sProgramId, 'GetList', { StartDate: newDate(start), EndDate: newDate(end), CalType: saCalType.join(','), OpenMent: saOpenMent.join(',') }, function(res) { if (res.RESULT) { var saEvents = res.DATA.rel; $.each(saEvents, function (idx, item) { if (item.CalType === '07') { var Owner = item.CreateUser === parent.UserID; if (Owner || isAdmin) item.show = true; else { item.show = false; item.Description = ""; } } else { item.show = true; } }); callback(saEvents); } }); }, /** * 處理資料(轉換成日曆資料格式) */ eventDataTransform: function(event) { event.id = event.NO; event.title = event.Title; event.content = event.Description; event.allDay = event.AllDay; if (event.StartDate) event.start = event.StartDate; if (event.EndDate) event.end = event.EndDate; event.color = event.Importment === 'H' ? 'red' : event.Color; event.className = 'calendar-event'; return event; } }); var elOpenMent = ' '; //\ $('.fc-toolbar .fc-left').append(elCalType[0].outerHTML); $('.fc-toolbar .fc-right').prepend(elOpenMent); $('[name="CalType[]"]').click(function() { saCalType = []; $('[name="CalType[]"]').each(function() { if (this.checked) { saCalType.push(this.value); } }); oCalendar.fullCalendar('refetchEvents'); }); $('[name="OpenMent[]"]').click(function() { saOpenMent = []; $('[name="OpenMent[]"]').each(function() { if (this.checked) { saOpenMent.push(this.value); } }); oCalendar.fullCalendar('refetchEvents'); }); } }]); }, closeTips = function(index) { layer.close(index); //同步完成后關閉loading oCalendar.fullCalendar('refetchEvents'); }; require(['base', 'jsgrid', 'jbox', 'util'], fnPageInit);