JAVASCRIPT   77

forward js

Guest on 22nd June 2022 02:44:33 PM

  1. ;(function($, yl) {
  2.     yl.forwardHandlerRegistry = yl.forwardHandlerRegistry || {};
  3.  
  4.     yl.registerForwardHandler = function(name, handler) {
  5.         yl.forwardHandlerRegistry[name] = handler;
  6.     };
  7.  
  8.     yl.getForwardHandler = function(name) {
  9.         return yl.forwardHandlerRegistry[name];
  10.     };
  11.  
  12.     function getForwardStrategy(element) {
  13.         var checkForCheckboxes = function() {
  14.             var all = true;
  15.             $.each(element, function(ix, e) {
  16.                 if ($(e).attr("type") !== "checkbox") {
  17.                     all = false;
  18.                 }
  19.             });
  20.             return all;
  21.         };
  22.  
  23.         if (element.length === 1 &&
  24.                 element.attr("type") === "checkbox" &&
  25.                 element.attr("value") === undefined) {
  26.             // Single checkbox without 'value' attribute
  27.             // Boolean field
  28.             return "exists";
  29.         } else if (element.length === 1 &&
  30.                 element.attr("multiple") !== undefined) {
  31.             // Multiple by HTML semantics. E. g. multiple select
  32.             // Multiple choice field
  33.             return "multiple";
  34.         } else if (checkForCheckboxes()) {
  35.             // Multiple checkboxes or one checkbox with 'value' attribute.
  36.             // Multiple choice field represented by checkboxes
  37.             return "multiple";
  38.         } else {
  39.             // Other cases
  40.             return "single";
  41.         }
  42.     }
  43.  
  44.     /**
  45.      * Get fields with name `name` relative to `element` with considering form
  46.      * prefixes.
  47.      * @param element the element
  48.      * @param name name of the field
  49.      * @returns jQuery object with found fields or empty jQuery object if no
  50.      * field was found
  51.      */
  52.     yl.getFieldRelativeTo = function(element, name) {
  53.         var prefixes = $(element).getFormPrefixes();
  54.  
  55.         for (var i = 0; i < prefixes.length; i++) {
  56.             var fieldSelector = "[name=" + prefixes[i] + name + "]";
  57.             var field = $(fieldSelector);
  58.  
  59.             if (field.length) {
  60.                 return field;
  61.             }
  62.         }
  63.  
  64.         return $();
  65.     };
  66.  
  67.     /**
  68.      * Get field value which is put to forwarded dictionary
  69.      * @param field the field
  70.      * @returns forwarded value
  71.      */
  72.     yl.getValueFromField = function(field) {
  73.         var strategy = getForwardStrategy(field);
  74.         var serializedField = $(field).serializeArray();
  75.  
  76.         if ((serializedField == false) && ($(field).prop('disabled'))) {
  77.             $(field).prop('disabled', false);
  78.             serializedField = $(field).serializeArray();
  79.             $(field).prop('disabled', true);
  80.         }
  81.  
  82.         var getSerializedFieldElementAt = function (index) {
  83.             // Return serializedField[index]
  84.             // or null if something went wrong
  85.             if (serializedField.length > index) {
  86.                 return serializedField[index];
  87.             } else {
  88.                 return null;
  89.             }
  90.         };
  91.  
  92.         var getValueOf = function (elem) {
  93.             // Return elem.value
  94.             // or null if something went wrong
  95.             if (elem.hasOwnProperty("value") &&
  96.                 elem.value !== undefined
  97.             ) {
  98.                 return elem.value;
  99.             } else {
  100.                 return null;
  101.             }
  102.         };
  103.  
  104.         var getSerializedFieldValueAt = function (index) {
  105.             // Return serializedField[index].value
  106.             // or null if something went wrong
  107.             var elem = getSerializedFieldElementAt(index);
  108.             if (elem !== null) {
  109.                 return getValueOf(elem);
  110.             } else {
  111.                 return null;
  112.             }
  113.         };
  114.  
  115.         if (strategy === "multiple") {
  116.             return serializedField.map(
  117.                 function (item) {
  118.                     return getValueOf(item);
  119.                 }
  120.             );
  121.         } else if (strategy === "exists") {
  122.             return serializedField.length > 0;
  123.         } else {
  124.             return getSerializedFieldValueAt(0);
  125.         }
  126.     };
  127.  
  128.     yl.getForwards = function(element) {
  129.         var forwardElem,
  130.             forwardList,
  131.             forwardedData,
  132.             divSelector,
  133.             form;
  134.         divSelector = "div.dal-forward-conf#dal-forward-conf-for-" +
  135.                 element.attr("id") + ", " +
  136.                 "div.dal-forward-conf#dal-forward-conf-for_" +
  137.                 element.attr("id");
  138.         form = element.length > 0 ? $(element[0].form) : $();
  139.  
  140.         forwardElem =
  141.             form.find(divSelector).find('script');
  142.         if (forwardElem.length === 0) {
  143.             return;
  144.         }
  145.         try {
  146.             forwardList = JSON.parse(forwardElem.text());
  147.         } catch (e) {
  148.             return;
  149.         }
  150.  
  151.         if (!Array.isArray(forwardList)) {
  152.             return;
  153.         }
  154.  
  155.         forwardedData = {};
  156.  
  157.         $.each(forwardList, function(ix, field) {
  158.             var srcName, dstName;
  159.             if (field.type === "const") {
  160.                 forwardedData[field.dst] = field.val;
  161.             } else if (field.type === "self") {
  162.                 if (field.hasOwnProperty("dst")) {
  163.                     dstName = field.dst;
  164.                 } else {
  165.                     dstName = "self";
  166.                 }
  167.                 forwardedData[dstName] = yl.getValueFromField(element);
  168.             } else if (field.type === "field") {
  169.                 srcName = field.src;
  170.                 if (field.hasOwnProperty("dst")) {
  171.                     dstName = field.dst;
  172.                 } else {
  173.                     dstName = srcName;
  174.                 }
  175.                 var forwardedField = yl.getFieldRelativeTo(element, srcName);
  176.  
  177.                 if (!forwardedField.length) {
  178.                     return;
  179.                 }
  180.  
  181.                 forwardedData[dstName] = yl.getValueFromField(forwardedField);
  182.             } else if (field.type === "javascript") {
  183.                 var handler = yl.getForwardHandler(field.handler);
  184.                 forwardedData[field.dst || field.handler] = handler(element);
  185.             }
  186.  
  187.         });
  188.         return JSON.stringify(forwardedData);
  189.     };
  190.  
  191. })(yl.jQuery, yl);

Raw Paste


Login or Register to edit or fork this paste. It's free.