profile-studio/app/app.js

496 lines
8.8 KiB
JavaScript

//------------------------------------------------------------------------------------------
/*
* The root application.
*/
//------------------------------------------------------------------------------------------
/**
* Define all the routes in the application/
*/
var router = new VueRouter({
routes: [
{ path: '/', component: homeComponent },
{ path: '/section/basics', component: sectionBasicsComponent },
{ path: '/section/work', component: sectionWorkComponent },
{ path: '/section/volunteer', component: sectionVolunteerComponent },
{ path: '/section/education', component: sectionEducationComponent },
{ path: '/section/awards', component: sectionAwardsComponent },
{ path: '/section/publications', component: sectionPublicationsComponent },
{ path: '/section/skills', component: sectionSkillsComponent },
{ path: '/section/languages', component: sectionLanguagesComponent },
{ path: '/section/interests', component: sectionInterestsComponent },
{ path: '/section/references', component: sectionReferencesComponent },
{ path: '/preview', component: previewResumeComponent },
{ path: '/import', component: importComponent },
{ path: '/export', component: exportComponent },
{ path: '/about', component: aboutComponent }
]
});
var app = new Vue({
el: '#app',
router: router,
components:
{
},
data:
{
status: "laading",
sections: {},
/**
* Details of the current page/route.
*/
activePage: {
id: "",
title: "",
fontAwesomeIconCss: ""
}
},
created()
{
this.sections = this.getDefaultSections();
//-- Register all components
components.registerComponents();
//-- Get the component for the initial route path
var initialRoute = this.$route.path;
var component = components.getComponentByPath(initialRoute);
this.setActivePageByComponent(component);
},
destroyed()
{
},
mounted()
{
//this.loadFromStorage();
// Set the "current" main navigation item based on the current route.
helpers.selectMenuItemForCurrentUrl();
// Once the app is fully displayed, hide the overlay.
helpers.hideFullPageOverlay();
this.status = "loaded"; // Now we can start watching for changes in 'sections' data.
},
methods: {
/**
* Set details of the currently selected "page" (route) from a registered component.
*
* @param object component Object containing the details of a registered component.
*/
setActivePageByComponent: function(component)
{
this.activePage.id = component.id;
this.activePage.title = component.title;
this.activePage.fontAwesomeIconCss = component.fontAwesomeIcon;
},
/**
* Reset and clear the details of the active page.
*/
clearActivePage: function()
{
this.activePage.id = "";
this.activePage.title = "";
this.activePage.fontAwesomeIconCss = "";
},
loadFromStorage: function()
{
var savedData = helpers.getLocalStorage("sections");
this.populateSections(savedData);
},
populateSections: function(data)
{
if (data)
{
// Data previously saved.
for (var key in data)
{
if (data.hasOwnProperty(key))
{
this.sections[key] = data[key];
}
}
}
},
/**
* Clear save data and reset the sections structure.
*/
resetResume: function()
{
var response = confirm("Are you sure you want to clear your saved resume?");
if (response == true)
{
this.sections = this.getDefaultSections();
alert("Your resume has been cleared.");
}
return false;
},
getDefaultSections: function()
{
// return {
// basics: {
// name: "",
// label: "",
// picture: "",
// email: "",
// phone: "",
// website: "",
// summary: "",
// location: {
// address: "",
// postalCode: "",
// city: "",
// countryCode: "",
// region: "",
// },
// profiles: [
// {
// network: "",
// username: "",
// url: "",
// }
// ]
// },
// work: [{
// company: "",
// position: "",
// website: "",
// startDate: "",
// endDate: "",
// summary: "",
// highlights: [""]
// }],
// volunteer: [{
// organization: "",
// position: "",
// website: "",
// startDate: "",
// endDate: "",
// summary: "",
// highlights: []
// }],
// education: [{
// institution: "",
// area: "",
// studyType: "",
// startDate: "",
// endDate: "",
// gpa: "",
// courses: []
// }],
// awards: [{
// title: "",
// date: "",
// awarder: "",
// summary: ""
// }],
// publications: [{
// name: "",
// publisher: "",
// releaseDate: "",
// website: "",
// summary: ""
// }],
// skills: [{
// name: "",
// level: "",
// keywords: []
// }],
// languages: [{
// language: "",
// fluency: ""
// }],
// interests: [{
// name: "",
// keywords: [
// ]
// }],
// references: [{
// name: "",
// reference: ""
// }]
// };
var structure = {
basics: {},
work: [],
volunteer: [],
education: [],
awards: [],
publications: [],
skills: [],
languages: [],
interests: [],
references: []
};
structure.basics = this.getDefaultBasic();
structure.work.push(this.getDefaultWork());
structure.volunteer.push(this.getDefaultVolunteer());
structure.education.push(this.getDefaultEducation());
structure.awards.push(this.getDefaultAward());
structure.publications.push(this.getDefaultPublication());
structure.skills.push(this.getDefaultSkill());
structure.languages.push(this.getDefaultLanguage());
structure.interests.push(this.getDefaultInterest());
structure.references.push(this.getDefaultReference());
return structure;
},
getDefaultBasic: function()
{
return {
name: "",
label: "",
picture: "",
email: "",
phone: "",
website: "",
summary: "",
location: {
address: "",
postalCode: "",
city: "",
countryCode: "",
region: "",
},
profiles: [
{
network: "",
username: "",
url: "",
}
]
};
},
getDefaultBasicProfile: function()
{
return {
network: "",
username: "",
url: "",
};
},
getDefaultWork: function()
{
return {
company: "",
position: "",
website: "",
startDate: "",
endDate: "",
summary: "",
highlights: [""]
};
},
getDefaultWorkHighlight: function()
{
return "";
},
getDefaultVolunteer: function()
{
return {
organization: "",
position: "",
website: "",
startDate: "",
endDate: "",
summary: "",
highlights: [""]
};
},
getDefaulVolunteerHighlight: function()
{
return "";
},
getDefaultEducation: function()
{
return {
institution: "",
area: "",
studyType: "",
startDate: "",
endDate: "",
gpa: "",
courses: [""]
};
},
getDefaultEducationCourse: function()
{
return "";
},
getDefaultAward: function()
{
return {
title: "",
date: "",
awarder: "",
summary: ""
};
},
getDefaultPublication: function()
{
return {
name: "",
publisher: "",
releaseDate: "",
website: "",
summary: ""
};
},
getDefaultSkill: function()
{
return {
name: "",
level: "",
keywords: [""]
};
},
getDefaultSkillKeywoard: function()
{
return "";
},
getDefaultLanguage: function()
{
return {
language: "",
fluency: ""
};
},
getDefaultInterest: function()
{
return {
name: "",
keywords: [""]
};
},
getDefaultInterestKeywoard: function()
{
return "";
},
getDefaultReference: function()
{
return {
name: "",
reference: ""
};
}
},
watch: {
/**
* Detect when a route changes.
*
* @param object to Details of the previous route (navigating away from).
* @param object from Details of the new active route (navigating to).
*/
$route: function (to, from)
{
//console.log("Route change: ", from, " --> ", to);
// Set the "current" main navigation item based on the current route.
helpers.selectMenuItemForCurrentUrl();
// Set the current page details based on the component mapped to the active route.
var component = components.getComponentByPath(to.fullPath);
this.setActivePageByComponent(component);
},
$data: {
handler: function(val, oldVal)
{
// Save the data to localStorage
//NOTE: I'm initially not concerned about performance here.
if (val.status == "loaded")
{
helpers.setLocalStorage("sections", val.sections);
}
},
deep: true
}
},
});