Преглед на файлове

Renaming in order to solve AdBlocker problem

feature/solving_add_blocker_problem_fe
Dzenis Hadzifejzovic преди 2 години
родител
ревизия
0cf3c7f97f
променени са 50 файла, в които са добавени 569 реда и са изтрити 577 реда
  1. 2
    2
      src/AppRoutes.js
  2. 2
    2
      src/__tests__/UITests/adDetailsCandidateCardUI.test.js
  3. 9
    9
      src/__tests__/UITests/adDetailsPageUI.test.js
  4. 6
    6
      src/__tests__/UITests/adsCandidatesPageUI.test.js
  5. 17
    17
      src/__tests__/UITests/adsPageUI.test.js
  6. 8
    8
      src/__tests__/UITests/applyForAdFirstStageUI.test.js
  7. 5
    5
      src/__tests__/UITests/applyForAdFourthStageUI.test.js
  8. 7
    7
      src/__tests__/UITests/applyForAdSecondStageUI.test.js
  9. 7
    7
      src/__tests__/UITests/applyForAdThirdStageUI.test.js
  10. 1
    1
      src/__tests__/UITests/candidateDetailsPageUI.test.js
  11. 8
    8
      src/__tests__/UITests/createAdPageUI.test.js
  12. 1
    1
      src/__tests__/UITests/patternDetailsPageUI.test.js
  13. 1
    1
      src/__tests__/UITests/patternsPageUI.test.js
  14. 4
    4
      src/__tests__/UITests/statsAdComponentUI.test.js
  15. 3
    3
      src/__tests__/UITests/statsPageUI.test.js
  16. 170
    178
      src/assets/styles/components/_ads.scss
  17. 9
    9
      src/assets/styles/components/_candidatePage.scss
  18. 17
    17
      src/assets/styles/components/_candidatesPage.scss
  19. 2
    2
      src/assets/styles/components/_statistics.scss
  20. 10
    10
      src/components/Ads/Ad.js
  21. 8
    8
      src/components/Ads/AdDetailsCandidateCard.js
  22. 18
    18
      src/components/Ads/AdFilters.js
  23. 7
    7
      src/components/Ads/ApplyForAd.js
  24. 13
    13
      src/components/Ads/ApplyForAdFirstStage.js
  25. 8
    8
      src/components/Ads/ApplyForAdFourthStage.js
  26. 16
    16
      src/components/Ads/ApplyForAdSecondStage.js
  27. 6
    6
      src/components/Ads/ApplyForAdThirdStage.js
  28. 8
    8
      src/components/Ads/ArchiveJob.js
  29. 6
    6
      src/components/Ads/StatsAd.js
  30. 1
    1
      src/components/Button/FilterButton.js
  31. 16
    16
      src/components/Candidates/CandidateFilters.js
  32. 1
    1
      src/components/MUI/NavbarComponent.js
  33. 3
    3
      src/components/Selection/ApplicantSelection.js
  34. 12
    12
      src/components/Selection/SelectionFilter.js
  35. 3
    3
      src/constants/pages.js
  36. 1
    1
      src/i18n/resources/en.js
  37. 30
    30
      src/pages/AdsPage/AdDetailsPage.js
  38. 47
    47
      src/pages/AdsPage/AdsPage.js
  39. 9
    9
      src/pages/AdsPage/CreateAdFirstStep.js
  40. 7
    7
      src/pages/AdsPage/CreateAdPage.js
  41. 13
    13
      src/pages/AdsPage/CreateAdSecondStep.js
  42. 4
    4
      src/pages/AdsPage/CreateAdThirdStep.js
  43. 8
    8
      src/pages/CandidatesPage/AdsCandidatesPage.js
  44. 5
    5
      src/pages/CandidatesPage/CandidateDetailsPage.js
  45. 3
    3
      src/pages/PatternsPage/PatternDetailsPage.js
  46. 1
    1
      src/pages/PatternsPage/PatternsPage.js
  47. 9
    9
      src/pages/SelectionProcessPage/SelectionProcessOfApplicantPage.js
  48. 10
    10
      src/pages/StatsPage/StatsPage.js
  49. 1
    1
      src/pages/UsersPage/UsersPage.js
  50. 6
    6
      src/request/apiEndpoints.js

+ 2
- 2
src/AppRoutes.js Целия файл

@@ -6,7 +6,6 @@ import { useLocation } from "react-router-dom";

import {
ADS_PAGE,
AD_DETAILS_PAGE,
FORGOT_PASSWORD_PAGE,
FORGOT_PASSWORD_CONFIRMATION_PAGE,
NOT_FOUND_PAGE,
@@ -25,6 +24,7 @@ import {
STATS_PAGE,
REGISTER_PAGE,
CREATE_AD_PAGE,
JOB_DETAILS_PAGE,
} from "./constants/pages";

import LoginPage from "./pages/LoginPage/LoginPageMUI";
@@ -73,7 +73,7 @@ const AppRoutes = () => {
<Route exact path={REGISTER_PAGE} component={RegisterPage} />
<Route path={RESET_PASSWORD_PAGE} component={ResetPasswordPage} />
<PrivateRoute exact path={ADS_PAGE} component={AdsPage} />
<PrivateRoute exact path={AD_DETAILS_PAGE} component={AdDetailsPage} />
<PrivateRoute exact path={JOB_DETAILS_PAGE} component={AdDetailsPage} />
<PrivateRoute exact path={USER_DETAILS_PAGE} component={UserDetails} />
<PrivateRoute exact path={USERS_PAGE} component={UsersPage} />
<PrivateRoute exact path={CANDIDATES_PAGE} component={CandidatesPage} />

+ 2
- 2
src/__tests__/UITests/adDetailsCandidateCardUI.test.js Целия файл

@@ -49,13 +49,13 @@ describe("Ad details candidate card ui tests", () => {

it("Should load ad details candidate card component", () => {
render(cont);
expect(screen.getByTestId("ad-details-candidate")).toBeDefined();
expect(screen.getByTestId("job-details-candidate")).toBeDefined();
});

it("Should navigate on candidates page when button clicked", async () => {
render(cont);
waitFor(() => {
fireEvent.click(screen.getByTestId("ad-details-candidate-title-link"));
fireEvent.click(screen.getByTestId("job-details-candidate-title-link"));
expect(props.history.push).toHaveBeenCalledWith("/candidates/1");
});
});

+ 9
- 9
src/__tests__/UITests/adDetailsPageUI.test.js Целия файл

@@ -43,13 +43,13 @@ describe("AdDetailsPage render tests", () => {

it("Should render AdDetailsPage", () => {
render(cont);
expect(screen.getByTestId("ad-details-page")).toBeDefined();
expect(screen.getByTestId("job-details-page")).toBeDefined();
});

it("Should render modal when click archive ad button", () => {
const { container } = render(cont);

fireEvent.click(container.getElementsByClassName("archive-ad-button")[0]);
fireEvent.click(container.getElementsByClassName("archive-job-button")[0]);

expect(screen.getByTestId("alert-container")).toBeDefined();
});
@@ -58,25 +58,25 @@ describe("AdDetailsPage render tests", () => {
const { container } = render(cont);

waitFor(() => {
fireEvent.click(container.getElementsByClassName("archive-ad-button")[0]);
fireEvent.click(container.getElementsByClassName("archive-job-button")[0]);

fireEvent.click(container.getElementsByClassName("dialog-btn")[1]);

waitFor(() => expect(props.history.push).toHaveBeenCalledWith('/ads'));
waitFor(() => expect(props.history.push).toHaveBeenCalledWith('/jobs'));
});
});

it("Should render apply for ad button", () => {
const { container } = render(cont);
expect(
container.getElementsByClassName("apply-for-ad-button")[0]
container.getElementsByClassName("apply-for-job-button")[0]
).toBeDefined();
});

it("Should render apply for ad modal after click button", () => {
const { container } = render(cont);

fireEvent.click(container.getElementsByClassName("apply-for-ad-button")[0]);
fireEvent.click(container.getElementsByClassName("apply-for-job-button")[0]);

const a = screen.getByTestId("custom-modal-test-id");

@@ -86,7 +86,7 @@ describe("AdDetailsPage render tests", () => {
it("Should render go back button", () => {
const { container } = render(cont);
expect(
container.getElementsByClassName("ad-details-buttons-link")[0]
container.getElementsByClassName("job-details-buttons-link")[0]
).toBeDefined();
});

@@ -94,10 +94,10 @@ describe("AdDetailsPage render tests", () => {
const { container } = render(cont);

fireEvent.click(
container.getElementsByClassName("ad-details-buttons-link")[0]
container.getElementsByClassName("job-details-buttons-link")[0]
);

const arg = { pathname: "/ads" };
const arg = { pathname: "/jobs" };

waitFor(() => expect(props.history.push).toHaveBeenCalledWith(arg));
});

+ 6
- 6
src/__tests__/UITests/adsCandidatesPageUI.test.js Целия файл

@@ -39,13 +39,13 @@ describe("TableViewPage render tests", () => {
it("Should render", () => {
const { container } = render(cont);
expect(
container.getElementsByClassName("ads-candidates-container")[0]
container.getElementsByClassName("jobs-candidates-container")[0]
).toBeDefined();
});

it("Number of sliders should be equal to length of our adsCandidates array", () => {
const { container } = render(cont);
expect(container.getElementsByClassName("ads-candidates").length).toBe(
expect(container.getElementsByClassName("jobs-candidates").length).toBe(
mockState.candidates.adsCandidates.length
);
});
@@ -54,7 +54,7 @@ describe("TableViewPage render tests", () => {
const { container } = render(cont);
expect(
container
.getElementsByClassName("ads-candidates")[0]
.getElementsByClassName("jobs-candidates")[0]
.getElementsByClassName("slick-slide").length
).toBe(mockState.candidates.adsCandidates[0].applicants.length);
});
@@ -62,7 +62,7 @@ describe("TableViewPage render tests", () => {
it("Number of arrows (left and right) should be 1 because there is more than 4 candidates which applied for ad", () => {
const { container } = render(cont);
expect(
container.getElementsByClassName("active-ads-ads-arrows").length
container.getElementsByClassName("active-jobs-jobs-arrows").length
).toBe(1);
});

@@ -70,14 +70,14 @@ describe("TableViewPage render tests", () => {
const { container } = render(cont);
fireEvent.click(
container
.getElementsByClassName("active-ads-ads-arrows")[0]
.getElementsByClassName("active-jobs-jobs-arrows")[0]
.getElementsByTagName("button")[1]
);

await waitFor(() =>
expect(
container
.getElementsByClassName("ads-candidates")[0]
.getElementsByClassName("jobs-candidates")[0]
.getElementsByClassName("slick-active")[0]
.getElementsByClassName("candidate-card-container")[0]
.getElementsByClassName("candidate-card-applicant-name")[0]

+ 17
- 17
src/__tests__/UITests/adsPageUI.test.js Целия файл

@@ -52,27 +52,27 @@ describe("AdsPage render tests", () => {

it("Should render ads", () => {
render(cont);
expect(screen.getByTestId("ads-page")).toBeDefined();
expect(screen.getByTestId("jobs-page")).toBeDefined();
});

it("Should be rendered button which is used for showing input responsible for searching by name", () => {
const { container } = render(cont);
expect(container.getElementsByClassName("ads-page-btn")[0]).toBeDefined();
expect(container.getElementsByClassName("jobs-page-btn")[0]).toBeDefined();
});

it("Should be rendered button for toggling filters modal", () => {
const { container } = render(cont);
expect(container.getElementsByClassName("ads-page-btn")[1]).toBeDefined();
expect(container.getElementsByClassName("jobs-page-btn")[1]).toBeDefined();
});

it("Should be rendered button for adding new ad", () => {
const { container } = render(cont);
expect(container.getElementsByClassName("ads-page-btn")[2]).toBeDefined();
expect(container.getElementsByClassName("jobs-page-btn")[2]).toBeDefined();
});

it("Should render CreateAdPage when click Add Ad button", () => {
const { container } = render(cont);
fireEvent.click(container.getElementsByClassName("ads-page-btn")[2]);
fireEvent.click(container.getElementsByClassName("jobs-page-btn")[2]);

expect(props.history.push).toHaveBeenCalledWith("/create-ad");
});
@@ -80,41 +80,41 @@ describe("AdsPage render tests", () => {
it("Input for searching by title should not be shown when component is initialy rendered", () => {
const { container } = render(cont);
expect(
container.getElementsByClassName("ads-page-search-by-title")[0].style
container.getElementsByClassName("jobs-page-search-by-title")[0].style
.visibility
).toBe("hidden");
});

it("Should be rendered ad cards", () => {
const { container } = render(cont);
expect(container.getElementsByClassName("ad-card").length).toBeGreaterThan(
expect(container.getElementsByClassName("job-card").length).toBeGreaterThan(
0
);
});

it("Should be rendered archive ad cards", () => {
const { container } = render(cont);
expect(container.getElementsByClassName("archive-ad").length).toBe(0);
expect(container.getElementsByClassName("archive-job").length).toBe(0);
});

it("Should render filter drawer after click filter button", () => {
const { container } = render(cont);

fireEvent.click(container.getElementsByClassName("fltr-btn")[0]);
expect(screen.getByTestId("ad-filters-drawer")).toBeDefined();
expect(screen.getByTestId("job-filters-drawer")).toBeDefined();
});

it("Should render arrow buttons for active ads slider", () => {
const { container } = render(cont);
expect(
container.getElementsByClassName("active-ads-ads-arrows")
container.getElementsByClassName("active-jobs-jobs-arrows")
).toBeDefined();
});

it("Should render arrow buttons for archived ads slider", () => {
const { container } = render(cont);
expect(
container.getElementsByClassName("archived-ads-ads-arrows")
container.getElementsByClassName("archived-jobs-jobs-arrows")
).toBeDefined();
});

@@ -125,13 +125,13 @@ describe("AdsPage render tests", () => {
fireEvent.click(container.getElementsByClassName("fltr-btn")[0]);

fireEvent.click(
container.getElementsByClassName("ad-filters-checkbox")[0]
container.getElementsByClassName("job-filters-checkbox")[0]
);

fireEvent.click(container.getByTestId("ad-filters-submit")[0]);
fireEvent.click(container.getByTestId("job-filters-submit")[0]);

expect(
container.getElementsByClassName("ad-card").length
container.getElementsByClassName("job-card").length
).toBeGreaterThan(0);
});
});
@@ -140,15 +140,15 @@ describe("AdsPage render tests", () => {
const { container } = render(cont);
waitFor(() =>
expect(
container.getElementsByClassName("ad-card").length
container.getElementsByClassName("job-card").length
).toBeGreaterThan(0)
);
});

it("Should navigate to ad details when click on ad card", async () => {
const { container } = render(cont);
fireEvent.click(container.getElementsByClassName("ad-card")[0]);
fireEvent.click(container.getElementsByClassName("job-card")[0]);

expect(props.history.push).toHaveBeenCalledWith("/ads/1");
expect(props.history.push).toHaveBeenCalledWith("/jobs/1");
});
});

+ 8
- 8
src/__tests__/UITests/applyForAdFirstStageUI.test.js Целия файл

@@ -45,13 +45,13 @@ describe("Apply for ad first stage ui tests", () => {

it("Should render firstName input", () => {
render(cont);
expect(screen.getByTestId("apply-for-ad-modal-first-name-input")).toBeDefined();
expect(screen.getByTestId("apply-for-job-modal-first-name-input")).toBeDefined();
});

it("Should change firstName on changing input", async () => {
render(cont);
fireEvent.change(
screen.getByTestId("apply-for-ad-modal-first-name-input"),
screen.getByTestId("apply-for-job-modal-first-name-input"),
{ target: { value: "Ermin" } }
);

@@ -60,7 +60,7 @@ describe("Apply for ad first stage ui tests", () => {

it("Should change last on changing input", async () => {
render(cont);
fireEvent.change(screen.getByTestId("apply-for-ad-modal-last-name-input"), {
fireEvent.change(screen.getByTestId("apply-for-job-modal-last-name-input"), {
target: { value: "Bronja" },
});

@@ -70,7 +70,7 @@ describe("Apply for ad first stage ui tests", () => {
it("Should select male gender", async () => {
const { container } = render(cont);
fireEvent.click(
container.getElementsByClassName("apply-for-ad-modal-gender-input")[0]
container.getElementsByClassName("apply-for-job-modal-gender-input")[0]
);

waitFor(() => expect(props.setGender).toHaveBeenCalled());
@@ -79,7 +79,7 @@ describe("Apply for ad first stage ui tests", () => {
it("Should select female gender", async () => {
const { container } = render(cont);
fireEvent.click(
container.getElementsByClassName("apply-for-ad-modal-gender-input")[1]
container.getElementsByClassName("apply-for-job-modal-gender-input")[1]
);

waitFor(() => expect(props.setGender).toHaveBeenCalled());
@@ -87,7 +87,7 @@ describe("Apply for ad first stage ui tests", () => {

it("Should change date of birth", async () => {
render(cont);
fireEvent.change(screen.getByTestId("apply-for-ad-modal-date-of-birth"), {
fireEvent.change(screen.getByTestId("apply-for-job-modal-date-of-birth"), {
target: { value: "1998-05-05" },
});

@@ -96,14 +96,14 @@ describe("Apply for ad first stage ui tests", () => {

it("Should change phone number", async () => {
render(cont);
fireEvent.change(screen.getByTestId("apply-for-ad-modal-phone-number"), { target: { value: "0000000000" } });
fireEvent.change(screen.getByTestId("apply-for-job-modal-phone-number"), { target: { value: "0000000000" } });

waitFor(() => expect(props.setPhoneNumber).toHaveBeenCalled());
});

it("Should click go forward button", async () => {
render(cont);
fireEvent.click(screen.getByTestId("apply-for-ad-modal-go-forward-button"));
fireEvent.click(screen.getByTestId("apply-for-job-modal-go-forward-button"));

waitFor(() => expect(props.onIncreaseStage).toHaveBeenCalled());
});

+ 5
- 5
src/__tests__/UITests/applyForAdFourthStageUI.test.js Целия файл

@@ -42,13 +42,13 @@ describe("Apply for ad fourth stage ui tests", () => {

it("Should render apply for ad fourth stage modal", () => {
render(cont);
expect(screen.getByTestId("apply-for-ad-modal-fourth-stage")).toBeDefined();
expect(screen.getByTestId("apply-for-job-modal-fourth-stage")).toBeDefined();
});

it("Should change pdfFile", async () => {
render(cont);
fireEvent.change(
screen.getByTestId("apply-for-ad-modal-fourth-stage-pdf-input"),
screen.getByTestId("apply-for-job-modal-fourth-stage-pdf-input"),
{ target: { files: [file] } }
);

@@ -58,7 +58,7 @@ describe("Apply for ad fourth stage ui tests", () => {
it("Should change coverLetter", async () => {
render(cont);
fireEvent.change(
screen.getByTestId("apply-for-ad-modal-fourth-stage-cover-letter-input"),
screen.getByTestId("apply-for-job-modal-fourth-stage-cover-letter-input"),
{ target: { value: "Cover Letter" } }
);

@@ -68,7 +68,7 @@ describe("Apply for ad fourth stage ui tests", () => {
it("Should go back on click button", async () => {
render(cont);
fireEvent.click(
screen.getByTestId("apply-for-ad-modal-fourth-stage-go-back-button")
screen.getByTestId("apply-for-job-modal-fourth-stage-go-back-button")
);

waitFor(() => expect(props.onDecreaseStage).toHaveBeenCalled());
@@ -77,7 +77,7 @@ describe("Apply for ad fourth stage ui tests", () => {
it("Should finish stages on click button", async () => {
render(cont);
fireEvent.click(
screen.getByTestId("apply-for-ad-modal-fourth-stage-go-forward-button")
screen.getByTestId("apply-for-job-modal-fourth-stage-go-forward-button")
);

waitFor(() => expect(props.onFinishedFourStages).toHaveBeenCalled());

+ 7
- 7
src/__tests__/UITests/applyForAdSecondStageUI.test.js Целия файл

@@ -61,14 +61,14 @@ describe("Apply for ad second stage ui tests", () => {

it("Should render apply for ad second stage", () => {
render(cont);
expect(screen.getByTestId("apply-for-ad-second-stage")).toBeDefined();
expect(screen.getByTestId("apply-for-job-second-stage")).toBeDefined();
});

it("Should change professional qualification input", () => {
render(cont);
fireEvent.change(
screen.getByTestId(
"apply-for-ad-second-stage-professional-qualification"
"apply-for-job-second-stage-professional-qualification"
),
{
target: { value: "Faculty" },
@@ -82,7 +82,7 @@ describe("Apply for ad second stage ui tests", () => {
const { container } = render(cont);

expect(
container.getElementsByClassName("apply-for-ad-second-stage-checkbox")[0]
container.getElementsByClassName("apply-for-job-second-stage-checkbox")[0]
).toBeDefined();
});

@@ -90,7 +90,7 @@ describe("Apply for ad second stage ui tests", () => {
const { container } = render(cont);

expect(
container.getElementsByClassName("apply-for-ad-second-stage-checkbox")[1]
container.getElementsByClassName("apply-for-job-second-stage-checkbox")[1]
).toBeDefined();
});

@@ -98,7 +98,7 @@ describe("Apply for ad second stage ui tests", () => {
const { container } = render(cont);

expect(
container.getElementsByClassName("apply-for-ad-second-stage-checkbox")[2]
container.getElementsByClassName("apply-for-job-second-stage-checkbox")[2]
).toBeDefined();
});

@@ -106,7 +106,7 @@ describe("Apply for ad second stage ui tests", () => {
render(cont);

fireEvent.change(
screen.getByTestId("apply-for-ad-second-stage-experience-input"),
screen.getByTestId("apply-for-job-second-stage-experience-input"),
{ target: { value: 2 } }
);

@@ -117,7 +117,7 @@ describe("Apply for ad second stage ui tests", () => {
const { container } = render(cont);

fireEvent.click(
container.getElementsByClassName("apply-for-ad-second-stage-checkbox")[0]
container.getElementsByClassName("apply-for-job-second-stage-checkbox")[0]
);

waitFor(() => expect(props.technologies[0]).toBe(true));

+ 7
- 7
src/__tests__/UITests/applyForAdThirdStageUI.test.js Целия файл

@@ -45,7 +45,7 @@ describe("Apply for ad third stage ui tests", () => {
it("Should change linkedin input", async () => {
render(cont);
fireEvent.change(
screen.getByTestId("apply-for-ad-modal-third-stage-linkedin-input"),
screen.getByTestId("apply-for-job-modal-third-stage-linkedin-input"),
{ target: { value: "https://linkedin" } }
);

@@ -56,14 +56,14 @@ describe("Apply for ad third stage ui tests", () => {
render(cont);

expect(
screen.getByTestId("apply-for-ad-modal-third-stage-linkedin-input")
screen.getByTestId("apply-for-job-modal-third-stage-linkedin-input")
).toBeDefined();
});

it("Should change github input", async () => {
render(cont);
fireEvent.change(
screen.getByTestId("apply-for-ad-modal-third-stage-github-input"),
screen.getByTestId("apply-for-job-modal-third-stage-github-input"),
{ target: { value: "https://github" } }
);

@@ -73,7 +73,7 @@ describe("Apply for ad third stage ui tests", () => {
it("Should change bitbucket input", async () => {
render(cont);
fireEvent.change(
screen.getByTestId("apply-for-ad-modal-third-stage-bitbucket-input"),
screen.getByTestId("apply-for-job-modal-third-stage-bitbucket-input"),
{ target: { value: "https://bitbucket" } }
);

@@ -83,7 +83,7 @@ describe("Apply for ad third stage ui tests", () => {
it("Should change email input", async () => {
render(cont);
fireEvent.change(
screen.getByTestId("apply-for-ad-modal-third-stage-email-input"),
screen.getByTestId("apply-for-job-modal-third-stage-email-input"),
{ target: { value: "ermin.bronja@dilig.net" } }
);

@@ -93,7 +93,7 @@ describe("Apply for ad third stage ui tests", () => {
it("Should go back when button clicked", async () => {
render(cont);
fireEvent.click(
screen.getByTestId("apply-for-ad-modal-third-stage-go-back-button")
screen.getByTestId("apply-for-job-modal-third-stage-go-back-button")
);

waitFor(() => expect(props.onDecreaseStage).toHaveBeenCalled());
@@ -102,7 +102,7 @@ describe("Apply for ad third stage ui tests", () => {
it("Should go forward when button clicked", async () => {
render(cont);
fireEvent.click(
screen.getByTestId("apply-for-ad-modal-third-stage-go-forward-button")
screen.getByTestId("apply-for-job-modal-third-stage-go-forward-button")
);

waitFor(() => expect(props.onIncreaseStage).toHaveBeenCalled());

+ 1
- 1
src/__tests__/UITests/candidateDetailsPageUI.test.js Целия файл

@@ -191,7 +191,7 @@ describe("CandidateDetailsPage render tests", () => {
it("Should render page with all candidates", () => {
const { container } = render(cont);
fireEvent.click(
container.getElementsByClassName("applicant-ads-back-button")[0]
container.getElementsByClassName("applicant-jobs-back-button")[0]
);
const arg = { pathname: "/candidates" };
expect(props.history.push).toHaveBeenCalledWith(arg);

+ 8
- 8
src/__tests__/UITests/createAdPageUI.test.js Целия файл

@@ -39,32 +39,32 @@ describe("CreateAdPage render tests", () => {

it("Should render create ad page", () => {
render(cont);
expect(screen.getByTestId("create-ad-page")).toBeDefined();
expect(screen.getByTestId("create-job-page")).toBeDefined();
});

it("Should render go back button", () => {
const { container } = render(cont);
expect(
container.getElementsByClassName("create-ad-buttons-back")[0]
container.getElementsByClassName("create-job-buttons-back")[0]
).toBeDefined();
});

it("Should render go forward button", () => {
const { container } = render(cont);
expect(
container.getElementsByClassName("create-ad-buttons-forward")[0]
container.getElementsByClassName("create-job-buttons-forward")[0]
).toBeDefined();
});

it("Should render create ad first step form", () => {
render(cont);
expect(screen.getByTestId("create-ad-first-step-form")).toBeDefined();
expect(screen.getByTestId("create-job-first-step-form")).toBeDefined();
});

it("Should render sercond step form", () => {
const { container } = render(cont);
const formControls = container.getElementsByClassName(
"create-ad-form-control-first-step-input"
"create-job-form-control-first-step-input"
);

fireEvent.change(formControls[0], { target: { value: ".NET DEVELOPER" } });
@@ -72,13 +72,13 @@ describe("CreateAdPage render tests", () => {
fireEvent.change(formControls[1], { target: { value: "2020-05-24" } });

fireEvent.click(
container.getElementsByClassName("create-ad-buttons-forward")[0]
container.getElementsByClassName("create-job-buttons-forward")[0]
);

fireEvent.click(container.getElementsByClassName("create-ad-second-step-checkbox")[0])
fireEvent.click(container.getElementsByClassName("create-job-second-step-checkbox")[0])

fireEvent.click(
container.getElementsByClassName("create-ad-buttons-forward")[0]
container.getElementsByClassName("create-job-buttons-forward")[0]
);

expect(screen.getByTestId("create-ad-third-step-form")).toBeDefined();

+ 1
- 1
src/__tests__/UITests/patternDetailsPageUI.test.js Целия файл

@@ -80,7 +80,7 @@ describe("PatternDetailsPage render tests", () => {
const { container } = render(cont);
waitFor(() => {
expect(
container.getElementsByClassName("ad-details-buttons-link")[0]
container.getElementsByClassName("job-details-buttons-link")[0]
).toBeDefined();
});
});

+ 1
- 1
src/__tests__/UITests/patternsPageUI.test.js Целия файл

@@ -53,7 +53,7 @@ describe("PatternsPage render tests", () => {

it("Should render add pattern button", () => {
const { container } = render(cont);
expect(container.getElementsByClassName("add-ad-btn")[0]).toBeDefined();
expect(container.getElementsByClassName("add-job-btn")[0]).toBeDefined();
});

it("Should render add pattern modal", () => {

+ 4
- 4
src/__tests__/UITests/statsAdComponentUI.test.js Целия файл

@@ -29,20 +29,20 @@ describe("StatsAd render tests", () => {

it("Should render", () => {
const { container } = render(cont);
expect(container.getElementsByClassName("stats-ad")[0]).toBeDefined();
expect(container.getElementsByClassName("stats-job")[0]).toBeDefined();
});

it("Should render title", () => {
const { container } = render(cont);
expect(
container.getElementsByClassName("archive-ad-title")[0]
container.getElementsByClassName("archive-job-title")[0]
).toBeDefined();
});

it("Should render date", () => {
const { container } = render(cont);
expect(
container.getElementsByClassName("archive-ad-date")[0]
container.getElementsByClassName("archive-job-date")[0]
).toBeDefined();
});

@@ -50,7 +50,7 @@ describe("StatsAd render tests", () => {
const { container } = render(cont);
expect(
container
.getElementsByClassName("archive-ad-experience")[0]
.getElementsByClassName("archive-job-experience")[0]
.getElementsByTagName("p")[0].textContent
).toBe("1+ common.experience");
});

+ 3
- 3
src/__tests__/UITests/statsPageUI.test.js Целия файл

@@ -43,7 +43,7 @@ describe("StatsPage render tests", () => {

it("Should render ads because there is more than 0 ads", () => {
const { container } = render(cont);
expect(container.getElementsByClassName("archived-ads")[0]).toBeDefined();
expect(container.getElementsByClassName("archived-jobs")[0]).toBeDefined();
});

it("Should render only one right arrow and that depends on screen size", () => {
@@ -63,7 +63,7 @@ describe("StatsPage render tests", () => {

it("Should render all ads in slider", () => {
const { container } = render(cont);
expect(container.getElementsByClassName("stats-ad").length).toBe(
expect(container.getElementsByClassName("stats-job").length).toBe(
mockState.stats.ads.length
);
});
@@ -85,7 +85,7 @@ describe("StatsPage render tests", () => {
container
.getElementsByClassName("slick-list")[0]
.getElementsByClassName("slick-active")[4]
.getElementsByClassName("archive-ad-title")[0].textContent
.getElementsByClassName("archive-job-title")[0].textContent
).toBe("React")
);
});

+ 170
- 178
src/assets/styles/components/_ads.scss
Файловите разлики са ограничени, защото са твърде много
Целия файл


+ 9
- 9
src/assets/styles/components/_candidatePage.scss Целия файл

@@ -290,11 +290,11 @@
color: #226cb0;
}

.applicant-ads-container {
.applicant-jobs-container {
margin-top: 36px;
}

.applicant-ads-container > p {
.applicant-jobs-container > p {
font-family: "Source Sans Pro";
font-weight: 600;
font-size: 24px;
@@ -303,7 +303,7 @@
color: #272727;
}

.applicant-ads-sub-container {
.applicant-jobs-sub-container {
margin-top: 18px;
display: flex;
margin-left: -20px;
@@ -384,7 +384,7 @@
text-decoration: none;
}

.applicant-ads-back-button {
.applicant-jobs-back-button {
margin-right: 36px;
font-family: "Source Sans Pro";
font-weight: 400;
@@ -439,7 +439,7 @@
color: #272727;
}

.applicant-ads-container-2 {
.applicant-jobs-container-2 {
display: flex;
align-items: center;
margin-top: 18px;
@@ -606,7 +606,7 @@
justify-content: initial;
}

.applicant-ads-container-2 {
.applicant-jobs-container-2 {
flex-direction: column-reverse;
align-items: flex-start;
}
@@ -614,7 +614,7 @@
padding-left: 0 !important;
}

.applicant-ads-back-button {
.applicant-jobs-back-button {
font-size: 14px;
line-height: 18px;
margin-right: 0;
@@ -627,11 +627,11 @@
letter-spacing: 0.04em;
}

.active-ads-ads-arrows {
.active-jobs-jobs-arrows {
margin-left: -0.75rem;
}

.applicant-ads-buttons-container{
.applicant-jobs-buttons-container{
margin-left: 36px;
}
}

+ 17
- 17
src/assets/styles/components/_candidatesPage.scss Целия файл

@@ -86,32 +86,32 @@
background-color: #226cb0;
}

.ads-candidates-container {
.jobs-candidates-container {
max-height: 837px;
overflow-y: auto;
overflow-x: hidden;
}

.ads-candidates-slider {
.jobs-candidates-slider {
display: flex;
margin-top: 31px;
}

.ads-candidates-slider .slick-track {
.jobs-candidates-slider .slick-track {
margin: 0 !important;
}

.ads-candidates-slider .slick-slider {
.jobs-candidates-slider .slick-slider {
width: 100% !important;
}

.ads-candidates-top-container {
.jobs-candidates-top-container {
display: flex;
align-items: center;
margin-left: 72px;
}

.ads-candidates-title {
.jobs-candidates-title {
font-family: Source Sans Pro;
font-size: 24px;
font-weight: 600;
@@ -119,7 +119,7 @@
margin-left: 18px;
}

.ads-candidates-numberOfApplicants {
.jobs-candidates-numberOfApplicants {
font-family: Source Sans Pro;
font-size: 16px;
font-weight: 600;
@@ -128,7 +128,7 @@
margin-left: 5px;
}

.ads-candidates-image {
.jobs-candidates-image {
width: 49px;
height: 39px;
}
@@ -194,7 +194,7 @@
margin-left: 42px;
}

.ads-search-field-responsive {
.jobs-search-field-responsive {
min-width: 350px;
border: 1px solid #226cb0;
border-radius: 10px;
@@ -209,13 +209,13 @@
}
}

.ads-search-field-responsive::placeholder {
.jobs-search-field-responsive::placeholder {
font-size: 1rem;
color: #9d9d9d;
font-style: italic;
}

.ads-search-field {
.jobs-search-field {
min-width: 700px !important;
border: 1px solid #226cb0;
border-radius: 10px;
@@ -227,7 +227,7 @@
z-index: 1000;
}

.ads-search-field::placeholder {
.jobs-search-field::placeholder {
font-size: 1rem;
color: #9d9d9d;
font-style: italic;
@@ -280,21 +280,21 @@
}

@media only screen and (max-width: 600px) {
.ads-candidates-title {
.jobs-candidates-title {
font-size: 18px;
margin-left: 10px;
}
.ads-candidates-image {
.jobs-candidates-image {
width: 40px;
height: 30px;
}
.ads-candidates-numberOfApplicants {
.jobs-candidates-numberOfApplicants {
font-size: 14px;
}
}

@media only screen and (max-width: 361px) {
.ads-candidates-slider {
.jobs-candidates-slider {
flex-direction: column-reverse;
}

@@ -310,7 +310,7 @@
margin-left: 36px;
}

.ads-candidates-top-container {
.jobs-candidates-top-container {
margin-left: 36px;
}


+ 2
- 2
src/assets/styles/components/_statistics.scss Целия файл

@@ -210,7 +210,7 @@
padding: 20px 36px !important;
}
}
.ad-count {
.job-count {
display: flex;
flex-direction: row;
justify-content: center;
@@ -232,7 +232,7 @@
order: 0;
flex-grow: 0;
}
.stat-ads {
.stat-jobs {
margin-bottom: 0 !important;
padding-bottom: 0 !important;
}

+ 10
- 10
src/components/Ads/Ad.js Целия файл

@@ -22,44 +22,44 @@ const Ad = ({
const { t } = useTranslation();

return (
<div className={`ad-card ${className}`} onClick={onShowAdDetails}>
<div className="ad-card-date">
<div className={`job-card ${className}`} onClick={onShowAdDetails}>
<div className="job-card-date">
<p>
{new Date(createdAt).toLocaleDateString()} -{" "}
{new Date(expiredAt).toLocaleDateString()}
</p>
</div>

<div className="ad-card-title">
<div className="job-card-title">
<h3>{title}</h3>
</div>

<div className="ad-card-logo">
<div className="job-card-logo">
<img src={selectLogo(title)} alt="logo-react" />
</div>

<div className="ad-card-experience">
<div className="job-card-experience">
<p>
{minimumExperience}+ {t("common.experience")}
</p>
</div>

{!matches && (
<div className="ad-card-buttons">
<div className="job-card-buttons">
<button>LinkedIn</button>
<button>Facebook</button>
<button disabled>Instagram</button>
</div>
)}
{matches && (
<div className="ad-card-buttons">
<button className="ad-card-buttons-button">
<div className="job-card-buttons">
<button className="job-card-buttons-button">
<img src={linkedin} />
</button>
<button className="ad-card-buttons-button">
<button className="job-card-buttons-button">
<img src={facebook} />
</button>
<button disabled className="ad-card-buttons-button">
<button disabled className="job-card-buttons-button">
<img src={instagram} />
</button>
</div>

+ 8
- 8
src/components/Ads/AdDetailsCandidateCard.js Целия файл

@@ -16,15 +16,15 @@ const AdDetailsCandidateCard = ({
const { t } = useTranslation();
return (
<div
data-testid="ad-details-candidate"
className={`ad-details-candidate ${className}`}
data-testid="job-details-candidate"
className={`job-details-candidate ${className}`}
>
<div className="ad-details-candidate-date">
<div className="job-details-candidate-date">
<p>{new Date().toLocaleDateString()}</p>
</div>
<div className="ad-details-candidate-title">
<div className="job-details-candidate-title">
<h3
data-testid="ad-details-candidate-title-link"
data-testid="job-details-candidate-title-link"
onClick={() =>
history.push(CANDIDATES_DETAILS_PAGE.replace(":id", id))
}
@@ -32,7 +32,7 @@ const AdDetailsCandidateCard = ({
{firstName} {lastName}
</h3>
</div>
<div className="ad-details-candidate-experience">
<div className="job-details-candidate-experience">
{experience > 0 ? (
<p>
{experience}+ {t("common.experience")}
@@ -41,12 +41,12 @@ const AdDetailsCandidateCard = ({
<p>{t("common.noExperience")}</p>
)}
</div>
<div className="ad-details-candidate-buttons">
<div className="job-details-candidate-buttons">
<button>React</button>
<button>.NET</button>
<button>Angular</button>
</div>
<div className="ad-details-candidate-cv">
<div className="job-details-candidate-cv">
<a href="#">{cv}</a>
</div>
</div>

+ 18
- 18
src/components/Ads/AdFilters.js Целия файл

@@ -81,23 +81,23 @@ const AdFilters = ({ open, handleClose, technologies }) => {
onKeyDown={handleClose}
>
<div data-testid="ad-filters-drawer">
<div className="ad-filters-header-container">
<div className="ad-filters-header">
<div className="job-filters-header-container">
<div className="job-filters-header">
<img src={filterIcon} alt="filter_icon" />
<h3>{t("filters.filters")}</h3>
<p>
<sub>| {t("ads.ads")}</sub>
</p>
</div>
<div className="ad-filters-header-close" onClick={handleClose}>
<div className="job-filters-header-close" onClick={handleClose}>
<img src={x} alt="x" />
</div>
</div>
<div className="ad-filters-experience">
<div className="ad-filters-sub-title">
<div className="job-filters-experience">
<div className="job-filters-sub-title">
<p>{t("filters.experience")}</p>
</div>
<div className="ad-filters-experience-slider">
<div className="job-filters-experience-slider">
<Slider
getAriaLabel={() => "Temperature range"}
value={sliderValue}
@@ -107,11 +107,11 @@ const AdFilters = ({ open, handleClose, technologies }) => {
/>
</div>
</div>
<div className="ad-filters-technologies">
<div className="ad-filters-sub-title">
<div className="job-filters-technologies">
<div className="job-filters-sub-title">
<p>{t("filters.tecnologies")}</p>
</div>
<div className="ad-filters-technologies-checkboxes">
<div className="job-filters-technologies-checkboxes">
<FormGroup>
{technologies?.map((technology, index) => (
<FormControlLabel
@@ -121,7 +121,7 @@ const AdFilters = ({ open, handleClose, technologies }) => {
onChange={handleCheckboxes}
value={technology.name}
checked={technology.isChecked}
className="ad-filters-checkbox"
className="job-filters-checkbox"
/>
}
label={technology.name}
@@ -130,11 +130,11 @@ const AdFilters = ({ open, handleClose, technologies }) => {
</FormGroup>
</div>
</div>
<div className="ad-filters-technologies">
<div className="ad-filters-sub-title">
<div className="job-filters-technologies">
<div className="job-filters-sub-title">
<p>{t("filters.employmentType")}</p>
</div>
<div className="ad-filters-employment-type">
<div className="job-filters-employment-type">
<button
className={`c-btn ${
employmentType === "Intership"
@@ -157,11 +157,11 @@ const AdFilters = ({ open, handleClose, technologies }) => {
</button>
</div>
</div>
<div className="ad-filters-technologies">
<div className="ad-filters-sub-title">
<div className="job-filters-technologies">
<div className="job-filters-sub-title">
<p>{t("filters.workHour")}</p>
</div>
<div className="ad-filters-employment-type">
<div className="job-filters-employment-type">
<button
className={`c-btn ${
workHour === "PartTime"
@@ -184,11 +184,11 @@ const AdFilters = ({ open, handleClose, technologies }) => {
</button>
</div>
</div>
<div className="ad-filters-search">
<div className="job-filters-search">
<button
onClick={onSubmitFilters}
className="c-btn c-btn--primary"
data-testid="ad-filters-submit"
data-testid="job-filters-submit"
>
{t("filters.search")}
</button>

+ 7
- 7
src/components/Ads/ApplyForAd.js Целия файл

@@ -91,20 +91,20 @@ const ApplyForAd = ({ open, title, adId, onCloseModal }) => {
};

return (
<CustomModal open={open} onCloseModal={onCloseModal} classes="apply-for-ad">
<div className="apply-for-ad-header">
<div className="apply-for-ad-header-left">
<div className="apply-for-ad-header-left-image">
<CustomModal open={open} onCloseModal={onCloseModal} classes="apply-for-job">
<div className="apply-for-job-header">
<div className="apply-for-job-header-left">
<div className="apply-for-job-header-left-image">
<img src={briefcaseIcon} alt="plus" />
</div>
<div className="apply-for-ad-header-left-image-title">
<div className="apply-for-job-header-left-image-title">
<p>{t("ads.signUp")}</p>
</div>
<div className="apply-for-ad-header-left-image-title-sub">
<div className="apply-for-job-header-left-image-title-sub">
<sub> | {title}</sub>
</div>
</div>
<div className="apply-for-ad-header-right">
<div className="apply-for-job-header-right">
<button onClick={onCloseModal}>
<img src={xIcon} alt="x" />
</button>

+ 13
- 13
src/components/Ads/ApplyForAdFirstStage.js Целия файл

@@ -26,27 +26,27 @@ const ApplyForAdFirstStage = ({

return (
<div>
<div className="apply-for-ad-modal-form-control">
<div className="apply-for-job-modal-form-control">
<label>{t("common.name")}</label>
<input
type="text"
placeholder="ex. Petar"
value={firstName}
data-testid="apply-for-ad-modal-first-name-input"
data-testid="apply-for-job-modal-first-name-input"
onChange={(e) => setFirstName(e.target.value)}
/>
</div>
<div className="apply-for-ad-modal-form-control">
<div className="apply-for-job-modal-form-control">
<label>{t("common.lastName")}</label>
<input
type="text"
placeholder="ex. Petrovic"
value={lastName}
data-testid="apply-for-ad-modal-last-name-input"
data-testid="apply-for-job-modal-last-name-input"
onChange={(e) => setLastName(e.target.value)}
/>
</div>
<div className="apply-for-ad-modal-form-control">
<div className="apply-for-job-modal-form-control">
<label>{t("common.gender")}</label>
<div style={{ display: "flex" }}>
<div style={{ display: "flex" }}>
@@ -54,7 +54,7 @@ const ApplyForAdFirstStage = ({
type="radio"
name="gender"
value="Muski"
className="apply-for-ad-modal-gender-input"
className="apply-for-job-modal-gender-input"
checked={gender === "Muski"}
onChange={(e) => setGender(e.target.value)}
/>
@@ -65,7 +65,7 @@ const ApplyForAdFirstStage = ({
type="radio"
name="gender"
value="Zenski"
className="apply-for-ad-modal-gender-input"
className="apply-for-job-modal-gender-input"
checked={gender === "Zenski"}
onChange={(e) => setGender(e.target.value)}
/>
@@ -73,31 +73,31 @@ const ApplyForAdFirstStage = ({
</div>
</div>
</div>
<div className="apply-for-ad-modal-form-control">
<div className="apply-for-job-modal-form-control">
<label>{t("common.dateOfBirth")}</label>
<input
type="date"
placeholder="ex. Datum rodjenja"
data-testid="apply-for-ad-modal-date-of-birth"
data-testid="apply-for-job-modal-date-of-birth"
value={dateOfBirth}
onChange={(e) => setDateOfBirth(e.target.value)}
/>
</div>
<div className="apply-for-ad-modal-form-control">
<div className="apply-for-job-modal-form-control">
<label>{t("common.phoneNumber")}</label>
<input
type="text"
placeholder="ex. +381/60/000/0000"
data-testid="apply-for-ad-modal-phone-number"
data-testid="apply-for-job-modal-phone-number"
value={phoneNumber}
onChange={(e) => setPhoneNumber(e.target.value)}
/>
</div>
<div className="apply-for-ad-buttons">
<div className="apply-for-job-buttons">
<button disabled>{t("common.back")}</button>
<button
disabled={disabled}
data-testid="apply-for-ad-modal-go-forward-button"
data-testid="apply-for-job-modal-go-forward-button"
onClick={() => onIncreaseStage()}
>
{t("common.continue")}

+ 8
- 8
src/components/Ads/ApplyForAdFourthStage.js Целия файл

@@ -22,8 +22,8 @@ const ApplyForAdFourthStage = ({
};

return (
<div data-testid="apply-for-ad-modal-fourth-stage">
<div className="apply-for-ad-modal-form-control">
<div data-testid="apply-for-job-modal-fourth-stage">
<div className="apply-for-job-modal-form-control">
<label>CV</label>
<div
className="uploadCV-input"
@@ -67,7 +67,7 @@ const ApplyForAdFourthStage = ({
id="upload-file"
style={{ display: "none", zIndex: -1 }}
value={pdfFile}
data-testid="apply-for-ad-modal-fourth-stage-pdf-input"
data-testid="apply-for-job-modal-fourth-stage-pdf-input"
onChange={(e) => {
console.log("Ovde smo");
setPdfFile(e.target.files[0]);
@@ -79,26 +79,26 @@ const ApplyForAdFourthStage = ({
</div>
</div>
</div>
<div className="apply-for-ad-modal-form-control">
<div className="apply-for-job-modal-form-control">
<label>{t("ads.coverLetter")}</label>
<textarea
value={coverLetter}
onChange={(e) => setCoverLetter(e.target.value)}
data-testid="apply-for-ad-modal-fourth-stage-cover-letter-input"
data-testid="apply-for-job-modal-fourth-stage-cover-letter-input"
placeholder="ex. Kao student Elektronskog fakulteta u Nišu..."
rows={5}
></textarea>
</div>
<div className="apply-for-ad-buttons">
<div className="apply-for-job-buttons">
<button
onClick={onDecreaseStage}
data-testid="apply-for-ad-modal-fourth-stage-go-back-button"
data-testid="apply-for-job-modal-fourth-stage-go-back-button"
>
{t("common.back")}
</button>
<button
disabled={disabled}
data-testid="apply-for-ad-modal-fourth-stage-go-forward-button"
data-testid="apply-for-job-modal-fourth-stage-go-forward-button"
onClick={onFinishedFourStages}
>
{t("ads.signUp")}

+ 16
- 16
src/components/Ads/ApplyForAdSecondStage.js Целия файл

@@ -35,11 +35,11 @@ const ApplyForAdSecondStage = ({
};

return (
<div data-testid="apply-for-ad-second-stage">
<div className="apply-for-ad-header-title">
<div data-testid="apply-for-job-second-stage">
<div className="apply-for-job-header-title">
<p>{t("ads.professionalQualification")}</p>
</div>
<div className="apply-for-ad-modal-form-control">
<div className="apply-for-job-modal-form-control">
<input
type="text"
placeholder="ex. Elektrotehnicki fakultet"
@@ -48,13 +48,13 @@ const ApplyForAdSecondStage = ({
onChange={(e) => setProfessionalQualification(e.target.value)}
/>
</div>
<div className="apply-for-ad-header-title">
<div className="apply-for-job-header-title">
<p>{t("ads.technologies")}</p>
</div>
<div className="apply-for-ad-header-sub">
<div className="apply-for-ad-header-sub-group">
<div className="apply-for-job-header-sub">
<div className="apply-for-job-header-sub-group">
<label>Back-End</label>
<div className="apply-for-ad-header-sub-group-checkboxes">
<div className="apply-for-job-header-sub-group-checkboxes">
{technologies
.filter((x) => x.technologyType === "Backend")
.map((x) => (
@@ -62,7 +62,7 @@ const ApplyForAdSecondStage = ({
key={x.technologyId}
control={
<Checkbox
className="apply-for-ad-second-stage-checkbox"
className="apply-for-job-second-stage-checkbox"
value={x.name}
checked={x.isChecked}
onChange={handleCheckboxes.bind(this, x.technologyId)}
@@ -73,9 +73,9 @@ const ApplyForAdSecondStage = ({
))}
</div>
</div>
<div className="apply-for-ad-header-sub-group">
<div className="apply-for-job-header-sub-group">
<label>Front-End</label>
<div className="apply-for-ad-header-sub-group-checkboxes">
<div className="apply-for-job-header-sub-group-checkboxes">
{technologies
.filter((x) => x.technologyType === "Frontend")
.map((x) => (
@@ -83,7 +83,7 @@ const ApplyForAdSecondStage = ({
key={x.technologyId}
control={
<Checkbox
className="apply-for-ad-second-stage-checkbox"
className="apply-for-job-second-stage-checkbox"
value={x.name}
checked={x.isChecked}
onChange={handleCheckboxes.bind(this, x.technologyId)}
@@ -94,9 +94,9 @@ const ApplyForAdSecondStage = ({
))}
</div>
</div>
<div className="apply-for-ad-header-sub-group">
<div className="apply-for-job-header-sub-group">
<label>{t("ads.others")}</label>
<div className="apply-for-ad-header-sub-group-checkboxes">
<div className="apply-for-job-header-sub-group-checkboxes">
{technologies
.filter((x) => x.technologyType === "Other")
.map((x) => (
@@ -104,7 +104,7 @@ const ApplyForAdSecondStage = ({
key={x.technologyId}
control={
<Checkbox
className="apply-for-ad-second-stage-checkbox"
className="apply-for-job-second-stage-checkbox"
value={x.name}
checked={x.isChecked}
onChange={handleCheckboxes.bind(this, x.technologyId)}
@@ -116,7 +116,7 @@ const ApplyForAdSecondStage = ({
</div>
</div>
</div>
<div className="apply-for-ad-modal-form-control">
<div className="apply-for-job-modal-form-control">
<label>{t("filters.experience")}</label>
<input
type="number"
@@ -126,7 +126,7 @@ const ApplyForAdSecondStage = ({
onChange={(e) => setExperience(e.target.value)}
/>
</div>
<div className="apply-for-ad-buttons">
<div className="apply-for-job-buttons">
<button onClick={onDecreaseStage}>{t("common.back")}</button>
<button onClick={onIncreaseStage} disabled={disabled}>
{t("common.continue")}

+ 6
- 6
src/components/Ads/ApplyForAdThirdStage.js Целия файл

@@ -23,10 +23,10 @@ const ApplyForAdThirdStage = ({

return (
<div>
<div className="apply-for-ad-header-title">
<div className="apply-for-job-header-title">
<p>{t("common.socialNetwork")}</p>
</div>
<div className="apply-for-ad-modal-form-control">
<div className="apply-for-job-modal-form-control">
<label>LinkedIn</label>
<input
type="text"
@@ -36,7 +36,7 @@ const ApplyForAdThirdStage = ({
placeholder="ex. https://www.linkedin.com/in/petar-petrovic"
/>
</div>
<div className="apply-for-ad-modal-form-control">
<div className="apply-for-job-modal-form-control">
<label>GitHub</label>
<input
type="text"
@@ -46,7 +46,7 @@ const ApplyForAdThirdStage = ({
placeholder="ex. https://www.github.com/petarpetrovic"
/>
</div>
<div className="apply-for-ad-modal-form-control">
<div className="apply-for-job-modal-form-control">
<label>BitBucket</label>
<input
type="text"
@@ -56,7 +56,7 @@ const ApplyForAdThirdStage = ({
placeholder="ex. https://developer.atlassian.com/user/petarapetrovic"
/>
</div>
<div className="apply-for-ad-modal-form-control">
<div className="apply-for-job-modal-form-control">
<label>Email</label>
<input
type="email"
@@ -66,7 +66,7 @@ const ApplyForAdThirdStage = ({
placeholder="ex. petar.petrovic@dilig.net"
/>
</div>
<div className="apply-for-ad-buttons">
<div className="apply-for-job-buttons">
<button
onClick={onDecreaseStage}
data-testid="apply-for-ad-modal-third-stage-go-back-button"

src/components/Ads/ArchiveAd.js → src/components/Ads/ArchiveJob.js Целия файл

@@ -3,7 +3,7 @@ import PropTypes from "prop-types";
import { selectLogo } from "../../util/helpers/technologiesLogos";
import { useTranslation } from "react-i18next";

const ArchiveAd = ({
const ArchiveJob = ({
className,
title,
minimumExperience,
@@ -13,20 +13,20 @@ const ArchiveAd = ({
}) => {
const { t } = useTranslation();
return (
<div className={`archive-ad ${className}`} onClick={onShowAdDetails}>
<div className="archive-ad-date">
<div className={`archive-job ${className}`} onClick={onShowAdDetails}>
<div className="archive-job-date">
<p>
{new Date(createdAt).toLocaleDateString()} -{" "}
{new Date(expiredAt).toLocaleDateString()}
</p>
</div>
<div className="archive-ad-title">
<div className="archive-job-title">
<h3>{title}</h3>
</div>
<div className="archive-ad-image">
<div className="archive-job-image">
<img src={selectLogo(title)} alt=".net icon" />
</div>
<div className="archive-ad-experience">
<div className="archive-job-experience">
{minimumExperience > 0 ? (
<p>
{minimumExperience}+ {t("common.experience")}
@@ -39,7 +39,7 @@ const ArchiveAd = ({
);
};

ArchiveAd.propTypes = {
ArchiveJob.propTypes = {
id: PropTypes.number,
title: PropTypes.string,
minimumExperience: PropTypes.number,
@@ -49,4 +49,4 @@ ArchiveAd.propTypes = {
className: PropTypes.any,
};

export default ArchiveAd;
export default ArchiveJob;

+ 6
- 6
src/components/Ads/StatsAd.js Целия файл

@@ -14,23 +14,23 @@ const StatsAd = ({
}) => {
const {t} = useTranslation()
return (
<div className={`archive-ad stats-ad ${className}`} onClick={onShowAdDetails}>
<div className="ad-count">
<div className={`archive-job stats-job ${className}`} onClick={onShowAdDetails}>
<div className="job-count">
{count} {t("ads.registered")}
</div>
<div className="archive-ad-date">
<div className="archive-job-date">
<p>
{new Date(createdAt).toLocaleDateString()} -{" "}
{new Date(expiredAt).toLocaleDateString()}
</p>
</div>
<div className="archive-ad-title">
<div className="archive-job-title">
<h3>{title}</h3>
</div>
<div className="archive-ad-image">
<div className="archive-job-image">
<img src={selectLogo(title)} alt=".net icon" />
</div>
<div className="archive-ad-experience">
<div className="archive-job-experience">
{minimumExperience > 0 ? (
<p>{minimumExperience}+ {t("common.experience")}</p>
) : (

+ 1
- 1
src/components/Button/FilterButton.js Целия файл

@@ -14,7 +14,7 @@ const FilterButton = ({ onShowFilters }) => {
return (
<IconButton
className={
"c-btn--primary-outlined ads-page-btn fltr-btn c-btn userPageBtn ml-20px no-padding custom-filter-button"
"c-btn--primary-outlined jobs-page-btn fltr-btn c-btn userPageBtn ml-20px no-padding custom-filter-button"
}
onClick={onShowFilters}
>

+ 16
- 16
src/components/Candidates/CandidateFilters.js Целия файл

@@ -182,23 +182,23 @@ const CandidateFilters = ({
onKeyDown={handleClose}
>
<div>
<div className="ad-filters-header-container">
<div className="ad-filters-header">
<div className="job-filters-header-container">
<div className="job-filters-header">
<img src={filterIcon} alt="filter_icon" />
<h3>{t("filters.filters")}</h3>
<p>
<sub>| {t("candidates.candidates")}</sub>
</p>
</div>
<div className="ad-filters-header-close" onClick={handleClose}>
<div className="job-filters-header-close" onClick={handleClose}>
<img src={x} alt="x" />
</div>
</div>
<div className="ad-filters-experience">
<div className="ad-filters-sub-title">
<div className="job-filters-experience">
<div className="job-filters-sub-title">
<p>{t("filters.experience")}</p>
</div>
<div className="ad-filters-experience-slider">
<div className="job-filters-experience-slider">
<Slider
getAriaLabel={() => "Temperature range"}
value={sliderValue}
@@ -208,11 +208,11 @@ const CandidateFilters = ({
/>
</div>
</div>
<div className="ad-filters-technologies">
<div className="ad-filters-sub-title">
<div className="job-filters-technologies">
<div className="job-filters-sub-title">
<p>{t("filters.technologies")}</p>
</div>
<div className="ad-filters-technologies-checkboxes">
<div className="job-filters-technologies-checkboxes">
<FormGroup>
{technologies.map((technology, index) => (
<FormControlLabel
@@ -221,7 +221,7 @@ const CandidateFilters = ({
<Checkbox
checked={technology.isChecked}
name={technology.name}
className="ad-filters-technologies-checkboxes-checkbox"
className="job-filters-technologies-checkboxes-checkbox"
onChange={handleTechologiesChange}
/>
}
@@ -231,11 +231,11 @@ const CandidateFilters = ({
</FormGroup>
</div>
</div>
<div className="ad-filters-technologies">
<div className="ad-filters-sub-title">
<div className="job-filters-technologies">
<div className="job-filters-sub-title">
<p>{t("filters.employmentType")}</p>
</div>
<div className="ad-filters-employment-type">
<div className="job-filters-employment-type">
{typesOfEmployments.map((type, index) => (
<button
key={index}
@@ -251,8 +251,8 @@ const CandidateFilters = ({
))}
</div>
</div>
<div className="ad-filters-technologies" style={{ marginTop: "35px" }}>
<div className="ad-filters-sub-title">
<div className="job-filters-technologies" style={{ marginTop: "35px" }}>
<div className="job-filters-sub-title">
<p>{t("filters.dateOfApplication")}</p>
<div className="filter-date-container">
<p>{t("common.from")}</p>
@@ -277,7 +277,7 @@ const CandidateFilters = ({
</div>
</div>
</div>
<div className="ad-filters-search" style={{ marginTop: "45px" }}>
<div className="job-filters-search" style={{ marginTop: "45px" }}>
<button
className="c-btn c-btn--primary"
onClick={fiterItems}

+ 1
- 1
src/components/MUI/NavbarComponent.js Целия файл

@@ -36,7 +36,7 @@ import { Link, useLocation } from "react-router-dom";

const NavbarComponent = () => {
const navItems = [
"ads",
"jobs",
"selectionFlow",
"candidates",
"schedule",

+ 3
- 3
src/components/Selection/ApplicantSelection.js Целия файл

@@ -45,7 +45,7 @@ const ApplicantSelection = ({
<p>{date && date !== "" && formatDate(new Date(date))}</p>
</div>

<div className="ad-card-title">
<div className="job-card-title">
<h3>{levelName}</h3>
</div>

@@ -61,12 +61,12 @@ const ApplicantSelection = ({

<div className="active-process-card-link">
{status === "Odrađen" && (
<Link className="ad-details-buttons-link" to={"/candidates/" + id}>
<Link className="job-details-buttons-link" to={"/candidates/" + id}>
{t("selection.report")}
</Link>
)}
{link && status !== "Odrađen" && (
<a href={link} className="ad-details-buttons-link">
<a href={link} className="job-details-buttons-link">
{t("selection.link")}
</a>
)}

+ 12
- 12
src/components/Selection/SelectionFilter.js Целия файл

@@ -53,23 +53,23 @@ const SelectionFilter = ({ open, handleClose, statuses }) => {
onKeyDown={handleClose}
>
<div>
<div className="ad-filters-header-container">
<div className="ad-filters-header">
<div className="job-filters-header-container">
<div className="job-filters-header">
<img src={filterIcon} alt="filter_icon" />
<h3>{t("filters.filters")}</h3>
<p>
<sub>| {t("selection.title")}</sub>
</p>
</div>
<div className="ad-filters-header-close" onClick={handleClose}>
<div className="job-filters-header-close" onClick={handleClose}>
<img src={x} alt="x" />
</div>
</div>
<div className="ad-filters-technologies">
<div className="ad-filters-sub-title">
<div className="job-filters-technologies">
<div className="job-filters-sub-title">
<p>Status</p>
</div>
<div className="ad-filters-technologies-checkboxes">
<div className="job-filters-technologies-checkboxes">
<FormGroup>
{statuses?.map((technology, index) => (
<FormControlLabel
@@ -87,8 +87,8 @@ const SelectionFilter = ({ open, handleClose, statuses }) => {
</FormGroup>
</div>
</div>
<div className="ad-filters-technologies">
{/* <div className="ad-filters-sub-title">
<div className="job-filters-technologies">
{/* <div className="job-filters-sub-title">
<p>Datum isteka oglasa</p>
</div>
<input
@@ -97,10 +97,10 @@ const SelectionFilter = ({ open, handleClose, statuses }) => {
value={expiredAt}
onChange={(e) => setExpiredAt(e.target.value)}
/> */}
<div className="ad-filters-sub-title">
<div className="job-filters-sub-title">
<p>{t("selection.filterDate")}</p>
</div>
<div className="add-ad-modal-stage-sub-card">
<div className="add-job-modal-stage-sub-card">
<label>{t("common.from")}</label>
<input
type="date"
@@ -109,7 +109,7 @@ const SelectionFilter = ({ open, handleClose, statuses }) => {
onChange={(e) => setStartAt(e.target.value)}
/>
</div>
<div className="add-ad-modal-stage-sub-card">
<div className="add-job-modal-stage-sub-card">
<label>{t("common.to")}</label>
<input
type="date"
@@ -119,7 +119,7 @@ const SelectionFilter = ({ open, handleClose, statuses }) => {
/>
</div>
</div>
<div className="ad-filters-search">
<div className="job-filters-search">
<button onClick={onSubmitFilters} className="c-btn c-btn--primary">
{t("common.search")}
</button>

+ 3
- 3
src/constants/pages.js Целия файл

@@ -2,8 +2,8 @@
export const BASE_PAGE = '/';
export const FORGOT_PASSWORD_PAGE = '/forgot-password';
export const HOME_PAGE = '/home';
export const ADS_PAGE = '/ads';
export const AD_DETAILS_PAGE = '/ads/:id';
export const ADS_PAGE = '/jobs';
export const JOB_DETAILS_PAGE = '/jobs/:id';
export const ERROR_PAGE = '/error-page';
export const NOT_FOUND_PAGE = '/not-found';
export const USERS_PAGE = '/users';
@@ -19,4 +19,4 @@ export const PATTERN_DETAILS_PAGE = '/patterns/:id';
export const SCHEDULE_PAGE = '/schedule'
export const STATS_PAGE = '/statistics';
export const REGISTER_PAGE = '/register';
export const CREATE_AD_PAGE = '/create-ad';
export const CREATE_AD_PAGE = '/create-job';

+ 1
- 1
src/i18n/resources/en.js Целия файл

@@ -121,7 +121,7 @@ export default {
},
nav: {
navigation: "Navigation",
ads: "Ads",
jobs: "Ads",
selectionFlow: "Selection flow",
candidates: "Candidates",
planer: "Planer",

+ 30
- 30
src/pages/AdsPage/AdDetailsPage.js Целия файл

@@ -108,31 +108,31 @@ const AdDetailsPage = () => {
<>
{!ad && <p>Radi</p>}
{ad && (
<div data-testid="ad-details-page">
<div data-testid="job-details-page">
<ApplyForAd
open={applyForAdOpenModal}
title={ad.title}
adId={id}
onCloseModal={handleCloseApplyForAdModal}
/>
<div className="ad-details">
<div className="job-details">
{matches && (
<div className="ad-details-tech-logo-date">
<div className="job-details-tech-logo-date">
<p>
<span>{t("ads.adDetailsExpiredAt")}: </span>
{new Date(ad.expiredAt).toLocaleDateString()}
</p>
</div>
)}
<div className="ad-details-tech-logo">
<div className="ad-details-tech-logo-title">
<div className="ad-details-tech-logo-title-img">
<div className="job-details-tech-logo">
<div className="job-details-tech-logo-title">
<div className="job-details-tech-logo-title-img">
<img src={selectLogo(ad.title)} alt="asp-net-icon" />
</div>
<div className="ad-details-tech-logo-title-title">
<div className="job-details-tech-logo-title-title">
<h1>{ad.title}</h1>
</div>
<div className="ad-details-tech-logo-title-sub">
<div className="job-details-tech-logo-title-sub">
<sub>
| {ad.totalApplicants} {t("ads.registered")}
</sub>
@@ -141,7 +141,7 @@ const AdDetailsPage = () => {
{!(new Date(ad.expiredAt) < new Date()) && (
<IconButton
onClick={() => setShowArchiveAdDialog(true)}
className={`c-btn--primary-outlined editEnableBtn c-btn userPageBtn archive-ad-button
className={`c-btn--primary-outlined editEnableBtn c-btn userPageBtn archive-job-button
}`}
>
{!matches && "Arhiviraj"}
@@ -167,43 +167,43 @@ const AdDetailsPage = () => {
}}
onConfirm={() => archiveAdHandler()}
/>
<div className="ad-details-content">
<div className="ad-details-content-experience">
<div className="job-details-content">
<div className="job-details-content-experience">
<p>
{ad.minimumExperience}+ {t("ads.adDetailsExperience")}
</p>
</div>
<div className="ad-details-content-work-time">
<div className="job-details-content-work-time">
<button>{t("filters.work")}</button>
<button>{t("filters.fullTime")}</button>
</div>
<div className="ad-details-content-content">
<div className="ad-details-content-conten-description">
<div className="job-details-content-content">
<div className="job-details-content-conten-description">
<p>{t("ads.adDetailsDescription")}</p>
</div>
<div className="ad-details-content-conten-description">
<div className="job-details-content-conten-description">
<h3>{t("ads.adDetailsKeyResponsibilities")}</h3>
{parse(ad.keyResponsibilities)}
</div>
<div className="ad-details-content-conten-description">
<div className="job-details-content-conten-description">
<h3>{t("ads.adDetailsRequirements")}</h3>
{parse(ad.requirements)}
</div>
<div className="ad-details-content-conten-description">
<div className="job-details-content-conten-description">
<h3>{t("ads.adDetailsOffer")}</h3>
{parse(ad.offer)}
</div>
</div>
</div>
{ad.applicants && ad.applicants.length > 0 && (
<div className="ad-details-applicants">
<div className="ad-details-applicants-header">
<div className="job-details-applicants">
<div className="job-details-applicants-header">
<h2>{t("ads.archiveAdsCandidates")}</h2>
</div>
<div className="ad-details-applicants-applicants">
<div className="job-details-applicants-applicants">
{!matches && (
<div className="ad-details-applicants-applicants-a">
<div className="ad-details-applicants-applicants-arrows">
<div className="job-details-applicants-applicants-a">
<div className="job-details-applicants-applicants-arrows">
<button onClick={archiveAdsArrowLeftHandler}>
<img src={arrow_left} alt="arrow-left" />
</button>
@@ -215,7 +215,7 @@ const AdDetailsPage = () => {
</div>
</div>
)}
<div className="ad-details-applicants-applicants-applicant">
<div className="job-details-applicants-applicants-applicant">
<Slider
ref={archiveAdsSliderRef}
{...settings}
@@ -239,7 +239,7 @@ const AdDetailsPage = () => {
</div>
</div>
{matches && (
<div className="active-ads-ads-arrows">
<div className="active-jobs-jobs-arrows">
<button onClick={archiveAdsArrowLeftHandler}>
<img src={arrow_left} alt="arrow-left" />
</button>
@@ -252,10 +252,10 @@ const AdDetailsPage = () => {
)}
</div>
)}
<div className="ad-details-actions">
<div className="job-details-actions">
{!matches && (
<div className="ad-details-expired-at">
<div className="ad-details-tech-logo-date">
<div className="job-details-expired-at">
<div className="job-details-tech-logo-date">
<p>
<span>{t("ads.adDetailsExpiredAt")}: </span>
{new Date(ad.expiredAt).toLocaleDateString()}
@@ -263,9 +263,9 @@ const AdDetailsPage = () => {
</div>
</div>
)}
<div className="ad-details-buttons">
<div className="job-details-buttons">
<button
className="ad-details-buttons-link"
className="job-details-buttons-link"
onClick={() => history.push({ pathname: ADS_PAGE })}
>
{t("ads.backToAds")}
@@ -273,7 +273,7 @@ const AdDetailsPage = () => {

{!(new Date(ad.expiredAt) < new Date()) && (
<IconButton
className="c-btn c-btn--primary add-ad-btn apply-for-ad-button"
className="c-btn c-btn--primary add-job-btn apply-for-job-button"
onClick={() => setApplyForAdOpenModal(true)}
>
{t("ads.signUp").toUpperCase()}

+ 47
- 47
src/pages/AdsPage/AdsPage.js Целия файл

@@ -1,7 +1,6 @@
import React, { useState, useEffect, useRef } from "react";
import PropTypes from "prop-types";
import Ad from "../../components/Ads/Ad";
import ArchiveAd from "../../components/Ads/ArchiveAd";
import IconButton from "../../components/IconButton/IconButton";
import arrow_left from "../../assets/images/arrow_left.png";
import arrow_right from "../../assets/images/arrow_right.png";
@@ -15,7 +14,7 @@ import {
} from "../../store/actions/ads/adsAction";
import { useSelector } from "react-redux";
import { selectAds } from "../../store/selectors/adsSelectors";
import { AD_DETAILS_PAGE, CREATE_AD_PAGE } from "../../constants/pages";
import { JOB_DETAILS_PAGE, CREATE_AD_PAGE } from "../../constants/pages";
import FilterButton from "../../components/Button/FilterButton";
import Slider from "react-slick";
import "slick-carousel/slick/slick.css";
@@ -31,6 +30,7 @@ import { useLocation } from "react-router-dom";
import Fade from "@mui/material/Fade";
import { FETCH_ADS_LOADING } from "../../store/actions/ads/adsActionConstants";
import { selectIsLoadingByActionType } from "../../store/selectors/loadingSelectors";
import ArchiveJob from '../../components/Ads/ArchiveJob'

const AdsPage = ({ history }) => {
const theme = useTheme();
@@ -41,9 +41,9 @@ const AdsPage = ({ history }) => {
const [tmp, setTmp] = useState(null);
const ads = useSelector(selectAds);
const technologies = useSelector(selectTechnologies);
const archiveAds = useSelector(selectArchiveAds);
const archiveJobs = useSelector(selectArchiveAds);
const activeAdsSliderRef = useRef();
const archiveAdsSliderRef = useRef();
const archiveJobsSliderRef = useRef();
const { t } = useTranslation();
const dispatch = useDispatch();
const { search } = useLocation();
@@ -53,8 +53,8 @@ const AdsPage = ({ history }) => {
dispatch(setArchiveAdsReq());
}, []);

var slider1 = document.querySelector(".active-ads-ads-ad .slick-track");
var slider2 = document.querySelector(".archived-ads-ads-ad .slick-track");
var slider1 = document.querySelector(".active-jobs-jobs-job .slick-track");
var slider2 = document.querySelector(".archived-jobs-jobs-job .slick-track");

useEffect(() => {
if (slider1 && slider2) {
@@ -150,11 +150,11 @@ const AdsPage = ({ history }) => {
};

const archiveAdsArrowLeftHandler = () => {
archiveAdsSliderRef.current.slickPrev();
archiveJobsSliderRef.current.slickPrev();
};

const archiveAdsArrowRightHandler = () => {
archiveAdsSliderRef.current.slickNext();
archiveJobsSliderRef.current.slickNext();
};

// const deleteFiltersHandler = () => {
@@ -172,11 +172,11 @@ const AdsPage = ({ history }) => {
return ads;
};

const getDummyArchiveAds = (len) => {
const getDummyArchiveJobs = (len) => {
const ads = [];

for (let i = 0; i < 5 - len + 1; i++) {
ads.push(<ArchiveAd key={i} className="hiddenAd" />);
ads.push(<ArchiveJob key={i} className="hiddenAd" />);
}

return ads;
@@ -196,7 +196,7 @@ const AdsPage = ({ history }) => {
placeholder="Pretrazi..."
value={searchInput}
onChange={(e) => setSearchInput(e.target.value)}
className="ads-search-field"
className="jobs-search-field"
onClick={stopPropagation}
style={{ zIndex: 1000 }}
/>
@@ -209,7 +209,7 @@ const AdsPage = ({ history }) => {
placeholder="Pretrazi..."
value={searchInput}
onChange={(e) => setSearchInput(e.target.value)}
className="ads-search-field-responsive smaller"
className="jobs-search-field-responsive smaller"
onClick={stopPropagation}
style={{ zIndex: 1000 }}
/>
@@ -226,7 +226,7 @@ const AdsPage = ({ history }) => {
</div>
</div>
) : (
<div data-testid="ads-page">
<div data-testid="jobs-page">
<div className="l-t-rectangle"></div>
<div className="r-b-rectangle"></div>
{/* <AdFilters /> */}
@@ -241,7 +241,7 @@ const AdsPage = ({ history }) => {
<Fade
in={isSearchFieldVisible}
timeout={500}
className="ads-page-search-by-title"
className="jobs-page-search-by-title"
>
{inputNormal}
</Fade>
@@ -279,12 +279,12 @@ const AdsPage = ({ history }) => {
</>
)}
</div>
<div className="ads" onClick={() => handleChangeVisibility(false)}>
<div className="jobs" onClick={() => handleChangeVisibility(false)}>
{ads && ads.length > 0 && (
<div className="active-ads">
<div className="active-ads-header">
<div className="active-jobs">
<div className="active-jobs-header">
<h1>{t("ads.activeAds")}</h1>
<div className="active-ads-header-buttons">
<div className="active-jobs-header-buttons">
<IconButton
className={
"c-btn--primary-outlined c-btn ads-page-btn userPageBtn ml-20px no-padding"
@@ -304,10 +304,10 @@ const AdsPage = ({ history }) => {
<FilterButton onShowFilters={handleToggleFiltersDrawer} />
</div>
</div>
<div className="active-ads-ads">
<div className="active-ads-ads-a">
<div className="active-jobs-jobs">
<div className="active-jobs-jobs-a">
{!matches && (
<div className="active-ads-ads-arrows">
<div className="active-jobs-jobs-arrows">
<button onClick={activeAdsArrowLeftHandler}>
<img src={arrow_left} alt="arrow-left" />
</button>
@@ -319,7 +319,7 @@ const AdsPage = ({ history }) => {
</div>
)}
</div>
<div className="active-ads-ads-ad">
<div className="active-jobs-jobs-job">
<Slider
{...settings}
slidesToShow={3}
@@ -334,7 +334,7 @@ const AdsPage = ({ history }) => {
.map((ad, index) => (
<Ad
onShowAdDetails={() =>
history.push(AD_DETAILS_PAGE.replace(":id", ad.id))
history.push(JOB_DETAILS_PAGE.replace(":id", ad.id))
}
key={index}
title={ad.title}
@@ -350,7 +350,7 @@ const AdsPage = ({ history }) => {
</div>
)}
{ads && ads.length > 0 && matches && (
<div className="active-ads-ads-arrows">
<div className="active-jobs-jobs-arrows">
<button onClick={activeAdsArrowLeftHandler}>
<img src={arrow_left} alt="arrow-left" />
</button>
@@ -362,16 +362,16 @@ const AdsPage = ({ history }) => {
</div>
)}
{(!ads || ads.length === 0) && (
<div className="active-ads-ads-no-ads">
<div className="active-ads-ads-no-ads-filters">
<div className="active-jobs-jobs-no-jobs">
<div className="active-jobs-jobs-no-jobs-filters">
<FilterButton onShowFilters={handleToggleFiltersDrawer} />
</div>
<img src={noActiveAds} alt="noActiveAds" />
<h1>{t("ads.thereIsNoAds")}</h1>
<p>{t("ads.addAd")}</p>
<div className="add-ad add-ad-no-ads">
<div className="add-job add-job-no-jobs">
<IconButton
className="c-btn ads-page-btn c-btn--primary add-ad-btn"
className="c-btn jobs-page-btn c-btn--primary add-job-btn"
onClick={() => history.push(CREATE_AD_PAGE)}
>
{t("ads.adNewAd")}
@@ -379,19 +379,19 @@ const AdsPage = ({ history }) => {
</div>
</div>
)}
{archiveAds && archiveAds.length > 0 && (
<div className="archived-ads">
<div className="archived-ads-header">
{archiveJobs && archiveJobs.length > 0 && (
<div className="archived-jobs">
<div className="archived-jobs-header">
<h2>{t("ads.archiveAds")}</h2>
</div>
<div className="archived-ads-ads">
<div className="archived-jobs-jobs">
{!matches && (
<div className="archived-ads-ads-a">
<div className="archived-ads-ads-arrows">
<div className="archived-jobs-jobs-a">
<div className="archived-jobs-jobs-arrows">
<button onClick={archiveAdsArrowLeftHandler}>
<img src={arrow_left} alt="arrow-left" />
</button>
{archiveAds.length > 5 && (
{archiveJobs.length > 5 && (
<button onClick={archiveAdsArrowRightHandler}>
<img src={arrow_right} alt="arrow-right" />
</button>
@@ -399,41 +399,41 @@ const AdsPage = ({ history }) => {
</div>
</div>
)}
<div className="archived-ads-ads-ad">
<div className="archived-jobs-jobs-job">
<Slider
ref={archiveAdsSliderRef}
ref={archiveJobsSliderRef}
{...settings}
slidesToShow={5}
slidesToScroll={5}
style={{ width: "100%" }}
>
{archiveAds
{archiveJobs
.filter((ad) =>
ad.title.toLowerCase().includes(searchInput.toLowerCase())
)
.map((ad, index) => (
<ArchiveAd
<ArchiveJob
key={index}
title={ad.title}
minimumExperience={ad.minimumExperience}
createdAt={ad.createdAt}
expiredAt={ad.expiredAt}
onShowAdDetails={() =>
history.push(AD_DETAILS_PAGE.replace(":id", ad.id))
history.push(JOB_DETAILS_PAGE.replace(":id", ad.id))
}
/>
))}
{archiveAds.length <= 5 &&
getDummyArchiveAds(archiveAds.length)}
{archiveJobs.length <= 5 &&
getDummyArchiveJobs(archiveJobs.length)}
</Slider>
</div>
</div>
{matches && (
<div className="active-ads-ads-arrows">
<div className="active-jobs-jobs-arrows">
<button onClick={archiveAdsArrowLeftHandler}>
<img src={arrow_left} alt="arrow-left" />
</button>
{archiveAds.length > 5 && (
{archiveJobs.length > 5 && (
<button onClick={archiveAdsArrowRightHandler}>
<img src={arrow_right} alt="arrow-right" />
</button>
@@ -441,15 +441,15 @@ const AdsPage = ({ history }) => {
</div>
)}

<div className="archive-ads-no-active-ads"></div>
<div className="archive-jobs-no-active-jobs"></div>
</div>
)}
</div>

{ads && ads.length > 0 && (
<div className="add-ad">
<div className="add-job">
<IconButton
className="c-btn ads-page-btn c-btn--primary add-ad-btn"
className="c-btn ads-page-btn c-btn--primary add-job-btn"
onClick={createAd}
>
+ {t("ads.ad")}

+ 9
- 9
src/pages/AdsPage/CreateAdFirstStep.js Целия файл

@@ -22,20 +22,20 @@ const CreateAdFirstStep = ({
};

return (
<div data-testid="create-ad-first-step-form">
<div className="create-ad-form-control">
<div data-testid="create-job-first-step-form">
<div className="create-job-form-control">
<label>{t("common.title")}</label>
<input
type="text"
className="create-ad-form-control-first-step-input"
className="create-job-form-control-first-step-input"
onChange={(e) => setTitle(e.target.value)}
value={title}
placeholder="ex. Medior React Developer"
/>
</div>
<div className="create-ad-form-control">
<div className="create-job-form-control">
<label>{t("filters.employmentType")}</label>
<div className="create-ad-form-control-buttons">
<div className="create-job-form-control-buttons">
<button
className={`c-btn ${
employmentType === "Work"
@@ -58,9 +58,9 @@ const CreateAdFirstStep = ({
</button>
</div>
</div>
<div className="create-ad-form-control">
<div className="create-job-form-control">
<label>{t("filters.workHour")}</label>
<div className="create-ad-form-control-buttons">
<div className="create-job-form-control-buttons">
<button
className={`c-btn ${
workHour === "PartTime"
@@ -83,11 +83,11 @@ const CreateAdFirstStep = ({
</button>
</div>
</div>
<div className="create-ad-form-control">
<div className="create-job-form-control">
<label>{t("ads.expirationDate")}</label>
<input
type="date"
className="create-ad-form-control-first-step-input"
className="create-job-form-control-first-step-input"
onChange={(e) => setExpiredAt(e.target.value)}
value={expiredAt}
/>

+ 7
- 7
src/pages/AdsPage/CreateAdPage.js Целия файл

@@ -109,9 +109,9 @@ const CreateAdPage = () => {
};

return (
<div className="create-ad-page" data-testid="create-ad-page">
<div className="create-ad-page-content">
<div className="create-ad-page-content-header">
<div className="create-job-page" data-testid="create-job-page">
<div className="create-job-page-content">
<div className="create-job-page-content-header">
<img
src={plusIcon}
alt="plus"
@@ -122,7 +122,7 @@ const CreateAdPage = () => {
<sub> | {t("ads.ad")}</sub>
</h2>
</div>
<div className="create-ad-steps">
<div className="create-job-steps">
{stage === 1 && (
<CreateAdFirstStep
title={title}
@@ -144,16 +144,16 @@ const CreateAdPage = () => {
)}
{stage === 3 && <CreateAdThirdStep childRef={childRef} />}
</div>
<div className="create-ad-buttons" style={{ marginBottom: "2rem" }}>
<div className="create-job-buttons" style={{ marginBottom: "2rem" }}>
<button
className="create-ad-buttons-back"
className="create-job-buttons-back"
disabled={stage === 1}
onClick={backClickHandler}
>
{t("common.back")}
</button>
<button
className="create-ad-buttons-forward"
className="create-job-buttons-forward"
onClick={forwardClickHandler}
>
{t("common.continue")}

+ 13
- 13
src/pages/AdsPage/CreateAdSecondStep.js Целия файл

@@ -14,14 +14,14 @@ const CreateAdSecondStep = ({ technologies, experience, setExperience }) => {
};

return (
<div data-testid="create-ad-second-step-form">
<div className="create-ad-form-control">
<div data-testid="create-job-second-step-form">
<div className="create-job-form-control">
<label>{t("filters.advancedTechnologies")}</label>
</div>
<div className="add-ad-modal-stage-sub-card">
<div className="add-ad-modal-stage-sub-card-checkboxes-group">
<div className="add-job-modal-stage-sub-card">
<div className="add-job-modal-stage-sub-card-checkboxes-group">
<label>Front-End</label>
<div className="add-ad-modal-stage-sub-card-checkboxes">
<div className="add-job-modal-stage-sub-card-checkboxes">
{technologies
.filter((x) => x.technologyType === "Frontend")
.map((x) => (
@@ -32,7 +32,7 @@ const CreateAdSecondStep = ({ technologies, experience, setExperience }) => {
value={x.name}
checked={x.isChecked}
onChange={handleCheckboxes.bind(this, x.technologyId)}
className="create-ad-second-step-checkbox"
className="create-job-second-step-checkbox"
/>
}
label={x.name}
@@ -41,9 +41,9 @@ const CreateAdSecondStep = ({ technologies, experience, setExperience }) => {
</div>
</div>

<div className="add-ad-modal-stage-sub-card-checkboxes-group">
<div className="add-job-modal-stage-sub-card-checkboxes-group">
<label>Back-End</label>
<div className="add-ad-modal-stage-sub-card-checkboxes">
<div className="add-job-modal-stage-sub-card-checkboxes">
{technologies
.filter((x) => x.technologyType === "Backend")
.map((x) => (
@@ -54,7 +54,7 @@ const CreateAdSecondStep = ({ technologies, experience, setExperience }) => {
value={x.name}
checked={x.isChecked}
onChange={handleCheckboxes.bind(this, x.technologyId)}
className="create-ad-second-step-checkbox"
className="create-job-second-step-checkbox"
/>
}
label={x.name}
@@ -63,9 +63,9 @@ const CreateAdSecondStep = ({ technologies, experience, setExperience }) => {
</div>
</div>

<div className="add-ad-modal-stage-sub-card-checkboxes-group">
<div className="add-job-modal-stage-sub-card-checkboxes-group">
<label>{t("ads.others")}</label>
<div className="add-ad-modal-stage-sub-card-checkboxes">
<div className="add-job-modal-stage-sub-card-checkboxes">
{technologies
.filter((x) => x.technologyType === "Other")
.map((x) => (
@@ -76,7 +76,7 @@ const CreateAdSecondStep = ({ technologies, experience, setExperience }) => {
value={x.name}
checked={x.isChecked}
onChange={handleCheckboxes.bind(this, x.technologyId)}
className="create-ad-second-step-checkbox"
className="create-job-second-step-checkbox"
/>
}
label={x.name}
@@ -85,7 +85,7 @@ const CreateAdSecondStep = ({ technologies, experience, setExperience }) => {
</div>
</div>
</div>
<div className="create-ad-form-control">
<div className="create-job-form-control">
<label>{t("filters.experience")}</label>
<input
type="number"

+ 4
- 4
src/pages/AdsPage/CreateAdThirdStep.js Целия файл

@@ -24,8 +24,8 @@ const CreateAdThirdStep = ({ childRef }) => {
}

return (
<div data-testid="create-ad-third-step-form">
<div className="create-ad-form-control">
<div data-testid="create-job-third-step-form">
<div className="create-job-form-control">
<label>{t("ads.duties")}</label>
<Editor
onInit={(evt, editor) =>
@@ -34,14 +34,14 @@ const CreateAdThirdStep = ({ childRef }) => {
style={{ height: "1rem !important" }}
/>
</div>
<div className="create-ad-form-control">
<div className="create-job-form-control">
<label>{t("ads.conditions")}</label>
<Editor
onInit={(evt, editor) => (editorRequirementsRef.current = editor)}
style={{ height: "1rem !important" }}
/>
</div>
<div className="create-ad-form-control">
<div className="create-job-form-control">
<label>{t("ads.offer")}</label>
<Editor
onInit={(evt, editor) => (editorOfferRef.current = editor)}

+ 8
- 8
src/pages/CandidatesPage/AdsCandidatesPage.js Целия файл

@@ -103,20 +103,20 @@ const AdsCandidatesPage = ({ history, search }) => {
};

return (
<div className="ads-candidates-container top-cnd">
<div className="jobs-candidates-container top-cnd">
{adsCandidates.map((adCandidates, index) => (
<div className="ads-candidates" key={index}>
<div className="ads-candidates-top-container">
<img src={adImage} className="ads-candidates-image" />
<p className="ads-candidates-title">{adCandidates.title}</p>
<p className="ads-candidates-numberOfApplicants">
<div className="jobs-candidates" key={index}>
<div className="jobs-candidates-top-container">
<img src={adImage} className="jobs-candidates-image" />
<p className="jobs-candidates-title">{adCandidates.title}</p>
<p className="jobs-candidates-numberOfApplicants">
| {adCandidates.nubmerOfApplicants} {t("ads.registered")}
</p>
</div>
<div className="ads-candidates-slider">
<div className="jobs-candidates-slider">
{filterByName(adCandidates).length > 4 && (
<div
className="active-ads-ads-arrows"
className="active-jobs-jobs-arrows"
style={matches ? { marginLeft: 36 } : { marginLeft: 0 }}
>
<button onClick={() => activeAdsArrowLeftHandler(index)}>

+ 5
- 5
src/pages/CandidatesPage/CandidateDetailsPage.js Целия файл

@@ -444,11 +444,11 @@ const CandidateDetailsPage = ({ history }) => {
</div>
</div>
</div>
<div className="applicant-ads-container">
<div className="applicant-jobs-container">
<p style={{ marginLeft: matches ? 36 : 144 }}>
{t("candidates.allApplications")}
</p>
<div className="applicant-ads-container-2">
<div className="applicant-jobs-container-2">
<div
style={{
marginLeft: matches ? 36 : candidate.ads.length < 5 ? 108 : 72,
@@ -458,7 +458,7 @@ const CandidateDetailsPage = ({ history }) => {
? candidate.ads.length > 1
: candidate.ads.length > 5) && (
<div
className="active-ads-ads-arrows"
className="active-jobs-jobs-arrows"
data-testid="candidate-ad-responsive-arrows"
>
<button onClick={activeAdsArrowLeftHandler}>
@@ -482,10 +482,10 @@ const CandidateDetailsPage = ({ history }) => {
</Slider>
</div>
</div>
<div className="applicant-ads-buttons-container">
<div className="applicant-jobs-buttons-container">
<p
to="/candidates"
className="applicant-ads-back-button"
className="applicant-jobs-back-button"
onClick={goToPageWithAllCandidates}
>
{t("candidates.backToCandidates")}

+ 3
- 3
src/pages/PatternsPage/PatternDetailsPage.js Целия файл

@@ -177,15 +177,15 @@ const PatternDetailsPage = () => {

<div className="pattern-details-card-buttons">
<button
className="ad-details-buttons-link"
data-testid="ad-details-buttons-link"
className="job-details-buttons-link"
data-testid="job-details-buttons-link"
onClick={() => history.push(PATTERNS_PAGE)}
>
{t("ads.backToAds")}
</button>
<IconButton
disabled={emails && emails.length === 0}
className="c-btn c-btn--primary add-ad-btn"
className="c-btn c-btn--primary add-job-btn"
data-testid="pattern-details-send-email"
onClick={scheduleAppointmentHandler}
>

+ 1
- 1
src/pages/PatternsPage/PatternsPage.js Целия файл

@@ -330,7 +330,7 @@ const PatternsPage = ({ history }) => {
</div>
<div className="patterns-button">
<IconButton
className="c-btn c-btn--primary add-ad-btn add-pattern-btn"
className="c-btn c-btn--primary add-job-btn add-pattern-btn"
onClick={() => setOpenAddPatternModal(true)}
>
{t("patterns.addPattern")}

+ 9
- 9
src/pages/SelectionProcessPage/SelectionProcessOfApplicantPage.js Целия файл

@@ -105,10 +105,10 @@ const SelectionProcessOfApplicantPage = () => {
<div className="l-t-rectangle"></div>
<div className="r-b-rectangle"></div>
{/* <AdFilters /> */}
<div data-testid="appl-sel" className="ads">
<div data-testid="appl-sel" className="jobs">
{processes && processes.length > 0 && (
<div className="active-ads">
<div className="active-ads-header">
<div className="active-jobs">
<div className="active-jobs-header">
<h1>
{t("selection.title")}
<span className="level-header-spliter">|</span>
@@ -118,10 +118,10 @@ const SelectionProcessOfApplicantPage = () => {
</h1>
</div>

<div className="active-ads-ads">
<div className="active-ads-ads-a">
<div className="active-jobs-jobs">
<div className="active-jobs-jobs-a">
{!matches && (
<div className="active-ads-ads-arrows">
<div className="active-jobs-jobs-arrows">
<button onClick={activeAdsArrowLeftHandler}>
<img src={arrow_left} alt="arrow-left" />
</button>
@@ -131,7 +131,7 @@ const SelectionProcessOfApplicantPage = () => {
</div>
)}
</div>
<div className="active-ads-ads-ad">
<div className="active-jobs-jobs-job">
<Slider
{...settings}
slidesToShow={4}
@@ -167,7 +167,7 @@ const SelectionProcessOfApplicantPage = () => {
</div>
)}
{matches && (
<div className="active-ads-ads-arrows">
<div className="active-jobs-jobs-arrows">
<button onClick={activeAdsArrowLeftHandler}>
<img src={arrow_left} alt="arrow-left" />
</button>
@@ -199,7 +199,7 @@ const SelectionProcessOfApplicantPage = () => {
</p>
</div>
</div>
<div className="add-ad">
<div className="add-job">
<Link className="ad-details-buttons-link" to="/selectionFlow">
{t("candidates.backToCandidates")}
</Link>

+ 10
- 10
src/pages/StatsPage/StatsPage.js Целия файл

@@ -5,7 +5,7 @@ import { useRef } from "react";
import arrow_left from "../../assets/images/arrow_left.png";
import arrow_right from "../../assets/images/arrow_right.png";
import Slider from "react-slick";
import { AD_DETAILS_PAGE } from "../../constants/pages";
import { JOB_DETAILS_PAGE } from "../../constants/pages";
import StatsAd from "../../components/Ads/StatsAd";
import { useDispatch } from "react-redux";
import { useSelector } from "react-redux";
@@ -154,16 +154,16 @@ const StatsPage = ({ history }) => {
<div className="stats-section">
<h2 className="section-header">{t("stats.registered")}</h2>
</div>
<div className="ads stat-ads">
<div className="jobs stat-jobs">
{stats.ads && stats.ads.length > 0 && (
<div className="archived-ads">
{/* <div className="archived-ads-header">
<div className="archived-jobs">
{/* <div className="archived-jobs-header">
<h2>{t("ads.archiveAds")}</h2>
</div> */}
<div className="archived-ads-ads">
<div className="archived-jobs-jobs">
{!matches && (
<div className="archived-ads-ads-a">
<div className="archived-ads-ads-arrows">
<div className="archived-jobs-jobs-a">
<div className="archived-jobs-jobs-arrows">
<button onClick={arrowLeftHandler} data-testid="left-arrow">
<img src={arrow_left} alt="arrow-left" />
</button>
@@ -178,7 +178,7 @@ const StatsPage = ({ history }) => {
</div>
</div>
)}
<div className="archived-ads-ads-ad">
<div className="archived-jobs-jobs-job">
<Slider
ref={sliderRef}
{...settings}
@@ -195,7 +195,7 @@ const StatsPage = ({ history }) => {
createdAt={ad.createdAt}
expiredAt={ad.expiredAt}
onShowAdDetails={() =>
history.push(AD_DETAILS_PAGE.replace(":id", ad.id))
history.push(JOB_DETAILS_PAGE.replace(":id", ad.id))
}
/>
))}
@@ -205,7 +205,7 @@ const StatsPage = ({ history }) => {
</div>
</div>
{matches && (
<div className="active-ads-ads-arrows">
<div className="active-jobs-jobs-arrows">
<button onClick={arrowLeftHandler} data-testid="left-arrow">
<img src={arrow_left} alt="arrow-left" />
</button>

+ 1
- 1
src/pages/UsersPage/UsersPage.js Целия файл

@@ -147,7 +147,7 @@ const UsersPage = (props) => {
<Fade
in={isSearchFieldVisible}
timeout={500}
className="ads-page-search-by-title"
className="jobs-page-search-by-title"
>
{inputNormal}
</Fade>

+ 6
- 6
src/request/apiEndpoints.js Целия файл

@@ -23,12 +23,12 @@ export default {
initProcess: base + "/applicants/selection-init",
},
ads: {
allAds: base + "/ads",
createAd: base + "/ads",
allFilteredAds: base + "/ads/filtered",
allArchiveAds: base + "/ads/archive",
adDetails: base + "/ads/details",
archiveActiveAd: base + "/ads/archive-active-ad/:id",
allAds: base + "/jobs",
createAd: base + "/jobs",
allFilteredAds: base + "/jobs/filtered",
allArchiveAds: base + "/jobs/archive",
adDetails: base + "/jobs/details",
archiveActiveAd: base + "/jobs/archive-active-job/:id",
},
technologies: {
allTechnologies: base + "/technologies",

Loading…
Отказ
Запис