mirror of
https://github.com/e107inc/e107.git
synced 2025-08-11 17:14:42 +02:00
Bootstrap 5 styling. (data-bs-toggle)
Signup shortcodes now automatically load the required template.
This commit is contained in:
@@ -1283,9 +1283,9 @@ $columnInfo = array(
|
||||
$text = "
|
||||
|
||||
<ul class='nav nav-tabs'>
|
||||
<li class='active'><a data-toggle='tab' href='#download-create'>".DOWLAN_175."</a></li>
|
||||
<li><a data-toggle='tab' href='#download-edit-external'>".DOWLAN_176."</a></li>
|
||||
<li><a data-toggle='tab' href='#download-edit-mirror'>".DOWLAN_128."</a></li>
|
||||
<li class='active'><a data-toggle='tab' data-bs-toggle='tab' href='#download-create'>".DOWLAN_175."</a></li>
|
||||
<li><a data-toggle='tab' data-bs-toggle='tab' href='#download-edit-external'>".DOWLAN_176."</a></li>
|
||||
<li><a data-toggle='tab' data-bs-toggle='tab' href='#download-edit-mirror'>".DOWLAN_128."</a></li>
|
||||
</ul>
|
||||
<form method='post' action='".e_SELF."?".e_QUERY."' id='myform'>
|
||||
<div class='tab-content'>
|
||||
@@ -2167,11 +2167,11 @@ $columnInfo = array(
|
||||
$text = "
|
||||
|
||||
<ul class='nav nav-tabs'>
|
||||
<li class='active'><a data-toggle='tab' href='#core-download-download1'>".LAN_DL_DOWNLOAD_OPT_GENERAL."</a></li>
|
||||
<li><a data-toggle='tab' href='#core-download-download2'>".LAN_DL_DOWNLOAD_OPT_BROKEN."</a></li>
|
||||
<li><a data-toggle='tab' href='#core-download-download3'>".LAN_DL_DOWNLOAD_OPT_AGREE."</a></li>
|
||||
<li><a data-toggle='tab' href='#core-download-download4'>".LAN_DL_DOWNLOAD_OPT_SECURITY."</a></li>
|
||||
<li><a data-toggle='tab' href='#core-download-download5'>".LAN_DL_UPLOAD."</a></li>
|
||||
<li class='active'><a data-toggle='tab' data-bs-toggle='tab' href='#core-download-download1'>".LAN_DL_DOWNLOAD_OPT_GENERAL."</a></li>
|
||||
<li><a data-toggle='tab' data-bs-toggle='tab' href='#core-download-download2'>".LAN_DL_DOWNLOAD_OPT_BROKEN."</a></li>
|
||||
<li><a data-toggle='tab' data-bs-toggle='tab' href='#core-download-download3'>".LAN_DL_DOWNLOAD_OPT_AGREE."</a></li>
|
||||
<li><a data-toggle='tab' data-bs-toggle='tab' href='#core-download-download4'>".LAN_DL_DOWNLOAD_OPT_SECURITY."</a></li>
|
||||
<li><a data-toggle='tab' data-bs-toggle='tab' href='#core-download-download5'>".LAN_DL_UPLOAD."</a></li>
|
||||
</ul>
|
||||
|
||||
<form method='post' action='".e_SELF."?".e_QUERY."'>\n
|
||||
|
@@ -242,7 +242,7 @@ $FEATUREBOX_CATEGORY_TEMPLATE['bootstrap_tabs']['item_separator'] = '<div class=
|
||||
$FEATUREBOX_CATEGORY_TEMPLATE['bootstrap_tabs']['item_empty'] = '';
|
||||
|
||||
$FEATUREBOX_CATEGORY_TEMPLATE['bootstrap_tabs']['nav_start'] = '<ul class="nav nav-tabs">';
|
||||
$FEATUREBOX_CATEGORY_TEMPLATE['bootstrap_tabs']['nav_item'] = '<li class="{FEATUREBOX_ACTIVE}"><a data-toggle="tab" href="#tab-{FEATUREBOX_COLSCOUNT}">{FEATUREBOX_TITLE}</a></li>';
|
||||
$FEATUREBOX_CATEGORY_TEMPLATE['bootstrap_tabs']['nav_item'] = '<li class="{FEATUREBOX_ACTIVE}"><a data-toggle="tab" data-bs-toggle="tab" href="#tab-{FEATUREBOX_COLSCOUNT}">{FEATUREBOX_TITLE}</a></li>';
|
||||
$FEATUREBOX_CATEGORY_TEMPLATE['bootstrap_tabs']['nav_end'] = '</ul>';
|
||||
$FEATUREBOX_CATEGORY_TEMPLATE['bootstrap_tabs']['nav_separator'] = '';
|
||||
//<div class="e-bootstrap_tabs">
|
||||
|
@@ -948,7 +948,7 @@ class forum_post_handler
|
||||
<div class='alert alert-block alert-warning'>
|
||||
<h4>".LAN_FORUM_2025.': '.$thread_name."</h4>
|
||||
".LAN_FORUM_2027."<br />".str_replace(array('[', ']'), array('<b>', '</b>'), LAN_FORUM_2028)."
|
||||
<a class='pull-right float-right btn btn-xs btn-primary e-expandit' href='#post-info'>".LAN_FORUM_2026."</a>
|
||||
<a class='pull-right float-right float-end btn btn-xs btn-primary e-expandit' href='#post-info'>".LAN_FORUM_2026."</a>
|
||||
</div>
|
||||
<div id='post-info' class='e-hideme alert alert-block alert-danger'>
|
||||
".$tp->toHTML($this->data['post_entry'],true)."
|
||||
|
@@ -525,7 +525,7 @@ function init()
|
||||
|
||||
$text = '<div class="btn-group">
|
||||
<a href="' . $url . '" class="btn btn-primary">' . LAN_FORUM_1018 . '</a>
|
||||
<button class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
|
||||
<button class="btn btn-primary dropdown-toggle" data-toggle="dropdown" data-bs-toggle="dropdown">
|
||||
<span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu pull-right float-right">
|
||||
|
@@ -358,10 +358,10 @@ class plugin_forum_post_shortcodes extends e_shortcode
|
||||
/*
|
||||
$text = "
|
||||
<ul class='nav nav-tabs'>
|
||||
<li class='active'><a href='#type' data-toggle='tab'>".LAN_FORUM_3025."</a></li>";
|
||||
<li class='active'><a href='#type' data-toggle='tab' data-bs-toggle='tab'>".LAN_FORUM_3025."</a></li>";
|
||||
|
||||
$text .= ($poll) ? "<li><a href='#poll' data-toggle='tab'>".LAN_FORUM_1016."</a></li>\n" : "";
|
||||
$text .= ($attach) ? "<li><a href='#attach' data-toggle='tab'>".LAN_FORUM_3012."</a></li>\n" : "";
|
||||
$text .= ($poll) ? "<li><a href='#poll' data-toggle='tab' data-bs-toggle='tab'>".LAN_FORUM_1016."</a></li>\n" : "";
|
||||
$text .= ($attach) ? "<li><a href='#attach' data-toggle='tab' data-bs-toggle='tab'>".LAN_FORUM_3012."</a></li>\n" : "";
|
||||
|
||||
$text .= "
|
||||
</ul>
|
||||
|
@@ -864,7 +864,7 @@ class plugin_forum_view_shortcodes extends e_shortcode
|
||||
$text = '<div class="btn-group ">
|
||||
|
||||
<a class="btn btn-default btn-secondary btn-sm btn-small" href="' . $userUrl . '">' . $username . '</a>
|
||||
<button class="btn btn-default btn-secondary btn-sm btn-small dropdown-toggle" data-toggle="dropdown">
|
||||
<button class="btn btn-default btn-secondary btn-sm btn-small dropdown-toggle" data-toggle="dropdown" data-bs-toggle="dropdown">
|
||||
<span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu left">
|
||||
@@ -914,8 +914,8 @@ class plugin_forum_view_shortcodes extends e_shortcode
|
||||
$postID = !empty($this->postInfo['post_id']) ? $this->postInfo['post_id'] : 0;
|
||||
// {EMAILITEM} {PRINTITEM} {REPORTIMG}{EDITIMG}{QUOTEIMG}
|
||||
|
||||
$text = '<div class="btn-group pull-right float-right">
|
||||
<button class="btn btn-default btn-secondary btn-sm btn-small dropdown-toggle" data-toggle="dropdown">
|
||||
$text = '<div class="btn-group pull-right float-right float-end">
|
||||
<button class="btn btn-default btn-secondary btn-sm btn-small dropdown-toggle" data-toggle="dropdown" data-bs-toggle="dropdown">
|
||||
' . LAN_FORUM_8013 . '
|
||||
';
|
||||
|
||||
@@ -926,7 +926,7 @@ class plugin_forum_view_shortcodes extends e_shortcode
|
||||
|
||||
$text .= '
|
||||
</button>
|
||||
<ul class="dropdown-menu pull-right float-right text-right">';
|
||||
<ul class="dropdown-menu pull-right dropdown-menu-end float-right text-right">';
|
||||
|
||||
|
||||
$text .= "<li class='text-right float-right float-right'><a href='" . e_HTTP . "email.php?plugin:forum." . $threadID . "'>" . LAN_FORUM_2044 . " " . $tp->toGlyph('fa-envelope') . "</a></li>";
|
||||
@@ -1206,7 +1206,7 @@ class plugin_forum_view_shortcodes extends e_shortcode
|
||||
}
|
||||
|
||||
$replyUrl = "<a class='btn btn-primary" . ($url ? "" : " disabled") . "' "
|
||||
. ($url ? "" : " data-toggle='tooltip' title='" . LAN_FORUM_0046 . "'
|
||||
. ($url ? "" : " data-toggle='tooltip' data-bs-toggle='tooltip' title='" . LAN_FORUM_0046 . "'
|
||||
style='cursor: not-allowed; pointer-events: all !important;'") . " href='" . ($url ?: "#") . "'>" . LAN_FORUM_2006 . "</a>" . ($url ? "" : "<span> </span>");
|
||||
|
||||
if($this->forum->checkPerm($this->var['thread_forum_id'], 'post'))
|
||||
@@ -1235,7 +1235,7 @@ class plugin_forum_view_shortcodes extends e_shortcode
|
||||
|
||||
$text = '<div class="btn-group">
|
||||
' . $replyUrl . '
|
||||
<button class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
|
||||
<button class="btn btn-primary dropdown-toggle" data-toggle="dropdown" data-bs-toggle="dropdown">
|
||||
';
|
||||
|
||||
if(defined('BOOTSTRAP') && BOOTSTRAP !== 4)
|
||||
@@ -1246,7 +1246,7 @@ class plugin_forum_view_shortcodes extends e_shortcode
|
||||
$text .= '
|
||||
<span class="sr-only">Toggle Dropdown</span>
|
||||
</button>
|
||||
<ul class="dropdown-menu pull-right float-right">
|
||||
<ul class="dropdown-menu pull-right dropdown-menu-end float-right">
|
||||
';
|
||||
|
||||
foreach($options as $key => $val)
|
||||
|
@@ -85,11 +85,11 @@
|
||||
global $forum;
|
||||
$jumpList = $forum->forumGetAllowed('view');
|
||||
|
||||
$text = '<div class="btn-group">';
|
||||
$text = '<div class="btn-group mb-2">';
|
||||
/*
|
||||
$text .=
|
||||
($this->var['ntUrl'] ? '<a href="'.$this->var['ntUrl'].'" class="btn btn-primary">'.LAN_FORUM_1018.'</a>' :'').
|
||||
'<button class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
|
||||
'<button class="btn btn-primary dropdown-toggle" data-toggle="dropdown" data-bs-toggle="dropdown">
|
||||
'.($this->var['ntUrl'] ? '' : LAN_FORUM_1001." ".LAN_FORUM_8013).'<span class="caret"></span>
|
||||
<span class="sr-only">Toggle Dropdown</span>
|
||||
</button>
|
||||
@@ -98,7 +98,7 @@
|
||||
*/
|
||||
$href = "#";
|
||||
$disabled = " disabled";
|
||||
$restricted_to_members_only = " data-toggle='tooltip' title='".LAN_FORUM_0006."'
|
||||
$restricted_to_members_only = " data-toggle='tooltip' data-bs-toggle='tooltip' title='".LAN_FORUM_0006."'
|
||||
style='cursor: not-allowed; pointer-events: all !important;'";
|
||||
$extra_space = "<span> </span>";
|
||||
if ($this->var['ntUrl'])
|
||||
@@ -110,11 +110,8 @@
|
||||
}
|
||||
|
||||
$text .=
|
||||
'<a href="'.$href.
|
||||
'" class="btn btn-primary'.$disabled.'"'
|
||||
.$restricted_to_members_only.'>'.LAN_FORUM_1018.'</a>
|
||||
'.$extra_space.'
|
||||
<button class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
|
||||
'<a href="'.$href.'" class="btn btn-primary'.$disabled.'"'.$restricted_to_members_only.'>'.LAN_FORUM_1018.'</a>'.$extra_space.'
|
||||
<button class="btn btn-primary dropdown-toggle" data-toggle="dropdown" data-bs-toggle="dropdown">
|
||||
';
|
||||
if($bootstrap !== 4)
|
||||
{
|
||||
@@ -123,7 +120,7 @@
|
||||
$text .= '
|
||||
<span class="sr-only">Toggle Dropdown</span>
|
||||
</button>
|
||||
<ul class="dropdown-menu pull-right float-right">
|
||||
<ul class="dropdown-menu pull-right float-right dropdown-menu-end">
|
||||
';
|
||||
|
||||
//-- foreach($jumpList as $key => $val)
|
||||
@@ -1026,7 +1023,7 @@
|
||||
// $url = e107::getUrl()->create('forum/thread/view', $urlparms);
|
||||
$title = $tp->lanVars(LAN_GOTOPAGEX, $aa);
|
||||
$url = e107::url('forum', 'topic', $urlparms) . '&p=' . $aa;
|
||||
$opts[] = "<a data-toggle='tooltip' title=\"" . $title . "\" href='{$url}'>{$aa}</a>";
|
||||
$opts[] = "<a data-toggle='tooltip' data-bs-toggle='tooltip' title=\"" . $title . "\" href='{$url}'>{$aa}</a>";
|
||||
}
|
||||
$text .= ' ... ';
|
||||
for($a = $pages - 3; $a <= $pages - 1; $a++)
|
||||
@@ -1037,7 +1034,7 @@
|
||||
// $url = e107::getUrl()->create('forum/thread/view', $urlparms);
|
||||
$title = $tp->lanVars(LAN_GOTOPAGEX, $aa);
|
||||
$url = e107::url('forum', 'topic', $urlparms) . '&p=' . $aa;
|
||||
$opts[] = "<a data-toggle='tooltip' title=\"" . $title . "\" href='{$url}'>{$aa}</a>";
|
||||
$opts[] = "<a data-toggle='tooltip' data-bs-toggle='tooltip' title=\"" . $title . "\" href='{$url}'>{$aa}</a>";
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -1051,7 +1048,7 @@
|
||||
// $url = e107::getUrl()->create('forum/thread/view', $urlparms);
|
||||
$title = $tp->lanVars(LAN_GOTOPAGEX, $aa);
|
||||
$url = e107::url('forum', 'topic', $urlparms) . '&p=' . $aa;
|
||||
$opts[] = "<a data-toggle='tooltip' title=\"" . $title . "\" href='{$url}'>{$aa}</a>";
|
||||
$opts[] = "<a data-toggle='tooltip' data-bs-toggle='tooltip' title=\"" . $title . "\" href='{$url}'>{$aa}</a>";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1135,10 +1132,10 @@
|
||||
$tp = e107::getParser();
|
||||
|
||||
// $text = "<form method='post' action='".e_REQUEST_URI."' id='frmMod_{$forumId}_{$threadId}' style='margin:0;'>";
|
||||
$text = '<div class="btn-group"><button class="btn btn-default btn-secondary btn-sm btn-mini dropdown-toggle" data-toggle="dropdown">
|
||||
$text = '<div class="btn-group"><button class="btn btn-default btn-secondary btn-sm btn-mini dropdown-toggle" data-toggle="dropdown" data-bs-toggle="dropdown">
|
||||
<span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu pull-right float-right">
|
||||
<ul class="dropdown-menu pull-right dropdown-menu-end float-right">
|
||||
';
|
||||
|
||||
//FIXME - not fully working.
|
||||
|
@@ -51,7 +51,7 @@ $FORUM_POLL_TEMPLATE['results']['start'] = "
|
||||
";
|
||||
|
||||
$FORUM_POLL_TEMPLATE['results']['item'] = "
|
||||
<strong>{OPTION}</strong><small class='pull-right float-right'><a href='#' class='e-tip' title=\"{VOTES}\">{PERCENTAGE}</a></small>
|
||||
<strong>{OPTION}</strong><small class='pull-right float-right float-end'><a href='#' class='e-tip' title=\"{VOTES}\">{PERCENTAGE}</a></small>
|
||||
{BAR}
|
||||
";
|
||||
|
||||
|
@@ -289,7 +289,7 @@ $FORUM_VIEWFORUM_TEMPLATE['start'] = "<div id='forum-viewforum'>";
|
||||
$FORUM_VIEWFORUM_TEMPLATE['header'] = "<div class=' row-fluid'><div>{BREADCRUMB}</div></div>
|
||||
<div class='row row-fluid'>
|
||||
<div class='col-md-9 span9 pull-left float-left'><h3>{FORUMIMAGE:h=60}{FORUMTITLE}</h3></div>
|
||||
<div class='col-md-3 span3 pull-right float-right right' style='padding-top:10px'>{NEWTHREADBUTTONX}</div></div>
|
||||
<div class='col-md-3 span3 pull-right float-right float-end right' style='padding-top:10px'>{NEWTHREADBUTTONX}</div></div>
|
||||
<table class='table table-hover table-striped table-bordered'>
|
||||
<colgroup>
|
||||
<col style='width:3%' />
|
||||
@@ -313,7 +313,7 @@ $FORUM_VIEWFORUM_TEMPLATE['item'] = "<tr>
|
||||
</div>
|
||||
</td>
|
||||
<td class='text-center'>{REPLIESX}</td><td class='hidden-xs text-center'>{VIEWSX}</td>
|
||||
<td class='hidden-xs'><small>{LASTPOSTUSER} {LASTPOSTDATE} </small><div class='span2 right float-right pull-right'>{ADMINOPTIONS}</div></td>
|
||||
<td class='hidden-xs'><small>{LASTPOSTUSER} {LASTPOSTDATE} </small><div class='span2 right float-right pull-right float-end'>{ADMINOPTIONS}</div></td>
|
||||
</tr>\n";
|
||||
|
||||
|
||||
@@ -350,7 +350,7 @@ $SC_WRAPPER['VIEWABLE_BY'] = "<div class='panel panel-default' style='margin-top
|
||||
$FORUM_VIEWFORUM_TEMPLATE['footer'] = "</table>
|
||||
<div class='row row-fluid'>
|
||||
|
||||
<div class='col-md-5 span5 pull-left float-left left' style='padding-top:10px'>{THREADPAGES}</div><div class='col-md-3 span3 pull-right float-right right' style='padding-top:10px'>{NEWTHREADBUTTONX}</div>
|
||||
<div class='col-md-5 span5 pull-left float-left left' style='padding-top:10px'>{THREADPAGES}</div><div class='col-md-3 span3 pull-right float-right float-end right' style='padding-top:10px'>{NEWTHREADBUTTONX}</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
@@ -327,7 +327,7 @@ $FORUM_VIEWTOPIC_TEMPLATE['start'] = "
|
||||
</div>
|
||||
|
||||
<div class='row row-fluid'>
|
||||
<div class='col-md-9 span9 pull-left float-left'><h3>{THREADNAME}</h3></div><div class='col-md-3 span3 pull-right float-right right text-right' style='padding-top:10px'>{TRACK} {BUTTONSX}</div>
|
||||
<div class='col-md-9 span9 pull-left float-left'><h3>{THREADNAME}</h3></div><div class='col-md-3 span3 pull-right float-right float-end right text-right' style='padding-top:10px'>{TRACK} {BUTTONSX}</div>
|
||||
</div>
|
||||
|
||||
{MESSAGE}
|
||||
@@ -366,7 +366,7 @@ $FORUM_VIEWTOPIC_TEMPLATE['thread'] = "
|
||||
{LEVEL=badge} {LEVEL=glyph}
|
||||
</small>
|
||||
</div>
|
||||
<div class='visible-xs col-xs-3'><div class='clearfix'>{POSTOPTIONS}</div><div class='pull-right float-right'><br /><small class='text-muted'>{THREADDATESTAMP=relative}</small></div></div>
|
||||
<div class='visible-xs col-xs-3'><div class='clearfix'>{POSTOPTIONS}</div><div class='pull-right float-right float-end'><br /><small class='text-muted'>{THREADDATESTAMP=relative}</small></div></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class='visible-xs col-xs-12'><hr /></div>
|
||||
@@ -405,7 +405,7 @@ $FORUM_VIEWTOPIC_TEMPLATE['end'] = "</ul>
|
||||
{GOTOPAGES}
|
||||
</div>
|
||||
<div class='col-xs-12 col-md-4'>
|
||||
<div class='pull-right float-right'>
|
||||
<div class='pull-right float-right float-end'>
|
||||
{BUTTONSX}
|
||||
</div>
|
||||
</div>
|
||||
@@ -454,7 +454,7 @@ $FORUM_VIEWTOPIC_TEMPLATE['deleted'] = "
|
||||
{LEVEL=badge} {LEVEL=glyph}
|
||||
</small>
|
||||
</div>
|
||||
<div class='visible-xs col-xs-3'><div class='clearfix'>{POSTOPTIONS}</div><div class='pull-right float-right'><br /><small class='text-muted'>{THREADDATESTAMP=relative}</small></div></div>
|
||||
<div class='visible-xs col-xs-3'><div class='clearfix'>{POSTOPTIONS}</div><div class='pull-right float-right float-end'><br /><small class='text-muted'>{THREADDATESTAMP=relative}</small></div></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class='visible-xs col-xs-12'><hr /></div>
|
||||
|
@@ -61,7 +61,7 @@ class pm_shortcodes extends e_shortcode
|
||||
$urlOutbox = e107::url('pm','index','', array('query'=>array('mode'=>'outbox')));
|
||||
$urlCompose = e107::url('pm','index','', array('query'=>array('mode'=>'send')));
|
||||
|
||||
return '<a class="pm-nav nav-link dropdown-toggle" data-toggle="dropdown" data-bs-toggle="dropdown" href="#">'.$icon.$count.'</a>
|
||||
return '<a class="pm-nav nav-link dropdown-toggle" data-toggle="dropdown" data-bs-toggle="dropdown" data-bs-toggle="dropdown" href="#">'.$icon.$count.'</a>
|
||||
<ul class="dropdown-menu dropdown-menu-end">
|
||||
<li>
|
||||
<a class="dropdown-item" href="'.$urlInbox.'">'.LAN_PLUGIN_PM_INBOX.'</a>
|
||||
|
@@ -137,11 +137,11 @@ class e_bootstrap
|
||||
$text .= '
|
||||
<ul class="nav nav-tabs">';
|
||||
|
||||
$text .= '<li class="active" ><a href="#mbuttons" data-toggle="tab">Buttons</a></li>';
|
||||
$text .= '<li class="active" ><a href="#mbuttons" data-toggle="tab" data-bs-toggle="tab">Buttons</a></li>';
|
||||
|
||||
$text .= '<li><a href="#badges" data-toggle="tab">Labels & Badges</a></li>';
|
||||
$text .= '<li><a href="#badges" data-toggle="tab" data-bs-toggle="tab">Labels & Badges</a></li>';
|
||||
|
||||
$text .= '<li><a href="#glyphs" data-toggle="tab">Glyphicons</a></li>';
|
||||
$text .= '<li><a href="#glyphs" data-toggle="tab" data-bs-toggle="tab">Glyphicons</a></li>';
|
||||
|
||||
$text .= '</ul>';
|
||||
|
||||
|
Reference in New Issue
Block a user