mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-11-04 01:12:08 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			192 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			192 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
;(function($, yl) {
 | 
						|
    yl.forwardHandlerRegistry = yl.forwardHandlerRegistry || {};
 | 
						|
 | 
						|
    yl.registerForwardHandler = function(name, handler) {
 | 
						|
        yl.forwardHandlerRegistry[name] = handler;
 | 
						|
    };
 | 
						|
 | 
						|
    yl.getForwardHandler = function(name) {
 | 
						|
        return yl.forwardHandlerRegistry[name];
 | 
						|
    };
 | 
						|
 | 
						|
    function getForwardStrategy(element) {
 | 
						|
        var checkForCheckboxes = function() {
 | 
						|
            var all = true;
 | 
						|
            $.each(element, function(ix, e) {
 | 
						|
                if ($(e).attr("type") !== "checkbox") {
 | 
						|
                    all = false;
 | 
						|
                }
 | 
						|
            });
 | 
						|
            return all;
 | 
						|
        };
 | 
						|
 | 
						|
        if (element.length === 1 &&
 | 
						|
                element.attr("type") === "checkbox" &&
 | 
						|
                element.attr("value") === undefined) {
 | 
						|
            // Single checkbox without 'value' attribute
 | 
						|
            // Boolean field
 | 
						|
            return "exists";
 | 
						|
        } else if (element.length === 1 &&
 | 
						|
                element.attr("multiple") !== undefined) {
 | 
						|
            // Multiple by HTML semantics. E. g. multiple select
 | 
						|
            // Multiple choice field
 | 
						|
            return "multiple";
 | 
						|
        } else if (checkForCheckboxes()) {
 | 
						|
            // Multiple checkboxes or one checkbox with 'value' attribute.
 | 
						|
            // Multiple choice field represented by checkboxes
 | 
						|
            return "multiple";
 | 
						|
        } else {
 | 
						|
            // Other cases
 | 
						|
            return "single";
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get fields with name `name` relative to `element` with considering form
 | 
						|
     * prefixes.
 | 
						|
     * @param element the element
 | 
						|
     * @param name name of the field
 | 
						|
     * @returns jQuery object with found fields or empty jQuery object if no
 | 
						|
     * field was found
 | 
						|
     */
 | 
						|
    yl.getFieldRelativeTo = function(element, name) {
 | 
						|
        var prefixes = $(element).getFormPrefixes();
 | 
						|
 | 
						|
        for (var i = 0; i < prefixes.length; i++) {
 | 
						|
            var fieldSelector = "[name=" + prefixes[i] + name + "]";
 | 
						|
            var field = $(fieldSelector);
 | 
						|
 | 
						|
            if (field.length) {
 | 
						|
                return field;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return $();
 | 
						|
    };
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get field value which is put to forwarded dictionary
 | 
						|
     * @param field the field
 | 
						|
     * @returns forwarded value
 | 
						|
     */
 | 
						|
    yl.getValueFromField = function(field) {
 | 
						|
        var strategy = getForwardStrategy(field);
 | 
						|
        var serializedField = $(field).serializeArray();
 | 
						|
 | 
						|
        if ((serializedField == false) && ($(field).prop('disabled'))) {
 | 
						|
            $(field).prop('disabled', false);
 | 
						|
            serializedField = $(field).serializeArray();
 | 
						|
            $(field).prop('disabled', true);
 | 
						|
        }
 | 
						|
 | 
						|
        var getSerializedFieldElementAt = function (index) {
 | 
						|
            // Return serializedField[index]
 | 
						|
            // or null if something went wrong
 | 
						|
            if (serializedField.length > index) {
 | 
						|
                return serializedField[index];
 | 
						|
            } else {
 | 
						|
                return null;
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        var getValueOf = function (elem) {
 | 
						|
            // Return elem.value
 | 
						|
            // or null if something went wrong
 | 
						|
            if (elem.hasOwnProperty("value") &&
 | 
						|
                elem.value !== undefined
 | 
						|
            ) {
 | 
						|
                return elem.value;
 | 
						|
            } else {
 | 
						|
                return null;
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        var getSerializedFieldValueAt = function (index) {
 | 
						|
            // Return serializedField[index].value
 | 
						|
            // or null if something went wrong
 | 
						|
            var elem = getSerializedFieldElementAt(index);
 | 
						|
            if (elem !== null) {
 | 
						|
                return getValueOf(elem);
 | 
						|
            } else {
 | 
						|
                return null;
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        if (strategy === "multiple") {
 | 
						|
            return serializedField.map(
 | 
						|
                function (item) {
 | 
						|
                    return getValueOf(item);
 | 
						|
                }
 | 
						|
            );
 | 
						|
        } else if (strategy === "exists") {
 | 
						|
            return serializedField.length > 0;
 | 
						|
        } else {
 | 
						|
            return getSerializedFieldValueAt(0);
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
    yl.getForwards = function(element) {
 | 
						|
        var forwardElem,
 | 
						|
            forwardList,
 | 
						|
            forwardedData,
 | 
						|
            divSelector,
 | 
						|
            form;
 | 
						|
        divSelector = "div.dal-forward-conf#dal-forward-conf-for-" +
 | 
						|
                element.attr("id") + ", " +
 | 
						|
                "div.dal-forward-conf#dal-forward-conf-for_" +
 | 
						|
                element.attr("id");
 | 
						|
        form = element.length > 0 ? $(element[0].form) : $();
 | 
						|
 | 
						|
        forwardElem =
 | 
						|
            form.find(divSelector).find('script');
 | 
						|
        if (forwardElem.length === 0) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        try {
 | 
						|
            forwardList = JSON.parse(forwardElem.text());
 | 
						|
        } catch (e) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        if (!Array.isArray(forwardList)) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        forwardedData = {};
 | 
						|
 | 
						|
        $.each(forwardList, function(ix, field) {
 | 
						|
            var srcName, dstName;
 | 
						|
            if (field.type === "const") {
 | 
						|
                forwardedData[field.dst] = field.val;
 | 
						|
            } else if (field.type === "self") {
 | 
						|
                if (field.hasOwnProperty("dst")) {
 | 
						|
                    dstName = field.dst;
 | 
						|
                } else {
 | 
						|
                    dstName = "self";
 | 
						|
                }
 | 
						|
                forwardedData[dstName] = yl.getValueFromField(element);
 | 
						|
            } else if (field.type === "field") {
 | 
						|
                srcName = field.src;
 | 
						|
                if (field.hasOwnProperty("dst")) {
 | 
						|
                    dstName = field.dst;
 | 
						|
                } else {
 | 
						|
                    dstName = srcName;
 | 
						|
                }
 | 
						|
                var forwardedField = yl.getFieldRelativeTo(element, srcName);
 | 
						|
 | 
						|
                if (!forwardedField.length) {
 | 
						|
                    return;
 | 
						|
                }
 | 
						|
 | 
						|
                forwardedData[dstName] = yl.getValueFromField(forwardedField);
 | 
						|
            } else if (field.type === "javascript") {
 | 
						|
                var handler = yl.getForwardHandler(field.handler);
 | 
						|
                forwardedData[field.dst || field.handler] = handler(element);
 | 
						|
            }
 | 
						|
 | 
						|
        });
 | 
						|
        return JSON.stringify(forwardedData);
 | 
						|
    };
 | 
						|
 | 
						|
})(yl.jQuery, yl);
 |