Skip to content
Snippets Groups Projects
Commit bd0ba007 authored by moon's avatar moon
Browse files

Merge branch 'user_interaction' into develop

# Conflicts:
#	web/src/components/js/const.js
parents e961567e a25fa6a1
No related branches found
No related tags found
No related merge requests found
const namespaced = true
const state = {
jwt: null,
userData: null,
userRole: null,
}
const mutations = {
SET_JWT (state, jwt) {
state.jwt = jwt
},
SET_USER_DATA (state, userData) {
state.userData = userData
},
SET_USER_ROLE (state, userRole) {
state.userRole = userRole
},
LOG_OUT (state) {
state.jwt = null
state.userData = null
state.userRole = null
},
}
const getters = {
jwt: state => state.jwt,
userData: state => state.userData,
userRole: state => state.userRole,
}
const actions = {
setJwt ({ commit }, jwt) {
commit('SET_JWT', jwt)
},
setUserData ({ commit }, userData) {
commit('SET_USER_DATA', userData)
},
setUserRole ({ commit }, userRole) {
commit('SET_USER_ROLE', userRole)
},
logOut ({ commit }) {
commit('LOG_OUT')
},
}
export default {
namespaced,
state,
mutations,
getters,
actions
}
<template>
<div>
<div class="flex items-center justify-center">
<div class="sm:block">
<div class="p-5 mx-auto text-left font-raleway">
<h1 class="font-bold text-left font-montserrat text-3xl sm:text-5xl mb-7">
Recover Your DD-Code Password
</h1>
<p v-show="done" class="text-lg text-green-500">Password reset link has been sent to {{ email }}</p>
<p v-show="error" class="text-lg text-red-500">An error occurred</p>
<form @submit="forgotPassword">
<div class="my-4">
<h1 class="text-left font-bold mb-5 text-xl sm:text-2xl font-montserrat">Email</h1>
<input type="email" v-model="email" class="text-xl outline-none pb-5 w-4/5 bg-transparent border-b hover:border-blue-700 focus:border-blue-700">
</div>
<button type="submit" class="bg-green-400 p-5 text-white">
Send Email link <span class="fa fa-arrow-right"/>
</button>
</form>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'ForgotPassword',
data() {
return {
email: '',
done: false,
error: false,
}
},
methods: {
async forgotPassword(e) {
e.preventDefault()
this.done = false;
this.error = false;
this.axios.post(`http://localhost:1337/api/auth/forgot-password`, {
email: this.email
})
.then(() => {
this.done = true
})
.catch(e => {
e;
this.error = true
})
}
}
}
</script>
<style>
@import url('~@/assets/bootstrap.css');
a {
color: #42b983;
}
</style>
<template>
<div class="overflow-x-hidden">
<Nav class="z-20" />
<!-- Hero section -->
<HeroSection />
<!-- featured section -->
<FeaturedSection />
</div>
</template>
<script>
// @ is an alias to /src
import Nav from '@/components/Nav.vue'
import HeroSection from '@/components/HeroSection.vue'
import FeaturedSection from '@/components/FeaturedSection.vue'
export default {
name: 'Home',
components: {
Nav,
HeroSection,
FeaturedSection
}
}
</script>
\ No newline at end of file
<template>
<div>
<div class="flex items-center justify-center">
<div class="sm:block">
<div class="p-5 mx-auto text-left font-raleway">
<h1 class="font-bold text-left font-montserrat text-3xl sm:text-5xl mb-7">
Login to DD-Code
</h1>
<p v-show="error" class="text-lg text-red-500">{{ errorMsg }}</p>
<form @submit="login">
<div class="my-4">
<h1 class="text-left font-bold mb-2 text-xl sm:text-2xl font-montserrat">Email</h1>
<input type="email" v-model="email" class="text-xl outline-none pt-3 pb-3 w-4/5 bg-transparent border-b hover:border-blue-700 focus:border-blue-700">
</div>
<div class="my-4">
<h1 class="text-left font-bold mb-2 text-xl sm:text-2xl font-montserrat">Password</h1>
<input type="password" v-model="password" class="text-xl outline-none pt-3 pb-3 w-4/5 bg-transparent border-b hover:border-blue-700 focus:border-blue-700">
</div>
<button type="submit" :disabled="password.length < 3" class="bg-green-400 p-5 text-white">
Login <span class="fa fa-arrow-right"/>
</button>
<p class="my-2">
<router-link to="/forgotpassword" >Forgot Password?</router-link>
</p>
<p class="my-2">
<router-link to="/signup" >Need Sign Up?</router-link>
</p>
</form>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'Login',
data() {
return {
email: '',
password: '',
error: false,
errorMsg: `An error occurred, please try again`
}
},
computed: {
userData: function () {
return this.$store.getters['User/userData']
},
},
methods: {
async login(e) {
e.preventDefault()
try {
const res = await this.axios.post(`http://localhost:1337/api/auth/local`, {
identifier: this.email,
password: this.password
});
const { jwt, user } = res.data
// console.log(user)
window.localStorage.setItem('jwt', jwt)
window.localStorage.setItem('userData', JSON.stringify(user))
this.$store.dispatch('User/setJwt', jwt)
this.$store.dispatch('User/setUserData', user)
this.$router.push('/profile')
} catch(error) {
// console.log(error.response.data.error.message)
this.error = true
this.password = ''
}
},
},
mounted: function () {
const vm = this
if(vm.userData !== null) {
this.$router.push('/profile')
}
}
}
</script>
<style>
@import url('~@/assets/bootstrap.css');
a {
color: #42b983;
}
</style>
\ No newline at end of file
<template>
<div id="page-content-wrapper" class="main">
<fetch-profile v-if="userData !== null">
<template slot-scope="{response, loading}">
<slot :response="response" :loading="loading">
<div v-if="loading || response === null"></div>
<div v-else>
<!-- {{response}}-->
<h4 class="round">User Profile</h4>
<div class="panel panel-default">
<div class="panel-body">
<div class="container-fluid col-md-12">
<div class="row">
<div class="text col-sm-3">User Name</div>
<div class="col-sm-9">
<b>{{response.username}}</b>
</div>
</div>
<div class="row">
<div class="text col-sm-3">Email</div>
<div class="col-sm-9">
{{response.email}}
</div>
</div>
<div class="row">
<div class="text col-sm-3">Role</div>
<div class="col-sm-9">
{{setRole(response.role.name)}}
</div>
</div>
<div class="row">
<div class="text col-sm-3">Affiliation</div>
<div class="col-sm-9">
{{response.Affiliation}}
</div>
</div>
<div class="row">
<div class="text col-sm-3">Link</div>
<div class="col-sm-9">
{{response.ProfileLink}}
</div>
</div>
<div class="row">
<div class="text col-sm-3">Joined</div>
<div class="col-sm-9">
{{response.createdAt}}
</div>
</div>
<div class="row">
<div class="text col-sm-3">Updated</div>
<div class="col-sm-9">
{{response.updatedAt}}
</div>
</div>
</div>
</div>
</div>
<button class="btn btn-primary" @click="$router.push('/updateitem/new')">
Create new Update Item
</button>
</div>
</slot>
</template>
</fetch-profile>
<h4 class="round">Update Items</h4>
<fetch-update-items v-if="userData !== null">
<template slot-scope="{response, loading}">
<slot :response="response" :loading="loading">
<div v-if="loading || response === null"></div>
<div v-else>
<update-item-table id="update-item-table" :data="response.data">
</update-item-table>
</div>
</slot>
</template>
</fetch-update-items>
<fetch-users v-if="getRole ==='Administrator'">
<template slot-scope="{response, loading}">
<slot :response="response" :loading="loading">
<div v-if="loading || response === null"></div>
<div v-else>
<h4 class="round">User List</h4>
<user-table id="usersTable" :data="response" />
</div>
</slot>
</template>
</fetch-users>
</div>
</template>
<script>
import FetchProfile from "@/components/CMS/fetchProfile";
import FetchUpdateItems from "@/components/CMS/fetchUpdateItems";
import UpdateItemTable from "@/components/UpdateItemTable";
import FetchUsers from "@/components/CMS/fetchUsers"
import UserTable from '../components/UserTable.vue';
const _ = require('lodash')
export default {
name: 'ProfilePage',
components: {
FetchProfile, FetchUpdateItems, UpdateItemTable,
UserTable, FetchUsers
},
props: {
msg: String
},
data() {
return {
isDev: process.env.NODE_ENV === 'development'
}
},
computed: {
userData: function () {
return this.$store.getters['User/userData']
},
getRole: function(){
return this.$store.getters['User/userRole']
}
},
methods: {
setRole(roleName) {
//console.log("role name is,", roleName);
const vm = this
window.localStorage.setItem('roleName', roleName)
vm.$store.dispatch('User/setUserRole', roleName)
return roleName
},
},
mounted: function () {
const vm = this
if(vm.userData === null) {
this.$router.push('/login')
}
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style>
@import url('~@/assets/bootstrap.css');
.main {
margin: 1.5rem;
}
h3 {
margin: 40px 0 0;
}
a {
color: #42b983;
}
.panel {
font-size: 1.2rem;
}
ul.a {
list-style-type: disc;
list-style-position: inside;
}
</style>
<template>
<div>
<div class="flex items-center justify-center">
<div class="sm:block">
<div class="p-5 mx-auto text-left font-raleway">
<h1 class="font-bold text-left font-montserrat text-3xl sm:text-5xl mb-10">
Recover Your DD-Code Password
</h1>
<p v-show="error" class="text-lg text-red-500">An Error Occurred, Please Try Again</p>
<form @submit="resetPassword">
<div class="my-4">
<h1 class="text-left font-bold mb-5 text-xl sm:text-2xl font-montserrat">Password</h1>
<input type="password" v-model="password" class="text-xl outline-none pb-5 w-4/5 bg-transparent border-b hover:border-blue-700 focus:border-blue-700">
</div>
<div class="my-4">
<h1 class="text-left font-bold mb-5 text-xl sm:text-2xl font-montserrat">Confirm Password</h1>
<input type="password" v-model="confirmPassword" class="text-xl outline-none pb-5 w-4/5 bg-transparent border-b hover:border-blue-700 focus:border-blue-700">
</div>
<button type="submit" :disabled="password.length < 3 || password !== confirmPassword" class="bg-green-400 p-5 text-white">
Reset Password <span class="fa fa-arrow-right"/>
</button>
</form>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'ResetPassword',
data() {
return {
password: '',
confirmPassword: '',
done: false,
error: false,
}
},
methods: {
async resetPassword(e) {
e.preventDefault()
this.axios.post(`http://localhost:1337/api/auth/reset-password`, {
code: this.$route.query.code,
password: this.password,
passwordConfirmation: this.confirmPassword
})
.then(() => {
this.done = true
this.$router.push("login")
})
.catch(e => {
e;
this.error = true
})
}
},
}
</script>
<style>
@import url('~@/assets/bootstrap.css');
a {
color: #42b983;
}
</style>
<template>
<div>
<div class="flex items-center justify-center">
<div class="sm:block">
<div class="p-5 mx-auto text-left font-raleway">
<h1 class="font-bold text-left font-montserrat text-3xl sm:text-5xl mb-7">
Sign Up to join DD-Code
</h1>
<p v-show="error" class="text-lg text-red-500">{{ errorMsg }}</p>
<form @submit="register">
<div class="my-4">
<h1 class="text-left font-bold mb-2 text-xl sm:text-2xl font-montserrat">Name</h1>
<input type="text" v-model="name" class="text-xl outline-none pb-2 w-4/5 bg-transparent border-b hover:border-blue-700 focus:border-blue-700">
</div>
<div class="my-4">
<h1 class="text-left font-bold mb-2 text-xl sm:text-2xl font-montserrat">Email</h1>
<input type="email" v-model="email" class="text-xl outline-none pb-2 w-4/5 bg-transparent border-b hover:border-blue-700 focus:border-blue-700">
</div>
<div class="my-4">
<h1 class="text-left font-bold mb-2 text-xl sm:text-2xl font-montserrat">Password</h1>
<input type="password" v-model="password" class="text-xl outline-none pb-2 w-4/5 bg-transparent border-b hover:border-blue-700 focus:border-blue-700">
</div>
<div class="my-4">
<h1 class="text-left font-bold mb-2 text-xl sm:text-2xl font-montserrat">Username</h1>
<input type="text" v-model="username" class="text-xl outline-none pb-2 w-4/5 bg-transparent border-b hover:border-blue-700 focus:border-blue-700">
</div>
<button type="submit" :disabled="name.length < 6 || password.length < 6 || username.length < 3" class="bg-green-400 p-5 text-white">
Sign Up <span class="fa fa-arrow-right"/>
</button>
</form>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'Register',
data() {
return {
name: '',
email: '',
password: '',
username: '',
error: false,
errorMsg: `An Error occurred, please try again`
}
},
methods: {
async register(e) {
const vm = this
try {
e.preventDefault()
await vm.axios.post(`http://localhost:1337/api/auth/local/register`, {
name: vm.name,
password: vm.password,
email: vm.email,
username: vm.username
})
vm.$router.push('login')
} catch(e) {
// console.error(e)
vm.error = true
vm.email = ''
}
}
}
}
</script>
<style>
@import url('~@/assets/bootstrap.css');
a {
color: #42b983;
}
</style>
\ No newline at end of file
<template>
<div>
<div class="flex items-center justify-center">
<h3 v-show="error" class="text-2xl text-red-500">{{ errorMsg }}</h3>
<div v-if="item === 'new' || loaded" class="md:flex card p-2 mt-5">
<div class="p-5 mx-auto text-left font-raleway container max-w-screen-md">
<h1 class="font-bold text-left font-montserrat text-3xl sm:text-5xl mb-7">
{{ item === 'new'? 'Create new Update Item' : item }}
</h1>
<form @submit="update" class="w-full md:w-auto">
<div class="md:flex md:items-center mx-3 mb-6">
<div class="md:w-1/3">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-entity-type">
Entity Type
</label>
</div>
<div class="md:w-2/3">
<select v-model="entity" class="bg-white w-full py-2 text-gray-700 outline-none bg-transparent border-b hover:border-blue-700 focus:bg-gray-200 focus:border-blue-700" id="inline-entity-type" >
<option disabled value="">Please select one</option>
<option>Protein</option>
<option>Condensate</option>
<option>Condensate_Protein</option>
</select>
</div>
</div>
<div class="md:flex md:items-center mx-3 mb-6">
<div class="md:w-1/3">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-entity-id">
Entity ID
</label>
</div>
<div class="md:w-2/3">
<input v-model="entityId" class="bg-white w-full py-2 text-gray-700 outline-none bg-transparent border-b hover:border-blue-700 focus:bg-gray-200 focus:border-blue-700" id="inline-entity-id" type="text" placeholder="UNE6">
</div>
</div>
<div class="md:flex md:items-center mx-3 mb-6">
<div class="md:w-1/3">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-change-operation">
Change Operation
</label>
</div>
<div class="md:w-2/3">
<select v-model="changeOperation" class="bg-white w-full py-2 text-gray-700 outline-none bg-transparent border-b hover:border-blue-700 focus:bg-gray-200 focus:border-blue-700" id="inline-change-operation" >
<option disabled value="">Please select one</option>
<option>Add</option>
<option>Remove</option>
<option>Update</option>
</select>
</div>
</div>
<div class="md:flex md:items-center mx-3 mb-6">
<div class="md:w-1/3">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-attribute-name">
Attribute Name
</label>
</div>
<div class="md:w-2/3">
<input v-model="attribute" class="bg-white w-full py-2 text-gray-700 outline-none bg-transparent border-b hover:border-blue-700 focus:bg-gray-200 focus:border-blue-700" id="inline-attribute-name" type="text" placeholder="functional_type">
</div>
</div>
<div class="md:flex md:items-center mx-3 mb-6">
<div class="md:w-1/3">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-attribute-value">
Attribute Value
</label>
</div>
<div class="md:w-2/3">
<input v-model="attributeValue" class="bg-white w-full py-2 text-gray-700 outline-none bg-transparent border-b hover:border-blue-700 focus:bg-gray-200 focus:border-blue-700" id="inline-attribute-value" type="text" placeholder="driver">
</div>
</div>
<div class="md:flex md:items-center mx-3 mb-6">
<div class="md:w-1/3">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-comment">
Comments
</label>
</div>
<div class="md:w-2/3">
<input v-model="submissionComments" class="bg-white w-full py-2 text-gray-700 outline-none bg-transparent border-b hover:border-blue-700 focus:bg-gray-200 focus:border-blue-700" id="inline-comment" type="text" placeholder="your comments here">
</div>
</div>
<div v-if="item !== 'new'" class="md:flex md:items-center mx-3 mb-6">
<div class="md:w-1/3">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-status">
Status
</label>
</div>
<div class="md:w-2/3">
<p v-if="(userRole === 'Contributor' || userRole === 'Maintainer' || userRole === 'Administrator') && itemId !== 'new'" class="mt-3">
{{status}}
</p>
</div>
</div>
<div v-if="item !== 'new'" class="md:flex md:items-center mx-3 mb-6">
<div class="md:w-1/3">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-reviewer-comment">
Reviewer Comments
</label>
</div>
<div class="md:w-2/3">
<p v-if="(userRole === 'Contributor' || userRole === 'Maintainer' || userRole === 'Administrator') && itemId !== 'new'" class="mt-3">
{{reviewComments}}
</p>
</div>
</div>
<button type="submit" :disabled="entityId.length < 3" class="bg-green-400 p-5 text-white">
{{ item === 'new'? 'Submit' : 'Update' }} <span class="fa fa-arrow-right"/>
</button>
<div v-if="(userRole === 'Maintainer' || userRole === 'Administrator') && item !== 'new'" class="mt-10">
<hr/>
<div class="md:flex md:items-center mx-3 mb-6">
<div class="md:w-1/3">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-status">
Status
</label>
</div>
<div class="md:w-2/3">
<select v-model="status" class="bg-white w-full py-2 text-gray-700 outline-none bg-transparent border-b hover:border-blue-700 focus:bg-gray-200 focus:border-blue-700" id="inline-status" >
<option disabled value="">Please select one</option>
<option>Requested</option>
<option>Accepted</option>
<option>Rejected</option>
<option>Synced</option>
</select>
</div>
</div>
<div class="md:flex md:items-center mx-3 mb-6">
<div class="md:w-1/3">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-reviewer-comment">
Reviewer Comment
</label>
</div>
<div class="md:w-2/3">
<input v-model="reviewComments" class="bg-white w-full py-2 text-gray-700 outline-none bg-transparent border-b hover:border-blue-700 focus:bg-gray-200 focus:border-blue-700" id="inline-reviewer-comment" type="text" placeholder="reviewer comments here">
</div>
</div>
<div class="md:flex md:items-center mx-3 mb-6">
<div class="md:w-1/3">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-reviewer-comment">
Sync Response
</label>
</div>
<div class="md:w-2/3">
<p class="mt-3">
{{syncResponse}}
</p>
</div>
</div>
<button type="button" :disabled="entityId.length < 3" class="bg-green-400 p-5 text-white" @click="updateReview">
{{ 'Update Review' }} <span class="fa fa-arrow-right"/>
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'UpdateItem',
props: ['itemId'],
data() {
return {
item: this.$route.params.item ? this.$route.params.item : this.itemId,
entity: 'Protein', // [protein, condensate, condensate_protein]
entityId: '', // protein: <uniprot_id>, condensate: <canonical_id>, condensate_protein: <uniprot_id>==<canonical_id>
changeOperation: 'Add', // add/remove/update/update_add/update_remove
attribute: '', // protein: functional_type[driver/client/regulator], pubmed_ids[]
// condensate: description, proteins
// condensate_protein: confidence_score, pubmed_ids
attributeValue: '', // the value of the attribute to be updated. Could be "null" for add/remove operations. The data type is dynamic
status: 'Requested', // 1. Requested, 2. Accepted, 3. Rejected, 4. Patially_Accepted, 5. Synced
submittedBy: '',
submittedAt: '', // datetime
submissionComments: '',
reviewedBy: '',
reviewedAt: '', // datetime
reviewComments: '',
syncedAt: '', // datetime
syncResponse: '', // response from the sync process (errors if any)
loaded: false,
error: false,
errorMsg: `An error occurred, please try again`
}
},
computed: {
jwt: function () {
return this.$store.getters['User/jwt']
},
userData: function () {
return this.$store.getters['User/userData']
},
userRole: function () {
return this.$store.getters['User/userRole']
},
},
methods: {
async update(e) {
const vm = this;
e.preventDefault()
const jwt = vm.jwt;
if(jwt === null) {
vm.loaded = false;
return
}
// console.log(vm.userData)
let dat = {
Entity: this.entity,
EntityId: this.entityId,
Attribute: this.attribute,
Value: this.attributeValue,
ChangeOperation: this.changeOperation,
SubmissionComments: this.submissionComments,
Status: this.status,
// ReviewedBy:
// ReviewedAt:
// ReviewComment:
// SyncedAt:
// SyncResponse:
};
try {
if(vm.item !== 'new') {
const res = await this.axios.put(`http://localhost:1337/api/update-items/` + vm.item, {
data: dat,
}, {
headers: {
Authorization: `Bearer ${jwt}`
}
});
} else {
const res = await this.axios.post(`http://localhost:1337/api/update-items`, {
data: dat,
}, {
headers: {
Authorization: `Bearer ${jwt}`
}
});
}
// console.log(res)
vm.$router.push('/profile')
} catch(error) {
// console.log(error.response.data.error.message)
// console.log(error.response)
this.error = true
this.errorMsg = error
}
},
async load(id) {
const vm = this;
const jwt = vm.jwt;
if(jwt === null) {
vm.loaded = false;
return
}
// console.log(vm.userData)
try {
const res = await this.axios.get(`http://localhost:1337/api/update-items/` + id, {
headers: {
Authorization: `Bearer ${jwt}`
}
});
// console.log(res)
if(res.data.data) {
const d = res.data.data.attributes;
vm.item = res.data.data.id;
vm.entity = d.Entity;
vm.entityId = d.EntityId;
vm.attribute = d.Attribute;
vm.attributeValue = d.Value;
vm.changeOperation = d.ChangeOperation;
vm.status = d.Status;
vm.submissionComments = d.SubmissionComments;
vm.reviewComments = d.ReviewComments;
vm.reviewedBy = d.reviewedBy;
vm.reviewedAt = d.ReviewedAt;
// ReviewedBy:
// ReviewedAt:
// ReviewComment:
// SyncedAt:
// SyncResponse:
}
vm.loaded = true;
} catch(error) {
// console.error(error)
this.error = true
this.errorMsg = "You are not authorized to access this item."
setTimeout(() => vm.$router.go(-1), 2000);
}
},
async updateReview() {
const vm = this;
const jwt = vm.jwt;
if(jwt === null) {
vm.loaded = false;
return
}
// console.log(vm.userData)
let dat = {
Status: this.status,
ReviewComments: this.reviewComments,
ReviewedAt: this.reviewedAt
};
try {
await this.axios.put(`http://localhost:1337/api/update-item/review/` + vm.item, {
data: dat,
}, {
headers: {
Authorization: `Bearer ${jwt}`
}
});
// console.log(res)
vm.$router.go(-1)
} catch(error) {
// console.log(error.response.data.error.message)
// console.log(error.response)
this.error = true
this.errorMsg = error
}
}
},
mounted: function () {
const vm = this;
const jwt = vm.jwt;
if(jwt === null) {
vm.$router.push('/login')
} else {
if(vm.item !== 'new') {
vm.load(vm.item)
}
}
}
}
</script>
<style>
@import url('~@/assets/bootstrap.css');
a {
color: #42b983;
}
</style>
\ No newline at end of file
module.exports = {
purge: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
darkMode: false, // or 'media' or 'class'
theme: {
extend: {
fontFamily: {
'pacifico': ['Pacifico'],
'montserrat': ['Montserrat'],
'roboto': ['Roboto'],
'righteous': ['Righteous'],
'lato': ['Lato'],
'raleway': ['Raleway'],
}
},
},
variants: {
extend: {},
},
plugins: [],
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment