File size: 7,093 Bytes
4f591e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d8700ae
4f591e5
 
 
 
 
 
 
 
 
d8700ae
4f591e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d8700ae
4f591e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
{% extends 'base.html' %}

{% block title %}Prediction Results{% endblock %}

{% block content %}
<div class="container mt-4">
    <!-- Topic Card (same width as comparison) -->
    <div class="row">
        <div class="col-12 mb-4">
            <div class="card border-primary">
                <div class="card-header bg-secondary text-white">
                    <h4 class="mb-0">Topic</h4>
                </div>
                <div class="card-body">
                    <p class="card-text" style="color: black;">{{ topic }}</p>
                </div>
            </div>
        </div>
    </div>

    <!-- Essay Comparison -->
    <div class="row">
        <div class="col-12 mb-4">
            <div class="card border-primary">
                <div class="card-header bg-secondary text-white">
                    <h4 class="mb-0">Essay Comparison</h4>
                </div>
                <div class="card-body p-0">
                    <div class="row g-0">
                        <!-- Original Essay -->
                        <div class="col-md-6 border-end">
                            <div class="p-3">
                                <h5 class="text-center text-primary">Original Essay</h5>
                                <div class="original-essay" id="originalEssay" style="color: black; height: 400px; overflow-y: auto;">
                                    {{ essay }}
                                </div>
                            </div>
                        </div>
                        
                        <!-- Corrected Essay -->
                        <div class="col-md-6">
                            <div class="p-3">
                                <h5 class="text-center text-success">Corrected Essay</h5>
                                <div class="corrected-essay" id="correctedEssay" style="color: black; height: 400px; overflow-y: auto;">
                                    {{ corrected_essay }}
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <!-- Rubric Cards (now below comparison) -->
    <div class="row">
        {% set rubrics = [
            ('Task Response', result[0], tr , 'task_response'),
            ('Coherence and Cohesion', result[1], cc, 'coherence_cohesion'),
            ('Lexical Resource', result[2], lr, 'lexical_resource'),
            ('Grammatical Range and Accuracy', result[3], gra, 'grammatical_accuracy')
        ] %}
    
        {% for rubric, score, explanation, link in rubrics %}
        <div class="col-md-3 mb-4">  <!-- Changed to col-md-3 for 4 cards in a row -->
            <div class="card h-100 bg-light border-info">  <!-- Changed to light bg with info border -->
                <div class="card-body">
                    <h5 class="card-title" style="color: black;">{{ rubric }}</h5>
                    <div class="score-display mb-3 text-center">  <!-- Centered score -->
                        <span class="score">{{ score|int }}</span>/9
                    </div>
                    <p class="card-text text-truncate-multiline text-dark">  <!-- Dark text for better readability -->
                        {{ explanation }}
                    </p>
                    <div class="d-flex justify-content-between mt-3">
                        <button type="button" class="btn btn-sm btn-outline-info" data-bs-toggle="modal" data-bs-target="#feedbackModal{{ loop.index }}">
                            View Feedback
                        </button>
                        <a href="{{ url_for('infer.rubric_explanation', rubric=link) }}" class="btn btn-sm btn-outline-info">
                            Details
                        </a>
                    </div>
                </div>
            </div>

            <!-- Modal for each feedback item -->
            <div class="modal fade" id="feedbackModal{{ loop.index }}" tabindex="-1" aria-labelledby="feedbackModalLabel{{ loop.index }}" aria-hidden="true">
                <div class="modal-dialog modal-dialog-centered">
                    <div class="modal-content">
                        <div class="modal-header bg-info text-white">
                            <h5 class="modal-title" id="feedbackModalLabel{{ loop.index }}">{{ rubric }} Feedback</h5>
                            <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                        </div>
                        <div class="modal-body" style="max-height: 60vh; overflow-y: auto;">
                            {{ explanation }}
                        </div>
                        <div class="modal-footer">
                            <button type="button" class="btn btn-info" data-bs-dismiss="modal">Close</button>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        {% endfor %}
    </div>

    <div class="text-center mt-4">
        <a href="{{ url_for('infer.index') }}" class="btn btn-primary">Submit Another Essay</a>
    </div>
</div>
{% endblock %}

{% block extra_scripts %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jsdiff/5.0.1/diff.min.js"></script>
  <script>
  document.addEventListener('DOMContentLoaded', function() {
    try {
      const origEl = document.getElementById('originalEssay');
      const corrEl = document.getElementById('correctedEssay');
      if (!origEl || !corrEl) return;

      const originalText  = origEl.textContent;
      const correctedText = corrEl.textContent;

      // 2) do the diff
      const diff = JsDiff.diffWordsWithSpace(originalText, correctedText);

      // if nothing really changed, bail out
      if (diff.length <= 1) return;

      // 3) clear out the old
      corrEl.innerHTML = '';

      // 4) re‐render with spans
      diff.forEach(part => {
        const span = document.createElement('span');
        span.textContent = part.value;
        if (part.added)   span.classList.add('diff-ins');
        if (part.removed) span.classList.add('diff-del');
        corrEl.appendChild(span);
      });
    }
    catch (e) {
      console.error('Diff rendering error:', e);
    }
  });
  </script>
<style>
  .diff-ins {border-bottom:2px solid #28a745; }
  .diff-del {text-decoration: line-through; color: #dc3545; }

    /* Custom styles */
    .score-display {
        font-size: 1.2rem;
        font-weight: bold;
    }
    
    .score {
        color: #0d6efd;  /* Changed to Bootstrap primary blue */
        font-size: 1.5rem;
    }
    
    .text-truncate-multiline {
        display: -webkit-box;
        -webkit-line-clamp: 3;
        -webkit-box-orient: vertical;
        overflow: hidden;
        text-overflow: ellipsis;
        min-height: 4.5em;
    }
    
    .card {
        transition: transform 0.2s;
    }
    
    .card:hover {
        transform: translateY(-5px);
        box-shadow: 0 4px 15px rgba(13, 110, 253, 0.25);  /* Primary blue shadow */
    }
</style>
{% endblock %}