Commit 761f6ecc authored by Reza Sahebgharan's avatar Reza Sahebgharan

Change Password UI

parent b6147118
<template> <template>
<v-app>
<transition name="fade" mode="out-in"> <transition name="fade" mode="out-in">
<keep-alive> <keep-alive>
<router-view></router-view> <router-view></router-view>
</keep-alive> </keep-alive>
</transition> </transition>
</v-app>
</template> </template>
<script> <script>
...@@ -42,9 +42,18 @@ export default { ...@@ -42,9 +42,18 @@ export default {
</script> </script>
<style> <style>
#app { #inspire {
font-family: "Vazir"; font-family: "Vazir";
} }
/* label,span{
font-family: Vazir;
} */
.v-messages__message {
font-family: Vazir;
font-size: 0.5rem;
}
html { html {
overflow-y: auto !important; overflow-y: auto !important;
} }
......
<template> <template>
<v-footer inset elevation="24" color="#0065613b" app height="30"> <v-footer
<v-row justify="center" align="center" class="text-center red--text"> color="#c0d7d6"
<v-menu transition="slide-x-transition"> height="40px"
<template v-slot:activator="{ on }"> app
<v-btn elevation="24"
class="changeLangBtn" class="d-flex justify-center align-center text-center red--text"
color="red" >
dark <v-menu transition="slide-x-transition">
v-on="on" <template v-slot:activator="{ on }">
depressed <v-btn
text class="changeLangBtn"
>{{$t('AppFooter.appLang')}}</v-btn> color="red"
</template> dark
<v-list> v-on="on"
<v-list-item v-for="lng in langList" :key="lng.name" @click="setLang(lng.alias)"> depressed
<v-list-item-title>{{lng.name}}</v-list-item-title> text
</v-list-item> >{{$t('AppFooter.appLang')}}</v-btn>
</v-list> </template>
</v-menu> <v-list>
<!-- <v-img src="/img/0.png" contain max-height="60" max-width="60"></v-img> --> <v-list-item v-for="lng in langList" :key="lng.name" @click="setLang(lng.alias)">
<h5>©2005-{{ new Date().getFullYear() }} MARCO PACS</h5> <v-list-item-title>{{lng.name}}</v-list-item-title>
</v-list-item>
</v-row> </v-list>
</v-menu>
<h5>©2005-{{ new Date().getFullYear() }} MARCO PACS</h5>
</v-footer> </v-footer>
</template> </template>
...@@ -48,6 +50,6 @@ export default { ...@@ -48,6 +50,6 @@ export default {
position: absolute; position: absolute;
left: 0; left: 0;
} }
</style>> </style>
</style> </style>
\ No newline at end of file
<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-app-bar fixed app elevation="24" color="#c0d7d6">
<v-toolbar-title class="red--text">{{$t('AppHeader.appName')}}</v-toolbar-title> <v-toolbar-title class="red--text">{{$t('AppHeader.appName')}}</v-toolbar-title>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-btn text color="red red--text" :to="btnTo"> <v-btn text color="red red--text" :to="btnTo">
...@@ -9,6 +9,15 @@ ...@@ -9,6 +9,15 @@
<strong>{{$t(btnLabel)}}</strong> <strong>{{$t(btnLabel)}}</strong>
</v-btn> </v-btn>
</v-app-bar> </v-app-bar>
<!-- <v-toolbar absolute fixed app elevation="24" color="#0065613b" style="width:100%">
<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">
<v-icon left>{{ btnIconName }}</v-icon>
<strong>{{$t(btnLabel)}}</strong>
</v-btn>
</v-toolbar> -->
</template> </template>
<script> <script>
......
<template> <template>
<div style="width:100%" class="d-flex fill-height align-start justify-center flex-wrap"> <v-container fluid>
<div style="width:100%;display:flex;justify-content:center"> <v-row justify="center" dense class="flex-wrap">
<v-card outlined raised> <v-col md="6" cols="12">
<v-card outlined raised> <v-card>
<v-card-actions> <v-card>
<v-combobox <v-card-actions>
v-model="model" <v-combobox
:items="items" v-model="model"
:search-input.sync="search" :items="items"
hide-selected :search-input.sync="search"
label="please select a machine" hide-selected
persistent-hint label="please select a machine"
small-chips persistent-hint
clearable small-chips
> clearable
<template v-if="noData" v-slot:no-data> >
<v-list-item> <template v-if="noData" v-slot:no-data>
<v-list-item-content> <v-list-item>
<v-list-item-title> <v-list-item-content>
No results matching " <v-list-item-title>
<strong>{{ search }}</strong>". Press No results matching "
<kbd>enter</kbd> to create a new one <strong>{{ search }}</strong>". Press
</v-list-item-title> <kbd>enter</kbd> to create a new one
</v-list-item-content> </v-list-item-title>
</v-list-item> </v-list-item-content>
</template> </v-list-item>
</v-combobox> </template>
<v-btn text color="deep-purple accent-4">Search</v-btn> </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-actions>
</v-card> </v-card>
<v-card-actions class="d-flex flex-wrap justify-center"> </v-col>
<v-btn-toggle v-model="toggle_exclusive" mandatory> </v-row>
<v-btn class="green"> <v-row justify="center" dense class="flex-wrap">
<v-icon left v-if="toggle_exclusive==0">done</v-icon> <v-col cols="12">
<strong>All</strong> <v-data-table
</v-btn> v-model="selected"
<v-btn class="green" style="margin-left:0px;margin-right:0px"> :headers="headers"
<v-icon left v-if="toggle_exclusive==1">done</v-icon> :items="desserts"
<strong>unknown</strong> single-select
</v-btn> item-key="name"
</v-btn-toggle> show-select
hide-default-footer
<v-btn class="ma-3" rounded> class="elevation-1"
<strong>Export To Excel</strong> disable-pagination
</v-btn> style="width:100%"
</v-card-actions> ></v-data-table>
</v-card> </v-col>
</div> </v-row>
<div style="width:100%;display:flex;justify-content:center" class="ma-3"> </v-container>
<v-data-table
v-model="selected"
:headers="headers"
:items="desserts"
single-select
item-key="name"
show-select
class="elevation-1"
disable-pagination
height="600"
style="width:100%"
></v-data-table>
</div>
</div>
</template> </template>
<script> <script>
import Worklist from "../../imports/api/collections/worklist.js";
import { Tracker } from "meteor/tracker";
export default { export default {
data: () => ({ data: () => ({
devicemap: "ratio",
items: ["Gaming", "Programming", "Vue", "Vuetify"], items: ["Gaming", "Programming", "Vue", "Vuetify"],
model: ["Vuetify"], model: ["Vuetify"],
search: null, search: null,
...@@ -171,9 +177,34 @@ export default { ...@@ -171,9 +177,34 @@ export default {
carbs: 65, carbs: 65,
protein: 7, protein: 7,
iron: "6%" iron: "6%"
}, }
] ]
}) }),
mounted() {
Meteor.setTimeout(() => {
this.devicemap = "ct";
}, 5000);
Meteor.setTimeout(() => {
this.devicemap = "ratio";
}, 10000);
},
meteor: {
$subscribe: {
worklist: function() {
return [this.devicemap];
}
},
worklist() {
return Worklist.find({});
}
},
watch: {
worklist: (newWorklist, oldWorklist) => {
console.log(newWorklist);
},
"$subReady.worklist": ready => {
console.log(ready);
}
}
}; };
</script> </script>
\ No newline at end of file
...@@ -22,6 +22,8 @@ import { store } from './store/store'; ...@@ -22,6 +22,8 @@ import { store } from './store/store';
import i18n from './plugins/i18n'; import i18n from './plugins/i18n';
Meteor.startup(() => { Meteor.startup(() => {
new Vue({ new Vue({
i18n, i18n,
......
...@@ -4,11 +4,6 @@ Vue.use(VueI18n); ...@@ -4,11 +4,6 @@ Vue.use(VueI18n);
const messages = { const messages = {
'en': { 'en': {
$vuetify: {
dataTable: {
itemsPerPageText: 'منستیبمتن سمکنیتب '
}
},
Login: { Login: {
loginHeader: 'Login', loginHeader: 'Login',
registerBtn: 'Register', registerBtn: 'Register',
...@@ -21,7 +16,8 @@ const messages = { ...@@ -21,7 +16,8 @@ const messages = {
usernameAlert: 'please enter username', usernameAlert: 'please enter username',
passwordAlert: 'please enter password', passwordAlert: 'please enter password',
errorUserNotFound: 'User not found', errorUserNotFound: 'User not found',
errorIncorrectPassword: 'Incorrect Password' errorIncorrectPassword: 'Incorrect Password',
changePassword: 'Change Password?'
}, },
Register: { Register: {
registerHeader: 'Register', registerHeader: 'Register',
...@@ -45,6 +41,24 @@ const messages = { ...@@ -45,6 +41,24 @@ const messages = {
}, },
AppFooter: { AppFooter: {
appLang: 'en', appLang: 'en',
},
ChangePassword: {
formHeader: 'change password',
username: 'username',
usernameAlert: 'please enter username',
oldPassword: 'old password',
oldPasswordAlert: 'please enter old password',
newPassword: 'new password',
newPasswordAlert: 'please enter new password',
matchPass: 'old password and new password should not be the same',
required: 'Required',
min8Character: 'Min 8 Characters',
changePasswordBtn: 'change',
loadingText: 'changing password',
NotFoundUser: 'user not found',
CheckPassError: 'incorrect old password',
SuccessChangePass: 'Password Successfully changed',
internalServerError: 'internal server error'
} }
...@@ -62,7 +76,8 @@ const messages = { ...@@ -62,7 +76,8 @@ const messages = {
usernameAlert: 'لطفا نام کاربری را وارد نمایید', usernameAlert: 'لطفا نام کاربری را وارد نمایید',
passwordAlert: 'لطفا رمز ورود را وارد نمایید', passwordAlert: 'لطفا رمز ورود را وارد نمایید',
errorUserNotFound: 'کاربر یافت نشد', errorUserNotFound: 'کاربر یافت نشد',
errorIncorrectPassword: 'رمز نادرست' errorIncorrectPassword: 'رمز نادرست',
changePassword: 'تغییر رمز؟'
}, },
Register: { Register: {
registerHeader: 'ثبت نام کاربر', registerHeader: 'ثبت نام کاربر',
...@@ -86,6 +101,24 @@ const messages = { ...@@ -86,6 +101,24 @@ const messages = {
}, },
AppFooter: { AppFooter: {
appLang: 'فا', appLang: 'فا',
},
ChangePassword: {
formHeader: 'تغییر رمز',
username: 'نام کاربری',
usernameAlert: 'لطفا نام کاربری را وارد نمایید',
oldPassword: 'رمز فعلی',
oldPasswordAlert: 'لطفا رمز فعلی را وارد نمایید',
newPassword: 'رمز جدید',
newPasswordAlert: 'لطفا رمز جدید را وارد نمایید',
matchPass: 'رمز فعلی و رمز جدید نباید یکسان باشند',
required: 'مورد نیاز',
min8Character: 'حداقل 8 کاراکتر',
changePasswordBtn: 'تغییر رمز',
loadingText: 'در حال تغییر رمز',
NotFoundUser: 'کاربر یافت نشد',
CheckPassError: 'رمز فعلی نادرست می باشد',
SuccessChangePass: 'رمز کاربر با موفقیت تغییر یافت',
internalServerError: 'خطا در سرور'
} }
} }
......
import Login from '../views/Login.vue'; import Login from '../views/Login.vue';
import Home from '../views/Home.vue'; import Home from '../views/Home.vue';
import Register from '../views/Register.vue'; import Register from '../views/Register.vue';
import ChangePassword from '../views/ChangePassword.vue';
import Main from '../views/Main.vue'; import Main from '../views/Main.vue';
import EditWorkList from '../components/EditWorkList.vue'; import EditWorkList from '../components/EditWorkList.vue';
...@@ -22,6 +23,10 @@ const routes = [{ ...@@ -22,6 +23,10 @@ const routes = [{
name: 'signup' name: 'signup'
}, },
{ {
path: '/changePassword',
component: ChangePassword,
name: 'changePassword'
}, {
path: '/main', path: '/main',
component: Main, component: Main,
name: 'main', name: 'main',
......
<template>
<v-app id="inspire">
<auth-header btnToProp="signin" btnLabel="Register.loginBtn" btnIconName="mdi-login"></auth-header>
<v-content>
<v-container fluid class="align-center fill-height backgroundImg">
<v-row justify="center" class="loginCard" >
<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-lock-reset</v-icon>
<v-toolbar-title>{{$t('ChangePassword.formHeader')}}</v-toolbar-title>
</v-toolbar>
<v-card-text>
<v-form>
<v-container fluid class="flex-wrap">
<v-row>
<v-col cols="12">
<v-text-field
:label="$t('ChangePassword.username')"
prepend-icon="mdi-account-circle"
:rules="[rules.required]"
v-model="username"
ref="usernameTextField"
persistent-hint
:hint="this.usernameAlert?`${$t('ChangePassword.usernameAlert')}`:''"
@keyup.enter="changePassword()"
/>
</v-col>
<v-col cols="12">
<v-text-field
:type="!showPassword1?'password' :'text'"
:label="$t('ChangePassword.oldPassword')"
prepend-icon="mdi-lock"
@click:append="showPassword1 = !showPassword1"
:append-icon="showPassword1 ? 'mdi-eye': 'mdi-eye-off'"
v-model="oldPass"
:rules="[rules.required, rules.min]"
ref="oldPassTextField"
persistent-hint
:hint="this.oldPassAlert?`${$t('ChangePassword.oldPasswordAlert')}`:''"
@keyup.enter="changePassword()"
/>
</v-col>
<v-col cols="12">
<v-text-field
:type="!showPassword2?'password' :'text'"
:label="$t('ChangePassword.newPassword')"
prepend-icon="mdi-lock"
@click:append="showPassword2 = !showPassword2"
:append-icon="showPassword2 ? 'mdi-eye': 'mdi-eye-off'"
v-model="newPass"
:rules="[rules.required, rules.matchPass]"
ref="newPassTextField"
persistent-hint
:hint="this.newPassAlert?`${$t('ChangePassword.newPasswordAlert')}`:''"
@keyup.enter="changePassword()"
/>
</v-col>
</v-row>
</v-container>
</v-form>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn
style="width:100%"
class="white--text"
color="rgb(94, 181, 177,.85)"
rounded
:loading="loading"
:disabled="loading"
@click="changePassword()"
>
<v-icon left>mdi-lock-question</v-icon>
<small>{{$t('ChangePassword.changePasswordBtn')}}</small>
<template v-slot:loader>
<span>{{$t('ChangePassword.loadingText')}}</span>
</template>
</v-btn>
</v-card-actions>
</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-snackbar v-model="snackbar" :color="snackbarColor" :timeout="2000">{{ snackbarText }}</v-snackbar>
</v-container>
</v-content>
<app-footer></app-footer>
</v-app>
</template>
<script>
import AppFooter from "../components/AppFooter.vue";
import AuthHeader from "../components/AuthHeader.vue";
import { Accounts } from "meteor/accounts-base";
import { Meteor } from "meteor/meteor";
export default {
components: {
"app-footer": AppFooter,
"auth-header": AuthHeader
},
data() {
return {
snackbar: false,
snackbarText: "",
snackbarColor: "red",
loading: false,
username: null,
usernameAlert: false,
oldPass: null,
oldPassAlert: false,
newPass: null,
newPassAlert: false,
showPassword1: false,
showPassword2: false,
rules: {
required: value => !!value || this.$t("ChangePassword.required"),
min: v => {
if (v == undefined) return true;
return v.length >= 8 || this.$t("ChangePassword.min8Character");
},
matchPass: v => {
return (
this.oldPass !== this.newPass || this.$t("ChangePassword.matchPass")
);
}
}
};
},
methods: {
changePassword() {
const that = this;
if (this.username == null || this.username.length == 0) {
this.$refs.usernameTextField.focus();
this.usernameAlert = true;
return;
}
if (this.oldPass == null || this.oldPass.length == 0) {
this.$refs.oldPassTextField.focus();
this.oldPassAlert = true;
return;
}
if (this.newPass == null || this.newPass.length == 0) {
this.$refs.newPassTextField.focus();
this.newPassAlert = true;
return;
}
if (this.oldPass == this.newPass) {
return;
}
this.loading = true;
Meteor.call(
"changePass",
this.username,
this.oldPass,
this.newPass,
function(error, result) {
if (error) {
that.loading = false;
if (error.error == "NotFoundUser") {
that.snackbarColor = "red";
that.snackbarText = that.$t("ChangePassword.NotFoundUser");
that.snackbar = true;
return;
}
if (error.error == "CheckPassError") {
that.snackbarColor = "red";
that.snackbarText = that.$t("ChangePassword.CheckPassError");
that.snackbar = true;
return;
}
that.snackbarColor = "red";
that.snackbarText = that.$t("ChangePassword.internalServerError");
that.snackbar = true;
return;
}
Meteor.setTimeout(() => {
that.loading = false;
that.snackbarColor = "rgb(94, 181, 177,.85)";
that.snackbarText = that.$t("ChangePassword.SuccessChangePass");
that.snackbar = true;
}, 1000);
}
);
}
}
};
</script>
<style scoped>
.backgroundImg {
background-color: #abdae4ad;
background-image: linear-gradient(
141deg,
#9fb8ad 0%,
#1fc8db 51%,
#2ce8ceb0 75%
);
}
img {
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 100%;
overflow-y: hidden;
opacity: 0.6;
filter: grayscale(0.5) blur(2px);
z-index: 0;
}
.loginCard {
z-index: 1;
}
.backgroundImg {
overflow-y: hidden;
}
.roundedCard {
border-radius: 20px;
}
/* loader */
@-moz-keyframes loader {
from {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
@-webkit-keyframes loader {
from {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
@-o-keyframes loader {
from {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
@keyframes loader {
from {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
</style>
\ No newline at end of file
<template> <template>
<v-content class="fill-height"> <!-- <div style="height:100%"> -->
<v-app id="inspire">
<auth-header btnToProp="signup" btnLabel="Login.registerBtn" btnIconName="mdi-account-plus"></auth-header> <auth-header btnToProp="signup" btnLabel="Login.registerBtn" btnIconName="mdi-account-plus"></auth-header>
<v-content>
<v-container fluid class="align-center fill-height backgroundImg"> <v-container fluid fill-height class="align-center backgroundImg">
<v-row justify="center" class="loginCard"> <v-row justify="center" class="loginCard">
<v-col xs="8" sm="6" md="4" lg="3"> <v-col xs="8" sm="6" md="4" lg="3">
<v-card class="elevation-12 roundedCard" light elevation="24"> <v-card class="elevation-12 roundedCard" light elevation="24">
<v-toolbar color="rgb(94, 181, 177,.85)" dark> <v-toolbar color="rgb(94, 181, 177,.85)" dark>
<v-icon class="ma-3">mdi-login</v-icon> <v-icon class="ma-3">mdi-login</v-icon>
<v-toolbar-title>{{$t('Login.loginHeader')}}</v-toolbar-title> <v-toolbar-title>{{$t('Login.loginHeader')}}</v-toolbar-title>
</v-toolbar> </v-toolbar>
<v-card-text class="d-flex align-center justify-center"> <v-card-text class="d-flex align-center justify-center">
<v-img src="/img/0.png" contain height="150" width="150"></v-img> <v-img
<v-form> src="/img/0.png"
<v-text-field contain
:label="$t('Login.username')" :height="$vuetify.breakpoint.mdAndUp?150:100"
prepend-icon="mdi-account-circle" :width="$vuetify.breakpoint.mdAndUp?150:100"
:rules="[rules.required]" ></v-img>
v-model="username" <v-form>
ref="usernameTextField" <v-container fluid>
:hint="this.usernameAlert?`${$t('Login.usernameAlert')}`:''" <v-row>
/> <v-col cols="12">
<v-text-field <v-text-field
:type="!showPassword?'password' :'text'" :autofocus="usernameFocus"
:label="$t('Login.password')" :label="$t('Login.username')"
prepend-icon="mdi-lock" prepend-icon="mdi-account-circle"
@click:append="showPassword = !showPassword" :rules="[rules.required]"
:append-icon="showPassword ? 'mdi-eye': 'mdi-eye-off'" v-model="username"
:hint="this.passwordAlert?$t('Login.passwordAlert'):$t('Login.passwordHint')" ref="usernameTextField"
:rules="[rules.required, rules.min]" :hint="this.usernameAlert?`${$t('Login.usernameAlert')}`:''"
v-model="password" @keyup.enter="loginUser()"
ref="passwordTextField" />
/> </v-col>
</v-form> <v-col cols="12">
</v-card-text> <v-text-field
<v-card-actions class="flex-wrap"> :autofocus="passwordFocus"
<v-btn :type="!showPassword?'password' :'text'"
style="width:100%" :label="$t('Login.password')"
color="rgb(94, 181, 177,.85)" prepend-icon="mdi-lock"
rounded @click:append="showPassword = !showPassword"
class="white--text mb-2" :append-icon="showPassword ? 'mdi-eye': 'mdi-eye-off'"
@click="loginUser()" :hint="this.passwordAlert?$t('Login.passwordAlert'):$t('Login.passwordHint')"
:loading="loading" :rules="[rules.required, rules.min]"
:disabled="loading" v-model="password"
> ref="passwordTextField"
<v-icon left>mdi-login</v-icon> @keyup.enter="loginUser()"
<small>{{$t('Login.loginBtn')}}</small> />
</v-btn> </v-col>
<v-btn text rounded color="green" x-small>Change Password?</v-btn> </v-row>
</v-card-actions> </v-container>
</v-card> </v-form>
</v-col> </v-card-text>
</v-row> <v-card-actions class="flex-wrap">
<ul class="bubble-boxes"> <v-btn
<li></li> style="width:100%"
<li></li> color="rgb(94, 181, 177,.85)"
<li></li> rounded
<li></li> class="white--text mb-2"
<li></li> @click="loginUser()"
<li></li> :loading="loading"
<li></li> :disabled="loading"
<li></li> >
<li></li> <v-icon left>mdi-login</v-icon>
<li></li> <small>{{$t('Login.loginBtn')}}</small>
</ul> </v-btn>
<v-snackbar v-model="snackbar" :color="snackbarColor" :timeout="2000">{{ snackbarText }}</v-snackbar> <v-btn
</v-container> text
rounded
color="green"
x-small
to="/changePassword"
>{{$t('Login.changePassword')}}</v-btn>
</v-card-actions>
</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-snackbar v-model="snackbar" :color="snackbarColor" :timeout="2000">{{ snackbarText }}</v-snackbar>
</v-container>
</v-content>
<app-footer></app-footer> <app-footer></app-footer>
</v-content> <!-- </div> -->
</v-app>
</template> </template>
<script> <script>
...@@ -80,6 +106,12 @@ export default { ...@@ -80,6 +106,12 @@ export default {
"app-footer": AppFooter, "app-footer": AppFooter,
"auth-header": AuthHeader "auth-header": AuthHeader
}, },
mounted() {
let self = this;
this.username = null;
this.password = null;
},
data() { data() {
return { return {
loading: false, loading: false,
...@@ -134,6 +166,7 @@ export default { ...@@ -134,6 +166,7 @@ export default {
that.snackbar = true; that.snackbar = true;
} }
} else { } else {
Meteor.call("Fetchworklist", "ratio");
Meteor.setTimeout(() => { Meteor.setTimeout(() => {
that.loading = false; that.loading = false;
that.$router.push("/main/worklist"); that.$router.push("/main/worklist");
...@@ -145,6 +178,7 @@ export default { ...@@ -145,6 +178,7 @@ export default {
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
next(vm => { next(vm => {
debugger; debugger;
// if (Meteor.userId()) { // if (Meteor.userId()) {
// vm.$router.push("/main/worklist"); // vm.$router.push("/main/worklist");
// } // }
...@@ -188,7 +222,7 @@ img { ...@@ -188,7 +222,7 @@ img {
} }
.loginCard { .loginCard {
z-index: 10; z-index: 1;
} }
.backgroundImg { .backgroundImg {
......
<template> <template>
<div class="fill-height"> <v-app id="inspire">
<!-- <div style="height:100%"> -->
<!-- <v-content class="fill-height"> --> <!-- <v-content class="fill-height"> -->
<template v-if="!$vuetify.rtl"> <template v-if="!$vuetify.rtl">
...@@ -79,7 +80,7 @@ ...@@ -79,7 +80,7 @@
<v-navigation-drawer v-model="left" fixed temporary></v-navigation-drawer> <v-navigation-drawer v-model="left" fixed temporary></v-navigation-drawer>
<v-content class="fill-height"> <v-content class="fill-height">
<v-container class="fill-height" fluid> <v-container class="fill-height align-start" fluid>
<!-- <v-row justify="center" align="center"> <!-- <v-row justify="center" align="center">
<v-col class="shrink"> <v-col class="shrink">
<v-tooltip right> <v-tooltip right>
...@@ -105,7 +106,7 @@ ...@@ -105,7 +106,7 @@
<span>Codepen</span> <span>Codepen</span>
</v-tooltip> </v-tooltip>
</v-col> </v-col>
</v-row> --> </v-row>-->
<router-view></router-view> <router-view></router-view>
</v-container> </v-container>
</v-content> </v-content>
...@@ -113,8 +114,9 @@ ...@@ -113,8 +114,9 @@
<v-navigation-drawer v-model="right" fixed right temporary></v-navigation-drawer> <v-navigation-drawer v-model="right" fixed right temporary></v-navigation-drawer>
<app-footer></app-footer> <app-footer></app-footer>
</div> <!-- </div> -->
<!-- </v-content> --> <!-- </v-content> -->
</v-app>
</template> </template>
<script> <script>
......
<template> <template>
<!-- <div class="fill-height"> --> <v-app id="inspire">
<v-content class="fill-height">
<auth-header btnToProp="signin" btnLabel="Register.loginBtn" btnIconName="mdi-login"></auth-header> <auth-header btnToProp="signin" btnLabel="Register.loginBtn" btnIconName="mdi-login"></auth-header>
<v-container fluid class="align-center fill-height backgroundImg"> <v-content>
<v-row justify="center" class="loginCard"> <v-container fluid class="align-center fill-height backgroundImg">
<v-col xs="8" sm="6" md="4" lg="3"> <v-row justify="center" class="loginCard">
<v-card class="elevation-12 roundedCard" light elevation="24"> <v-col xs="8" sm="6" md="4" lg="3">
<v-toolbar color="rgb(94, 181, 177,.85)" dark> <v-card class="elevation-12 roundedCard" light elevation="24">
<v-icon class="ma-3">mdi-account-plus</v-icon> <v-toolbar color="rgb(94, 181, 177,.85)" dark>
<v-toolbar-title>{{$t('Register.registerHeader')}}</v-toolbar-title> <v-icon class="ma-3">mdi-account-plus</v-icon>
</v-toolbar> <v-toolbar-title>{{$t('Register.registerHeader')}}</v-toolbar-title>
<v-card-text> </v-toolbar>
<v-form> <v-card-text>
<v-text-field <v-form>
:label="$t('Register.username')" <v-container fluid>
prepend-icon="mdi-account-circle" <v-row>
:rules="[rules.required]" <v-col cols="12">
v-model="username" <v-text-field
ref="usernameTextField" :label="$t('Register.username')"
:hint="this.usernameAlert?`${$t('Register.usernameAlert')}`:''" prepend-icon="mdi-account-circle"
/> :rules="[rules.required]"
<v-text-field v-model="username"
:type="!showPassword1?'password' :'text'" ref="usernameTextField"
:label="$t('Register.password')" :hint="this.usernameAlert?`${$t('Register.usernameAlert')}`:''"
prepend-icon="mdi-lock" @keyup.enter="createAccount()"
@click:append="showPassword1 = !showPassword1" />
:append-icon="showPassword1 ? 'mdi-eye': 'mdi-eye-off'" </v-col>
v-model="firstPass" <v-col cols="12">
:rules="[rules.required, rules.min]" <v-text-field
ref="firstPassTextField" :type="!showPassword1?'password' :'text'"
:hint="this.firstPassAlert?`${$t('Register.usernameAlert')}`:''" :label="$t('Register.password')"
/> prepend-icon="mdi-lock"
<v-text-field @click:append="showPassword1 = !showPassword1"
:type="!showPassword2?'password' :'text'" :append-icon="showPassword1 ? 'mdi-eye': 'mdi-eye-off'"
:label="$t('Register.repeatPassword')" v-model="firstPass"
prepend-icon="mdi-lock" :rules="[rules.required, rules.min]"
@click:append="showPassword2 = !showPassword2" ref="firstPassTextField"
:append-icon="showPassword2 ? 'mdi-eye': 'mdi-eye-off'" :hint="this.firstPassAlert?`${$t('Register.firstPassAlert')}`:''"
v-model="secondPass" @keyup.enter="createAccount()"
:rules="[rules.required, rules.matchPass]" />
ref="secondPassTextField" </v-col>
:hint="this.secondPassAlert?`${$t('Register.usernameAlert')}`:''" <v-col cols="12">
/> <v-text-field
</v-form> :type="!showPassword2?'password' :'text'"
</v-card-text> :label="$t('Register.repeatPassword')"
<v-card-actions> prepend-icon="mdi-lock"
<v-spacer></v-spacer> @click:append="showPassword2 = !showPassword2"
<v-btn :append-icon="showPassword2 ? 'mdi-eye': 'mdi-eye-off'"
style="width:100%" v-model="secondPass"
class="white--text" :rules="[rules.required, rules.matchPass]"
color="rgb(94, 181, 177,.85)" ref="secondPassTextField"
rounded :hint="this.secondPassAlert?`${$t('Register.secondPassAlert')}`:''"
@click="createAccount()" @keyup.enter="createAccount()"
:loading="loading" />
:disabled="loading" </v-col>
> </v-row>
<v-icon left>mdi-login</v-icon> </v-container>
<small>{{$t('Register.registerBtn')}}</small> </v-form>
<template v-slot:loader> </v-card-text>
<span>{{$t('Register.loadingText')}}</span> <v-card-actions>
</template> <v-spacer></v-spacer>
</v-btn> <v-btn
</v-card-actions> style="width:100%"
</v-card> class="white--text"
</v-col> color="rgb(94, 181, 177,.85)"
</v-row> rounded
<ul class="bubble-boxes"> @click="createAccount()"
<li></li> :loading="loading"
<li></li> :disabled="loading"
<li></li> >
<li></li> <v-icon left>mdi-login</v-icon>
<li></li> <small>{{$t('Register.registerBtn')}}</small>
<li></li> <template v-slot:loader>
<li></li> <span>{{$t('Register.loadingText')}}</span>
<li></li> </template>
<li></li> </v-btn>
<li></li> </v-card-actions>
</ul> </v-card>
<v-snackbar v-model="snackbar" :color="snackbarColor" :timeout="2000">{{ snackbarText }}</v-snackbar> </v-col>
</v-container> </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-snackbar v-model="snackbar" :color="snackbarColor" :timeout="2000">{{ snackbarText }}</v-snackbar>
</v-container>
</v-content>
<app-footer></app-footer> <app-footer></app-footer>
</v-content> </v-app>
<!-- </div> -->
</template> </template>
<script> <script>
...@@ -123,7 +136,6 @@ export default { ...@@ -123,7 +136,6 @@ export default {
}, },
methods: { methods: {
createAccount() { createAccount() {
debugger;
const username = this.username; const username = this.username;
const password = this.firstPass; const password = this.firstPass;
const that = this; const that = this;
...@@ -152,7 +164,7 @@ export default { ...@@ -152,7 +164,7 @@ export default {
if (this.firstPass == this.secondPass && this.username != null) { if (this.firstPass == this.secondPass && this.username != null) {
this.loading = true; this.loading = true;
Accounts.createUser( Accounts.createUser(
{ {
username: this.username, username: this.username,
...@@ -170,7 +182,7 @@ export default { ...@@ -170,7 +182,7 @@ export default {
that.snackbarColor = "rgb(94, 181, 177,.85)"; that.snackbarColor = "rgb(94, 181, 177,.85)";
that.snackbarText = that.$t("Register.userCreated"); that.snackbarText = that.$t("Register.userCreated");
that.snackbar = true; that.snackbar = true;
Meteor.setTimeout(() => { Meteor.setTimeout(() => {
that.loading = false; that.loading = false;
that.$router.push("/main/worklist"); that.$router.push("/main/worklist");
...@@ -208,9 +220,10 @@ img { ...@@ -208,9 +220,10 @@ img {
} }
.loginCard { .loginCard {
z-index: 10; z-index: 1;
} }
.backgroundImg { .backgroundImg {
overflow-y: hidden; overflow-y: hidden;
} }
......
import { Mongo } from 'meteor/mongo';
import { Meteor } from 'meteor/meteor';
let Worklist;
if (Meteor.isClient || Meteor.isCordova) {
Worklist = new Mongo.Collection('worklist')
}
if (Meteor.isServer) {
Worklist = new Mongo.Collection('worklist', { connection: null })
}
export default Worklist;
\ No newline at end of file
import { Meteor } from 'meteor/meteor';
import { Accounts } from 'meteor/accounts-base';
import { check } from 'meteor/check';
Meteor.methods({
'changePass' (username, oldPassword, newPassword) {
debugger;
this.unblock();
check(username, String);
check(oldPassword, String);
check(newPassword, String);
const user = Accounts.findUserByUsername(username);
if (user == null) {
throw new Meteor.Error("NotFoundUser");
}
// const digestOldPassword = sha256(oldPassword);
// const password = { digest: digestOldPassword, algorithm: 'sha-256' };
const result = Accounts._checkPassword(user, oldPassword);
if (result.error != null) {
throw new Meteor.Error("CheckPassError");
}
Accounts.setPassword(user._id, newPassword);
},
});
\ No newline at end of file
import { Meteor } from 'meteor/meteor'; import { Meteor } from 'meteor/meteor';
import { check } from 'meteor/check';
import { Accounts } from 'meteor/accounts-base'; import { Accounts } from 'meteor/accounts-base';
Accounts.onLogin(function(user) { // Accounts.onLogin(function(user) {
debugger; // debugger;
console.log(",", user.user._id) // console.log(",", user.user._id)
}); // });
import Worklist from '../collections/worklist.js';
Meteor.methods({ Meteor.methods({
'Fetchworklist' () { 'Fetchworklist' (devicemap) {
debugger; debugger;
check(devicemap, String);
this.unblock(); this.unblock();
try { if (this.userId) {
const result = HTTP.call('GET', 'http://192.168.4.105:2050/Broker/HISIntegration.svc/rest/Fetchworklist/ratio'); try {
console.log(result); debugger;
const result = HTTP.call('GET', `http://192.168.0.156/Broker/HISIntegration.svc/rest/Fetchworklist/${devicemap}`);
return true; let worklistHttp = JSON.parse(result.content);
} catch (e) {
// Got a network error, timeout, or HTTP error in the 400 or 500 range. Worklist.remove({ _userid: this.userId, _devicemap: devicemap });
return false;
// worklist.forEach((patient) => {
// Worklist.insert({ PatientID: worklist.PatientID, _userid: worklist._userid, _devicemap: devicemap }, {
// $set: {
// ...patient
// }
// });
// })
worklistHttp.WorkListItems.forEach((patient) => {
Worklist.insert({
...patient,
_userid: this.userId,
_devicemap: devicemap
});
})
// worklist._userid = this.userId;
// worklist._devicemap = devicemap;
// Worklist.upsert({ _userid: worklist._userid, _devicemap: devicemap }, { $set: worklist });
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
import Worklist from '../../collections/worklist.js';
import { check } from 'meteor/check';
Meteor.publish("worklist", function(devicemap) {
if (!this.userId) {
return this.ready();
}
const userid = this.userId;
check(devicemap, String);
// console.log(Worklist.find({ _userid: userid, _devicemap: devicemap }).fetch())
return Worklist.find({ _userid: userid, _devicemap: devicemap }, { fields: { _devicemap: 0, _userid: 0 } });
});
\ No newline at end of file
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
font-family: Vazir; font-family: Vazir;
src: url('vazir-font-v18.0.0/Vazir.eot'); src: url('vazir-font-v18.0.0/Vazir.eot');
src: url('vazir-font-v18.0.0/Vazir.eot?#iefix') format('vazir-opentype'), url('vazir-font-v18.0.0/Vazir.woff') format('woff'), url('vazir-font-v18.0.0/Vazir.ttf') format('truetype'); src: url('vazir-font-v18.0.0/Vazir.eot?#iefix') format('vazir-opentype'), url('vazir-font-v18.0.0/Vazir.woff') format('woff'), url('vazir-font-v18.0.0/Vazir.ttf') format('truetype');
font-weight: bold; /* font-weight: normal; */
font-style: normal; font-style: normal;
} }
......
import { Meteor } from 'meteor/meteor'; import { Meteor } from 'meteor/meteor';
import '../imports/api/methods/worklist.js'; import '../imports/api/methods/worklist.js';
import '../imports/api/methods/changePassword.js';
import '../imports/api/server/publications/worklist.js'
Meteor.startup(() => { Meteor.startup(() => {
......
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