Skip to content

Commit

Permalink
Add option to validate file extension
Browse files Browse the repository at this point in the history
  • Loading branch information
JoaoFelipe committed Nov 5, 2023
1 parent 0df331a commit c80f4b5
Show file tree
Hide file tree
Showing 9 changed files with 96 additions and 21 deletions.
7 changes: 7 additions & 0 deletions app/assets/javascripts/form_fields/config_base.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,13 @@ function form_field_config_base(form_field) {
form_field.widgets = [
config_form_field_checkbox(form_field, "required"),
]
} else if (selected_value == "file" ) {
form_field.widgets = [
config_form_field_checkbox(form_field, "required"),
config_form_field_values_sql(form_field, "values", {
label: "extensions"
}),
]
} else if (selected_value == "string") {
form_field.widgets = [
config_form_field_checkbox(form_field, "required"),
Expand Down
3 changes: 3 additions & 0 deletions app/assets/javascripts/form_fields/config_student.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ function config_form_field_student(form_field, field) {
field_type = "residency"
} else if (selected_value == "special_majors") {
field_type = "scholarity"
} else if (selected_value == "photo") {
field_type = "file"
show_notice = false;
} else {
show_notice = false;
}
Expand Down
14 changes: 11 additions & 3 deletions app/models/admissions/filled_form_field.rb
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def that_value_follows_configuration_rules
when Admissions::FormField::SINGLE_CHECKBOX
nil
when Admissions::FormField::FILE
validate_file_required(configuration)
validate_file_field(configuration)
when Admissions::FormField::TEXT
validate_value_required(configuration)
when Admissions::FormField::STUDENT_FIELD
Expand Down Expand Up @@ -114,7 +114,7 @@ def validate_collection_checkbox(configuration)

def validate_student_field(configuration)
if configuration["field"] == "photo"
validate_file_required(configuration)
validate_file_field(configuration, is_photo: true)
elsif ["special_city", "special_birth_city"].include? configuration["field"]
validate_city_field(configuration)
elsif configuration["field"] == "special_address"
Expand Down Expand Up @@ -157,10 +157,18 @@ def validate_value_required(configuration)
end
end

def validate_file_required(configuration)
def validate_file_field(configuration, is_photo: false)
if configuration["required"] && (self.file.blank? || self.file.file.blank?)
add_error(:blank)
end
if configuration["values"] && !(self.file.blank? || self.file.file.blank?)
values = configuration["values"].dup
values << ".jpg" if is_photo
filename = self.file.filename.downcase
if values.none? { |ext| filename.end_with?(ext.downcase) }
add_error(:extension, valid: configuration["values"].join(', '))
end
end
end

def to_label
Expand Down
39 changes: 31 additions & 8 deletions app/views/admissions/filled_form/edit/_as_student_photo.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -32,18 +32,41 @@
$(document).ready(function() {
carrierwave_webcam(".webcam-photo")

function validateFile(file) {
if (!file) {
return "";
}
if (file.size > 15 * 1024 * 1024) {
return `<%= form_field.name %> <%= I18n.t(
"activerecord.errors.models.admissions/filled_form_field.filesize",
count: 15) %>`
}
<% if configuration["values"] %>
<%
extensions = configuration["values"].dup
extensions << ".jpg"
%>
let filename = file.name.toLowerCase();
let extensions = <%= raw extensions.to_json %>;
if (!extensions.some((ext) => filename.endsWith(ext.toLowerCase()))) {
return `<%= form_field.name %> <%= I18n.t(
"activerecord.errors.models.admissions/filled_form_field.extension",
valid: configuration["values"].join(', ')) %>`
}
<% end %>
return "" ;
}

window.customFormValidations.push(function() {
let input = $(`#<%= file_id %> input[type="file"]`).get(0)
if (input.files[0] && (input.files[0].size > 15 * 1024 * 1024)) {
input.setCustomValidity(`<%= form_field.name %> <%= I18n.t(
"activerecord.errors.models.admissions/filled_form_field.filesize",
count: 15) %>`)
input.reportValidity()
return false;
} else {
input.setCustomValidity("");
error_msg = validateFile(input.files[0]);
input.setCustomValidity(error_msg);
if (error_msg != "") {
input.reportValidity()
return false;
}
return true;
})

});
</script>
38 changes: 30 additions & 8 deletions app/views/admissions/filled_form/edit/_generic_file_field.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,38 @@

<script>
$(document).ready(function() {

function validateFile(file) {
if (!file) {
return "";
}
if (file.size > 15 * 1024 * 1024) {
return `<%= form_field.name %> <%= I18n.t(
"activerecord.errors.models.admissions/filled_form_field.filesize",
count: 15) %>`
}
<% if configuration["values"] %>
<%
extensions = configuration["values"]
%>
let filename = file.name.toLowerCase();
let extensions = <%= raw extensions.to_json %>;
if (!extensions.some((ext) => filename.endsWith(ext.toLowerCase()))) {
return `<%= form_field.name %> <%= I18n.t(
"activerecord.errors.models.admissions/filled_form_field.extension",
valid: configuration["values"].join(', ')) %>`
}
<% end %>
return "" ;
}

window.customFormValidations.push(function() {
let input = $(`#<%= file_id %> input[type="file"]`).get(0)
if (input.files[0] && (input.files[0].size > 15 * 1024 * 1024)) {
input.setCustomValidity(`<%= form_field.name %> <%= I18n.t(
"activerecord.errors.models.admissions/filled_form_field.filesize",
count: 15) %>`)
input.reportValidity()
return false;
} else {
input.setCustomValidity("");
error_msg = validateFile(input.files[0]);
input.setCustomValidity(error_msg);
if (error_msg != "") {
input.reportValidity()
return false;
}
return true;
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@
"<%= Admissions::FormField::RADIO %>": "radio",
"<%= Admissions::FormField::COLLECTION_CHECKBOX %>": "collection_checkbox",
"<%= Admissions::FormField::SINGLE_CHECKBOX %>": "single_checkbox",
"<%= Admissions::FormField::FILE %>": "requirable",
"<%= Admissions::FormField::FILE %>": "file",
"<%= Admissions::FormField::TEXT %>": "text",
"<%= Admissions::FormField::STUDENT_FIELD %>": "student_field",
"<%= Admissions::FormField::CITY %>": "city",
Expand Down
6 changes: 6 additions & 0 deletions app/views/admissions/form_templates/preview.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,12 @@
$(document).ready(function() {
$("#submit").click(function(e){
window.onbeforeunload = null;
for (let validation of window.customFormValidations) {
if (!validation()) {
e.preventDefault();
return false;
}
}
})
});
</script>
3 changes: 2 additions & 1 deletion config/locales/admissions/filled_form_field.pt-BR.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,5 @@ pt-BR:
country_blank: "- País não pode ficar em branco"
street_blank: "- Logradouro não pode ficar em branco"
number_blank: "- Número não pode ficar em branco"
scholarity_blank: "- %{attr} não pode ficar em branco"
scholarity_blank: "- %{attr} não pode ficar em branco"
extension: "possui extensão inválida. Opções permitidas: %{valid}"
5 changes: 5 additions & 0 deletions config/locales/admissions/form_field.pt-BR.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,11 @@ pt-BR:
add: Adicionar nível
levels_use_sql: Popular níveis com SQL
levels_sql: Níveis (SQL)
extensions:
title: Extensões permitidas
add: Adicionar extensão
extensions_use_sql: Popular extensões permitidas com SQL
extensions_sql: Extensões (SQL)
minselection: Quantidade mínima
maxselection: Quantidade máxima
default_values:
Expand Down

0 comments on commit c80f4b5

Please sign in to comment.