From 53a4912f8d652a850f3141b3cb0b003f1f9afab4 Mon Sep 17 00:00:00 2001 From: Justin Gasper Date: Thu, 12 Feb 2026 07:27:13 +1100 Subject: [PATCH 01/70] Initial work-manager port work --- .env.development | 5 + .env.production | 5 + package.json | 1 + src/apps/platform/src/platform.routes.tsx | 2 + src/apps/work/README.md | 36 + src/apps/work/index.ts | 1 + src/apps/work/src/WorkApp.tsx | 33 + src/apps/work/src/config/index.config.ts | 70 + src/apps/work/src/config/routes.config.ts | 27 + src/apps/work/src/index.ts | 2 + src/apps/work/src/lib/assets/.gitkeep | 0 .../assets/icons/IconDownloadArtifacts.svg | 4 + .../lib/assets/icons/IconReviewRatingList.svg | 1 + .../lib/assets/icons/IconSquareDownload.svg | 3 + .../src/lib/assets/icons/chevron-down.svg | 3 + src/apps/work/src/lib/assets/icons/lock.svg | 9 + .../AcceptApplicationModal.module.scss | 46 + .../AcceptApplicationModal.tsx | 228 ++++ .../AcceptApplicationModal/index.ts | 2 + .../AddUserModal/AddUserModal.module.scss | 54 + .../components/AddUserModal/AddUserModal.tsx | 362 ++++++ .../src/lib/components/AddUserModal/index.ts | 1 + .../ApplicationDetailModal.module.scss | 53 + .../ApplicationDetailModal.tsx | 125 ++ .../ApplicationDetailModal/index.ts | 1 + .../ArtifactsModal/ArtifactsModal.module.scss | 98 ++ .../ArtifactsModal/ArtifactsModal.tsx | 124 ++ .../lib/components/ArtifactsModal/index.ts | 1 + .../ChallengeCard/ChallengeCard.module.scss | 58 + .../ChallengeCard/ChallengeCard.tsx | 136 ++ .../src/lib/components/ChallengeCard/index.ts | 1 + .../ChallengeStatus.module.scss | 38 + .../ChallengeStatus/ChallengeStatus.tsx | 40 + .../lib/components/ChallengeStatus/index.ts | 1 + .../ChallengeTag/ChallengeTag.module.scss | 63 + .../components/ChallengeTag/ChallengeTag.tsx | 92 ++ .../src/lib/components/ChallengeTag/index.ts | 1 + .../ChallengesFilter.module.scss | 67 + .../ChallengesFilter/ChallengesFilter.tsx | 364 ++++++ .../lib/components/ChallengesFilter/index.ts | 1 + .../ChallengesTable.module.scss | 56 + .../ChallengesTable/ChallengesTable.tsx | 181 +++ .../lib/components/ChallengesTable/index.ts | 1 + .../ConfirmationModal.module.scss | 52 + .../ConfirmationModal/ConfirmationModal.tsx | 69 + .../lib/components/ConfirmationModal/index.ts | 1 + .../EngagementCard/EngagementCard.module.scss | 64 + .../EngagementCard/EngagementCard.tsx | 87 ++ .../lib/components/EngagementCard/index.ts | 1 + .../EngagementsFilter.module.scss | 45 + .../EngagementsFilter/EngagementsFilter.tsx | 228 ++++ .../lib/components/EngagementsFilter/index.ts | 1 + .../ErrorMessage/ErrorMessage.module.scss | 19 + .../components/ErrorMessage/ErrorMessage.tsx | 28 + .../src/lib/components/ErrorMessage/index.ts | 1 + .../GroupSuccessModal.module.scss | 51 + .../GroupSuccessModal/GroupSuccessModal.tsx | 62 + .../lib/components/GroupSuccessModal/index.ts | 1 + .../InviteUserModal.module.scss | 54 + .../InviteUserModal/InviteUserModal.tsx | 193 +++ .../lib/components/InviteUserModal/index.ts | 1 + .../lib/components/Layout/Layout.module.scss | 29 + .../work/src/lib/components/Layout/Layout.tsx | 27 + .../work/src/lib/components/Layout/index.ts | 2 + .../LoadingSpinner/LoadingSpinner.module.scss | 18 + .../LoadingSpinner/LoadingSpinner.tsx | 23 + .../lib/components/LoadingSpinner/index.ts | 1 + .../components/NavTabs/NavTabs.module.scss | 138 ++ .../src/lib/components/NavTabs/NavTabs.tsx | 125 ++ .../lib/components/NavTabs/config/index.ts | 1 + .../components/NavTabs/config/tabs-config.ts | 77 ++ .../work/src/lib/components/NavTabs/index.ts | 1 + .../Pagination/Pagination.module.scss | 35 + .../lib/components/Pagination/Pagination.tsx | 76 ++ .../src/lib/components/Pagination/index.ts | 1 + .../PaymentFormModal.module.scss | 46 + .../PaymentFormModal/PaymentFormModal.tsx | 198 +++ .../lib/components/PaymentFormModal/index.ts | 2 + .../PaymentHistoryModal.module.scss | 67 + .../PaymentHistoryModal.tsx | 114 ++ .../components/PaymentHistoryModal/index.ts | 1 + .../ProjectCard/ProjectCard.module.scss | 74 ++ .../components/ProjectCard/ProjectCard.tsx | 59 + .../src/lib/components/ProjectCard/index.ts | 1 + .../ProjectStatus/ProjectStatus.module.scss | 44 + .../ProjectStatus/ProjectStatus.tsx | 35 + .../src/lib/components/ProjectStatus/index.ts | 1 + .../ProjectsFilter/ProjectsFilter.module.scss | 44 + .../ProjectsFilter/ProjectsFilter.tsx | 172 +++ .../lib/components/ProjectsFilter/index.ts | 1 + .../ProjectsListPage.module.scss | 36 + .../ProjectsTable/ProjectsTable.module.scss | 71 ++ .../ProjectsTable/ProjectsTable.tsx | 190 +++ .../src/lib/components/ProjectsTable/index.ts | 1 + .../ResourceAddModal.module.scss | 54 + .../ResourceAddModal/ResourceAddModal.tsx | 166 +++ .../lib/components/ResourceAddModal/index.ts | 1 + .../ResourcesTable/ResourcesTable.module.scss | 147 +++ .../ResourcesTable/ResourcesTable.tsx | 416 ++++++ .../lib/components/ResourcesTable/index.ts | 1 + .../SubmissionHistoryModal.module.scss | 85 ++ .../SubmissionHistoryModal.tsx | 155 +++ .../SubmissionHistoryModal/index.ts | 1 + .../SubmissionsTable.module.scss | 167 +++ .../SubmissionsTable/SubmissionsTable.tsx | 408 ++++++ .../lib/components/SubmissionsTable/index.ts | 1 + .../TaasProjectCard.module.scss | 40 + .../TaasProjectCard/TaasProjectCard.tsx | 51 + .../lib/components/TaasProjectCard/index.ts | 1 + .../TaasProjectsFilter.module.scss | 44 + .../TaasProjectsFilter/TaasProjectsFilter.tsx | 178 +++ .../components/TaasProjectsFilter/index.ts | 1 + .../TerminateAssignmentModal.module.scss | 32 + .../TerminateAssignmentModal.tsx | 101 ++ .../TerminateAssignmentModal/index.ts | 1 + .../components/UserCard/UserCard.module.scss | 93 ++ .../src/lib/components/UserCard/UserCard.tsx | 293 +++++ .../work/src/lib/components/UserCard/index.ts | 1 + .../ValidationResultsTable.module.scss | 75 ++ .../ValidationResultsTable.tsx | 148 +++ .../ValidationResultsTable/index.ts | 1 + .../FormCheckboxField.module.scss | 23 + .../FormCheckboxField/FormCheckboxField.tsx | 76 ++ .../form/FormCheckboxField/index.ts | 1 + .../FormFieldWrapper.module.scss | 30 + .../FormFieldWrapper/FormFieldWrapper.tsx | 60 + .../components/form/FormFieldWrapper/index.ts | 1 + .../FormGroupsSelect.module.scss | 24 + .../FormGroupsSelect/FormGroupsSelect.tsx | 265 ++++ .../components/form/FormGroupsSelect/index.ts | 1 + .../FormMarkdownEditor.module.scss | 7 + .../FormMarkdownEditor/FormMarkdownEditor.tsx | 104 ++ .../form/FormMarkdownEditor/index.ts | 1 + .../FormRadioGroup/FormRadioGroup.module.scss | 27 + .../form/FormRadioGroup/FormRadioGroup.tsx | 108 ++ .../components/form/FormRadioGroup/index.ts | 1 + .../FormSelectField.module.scss | 24 + .../form/FormSelectField/FormSelectField.tsx | 192 +++ .../components/form/FormSelectField/index.ts | 1 + .../FormTextAreaField.module.scss | 38 + .../FormTextAreaField/FormTextAreaField.tsx | 89 ++ .../form/FormTextAreaField/index.ts | 1 + .../FormTextField/FormTextField.module.scss | 37 + .../form/FormTextField/FormTextField.tsx | 108 ++ .../components/form/FormTextField/index.ts | 1 + .../FormTinyMceEditor.module.scss | 3 + .../FormTinyMceEditor/FormTinyMceEditor.tsx | 102 ++ .../form/FormTinyMceEditor/index.ts | 1 + .../FormUserAutocomplete.module.scss | 24 + .../FormUserAutocomplete.tsx | 186 +++ .../form/FormUserAutocomplete/index.ts | 1 + .../PhaseDurationInput.module.scss | 60 + .../PhaseDurationInput/PhaseDurationInput.tsx | 112 ++ .../form/PhaseDurationInput/index.ts | 1 + .../form/PrizeInput/PrizeInput.module.scss | 54 + .../components/form/PrizeInput/PrizeInput.tsx | 74 ++ .../lib/components/form/PrizeInput/index.ts | 1 + .../StartDateTimeInput.module.scss | 13 + .../StartDateTimeInput/StartDateTimeInput.tsx | 66 + .../form/StartDateTimeInput/index.ts | 1 + .../work/src/lib/components/form/index.ts | 13 + src/apps/work/src/lib/components/index.ts | 35 + src/apps/work/src/lib/constants.ts | 250 ++++ .../constants/challenge-editor.constants.ts | 74 ++ .../lib/constants/project-roles.constants.ts | 15 + .../work/src/lib/constants/roles.constants.ts | 60 + .../src/lib/contexts/SWRConfigProvider.tsx | 19 + .../work/src/lib/contexts/WorkAppContext.ts | 17 + .../lib/contexts/WorkAppContextProvider.tsx | 84 ++ src/apps/work/src/lib/contexts/index.ts | 3 + src/apps/work/src/lib/hooks/index.ts | 34 + src/apps/work/src/lib/hooks/useAutosave.ts | 73 ++ .../work/src/lib/hooks/useBulkCreateGroup.ts | 78 ++ .../src/lib/hooks/useBulkSearchMembers.ts | 116 ++ .../lib/hooks/useDownloadAllSubmissions.ts | 100 ++ .../work/src/lib/hooks/useDownloadArtifact.ts | 147 +++ .../src/lib/hooks/useDownloadSubmission.ts | 77 ++ .../src/lib/hooks/useFetchApplications.ts | 46 + .../lib/hooks/useFetchAssignmentPayments.ts | 47 + .../src/lib/hooks/useFetchBillingAccounts.ts | 35 + .../work/src/lib/hooks/useFetchChallenge.ts | 40 + .../src/lib/hooks/useFetchChallengePhases.ts | 36 + .../src/lib/hooks/useFetchChallengeTracks.ts | 31 + .../src/lib/hooks/useFetchChallengeTypes.ts | 34 + .../work/src/lib/hooks/useFetchChallenges.ts | 229 ++++ .../work/src/lib/hooks/useFetchEngagement.ts | 42 + .../work/src/lib/hooks/useFetchEngagements.ts | 73 ++ src/apps/work/src/lib/hooks/useFetchGroups.ts | 43 + .../work/src/lib/hooks/useFetchProject.ts | 38 + .../src/lib/hooks/useFetchProjectMembers.ts | 177 +++ .../src/lib/hooks/useFetchProjectTypes.ts | 31 + .../work/src/lib/hooks/useFetchProjects.ts | 43 + .../src/lib/hooks/useFetchProjectsList.ts | 203 +++ .../src/lib/hooks/useFetchResourceRoles.ts | 33 + .../work/src/lib/hooks/useFetchResources.ts | 43 + .../work/src/lib/hooks/useFetchReviews.ts | 43 + .../lib/hooks/useFetchSubmissionArtifacts.ts | 42 + .../lib/hooks/useFetchSubmissionVersions.ts | 67 + .../work/src/lib/hooks/useFetchSubmissions.ts | 88 ++ .../work/src/lib/hooks/useFetchTaasProject.ts | 42 + .../src/lib/hooks/useFetchTaasProjects.ts | 69 + src/apps/work/src/lib/hooks/useFetchTerms.ts | 33 + .../lib/hooks/useFetchTimelineTemplates.ts | 36 + .../src/lib/hooks/useFetchUserProjects.ts | 69 + .../work/src/lib/hooks/useSearchSkills.ts | 74 ++ src/apps/work/src/lib/index.ts | 7 + .../work/src/lib/models/Attachment.model.ts | 44 + .../work/src/lib/models/Challenge.model.ts | 111 ++ .../src/lib/models/ChallengeEditor.model.ts | 59 + .../src/lib/models/ChallengeFilters.model.ts | 12 + .../src/lib/models/ChallengeType.model.ts | 8 + .../work/src/lib/models/Engagement.model.ts | 97 ++ src/apps/work/src/lib/models/Group.model.ts | 77 ++ .../work/src/lib/models/Pagination.model.ts | 6 + src/apps/work/src/lib/models/Prize.model.ts | 16 + src/apps/work/src/lib/models/Project.model.ts | 81 ++ .../src/lib/models/ProjectMember.model.ts | 22 + .../work/src/lib/models/Resource.model.ts | 28 + src/apps/work/src/lib/models/Review.model.ts | 6 + .../work/src/lib/models/ReviewType.model.ts | 7 + .../work/src/lib/models/Reviewer.model.ts | 41 + src/apps/work/src/lib/models/Skill.model.ts | 11 + .../work/src/lib/models/Submission.model.ts | 44 + src/apps/work/src/lib/models/TaasJob.model.ts | 36 + src/apps/work/src/lib/models/Term.model.ts | 9 + .../work/src/lib/models/Timeline.model.ts | 23 + src/apps/work/src/lib/models/Track.model.ts | 7 + src/apps/work/src/lib/models/User.model.ts | 12 + .../lib/models/WorkAppContextModel.model.ts | 11 + src/apps/work/src/lib/models/index.ts | 35 + .../lib/schemas/challenge-editor.schema.ts | 325 +++++ .../lib/schemas/engagement-editor.schema.ts | 76 ++ .../work/src/lib/schemas/groups.schema.ts | 30 + .../src/lib/schemas/project-editor.schema.ts | 67 + .../src/lib/schemas/taas-project.schema.ts | 87 ++ .../src/lib/services/applications.service.ts | 192 +++ .../src/lib/services/attachments.service.ts | 95 ++ .../lib/services/billing-accounts.service.ts | 47 + .../src/lib/services/challenges.service.ts | 633 +++++++++ .../src/lib/services/engagements.service.ts | 551 ++++++++ .../work/src/lib/services/groups.service.ts | 370 ++++++ src/apps/work/src/lib/services/index.ts | 40 + .../work/src/lib/services/members.service.ts | 330 +++++ .../work/src/lib/services/payments.service.ts | 174 +++ .../project-member-invites.service.ts | 239 ++++ .../work/src/lib/services/projects.service.ts | 1131 +++++++++++++++++ .../src/lib/services/resources.service.ts | 245 ++++ .../src/lib/services/reviewers.service.ts | 196 +++ .../work/src/lib/services/reviews.service.ts | 99 ++ .../work/src/lib/services/skills.service.ts | 101 ++ .../src/lib/services/submissions.service.ts | 681 ++++++++++ .../src/lib/services/taas-projects.service.ts | 456 +++++++ .../work/src/lib/services/terms.service.ts | 73 ++ .../services/timeline-templates.service.ts | 105 ++ .../work/src/lib/services/tracks.service.ts | 49 + .../work/src/lib/services/users.service.ts | 161 +++ src/apps/work/src/lib/styles/index.scss | 16 + src/apps/work/src/lib/utils/async.utils.ts | 120 ++ src/apps/work/src/lib/utils/auth.utils.ts | 83 ++ .../src/lib/utils/challenge-editor.utils.ts | 695 ++++++++++ .../work/src/lib/utils/challenge.utils.ts | 213 ++++ src/apps/work/src/lib/utils/date.utils.ts | 136 ++ .../work/src/lib/utils/engagement.utils.ts | 430 +++++++ src/apps/work/src/lib/utils/error.utils.ts | 72 ++ src/apps/work/src/lib/utils/file.utils.ts | 273 ++++ src/apps/work/src/lib/utils/index.ts | 28 + src/apps/work/src/lib/utils/metadata.utils.ts | 78 ++ .../work/src/lib/utils/navigation.utils.ts | 84 ++ .../work/src/lib/utils/pagination.utils.ts | 81 ++ src/apps/work/src/lib/utils/payment.utils.ts | 79 ++ .../work/src/lib/utils/permissions.utils.ts | 299 +++++ src/apps/work/src/lib/utils/phase.utils.ts | 29 + src/apps/work/src/lib/utils/prize.utils.ts | 133 ++ src/apps/work/src/lib/utils/rating.utils.ts | 23 + .../src/lib/utils/resource-deletion.utils.ts | 189 +++ src/apps/work/src/lib/utils/sorting.utils.ts | 196 +++ src/apps/work/src/lib/utils/storage.utils.ts | 74 ++ .../work/src/lib/utils/timezone.utils.spec.ts | 26 + src/apps/work/src/lib/utils/timezone.utils.ts | 207 +++ src/apps/work/src/lib/utils/toast.utils.ts | 18 + src/apps/work/src/lib/utils/user.utils.ts | 63 + .../src/lib/utils/validation.utils.spec.ts | 10 + .../work/src/lib/utils/validation.utils.ts | 89 ++ .../ChallengeEditorPage.module.scss | 31 + .../ChallengeEditorPage.tsx | 216 ++++ .../challenges/ChallengeEditorPage/README.md | 46 + .../AssignedMemberField.module.scss | 9 + .../AssignedMemberField.tsx | 58 + .../components/AssignedMemberField/index.ts | 1 + .../AttachmentsField.module.scss | 59 + .../AttachmentsField/AttachmentsField.tsx | 336 +++++ .../components/AttachmentsField/index.ts | 1 + .../BillingAccountField.tsx | 68 + .../components/BillingAccountField/index.ts | 1 + .../ChallengeDescriptionField.module.scss | 13 + .../components/ChallengeDescriptionField.tsx | 31 + .../ChallengeEditorForm.module.scss | 82 ++ .../components/ChallengeEditorForm.tsx | 413 ++++++ .../ChallengeFeeField.module.scss | 13 + .../ChallengeFeeField/ChallengeFeeField.tsx | 33 + .../components/ChallengeFeeField/index.ts | 1 + .../components/ChallengeNameField.tsx | 18 + ...allengePrivateDescriptionField.module.scss | 23 + .../ChallengePrivateDescriptionField.tsx | 68 + .../ChallengePrizesField.module.scss | 95 ++ .../ChallengePrizesField.tsx | 431 +++++++ .../components/ChallengePrizesField/index.ts | 1 + .../ChallengeScheduleSection.module.scss | 106 ++ .../ChallengeScheduleSection.tsx | 671 ++++++++++ .../ChallengeScheduleSection/index.ts | 1 + .../components/ChallengeSkillsField.tsx | 132 ++ .../components/ChallengeTagsField.tsx | 83 ++ .../ChallengeTotalField.module.scss | 13 + .../ChallengeTotalField.tsx | 59 + .../components/ChallengeTotalField/index.ts | 1 + .../components/ChallengeTrackField.tsx | 43 + .../components/ChallengeTypeField.tsx | 47 + .../CheckpointPrizesField.module.scss | 25 + .../CheckpointPrizesField.tsx | 236 ++++ .../components/CheckpointPrizesField/index.ts | 1 + .../CopilotFeeField/CopilotFeeField.tsx | 128 ++ .../components/CopilotFeeField/index.ts | 1 + .../CopilotField/CopilotField.module.scss | 16 + .../components/CopilotField/CopilotField.tsx | 113 ++ .../components/CopilotField/index.ts | 1 + .../DiscussionForumField.tsx | 27 + .../components/DiscussionForumField/index.ts | 1 + .../components/GroupsField/GroupsField.tsx | 12 + .../components/GroupsField/index.ts | 1 + .../MaximumSubmissionsField.module.scss | 9 + .../MaximumSubmissionsField.tsx | 260 ++++ .../MaximumSubmissionsField/index.ts | 1 + .../components/NDAField/NDAField.tsx | 92 ++ .../components/NDAField/index.ts | 1 + .../PhaseEditorRow/PhaseEditorRow.module.scss | 83 ++ .../PhaseEditorRow/PhaseEditorRow.tsx | 77 ++ .../components/PhaseEditorRow/index.ts | 1 + .../ResourcesSection.module.scss | 57 + .../ResourcesSection/ResourcesSection.tsx | 462 +++++++ .../components/ResourcesSection/index.ts | 1 + .../ReviewCostField/ReviewCostField.tsx | 128 ++ .../components/ReviewCostField/index.ts | 1 + .../ReviewTypeField/ReviewTypeField.tsx | 42 + .../components/ReviewTypeField/index.ts | 1 + .../ReviewersField/ReviewersField.module.scss | 50 + .../ReviewersField/ReviewersField.tsx | 465 +++++++ .../components/ReviewersField/index.ts | 1 + .../RoundTypeField/RoundTypeField.tsx | 29 + .../components/RoundTypeField/index.ts | 1 + .../StockArtsField/StockArtsField.tsx | 86 ++ .../components/StockArtsField/index.ts | 1 + .../SubmissionVisibilityField.tsx | 86 ++ .../SubmissionVisibilityField/index.ts | 1 + .../SubmissionsSection.module.scss | 97 ++ .../SubmissionsSection/SubmissionsSection.tsx | 761 +++++++++++ .../components/SubmissionsSection/index.ts | 1 + .../components/TermsField/TermsField.tsx | 42 + .../components/TermsField/index.ts | 1 + .../TimelineTemplateField.tsx | 73 ++ .../components/TimelineTemplateField/index.ts | 1 + .../TimelineVisualization.module.scss | 99 ++ .../TimelineVisualization.tsx | 234 ++++ .../components/TimelineVisualization/index.ts | 1 + .../ChallengeEditorPage/components/index.ts | 34 + .../challenges/ChallengeEditorPage/index.ts | 3 + .../ChallengesListPage.module.scss | 35 + .../ChallengesListPage/ChallengesListPage.tsx | 361 ++++++ .../challenges/ChallengesListPage/index.ts | 3 + src/apps/work/src/pages/challenges/index.ts | 2 + .../ApplicationsListPage.module.scss | 78 ++ .../ApplicationsListPage.tsx | 430 +++++++ .../engagements/ApplicationsListPage/index.ts | 3 + .../EngagementEditorPage.module.scss | 3 + .../EngagementEditorPage.tsx | 112 ++ .../AssignmentDetailsModal.module.scss | 46 + .../components/AssignmentDetailsModal.tsx | 209 +++ .../EngagementEditorForm.module.scss | 70 + .../components/EngagementEditorForm.tsx | 536 ++++++++ .../components/EngagementLocationFields.tsx | 114 ++ .../EngagementPrivateSection.module.scss | 59 + .../components/EngagementPrivateSection.tsx | 191 +++ .../EngagementSkillsField.module.scss | 3 + .../components/EngagementSkillsField.tsx | 157 +++ .../components/EngagementStartDateField.tsx | 31 + .../components/EngagementStatusField.tsx | 28 + .../EngagementEditorPage/components/index.ts | 7 + .../engagements/EngagementEditorPage/index.ts | 3 + .../EngagementExperiencePage.module.scss | 22 + .../EngagementExperiencePage.tsx | 184 +++ .../EngagementExperiencePage/index.ts | 3 + .../EngagementFeedbackPage.module.scss | 22 + .../EngagementFeedbackPage.tsx | 226 ++++ .../EngagementFeedbackPage/index.ts | 3 + .../EngagementPaymentPage.module.scss | 79 ++ .../EngagementPaymentPage.tsx | 347 +++++ .../EngagementPaymentPage/index.ts | 3 + .../EngagementsListPage.module.scss | 62 + .../EngagementsListPage.tsx | 310 +++++ .../engagements/EngagementsListPage/index.ts | 3 + src/apps/work/src/pages/engagements/index.ts | 6 + .../GroupEditPage/GroupEditPage.module.scss | 204 +++ .../groups/GroupEditPage/GroupEditPage.tsx | 581 +++++++++ .../src/pages/groups/GroupEditPage/index.ts | 3 + .../groups/GroupsPage/GroupsPage.module.scss | 215 ++++ .../pages/groups/GroupsPage/GroupsPage.tsx | 707 +++++++++++ .../work/src/pages/groups/GroupsPage/index.ts | 3 + src/apps/work/src/pages/groups/index.ts | 2 + .../ProjectInvitationsPage.module.scss | 10 + .../ProjectInvitationsPage.tsx | 218 ++++ .../ProjectInvitationsPage/index.ts | 3 + src/apps/work/src/pages/invitations/index.ts | 1 + .../ProjectEditorPage.module.scss | 6 + .../ProjectEditorPage/ProjectEditorPage.tsx | 238 ++++ .../ProjectEditorForm.module.scss | 57 + .../ProjectEditorForm/ProjectEditorForm.tsx | 385 ++++++ .../components/ProjectEditorForm/index.ts | 3 + .../ProjectEditorPage/components/index.ts | 1 + .../pages/projects/ProjectEditorPage/index.ts | 3 + .../ProjectsListPage/ProjectsListPage.tsx | 335 +++++ .../pages/projects/ProjectsListPage/index.ts | 3 + src/apps/work/src/pages/projects/index.ts | 2 + .../TaasListPage/TaasListPage.module.scss | 41 + .../pages/taas/TaasListPage/TaasListPage.tsx | 185 +++ .../work/src/pages/taas/TaasListPage/index.ts | 4 + .../TaasProjectFormPage.module.scss | 77 ++ .../TaasProjectFormPage.tsx | 415 ++++++ .../components/TaasJobFields.module.scss | 57 + .../components/TaasJobFields.tsx | 203 +++ .../components/TaasSkillsField.module.scss | 24 + .../components/TaasSkillsField.tsx | 188 +++ .../TaasProjectFormPage/components/index.ts | 2 + .../pages/taas/TaasProjectFormPage/index.ts | 4 + src/apps/work/src/pages/taas/index.ts | 2 + .../UsersManagementPage.module.scss | 122 ++ .../UsersManagementPage.tsx | 448 +++++++ .../pages/users/UsersManagementPage/index.ts | 3 + src/apps/work/src/pages/users/index.ts | 1 + src/apps/work/src/work-app.routes.tsx | 303 +++++ src/config/constants.ts | 1 + src/config/environments/default.env.ts | 20 + .../environments/global-config.model.ts | 5 + src/declarations.d.ts | 1 + tsconfig.paths.json | 3 + yarn.lock | 5 + 444 files changed, 39630 insertions(+) create mode 100644 .env.development create mode 100644 .env.production create mode 100644 src/apps/work/README.md create mode 100644 src/apps/work/index.ts create mode 100644 src/apps/work/src/WorkApp.tsx create mode 100644 src/apps/work/src/config/index.config.ts create mode 100644 src/apps/work/src/config/routes.config.ts create mode 100644 src/apps/work/src/index.ts create mode 100644 src/apps/work/src/lib/assets/.gitkeep create mode 100644 src/apps/work/src/lib/assets/icons/IconDownloadArtifacts.svg create mode 100644 src/apps/work/src/lib/assets/icons/IconReviewRatingList.svg create mode 100644 src/apps/work/src/lib/assets/icons/IconSquareDownload.svg create mode 100644 src/apps/work/src/lib/assets/icons/chevron-down.svg create mode 100644 src/apps/work/src/lib/assets/icons/lock.svg create mode 100644 src/apps/work/src/lib/components/AcceptApplicationModal/AcceptApplicationModal.module.scss create mode 100644 src/apps/work/src/lib/components/AcceptApplicationModal/AcceptApplicationModal.tsx create mode 100644 src/apps/work/src/lib/components/AcceptApplicationModal/index.ts create mode 100644 src/apps/work/src/lib/components/AddUserModal/AddUserModal.module.scss create mode 100644 src/apps/work/src/lib/components/AddUserModal/AddUserModal.tsx create mode 100644 src/apps/work/src/lib/components/AddUserModal/index.ts create mode 100644 src/apps/work/src/lib/components/ApplicationDetailModal/ApplicationDetailModal.module.scss create mode 100644 src/apps/work/src/lib/components/ApplicationDetailModal/ApplicationDetailModal.tsx create mode 100644 src/apps/work/src/lib/components/ApplicationDetailModal/index.ts create mode 100644 src/apps/work/src/lib/components/ArtifactsModal/ArtifactsModal.module.scss create mode 100644 src/apps/work/src/lib/components/ArtifactsModal/ArtifactsModal.tsx create mode 100644 src/apps/work/src/lib/components/ArtifactsModal/index.ts create mode 100644 src/apps/work/src/lib/components/ChallengeCard/ChallengeCard.module.scss create mode 100644 src/apps/work/src/lib/components/ChallengeCard/ChallengeCard.tsx create mode 100644 src/apps/work/src/lib/components/ChallengeCard/index.ts create mode 100644 src/apps/work/src/lib/components/ChallengeStatus/ChallengeStatus.module.scss create mode 100644 src/apps/work/src/lib/components/ChallengeStatus/ChallengeStatus.tsx create mode 100644 src/apps/work/src/lib/components/ChallengeStatus/index.ts create mode 100644 src/apps/work/src/lib/components/ChallengeTag/ChallengeTag.module.scss create mode 100644 src/apps/work/src/lib/components/ChallengeTag/ChallengeTag.tsx create mode 100644 src/apps/work/src/lib/components/ChallengeTag/index.ts create mode 100644 src/apps/work/src/lib/components/ChallengesFilter/ChallengesFilter.module.scss create mode 100644 src/apps/work/src/lib/components/ChallengesFilter/ChallengesFilter.tsx create mode 100644 src/apps/work/src/lib/components/ChallengesFilter/index.ts create mode 100644 src/apps/work/src/lib/components/ChallengesTable/ChallengesTable.module.scss create mode 100644 src/apps/work/src/lib/components/ChallengesTable/ChallengesTable.tsx create mode 100644 src/apps/work/src/lib/components/ChallengesTable/index.ts create mode 100644 src/apps/work/src/lib/components/ConfirmationModal/ConfirmationModal.module.scss create mode 100644 src/apps/work/src/lib/components/ConfirmationModal/ConfirmationModal.tsx create mode 100644 src/apps/work/src/lib/components/ConfirmationModal/index.ts create mode 100644 src/apps/work/src/lib/components/EngagementCard/EngagementCard.module.scss create mode 100644 src/apps/work/src/lib/components/EngagementCard/EngagementCard.tsx create mode 100644 src/apps/work/src/lib/components/EngagementCard/index.ts create mode 100644 src/apps/work/src/lib/components/EngagementsFilter/EngagementsFilter.module.scss create mode 100644 src/apps/work/src/lib/components/EngagementsFilter/EngagementsFilter.tsx create mode 100644 src/apps/work/src/lib/components/EngagementsFilter/index.ts create mode 100644 src/apps/work/src/lib/components/ErrorMessage/ErrorMessage.module.scss create mode 100644 src/apps/work/src/lib/components/ErrorMessage/ErrorMessage.tsx create mode 100644 src/apps/work/src/lib/components/ErrorMessage/index.ts create mode 100644 src/apps/work/src/lib/components/GroupSuccessModal/GroupSuccessModal.module.scss create mode 100644 src/apps/work/src/lib/components/GroupSuccessModal/GroupSuccessModal.tsx create mode 100644 src/apps/work/src/lib/components/GroupSuccessModal/index.ts create mode 100644 src/apps/work/src/lib/components/InviteUserModal/InviteUserModal.module.scss create mode 100644 src/apps/work/src/lib/components/InviteUserModal/InviteUserModal.tsx create mode 100644 src/apps/work/src/lib/components/InviteUserModal/index.ts create mode 100644 src/apps/work/src/lib/components/Layout/Layout.module.scss create mode 100644 src/apps/work/src/lib/components/Layout/Layout.tsx create mode 100644 src/apps/work/src/lib/components/Layout/index.ts create mode 100644 src/apps/work/src/lib/components/LoadingSpinner/LoadingSpinner.module.scss create mode 100644 src/apps/work/src/lib/components/LoadingSpinner/LoadingSpinner.tsx create mode 100644 src/apps/work/src/lib/components/LoadingSpinner/index.ts create mode 100644 src/apps/work/src/lib/components/NavTabs/NavTabs.module.scss create mode 100644 src/apps/work/src/lib/components/NavTabs/NavTabs.tsx create mode 100644 src/apps/work/src/lib/components/NavTabs/config/index.ts create mode 100644 src/apps/work/src/lib/components/NavTabs/config/tabs-config.ts create mode 100644 src/apps/work/src/lib/components/NavTabs/index.ts create mode 100644 src/apps/work/src/lib/components/Pagination/Pagination.module.scss create mode 100644 src/apps/work/src/lib/components/Pagination/Pagination.tsx create mode 100644 src/apps/work/src/lib/components/Pagination/index.ts create mode 100644 src/apps/work/src/lib/components/PaymentFormModal/PaymentFormModal.module.scss create mode 100644 src/apps/work/src/lib/components/PaymentFormModal/PaymentFormModal.tsx create mode 100644 src/apps/work/src/lib/components/PaymentFormModal/index.ts create mode 100644 src/apps/work/src/lib/components/PaymentHistoryModal/PaymentHistoryModal.module.scss create mode 100644 src/apps/work/src/lib/components/PaymentHistoryModal/PaymentHistoryModal.tsx create mode 100644 src/apps/work/src/lib/components/PaymentHistoryModal/index.ts create mode 100644 src/apps/work/src/lib/components/ProjectCard/ProjectCard.module.scss create mode 100644 src/apps/work/src/lib/components/ProjectCard/ProjectCard.tsx create mode 100644 src/apps/work/src/lib/components/ProjectCard/index.ts create mode 100644 src/apps/work/src/lib/components/ProjectStatus/ProjectStatus.module.scss create mode 100644 src/apps/work/src/lib/components/ProjectStatus/ProjectStatus.tsx create mode 100644 src/apps/work/src/lib/components/ProjectStatus/index.ts create mode 100644 src/apps/work/src/lib/components/ProjectsFilter/ProjectsFilter.module.scss create mode 100644 src/apps/work/src/lib/components/ProjectsFilter/ProjectsFilter.tsx create mode 100644 src/apps/work/src/lib/components/ProjectsFilter/index.ts create mode 100644 src/apps/work/src/lib/components/ProjectsListPage/ProjectsListPage.module.scss create mode 100644 src/apps/work/src/lib/components/ProjectsTable/ProjectsTable.module.scss create mode 100644 src/apps/work/src/lib/components/ProjectsTable/ProjectsTable.tsx create mode 100644 src/apps/work/src/lib/components/ProjectsTable/index.ts create mode 100644 src/apps/work/src/lib/components/ResourceAddModal/ResourceAddModal.module.scss create mode 100644 src/apps/work/src/lib/components/ResourceAddModal/ResourceAddModal.tsx create mode 100644 src/apps/work/src/lib/components/ResourceAddModal/index.ts create mode 100644 src/apps/work/src/lib/components/ResourcesTable/ResourcesTable.module.scss create mode 100644 src/apps/work/src/lib/components/ResourcesTable/ResourcesTable.tsx create mode 100644 src/apps/work/src/lib/components/ResourcesTable/index.ts create mode 100644 src/apps/work/src/lib/components/SubmissionHistoryModal/SubmissionHistoryModal.module.scss create mode 100644 src/apps/work/src/lib/components/SubmissionHistoryModal/SubmissionHistoryModal.tsx create mode 100644 src/apps/work/src/lib/components/SubmissionHistoryModal/index.ts create mode 100644 src/apps/work/src/lib/components/SubmissionsTable/SubmissionsTable.module.scss create mode 100644 src/apps/work/src/lib/components/SubmissionsTable/SubmissionsTable.tsx create mode 100644 src/apps/work/src/lib/components/SubmissionsTable/index.ts create mode 100644 src/apps/work/src/lib/components/TaasProjectCard/TaasProjectCard.module.scss create mode 100644 src/apps/work/src/lib/components/TaasProjectCard/TaasProjectCard.tsx create mode 100644 src/apps/work/src/lib/components/TaasProjectCard/index.ts create mode 100644 src/apps/work/src/lib/components/TaasProjectsFilter/TaasProjectsFilter.module.scss create mode 100644 src/apps/work/src/lib/components/TaasProjectsFilter/TaasProjectsFilter.tsx create mode 100644 src/apps/work/src/lib/components/TaasProjectsFilter/index.ts create mode 100644 src/apps/work/src/lib/components/TerminateAssignmentModal/TerminateAssignmentModal.module.scss create mode 100644 src/apps/work/src/lib/components/TerminateAssignmentModal/TerminateAssignmentModal.tsx create mode 100644 src/apps/work/src/lib/components/TerminateAssignmentModal/index.ts create mode 100644 src/apps/work/src/lib/components/UserCard/UserCard.module.scss create mode 100644 src/apps/work/src/lib/components/UserCard/UserCard.tsx create mode 100644 src/apps/work/src/lib/components/UserCard/index.ts create mode 100644 src/apps/work/src/lib/components/ValidationResultsTable/ValidationResultsTable.module.scss create mode 100644 src/apps/work/src/lib/components/ValidationResultsTable/ValidationResultsTable.tsx create mode 100644 src/apps/work/src/lib/components/ValidationResultsTable/index.ts create mode 100644 src/apps/work/src/lib/components/form/FormCheckboxField/FormCheckboxField.module.scss create mode 100644 src/apps/work/src/lib/components/form/FormCheckboxField/FormCheckboxField.tsx create mode 100644 src/apps/work/src/lib/components/form/FormCheckboxField/index.ts create mode 100644 src/apps/work/src/lib/components/form/FormFieldWrapper/FormFieldWrapper.module.scss create mode 100644 src/apps/work/src/lib/components/form/FormFieldWrapper/FormFieldWrapper.tsx create mode 100644 src/apps/work/src/lib/components/form/FormFieldWrapper/index.ts create mode 100644 src/apps/work/src/lib/components/form/FormGroupsSelect/FormGroupsSelect.module.scss create mode 100644 src/apps/work/src/lib/components/form/FormGroupsSelect/FormGroupsSelect.tsx create mode 100644 src/apps/work/src/lib/components/form/FormGroupsSelect/index.ts create mode 100644 src/apps/work/src/lib/components/form/FormMarkdownEditor/FormMarkdownEditor.module.scss create mode 100644 src/apps/work/src/lib/components/form/FormMarkdownEditor/FormMarkdownEditor.tsx create mode 100644 src/apps/work/src/lib/components/form/FormMarkdownEditor/index.ts create mode 100644 src/apps/work/src/lib/components/form/FormRadioGroup/FormRadioGroup.module.scss create mode 100644 src/apps/work/src/lib/components/form/FormRadioGroup/FormRadioGroup.tsx create mode 100644 src/apps/work/src/lib/components/form/FormRadioGroup/index.ts create mode 100644 src/apps/work/src/lib/components/form/FormSelectField/FormSelectField.module.scss create mode 100644 src/apps/work/src/lib/components/form/FormSelectField/FormSelectField.tsx create mode 100644 src/apps/work/src/lib/components/form/FormSelectField/index.ts create mode 100644 src/apps/work/src/lib/components/form/FormTextAreaField/FormTextAreaField.module.scss create mode 100644 src/apps/work/src/lib/components/form/FormTextAreaField/FormTextAreaField.tsx create mode 100644 src/apps/work/src/lib/components/form/FormTextAreaField/index.ts create mode 100644 src/apps/work/src/lib/components/form/FormTextField/FormTextField.module.scss create mode 100644 src/apps/work/src/lib/components/form/FormTextField/FormTextField.tsx create mode 100644 src/apps/work/src/lib/components/form/FormTextField/index.ts create mode 100644 src/apps/work/src/lib/components/form/FormTinyMceEditor/FormTinyMceEditor.module.scss create mode 100644 src/apps/work/src/lib/components/form/FormTinyMceEditor/FormTinyMceEditor.tsx create mode 100644 src/apps/work/src/lib/components/form/FormTinyMceEditor/index.ts create mode 100644 src/apps/work/src/lib/components/form/FormUserAutocomplete/FormUserAutocomplete.module.scss create mode 100644 src/apps/work/src/lib/components/form/FormUserAutocomplete/FormUserAutocomplete.tsx create mode 100644 src/apps/work/src/lib/components/form/FormUserAutocomplete/index.ts create mode 100644 src/apps/work/src/lib/components/form/PhaseDurationInput/PhaseDurationInput.module.scss create mode 100644 src/apps/work/src/lib/components/form/PhaseDurationInput/PhaseDurationInput.tsx create mode 100644 src/apps/work/src/lib/components/form/PhaseDurationInput/index.ts create mode 100644 src/apps/work/src/lib/components/form/PrizeInput/PrizeInput.module.scss create mode 100644 src/apps/work/src/lib/components/form/PrizeInput/PrizeInput.tsx create mode 100644 src/apps/work/src/lib/components/form/PrizeInput/index.ts create mode 100644 src/apps/work/src/lib/components/form/StartDateTimeInput/StartDateTimeInput.module.scss create mode 100644 src/apps/work/src/lib/components/form/StartDateTimeInput/StartDateTimeInput.tsx create mode 100644 src/apps/work/src/lib/components/form/StartDateTimeInput/index.ts create mode 100644 src/apps/work/src/lib/components/form/index.ts create mode 100644 src/apps/work/src/lib/components/index.ts create mode 100644 src/apps/work/src/lib/constants.ts create mode 100644 src/apps/work/src/lib/constants/challenge-editor.constants.ts create mode 100644 src/apps/work/src/lib/constants/project-roles.constants.ts create mode 100644 src/apps/work/src/lib/constants/roles.constants.ts create mode 100644 src/apps/work/src/lib/contexts/SWRConfigProvider.tsx create mode 100644 src/apps/work/src/lib/contexts/WorkAppContext.ts create mode 100644 src/apps/work/src/lib/contexts/WorkAppContextProvider.tsx create mode 100644 src/apps/work/src/lib/contexts/index.ts create mode 100644 src/apps/work/src/lib/hooks/index.ts create mode 100644 src/apps/work/src/lib/hooks/useAutosave.ts create mode 100644 src/apps/work/src/lib/hooks/useBulkCreateGroup.ts create mode 100644 src/apps/work/src/lib/hooks/useBulkSearchMembers.ts create mode 100644 src/apps/work/src/lib/hooks/useDownloadAllSubmissions.ts create mode 100644 src/apps/work/src/lib/hooks/useDownloadArtifact.ts create mode 100644 src/apps/work/src/lib/hooks/useDownloadSubmission.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchApplications.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchAssignmentPayments.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchBillingAccounts.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchChallenge.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchChallengePhases.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchChallengeTracks.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchChallengeTypes.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchChallenges.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchEngagement.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchEngagements.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchGroups.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchProject.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchProjectMembers.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchProjectTypes.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchProjects.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchProjectsList.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchResourceRoles.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchResources.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchReviews.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchSubmissionArtifacts.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchSubmissionVersions.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchSubmissions.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchTaasProject.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchTaasProjects.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchTerms.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchTimelineTemplates.ts create mode 100644 src/apps/work/src/lib/hooks/useFetchUserProjects.ts create mode 100644 src/apps/work/src/lib/hooks/useSearchSkills.ts create mode 100644 src/apps/work/src/lib/index.ts create mode 100644 src/apps/work/src/lib/models/Attachment.model.ts create mode 100644 src/apps/work/src/lib/models/Challenge.model.ts create mode 100644 src/apps/work/src/lib/models/ChallengeEditor.model.ts create mode 100644 src/apps/work/src/lib/models/ChallengeFilters.model.ts create mode 100644 src/apps/work/src/lib/models/ChallengeType.model.ts create mode 100644 src/apps/work/src/lib/models/Engagement.model.ts create mode 100644 src/apps/work/src/lib/models/Group.model.ts create mode 100644 src/apps/work/src/lib/models/Pagination.model.ts create mode 100644 src/apps/work/src/lib/models/Prize.model.ts create mode 100644 src/apps/work/src/lib/models/Project.model.ts create mode 100644 src/apps/work/src/lib/models/ProjectMember.model.ts create mode 100644 src/apps/work/src/lib/models/Resource.model.ts create mode 100644 src/apps/work/src/lib/models/Review.model.ts create mode 100644 src/apps/work/src/lib/models/ReviewType.model.ts create mode 100644 src/apps/work/src/lib/models/Reviewer.model.ts create mode 100644 src/apps/work/src/lib/models/Skill.model.ts create mode 100644 src/apps/work/src/lib/models/Submission.model.ts create mode 100644 src/apps/work/src/lib/models/TaasJob.model.ts create mode 100644 src/apps/work/src/lib/models/Term.model.ts create mode 100644 src/apps/work/src/lib/models/Timeline.model.ts create mode 100644 src/apps/work/src/lib/models/Track.model.ts create mode 100644 src/apps/work/src/lib/models/User.model.ts create mode 100644 src/apps/work/src/lib/models/WorkAppContextModel.model.ts create mode 100644 src/apps/work/src/lib/models/index.ts create mode 100644 src/apps/work/src/lib/schemas/challenge-editor.schema.ts create mode 100644 src/apps/work/src/lib/schemas/engagement-editor.schema.ts create mode 100644 src/apps/work/src/lib/schemas/groups.schema.ts create mode 100644 src/apps/work/src/lib/schemas/project-editor.schema.ts create mode 100644 src/apps/work/src/lib/schemas/taas-project.schema.ts create mode 100644 src/apps/work/src/lib/services/applications.service.ts create mode 100644 src/apps/work/src/lib/services/attachments.service.ts create mode 100644 src/apps/work/src/lib/services/billing-accounts.service.ts create mode 100644 src/apps/work/src/lib/services/challenges.service.ts create mode 100644 src/apps/work/src/lib/services/engagements.service.ts create mode 100644 src/apps/work/src/lib/services/groups.service.ts create mode 100644 src/apps/work/src/lib/services/index.ts create mode 100644 src/apps/work/src/lib/services/members.service.ts create mode 100644 src/apps/work/src/lib/services/payments.service.ts create mode 100644 src/apps/work/src/lib/services/project-member-invites.service.ts create mode 100644 src/apps/work/src/lib/services/projects.service.ts create mode 100644 src/apps/work/src/lib/services/resources.service.ts create mode 100644 src/apps/work/src/lib/services/reviewers.service.ts create mode 100644 src/apps/work/src/lib/services/reviews.service.ts create mode 100644 src/apps/work/src/lib/services/skills.service.ts create mode 100644 src/apps/work/src/lib/services/submissions.service.ts create mode 100644 src/apps/work/src/lib/services/taas-projects.service.ts create mode 100644 src/apps/work/src/lib/services/terms.service.ts create mode 100644 src/apps/work/src/lib/services/timeline-templates.service.ts create mode 100644 src/apps/work/src/lib/services/tracks.service.ts create mode 100644 src/apps/work/src/lib/services/users.service.ts create mode 100644 src/apps/work/src/lib/styles/index.scss create mode 100644 src/apps/work/src/lib/utils/async.utils.ts create mode 100644 src/apps/work/src/lib/utils/auth.utils.ts create mode 100644 src/apps/work/src/lib/utils/challenge-editor.utils.ts create mode 100644 src/apps/work/src/lib/utils/challenge.utils.ts create mode 100644 src/apps/work/src/lib/utils/date.utils.ts create mode 100644 src/apps/work/src/lib/utils/engagement.utils.ts create mode 100644 src/apps/work/src/lib/utils/error.utils.ts create mode 100644 src/apps/work/src/lib/utils/file.utils.ts create mode 100644 src/apps/work/src/lib/utils/index.ts create mode 100644 src/apps/work/src/lib/utils/metadata.utils.ts create mode 100644 src/apps/work/src/lib/utils/navigation.utils.ts create mode 100644 src/apps/work/src/lib/utils/pagination.utils.ts create mode 100644 src/apps/work/src/lib/utils/payment.utils.ts create mode 100644 src/apps/work/src/lib/utils/permissions.utils.ts create mode 100644 src/apps/work/src/lib/utils/phase.utils.ts create mode 100644 src/apps/work/src/lib/utils/prize.utils.ts create mode 100644 src/apps/work/src/lib/utils/rating.utils.ts create mode 100644 src/apps/work/src/lib/utils/resource-deletion.utils.ts create mode 100644 src/apps/work/src/lib/utils/sorting.utils.ts create mode 100644 src/apps/work/src/lib/utils/storage.utils.ts create mode 100644 src/apps/work/src/lib/utils/timezone.utils.spec.ts create mode 100644 src/apps/work/src/lib/utils/timezone.utils.ts create mode 100644 src/apps/work/src/lib/utils/toast.utils.ts create mode 100644 src/apps/work/src/lib/utils/user.utils.ts create mode 100644 src/apps/work/src/lib/utils/validation.utils.spec.ts create mode 100644 src/apps/work/src/lib/utils/validation.utils.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/ChallengeEditorPage.module.scss create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/ChallengeEditorPage.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/README.md create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/AssignedMemberField/AssignedMemberField.module.scss create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/AssignedMemberField/AssignedMemberField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/AssignedMemberField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/AttachmentsField/AttachmentsField.module.scss create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/AttachmentsField/AttachmentsField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/AttachmentsField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/BillingAccountField/BillingAccountField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/BillingAccountField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeDescriptionField.module.scss create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeDescriptionField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeEditorForm.module.scss create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeEditorForm.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeFeeField/ChallengeFeeField.module.scss create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeFeeField/ChallengeFeeField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeFeeField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeNameField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengePrivateDescriptionField.module.scss create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengePrivateDescriptionField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengePrizesField/ChallengePrizesField.module.scss create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengePrizesField/ChallengePrizesField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengePrizesField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeScheduleSection/ChallengeScheduleSection.module.scss create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeScheduleSection/ChallengeScheduleSection.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeScheduleSection/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeSkillsField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeTagsField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeTotalField/ChallengeTotalField.module.scss create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeTotalField/ChallengeTotalField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeTotalField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeTrackField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeTypeField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/CheckpointPrizesField/CheckpointPrizesField.module.scss create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/CheckpointPrizesField/CheckpointPrizesField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/CheckpointPrizesField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/CopilotFeeField/CopilotFeeField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/CopilotFeeField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/CopilotField/CopilotField.module.scss create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/CopilotField/CopilotField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/CopilotField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/DiscussionForumField/DiscussionForumField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/DiscussionForumField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/GroupsField/GroupsField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/GroupsField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/MaximumSubmissionsField/MaximumSubmissionsField.module.scss create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/MaximumSubmissionsField/MaximumSubmissionsField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/MaximumSubmissionsField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/NDAField/NDAField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/NDAField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/PhaseEditorRow/PhaseEditorRow.module.scss create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/PhaseEditorRow/PhaseEditorRow.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/PhaseEditorRow/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ResourcesSection/ResourcesSection.module.scss create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ResourcesSection/ResourcesSection.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ResourcesSection/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ReviewCostField/ReviewCostField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ReviewCostField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ReviewTypeField/ReviewTypeField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ReviewTypeField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ReviewersField/ReviewersField.module.scss create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ReviewersField/ReviewersField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ReviewersField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/RoundTypeField/RoundTypeField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/RoundTypeField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/StockArtsField/StockArtsField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/StockArtsField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/SubmissionVisibilityField/SubmissionVisibilityField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/SubmissionVisibilityField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/SubmissionsSection/SubmissionsSection.module.scss create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/SubmissionsSection/SubmissionsSection.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/SubmissionsSection/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/TermsField/TermsField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/TermsField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/TimelineTemplateField/TimelineTemplateField.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/TimelineTemplateField/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/TimelineVisualization/TimelineVisualization.module.scss create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/TimelineVisualization/TimelineVisualization.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/TimelineVisualization/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/components/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengeEditorPage/index.ts create mode 100644 src/apps/work/src/pages/challenges/ChallengesListPage/ChallengesListPage.module.scss create mode 100644 src/apps/work/src/pages/challenges/ChallengesListPage/ChallengesListPage.tsx create mode 100644 src/apps/work/src/pages/challenges/ChallengesListPage/index.ts create mode 100644 src/apps/work/src/pages/challenges/index.ts create mode 100644 src/apps/work/src/pages/engagements/ApplicationsListPage/ApplicationsListPage.module.scss create mode 100644 src/apps/work/src/pages/engagements/ApplicationsListPage/ApplicationsListPage.tsx create mode 100644 src/apps/work/src/pages/engagements/ApplicationsListPage/index.ts create mode 100644 src/apps/work/src/pages/engagements/EngagementEditorPage/EngagementEditorPage.module.scss create mode 100644 src/apps/work/src/pages/engagements/EngagementEditorPage/EngagementEditorPage.tsx create mode 100644 src/apps/work/src/pages/engagements/EngagementEditorPage/components/AssignmentDetailsModal.module.scss create mode 100644 src/apps/work/src/pages/engagements/EngagementEditorPage/components/AssignmentDetailsModal.tsx create mode 100644 src/apps/work/src/pages/engagements/EngagementEditorPage/components/EngagementEditorForm.module.scss create mode 100644 src/apps/work/src/pages/engagements/EngagementEditorPage/components/EngagementEditorForm.tsx create mode 100644 src/apps/work/src/pages/engagements/EngagementEditorPage/components/EngagementLocationFields.tsx create mode 100644 src/apps/work/src/pages/engagements/EngagementEditorPage/components/EngagementPrivateSection.module.scss create mode 100644 src/apps/work/src/pages/engagements/EngagementEditorPage/components/EngagementPrivateSection.tsx create mode 100644 src/apps/work/src/pages/engagements/EngagementEditorPage/components/EngagementSkillsField.module.scss create mode 100644 src/apps/work/src/pages/engagements/EngagementEditorPage/components/EngagementSkillsField.tsx create mode 100644 src/apps/work/src/pages/engagements/EngagementEditorPage/components/EngagementStartDateField.tsx create mode 100644 src/apps/work/src/pages/engagements/EngagementEditorPage/components/EngagementStatusField.tsx create mode 100644 src/apps/work/src/pages/engagements/EngagementEditorPage/components/index.ts create mode 100644 src/apps/work/src/pages/engagements/EngagementEditorPage/index.ts create mode 100644 src/apps/work/src/pages/engagements/EngagementExperiencePage/EngagementExperiencePage.module.scss create mode 100644 src/apps/work/src/pages/engagements/EngagementExperiencePage/EngagementExperiencePage.tsx create mode 100644 src/apps/work/src/pages/engagements/EngagementExperiencePage/index.ts create mode 100644 src/apps/work/src/pages/engagements/EngagementFeedbackPage/EngagementFeedbackPage.module.scss create mode 100644 src/apps/work/src/pages/engagements/EngagementFeedbackPage/EngagementFeedbackPage.tsx create mode 100644 src/apps/work/src/pages/engagements/EngagementFeedbackPage/index.ts create mode 100644 src/apps/work/src/pages/engagements/EngagementPaymentPage/EngagementPaymentPage.module.scss create mode 100644 src/apps/work/src/pages/engagements/EngagementPaymentPage/EngagementPaymentPage.tsx create mode 100644 src/apps/work/src/pages/engagements/EngagementPaymentPage/index.ts create mode 100644 src/apps/work/src/pages/engagements/EngagementsListPage/EngagementsListPage.module.scss create mode 100644 src/apps/work/src/pages/engagements/EngagementsListPage/EngagementsListPage.tsx create mode 100644 src/apps/work/src/pages/engagements/EngagementsListPage/index.ts create mode 100644 src/apps/work/src/pages/engagements/index.ts create mode 100644 src/apps/work/src/pages/groups/GroupEditPage/GroupEditPage.module.scss create mode 100644 src/apps/work/src/pages/groups/GroupEditPage/GroupEditPage.tsx create mode 100644 src/apps/work/src/pages/groups/GroupEditPage/index.ts create mode 100644 src/apps/work/src/pages/groups/GroupsPage/GroupsPage.module.scss create mode 100644 src/apps/work/src/pages/groups/GroupsPage/GroupsPage.tsx create mode 100644 src/apps/work/src/pages/groups/GroupsPage/index.ts create mode 100644 src/apps/work/src/pages/groups/index.ts create mode 100644 src/apps/work/src/pages/invitations/ProjectInvitationsPage/ProjectInvitationsPage.module.scss create mode 100644 src/apps/work/src/pages/invitations/ProjectInvitationsPage/ProjectInvitationsPage.tsx create mode 100644 src/apps/work/src/pages/invitations/ProjectInvitationsPage/index.ts create mode 100644 src/apps/work/src/pages/invitations/index.ts create mode 100644 src/apps/work/src/pages/projects/ProjectEditorPage/ProjectEditorPage.module.scss create mode 100644 src/apps/work/src/pages/projects/ProjectEditorPage/ProjectEditorPage.tsx create mode 100644 src/apps/work/src/pages/projects/ProjectEditorPage/components/ProjectEditorForm/ProjectEditorForm.module.scss create mode 100644 src/apps/work/src/pages/projects/ProjectEditorPage/components/ProjectEditorForm/ProjectEditorForm.tsx create mode 100644 src/apps/work/src/pages/projects/ProjectEditorPage/components/ProjectEditorForm/index.ts create mode 100644 src/apps/work/src/pages/projects/ProjectEditorPage/components/index.ts create mode 100644 src/apps/work/src/pages/projects/ProjectEditorPage/index.ts create mode 100644 src/apps/work/src/pages/projects/ProjectsListPage/ProjectsListPage.tsx create mode 100644 src/apps/work/src/pages/projects/ProjectsListPage/index.ts create mode 100644 src/apps/work/src/pages/projects/index.ts create mode 100644 src/apps/work/src/pages/taas/TaasListPage/TaasListPage.module.scss create mode 100644 src/apps/work/src/pages/taas/TaasListPage/TaasListPage.tsx create mode 100644 src/apps/work/src/pages/taas/TaasListPage/index.ts create mode 100644 src/apps/work/src/pages/taas/TaasProjectFormPage/TaasProjectFormPage.module.scss create mode 100644 src/apps/work/src/pages/taas/TaasProjectFormPage/TaasProjectFormPage.tsx create mode 100644 src/apps/work/src/pages/taas/TaasProjectFormPage/components/TaasJobFields.module.scss create mode 100644 src/apps/work/src/pages/taas/TaasProjectFormPage/components/TaasJobFields.tsx create mode 100644 src/apps/work/src/pages/taas/TaasProjectFormPage/components/TaasSkillsField.module.scss create mode 100644 src/apps/work/src/pages/taas/TaasProjectFormPage/components/TaasSkillsField.tsx create mode 100644 src/apps/work/src/pages/taas/TaasProjectFormPage/components/index.ts create mode 100644 src/apps/work/src/pages/taas/TaasProjectFormPage/index.ts create mode 100644 src/apps/work/src/pages/taas/index.ts create mode 100644 src/apps/work/src/pages/users/UsersManagementPage/UsersManagementPage.module.scss create mode 100644 src/apps/work/src/pages/users/UsersManagementPage/UsersManagementPage.tsx create mode 100644 src/apps/work/src/pages/users/UsersManagementPage/index.ts create mode 100644 src/apps/work/src/pages/users/index.ts create mode 100644 src/apps/work/src/work-app.routes.tsx diff --git a/.env.development b/.env.development new file mode 100644 index 000000000..dca44557e --- /dev/null +++ b/.env.development @@ -0,0 +1,5 @@ +REACT_APP_GROUPS_API_URL=https://api.topcoder-dev.com/v5/groups +REACT_APP_TERMS_API_URL=https://api.topcoder-dev.com/v5/terms +REACT_APP_RESOURCES_API_URL=https://api.topcoder-dev.com/v6/resources +REACT_APP_MEMBER_API_URL=https://api.topcoder-dev.com/v5/members +REACT_APP_RESOURCE_ROLES_API_URL=https://api.topcoder-dev.com/v6/resource-roles diff --git a/.env.production b/.env.production new file mode 100644 index 000000000..ac33d2329 --- /dev/null +++ b/.env.production @@ -0,0 +1,5 @@ +REACT_APP_GROUPS_API_URL=https://api.topcoder.com/v5/groups +REACT_APP_TERMS_API_URL=https://api.topcoder.com/v5/terms +REACT_APP_RESOURCES_API_URL=https://api.topcoder.com/v6/resources +REACT_APP_MEMBER_API_URL=https://api.topcoder.com/v5/members +REACT_APP_RESOURCE_ROLES_API_URL=https://api.topcoder.com/v6/resource-roles diff --git a/package.json b/package.json index 9bc448381..123a8f9aa 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "express": "^4.22.1", "express-fileupload": "^1.5.2", "express-interceptor": "^1.2.0", + "fflate": "^0.8.2", "filestack-js": "^3.44.2", "highcharts": "^10.3.3", "highcharts-react-official": "^3.2.3", diff --git a/src/apps/platform/src/platform.routes.tsx b/src/apps/platform/src/platform.routes.tsx index 259e02e82..f176564f9 100644 --- a/src/apps/platform/src/platform.routes.tsx +++ b/src/apps/platform/src/platform.routes.tsx @@ -11,6 +11,7 @@ import { walletAdminRoutes } from '~/apps/wallet-admin' import { copilotsRoutes } from '~/apps/copilots' import { adminRoutes } from '~/apps/admin' import { reviewRoutes } from '~/apps/review' +import { workRoutes } from '~/apps/work' import { calendarRoutes } from '~/apps/calendar' import { engagementsRoutes } from '~/apps/engagements' import { customerPortalRoutes } from '~/apps/customer-portal' @@ -42,6 +43,7 @@ export const platformRoutes: Array = [ ...walletAdminRoutes, ...accountsRoutes, ...reviewRoutes, + ...workRoutes, ...calendarRoutes, ...engagementsRoutes, ...homeRoutes, diff --git a/src/apps/work/README.md b/src/apps/work/README.md new file mode 100644 index 000000000..45c92c791 --- /dev/null +++ b/src/apps/work/README.md @@ -0,0 +1,36 @@ +# Work App + +The Work app provides work management capabilities for: +- challenges +- projects +- TaaS engagements +- users +- groups + +## Routing + +`work-app.routes.tsx` defines the app root and child routes: +- `challenges` +- `projects` +- `taas` +- `users` +- `groups` + +`config/routes.config.ts` contains route ids and the `rootRoute` resolver based on the active subdomain. + +## Providers + +`WorkApp.tsx` composes these providers: +- `WorkAppContextProvider`: authentication token and derived role/access flags +- `SWRConfigProvider`: shared SWR fetch configuration for the app + +## Extending The App + +1. Add feature routes under `work-app.routes.tsx` children. +2. Implement pages/components inside `src/lib` or feature folders. +3. Reuse `WorkAppContext` and `SWRConfigProvider` for shared state/data access. + +## Legacy Reference + +Original implementation reference: +- `work-manager/` diff --git a/src/apps/work/index.ts b/src/apps/work/index.ts new file mode 100644 index 000000000..6f39cd49b --- /dev/null +++ b/src/apps/work/index.ts @@ -0,0 +1 @@ +export * from './src' diff --git a/src/apps/work/src/WorkApp.tsx b/src/apps/work/src/WorkApp.tsx new file mode 100644 index 000000000..b2b526a44 --- /dev/null +++ b/src/apps/work/src/WorkApp.tsx @@ -0,0 +1,33 @@ +import { FC, useContext, useEffect, useMemo } from 'react' +import { Outlet, Routes } from 'react-router-dom' + +import { routerContext, RouterContextData } from '~/libs/core' + +import { Layout, SWRConfigProvider, WorkAppContextProvider, WORK_APP_BODY_CLASS } from './lib' +import { toolTitle } from './work-app.routes' +import './lib/styles/index.scss' + +const WorkApp: FC = () => { + const { getChildRoutes }: RouterContextData = useContext(routerContext) + const childRoutes = useMemo(() => getChildRoutes(toolTitle), [getChildRoutes]) + + useEffect(() => { + document.body.classList.add(WORK_APP_BODY_CLASS) + return () => { + document.body.classList.remove(WORK_APP_BODY_CLASS) + } + }, []) + + return ( + + + + + {childRoutes} + + + + ) +} + +export default WorkApp diff --git a/src/apps/work/src/config/index.config.ts b/src/apps/work/src/config/index.config.ts new file mode 100644 index 000000000..cdb4b74a3 --- /dev/null +++ b/src/apps/work/src/config/index.config.ts @@ -0,0 +1,70 @@ +export const CHALLENGE_TRACKS = { + COMPETITIVE_PROGRAMMING: 'COMPETITIVE_PROGRAMMING', + DATA_SCIENCE: 'DATA_SCIENCE', + DESIGN: 'DESIGN', + DEVELOP: 'DEVELOP', + QA: 'QA', +} as const + +export const CHALLENGE_TYPES = { + CHALLENGE: 'Challenge', + FIRST_2_FINISH: 'First2Finish', + MARATHON_MATCH: 'Marathon Match', + TASK: 'Task', +} as const + +export const CHALLENGE_STATUS = { + ACTIVE: 'ACTIVE', + APPROVED: 'APPROVED', + CANCELLED: 'CANCELLED', + CANCELLED_CLIENT_REQUEST: 'CANCELLED_CLIENT_REQUEST', + CANCELLED_FAILED_REVIEW: 'CANCELLED_FAILED_REVIEW', + CANCELLED_FAILED_SCREENING: 'CANCELLED_FAILED_SCREENING', + CANCELLED_REQUIREMENTS_INFEASIBLE: 'CANCELLED_REQUIREMENTS_INFEASIBLE', + CANCELLED_WINNER_UNRESPONSIVE: 'CANCELLED_WINNER_UNRESPONSIVE', + CANCELLED_ZERO_REGISTRATIONS: 'CANCELLED_ZERO_REGISTRATIONS', + CANCELLED_ZERO_SUBMISSIONS: 'CANCELLED_ZERO_SUBMISSIONS', + COMPLETED: 'COMPLETED', + DRAFT: 'DRAFT', + NEW: 'NEW', +} as const + +export const READ_ONLY = 'topcoder user' +export const ADMIN = 'administrator' +export const CONNECT_ADMIN = 'connect admin' +export const COPILOT = 'copilot' +export const MANAGER = 'manager' +export const PROJECT_MANAGER = 'project manager' +export const TOPCODER_PROJECT_MANAGER = 'topcoder project manager' +export const TALENT_MANAGER = 'talent manager' +export const TOPCODER_TALENT_MANAGER = 'topcoder talent manager' +export const TASK_MANAGER = 'task manager' +export const TOPCODER_TASK_MANAGER = 'topcoder task manager' + +export const READ_ONLY_ROLES = [READ_ONLY] +export const ADMIN_ROLES = [ADMIN, CONNECT_ADMIN] +export const COPILOT_ROLES = [COPILOT] +export const MANAGER_ROLES = [ + PROJECT_MANAGER, + TOPCODER_PROJECT_MANAGER, + TALENT_MANAGER, + TOPCODER_TALENT_MANAGER, +] +export const TASK_MANAGER_ROLES = [ + TASK_MANAGER, + TOPCODER_TASK_MANAGER, + TALENT_MANAGER, + TOPCODER_TALENT_MANAGER, +] + +export const DEFAULT_PAGE_SIZE = 10 +export const PROJECTS_PAGE_SIZE = 20 +export const ENGAGEMENTS_PAGE_SIZE = 20 +export const TABLE_DATE_FORMAT = 'MMM DD YYYY, HH:mm A' + +export const PAGINATION_PER_PAGE_OPTIONS = [ + { label: '5', value: '5' }, + { label: '10', value: '10' }, + { label: '25', value: '25' }, + { label: '50', value: '50' }, +] diff --git a/src/apps/work/src/config/routes.config.ts b/src/apps/work/src/config/routes.config.ts new file mode 100644 index 000000000..b7e6c74ce --- /dev/null +++ b/src/apps/work/src/config/routes.config.ts @@ -0,0 +1,27 @@ +import { AppSubdomain, EnvironmentConfig } from '~/config' + +export const rootRoute: string + = EnvironmentConfig.SUBDOMAIN === AppSubdomain.work + ? '' + : `/${AppSubdomain.work}` + +export const challengesRouteId = 'challenges' +export const challengeCreateRouteId = 'challenge-create' +export const challengeEditRouteId = 'challenge-edit' +export const projectsRouteId = 'projects' +export const projectCreateRouteId = 'project-create' +export const projectEditRouteId = 'project-edit' +export const taasRouteId = 'taas' +export const taasCreateRouteId = 'taas-create' +export const taasEditRouteId = 'taas-edit' +export const engagementsRouteId = 'engagements' +export const engagementCreateRouteId = 'engagement-create' +export const engagementEditRouteId = 'engagement-edit' +export const engagementApplicationsRouteId = 'engagement-applications' +export const engagementAssignmentsRouteId = 'engagement-assignments' +export const engagementFeedbackRouteId = 'engagement-feedback' +export const engagementExperienceRouteId = 'engagement-experience' +export const usersRouteId = 'users' +export const projectInvitationsRouteId = 'project-invitations' +export const groupsRouteId = 'groups' +export const groupsEditRouteId = 'group-edit' diff --git a/src/apps/work/src/index.ts b/src/apps/work/src/index.ts new file mode 100644 index 000000000..5542c454c --- /dev/null +++ b/src/apps/work/src/index.ts @@ -0,0 +1,2 @@ +export { workRoutes } from './work-app.routes' +export { rootRoute as workRootRoute } from './config/routes.config' diff --git a/src/apps/work/src/lib/assets/.gitkeep b/src/apps/work/src/lib/assets/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/apps/work/src/lib/assets/icons/IconDownloadArtifacts.svg b/src/apps/work/src/lib/assets/icons/IconDownloadArtifacts.svg new file mode 100644 index 000000000..ca1c58fe0 --- /dev/null +++ b/src/apps/work/src/lib/assets/icons/IconDownloadArtifacts.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/apps/work/src/lib/assets/icons/IconReviewRatingList.svg b/src/apps/work/src/lib/assets/icons/IconReviewRatingList.svg new file mode 100644 index 000000000..588f49722 --- /dev/null +++ b/src/apps/work/src/lib/assets/icons/IconReviewRatingList.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/apps/work/src/lib/assets/icons/IconSquareDownload.svg b/src/apps/work/src/lib/assets/icons/IconSquareDownload.svg new file mode 100644 index 000000000..e56fda655 --- /dev/null +++ b/src/apps/work/src/lib/assets/icons/IconSquareDownload.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/apps/work/src/lib/assets/icons/chevron-down.svg b/src/apps/work/src/lib/assets/icons/chevron-down.svg new file mode 100644 index 000000000..d9294fd27 --- /dev/null +++ b/src/apps/work/src/lib/assets/icons/chevron-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/apps/work/src/lib/assets/icons/lock.svg b/src/apps/work/src/lib/assets/icons/lock.svg new file mode 100644 index 000000000..076bd432c --- /dev/null +++ b/src/apps/work/src/lib/assets/icons/lock.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/apps/work/src/lib/components/AcceptApplicationModal/AcceptApplicationModal.module.scss b/src/apps/work/src/lib/components/AcceptApplicationModal/AcceptApplicationModal.module.scss new file mode 100644 index 000000000..9890328a3 --- /dev/null +++ b/src/apps/work/src/lib/components/AcceptApplicationModal/AcceptApplicationModal.module.scss @@ -0,0 +1,46 @@ +.content { + display: flex; + flex-direction: column; + gap: 16px; +} + +.member { + display: flex; + flex-direction: column; + gap: 4px; +} + +.label { + color: #5b5b5b; + font-size: 12px; +} + +.value { + color: #2a2a2a; + font-size: 14px; + font-weight: 500; +} + +.fieldRow { + display: flex; + flex-direction: column; + gap: 6px; +} + +.input, +.textarea { + border: 1px solid #d5d5d5; + border-radius: 6px; + padding: 10px 12px; +} + +.error { + color: #db3030; + font-size: 12px; + margin: 0; +} + +.actions { + display: flex; + gap: 12px; +} diff --git a/src/apps/work/src/lib/components/AcceptApplicationModal/AcceptApplicationModal.tsx b/src/apps/work/src/lib/components/AcceptApplicationModal/AcceptApplicationModal.tsx new file mode 100644 index 000000000..b1aa56eaf --- /dev/null +++ b/src/apps/work/src/lib/components/AcceptApplicationModal/AcceptApplicationModal.tsx @@ -0,0 +1,228 @@ +/* eslint-disable react/jsx-no-bind */ + +import { + FC, + useCallback, + useMemo, + useState, +} from 'react' + +import { + BaseModal, + Button, +} from '~/libs/ui' + +import { + Application, +} from '../../models' +import { + StartDateTimeInput, +} from '../form' + +import styles from './AcceptApplicationModal.module.scss' + +export interface AcceptApplicationFormData { + agreementRate: string + endDate: string + otherRemarks?: string + startDate: string +} + +interface AcceptApplicationModalProps { + application: Application | undefined + isSubmitting?: boolean + onCancel: () => void + onConfirm: (data: AcceptApplicationFormData) => Promise | void + open: boolean +} + +interface ValidationErrors { + agreementRate?: string + endDate?: string + startDate?: string +} + +function parseDate(value: Date | undefined): number { + if (!value) { + return 0 + } + + return value.getTime() +} + +const AcceptApplicationModal: FC = ( + props: AcceptApplicationModalProps, +) => { + const [agreementRate, setAgreementRate] = useState('') + const [endDate, setEndDate] = useState() + const [errors, setErrors] = useState({}) + const [otherRemarks, setOtherRemarks] = useState('') + const [startDate, setStartDate] = useState() + + const isSubmitting = props.isSubmitting === true + + const minStartDate = useMemo(() => new Date(), []) + + const minEndDate = useMemo(() => { + if (!startDate) { + return minStartDate + } + + return startDate + }, [minStartDate, startDate]) + + const resetState = useCallback((): void => { + setAgreementRate('') + setEndDate(undefined) + setErrors({}) + setOtherRemarks('') + setStartDate(undefined) + }, []) + + const handleCancel = useCallback((): void => { + resetState() + props.onCancel() + }, [props, resetState]) + + const handleConfirm = useCallback(async (): Promise => { + const nextErrors: ValidationErrors = {} + + if (!startDate) { + nextErrors.startDate = 'Tentative start date is required.' + } + + if (!endDate) { + nextErrors.endDate = 'Tentative end date is required.' + } + + if (startDate && endDate && parseDate(endDate) < parseDate(startDate)) { + nextErrors.endDate = 'Tentative end date must be after start date.' + } + + if (!agreementRate.trim()) { + nextErrors.agreementRate = 'Assignment rate is required.' + } + + if (Object.keys(nextErrors).length > 0) { + setErrors(nextErrors) + return + } + + await props.onConfirm({ + agreementRate: agreementRate.trim(), + endDate: endDate?.toISOString() || '', + otherRemarks: otherRemarks.trim() || undefined, + startDate: startDate?.toISOString() || '', + }) + + resetState() + }, [agreementRate, endDate, otherRemarks, props, resetState, startDate]) + + return ( + +