h1 => @exercise ' (external user = link_to_if(policy(@external_user).show?, @external_user.displayname, @external_user) ' ) - submissions = @all_events.filter {|event| event.is_a? Submission } - current_submission = submissions.first - if current_submission - all_files = [] - file_types = Set.new - submissions.each do |submission| - submission.files.each do |file| - file_types.add(ActiveSupport::JSON.encode(file.file_type)) - all_files.push(submission.files) - all_files.compact_blank! - file_types.reject!(&:blank?) # rubocop:disable Rails/CompactBlank because it's a set .d-none#data data-submissions=ActiveSupport::JSON.encode(submissions) data-files=ActiveSupport::JSON.encode(all_files) data-file-types=ActiveSupport::JSON.encode(file_types) #stats-editor.row - index = 0 - all_files.each do |files| .files class=(@exercise.hide_file_tree ? 'd-none col-sm-3' : 'col-sm-3') data-index=index data-entries=FileTree.new(files).to_js_tree_in_json - index += 1 div class=(@exercise.hide_file_tree ? 'col-sm-12' : 'col-sm-9') #current-file.editor .flex-container button.btn.btn-secondary#play-button span.fa-solid.fa-play #submissions-slider.flex-item input.w-100 type='range' orient='horizontal' list='datapoints' value=0 min=0 max=all_files.length - 1 datalist#datapoints - index = 0 - submissions.each do |submission| - next if submission.files.blank? option data-submission=submission = index - index += 1 - if policy(@exercise).detailed_statistics? .bg-body-secondary.w-100.p-2.mb-4.align-items-center.d-flex.justify-content-between - if @show_autosaves span.ps-1.pb-1 i.fa-solid.fa-circle-info.align-middle small.me-5.ms-1 = t('.toggle_status_on') = link_to t('.toggle_autosave_off'), statistics_external_user_exercise_path(show_autosaves: false), class: 'btn btn-outline-contrast float-end btn-sm' - else span.ps-1.pb-1 i.fa-solid.fa-circle-info.align-middle small.me-5.ms-1 = t('.toggle_status_off') = link_to t('.toggle_autosave_on'), statistics_external_user_exercise_path(show_autosaves: true), class: 'btn btn-outline-contrast float-end btn-sm' #timeline .table-responsive table.table thead tr th.header = t('.time') th.header = t('.cause') th.header = t('.score') th.header = t('.tests') th.header = t('.time_difference') if policy(@exercise).detailed_statistics? tbody - @all_events.each_with_index do |this, event_index| - highlight = event_index.positive? && @deltas.present? && @deltas[event_index].zero? && this.created_at.to_s != @all_events[event_index - 1].created_at.to_s - row_classes = '' - row_classes += ' highlight' if highlight - row_classes += ' before_deadline' if this.is_a?(Submission) && this.before_deadline? - row_classes += ' within_grace_period' if this.is_a?(Submission) && this.within_grace_period? - row_classes += ' after_late_deadline' if this.is_a?(Submission) && this.after_late_deadline? tr data-id=this.id class=row_classes - if this.is_a?(Submission) td class=(this.files.present? ? 'clickable' : '') = this.created_at.strftime('%F %T') td = this.cause td = this.score td.align-middle -this.testruns.sort_by {|t| [t.file&.name ? 0 : 1, t.file&.name] }.each do |run| - if run.passed .unit-test-result.positive-result title=[run.file&.filepath, run.log].join("\n").strip - else .unit-test-result.unknown-result title=[run.file&.filepath, run.log].join("\n").strip td = @working_times_until[event_index] if event_index.positive? && policy(@exercise).detailed_statistics? - elsif this.is_a? UserExerciseIntervention td = this.created_at.strftime('%F %T') td = this.intervention.name td td td = @working_times_until[event_index] if event_index.positive? && policy(@exercise).detailed_statistics? small b = t('.legend') .container.px-0.border .row.w-100.mx-0 .col-sm-3.py-2 = t('.no_deadline') .col-sm-3.before_deadline.py-2 = t('.before_deadline') .col-sm-3.within_grace_period.py-2 = t('.within_grace_period') .col-sm-3.after_late_deadline.py-2 = t('.after_late_deadline') - unless current_user.try(:admin?) p.mt-2 = t('.filter') - if current_user.try(:admin?) p = t('.addendum', delta: StatisticsHelper::WORKING_TIME_DELTA_IN_SECONDS / 60) .d-none#wtimes data-working_times=ActiveSupport::JSON.encode(@working_times_until) #progress_chart.col-lg-12 .graph-functions-2 - else p = t('.no_data_available')