UNPKG

periodicjs.ext.asyncadmin

Version:

An authentication extension for periodicjs that uses passport to authenticate user sessions.

319 lines (290 loc) 12.1 kB
'use strict'; var debounce = require('debounce'); var util = require('util'), events = require('events'), moment = require('moment'), ejs = require('ejs'), capitalize = require('capitalize'), pluralize = require('pluralize'), classie = require('classie'), data_tables = require('../../controller/data_tables'), extend = require('util-extend'), request = require('superagent'), Bindie = require('bindie'); ejs.delimiter = '?'; var uniq_fast = function (a) { var seen = {}; var out = []; var len = a.length; var j = 0; for (var i = 0; i < len; i++) { var item = a[i]; if (seen[item] !== 1) { seen[item] = 1; out[j++] = item; } } return out; }; /** * A module that represents a tstagmanager object, a componentTab is a page composition tool. * @{@link https://github.com/typesettin/tstagmanager} * @author Yaw Joseph Etse * @copyright Copyright (c) 2014 Typesettin. All rights reserved. * @license MIT * @constructor tstagmanager * @requires module:events * @requires module:util-extend * @requires module:util * @param {object} options configuration options * @example tstagmanager_id: token(), push_state_support: true, replacecallback: function (data) { console.log(data); }, popcallback: function (data) { console.log(data); }, pushcallback: function (data) { console.log(data); } */ var tstagmanager = function (options) { events.EventEmitter.call(this); var defaultOptions = { element: {}, dataitems: {} }; this.options = extend(defaultOptions, options); this.init = this.__init; this.init(); this.initEventListeners(); // this.addBinder = this._addBinder; }; util.inherits(tstagmanager, events.EventEmitter); tstagmanager.prototype.initEventListeners = function () { var self = this; var handleSearchMenuContentClick = function (e) { var etarget = e.target, newtaxdata = {}; // console.log('before self.options.taxfields[etarget.getAttribute(data-fieldname)]', self.options.taxfields[etarget.getAttribute('data-fieldname')]); if (classie.has(etarget, 'add-taxonomy')) { try { if (!document.querySelector('[name="docid"]') && window.showServerNotification) { window.showServerNotification({ type: 'error', message: 'please save before adding taxonomy' }); } newtaxdata = { _id: etarget.getAttribute('data-id'), id: etarget.getAttribute('data-id'), title: etarget.getAttribute('data-labeltouse'), name: etarget.getAttribute('data-labeltouse'), fileurl: etarget.getAttribute('data-fileurl'), assettype: etarget.getAttribute('data-assettype'), }; if (etarget.getAttribute('data-mappingtype') === 'array') { self.options.taxfields[etarget.getAttribute('data-fieldname')].field_data.push(newtaxdata); } else { self.options.taxfields[etarget.getAttribute('data-fieldname')].field_data = newtaxdata; } } catch (e) { console.error(e); } // console.log('after self.options.taxfields[etarget.getAttribute(data-fieldname)]', self.options.taxfields[etarget.getAttribute('data-fieldname')]); // console.log('handleSearchMenuContentClick e.target', e.target); self.__updateBindie(); } }; var search_menu_callback = function () { var searchhtml = ''; try { self.options.search_menu_content.innerHTML = 'Seaching...'; request .get('/p-admin/content/search') .set('x-csrf-token', document.querySelector('input[name=_csrf]').value) .set('Accept', 'application/json') .withCredentials() .query({ search_entities: self.options.element.getAttribute('data-search-entities'), format: 'json', _csrf: document.querySelector('input[name=_csrf]').value, 'searchall-input': this.value }) .end(function (err, responsedata) { responsedata.body.moment = moment; responsedata.body.capitalize = capitalize; responsedata.body.pluralize = pluralize; responsedata.body.data_tables = data_tables; responsedata.body.taxfields = self.options.taxfields; searchhtml = ejs.render(self.options.search_result_template, responsedata.body); self.options.search_menu_content.innerHTML = searchhtml; // console.log('responsedata.body', responsedata.body); // }); } catch (e) { window.handleUncaughtError(e, 'ajax page error'); } }; var search_filter_select_handler = function () { self.options.element.setAttribute('data-search-entities', this.value); if (this.value.match(/\,/gi)) { self.options.element.setAttribute('placeholder', self.options.element.getAttribute('data-original-placeholder')); } else { self.options.element.setAttribute('placeholder', 'Search ' + pluralize.plural(this.value)); } }; var create_filter_select_handler = function () { window.AdminModal.show('new-' + this.value + '-modal'); self.options.create_filter_select.value = 'default'; }; var tax_prop_container = document.querySelector(self.options.element.getAttribute('data-taxprops-selector')), t; // self.options.element.addEventListener('keydown', debounce(self.search_menu_callback.apply(self), 200), false); tax_prop_container.addEventListener('click', function (e) { var etarget = e.target; if (classie.has(etarget, 'ts-tax-clear-button')) { document.querySelector('#' + etarget.getAttribute('data-span-container')).innerHTML = '<input style="display:none;" type="checkbox" checked="checked" name="' + etarget.getAttribute('data-field-name') + '" value="!!--EMPTY--' + etarget.getAttribute('data-field-mapping-type') + '--EMTPY--!!"/>'; if (self.options.formietosubmit && window.AdminFormies[self.options.formietosubmit]) { window.AdminFormies[self.options.formietosubmit].submit(); } if (etarget.getAttribute('data-field-mapping-type') === 'array') { self.options.taxfields[etarget.getAttribute('data-field-name')].field_data = []; } else { self.options.taxfields[etarget.getAttribute('data-field-name')].field_data = ''; } // self.__updateBindie(); // t = setTimeout(function () { // self.__updateBindie(); // clearTimeout(t); // }, 200); } // console.log('tax_prop_container etarget', etarget); }, false) self.options.element.addEventListener('keyup', debounce(search_menu_callback, 200), false); self.options.search_menu_content.addEventListener('click', handleSearchMenuContentClick, false); self.options.search_filter_select.addEventListener('change', search_filter_select_handler, false); self.options.create_filter_select.addEventListener('change', create_filter_select_handler, false); }; tstagmanager.prototype.__updateBindie = function () { var new_taxfields = this.options.taxfields; this.options.tagmanbindie.update({ data: { taxfields: { taxfields: new_taxfields } } }); }; // var get_data_element_doc = function (options) { // var data = options.data, // ajaxprop = options.ajaxprop, // returnObject = { // id: data._id, // name: data.name, // title: data.title, // checkboxname: ajaxprop, // source_data: options.data // }; // return returnObject; // }; // var get_generic_doc = function (options) { // var dataobjtouse = options.data; // // console.log('dataobjtouse', dataobjtouse); // dataobjtouse.name = (dataobjtouse.username) ? dataobjtouse.username : dataobjtouse.name; // dataobjtouse.title = (dataobjtouse.username) ? dataobjtouse.username : dataobjtouse.title; // return dataobjtouse; // }; /** * sets detects support for history push/pop/replace state and can set initial data * @emits initialized */ tstagmanager.prototype.__init = function () { var initializing = true, bindie_template_element, self = this, inputelement = this.options.element; this.options.search_result_template = document.querySelector(this.options.element.getAttribute('data-searchresults-template-selector')).innerHTML; this.options.presetdata_prefix = this.options.element.getAttribute('data-presetdata-prefix'); this.options.bindie_template_element = document.querySelector(this.options.element.getAttribute('data-taxman-template-selector')); this.options.search_menu_content = document.querySelector(this.options.element.getAttribute('data-searchresults-selector')); this.options.create_filter_select = document.querySelector(this.options.element.getAttribute('data-create-filter-selector')); this.options.search_filter_select = document.querySelector(this.options.element.getAttribute('data-filter-selector')); // this.options.search_entities = this.options.element.getAttribute('data-search-entities').split(','); this.options.search_entities = []; this.options.createable_entities = []; this.options.taxfields = {}; this.options.element.getAttribute('data-taxonomy-fields').split(',').forEach(function (taxfield) { var taxfieldarray = taxfield.split(':'); self.options.taxfields[taxfieldarray[0]] = { field_name: taxfieldarray[0], field_mapping_type: taxfieldarray[1], field_entity_type: taxfieldarray[2], field_media_type: taxfieldarray[3], field_createable: taxfieldarray[4], field_label: taxfieldarray[5] || taxfieldarray[0] }; self.options.search_entities.push(taxfieldarray[2]); if (taxfieldarray[4] === 'createable') { self.options.createable_entities.push(taxfieldarray[2]); } // console.log(self.options.presetdata_prefix + taxfieldarray[0], 'window[self.options.presetdata_prefix + taxfieldarray[0]]', window[self.options.presetdata_prefix + taxfieldarray[0]]); if (window[self.options.presetdata_prefix + taxfieldarray[0]]) { self.options.taxfields[taxfieldarray[0]].field_data = window[self.options.presetdata_prefix + taxfieldarray[0]]; } }); this.options.formietosubmit = (this.options.element.getAttribute('data-ajax-formie') && this.options.element.getAttribute('data-ajax-formie') !== null) ? this.options.element.getAttribute('data-ajax-formie') : false; this.options.tagmanbindie = new Bindie({ ejsdelimiter: '?' }); bindie_template_element = this.options.bindie_template_element; this.options.tagmanbindie.addBinder({ prop: 'taxfields', elementSelector: this.options.element.getAttribute('data-taxprops-selector'), binderType: 'template', binderTemplate: bindie_template_element.innerHTML, binderCallback: function (cbdata) { // console.log('cbdata', cbdata); var successsubmitFunctionString = inputelement.getAttribute('data-bindiecallback'), successfn = window[successsubmitFunctionString]; // is object a function? if (typeof successfn === 'function') { successfn(cbdata); } if (this.options.formietosubmit && initializing === false && window.AdminFormies[this.options.formietosubmit]) { window.AdminFormies[this.options.formietosubmit].submit(); } }.bind(this) }); this.__updateBindie(); //set other elements this.options.search_entities = uniq_fast(this.options.search_entities); this.options.createable_entities = uniq_fast(this.options.createable_entities); this.options.element.setAttribute('data-original-placeholder', this.options.element.getAttribute('placeholder')); this.options.element.setAttribute('data-search-entities', this.options.search_entities.join(',')); var filterselectinnerhtml = '<option value="' + this.options.element.getAttribute('placeholder') + '">Search All</option>'; this.options.search_entities.forEach(function (entity) { filterselectinnerhtml += '<option value="' + entity + '">' + capitalize(pluralize(entity)) + '</option>'; }); this.options.search_filter_select.innerHTML = filterselectinnerhtml; var createselectinnerhtml = '<option value="default">Create new ...</option>'; if (this.options.createable_entities.length < 1) { this.options.create_filter_select.parentElement.style.display = 'none'; } else { this.options.createable_entities.forEach(function (entity) { createselectinnerhtml += '<option value="' + entity + '"> Create new ' + capitalize(entity) + '</option>'; }); this.options.create_filter_select.innerHTML = createselectinnerhtml; } initializing = false; this.emit('initialized'); }; module.exports = tstagmanager;