No Description

forward.js 6.0KB

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