Passed
Push — dev ( f75e7c...8bffdc )
by Tristan
05:54 queued 10s
created

routes.ts ➔ hrScreeningPlan   A

Complexity

Conditions 1

Size

Total Lines 2
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
dl 0
loc 2
rs 10
c 0
b 0
f 0
1
import { Locales } from "./localize";
2
3
/* eslint-disable no-useless-escape */
4
function stripTrailingSlash(str: string): string {
5
  return str.endsWith("/") ? str.slice(0, -1) : str;
6
}
7
8
function isValidUrl(str: string): boolean {
9
  if (str.startsWith("http://") || str.startsWith("https://")) {
10
    try {
11
      // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars
12
      const url = new URL(str);
13
    } catch (_) {
14
      return false;
15
    }
16
    return true;
17
  }
18
  return false;
19
}
20
21
export function baseUrl(): string {
22
  const base = document.querySelector("meta[name='base-url']");
23
  if (base !== null) {
24
    return stripTrailingSlash(base.getAttribute("content") ?? "");
25
  }
26
  return "";
27
}
28
29
export function basePathname(): string {
30
  const base = baseUrl();
31
  return isValidUrl(base) ? new URL(baseUrl()).pathname : "";
32
}
33
34
export function baseApiUrl(version = 1): string {
35
  return `${baseUrl()}/api/v${version}`;
36
}
37
38
/**
39
 *
40
 * @param imgFile The name of the img file, not inluding the /images/ path.
41
 */
42
export function imageUrl(imgFile: string): string {
43
  return `${baseUrl()}/images/${imgFile}`;
44
}
45
46
/**
47
 * Removes the base url or base pathname if the given url starts with them.
48
 * @param url
49
 */
50
export function removeBaseUrl(url: string): string {
51
  const base = baseUrl();
52
  if (url.startsWith(base)) {
53
    return url.substr(base.length);
54
  }
55
  const basePath = basePathname();
56
  if (url.startsWith(basePath)) {
57
    return url.substr(basePath.length);
58
  }
59
  return url;
60
}
61
62
export function jobShow(locale: string, jobId: number): string {
63
  return `${baseUrl()}/${locale}/jobs/${jobId}`;
64
}
65
66
function applicationShow(
67
  locale: string,
68
  prefix: string,
69
  applicationId: number,
70
  jobId: number,
71
): string {
72
  return `${baseUrl()}/${locale}/${prefix}/jobs/${jobId}/applications/${applicationId}`;
73
}
74
75
function applicantShow(
76
  locale: string,
77
  prefix: string,
78
  applicantId: number,
79
  jobId: number,
80
): string {
81
  return `${baseUrl()}/${locale}/${prefix}/jobs/${jobId}/applicants/${applicantId}`;
82
}
83
84
export function managerApplicationShow(
85
  locale: string,
86
  applicationId: number,
87
  jobId: number,
88
): string {
89
  return applicationShow(locale, "manager", applicationId, jobId);
90
}
91
92
export function managerApplicantShow(
93
  locale: string,
94
  applicantId: number,
95
  jobId: number,
96
): string {
97
  return applicantShow(locale, "manager", applicantId, jobId);
98
}
99
100
export function managerEditProfile(locale: string): string {
101
  return `${baseUrl()}/${locale}/manager/profile`;
102
}
103
104
export function managerJobIndex(locale: string): string {
105
  return `${baseUrl()}/${locale}/manager/jobs`;
106
}
107
108
export function managerJobSummary(locale: string, jobId: number): string {
109
  return `${baseUrl()}/${locale}/manager/jobs/${jobId}`;
110
}
111
112
export function managerJobPreview(locale: string, jobId: number): string {
113
  return `${baseUrl()}/${locale}/manager/jobs/${jobId}/preview`;
114
}
115
116
export function managerJobApplications(locale: string, jobId: number): string {
117
  return `${baseUrl()}/${locale}/manager/jobs/${jobId}/applications`;
118
}
119
120
export function managerScreeningPlan(locale: string, jobId: number): string {
121
  return `${baseUrl()}/${locale}/manager/jobs/${jobId}/assessment-plan`;
122
}
123
124
export function applicationReviewUpdate(
125
  locale: string,
126
  applicationId: number,
127
): string {
128
  return `${baseApiUrl()}/applications/${applicationId}/review`;
129
}
130
131
export function jobBuilderIntro(locale: string, jobId?: number): string {
132
  if (jobId) {
133
    return `${baseUrl()}/${locale}/manager/jobs/${jobId}/builder/intro`;
134
  }
135
  return `${baseUrl()}/${locale}/manager/job-builder/intro`;
136
}
137
138
export function jobBuilderDetails(locale: string, jobId: number): string {
139
  return `${baseUrl()}/${locale}/manager/jobs/${jobId}/builder/details`;
140
}
141
142
export function jobBuilderEnv(locale: string, jobId: number): string {
143
  return `${baseUrl()}/${locale}/manager/jobs/${jobId}/builder/environment`;
144
}
145
146
export function jobBuilderImpact(locale: string, jobId: number): string {
147
  return `${baseUrl()}/${locale}/manager/jobs/${jobId}/builder/impact`;
148
}
149
150
export function jobBuilderTasks(locale: string, jobId: number): string {
151
  return `${baseUrl()}/${locale}/manager/jobs/${jobId}/builder/tasks`;
152
}
153
154
export function jobBuilderSkills(locale: string, jobId: number): string {
155
  return `${baseUrl()}/${locale}/manager/jobs/${jobId}/builder/skills`;
156
}
157
158
export function jobBuilderReview(locale: string, jobId: number): string {
159
  return `${baseUrl()}/${locale}/manager/jobs/${jobId}/builder/review`;
160
}
161
162
type FaqSection = "manager-who" | "levels";
163
164
export function applicantFaq(locale: string, faqSection?: FaqSection): string {
165
  const base = `${baseUrl()}/${locale}/faq`;
166
  if (faqSection) {
167
    return `${base}#${faqSection}`;
168
  }
169
  return base;
170
}
171
172
export function managerFaq(locale: string, faqSection?: FaqSection): string {
173
  const base = `${baseUrl()}/${locale}/manager/faq`;
174
  if (faqSection) {
175
    return `${base}#${faqSection}`;
176
  }
177
  return base;
178
}
179
180
export function hrJobIndex(locale: string): string {
181
  return `${baseUrl()}/${locale}/hr/jobs`;
182
}
183
export function hrJobSummary(locale: string, jobId: number): string {
184
  return `${baseUrl()}/${locale}/hr/jobs/${jobId}`;
185
}
186
export function hrJobReview(locale: string, jobId: number): string {
187
  return `${baseUrl()}/${locale}/hr/jobs/${jobId}/review`;
188
}
189
export function hrJobPreview(locale: string, jobId: number): string {
190
  return `${baseUrl()}/${locale}/hr/jobs/${jobId}/preview`;
191
}
192
export function hrScreeningPlan(locale: string, jobId: number): string {
193
  return `${baseUrl()}/${locale}/hr/jobs/${jobId}/assessment-plan`;
194
}
195
export function hrJobApplications(locale: string, jobId: number): string {
196
  return `${baseUrl()}/${locale}/hr/jobs/${jobId}/applications`;
197
}
198
export const hrApplicationShow = (
199
  locale: string,
200
  applicationId: number,
201
  jobId: number,
202
): string => applicationShow(locale, "hr", applicationId, jobId);
203
export const hrApplicantShow = (
204
  locale: string,
205
  applicantId: number,
206
  jobId: number,
207
): string => applicantShow(locale, "hr", applicantId, jobId);
208
209
export function accountSettings(locale: string): string {
210
  return `${baseUrl()}/${locale}/settings`;
211
}
212
213
export function applicationIndex(locale: Locales): string {
214
  return `${baseUrl()}/${locale}/applications`;
215
}
216
217
function baseApplicationUrl(locale: Locales, applicationId) {
218
  // TODO: remove "demo" from url.
219
  return `${baseUrl()}/${locale}/demo/applications/${applicationId}`;
220
}
221
export function applicationWelcome(
222
  locale: Locales,
223
  applicationId: number,
224
): string {
225
  return `${baseApplicationUrl(locale, applicationId)}/welcome`;
226
}
227
export function applicationBasic(
228
  locale: Locales,
229
  applicationId: number,
230
): string {
231
  return `${baseApplicationUrl(locale, applicationId)}/basic`;
232
}
233
export function applicationExperienceIntro(
234
  locale: Locales,
235
  applicationId: number,
236
): string {
237
  return `${baseApplicationUrl(locale, applicationId)}/experience-intro`;
238
}
239
export function applicationExperience(
240
  locale: Locales,
241
  applicationId: number,
242
): string {
243
  return `${baseApplicationUrl(locale, applicationId)}/experience`;
244
}
245
export function applicationSkillsIntro(
246
  locale: Locales,
247
  applicationId: number,
248
): string {
249
  return `${baseApplicationUrl(locale, applicationId)}/skills-intro`;
250
}
251
export function applicationSkills(
252
  locale: Locales,
253
  applicationId: number,
254
): string {
255
  return `${baseApplicationUrl(locale, applicationId)}/skills`;
256
}
257
export function applicationFit(locale: Locales, applicationId: number): string {
258
  return `${baseApplicationUrl(locale, applicationId)}/fit`;
259
}
260
export function applicationReview(
261
  locale: Locales,
262
  applicationId: number,
263
): string {
264
  return `${baseApplicationUrl(locale, applicationId)}/review`;
265
}
266
export function applicationSubmission(
267
  locale: Locales,
268
  applicationId: number,
269
): string {
270
  return `${baseApplicationUrl(locale, applicationId)}/submission`;
271
}
272
export function applicationNextSteps(
273
  locale: Locales,
274
  applicationId: number,
275
): string {
276
  // TODO: Link to a non-demo Next Steps page.
277
  return `${baseUrl()}/${locale}/demo/application-10`;
278
}
279
280
/**
281
 * Converts a string to a url safe equivalent.
282
 * @param string Any input text.
283
 * @returns url safe string.
284
 */
285
export function slugify(string: string): string {
286
  const a =
287
    "àáâäæãåāăąçćčđďèéêëēėęěğǵḧîïíīįìłḿñńǹňôöòóœøōõőṕŕřßśšşșťțûüùúūǘůűųẃẍÿýžźż·/_,:;";
288
  const b =
289
    "aaaaaaaaaacccddeeeeeeeegghiiiiiilmnnnnoooooooooprrsssssttuuuuuuuuuwxyyzzz------";
290
  const p = new RegExp(a.split("").join("|"), "g");
291
292
  return string
293
    .toString()
294
    .toLowerCase()
295
    .replace(/\s+/g, "-") // Replace spaces with -
296
    .replace(p, (c) => b.charAt(a.indexOf(c))) // Replace special characters
297
    .replace(/&/g, "-and-") // Replace & with 'and'
298
    .replace(/[^\w\-]+/g, "") // Remove all non-word characters
299
    .replace(/\-\-+/g, "-") // Replace multiple - with single -
300
    .replace(/^-+/, "") // Trim - from start of text
301
    .replace(/-+$/, ""); // Trim - from end of text
302
}
303