Commit d53da8aa authored by Reza Sahebgharan's avatar Reza Sahebgharan

Login And Register UI

parent 51143539
......@@ -15,3 +15,4 @@ shell-server@0.4.0 # Server-side component of the `meteor shell` comm
accounts-password
ardatan:webpack
ardatan:webpack-dev-middleware
http
......@@ -28,6 +28,7 @@ es5-shim@4.8.0
fetch@0.1.1
geojson-utils@1.0.10
hot-code-push@1.0.4
http@1.4.2
id-map@1.1.0
inter-process-messaging@0.1.0
launch-screen@1.1.1
......@@ -63,5 +64,6 @@ socket-stream-client@0.2.2
srp@1.0.12
tracker@1.2.0
underscore@1.0.10
url@1.2.0
webapp@1.7.4
webapp-hashing@1.0.9
<template>
<v-footer inset elevation="24" color="teal lighten-3" app height="70">
<v-footer inset elevation="24" color="#0065613b" app height="30">
<v-row justify="center" align="center" class="text-center red--text">
<v-menu transition="slide-x-transition">
<template v-slot:activator="{ on }">
......@@ -18,8 +18,9 @@
</v-list-item>
</v-list>
</v-menu>
<strong>{{ new Date().getFullYear() }}</strong>
<v-img src="img/0.png" contain max-height="60" max-width="60"></v-img>
<!-- <v-img src="/img/0.png" contain max-height="60" max-width="60"></v-img> -->
<h5>©2005-{{ new Date().getFullYear() }} MARCO PACS</h5>
</v-row>
</v-footer>
</template>
......
<template>
<v-app-bar app elevation="24" color="teal lighten-3">
<!-- <v-app-bar app elevation="24" color="teal lighten-3"> -->
<v-app-bar app elevation="24" color="#0065613b">
<v-toolbar-title class="red--text">{{$t('AppHeader.appName')}}</v-toolbar-title>
<v-spacer></v-spacer>
<v-btn text color="red red--text" :to="btnTo">
......
<template>
<v-navigation-drawer app right clipped :width="$vuetify.breakpoint.width/3" bottom>
<v-list dense>
<v-list-item>
<v-list-item-action>
<v-icon>mdi-exit-to-app</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>Open Temporary Drawer</v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-list>
</v-navigation-drawer>
</template>
\ No newline at end of file
<template>
<div style="width:100%" class="d-flex fill-height align-start justify-center flex-wrap">
<div style="width:100%;display:flex;justify-content:center">
<v-card outlined raised>
<v-card outlined raised>
<v-card-actions>
<v-combobox
v-model="model"
:items="items"
:search-input.sync="search"
hide-selected
label="please select a machine"
persistent-hint
small-chips
clearable
>
<template v-if="noData" v-slot:no-data>
<v-list-item>
<v-list-item-content>
<v-list-item-title>
No results matching "
<strong>{{ search }}</strong>". Press
<kbd>enter</kbd> to create a new one
</v-list-item-title>
</v-list-item-content>
</v-list-item>
</template>
</v-combobox>
<v-btn text color="deep-purple accent-4">Search</v-btn>
</v-card-actions>
</v-card>
<v-card-actions class="d-flex flex-wrap justify-center">
<v-btn-toggle v-model="toggle_exclusive" mandatory>
<v-btn class="green">
<v-icon left v-if="toggle_exclusive==0">done</v-icon>
<strong>All</strong>
</v-btn>
<v-btn class="green" style="margin-left:0px;margin-right:0px">
<v-icon left v-if="toggle_exclusive==1">done</v-icon>
<strong>unknown</strong>
</v-btn>
</v-btn-toggle>
<v-btn class="ma-3" rounded>
<strong>Export To Excel</strong>
</v-btn>
</v-card-actions>
</v-card>
</div>
<div style="width:100%;display:flex;justify-content:center" class="ma-3">
<v-data-table
v-model="selected"
:headers="headers"
:items="desserts"
single-select
item-key="name"
show-select
class="elevation-1"
disable-pagination
hide-default-footer
height="600"
style="width:100%"
></v-data-table>
</div>
</div>
</template>
<script>
export default {
data: () => ({
items: ["Gaming", "Programming", "Vue", "Vuetify"],
model: ["Vuetify"],
search: null,
chips: true,
multiple: true,
hideSelected: true,
noData: true,
clearable: false,
toggle_exclusive: 0,
selected: [],
headers: [
{
text: "Dessert (100g serving)",
align: "left",
sortable: false,
value: "name"
},
{ text: "Calories", value: "calories" },
{ text: "Fat (g)", value: "fat" },
{ text: "Carbs (g)", value: "carbs" },
{ text: "Protein (g)", value: "protein" },
{ text: "Iron (%)", value: "iron" }
],
desserts: [
{
name: "Frozen Yogurt",
calories: 159,
fat: 6.0,
carbs: 24,
protein: 4.0,
iron: "1%"
},
{
name: "Ice cream sandwich",
calories: 237,
fat: 9.0,
carbs: 37,
protein: 4.3,
iron: "1%"
},
{
name: "Eclair",
calories: 262,
fat: 16.0,
carbs: 23,
protein: 6.0,
iron: "7%"
},
{
name: "Cupcake",
calories: 305,
fat: 3.7,
carbs: 67,
protein: 4.3,
iron: "8%"
},
{
name: "Gingerbread",
calories: 356,
fat: 16.0,
carbs: 49,
protein: 3.9,
iron: "16%"
},
{
name: "Jelly bean",
calories: 375,
fat: 0.0,
carbs: 94,
protein: 0.0,
iron: "0%"
},
{
name: "Lollipop",
calories: 392,
fat: 0.2,
carbs: 98,
protein: 0,
iron: "2%"
},
{
name: "Honeycomb",
calories: 408,
fat: 3.2,
carbs: 87,
protein: 6.5,
iron: "45%"
},
{
name: "Donut",
calories: 452,
fat: 25.0,
carbs: 51,
protein: 4.9,
iron: "22%"
},
{
name: "KitKat",
calories: 518,
fat: 26.0,
carbs: 65,
protein: 7,
iron: "6%"
},
{
name: "Frozen Yogurt",
calories: 159,
fat: 6.0,
carbs: 24,
protein: 4.0,
iron: "1%"
},
{
name: "Ice cream sandwich",
calories: 237,
fat: 9.0,
carbs: 37,
protein: 4.3,
iron: "1%"
},
{
name: "Eclair",
calories: 262,
fat: 16.0,
carbs: 23,
protein: 6.0,
iron: "7%"
},
{
name: "Cupcake",
calories: 305,
fat: 3.7,
carbs: 67,
protein: 4.3,
iron: "8%"
},
{
name: "Gingerbread",
calories: 356,
fat: 16.0,
carbs: 49,
protein: 3.9,
iron: "16%"
},
{
name: "Jelly bean",
calories: 375,
fat: 0.0,
carbs: 94,
protein: 0.0,
iron: "0%"
},
{
name: "Lollipop",
calories: 392,
fat: 0.2,
carbs: 98,
protein: 0,
iron: "2%"
},
{
name: "Honeycomb",
calories: 408,
fat: 3.2,
carbs: 87,
protein: 6.5,
iron: "45%"
},
{
name: "Donut",
calories: 452,
fat: 25.0,
carbs: 51,
protein: 4.9,
iron: "22%"
},
{
name: "KitKat",
calories: 518,
fat: 26.0,
carbs: 65,
protein: 7,
iron: "6%"
}
]
})
};
</script>
\ No newline at end of file
......@@ -5,7 +5,7 @@ Vue.use(VueI18n);
const messages = {
'en': {
Login: {
loginHeader: 'Login Form',
loginHeader: 'Login',
registerBtn: 'Register',
username: 'username',
password: 'password',
......@@ -15,7 +15,7 @@ const messages = {
min8Character: 'Min 8 Characters'
},
Register: {
registerHeader: 'Signup',
registerHeader: 'Register',
loginBtn: 'login',
username: 'username',
password: 'password',
......
......@@ -3,6 +3,9 @@ import Home from '../views/Home.vue';
import Register from '../views/Register.vue';
import Main from '../views/Main.vue';
import EditWorkList from '../components/EditWorkList.vue';
import WorkList from '../components/WorkList.vue';
const routes = [{
path: '/',
component: Home,
......@@ -21,7 +24,15 @@ const routes = [{
{
path: '/main',
component: Main,
name: 'main'
name: 'main',
children: [{
path: "worklist",
name: "worklist",
components: {
default: WorkList,
edit_worklist: EditWorkList
}
}]
}
];
......
......@@ -7,28 +7,28 @@ import Vuetify from 'vuetify';
import '../../public/fonts/font.css';
Vue.use(Vuetify);
import fa from 'vuetify/es5/locale/fa';
import en from 'vuetify/es5/locale/en';
// import fa from 'vuetify/es5/locale/fa';
// import en from 'vuetify/es5/locale/en';
import VueI18n from 'vue-i18n';
Vue.use(VueI18n);
// import VueI18n from 'vue-i18n';
// Vue.use(VueI18n);
import messages from './i18n';
// import messages from './i18n';
const i18n = new VueI18n({
locale: 'fa', // set locale
fallbackLocale: 'en', // set fallback locale
messages, // set locale messages
});
// const i18n = new VueI18n({
// locale: 'fa', // set locale
// fallbackLocale: 'en', // set fallback locale
// messages, // set locale messages
// });
export default new Vuetify({
lang: {
locales: { fa, en },
current: 'fa',
t: (key, ...params) => i18n.t(key, params),
},
// lang: {
// locales: { fa, en },
// current: 'fa',
// t: (key, ...params) => i18n.t(key, params),
// },
icons: {
iconfont: 'mdi', // default - only for display purposes
},
......
......@@ -3,10 +3,17 @@
</template>
<script>
import { Meteor } from "meteor/meteor";
export default {
beforeRouteEnter(to, from, next) {
next(vm => {
vm.$router.push('/login');
debugger;
// if (Meteor.userId()) {
// vm.$router.push("/main/worklist");
// } else {
// vm.$router.push("/login");
// }
vm.$router.push("/login");
});
}
};
......
<template>
<!-- <fragment> -->
<!-- <div style="height:100%"> -->
<v-content class="fill-height">
<auth-header btnToProp="register" btnLabel="Login.registerBtn" btnIconName="mdi-account-plus"></auth-header>
<v-container fluid class="align-center fill-height backgroundImg">
<img src="../../public/img/radio2.png" />
<v-row justify="center" class="loginCard">
<v-col xs="12" sm="8" md="4">
<v-card class="elevation-12" light elevation="24">
<v-toolbar color="light-green" dark>
<v-col xs="8" sm="6" md="4" lg="3">
<v-card class="elevation-12 roundedCard" light elevation="24">
<v-toolbar color="rgb(94, 181, 177,.85)" dark>
<v-icon class="ma-3">mdi-login</v-icon>
<v-toolbar-title>{{$t('Login.loginHeader')}}</v-toolbar-title>
</v-toolbar>
<v-card-text>
<v-card-text class="d-flex align-center justify-center">
<v-img src="/img/0.png" contain height="150" width="150"></v-img>
<v-form>
<v-text-field
:label="$t('Login.username')"
prepend-icon="mdi-account-circle"
:rules="[rules.required]"
v-model="username"
/>
<v-text-field
:type="!showPassword?'password' :'text'"
......@@ -27,12 +28,20 @@
:append-icon="showPassword ? 'mdi-eye': 'mdi-eye-off'"
:hint="$t('Login.passwordHint')"
:rules="[rules.required, rules.min]"
v-model="password"
/>
</v-form>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="light-green white--text" to="/main">
<v-btn
style="width:100%"
color="rgb(94, 181, 177,.85)"
rounded
dark
@click="loginUser()"
>
<v-icon left>mdi-login</v-icon>
<small>{{$t('Login.loginBtn')}}</small>
</v-btn>
......@@ -40,17 +49,28 @@
</v-card>
</v-col>
</v-row>
<ul class="bubble-boxes">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</v-container>
<app-footer></app-footer>
<!-- </fragment> -->
<!-- </div> -->
</v-content>
</template>
<script>
import AppFooter from "../components/AppFooter.vue";
import AuthHeader from "../components/AuthHeader.vue";
import { Meteor } from "meteor/meteor";
export default {
components: {
"app-footer": AppFooter,
......@@ -59,6 +79,8 @@ export default {
data() {
return {
showPassword: false,
username: null,
password: null,
rules: {
required: value => !!value || this.$t("Login.required"),
min: v => {
......@@ -67,6 +89,33 @@ export default {
}
}
};
},
methods: {
loginUser() {
debugger;
const that = this;
if ((this.username != null) & (this.password != null)) {
Meteor.loginWithPassword(this.username, this.password, function(
error,
result
) {
console.log(result);
if (error) {
console.log(error);
} else {
that.$router.push("/main/worklist");
}
});
}
}
},
beforeRouteEnter(to, from, next) {
next(vm => {
debugger;
// if (Meteor.userId()) {
// vm.$router.push("/main/worklist");
// }
});
}
};
</script>
......@@ -74,6 +123,12 @@ export default {
<style scoped>
.backgroundImg {
background-color: #abdae4ad;
background-image: linear-gradient(
141deg,
#9fb8ad 0%,
#1fc8db 51%,
#2ce8ceb0 75%
);
}
img {
......@@ -88,6 +143,17 @@ img {
z-index: 0;
}
.backgroundSheet {
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 100%;
overflow-y: hidden;
z-index: 0;
}
.loginCard {
z-index: 10;
}
......@@ -95,4 +161,9 @@ img {
.backgroundImg {
overflow-y: hidden;
}
.roundedCard {
border-radius: 20px;
}
@import url("./css/bubbles.css");
</style>
\ No newline at end of file
......@@ -3,7 +3,7 @@
<!-- <v-content class="fill-height"> -->
<template v-if="!$vuetify.rtl">
<v-navigation-drawer v-model="drawerRight" app right clipped>
<!-- <v-navigation-drawer v-model="drawerRight" app right clipped :width="$vuetify.breakpoint.width/3" bottom>
<v-list dense>
<v-list-item @click.stop="right = !right">
<v-list-item-action>
......@@ -13,8 +13,12 @@
<v-list-item-title>Open Temporary Drawer</v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-list>right
</v-navigation-drawer>
</v-list>
</v-navigation-drawer>-->
<keep-alive>
<router-view name="edit_worklist"></router-view>
</keep-alive>
<v-app-bar app clipped-right color="teal lighten-3" dark>
<v-app-bar-nav-icon @click.stop="drawer = !drawer"></v-app-bar-nav-icon>
......@@ -76,7 +80,7 @@
<v-content class="fill-height">
<v-container class="fill-height" fluid>
<v-row justify="center" align="center">
<!-- <v-row justify="center" align="center">
<v-col class="shrink">
<v-tooltip right>
<template v-slot:activator="{ on }">
......@@ -101,7 +105,8 @@
<span>Codepen</span>
</v-tooltip>
</v-col>
</v-row>
</v-row> -->
<router-view></router-view>
</v-container>
</v-content>
......@@ -118,7 +123,7 @@ import AppFooter from "../components/AppFooter.vue";
export default {
components: {
"app-footer": AppFooter,
"fragment": Fragment
fragment: Fragment
},
props: {
source: String
......
......@@ -3,11 +3,11 @@
<v-content class="fill-height">
<auth-header btnToProp="login" btnLabel="Register.loginBtn" btnIconName="mdi-login"></auth-header>
<v-container fluid class="align-center fill-height backgroundImg">
<img src="../../public/img/radio2.png" />
<v-row justify="center" class="loginCard">
<v-col xs="12" sm="8" md="4">
<v-card class="elevation-12" light elevation="24">
<v-toolbar color="light-green" dark>
<v-col xs="8" sm="6" md="4" lg="3">
<v-card class="elevation-12 roundedCard" light elevation="24">
<v-toolbar color="rgb(94, 181, 177,.85)" dark>
<v-icon class="ma-3">mdi-account-plus</v-icon>
<v-toolbar-title>{{$t('Register.registerHeader')}}</v-toolbar-title>
</v-toolbar>
<v-card-text>
......@@ -16,6 +16,7 @@
:label="$t('Register.username')"
prepend-icon="mdi-account-circle"
:rules="[rules.required]"
v-model="username"
/>
<v-text-field
:type="!showPassword1?'password' :'text'"
......@@ -39,7 +40,7 @@
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="light-green white--text">
<v-btn style="width:100%" dark color="rgb(94, 181, 177,.85)" rounded @click="createAccount()">
<v-icon left>mdi-login</v-icon>
<small>{{$t('Register.registerBtn')}}</small>
</v-btn>
......@@ -47,6 +48,18 @@
</v-card>
</v-col>
</v-row>
<ul class="bubble-boxes">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</v-container>
<app-footer></app-footer>
</v-content>
......@@ -56,6 +69,7 @@
<script>
import AppFooter from "../components/AppFooter.vue";
import AuthHeader from "../components/AuthHeader.vue";
import { Accounts } from "meteor/accounts-base";
export default {
components: {
"app-footer": AppFooter,
......@@ -63,6 +77,7 @@ export default {
},
data() {
return {
username: null,
firstPass: undefined,
secondPass: undefined,
showPassword1: false,
......@@ -80,6 +95,35 @@ export default {
}
}
};
},
methods: {
createAccount() {
debugger;
const username = this.username;
const password = this.firstPass;
const that = this;
if (this.firstPass == this.secondPass && this.username != null) {
Accounts.createUser(
{
username: this.username,
password: this.firstPass
},
function(error, result) {
if (error) {
return;
} else {
Meteor.loginWithPassword(username, password, function(error) {
if (error) {
console.log(error);
} else {
that.$router.push("/main/worklist");
}
});
}
}
);
}
}
}
};
</script>
......@@ -87,6 +131,12 @@ export default {
<style scoped>
.backgroundImg {
background-color: #abdae4ad;
background-image: linear-gradient(
141deg,
#9fb8ad 0%,
#1fc8db 51%,
#2ce8ceb0 75%
);
}
img {
......@@ -108,4 +158,8 @@ img {
.backgroundImg {
overflow-y: hidden;
}
.roundedCard {
border-radius: 20px;
}
</style>
\ No newline at end of file
/*Bubble Boxes Animation CSS*/
.bubble-boxes {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 40%;
}
.bubble-boxes li {
position: absolute;
list-style: none;
display: flex;
width: 20px;
height: 20px;
background: rgba(255, 255, 255, .2);
animation: animate 25s linear infinite;
bottom: -800px;
}
.bubble-boxes li:nth-child(1) {
left: 25%;
width: 80px;
height: 80px;
animation-delay: 0;
}
.bubble-boxes li:nth-child(2) {
left: 10%;
width: 20px;
height: 20px;
animation-delay: 2s;
animation-duration: 12s;
}
.bubble-boxes li:nth-child(3) {
left: 70%;
width: 20px;
height: 20px;
animation-delay: 4s;
}
.bubble-boxes li:nth-child(4) {
left: 40%;
width: 60px;
height: 60px;
animation-delay: 0s;
animation-duration: 18s;
}
.bubble-boxes li:nth-child(5) {
left: 65%;
width: 20px;
height: 20px;
animation-delay: 0s;
}
.bubble-boxes li:nth-child(6) {
left: 75%;
width: 110px;
height: 110px;
animation-delay: 3s;
}
.bubble-boxes li:nth-child(7) {
left: 35%;
width: 150px;
height: 150px;
animation-delay: 7s;
}
.bubble-boxes li:nth-child(8) {
left: 50%;
width: 25px;
height: 25px;
animation-delay: 15s;
animation-duration: 45s;
}
.bubble-boxes li:nth-child(9) {
left: 20%;
width: 15px;
height: 15px;
animation-delay: 2s;
animation-duration: 35s;
}
.bubble-boxes li:nth-child(10) {
left: 85%;
width: 150px;
height: 150px;
animation-delay: 0s;
animation-duration: 12s;
}
@keyframes animate {
0% {
transform: translateY(0) rotate(0deg);
opacity: 1;
border-radius: 0;
}
100% {
transform: translateY(-1000px) rotate(720deg);
opacity: 1;
border-radius: 50%;
}
}
\ No newline at end of file
import { Meteor } from 'meteor/meteor';
import { Accounts } from 'meteor/accounts-base'
Meteor.methods({
'Fetchworklist' () {
debugger;
this.unblock();
try {
const result = HTTP.call('GET', 'http://192.168.4.105:2050/Broker/HISIntegration.svc/rest/Fetchworklist/ratio');
console.log(result);
return true;
} catch (e) {
// Got a network error, timeout, or HTTP error in the 400 or 500 range.
return false;
}
}
});
\ No newline at end of file
......@@ -6360,9 +6360,9 @@
"dev": true
},
"vuetify": {
"version": "2.0.10",
"resolved": "https://registry.npmjs.org/vuetify/-/vuetify-2.0.10.tgz",
"integrity": "sha512-JgJJnD4e1/relDtu/448+nBn3J2ncXyk0YH4uZAAGM6XyUOpKMnLvv3Q+ZCnIxA1D6yp+wEknyzsfx2N9MgVwg=="
"version": "2.0.15",
"resolved": "https://registry.npmjs.org/vuetify/-/vuetify-2.0.15.tgz",
"integrity": "sha512-3x/YwEaf7nCHDBfAeB1HZZ9ltgX3Bu9zhfCmq3ZGbuylLrKJMR4bp5xY3chVq1DAalXs0eqV69TbEkkSt1Iwkg=="
},
"vuetify-loader": {
"version": "1.3.0",
......
......@@ -22,7 +22,7 @@
"vue-meteor-tracker": "^2.0.0-beta.5",
"vue-router": "^3.1.2",
"vue-template-compiler": "^2.6.10",
"vuetify": "^2.0.5",
"vuetify": "^2.0.15",
"vuex": "^3.1.1"
},
"devDependencies": {
......
import { Meteor } from 'meteor/meteor';
import '../imports/api/methods/worklist.js';
Meteor.startup(() => {
// code to run on server at startup
});
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment