webcodelab commited on
Commit
27e1ca7
Β·
verified Β·
1 Parent(s): a011d5b

Create try_api.html

Browse files
Files changed (1) hide show
  1. app/templates/try_api.html +166 -0
app/templates/try_api.html ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "base.html" %}
2
+ {% block title %}Try It Now – Resume Ranker API{% endblock %}
3
+
4
+ {% block extra_head %}
5
+ {# Link any specific CSS for this page here if separate from dashboard.css #}
6
+ {% endblock %}
7
+
8
+ {% block content %}
9
+ <div class="dashboard-wrapper">
10
+ <aside class="sidebar" id="sidebar">
11
+ <div class="sidebar-header">
12
+ <div class="logo">ResumeRanker<span style="color:var(--accent)">.API</span></div>
13
+ <button class="close-sidebar" id="closeSidebar" aria-label="Close menu">
14
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-x"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
15
+ </button>
16
+ </div>
17
+ <nav class="sidebar-nav">
18
+ <a href="{{ url_for('auth.dashboard') }}" class="nav-item">
19
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-grid"><rect x="3" y="3" width="7" height="7"></rect><rect x="14" y="3" width="7" height="7"></rect><rect x="14" y="14" width="7" height="7"></rect><rect x="3" y="14" width="7" height="7"></rect></svg>
20
+ <span>Dashboard</span>
21
+ </a>
22
+ <a href="{{ url_for('auth.generate_api'') }}" class="nav-item">
23
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-key"><path d="M19 10H5a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2z"></path><circle cx="12" cy="16" r="2"></circle><path d="M15 10V4.5a2.5 2.5 0 0 0-5 0V10"></path></svg>
24
+ <span>My API Keys</span>
25
+ </a>
26
+ <a href="{{ url_for('api.rank_resumes') }}" class="nav-item">
27
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-award"><circle cx="12" cy="8" r="7"></circle><polyline points="8.21 13.89 7 23 12 20 17 23 15.79 13.89"></polyline></svg>
28
+ <span>Resume Rankings</span>
29
+ </a>
30
+ <a href="{{ url_for('auth.try_api') }}" class="nav-item active"> {# Active #}
31
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-play-circle"><circle cx="12" cy="12" r="10"></circle><polygon points="10 8 16 12 10 16 10 8"></polygon></svg>
32
+ <span>Try It Now</span>
33
+ </a>
34
+ <a href="{{ url_for('auth.try_api') }}" class="nav-item">
35
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-settings"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l-.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg>
36
+ <span>Settings</span>
37
+ </a>
38
+ <a href="{{ url_for('auth.logout') }}" class="nav-item logout-item">
39
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-log-out"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"></path><polyline points="17 16 22 12 17 8"></polyline><line x1="22" y1="12" x2="10" y2="12"></line></svg>
40
+ <span>Logout</span>
41
+ </a>
42
+ </nav>
43
+ </aside>
44
+
45
+ <div class="main-content-area" id="mainContentArea">
46
+ <header class="dashboard-header">
47
+ <button class="hamburger-dashboard" id="hamburgerDashboard" aria-label="Open sidebar menu">
48
+ <span></span><span></span><span></span>
49
+ </button>
50
+ <div class="user-settings">
51
+ <span class="user-name">{{ user.username }}</span>
52
+ <div class="user-avatar">
53
+ <img src="https://ui-avatars.com/api/?name={{ user.username | urlencode }}&background=2563eb&color=fff&size=30" alt="User Avatar">
54
+ </div>
55
+ <button class="theme-toggle" id="themeToggleDashboard" aria-label="Toggle dark mode">πŸŒ™</button>
56
+ </div>
57
+ </header>
58
+
59
+ <div class="content-padding">
60
+ <h1 class="welcome-title">Try It Now</h1>
61
+ <p class="subtitle">Upload resumes and a job description to get instant rankings.</p>
62
+
63
+ {% if error %}
64
+ <div class="error-message">{{ error }}</div>
65
+ {% endif %}
66
+
67
+ {% if success %}
68
+ <div class="success-message">{{ success }}</div>
69
+ {% endif %}
70
+
71
+ <div class="section-card api-tester-form">
72
+ <h3 class="section-title">Submit Test Request</h3>
73
+ <form method="POST" action="{{ url_for('auth.try_api') }}" enctype="multipart/form-data">
74
+ <div class="form-group">
75
+ <label for="api_key" class="form-label">API Key</label>
76
+ <input type="text" class="form-input" id="api_key" name="api_key" value="{{ user.api_key }}" placeholder="your_api_key_here" required>
77
+ </div>
78
+ <div class="form-group">
79
+ <label for="resumes" class="form-label">Upload Resumes (PDF, DOCX)</label>
80
+ <input type="file" class="form-input" id="resumes" name="resumes" multiple accept=".pdf,.doc,.docx" required>
81
+ </div>
82
+ <div class="form-group">
83
+ <label for="job_description" class="form-label">Job Description</label>
84
+ <textarea class="form-input" id="job_description" name="job_description" rows="6" placeholder="Paste the job description here..." required></textarea>
85
+ </div>
86
+ <button type="submit" class="btn primary-btn">Submit Test Request</button>
87
+ </form>
88
+ </div>
89
+
90
+ {% if response %}
91
+ <div class="section-card api-results">
92
+ <h3 class="section-title">πŸ” Resume Ranking Results</h3>
93
+ <p class="section-description"><strong>Job Description:</strong> {{ response.job_description | truncate(150, true) }}</p> {# Truncate for display #}
94
+ <div class="table-responsive">
95
+ <table class="data-table">
96
+ <thead>
97
+ <tr>
98
+ <th>Filename</th>
99
+ <th>Score</th>
100
+ </tr>
101
+ </thead>
102
+ <tbody>
103
+ {% for r in response.ranked_resumes %}
104
+ <tr>
105
+ <td data-label="Filename">{{ r.filename }}</td>
106
+ <td data-label="Score">{{ r.score }}</td>
107
+ </tr>
108
+ {% endfor %}
109
+ </tbody>
110
+ </table>
111
+ </div>
112
+ </div>
113
+ {% endif %}
114
+
115
+ <p class="mt-4"><a href="{{ url_for('auth.dashboard') }}" class="btn secondary-btn">← Back to Dashboard</a></p>
116
+ </div>
117
+ </div>
118
+ </div>
119
+ {% endblock %}
120
+
121
+ {% block extra_scripts %}
122
+ <script>
123
+ // Theme toggle & Sidebar toggle JS from dashboard.html
124
+ const themeToggleDashboard = document.getElementById('themeToggleDashboard');
125
+ const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
126
+ function setTheme(theme) {
127
+ document.documentElement.setAttribute('data-theme', theme);
128
+ localStorage.setItem('theme', theme);
129
+ themeToggleDashboard.textContent = theme === 'dark' ? 'β˜€οΈ' : 'πŸŒ™';
130
+ }
131
+ const savedTheme = localStorage.getItem('theme');
132
+ setTheme(savedTheme || (prefersDark ? 'dark' : 'light'));
133
+ themeToggleDashboard.onclick = () => {
134
+ const current = document.documentElement.getAttribute('data-theme');
135
+ setTheme(current === 'dark' ? 'light' : 'dark');
136
+ };
137
+
138
+ const hamburgerDashboard = document.getElementById('hamburgerDashboard');
139
+ const sidebar = document.getElementById('sidebar');
140
+ const mainContentArea = document.getElementById('mainContentArea');
141
+ const closeSidebarBtn = document.getElementById('closeSidebar');
142
+
143
+ hamburgerDashboard.onclick = () => {
144
+ sidebar.classList.add('open');
145
+ mainContentArea.classList.add('shifted');
146
+ };
147
+ closeSidebarBtn.onclick = () => {
148
+ sidebar.classList.remove('open');
149
+ mainContentArea.classList.remove('shifted');
150
+ };
151
+ mainContentArea.onclick = (event) => {
152
+ if (sidebar.classList.contains('open') && !sidebar.contains(event.target) && !hamburgerDashboard.contains(event.target)) {
153
+ sidebar.classList.remove('open');
154
+ mainContentArea.classList.remove('shifted');
155
+ }
156
+ };
157
+ Array.from(sidebar.getElementsByClassName('nav-item')).forEach(item => {
158
+ item.onclick = () => {
159
+ if (window.innerWidth <= 900) {
160
+ sidebar.classList.remove('open');
161
+ mainContentArea.classList.remove('shifted');
162
+ }
163
+ };
164
+ });
165
+ </script>
166
+ {% endblock %}