5htp 0.3.6 → 0.3.9

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.
Files changed (102) hide show
  1. package/package.json +1 -1
  2. package/skeleton/docker-compose.yml +7 -15
  3. package/skeleton/identity.yaml +12 -8
  4. package/skeleton/package.json +25 -7
  5. package/skeleton/src/client/assets/identity/logo.svg +13 -63
  6. package/skeleton/src/client/assets/identity/logoAndText.svg +9 -104
  7. package/skeleton/src/client/assets/identity/logoAndTextBlack.svg +11 -0
  8. package/skeleton/src/client/assets/illustration/landing/banner.webp +0 -0
  9. package/skeleton/src/client/assets/illustration/landing/candidate/employers.webp +0 -0
  10. package/skeleton/src/client/assets/illustration/landing/candidate/hero.webp +0 -0
  11. package/skeleton/src/client/assets/illustration/landing/candidate/mentors.webp +0 -0
  12. package/skeleton/src/client/assets/illustration/landing/headhunter/hero.webp +0 -0
  13. package/skeleton/src/client/assets/illustration/landing/hero.jpeg +0 -0
  14. package/skeleton/src/client/assets/illustration/landing/hero.webp +0 -0
  15. package/skeleton/src/client/assets/illustration/landing/hero.xcf +0 -0
  16. package/skeleton/src/client/assets/illustration/landing/recruiter/onboarding.webp +0 -0
  17. package/skeleton/src/client/assets/illustration/landing/team/andre.png +0 -0
  18. package/skeleton/src/client/assets/illustration/landing/team/emma.png +0 -0
  19. package/skeleton/src/client/assets/illustration/landing/team/fei.png +0 -0
  20. package/skeleton/src/client/assets/illustration/landing/team/gaetan.png +0 -0
  21. package/skeleton/src/client/assets/illustration/landing/team/jordan.png +0 -0
  22. package/skeleton/src/client/assets/illustration/landing/team/lery.png +0 -0
  23. package/skeleton/src/client/assets/illustration/landing/team/mehdi.png +0 -0
  24. package/skeleton/src/client/assets/illustration/landing/team/omkar.png +0 -0
  25. package/skeleton/src/client/assets/illustration/landing/team/thibaut.png +0 -0
  26. package/skeleton/src/client/assets/img/background/header-blur.png +0 -0
  27. package/skeleton/src/client/assets/img/partners/citron.svg +987 -0
  28. package/skeleton/src/client/assets/patterns/dots.png +0 -0
  29. package/skeleton/src/client/assets/theme.less +179 -226
  30. package/skeleton/src/client/assets/vars.less +54 -0
  31. package/skeleton/src/client/context.ts +23 -0
  32. package/skeleton/src/client/index.ts +59 -0
  33. package/skeleton/src/client/pages/_messages/400.tsx +45 -0
  34. package/skeleton/src/client/pages/_messages/401.tsx +39 -0
  35. package/skeleton/src/client/pages/_messages/403.tsx +43 -0
  36. package/skeleton/src/client/pages/_messages/404.tsx +42 -0
  37. package/skeleton/src/client/pages/_messages/500.tsx +42 -0
  38. package/skeleton/src/client/pages/platform/Header.less +12 -0
  39. package/skeleton/src/client/pages/platform/Header.tsx +119 -0
  40. package/skeleton/src/client/pages/platform/_layout/index.less +118 -0
  41. package/skeleton/src/client/pages/platform/_layout/index.tsx +131 -0
  42. package/skeleton/src/client/pages/platform/_layout/mobile.less +114 -0
  43. package/skeleton/src/client/pages/platform/_page.tsx +54 -0
  44. package/skeleton/src/client/pages/platform/headhunters/index.tsx +88 -0
  45. package/skeleton/src/client/pages/platform/index.tsx +58 -0
  46. package/skeleton/src/client/pages/platform/missions/index.tsx +149 -0
  47. package/skeleton/src/client/services/metrics/index.ts +59 -0
  48. package/skeleton/src/client/tsconfig.json +4 -1
  49. package/skeleton/src/common/config/router.ts +16 -0
  50. package/skeleton/src/common/forms/company/bookCall.ts +25 -0
  51. package/skeleton/src/common/forms/company/importJob.ts +26 -0
  52. package/skeleton/src/common/forms/company/signup.ts +31 -0
  53. package/skeleton/src/common/forms/headhunter/feedback.ts +31 -0
  54. package/skeleton/src/common/forms/headhunter/mission/cancel.ts +26 -0
  55. package/skeleton/src/common/forms/headhunter/mission/candidate/availability.ts +31 -0
  56. package/skeleton/src/common/forms/headhunter/mission/candidate/education.ts +19 -0
  57. package/skeleton/src/common/forms/headhunter/mission/candidate/identity.ts +31 -0
  58. package/skeleton/src/common/forms/headhunter/mission/candidate/others.ts +19 -0
  59. package/skeleton/src/common/forms/headhunter/mission/candidate/skills.ts +21 -0
  60. package/skeleton/src/common/forms/headhunter/mission/reject.ts +23 -0
  61. package/skeleton/src/common/forms/headhunter/mission/search.ts +78 -0
  62. package/skeleton/src/common/forms/headhunter/signup.ts +34 -0
  63. package/skeleton/src/common/libs/headhunter/candidate/index.ts +155 -0
  64. package/skeleton/src/common/libs/headhunter/mission/index.ts +30 -0
  65. package/skeleton/src/common/libs/hub/index.ts +41 -0
  66. package/skeleton/src/server/config/communication.ts +48 -0
  67. package/skeleton/src/server/config/crosspath.ts +9 -0
  68. package/skeleton/src/server/config/data.ts +34 -0
  69. package/skeleton/src/server/config/database.ts +26 -0
  70. package/skeleton/src/server/config/internal.ts +21 -0
  71. package/skeleton/src/server/config/user.ts +90 -0
  72. package/skeleton/src/server/index.ts +111 -23
  73. package/skeleton/src/server/libs/utils/slug.ts +11 -0
  74. package/skeleton/src/server/routes/global.ts +33 -0
  75. package/skeleton/src/server/routes/headhunters.ts +24 -0
  76. package/skeleton/src/server/routes/missions.ts +50 -0
  77. package/skeleton/src/server/services/Headhunter/index.ts +127 -0
  78. package/skeleton/src/server/services/Headhunter/service.json +6 -0
  79. package/skeleton/src/server/services/Mission/index.ts +174 -0
  80. package/skeleton/src/server/services/Mission/service.json +6 -0
  81. package/skeleton/src/server/services/email/sendgrid/index.ts +97 -0
  82. package/skeleton/src/server/services/email/sendgrid/service.json +6 -0
  83. package/skeleton/src/server/services/slack/index.ts +105 -0
  84. package/skeleton/src/server/services/slack/service.json +6 -0
  85. package/skeleton/src/server/services/users/index.ts +133 -0
  86. package/skeleton/src/server/services/users/service.json +6 -0
  87. package/skeleton/src/server/tsconfig.json +6 -8
  88. package/skeleton/var/typings/routes.d.ts +541 -0
  89. package/src/compiler/index.ts +34 -12
  90. package/src/index.ts +1 -1
  91. package/src/utils/keyboard.ts +1 -1
  92. package/skeleton/package-lock.json +0 -6139
  93. package/skeleton/src/client/components/LoginModal.tsx +0 -45
  94. package/skeleton/src/client/pages/app/_layout/index.less +0 -20
  95. package/skeleton/src/client/pages/app/_layout/index.tsx +0 -33
  96. package/skeleton/src/client/pages/app/index.tsx +0 -57
  97. package/skeleton/src/client/pages/landing/_layout/index.less +0 -145
  98. package/skeleton/src/client/pages/landing/_layout/index.tsx +0 -63
  99. package/skeleton/src/client/pages/landing/index.tsx +0 -73
  100. package/skeleton/src/server/models.ts +0 -117
  101. package/skeleton/src/server/routes/general.ts +0 -66
  102. 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
+ });