fix: admin/circle administration
This commit is contained in:
parent
3287257eb0
commit
eb31b5b9d9
@ -61,7 +61,7 @@ html(lang="en")
|
||||
include views/page-directory.pug
|
||||
|
||||
if endpoints.get.projects
|
||||
#project(hidden, data-view="project", no-render).with-sidebar.whitespace-normal
|
||||
#project(hidden, data-view="project").with-sidebar.whitespace-normal
|
||||
hubl-reactivity(bind-user nested-field='inbox' target-src="store://user.projects")
|
||||
hubl-reactivity(data-src=`${endpoints.post.projects}joinable/` target-src=`${endpoints.get.projects}`)
|
||||
hubl-reactivity(data-src=`${endpoints.post.projects}` target-src=`${endpoints.get.projects}`)
|
||||
@ -73,7 +73,7 @@ html(lang="en")
|
||||
include views/page-project.pug
|
||||
|
||||
if endpoints.get.circles
|
||||
#circle(hidden, data-view="circle", no-render).with-sidebar.whitespace-normal
|
||||
#circle(hidden, data-view="circle").with-sidebar.whitespace-normal
|
||||
hubl-reactivity(bind-user nested-field='inbox' target-src="store://user.circles")
|
||||
hubl-reactivity(data-src=`${endpoints.post.circles}joinable/` target-src=`${endpoints.get.circles}`)
|
||||
hubl-reactivity(data-src=`${endpoints.post.circles}` target-src=`${endpoints.get.circles}`)
|
||||
|
@ -30,6 +30,10 @@ main#content {
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
&.admin-name-ellipsis {
|
||||
display: inline-block;
|
||||
width: 75%;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,14 +1,14 @@
|
||||
.scrollbar-content.views-container.sidebar-is-closed.bg-color-white
|
||||
solid-ac-checker(permission='acl:Read', bind-resources)
|
||||
#circle-chat(hidden, data-view="circle-chat")
|
||||
#circle-chat(hidden, data-view="circle-chat", no-render)
|
||||
include partials/circle/page-circle-chat.pug
|
||||
#circle-information(hidden, data-view="circle-information")
|
||||
#circle-information(hidden, data-view="circle-information", no-render)
|
||||
include partials/circle/page-circle-profile.pug
|
||||
#circle-events(hidden, data-view="circle-events")
|
||||
#circle-events(hidden, data-view="circle-events", no-render)
|
||||
include partials/circle/page-circle-events.pug
|
||||
#circle-resources(hidden, data-view="circle-resources")
|
||||
#circle-resources(hidden, data-view="circle-resources", no-render)
|
||||
include partials/circle/page-circle-resources.pug
|
||||
#circle-polls(hidden, data-view="circle-polls")
|
||||
#circle-polls(hidden, data-view="circle-polls", no-render)
|
||||
include partials/circle/page-circle-polls.pug
|
||||
|
||||
nav.jsRightMenu.text-disable-selection.sidebar.whitespace-normal(role='navigation')
|
||||
|
@ -1,10 +1,10 @@
|
||||
.scrollbar-content.views-container.sidebar-is-closed.bg-color-white
|
||||
solid-ac-checker(permission='acl:Read', bind-resources)
|
||||
#project-chat(hidden, data-view="project-chat")
|
||||
#project-chat(hidden, data-view="project-chat", no-render)
|
||||
include partials/project/page-project-chat.pug
|
||||
#project-information(hidden, data-view="project-information")
|
||||
#project-information(hidden, data-view="project-information", no-render)
|
||||
include partials/project/page-project-profile.pug
|
||||
#project-picture(hidden, data-view="project-picture")
|
||||
#project-picture(hidden, data-view="project-picture", no-render)
|
||||
include partials/project/page-project-picture.pug
|
||||
|
||||
nav.jsRightMenu.text-disable-selection.sidebar.whitespace-normal(role='navigation')
|
||||
|
@ -61,6 +61,28 @@ div.segment.full.padding-large.sm-padding-xsmall.sm-padding-top-normal.whitespac
|
||||
)
|
||||
span.icon.icon-people.icon-xsmall.margin-right-xxsmall
|
||||
|
||||
solid-widget(name='admin-circle-link')
|
||||
template
|
||||
solid-link(
|
||||
data-src='${src}'
|
||||
next='circle-information'
|
||||
)
|
||||
solid-display(
|
||||
data-src='${src}'
|
||||
fields='name'
|
||||
)
|
||||
|
||||
solid-widget(name='admin-circle-link-alternate')
|
||||
template
|
||||
solid-display(
|
||||
data-src='${src}'
|
||||
nested-field='circle'
|
||||
fields='name'
|
||||
class-name='segment block margin-bottom-xxsmall text-xlarge text-color-heading text-semibold text-letter-spacing-large text-underline text-ellipsis admin-name-ellipsis'
|
||||
action-name='name'
|
||||
widget-name='admin-circle-link'
|
||||
)
|
||||
|
||||
.segment.table-wrapper
|
||||
.table
|
||||
|
||||
@ -69,6 +91,15 @@ div.segment.full.padding-large.sm-padding-xsmall.sm-padding-top-normal.whitespac
|
||||
div.segment.table-cell.third(data-trans='circle.list.tableHeader2')
|
||||
div.segment.table-cell.third(data-trans='circle.list.tableHeader3')
|
||||
|
||||
solid-widget(name="leave-circle-reactivity")
|
||||
template
|
||||
hubl-reactivity(data-src=`${endpoints.get.circles}` target-src='${value}')
|
||||
hubl-reactivity(data-src=`${endpoints.get.circles}joinable/` target-src='${value}')
|
||||
hubl-reactivity(data-src=`${endpoints.post.circles}` target-src='${value}')
|
||||
hubl-reactivity(data-src=`${endpoints.post.circles}joinable/` target-src='${value}')
|
||||
hubl-reactivity(bind-user nested-field="circles" target-src='${value}')
|
||||
|
||||
|
||||
solid-widget(name='hubl-admin-circle-leave-button')
|
||||
template
|
||||
solid-delete(
|
||||
@ -77,12 +108,17 @@ div.segment.full.padding-large.sm-padding-xsmall.sm-padding-top-normal.whitespac
|
||||
data-label=''
|
||||
data-trans='data-label=circle.list.buttonQuit'
|
||||
)
|
||||
hubl-reactivity(data-src=`${endpoints.circles || endpoints.get.circles}` target-src='${src}')
|
||||
hubl-reactivity(data-src=`${endpoints.circles || endpoints.get.circles}joinable/` target-src='${src}')
|
||||
hubl-reactivity(data-src=`${endpoints.get.circles}` target-src='${src}')
|
||||
hubl-reactivity(data-src=`${endpoints.get.circles}joinable/` target-src='${src}')
|
||||
hubl-reactivity(data-src=`${endpoints.post.circles}` target-src='${src}')
|
||||
hubl-reactivity(data-src=`${endpoints.post.circles}joinable/` target-src='${src}')
|
||||
hubl-reactivity(bind-user nested-field="circles" target-src='${src}')
|
||||
if (endpoints.post && endpoints.post.circles) && (endpoints.get && endpoints.get.circles)
|
||||
hubl-reactivity(data-src=`${endpoints.post.circles}joinable/` target-src=`${src}`)
|
||||
hubl-reactivity(data-src=`${endpoints.post.circles}` target-src=`${src}`)
|
||||
solid-display(
|
||||
data-src="${src}"
|
||||
fields="circle"
|
||||
widget-circle='leave-circle-reactivity'
|
||||
hidden
|
||||
)
|
||||
|
||||
solid-display(
|
||||
class='table-body'
|
||||
@ -95,7 +131,8 @@ div.segment.full.padding-large.sm-padding-xsmall.sm-padding-top-normal.whitespac
|
||||
class-cell2='segment table-cell third text-center text-left'
|
||||
class-cell3='segment table-cell third text-center'
|
||||
|
||||
class-circle.name='segment block margin-bottom-xxsmall text-xlarge text-color-heading text-semibold text-letter-spacing-large text-underline ellipsis'
|
||||
action-circle.name='circle.name'
|
||||
widget-circle.name='admin-circle-link-alternate'
|
||||
class-circle.subtitle='segment full text-ellipsis'
|
||||
|
||||
action-leaveButton="joinButton"
|
||||
@ -120,12 +157,11 @@ div.segment.full.padding-large.sm-padding-xsmall.sm-padding-top-normal.whitespac
|
||||
submit-button='Join'
|
||||
data-trans='submit-button=circle.list.buttonJoin'
|
||||
)
|
||||
hubl-reactivity(data-src=`${endpoints.circles || endpoints.get.circles}` target-src='${value}')
|
||||
hubl-reactivity(data-src=`${endpoints.circles || endpoints.get.circles}joinable/` target-src='${value}')
|
||||
hubl-reactivity(data-src=`${endpoints.get.circles}` target-src='${value}')
|
||||
hubl-reactivity(data-src=`${endpoints.get.circles}joinable/` target-src='${value}')
|
||||
hubl-reactivity(data-src=`${endpoints.post.circles}` target-src='${value}')
|
||||
hubl-reactivity(data-src=`${endpoints.post.circles}joinable/` target-src='${value}')
|
||||
hubl-reactivity(bind-user nested-field="circles" target-src='${value}')
|
||||
if (endpoints.post && endpoints.post.circles) && (endpoints.get && endpoints.get.circles)
|
||||
hubl-reactivity(data-src=`${endpoints.post.circles}joinable/` target-src=`${value}`)
|
||||
hubl-reactivity(data-src=`${endpoints.post.circles}` target-src=`${value}`)
|
||||
|
||||
solid-display(
|
||||
class='table-body'
|
||||
@ -138,7 +174,9 @@ div.segment.full.padding-large.sm-padding-xsmall.sm-padding-top-normal.whitespac
|
||||
class-cell2='segment table-cell third text-center text-left'
|
||||
class-cell3='segment table-cell third text-center'
|
||||
|
||||
class-name='segment block margin-bottom-xxsmall text-xlarge text-color-heading text-semibold text-letter-spacing-large text-underline ellipsis'
|
||||
class-name='segment block margin-bottom-xxsmall text-xlarge text-color-heading text-semibold text-letter-spacing-large text-underline text-ellipsis admin-name-ellipsis'
|
||||
action-name='name'
|
||||
widget-name='admin-circle-link'
|
||||
class-subtitle='segment full text-ellipsis'
|
||||
|
||||
widget-owner='hubl-circle-owner'
|
||||
|
@ -36,6 +36,28 @@ div.segment.full.padding-large.sm-padding-xsmall.sm-padding-top-medium.whitespac
|
||||
)
|
||||
span.icon.icon-people.icon-xsmall.margin-right-xxsmall
|
||||
|
||||
solid-widget(name='admin-project-link')
|
||||
template
|
||||
solid-link(
|
||||
data-src='${src}'
|
||||
next='project-information'
|
||||
)
|
||||
solid-display(
|
||||
data-src='${src}'
|
||||
fields='customer.name'
|
||||
)
|
||||
|
||||
solid-widget(name='admin-project-link-alternate')
|
||||
template
|
||||
solid-display(
|
||||
data-src='${src}'
|
||||
nested-field='project'
|
||||
fields='name'
|
||||
class-name='segment block margin-bottom-xxsmall text-xlarge text-color-heading text-semibold text-letter-spacing-large text-underline text-ellipsis admin-name-ellipsis'
|
||||
action-name='name'
|
||||
widget-name='admin-project-link'
|
||||
)
|
||||
|
||||
.segment.table-wrapper
|
||||
.table
|
||||
|
||||
@ -45,6 +67,14 @@ div.segment.full.padding-large.sm-padding-xsmall.sm-padding-top-medium.whitespac
|
||||
div.segment.table-cell.quarter(data-trans='project.list.tableHeader3')
|
||||
div.segment.table-cell.quarter(data-trans='project.list.tableHeader4')
|
||||
|
||||
solid-widget(name="leave-project-reactivity")
|
||||
template
|
||||
hubl-reactivity(data-src=`${endpoints.get.projects}` target-src='${value}')
|
||||
hubl-reactivity(data-src=`${endpoints.get.projects}joinable/` target-src='${value}')
|
||||
hubl-reactivity(data-src=`${endpoints.post.projects}` target-src='${value}')
|
||||
hubl-reactivity(data-src=`${endpoints.post.projects}joinable/` target-src='${value}')
|
||||
hubl-reactivity(bind-user nested-field="projects" target-src='${value}')
|
||||
|
||||
solid-widget(name="hubl-admin-project-leave-button")
|
||||
template
|
||||
solid-delete(
|
||||
@ -53,12 +83,17 @@ div.segment.full.padding-large.sm-padding-xsmall.sm-padding-top-medium.whitespac
|
||||
data-label=''
|
||||
data-trans='data-label=project.list.buttonQuit'
|
||||
)
|
||||
hubl-reactivity(data-src=`${endpoints.projects || endpoints.get.projects}` target-src='${src}')
|
||||
hubl-reactivity(data-src=`${endpoints.projects || endpoints.get.projects}joinable/` target-src='${src}')
|
||||
hubl-reactivity(data-src=`${endpoints.get.projects}` target-src='${src}')
|
||||
hubl-reactivity(data-src=`${endpoints.get.projects}joinable/` target-src='${src}')
|
||||
hubl-reactivity(data-src=`${endpoints.post.projects}` target-src='${src}')
|
||||
hubl-reactivity(data-src=`${endpoints.post.projects}joinable/` target-src='${src}')
|
||||
hubl-reactivity(bind-user nested-field="projects" target-src='${src}')
|
||||
if (endpoints.post && endpoints.post.projects) && (endpoints.get && endpoints.get.projects)
|
||||
hubl-reactivity(data-src=`${endpoints.post.projects}joinable/` target-src=`${src}`)
|
||||
hubl-reactivity(data-src=`${endpoints.post.projects}` target-src=`${src}`)
|
||||
solid-display(
|
||||
data-src="${src}"
|
||||
fields="project"
|
||||
widget-project='leave-project-reactivity'
|
||||
hidden
|
||||
)
|
||||
|
||||
solid-widget(name='hubl-project-captain')
|
||||
template
|
||||
@ -108,7 +143,8 @@ div.segment.full.padding-large.sm-padding-xsmall.sm-padding-top-medium.whitespac
|
||||
class-cell3='segment table-cell quarter text-left'
|
||||
class-cell4='segment table-cell quarter text-center'
|
||||
|
||||
class-project.customer.name='segment block margin-bottom-xxsmall text-xlarge text-color-heading text-semibold text-letter-spacing-large text-underline ellipsis'
|
||||
action-project.customer.name='project.customer.name'
|
||||
widget-project.customer.name='admin-project-link-alternate'
|
||||
class-project.name='segment full'
|
||||
|
||||
action-leaveButton="joinButton"
|
||||
@ -136,12 +172,11 @@ div.segment.full.padding-large.sm-padding-xsmall.sm-padding-top-medium.whitespac
|
||||
submit-button=''
|
||||
data-trans='submit-button=project.list.buttonJoin'
|
||||
)
|
||||
hubl-reactivity(data-src=`${endpoints.projects || endpoints.get.projects}` target-src='${src}')
|
||||
hubl-reactivity(data-src=`${endpoints.projects || endpoints.get.projects}joinable/` target-src='${src}')
|
||||
hubl-reactivity(bind-user nested-field="projects" target-src='${src}')
|
||||
if (endpoints.post && endpoints.post.projects) && (endpoints.get && endpoints.get.projects)
|
||||
hubl-reactivity(data-src=`${endpoints.post.projects}joinable/` target-src=`${value}`)
|
||||
hubl-reactivity(data-src=`${endpoints.post.projects}` target-src=`${value}`)
|
||||
hubl-reactivity(data-src=`${endpoints.get.projects}` target-src='${value}')
|
||||
hubl-reactivity(data-src=`${endpoints.get.projects}joinable/` target-src='${value}')
|
||||
hubl-reactivity(data-src=`${endpoints.post.projects}` target-src='${value}')
|
||||
hubl-reactivity(data-src=`${endpoints.post.projects}joinable/` target-src='${value}')
|
||||
hubl-reactivity(bind-user nested-field="projects" target-src='${value}')
|
||||
|
||||
solid-display(
|
||||
class='table-body'
|
||||
@ -155,7 +190,8 @@ div.segment.full.padding-large.sm-padding-xsmall.sm-padding-top-medium.whitespac
|
||||
class-cell3='segment table-cell quarter text-left'
|
||||
class-cell4='segment table-cell quarter text-center'
|
||||
|
||||
class-customer.name='segment block margin-bottom-xxsmall text-xlarge text-color-heading text-semibold text-letter-spacing-large text-underline ellpsis'
|
||||
action-project.customer.name='project.customer.name'
|
||||
widget-project.customer.name='admin-project-link'
|
||||
class-name='segment full'
|
||||
|
||||
action-joinButton="joinButton"
|
||||
|
@ -18,6 +18,32 @@ solid-router(default-route='circle-profile', hidden)
|
||||
solid-widget(name='hubl-circle-team-contact')
|
||||
template
|
||||
solid-link.icon.icon-secondary.hover.icon-speech.margin-left-xsmall.margin-right-medium(data-src='\${value}', next='messages')
|
||||
|
||||
solid-widget(name='hubl-circle-leave-button')
|
||||
template
|
||||
solid-ac-checker(no-permission='acl:Delete', data-src="${src}", nested-field="circle")
|
||||
solid-delete(
|
||||
class='button text-xsmall text-bold text-uppercase color-secondary bordered'
|
||||
data-src="${src}"
|
||||
data-label=''
|
||||
data-trans='data-label=circle.profile.buttonQuit'
|
||||
next='circle-left'
|
||||
)
|
||||
|
||||
solid-widget(name='hubl-circle-join-button')
|
||||
template
|
||||
button.button.text-xsmall.text-bold.text-uppercase.reversed.color-secondary.bordered.icon.icon-arrow-right-circle
|
||||
solid-form(
|
||||
bind-resource
|
||||
nested-field='members'
|
||||
|
||||
fields='user.username'
|
||||
value-user.username='hubl-workaround-493'
|
||||
widget-user.username='solid-form-hidden'
|
||||
|
||||
submit-button=''
|
||||
data-trans='submit-button=circle.profile.buttonJoin'
|
||||
)
|
||||
|
||||
div.segment.full.padding-large.sm-padding-xsmall.sm-padding-top-xlarge
|
||||
div#loader-circle-profile.loader
|
||||
@ -38,20 +64,34 @@ solid-router(default-route='circle-profile', hidden)
|
||||
widget-creationDate='solid-display-value-date'
|
||||
)
|
||||
|
||||
solid-ac-checker.segment.half.sm-full.text-right(permission='acl:Append', bind-resources, nested-field='members')
|
||||
solid-ac-checker(permission='acl:Delete', bind-resources)
|
||||
solid-link(class='segment sm-full margin-bottom-large sm-margin-bottom-medium button text-xsmall text-bold text-uppercase text-center reversed color-secondary bordered icon icon-pencil' next='circle-edit' bind-resources data-trans='circle.profile.buttonModify')
|
||||
solid-ac-checker(no-permission='acl:Delete', bind-resources)
|
||||
solid-link(class='segment sm-full margin-bottom-large sm-margin-bottom-medium button text-xsmall text-bold text-uppercase text-center reversed color-secondary bordered icon icon-pencil' next='circle-edit' bind-resources data-trans='circle.profile.buttonAdd')
|
||||
.segment.half.sm-full.text-right.margin-bottom-medium.sm-margin-bottom-small
|
||||
solid-ac-checker(permission='acl:Append', bind-resources, nested-field='members')
|
||||
solid-ac-checker(permission='acl:Delete', bind-resources)
|
||||
solid-link(class='segment sm-full button text-xsmall text-bold text-uppercase text-center reversed color-secondary bordered icon icon-pencil' next='circle-edit' bind-resources data-trans='circle.profile.buttonModify')
|
||||
solid-ac-checker(no-permission='acl:Delete', bind-resources)
|
||||
solid-link(class='segment sm-full button text-xsmall text-bold text-uppercase text-center reversed color-secondary bordered icon icon-pencil' next='circle-edit' bind-resources data-trans='circle.profile.buttonAdd')
|
||||
|
||||
solid-ac-checker.segment.full.text-right.margin-bottom-large.sm-margin-bottom-medium(permission='acl:Delete', bind-resources)
|
||||
solid-delete(
|
||||
class='segment sm-full text-xsmall text-center children-link-button children-link-text-bold children-link-text-uppercase children-link-color-secondary bordered'
|
||||
.segment.full.text-right.margin-bottom-large.sm-margin-bottom-medium
|
||||
solid-display.segment(
|
||||
bind-resources
|
||||
data-label=''
|
||||
data-trans='data-label=circle.profile.buttonDelete'
|
||||
next='admin-circles'
|
||||
nested-field='members'
|
||||
fields='relation'
|
||||
action-relation='relation'
|
||||
widget-relation='hubl-circle-leave-button'
|
||||
search-fields='user'
|
||||
search-widget-user='solid-form-hidden'
|
||||
search-value-user=""
|
||||
empty-widget='hubl-circle-join-button'
|
||||
hubl-inherit-user-id="search-value-user"
|
||||
)
|
||||
solid-ac-checker.segment.margin-left-small(permission='acl:Delete', bind-resources)
|
||||
solid-delete(
|
||||
class='segment sm-full text-xsmall text-center children-link-button children-link-text-bold children-link-text-uppercase children-link-color-secondary bordered'
|
||||
bind-resources
|
||||
data-label=''
|
||||
data-trans='data-label=circle.profile.buttonDelete'
|
||||
next='admin-circles'
|
||||
)
|
||||
|
||||
h3.text-color-heading.text-bold.text-letter-spacing-large(data-trans='circle.profile.description')
|
||||
|
||||
@ -61,46 +101,6 @@ solid-router(default-route='circle-profile', hidden)
|
||||
widget-description='solid-display-value-markdown'
|
||||
)
|
||||
|
||||
solid-widget(name='hubl-circle-leave-button')
|
||||
template
|
||||
solid-ac-checker(no-permission='acl:Delete', data-src="${src}", nested-field="circle")
|
||||
solid-delete(
|
||||
class='button text-xsmall text-bold text-uppercase color-secondary bordered'
|
||||
data-src="${src}"
|
||||
data-label=''
|
||||
data-trans='data-label=circle.profile.buttonQuit'
|
||||
next='circle-left'
|
||||
)
|
||||
|
||||
solid-widget(name='hubl-circle-join-button')
|
||||
template
|
||||
button.button.text-xsmall.text-bold.text-uppercase.reversed.color-secondary.bordered.icon.icon-arrow-right-circle
|
||||
solid-form(
|
||||
data-src=''
|
||||
nested-field='members'
|
||||
|
||||
fields='user.username'
|
||||
value-user.username='hubl-workaround-493'
|
||||
widget-user.username='solid-form-hidden'
|
||||
|
||||
submit-button=''
|
||||
data-trans='submit-button=circle.profile.buttonJoin'
|
||||
)
|
||||
|
||||
solid-display(
|
||||
bind-resources
|
||||
nested-field='members'
|
||||
fields='relation'
|
||||
action-relation='relation'
|
||||
widget-relation='hubl-circle-leave-button'
|
||||
search-fields='user'
|
||||
search-widget-user='solid-form-hidden'
|
||||
search-value-user=""
|
||||
empty-widget='hubl-circle-join-button'
|
||||
hubl-inherit-bind-resources='hubl-circle-join-button'
|
||||
hubl-inherit-user-id="search-value-user"
|
||||
)
|
||||
|
||||
h3.text-color-heading.text-bold.text-letter-spacing-large(data-trans='circle.profile.subTitle')
|
||||
|
||||
solid-widget(name='hubl-circle-user-admin')
|
||||
@ -121,7 +121,7 @@ solid-router(default-route='circle-profile', hidden)
|
||||
class-line2='segment block'
|
||||
class-atom='icon icon-large icon-third mdi-atom margin-right-xxsmall'
|
||||
class-user.communities='full'
|
||||
|
||||
|
||||
class-is_admin='segment tag color-primary'
|
||||
|
||||
multiple-user.communities
|
||||
|
@ -69,7 +69,7 @@ solid-router(default-route='project-profile', hidden)
|
||||
next='project-left'
|
||||
)
|
||||
|
||||
solid-ac-checker.segment.full.text-right.margin-bottom-large(no-permission='acl:Delete', bind-resources)
|
||||
solid-ac-checker.segment.full.text-right.margin-bottom-large.sm-margin-bottom-medium(no-permission='acl:Delete', bind-resources)
|
||||
solid-display(
|
||||
bind-resources
|
||||
nested-field='members'
|
||||
|
Loading…
Reference in New Issue
Block a user