Skip to content

Commit d0a66ae

Browse files
committed
added nasa api project
1 parent d51c1a3 commit d0a66ae

File tree

9 files changed

+453
-61
lines changed

9 files changed

+453
-61
lines changed

.vscode/settings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"liveServer.settings.port": 5502
3+
}

img/new/images-from-space-opt.png

182 KB
Loading

img/new/images-from-space2-opt.png

170 KB
Loading

index.html

Lines changed: 41 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
<link rel="stylesheet" href="css/menu.css">
1313
<link rel="stylesheet" href="style.css">
1414
<link rel="stylesheet" href="sss/sss.css">
15-
16-
15+
16+
1717

1818

1919
</head>
@@ -58,11 +58,11 @@ <h1>David Petrey
5858
<div>
5959
Hi, I'm Dave.
6060
<br>I'm a Front-End Web Developer with a passion for creating excellent customer experiences... <em>with code</em>.
61-
61+
6262
</div>
6363
<a class="view-button" href="portfolio.html">View my portfolio</a>
6464
</div>
65-
65+
6666
</div>
6767
</section>
6868

@@ -83,10 +83,25 @@ <h1>David Petrey
8383

8484
<section class="port">
8585

86-
8786
<div class="container clear">
8887
<div id="portScroll"></div>
8988
<h1>Portfolio</h1>
89+
90+
<div class="nasa-api clear">
91+
<h3>
92+
Images From Space
93+
<p><span>Small Ajax project using NASA's Mars Rover API</span></p>
94+
</h3>
95+
<div class="ex-wrapper col-12 col-10-tablet clear">
96+
<a href="/nasa-api/" target="_blank">
97+
<span></span>
98+
<img src="img/new/images-from-space2-opt.png" class="img-fluid">
99+
<span>Try it</span>
100+
</a>
101+
</div>
102+
</div>
103+
104+
90105
<div class="lennox">
91106
<h3>Lennox International</h3>
92107
<div class="wyw">
@@ -139,23 +154,23 @@ <h4>LennoxPros.com Marketing and Content pages</h4>
139154

140155

141156

142-
143-
144-
145-
146-
147-
148-
149-
150-
157+
158+
159+
160+
161+
162+
163+
164+
165+
151166

152167

153168

154169

155170
<div class="container clear">
156171

157172
<h3>Oak Cliff Bible Fellowship
158-
<p>
173+
<p>
159174
<span> I worked on this project at AM Digital Agency. Implemented various features and fixes, performed testing, and developed custom post types along with their templates and pages.</span>
160175
</p>
161176
</h3>
@@ -176,15 +191,15 @@ <h3>Oak Cliff Bible Fellowship
176191
</div>
177192
</a>
178193
</div>
179-
194+
180195
</div>
181-
196+
182197

183198

184199
<div class="container clear">
185200

186201
<h3>T-Mobile Email templates &amp; Landing pages
187-
202+
188203
<p>Tech: <span>HTML, CSS, JavaScript, jQuery</span></p>
189204
</h3>
190205

@@ -202,7 +217,7 @@ <h3>T-Mobile Email templates &amp; Landing pages
202217
</div>
203218

204219
</div>
205-
220+
206221
<div class="container clear reap">
207222

208223
<h3>Websites built while working at Reap Marketing
@@ -219,7 +234,7 @@ <h3>Websites built while working at Reap Marketing
219234
</div>
220235
<div class="ex-wrapper col-12 col-6-tablet clear">
221236
<a href="https://www.asdonline.com" target="_blank">
222-
<span>ASD MARKETWEEK:</span>
237+
<span>ASD MARKETWEEK:</span>
223238
<p class="p-descript">Homepage and Optimizely testing</p>
224239
<img src="img/asd.jpg" class="img-fluid">
225240
</a>
@@ -269,16 +284,16 @@ <h3>Custom WordPress sites I built while working at AutoRevo
269284
</a>
270285
</div>
271286

272-
</div>
287+
</div>
273288

274289
</section>
275290

276291

277292
<footer>
278293
<section>
279-
<span>
294+
<span>
280295
<a href="https://www.linkedin.com/in/davidpetrey" target="_blank">Linkedin</a>
281-
<a href="https://github.com/davidpetrey" target="_blank">GitHub</a>
296+
<a href="https://github.com/davidpetrey" target="_blank">GitHub</a>
282297
</span>
283298
<span>
284299
&copy; 2022 David Petrey
@@ -300,12 +315,12 @@ <h3>Custom WordPress sites I built while working at AutoRevo
300315
$(document).ready(function() {
301316
$("a.view-button").click(function(event) {
302317
event.preventDefault();
303-
document.getElementById('portScroll').scrollIntoView({
304-
behavior: 'smooth'
318+
document.getElementById('portScroll').scrollIntoView({
319+
behavior: 'smooth'
305320
});
306321
});
307322

308-
323+
309324
$('.slider1').sss({
310325
slideShow : true, // Set to false to prevent SSS from automatically animating.
311326
startOn : 0, // Slide to display first. Uses array notation (0 = first slide).

nasa-api/app.js

Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
document.addEventListener('DOMContentLoaded', () => {
2+
/* https://api.nasa.gov/ */
3+
4+
let maxSol;
5+
let manifest;
6+
let solsWithPics;
7+
8+
let getManifest = (rover) => {
9+
$.ajax({
10+
method: "GET",
11+
url: `https://api.nasa.gov/mars-photos/api/v1/manifests/${rover}?api_key=c9OyMPxnO1YTXXEecRMoGxlfNRRMHT412OFVjMyA`,
12+
})
13+
.done(function(data, textStatus, jqXHR) {
14+
console.log(jqXHR.status, textStatus);
15+
console.log(data);
16+
// console.log(jqXHR);
17+
manifest = data.photo_manifest;
18+
maxSol = data.photo_manifest.max_sol;
19+
20+
solsWithPics = manifest.photos.map(arr => arr.sol);
21+
22+
solDescript.innerText = "Please enter a number from day 1 to day " + maxSol;
23+
24+
selectCamera.innerHTML = "";
25+
selectCamera.disabled = true;
26+
selectSolarDay.value = "";
27+
selectSolarDay.disabled = false;
28+
29+
}).fail(function(jqXHR, textStatus, errorThrown){
30+
console.log(textStatus, jqXHR.status, jqXHR.statusText);
31+
});
32+
}
33+
34+
35+
let selectedRover;
36+
let selectedSol;
37+
let selectedCamera;
38+
const selectRover = document.getElementById("inputRover");
39+
const selectSolarDay = document.getElementById("inputSol");
40+
let selectCamera = document.getElementById("inputCamera");
41+
let solDescript = document.getElementById("solDescript");
42+
43+
selectRover.addEventListener('change', (e) => {
44+
if (!e.target.value) {
45+
selectSolarDay.value = '';
46+
selectSolarDay.disabled = true;
47+
selectCamera.value = '';
48+
selectCamera.disabled = true;
49+
}
50+
if (e.target.value) {
51+
selectedRover = e.target.value;
52+
getManifest(selectedRover);
53+
}
54+
});
55+
56+
selectSolarDay.addEventListener('keyup', (e) => {
57+
if(/^[0-9]+$/.test(e.target.value)){
58+
debounceInput(e.target.value);
59+
}
60+
});
61+
62+
/* disable */
63+
selectSolarDay.addEventListener('keydown', (e) => {
64+
selectCamera.disabled = true;
65+
});
66+
67+
68+
selectCamera.addEventListener('change', (e) => {
69+
selectedCamera = e.target.value;
70+
});
71+
72+
73+
function solarDayError(found) {
74+
solDescript.innerText = "No photos for this day. Next day with photos is " + found;
75+
}
76+
77+
78+
79+
let debounceTimer;
80+
let cameraTemplate;
81+
82+
function debounceInput(sol){
83+
cameraTemplate = "";
84+
window.clearTimeout(debounceTimer);
85+
debounceTimer = window.setTimeout(() => {
86+
let solNumber = +sol;
87+
88+
let index;
89+
let found = solsWithPics.find(function(item, i) {
90+
index = i;
91+
if (item == solNumber) return true;
92+
return item > solNumber;
93+
});
94+
95+
if (solNumber != found) {
96+
solarDayError(found);
97+
}
98+
99+
if (solNumber == found) {
100+
solDescript.innerText = "Please enter a number from day 1 to day " + maxSol;
101+
selectedSol = sol;
102+
103+
cameraTemplate = `<option value=""></option>`;
104+
105+
manifest.photos[index].cameras.forEach(camera => {
106+
cameraTemplate += `<option value="${camera}">${camera}</option>`;
107+
});
108+
109+
selectCamera.disabled = false;
110+
selectCamera.innerHTML = cameraTemplate;
111+
}
112+
}, 1000);
113+
}
114+
115+
116+
// set submit function here
117+
let getPhotosButton = document.getElementById("getPhotos");
118+
119+
getPhotosButton.addEventListener("click", (e) => {
120+
getImages(selectedRover, selectedSol, selectedCamera)
121+
})
122+
123+
124+
125+
function getImages(roverNameQsValue, solDayQSValue, cameraQsValue) {
126+
// let requestUrl = `https://api.nasa.gov/mars-photos/api/v1/rovers/${roverNameQsValue}/photos?sol=${solDayQSValue}&page=1&api_key=${marsRoverApiKey}`;
127+
let requestUrl = `https://api.nasa.gov/mars-photos/api/v1/rovers/${roverNameQsValue}/photos?sol=${solDayQSValue}&page=1&camera=${cameraQsValue}&api_key=c9OyMPxnO1YTXXEecRMoGxlfNRRMHT412OFVjMyA`;
128+
129+
$.ajax({
130+
method: "GET",
131+
url: requestUrl,
132+
})
133+
.done(function(data, textStatus, jqXHR) {
134+
console.log(jqXHR.status, textStatus);
135+
console.log(data);
136+
// console.log(jqXHR);
137+
138+
processData(data.photos);
139+
140+
}).fail(function(jqXHR, textStatus, errorThrown){
141+
console.log(textStatus, jqXHR.status, jqXHR.statusText);
142+
});
143+
}
144+
145+
146+
147+
/*
148+
fetch("https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos?sol=100&page=1&api_key=${marsRoverApiKey}", {
149+
method: "GET",
150+
headers: headersList
151+
}).then(function(response) {
152+
console.log(response);
153+
return response.text();
154+
}).then(function(data) {
155+
processData(JSON.parse(data).photos)
156+
});
157+
*/
158+
159+
160+
let myTemplate;
161+
162+
function processData(photos) {
163+
myTemplate = '';
164+
165+
photos.forEach(row => {
166+
makeTemplate(row.rover.name, row.camera.name, row.img_src, row.earth_date);
167+
});
168+
169+
function makeTemplate(rover, camera, imgSrc, earthDate) {
170+
let tempTemplate = `<div class="col"><img src="${imgSrc}" alt=""> <div class="text-end">Date: ${earthDate} </div></div>`;
171+
172+
myTemplate += tempTemplate;
173+
174+
let longName = getCameraName(camera.toLowerCase())
175+
let properRoverName = rover.charAt(0).toUpperCase() + rover.slice(1);
176+
177+
document.getElementById("roverName").innerHTML = properRoverName;
178+
document.getElementById("cameraName").innerHTML = longName;
179+
document.getElementById("test").innerHTML = myTemplate;
180+
}
181+
}
182+
183+
184+
185+
const cameraNameLookup = {
186+
"fhaz": "Front Hazard Avoidance Camera",
187+
"rhaz": "Rear Hazard Avoidance Camera",
188+
"mast": "Mast Camera",
189+
"chemcam": "Chemistry and Camera Complex",
190+
"mahli": "Mars Hand Lens Imager",
191+
"mardi": "Mars Descent Imager",
192+
"navcam": "Navigation Camera",
193+
"pancam": "Panoramic Camera",
194+
"minites": "Miniature Thermal Emission Spectrometer (Mini-TES)"
195+
}
196+
const getCameraName = (shortName) => cameraNameLookup[shortName] || 'unknown';
197+
198+
199+
200+
});
201+

0 commit comments

Comments
 (0)