form_configurable.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. $(function () {
  2. const getFormData = function (elem) {
  3. const form_data = $("#edit_agent, #new_agent").serializeObject();
  4. const attribute = $(elem).data("attribute");
  5. form_data["attribute"] = attribute;
  6. delete form_data["_method"];
  7. return form_data;
  8. };
  9. return (window.initializeFormCompletable = function () {
  10. let returnedResults = {};
  11. const completableDefaultOptions = (input) => ({
  12. results: [
  13. returnedResults[$(input).data("attribute")] || {
  14. text: "Options",
  15. children: [{ id: undefined, text: "loading ..." }],
  16. },
  17. {
  18. text: "Current",
  19. children: [{ id: $(input).val(), text: $(input).val() }],
  20. },
  21. {
  22. text: "Custom",
  23. children: [{ id: "manualInput", text: "manual input" }],
  24. },
  25. ],
  26. });
  27. $("input[role~=validatable], select[role~=validatable]").on(
  28. "change",
  29. (e) => {
  30. const form_data = getFormData(e.currentTarget);
  31. const form_group = $(e.currentTarget).closest(".form-group");
  32. return $.ajax("/agents/validate", {
  33. type: "POST",
  34. data: form_data,
  35. success: (data) => {
  36. form_group.addClass("has-feedback").removeClass("has-error");
  37. form_group.find("span").addClass("hidden");
  38. form_group.find(".glyphicon-ok").removeClass("hidden");
  39. return (returnedResults = {});
  40. },
  41. error: (data) => {
  42. form_group.addClass("has-feedback").addClass("has-error");
  43. form_group.find("span").addClass("hidden");
  44. form_group.find(".glyphicon-remove").removeClass("hidden");
  45. return (returnedResults = {});
  46. },
  47. });
  48. }
  49. );
  50. $("input[role~=validatable], select[role~=validatable]").trigger("change");
  51. $.each($("input[role~=completable]"), (i, input) =>
  52. $(input)
  53. .select2({
  54. data: () => completableDefaultOptions(input),
  55. })
  56. .on("change", function (e) {
  57. if (e.added && e.added.id === "manualInput") {
  58. $(e.currentTarget).select2("destroy");
  59. return $(e.currentTarget).val(e.removed.id);
  60. }
  61. })
  62. );
  63. const updateDropdownData = function (form_data, element, data) {
  64. returnedResults[form_data.attribute] = {
  65. text: "Options",
  66. children: data,
  67. };
  68. $(element).trigger("change");
  69. $("input[role~=completable]").off(
  70. "select2-opening",
  71. select2OpeningCallback
  72. );
  73. $(element).select2("open");
  74. return $("input[role~=completable]").on(
  75. "select2-opening",
  76. select2OpeningCallback
  77. );
  78. };
  79. var select2OpeningCallback = function (e) {
  80. const form_data = getFormData(e.currentTarget);
  81. if (
  82. returnedResults[form_data.attribute] &&
  83. !$(e.currentTarget).data("cacheResponse")
  84. ) {
  85. delete returnedResults[form_data.attribute];
  86. }
  87. if (returnedResults[form_data.attribute]) {
  88. return;
  89. }
  90. return $.ajax("/agents/complete", {
  91. type: "POST",
  92. data: form_data,
  93. success: (data) => {
  94. return updateDropdownData(form_data, e.currentTarget, data);
  95. },
  96. error: (data) => {
  97. return updateDropdownData(form_data, e.currentTarget, [
  98. { id: undefined, text: "Error loading data." },
  99. ]);
  100. },
  101. });
  102. };
  103. $("input[role~=completable]").on("select2-opening", select2OpeningCallback);
  104. return $("input[type=radio][role~=form-configurable]").change(function (e) {
  105. const input = $(e.currentTarget)
  106. .parents()
  107. .siblings(
  108. `input[data-attribute=${$(e.currentTarget).data("attribute")}]`
  109. );
  110. if ($(e.currentTarget).val() === "manual") {
  111. return input.removeClass("hidden");
  112. } else {
  113. input.val($(e.currentTarget).val());
  114. return input.addClass("hidden");
  115. }
  116. });
  117. });
  118. });