⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 conditional_simple_edit.js.tmp

📁 PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。
💻 TMP
字号:
/* Model Functions * * Perform various and sundry operations on the edit-page. */var target_url = '/plugins/ktcore/admin/ajaxSimpleConditionals.php';function getTargetUrl() {    var base = getElement('kt-core-baseurl');    return base.value + target_url;}/** Simple edit: HTML helper functions */function getConditionalTable() {    return getElement('simple_conditional_edit');}// returns the td element representing the row, for use as Parent.function getColumnForField(field_id) {    return getElement('md_'+field_id);}function getButtonsForField(field_id) {    return getElement('buttons_'+field_id);}function getNameForField(field_id) {    var h = getElement('header_'+field_id);    //alert(field_id);    return scrapeText(h);}function getFieldIdFromColumn(column) {    return column.id.substr(3,column.id.length);}// takes "active_fields[]".  sets both sets to "active"// triggered by the "edit button" and its respective callbacks.function setActiveFields(active_fields) {    var fixed_field = current_fixed;    // stored and managed by pushUndoStack.    for (var i=0; i<active_fields.length; i++) {        var column = getColumnForField(active_fields[i]);        setElementClass(column, 'active');    }}// takes a field, and sets all items in active_lookups to be active.  other items are deleted.// active_lookups should map to the _values_ of the <option>'s.function setActiveLookupsForField(field_id, active_lookups) {    simpleLog('DEBUG','function setActiveLookupsForField called with '+active_lookups.length+' items');    var column = getColumnForField(field_id);    // Use an Object as a new associative array.    var active_hash = new Object;    for (var i=0; i<active_lookups.length; i++) {        active_hash[active_lookups[i]] = 1; // everything else is undef.    }    var item_list = getElementsByTagAndClassName('SELECT','item_list',column)[0];      // FIXME check for failure.    for (var i=0; i<item_list.options.length; i++) {        var option = item_list.options[i];        option.selected = false;        if (active_hash[option.value]) {            option.selected = true;        }    }}// check in all active (non-edit) fields for lookup_values that are active.// returns a NESTED array (field_id => array('value'))// to make the backend a tad simpler.function getActiveLookups() {    simpleLog('DEBUG','getActiveLookups called');    // first get all edit columns    var rootItem = getConditionalTable();    var potential_sources = getElementsByTagAndClassName('TD','active',rootItem);    if (potential_sources.length == 0) {        simpleLog('ERROR','no active fields located.');        return null;    }    var active_lookups = Array();    for (var i=0; i<potential_sources.length; i++) {        var column = potential_sources[i];        if (!hasElementClass(column, 'editing')) {            var item_list = getElementsByTagAndClassName('SELECT','item_list',column)[0];   // FIXME catch potential failure here (pathalogical)            var field_id = getFieldIdFromColumn(column);            simpleLog('DEBUG','found non-fixed active column-set ('+field_id+')');            active_lookups[field_id] = Array();            for (var j=0; j<item_list.options.length; j++) {                if (item_list.options[j].selected == true) {                    active_lookups[field_id].push(item_list.options[j].value);                }            }        }    }    return active_lookups;}/** Simple edit: AJAX component */// extract the "fixed" field, and identify which fields (if any) are active.function updateActiveFields() {   simpleLog('DEBUG','function updateActiveFields called.');   var req = getXMLHttpRequest();   req.open('GET',getTargetUrl()+'?action=updateActiveFields&active_field='+current_fixed, true);   var deferred = sendXMLHttpRequest(req);   deferred.addCallback(do_updateActiveFields);   deferred.addErrback(partial(do_handleAjaxError, 'updateActiveFields'));}function do_handleAjaxError(err_source, err) {    simpleLog('ERROR','AJAX function "'+err_source+'" failed with: \n'+repr(err));}// from a selected_lookup, get the fixed_field and pass through, getting the items that selection currently activates.function updateActiveLookups(selected_lookup, lookup_label) {   simpleLog('DEBUG','function updateActiveLookups called.');   var req = getXMLHttpRequest();   req.open('GET',getTargetUrl()+'?action=updateActiveLookups&active_field='+current_fixed+'&selected_lookup='+selected_lookup, true);   var deferred = sendXMLHttpRequest(req);   deferred.addCallback(partial(do_updateActiveLookups, lookup_label));   deferred.addErrback(partial(do_handleAjaxError, 'updateActiveLookups'));}// send a "save" request to the backend, asking it to make the child_lookups the only items parented// to the selected_lookup (include field_id for selected, and fieldset).function storeRelationship(selected_lookup, child_lookups) {  var formKeys = Array();  var formValues = Array();  // action  formKeys.push('action');  formValues.push('storeRelationship');  var fieldset_id = getElement('global-fieldset-id').value;  formKeys.push('fieldset_id');  formValues.push(fieldset_id);  // which parent_field  formKeys.push('parent_field');  formValues.push(current_fixed);  // which parent_field  formKeys.push('parent_lookup');  formValues.push(selected_lookup);  // add children to the form.  for (var i=0; i<child_lookups.length; i++) {        if (child_lookups[i]) {     // catch undefined items            for (var j=0; j<child_lookups[i].length; j++) {                formKeys.push('child_lookups['+i+'][]');        // field_id and append.                formValues.push(child_lookups[i][j]);            }        }  }  var POSTval = queryString(formKeys, formValues);  simpleLog('DEBUG','query from storeRelationship: \n'+POSTval);  var req = getXMLHttpRequest();  req.open('POST', getTargetUrl(), true);  req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');  var deferred = sendXMLHttpRequest(req, POSTval);  // inform the user that something has happened.  // FIXME this isn't i18n friendly.  addInformationNote(_('Dependencies saved. (at ') + new Date() + ')');  deferred.addCallback(do_updateActiveLookups);  deferred.addErrback(partial(do_handleAjaxError, 'storeRelationship'));}function addInformationNote(message) {  // this is _NOT_ the best way to handle this ...  var dynamicMessage = getElement('condy-simple-notice');  if (dynamicMessage == null) {    dynamicMessage = DIV({'id':'condy-simple-notice','class':'ktInfo'},null);    var contentBox = getElement('content');    var secondHeaders = contentBox.getElementsByTagName('h2'); // should only be one.    var sH = secondHeaders[0];    contentBox.insertBefore(dynamicMessage, sH);  }  var newStr = createDOM('P',null,message);  replaceChildNodes(dynamicMessage, newStr);}// receives a very simple list of fields.function do_updateActiveFields(req) {   simpleLog('DEBUG','AJAX function do_updateActiveFields triggered');   var active_fields = Array();   var incoming_fields = req.responseXML.getElementsByTagName('active');   for (var i=0; i<incoming_fields.length; i++) {        active_fields.push(incoming_fields[i].getAttribute('field_id'));   }   simpleLog('DEBUG','do_updateActiveFields found active fields: '+repr(active_fields));   setActiveFields(active_fields);}// should receive a simple-enough set of "field" elements,// filled with "lookup" items.function do_updateActiveLookups(label, req) {   simpleLog('DEBUG','AJAX function do_updateActiveLookups triggered');   var active_fields = Array();   var incoming_fields = req.responseXML.getElementsByTagName('field');   for (var i=0; i<incoming_fields.length; i++) {        var field = incoming_fields[i];        var field_id = field.getAttribute('field_id');        simpleLog('DEBUG','found field: '+field_id);        var infoset = {'field_id':field_id, 'lookups':new Array()};        var active_lookups = field.getElementsByTagName('lookup');        simpleLog('DEBUG',typeof(active_lookups)+' ');        for (var j=0; j < active_lookups.length; j++) {            infoset.lookups.push(active_lookups[j].getAttribute('lookup_id'));        }        active_fields.push(infoset);   }   simpleLog('DEBUG','do_updateActiveLookups found active fields count: '+repr(active_fields.length));   for (var i=0; i<active_fields.length; i++) {        if (active_fields[i]) { // e.g. not undefined.            simpleLog('DEBUG','lookups contain['+i+']: '+active_fields[i].field_id+' - '+active_fields[i].lookups);            setActiveLookupsForField(active_fields[i].field_id, active_fields[i].lookups);        }   }   addInformationNote(_('Dependencies for value "')+label+('" loaded.(at ') + new Date() + ')');}/** Simple edit: JS model */function setExclusiveEditing(field_id) {    var rootItem = getConditionalTable();    var columns = rootItem.getElementsByTagName('TD');    for (var i=0; i<columns.length; i++) {        var col = columns[i];        if (hasElementClass(col, "buttonset")) { setElementClass(col, 'buttonset inactive'); }        else {            setElementClass(columns[i], 'inactive');            var item_list = getElementsByTagAndClassName('SELECT','item_list',columns[i])[0];   // FIXME catch potential failure here (pathalogical)            item_list.multiple=true;            updateNodeAttributes(item_list, {'onchange':null});        }    }    // get the "right" column.    var column = getColumnForField(field_id);    simpleLog('DEBUG','setExclusiveEditing found column' + column + ' for id ' + field_id);    setElementClass(column, 'active editing');    var item_list = getElementsByTagAndClassName('SELECT','item_list',column)[0];   // FIXME catch potential failure here (pathalogical)    item_list.multiple = false;    updateNodeAttributes(item_list, {'onchange':partial(handleChangedSelection, field_id, item_list)});    var buttons = getButtonsForField(field_id);    setElementClass(buttons, 'buttonset active editing');    simpleLog('ERROR','setExclusiveEditing needs to alter the options so nothing is selected.');}function editSimpleField(field_id) {    simpleLog('DEBUG','function editSimpleField called.');    // this needs to:    //   - make the selected field_id the _only_ editing column.    //     (remember to reset multiple on the previously-editable column    //   - make the selected field_id's item_list a singular one.    // push the stack.    pushUndoStack(field_id);    // set everything to inactive, except the chosen field.    setExclusiveEditing(field_id);    updateActiveFields(); // trigger an update of the backend.    // rest is asynchronous.    addInformationNote(_('Now editing field "')+getNameForField(field_id)+'".');}// extract the currently active lookup, and pass though.function saveSimpleField(field_id) {    simpleLog('DEBUG','saveSimpleField called with field '+field_id);    var column = getColumnForField(field_id);    var item_list_select = getElementsByTagAndClassName('SELECT','item_list', column);    if (item_list_select.length == 0) {        simpleLog('ERROR','no item_list select found in field '+field_id);        return false;    }    // else    var selected_lookup = item_list_select[0].value;    simpleLog('DEBUG','extracted selected lookup of '+selected_lookup);    // get the active items.    var active_lookups = getActiveLookups();    if (active_lookups == null) {        simpleLog('DEBUG','no selected items found in dependant columns.  NOT saving.');        return false;    }    storeRelationship(selected_lookup, active_lookups);}function finishSimpleField(field_id) {    popUndoStack();}// called when a single-view dropdown is activated.function handleChangedSelection(field_id, select_input) {    addInformationNote(_('Loading Dependencies for value "')+scrapeText(select_input.options[select_input.selectedIndex])+'"(at ' + new Date() + ')');    updateActiveLookups(select_input.value, scrapeText(select_input.options[select_input.selectedIndex]));    // handles everything for us.}// push onto the "fixed" stack the field which is being edited at the moment.// gracefully handles multiple-calls, ensuring non-immediate replication// of entries.var undoStack = Array();        // stores the field_ids.var current_fixed = null;       // current fixed.  saves a bit of time...function pushUndoStack(field_id) {    current_fixed = field_id;    return false;    simpleLog('DEBUG','untested function pushUndoStack called.');    if (current_fixed == null) {        current_fixed = field_id;        return false;        // pre-initialisation.    }    if (undoStack.length == 0) {        undoStack.push(current_fixed);    } else if (undoStack[undoStack.length-1] != field_id) {        undoStack.push(current_fixed);    } else {        return false; // pass    }    simpleLog('DEBUG','undoStack is now: '+repr(undoStack));    current_fixed=field_id;}function popUndoStack() {    simpleLog('DEBUG','function popUndoStack called.');    if (undoStack.length == 0 ) {        simpleLog('ERROR','undo stack popped at 0.  This should be impossible');        return false;    }    var targetFixed = undoStack.pop();    current_fixed = targetFixed;    setExclusiveEditing(targetFixed);    updateActiveFields(); // trigger an update of the backend.    if (undoStack.length == 0) {        undoStack.push(targetFixed);        simpleLog('ERROR','undo stack popped to 0, re-pushing this last item. ');    }    simpleLog('DEBUG','undoStack is now: '+repr(undoStack));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -