UNPKG

newswriter

Version:

NewsWriter is a generic tool for maintaining news and announcements on a website news page. Details are held in an SQLite database, from which the tool generates the index page (typically the top page of the target site), individual pages for events and a

442 lines (405 loc) 13.5 kB
function mapField (ret,id,value) { if (fieldMap[id]) { ret[fieldMap[id]] = value; } }; function previewForm (suppressPreview) { var data = { pageDate:pageDate }; //data.eventID = document.getElementById('event-id').value; var formNodes = getFormNodes(); for (var i=0,ilen=formNodes.required.length;i<ilen;i+=1) { mapField(data,formNodes.required[i].id,formNodes.required[i].value); } for (var i=0,ilen=formNodes.optional.length;i<ilen;i+=1) { if (formNodes.optional[i].value) { mapField(data,formNodes.optional[i].id,formNodes.optional[i].value); } } if (formNodes.presenter.value) { mapField(data,formNodes.presenter.id,formNodes.presenter.value); data.sessions = {}; // Grab everything. Total free-for-all scramble from UI chaos to API order. var sessionNodes = document.getElementsByClassName('session-required'); for (var i=0,ilen=sessionNodes.length;i<ilen;i+=1) { var sessionNode = sessionNodes[i]; var smartId = new SmartId(sessionNode.id); if (!data.sessions[smartId.num]) { data.sessions[smartId.num] = {}; } mapField(data.sessions[smartId.num],smartId.id,sessionNode.value); } var minStartDate = 0; // Reprocess sessions to consolidate date+start and date+end in two dateTime fields // Includes a time adjustment. See TIMES.txt for details. for (var sessionKey in data.sessions) { var session = data.sessions[sessionKey]; // Extract from date var date = extractDate(session['session-date']); // Extract from start var start = extractTime(session['session-hour-start']); // Extract from end var end = extractTime(session['session-hour-end']); // Compose ... var startDateTime = new Date(year=date.year,month=date.month,day=date.day,hour=start.hour,minute=start.minute); session.startDateTime = jstShift(startDateTime); // Track minStartDate if (!minStartDate || session.startDateTime < minStartDate) { minStartDate = session.startDateTime; } var endDateTime = new Date(year=date.year,month=date.month,day=date.day,hour=end.hour,minute=end.minute); session.endDateTime = jstShift(endDateTime); // Deletes ... delete session['session-date']; delete session['session-hour-start']; delete session['session-hour-end']; } // If we have a minStartDate value, use it for pageDate if (minStartDate) { data.pageDate = minStartDate; } data.sessions = convertSessionsObjectToSortedList(data.sessions); } // If hasAttachment ... var attachments = document.getElementsByClassName('attachment-required'); for (var i=0,ilen=attachments.length;i<ilen;i+=1) { if (!data.attachments) { data.attachments = []; } if (attachments[i].value) { var smartId = new SmartId(attachments[i].id); data.attachments.push(smartId.num); } } // API save call convertAllDatesToRemote(data); if (!pageName) { pageName = 'top'; } var row = apiRequest( '/?admin=' + adminID + '&page=' + pageName + '&cmd=saveevent' , { data:data, userkey:userKey } ); if (false === row) return; // Receive eventID and set in form var eventIdNode = document.getElementById('event-id'); eventIdNode.value = row.eventID; // API read calls and updates (for event & announcement pulldown lists) updateMenuList('event'); updateMenuList('announcement'); // API read call (for preview) // Compose preview popup and display var path = fixPath('/?admin=' + adminID + '&page=' + pageName + '&cmd=preview&eventid=' + row.eventID); if (!suppressPreview) { popupCenter(path,'preview',700,500); }; setFormButtons(row); // Once this is all working, only mail remains! }; function convertSessionsObjectToSortedList(sessions) { var lst = []; for (var sessionKey in sessions) { lst.push(sessions[sessionKey]); }; lst.sort(function(a,b){ if (a.startDateTime > b.startDateTime) { return 1; } else if (a.startDateTime < b.startDateTime) { return -1; } else { return 0; } }); return lst; }; function getPageContent (event) { var eventID; if ("number" === typeof event) { eventID = event; } else { eventID = event.target.value; } if (eventID) { eventID = parseInt(eventID,10); } var data = apiRequest( '/?admin=' + adminID + '&page=' + pageName + '&cmd=readevent' , { eventid:eventID, userkey:userKey } ); if (false === data) return; role = data.role; convertAllDatesToLocal(data); // Clear form clearForm(); // Populate form populateForm(eventID,data); // Show current form in pulldown menus updateMenuList('event'); updateMenuList('announcement'); updateMenuList('trash'); // Wake up buttons checkFormComplete(); setFormButtons(data); if ("number" !== typeof event) { event.target.blur(); } }; function getFormNodes() { var ret = {}; ret.required = document.getElementsByClassName('form-required'); ret.optional = document.getElementsByClassName('form-optional'); ret.master = document.getElementsByClassName('person-master'); ret.servant = document.getElementsByClassName('person-servant'); ret.presenter = document.getElementById('presenter-name-id'); ret.session = document.getElementById('session-container'); ret.attachment = document.getElementById('attachment-container'); ret.disable = document.getElementsByClassName('default-disable'); ret.nodisplay = document.getElementsByClassName('default-nodisplay'); ret.search = document.getElementById('uploader-attachment-searchable'); return ret; }; var populateMap = { convenor: { convenorID:'convenor-name-id', convenorName:'convenor-name', convenorContact:'convenor-contact', convenorAffiliation:'convenor-affiliation', convenorPosition:'convenor-position' }, presenter: { presenterID:'presenter-name-id', presenterName:'presenter-name', presenterContact:'presenter-contact', presenterAffiliation:'presenter-affiliation', presenterPosition:'presenter-position' }, details: { title:'title', description:'description', note:'note' } }; function populateForm (eventID,data) { var formNodes = getFormNodes(); document.getElementById('event-id').value = eventID; var persons = ['convenor','presenter']; for (var i=0,ilen=persons.length;i<ilen;i+=1) { var person = persons[i]; var hasPerson = false; for (var key in populateMap[person]) { var node = document.getElementById(populateMap[person][key]); if (data[key]) { hasPerson = true; node.value = data[key]; node.classList.add('has-content'); node.disabled = true; cache[populateMap[person][key]] = data[key]; } } if (hasPerson) { document.getElementById(person + '-clear').disabled = false; document.getElementById(person + '-edit').style.display = 'inline'; } } for (var key in populateMap.details) { var node = document.getElementById(populateMap.details[key]); if (data[key]) { hasPerson = true; node.value = data[key]; node.classList.add('has-content'); cache[populateMap.details[key]] = data[key]; } } for (var i=0,ilen=data.attachments.length;i<ilen;i+=1) { var attachment = data.attachments[i]; appendAttachmentNode(attachment.documentID,attachment.title); } for (var i=0,ilen=data.sessions.length;i<ilen;i+=1) { var session = data.sessions[i]; var fields = prepareFields(session); appendSessionNode(fields); } }; function padNumber (num,padlen) { if (!padlen) { padlen = 0; } num = '' + num; while (num.length < padlen) { num = '0' + num; } return num; }; function prepareFields (session) { // "startDateTime": 1395882000000, // "endDateTime": 1395885600000 var ret = {}; ret.title = session.title; ret.place = session.place; ret.date = inferUiDate(session.startDateTime); ret.start = inferUiTimeIndex(session.startDateTime); ret.end = inferUiTimeIndex(session.endDateTime); return ret; }; function clearForm () { var formNodes = getFormNodes(); // Clear cache cache = {}; // Clear required for (var i=0,ilen=formNodes.required.length;i<ilen;i+=1) { formNodes.required[i].value = ""; formNodes.required[i].classList.remove('has-content'); } // Clear optional for (var i=0,ilen=formNodes.optional.length;i<ilen;i+=1) { formNodes.optional[i].value = ""; formNodes.optional[i].classList.remove('has-content'); } // Clear person master for (var i=0,ilen=formNodes.master.length;i<ilen;i+=1) { formNodes.master[i].value = ""; formNodes.master[i].classList.remove('has-content'); formNodes.master[i].disabled = false; } // Clear person servant for (var i=0,ilen=formNodes.servant.length;i<ilen;i+=1) { formNodes.servant[i].value = ""; formNodes.servant[i].classList.remove('has-content'); formNodes.servant[i].disabled = true; } // Clear attachments for (var i=0,ilen=formNodes.attachment.childNodes.length;i<ilen;i+=1) { formNodes.attachment.removeChild(formNodes.attachment.childNodes[0]); } // Clear sessions for (var i=0,ilen=formNodes.session.childNodes.length;i<ilen;i+=1) { formNodes.session.removeChild(formNodes.session.childNodes[0]); } // Disable buttons for (var i=0,ilen=formNodes.disable.length;i<ilen;i+=1) { formNodes.disable[i].disabled = true; } // Hide buttons for (var i=0,ilen=formNodes.nodisplay.length;i<ilen;i+=1) { formNodes.nodisplay[i].style.display = 'none'; } // Clear search toggle formNodes.search.checked = false; }; function trashItem (event) { var eventID = document.getElementById('event-id').value; var row = apiRequest( '/?admin=' + adminID + '&page=' + pageName + '&cmd=trashevent' , { eventid:eventID } ); if (false === row) return; updateMenuList('event'); updateMenuList('announcement'); updateMenuList('trash'); setFormButtons(row); event.target.blur(); }; function restoreItem (event) { var eventID = document.getElementById('event-id').value; var row = apiRequest( '/?admin=' + adminID + '&page=' + pageName + '&cmd=restoreevent' , { eventid:eventID } ); if (false === row) return; updateMenuList('event'); updateMenuList('announcement'); updateMenuList('trash'); setFormButtons(row); event.target.blur(); }; function publishItem (event) { previewForm(true); var eventID = document.getElementById('event-id').value; var row = apiRequest( '/?admin=' + adminID + '&page=' + pageName + '&cmd=publish' , { eventid:eventID, userkey:userKey } ); if (false === row) return; updateMenuList('event'); updateMenuList('announcement'); updateMenuList('trash'); showSave(event.target,function(node){ node.classList.remove('has-content'); setFormButtons(row); node.blur(); }); }; function republishItem (event) { previewForm(true); var eventID = document.getElementById('event-id').value; var row = apiRequest( '/?admin=' + adminID + '&page=' + pageName + '&cmd=publish' , { eventid:eventID, userkey:userKey } ); if (false === row) return; updateMenuList('event'); updateMenuList('announcement'); updateMenuList('trash'); showSave(event.target,function(node){ node.classList.remove('has-content'); setFormButtons(row); node.blur(); }); }; function confirmItem (event) { previewForm(true); var eventID = document.getElementById('event-id').value; var row = apiRequest( '/?admin=' + adminID + '&page=' + pageName + '&cmd=confirmevent' , { eventid:eventID } ); if (false === row) return; updateMenuList('event'); updateMenuList('announcement'); updateMenuList('trash'); showSave(event.target,function(node){ node.classList.remove('has-content'); setFormButtons(row); node.blur(); }); };