app/assets/javascripts/components/form_configurable.js
$(function () {
const getFormData = function (elem) {
const form_data = $("#edit_agent, #new_agent").serializeObject();
const attribute = $(elem).data("attribute");
form_data["attribute"] = attribute;
delete form_data["_method"];
return form_data;
};
return (window.initializeFormCompletable = function () {
$("input[role~=validatable], select[role~=validatable]").on(
"change",
(e) => {
const form_data = getFormData(e.currentTarget);
const form_group = $(e.currentTarget).closest(".form-group");
return $.ajax("/agents/validate", {
type: "POST",
data: form_data,
success: (data) => {
form_group.addClass("has-feedback").removeClass("has-error");
form_group.find("span").addClass("hidden");
form_group.find(".glyphicon-ok").removeClass("hidden");
},
error: (data) => {
form_group.addClass("has-feedback").addClass("has-error");
form_group.find("span").addClass("hidden");
form_group.find(".glyphicon-remove").removeClass("hidden");
},
});
}
);
$("input[role~=validatable], select[role~=validatable]").trigger("change");
$.each($("select[role~=completable]"), (i, select) => {
const $select = $(select);
const value = $select.data("value");
const setValue = (value) => {
if (
$select
.find("option")
.toArray()
.some((option) => option.value == value)
) {
$select.val(value).trigger("change");
} else {
$select
.append(new Option(value, value, true, true))
.trigger("change");
}
};
if ($select.data("cacheResponse")) {
const loadData = (data) => {
$select.select2({ data: data, tags: true });
setValue(value);
};
$.ajax("/agents/complete", {
type: "POST",
data: getFormData(select),
success: (data) => loadData(data),
error: (data) =>
loadData([{ id: undefined, text: "Error loading data." }]),
});
} else {
$select.select2({
ajax: {
url: "/agents/complete",
type: "POST",
data: (params) => getFormData(select),
processResults: (data) => ({ results: data }),
},
tags: true,
});
setValue(value);
}
});
$("input[type=radio][role~=form-configurable]").change(function (e) {
const input = $(e.currentTarget)
.parents()
.siblings(
`input[data-attribute=${$(e.currentTarget).data("attribute")}]`
);
if ($(e.currentTarget).val() === "manual") {
input.removeClass("hidden");
} else {
input.val($(e.currentTarget).val());
input.addClass("hidden");
}
});
});
});