This project was proposed after a first round interview as an introduction to Angular.
Thank you Anonymous Company for the opportunity to interview with you and welcome to my project!
During the interview I was asked about my process of learning
new technologies and in approaching this project I realized that I missed an important part of my process. I have increasingly starting learning new technologies by finding a highly rated course online. Even if the course is centered around building a project (vs just covering concepts) I will just watch the entire course (usually on 2x speed) and take as many notes as possible.
This allows me to become familiar with the lingo / buzzwords that are used when approaching different concepts within the particular technology at hand. Additionally, through my time at Lambda all of my notes are compiled into a private repo that I call my codebrain
.
While continuously pausing the lecture or stopping the base project to take / update my notes initially slows down my progress, I have seen that in the long run it dramatically increases the speed of my development. I am either able to immediately retrieve information which is already structured in my preferred format from my codebrain
or I can better target the official documentation to learn more granular details as needed (and update my notes accordingly).
We were able to work through my dad being absolutely sure that he only cut the cable (not the internet) while doing renovations on Saturday and a power outage Sunday to learn ALOT about Angular this weekend!
I look forward to being able to speak with you regarding improvements that I can make!
Dashboard | Heroes |
---|---|
![]() |
![]() |
Hero Detail | Hero Search |
---|---|
![]() |
![]() |
1.0.0 - Styling Update & Code Cleanup
- Added
mixin
for a standard button which can accept a@font_color
&@background_color
as arguments - Overhauled LESS variables
- General code cleanup throughout project
0.9.0 - Hero Search
- Created
hero-search
component as nested child ofheroes
component - Added
<app-hero-search>
element todashboard
component - Updated
hero-search.html
to have:- input section => event bound to
search()
which passes an updated term to search when the input changes - result section => renders a list of results based on the response from the
heroes$
observable
- input section => event bound to
hero-search.ts
is utilizingdebounceTime
/distinctUntilChanged
/switchMap
inside itsngOnInit()
to control the number of HTTP requests sent tosearchHeroes()
method inheroesDataService
0.8.0 - Update / Add / Delete Hero
-
Update =>
hero-detail.html
&hero-detail.ts
- Added Save button which is event bound to button click triggering
updateHero()
method which calls theupdateHero()
method on theheroesDataService
- Added Save button which is event bound to button click triggering
-
Add =>
heroes.html
&heroes.ts
- Added input box for new hero name
- Added Add button to pass local reference to #localName input into event bound
addHero()
method which calls theaddHero
method on theheroesDataService
-
Delete =>
heroes.html
&heroes.ts
- Added
x
box on each heroli
which is event bound to click and passing the hero into theDeleteHero
method which calls thedeleteHero()
method on theheroesDataDataService
- Added
- All method in
heroesDataService
are:- Utilizing a
pipe
to handle errors - Utilizing a
tap
to call messageService
- Utilizing a
0.7.0 - Simulating HTTP Request w/ angular-in-memory-web-api
- Creating @Injectable
InMemoryDataService
with imported mock array of Hero interface types - Updated
heroesData.service.ts
getHeroes()
&getHero()
are both usingHttpClient
to retrieve data through a RxJS Observable- Utilizing a
pipe
to handle errors - Utilizing a
tap
to call messageService which has been consolidated into aprivate log()
util method
- Utilizing a
0.6.0 - Hero Detail Routing
- Added
getHero(id)
method toheroesDataService
- Added
detail/:id
route toapp-routing.module.ts
- Cleaned
heroes.component.html
&heroes.component.ts
of any selection logic now that routerLink will send the user to the appropriate route - Updated
hero-detail.component.ts
- Getting selected hero ID from the
paramMap.get()
provided through theActivatedRoute
import. ID is being passed into localgetHero()
method which is called inngOnInit()
and usingheroDataService.getHero()
- Added
goBack()
method to return to previous page through theLocation
import
- Getting selected hero ID from the
Screenshots:
0.5.0 - Initial Routing
- Added 3 routes to
app-routing.module.ts
- path: '' => redirects to '/dashboard'
- path: 'dashboard' =>
DashboardComponent
- path: 'heroes' =>
HeroesComponent
app.compoent.html
- Replaced
<app-heroes>
element with<router-outlet>
element - Added 2
routerLinks
- '/heroes'
- '/dashboard'
- Replaced
- Created
DashboardComponent
that is using the `HeroesDataService and rendering the name of heroes from index 1-5
0.4.0 - Messages Service & Messages Component
-
message.service.ts
added to services directory- Property: array of strings representing a cache of messages
- Methods
- add() => pushes new message into cache
- clear() => removes all messages from cache
-
heroData.service
usingmessage.service
to log requests for heroes -
heroes.component
usingmessage.service
to log when a user selects an individual hero -
Added
messages
component which is rendering in theapp.component.html
through an*ngIf
if the messages cache is not empty
0.3.1 - Heroes Data Service w/ RxJS Observable
heroesData.service.ts
is now using RxJS with anObservable
return type and simulate the asynchronous fetching of dataheroes.component.ts
is subscribing to the returnedObservable
and only updatingthis.heroes
when data is returned
0.3.0 - Heroes Data Service
- Created
services
directory- Added
heroesData.service.ts
@Injectable()
created the service and defined its injector as the root injectorgetHeros()
is returning a mocked array of Hero interface types
- Added
heroes.component.ts
is requesting an injection of theherosData
service and using the service in thengInit()
lifecycle method
0.2.1 - Hero Detail SubComponent
hero-detail
component is now responsible for all logic relating to a selected heroheroes.component.html
is usingone-way property binding
to pass a selectedHero to thehero-detail
componenthero-detail
is receiving theone-way property binding
through an@input()
which expects the passed data to be of the Hero interface type
heros
is only responsible for displaying list of heros
- New (truncated and rearranged)
src
directory
βββ src
βΒ Β βββ app
βΒ Β βΒ Β βββ app.component.html
βΒ Β βΒ Β βββ app.component.less
βΒ Β βΒ Β βββ app.component.spec.ts
βΒ Β βΒ Β βββ app.component.ts
βΒ Β βΒ Β βββ app.module.ts
βΒ Β βΒ Β βββ heroes
βΒ Β βΒ Β βββ hero-detail
βΒ Β βΒ Β βΒ Β βββ hero-detail.component.html
βΒ Β βΒ Β βΒ Β βββ hero-detail.component.less
βΒ Β βΒ Β βΒ Β βββ hero-detail.component.spec.ts
βΒ Β βΒ Β βΒ Β βββ hero-detail.component.ts
βΒ Β βΒ Β βββ heroes.component.html
βΒ Β βΒ Β βββ heroes.component.less
βΒ Β βΒ Β βββ heroes.component.spec.ts
βΒ Β βΒ Β βββ heroes.component.ts
βΒ Β βββ __mocks__
βΒ Β βΒ Β βββ heroes.mock.ts
βΒ Β βββ interface
βΒ Β βΒ Β βββ hero.interface.ts
βΒ Β βββ styles
βΒ Β βΒ Β βββ cssReset.css
βΒ Β βΒ Β βββ global.less
βΒ Β βΒ Β βββ variables.less
βΒ Β βββ styles.less
0.2.0 - Hero List
- Created separate
styles
directory- Moved
CSS Reset
&Global Styles
- Added LESS Variables
- Font Sizing
- Font Colors
- Background Colors
- Moved
- Mocking array of 10 heroes based on imported Hero type interface
heroes.component.html
- Rendering unordered list of 10 heroes
- List styling accommodates up to
id: 10000
- on selection of a single hero
*ngIf
displays selected hero content and exposes the ability to update the selected hero
0.1.0 - Project Initialization
StartTime: Early Afternoon - Saturday 10/17
- Angular CLI Installed w/
@latest
- Angular CLI: 10.1.7
- Node: 12.14.1
- App Created
- No Initial Routing
- LESS Styling
- CSS Reset w/ Meyers Reset v2.0
Pre-Project Course
Course Name: Angular - The Complete Guide (2020 Edition)
Course Author: Maximilian SchwarzmΓΌller
StartTime: After Internship - Friday 10/16
EndTime: Early Afternoon - Saturday 10/17