├── .browserslistrc ├── .env.development ├── .env.production ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── LICENSE ├── README.md ├── babel.config.js ├── build-assets.sh ├── docker ├── dev │ └── docker-compose.yaml ├── dockerfile └── prod │ └── docker-compose.yaml ├── github └── img │ ├── preview │ ├── interface-1.jpg │ ├── interface-2.jpg │ ├── interface-3.jpg │ └── interface-4.jpg │ └── workflow-diagram.png ├── index.html ├── jsconfig.json ├── mock-npm-package.js ├── package-lock.json ├── package.json ├── postcss.config.js ├── prepare-prod.sh ├── public ├── favicon.ico ├── fonts │ ├── fredoka-one │ │ └── FredokaOne-Regular.ttf │ ├── raleway │ │ └── Raleway-VariableFont_wght.ttf │ └── teko │ │ └── Teko-Regular.ttf └── image │ ├── easy-email │ └── image-placeholder.jpg │ ├── error-pages │ └── maintenance │ │ └── Maintenance.svg │ ├── job-service │ └── logo │ │ ├── 1jeune1solution.gouv.fr.png │ │ ├── absolventa.de.png │ │ ├── adzuna.pl.png │ │ ├── anzeigen.jobsintown.de.png │ │ ├── apec.fr.png │ │ ├── aplikuj.pl.png │ │ ├── appcast.io.png │ │ ├── bankjob.de.png │ │ ├── cadremploi.fr.png │ │ ├── elempleo.com.png │ │ ├── es.talent.com.png │ │ ├── fachpraca.pl.png │ │ ├── goldenline.pl.png │ │ ├── gowork.pl.png │ │ ├── hellowork.com.png │ │ ├── indeed.com.png │ │ ├── infoempleo.com.png │ │ ├── infojobs.net.png │ │ ├── infopraca.pl.png │ │ ├── interviewme.pl.png │ │ ├── jobb.blocket.se.png │ │ ├── jobbguru.se.png │ │ ├── jobbland.se.png │ │ ├── jobbsafari.png │ │ ├── jobs.de.png │ │ ├── jobs.meinestadt.de.png │ │ ├── jobs.pl.png │ │ ├── jobware.de.png │ │ ├── karrierestart.no.png │ │ ├── kimeta.de.png │ │ ├── monster.png │ │ ├── not-found.png │ │ ├── praca.pl.png │ │ ├── pracuj.pl.png │ │ ├── stellenanzeigen.de.png │ │ ├── stellenonline.de.png │ │ ├── stepstone.de.png │ │ ├── talent.com.png │ │ ├── thehub.io.png │ │ ├── theprotocol.it.png │ │ ├── tideri.de.png │ │ └── xing.com.png │ ├── landing-pages │ ├── account-activate │ │ └── activate.png │ ├── ban │ │ └── ban.png │ ├── change-email │ │ └── change.png │ └── password-reset │ │ └── reset.png │ ├── login │ └── spectrum-gradient.svg │ └── system │ ├── dummy-avatar.png │ ├── gem │ ├── gem-128.png │ ├── gem-16.png │ ├── gem-24.png │ ├── gem-256.png │ ├── gem-32.png │ └── gem-64.png │ └── no-image.png ├── src ├── App.vue ├── assets │ ├── fonts │ │ ├── Poppins │ │ │ ├── Poppins-devanagari.woff2 │ │ │ ├── Poppins-latin-ext.woff2 │ │ │ └── Poppins-latin.woff2 │ │ └── info-page │ │ │ ├── Now-Bold.42f8447.woff │ │ │ ├── Now-Bold.4fba4e2.woff2 │ │ │ ├── Now-Regular.01092b0.woff │ │ │ └── Now-Regular.cff7fbe.woff2 │ ├── img │ │ ├── email-builder │ │ │ └── guide │ │ │ │ ├── Variables.gif │ │ │ │ ├── application-wizard-confirmation.png │ │ │ │ ├── application-wizard-template-pick.png │ │ │ │ ├── details.png │ │ │ │ ├── drag-components.gif │ │ │ │ └── drag-n-remove.gif │ │ ├── favicon │ │ │ ├── about.txt │ │ │ ├── android-chrome-192x192.png │ │ │ ├── android-chrome-512x512.png │ │ │ ├── apple-touch-icon.png │ │ │ ├── favicon-16x16.png │ │ │ ├── favicon-32x32.png │ │ │ ├── favicon.ico │ │ │ └── site.webmanifest │ │ ├── info-page │ │ │ ├── gradient-wave.png │ │ │ └── section │ │ │ │ └── info │ │ │ │ ├── 512.7302e24.jpeg │ │ │ │ ├── about-us │ │ │ │ ├── 508.f492d6a.jpeg │ │ │ │ ├── 509.e5ff6e7.jpeg │ │ │ │ └── product-owner.jpg │ │ │ │ ├── footer │ │ │ │ ├── footer-bg.78b07eb.png │ │ │ │ ├── footer-two.0e57bdd.png │ │ │ │ └── footer.671c44f.png │ │ │ │ ├── info │ │ │ │ └── carousel │ │ │ │ │ ├── carousel1.png │ │ │ │ │ ├── carousel2.png │ │ │ │ │ └── carousel3.png │ │ │ │ ├── payment │ │ │ │ └── screen.png │ │ │ │ ├── what-we-dont-offer │ │ │ │ ├── 24-7.jpg │ │ │ │ ├── aggregation.jpg │ │ │ │ └── direct-contact.jpg │ │ │ │ └── what-we-offer │ │ │ │ ├── bulk-applications.jpg │ │ │ │ ├── email-builder.jpg │ │ │ │ └── offer-search.jpg │ │ ├── job-search │ │ │ └── examples │ │ │ │ ├── france-mobile.png │ │ │ │ ├── poland-mobile.png │ │ │ │ └── spain-mobile.png │ │ ├── logo │ │ │ ├── eps │ │ │ │ ├── logo-black.eps │ │ │ │ ├── logo-color.eps │ │ │ │ ├── logo-no-background.eps │ │ │ │ └── logo-white.eps │ │ │ ├── pdf │ │ │ │ ├── logo-black.pdf │ │ │ │ ├── logo-color.pdf │ │ │ │ ├── logo-no-background.pdf │ │ │ │ └── logo-white.pdf │ │ │ ├── png │ │ │ │ ├── logo-black.png │ │ │ │ ├── logo-color.png │ │ │ │ ├── logo-no-background.png │ │ │ │ └── logo-white.png │ │ │ ├── svg │ │ │ │ ├── logo-black.svg │ │ │ │ ├── logo-color.svg │ │ │ │ ├── logo-no-background-white.svg │ │ │ │ ├── logo-no-background.svg │ │ │ │ └── logo-white.svg │ │ │ ├── voltigo-low-resolution-logo-color-on-transparent-background.svg │ │ │ └── voltigo-low-resolution-logo-white-on-transparent-background.svg │ │ └── wave.png │ ├── logo.png │ ├── scss │ │ ├── animation.scss │ │ ├── app.scss │ │ ├── colors.scss │ │ ├── fonts.scss │ │ ├── fonts │ │ │ ├── fredoka.scss │ │ │ ├── raleway.scss │ │ │ └── teko.scss │ │ ├── info-page │ │ │ ├── all.scss │ │ │ ├── bootstrap.scss │ │ │ └── page.scss │ │ ├── libs │ │ │ ├── admin-panel.scss │ │ │ ├── n-progress.scss │ │ │ ├── simple-dotted-timeline.scss │ │ │ ├── steps.scss │ │ │ ├── tippy.js.scss │ │ │ ├── toast-notification.scss │ │ │ └── v-tour.scss │ │ ├── normalization │ │ │ └── form-inputs.scss │ │ ├── responsive.scss │ │ ├── scrollbar.scss │ │ ├── text.scss │ │ └── vue │ │ │ └── view │ │ │ └── info-page.scss │ └── tailwind.css ├── components │ ├── App │ │ ├── DispatcherListener.vue │ │ └── EasyEmailCommunicationIframe.vue │ ├── Dashboard │ │ └── SmallDataDisplayBlock.vue │ ├── Development │ │ ├── FooterBar │ │ │ ├── Buttons │ │ │ │ ├── BaseButton.vue │ │ │ │ ├── Eruda.vue │ │ │ │ ├── PinBar.vue │ │ │ │ └── SymfonyProfiler.vue │ │ │ └── FooterBar.vue │ │ └── Sidebar │ │ │ ├── Components │ │ │ └── DeveloperPlaygroundButton.vue │ │ │ └── DeveloperSidebar.vue │ ├── Form │ │ ├── AsteriskRequired.vue │ │ ├── Checkbox.vue │ │ ├── Finances │ │ │ └── Internal │ │ │ │ └── CurrenciesSelect.vue │ │ ├── GeoLocation │ │ │ ├── CountrySelect.vue │ │ │ └── Internal │ │ │ │ └── CountrySelect.vue │ │ ├── Input.vue │ │ ├── InputViolations.vue │ │ ├── LanguageSelect.vue │ │ ├── MultiSelect.vue │ │ ├── PasswordWithConfirmation.vue │ │ ├── PasswordWithPreview.vue │ │ ├── Range.vue │ │ └── mixin │ │ │ └── MultiselectFocusMixin.vue │ ├── Global │ │ ├── Security │ │ │ └── RoleProtectedComponent.vue │ │ ├── TransitionPreconfigured.vue │ │ └── TransitionedComponent.vue │ ├── Libs │ │ ├── CountryFlag │ │ │ └── CountryFlag.vue │ │ └── Fontawesome.vue │ ├── LoggedIn │ │ ├── JobOffer │ │ │ ├── Filters │ │ │ │ └── Keywords.vue │ │ │ └── Sidebar │ │ │ │ ├── FullInfo.vue │ │ │ │ └── FullInfo │ │ │ │ ├── CompanyDetail │ │ │ │ ├── CompanyData.vue │ │ │ │ ├── CompanyIndustries.vue │ │ │ │ ├── CompanyLocations.vue │ │ │ │ └── CompanyWebsites.vue │ │ │ │ ├── Search │ │ │ │ └── SearchOnGoogle.vue │ │ │ │ ├── TabCompanyDetail.vue │ │ │ │ ├── TabJobOfferDetail.vue │ │ │ │ └── TabSearch.vue │ │ ├── Navigation │ │ │ ├── Footer │ │ │ │ ├── Footer.vue │ │ │ │ └── components │ │ │ │ │ ├── Copyright.vue │ │ │ │ │ ├── GithubRepo.vue │ │ │ │ │ └── LinksMenu │ │ │ │ │ └── LinksMenu.vue │ │ │ ├── Founds │ │ │ │ ├── FoundsStatus.vue │ │ │ │ └── Modal │ │ │ │ │ ├── CurrencyPaymentSupportInfo.vue │ │ │ │ │ └── FoundsStateModal.vue │ │ │ ├── PageTitleSection.vue │ │ │ ├── RightSidebar.vue │ │ │ ├── Sidebar.vue │ │ │ ├── SidebarComponents │ │ │ │ ├── SingleDropdownMenuElement.vue │ │ │ │ └── SingleMenuElement.vue │ │ │ ├── Timer │ │ │ │ └── Timer.vue │ │ │ ├── TopBar.vue │ │ │ └── TopBarComponents │ │ │ │ ├── UserMenu.vue │ │ │ │ └── UserMenuComponents │ │ │ │ └── SingleMenuElement.vue │ │ ├── Payment │ │ │ ├── PaymentModal.vue │ │ │ ├── PointsFee.vue │ │ │ ├── PointsFee │ │ │ │ └── Layout.vue │ │ │ └── Tool │ │ │ │ ├── Button │ │ │ │ ├── BaseButton.vue │ │ │ │ ├── PaypalButton.vue │ │ │ │ └── StripeButton.vue │ │ │ │ ├── PaypalPayment.vue │ │ │ │ └── StripePayment.vue │ │ ├── Product │ │ │ ├── AvailableProductsList.vue │ │ │ └── PointProduct │ │ │ │ ├── Components │ │ │ │ ├── Details.vue │ │ │ │ ├── Icon.vue │ │ │ │ └── Name.vue │ │ │ │ └── PointProduct.vue │ │ └── System │ │ │ └── SessionTimeWarningModal.vue │ ├── Modal │ │ ├── Modal.vue │ │ └── WarningModal.vue │ ├── Navigation │ │ ├── Button │ │ │ ├── BigSquareButton.vue │ │ │ ├── ButtonRounded.vue │ │ │ ├── FullRoundButtonWithIcon.vue │ │ │ └── MediumButtonWithIcon.vue │ │ ├── CircleMenu │ │ │ ├── CircleMenu.vue │ │ │ └── MenuElement.vue │ │ ├── Hamburger.vue │ │ ├── SearchInput.vue │ │ ├── Steps │ │ │ ├── Step.vue │ │ │ ├── Step │ │ │ │ └── Components │ │ │ │ │ ├── DoneState.vue │ │ │ │ │ └── NotDoneState.vue │ │ │ └── Steps.vue │ │ └── Tabs │ │ │ └── Tabs.vue │ ├── Notification │ │ ├── Alert.vue │ │ └── mixins │ │ │ └── NotificationContentMixin.vue │ ├── Page │ │ ├── AboutAccordion.vue │ │ ├── InformationBlock.vue │ │ ├── NoResultsText.vue │ │ └── WarningBlock.vue │ ├── Security │ │ ├── Modal │ │ │ └── RemindPasswordModal.vue │ │ └── PasswordConstraintsBlock.vue │ ├── System │ │ ├── MessageBar │ │ │ └── MessageBar.vue │ │ └── SystemDisabledBar │ │ │ └── SystemDisabledBar.vue │ └── Ui │ │ ├── Accordion │ │ ├── Accordion.vue │ │ └── Panel.vue │ │ ├── Badge │ │ └── Badge.vue │ │ ├── Bar │ │ └── ColorBorderBar.vue │ │ ├── ColoredSwitch.vue │ │ ├── Containers │ │ ├── Container.vue │ │ └── FloatingBox.vue │ │ ├── HtmlIframe.vue │ │ ├── Icons │ │ ├── LineAwesome.vue │ │ ├── Svg │ │ │ ├── Checkmark.vue │ │ │ ├── Cog.vue │ │ │ ├── DoubleArrowLeft.vue │ │ │ ├── DoubleArrowRight.vue │ │ │ ├── GitHub.vue │ │ │ ├── Logout.vue │ │ │ ├── NoMail.vue │ │ │ ├── Person.vue │ │ │ ├── Wrench.vue │ │ │ └── XMark.vue │ │ └── UnicodeArrow.vue │ │ ├── Lightbox │ │ └── Lightbox.vue │ │ ├── List │ │ ├── NumericList.vue │ │ ├── NumericList │ │ │ └── SingleElement.vue │ │ └── SelectableList.vue │ │ ├── Navigation │ │ └── QuickTopBottom │ │ │ ├── FixedGoToBottom.vue │ │ │ ├── FixedGoToTop.vue │ │ │ └── FixedTopBottom.vue │ │ ├── Pagination.vue │ │ ├── Payment │ │ ├── CreditCard.vue │ │ └── PayNowButton.vue │ │ ├── QuestionMarkAbout.vue │ │ ├── Row.vue │ │ ├── Table │ │ └── SimpleTable.vue │ │ ├── Timeline │ │ └── SimpleDotted │ │ │ ├── Element.vue │ │ │ └── Timeline.vue │ │ └── Upload │ │ ├── Component │ │ ├── Upload.vue │ │ ├── components │ │ │ └── UploadedFilesList.vue │ │ └── mixin │ │ │ └── UploadStatusMixin.vue │ │ └── Dialog │ │ └── UploadDialog.vue ├── config │ ├── dev │ │ ├── .gitignore │ │ ├── encryption.json │ │ └── jwt.json │ ├── global.json │ ├── globalThis.json │ └── prod │ │ ├── .gitignore │ │ ├── encryption.json │ │ └── jwt.json ├── main.ts ├── mixins │ ├── Attribute │ │ └── CssClassNormalizerMixin.vue │ ├── Awarness │ │ ├── DemoAwareMixin.vue │ │ ├── EasyEmailCommunicationAwareMixin.vue │ │ ├── HtmlToPdfBase64ProviderAwareMixin.vue │ │ ├── SymfonyProfilerAwareMixin.vue │ │ └── TourAwareMixin.vue │ ├── EasyEmail │ │ └── UploadMixin.vue │ ├── Finances │ │ └── Currency │ │ │ ├── CurrencyCodesMixin.vue │ │ │ └── ExchangeRateMixin.vue │ ├── Invoice │ │ └── InvoicePdfProviderMixin.vue │ ├── Libs │ │ ├── ChartJsMixin.vue │ │ └── EasyEmailMixin.vue │ ├── Order │ │ ├── PointProductsProviderMixin.vue │ │ └── UserOrdersProviderMixin.vue │ ├── Payment │ │ └── PreparedPaymentMixin.vue │ ├── PointShop │ │ └── PointShopHistoryProviderMixin.vue │ ├── Responsive │ │ ├── ResponsiveModalSizeMixin.vue │ │ └── ResponsiveVarsMixin.vue │ ├── System │ │ ├── PasswordConstraintsMixin.vue │ │ ├── PublicFolderAccessTokenMixin.vue │ │ ├── Restriction │ │ │ └── MaxAllowedPaymentDataMixin.vue │ │ └── SystemStateMixin.vue │ └── User │ │ └── UserRegulationMixin.vue ├── router │ ├── SymfonyRoutes.ts │ ├── SymfonyRoutes │ │ ├── SymfonyDashboardRoutes.ts │ │ ├── SymfonyEmailRoutes.ts │ │ ├── SymfonyFileRoutes.ts │ │ ├── SymfonyFinanceRoutes.ts │ │ ├── SymfonyInvoiceRoutes.ts │ │ ├── SymfonyJobOfferRoutes.ts │ │ ├── SymfonyJobServicesRoutes.ts │ │ ├── SymfonyOrderRoutes.ts │ │ ├── SymfonyPointShopRoutes.ts │ │ ├── SymfonyPointsRoutes.ts │ │ ├── SymfonyProductRoutes.ts │ │ ├── SymfonySystemRoutes.ts │ │ └── User │ │ │ ├── Regulation │ │ │ └── SymfonyUserRegulationsRoutes.ts │ │ │ └── Setting │ │ │ └── SymfonyUserSettingRoutes.ts │ ├── VueRouter.ts │ ├── VueRouterAccessControl.ts │ ├── VueRouterGuards.ts │ └── VueRouterUser.ts ├── scripts │ ├── .gitignore │ ├── BootLoader.ts │ ├── Core │ │ ├── .gitignore │ │ ├── BuildService.ts │ │ ├── Controller │ │ │ └── UserController.ts │ │ ├── Error │ │ │ ├── BaseError.ts │ │ │ └── NonLoggableBaseError.ts │ │ ├── Interfaces │ │ │ └── AppAxiosInterface.ts │ │ ├── Listeners │ │ │ ├── ErrorListener.ts │ │ │ ├── Interfaces │ │ │ │ └── ListenerInterface.ts │ │ │ ├── RejectedPromiseErrorListener.ts │ │ │ └── UserActivityListener.ts │ │ ├── Logger.ts │ │ ├── Security │ │ │ ├── JwtTokenHandler.ts │ │ │ └── SymfonyRolesAndRights.ts │ │ ├── Services │ │ │ ├── ConfigLoader │ │ │ │ └── ConfigLoader.ts │ │ │ ├── Crypto │ │ │ │ ├── Base64Service.ts │ │ │ │ ├── Md5Service.ts │ │ │ │ └── RandomGeneratorService.ts │ │ │ ├── Dispatcher │ │ │ │ ├── EventDispatcherLoggedUserService.ts │ │ │ │ ├── EventDispatcherService.ts │ │ │ │ └── EventEmitterService.ts │ │ │ ├── DomService.ts │ │ │ ├── Download │ │ │ │ ├── Base64DownloadService.ts │ │ │ │ └── Base64PdfDownloadService.ts │ │ │ ├── EasyEmail │ │ │ │ ├── EasyEmailSecretHandler.ts │ │ │ │ └── Event │ │ │ │ │ ├── Incoming.ts │ │ │ │ │ └── Outgoing.ts │ │ │ ├── EventListenerService.ts │ │ │ ├── External │ │ │ │ ├── GoogleMapsService.ts │ │ │ │ ├── GoogleSearchService.ts │ │ │ │ └── ShieldsIoService.ts │ │ │ ├── Generator │ │ │ │ ├── CsvGenerator.ts │ │ │ │ └── UniqidService.ts │ │ │ ├── Job │ │ │ │ └── JobServiceDataProvider.ts │ │ │ ├── Math │ │ │ │ └── MathService.ts │ │ │ ├── Parser │ │ │ │ └── TextParser.ts │ │ │ ├── Promise │ │ │ │ └── PromiseService.ts │ │ │ ├── PublicFolder │ │ │ │ └── PublicFolderService.ts │ │ │ ├── Request │ │ │ │ └── AppAxios.ts │ │ │ ├── Resolver │ │ │ │ └── ObjectValuesResolver.ts │ │ │ ├── Security │ │ │ │ ├── BanHandlerService.ts │ │ │ │ ├── CookiePopup.ts │ │ │ │ ├── EncryptionService.ts │ │ │ │ ├── IframePostMessageControlService.ts │ │ │ │ └── JwtService.ts │ │ │ ├── Storage │ │ │ │ ├── BackendErrorStorageService.ts │ │ │ │ ├── DevelopmentLocalStorageService.ts │ │ │ │ ├── LocalStorageService.ts │ │ │ │ └── SessionStorageService.ts │ │ │ ├── TimerService.ts │ │ │ ├── Types │ │ │ │ └── TypeChecker.ts │ │ │ ├── TypesProcessors │ │ │ │ ├── ArrayTypeProcessor.ts │ │ │ │ ├── BoolTypeProcessor.ts │ │ │ │ ├── DateTimeProcessor.ts │ │ │ │ ├── NumberTypeProcessor.ts │ │ │ │ ├── ObjectTypeProcessor.ts │ │ │ │ └── StringTypeProcessor.ts │ │ │ ├── Url │ │ │ │ └── UrlService.ts │ │ │ ├── View │ │ │ │ └── BrowserDetection.ts │ │ │ ├── Websocket │ │ │ │ ├── ActionExecutor │ │ │ │ │ ├── AbstractWebsocketActionExecutor.ts │ │ │ │ │ ├── AuthenticatedUserWebsocketActionExecutor.ts │ │ │ │ │ └── GlobalWebsocketActionExecutor.ts │ │ │ │ ├── Callable │ │ │ │ │ └── AuthenticatedUserWebsocketCallable.ts │ │ │ │ ├── Handler │ │ │ │ │ ├── AuthenticatedUserWebsocketHandler.ts │ │ │ │ │ ├── GlobalWebsocketHandler.ts │ │ │ │ │ ├── NotFoundWebsocketHandler.ts │ │ │ │ │ ├── NotificationWebsocketHandler.ts │ │ │ │ │ ├── UnauthorizedWebsocketHandler.ts │ │ │ │ │ └── WebsocketHandlerInterface.ts │ │ │ │ ├── WebsocketConnectionHandler.ts │ │ │ │ ├── WebsocketHandlerSelector.ts │ │ │ │ └── websocket.d.ts │ │ │ └── WindowService.ts │ │ ├── System │ │ │ └── EnvReader.ts │ │ └── Types │ │ │ ├── Account.ts │ │ │ ├── ConfigLoader.ts │ │ │ ├── EmailTemplate.ts │ │ │ ├── Request │ │ │ ├── AxiosTypes.ts │ │ │ └── RequestMethodType.ts │ │ │ ├── Svg.d.ts │ │ │ └── UserData.ts │ ├── Dto │ │ ├── BaseDTO.ts │ │ ├── File │ │ │ ├── UploadConfigurationDTO.ts │ │ │ └── UploadedFileDTO.ts │ │ ├── Jwt │ │ │ └── JwtPayloadType.ts │ │ └── Websocket │ │ │ ├── IncomingWebsocketMessageDTO.ts │ │ │ ├── OutgoingWebsocketMessageDTO.ts │ │ │ └── WebsocketMessageBaseDTO.ts │ ├── Entity │ │ ├── Email │ │ │ └── EmailTemplate.ts │ │ ├── Geolocation │ │ │ └── Country.ts │ │ ├── Job │ │ │ ├── CompanyDetail.ts │ │ │ ├── ContactDetail.ts │ │ │ ├── Filter │ │ │ │ └── JobOfferSearchResultDetailFilter.ts │ │ │ ├── JobApplications.ts │ │ │ ├── JobOfferAnalyzed.ts │ │ │ ├── JobSearchResult.ts │ │ │ ├── JobShortInformation.ts │ │ │ └── Salary.ts │ │ └── PointShop │ │ │ └── PointShopProduct.ts │ ├── Enum │ │ ├── PaymentStatusEnum.ts │ │ └── PointShopProductEnum.ts │ ├── Libs │ │ ├── .gitignore │ │ ├── FlagIconCss.ts │ │ ├── GeneratePassword.ts │ │ ├── IsoCountries.ts │ │ ├── Nprogress.ts │ │ └── ToastNotification.ts │ ├── Response │ │ ├── Ban │ │ │ └── BanResponse.ts │ │ ├── BaseApiResponse.ts │ │ ├── CsrfTokenResponse.ts │ │ ├── Currency │ │ │ ├── GetAllCurrencyCodesResponse.ts │ │ │ └── GetExchangeRateResponse.ts │ │ ├── Dashboard │ │ │ └── GetDashboardDataResponse.ts │ │ ├── Email │ │ │ └── Template │ │ │ │ ├── GetEditorVariables.ts │ │ │ │ ├── GetTemplates.ts │ │ │ │ ├── ReFetchTemplate.ts │ │ │ │ └── SaveTemplate.ts │ │ ├── ErrorHandler.ts │ │ ├── File │ │ │ └── Upload │ │ │ │ ├── GetUploadConfigurationResponse.ts │ │ │ │ ├── GetUserCvList.ts │ │ │ │ └── UploadResponse.ts │ │ ├── Invoice │ │ │ └── GetInvoiceResponse.ts │ │ ├── Job │ │ │ ├── Application │ │ │ │ └── GetApplications.ts │ │ │ ├── Filter │ │ │ │ └── GetDefaultFilter.ts │ │ │ ├── Offer │ │ │ │ ├── GetFullDescription.ts │ │ │ │ └── GetJobOffers.ts │ │ │ ├── Search │ │ │ │ └── GetJobSearchResults.ts │ │ │ └── Service │ │ │ │ └── GetSupportedCuntries.ts │ │ ├── Order │ │ │ └── GetOrdersDataResponse.ts │ │ ├── Payment │ │ │ ├── PrepareResponse.ts │ │ │ └── Stripe │ │ │ │ └── GetPaymentIntentResponse.ts │ │ ├── PointShop │ │ │ ├── GetAllJobSearchTagProductResponse.ts │ │ │ ├── GetFullPointShopHistoryResponse.ts │ │ │ └── GetPointShopProductResponse.ts │ │ ├── Product │ │ │ └── GetAllPointProductDataResponse.ts │ │ ├── System │ │ │ ├── AccessToken │ │ │ │ └── GetPublicFolderAccessTokenResponse.ts │ │ │ ├── GeoData │ │ │ │ └── InternallySupportedCountriesResponse.ts │ │ │ ├── Restriction │ │ │ │ ├── CheckActiveJobSearchResponse.ts │ │ │ │ ├── CheckEmailTemplateRestrictions.ts │ │ │ │ ├── GetMaxAllowedPaymentDataResponse.ts │ │ │ │ └── MaxTemplateTestEmailResponse.ts │ │ │ ├── Security │ │ │ │ └── GetPasswordConstraintsResponse.ts │ │ │ └── State │ │ │ │ ├── CheckActiveJobSearchResponse.ts │ │ │ │ └── SystemDisabledStateResponse.ts │ │ └── User │ │ │ └── IsUserRegulationAcceptedResponse.ts │ └── Vue │ │ ├── Mixins │ │ ├── BaseApiResponseViolationsToDataFieldsViolations.vue │ │ ├── Colors.vue │ │ ├── Email │ │ │ └── TemplatesProviderMixin.vue │ │ ├── FailedBackendResponseHandler.vue │ │ ├── Response │ │ │ └── BaseApiResponseMixin.vue │ │ ├── Ui │ │ │ └── PaginationMixin.vue │ │ └── VuelidateHandler.vue │ │ ├── Plugin │ │ ├── Axios │ │ │ ├── AxiosPlugin.ts │ │ │ └── axios.d.ts │ │ ├── Events │ │ │ ├── RootEvent.ts │ │ │ └── rootEvent.d.ts │ │ ├── InstallablePluginInterface.ts │ │ ├── Libs │ │ │ ├── Fontawesome.ts │ │ │ └── Tippy.ts │ │ ├── PluginsInstaller.ts │ │ └── View │ │ │ ├── ViewPlugin.ts │ │ │ └── viewPlugin.d.ts │ │ ├── Provider │ │ └── TranslationsProvider.ts │ │ ├── Store │ │ ├── ApplicationWizardOffersStore.ts │ │ ├── SystemDisabledState.ts │ │ └── UserState.ts │ │ └── Types │ │ ├── Components │ │ ├── ComponentPickerRecord.ts │ │ ├── Sidebar.ts │ │ └── types.d.ts │ │ └── Router │ │ └── router.d.ts ├── shims-vue.d.ts ├── translations │ └── en-US │ │ ├── components │ │ ├── Form │ │ │ ├── currency.json │ │ │ └── keywords.json │ │ ├── Modal │ │ │ ├── EmailBuilder │ │ │ │ └── general-regulations.json │ │ │ ├── founds.json │ │ │ ├── payment.json │ │ │ └── warning.json │ │ ├── Page │ │ │ ├── about.json │ │ │ └── no-results.json │ │ ├── Security │ │ │ └── password.json │ │ ├── UI │ │ │ └── colored-switch.json │ │ ├── User │ │ │ └── personal-data.json │ │ ├── developer.json │ │ ├── job-offer-email-wizard.json │ │ ├── job-offer-selected-offers-preview.json │ │ ├── payment.json │ │ ├── upload.json │ │ └── user-settings.json │ │ ├── demo.json │ │ ├── info │ │ └── info-page.json │ │ ├── messages.json │ │ ├── navigation.json │ │ ├── other │ │ ├── date-time │ │ │ └── months.json │ │ └── validations.json │ │ ├── process │ │ └── payment.json │ │ ├── regulations │ │ ├── email-builder │ │ │ └── general.json │ │ └── general │ │ │ └── terms-of-use.json │ │ ├── system │ │ ├── restriction │ │ │ └── payment.json │ │ ├── state.json │ │ └── timer.json │ │ └── views │ │ ├── email │ │ └── template │ │ │ ├── builder-close-modal.json │ │ │ ├── builder.json │ │ │ └── removal-confirmation-modal.json │ │ ├── errorPage │ │ └── 404.json │ │ ├── home-dashboard │ │ └── home-dashboard.json │ │ ├── jobOffer │ │ ├── job-offer-applications.json │ │ ├── job-offer-results.json │ │ ├── job-offer-search-entries.json │ │ ├── job-offer-search.json │ │ └── job-service.data.json │ │ ├── landing-page │ │ ├── account-activate │ │ │ └── activate.json │ │ ├── ban │ │ │ └── ban.json │ │ ├── change-email │ │ │ └── change.json │ │ ├── landing-page.json │ │ ├── password-reset │ │ │ └── reset.json │ │ └── user-not-activated │ │ │ └── not-activated.json │ │ ├── logged-in.json │ │ ├── login │ │ └── login.json │ │ ├── payments │ │ └── orders-payments-overview.json │ │ ├── pointShop │ │ └── pointShop.json │ │ ├── register │ │ └── register.json │ │ ├── security │ │ └── login.json │ │ └── user │ │ └── profile.json └── views │ ├── Ban │ ├── Ban.vue │ ├── components │ │ ├── BanReason.vue │ │ └── BannedUntil.vue │ └── mixin │ │ └── BanTypeMixin.vue │ ├── Dashboard.vue │ ├── Dashboard │ └── Components │ │ ├── JobApplicationsSent.vue │ │ ├── Mixin │ │ ├── CountGroupingByDateMixin.vue │ │ └── TourMixin.vue │ │ ├── TopDataBlocks.vue │ │ └── UniqueOffersFound.vue │ ├── Development │ └── Playground.vue │ ├── Email │ └── Template │ │ ├── Builder.vue │ │ └── Builder │ │ ├── HintsAccordion.vue │ │ ├── Mixin │ │ ├── DeleteMixin.vue │ │ ├── LoadCloneableMixin.vue │ │ ├── LoadMixin.vue │ │ └── SaveMixin.vue │ │ ├── Modal │ │ ├── EasyEmail.vue │ │ ├── EasyEmailTourMixin.vue │ │ ├── GeneratePdfModal.vue │ │ ├── GuideModal.vue │ │ ├── RegulationsModal.vue │ │ ├── RemoveTemplateConfirmationModal.vue │ │ ├── SendTestEmailModal.vue │ │ └── StopEditingConfirmationModal.vue │ │ ├── PredefinedTemplates.vue │ │ ├── TemplatesList.vue │ │ ├── TemplatesList │ │ └── SingleTemplate │ │ │ ├── SingleTemplate.vue │ │ │ └── components │ │ │ ├── Buttons.vue │ │ │ └── Image.vue │ │ ├── TopNavBar.vue │ │ └── WarningMobileBrowser.vue │ ├── ErrorCodes │ └── 404.vue │ ├── Examples │ └── RoleProtectedRoute.vue │ ├── InfoLandingPage │ ├── Components │ │ ├── BackToTop.vue │ │ ├── Footer.vue │ │ ├── Footer │ │ │ ├── Contact.vue │ │ │ └── Menu.vue │ │ ├── Mixin │ │ │ ├── LoginPageHandlerMixin.vue │ │ │ └── SectionNavigationMixin.vue │ │ ├── Modal │ │ │ ├── Credits.vue │ │ │ └── RoadMap.vue │ │ ├── Section │ │ │ ├── AboutUs.vue │ │ │ ├── Components │ │ │ │ ├── AboutUs │ │ │ │ │ └── ExternalStyles.vue │ │ │ │ ├── Home │ │ │ │ │ └── ExternalStyles.vue │ │ │ │ ├── Info │ │ │ │ │ ├── InfoToLeft.vue │ │ │ │ │ └── InfoToRight.vue │ │ │ │ └── Offer │ │ │ │ │ ├── Block.vue │ │ │ │ │ └── Section.vue │ │ │ ├── Countries.vue │ │ │ ├── Faq.vue │ │ │ ├── Home.vue │ │ │ ├── Info.vue │ │ │ ├── Payment.vue │ │ │ ├── ScreensCarousel.vue │ │ │ ├── WhatWeDontOffer.vue │ │ │ └── WhatWeOffer.vue │ │ ├── TopMenu.vue │ │ └── TopMenu │ │ │ └── LoginLink.vue │ └── Page.vue │ ├── JobOffer │ ├── Applications.vue │ ├── Applications │ │ ├── Components │ │ │ ├── FiltersPanel │ │ │ │ ├── Components │ │ │ │ │ ├── CompanyNameFilter.vue │ │ │ │ │ ├── DateFromFilter.vue │ │ │ │ │ ├── DateToFilter.vue │ │ │ │ │ ├── EmailAddressFilter.vue │ │ │ │ │ └── JobTitleFilter.vue │ │ │ │ └── FiltersPanel.vue │ │ │ └── SortPanel │ │ │ │ ├── Components │ │ │ │ └── GeneralSort.vue │ │ │ │ └── SortPanel.vue │ │ ├── Mixin │ │ │ ├── Filter │ │ │ │ └── InitialFilterValuesMixin.vue │ │ │ └── Sort │ │ │ │ ├── InitialSortValuesMixin.vue │ │ │ │ └── SortTypesMixin.vue │ │ ├── SingleApplication │ │ │ ├── Components │ │ │ │ ├── Details.vue │ │ │ │ ├── Logo.vue │ │ │ │ ├── OfferServiceData.vue │ │ │ │ ├── Status.vue │ │ │ │ ├── Tooltip.vue │ │ │ │ └── Tooltip │ │ │ │ │ └── Components │ │ │ │ │ └── SeeOffer.vue │ │ │ └── SingleJobApplication.vue │ │ ├── TopRow.vue │ │ └── Types │ │ │ ├── Filter │ │ │ └── FilterTypes.ts │ │ │ └── Sort │ │ │ └── SortTypes.ts │ ├── Email │ │ ├── Mixin │ │ │ └── DummyVariablesProviderMixin.vue │ │ ├── Wizard.vue │ │ └── Wizard │ │ │ ├── Attachments │ │ │ └── Cv.vue │ │ │ ├── Common │ │ │ ├── Mixin │ │ │ │ └── GenerateEmailMixin.vue │ │ │ └── StepNavigation.vue │ │ │ ├── Confirmation │ │ │ ├── Headers.vue │ │ │ ├── ModalTemplateHasChanged.vue │ │ │ ├── OffersList │ │ │ │ ├── Components │ │ │ │ │ ├── SingleOffer.vue │ │ │ │ │ └── SingleOffer │ │ │ │ │ │ └── Components │ │ │ │ │ │ ├── OfferDetails.vue │ │ │ │ │ │ └── OfferSelection.vue │ │ │ │ └── OffersList.vue │ │ │ ├── SelectedAttachments.vue │ │ │ └── SendApplicationsButton.vue │ │ │ ├── Mixin │ │ │ └── TargetStepHandlerMixin.vue │ │ │ ├── StepConfirmation.vue │ │ │ ├── StepInterfaceMixin.vue │ │ │ ├── StepPreviewTemplate.vue │ │ │ ├── StepSelectAttachments.vue │ │ │ └── StepSelectTemplate.vue │ ├── Search.vue │ ├── Search │ │ ├── AdvancedSettingModal.vue │ │ ├── AdvancedSettingModal │ │ │ └── LimitSelect.vue │ │ ├── ExamplesButton.vue │ │ ├── ExamplesLightbox.vue │ │ ├── HandlerOfflineInfo.vue │ │ ├── LimitInfoBlock.vue │ │ ├── LimitReachedInfo.vue │ │ ├── LocationBasedSearchInfo.vue │ │ ├── Mixin │ │ │ └── TourMixin.vue │ │ ├── QuotaReachedInfo.vue │ │ └── WarningBlocks.vue │ └── SearchResult │ │ ├── Details.vue │ │ ├── Details │ │ ├── Components │ │ │ ├── ActionsPanel.vue │ │ │ ├── ActionsPanel │ │ │ │ ├── GetAsCsv.vue │ │ │ │ └── Search.vue │ │ │ ├── Cards │ │ │ │ ├── MiniSingleCard.vue │ │ │ │ ├── SingleCard.vue │ │ │ │ └── SingleCard │ │ │ │ │ ├── BottomBar.vue │ │ │ │ │ ├── CompanyDetail.vue │ │ │ │ │ ├── CompanyLocation.vue │ │ │ │ │ ├── CompanyName.vue │ │ │ │ │ ├── JobOfferServiceThumb.vue │ │ │ │ │ ├── LastTimeAppliedDate.vue │ │ │ │ │ ├── Mixin │ │ │ │ │ └── PreviewOfferMixin.vue │ │ │ │ │ ├── OfferData.vue │ │ │ │ │ ├── OfferDescription.vue │ │ │ │ │ ├── OfferPostedDate.vue │ │ │ │ │ ├── OfferServiceInfoBlock.vue │ │ │ │ │ ├── OfferTitle.vue │ │ │ │ │ └── QuickApply.vue │ │ │ ├── FiltersAccordion.vue │ │ │ ├── FiltersPanel.vue │ │ │ ├── FiltersPanel │ │ │ │ ├── Company.vue │ │ │ │ ├── Company │ │ │ │ │ └── components │ │ │ │ │ │ ├── BaseName.vue │ │ │ │ │ │ ├── ExcludedName.vue │ │ │ │ │ │ ├── IncludedName.vue │ │ │ │ │ │ └── NameSet.vue │ │ │ │ ├── Enum │ │ │ │ │ └── FilteringRuleEnum.ts │ │ │ │ ├── Keywords.vue │ │ │ │ ├── Offer.vue │ │ │ │ ├── Other.vue │ │ │ │ └── Other │ │ │ │ │ └── OnlyNewOffers.vue │ │ │ ├── Legend.vue │ │ │ ├── LegendBlock.vue │ │ │ ├── Navigation │ │ │ │ └── FloatingBoxes.vue │ │ │ ├── NoSearchResults.vue │ │ │ ├── OffersCountInfoBlock.vue │ │ │ ├── SelectedOffersListModal.vue │ │ │ └── WizardModal.vue │ │ └── Mixin │ │ │ ├── EmailSourceMixin.vue │ │ │ ├── JobOffersProviderMixin.vue │ │ │ ├── MiniCardsHandlerMixin.vue │ │ │ ├── OffersSelectionHandlerMixin.vue │ │ │ ├── RightSidebarHandlerMixin.vue │ │ │ └── SearchMixin.vue │ │ ├── Mixin │ │ └── SearchResultStatusMixin.vue │ │ ├── Overview.vue │ │ └── Overview │ │ └── Components │ │ ├── FiltersPanel │ │ ├── Components │ │ │ ├── CreatedFilter.vue │ │ │ ├── KeywordsFilter.vue │ │ │ ├── LocationDistanceFilter.vue │ │ │ ├── LocationNameFilter.vue │ │ │ ├── StatusFilter.vue │ │ │ └── TargetAreaFilter.vue │ │ └── FiltersPanel.vue │ │ └── SingleResult │ │ ├── Components │ │ ├── CountFound.vue │ │ ├── Details.vue │ │ ├── StatusIcon.vue │ │ ├── StatusText.vue │ │ ├── Tab.vue │ │ └── ValidityText.vue │ │ └── SingleResult.vue │ ├── Payments │ ├── Mixin │ │ └── PaymentStatusMixin.vue │ ├── Overview.vue │ ├── Overview │ │ └── Components │ │ │ ├── FiltersPanel │ │ │ ├── Components │ │ │ │ ├── CreatedFilter.vue │ │ │ │ ├── PriceFilter.vue │ │ │ │ ├── ProductNamesFilter.vue │ │ │ │ └── StatusFilter.vue │ │ │ └── FiltersPanel.vue │ │ │ └── SingleResult │ │ │ ├── Components │ │ │ ├── Actions.vue │ │ │ ├── Details.vue │ │ │ ├── StatusIcon.vue │ │ │ ├── StatusText.vue │ │ │ └── Tab.vue │ │ │ └── SingleResult.vue │ ├── PointShopHistory.vue │ └── PointShopHistory │ │ └── Components │ │ ├── Details │ │ ├── EmailSending.vue │ │ └── JobSearchProduct.vue │ │ ├── DetailsModal.vue │ │ ├── EntryInformation.vue │ │ ├── FiltersPanel │ │ ├── Components │ │ │ └── CreatedFilter.vue │ │ └── FiltersPanel.vue │ │ └── Type.vue │ ├── RouterViews │ ├── Components │ │ └── LoggedInUser │ │ │ └── TermsOfUseModal.vue │ └── LoggedInUser.vue │ ├── Security │ ├── Login.vue │ └── Register.vue │ ├── SystemState │ └── Maintenance.vue │ └── User │ ├── EmailChangeConfirmation.vue │ ├── InfoPage │ └── Components │ │ └── NavButtons.vue │ ├── NotActivatedView.vue │ ├── PasswordResetConfirmation.vue │ ├── PersonalData │ └── DataUsageInfo.vue │ ├── Profile.vue │ ├── ProfileActivationConfirmation.vue │ └── Settings │ ├── Navigation │ └── SettingsNavigation.vue │ ├── Settings.vue │ ├── Views │ ├── Account │ │ ├── Account.vue │ │ └── components │ │ │ ├── RemoveAccount.vue │ │ │ └── RemoveAccount │ │ │ └── Modal.vue │ ├── BaseData │ │ ├── BaseData.vue │ │ └── components │ │ │ ├── EmailAddress │ │ │ ├── Dialog.vue │ │ │ └── EmailAddressInput.vue │ │ │ ├── PersonalData │ │ │ ├── Address.vue │ │ │ ├── Address │ │ │ │ ├── City.vue │ │ │ │ ├── Country.vue │ │ │ │ ├── HomeNumber.vue │ │ │ │ ├── Street.vue │ │ │ │ └── Zip.vue │ │ │ ├── Dialog.vue │ │ │ ├── FirstName.vue │ │ │ └── LastName.vue │ │ │ └── ProfileImageUpload │ │ │ └── Dialog.vue │ ├── Files │ │ ├── Files.vue │ │ └── components │ │ │ └── Cv │ │ │ ├── Cv.vue │ │ │ └── components │ │ │ ├── CvList │ │ │ └── CvList.vue │ │ │ ├── CvModal.vue │ │ │ └── SingleCvData │ │ │ ├── SingleCvData.vue │ │ │ └── components │ │ │ ├── EditDialog.vue │ │ │ ├── FileName.vue │ │ │ └── UserBasedNameInput.vue │ ├── Mixin │ │ └── ResponsiveViewNavMixin.vue │ └── Security │ │ ├── Security.vue │ │ └── components │ │ ├── ChangePassword.vue │ │ └── ChangePassword │ │ └── Modal.vue │ └── components │ └── SingleNavElement.vue ├── tailwind.config.js ├── tsconfig.json └── vite.config.js /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not dead 4 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | es2021: true, 5 | }, 6 | 'extends': [ 7 | 'plugin:vue/vue3-essential', 8 | 'eslint:recommended', 9 | '@vue/typescript/recommended', 10 | ], 11 | parserOptions: { 12 | ecmaVersion: 2020 13 | }, 14 | rules: { 15 | 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 16 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 17 | 'no-async-promise-executor': "off", 18 | 'prefer-const': "off", 19 | 'no-var': "off", 20 | 'no-case-declarations': "off", 21 | "@typescript-eslint/ban-ts-comment": "off", 22 | "@typescript-eslint/no-inferrable-types": "off", 23 | "@typescript-eslint/no-this-alias": "off", 24 | "@typescript-eslint/no-var-requires": "off" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /build-assets.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Solve the JavaScript heap out of memory 4 | export NODE_OPTIONS='--max-old-space-size=4096' 5 | ENV_MODE=$1 6 | 7 | # Prints an information block (aka header) 8 | function printInfoBlock() { 9 | LINES="\n========================================\n"; 10 | 11 | printf "$LINES"; 12 | printf "$1" 13 | printf "$LINES \n"; 14 | } 15 | 16 | START=$(date +%s) && \ 17 | \ 18 | printInfoBlock "Executing VITE build process" && \ 19 | npx vite build --mode "${ENV_MODE}" && \ 20 | \ 21 | # This has to be made outside vite as otherwise it breaks the js code, consumes tremendous amount of resources & time 22 | ## It can happen that obfuscated code will get slower 23 | printInfoBlock "Obfuscating code" && \ 24 | npx javascript-obfuscator dist --output=dist && \ 25 | \ 26 | # This allows some browsers to take the gzip version (smaller one) 27 | printInfoBlock "Compressing files" && \ 28 | gzip --keep dist/assets/*.js && \ 29 | \ 30 | \ 31 | END=$(date +%s) && \ 32 | RUNTIME=$(($END- $START)) && \ 33 | \ 34 | printInfoBlock "Script was running ${RUNTIME} second/s"; 35 | -------------------------------------------------------------------------------- /github/img/preview/interface-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/github/img/preview/interface-1.jpg -------------------------------------------------------------------------------- /github/img/preview/interface-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/github/img/preview/interface-2.jpg -------------------------------------------------------------------------------- /github/img/preview/interface-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/github/img/preview/interface-3.jpg -------------------------------------------------------------------------------- /github/img/preview/interface-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/github/img/preview/interface-4.jpg -------------------------------------------------------------------------------- /github/img/workflow-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/github/img/workflow-diagram.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Voltigo - bulk job searches and applications from multiple sources 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 18 |
19 | 20 | 21 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "@/*": ["./src/*"] 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /mock-npm-package.js: -------------------------------------------------------------------------------- 1 | // This is just an empty js file used when conditionally importing packages (having something work on DEV but not on PROD etc.) -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {} 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /prepare-prod.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Prints an information block (aka header) 4 | function printInfoBlock() { 5 | LINES="\n========================================\n"; 6 | 7 | printf "$LINES"; 8 | printf "$1" 9 | printf "$LINES \n"; 10 | } 11 | 12 | if [ ! -d "./dist" ]; then 13 | printInfoBlock "This might take a while (1-5 min. - depending on the hardware)..."; 14 | npm run build && printInfoBlock "FINISHED"; # The && is must, else for some reason the printing func breaks. 15 | fi; 16 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/favicon.ico -------------------------------------------------------------------------------- /public/fonts/fredoka-one/FredokaOne-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/fonts/fredoka-one/FredokaOne-Regular.ttf -------------------------------------------------------------------------------- /public/fonts/raleway/Raleway-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/fonts/raleway/Raleway-VariableFont_wght.ttf -------------------------------------------------------------------------------- /public/fonts/teko/Teko-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/fonts/teko/Teko-Regular.ttf -------------------------------------------------------------------------------- /public/image/easy-email/image-placeholder.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/easy-email/image-placeholder.jpg -------------------------------------------------------------------------------- /public/image/job-service/logo/1jeune1solution.gouv.fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/1jeune1solution.gouv.fr.png -------------------------------------------------------------------------------- /public/image/job-service/logo/absolventa.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/absolventa.de.png -------------------------------------------------------------------------------- /public/image/job-service/logo/adzuna.pl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/adzuna.pl.png -------------------------------------------------------------------------------- /public/image/job-service/logo/anzeigen.jobsintown.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/anzeigen.jobsintown.de.png -------------------------------------------------------------------------------- /public/image/job-service/logo/apec.fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/apec.fr.png -------------------------------------------------------------------------------- /public/image/job-service/logo/aplikuj.pl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/aplikuj.pl.png -------------------------------------------------------------------------------- /public/image/job-service/logo/appcast.io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/appcast.io.png -------------------------------------------------------------------------------- /public/image/job-service/logo/bankjob.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/bankjob.de.png -------------------------------------------------------------------------------- /public/image/job-service/logo/cadremploi.fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/cadremploi.fr.png -------------------------------------------------------------------------------- /public/image/job-service/logo/elempleo.com.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/elempleo.com.png -------------------------------------------------------------------------------- /public/image/job-service/logo/es.talent.com.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/es.talent.com.png -------------------------------------------------------------------------------- /public/image/job-service/logo/fachpraca.pl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/fachpraca.pl.png -------------------------------------------------------------------------------- /public/image/job-service/logo/goldenline.pl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/goldenline.pl.png -------------------------------------------------------------------------------- /public/image/job-service/logo/gowork.pl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/gowork.pl.png -------------------------------------------------------------------------------- /public/image/job-service/logo/hellowork.com.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/hellowork.com.png -------------------------------------------------------------------------------- /public/image/job-service/logo/indeed.com.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/indeed.com.png -------------------------------------------------------------------------------- /public/image/job-service/logo/infoempleo.com.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/infoempleo.com.png -------------------------------------------------------------------------------- /public/image/job-service/logo/infojobs.net.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/infojobs.net.png -------------------------------------------------------------------------------- /public/image/job-service/logo/infopraca.pl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/infopraca.pl.png -------------------------------------------------------------------------------- /public/image/job-service/logo/interviewme.pl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/interviewme.pl.png -------------------------------------------------------------------------------- /public/image/job-service/logo/jobb.blocket.se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/jobb.blocket.se.png -------------------------------------------------------------------------------- /public/image/job-service/logo/jobbguru.se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/jobbguru.se.png -------------------------------------------------------------------------------- /public/image/job-service/logo/jobbland.se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/jobbland.se.png -------------------------------------------------------------------------------- /public/image/job-service/logo/jobbsafari.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/jobbsafari.png -------------------------------------------------------------------------------- /public/image/job-service/logo/jobs.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/jobs.de.png -------------------------------------------------------------------------------- /public/image/job-service/logo/jobs.meinestadt.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/jobs.meinestadt.de.png -------------------------------------------------------------------------------- /public/image/job-service/logo/jobs.pl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/jobs.pl.png -------------------------------------------------------------------------------- /public/image/job-service/logo/jobware.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/jobware.de.png -------------------------------------------------------------------------------- /public/image/job-service/logo/karrierestart.no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/karrierestart.no.png -------------------------------------------------------------------------------- /public/image/job-service/logo/kimeta.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/kimeta.de.png -------------------------------------------------------------------------------- /public/image/job-service/logo/monster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/monster.png -------------------------------------------------------------------------------- /public/image/job-service/logo/not-found.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/not-found.png -------------------------------------------------------------------------------- /public/image/job-service/logo/praca.pl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/praca.pl.png -------------------------------------------------------------------------------- /public/image/job-service/logo/pracuj.pl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/pracuj.pl.png -------------------------------------------------------------------------------- /public/image/job-service/logo/stellenanzeigen.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/stellenanzeigen.de.png -------------------------------------------------------------------------------- /public/image/job-service/logo/stellenonline.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/stellenonline.de.png -------------------------------------------------------------------------------- /public/image/job-service/logo/stepstone.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/stepstone.de.png -------------------------------------------------------------------------------- /public/image/job-service/logo/talent.com.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/talent.com.png -------------------------------------------------------------------------------- /public/image/job-service/logo/thehub.io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/thehub.io.png -------------------------------------------------------------------------------- /public/image/job-service/logo/theprotocol.it.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/theprotocol.it.png -------------------------------------------------------------------------------- /public/image/job-service/logo/tideri.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/tideri.de.png -------------------------------------------------------------------------------- /public/image/job-service/logo/xing.com.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/job-service/logo/xing.com.png -------------------------------------------------------------------------------- /public/image/landing-pages/account-activate/activate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/landing-pages/account-activate/activate.png -------------------------------------------------------------------------------- /public/image/landing-pages/ban/ban.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/landing-pages/ban/ban.png -------------------------------------------------------------------------------- /public/image/landing-pages/change-email/change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/landing-pages/change-email/change.png -------------------------------------------------------------------------------- /public/image/landing-pages/password-reset/reset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/landing-pages/password-reset/reset.png -------------------------------------------------------------------------------- /public/image/system/dummy-avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/system/dummy-avatar.png -------------------------------------------------------------------------------- /public/image/system/gem/gem-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/system/gem/gem-128.png -------------------------------------------------------------------------------- /public/image/system/gem/gem-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/system/gem/gem-16.png -------------------------------------------------------------------------------- /public/image/system/gem/gem-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/system/gem/gem-24.png -------------------------------------------------------------------------------- /public/image/system/gem/gem-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/system/gem/gem-256.png -------------------------------------------------------------------------------- /public/image/system/gem/gem-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/system/gem/gem-32.png -------------------------------------------------------------------------------- /public/image/system/gem/gem-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/system/gem/gem-64.png -------------------------------------------------------------------------------- /public/image/system/no-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/public/image/system/no-image.png -------------------------------------------------------------------------------- /src/assets/fonts/Poppins/Poppins-devanagari.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/fonts/Poppins/Poppins-devanagari.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/Poppins/Poppins-latin-ext.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/fonts/Poppins/Poppins-latin-ext.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/Poppins/Poppins-latin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/fonts/Poppins/Poppins-latin.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/info-page/Now-Bold.42f8447.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/fonts/info-page/Now-Bold.42f8447.woff -------------------------------------------------------------------------------- /src/assets/fonts/info-page/Now-Bold.4fba4e2.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/fonts/info-page/Now-Bold.4fba4e2.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/info-page/Now-Regular.01092b0.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/fonts/info-page/Now-Regular.01092b0.woff -------------------------------------------------------------------------------- /src/assets/fonts/info-page/Now-Regular.cff7fbe.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/fonts/info-page/Now-Regular.cff7fbe.woff2 -------------------------------------------------------------------------------- /src/assets/img/email-builder/guide/Variables.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/email-builder/guide/Variables.gif -------------------------------------------------------------------------------- /src/assets/img/email-builder/guide/application-wizard-confirmation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/email-builder/guide/application-wizard-confirmation.png -------------------------------------------------------------------------------- /src/assets/img/email-builder/guide/application-wizard-template-pick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/email-builder/guide/application-wizard-template-pick.png -------------------------------------------------------------------------------- /src/assets/img/email-builder/guide/details.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/email-builder/guide/details.png -------------------------------------------------------------------------------- /src/assets/img/email-builder/guide/drag-components.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/email-builder/guide/drag-components.gif -------------------------------------------------------------------------------- /src/assets/img/email-builder/guide/drag-n-remove.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/email-builder/guide/drag-n-remove.gif -------------------------------------------------------------------------------- /src/assets/img/favicon/about.txt: -------------------------------------------------------------------------------- 1 | This favicon was generated using the following font: 2 | 3 | - Font Title: Jomhuria 4 | - Font Author: Copyright 2015 KB-Studio (www.k-b-studio.com|tarobish@gmail.com). Copyright 2015 Lasse Fister (lasse@graphicore.de). Copyright 2015 Sorkin Type Co (www.sorkintype.com). Copyright 2010-2015 Khaled Hosny (khaledhosny@eglug.org). 5 | - Font Source: http://fonts.gstatic.com/s/jomhuria/v18/Dxxp8j-TMXf-llKur2b1MOGbC3Dh.ttf 6 | - Font License: SIL Open Font License, 1.1 (http://scripts.sil.org/OFL)) 7 | -------------------------------------------------------------------------------- /src/assets/img/favicon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/favicon/android-chrome-192x192.png -------------------------------------------------------------------------------- /src/assets/img/favicon/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/favicon/android-chrome-512x512.png -------------------------------------------------------------------------------- /src/assets/img/favicon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/favicon/apple-touch-icon.png -------------------------------------------------------------------------------- /src/assets/img/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /src/assets/img/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /src/assets/img/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/favicon/favicon.ico -------------------------------------------------------------------------------- /src/assets/img/favicon/site.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} -------------------------------------------------------------------------------- /src/assets/img/info-page/gradient-wave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/info-page/gradient-wave.png -------------------------------------------------------------------------------- /src/assets/img/info-page/section/info/512.7302e24.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/info-page/section/info/512.7302e24.jpeg -------------------------------------------------------------------------------- /src/assets/img/info-page/section/info/about-us/508.f492d6a.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/info-page/section/info/about-us/508.f492d6a.jpeg -------------------------------------------------------------------------------- /src/assets/img/info-page/section/info/about-us/509.e5ff6e7.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/info-page/section/info/about-us/509.e5ff6e7.jpeg -------------------------------------------------------------------------------- /src/assets/img/info-page/section/info/about-us/product-owner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/info-page/section/info/about-us/product-owner.jpg -------------------------------------------------------------------------------- /src/assets/img/info-page/section/info/footer/footer-bg.78b07eb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/info-page/section/info/footer/footer-bg.78b07eb.png -------------------------------------------------------------------------------- /src/assets/img/info-page/section/info/footer/footer-two.0e57bdd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/info-page/section/info/footer/footer-two.0e57bdd.png -------------------------------------------------------------------------------- /src/assets/img/info-page/section/info/footer/footer.671c44f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/info-page/section/info/footer/footer.671c44f.png -------------------------------------------------------------------------------- /src/assets/img/info-page/section/info/info/carousel/carousel1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/info-page/section/info/info/carousel/carousel1.png -------------------------------------------------------------------------------- /src/assets/img/info-page/section/info/info/carousel/carousel2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/info-page/section/info/info/carousel/carousel2.png -------------------------------------------------------------------------------- /src/assets/img/info-page/section/info/info/carousel/carousel3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/info-page/section/info/info/carousel/carousel3.png -------------------------------------------------------------------------------- /src/assets/img/info-page/section/info/payment/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/info-page/section/info/payment/screen.png -------------------------------------------------------------------------------- /src/assets/img/info-page/section/info/what-we-dont-offer/24-7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/info-page/section/info/what-we-dont-offer/24-7.jpg -------------------------------------------------------------------------------- /src/assets/img/info-page/section/info/what-we-dont-offer/aggregation.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/info-page/section/info/what-we-dont-offer/aggregation.jpg -------------------------------------------------------------------------------- /src/assets/img/info-page/section/info/what-we-dont-offer/direct-contact.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/info-page/section/info/what-we-dont-offer/direct-contact.jpg -------------------------------------------------------------------------------- /src/assets/img/info-page/section/info/what-we-offer/bulk-applications.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/info-page/section/info/what-we-offer/bulk-applications.jpg -------------------------------------------------------------------------------- /src/assets/img/info-page/section/info/what-we-offer/email-builder.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/info-page/section/info/what-we-offer/email-builder.jpg -------------------------------------------------------------------------------- /src/assets/img/info-page/section/info/what-we-offer/offer-search.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/info-page/section/info/what-we-offer/offer-search.jpg -------------------------------------------------------------------------------- /src/assets/img/job-search/examples/france-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/job-search/examples/france-mobile.png -------------------------------------------------------------------------------- /src/assets/img/job-search/examples/poland-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/job-search/examples/poland-mobile.png -------------------------------------------------------------------------------- /src/assets/img/job-search/examples/spain-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/job-search/examples/spain-mobile.png -------------------------------------------------------------------------------- /src/assets/img/logo/pdf/logo-black.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/logo/pdf/logo-black.pdf -------------------------------------------------------------------------------- /src/assets/img/logo/pdf/logo-color.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/logo/pdf/logo-color.pdf -------------------------------------------------------------------------------- /src/assets/img/logo/pdf/logo-no-background.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/logo/pdf/logo-no-background.pdf -------------------------------------------------------------------------------- /src/assets/img/logo/pdf/logo-white.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/logo/pdf/logo-white.pdf -------------------------------------------------------------------------------- /src/assets/img/logo/png/logo-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/logo/png/logo-black.png -------------------------------------------------------------------------------- /src/assets/img/logo/png/logo-color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/logo/png/logo-color.png -------------------------------------------------------------------------------- /src/assets/img/logo/png/logo-no-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/logo/png/logo-no-background.png -------------------------------------------------------------------------------- /src/assets/img/logo/png/logo-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/logo/png/logo-white.png -------------------------------------------------------------------------------- /src/assets/img/wave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/img/wave.png -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/assets/logo.png -------------------------------------------------------------------------------- /src/assets/scss/animation.scss: -------------------------------------------------------------------------------- 1 | @keyframes blink { 2 | 0%, 3 | 50%, 4 | 100% { 5 | opacity: 1; 6 | } 7 | 25%, 8 | 75% { 9 | opacity: 0.6; 10 | } 11 | } -------------------------------------------------------------------------------- /src/assets/scss/colors.scss: -------------------------------------------------------------------------------- 1 | $orange500: rgba(255, 98, 0, 0.56); 2 | $orange700: rgba(255, 98, 0, 0.76); 3 | $orange900: rgb(255, 98, 0); 4 | 5 | .border-orange-500 { 6 | border-color: $orange500 !important; 7 | } 8 | 9 | .border-orange-700 { 10 | border-color: $orange700; 11 | } 12 | 13 | .border-orange-900 { 14 | border-color: $orange900; 15 | } 16 | 17 | .bg-orange-500 { 18 | background-color: $orange500; 19 | } 20 | 21 | .bg-orange-700 { 22 | background-color: $orange700; 23 | } 24 | 25 | .bg-orange-900 { 26 | background-color: $orange900; 27 | } 28 | 29 | .text-orange-500 { 30 | color: $orange500; 31 | } 32 | 33 | .text-orange-700 { 34 | color: $orange700; 35 | } 36 | 37 | .text-orange-900 { 38 | color: $orange900; 39 | } -------------------------------------------------------------------------------- /src/assets/scss/fonts/fredoka.scss: -------------------------------------------------------------------------------- 1 | // Used for example on 404 page 2 | @font-face { 3 | font-family: 'Fredoka One'; 4 | src: url('/public/fonts/fredoka-one/FredokaOne-Regular.ttf'); 5 | } -------------------------------------------------------------------------------- /src/assets/scss/fonts/raleway.scss: -------------------------------------------------------------------------------- 1 | // Used for example on 404 page 2 | @font-face { 3 | font-family: Raleway; 4 | src: url('/public/fonts/raleway/Raleway-VariableFont_wght.ttf'); 5 | } -------------------------------------------------------------------------------- /src/assets/scss/fonts/teko.scss: -------------------------------------------------------------------------------- 1 | // Used for example on 404 page 2 | @font-face { 3 | font-family: Teko; 4 | src: url('/public/fonts/teko/Teko-Regular.ttf'); 5 | } -------------------------------------------------------------------------------- /src/assets/scss/info-page/all.scss: -------------------------------------------------------------------------------- 1 | @import './bootstrap'; 2 | @import './page'; -------------------------------------------------------------------------------- /src/assets/scss/libs/n-progress.scss: -------------------------------------------------------------------------------- 1 | @import "../responsive.scss"; 2 | 3 | #nprogress .bar { 4 | height: 6px 5 | } 6 | 7 | @media screen and (min-width: $phoneBreakingPoint + 'px') { 8 | #nprogress .bar { 9 | height: 3px 10 | } 11 | } -------------------------------------------------------------------------------- /src/assets/scss/libs/tippy.js.scss: -------------------------------------------------------------------------------- 1 | @import 'tippy.js/dist/tippy.css'; 2 | @import 'tippy.js/themes/light-border.css'; 3 | -------------------------------------------------------------------------------- /src/assets/scss/libs/toast-notification.scss: -------------------------------------------------------------------------------- 1 | #toast-container { 2 | z-index: 999999999999999999999999999999999999999999 !important; 3 | } -------------------------------------------------------------------------------- /src/assets/scss/libs/v-tour.scss: -------------------------------------------------------------------------------- 1 | .v-tour { 2 | $blueColor: rgb(59, 130, 246) !important; 3 | $blueColorLight: rgb(96, 152, 244) !important; 4 | .v-step { 5 | background-color: $blueColorLight; 6 | } 7 | .v-step__header { 8 | background-color: $blueColor, 9 | } 10 | 11 | .v-step__arrow::before { 12 | background-color: $blueColor, 13 | } 14 | } -------------------------------------------------------------------------------- /src/assets/scss/normalization/form-inputs.scss: -------------------------------------------------------------------------------- 1 | input:not(.multiselect-search):not(.multiselect-tags-search):not([type=checkbox]):not([type=radio]), 2 | .floating-input div.multiselect { 3 | min-height: 54px; 4 | } 5 | -------------------------------------------------------------------------------- /src/assets/scss/responsive.scss: -------------------------------------------------------------------------------- 1 | // Whenever changing the px values then also change the values in `ResponsiveVarsMixin` 2 | $tabletBreakingPointPx: 767; 3 | $phoneBreakingPoint: 640; 4 | $largeScreenBreakingPoint: 1024; -------------------------------------------------------------------------------- /src/assets/scss/scrollbar.scss: -------------------------------------------------------------------------------- 1 | /** 2 | Based on https://codepen.io/GhostRider/pen/GHaFw 3 | */ 4 | *::-webkit-scrollbar-track { 5 | -webkit-box-shadow: inset 0 0 4px rgba(0,0,0,0.3); 6 | border-radius: 10px; 7 | background-color: #ffffff; 8 | } 9 | 10 | *::-webkit-scrollbar { 11 | display: block !important; 12 | width: 5px !important;; 13 | background-color: #F5F5F5; 14 | } 15 | 16 | *::-webkit-scrollbar-thumb { 17 | border-radius: 10px; 18 | -webkit-box-shadow: inset 0 0 6px rgba(61, 60, 60, 0.3); 19 | background-color: #939393; 20 | } 21 | -------------------------------------------------------------------------------- /src/assets/scss/text.scss: -------------------------------------------------------------------------------- 1 | .h1-blue { 2 | @apply opacity-100 transition transition-opacity duration-300 text-2xl text-blue-500 font-extrabold; 3 | } 4 | 5 | .disabled-text-link { 6 | @apply text-gray-400 line-through pointer-events-none 7 | } -------------------------------------------------------------------------------- /src/assets/tailwind.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | 3 | @tailwind components; 4 | 5 | @tailwind utilities; 6 | -------------------------------------------------------------------------------- /src/components/Dashboard/SmallDataDisplayBlock.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | -------------------------------------------------------------------------------- /src/components/Development/FooterBar/Buttons/BaseButton.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /src/components/Development/FooterBar/Buttons/SymfonyProfiler.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | -------------------------------------------------------------------------------- /src/components/Form/AsteriskRequired.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | -------------------------------------------------------------------------------- /src/components/Form/InputViolations.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | -------------------------------------------------------------------------------- /src/components/Global/Security/RoleProtectedComponent.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /src/components/Libs/CountryFlag/CountryFlag.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /src/components/Libs/Fontawesome.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | -------------------------------------------------------------------------------- /src/components/LoggedIn/JobOffer/Sidebar/FullInfo/CompanyDetail/CompanyIndustries.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | -------------------------------------------------------------------------------- /src/components/LoggedIn/JobOffer/Sidebar/FullInfo/TabSearch.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 28 | 29 | -------------------------------------------------------------------------------- /src/components/LoggedIn/Navigation/Footer/components/Copyright.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /src/components/LoggedIn/Navigation/Footer/components/GithubRepo.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 31 | -------------------------------------------------------------------------------- /src/components/LoggedIn/Navigation/Founds/FoundsStatus.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 29 | 30 | -------------------------------------------------------------------------------- /src/components/LoggedIn/Navigation/Founds/Modal/CurrencyPaymentSupportInfo.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /src/components/LoggedIn/Navigation/PageTitleSection.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /src/components/LoggedIn/Navigation/TopBarComponents/UserMenuComponents/SingleMenuElement.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | -------------------------------------------------------------------------------- /src/components/LoggedIn/Payment/Tool/Button/BaseButton.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /src/components/LoggedIn/Product/PointProduct/Components/Icon.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | -------------------------------------------------------------------------------- /src/components/LoggedIn/Product/PointProduct/Components/Name.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 30 | 31 | -------------------------------------------------------------------------------- /src/components/Navigation/Button/ButtonRounded.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | -------------------------------------------------------------------------------- /src/components/Navigation/CircleMenu/MenuElement.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/Navigation/Hamburger.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | -------------------------------------------------------------------------------- /src/components/Navigation/SearchInput.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | -------------------------------------------------------------------------------- /src/components/Navigation/Steps/Steps.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /src/components/Notification/mixins/NotificationContentMixin.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/Page/AboutAccordion.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | -------------------------------------------------------------------------------- /src/components/Page/NoResultsText.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | -------------------------------------------------------------------------------- /src/components/Ui/Accordion/Panel.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 43 | 44 | -------------------------------------------------------------------------------- /src/components/Ui/Badge/Badge.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /src/components/Ui/Containers/Container.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /src/components/Ui/Icons/Svg/Cog.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | -------------------------------------------------------------------------------- /src/components/Ui/Icons/Svg/DoubleArrowLeft.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | -------------------------------------------------------------------------------- /src/components/Ui/Icons/Svg/DoubleArrowRight.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | -------------------------------------------------------------------------------- /src/components/Ui/Icons/Svg/Logout.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /src/components/Ui/Icons/Svg/Person.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/Ui/Icons/UnicodeArrow.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /src/components/Ui/Lightbox/Lightbox.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 47 | -------------------------------------------------------------------------------- /src/components/Ui/List/NumericList.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 30 | 31 | -------------------------------------------------------------------------------- /src/components/Ui/Navigation/QuickTopBottom/FixedGoToBottom.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | -------------------------------------------------------------------------------- /src/components/Ui/Navigation/QuickTopBottom/FixedGoToTop.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 40 | -------------------------------------------------------------------------------- /src/components/Ui/Navigation/QuickTopBottom/FixedTopBottom.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 19 | 20 | -------------------------------------------------------------------------------- /src/components/Ui/QuestionMarkAbout.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 27 | 28 | -------------------------------------------------------------------------------- /src/components/Ui/Timeline/SimpleDotted/Element.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 45 | 46 | -------------------------------------------------------------------------------- /src/components/Ui/Timeline/SimpleDotted/Timeline.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /src/components/Ui/Upload/Component/mixin/UploadStatusMixin.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/config/dev/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/config/dev/.gitignore -------------------------------------------------------------------------------- /src/config/dev/encryption.json: -------------------------------------------------------------------------------- 1 | { 2 | "jsencrypt": { 3 | "publicKey": "-----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAngwxrMPCzqqwcUXFcGNz8hWm+aApYO3pd1jpDKysRHOycL2KSjBZPG4Fhv+fWgZfG4BnY4QNembvq49Wz0qNw0SuSVSJ82CCSeNbNyvXROWerJW1iYhtWkHTWticlPB4xngTEP7Re65DibSTs/bQPcWGzquqQ6zQ3q4/u/1SkxfDovySr2QVFbBwjNtFwgsaUYPO2lPlbnbkR7fvSz1pRJlXNnKh4XerVFcTIs1RMoJe07pAM39fuHVeoZBWPXNpevd7ESRPRJtD4ltw4D6liEQo+sEreTuMos8PaEJREEar3Rcig5v5RjehI62zrZ4BK2bYvjRq+SnRPeZFwqNzWYm1/ngiMAlLR/k0+W4wzUGGfiPscdqbp5VRk0IGh8Qakw+a0/+3UQfE+NIAEuhKfNzutEXnFapccA13d2r371pGkkFcObVJCHBsVkTXFk7SVrwg3w8gu0dOfJAY9l0Vzr4nNXvT7OllCK+VJnIFPYDdPnSJXifijMytKd14fgXZrJ2Q7WS7a3OL2OeeDeB1PKv6OtEOcVwGxk+pkRRUVWqi2VpLqOLE3tnUPr4oWj/g2oqH3LdKrM4KgXn7+YQps2Wlvk41FUvpu99CjSvonG2lxpxMgWf2/IVaCCXGmr5WlznG2VDMUYyqc7KKK3aM5TZklpXU6c4GTlOR1aBZqr0CAwEAAQ== -----END PUBLIC KEY-----" 4 | } 5 | } -------------------------------------------------------------------------------- /src/config/dev/jwt.json: -------------------------------------------------------------------------------- 1 | { 2 | "publicSecretKey": "-----BEGIN PUBLIC KEY-----MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlpHC6S4QyNrZvcpAccxiTVGmEaGy2GOlyWxJUs8YYfAcVxX/bOj+Y1jxUViO9GpQtnVrpUMvtVx2f6fFtnZjm4iidxe3dsvh+woigcjb8IyujKLF4pHWHAy6mLfwPnaQryZ0lOLC5vJfgTuNZvVUwAVlcsXgnJobbKtwyP3WOnPWYH3ssdjnXq21VrPuiZiB+c9cU3zjq2v2BSk/L0V8LCQ/P6UstpgGvdVt0oqMNHtLngoXa36dacy9QNSTgtY8LG5urN4dsl5F1U1xBl+mQkgLHxutCwF9JuS2mWg93ojUMm17ikCMEAPItbCKtcUZFBWk2bSvu3hu04UutbHK1N9lrwaDLtlLIRY+P+ScIyjX9WbyA9wc2k8fuSq+47DVWs2HEDzcFeFagnTrqvSSMd3FNG5L8yM5fJLJ3N1w3sOxPr9lksZbWI/Uv5r8kS/PuAC/EeVRF4chqOd7idYrZpLpAIvwGpk0x8Smezbx/iTeYj6wnnDIeiwFofpt2C9BGfdSrMWVuCMvnwQ5l958py5QDR7noTYSZaT25GzBILzxdCY3d462hFmES7swjDhnDJ5E8zduqAaUDv5LccOq4/XJrj7a8XXktimg36/CNhCrYK6Nxa0XgJAEMolW2GgypuTsnQoh/l4ihFrtN5A7P6ZyytkeqpWzjoBE4Ss4E0UCAwEAAQ==-----END PUBLIC KEY-----" 3 | } -------------------------------------------------------------------------------- /src/config/global.json: -------------------------------------------------------------------------------- 1 | { 2 | "directories": { 3 | "translations": "translations" 4 | } 5 | } -------------------------------------------------------------------------------- /src/config/globalThis.json: -------------------------------------------------------------------------------- 1 | { 2 | "info": "This file exists only to prevent build process from failing. Dunno how to solve it any other way." 3 | } -------------------------------------------------------------------------------- /src/config/prod/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/config/prod/.gitignore -------------------------------------------------------------------------------- /src/config/prod/encryption.json: -------------------------------------------------------------------------------- 1 | { 2 | "jsencrypt": { 3 | "publicKey": "-----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAngwxrMPCzqqwcUXFcGNz8hWm+aApYO3pd1jpDKysRHOycL2KSjBZPG4Fhv+fWgZfG4BnY4QNembvq49Wz0qNw0SuSVSJ82CCSeNbNyvXROWerJW1iYhtWkHTWticlPB4xngTEP7Re65DibSTs/bQPcWGzquqQ6zQ3q4/u/1SkxfDovySr2QVFbBwjNtFwgsaUYPO2lPlbnbkR7fvSz1pRJlXNnKh4XerVFcTIs1RMoJe07pAM39fuHVeoZBWPXNpevd7ESRPRJtD4ltw4D6liEQo+sEreTuMos8PaEJREEar3Rcig5v5RjehI62zrZ4BK2bYvjRq+SnRPeZFwqNzWYm1/ngiMAlLR/k0+W4wzUGGfiPscdqbp5VRk0IGh8Qakw+a0/+3UQfE+NIAEuhKfNzutEXnFapccA13d2r371pGkkFcObVJCHBsVkTXFk7SVrwg3w8gu0dOfJAY9l0Vzr4nNXvT7OllCK+VJnIFPYDdPnSJXifijMytKd14fgXZrJ2Q7WS7a3OL2OeeDeB1PKv6OtEOcVwGxk+pkRRUVWqi2VpLqOLE3tnUPr4oWj/g2oqH3LdKrM4KgXn7+YQps2Wlvk41FUvpu99CjSvonG2lxpxMgWf2/IVaCCXGmr5WlznG2VDMUYyqc7KKK3aM5TZklpXU6c4GTlOR1aBZqr0CAwEAAQ== -----END PUBLIC KEY-----" 4 | } 5 | } -------------------------------------------------------------------------------- /src/config/prod/jwt.json: -------------------------------------------------------------------------------- 1 | { 2 | "publicSecretKey": "-----BEGIN PUBLIC KEY-----MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlpHC6S4QyNrZvcpAccxiTVGmEaGy2GOlyWxJUs8YYfAcVxX/bOj+Y1jxUViO9GpQtnVrpUMvtVx2f6fFtnZjm4iidxe3dsvh+woigcjb8IyujKLF4pHWHAy6mLfwPnaQryZ0lOLC5vJfgTuNZvVUwAVlcsXgnJobbKtwyP3WOnPWYH3ssdjnXq21VrPuiZiB+c9cU3zjq2v2BSk/L0V8LCQ/P6UstpgGvdVt0oqMNHtLngoXa36dacy9QNSTgtY8LG5urN4dsl5F1U1xBl+mQkgLHxutCwF9JuS2mWg93ojUMm17ikCMEAPItbCKtcUZFBWk2bSvu3hu04UutbHK1N9lrwaDLtlLIRY+P+ScIyjX9WbyA9wc2k8fuSq+47DVWs2HEDzcFeFagnTrqvSSMd3FNG5L8yM5fJLJ3N1w3sOxPr9lksZbWI/Uv5r8kS/PuAC/EeVRF4chqOd7idYrZpLpAIvwGpk0x8Smezbx/iTeYj6wnnDIeiwFofpt2C9BGfdSrMWVuCMvnwQ5l958py5QDR7noTYSZaT25GzBILzxdCY3d462hFmES7swjDhnDJ5E8zduqAaUDv5LccOq4/XJrj7a8XXktimg36/CNhCrYK6Nxa0XgJAEMolW2GgypuTsnQoh/l4ihFrtN5A7P6ZyytkeqpWzjoBE4Ss4E0UCAwEAAQ==-----END PUBLIC KEY-----" 3 | } -------------------------------------------------------------------------------- /src/mixins/Awarness/DemoAwareMixin.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/mixins/Awarness/SymfonyProfilerAwareMixin.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/mixins/Responsive/ResponsiveModalSizeMixin.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/mixins/System/PasswordConstraintsMixin.vue: -------------------------------------------------------------------------------- 1 | 22 | -------------------------------------------------------------------------------- /src/mixins/System/PublicFolderAccessTokenMixin.vue: -------------------------------------------------------------------------------- 1 | 22 | -------------------------------------------------------------------------------- /src/mixins/System/SystemStateMixin.vue: -------------------------------------------------------------------------------- 1 | 22 | -------------------------------------------------------------------------------- /src/router/SymfonyRoutes/SymfonyDashboardRoutes.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description Contains logic related to Dashboard (aka. Home) routes 3 | */ 4 | export default class SymfonyDashboardRoutes 5 | { 6 | public static readonly URL_GET_DASHBOARD_DATA = "/dashboard/get-data"; 7 | } -------------------------------------------------------------------------------- /src/router/SymfonyRoutes/SymfonyInvoiceRoutes.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description Contains logic related to invoices 3 | */ 4 | export default class SymfonyInvoiceRoutes 5 | { 6 | /** 7 | * @description handles getting the invoice pdf file path 8 | */ 9 | static readonly GET_INVOICE_PDF_PATH_IN_PUBLIC = "/invoice/get/:id"; 10 | static readonly GET_INVOICE_PDF_PATH_IN_PUBLIC_PARAM_ID = "id"; 11 | 12 | } -------------------------------------------------------------------------------- /src/router/SymfonyRoutes/SymfonyJobServicesRoutes.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description routes related to handling / getting data about job services themselves 3 | */ 4 | export default class SymfonyJobServicesRoutes 5 | { 6 | /** 7 | * @description will return country names for which job offers can be searched for 8 | */ 9 | static readonly URL_GET_SUPPORTED_COUNTRY_NAMES = "/job-services/get-supported-country-names"; 10 | } -------------------------------------------------------------------------------- /src/router/SymfonyRoutes/SymfonyOrderRoutes.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description Contains logic related to orders 3 | */ 4 | export default class SymfonyOrderRoutes 5 | { 6 | /** 7 | * @description handles getting all the orders that user made 8 | */ 9 | static readonly GET_ORDERS = "/orders/get-all"; 10 | 11 | } -------------------------------------------------------------------------------- /src/router/SymfonyRoutes/SymfonyPointShopRoutes.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description Contains logic related to Point shop routes 3 | */ 4 | export default class SymfonyPointShopRoutes 5 | { 6 | /** 7 | * @description returns all existing job search based {@see PointShopProduct} 8 | */ 9 | static readonly GET_JOB_SEARCH_PRODUCTS = "/point-shop/job-offer-search/all" 10 | 11 | /** 12 | * @description returns email sending based {@see PointShopProduct} 13 | */ 14 | static readonly GET_EMAIL_SENDING_PRODUCT = "/point-shop/email-sending"; 15 | 16 | /** 17 | * @description returns all the {@see UserPointHistory} for logged-in user 18 | */ 19 | static readonly GET_ALL_POINT_SHOP_HISTORY_ENTRIES = "/point-shop/history/get-all"; 20 | 21 | } -------------------------------------------------------------------------------- /src/router/SymfonyRoutes/SymfonyPointsRoutes.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description Contains logic related to any kind of direct manipulation of user points 3 | * - no ordering process, 4 | * - no transactions handling etc. 5 | */ 6 | export default class SymfonyPointsRoutes 7 | { 8 | /** 9 | * @description grants user points based on provided product 10 | */ 11 | static readonly GRANT_POINTS_BY_PRODUCT = "/user-point/grant/:id" 12 | static readonly GRANT_POINTS_BY_PRODUCT_PARAM_ID = "id" 13 | 14 | } -------------------------------------------------------------------------------- /src/router/SymfonyRoutes/SymfonyProductRoutes.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description Contains logic related to products 3 | */ 4 | export default class SymfonyProductRoutes 5 | { 6 | /** 7 | * @description handles getting all the point products 8 | */ 9 | static readonly GET_ALL_AVAILABLE_POINT_PRODUCTS = "/product/get-all/point"; 10 | 11 | } -------------------------------------------------------------------------------- /src/router/SymfonyRoutes/User/Regulation/SymfonyUserRegulationsRoutes.ts: -------------------------------------------------------------------------------- 1 | enum REGULATION_IDENTIFIER { 2 | EMAIL_BUILDER_GENERAL_USAGE, 3 | PLATFORM_TERMS_OF_USAGE, 4 | } 5 | 6 | /** 7 | * @description contains routes related to user regulations 8 | */ 9 | export default class SymfonyUserRegulationsRoutes 10 | { 11 | /** 12 | * @description check if user accepted give regulation 13 | */ 14 | static readonly URL_IS_REGULATION_ACCEPTED = "/user-regulation/check-is-accepted/:regulationIdentifier"; 15 | 16 | /** 17 | * @description accepts given regulation for user 18 | */ 19 | static readonly URL_ACCEPT_REGULATION = "/user-regulation/accept/:regulationIdentifier/:hash"; 20 | 21 | static readonly PARAM_REGULATION_IDENTIFIER = "regulationIdentifier"; 22 | static readonly PARAM_HASH = "hash"; 23 | } 24 | 25 | export {REGULATION_IDENTIFIER}; -------------------------------------------------------------------------------- /src/router/VueRouterAccessControl.ts: -------------------------------------------------------------------------------- 1 | import {RouteRecordRaw} from "vue-router"; 2 | import {Component} from "vue"; 3 | 4 | /** 5 | * @description logic related to the control of the access to the page or resources 6 | */ 7 | export default class VueRouterAccessControl { 8 | 9 | static readonly ROUTE_NAME_USER_SECURITY = "BannedAccess"; 10 | static readonly ROUTE_PATH_BANNED_BASE = "/banned/access-denied"; 11 | static readonly ROUTE_PATH_BANNED_HASH = "/:hash"; 12 | static readonly ROUTE_PATH_BANNED_FULL = VueRouterAccessControl.ROUTE_PATH_BANNED_BASE + VueRouterAccessControl.ROUTE_PATH_BANNED_HASH; 13 | 14 | public static readonly routesConfiguration: Array = [ 15 | { 16 | path: VueRouterAccessControl.ROUTE_PATH_BANNED_FULL, 17 | name: VueRouterAccessControl.ROUTE_NAME_USER_SECURITY, 18 | component: (): Promise => import("@/views/Ban/Ban.vue"), 19 | }, 20 | ] 21 | } -------------------------------------------------------------------------------- /src/scripts/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/scripts/.gitignore -------------------------------------------------------------------------------- /src/scripts/Core/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/scripts/Core/.gitignore -------------------------------------------------------------------------------- /src/scripts/Core/BuildService.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description provides some building process logic 3 | */ 4 | export default class { 5 | 6 | /** 7 | * @description registers globals need for the project to work 8 | */ 9 | public static registerGlobals(): void { 10 | global.Uint8Array = Uint8Array 11 | } 12 | } -------------------------------------------------------------------------------- /src/scripts/Core/Error/BaseError.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description this is a base error class to extend from 3 | * The `data` is not handled right now - no idea how to stack all bubbled calls to one data string 4 | */ 5 | export default class BaseError extends Error { 6 | 7 | /** 8 | * @param message 9 | * @param data 10 | */ 11 | public constructor(message: string, data: Record | Array = {}) { // eslint-disable-line @typescript-eslint/no-unused-vars 12 | super(message); 13 | } 14 | 15 | } -------------------------------------------------------------------------------- /src/scripts/Core/Error/NonLoggableBaseError.ts: -------------------------------------------------------------------------------- 1 | import BaseError from "@/scripts/Core/Error/BaseError"; 2 | 3 | /** 4 | * @description this is basically a base error but it indicates that nothing should / will be logged once this 5 | * error happens 6 | */ 7 | export default class NonLoggableBaseError extends BaseError { 8 | 9 | } -------------------------------------------------------------------------------- /src/scripts/Core/Interfaces/AppAxiosInterface.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AxiosPostDataBag, 3 | BaseApiResponsePromise 4 | } from "@/scripts/Core/Types/Request/AxiosTypes"; 5 | 6 | /** 7 | * @description axios app plugin interface 8 | */ 9 | export interface AppAxiosInterface 10 | { 11 | /** 12 | * @description makes the backend post call but first fetches the csrf for further submission 13 | */ 14 | postWithCsrf(calledUrl: string, dataBag?: AxiosPostDataBag, doEncryptData?: boolean, nonEncryptedDataBag?: AxiosPostDataBag, castedDto?): BaseApiResponsePromise; 15 | 16 | /** 17 | * @description makes the backed get call but first fetches the csrf for further submission 18 | */ 19 | getWithCsrf(calledUrl: string, castedDto?): BaseApiResponsePromise; 20 | 21 | /** 22 | * @description makes backend axios call for CSRF token 23 | */ 24 | callForCsrf(csrfTokenId: string | number): Promise; 25 | 26 | /** 27 | * @description makes call for data but without any dto casting, csrf fetching, this is just plain `get` method 28 | */ 29 | getRaw(calledUrl: string): Promise; 30 | } -------------------------------------------------------------------------------- /src/scripts/Core/Listeners/Interfaces/ListenerInterface.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description an listener defining base structure of the event listeners 3 | */ 4 | export default interface ListenerInterface 5 | { 6 | /** 7 | * @description start listening for the event 8 | */ 9 | startListening(): void; 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/scripts/Core/Security/SymfonyRolesAndRights.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description this class contains the symfony based roles / rights (these are provided in the jwt tokens) 3 | */ 4 | export default class SymfonyRolesAndRights { 5 | public static readonly ROLE_ADMIN :string = "ROLE_ADMIN"; 6 | public static readonly ROLE_USER :string = "ROLE_USER"; 7 | public static readonly ROLE_DEVELOPER :string = "ROLE_DEVELOPER"; 8 | public static readonly ROLE_DEBUGGER :string = "ROLE_DEBUGGER"; 9 | 10 | public static readonly RIGHT_PUBLIC_FOLDER_ACCESS :string = "RIGHT_PUBLIC_FOLDER_ACCESS"; 11 | } -------------------------------------------------------------------------------- /src/scripts/Core/Services/ConfigLoader/ConfigLoader.ts: -------------------------------------------------------------------------------- 1 | import {ConfigLoaderEncryption, ConfigLoaderGeneral, ConfigLoaderJwt} from "@/scripts/Core/Types/ConfigLoader"; 2 | 3 | /** 4 | * @description loads the project configuration 5 | */ 6 | export default class ConfigLoader 7 | { 8 | static readonly jwt: ConfigLoaderJwt; 9 | static readonly encryption: ConfigLoaderEncryption; 10 | static readonly general: ConfigLoaderGeneral; 11 | } -------------------------------------------------------------------------------- /src/scripts/Core/Services/Crypto/Md5Service.ts: -------------------------------------------------------------------------------- 1 | import {Md5} from "ts-md5"; 2 | 3 | /** 4 | * @description relies on {@link https://www.npmjs.com/package/ts-md5} 5 | */ 6 | export default class Md5Service { 7 | /** 8 | * @description will hash the string 9 | */ 10 | public static hash(hashedString: string): string { 11 | return Md5.hashStr(hashedString); 12 | } 13 | } -------------------------------------------------------------------------------- /src/scripts/Core/Services/Crypto/RandomGeneratorService.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description handles generating random values 3 | */ 4 | export default class RandomGeneratorService { 5 | 6 | /** 7 | * @link https://stackoverflow.com/questions/1527803/generating-random-whole-numbers-in-javascript-in-a-specific-range 8 | * 9 | * Returns a random integer between min (inclusive) and max (inclusive). 10 | * The value is no lower than min (or the next integer greater than min 11 | * if min isn't an integer) and no greater than max (or the next integer 12 | * lower than max if max isn't an integer). 13 | * Using Math.round() will give you a non-uniform distribution! 14 | */ 15 | public static getRandomInt(min, max) { 16 | min = Math.ceil(min); 17 | max = Math.floor(max); 18 | return Math.floor(Math.random() * (max - min + 1)) + min; 19 | } 20 | 21 | } -------------------------------------------------------------------------------- /src/scripts/Core/Services/Dispatcher/EventDispatcherLoggedUserService.ts: -------------------------------------------------------------------------------- 1 | import EventEmitterService from "@/scripts/Core/Services/Dispatcher/EventEmitterService"; 2 | 3 | /** 4 | * @description this service handles dispatching events. 5 | * can be used to dispatch events in vue components and can be used to dispatch events from within TS onto the VUE elements 6 | * (this is not recommended for small components etc. but can works just fine) 7 | * 8 | * Event's cannot be emitted directly on `router-view` as this element is sometimes gone from DOM 9 | * These events in here are available only for logged-in users 10 | */ 11 | export default class EventDispatcherLoggedUserService extends EventEmitterService 12 | { 13 | static readonly TYPESCRIPT_LOGGED_USER_DISPATCHER_LISTENER_DOM_ID = "loggedUserDispatcherListener" 14 | 15 | static readonly ALL_SUPPORTED_EVENTS = [] 16 | } -------------------------------------------------------------------------------- /src/scripts/Core/Services/DomService.ts: -------------------------------------------------------------------------------- 1 | import WindowService from "@/scripts/Core/Services/WindowService"; 2 | 3 | /** 4 | * @description provides dom related logic 5 | */ 6 | export default class DomService { 7 | 8 | /** 9 | * @description will go to target section 10 | */ 11 | public static goToSection(clickedElement: HTMLElement | null, scrollOffset = 0): void { 12 | if (!clickedElement) { 13 | throw Error("Clicked element does not exist?!"); 14 | } 15 | 16 | if (!clickedElement.hasAttribute('data-target-selector')) { 17 | throw Error("This element has no data-target-selector defined"); 18 | } 19 | 20 | let targetSelector = clickedElement.getAttribute('data-target-selector') as string; 21 | let targetElement = document.querySelector(targetSelector) as HTMLElement | null; 22 | if (!targetElement) { 23 | new Error("No element was found for selector: " + targetSelector) 24 | } 25 | 26 | WindowService.scrollTo(targetSelector, scrollOffset) 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /src/scripts/Core/Services/EventListenerService.ts: -------------------------------------------------------------------------------- 1 | import UserActivityListener from "@/scripts/Core/Listeners/UserActivityListener"; 2 | import ErrorListener from "@/scripts/Core/Listeners/ErrorListener"; 3 | import RejectedPromiseErrorListener from "@/scripts/Core/Listeners/RejectedPromiseErrorListener"; 4 | 5 | import ListenerInterface from "@/scripts/Core/Listeners/Interfaces/ListenerInterface"; 6 | 7 | /** 8 | * @description handles the event listeners logic 9 | */ 10 | export default class EventListenerService 11 | { 12 | /** 13 | * @description will register all event listeners 14 | */ 15 | public registerListeners(): void 16 | { 17 | let listeners = [ 18 | new ErrorListener(), 19 | new RejectedPromiseErrorListener(), 20 | new UserActivityListener() 21 | ] as Array; 22 | 23 | for(let listener of listeners){ 24 | listener.startListening(); 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /src/scripts/Core/Services/External/GoogleSearchService.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description handles google search based logic 3 | */ 4 | export default class GoogleSearchService { 5 | 6 | private static readonly COM_BASE = 'https://www.google.com/'; 7 | private static readonly SEARCH_URI = "search" 8 | private static readonly QUERY_PARAM = "q"; 9 | 10 | /** 11 | * @description will build to the Google search page with given query 12 | */ 13 | public static buildSearchLink(query: string): string { 14 | let encodedQuery = encodeURIComponent(query); 15 | let url = GoogleSearchService.COM_BASE 16 | + GoogleSearchService.SEARCH_URI 17 | + "?" 18 | + GoogleSearchService.QUERY_PARAM 19 | + `=${encodedQuery}` 20 | return url; 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /src/scripts/Core/Services/External/ShieldsIoService.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description builds links to badges from: 3 | * - {@link https://shields.io/} 4 | * Guides / Information: 5 | * - {@link https://javascript.plainenglish.io/how-to-make-custom-language-badges-for-your-profile-using-shields-io-d2aeaf016b6b} 6 | */ 7 | export default class ShieldsIoService { 8 | 9 | private static readonly BASE_URL = "https://img.shields.io/badge/"; 10 | 11 | /** 12 | * @description returns the badge url 13 | */ 14 | public static getBadgeUrl( 15 | text: string, 16 | backgroundColor: string, 17 | logoColor: string, // only if using shields.io based logo (it provides variety of logos but ofc not for all pages / brands) 18 | logoBase64: string, 19 | style = 'for-the-badge' 20 | ): string { 21 | return `${ShieldsIoService.BASE_URL}-${text}-${backgroundColor}?style=${style}&logoColor=${logoColor}&logo=${logoBase64}`; 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /src/scripts/Core/Services/Generator/UniqidService.ts: -------------------------------------------------------------------------------- 1 | import uniqid from 'uniqid'; 2 | 3 | export default class UniqidService { 4 | public static generate(): string { 5 | return uniqid(); 6 | } 7 | } -------------------------------------------------------------------------------- /src/scripts/Core/Services/Math/MathService.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description provides mathematical calculations based logic 3 | */ 4 | export default class MathService { 5 | 6 | /** 7 | * @description will round the provided value to X places 8 | */ 9 | public static round(value: number, decimals: number) { 10 | // @ts-ignore (sadly it has to be done this way) 11 | return Number(Math.round(value + 'e' + decimals) + 'e-' + decimals); 12 | } 13 | } -------------------------------------------------------------------------------- /src/scripts/Core/Services/Parser/TextParser.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @default handles parsing the text 3 | */ 4 | export default class TextParser { 5 | 6 | /** 7 | * @description will remove html tags from text leaving only what's between them (or outside them) 8 | */ 9 | public static stripHtmlTags(text: string): string 10 | { 11 | return text.replace(/<[^>]*>?/gm, ''); 12 | } 13 | } -------------------------------------------------------------------------------- /src/scripts/Core/Services/Promise/PromiseService.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description service for handling some special cases of promises 3 | */ 4 | export default class PromiseService { 5 | 6 | /** 7 | * @description will create a Promise which will periodically call provided function, 8 | * provided function MUST return true in order to resolve. 9 | * 10 | * Not checking the runtime, if it's stuck etc., because promise can keep running on some 11 | * page and waiting for user to click, if user never clicks then it's just pending. 12 | */ 13 | public static buildPeriodicallyCheckedPromise($function: CallableFunction): Promise { 14 | return new Promise( (resolve) => { 15 | let interval = setInterval(() => { 16 | if ($function()) { // because reactivity is not triggering resolving in here 17 | resolve(true); 18 | clearInterval(interval); 19 | } 20 | }, 100) 21 | }) 22 | } 23 | } -------------------------------------------------------------------------------- /src/scripts/Core/Services/PublicFolder/PublicFolderService.ts: -------------------------------------------------------------------------------- 1 | import LocalStorageService from "@/scripts/Core/Services/Storage/LocalStorageService"; 2 | 3 | /** 4 | * @description handles logic related to public folder data access 5 | */ 6 | export default class PublicFolderService { 7 | 8 | private static readonly TOKEN = "token"; 9 | 10 | /** 11 | * @description Will add the jwt token to the public file path, these require the token to be present in query because the files 12 | * such should be handled natively by browser, otherwise would make the ajax calls and then handle a bunch of rules, 13 | * like for example saving binary file etc. 14 | */ 15 | public static buildPathWithToken(filePath: string): string 16 | { 17 | return `${filePath}?${PublicFolderService.TOKEN}=${LocalStorageService.get(LocalStorageService.PUBLIC_FOLDER_AUTHENTICATION_TOKEN)}`; 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /src/scripts/Core/Services/Storage/DevelopmentLocalStorageService.ts: -------------------------------------------------------------------------------- 1 | import StringTypeProcessor from "@/scripts/Core/Services/TypesProcessors/StringTypeProcessor"; 2 | import LocalStorageService from "@/scripts/Core/Services/Storage/LocalStorageService"; 3 | 4 | /** 5 | * Same as {@see LocalStorageService} but development related things 6 | */ 7 | export default class DevelopmentLocalStorageService { 8 | /** 9 | * @description check if the developer footer bar is pinned or not 10 | */ 11 | static readonly IS_DEVELOPER_FOOTER_BAR_PINNED = "isDeveloperFooterBarPinned"; 12 | 13 | /** 14 | * @description check if developer footer bar is visible or not 15 | */ 16 | public static isDeveloperFooterBarPinned(): boolean { 17 | let visibilityState = LocalStorageService.get(DevelopmentLocalStorageService.IS_DEVELOPER_FOOTER_BAR_PINNED); 18 | if (StringTypeProcessor.isEmptyString(visibilityState)) { 19 | return false; 20 | } 21 | 22 | let isVisible = (visibilityState === "1"); 23 | 24 | return isVisible; 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/scripts/Core/Services/TimerService.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description handles any kind of delays, schedulers, etc. 3 | */ 4 | export default class TimerService 5 | { 6 | /** 7 | * @description will wait X ms 8 | * @note call this method with `await` in front 9 | * @param ms 10 | * @param doReject 11 | */ 12 | public static asyncSleep(ms: number, doReject = false): Promise { 13 | return new Promise((resolve, reject) => { 14 | setTimeout( () => { 15 | if (doReject) { 16 | reject(); 17 | } 18 | 19 | resolve(true); 20 | }, ms); 21 | }); 22 | } 23 | 24 | /** 25 | * @description standard timeout based sleep, added to avoid setting the comment all the time 26 | */ 27 | public static sleep(ms: number): void { 28 | setTimeout( () => { 29 | // 30 | }, ms); 31 | } 32 | } -------------------------------------------------------------------------------- /src/scripts/Core/Services/TypesProcessors/BoolTypeProcessor.ts: -------------------------------------------------------------------------------- 1 | import BaseError from "@/scripts/Core/Error/BaseError"; 2 | 3 | /** 4 | * @description will handle logic related to boolean value 5 | */ 6 | export default class BoolTypeProcessor 7 | { 8 | 9 | /** 10 | * @description return bool representation of string bool 11 | */ 12 | public static boolStringToRealBool(value: string | boolean): boolean 13 | { 14 | if("boolean" === typeof value){ 15 | return value; 16 | } 17 | 18 | if("true" == value || "1" == value){ 19 | return true; 20 | }else if("false" == value || "0" === value){ 21 | return false; 22 | } 23 | 24 | throw new BaseError("Not a valid `bool` string: " + value); 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /src/scripts/Core/Services/TypesProcessors/DateTimeProcessor.ts: -------------------------------------------------------------------------------- 1 | import moment from "moment"; 2 | 3 | /** 4 | * @description handles date / time - not just the standard DateTime but also moment.js 5 | */ 6 | export default class DateTimeProcessor { 7 | 8 | /** 9 | * @description takes the comparedDate and compares it with today-date, returns days difference 10 | */ 11 | public static getDaysAgo(comparedDate: string): number { 12 | let now = moment(); 13 | let postedMoment = moment(comparedDate); 14 | return now.diff(postedMoment, 'days'); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/scripts/Core/Services/TypesProcessors/NumberTypeProcessor.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description handles working with number type 3 | */ 4 | export default class NumberTypeProcessor { 5 | 6 | /** 7 | * @description check if number is int 8 | */ 9 | public static isInt(number){ 10 | return Number(number) === number && number % 1 === 0; 11 | } 12 | 13 | /** 14 | * @description check if number is float 15 | */ 16 | public static isFloat(number) { 17 | return Number(number) === number && number % 1 !== 0; 18 | } 19 | } -------------------------------------------------------------------------------- /src/scripts/Core/Services/Websocket/Handler/WebsocketHandlerInterface.ts: -------------------------------------------------------------------------------- 1 | import IncomingWebsocketMessageDTO from "@/scripts/Dto/Websocket/IncomingWebsocketMessageDTO"; 2 | import AbstractWebsocketActionExecutor from "@/scripts/Core/Services/Websocket/ActionExecutor/AbstractWebsocketActionExecutor"; 3 | 4 | /** 5 | * @description defines common logic for the websocket handlers 6 | */ 7 | export default interface WebsocketHandlerInterface 8 | { 9 | /** 10 | * @description return the handler name for backend endpoint 11 | */ 12 | getHandlerName(): string; 13 | 14 | /** 15 | * @description will return action executor for given handler 16 | */ 17 | getActionExecutor(): null | AbstractWebsocketActionExecutor; 18 | 19 | /** 20 | * @description return backend endpoint corresponding to handler 21 | */ 22 | getBackendEndpointName(): string; 23 | 24 | /** 25 | * @description handles the logic for message received event 26 | */ 27 | onMessage(incomingMessage: IncomingWebsocketMessageDTO): void; 28 | } -------------------------------------------------------------------------------- /src/scripts/Core/Services/Websocket/websocket.d.ts: -------------------------------------------------------------------------------- 1 | export type OUTGOING_WEBSOCKET_MESSAGE_TYPE_SUCCESS = "success"; 2 | export type OUTGOING_WEBSOCKET_MESSAGE_TYPE_FAILURE = "failure"; -------------------------------------------------------------------------------- /src/scripts/Core/Services/WindowService.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description provides variety of window related logic 3 | */ 4 | export default class WindowService { 5 | 6 | /** 7 | * @description scrolls window to the top 8 | */ 9 | public static scrollToTop(): void { 10 | window.scrollTo({top: 0, behavior: 'smooth'}); 11 | } 12 | 13 | /** 14 | * @description check if window is scrolled behind certain amount of pixels 15 | */ 16 | public static isScrolledBehindPx(px: number): boolean { 17 | return (window.scrollY >= px); 18 | } 19 | 20 | /** 21 | * @description will scroll to target selector, and includes the y offset 22 | */ 23 | public static scrollTo(selector, yOffset = 0) { 24 | const targetElement = document.querySelector(selector); 25 | if (!targetElement) { 26 | throw new Error("No element was found for selector: " + selector) 27 | } 28 | 29 | const y = targetElement.getBoundingClientRect().top + window.pageYOffset + yOffset; 30 | 31 | window.scrollTo({top: y, behavior: 'smooth'}); 32 | } 33 | } -------------------------------------------------------------------------------- /src/scripts/Core/Types/Account.ts: -------------------------------------------------------------------------------- 1 | export type Account = { 2 | maxParallelJobSearches: number | null, 3 | maxSearchedKeywords: number | null, 4 | maxPointsAllowed: number | null, 5 | canGeneratePdfFromTemplate: boolean, 6 | hasBoughtAnyPoints: boolean, 7 | } -------------------------------------------------------------------------------- /src/scripts/Core/Types/ConfigLoader.ts: -------------------------------------------------------------------------------- 1 | export type ConfigLoaderJwt = { 2 | publicSecretKey: string, 3 | } 4 | 5 | export type ConfigLoaderEncryption = { 6 | jsencrypt: { 7 | publicKey: string, 8 | } 9 | } 10 | 11 | export type ConfigLoaderGeneral = { 12 | directories: { 13 | translations: string, 14 | } 15 | } -------------------------------------------------------------------------------- /src/scripts/Core/Types/EmailTemplate.ts: -------------------------------------------------------------------------------- 1 | type EmailTemplateVariables = Record>; 2 | type UserData = Record; 3 | 4 | export {EmailTemplateVariables, UserData}; -------------------------------------------------------------------------------- /src/scripts/Core/Types/Request/AxiosTypes.ts: -------------------------------------------------------------------------------- 1 | import BaseApiResponse from "@/scripts/Response/BaseApiResponse"; 2 | 3 | type BaseApiResponsePromise = Promise 4 | 5 | /** 6 | * @description extractable array of parameters need in axios base calls for post, get etc. 7 | */ 8 | type AxiosMethodCallParameters = Array; 9 | 10 | type AxiosPostDataBag = Record | undefined; 11 | 12 | export { 13 | BaseApiResponsePromise, AxiosMethodCallParameters, AxiosPostDataBag 14 | } 15 | -------------------------------------------------------------------------------- /src/scripts/Core/Types/Request/RequestMethodType.ts: -------------------------------------------------------------------------------- 1 | type RequestMethodTypeGet = "get"; 2 | type RequestMethodTypePost = "post"; 3 | 4 | type RequestMethodType = RequestMethodTypePost | RequestMethodTypeGet; 5 | 6 | export { 7 | RequestMethodType, RequestMethodTypePost, RequestMethodTypeGet 8 | } -------------------------------------------------------------------------------- /src/scripts/Core/Types/Svg.d.ts: -------------------------------------------------------------------------------- 1 | declare module "*.svg" { 2 | const content: any; 3 | export default content; 4 | } -------------------------------------------------------------------------------- /src/scripts/Core/Types/UserData.ts: -------------------------------------------------------------------------------- 1 | import {Account} from "@/scripts/Core/Types/Account"; 2 | 3 | export type UserData = { 4 | username : string, 5 | email : string, 6 | userId : string, 7 | firstname : string, 8 | lastname : string, 9 | zip : string, 10 | street : string, 11 | city : string, 12 | countryCode : string, 13 | homeNumber : string, 14 | profilePicturePath : string | null, 15 | points : number, 16 | pendingPoints : number, 17 | isUserActive : boolean, 18 | account : Account 19 | } -------------------------------------------------------------------------------- /src/scripts/Dto/BaseDTO.ts: -------------------------------------------------------------------------------- 1 | import BaseError from "@/scripts/Core/Error/BaseError"; 2 | 3 | /** 4 | * @description Base of all dtos 5 | */ 6 | export default class BaseDTO { 7 | /** 8 | * @description Will throw error related to json parsing 9 | */ 10 | public static throwJsonParsingError(className: string, Exception: Error, json: string): void{ 11 | throw new BaseError("Could not parse the json for: " + className, { 12 | "exception" : Exception, 13 | "json" : json, 14 | }) 15 | } 16 | } -------------------------------------------------------------------------------- /src/scripts/Dto/Jwt/JwtPayloadType.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description must be used instead of 'jsonwebtoken' which is breaking in vite production mode 3 | */ 4 | import {JwtPayload} from "jsonwebtoken-esm"; 5 | 6 | /** 7 | * @description expected special keys in payload (delivered from backend) 8 | */ 9 | type BackendJwtTokenPayload = { 10 | roles : Array, 11 | username : string, 12 | email : string, 13 | isUserActive : boolean, 14 | userId : string, 15 | } 16 | 17 | type JwtTokenPayload = JwtPayload & BackendJwtTokenPayload; 18 | 19 | export { 20 | JwtTokenPayload 21 | } -------------------------------------------------------------------------------- /src/scripts/Dto/Websocket/WebsocketMessageBaseDTO.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description consist of common logic shared between: 3 | * - {@see IncomingWebsocketMessageDTO} 4 | * - {@see OutgoingWebsocketMessageDTO} 5 | */ 6 | export default class WebsocketMessageBaseDTO 7 | { 8 | public static readonly KEY_JWT = "jwt"; 9 | public static readonly KEY_CAN_RESPOND = "canRespond"; 10 | public static readonly KEY_IS_SYSTEM_DISABLED = "isSystemDisabled"; 11 | public static readonly KEY_IS_SYSTEM_SOON_DISABLED = "isSystemSoonDisabled"; 12 | 13 | protected _message : string; 14 | protected _actionName : string; 15 | 16 | get message(): string { 17 | return this._message; 18 | } 19 | 20 | set message(value: string) { 21 | this._message = value; 22 | } 23 | 24 | get actionName(): string { 25 | return this._actionName; 26 | } 27 | 28 | set actionName(value: string) { 29 | this._actionName = value; 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /src/scripts/Entity/Email/EmailTemplate.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description represents entity data from backend 3 | */ 4 | export default interface EmailTemplate 5 | { 6 | body: string; 7 | exampleHtml: string; 8 | subject: string; 9 | deleted?: boolean; 10 | emailTemplateName: string; 11 | id: number | null; 12 | created?: string; 13 | modified?: string; 14 | } -------------------------------------------------------------------------------- /src/scripts/Entity/Geolocation/Country.ts: -------------------------------------------------------------------------------- 1 | interface Country { 2 | countryName: string, 3 | countryIsoCode: string, 4 | countryLanguage: string | null, 5 | } 6 | 7 | export {Country}; -------------------------------------------------------------------------------- /src/scripts/Entity/Job/CompanyDetail.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description Represents the company detail 3 | */ 4 | export default interface CompanyDetail { 5 | companyName: string, 6 | companyLocations: Array, 7 | ageOld: number | null, 8 | employeesRange: string | null, 9 | websiteUrl: string | null, 10 | linkedinProfileUrl: string | null, 11 | industries: Array 12 | } -------------------------------------------------------------------------------- /src/scripts/Entity/Job/ContactDetail.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description contact details 3 | */ 4 | export default interface ContactDetail { 5 | email: string, 6 | phoneNumber: string, 7 | emailFromJobOffer: boolean, 8 | } -------------------------------------------------------------------------------- /src/scripts/Entity/Job/JobApplications.ts: -------------------------------------------------------------------------------- 1 | import {JobShortInformation} from "@/scripts/Entity/Job/JobShortInformation"; 2 | 3 | interface JobApplication extends ObjectConstructor { 4 | status: jobApplicationStatus, 5 | jobOffer: JobShortInformation, 6 | created: string, 7 | email: string, 8 | } 9 | 10 | enum jobApplicationStatus { 11 | SENT, 12 | PENDING, 13 | } 14 | 15 | export {JobApplication, jobApplicationStatus}; -------------------------------------------------------------------------------- /src/scripts/Entity/Job/JobOfferAnalyzed.ts: -------------------------------------------------------------------------------- 1 | import Salary from "@/scripts/Entity/Job/Salary"; 2 | import ContactDetail from "@/scripts/Entity/Job/ContactDetail"; 3 | import CompanyDetail from "@/scripts/Entity/Job/CompanyDetail"; 4 | 5 | /** 6 | * @description represents set of data regarding the job offer and analyse result 7 | */ 8 | interface JobOfferAnalyzed { 9 | identifier: number, 10 | jobDescription: string, 11 | jobTitle: string, 12 | jobOfferUrl: string, 13 | jobOfferHost: string, 14 | jobOfferLanguage: null | string, 15 | jobPostedDateTime: null | string, 16 | humanLanguages: Array, 17 | hasMail: boolean, 18 | hasPhone: boolean, 19 | hasSalary: boolean, 20 | hasLocation: boolean, 21 | remoteJobMentioned: boolean, 22 | hasHumanLanguages: boolean, 23 | hasJobDateTimePostedInformation: boolean, 24 | salary: Salary, 25 | contactDetail: ContactDetail, 26 | companyDetail: CompanyDetail, 27 | appliedAt: null | string, 28 | isSelected: false, 29 | } 30 | 31 | export { 32 | JobOfferAnalyzed 33 | } -------------------------------------------------------------------------------- /src/scripts/Entity/Job/JobSearchResult.ts: -------------------------------------------------------------------------------- 1 | enum SEARCH_RESULT_STATUS { 2 | PENDING, 3 | DONE, 4 | ERROR, 5 | WIP, 6 | } 7 | 8 | interface JobSearchResult { 9 | id : number, 10 | keywords : Array, 11 | targetAreas : Array, 12 | created : string, 13 | modified : string, 14 | locationName : string | null, 15 | maxDistance : number | null, 16 | externalExtractionId : number | null, 17 | status : string | null, 18 | validDaysNumber : number, 19 | offersFoundCount : number | null, 20 | } 21 | 22 | export {JobSearchResult, SEARCH_RESULT_STATUS}; -------------------------------------------------------------------------------- /src/scripts/Entity/Job/JobShortInformation.ts: -------------------------------------------------------------------------------- 1 | interface JobShortInformation{ 2 | title: string, 3 | companyName: string, 4 | originalUrl: string, 5 | } 6 | 7 | export {JobShortInformation} -------------------------------------------------------------------------------- /src/scripts/Entity/Job/Salary.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description salary information 3 | */ 4 | export default interface Salary { 5 | salaryMin: number, 6 | salaryMax: number, 7 | salaryAverage: number, 8 | } -------------------------------------------------------------------------------- /src/scripts/Entity/PointShop/PointShopProduct.ts: -------------------------------------------------------------------------------- 1 | export default interface PointShopProduct { 2 | id: number, 3 | cost: number, 4 | name: string, 5 | internalIdentifier: string, 6 | } -------------------------------------------------------------------------------- /src/scripts/Enum/PaymentStatusEnum.ts: -------------------------------------------------------------------------------- 1 | enum PAYMENT_STATUS_ENUM { 2 | // new transaction, nothing has been done with it yet 3 | PENDING, 4 | 5 | // transaction finished with success, tool accepted the founds, money was transferred 6 | SUCCESS, 7 | 8 | // transaction is finished with success, however the user either paid more or less than required 9 | SUCCESS_NOT_EQUAL_DEMANDED, 10 | 11 | // user finished payment on his side, the tool needs to provide response 12 | IN_PROGRESS, 13 | 14 | // something went wrong on some step 15 | ERROR, 16 | 17 | // no idea what is happening 18 | UNKNOWN, 19 | 20 | // the payment has been cancelled 21 | CANCELLED, 22 | 23 | // not really planning to support this but still adding 24 | RETURNED, 25 | 26 | // transaction process has started, this state is coming directly (AND ONLY) after status "PENDING" 27 | TRIGGERED, 28 | } 29 | 30 | export {PAYMENT_STATUS_ENUM} -------------------------------------------------------------------------------- /src/scripts/Enum/PointShopProductEnum.ts: -------------------------------------------------------------------------------- 1 | enum PointShopProductEnum { 2 | jobSearchTagNoLimit = "JOB_SEARCH_TAG_NO_LIMIT", 3 | jobSearchTagLimit30 = "JOB_SEARCH_TAG_LIMIT_30", 4 | emailSending = "EMAIL_SENDING", 5 | } 6 | 7 | enum PointShopSearchTagLimitEnum { 8 | "JOB_SEARCH_TAG_NO_LIMIT" = 0, 9 | "JOB_SEARCH_TAG_LIMIT_30" = 30, 10 | } 11 | 12 | export {PointShopProductEnum, PointShopSearchTagLimitEnum} -------------------------------------------------------------------------------- /src/scripts/Libs/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volmarg/voltigo-frontend/3b803f68f9dedff60600f2c6b41a7ab5b33e8cc5/src/scripts/Libs/.gitignore -------------------------------------------------------------------------------- /src/scripts/Libs/FlagIconCss.ts: -------------------------------------------------------------------------------- 1 | import IsoCountries from "@/scripts/Libs/IsoCountries"; 2 | 3 | /** 4 | * @description handles providing class names which result of showing country flag by taking the speaking human 5 | * language as argument 6 | * 7 | * @link https://www.npmjs.com/package/flag-icon-css 8 | * @link https://www.npmjs.com/package/flag-icons 9 | */ 10 | export default class FlagIconCss 11 | { 12 | private static readonly FLAG_ICON_CSS_CLASS_BASE = "flag-icon flag-icon-"; 13 | 14 | /** 15 | * @description will return flag css for spoken language (in english) 16 | */ 17 | public static getFlagCssForLanguage(spokenLanguage: string): string | null 18 | { 19 | let countryCode2Digit = IsoCountries.getCountry3166IsoCodeForSpokenLanguage(spokenLanguage); 20 | if (null === countryCode2Digit) { 21 | return null; 22 | } 23 | 24 | return FlagIconCss.FLAG_ICON_CSS_CLASS_BASE + countryCode2Digit; 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /src/scripts/Libs/Nprogress.ts: -------------------------------------------------------------------------------- 1 | import NProgress from 'nprogress'; 2 | 3 | /** 4 | * @description shows tiny loading bar directly on top of the page 5 | * @link https://github.com/rstacruz/nprogress 6 | */ 7 | export default class Nprogress 8 | { 9 | 10 | /** 11 | * @description will show the bar 12 | * Must be called on start of ajax or start of any special logic 13 | */ 14 | public static start(): void 15 | { 16 | NProgress.start(); 17 | } 18 | 19 | /** 20 | * @description will hide the bar 21 | * Must be called on end of the ajax call or end of any special logic 22 | */ 23 | public static done(): void 24 | { 25 | NProgress.done(); 26 | } 27 | } -------------------------------------------------------------------------------- /src/scripts/Response/Email/Template/SaveTemplate.ts: -------------------------------------------------------------------------------- 1 | import BaseApiResponse from "@/scripts/Response/BaseApiResponse"; 2 | import ErrorHandler from "@/scripts/Response/ErrorHandler"; 3 | 4 | /** 5 | * @description consist of the data returned after saving template 6 | */ 7 | export default class SaveTemplate extends BaseApiResponse 8 | { 9 | private _templateId: number | null; 10 | 11 | get templateId(): number | null { 12 | return this._templateId; 13 | } 14 | 15 | set templateId(value: number | null) { 16 | this._templateId = value; 17 | } 18 | 19 | /** 20 | * @description Create SaveTemplate from json 21 | */ 22 | public static fromJson(json: string): SaveTemplate 23 | { 24 | let apiResponse = new SaveTemplate(); 25 | apiResponse.prefillBaseFields(json); 26 | 27 | try{ 28 | var object = JSON.parse(json); 29 | }catch(Exception){ 30 | ErrorHandler.throwJsonParsingError('SaveTemplate', Exception, json); 31 | } 32 | 33 | apiResponse._templateId = object.templateId; 34 | return apiResponse; 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /src/scripts/Response/ErrorHandler.ts: -------------------------------------------------------------------------------- 1 | import BaseError from "@/scripts/Core/Error/BaseError"; 2 | 3 | /** 4 | * @description response error handler 5 | */ 6 | export default class ErrorHandler 7 | { 8 | /** 9 | * @description Will throw error related to json parsing 10 | */ 11 | public static throwJsonParsingError(className: string, Exception: Error, json: string): void{ 12 | throw new BaseError("Could not parse the json for: " + className, { 13 | "exception" : Exception, 14 | "json" : json, 15 | }) 16 | } 17 | } -------------------------------------------------------------------------------- /src/scripts/Response/Job/Offer/GetFullDescription.ts: -------------------------------------------------------------------------------- 1 | import BaseApiResponse from "@/scripts/Response/BaseApiResponse"; 2 | import ErrorHandler from "@/scripts/Response/ErrorHandler"; 3 | 4 | /** 5 | * Response containing full offer description 6 | */ 7 | export default class GetFullDescription extends BaseApiResponse 8 | { 9 | private _description: string; 10 | 11 | get description(): string { 12 | return this._description; 13 | } 14 | 15 | set description(value: string) { 16 | this._description = value; 17 | } 18 | 19 | /** 20 | * @description Create GetFullDescription from json 21 | */ 22 | public static fromJson(json: string): GetFullDescription 23 | { 24 | let apiResponse = new GetFullDescription(); 25 | apiResponse.prefillBaseFields(json); 26 | 27 | try{ 28 | var object = JSON.parse(json); 29 | }catch(Exception){ 30 | ErrorHandler.throwJsonParsingError('GetFullDescription', Exception, json); 31 | } 32 | 33 | apiResponse.description = object.description; 34 | return apiResponse; 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /src/scripts/Response/Payment/PrepareResponse.ts: -------------------------------------------------------------------------------- 1 | import BaseApiResponse from "@/scripts/Response/BaseApiResponse"; 2 | import ErrorHandler from "@/scripts/Response/ErrorHandler"; 3 | 4 | /** 5 | * Response containing full offer description 6 | */ 7 | export default class PrepareResponse extends BaseApiResponse { 8 | private _orderId: string; 9 | 10 | get orderId(): string { 11 | return this._orderId; 12 | } 13 | 14 | set orderId(value: string) { 15 | this._orderId = value; 16 | } 17 | 18 | /** 19 | * @description Create PrepareResponse from json 20 | */ 21 | public static fromJson(json: string): PrepareResponse { 22 | let apiResponse = new PrepareResponse(); 23 | apiResponse.prefillBaseFields(json); 24 | 25 | try { 26 | var object = JSON.parse(json); 27 | } catch (Exception) { 28 | ErrorHandler.throwJsonParsingError('PrepareResponse', Exception, json); 29 | } 30 | 31 | apiResponse.orderId = object.orderId; 32 | return apiResponse; 33 | } 34 | 35 | } -------------------------------------------------------------------------------- /src/scripts/Vue/Mixins/Colors.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/scripts/Vue/Mixins/Email/TemplatesProviderMixin.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/scripts/Vue/Plugin/Axios/AxiosPlugin.ts: -------------------------------------------------------------------------------- 1 | import {App} from "@vue/runtime-core"; 2 | import AppAxios from "@/scripts/Core/Services/Request/AppAxios"; 3 | import InstallablePluginInterface from "@/scripts/Vue/Plugin/InstallablePluginInterface"; 4 | 5 | /** 6 | * @description handles installing the 7 | * @see AppAxios {as the plugin for Vue} 8 | */ 9 | export default class AxiosPlugin implements InstallablePluginInterface 10 | { 11 | 12 | /** 13 | * @description will install the plugin 14 | */ 15 | public install(app: App): void 16 | { 17 | app.config.globalProperties.$axios = new AppAxios(); 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /src/scripts/Vue/Plugin/Axios/axios.d.ts: -------------------------------------------------------------------------------- 1 | import "@vue/runtime-core"; 2 | import {AppAxiosInterface} from "@/scripts/Core/Interfaces/AppAxiosInterface"; 3 | 4 | /** 5 | * @description extend Vue with axios property so that vue knows that $axios property exists for it when calling this.$axios 6 | * - this is only a definition, the property itself must be provided separately 7 | */ 8 | declare module '@vue/runtime-core' { 9 | interface ComponentCustomProperties { 10 | readonly $axios: AppAxiosInterface; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/scripts/Vue/Plugin/Events/RootEvent.ts: -------------------------------------------------------------------------------- 1 | import InstallablePluginInterface from "@/scripts/Vue/Plugin/InstallablePluginInterface"; 2 | import {App} from "@vue/runtime-core"; 3 | import EventDispatcherService from "@/scripts/Core/Services/Dispatcher/EventDispatcherService"; 4 | 5 | /** 6 | * @description provides logic for calling events on the root element 7 | * @note Vue3.x does not allow directly calling events from grandchildren to root etc, 8 | */ 9 | export default class RootEvent implements InstallablePluginInterface 10 | { 11 | /** 12 | * @inheritDoc 13 | */ 14 | public install(app: App): void { 15 | app.config.globalProperties.$rootEvent = { 16 | showNotification : EventDispatcherService.emitShowNotification, 17 | showFullPageLoader : EventDispatcherService.emitShowFullPageLoader, 18 | hideFullPageLoader : EventDispatcherService.emitHideFullPageLoader, 19 | showBarPageLoader : EventDispatcherService.emitShowBarPageLoader, 20 | hideBarPageLoader : EventDispatcherService.emitHideBarPageLoader, 21 | }; 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /src/scripts/Vue/Plugin/Events/rootEvent.d.ts: -------------------------------------------------------------------------------- 1 | import '@vue/runtime-core'; 2 | 3 | declare module '@vue/runtime-core' { 4 | interface ComponentCustomProperties { 5 | readonly $rootEvent: RootEventMethodsType 6 | } 7 | } 8 | 9 | type RootEventMethodsType = { 10 | showNotification : (alertType: string, message: string | null = null, stringToTranslate: string | null = null, autoClose = true) => void; 11 | showFullPageLoader : () => void; 12 | hideFullPageLoader : () => void; 13 | showBarPageLoader : () => void; 14 | hideBarPageLoader : () => void; 15 | } 16 | -------------------------------------------------------------------------------- /src/scripts/Vue/Plugin/InstallablePluginInterface.ts: -------------------------------------------------------------------------------- 1 | import {App} from "@vue/runtime-core"; 2 | 3 | /** 4 | * @description interface marking installable Vue.js plugins 5 | */ 6 | export default interface InstallablePluginInterface 7 | { 8 | /** 9 | * @description will install the plugin 10 | */ 11 | install(app: App): void; 12 | } -------------------------------------------------------------------------------- /src/scripts/Vue/Plugin/PluginsInstaller.ts: -------------------------------------------------------------------------------- 1 | import {App} from "@vue/runtime-core"; 2 | import InstallablePluginInterface from "@/scripts/Vue/Plugin/InstallablePluginInterface"; 3 | import AxiosPlugin from "@/scripts/Vue/Plugin/Axios/AxiosPlugin"; 4 | import RootEvent from "@/scripts/Vue/Plugin/Events/RootEvent"; 5 | import ViewPlugin from "@/scripts/Vue/Plugin/View/ViewPlugin"; 6 | 7 | /** 8 | * @description handles installing all vue Plugins 9 | */ 10 | export default class PluginsInstaller 11 | { 12 | /** 13 | * @description will install the plugins on app and afterwards return the app 14 | */ 15 | public installPlugins(app: App): App 16 | { 17 | let plugins: Array = [ 18 | new AxiosPlugin(), 19 | new RootEvent(), 20 | new ViewPlugin(), 21 | ]; 22 | 23 | for(let plugin of plugins){ 24 | app.use(plugin); 25 | } 26 | 27 | return app; 28 | } 29 | } -------------------------------------------------------------------------------- /src/scripts/Vue/Plugin/View/viewPlugin.d.ts: -------------------------------------------------------------------------------- 1 | import '@vue/runtime-core'; 2 | 3 | declare module '@vue/runtime-core' { 4 | interface ComponentCustomProperties { 5 | readonly $view: ViewPluginType 6 | } 7 | } 8 | 9 | type ViewPluginType = { 10 | scrollToElement : (domElement: HTMLElement | undefined | null) => void; 11 | scrollContentOfElement : (scrollTarget: HTMLElement | undefined | null | Window, offsetFromTop: number, behavior: ScrollBehavior = "smooth") => void; 12 | } 13 | -------------------------------------------------------------------------------- /src/scripts/Vue/Store/SystemDisabledState.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description defines the store for system disabling 3 | */ 4 | import {defineStore} from 'pinia' 5 | 6 | const systemDisabledStore = defineStore('systemDisabledState', { 7 | state: () => ({ 8 | isDisabled: false, 9 | isSoonDisabled: false, 10 | message: "", 11 | soonDisabledMessage: "", 12 | }), 13 | }); 14 | 15 | type SystemDisabledState = { 16 | isDisabled: boolean, 17 | isSoonDisabled: boolean, 18 | message: string, 19 | soonDisabledMessage: string, 20 | checkIsDisabled: () => Promise, 21 | } 22 | 23 | export {systemDisabledStore, SystemDisabledState}; -------------------------------------------------------------------------------- /src/scripts/Vue/Types/Components/ComponentPickerRecord.ts: -------------------------------------------------------------------------------- 1 | type ComponentPickerRecord = { 2 | shownName: string, 3 | selectionBasedName: string, 4 | targetComponentFile: string, 5 | } 6 | 7 | export type ComponentPickerRecords = Array; -------------------------------------------------------------------------------- /src/scripts/Vue/Types/Components/Sidebar.ts: -------------------------------------------------------------------------------- 1 | import {Component} from "vue"; 2 | 3 | export type RightSidebarComponentData = { 4 | componentName ?: string | null, 5 | componentInstance ?: Component | null, 6 | componentPropsData ?: Record 7 | } -------------------------------------------------------------------------------- /src/scripts/Vue/Types/Components/types.d.ts: -------------------------------------------------------------------------------- 1 | export type ComponentData = Record 2 | export type ComponentSetup = Record 3 | export type ComponentValidation = Record> 4 | export type ComponentPluginOptions = { 5 | directive : string, 6 | component : string, 7 | defaultProps : Record 8 | } -------------------------------------------------------------------------------- /src/scripts/Vue/Types/Router/router.d.ts: -------------------------------------------------------------------------------- 1 | import 'vue-router'; 2 | 3 | /** 4 | * @description define router extensions 5 | */ 6 | declare module "vue-router" { 7 | interface RouteMeta { 8 | requiredRole: string | undefined 9 | } 10 | } -------------------------------------------------------------------------------- /src/shims-vue.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | declare module '*.vue' { 3 | import type { DefineComponent } from 'vue' 4 | const component: DefineComponent<{}, {}, any> 5 | export default component 6 | } 7 | -------------------------------------------------------------------------------- /src/translations/en-US/components/Form/currency.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "currency": { 4 | "allCurrencies": { 5 | "targetCurrency": { 6 | "label": "Target currency" 7 | } 8 | } 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /src/translations/en-US/components/Form/keywords.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "component": { 4 | "keywords": { 5 | "keywordToLong": "This keyword is too long, max. length per keyword is: {length} character/s", 6 | "maxWords": "This keyword contains too many words. You can use max: {count} word/s" 7 | } 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/translations/en-US/components/Modal/EmailBuilder/general-regulations.json: -------------------------------------------------------------------------------- 1 | { 2 | "emailBuilder": { 3 | "modal": { 4 | "generalRegulations": { 5 | "header": "Regulations & Terms of use", 6 | "button": { 7 | "close": { 8 | "text": "Confirm" 9 | } 10 | } 11 | } 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /src/translations/en-US/components/Modal/warning.json: -------------------------------------------------------------------------------- 1 | { 2 | "warningModal": { 3 | "buttons": { 4 | "confirm": { 5 | "label": "Confirm" 6 | } 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /src/translations/en-US/components/Page/about.json: -------------------------------------------------------------------------------- 1 | { 2 | "page": { 3 | "components": { 4 | "about": { 5 | "accordion": { 6 | "header": { 7 | "label": "About" 8 | } 9 | } 10 | } 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /src/translations/en-US/components/Page/no-results.json: -------------------------------------------------------------------------------- 1 | { 2 | "noResults": { 3 | "text": "No results were found" 4 | } 5 | } -------------------------------------------------------------------------------- /src/translations/en-US/components/Security/password.json: -------------------------------------------------------------------------------- 1 | { 2 | "password": { 3 | "constraints": { 4 | "label": "Password requirements: " 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /src/translations/en-US/components/UI/colored-switch.json: -------------------------------------------------------------------------------- 1 | { 2 | "coloredSwitch" : { 3 | "on": "Yes", 4 | "off": "No" 5 | } 6 | } -------------------------------------------------------------------------------- /src/translations/en-US/components/User/personal-data.json: -------------------------------------------------------------------------------- 1 | { 2 | "user": { 3 | "personalData": { 4 | "messages": { 5 | "dataUsage": { 6 | "partial": { 7 | "keepInMind": "Keep in mind that any information in this section will / can be used in:", 8 | "usedInApplications" : "job applications (upon using template variables)", 9 | "usedInPayments": "3rd party payment transactions (sent only when it's required)", 10 | "emailing": "internal E-Mailing (notifications etc.)", 11 | "etc": "etc." 12 | } 13 | } 14 | } 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /src/translations/en-US/components/developer.json: -------------------------------------------------------------------------------- 1 | { 2 | "developer": { 3 | "xdebug": { 4 | "label": "Xdebug session name", 5 | "helpText": "This name will be sent to the backend alongside with the Ajax calls, can be used for debugging. This string must be equal to that set in the browser plugin" 6 | }, 7 | "symfonyProfiler": { 8 | "label": "Symfony Profiler", 9 | "helpText": "Go to symfony backend profiler" 10 | }, 11 | "playground": { 12 | "label": "Playground", 13 | "helpText": "Open the playground view whee code can be tested. DO NOT push that code to repo" 14 | }, 15 | "easyEmail": { 16 | "toggleCommunicationSectionIframe": { 17 | "label": "Toggle communication iframe", 18 | "helpText": "Shows / hides the iframe that is used for communication wit EasyEmail - can be used for logging data in there from EasyEmail" 19 | } 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /src/translations/en-US/components/job-offer-selected-offers-preview.json: -------------------------------------------------------------------------------- 1 | { 2 | "components": { 3 | "jobOfferSelectedOffersPreview": { 4 | "header": { 5 | "label": "Selected job offers" 6 | }, 7 | "miniCard": { 8 | "checkboxApply": { 9 | "tippy": { 10 | "info": { 11 | "text": "Cancel applying for this job offer" 12 | } 13 | } 14 | }, 15 | "preview": { 16 | "tippy": { 17 | "info": { 18 | "text": "Preview job offer" 19 | } 20 | } 21 | } 22 | } 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /src/translations/en-US/components/payment.json: -------------------------------------------------------------------------------- 1 | { 2 | "payment": { 3 | "error": { 4 | "label": "Payment server responded with error: " 5 | }, 6 | "pointsFee": { 7 | "gemHover": { 8 | "text": "Click here to charge your founds" 9 | } 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/translations/en-US/components/user-settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "userSettings": { 3 | "personalDataModal": { 4 | "buttons": { 5 | "close": { 6 | "label": "Close" 7 | } 8 | }, 9 | "header": "Your personal data" 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/translations/en-US/demo.json: -------------------------------------------------------------------------------- 1 | { 2 | "demo": { 3 | "sectionInfo": { 4 | "header": "Project demo version", 5 | "info": "This section is disabled" 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /src/translations/en-US/navigation.json: -------------------------------------------------------------------------------- 1 | { 2 | "navbar": { 3 | "sidebar": { 4 | "jobs": { 5 | "children": { 6 | "searchResults": { 7 | "label": "Search results" 8 | } 9 | } 10 | }, 11 | "payments": { 12 | "children": { 13 | "overview": { 14 | "label": "Overview" 15 | }, 16 | "pointShop": { 17 | "label": "Point shop" 18 | } 19 | }, 20 | "header": "Payments" 21 | } 22 | }, 23 | "topBar": { 24 | "founds": { 25 | "label": "Founds" 26 | }, 27 | "children": { 28 | "overview": { 29 | "label": "Overview" 30 | } 31 | } 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /src/translations/en-US/other/date-time/months.json: -------------------------------------------------------------------------------- 1 | { 2 | "dateTime": { 3 | "months": { 4 | "1": "January", 5 | "2": "February", 6 | "3": "March", 7 | "4": "April", 8 | "5": "May", 9 | "6": "June", 10 | "7": "July", 11 | "8": "August", 12 | "9": "September", 13 | "10": "October", 14 | "11": "November", 15 | "12": "December" 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /src/translations/en-US/other/validations.json: -------------------------------------------------------------------------------- 1 | { 2 | "validations": { 3 | "required": "Field is required" 4 | } 5 | } -------------------------------------------------------------------------------- /src/translations/en-US/process/payment.json: -------------------------------------------------------------------------------- 1 | { 2 | "paymentProcess": { 3 | "message": { 4 | "couldNotHandleThePayment": "Could not handle the payment", 5 | "currencyNotSupported": "Provided currency is not supported. Try selecting other one.", 6 | "methodNotSupported": "This payment method is not supported, try with other one.", 7 | "foundsUpdated": "Your founds state has been updated", 8 | "foundsPending": "Pending" 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/translations/en-US/regulations/email-builder/general.json: -------------------------------------------------------------------------------- 1 | { 2 | "regulations": { 3 | "emailBuilder": { 4 | "generalTermsOfUse": { 5 | "info": { 6 | "text": "By using E-Mail builder / copying any prepared templates, and / or sending them - You herby accept the information presented below (even if You somehow manage to close this popup and proceed using the editor)." 7 | } 8 | } 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /src/translations/en-US/regulations/general/terms-of-use.json: -------------------------------------------------------------------------------- 1 | { 2 | "general": { 3 | "regulations": { 4 | "termsOfUse": { 5 | "info": { 6 | "text": "By using the platform, You herby accept the information presented below (even if You somehow manage to close this popup and continue without accepting the terms)." 7 | } 8 | } 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /src/translations/en-US/system/restriction/payment.json: -------------------------------------------------------------------------------- 1 | { 2 | "system": { 3 | "restriction": { 4 | "payment": { 5 | "orderExceedsMax": "Tried to order product for more than current allowed max system-wide value. Your payment: {userPayment} ({userPaymentConverted}), max. {maxPayment}" 6 | } 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /src/translations/en-US/system/state.json: -------------------------------------------------------------------------------- 1 | { 2 | "state": { 3 | "disabled": { 4 | "message": "Cannot perform this operation - system is temporarily disabled." 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /src/translations/en-US/system/timer.json: -------------------------------------------------------------------------------- 1 | { 2 | "system": { 3 | "timer": { 4 | "warningModal": { 5 | "header": "You will soon be logged out", 6 | "text": "Click yes in order to extend the log-in time.", 7 | "buttons": { 8 | "ok": "Yes", 9 | "no": "No" 10 | } 11 | } 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /src/translations/en-US/views/email/template/builder-close-modal.json: -------------------------------------------------------------------------------- 1 | { 2 | "builderCloseModal": { 3 | "title": "Close E-mail builder", 4 | "text": { 5 | "confirm": "Do You really want to close the editor?
Any unsaved changes will be lost!" 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /src/translations/en-US/views/email/template/removal-confirmation-modal.json: -------------------------------------------------------------------------------- 1 | { 2 | "removalConfirmationModal": { 3 | "text": "Do You really want to remove this template?", 4 | "title": "Template removal" 5 | } 6 | } -------------------------------------------------------------------------------- /src/translations/en-US/views/errorPage/404.json: -------------------------------------------------------------------------------- 1 | { 2 | "404": { 3 | "message": "Oops, The Page you are looking for can't be found!", 4 | "button": "Return To Homepage" 5 | } 6 | } -------------------------------------------------------------------------------- /src/translations/en-US/views/landing-page/account-activate/activate.json: -------------------------------------------------------------------------------- 1 | { 2 | "landingPage": { 3 | "activateAccount": { 4 | "headline": { 5 | "label": "Activate Your account" 6 | }, 7 | "info": { 8 | "value": "Click on the button below to gain full access to our services" 9 | }, 10 | "button": { 11 | "label": "Activate" 12 | } 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/translations/en-US/views/landing-page/ban/ban.json: -------------------------------------------------------------------------------- 1 | { 2 | "ban": { 3 | "nav": { 4 | "tryAgain": "Try again" 5 | }, 6 | "headline": "You have been banned", 7 | "description": "Our system has detected undesired activity.
Either You did something wrong, or there is a bot in Your network.", 8 | "banReason": "Ban reason", 9 | "bannedUntil": "Banned until", 10 | "banValidity": { 11 | "perma": "Permanently, or until investigated and unlocked", 12 | "unknown": "Unknown, yet to be decided" 13 | }, 14 | "type": { 15 | "user": { 16 | "description": "Suspicious user activity" 17 | }, 18 | "ip": { 19 | "description": "Suspicious activity in Your network" 20 | }, 21 | "unknown": { 22 | "description": "Unknown reason - safety ban has been placed and must be investigated" 23 | } 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /src/translations/en-US/views/landing-page/change-email/change.json: -------------------------------------------------------------------------------- 1 | { 2 | "landingPage": { 3 | "emailChange": { 4 | "headline": { 5 | "label": "You've requested E-Mail change" 6 | }, 7 | "info": { 8 | "value": "Click on the button below to confirm Your request." 9 | }, 10 | "infoNewAddress": { 11 | "value": "Your new address will be:" 12 | }, 13 | "button": { 14 | "label": "Change E-Mail" 15 | } 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /src/translations/en-US/views/landing-page/landing-page.json: -------------------------------------------------------------------------------- 1 | { 2 | "landing-page": { 3 | "common": { 4 | "button": { 5 | "loginPage": "Login page", 6 | "homePage": "Home page" 7 | } 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/translations/en-US/views/landing-page/password-reset/reset.json: -------------------------------------------------------------------------------- 1 | { 2 | "landingPage": { 3 | "passwordReset": { 4 | "headline": { 5 | "label": "You've requested password reset" 6 | }, 7 | "info": { 8 | "value": "Click on the button below and You will get E-Mail with new password." 9 | }, 10 | "button": { 11 | "label": "Reset" 12 | } 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/translations/en-US/views/landing-page/user-not-activated/not-activated.json: -------------------------------------------------------------------------------- 1 | { 2 | "landingPage": { 3 | "userNotActivated": { 4 | "headline": { 5 | "label": "You need to activate Your account first" 6 | }, 7 | "info": { 8 | "value": "If You no longer have valid activation link, then click below to receive one on E-Mail" 9 | }, 10 | "button": { 11 | "label": "Request activation link" 12 | } 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/translations/en-US/views/logged-in.json: -------------------------------------------------------------------------------- 1 | { 2 | "view": { 3 | "loggedIn": { 4 | "modal": { 5 | "termsOfUse": { 6 | "header": { 7 | "label": "Terms of use / general information" 8 | }, 9 | "buttons": { 10 | "close": { 11 | "label": "Confirm" 12 | } 13 | } 14 | } 15 | } 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /src/translations/en-US/views/security/login.json: -------------------------------------------------------------------------------- 1 | { 2 | "security": { 3 | "login": { 4 | "form": { 5 | "button": { 6 | "submit": { 7 | "label": "Submit" 8 | } 9 | } 10 | } 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /src/views/Ban/mixin/BanTypeMixin.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/Development/Playground.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | -------------------------------------------------------------------------------- /src/views/Email/Template/Builder/Mixin/LoadCloneableMixin.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/Email/Template/Builder/Mixin/LoadMixin.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/Email/Template/Builder/TemplatesList/SingleTemplate/components/Image.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | -------------------------------------------------------------------------------- /src/views/Email/Template/Builder/WarningMobileBrowser.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/views/Examples/RoleProtectedRoute.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /src/views/InfoLandingPage/Components/Mixin/SectionNavigationMixin.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/InfoLandingPage/Components/Section/Components/Info/InfoToLeft.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 40 | -------------------------------------------------------------------------------- /src/views/InfoLandingPage/Components/Section/Info.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | -------------------------------------------------------------------------------- /src/views/InfoLandingPage/Components/TopMenu/LoginLink.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /src/views/JobOffer/Applications/Components/FiltersPanel/Components/CompanyNameFilter.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 44 | -------------------------------------------------------------------------------- /src/views/JobOffer/Applications/Components/FiltersPanel/Components/DateFromFilter.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 44 | -------------------------------------------------------------------------------- /src/views/JobOffer/Applications/Components/FiltersPanel/Components/DateToFilter.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 44 | -------------------------------------------------------------------------------- /src/views/JobOffer/Applications/Components/FiltersPanel/Components/EmailAddressFilter.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 44 | -------------------------------------------------------------------------------- /src/views/JobOffer/Applications/Components/FiltersPanel/Components/JobTitleFilter.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 44 | -------------------------------------------------------------------------------- /src/views/JobOffer/Applications/Mixin/Filter/InitialFilterValuesMixin.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/JobOffer/Applications/Mixin/Sort/InitialSortValuesMixin.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/JobOffer/Applications/Mixin/Sort/SortTypesMixin.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/JobOffer/Applications/SingleApplication/Components/OfferServiceData.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 28 | -------------------------------------------------------------------------------- /src/views/JobOffer/Applications/SingleApplication/Components/Tooltip.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 26 | 27 | -------------------------------------------------------------------------------- /src/views/JobOffer/Applications/TopRow.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /src/views/JobOffer/Applications/Types/Filter/FilterTypes.ts: -------------------------------------------------------------------------------- 1 | type FilterValues = { 2 | companyName : null | string, 3 | jobTitle : null | string, 4 | dateFrom : null | string, 5 | dateTo : null | string, 6 | email : null | string, 7 | } 8 | 9 | export {FilterValues}; -------------------------------------------------------------------------------- /src/views/JobOffer/Applications/Types/Sort/SortTypes.ts: -------------------------------------------------------------------------------- 1 | type SortValues = { 2 | general: string | null, 3 | }; 4 | 5 | export {SortValues} -------------------------------------------------------------------------------- /src/views/JobOffer/Email/Wizard/StepInterfaceMixin.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/JobOffer/Search/ExamplesButton.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 24 | 25 | -------------------------------------------------------------------------------- /src/views/JobOffer/Search/ExamplesLightbox.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 40 | -------------------------------------------------------------------------------- /src/views/JobOffer/Search/LocationBasedSearchInfo.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /src/views/JobOffer/Search/WarningBlocks.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | -------------------------------------------------------------------------------- /src/views/JobOffer/SearchResult/Details/Components/ActionsPanel/Search.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | -------------------------------------------------------------------------------- /src/views/JobOffer/SearchResult/Details/Components/Cards/SingleCard/CompanyName.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 23 | 24 | -------------------------------------------------------------------------------- /src/views/JobOffer/SearchResult/Details/Components/Cards/SingleCard/OfferTitle.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | -------------------------------------------------------------------------------- /src/views/JobOffer/SearchResult/Details/Components/FiltersPanel/Company/components/ExcludedName.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /src/views/JobOffer/SearchResult/Details/Components/FiltersPanel/Company/components/IncludedName.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /src/views/JobOffer/SearchResult/Details/Components/FiltersPanel/Enum/FilteringRuleEnum.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description must be in sync with backend `KeywordsFilteringRule` 3 | */ 4 | enum KEYWORD_FILTERING_RULE { 5 | "NONE" 6 | } 7 | 8 | /** 9 | * @description must be in sync with backend "PostedRule" 10 | */ 11 | enum POSTED_FILTERING_RULE { 12 | "NONE" 13 | } 14 | 15 | export {KEYWORD_FILTERING_RULE, POSTED_FILTERING_RULE}; -------------------------------------------------------------------------------- /src/views/JobOffer/SearchResult/Details/Components/LegendBlock.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 25 | -------------------------------------------------------------------------------- /src/views/JobOffer/SearchResult/Details/Components/NoSearchResults.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | -------------------------------------------------------------------------------- /src/views/JobOffer/SearchResult/Details/Mixin/EmailSourceMixin.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/JobOffer/SearchResult/Details/Mixin/RightSidebarHandlerMixin.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/JobOffer/SearchResult/Details/Mixin/SearchMixin.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/JobOffer/SearchResult/Overview/Components/FiltersPanel/Components/CreatedFilter.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 43 | -------------------------------------------------------------------------------- /src/views/JobOffer/SearchResult/Overview/Components/SingleResult/Components/CountFound.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 38 | -------------------------------------------------------------------------------- /src/views/Payments/Overview/Components/FiltersPanel/Components/CreatedFilter.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 43 | -------------------------------------------------------------------------------- /src/views/Payments/Overview/Components/SingleResult/SingleResult.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 29 | -------------------------------------------------------------------------------- /src/views/Payments/PointShopHistory/Components/FiltersPanel/Components/CreatedFilter.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 43 | -------------------------------------------------------------------------------- /src/views/SystemState/Maintenance.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 25 | 26 | -------------------------------------------------------------------------------- /src/views/User/PersonalData/DataUsageInfo.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 22 | 23 | -------------------------------------------------------------------------------- /src/views/User/Settings/Views/Account/Account.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | -------------------------------------------------------------------------------- /src/views/User/Settings/Views/BaseData/components/PersonalData/Address/City.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | -------------------------------------------------------------------------------- /src/views/User/Settings/Views/Files/Files.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /src/views/User/Settings/Views/Files/components/Cv/components/SingleCvData/components/FileName.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | 18 | -------------------------------------------------------------------------------- /src/views/User/Settings/Views/Mixin/ResponsiveViewNavMixin.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/User/Settings/Views/Security/Security.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | purge: { content: ['./public/**/*.html', './src/**/*.vue'] }, 3 | darkMode: false, // or 'media' or 'class' 4 | theme: { 5 | extend: {}, 6 | }, 7 | variants: { 8 | extend: {}, 9 | }, 10 | plugins: [], 11 | } 12 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "resolveJsonModule": true, 4 | "strictPropertyInitialization": false, 5 | "noImplicitAny": false, 6 | "noImplicitThis" : false, 7 | "target": "esnext", 8 | "module": "esnext", 9 | "strict": true, 10 | "jsx": "preserve", 11 | "importHelpers": true, 12 | "moduleResolution": "node", 13 | "experimentalDecorators": true, 14 | "skipLibCheck": true, 15 | "esModuleInterop": true, 16 | "allowSyntheticDefaultImports": true, 17 | "sourceMap": true, 18 | "baseUrl": ".", 19 | "types": [ 20 | "webpack-env", 21 | "vite/client" 22 | ], 23 | "paths": { 24 | "@/*": [ 25 | "src/*" 26 | ] 27 | }, 28 | "lib": [ 29 | "esnext", 30 | "dom", 31 | "dom.iterable", 32 | "scripthost" 33 | ] 34 | }, 35 | "include": [ 36 | "src/**/*.ts", 37 | "src/**/*.tsx", 38 | "src/**/*.vue", 39 | "tests/**/*.ts", 40 | "tests/**/*.tsx", 41 | "src/scripts/Core/Types/Svg.d.ts" 42 | ], 43 | "exclude": [ 44 | "node_modules" 45 | ] 46 | } 47 | --------------------------------------------------------------------------------