migrations
Some checks failed
🧪✨ Tests Workflow / 🛡️ 🔒 License Check (push) Has started running
🧪✨ Tests Workflow / 🐙 🔍 Code Sniffer (push) Has started running
🧪✨ Tests Workflow / 🧪 ✅ Unit Tests (push) Has been cancelled
🧪✨ Tests Workflow / 🧪 ✨ Database Migrations (push) Has started running
🧪✨ Tests Workflow / 🛡️ 🔒 Library Audit (push) Has started running
🧪✨ Tests Workflow / 📝 ✨ Code Lint (push) Has started running
2
.rr.yaml
@@ -21,7 +21,7 @@ http:
|
|||||||
middleware: [ "static" ]
|
middleware: [ "static" ]
|
||||||
static:
|
static:
|
||||||
dir: "public/"
|
dir: "public/"
|
||||||
allow: [ ".css", ".js", ".ico" ]
|
allow: [ ".css", ".js", ".ico", ".webmanifest", ".png" ]
|
||||||
|
|
||||||
pool:
|
pool:
|
||||||
allocate_timeout: 5s
|
allocate_timeout: 5s
|
||||||
|
|||||||
BIN
front-end/assets/favicon-16x16.png
Normal file
|
After Width: | Height: | Size: 892 B |
BIN
front-end/assets/favicon-180x180.png
Normal file
|
After Width: | Height: | Size: 59 KiB |
BIN
front-end/assets/favicon-192x192.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
front-end/assets/favicon-32x32.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
front-end/assets/favicon-48x48.png
Normal file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
front-end/assets/favicon-512x512.png
Normal file
|
After Width: | Height: | Size: 408 KiB |
BIN
front-end/assets/favicon-64x64.png
Normal file
|
After Width: | Height: | Size: 9.2 KiB |
BIN
front-end/assets/favicon.ico
Executable file → Normal file
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 121 KiB |
11
front-end/assets/head-tags.html
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="48x48" href="favicon-48x48.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="64x64" href="favicon-64x64.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="180x180" href="favicon-180x180.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="192x192" href="favicon-192x192.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="512x512" href="favicon-512x512.png">
|
||||||
|
<link rel="apple-touch-icon" sizes="180x180" href="favicon-180x180.png">
|
||||||
|
<link rel="apple-touch-icon" sizes="192x192" href="favicon-192x192.png">
|
||||||
|
<link rel="apple-touch-icon" sizes="512x512" href="favicon-512x512.png">
|
||||||
|
<link rel="manifest" href="site.webmanifest">
|
||||||
44
front-end/assets/site.webmanifest
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"name": "",
|
||||||
|
"short_name": "",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "favicon-16x16.png",
|
||||||
|
"sizes": "16x16",
|
||||||
|
"type": "image/png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "favicon-32x32.png",
|
||||||
|
"sizes": "32x32",
|
||||||
|
"type": "image/png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "favicon-48x48.png",
|
||||||
|
"sizes": "48x48",
|
||||||
|
"type": "image/png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "favicon-64x64.png",
|
||||||
|
"sizes": "64x64",
|
||||||
|
"type": "image/png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "favicon-180x180.png",
|
||||||
|
"sizes": "180x180",
|
||||||
|
"type": "image/png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "favicon-192x192.png",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"type": "image/png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "favicon-512x512.png",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/png"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"theme_color": "#ffffff",
|
||||||
|
"background_color": "#ffffff",
|
||||||
|
"display": "standalone"
|
||||||
|
}
|
||||||
@@ -2,7 +2,18 @@
|
|||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8"/>
|
<meta charset="UTF-8"/>
|
||||||
<link rel="icon" href="./assets/favicon.ico"/>
|
|
||||||
|
<link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="48x48" href="/assets/favicon-48x48.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="64x64" href="/assets/favicon-64x64.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="180x180" href="/assets/favicon-180x180.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="192x192" href="/assets/favicon-192x192.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="512x512" href="/assets/favicon-512x512.png">
|
||||||
|
<link rel="apple-touch-icon" sizes="180x180" href="/assets/favicon-180x180.png">
|
||||||
|
<link rel="apple-touch-icon" sizes="192x192" href="/assets/favicon-192x192.png">
|
||||||
|
<link rel="apple-touch-icon" sizes="512x512" href="/assets/favicon-512x512.png">
|
||||||
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||||
<title>Auth Service - Login</title>
|
<title>Auth Service - Login</title>
|
||||||
<script src="https://kit.fontawesome.com/a0fd516b66.js" crossorigin="anonymous"></script>
|
<script src="https://kit.fontawesome.com/a0fd516b66.js" crossorigin="anonymous"></script>
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="flex flex-row justify-center md:p-10">
|
<div class="flex flex-row justify-center md:p-10">
|
||||||
<Card class="p-10 w-full md:w-2/3 lg:w-1/2 xl:w-5/12">
|
<Card class="p-10 w-full md:w-2/3 lg:w-1/2 xl:w-5/12"
|
||||||
|
:style="{ backgroundColor: capabilities.branding.backgroundColor, color: capabilities.branding.foregroundColor }">
|
||||||
<template #header>
|
<template #header>
|
||||||
<div class="flex flex-col items-center justify-center">
|
<div class="flex flex-col items-center justify-center">
|
||||||
<div>
|
<div>
|
||||||
<Image
|
<Image
|
||||||
:src="getImgUrl"
|
:src="getImgUrl()"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-2xl mt-5">
|
<div class="text-2xl mt-5">
|
||||||
<span v-if="capabilities.client_name !== ''">{{ capabilities.client_name }}</span>
|
<span v-if="capabilities.client_name !== ''">{{ capabilities.client_name }}</span>
|
||||||
@@ -41,7 +43,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="capabilities.magicLogin" class="mt-5">
|
<div v-if="capabilities.magicLogin" class="mt-5">
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<Checkbox id="magic-link" v-model="magicLink" binary class="mr-3" />
|
<Checkbox id="magic-link" v-model="magicLink" binary class="mr-3"/>
|
||||||
<label for="magic-link">
|
<label for="magic-link">
|
||||||
Use Magic Login (Password-less)
|
Use Magic Login (Password-less)
|
||||||
</label>
|
</label>
|
||||||
@@ -83,11 +85,11 @@
|
|||||||
|
|
||||||
<div v-if="capabilities.socials && Object.keys(capabilities.socials).length > 0" class="mt-5">
|
<div v-if="capabilities.socials && Object.keys(capabilities.socials).length > 0" class="mt-5">
|
||||||
<div class="text-center mt-5 mb-5">
|
<div class="text-center mt-5 mb-5">
|
||||||
<div class="mb-5 w-1/4 ml-auto mr-auto" style="border-bottom: 1px solid rgba(156,134,134,0.27)" />
|
<div class="mb-5 w-1/4 ml-auto mr-auto" style="border-bottom: 1px solid rgba(156,134,134,0.27)"/>
|
||||||
Social Logins
|
Social Logins
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-around mt-5">
|
<div class="flex justify-around mt-5">
|
||||||
<Button style="display: none" />
|
<Button style="display: none"/>
|
||||||
<a v-if="capabilities.socials.google" :href="capabilities.socials.google.redirectUrl" class="p-button"
|
<a v-if="capabilities.socials.google" :href="capabilities.socials.google.redirectUrl" class="p-button"
|
||||||
style="background-color: #de5246">
|
style="background-color: #de5246">
|
||||||
<i class="fa-brands fa-google mr-2"></i> Google
|
<i class="fa-brands fa-google mr-2"></i> Google
|
||||||
@@ -101,7 +103,7 @@
|
|||||||
</template>
|
</template>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<p class="text-xs text-center text-gray-500 mt-10">
|
<p class="text-xs text-center text-gray-500 mt-10">
|
||||||
Career Uprising, Inc :: Authentication Portal ::
|
{{ capabilities.client_name }} :: Authentication Portal ::
|
||||||
<i class="text-xs fa-sharp fa-thin fa-copyright"></i> {{ date() }} :: {{ version() }}
|
<i class="text-xs fa-sharp fa-thin fa-copyright"></i> {{ date() }} :: {{ version() }}
|
||||||
</p>
|
</p>
|
||||||
<p class="text-center text-gray-500 mt-10">
|
<p class="text-center text-gray-500 mt-10">
|
||||||
@@ -112,14 +114,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue'
|
import {defineComponent} from 'vue'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
import { ToastMessageOptions } from 'primevue/toast'
|
import {ToastMessageOptions} from 'primevue/toast'
|
||||||
import Image from 'primevue/image'
|
import Image from 'primevue/image'
|
||||||
import Card from 'primevue/card'
|
import Card from 'primevue/card'
|
||||||
import Checkbox from 'primevue/checkbox'
|
import Checkbox from 'primevue/checkbox'
|
||||||
import useVuelidate from '@vuelidate/core'
|
import useVuelidate from '@vuelidate/core'
|
||||||
import { email, required } from '@vuelidate/validators'
|
import {email, required} from '@vuelidate/validators'
|
||||||
|
|
||||||
interface Data {
|
interface Data {
|
||||||
form: {
|
form: {
|
||||||
@@ -130,7 +132,7 @@ interface Data {
|
|||||||
loading: boolean
|
loading: boolean
|
||||||
capabilities: {
|
capabilities: {
|
||||||
branding: {
|
branding: {
|
||||||
imageUrl: string,
|
logoUrl: string,
|
||||||
foregroundColor: string,
|
foregroundColor: string,
|
||||||
backgroundColor: string,
|
backgroundColor: string,
|
||||||
},
|
},
|
||||||
@@ -156,8 +158,8 @@ export default defineComponent({
|
|||||||
Card,
|
Card,
|
||||||
Checkbox,
|
Checkbox,
|
||||||
},
|
},
|
||||||
setup () {
|
setup() {
|
||||||
return { v$: useVuelidate() }
|
return {v$: useVuelidate()}
|
||||||
},
|
},
|
||||||
data: (): Data => ({
|
data: (): Data => ({
|
||||||
form: {
|
form: {
|
||||||
@@ -168,7 +170,7 @@ export default defineComponent({
|
|||||||
loading: false,
|
loading: false,
|
||||||
capabilities: {
|
capabilities: {
|
||||||
branding: {
|
branding: {
|
||||||
imageUrl: '',
|
logoUrl: '',
|
||||||
foregroundColor: '',
|
foregroundColor: '',
|
||||||
backgroundColor: '',
|
backgroundColor: '',
|
||||||
},
|
},
|
||||||
@@ -196,7 +198,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
mounted () {
|
mounted() {
|
||||||
this.getCapabilities()
|
this.getCapabilities()
|
||||||
|
|
||||||
const urlParams = new URLSearchParams(window.location.search)
|
const urlParams = new URLSearchParams(window.location.search)
|
||||||
@@ -224,26 +226,26 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
getImgUrl() {
|
getImgUrl() {
|
||||||
if (this.capabilities.branding.imageUrl !== '') {
|
if (this.capabilities.branding.logoUrl && this.capabilities.branding.logoUrl !== '') {
|
||||||
return this.capabilities.branding.imageUrl
|
return this.capabilities.branding.logoUrl
|
||||||
}
|
}
|
||||||
|
|
||||||
return '/assets/logo.png'
|
return 'https://i.siteworxpro.com/NxsEu-0-v33knF-Ncdj2MPYJhKfincDN0lqfczAnYiU/w:600/sm:1/enc/U8uE6IaB8-3qrm6YHoicagNyCd3y9TxIvgXdX8KToub50MwB3SJ_zZCqhnHfy2JR'
|
||||||
},
|
},
|
||||||
date() {
|
date() {
|
||||||
return new Date().getFullYear()
|
return new Date().getFullYear()
|
||||||
},
|
},
|
||||||
version (): string {
|
version(): string {
|
||||||
return import.meta.env.VITE_VERSION || 'dev-master'
|
return import.meta.env.VITE_VERSION || 'dev-master'
|
||||||
},
|
},
|
||||||
getCapabilities () {
|
getCapabilities() {
|
||||||
const urlParams = new URLSearchParams(window.location.search)
|
const urlParams = new URLSearchParams(window.location.search)
|
||||||
|
|
||||||
axios.get(`/client/capabilities?client_id=${urlParams.get('client_id')}`).then((response) => {
|
axios.get(`/client/capabilities?client_id=${urlParams.get('client_id')}`).then((response) => {
|
||||||
this.capabilities = response.data
|
this.capabilities = response.data
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
sendMagicLink () {
|
sendMagicLink() {
|
||||||
this.v$.$touch()
|
this.v$.$touch()
|
||||||
|
|
||||||
if (this.v$.$error) {
|
if (this.v$.$error) {
|
||||||
@@ -272,7 +274,7 @@ export default defineComponent({
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
login () {
|
login() {
|
||||||
|
|
||||||
if (this.magicLink) {
|
if (this.magicLink) {
|
||||||
return this.sendMagicLink()
|
return this.sendMagicLink()
|
||||||
|
|||||||