5htp 0.3.6 → 0.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/skeleton/docker-compose.yml +7 -15
- package/skeleton/identity.yaml +12 -8
- package/skeleton/package.json +25 -7
- package/skeleton/src/client/assets/identity/logo.svg +13 -63
- package/skeleton/src/client/assets/identity/logoAndText.svg +9 -104
- package/skeleton/src/client/assets/identity/logoAndTextBlack.svg +11 -0
- package/skeleton/src/client/assets/illustration/landing/banner.webp +0 -0
- package/skeleton/src/client/assets/illustration/landing/candidate/employers.webp +0 -0
- package/skeleton/src/client/assets/illustration/landing/candidate/hero.webp +0 -0
- package/skeleton/src/client/assets/illustration/landing/candidate/mentors.webp +0 -0
- package/skeleton/src/client/assets/illustration/landing/headhunter/hero.webp +0 -0
- package/skeleton/src/client/assets/illustration/landing/hero.jpeg +0 -0
- package/skeleton/src/client/assets/illustration/landing/hero.webp +0 -0
- package/skeleton/src/client/assets/illustration/landing/hero.xcf +0 -0
- package/skeleton/src/client/assets/illustration/landing/recruiter/onboarding.webp +0 -0
- package/skeleton/src/client/assets/illustration/landing/team/andre.png +0 -0
- package/skeleton/src/client/assets/illustration/landing/team/emma.png +0 -0
- package/skeleton/src/client/assets/illustration/landing/team/fei.png +0 -0
- package/skeleton/src/client/assets/illustration/landing/team/gaetan.png +0 -0
- package/skeleton/src/client/assets/illustration/landing/team/jordan.png +0 -0
- package/skeleton/src/client/assets/illustration/landing/team/lery.png +0 -0
- package/skeleton/src/client/assets/illustration/landing/team/mehdi.png +0 -0
- package/skeleton/src/client/assets/illustration/landing/team/omkar.png +0 -0
- package/skeleton/src/client/assets/illustration/landing/team/thibaut.png +0 -0
- package/skeleton/src/client/assets/img/background/header-blur.png +0 -0
- package/skeleton/src/client/assets/img/partners/citron.svg +987 -0
- package/skeleton/src/client/assets/patterns/dots.png +0 -0
- package/skeleton/src/client/assets/theme.less +179 -226
- package/skeleton/src/client/assets/vars.less +54 -0
- package/skeleton/src/client/context.ts +23 -0
- package/skeleton/src/client/index.ts +59 -0
- package/skeleton/src/client/pages/_messages/400.tsx +45 -0
- package/skeleton/src/client/pages/_messages/401.tsx +39 -0
- package/skeleton/src/client/pages/_messages/403.tsx +43 -0
- package/skeleton/src/client/pages/_messages/404.tsx +42 -0
- package/skeleton/src/client/pages/_messages/500.tsx +42 -0
- package/skeleton/src/client/pages/platform/Header.less +12 -0
- package/skeleton/src/client/pages/platform/Header.tsx +119 -0
- package/skeleton/src/client/pages/platform/_layout/index.less +118 -0
- package/skeleton/src/client/pages/platform/_layout/index.tsx +131 -0
- package/skeleton/src/client/pages/platform/_layout/mobile.less +114 -0
- package/skeleton/src/client/pages/platform/_page.tsx +54 -0
- package/skeleton/src/client/pages/platform/headhunters/index.tsx +88 -0
- package/skeleton/src/client/pages/platform/index.tsx +58 -0
- package/skeleton/src/client/pages/platform/missions/index.tsx +149 -0
- package/skeleton/src/client/services/metrics/index.ts +59 -0
- package/skeleton/src/client/tsconfig.json +4 -1
- package/skeleton/src/common/config/router.ts +16 -0
- package/skeleton/src/common/forms/company/bookCall.ts +25 -0
- package/skeleton/src/common/forms/company/importJob.ts +26 -0
- package/skeleton/src/common/forms/company/signup.ts +31 -0
- package/skeleton/src/common/forms/headhunter/feedback.ts +31 -0
- package/skeleton/src/common/forms/headhunter/mission/cancel.ts +26 -0
- package/skeleton/src/common/forms/headhunter/mission/candidate/availability.ts +31 -0
- package/skeleton/src/common/forms/headhunter/mission/candidate/education.ts +19 -0
- package/skeleton/src/common/forms/headhunter/mission/candidate/identity.ts +31 -0
- package/skeleton/src/common/forms/headhunter/mission/candidate/others.ts +19 -0
- package/skeleton/src/common/forms/headhunter/mission/candidate/skills.ts +21 -0
- package/skeleton/src/common/forms/headhunter/mission/reject.ts +23 -0
- package/skeleton/src/common/forms/headhunter/mission/search.ts +78 -0
- package/skeleton/src/common/forms/headhunter/signup.ts +34 -0
- package/skeleton/src/common/libs/headhunter/candidate/index.ts +155 -0
- package/skeleton/src/common/libs/headhunter/mission/index.ts +30 -0
- package/skeleton/src/common/libs/hub/index.ts +41 -0
- package/skeleton/src/server/config/communication.ts +48 -0
- package/skeleton/src/server/config/crosspath.ts +9 -0
- package/skeleton/src/server/config/data.ts +34 -0
- package/skeleton/src/server/config/database.ts +26 -0
- package/skeleton/src/server/config/internal.ts +21 -0
- package/skeleton/src/server/config/user.ts +90 -0
- package/skeleton/src/server/index.ts +111 -23
- package/skeleton/src/server/libs/utils/slug.ts +11 -0
- package/skeleton/src/server/routes/global.ts +33 -0
- package/skeleton/src/server/routes/headhunters.ts +24 -0
- package/skeleton/src/server/routes/missions.ts +50 -0
- package/skeleton/src/server/services/Headhunter/index.ts +127 -0
- package/skeleton/src/server/services/Headhunter/service.json +6 -0
- package/skeleton/src/server/services/Mission/index.ts +174 -0
- package/skeleton/src/server/services/Mission/service.json +6 -0
- package/skeleton/src/server/services/email/sendgrid/index.ts +97 -0
- package/skeleton/src/server/services/email/sendgrid/service.json +6 -0
- package/skeleton/src/server/services/slack/index.ts +105 -0
- package/skeleton/src/server/services/slack/service.json +6 -0
- package/skeleton/src/server/services/users/index.ts +133 -0
- package/skeleton/src/server/services/users/service.json +6 -0
- package/skeleton/src/server/tsconfig.json +6 -8
- package/skeleton/var/typings/routes.d.ts +541 -0
- package/src/index.ts +1 -1
- package/src/utils/keyboard.ts +1 -1
- package/skeleton/package-lock.json +0 -6139
- package/skeleton/src/client/components/LoginModal.tsx +0 -45
- package/skeleton/src/client/pages/app/_layout/index.less +0 -20
- package/skeleton/src/client/pages/app/_layout/index.tsx +0 -33
- package/skeleton/src/client/pages/app/index.tsx +0 -57
- package/skeleton/src/client/pages/landing/_layout/index.less +0 -145
- package/skeleton/src/client/pages/landing/_layout/index.tsx +0 -63
- package/skeleton/src/client/pages/landing/index.tsx +0 -73
- package/skeleton/src/server/models.ts +0 -117
- package/skeleton/src/server/routes/general.ts +0 -66
- package/skeleton/src/server/services/auth/index.ts +0 -80
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/*----------------------------------
|
|
2
|
+
- DEPENDANCES
|
|
3
|
+
----------------------------------*/
|
|
4
|
+
|
|
5
|
+
// Npm
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import dayjs from 'dayjs';
|
|
8
|
+
|
|
9
|
+
// Core
|
|
10
|
+
import { Router } from '@app';
|
|
11
|
+
import { Button, Table } from '@client/components';
|
|
12
|
+
|
|
13
|
+
// App components
|
|
14
|
+
import Header from '@/client/pages/platform/Header';
|
|
15
|
+
|
|
16
|
+
// App
|
|
17
|
+
import Page from '../_page';
|
|
18
|
+
|
|
19
|
+
/*----------------------------------
|
|
20
|
+
- TYPES
|
|
21
|
+
----------------------------------*/
|
|
22
|
+
|
|
23
|
+
import type { Headhunter } from '@/server/models';
|
|
24
|
+
|
|
25
|
+
/*----------------------------------
|
|
26
|
+
- CONTROLEUR
|
|
27
|
+
----------------------------------*/
|
|
28
|
+
Router.page('/headhunters', ({ api, modal, toast }) => {
|
|
29
|
+
|
|
30
|
+
/*----------------------------------
|
|
31
|
+
- INIT
|
|
32
|
+
----------------------------------*/
|
|
33
|
+
|
|
34
|
+
const { headhunters } = api.fetch({
|
|
35
|
+
headhunters: api.get<Headhunter[]>('/headhunters'),
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
/*----------------------------------
|
|
39
|
+
- ACTIONS
|
|
40
|
+
----------------------------------*/
|
|
41
|
+
|
|
42
|
+
const loginAs = (h: Headhunter) => modal.confirm(
|
|
43
|
+
`Login?`,
|
|
44
|
+
`Do you want to login on platform with ${h.name}'s account?`
|
|
45
|
+
).then( shouldOpen => shouldOpen &&
|
|
46
|
+
Router.go('@recruiters/admin/headhunters/' + h.airtableId + '/login')
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
/*----------------------------------
|
|
50
|
+
- RENDER
|
|
51
|
+
----------------------------------*/
|
|
52
|
+
return (
|
|
53
|
+
<Page title="CrossPath - CSM Dashboard">
|
|
54
|
+
|
|
55
|
+
<Header title={<>
|
|
56
|
+
Headhunters
|
|
57
|
+
</>} />
|
|
58
|
+
|
|
59
|
+
<Table className="card" data={headhunters} columns={(h) => ([{
|
|
60
|
+
label: "Name",
|
|
61
|
+
cell: h.name
|
|
62
|
+
},{
|
|
63
|
+
label: "Signup",
|
|
64
|
+
cell: dayjs(h.created).format('DD/MM/YYYY HH:mm')
|
|
65
|
+
},{
|
|
66
|
+
label: "Last Active",
|
|
67
|
+
cell: dayjs(h.activity).format('DD/MM/YYYY HH:mm')
|
|
68
|
+
},{
|
|
69
|
+
label: "Quality of sourcing",
|
|
70
|
+
cell: '--'
|
|
71
|
+
},{
|
|
72
|
+
label: "Time to source",
|
|
73
|
+
cell: '--'
|
|
74
|
+
},{
|
|
75
|
+
label: "Actions",
|
|
76
|
+
cell: (
|
|
77
|
+
<div class='row sp-05 al-right'>
|
|
78
|
+
|
|
79
|
+
<Button size="s" icon="key"
|
|
80
|
+
title="Login as this headhunter"
|
|
81
|
+
onClick={() => loginAs(h)} />
|
|
82
|
+
</div>
|
|
83
|
+
)
|
|
84
|
+
}])} />
|
|
85
|
+
|
|
86
|
+
</Page>
|
|
87
|
+
)
|
|
88
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/*----------------------------------
|
|
2
|
+
- DEPENDANCES
|
|
3
|
+
----------------------------------*/
|
|
4
|
+
|
|
5
|
+
// Npm
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import dayjs from 'dayjs';
|
|
8
|
+
|
|
9
|
+
// Core
|
|
10
|
+
import { Router } from '@app';
|
|
11
|
+
import { Button, Table } from '@client/components';
|
|
12
|
+
import { hello } from '@common/data/chaines/greetings';
|
|
13
|
+
|
|
14
|
+
// App components
|
|
15
|
+
import Header from '@/client/pages/platform/Header';
|
|
16
|
+
|
|
17
|
+
// App
|
|
18
|
+
import Page from './_page';
|
|
19
|
+
|
|
20
|
+
/*----------------------------------
|
|
21
|
+
- TYPES
|
|
22
|
+
----------------------------------*/
|
|
23
|
+
|
|
24
|
+
import type { AcceptedMission, Mission } from '@/server/models';
|
|
25
|
+
|
|
26
|
+
export type TApplicationAction = 'approve'|'reject'
|
|
27
|
+
|
|
28
|
+
/*----------------------------------
|
|
29
|
+
- CONTROLEUR
|
|
30
|
+
----------------------------------*/
|
|
31
|
+
Router.page('/', ({ user, api, modal, toast }) => {
|
|
32
|
+
|
|
33
|
+
/*----------------------------------
|
|
34
|
+
- INIT
|
|
35
|
+
----------------------------------*/
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
/*----------------------------------
|
|
39
|
+
- ACTIONS
|
|
40
|
+
----------------------------------*/
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
/*----------------------------------
|
|
44
|
+
- RENDER
|
|
45
|
+
----------------------------------*/
|
|
46
|
+
return (
|
|
47
|
+
<Page title="CrossPath - CSM Dashboard">
|
|
48
|
+
|
|
49
|
+
<Header title={<>
|
|
50
|
+
{hello()}, {user.name}!<br/>
|
|
51
|
+
Let's bring Cross Path to the stars 🔥
|
|
52
|
+
</>} />
|
|
53
|
+
|
|
54
|
+
Page to be done
|
|
55
|
+
|
|
56
|
+
</Page>
|
|
57
|
+
)
|
|
58
|
+
});
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/*----------------------------------
|
|
2
|
+
- DEPENDANCES
|
|
3
|
+
----------------------------------*/
|
|
4
|
+
|
|
5
|
+
// Npm
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import dayjs from 'dayjs';
|
|
8
|
+
|
|
9
|
+
// Core
|
|
10
|
+
import { Router } from '@app';
|
|
11
|
+
import { Button, Table } from '@client/components';
|
|
12
|
+
import { hello } from '@common/data/chaines/greetings';
|
|
13
|
+
|
|
14
|
+
// App components
|
|
15
|
+
import Header from '@/client/pages/platform/Header';
|
|
16
|
+
|
|
17
|
+
// App
|
|
18
|
+
import Page from '../_page';
|
|
19
|
+
|
|
20
|
+
/*----------------------------------
|
|
21
|
+
- TYPES
|
|
22
|
+
----------------------------------*/
|
|
23
|
+
|
|
24
|
+
import type { AcceptedMission, Mission } from '@/server/models';
|
|
25
|
+
|
|
26
|
+
export type TApplicationAction = 'approve'|'reject'
|
|
27
|
+
|
|
28
|
+
/*----------------------------------
|
|
29
|
+
- CONTROLEUR
|
|
30
|
+
----------------------------------*/
|
|
31
|
+
Router.page('/missions', ({ user, api, modal, toast }) => {
|
|
32
|
+
|
|
33
|
+
/*----------------------------------
|
|
34
|
+
- INIT
|
|
35
|
+
----------------------------------*/
|
|
36
|
+
|
|
37
|
+
const { missions, applications } = api.fetch({
|
|
38
|
+
|
|
39
|
+
missions: api.get<Mission[]>('/missions'),
|
|
40
|
+
|
|
41
|
+
applications: api.get<AcceptedMission[]>('/missions/applications'),
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
const [missionId, setMissionId] = React.useState(null);
|
|
45
|
+
|
|
46
|
+
/*----------------------------------
|
|
47
|
+
- ACTIONS
|
|
48
|
+
----------------------------------*/
|
|
49
|
+
|
|
50
|
+
// Update filters
|
|
51
|
+
React.useEffect(() => {
|
|
52
|
+
|
|
53
|
+
api.reload(['applications'], { missionId });
|
|
54
|
+
|
|
55
|
+
}, [missionId]);
|
|
56
|
+
|
|
57
|
+
const confirmAction = (action: TApplicationAction, a: AcceptedMission) =>
|
|
58
|
+
modal.confirm("Accept this application?", <>
|
|
59
|
+
You're about to accept the following headhunter application:
|
|
60
|
+
|
|
61
|
+
<ul class="col liste">
|
|
62
|
+
<li>Headhunter: {a.headhunter}</li>
|
|
63
|
+
<li>Mission: {a.mission}</li>
|
|
64
|
+
</ul>
|
|
65
|
+
|
|
66
|
+
If you approve, the headhunter will get notified of your approval and will be able to submit candidates for this mission.
|
|
67
|
+
<br />
|
|
68
|
+
Do you want to continue?
|
|
69
|
+
</>).then( shouldAccept => shouldAccept &&
|
|
70
|
+
runAction(action, a)
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
const runAction = (action: TApplicationAction, a: AcceptedMission) =>
|
|
74
|
+
api.post('/missions/applications/' + action, {
|
|
75
|
+
missionId: a.missionId,
|
|
76
|
+
headhunterId: a.headhunterId,
|
|
77
|
+
}).then(() => {
|
|
78
|
+
toast.success("You approved the application. The Headhunter will be notified.");
|
|
79
|
+
api.reload('applications');
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
/*----------------------------------
|
|
83
|
+
- RENDER
|
|
84
|
+
----------------------------------*/
|
|
85
|
+
return (
|
|
86
|
+
<Page title="CrossPath - CSM Dashboard">
|
|
87
|
+
|
|
88
|
+
<Header title={<>
|
|
89
|
+
Missions
|
|
90
|
+
</>} />
|
|
91
|
+
|
|
92
|
+
<div class="row al-top">
|
|
93
|
+
|
|
94
|
+
<aside class="w-3 col">
|
|
95
|
+
|
|
96
|
+
<h2>Your Missions</h2>
|
|
97
|
+
|
|
98
|
+
<ul class="col menu">
|
|
99
|
+
<li>
|
|
100
|
+
<Button nav active={missionId === null}
|
|
101
|
+
onClick={() => setMissionId(null)}>
|
|
102
|
+
All Missions
|
|
103
|
+
</Button>
|
|
104
|
+
</li>
|
|
105
|
+
|
|
106
|
+
{missions.map( m => (
|
|
107
|
+
<li>
|
|
108
|
+
<Button nav active={m.airtableId === missionId}
|
|
109
|
+
onClick={() => setMissionId( m.airtableId )}>
|
|
110
|
+
{m.title}
|
|
111
|
+
</Button>
|
|
112
|
+
</li>
|
|
113
|
+
))}
|
|
114
|
+
</ul>
|
|
115
|
+
|
|
116
|
+
</aside>
|
|
117
|
+
|
|
118
|
+
<div class="col-1 col">
|
|
119
|
+
|
|
120
|
+
<h2>Headhunters Applications</h2>
|
|
121
|
+
|
|
122
|
+
<Table className="card" data={applications} columns={(a) => ([{
|
|
123
|
+
label: "Headhunter",
|
|
124
|
+
cell: a.headhunter
|
|
125
|
+
},{
|
|
126
|
+
label: "Mission",
|
|
127
|
+
cell: a.mission
|
|
128
|
+
},{
|
|
129
|
+
label: "Date Applied",
|
|
130
|
+
cell: dayjs(a.dateStart).format('DD/MM/YYYY HH:mm')
|
|
131
|
+
},{
|
|
132
|
+
label: "Actions",
|
|
133
|
+
cell: (
|
|
134
|
+
<div class='row sp-05 al-right'>
|
|
135
|
+
<Button size="s" class='bg success' icon="check"
|
|
136
|
+
onClick={() => confirmAction('approve', a)} />
|
|
137
|
+
<Button size="s" class='bg error' icon="times"
|
|
138
|
+
onClick={() => confirmAction('reject', a)} />
|
|
139
|
+
</div>
|
|
140
|
+
)
|
|
141
|
+
}])} />
|
|
142
|
+
|
|
143
|
+
</div>
|
|
144
|
+
|
|
145
|
+
</div>
|
|
146
|
+
|
|
147
|
+
</Page>
|
|
148
|
+
)
|
|
149
|
+
});
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/*----------------------------------
|
|
2
|
+
- DEPENDANCES
|
|
3
|
+
----------------------------------*/
|
|
4
|
+
|
|
5
|
+
// Npm
|
|
6
|
+
|
|
7
|
+
// Core
|
|
8
|
+
import type ClientApplication from '@client/app';
|
|
9
|
+
|
|
10
|
+
/*----------------------------------
|
|
11
|
+
- TYPES
|
|
12
|
+
----------------------------------*/
|
|
13
|
+
|
|
14
|
+
declare global {
|
|
15
|
+
interface Window {
|
|
16
|
+
// Defined by loading gtag.js
|
|
17
|
+
gtag: (
|
|
18
|
+
name: string,
|
|
19
|
+
action: string,
|
|
20
|
+
params?: {
|
|
21
|
+
event_category?: string,
|
|
22
|
+
event_label?: string,
|
|
23
|
+
value?: string,
|
|
24
|
+
}
|
|
25
|
+
) => void,
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/*----------------------------------
|
|
30
|
+
- SERVICE
|
|
31
|
+
----------------------------------*/
|
|
32
|
+
export default class ClientMetrics {
|
|
33
|
+
|
|
34
|
+
public constructor( public app: ClientApplication ) {
|
|
35
|
+
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public start() {
|
|
39
|
+
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Tracking
|
|
43
|
+
public event(
|
|
44
|
+
action: string,
|
|
45
|
+
category?: string,
|
|
46
|
+
label?: string,
|
|
47
|
+
value?: string,
|
|
48
|
+
) {
|
|
49
|
+
if (!window.gtag) return console.warn("[tracker] Google Analytics wasn't imported in header > scripts.");
|
|
50
|
+
if (action === 'pageview')
|
|
51
|
+
window.gtag('send', action);
|
|
52
|
+
else
|
|
53
|
+
window.gtag('event', action, {
|
|
54
|
+
event_category: category,
|
|
55
|
+
event_label: label,
|
|
56
|
+
value
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
"rootDir": "..",
|
|
5
5
|
"baseUrl": "..",
|
|
6
6
|
"paths": {
|
|
7
|
+
|
|
8
|
+
"@/server/models": ["./server/.generated/models"],
|
|
7
9
|
|
|
8
10
|
"@client/*": ["../node_modules/5htp-core/src/client/*"],
|
|
9
11
|
"@common/*": ["../node_modules/5htp-core/src/common/*"],
|
|
@@ -23,6 +25,7 @@
|
|
|
23
25
|
},
|
|
24
26
|
"include": [
|
|
25
27
|
".",
|
|
26
|
-
"../../node_modules/5htp-core/src/types/global"
|
|
28
|
+
"../../node_modules/5htp-core/src/types/global",
|
|
29
|
+
".generated/services.d.ts"
|
|
27
30
|
]
|
|
28
31
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const domains = {
|
|
2
|
+
local: {
|
|
3
|
+
recruiters: 'http://localhost:3010',
|
|
4
|
+
landing: 'http://localhost:3011',
|
|
5
|
+
employers: 'http://localhost:3012',
|
|
6
|
+
candidates: 'http://localhost:3013',
|
|
7
|
+
csm: 'http://localhost:3014',
|
|
8
|
+
},
|
|
9
|
+
prod: {
|
|
10
|
+
recruiters: 'https://recruiters.becrosspath.com',
|
|
11
|
+
landing: 'https://becrosspath.com',
|
|
12
|
+
employers: 'https://employers.becrosspath.com',
|
|
13
|
+
candidates: 'https://candidates.becrosspath.com',
|
|
14
|
+
csm: 'https://csm.becrosspath.com',
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/*----------------------------------
|
|
2
|
+
- DEPENDANCES
|
|
3
|
+
----------------------------------*/
|
|
4
|
+
|
|
5
|
+
// Core
|
|
6
|
+
import { Schema, Validators } from '@common/validation';
|
|
7
|
+
|
|
8
|
+
const field = new Validators();
|
|
9
|
+
|
|
10
|
+
/*----------------------------------
|
|
11
|
+
- SCHEMA
|
|
12
|
+
----------------------------------*/
|
|
13
|
+
export default new Schema({
|
|
14
|
+
|
|
15
|
+
firstName: field.string(),
|
|
16
|
+
|
|
17
|
+
lastName: field.string(),
|
|
18
|
+
|
|
19
|
+
companyName: field.string(),
|
|
20
|
+
|
|
21
|
+
email: field.email(),
|
|
22
|
+
|
|
23
|
+
phone: field.string(),
|
|
24
|
+
|
|
25
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/*----------------------------------
|
|
2
|
+
- DEPENDANCES
|
|
3
|
+
----------------------------------*/
|
|
4
|
+
|
|
5
|
+
// Core
|
|
6
|
+
import { Schema, Validators } from '@common/validation';
|
|
7
|
+
|
|
8
|
+
// App
|
|
9
|
+
import { Currencies } from '@/common/libs/hub';
|
|
10
|
+
|
|
11
|
+
const field = new Validators();
|
|
12
|
+
|
|
13
|
+
/*----------------------------------
|
|
14
|
+
- SCHEMA
|
|
15
|
+
----------------------------------*/
|
|
16
|
+
export default new Schema({
|
|
17
|
+
|
|
18
|
+
sourceUrl: field.url({ opt: true }),
|
|
19
|
+
|
|
20
|
+
salaryMin: field.int({ min: 0 }),
|
|
21
|
+
salaryMax: field.int({ min: 0 }),
|
|
22
|
+
|
|
23
|
+
desiredBounty: field.int({ min: 0 }),
|
|
24
|
+
bountyCurrency: field.choice( Currencies ),
|
|
25
|
+
|
|
26
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/*----------------------------------
|
|
2
|
+
- DEPENDANCES
|
|
3
|
+
----------------------------------*/
|
|
4
|
+
|
|
5
|
+
// Core
|
|
6
|
+
import { Schema, Validators } from '@common/validation';
|
|
7
|
+
|
|
8
|
+
const field = new Validators();
|
|
9
|
+
|
|
10
|
+
/*----------------------------------
|
|
11
|
+
- SCHEMA
|
|
12
|
+
----------------------------------*/
|
|
13
|
+
export default new Schema({
|
|
14
|
+
|
|
15
|
+
firstName: field.string(),
|
|
16
|
+
|
|
17
|
+
lastName: field.string(),
|
|
18
|
+
|
|
19
|
+
companyName: field.string(),
|
|
20
|
+
|
|
21
|
+
email: field.email(),
|
|
22
|
+
|
|
23
|
+
linkedInUrl: field.url(),
|
|
24
|
+
|
|
25
|
+
phone: field.string(),
|
|
26
|
+
|
|
27
|
+
calendly: field.string({ opt: true }),
|
|
28
|
+
|
|
29
|
+
jobIds: field.array( field.string(), { opt: true })
|
|
30
|
+
|
|
31
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/*----------------------------------
|
|
2
|
+
- DEPENDANCES
|
|
3
|
+
----------------------------------*/
|
|
4
|
+
|
|
5
|
+
// Core
|
|
6
|
+
import { Schema, Validators } from '@common/validation';
|
|
7
|
+
|
|
8
|
+
// TODO: impoer each validator independently via spread
|
|
9
|
+
const field = new Validators();
|
|
10
|
+
|
|
11
|
+
/*----------------------------------
|
|
12
|
+
- CONST
|
|
13
|
+
----------------------------------*/
|
|
14
|
+
|
|
15
|
+
export const feedbackTypes = ['Issue', 'Suggestion'].map( v => ({
|
|
16
|
+
label: v,
|
|
17
|
+
value: v
|
|
18
|
+
}))
|
|
19
|
+
|
|
20
|
+
/*----------------------------------
|
|
21
|
+
- SCHEMA
|
|
22
|
+
----------------------------------*/
|
|
23
|
+
export default new Schema({
|
|
24
|
+
|
|
25
|
+
type: field.choice(feedbackTypes),
|
|
26
|
+
|
|
27
|
+
mission: field.choice(undefined, { opt: true }),
|
|
28
|
+
|
|
29
|
+
comment: field.string()
|
|
30
|
+
|
|
31
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/*----------------------------------
|
|
2
|
+
- DEPENDANCES
|
|
3
|
+
----------------------------------*/
|
|
4
|
+
|
|
5
|
+
// Core
|
|
6
|
+
import { Schema, Validators } from '@common/validation';
|
|
7
|
+
|
|
8
|
+
// App
|
|
9
|
+
import { rejectionReasons } from '@/common/libs/headhunter/mission';
|
|
10
|
+
|
|
11
|
+
// TODO: impoer each validator independently via spread
|
|
12
|
+
const field = new Validators();
|
|
13
|
+
|
|
14
|
+
/*----------------------------------
|
|
15
|
+
- SCHEMA
|
|
16
|
+
----------------------------------*/
|
|
17
|
+
export default new Schema({
|
|
18
|
+
|
|
19
|
+
missionId: field.string(),
|
|
20
|
+
|
|
21
|
+
// TODO: Generate array list of possible values in @server/database
|
|
22
|
+
reason: field.choice( rejectionReasons ),
|
|
23
|
+
|
|
24
|
+
explanations: field.string({ opt: true }),
|
|
25
|
+
|
|
26
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/*----------------------------------
|
|
2
|
+
- DEPENDANCES
|
|
3
|
+
----------------------------------*/
|
|
4
|
+
|
|
5
|
+
// Core
|
|
6
|
+
import { Schema, Validators } from '@common/validation';
|
|
7
|
+
// TODO: impoer each validator independently via spread
|
|
8
|
+
const field = new Validators();
|
|
9
|
+
|
|
10
|
+
// App
|
|
11
|
+
import { Currencies, MobilityModes } from '@/common/libs/hub';
|
|
12
|
+
|
|
13
|
+
/*----------------------------------
|
|
14
|
+
- SCHEMA
|
|
15
|
+
----------------------------------*/
|
|
16
|
+
// TODO: Generate array list of possible values in @server/database
|
|
17
|
+
export default new Schema({
|
|
18
|
+
|
|
19
|
+
location: field.choice(),
|
|
20
|
+
locationCity: field.string({ opt: true }),
|
|
21
|
+
|
|
22
|
+
mobility: field.choice(MobilityModes),
|
|
23
|
+
mobilityLocations: field.array( field.choice(), { opt: true }),
|
|
24
|
+
hasVisa: field.array( field.choice(), { opt: true }),
|
|
25
|
+
|
|
26
|
+
availability: field.string(),
|
|
27
|
+
|
|
28
|
+
minSalaryExpect: field.int({ min: 0 }),
|
|
29
|
+
//maxSalaryExpect: field.int({ opt: true, min: 0 }),
|
|
30
|
+
salaryCurrency: field.choice(Currencies, { opt: true }),
|
|
31
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/*----------------------------------
|
|
2
|
+
- DEPENDANCES
|
|
3
|
+
----------------------------------*/
|
|
4
|
+
|
|
5
|
+
// Core
|
|
6
|
+
import { Schema, Validators } from '@common/validation';
|
|
7
|
+
// TODO: impoer each validator independently via spread
|
|
8
|
+
const field = new Validators();
|
|
9
|
+
|
|
10
|
+
/*----------------------------------
|
|
11
|
+
- SCHEMA
|
|
12
|
+
----------------------------------*/
|
|
13
|
+
// TODO: Generate array list of possible values in @server/database
|
|
14
|
+
export default new Schema({
|
|
15
|
+
/*schools: field.string({ opt: true }),
|
|
16
|
+
degreeSubject: field.string({ opt: true }),
|
|
17
|
+
graduationLevel: field.string({ opt: true }),
|
|
18
|
+
graduationYear: field.int({ opt: true }),*/
|
|
19
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/*----------------------------------
|
|
2
|
+
- DEPENDANCES
|
|
3
|
+
----------------------------------*/
|
|
4
|
+
|
|
5
|
+
// Core
|
|
6
|
+
import { Schema, Validators } from '@common/validation';
|
|
7
|
+
// TODO: impoer each validator independently via spread
|
|
8
|
+
const field = new Validators();
|
|
9
|
+
|
|
10
|
+
// App
|
|
11
|
+
import { Genders } from '@/common/libs/hub';
|
|
12
|
+
|
|
13
|
+
/*----------------------------------
|
|
14
|
+
- SCHEMA
|
|
15
|
+
----------------------------------*/
|
|
16
|
+
// TODO: Generate array list of possible values in @server/database
|
|
17
|
+
export default new Schema({
|
|
18
|
+
|
|
19
|
+
firstName: field.string(),
|
|
20
|
+
lastName: field.string(),
|
|
21
|
+
gender: field.choice(Genders, { opt: true }),
|
|
22
|
+
|
|
23
|
+
email: field.email(),
|
|
24
|
+
phone: field.string({ opt: true }),
|
|
25
|
+
linkedInUrl: field.url({
|
|
26
|
+
opt: true,
|
|
27
|
+
normalize: {
|
|
28
|
+
removeQueryParameters: true
|
|
29
|
+
}
|
|
30
|
+
}),
|
|
31
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/*----------------------------------
|
|
2
|
+
- DEPENDANCES
|
|
3
|
+
----------------------------------*/
|
|
4
|
+
|
|
5
|
+
// Core
|
|
6
|
+
import { Schema, Validators } from '@common/validation';
|
|
7
|
+
|
|
8
|
+
// TODO: impoer each validator independently via spread
|
|
9
|
+
const field = new Validators();
|
|
10
|
+
|
|
11
|
+
/*----------------------------------
|
|
12
|
+
- SCHEMA
|
|
13
|
+
----------------------------------*/
|
|
14
|
+
// TODO: Generate array list of possible values in @server/database
|
|
15
|
+
export default new Schema({
|
|
16
|
+
|
|
17
|
+
customQnA: field.string({ opt: true }),
|
|
18
|
+
comments: field.string(),
|
|
19
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/*----------------------------------
|
|
2
|
+
- DEPENDANCES
|
|
3
|
+
----------------------------------*/
|
|
4
|
+
|
|
5
|
+
// Core
|
|
6
|
+
import { Schema, Validators } from '@common/validation';
|
|
7
|
+
|
|
8
|
+
// TODO: impoer each validator independently via spread
|
|
9
|
+
const field = new Validators();
|
|
10
|
+
|
|
11
|
+
/*----------------------------------
|
|
12
|
+
- SCHEMA
|
|
13
|
+
----------------------------------*/
|
|
14
|
+
// TODO: Generate array list of possible values in @server/database
|
|
15
|
+
export default new Schema({
|
|
16
|
+
//softSkills: field.string({ opt: true }),
|
|
17
|
+
hardSkills: field.array( field.choice() ),
|
|
18
|
+
languages: field.array( field.choice(), {
|
|
19
|
+
min: 1
|
|
20
|
+
}),
|
|
21
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/*----------------------------------
|
|
2
|
+
- DEPENDANCES
|
|
3
|
+
----------------------------------*/
|
|
4
|
+
|
|
5
|
+
// Core
|
|
6
|
+
import { Schema, Validators } from '@common/validation';
|
|
7
|
+
|
|
8
|
+
// TODO: impoer each validator independently via spread
|
|
9
|
+
const field = new Validators();
|
|
10
|
+
|
|
11
|
+
/*----------------------------------
|
|
12
|
+
- SCHEMA
|
|
13
|
+
----------------------------------*/
|
|
14
|
+
export default new Schema({
|
|
15
|
+
|
|
16
|
+
missionId: field.string(),
|
|
17
|
+
|
|
18
|
+
// TODO: Generate array list of possible values in @server/database
|
|
19
|
+
reason: field.string(/*{ in: }*/),
|
|
20
|
+
|
|
21
|
+
explanations: field.string({ opt: true }),
|
|
22
|
+
|
|
23
|
+
});
|