Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Q
quasar-web-base
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Nguyễn Hải Sơn
quasar-web-base
Commits
4c102475
Commit
4c102475
authored
Apr 26, 2021
by
Võ Quang Thành Đạt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
done updateUser feature
parent
7200b608
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
379 additions
and
13 deletions
+379
-13
configurations.example.ts
src/assets/configurations.example.ts
+2
-0
AddNewUserDialog.ts
...s/user-management/add-new-user-dialog/AddNewUserDialog.ts
+2
-2
index.vue
src/components/user-management/add-new-user-dialog/index.vue
+4
-0
UpdateUserDialog.ts
...ts/user-management/update-user-dialog/UpdateUserDialog.ts
+94
-1
index.vue
src/components/user-management/update-user-dialog/index.vue
+163
-1
User.ts
src/pages/nguoi-dung/User.ts
+94
-9
index.vue
src/pages/nguoi-dung/index.vue
+20
-0
No files found.
src/assets/configurations.example.ts
View file @
4c102475
...
@@ -30,4 +30,6 @@ export enum API_PATHS {
...
@@ -30,4 +30,6 @@ export enum API_PATHS {
addNewUser
=
'/user/add'
,
addNewUser
=
'/user/add'
,
deleteUser
=
'/user/delete'
,
deleteUser
=
'/user/delete'
,
resetPassword
=
'/user/resetPass'
,
resetPassword
=
'/user/resetPass'
,
getUserDetail
=
'/user/detail'
,
updateUser
=
'/user/update'
,
}
}
src/components/user-management/add-new-user-dialog/AddNewUserDialog.ts
View file @
4c102475
...
@@ -16,11 +16,11 @@ export default defineComponent({
...
@@ -16,11 +16,11 @@ export default defineComponent({
mobileNumber
:
{
type
:
String
,
required
:
true
},
mobileNumber
:
{
type
:
String
,
required
:
true
},
address
:
{
type
:
String
,
required
:
true
},
address
:
{
type
:
String
,
required
:
true
},
phoneNumber
:
{
type
:
String
,
required
:
true
},
phoneNumber
:
{
type
:
String
,
required
:
true
},
unit
:
{
type
:
String
,
required
:
true
},
unit
:
{
type
:
Number
,
required
:
true
},
sex
:
{
type
:
Number
,
required
:
true
},
sex
:
{
type
:
Number
,
required
:
true
},
sexOptions
:
{
type
:
Array
,
required
:
true
},
sexOptions
:
{
type
:
Array
,
required
:
true
},
birthday
:
{
type
:
String
,
required
:
true
},
birthday
:
{
type
:
String
,
required
:
true
},
group
:
{
type
:
Number
,
required
:
true
},
group
:
{
type
:
Array
,
required
:
true
},
listGroup
:
{
type
:
Array
,
required
:
true
},
listGroup
:
{
type
:
Array
,
required
:
true
},
scheduleAccess
:
{
type
:
String
,
required
:
true
},
scheduleAccess
:
{
type
:
String
,
required
:
true
},
listScheduleAccess
:
{
type
:
Array
,
required
:
true
},
listScheduleAccess
:
{
type
:
Array
,
required
:
true
},
...
...
src/components/user-management/add-new-user-dialog/index.vue
View file @
4c102475
...
@@ -137,11 +137,15 @@
...
@@ -137,11 +137,15 @@
:options=
"listGroup"
:options=
"listGroup"
option-value=
"id"
option-value=
"id"
option-label=
"groupName"
option-label=
"groupName"
multiple
use-input
use-chips
map-options
map-options
emit-value
emit-value
:rules=
"groupRules"
:rules=
"groupRules"
hide-bottom-space
hide-bottom-space
></q-select>
></q-select>
<q-select
<q-select
:model-value=
"scheduleAccess"
:model-value=
"scheduleAccess"
@
update:model-value=
"$emit('update:scheduleAccess', $event)"
@
update:model-value=
"$emit('update:scheduleAccess', $event)"
...
...
src/components/user-management/update-user-dialog/UpdateUserDialog.ts
View file @
4c102475
import
{
defineComponent
}
from
'vue'
;
import
{
defineComponent
}
from
'vue'
;
export
default
defineComponent
({});
import
{
i18n
}
from
'src/boot/i18n'
;
import
{
isEmail
}
from
'../../../boot/functions'
;
import
{
isMobilePhone
}
from
'../../../boot/functions'
;
export
default
defineComponent
({
props
:
{
showDialogUpdate
:
{
type
:
Boolean
,
required
:
true
,
},
fullName
:
{
type
:
String
,
required
:
true
},
email
:
{
type
:
String
,
required
:
true
},
mobileNumber
:
{
type
:
String
,
required
:
true
},
address
:
{
type
:
String
,
required
:
true
},
phoneNumber
:
{
type
:
String
,
required
:
true
},
unit
:
{
type
:
String
,
required
:
true
},
sex
:
{
type
:
Number
,
required
:
true
},
sexOptions
:
{
type
:
Array
,
required
:
true
},
birthday
:
{
type
:
String
,
required
:
true
},
group
:
{
type
:
Array
,
required
:
true
},
listGroup
:
{
type
:
Array
,
required
:
true
},
scheduleAccess
:
{
type
:
String
,
required
:
true
},
listScheduleAccess
:
{
type
:
Array
,
required
:
true
},
status
:
{
type
:
Boolean
,
required
:
true
},
},
setup
()
{
const
fullNameRules
=
[
(
val
?:
string
)
=>
(
val
&&
val
.
trim
().
length
)
||
i18n
.
global
.
t
(
'userPage.validateMessages.requireFullName'
),
];
const
emailRules
=
[
(
val
?:
string
)
=>
(
val
&&
val
.
trim
().
length
)
||
i18n
.
global
.
t
(
'userPage.validateMessages.requireEmail'
),
(
val
:
string
)
=>
isEmail
(
val
)
||
i18n
.
global
.
t
(
'userPage.validateMessages.isEmail'
),
];
const
mobileNumberRules
=
[
(
val
?:
string
)
=>
(
val
&&
val
.
trim
().
length
)
||
i18n
.
global
.
t
(
'userPage.validateMessages.requireMobileNumber'
),
(
val
:
string
)
=>
isMobilePhone
(
val
)
||
i18n
.
global
.
t
(
'userPage.validateMessages.isMobilePhone'
),
];
const
addressRules
=
[
(
val
?:
string
)
=>
(
val
&&
val
.
trim
().
length
)
||
i18n
.
global
.
t
(
'userPage.validateMessages.requireAddress'
),
];
const
unitRules
=
[
(
val
?:
string
)
=>
(
val
&&
val
.
trim
().
length
)
||
i18n
.
global
.
t
(
'userPage.validateMessages.requireUnit'
),
];
const
sexRules
=
[
(
val
?:
number
)
=>
val
!==
undefined
||
i18n
.
global
.
t
(
'userPage.validateMessages.requireSex'
),
];
const
groupRules
=
[
(
val
?:
number
)
=>
val
!==
undefined
||
i18n
.
global
.
t
(
'userPage.validateMessages.requiredGroup'
),
];
return
{
fullNameRules
,
emailRules
,
mobileNumberRules
,
addressRules
,
unitRules
,
sexRules
,
groupRules
,
};
},
emits
:
[
'update:showDialogUpdate'
,
'click:CloseBtn'
,
'update:fullName'
,
'update:email'
,
'update:mobileNumber'
,
'update:address'
,
'update:phoneNumber'
,
'update:unit'
,
'update:sex'
,
'update:birthday'
,
'update:group'
,
'update:scheduleAccess'
,
'update:status'
,
'updateUser'
,
],
});
src/components/user-management/update-user-dialog/index.vue
View file @
4c102475
<
template
>
<
template
>
<div>
My component
</div>
<q-dialog
persistent
:model-value=
"showDialogUpdate"
@
update:model-value=
"$emit('update:showDialogUpdate', $event)"
>
<q-card
style=
"min-width: 900px"
bordered
>
<q-form
greedy
@
submit
.
prevent=
"$emit('updateUser')"
>
<q-card-section>
<q-item>
<q-item-section>
<q-item-label
class=
"text-h6 text-weight-regular"
>
{{
$t
(
'userPage.dialogLabel.title.updateUser'
)
}}
</q-item-label>
</q-item-section>
</q-item>
</q-card-section>
<q-separator
/>
<q-card-section>
<div
class=
"row q-col-gutter-sm"
>
<div
class=
"col-6"
>
<q-input
:model-value=
"fullName"
@
update:model-value=
"$emit('update:fullName', $event)"
:label=
"$t('userPage.dialogLabel.fieldLabels.fullName')"
type=
"text"
class=
"q-my-sm"
outlined
:rules=
"fullNameRules"
hide-bottom-space
></q-input>
<q-input
:model-value=
"email"
@
update:model-value=
"$emit('update:email', $event)"
:label=
"$t('userPage.dialogLabel.fieldLabels.email')"
type=
"text"
class=
"q-my-sm"
outlined
:rules=
"emailRules"
hide-bottom-space
></q-input>
<q-input
:model-value=
"mobileNumber"
@
update:model-value=
"$emit('update:mobileNumber', $event)"
:label=
"$t('userPage.dialogLabel.fieldLabels.mobileNumber')"
type=
"number"
class=
"q-my-sm"
outlined
:rules=
"mobileNumberRules"
hide-bottom-space
></q-input>
<q-input
:model-value=
"address"
@
update:model-value=
"$emit('update:address', $event)"
:label=
"$t('userPage.dialogLabel.fieldLabels.address')"
type=
"text"
class=
"q-my-sm"
outlined
:rules=
"addressRules"
hide-bottom-space
></q-input>
<q-input
:model-value=
"phoneNumber"
@
update:model-value=
"$emit('update:phoneNumber', $event)"
:label=
"$t('userPage.dialogLabel.fieldLabels.phoneNumber')"
type=
"number"
class=
"q-my-sm"
outlined
></q-input>
</div>
<div
class=
"col-6"
>
<q-input
:model-value=
"unit"
@
update:model-value=
"$emit('update:unit', $event)"
:label=
"$t('userPage.dialogLabel.fieldLabels.unit')"
type=
"text"
class=
"q-my-sm"
outlined
:rules=
"unitRules"
hide-bottom-space
></q-input>
<q-select
:model-value=
"sex"
emit-value
@
update:model-value=
"$emit('update:sex', $event)"
:label=
"$t('userPage.dialogLabel.fieldLabels.sex')"
class=
"q-my-sm"
:options=
"sexOptions"
option-value=
"id"
option-label=
"text"
outlined
map-options
:rules=
"sexRules"
hide-bottom-space
></q-select>
<q-input
:model-value=
"birthday"
@
update:model-value=
"$emit('update:birthday', $event)"
type=
"date"
class=
"q-my-sm"
outlined
>
<template
v-slot:prepend
>
<div
class=
"text-body2"
>
{{
$t
(
'userPage.dialogLabel.fieldLabels.birthday'
)
}}
</div>
</
template
>
</q-input>
<q-select
:model-value=
"group"
@
update:model-value=
"$emit('update:group', $event)"
:label=
"$t('userPage.dialogLabel.fieldLabels.group')"
class=
"q-my-sm"
outlined
:options=
"listGroup"
option-value=
"id"
option-label=
"groupName"
multiple
use-input
use-chips
map-options
emit-value
:rules=
"groupRules"
hide-bottom-space
></q-select>
<q-select
:model-value=
"scheduleAccess"
@
update:model-value=
"$emit('update:scheduleAccess', $event)"
:label=
"$t('userPage.dialogLabel.fieldLabels.scheduleAccess')"
:options=
"listScheduleAccess"
class=
"q-my-sm"
outlined
></q-select>
</div>
<q-space></q-space>
<div
class=
"col-6"
>
<span
class=
"text-body1"
>
{{
$t('userPage.dialogLabel.fieldLabels.status')
}}
</span
><q-toggle
:model-value=
"status"
@
update:model-value=
"$emit('update:status', $event)"
/>
</div>
</div>
</q-card-section>
<q-card-actions
align=
"right"
>
<q-btn
type=
"submit"
color=
"primary"
:label=
"$t('userPage.crudActions.save')"
/>
<q-btn
color=
"black"
:label=
"$t('userPage.crudActions.cancel')"
@
click=
"$emit('click:CloseBtn')"
/>
</q-card-actions>
</q-form>
</q-card>
</q-dialog>
</template>
</template>
<
script
lang=
"ts"
src=
"./UpdateUserDialog.ts"
></
script
>
<
script
lang=
"ts"
src=
"./UpdateUserDialog.ts"
></
script
>
src/pages/nguoi-dung/User.ts
View file @
4c102475
/* eslint-disable @typescript-eslint/ban-types */
import
{
AxiosResponse
}
from
'axios'
;
import
{
AxiosResponse
}
from
'axios'
;
import
{
Dialog
,
Notify
}
from
'quasar'
;
import
{
Dialog
,
Notify
}
from
'quasar'
;
import
{
API_PATHS
,
config
}
from
'src/assets/configurations'
;
import
{
API_PATHS
,
config
}
from
'src/assets/configurations'
;
...
@@ -7,10 +8,11 @@ import { i18n } from 'src/boot/i18n';
...
@@ -7,10 +8,11 @@ import { i18n } from 'src/boot/i18n';
import
{
useStore
}
from
'../../store/index'
;
import
{
useStore
}
from
'../../store/index'
;
import
{
computed
,
defineComponent
,
onMounted
,
ref
,
Ref
}
from
'vue'
;
import
{
computed
,
defineComponent
,
onMounted
,
ref
,
Ref
}
from
'vue'
;
import
AddNewUserDialogComponent
from
'../../components/user-management/add-new-user-dialog/index.vue'
;
import
AddNewUserDialogComponent
from
'../../components/user-management/add-new-user-dialog/index.vue'
;
import
UpdateUserDialogComponent
from
'../../components/user-management/update-user-dialog/index.vue'
;
import
{
GroupInfoType
}
from
'../nhom-nguoi-dung/UserGroup'
;
import
{
GroupInfoType
}
from
'../nhom-nguoi-dung/UserGroup'
;
export
default
defineComponent
({
export
default
defineComponent
({
components
:
{
AddNewUserDialogComponent
},
components
:
{
AddNewUserDialogComponent
,
UpdateUserDialogComponent
},
setup
()
{
setup
()
{
const
totalPage
=
ref
(
0
);
const
totalPage
=
ref
(
0
);
const
pageIndex
=
ref
(
1
);
const
pageIndex
=
ref
(
1
);
...
@@ -90,11 +92,11 @@ export default defineComponent({
...
@@ -90,11 +92,11 @@ export default defineComponent({
{
id
:
1
,
text
:
'Nam'
},
{
id
:
1
,
text
:
'Nam'
},
{
id
:
2
,
text
:
'Nữ'
},
{
id
:
2
,
text
:
'Nữ'
},
]);
]);
const
address
=
ref
(
''
);
const
address
:
Ref
<
string
|
undefined
>
=
ref
(
);
const
unit
=
ref
(
''
);
const
unit
:
Ref
<
number
|
undefined
>
=
ref
(
);
const
status
:
Ref
<
boolean
>
=
ref
(
true
);
const
status
:
Ref
<
boolean
|
number
>
=
ref
(
true
);
const
listGroup
:
Ref
<
{
id
:
number
;
groupName
:
string
}[]
>
=
ref
([]);
const
listGroup
:
Ref
<
{
id
:
number
;
groupName
:
string
}[]
>
=
ref
([]);
const
group
:
Ref
<
number
|
undefined
>
=
ref
(
);
const
group
:
Ref
<
number
[]
>
=
ref
([]
);
const
scheduleAccess
=
ref
(
'Chưa có lịch truy cập'
);
const
scheduleAccess
=
ref
(
'Chưa có lịch truy cập'
);
const
listScheduleAccess
=
ref
([
'Chưa có lịch truy cập'
]);
const
listScheduleAccess
=
ref
([
'Chưa có lịch truy cập'
]);
const
$store
=
useStore
();
const
$store
=
useStore
();
...
@@ -138,12 +140,15 @@ export default defineComponent({
...
@@ -138,12 +140,15 @@ export default defineComponent({
const
addNewUser
=
async
()
=>
{
const
addNewUser
=
async
()
=>
{
try
{
try
{
const
groups
:
{
id
:
number
}[]
=
[];
group
.
value
.
map
((
item
)
=>
{
groups
.
push
({
id
:
(
item
as
unknown
)
as
number
});
});
const
response
=
(
await
api
({
const
response
=
(
await
api
({
url
:
API_PATHS
.
addNewUser
,
url
:
API_PATHS
.
addNewUser
,
method
:
'POST'
,
method
:
'POST'
,
data
:
{
data
:
{
user
:
{
user
:
{
id
:
2
,
userName
:
userName
.
value
,
userName
:
userName
.
value
,
password
:
password
.
value
,
password
:
password
.
value
,
fullName
:
fullName
.
value
,
fullName
:
fullName
.
value
,
...
@@ -156,7 +161,7 @@ export default defineComponent({
...
@@ -156,7 +161,7 @@ export default defineComponent({
unit
:
unit
.
value
,
unit
:
unit
.
value
,
status
:
status
.
value
?
1
:
0
,
status
:
status
.
value
?
1
:
0
,
},
},
groups
:
[{
id
:
group
.
value
}]
,
groups
:
groups
,
pageRoles
:
[],
pageRoles
:
[],
},
},
}))
as
AxiosResponse
<
BaseResponseBody
<
unknown
>>
;
}))
as
AxiosResponse
<
BaseResponseBody
<
unknown
>>
;
...
@@ -233,13 +238,13 @@ export default defineComponent({
...
@@ -233,13 +238,13 @@ export default defineComponent({
});
});
};
};
const
resetPassword
=
async
(
userI
D
:
number
)
=>
{
const
resetPassword
=
async
(
userI
d
:
number
)
=>
{
try
{
try
{
const
deleteResult
=
(
await
api
({
const
deleteResult
=
(
await
api
({
url
:
API_PATHS
.
resetPassword
,
url
:
API_PATHS
.
resetPassword
,
method
:
'GET'
,
method
:
'GET'
,
params
:
{
params
:
{
userId
:
userI
D
,
userId
:
userI
d
,
},
},
}))
as
AxiosResponse
<
BaseResponseBody
<
unknown
>>
;
}))
as
AxiosResponse
<
BaseResponseBody
<
unknown
>>
;
...
@@ -255,6 +260,83 @@ export default defineComponent({
...
@@ -255,6 +260,83 @@ export default defineComponent({
}
catch
(
error
)
{}
}
catch
(
error
)
{}
};
};
const
showDialogUpdateUser
=
(
item
:
any
)
=>
{
showDialogUpdate
.
value
=
true
;
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
void
getUserDetail
(
item
.
row
.
id
);
};
const
getUserDetail
=
async
(
userId
:
number
)
=>
{
try
{
const
response
=
(
await
api
({
url
:
API_PATHS
.
getUserDetail
,
method
:
'GET'
,
params
:
{
userId
:
userId
,
},
}))
as
AxiosResponse
<
BaseResponseBody
<
{
user
:
UserObject
;
groups
:
GroupInfoType
[]
}
>
>
;
if
(
response
.
data
.
error
.
code
===
config
.
API_RES_CODE
.
OK
.
code
)
{
console
.
log
(
response
.
data
.
data
);
const
userInfo
=
response
.
data
.
data
.
user
;
const
groupInfo
=
response
.
data
.
data
.
groups
;
address
.
value
=
userInfo
.
address
as
string
;
birthday
.
value
=
userInfo
.
birthday
as
string
;
email
.
value
=
userInfo
.
email
as
string
;
fullName
.
value
=
userInfo
.
fullName
as
string
;
mobileNumber
.
value
=
userInfo
.
mobileNumber
as
string
;
phoneNumber
.
value
=
userInfo
.
phoneNumber
as
string
;
sex
.
value
=
userInfo
.
sex
;
status
.
value
=
userInfo
.
status
;
unit
.
value
=
userInfo
.
unit
as
number
;
userName
.
value
=
userInfo
.
userName
;
groupInfo
.
map
((
item
)
=>
{
group
.
value
.
push
(
item
.
id
);
});
}
}
catch
(
error
)
{}
};
const
updateUser
=
async
()
=>
{
console
.
log
(
'updateUser'
);
try
{
const
groups
:
{
id
:
number
}[]
=
[];
group
.
value
.
map
((
item
)
=>
{
groups
.
push
({
id
:
(
item
as
unknown
)
as
number
});
});
const
response
=
(
await
api
({
url
:
API_PATHS
.
updateUser
,
method
:
'POST'
,
data
:
{
user
:
{
userName
:
userName
.
value
,
password
:
password
.
value
,
fullName
:
fullName
.
value
,
birthday
:
birthday
.
value
,
email
:
email
.
value
,
phoneNumber
:
phoneNumber
.
value
,
mobileNumber
:
mobileNumber
.
value
,
sex
:
sex
.
value
,
address
:
address
.
value
,
unit
:
unit
.
value
,
status
:
status
.
value
?
1
:
0
,
},
groups
:
groups
,
pageRoles
:
[],
},
}))
as
AxiosResponse
<
BaseResponseBody
<
unknown
>>
;
if
(
response
.
data
.
error
.
code
===
config
.
API_RES_CODE
.
OK
.
code
)
{
showDialog
.
value
=
false
;
Notify
.
create
({
type
:
'positive'
,
message
:
i18n
.
global
.
t
(
'userPage.actionMessages.updateUserAccess'
),
});
void
getListUsers
();
}
}
catch
(
error
)
{}
};
onMounted
(()
=>
{
onMounted
(()
=>
{
void
getListUsers
();
void
getListUsers
();
void
getListUserGroup
();
void
getListUserGroup
();
...
@@ -290,6 +372,9 @@ export default defineComponent({
...
@@ -290,6 +372,9 @@ export default defineComponent({
deleteUser
,
deleteUser
,
confirmResetPassword
,
confirmResetPassword
,
showDialogUpdate
,
showDialogUpdate
,
showDialogUpdateUser
,
updateUser
,
getUserDetail
,
};
};
},
},
});
});
src/pages/nguoi-dung/index.vue
View file @
4c102475
...
@@ -53,6 +53,7 @@
...
@@ -53,6 +53,7 @@
round
round
color=
"primary"
color=
"primary"
icon=
"mdi-account-edit-outline"
icon=
"mdi-account-edit-outline"
@
click=
"showDialogUpdateUser(item)"
></q-btn>
></q-btn>
<q-btn
<q-btn
flat
flat
...
@@ -106,6 +107,25 @@
...
@@ -106,6 +107,25 @@
@
click:CloseBtn=
"showDialog = false"
@
click:CloseBtn=
"showDialog = false"
@
addNewUser=
"addNewUser"
@
addNewUser=
"addNewUser"
></AddNewUserDialogComponent>
></AddNewUserDialogComponent>
<UpdateUserDialogComponent
v-model:show-dialog-update=
"showDialogUpdate"
v-model:full-name=
"fullName"
v-model:email=
"email"
v-model:mobile-number=
"mobileNumber"
v-model:address=
"address"
v-model:phone-number=
"phoneNumber"
v-model:unit=
"unit"
v-model:sex=
"sex"
:sex-options=
"sexOptions"
v-model:birthday=
"birthday"
v-model:group=
"group"
:list-group=
"listGroup"
v-model:schedule-access=
"scheduleAccess"
:list-schedule-access=
"listScheduleAccess"
v-model:status=
"status"
@
click:CloseBtn=
"showDialogUpdate = false"
@
updateUser=
"updateUser"
></UpdateUserDialogComponent>
</div>
</div>
</template>
</template>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment