Merge branch 'basic0601' into main

* basic0601:
  update
This commit is contained in:
min.jiang 2024-06-07 09:02:09 +08:00
commit 4a5fe9459c
29 changed files with 481 additions and 321 deletions

View File

@ -10,20 +10,8 @@
"format": "prettier --write src/" "format": "prettier --write src/"
}, },
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-svg-core": "^6.4.2",
"@fortawesome/free-brands-svg-icons": "^6.4.2",
"@fortawesome/free-regular-svg-icons": "^6.4.2",
"@fortawesome/free-solid-svg-icons": "^6.4.2",
"@fortawesome/pro-duotone-svg-icons": "^6.4.2",
"@fortawesome/pro-light-svg-icons": "^6.4.2",
"@fortawesome/pro-regular-svg-icons": "^6.4.2",
"@fortawesome/pro-solid-svg-icons": "^6.4.2",
"@fortawesome/pro-thin-svg-icons": "^6.4.2",
"@fortawesome/sharp-light-svg-icons": "^6.4.2",
"@fortawesome/sharp-regular-svg-icons": "^6.4.2",
"@fortawesome/sharp-solid-svg-icons": "^6.4.2",
"@fortawesome/vue-fontawesome": "^3.0.3",
"@popperjs/core": "^2.11.8", "@popperjs/core": "^2.11.8",
"@vueup/vue-quill": "^1.2.0",
"axios": "^1.4.0", "axios": "^1.4.0",
"bootstrap": "^5.3.1", "bootstrap": "^5.3.1",
"buffer": "^6.0.3", "buffer": "^6.0.3",
@ -44,6 +32,8 @@
"sass": "^1.66.1", "sass": "^1.66.1",
"sass-loader": "^13.3.2", "sass-loader": "^13.3.2",
"vite": "^4.4.6", "vite": "^4.4.6",
"vite-plugin-svg-icons": "^2.0.1",
"fast-glob": "^3.3.2",
"webpack": "^5.88.2" "webpack": "^5.88.2"
} }
} }

View File

@ -34,24 +34,21 @@ export default {
margin-top: 0px; margin-top: 0px;
} }
.body-header { .body-header {width: 100%; height: $header-height;}
width: 100%;
height: 5vmax;
background: $primary;
}
.body-main { .body-main {
margin-top: 0px; margin-top: 0px;
min-height: calc(100vh - 5vmax); min-height: $body-height;
} }
.body-footer { .body-footer {
width: 100%; width: 100%;
height: 200px; height: $footer-height;
} }
.app-body { .app-body {
margin-top: 0px; margin-top: 0px;
width: 100%; width: 100%;
height: 100vh;
} }
</style> </style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -2,7 +2,7 @@
$shoutout: #f0783b; //for the shoutout texts $shoutout: #f0783b; //for the shoutout texts
// First override some or all individual color variables // First override some or all individual color variables
$primary: #0032fd; // #25408f; $primary: #1748F8; // #0032fd; // #25408f;
// $secondary: #8f5325; // $secondary: #8f5325;
// $success: #3e8d63; // $success: #3e8d63;
// $info: #13101c; // $info: #13101c;
@ -39,6 +39,11 @@ $spacers: map-merge(
), ),
$spacers $spacers
); );
$header-height: 88px;
$footer-height: 110px;
$body-height: calc(100vh - $header-height - $footer-height);
$body-width: 1288px;
// $default-font: "Lato", Verdana, Arial, sans-serif; // $default-font: "Lato", Verdana, Arial, sans-serif;
// $link-color: #ef899e; // $link-color: #ef899e;

View File

@ -26,3 +26,6 @@
@extend .container-fluid; @extend .container-fluid;
@extend .flex-row-box; @extend .flex-row-box;
} }
.flex-1 {flex: 1;}
.flex-all-center {align-items: center; justify-content: center;}
.full-height {height: $body-height;}

View File

@ -5,3 +5,18 @@
.input-control-item { .input-control-item {
@extend .form-control; @extend .form-control;
} }
.input-container {width: 460px; height: 62px; border: 2px solid $primary; border-radius: 8px; display: flex; align-items: center; position: relative;
.form-group {width: 100% !important; border: none !important;}
.input-email {
@extend .input-control-item;
@extend .me-1;
border: none !important; box-shadow: none !important; outline: none !important
}
.btn-start {
@extend .proceed-button;
@extend .ms-1;
margin: 8px !important; border-radius: 12px !important; font-weight: 500; font-size: 16px; color: #F8F8F9;
}
.error-msg {position: absolute; bottom: -36px; color: #9EA2AF; font-size: 18px; margin: 0;}
}

View File

@ -99,7 +99,7 @@ p {
clear: both; clear: both;
} }
@mixin container-content { @mixin container-content {
max-width: 1288px; max-width: $body-width;
width: 100%; width: 100%;
height: 100%; height: 100%;
margin: 0 auto; margin: 0 auto;

View File

@ -0,0 +1,83 @@
<template>
<div class="pdf-reader">
<canvas ref="canvas"></canvas>
</div>
</template>
<script>
// import { getDocument } from 'pdfjs-dist'
import * as PDFJS from "pdfjs-dist";
// import pdfjsWorker from "pdfjs-dist/build/pdf.worker.entry";
import { DocumentApi } from '@/utils/index'
// PDFJS.GlobalWorkerOptions.workerSrc = import('pdfjs-dist/build/pdf.worker')
export default {
name: 'PDFReader',
props: {
document: {type: String, default: ''}
},
mounted () {
this.renderPDF()
},
methods: {
async renderPDF () {
const response = await DocumentApi.download(this.document)
// const response = await ContentApi.retrieve_blog_content(this.document)
console.log('response', response)
// var fr = new FileReader();
// fr.onload = async function(){
// const doc = await getDocument({url: this.result}).promise
// const page = await doc.getPage(1)
// const canvas = this.$refs.canvas
// const context = canvas.getContext('2d')
// const viewport = page.getViewport({ scale: 1 })
// canvas.width = viewport.width
// canvas.height = viewport.height
// await page.render({
// canvasContext: context,
// viewport
// })
// }
// fr.readAsDataURL(response.data);
const doc = await PDFJS.getDocument({data: response.data}).promise
const page = await doc.getPage(1)
const canvas = this.$refs.canvas
const context = canvas.getContext('2d')
const viewport = page.getViewport({ scale: 1 })
canvas.width = viewport.width
canvas.height = viewport.height
await page.render({
canvasContext: context,
viewport
})
},
base64StringToUint8Array(base64String) {
var padding = '='.repeat((4 - base64String.length % 4) % 4);
var base64 = (base64String + padding)
.replace(/\-/g, '+')
.replace(/_/g, '/');
var rawData = atob(base64);
var outputArray = new Uint8Array(rawData.length);
for (var i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
}
}
}
</script>
<style scoped>
.pdf-reader {
width: 100%;
height: 100%;
}
</style>

View File

@ -0,0 +1,37 @@
<template>
<svg :class="svgClass" aria-hidden="true">
<use :xlink:href="iconName" />
</svg>
</template>
<script>
export default {
name: "SvgIcon",
props: {
icon: {
type: String,
required: true,
},
className: {
type: String,
default: "",
},
},
computed: {
iconName() {
return `#icon-${this.icon}`;
},
svgClass() {
if (this.className) {
return "svg-icon " + this.className;
} else {
return "svg-icon";
}
},
},
};
</script>
<style scoped>
.svg-icon {width: 1rem; height: 1rem; vertical-align: -0.15em; fill: currentColor; overflow: hidden;}
</style>

View File

@ -0,0 +1,60 @@
<template>
<div class="vue-quill-container">
<QuillEditor ref="quillRef" v-model:content="quillData" :options="quillOptions" content-type="html" @text-change="quillChange()" />
</div>
</template>
<script>
const toolbarOptions = [
['bold', 'italic', 'underline', 'strike'],
["blockquote", "code-block"],
[{ list: 'ordered' }, { list: 'bullet' }],
[{ script: "sub" }, { script: "super" }],
[{ indent: '-1' }, { indent: '+1' }],
[{ direction: 'rtl' }],
[{ size: ['small', false, 'large', 'huge'] }],
[{ header: [1, 2, 3, 4, 5, 6, false] }],
[{ color: [] }, { background: [] }],
[{ font: [] }],
[{ align: [] }],
['clean'],
]
import { QuillEditor } from '@vueup/vue-quill'
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
export default {
name: "VueQuill",
props: {
content: {
type: String,
default: ''
}
},
emits: ['update:content'],
components: { QuillEditor },
data() {
return {
quillData: this.content,
quillOptions: {
theme: 'snow',
placeholder: '请输入',
modules: {
toolbar: {
container: toolbarOptions
}
}}
}
},
methods: {
quillChange() {
this.$emit('update:content', this.quillData)
}
}
};
</script>
<style>
.vue-quill-container {width: 100%; height: 100%; min-height: 100px;}
</style>

View File

@ -1,13 +1,7 @@
<template> <template>
<div class="flex-colum-container"> <div class="flex-colum-container bottom-container">
<div class="top-layer"> <img class="company-logo" alt="freeleaps logo" src="@/assets/freeleaps.png" />
<p class="clickable-text" @click="gotoAboutMagicleaps()">About Magicleaps</p> <p class="bottom-text">2022 Freeleaps, LLC, All rights reserved</p>
<p class="clickable-text" @click="gotoAboutFreeleaps()">About Freeleaps</p>
<p class="clickable-text" @click="gotoContactUs()">Contact</p>
</div>
<div class="bottom-layer">
<p class="bottom-text">2022 Freeleaps, LLC, All rights reserved</p>
</div>
</div> </div>
</template> </template>
<script> <script>
@ -30,19 +24,9 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.top-layer { .bottom-container {height: 110px; align-items: center; justify-content: center;
@extend .flex-row-container; img {height: 20px; margin-bottom: 10px;}
@extend .justify-content-around;
} }
.bottom-layer { .bottom-text {color: rgba(0,0,0,.5); @extend .fs-6}
@extend .flex-row-container;
@extend .justify-content-around;
}
.bottom-text {
color: $callout;
@extend .fs-6;
@extend .text-center;
}
</style> </style>

View File

@ -1,18 +1,18 @@
<template> <template>
<div class="header-container"> <div class="header-container">
<div class="logo-area"> <div class="header-content">
<img class="company-logo" alt="freeleaps logo" src="@/assets/logo.png" /> <img class="company-logo" alt="freeleaps logo" src="@/assets/freeleaps.png" />
</div> <!-- <div class="content-area">
<div class="content-area"> <span class="company-slogan"
<span class="company-slogan" >Freeleaps: A trustworthy platform to find a software development partner</span
>Freeleaps: A trustworthy platform to find a software development partner</span >
> </div> -->
</div> <div class="public-sites">
<div class="public-sites"> <button class="public-site-button" @click="gotoAbout()">About</button>
<button class="public-site-button" @click="gotoAbout()">About</button> <button class="public-site-button" @click="gotoBlogs()">Blogs</button>
<button class="public-site-button" @click="gotoBlogs()">Blogs</button> <button class="public-site-button" @click="gotoCareer()">Career</button>
<button class="public-site-button" @click="gotoCareer()">Career</button> <button class="public-site-button" @click="gotoContact()">Contact</button>
<button class="public-site-button" @click="gotoContact()">Contact</button> </div>
</div> </div>
</div> </div>
</template> </template>
@ -39,22 +39,14 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.header-container {
@extend .flex-row-container; .header-container {width: 100%; height: 100%; background: white; max-width: 100%;
@extend .justify-content-between; .header-content {display: flex;align-items: center; justify-content: space-between; height: 100%; max-width: $body-width; width: 100%;
height: 100%; @extend .flex-row-container;
}
} }
.logo-area { .company-logo {height: 40px}
width: 10%;
height: 70%;
}
.company-logo {
max-width: 100%;
max-height: 100%;
float: left;
}
.company-slogan { .company-slogan {
@extend .text-center; @extend .text-center;
@ -67,14 +59,12 @@ export default {
width: 60%; width: 60%;
@extend .align-items-center; @extend .align-items-center;
} }
.public-sites {
width: 30%;
@extend .flex-row-container;
@extend .justify-content-between;
}
.public-site-button { .public-sites {display: flex; align-items: center;
@extend .btn; .public-site-button {
@extend .btn-link; @extend .btn;
@extend .btn-link;
color: black; font-size: 16px; text-decoration: none;
}
} }
</style> </style>

View File

@ -1,33 +1,29 @@
<template> <template>
<div class="header-container"> <div class="header-container">
<div class="information-bar"> <div class="header-content">
<img class="company-logo" alt="freeleaps logo" src="@/assets/logo.png" /> <div class="information-bar" @click="gotoMessages">
<span class="company-slogan" <img alt="freeleaps logo" src="@/assets/message.png" />
>Freeleaps: A trustworthy platform to find a software development partner</span </div>
> <div class="navigation-container" role="navigation">
</div> <button class="navigation-item active" @click="gotoWorkspace">
<div class="menu-conainer"> <svg-icon icon="workspace" class-name="icon" />
<div class="message-area"> Workspace
<button class="message-button" type="button" @click="gotoMessages"> </button>
<font-awesome-icon icon="fa-duotone fa-messages fa-xl" /> <button class="navigation-item" @click="gotoRequests">
<svg-icon icon="requests" class-name="icon" />
Requests
</button>
<button class="navigation-item" @click="gotoProviders">
<svg-icon icon="providers" class-name="icon" />
Providers
</button>
<button class="navigation-item" @click="gotoIssueRequest">
<svg-icon icon="post" class-name="icon" />
Post
</button> </button>
</div> </div>
<div class="nav-bar-container" role="navigation"> <div class="profile-container">
<button class="nav-bar-button" @click="gotoWorkspace">Workspace</button> <img alt="freeleaps logo" data-bs-toggle="dropdown" aria-expanded="false" id="accountButton" src="@/assets/profile.png" />
<button class="nav-bar-button" @click="gotoRequests">Requests</button>
<button class="nav-bar-button" @click="gotoProviders">Providers</button>
<button class="nav-bar-button" @click="gotoIssueRequest">Post</button>
</div>
<div class="account-container">
<button
class="account-button"
type="button"
id="accountButton"
data-bs-toggle="dropdown"
aria-expanded="false"
>
<font-awesome-icon icon="fa-duotone fa-user fa-xl" />
</button>
<ul class="dropdown-menu" aria-labelledby="accountButton"> <ul class="dropdown-menu" aria-labelledby="accountButton">
<li> <li>
<button class="account-menu-button" @click="gotoProfile">Profile</button> <button class="account-menu-button" @click="gotoProfile">Profile</button>
@ -114,14 +110,26 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.header-container { .header-container {width: 100%; height: 100%; background: #F8FAFC; max-width: 100%;
@extend .flex-colum-container; .header-content {display: flex;align-items: center; justify-content: space-between; height: 100%; max-width: $body-width; width: 100%;
height: 100%; @extend .flex-row-container;
}
} }
.information-bar { .information-bar {width: 52px; height: 36px; border-radius: 18px; display: flex; align-items: center; justify-content: center; position: relative; background-color: white;
@extend .flex-row-container; img {width: 24px; height: 24px;}
height: 20%; &::after {content: ''; display: block; width: 8px; height: 8px; border-radius: 4px; position: absolute; right: 0; top: 0; background-color: #F44837;}
}
.profile-container {position: relative;
img {width: 56px;}
}
.navigation-container {display: flex; align-items: center; justify-content: center;
.navigation-item {@extend .btn; @extend .btn-link; color: #6E7387; text-decoration: none; margin: 0 30px;
&:hover {color: $primary;}
&.active {color: $primary; font-weight: 500;}
}
} }
.company-logo { .company-logo {

View File

@ -0,0 +1 @@
<svg viewBox="0 0 1066 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1829" width="64" height="64"><path d="M169.173333 147.84C255.616 61.44 380.330667 18.346667 533.333333 18.346667c153.045333 0 277.76 43.136 364.16 129.536C983.893333 234.282667 1027.072 358.997333 1027.072 512c0 153.002667-43.178667 277.76-129.578667 364.16-86.442667 86.4-211.114667 129.578667-364.16 129.578667-153.002667 0-277.76-43.178667-364.16-129.578667C82.773333 789.717333 39.68 665.002667 39.68 512c0-153.002667 43.136-277.76 129.536-364.16zM800.426667 331.946667a94.890667 94.890667 0 0 0-88.106667-88.106667c-109.824-8.021333-300.032 14.378667-486.485333 172.544-45.696 38.741333-49.194667 110.976 2.005333 149.973333 30.933333 23.552 72.704 49.877333 119.338667 66.133334l154.965333-155.008a45.696 45.696 0 1 1 64.64 64.64L411.733333 697.173333c16.213333 46.592 42.581333 88.362667 66.133334 119.296 38.954667 51.2 111.189333 47.701333 149.930666 2.005334 158.165333-186.453333 180.565333-376.661333 172.544-486.485334z" p-id="1830"></path></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -0,0 +1 @@
<svg viewBox="0 0 1066 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1993" width="64" height="64"><path d="M533.333333 1024c327.68 0 512-184.32 512-512s-184.32-512-512-512S21.333333 184.32 21.333333 512s184.32 512 512 512z m265.984-180.736a301.696 301.696 0 0 0-265.984-159.146667 301.866667 301.866667 0 0 0-265.984 159.146667c60.885333 43.733333 147.456 71.04 265.984 71.04s205.098667-27.306667 265.984-71.04zM705.578667 385.365333c0 110.293333-61.994667 172.330667-172.288 172.330667S360.96 495.658667 360.96 385.365333c0-110.250667 62.037333-172.288 172.330667-172.288s172.288 62.037333 172.288 172.288z" p-id="1994"></path></svg>

After

Width:  |  Height:  |  Size: 649 B

View File

@ -0,0 +1 @@
<svg viewBox="0 0 1066 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1667" width="64" height="64"><path d="M260.864 206.976c53.333333-44.586667 133.717333-69.461333 218.325333-69.461333 84.650667 0 165.12 24.874667 218.453334 69.461333 58.112 48.597333 93.013333 132.693333 97.877333 225.493333 4.864 92.842667-20.906667 183.552-70.485333 241.749334-52.650667 61.824-145.834667 97.066667-245.76 97.066666-99.968 0-193.152-35.242667-245.845334-97.066666-49.578667-58.197333-75.306667-148.906667-70.485333-241.706667 4.821333-92.928 39.765333-177.066667 97.92-225.536z m507.008-84.181333C690.090667 57.728 582.528 27.776 479.189333 27.776c-103.253333 0-210.858667 29.994667-288.682666 95.018667-88.32 73.728-131.2 190.634667-137.130667 303.914666-5.973333 113.365333 24.405333 233.984 96.554667 318.592 79.402667 93.354667 207.701333 135.68 329.258666 135.68 83.84 0 170.794667-20.053333 242.773334-63.146666l154.752 154.752a80.426667 80.426667 0 1 0 113.749333-113.834667l-152.874667-152.832c51.2-80.469333 72.533333-182.442667 67.498667-279.210667-5.973333-113.28-48.853333-230.186667-137.216-303.914666z m-287.872 209.066666h-1.749333c-12.714667 0-25.770667 0-38.826667 0.128v-1.28a39.722667 39.722667 0 0 1 79.402667 0v1.28a3199.018667 3199.018667 0 0 0-38.741334-0.128h-0.085333z m112 3.797334v-4.906667a112.853333 112.853333 0 0 0-225.706667 0v4.906667a414.250667 414.250667 0 0 0-28.16 3.925333A62.890667 62.890667 0 0 0 288 387.968c-7.296 32.853333-7.296 63.146667-7.296 106.453333v2.304c0 43.221333 0 73.557333 7.296 106.410667a62.890667 62.890667 0 0 0 50.090667 48.341333c42.752 7.850667 93.44 7.850667 140.16 7.850667h1.749333c46.805333 0 97.450667 0 140.16-7.850667a62.890667 62.890667 0 0 0 50.090667-48.256c7.296-32.938667 7.296-63.274667 7.296-106.496v-2.261333c0-43.306667 0-73.685333-7.296-106.496a62.933333 62.933333 0 0 0-50.090667-48.298667 381.653333 381.653333 0 0 0-28.16-4.010666z" p-id="1668"></path></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1 @@
<svg viewBox="0 0 1066 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1736" width="64" height="64"><path d="M412.672 228.565333c0-50.474667 40.917333-91.434667 91.434667-91.434666h58.453333c50.517333 0 91.477333 40.96 91.477333 91.434666v11.093334c-39.893333-0.853333-79.872-0.853333-118.613333-0.853334h-4.138667c-38.826667 0-78.762667 0-118.613333 0.853334v-11.093334zM302.933333 244.906667v-16.298667A201.130667 201.130667 0 0 1 504.106667 27.434667h58.453333A201.130667 201.130667 0 0 1 763.733333 228.565333v16.298667c31.530667 2.56 62.165333 6.229333 91.264 11.434667a149.76 149.76 0 0 1 120.064 115.968c6.485333 29.994667 10.368 59.136 12.672 89.642666l-422.272 140.970667a100.608 100.608 0 0 1-63.701333 0l-422.826667-141.141333c2.346667-30.464 6.229333-59.562667 12.672-89.472a149.76 149.76 0 0 1 120.064-115.968 967.68 967.68 0 0 1 91.306667-11.434667zM75.52 614.954667c0-20.48 0-39.68 0.128-57.941334l397.226667 132.608a192 192 0 0 0 121.557333 0l396.672-132.437333c0.128 18.218667 0.128 37.376 0.128 57.770667v5.461333c0 98.346667 0 167.978667-16.128 242.730667a149.76 149.76 0 0 1-120.064 115.968c-97.749333 17.493333-213.162667 17.493333-319.573333 17.493333h-4.138667c-106.453333 0-221.866667 0-319.573333-17.493333a149.76 149.76 0 0 1-120.106667-115.968c-16.128-74.752-16.128-144.384-16.128-242.730667v-5.461333z" p-id="1737"></path></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -6,27 +6,27 @@ import { navigatorMixin, userIdentityMixin, errorHanlderMixin, userAuthMixin } f
import { tooltip } from './utils/index' import { tooltip } from './utils/index'
/* import the fontawesome core */ /* import the fontawesome core */
import { library } from '@fortawesome/fontawesome-svg-core' // import { library } from '@fortawesome/fontawesome-svg-core'
/* import font awesome icon component */ /* import font awesome icon component */
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome' // import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
/* import free icons */ /* import free icons */
import { faUser as fasUser } from '@fortawesome/free-solid-svg-icons' // import { faUser as fasUser } from '@fortawesome/free-solid-svg-icons'
/* add some pro styles */ /* add some pro styles */
//import { faBicycle } from '@fortawesome/pro-regular-svg-icons' //import { faBicycle } from '@fortawesome/pro-regular-svg-icons'
// import { faEnvelope } from '@fortawesome/pro-light-svg-icons' // import { faEnvelope } from '@fortawesome/pro-light-svg-icons'
// import { faFeather } from '@fortawesome/pro-thin-svg-icons' // import { faFeather } from '@fortawesome/pro-thin-svg-icons'
import { // import {
faUser as fadUser, // faUser as fadUser,
faMessages as fadMessage, // faMessages as fadMessage,
faCircleInfo as fadCircleInfo // faCircleInfo as fadCircleInfo
} from '@fortawesome/pro-duotone-svg-icons' // } from '@fortawesome/pro-duotone-svg-icons'
// import { faAlien } from '@fortawesome/sharp-solid-svg-icons' // import { faAlien } from '@fortawesome/sharp-solid-svg-icons'
// import { faPlateUtensils } from '@fortawesome/sharp-regular-svg-icons' // import { faPlateUtensils } from '@fortawesome/sharp-regular-svg-icons'
/* add icons to the library */ /* add icons to the library */
library.add(fasUser, fadUser, fadMessage, fadCircleInfo) // library.add(fasUser)
const app = createApp(App) const app = createApp(App)
app.use(store) app.use(store)
@ -36,7 +36,10 @@ app.mixin(navigatorMixin)
app.mixin(errorHanlderMixin) app.mixin(errorHanlderMixin)
app.mixin(userAuthMixin) app.mixin(userAuthMixin)
app.directive('tooltip', tooltip) app.directive('tooltip', tooltip)
app.component('font-awesome-icon', FontAwesomeIcon)
import 'virtual:svg-icons-register'
import SvgIcon from "@/components/SvgIcon.vue";
app.component("svg-icon", SvgIcon);
app.mount('#app') app.mount('#app')
app.config.warnHandler = (msg, instance, trace) => { app.config.warnHandler = (msg, instance, trace) => {

View File

@ -1,8 +1,9 @@
<template> <template>
<div class="story-board-container"> <div class="flex-colum-container front-container">
<div class="focus-input-container"> <div class="slogen">A platform where our users can find a trustworthy partner, <br/>simplify software development, and secure return.</div>
<div class="focus-area"> <div class="poster"><span class="blue">One stop platform</span> for hiring the best <br/>freelance software development talent</div>
<div class="form-group"> <div class="input-container">
<div class="form-group">
<div class="input-group-container"> <div class="input-group-container">
<div class="form-floating"> <div class="form-floating">
<input <input
@ -14,14 +15,11 @@
/> />
<label for="inputEmail">Email address</label> <label for="inputEmail">Email address</label>
</div> </div>
<button class="btn-start" ref="submitButton" @click="trySigninWithEmail()"> <button class="btn-start" ref="submitButton" @click="trySigninWithEmail()">GET STARTED</button>
Start
</button>
</div> </div>
</div> </div>
</div> <p class="error-msg">{{ message }}</p>
</div> </div>
<p>{{ message }}</p>
</div> </div>
</template> </template>
@ -41,7 +39,6 @@ export default {
message: null message: null
} }
}, },
methods: { methods: {
trySigninWithEmail() { trySigninWithEmail() {
this.message = null this.message = null
@ -83,13 +80,11 @@ export default {
<!-- Add "scoped" attribute to limit CSS to this component only --> <!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="scss"> <style scoped lang="scss">
.input-email { .front-container {padding: 20px 0;
@extend .input-control-item; .slogen {font-size: 20px; font-weight: 400; color: rgba(0,0,0,.5); text-align: center; margin-bottom: 24px; line-height: 22px}
@extend .me-1; .poster {font-size: 48px; font-weight: 500; color: black; text-align: center; margin-bottom: 40px; line-height: 52px;
.blue {color: $primary}
}
} }
.btn-start {
@extend .proceed-button;
@extend .ms-1;
}
</style> </style>

View File

@ -1,27 +1,23 @@
<template> <template>
<div> <div class="flex-row-container flex-all-center full-height">
<form @submit.prevent="updateFlid"> <form @submit.prevent="updateFlid">
<div class="story-board-container"> <div class="input-container">
<div class="focus-input-container"> <div class="form-group">
<div class="focus-area"> <div class="input-group-container">
<div class="form-group"> <div class="form-floating">
<div class="input-group-container"> <input
<div class="form-floating"> class="input-email"
<input id="inputCode"
class="input-code" type="text"
id="inputCode" :placeholder="'set your Freeleaps user id'"
type="text" v-model="flid"
:placeholder="'set your Freeleaps user id'" />
v-model="flid" <label for="inputCode">Your Freeleaps User ID</label>
/>
<label for="inputCode">Your Freeleaps User ID</label>
</div>
</div>
</div> </div>
<button type="submit" class="btn-start">Submit</button> <button type="submit" class="btn-start">SUBMIT</button>
</div> </div>
<p class="errorInput" v-if="message != null">{{ message }}</p>
</div> </div>
<p class="errorInput" v-if="message != null">{{ message }}</p>
</div> </div>
</form> </form>
</div> </div>
@ -86,13 +82,4 @@ export default {
<!-- Add "scoped" attribute to limit CSS to this component only --> <!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="scss"> <style scoped lang="scss">
.input-code {
@extend .input-control-item;
@extend .me-1;
}
.btn-start {
@extend .proceed-button;
@extend .ms-1;
}
</style> </style>

View File

@ -1,40 +1,38 @@
<template> <template>
<div> <div class="flex-row-container flex-all-center full-height">
<form @submit.prevent="updatePassword"> <form @submit.prevent="updatePassword">
<div class="story-board-container"> <div class="input-container mb-12">
<div class="focus-input-container"> <div class="form-group">
<div class="focus-area"> <div class="input-group-container">
<div class="form-group"> <div class="form-floating">
<div class="input-group-container"> <input
<div class="form-floating"> class="input-email"
<input id="inputCode"
class="input-code" type="password"
id="inputCode" :placeholder="'Type your password'"
type="password" v-model="password"
:placeholder="'Type your password'" />
v-model="password" <label for="inputCode">Your password</label>
/>
<label for="inputCode">Your password</label>
</div>
</div>
<div class="input-group-container">
<div class="form-floating">
<input
class="input-code"
id="inputCode"
type="password"
:placeholder="'Repeat your password'"
v-model="password2"
/>
<label for="inputCode">Repeat password</label>
</div>
</div>
</div> </div>
<button type="submit" class="btn-start">Update</button>
</div> </div>
<p class="errorInput" v-if="message != null">{{ message }}</p>
</div> </div>
</div> </div>
<div class="input-container">
<div class="input-group-container">
<div class="form-floating">
<input
class="input-email"
id="inputCode"
type="password"
:placeholder="'Repeat your password'"
v-model="password2"
/>
<label for="inputCode">Repeat password</label>
</div>
<button type="submit" class="btn-start">SIGN UP</button>
</div>
<p class="errorInput" v-if="message != null">{{ message }}</p>
</div>
</form> </form>
</div> </div>
</template> </template>
@ -86,13 +84,14 @@ export default {
<!-- Add "scoped" attribute to limit CSS to this component only --> <!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="scss"> <style scoped lang="scss">
.input-code { // .input-code {
@extend .input-control-item; // @extend .input-control-item;
@extend .me-1; // @extend .me-1;
} // }
.btn-start { // .btn-start {
@extend .proceed-button; // @extend .proceed-button;
@extend .ms-1; // @extend .ms-1;
} // }
.mb-12 {margin-bottom: 12px;}
</style> </style>

View File

@ -1,27 +1,23 @@
<template> <template>
<div> <div class="flex-row-container flex-all-center full-height">
<form @submit.prevent="signinWithCode"> <form @submit.prevent="signinWithCode">
<div class="story-board-container"> <div class="input-container">
<div class="focus-input-container"> <div class="form-group">
<div class="focus-area"> <div class="input-group-container">
<div class="form-group"> <div class="form-floating">
<div class="input-group-container"> <input
<div class="form-floating"> class="input-email"
<input id="inputCode"
class="input-code" type="text"
id="inputCode" :placeholder="'Code sent to your email'"
type="text" v-model="code"
:placeholder="'Code sent to your email'" />
v-model="code" <label for="inputCode">Authenticaion Code Sent To Your Email</label>
/>
<label for="inputCode">Authenticaion Code Sent To Your Email</label>
</div>
<button type="submit" class="btn-start">Sign in</button>
</div>
</div> </div>
<button type="submit" class="btn-start">SIGN IN</button>
</div> </div>
<p class="errorInput" v-if="message != null">{{ message }}</p>
</div> </div>
<p class="error-msg" v-if="message != null">{{ message }}</p>
</div> </div>
</form> </form>
</div> </div>
@ -99,13 +95,13 @@ export default {
<!-- Add "scoped" attribute to limit CSS to this component only --> <!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="scss"> <style scoped lang="scss">
.input-code { // .input-code {
@extend .input-control-item; // @extend .input-control-item;
@extend .me-1; // @extend .me-1;
} // }
.btn-start { // .btn-start {
@extend .proceed-button; // @extend .proceed-button;
@extend .ms-1; // @extend .ms-1;
} // }
</style> </style>

View File

@ -1,32 +1,29 @@
<template> <template>
<div> <div class="flex-row-container flex-all-center full-height">
<form @submit.prevent="signinWithPassword"> <form @submit.prevent="signinWithPassword">
<div class="story-board-container"> <div class="input-container">
<div class="focus-input-container"> <div class="form-group">
<div class="focus-area"> <div class="input-group-container">
<div class="form-group"> <div class="form-floating">
<div class="input-group-container"> <input
<div class="form-floating"> class="input-email"
<input id="inputCode"
class="input-code" type="password"
id="inputCode" :placeholder="'Type in your password'"
type="password" v-model="password"
:placeholder="'Type in your password'" />
v-model="password" <label for="inputCode">Password</label>
/>
<label for="inputCode">Password</label>
</div>
<button type="submit" class="btn-start">Sign in</button>
</div>
</div> </div>
<button type="submit" class="btn-start">SIGN IN</button>
</div> </div>
<p class="errorInput" v-if="message != null">{{ message }}</p> </div>
<div class="error-msg flex-row-container">
<p class="error-p" v-if="message != null">{{ message }}</p>
<div class="flex-1" />
<button type="button" class="btn-forget-password" @click="forgetPassword()">Forget password</button>
</div> </div>
</div> </div>
</form> </form>
<button type="button" class="btn-forget-password" @click="forgetPassword()">
Forget password
</button>
</div> </div>
</template> </template>
@ -114,18 +111,11 @@ export default {
<!-- Add "scoped" attribute to limit CSS to this component only --> <!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="scss"> <style scoped lang="scss">
.input-code { .error-p {color: #916AD4; margin: 0}
@extend .input-control-item;
@extend .me-1;
}
.btn-start {
@extend .proceed-button;
@extend .ms-1;
}
.btn-forget-password { .btn-forget-password {
@extend .proceed-button; @extend .btn;
@extend .ms-1; // @extend .ms-1;
@extend .btn-link;
padding: 0; font-size: 16px; margin-left: 15px;
} }
</style> </style>

View File

@ -1,10 +1,13 @@
<template> <template>
<div class="">ContentViewer</div> <div style="width: 100vw; height: 100vh">
<PDFReader document="6662431ee312d5389c612020" />
</div>
</template> </template>
<script> <script>
import { pdfjsLib } from '../../plugins/index' // import { pdfjsLib } from '../../plugins/index'
import { ContentApi } from '../../utils/index' // import { ContentApi } from '../../utils/index'
import { Buffer } from 'buffer' // import { Buffer } from 'buffer'
import PDFReader from '@/components/PDFReader.vue'
export default { export default {
name: 'PdfContentViewer', name: 'PdfContentViewer',
props: { props: {
@ -13,32 +16,32 @@ export default {
type: String type: String
} }
}, },
components: {}, components: {PDFReader},
computed: {}, computed: {},
mounted() { mounted() {
this.retrieve_blog_content() // this.retrieve_blog_content()
}, },
methods: { methods: {
retrieve_blog_content() { // retrieve_blog_content() {
ContentApi.retrieve_blog_content(this.content_id) // ContentApi.retrieve_blog_content(this.content_id)
.then((response) => { // .then((response) => {
this.content_media_data = response.data // this.content_media_data = response.data
var loadingTask = pdfjsLib.getDocument({ // var loadingTask = pdfjsLib.getDocument({
data: Buffer.from(this.content_media_data, 'base64') // data: Buffer.from(this.content_media_data, 'base64')
}) // })
loadingTask.promise.then(function (pdf) { // loadingTask.promise.then(function (pdf) {
// // //
// Fetch the first page // // Fetch the first page
// // //
pdf.getPage(1).then(function (page) { // pdf.getPage(1).then(function (page) {
//rendering // //rendering
}) // })
}) // })
}) // })
.catch((error) => { // .catch((error) => {
this.mnx_backendErrorHandler(error) // this.mnx_backendErrorHandler(error)
}) // })
} // }
}, },
data() { data() {
return { return {

View File

@ -141,7 +141,7 @@
</button> </button>
</div> </div>
<div class="description-container"> <div class="description-container">
<div <!-- <div
class="input-description" class="input-description"
id="inputDescription" id="inputDescription"
placeholder="Fill the request's description here" placeholder="Fill the request's description here"
@ -149,7 +149,8 @@
@keyup="textAreaAdjust($event)" @keyup="textAreaAdjust($event)"
@blur="descriptionDone($event)" @blur="descriptionDone($event)"
contenteditable="true" contenteditable="true"
/> /> -->
<VueQuill v-model:content="content" />
</div> </div>
<div class="file-upload-container"> <div class="file-upload-container">
<label for="file-upload" class="file-upload-label">Upload File:</label> <label for="file-upload" class="file-upload-label">Upload File:</label>
@ -170,6 +171,7 @@ import {
DocumentApi DocumentApi
} from '../../../../utils/index' } from '../../../../utils/index'
import { requestIssuingModelEnum } from '../../../../types/index' import { requestIssuingModelEnum } from '../../../../types/index'
import VueQuill from '@/components/VueQuill.vue'
export default { export default {
name: 'IssueRequest', name: 'IssueRequest',
@ -183,6 +185,7 @@ export default {
type: String type: String
} }
}, },
components: {VueQuill},
mounted() { mounted() {
this.initProducts() this.initProducts()
this.initiateFromInput() this.initiateFromInput()

View File

@ -58,7 +58,6 @@ import UserHistory from '../../pages/user/account/UserHistory.vue'
import Workspace from '../../pages/user/workspace/Home.vue' import Workspace from '../../pages/user/workspace/Home.vue'
import FooterGuest from '../../footers/FooterGuest.vue' import FooterGuest from '../../footers/FooterGuest.vue'
import FooterUser from '../../footers/FooterUser.vue'
import HeaderGuest from '../../headers/HeaderGuest.vue' import HeaderGuest from '../../headers/HeaderGuest.vue'
import HeaderUser from '../../headers/HeaderUser.vue' import HeaderUser from '../../headers/HeaderUser.vue'
@ -177,7 +176,7 @@ const router = createRouter({
name: 'my-workspace-projects', name: 'my-workspace-projects',
path: '/my-workspace-projects', path: '/my-workspace-projects',
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL] },
components: { default: MyWorkspaceProjects, footer: FooterUser, header: HeaderUser }, components: { default: MyWorkspaceProjects, footer: FooterGuest, header: HeaderUser },
props: false props: false
}, },
@ -185,7 +184,7 @@ const router = createRouter({
name: 'project-manage', name: 'project-manage',
path: '/project-manage/:projectId', path: '/project-manage/:projectId',
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL] },
components: { default: ProjectManage, footer: FooterUser, header: HeaderUser }, components: { default: ProjectManage, footer: FooterGuest, header: HeaderUser },
props: true, props: true,
children: [ children: [
{ {
@ -230,14 +229,14 @@ const router = createRouter({
name: 'my-workspace-requests', name: 'my-workspace-requests',
path: '/my-workspace-requests', path: '/my-workspace-requests',
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL] },
components: { default: MyWorkspaceRequests, footer: FooterUser, header: HeaderUser }, components: { default: MyWorkspaceRequests, footer: FooterGuest, header: HeaderUser },
props: false props: false
}, },
{ {
name: 'request-issue', name: 'request-issue',
path: '/request-issue/:loadFrom', path: '/request-issue/:loadFrom',
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL] },
components: { default: IssueRequest, footer: FooterUser, header: HeaderUser }, components: { default: IssueRequest, footer: FooterGuest, header: HeaderUser },
props: (route) => { props: (route) => {
/** /**
* This would preserve the other route.params object properties overriding only * This would preserve the other route.params object properties overriding only
@ -254,7 +253,7 @@ const router = createRouter({
name: 'request-issue2', name: 'request-issue2',
path: '/request-issue/:loadFrom/:requestId', path: '/request-issue/:loadFrom/:requestId',
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL] },
components: { default: IssueRequest, footer: FooterUser, header: HeaderUser }, components: { default: IssueRequest, footer: FooterGuest, header: HeaderUser },
props: (route) => { props: (route) => {
/** /**
* This would preserve the other route.params object properties overriding only * This would preserve the other route.params object properties overriding only
@ -271,28 +270,28 @@ const router = createRouter({
name: 'request-submitted', name: 'request-submitted',
path: '/request-submitted/:requestId', path: '/request-submitted/:requestId',
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL] },
components: { default: RequestSubmitted, footer: FooterUser, header: HeaderUser }, components: { default: RequestSubmitted, footer: FooterGuest, header: HeaderUser },
props: true props: true
}, },
{ {
name: 'request-deposit', name: 'request-deposit',
path: '/request-deposit/:requestId', path: '/request-deposit/:requestId',
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL] },
components: { default: RequestDeposit, footer: FooterUser, header: HeaderUser }, components: { default: RequestDeposit, footer: FooterGuest, header: HeaderUser },
props: true props: true
}, },
{ {
name: 'request-deposited', name: 'request-deposited',
path: '/request-deposited/:requestId', path: '/request-deposited/:requestId',
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL] },
components: { default: RequestDeposited, footer: FooterUser, header: HeaderUser }, components: { default: RequestDeposited, footer: FooterGuest, header: HeaderUser },
props: true props: true
}, },
{ {
name: 'my-workspace-proposals', name: 'my-workspace-proposals',
path: '/my-workspace-proposals', path: '/my-workspace-proposals',
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL] },
components: { default: MyWorkspaceProposals, footer: FooterUser, header: HeaderUser }, components: { default: MyWorkspaceProposals, footer: FooterGuest, header: HeaderUser },
props: false props: false
}, },
//message hub //message hub
@ -300,34 +299,34 @@ const router = createRouter({
name: 'message-hub', name: 'message-hub',
path: '/message-hub', path: '/message-hub',
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL] },
components: { default: MessageHub, footer: FooterUser, header: HeaderUser } components: { default: MessageHub, footer: FooterGuest, header: HeaderUser }
}, },
// provider hub // provider hub
{ {
name: 'provider-hub', name: 'provider-hub',
path: '/provider-hub', path: '/provider-hub',
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL] },
components: { default: ProviderHub, footer: FooterUser, header: HeaderUser } components: { default: ProviderHub, footer: FooterGuest, header: HeaderUser }
}, },
//request hub //request hub
{ {
name: 'request-hub', name: 'request-hub',
path: '/request-hub', path: '/request-hub',
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL] },
components: { default: RequestHub, footer: FooterUser, header: HeaderUser } components: { default: RequestHub, footer: FooterGuest, header: HeaderUser }
}, },
{ {
name: 'make-proposal', name: 'make-proposal',
path: '/make-proposal/:requestId/:loadingMode', path: '/make-proposal/:requestId/:loadingMode',
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL] },
components: { default: MakeProposal, footer: FooterUser, header: HeaderUser }, components: { default: MakeProposal, footer: FooterGuest, header: HeaderUser },
props: true props: true
}, },
{ {
name: 'proposal-submitted', name: 'proposal-submitted',
path: '/proposal-submitted/:proposalId', path: '/proposal-submitted/:proposalId',
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL] },
components: { default: ProposalSubmitted, footer: FooterUser, header: HeaderUser }, components: { default: ProposalSubmitted, footer: FooterGuest, header: HeaderUser },
props: true props: true
}, },
@ -335,7 +334,7 @@ const router = createRouter({
name: 'request-manage', name: 'request-manage',
path: '/request-manage/:requestId', path: '/request-manage/:requestId',
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL] },
components: { default: RequestManage, footer: FooterUser, header: HeaderUser }, components: { default: RequestManage, footer: FooterGuest, header: HeaderUser },
props: true props: true
}, },
{ {
@ -344,7 +343,7 @@ const router = createRouter({
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL] },
components: { components: {
default: ReviewProposalBeforeAccetance, default: ReviewProposalBeforeAccetance,
footer: FooterUser, footer: FooterGuest,
header: HeaderUser header: HeaderUser
}, },
props: true props: true
@ -354,25 +353,25 @@ const router = createRouter({
name: 'user-profile', name: 'user-profile',
path: '/user-profile', path: '/user-profile',
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL] },
components: { default: UserProfile, footer: FooterUser, header: HeaderUser } components: { default: UserProfile, footer: FooterGuest, header: HeaderUser }
}, },
{ {
name: 'user-finance', name: 'user-finance',
path: '/user-finance', path: '/user-finance',
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL] },
components: { default: UserFinance, footer: FooterUser, header: HeaderUser } components: { default: UserFinance, footer: FooterGuest, header: HeaderUser }
}, },
{ {
name: 'user-history', name: 'user-history',
path: '/user-history', path: '/user-history',
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL] },
components: { default: UserHistory, footer: FooterUser, header: HeaderUser } components: { default: UserHistory, footer: FooterGuest, header: HeaderUser }
}, },
{ {
name: 'work-space', name: 'work-space',
path: '/work-space', path: '/work-space',
meta: { requiredRoles: [userRoleEnum.PERSONAL] }, meta: { requiredRoles: [userRoleEnum.PERSONAL], active: 'workspace' },
components: { default: Workspace, footer: FooterUser, header: HeaderUser } components: { default: Workspace, footer: FooterGuest, header: HeaderUser }
} }
], ],
@ -387,6 +386,7 @@ const router = createRouter({
}) })
router.beforeEach(function (to, from, next) { router.beforeEach(function (to, from, next) {
console.log('beforeEach', to)
if (to.name == 'front-door') { if (to.name == 'front-door') {
next() next()
} else if (to.meta.requiredRoles.includes(userRoleEnum.NONE)) { } else if (to.meta.requiredRoles.includes(userRoleEnum.NONE)) {

View File

@ -1,20 +1,28 @@
import { fileURLToPath, URL } from 'node:url' import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite' import { defineConfig } from 'vite'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import vue from '@vitejs/plugin-vue' import vue from '@vitejs/plugin-vue'
const path = require('path') const path = require('path')
function resolve(dir) {
return path.join(__dirname, dir);
}
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig({ export default defineConfig({
plugins: [ plugins: [
vue(), vue(),
createSvgIconsPlugin({
iconDirs: [resolve('src/icons')],
symbolId: 'icon-[name]'
}),
], ],
resolve: { resolve: {
root: path.resolve(__dirname, 'src'), root: resolve('src'),
alias: { alias: {
'@': fileURLToPath(new URL('./src', import.meta.url)), '@': fileURLToPath(new URL('./src', import.meta.url)),
'~bootstrap': path.resolve(__dirname, 'node_modules/bootstrap'), '~bootstrap': resolve('node_modules/bootstrap'),
'~quill': path.resolve(__dirname, 'node_modules/quill'), '~quill': resolve('node_modules/quill'),
} }
}, },
css: { css: {
@ -30,7 +38,7 @@ export default defineConfig({
server: { server: {
proxy: { proxy: {
'^/api/': { '^/api/': {
target: 'http://127.0.0.1:8001/', target: 'https://freeleaps-alpha.com',
ws: true, ws: true,
changeOrigin: true changeOrigin: true
} }