Commit 8fe0d4e1 by Muhammad Usman

personal details functionality added

parent b55f1f96
import { AfterViewInit, HostListener, OnDestroy, OnInit } from '@angular/core';
import { AfterViewInit, HostListener, OnDestroy } from '@angular/core';
import { Subject } from 'rxjs';
export class BaseComponent implements AfterViewInit, OnDestroy {
isEditMode = false;
isLoading = false;
isSaving = false;
isMobileView = false;
resizeTimeout = 500;
createdObjs = {};
updatedObjs = {};
deletedObjs = {};
protected componentInView = new Subject();
......
export const CLASSES = {
MESSAGE_TEMPLATE: 'performa.orm.MessageTemplate',
TEMPLATE_TYPE: 'performa.orm.types.TemplateType',
APPLICATION_STATUS: 'performa.orm.types.ApplicationStatus',
HIRING_TEAM: 'performa.orm.HiringTeam',
PLACEHOLDER_OPTIONS: 'performa.orm.types.PlaceholderOptions',
WORKFLOW_TEMPLATE: 'performa.orm.WorkFlowTemplate',
WORKFLOW_MESSAGE: 'performa.orm.WorkFlowMessage',
WORKFLOW_STAGE: 'performa.orm.WorkFlowStage',
WORKFLOW_STEP: 'performa.orm.WorkFlowStep',
JOB_APPLICATION: 'performa.orm.JobApplication',
MESSAGE: 'performa.orm.Message',
CHAT_ATTACHMENT: 'performa.orm.ChatAttachment',
CANDIDATE: 'performa.orm.Candidate',
USER: 'oneit.security.SecUser',
JOB: 'performa.orm.Job',
CAREER_PROFILE: 'performa.orm.CareerProfile'
};
export const SERVICES = {
MESSAGE_TEMPLATES: 'MessageTemplates',
WORKFLOW_TEMPLATES: 'WorkFlowTemplates',
SAVE_MESSAGE_AS_COPY: 'SaveMessageAsCopy',
SAVE_WORKFLOW_AS_COPY: 'SaveWorkflowAsCopy',
SAVE_WORKFLOW: 'SaveWorkFlowTemplate',
SAVE: 'Save',
CAREER_PROFILES: 'CareerProfiles',
JOB_TITLES: 'JobTitles',
};
export const SEARCH = {
MESSAGE_TEMPLATE: 'ListMessageTemplate',
WORKFLOW_TEMPLATE: 'ListWorkFlow'
};
export const ASSOCS = {
WORKFLOW_STAGE: 'WorkFlowStages',
WORKFLOW_MESSAGE: 'WorkFlowMessages',
WORKFLOW_STEP: 'Steps',
MESSAGE_TEMPLATE: 'MessageTemplate',
JOB: 'Job',
CANDIDATE: 'Candidate',
USER: 'User',
MESSAGES: 'Messages',
HIRING_TEAM: 'HiringTeam',
SENT_BY: 'SentBy',
ATTACHMENTS: 'Attachments'
};
......@@ -7,6 +7,7 @@ import { DashboardComponent } from './dashboard/dashboard.component';
import { HomeComponent } from './home/home.component';
import { LeftSidebarComponent } from './left-sidebar/left-sidebar.component';
import { ProfileTasksComponent } from './profile-tasks/profile-tasks.component';
import { PersonalDetailsComponent } from './personal-details/personal-details.component';
@NgModule({
imports: [
......@@ -18,7 +19,8 @@ import { ProfileTasksComponent } from './profile-tasks/profile-tasks.component';
DashboardComponent,
HomeComponent,
LeftSidebarComponent,
ProfileTasksComponent
ProfileTasksComponent,
PersonalDetailsComponent
]
})
......
......@@ -2,6 +2,7 @@ import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { DashboardComponent } from './dashboard/dashboard.component';
import { HomeComponent } from './home/home.component';
import { PersonalDetailsComponent } from './personal-details/personal-details.component';
const routes: Routes = [
{
......@@ -13,6 +14,10 @@ const routes: Routes = [
component: HomeComponent
},
{
path: 'personal-details',
component: PersonalDetailsComponent
},
{
path: '',
redirectTo: 'home',
pathMatch: 'full'
......
......@@ -39,6 +39,7 @@
width: 0;
transition: .5s;
color: #fff;
z-index: 1000;
&.show {
width: 100%;
......
......@@ -4,7 +4,7 @@
</div>
<div class="sidebar-navigation">
<div class="sidebar-navigation-item" routerLink="/my-career-web/dashboard/home" routerLinkActive="active">
<div class="sidebar-navigation-item" routerLink="/my-career-web/dashboard" routerLinkActive="active">
<span class="sidebar-navigation-item-icon">
<i class="fa fa-home"></i>
</span>
......
<div class="mc-page-header">
Personal Information
</div>
<div class="personal-details">
<app-overlay [isActive]="isLoading"></app-overlay>
<form class="row" #form="ngForm">
<div class="col-md-6 form-group">
<label>First Name</label>
<app-form-control>
<input type="text" class="form-control" placeholder="First Name" required name="FirstName" [(ngModel)]="careerProfile.Candidate.User.FirstName">
</app-form-control>
</div>
<div class="col-md-6 form-group">
<label>Last Name</label>
<app-form-control>
<input type="text" class="form-control" placeholder="Last Name" required name="LastName" [(ngModel)]="careerProfile.Candidate.User.LastName">
</app-form-control>
</div>
<div class="col-md-6 form-group">
<label>Email</label>
<app-form-control>
<input type="email" email="" class="form-control" placeholder="Email Address" required name="Email" [(ngModel)]="careerProfile.Candidate.User.Email">
</app-form-control>
</div>
<div class="col-md-6 form-group">
<label>Mobile</label>
<app-form-control>
<input type="text" class="form-control" placeholder="Mobile No" [(ngModel)]="careerProfile.Mobile" name="Mobile">
</app-form-control>
<div class="mobile-no-msg" *ngIf="!careerProfile.Mobile">
You did not enter a mobile phone number. We occasionally try to contact you via text message.
</div>
</div>
<div class="col-md-12 form-group">
<label>Address</label>
<app-form-control>
<input type="text" appGooglePlacesAutocomplete (change)="changedAddress()" (addressSelected)="updateAddress($event)" class="form-control" placeholder="Address" required [(ngModel)]="careerProfile.GoogleAddress" name="Address">
</app-form-control>
</div>
<div class="col-md-6 form-group">
<label>Skype</label>
<app-form-control>
<input type="text" class="form-control" placeholder="Skype" [(ngModel)]="careerProfile.Skype" name="Skype">
</app-form-control>
</div>
<div class="col-md-6 form-group">
<label>Occupation Preference</label>
<p-autoComplete placeholder="Occupation Preference" (completeMethod)="getJobTitles($event)" [forceSelection]="true" field="JobTitle" [suggestions]="jobTitles" name="OccupationPreference" [(ngModel)]="careerProfile.Candidate.OccupationPreference" dataKey="ObjectID">
</p-autoComplete>
</div>
<div class="col-md-6 form-group">
<label>Employment Preference</label>
<div class="row">
<div class="col-sm-12" *ngIf="isLoadingPreferences"><i class="pi pi-spin pi-spinner"></i></div>
<div class="col-sm-6" *ngFor="let preference of employmentPreferences; let i = index;">
<p-checkbox [label]="preference.Description" [value]="preference.Value" [(ngModel)]="careerProfile.Candidate.EmploymentPreference" name="pref-{{i}}">
</p-checkbox>
</div>
</div>
</div>
<div class="col-md-6 form-group">
<label>Employment Status</label>
<p-dropdown placeholder="Employment Status" [options]="employmentStatuses" [dropdownIcon]="isLoadingStatuses ? 'pi pi-spin pi-spinner' : 'pi pi-chevron-down'" optionLabel="Description" name="EmploymentStatus" [(ngModel)]="careerProfile.Candidate.EmploymentStatus" dataKey="Value">
</p-dropdown>
</div>
<div class="col-md-12">
<div class="row">
<div class="col-md-6 form-group new-opportunity">
<label>I am interested in new opportunities</label>
<p-inputSwitch [(ngModel)]="careerProfile.Candidate.InterestedInOpportunities" name="Interested">
</p-inputSwitch>
</div>
</div>
</div>
<div class="col-md-6 mt-4 d-flex justify-content-center">
<button type="button" pButton label="Connect With Google" class="ui-button-google" (click)="connectWithSocial('GOOGLE')" *ngIf="!careerProfile.IsGoogleConnected"></button>
<button type="button" pButton label="Connected With Google" class="ui-button-google" *ngIf="careerProfile.IsGoogleConnected"></button>
</div>
<div class="col-md-6 mt-4 d-flex justify-content-center">
<button type="button" pButton label="Connect With LinkedIn" class="ui-button-facebook" (click)="connectWithSocial('LINKEDIN')" *ngIf="!careerProfile.IsLinkedInConnected"></button>
<button type="button" pButton label="Connected With LinkedIn" class="ui-button-facebook" *ngIf="careerProfile.IsLinkedInConnected"></button>
</div>
<div class="col-md-12 d-flex justify-content-end mt-5">
<button (click)="updateProfile()" pButton [icon]="isSaving ? 'pi pi-spin pi-spinner' : 'pi pi-save'" label="Update Information" class="ui-button-info" [disabled]="isLoading || isSaving">
</button>
</div>
</form>
</div>
@import "~styles/my-career-styles/variables";
.personal-details {
margin: -2% 4%;
background: #FFFFFF;
box-shadow: 0 0 20px 0 rgba(128,130,133,0.13);
padding: 2% 4%;
position: relative;
h3 {
font-family: $headingFont;
font-size: 24px;
font-weight: bold;
margin: 0 0 20px;
}
.new-opportunity {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0;
label {
margin: 0;
}
}
.update-info-btn {
border-radius: 4px;
background-color: #12A8DE;
font-family: $bodyFont;
color: #fff;
border: 0;
font-weight: bold;
padding: 12px 8px;
height: 40px;
margin-left: auto;
}
}
.mobile-no-msg {
padding: 8px;
font-size: 12px;
font-family: $bodyFont;
background: lightblue;
color: #12709a;
border-radius: 4px;
margin-top: 8px;
}
@media only screen and (max-width: 600px) {
.personal-details {
padding: 5%;
}
}
import { ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core';
import { BaseComponent } from '../../base/base.component';
import { PersonalDetailsService } from '../../services/personal-details.service';
import { takeUntil } from 'rxjs/operators';
import { HelperService } from '../../services/helper.service';
import { CareerProfileModel } from '../../models/career-profile.model';
import { UtilsService } from '../../../../oneit/services/utils.service';
import { NgForm } from '@angular/forms';
import { ToasterService } from '../../services/toaster.service';
import { environment } from '../../../../../environments/environment';
import { AppService } from '../../../../app.service';
@Component({
selector: 'app-personal-details',
templateUrl: './personal-details.component.html',
styleUrls: ['./personal-details.component.scss']
})
export class PersonalDetailsComponent extends BaseComponent implements OnInit {
isLoadingStatuses = false;
isLoadingPreferences = false;
employmentStatuses = [];
employmentPreferences = [];
jobTitles = [];
careerProfile = new CareerProfileModel();
assocs = ['Candidate.User', 'Candidate.OccupationPreference'];
@ViewChild('form') form: NgForm;
constructor(
private ps: PersonalDetailsService,
private us: UtilsService,
private ts: ToasterService,
private hs: HelperService,
private cdr: ChangeDetectorRef,
private aps: AppService,
) {
super();
}
ngOnInit() {
this.getEmploymentStatuses();
this.getEmploymentPreferences();
this.getCareerProfile();
}
getEmploymentStatuses(): void {
this.isLoadingStatuses = true;
this.ps.getEmploymentStatuses()
.pipe(takeUntil(this.componentInView))
.subscribe(response => {
this.employmentStatuses = response;
this.isLoadingStatuses = false;
}, err => {
this.hs.handleHttpError(err);
this.isLoadingStatuses = false;
})
}
getEmploymentPreferences(): void {
this.isLoadingPreferences = true;
this.ps.getEmploymentPreferences()
.pipe(takeUntil(this.componentInView))
.subscribe(response => {
this.employmentPreferences = response;
this.isLoadingPreferences = false;
}, err => {
this.hs.handleHttpError(err);
this.isLoadingPreferences = false;
})
}
getJobTitles($event): void {
this.ps.getJobTitles({JobTitle: $event.query})
.pipe(takeUntil(this.componentInView))
.subscribe(response => {
this.jobTitles = response;
}, err => {
this.hs.handleHttpError(err);
})
}
getCareerProfile(): void {
this.isLoading = true;
this.ps.getCareerProfile(this.assocs)
.pipe(takeUntil(this.componentInView))
.subscribe(response => {
this.careerProfile = response;
this.updatedObjs[this.careerProfile.ObjectID] = this.careerProfile;
this.updatedObjs[this.careerProfile.Candidate.ObjectID] = this.careerProfile.Candidate;
this.updatedObjs[this.careerProfile.Candidate.User.ObjectID] = this.careerProfile.Candidate.User;
if (this.careerProfile.Candidate.EmploymentPreference) {
this.careerProfile.Candidate.EmploymentPreference = this.careerProfile.Candidate.EmploymentPreference.map(p => p.Value);
}
this.isLoading = false;
}, err => {
this.hs.handleHttpError(err);
this.isLoading = false;
})
}
updateProfile(): void {
if (this.form.invalid) {
return this.hs.validateAllFormFields(this.form);
}
this.isSaving = true;
this.ps.saveProfile(this.createdObjs, this.updatedObjs, this.deletedObjs)
.pipe(takeUntil(this.componentInView))
.subscribe(() => {
this.ps.careerProfileUpdated = this.careerProfile;
this.ts.success('Profile updated.');
this.isSaving = false;
}, err => {
this.hs.handleHttpError(err);
this.isSaving = false;
})
}
updateAddress($event): void {
this.careerProfile = {...this.careerProfile, ...{GoogleAddress: $event.address}};
this.cdr.detectChanges();
}
changedAddress(): void {
this.careerProfile.GoogleAddress = ' ';
}
connectWithSocial(type): void {
const params = {
environment: environment.envName,
nextPage: window.location.href.split('/#/')[0] + '/#/my-career-web/dashboard/home'
};
const svc = type === 'LINKEDIN' ? 'LoginWithLinkedIn' : 'LoginWithGoogle';
this.aps.socicalMediaLogin(svc, params)
.pipe(takeUntil(this.componentInView))
.subscribe(data => {
this.isLoading = false;
if (data.destination) {
window.location.href = data.destination;
return;
}
},
err => {
this.hs.handleHttpError(err);
}
)
}
}
<div class="right-sidebar">
<app-overlay [isActive]="isLoading"></app-overlay>
<div class="user-profile">
<i class="fa fa-bell" *ngIf="!isMobileView"></i>
<div class="user-profile-avatar-wrapper">
......@@ -11,8 +11,8 @@
<hr style="border-bottom: 1px solid #E0E0E0; margin: 24px 0;">
<div class="user-profile-name">MARK STAFFORD</div>
<div class="user-profile-role" style="margin-top: 5px;">Web Developer</div>
<div class="user-profile-name">{{careerProfile.Candidate.User.FirstName}} {{careerProfile.Candidate.User.LastName}}</div>
<div class="user-profile-role" style="margin-top: 5px;">{{careerProfile.Candidate?.OccupationPreference?.JobTitle}}</div>
<div class="user-profile-completion">
......@@ -20,8 +20,8 @@
<div class="user-profile-section active">
<span>Personal Details</span>
<span class="section-percentage">0%</span>
<button class="section-start">Get started</button>
<button pButton label="Get Started" routerLink="/my-career-web/dashboard/personal-details" class="ui-button-info section-start">
</button>
</div>
<div class="user-profile-section">
<span>Work Strengths</span>
......
......@@ -2,6 +2,7 @@
.right-sidebar {
padding: 26px 24px;
position: relative;
.user-profile {
position: relative;
......@@ -84,15 +85,7 @@
}
.section-start {
border-radius: 4px;
background-color: #12A8DE;
line-height: 21px;
font-family: $bodyFont;
color: #fff;
box-shadow: none;
border: 0;
display: block;
height: 40px;
width: 100%;
margin-top: 7px;
}
......
import { Component, OnInit } from '@angular/core';
import { BaseComponent } from '../../base/base.component';
import { PersonalDetailsService } from '../../services/personal-details.service';
import { takeUntil } from 'rxjs/operators';
import { CareerProfileModel } from '../../models/career-profile.model';
import { HelperService } from '../../services/helper.service';
import { UtilsService } from '../../../../oneit/services/utils.service';
@Component({
selector: 'app-profile-tasks',
......@@ -8,11 +13,37 @@ import { BaseComponent } from '../../base/base.component';
})
export class ProfileTasksComponent extends BaseComponent implements OnInit {
constructor() {
assocs = ['Candidate.User', 'Candidate.OccupationPreference'];
careerProfile = new CareerProfileModel();
constructor(
private hs: HelperService,
private us: UtilsService,
private ps: PersonalDetailsService
) {
super();
}
ngOnInit() {
this.getCareerProfile();
this.ps.careerProfileUpdated$
.pipe(takeUntil(this.componentInView))
.subscribe(profile => {
this.careerProfile = this.us.cloneObject(profile);
})
}
getCareerProfile(): void {
this.isLoading = true;
this.ps.getCareerProfile(this.assocs)
.pipe(takeUntil(this.componentInView))
.subscribe(response => {
this.careerProfile = response;
this.isLoading = false;
}, err => {
this.hs.handleHttpError(err);
this.isLoading = false;
})
}
}
import { Directive, ElementRef, EventEmitter, OnInit, Output } from '@angular/core';
declare var google: any;
@Directive({
selector: '[appGooglePlacesAutocomplete]'
})
export class GooglePlacesAutocompleteDirective implements OnInit {
@Output() readonly addressSelected: EventEmitter<any> = new EventEmitter();
private readonly element: HTMLInputElement;
static getFormattedAddress(place): any {
const googleLocation: any = {};
googleLocation.lat = place.geometry.location.lat();
googleLocation.lng = place.geometry.location.lng();
for (const i in place.address_components) {
if (place.address_components.hasOwnProperty(i)) {
const item = place.address_components[i];
googleLocation.address = place.formatted_address;
// if (item.types.indexOf('administrative_area_level_1') > -1) {
// googleLocation.city = item.long_name;
// } else if (item.types.indexOf('administrative_area_level_2') > -1) {
// googleLocation.town_area = item.long_name;
// } else if (item.types.indexOf('administrative_area_level_3') > -1) {
// if (!googleLocation.town_area) {
// googleLocation.town_area = item.long_name;
// }
// } else if (item.types.indexOf('country') > -1) {
// googleLocation.country = item.long_name;
// } else if (item.types.indexOf('postal_code') > -1) {
// googleLocation.zipcode = item.short_name;
// } else if (item.types.indexOf('route') > -1) {
// googleLocation.street = item.long_name;
// } else if (item.types.indexOf('route') > -1) {
// googleLocation.street = item.long_name;
// } else if (item.types.indexOf('street_number') > -1) {
// googleLocation.building_no = item.long_name;
// }
}
}
return googleLocation;
}
constructor(private elRef: ElementRef) {
this.element = elRef.nativeElement;
}
ngOnInit(): void {
const autocomplete = new google.maps.places.Autocomplete(this.element);
google.maps.event.addListener(autocomplete, 'place_changed', () => {
this.addressSelected.emit(GooglePlacesAutocompleteDirective.getFormattedAddress(autocomplete.getPlace()));
});
}
}
......@@ -8,13 +8,23 @@ import { HelperService } from '../services/helper.service';
import { ToasterService } from '../services/toaster.service';
import { FormControlComponent } from './form-control/form-control.component';
import { OverlayComponent } from './overlay/overlay.component';
import { DropdownModule } from 'primeng/dropdown';
import { AutoCompleteModule } from 'primeng/autocomplete';
import { PersonalDetailsService } from '../services/personal-details.service';
import { InputSwitchModule } from 'primeng/inputswitch';
import { ButtonModule } from 'primeng/button';
import { GooglePlacesAutocompleteDirective } from './google-places-autocomplete.directive';
const MODULES = [
ReactiveFormsModule,
FormsModule,
RadioButtonModule,
CheckboxModule,
ToastModule
DropdownModule,
AutoCompleteModule,
ToastModule,
InputSwitchModule,
ButtonModule,
];
const COMPONENTS = [
......@@ -23,6 +33,7 @@ const COMPONENTS = [
];
const DIRECTIVES = [
GooglePlacesAutocompleteDirective
];
@NgModule({
......@@ -37,7 +48,8 @@ const DIRECTIVES = [
],
providers: [
ToasterService,
HelperService
HelperService,
PersonalDetailsService
],
declarations: [
...COMPONENTS,
......
export class BaseModel {
ObjectID = '';
ObjectCreatedStr = null;
ObjectLastModifiedStr = null;
}
import { UserModel } from './user.model';
import { CLASSES } from '../config/constants';
import { BaseModel } from './base.model';
export class CandidateModel extends BaseModel {
ObjectClass = CLASSES.CANDIDATE;
Phone: string;
ForgotPasswordMailSendDate: string;
ForgotPasswordKey: string;
VerificationMailSendDate: string;
VerificationKey: string;
IsAccountVerified: boolean;
IsPasswordChanged: boolean;
GoogleAddressText: string;
OccupationPreference: any;
EmploymentStatus: string;
EmploymentPreference: Array<any>;
InterestedInOpportunities: string;
IsEmailIngest: boolean;
IsMaskedEmail: boolean;
KnownAsAlias: string;
PrivacyPolicyAgreed: boolean;
ConditionsAgreed: boolean;
HasValidAddress: boolean;
User = new UserModel();
TestInput: string;
TestAnalysises: Array<string>;
JobApplications: Array<string>;
CultureCriteriaAnswers: Array<string>;
ProfileAssessmentAnswers: Array<string>;
DiversityAnswers: Array<string>;
}
import { BaseModel } from './base.model';
import { CandidateModel } from './candidate.model';
import { CLASSES } from '../config/constants';
export class CareerProfileModel extends BaseModel {
ObjectClass = CLASSES.CAREER_PROFILE;
Mobile: string;
GoogleAddress: string;
Skype: string;
Candidate = new CandidateModel();
IsGoogleConnected: boolean;
IsLinkedInConnected: boolean;
}
import { BaseModel } from './base.model';
import { CLASSES } from '../config/constants';
export class UserModel extends BaseModel {
ObjectClass = CLASSES.USER;
UserName: string;
Password: string;
Enabled: boolean;
PasswordExpiryDate: string;
FirstName: string;
LastName: string;
Name: string;
UserDescription: string;
Email: string;
SupportUser: string;
SupportKey: string;
ResetPassword: boolean;
PasswordRehashed: boolean;
UpdatedPassword: string;
PrivsOverrides: string;
RolesOverrides: string;
GroupsOverrides: string;
ReportsTo: string;
PrivilegeGrants: Array<string>;
RoleGrants: Array<string>;
GroupGrants: Array<string>;
UserPasswords: Array<string>;
Extensions: Array<string>;
}
import { Injectable } from '@angular/core';
import { EnumService } from '../../../oneit/services/enum.service';
import { Observable, Subject } from 'rxjs';
import { SearchService } from '../../../oneit/services/search.service';
import { UtilsService } from '../../../oneit/services/utils.service';
import { SaveService } from '../../../oneit/services/save.service';
import { SERVICES } from '../config/constants';
import { CareerProfileModel } from '../models/career-profile.model';
@Injectable()
export class PersonalDetailsService {
private _detailsUpdated = new Subject<CareerProfileModel>();
get careerProfileUpdated$(): Observable<CareerProfileModel> {
return this._detailsUpdated.asObservable();
}
set careerProfileUpdated(profile: CareerProfileModel) {
this._detailsUpdated.next(profile);
}
constructor(
private es: EnumService,
private us: UtilsService,
private ss: SearchService,
private svs: SaveService
) {
}
getEmploymentStatuses(): Observable<any> {
return this.es.getEnums('EmploymentStatuses', true);
}
getEmploymentPreferences(): Observable<any> {
return this.es.getEnums('EmploymentPreferences', true);
}
getJobTitles(queryParams = {}, assocs = []): Observable<any> {
return this.ss.getObjects(SERVICES.JOB_TITLES, 'All', queryParams, assocs, null, null, null, null)
.map(
data => {
return this.us.convertResponseToObjects(data, assocs);
}
)
}
getCareerProfile(assocs = []): Observable<CareerProfileModel> {
return this.ss.getObjects(SERVICES.CAREER_PROFILES, 'All', {}, assocs, null, null, null, null)
.map(
data => {
return this.us.convertResponseToObjects(data, assocs)[0];
}
)
}
saveProfile(createdObjs, updatedObjs, deletedObjs): Observable<any> {
return this.svs.saveObjectsWithDefaultSvc(createdObjs, updatedObjs, deletedObjs);
}
}
......@@ -11,6 +11,9 @@
<title>PerformaInvestments</title>
<link id="layout-css" rel="stylesheet" type="text/css" href="app/oneit/assets/layout/css/layout-oneit.css">
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCZ-_hEi8igC1Jyw0Qm4WM2t4wpVgMx5Do&libraries=places"
async defer></script>
</head>
<body class="">
......
......@@ -16,6 +16,10 @@
&-between {
justify-content: space-between;
}
&-end {
justify-content: flex-end;
}
}
......@@ -31,3 +35,18 @@
position: relative;
}
}
.m {
&t-0 { margin-top: 0; }
&t-1 { margin-top: 0.5em; }
&t-2 { margin-top: 1em; }
&t-3 { margin-top: 1.5em; }
&t-4 { margin-top: 2em; }
&t-5 { margin-top: 3em; }
}
......@@ -9,3 +9,13 @@
}
}
.mc-page-header {
background: #58595B;
padding: 3% 8%;
position: relative;
color: #FFFFFF;
font-family: $headingFont;
font-size: 24px;
font-weight: bold;
}
......@@ -4,11 +4,16 @@
@import url('~assets/my-career-web/fonts/catamaran/catamaran.css');
@import url('~assets/my-career-web/fonts/montserrat/montserrat.css');
@import "variables";
@import "flex-helpers";
@import "form";
@import "misc";
@import "primeng/radio";
@import "primeng/checkbox";
@import "primeng/toast";
@import "primeng/autocomplete";
@import "primeng/dropdown";
@import "primeng/switch";
@import "primeng/button";
}
$headingFont: 'Montserrat', sans-serif;
$bodyFont: 'Catamaran', sans-serif,
$bodyFont: 'Catamaran', sans-serif;
$primaryColor: #12A8DE;
p-autoComplete {
display: block;
font-family: $bodyFont;
.ui-autocomplete {
width: 100%;
&-loader {
right: 1em !important;
}
.ui-inputtext {
border-radius: 4px;
border: 2px solid #E0E0E0;
width: 100%;
height: 46px;
padding: 6px 12px;
font-size: 14px;
background-image: none !important;
transition: .3s;
&:focus {
background-image: none !important;
}
&:focus, &:active {
border: 2px solid #12A8DE !important;
}
}
}
}
.ui-button {
height: 40px;
transition: .3s;
font-family: $bodyFont;
&-info {
background-color: $primaryColor !important;
&:hover {
background-color: #1091bf !important;
}
}
&-google {
background-color: #de5246 !important;
&:hover {
background-color: #C34C41 !important;
}
}
&-facebook {
background-color: #0072b1 !important;
&:hover {
background-color: #005A8D !important;
}
}
}
......@@ -15,5 +15,9 @@ p-checkbox {
border-color: #12A8DE !important;
}
}
&-label {
margin-bottom: 0;
}
}
}
p-dropdown {
display: block;
font-family: $bodyFont;
.ui-dropdown {
width: 100% !important;
background-image: none !important;
max-width: 100%;
&-label {
width: 100%;
height: 46px;
border-radius: 4px;
padding: 6px 12px;
border: 2px solid #E0E0E0;
line-height: 30px !important;
transition: .3s;
&:focus, &:active {
border: 2px solid #12A8DE !important;
}
}
&-trigger {
top: 13px;
margin-right: 12px;
}
}
}
p-inputSwitch {
display: block;
line-height: 0;
.ui-inputswitch {
margin: 0;
&-slider {
&:before {
left: 2px !important;
}
}
&.ui-inputswitch-checked {
background-color: #21b8fc !important;
border-color: #21b8fc !important;
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment