Commit d0fb3d4b authored by Reza Sahebgharan's avatar Reza Sahebgharan

feat(account-management): account-management

parent a65548d4
Pipeline #960 passed with stage
......@@ -9,7 +9,7 @@
<h5>©2005-{{ new Date().getFullYear() }} MARCO PACS</h5>
<v-menu transition="slide-x-transition">
<!-- <v-menu transition="slide-x-transition">
<template v-slot:activator="{ on }">
<v-btn
class="changeLangBtn"
......@@ -25,7 +25,7 @@
<v-list-item-title>{{lng.name}}</v-list-item-title>
</v-list-item>
</v-list>
</v-menu>
</v-menu> -->
</v-footer>
</template>
......
......@@ -4,10 +4,10 @@
<v-app-bar fixed app elevation="24" color="#c0d7d6">
<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" :data-cy="btnToProp">
<!-- <v-btn text color="red red--text" :to="btnTo" :data-cy="btnToProp">
<v-icon left>{{ btnIconName }}</v-icon>
<strong>{{$t(btnLabel)}}</strong>
</v-btn>
</v-btn> -->
</v-app-bar>
<!-- <v-toolbar absolute fixed app elevation="24" color="#0065613b" style="width:100%">
......
<template>
<v-container>
<v-snackbar color="primary" v-model="alertSnackbar" :timeout="2000">{{alertText}}</v-snackbar>
<v-row justify="center" dense class="flex-wrap mb-6">
<v-col md="7" lg="6" cols="12">
<v-card shaped :loading="loading">
<v-card-text>
<v-row style="margin:auto">
<v-col cols="12" class="d-flex justify-center align-center flex-wrap">
<v-list-item-avatar size="200">
<v-img v-if="!temp" :src="src"></v-img>
<v-img v-else :src="newSrc"></v-img>
<v-btn
@click="$refs.inputUpload.click()"
fab
style="position:absolute;bottom:5px;right:5px"
>
<v-icon>add_a_photo</v-icon>
</v-btn>
<input
v-show="false"
ref="inputUpload"
type="file"
@change="fileUploadFunc"
accept="image/x-png, image/gif, image/jpeg"
/>
</v-list-item-avatar>
</v-col>
</v-row>
<v-row style="margin:auto">
<v-col cols="12">
<v-text-field :label="$t('UserSetting.fullName')" v-model="fullName" />
</v-col>
<v-col cols="6">
<v-combobox
v-model="selectedLang"
:items="langList"
item-text="name"
item-value="alias"
:label="$t('UserSetting.language')"
hide-selected
persistent-hint
small-chips
clearable
dense
return-object
></v-combobox>
</v-col>
</v-row>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn
rounded
color="rgb(94, 181, 177,.85)"
class="white--text"
@click="saveUserProfile"
>
<strong>{{$t("UserSetting.SaveBtn")}}</strong>
</v-btn>
</v-card-actions>
</v-card>
</v-col>
</v-row>
</v-container>
</template>
<script>
import { mapActions } from "vuex";
export default {
data() {
return {
langList: [
{ name: "فارسی", alias: "fa" },
{ name: "English", alias: "en" }
],
newSelectedLang: { name: "English", alias: "en" },
loading: false,
newSrc: "/img/empty.png",
newFullName: "",
temp: false,
alertSnackbar: false,
alertText: ""
};
},
methods: {
...mapActions(["setLang"]),
alertSnackbarMethod(text) {
this.alertText = text;
this.alertSnackbar = true;
},
saveUserProfile() {
debugger;
this.loading = true;
if (this.newSelectedLang == null || this.newSelectedLang == undefined) {
this.alertSnackbarMethod(this.$t("UserSetting.chooseLanguage"));
this.loading = false;
return;
}
// this.setLang(this.newSelectedLang.alias);
let profile = {
"profile.fullName": this.newFullName,
"profile.language": this.newSelectedLang,
"profile.picture": this.newSrc
};
let me = this;
Meteor.call("editUserProfile", profile, function(err, result) {
if (result) {
me.alertSnackbarMethod(me.$t("UserSetting.successfullSave"));
}
me.temp = false;
});
this.loading = false;
},
fileUploadFunc(event) {
const file = event.target.files[0];
const reader = new FileReader();
let me = this;
reader.addEventListener(
"load",
function() {
me.temp = true;
me.src = reader.result;
},
false
);
if (file && file.type.includes("image")) {
reader.readAsDataURL(file);
} else {
this.alertSnackbarMethod(this.$t("UserSetting.chooseImage"));
}
}
},
computed: {
fullName: {
get() {
if (this.users && this.users.length > 0) {
this.newFullName = this.users[0].profile.fullName;
return this.users[0].profile.fullName;
} else {
return "";
}
},
set(newValue) {
this.newFullName = newValue;
}
},
src: {
get() {
if (this.users && this.users.length > 0) {
this.newSrc = this.users[0].profile.picture;
return this.users[0].profile.picture;
} else {
return "/img/empty.png";
}
},
set(newValue) {
this.newSrc = newValue;
}
},
selectedLang: {
get() {
debugger;
if (this.users && this.users.length > 0) {
this.newSelectedLang = this.users[0].profile.language;
return this.users[0].profile.language;
} else {
return { name: "English", alias: "en" };
}
},
set(newValue) {
this.newSelectedLang = {};
this.newSelectedLang = newValue;
}
}
},
// watch:{
// selectedLang(newLang, oldLang){
// this.setLang(newLang.alias);
// }
// }
meteor: {
$subscribe: {
users: []
},
users() {
return Meteor.users.find({ _id: Meteor.userId() }).fetch();
}
}
};
</script>
<style scoped>
</style>
\ No newline at end of file
This diff is collapsed.
......@@ -107,7 +107,7 @@
<v-card-text
class="subtitle-1 font-weight-bold black--text"
style="text-align:center"
>Farsi First Name:</v-card-text>
>{{$t("WorkList.FarsiFirstName")}}:</v-card-text>
</v-col>
<v-col md="3">
<v-text-field
......@@ -137,7 +137,7 @@
<v-card-text
class="subtitle-1 font-weight-bold black--text"
style="text-align:center"
>English First Name:</v-card-text>
>{{$t("WorkList.EnglishFirstName")}}:</v-card-text>
</v-col>
<v-col md="3">
<v-text-field
......@@ -168,7 +168,7 @@
<v-card-text
class="subtitle-1 font-weight-bold black--text"
style="text-align:center"
>Farsi Last Name:</v-card-text>
>{{$t("WorkList.FarsiLastName")}}:</v-card-text>
</v-col>
<v-col md="3">
<v-text-field
......@@ -197,7 +197,7 @@
<v-card-text
class="subtitle-1 font-weight-bold black--text"
style="text-align:center"
>English Last Name:</v-card-text>
>{{$t("WorkList.EnglishLastName")}}:</v-card-text>
</v-col>
<v-col md="3">
<v-text-field
......@@ -232,14 +232,14 @@
<v-card-text
class="subtitle-1 font-weight-bold black--text"
style="text-align:center"
>Farsi First Name:</v-card-text>
>{{$t("WorkList.FarsiFirstName")}}:</v-card-text>
</v-col>
<v-col sm="6" class="justify-center align-center align-self-end">
<v-card-text
class="subtitle-1 font-weight-bold black--text"
style="text-align:center"
>English First Name:</v-card-text>
>{{$t("WorkList.EnglishFirstName")}}:</v-card-text>
</v-col>
</v-row>
<v-row>
......@@ -300,14 +300,14 @@
<v-card-text
class="subtitle-1 font-weight-bold black--text"
style="text-align:center"
>Farsi Last Name:</v-card-text>
>{{$t("WorkList.FarsiLastName")}}:</v-card-text>
</v-col>
<v-col sm="6" class="justify-center align-center align-self-end">
<v-card-text
class="subtitle-1 font-weight-bold black--text"
style="text-align:center"
>English Last Name:</v-card-text>
>{{$t("WorkList.EnglishLastName")}}:</v-card-text>
</v-col>
</v-row>
<v-row>
......
......@@ -71,7 +71,11 @@ const messages = {
Register: "Register",
CreatePatient: "Create",
RegisterPatient: "Register Patient",
EditRegisterPatient: "Edit Patient Information"
EditRegisterPatient: "Edit Patient Information",
FarsiFirstName: "Farsi First Name",
EnglishFirstName: "English First Name",
FarsiLastName: "Farsi Last Name",
EnglishLastName: "English Last Name"
},
HISLink: {
DeleteMessage: "Are You Sure?",
......@@ -127,12 +131,27 @@ const messages = {
editText: "Edit",
UserName: "Users",
createBtn: "Create",
resetPassword: "Reset Password",
editBtn: "Edit",
userSelectStatement: "please select one of users",
userDeleteStatement: "user has been deleted",
UsernameTxtBox: "Username",
FullNameTxtBox: "Fullname",
ResetPasswordBtn: "Reset Password",
matchPassword: "password and its repeat must be the same",
minimum5Character: "minimum 5 characters required"
},
HisWorklist: {
title: "Worklist"
},
UserSetting: {
language: "Language",
fullName: "Full Name",
SaveBtn: "Save",
chooseLanguage: "please choose a language",
successfullSave: "changes have been successfully saved",
chooseImage: "please choose an image"
}
},
'fa': {
......@@ -203,7 +222,11 @@ const messages = {
Register: "ثبت",
CreatePatient: "ایجاد",
RegisterPatient: "ایجاد بیمار",
EditRegisterPatient: "ویرایش اطلاعات بیمار"
EditRegisterPatient: "ویرایش اطلاعات بیمار",
FarsiFirstName: "نام به فارسی",
EnglishFirstName: "نام به انگلیسی",
FarsiLastName: "نام خانوادگی به فارسی",
EnglishLastName: "نام خانوادگی به انگلیسی"
},
HISLink: {
......@@ -258,14 +281,30 @@ const messages = {
NoBtn: "نه",
newText: "جدید",
editText: "ویرایش",
resetPassword: "تغییر رمز کاربر",
UserName: "کاربر",
createBtn: "ایجاد",
editBtn: "ویرایش",
userSelectStatement: "لطفا یکی از کاربر ها را انتخاب نمایید",
userDeleteStatement: "کاربر حذف گردید",
UsernameTxtBox: "نام کاربری",
FullNameTxtBox: "نام و نام خانوادگی",
ResetPasswordBtn: "تغییر رمز",
matchPassword: "رمز و تکرار آن می بایست یکی باشد",
minimum5Character: "رمز باید حداقل دارای 5 کاراکتر باشد"
},
HisWorklist: {
title: "لیست بیماران"
},
UserSetting: {
language: "زبان",
fullName: "نام خانوادگی",
SaveBtn: "ذخیره",
chooseLanguage: "لطفا یک زبان را انتخاب نمایید",
successfullSave: "اطلاعات با موفقیت ذخیره گردید",
chooseImage: "لطفا یک عکس انتخاب نمایید"
}
}
......
......@@ -94,18 +94,19 @@
import Login from '../views/Login.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 EditWorkList from '../components/EditWorkList.vue';
import RegisterPatient from '../components/RegisterPatient.vue';
import WorkList from '../components/Worklist.vue';
import HisLink from '../components/HisLink.vue';
// import WorkList from '../components/Worklist.vue';
// import HisLink from '../components/HisLink.vue';
import DeviceMap from '../components/DeviceMap.vue';
import Client from '../components/Client.vue';
import Users from '../components/Users.vue';
import UserSetting from '../components/UserSetting.vue';
import AppVersion from '../views/AppVersion.vue';
......@@ -124,11 +125,11 @@ const routes = [{
component: Login,
name: 'signin'
},
{
path: '/signup',
component: Register,
name: 'signup'
},
// {
// path: '/signup',
// component: Register,
// name: 'signup'
// },
{
path: '/changePassword',
component: ChangePassword,
......@@ -141,14 +142,18 @@ const routes = [{
path: "worklist",
name: "worklist",
components: {
default: WorkList,
// default: WorkList,
default: () =>
import ('../components/Worklist.vue'),
register_patient: RegisterPatient
// edit_worklist: WorkList
}
}, {
path: "hislink",
name: "hislink",
component: HisLink
// component: HisLink
component: () =>
import ('../components/HisLink.vue')
}, {
path: "devicemap",
name: "devicemap",
......@@ -161,6 +166,10 @@ const routes = [{
path: "users",
name: "users",
component: Users
}, {
path: "usersetting",
name: "usersetting",
component: UserSetting
}]
}
];
......
......@@ -9,7 +9,55 @@
<v-spacer></v-spacer>
</v-app-bar>
<v-navigation-drawer v-model="drawer" app clipped>
<v-system-bar></v-system-bar>
<v-list nav dense>
<v-list-item>
<v-list-item-avatar size="100">
<v-img :src="src"></v-img>
<!-- <v-btn x-small fab style="position:absolute;bottom:0;right:0">
<v-icon small>add_a_photo</v-icon>
</v-btn>-->
</v-list-item-avatar>
</v-list-item>
<v-list-group no-action>
<template v-slot:activator>
<v-list-item-content>
<v-list-item-title class="pa-2">{{fullName}}</v-list-item-title>
<!-- <v-list-item-subtitle></v-list-item-subtitle> -->
</v-list-item-content>
</template>
<v-list-item class="pl-10" to="/main/usersetting">
<v-list-item-icon>
<v-icon>settings_applications</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>Setting</v-list-item-title>
</v-list-item-content>
</v-list-item>
<v-list-item class="pl-10" @click="logoffUser">
<v-list-item-icon>
<v-icon>exit_to_app</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>Signout</v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-list-group>
<!-- <v-list-item link>
<v-list-item-content>
<v-list-item-title class="title">John Leider</v-list-item-title>
<v-list-item-subtitle>john@vuetifyjs.com</v-list-item-subtitle>
</v-list-item-content>
<v-list-item-action>
<v-icon>mdi-menu-down</v-icon>
</v-list-item-action>
</v-list-item>-->
<v-divider></v-divider>
<v-list-item-group v-model="item" color="primary">
<v-list-item v-for="(item, i) in updatedItems" :key="i" :to="item.url">
<!-- <v-list-item-icon>
......@@ -26,15 +74,47 @@
<template v-if="$vuetify.rtl">
<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>
<v-toolbar-title class="red--text">Karname</v-toolbar-title>
<router-view name="register_patient"></router-view>
<v-spacer></v-spacer>
</v-app-bar>
<v-navigation-drawer v-model="drawer" app clipped right>
<v-system-bar></v-system-bar>
<v-list nav dense>
<v-list-item>
<v-list-item-avatar size="100">
<v-img :src="src"></v-img>
<!-- <v-btn x-small fab style="position:absolute;bottom:0;left:0">
<v-icon small>add_a_photo</v-icon>
</v-btn>-->
</v-list-item-avatar>
</v-list-item>
<v-list-group no-action>
<template v-slot:activator>
<v-list-item-content>
<v-list-item-title class="pa-2">{{fullName}}</v-list-item-title>
</v-list-item-content>
</template>
<v-list-item class="pr-10" to="/main/usersetting">
<v-list-item-icon>
<v-icon>settings_applications</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>Setting</v-list-item-title>
</v-list-item-content>
</v-list-item>
<v-list-item class="pr-10" @click="logoffUser">
<v-list-item-icon>
<v-icon>exit_to_app</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>Signout</v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-list-group>
<v-divider></v-divider>
<v-list-item-group v-model="item" color="primary">
<v-list-item v-for="(item, i) in updatedItems" :key="i" :to="item.url">
<!-- <v-list-item-icon>
......@@ -57,7 +137,7 @@
<keep-alive>
<router-view name="edit_worklist"></router-view>
</keep-alive>
</transition> -->
</transition>-->
</v-content>
<app-footer></app-footer>
......@@ -69,6 +149,7 @@ import { Fragment } from "vue-fragment";
import AppFooter from "../components/AppFooter.vue";
import { Meteor } from "meteor/meteor";
import RegisterPatient from "../components/RegisterPatient.vue";
import { mapActions } from "vuex";
export default {
components: {
"app-footer": AppFooter,
......@@ -78,8 +159,13 @@ export default {
props: {
source: String
},
methods:{
methods: {
...mapActions(["setLang"]),
logoffUser() {
Meteor.logout();
this.$router.push({ path: "/signin" });
document.location.reload();
}
},
computed: {
// getCurrentRoute(){
......@@ -95,8 +181,52 @@ export default {
) {
if (this.items.findIndex(item => item.text == "Users") < 0)
this.items.push({ text: "Users", url: "/main/users" });
} else {
const index = this.items.indexOf("Users");
if (index > -1) {
this.items.splice(index, 1);
}
}
return this.items;
},
fullName: {
get() {
if (this.users && this.users.length > 0) {
this.setLang(this.users[0].profile.language.alias);
return this.users[0].profile.fullName;
} else {
return "";
}
},
set(newValue) {
// this.newFullName = newValue;
}
},
src: {
get() {
if (this.users && this.users.length > 0) {
return this.users[0].profile.picture;
} else {
return "/img/empty.png";
}
},
set(newValue) {
// this.newSrc = newValue;
}
},
selectedLang: {
get() {
debugger;
if (this.users && this.users.length > 0) {
return this.users[0].profile.language;
} else {
return { name: "English", alias: "en" };
}
},
set(newValue) {
// this.newSelectedLang = {};
// this.newSelectedLang = newValue;
}
}
},
data: () => ({
......@@ -117,7 +247,7 @@ export default {
users: []
},
users() {
return Meteor.users.find({});
return Meteor.users.find({ _id: Meteor.userId() });
}
}
};
......
......@@ -14,8 +14,12 @@ Meteor.methods({
let userExists = Meteor.users.findOne({ username: item.username });
if (userExists == undefined || userExists == null)
Accounts.createUser({
username: item.username,
password: item.password
...item
// username: item.username,
// password: item.password,
// profile:{
// }
});
return true
......@@ -27,6 +31,21 @@ Meteor.methods({
}
},
"editUser1" (item) {
this.unblock();
if (this.userId) {
try {
debugger;
Meteor.users.update({ _id: item._id }, { $set: { "profile.fullName": item.fullName } }, { upsert: true })
// Accounts.setPassword(item._id, item.password, { logout: true })
return true
} catch (e) {
// Got a network error, timeout, or HTTP error in the 400 or 500 range.
console.log(e);
return false;
}
}
},
"setPassword" (item) {
this.unblock();
if (this.userId) {
try {
......@@ -55,4 +74,20 @@ Meteor.methods({
}
}
},
"editUserProfile" (item) {
debugger;
this.unblock();
if (this.userId) {
try {
debugger;
// db.collection.update( { _id:...} , { $set: { some_key.param2 : new_info } }
Meteor.users.update({ _id: this.userId }, { $set: {...item } }, { upsert: true })
return true
} catch (e) {
// Got a network error, timeout, or HTTP error in the 400 or 500 range.
console.log(e);
return false;
}
}
}
});
\ No newline at end of file
......@@ -9,13 +9,22 @@ Meteor.publish("users", function() {
if (this.userId) {
let isMarcoAdmin = Meteor.users.findOne({ _id: this.userId });
if (isMarcoAdmin.username == "marcoadmin") {
return Meteor.users.find({ username: { $ne: "marcoadmin" } }, {
return Meteor.users.find({ username: { $ne: "marcoadmin" } });
disableOplog: true,
// pollingThrottleMs: 1000,
pollingIntervalMs: 1000
});
}
// return Meteor.users.find({});
else
return [];
return Meteor.users.find({ _id: this.userId }, {
disableOplog: true,
// pollingThrottleMs: 1000,
pollingIntervalMs: 1000
});
// return Clients.find({}, {
// reactive: true,
......
......@@ -29,5 +29,5 @@ Meteor.startup(() => {
password: 'sysAdmin4.21'
});
Meteor.users.deny({ update: () => true });
});
\ No newline at end of file
{
"worklistUrl": "http://karname-broker.karname.ir",
"worklistUrl": "http://192.168.0.66:8086",
"databusUrl": "http://localhost:8090"
}
\ 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