SlideShare a Scribd company logo
Single Page Web App: Manchester
Tech Meetups
by Sean O’Mahoney (@Sean12697)
Who?
 Computer Science at Manchester Metropolitan University
 Prolific Networker: ~200 Networking Events Attended
 Hackathons: 1st Place once, 2nd place three times, lost none
 Workshops/Talks: Run 4 (5 now), done 15 times (now 16)
 Likes Web & Data stuffs, does Photography
@Sean12697
What? (http://mcrmeetup.tech/)
Essentially, a service which will allow
you to find Meetup Groups, their
events, and filter through both.
@Sean12697
Inspiration / Research
 Spotify Playlist Generator - https://www.youtube.com/watch?v=eV3WkDAM3Hw
 GitHub Repository Video - https://github.com/lets-learn/spotify-playlist-generator
 Meetup RESTFUL API - https://www.meetup.com/meetup_api/
@Sean12697
How to get there?
MVP! MVP! MVP!!! (Minimum Viable Product)
Ideas (Features):
 Show All Meetups
 Search
 Filter into Categories
 Show Events
 Filter Events
 TechNW Integration
 Sorting
 Activity
Essential Features:
 Show All Meetups
 Show Events
 Search
MVP:
 Show All Meetups
Release:
 + Show Events
 + Search
Iteration x:
 + Filters
@Sean12697
MVP
 API Call compared from the tutorial, to research from the Meetup API
app.getAlbumTracks = (id) => $.ajax({
url: `https://api.spotify.com/v1/albums/${id}/tracks`,
method: 'GET',
dataType: 'json'
});
app.getMeetups = (meetup) => $.ajax({
url: 'https://api.meetup.com/' + meetup,
method: 'GET',
dataType: 'jsonp'
});
@Sean12697
MVP
 Function calls to the API compared from the tutorial, to what’s needed for the Meetup API
function initGetMeetups() {
console.log(meetups);
MeetupsJSON = MeetupsJSON.map(app.getMeetups);
$.when(...MeetupsJSON)
.then((...MeetupsJSON) => {
MeetupsJSON = MeetupsJSON.map(a => a[0].data);
console.log(MeetupsJSON); // MVP
});
}
app.getTracks = function(tracks) {
$.when(...tracks)
.then((...tracks) => {
tracks = tracks
.map(getDataObject)
.reduce((prev,curr) => [...prev,...curr],[]);
const randomPlayList = getRandomTracks(50,tracks);
app.createPlayList(randomPlayList);
})
};
 “meetups” & “MeetupJSON” = ["android_mcr", "BCS-Greater-Manchester-Branch“,.. ]
 $.when & .then are async’ call, .then doing the anonymous function once complete
 .map(a => a[0].data) to remove the JSONP padding ([0]), then async’ promise (.data)
@Sean12697
MVP (Console Logs)
 Whoop!
@Sean12697
MVP (Display & Responsiveness)
 What do we need? (Image, Name, Members).
 How should elements be, how do they change (thinking about CSS in Media Queries).
NAME
MEMBERS
NAME
MEMBERS
NAME
MEMBERS
NAME
MEMBERS
 Container (Div) = inline-block
 Picture and Text Elements
 Text Align: Centre or Left
@Sean12697
MVP (Resulting HTML)
<div class="group" id="0">
<div class="meetupImg">
<img src="https://secure.meetupstatic.com/photos/event/9/0/f/f/600_447577119.jpeg">
</div>
<div class="groupText">
<a href="https://www.meetup.com/android_mcr/" target="_blank">
<p class="groupName">Android Manchester</p>
</a>
<p>Members: 341</p>
</div>
</div>
@Sean12697
MVP (Resulting CSS)
.group {
display: inline-block;
width: 150px;
height: 280px;
margin: 10px;
overflow: hidden;
background-color: #fff;
transition-duration: 0.4s;
}
.group:hover {
transform: scale(1.1);
}
.groupText {
margin: 5px;
}
.group img {
object-fit: cover;
width: 150px;
height: 150px;
padding-bottom: 0px;
}
.groupName {
height: 40px;
overflow: hidden;
}
@media only screen and (min-width: 324px) and (max-width: 480px) {
.group {
width: 100%;
height: 100px;
margin: 8px 0px;
text-align: left;
overflow: hidden;
}
.group label {
width: 100px;
height: 100px;
padding: 0px;
margin: 0px;
display: inline-block;
overflow: hidden;
}
.meetupImg {
display: inline-block;
vertical-align: top;
}
.groupText {
padding: 0px 10px;
display: inline-block;
width: 50%;
}
.groupName {
margin: 0px;
margin-top: 10px;
}
.group img {
object-fit: cover;
width: 100px;
height: 100px;
padding-bottom: 0px;
}
.groupText p {
margin: 10px;
margin-left: 0px;
}
}
@Sean12697
MVP (Resulting JavaScript)
function drawMeetups(JSON) {
groupsContainer.innerHTML = "";
for (var i = 0; i < JSON.length; i++) {
var x = JSON[i];
var name = x.name;
var link = x.link;
var members = x.members;
var thumb = 'blank.jpg';
if (x.hasOwnProperty('group_photo')) {
thumb = x.group_photo.photo_link;
} else {
if(x.hasOwnProperty('organizer')) {
if (x.organizer.hasOwnProperty('photo')) {
thumb = x.organizer.photo.photo_link;
}
}
} groupsContainer.insertAdjacentHTML('beforeend', '<div class="group" id="' + i + '"><div class="meetupImg"><img src="' + thumb
+ '"></div><div class="groupText"><a href="' + link + '" target="_blank"><p class="groupName">' + name + '</p></a><p>Members: ' +
members + '</p></div></div>');
}
}
 Clear our container (which will have a loader)
 Go through each object in our returned JSON
 Put the content we need in variables
 Do error correction on some (don’t make
assumptions)
 Generate HTML and insert it within a container
element (which has been defined)
@Sean12697
MVP Complete (“Show
All Meetups”)
 Within 43 lines of JavaScript
 https://github.com/Sean12697/mcrmeetup
tech_workshop
@Sean12697
Tips & Tricks
 Spinner (for good UX) - https://medium.com/@kayliepoitras/css3-style-animation-preloaders-
d07914bb84a8
@Sean12697

More Related Content

PPT
PowerPoint Only
PDF
5 Ways to Make Use of Your Google Analytics
PDF
Build Your Own Website with HTML/CSS 8.15
PDF
Build Your Own Website with HTML/CSS
PDF
HTML 5 Development for Windows Phone and Desktop
PPTX
Building a Simple Mobile-optimized Web App Using the jQuery Mobile Framework
PDF
Build Your Own Website with HTML/CSS 8.15
PPT
WordCamp 2012 - Seth Carstens Presentation (Responsive Width)
PowerPoint Only
5 Ways to Make Use of Your Google Analytics
Build Your Own Website with HTML/CSS 8.15
Build Your Own Website with HTML/CSS
HTML 5 Development for Windows Phone and Desktop
Building a Simple Mobile-optimized Web App Using the jQuery Mobile Framework
Build Your Own Website with HTML/CSS 8.15
WordCamp 2012 - Seth Carstens Presentation (Responsive Width)

Similar to Single Page Web App (20)

PDF
APIs for modern web apps
PDF
Producing a mobile presence. Timeline: Yesterday...
PDF
Build Your Own Website - Thinkful DC
PDF
Innovations in Mobile Testing: Expanding Your Test Plan
PDF
Web versus Native: round 1!
PDF
Mobile Device APIs
PDF
HTML5 for Web Designers
PDF
An Intro to Mobile HTML5
PPTX
HTML5 on Mobile(For Designer)
PPTX
Boulder JS meet up presentation for April 16
PDF
Responsive websites. Toolbox
PDF
Use Web Skills To Build Mobile Apps
PPTX
Here Today, Here Tomorrow: Mobile Devices - Northwestern University Web Steer...
PDF
Sexy HTML with Twitter Bootstrap
PPTX
Simplicity - develop modern web apps with tiny frameworks and tools
PDF
Don't Miss a Thing at IBM InterConnect 2015
PDF
Cloud Infrastructure & IT Optimization Expo Highlights
PDF
GSMA in W3C
PDF
Build Your Own Website with HTML/CSS
PDF
Startup Institute NYC: Styling
APIs for modern web apps
Producing a mobile presence. Timeline: Yesterday...
Build Your Own Website - Thinkful DC
Innovations in Mobile Testing: Expanding Your Test Plan
Web versus Native: round 1!
Mobile Device APIs
HTML5 for Web Designers
An Intro to Mobile HTML5
HTML5 on Mobile(For Designer)
Boulder JS meet up presentation for April 16
Responsive websites. Toolbox
Use Web Skills To Build Mobile Apps
Here Today, Here Tomorrow: Mobile Devices - Northwestern University Web Steer...
Sexy HTML with Twitter Bootstrap
Simplicity - develop modern web apps with tiny frameworks and tools
Don't Miss a Thing at IBM InterConnect 2015
Cloud Infrastructure & IT Optimization Expo Highlights
GSMA in W3C
Build Your Own Website with HTML/CSS
Startup Institute NYC: Styling
Ad

More from Sean O'Mahoney (10)

PPTX
Tips & Tricks From The Experts
PPTX
Managing Your Assessments
PPTX
Making the Most of Lectures
PPTX
Intro to Cryptography (Futures Friday)
PPTX
CompiledMCR
PPTX
Front-end Performance 101
PPTX
University Recommendations
PPTX
Creating Your Own Static Website Generator
PPTX
BCS Hackathon: Check Your Numbers
PPTX
TAPIT Pitch Idea
Tips & Tricks From The Experts
Managing Your Assessments
Making the Most of Lectures
Intro to Cryptography (Futures Friday)
CompiledMCR
Front-end Performance 101
University Recommendations
Creating Your Own Static Website Generator
BCS Hackathon: Check Your Numbers
TAPIT Pitch Idea
Ad

Recently uploaded (20)

PPTX
SOPHOS-XG Firewall Administrator PPT.pptx
PPTX
Machine Learning_overview_presentation.pptx
PPTX
Spectroscopy.pptx food analysis technology
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
A Presentation on Artificial Intelligence
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPTX
Big Data Technologies - Introduction.pptx
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Approach and Philosophy of On baking technology
PDF
Encapsulation_ Review paper, used for researhc scholars
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PPTX
1. Introduction to Computer Programming.pptx
SOPHOS-XG Firewall Administrator PPT.pptx
Machine Learning_overview_presentation.pptx
Spectroscopy.pptx food analysis technology
Digital-Transformation-Roadmap-for-Companies.pptx
A Presentation on Artificial Intelligence
Mobile App Security Testing_ A Comprehensive Guide.pdf
Big Data Technologies - Introduction.pptx
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Dropbox Q2 2025 Financial Results & Investor Presentation
Building Integrated photovoltaic BIPV_UPV.pdf
Assigned Numbers - 2025 - Bluetooth® Document
Network Security Unit 5.pdf for BCA BBA.
Diabetes mellitus diagnosis method based random forest with bat algorithm
Approach and Philosophy of On baking technology
Encapsulation_ Review paper, used for researhc scholars
“AI and Expert System Decision Support & Business Intelligence Systems”
MYSQL Presentation for SQL database connectivity
Agricultural_Statistics_at_a_Glance_2022_0.pdf
1. Introduction to Computer Programming.pptx

Single Page Web App

  • 1. Single Page Web App: Manchester Tech Meetups by Sean O’Mahoney (@Sean12697)
  • 2. Who?  Computer Science at Manchester Metropolitan University  Prolific Networker: ~200 Networking Events Attended  Hackathons: 1st Place once, 2nd place three times, lost none  Workshops/Talks: Run 4 (5 now), done 15 times (now 16)  Likes Web & Data stuffs, does Photography @Sean12697
  • 3. What? (http://mcrmeetup.tech/) Essentially, a service which will allow you to find Meetup Groups, their events, and filter through both. @Sean12697
  • 4. Inspiration / Research  Spotify Playlist Generator - https://www.youtube.com/watch?v=eV3WkDAM3Hw  GitHub Repository Video - https://github.com/lets-learn/spotify-playlist-generator  Meetup RESTFUL API - https://www.meetup.com/meetup_api/ @Sean12697
  • 5. How to get there? MVP! MVP! MVP!!! (Minimum Viable Product) Ideas (Features):  Show All Meetups  Search  Filter into Categories  Show Events  Filter Events  TechNW Integration  Sorting  Activity Essential Features:  Show All Meetups  Show Events  Search MVP:  Show All Meetups Release:  + Show Events  + Search Iteration x:  + Filters @Sean12697
  • 6. MVP  API Call compared from the tutorial, to research from the Meetup API app.getAlbumTracks = (id) => $.ajax({ url: `https://api.spotify.com/v1/albums/${id}/tracks`, method: 'GET', dataType: 'json' }); app.getMeetups = (meetup) => $.ajax({ url: 'https://api.meetup.com/' + meetup, method: 'GET', dataType: 'jsonp' }); @Sean12697
  • 7. MVP  Function calls to the API compared from the tutorial, to what’s needed for the Meetup API function initGetMeetups() { console.log(meetups); MeetupsJSON = MeetupsJSON.map(app.getMeetups); $.when(...MeetupsJSON) .then((...MeetupsJSON) => { MeetupsJSON = MeetupsJSON.map(a => a[0].data); console.log(MeetupsJSON); // MVP }); } app.getTracks = function(tracks) { $.when(...tracks) .then((...tracks) => { tracks = tracks .map(getDataObject) .reduce((prev,curr) => [...prev,...curr],[]); const randomPlayList = getRandomTracks(50,tracks); app.createPlayList(randomPlayList); }) };  “meetups” & “MeetupJSON” = ["android_mcr", "BCS-Greater-Manchester-Branch“,.. ]  $.when & .then are async’ call, .then doing the anonymous function once complete  .map(a => a[0].data) to remove the JSONP padding ([0]), then async’ promise (.data) @Sean12697
  • 8. MVP (Console Logs)  Whoop! @Sean12697
  • 9. MVP (Display & Responsiveness)  What do we need? (Image, Name, Members).  How should elements be, how do they change (thinking about CSS in Media Queries). NAME MEMBERS NAME MEMBERS NAME MEMBERS NAME MEMBERS  Container (Div) = inline-block  Picture and Text Elements  Text Align: Centre or Left @Sean12697
  • 10. MVP (Resulting HTML) <div class="group" id="0"> <div class="meetupImg"> <img src="https://secure.meetupstatic.com/photos/event/9/0/f/f/600_447577119.jpeg"> </div> <div class="groupText"> <a href="https://www.meetup.com/android_mcr/" target="_blank"> <p class="groupName">Android Manchester</p> </a> <p>Members: 341</p> </div> </div> @Sean12697
  • 11. MVP (Resulting CSS) .group { display: inline-block; width: 150px; height: 280px; margin: 10px; overflow: hidden; background-color: #fff; transition-duration: 0.4s; } .group:hover { transform: scale(1.1); } .groupText { margin: 5px; } .group img { object-fit: cover; width: 150px; height: 150px; padding-bottom: 0px; } .groupName { height: 40px; overflow: hidden; } @media only screen and (min-width: 324px) and (max-width: 480px) { .group { width: 100%; height: 100px; margin: 8px 0px; text-align: left; overflow: hidden; } .group label { width: 100px; height: 100px; padding: 0px; margin: 0px; display: inline-block; overflow: hidden; } .meetupImg { display: inline-block; vertical-align: top; } .groupText { padding: 0px 10px; display: inline-block; width: 50%; } .groupName { margin: 0px; margin-top: 10px; } .group img { object-fit: cover; width: 100px; height: 100px; padding-bottom: 0px; } .groupText p { margin: 10px; margin-left: 0px; } } @Sean12697
  • 12. MVP (Resulting JavaScript) function drawMeetups(JSON) { groupsContainer.innerHTML = ""; for (var i = 0; i < JSON.length; i++) { var x = JSON[i]; var name = x.name; var link = x.link; var members = x.members; var thumb = 'blank.jpg'; if (x.hasOwnProperty('group_photo')) { thumb = x.group_photo.photo_link; } else { if(x.hasOwnProperty('organizer')) { if (x.organizer.hasOwnProperty('photo')) { thumb = x.organizer.photo.photo_link; } } } groupsContainer.insertAdjacentHTML('beforeend', '<div class="group" id="' + i + '"><div class="meetupImg"><img src="' + thumb + '"></div><div class="groupText"><a href="' + link + '" target="_blank"><p class="groupName">' + name + '</p></a><p>Members: ' + members + '</p></div></div>'); } }  Clear our container (which will have a loader)  Go through each object in our returned JSON  Put the content we need in variables  Do error correction on some (don’t make assumptions)  Generate HTML and insert it within a container element (which has been defined) @Sean12697
  • 13. MVP Complete (“Show All Meetups”)  Within 43 lines of JavaScript  https://github.com/Sean12697/mcrmeetup tech_workshop @Sean12697
  • 14. Tips & Tricks  Spinner (for good UX) - https://medium.com/@kayliepoitras/css3-style-animation-preloaders- d07914bb84a8 @Sean12697

Editor's Notes

  • #4: [Small Demo]