diff --git a/app/assets/javascripts/exercises.js.erb b/app/assets/javascripts/exercises.js similarity index 80% rename from app/assets/javascripts/exercises.js.erb rename to app/assets/javascripts/exercises.js index 95decf1e..5b027258 100644 --- a/app/assets/javascripts/exercises.js.erb +++ b/app/assets/javascripts/exercises.js @@ -1,9 +1,10 @@ $(function() { var ACE_FILES_PATH = '/assets/ace/'; - var EXECUTION_ENVIRONMENTS = <%= ExecutionEnvironment.where('file_type_id IS NOT NULL').select(:file_type_id, :id).to_json %>; - var FILE_TYPES = <%= FileType.where('file_extension IS NOT NULL').map { |file_type| [file_type.file_extension, file_type.id] }.to_h.to_json %>; var TAB_KEY_CODE = 9; + var execution_environments; + var file_types; + var addFileForm = function(event) { event.preventDefault(); var element = $('#dummies').children().first().clone(); @@ -27,10 +28,16 @@ $(function() { }); }; + var findFileTypeByFileExtension = function(file_extension) { + return _.find(file_types, function(file_type) { + return file_type.file_extension === file_extension; + }) || {}; + }; + var getSelectedExecutionEnvironment = function() { - return _.find(EXECUTION_ENVIRONMENTS, function(execution_environment) { + return _.find(execution_environments, function(execution_environment) { return execution_environment.id === parseInt($('#exercise_execution_environment_id').val()); - }, this); + }); }; var highlightCode = function() { @@ -42,10 +49,12 @@ $(function() { var inferFileAttributes = function() { $(document).on('change', 'input[type="file"]', function(event) { var filename = $(this).val().split(/\\|\//g).pop(); - var file_type_id = FILE_TYPES['.' + filename.split('.')[1]]; + var file_extension = '.' + filename.split('.')[1]; + var file_type = findFileTypeByFileExtension(file_extension); + var name = filename.split('.')[0]; var parent = $(this).parents('li'); - parent.find('input[name*="name"]').val(filename.split('.')[0]); - parent.find('select[name*="file_type_id"]').val(file_type_id).trigger('chosen:updated'); + parent.find('input[name*="name"]').val(name); + parent.find('select[name*="file_type_id"]').val(file_type.id).trigger('chosen:updated'); }); }; @@ -85,6 +94,8 @@ $(function() { if ($.isController('exercises')) { if ($('.edit_exercise, .new_exercise').isPresent()) { + execution_environments = $('form').data('execution-environments'); + file_types = $('form').data('file-types'); new MarkdownEditor('#exercise_instructions'); enableInlineFileCreation(); inferFileAttributes(); diff --git a/app/models/file_type.rb b/app/models/file_type.rb index 87c34087..e9d92fb2 100644 --- a/app/models/file_type.rb +++ b/app/models/file_type.rb @@ -24,9 +24,9 @@ class FileType < ActiveRecord::Base end def set_default_values - self.binary ||= false - self.executable ||= false - self.renderable ||= false + self.binary ||= false if has_attribute?(:binary) + self.executable ||= false if has_attribute?(:executable) + self.renderable ||= false if has_attribute?(:renderable) end private :set_default_values diff --git a/app/views/exercises/_form.html.slim b/app/views/exercises/_form.html.slim index 366295e4..32365e4a 100644 --- a/app/views/exercises/_form.html.slim +++ b/app/views/exercises/_form.html.slim @@ -1,4 +1,7 @@ -= form_for(@exercise, multipart: true) do |f| +- execution_environments = ExecutionEnvironment.where('file_type_id IS NOT NULL').select(:file_type_id, :id) +- file_types = FileType.where('file_extension IS NOT NULL').select(:file_extension, :id) + += form_for(@exercise, data: {execution_environments: execution_environments, file_types: file_types}, multipart: true) do |f| = render('shared/form_errors', object: @exercise) .form-group = f.label(:title)