Commit 8b6da72e authored by Penom Nom's avatar Penom Nom
Browse files

gestion of ng6 administrator

parent daedfdb6
...@@ -29,15 +29,7 @@ from ng6.t3MySQLdb import t3MySQLdb ...@@ -29,15 +29,7 @@ from ng6.t3MySQLdb import t3MySQLdb
from ng6.project import Project from ng6.project import Project
from ng6.run import Run from ng6.run import Run
from workflows.types import adminlogin
def adminlogin(login):
t3mysql = t3MySQLdb()
try:
t3mysql.get_user_id(login)
return login
except:
raise argparse.ArgumentTypeError("Login '" + login + "' does not exists! Please provide a valid login!")
class BasicNG6Workflow (Workflow): class BasicNG6Workflow (Workflow):
......
...@@ -72,6 +72,28 @@ class t3MySQLdb(object): ...@@ -72,6 +72,28 @@ class t3MySQLdb(object):
conn.close() conn.close()
return id return id
def is_ng6admin(self, login):
"""
Return true if the login is a ng6 administrator
@return: id
@param login: the login name
"""
conn = connect(self.host, self.user, self.passwd, self.db)
curs = conn.cursor()
req = "SELECT uid, usergroup FROM fe_users WHERE username = '" + str(login) + "'"
curs.execute(req)
try:
data = curs.fetchall()
id = data[0][0]
grp = data[0][1].split(',')
is_admin = True if "1" in grp else False
except:
raise Exception('t3MySQLdb', 'The login ' + login + ' does not exist.')
curs.close()
conn.close()
return is_admin
def get_users (self, project_id, right): def get_users (self, project_id, right):
""" """
Select the users ids for a project and a level of rigth Select the users ids for a project and a level of rigth
......
...@@ -562,6 +562,16 @@ class tx_nG6_eid { ...@@ -562,6 +562,16 @@ class tx_nG6_eid {
} }
} }
else if ( $type == 'add_to_ng6_admin'){
$userid = trim(t3lib_div::_GP('userid'));
tx_nG6_db::add_to_ng6_admin($userid);
}
else if ( $type == 'delete_from_ng6_admin'){
$userids = trim(t3lib_div::_GP('userids'));
$userids = explode(',', $userids);
tx_nG6_db::remove_from_ng6_admin($userids);
}
else if($type == 'update_user'){ else if($type == 'update_user'){
$email = trim(t3lib_div::_GP('email')); $email = trim(t3lib_div::_GP('email'));
$first_name = trim(t3lib_div::_GP('first_name')); $first_name = trim(t3lib_div::_GP('first_name'));
...@@ -665,6 +675,7 @@ class tx_nG6_eid { ...@@ -665,6 +675,7 @@ class tx_nG6_eid {
$smarty->assign('projects', $projects); $smarty->assign('projects', $projects);
$smarty->assign('is_at_least_admin_of_1_project', $is_at_least_admin_of_1_project); $smarty->assign('is_at_least_admin_of_1_project', $is_at_least_admin_of_1_project);
$smarty->assign('login_user', $login_user); $smarty->assign('login_user', $login_user);
$smarty->assign('is_ng6_admin', tx_nG6_db::is_ng6_administrator($user_id) ? true : false);
print $smarty->fetch('project_table.tpl'); print $smarty->fetch('project_table.tpl');
} elseif($type == 'analyses_table') { } elseif($type == 'analyses_table') {
...@@ -712,7 +723,11 @@ class tx_nG6_eid { ...@@ -712,7 +723,11 @@ class tx_nG6_eid {
tx_nG6_utils::hash_password(trim(t3lib_div::_GP('password'))), tx_nG6_utils::hash_password(trim(t3lib_div::_GP('password'))),
trim(t3lib_div::_GP('pid')), trim(t3lib_div::_GP('pid')),
"Demo project", "Demo project",
"This project presents demonstration workflows" "This project presents demonstration workflows",
trim(t3lib_div::_GP('title')),
trim(t3lib_div::_GP('organism')),
trim(t3lib_div::_GP('location'))
); );
// if there is a result, then log the user // if there is a result, then log the user
if ($res2) { if ($res2) {
......
...@@ -1648,6 +1648,89 @@ class tx_nG6_db { ...@@ -1648,6 +1648,89 @@ class tx_nG6_db {
return $authorized; return $authorized;
} }
/**
* Return true if the user is a ng6 administrator (belongs to ng6_admin group)
*
* @param string $user_id The user id
* @param unknown $user_id
*/
function is_ng6_administrator($user_id){
$is_ng6_admin = false;
if( $user_id != null){
$user_group = tx_nG6_db::get_user_usergroup($user_id);
$groups = explode ( ',', $user_group) ;
if (in_array('1', $groups)){
$is_ng6_admin = true;
}
}
return $is_ng6_admin;
}
/**
* Return the list of ng6_admin users
*/
function get_ng6_admin_users(){
$ng6_admin_users = null;
$queryParts = Array(
'SELECT' => 'fe_users.uid, fe_users.username, fe_users.first_name, fe_users.last_name, fe_users.email',
'FROM' => 'fe_users',
'WHERE' => '',
'GROUPBY' => '',
'ORDERBY' => '',
'LIMIT' => '',
);
$res = $GLOBALS['TYPO3_DB']->exec_SELECT_queryArray($queryParts);
while($res_row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
if (tx_nG6_db::is_ng6_administrator($res_row['uid'])){
$ng6_admin_users[ ] = array(
'id' => $res_row['uid'],
'username' => $res_row['username'],
'first_name' => $res_row['first_name'],
'last_name' => $res_row['last_name'],
'email' => $res_row['email']
);
}
}
return $ng6_admin_users;
}
/**
* Add an existing user to the ng6_admin group
* @param unknown $userid
*/
function add_to_ng6_admin( $userid ){
$user_info = tx_nG6_db::get_user_informations($userid);
$pieces = explode(",", $user_info['usergroup']);
if (!in_array("1", $pieces)) {
$pieces [] = "1";
$group = implode(",", $pieces);
$GLOBALS['TYPO3_DB']->exec_UPDATEquery ('fe_users', 'fe_users.uid='.$userid, array('fe_users.usergroup' => $group));
}
}
/**
* Remove an user from the ng6_admin group
* @param unknown $userids
*/
function remove_from_ng6_admin( $userids ){
foreach ($userids as $userid){
$user_info = tx_nG6_db::get_user_informations($userid);
$pieces = explode(",", $user_info['usergroup']);
if (in_array('1', $pieces)){
unset($pieces[array_search('1',$pieces)]);
$group = implode(",", $pieces);
$GLOBALS['TYPO3_DB']->exec_UPDATEquery ('fe_users', 'fe_users.uid='.$userid, array('fe_users.usergroup' => $group));
}
}
}
/** /**
* Return if the user is a superuser (administrator) for the specified project/run/analyse * Return if the user is a superuser (administrator) for the specified project/run/analyse
* *
...@@ -1939,12 +2022,14 @@ class tx_nG6_db { ...@@ -1939,12 +2022,14 @@ class tx_nG6_db {
$distinct = array(); $distinct = array();
while($res_row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { while($res_row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
if( $col == 'title') { if( $col == 'title') {
if ($res_row["title"] != 'ng6_admin'){
$res_tab[] = array( $res_tab[] = array(
'uid' => $res_row['uid'], 'uid' => $res_row['uid'],
'title' => $res_row['title'], 'title' => $res_row['title'],
'organism' => $res_row['tx_nG6_organism'], 'organism' => $res_row['tx_nG6_organism'],
'location' => $res_row['tx_nG6_location'] 'location' => $res_row['tx_nG6_location']
); );
}
} else { } else {
if( !isset($distinct[$res_row[$col]]) ) { if( !isset($distinct[$res_row[$col]]) ) {
$res_tab[] = array( $res_tab[] = array(
...@@ -1966,7 +2051,7 @@ class tx_nG6_db { ...@@ -1966,7 +2051,7 @@ class tx_nG6_db {
*/ */
function get_user_informations($user_id){ function get_user_informations($user_id){
$queryParts = Array( $queryParts = Array(
'SELECT' => 'fe_users.uid, fe_users.username, fe_users.last_name, fe_users.first_name, fe_users.password, fe_users.email, fe_users.cruser_id', 'SELECT' => 'fe_users.uid, fe_users.username, fe_users.last_name, fe_users.first_name, fe_users.password, fe_users.email, fe_users.cruser_id, fe_users.usergroup',
'FROM' => 'fe_users', 'FROM' => 'fe_users',
'WHERE' => 'fe_users.uid='.$user_id, 'WHERE' => 'fe_users.uid='.$user_id,
'GROUPBY' => '', 'GROUPBY' => '',
...@@ -1983,7 +2068,8 @@ class tx_nG6_db { ...@@ -1983,7 +2068,8 @@ class tx_nG6_db {
'last_name' => $res_row['last_name'], 'last_name' => $res_row['last_name'],
'password' => $res_row['password'], 'password' => $res_row['password'],
'email' => $res_row['email'], 'email' => $res_row['email'],
'cruser_id' => $res_row['cruser_id'] 'cruser_id' => $res_row['cruser_id'],
'usergroup' => $res_row['usergroup']
); );
} }
return $res_tab; return $res_tab;
...@@ -2188,7 +2274,13 @@ class tx_nG6_db { ...@@ -2188,7 +2274,13 @@ class tx_nG6_db {
* @param string user_name the user id * @param string user_name the user id
* @return bool true if ok false else * @return bool true if ok false else
*/ */
function finalize_installation($user_id, $user_name, $first_name, $last_name, $email, $password, $pid, $project, $descr){ function finalize_installation($user_id, $user_name, $first_name, $last_name, $email, $password, $pid, $project, $descr,
$group_name, $organism, $location){
$group_id = tx_nG6_db::get_group_id($group_name);
if( !isset($group_id) ){
$group_id = tx_nG6_db::create_new_group($user_id, $group_name, $organism, $location);
}
$fe_user_datas = array( $fe_user_datas = array(
'username' => $user_name, 'username' => $user_name,
...@@ -2197,7 +2289,8 @@ class tx_nG6_db { ...@@ -2197,7 +2289,8 @@ class tx_nG6_db {
'last_name' => $last_name, 'last_name' => $last_name,
'email' => $email, 'email' => $email,
'password' => $password, 'password' => $password,
'tstamp' => time() 'tstamp' => time(),
'usergroup' => $group_id
); );
$be_user_datas = array( $be_user_datas = array(
'username' => $user_name, 'username' => $user_name,
...@@ -2214,6 +2307,7 @@ class tx_nG6_db { ...@@ -2214,6 +2307,7 @@ class tx_nG6_db {
$res = $GLOBALS['TYPO3_DB']->exec_UPDATEquery('fe_users', 'uid='.$user_id, $fe_user_datas ); $res = $GLOBALS['TYPO3_DB']->exec_UPDATEquery('fe_users', 'uid='.$user_id, $fe_user_datas );
if ($res == True){ if ($res == True){
tx_nG6_db::add_to_ng6_admin($user_id);
$res2 = $GLOBALS['TYPO3_DB']->exec_UPDATEquery('be_users', 'uid='.$user_id, $be_user_datas ); $res2 = $GLOBALS['TYPO3_DB']->exec_UPDATEquery('be_users', 'uid='.$user_id, $be_user_datas );
} }
if ($res == True){ if ($res == True){
...@@ -2298,6 +2392,7 @@ class tx_nG6_db { ...@@ -2298,6 +2392,7 @@ class tx_nG6_db {
); );
$GLOBALS['TYPO3_DB']->exec_INSERTquery('fe_groups', $group_datas); $GLOBALS['TYPO3_DB']->exec_INSERTquery('fe_groups', $group_datas);
return $GLOBALS['TYPO3_DB']->sql_insert_id();
} }
/** /**
......
...@@ -81,6 +81,27 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. ...@@ -81,6 +81,27 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
</div> </div>
</div> </div>
<div class="control-group">
<label class="control-label">Laboratory</label>
<div class="controls">
<input type="text" id="title_val" class="group_typeahead" name="title_val" placeholder="Laboratory"/>
</div>
</div>
<div class="control-group">
<label class="control-label">Organism</label>
<div class="controls">
<input type="text" id="organism_val" class="group_typeahead" name="organism_val" placeholder="Organism"/>
</div>
</div>
<div class="control-group">
<label class="control-label">Location</label>
<div class="controls">
<input type="text" id="location_val" class="group_typeahead" name="location_val" placeholder="Location"/>
</div>
</div>
</form> </form>
<div style="float:right;margin-top:10px"> <div style="float:right;margin-top:10px">
<button class="btn" id="raz_form_install"><i class="icon-repeat"></i> Clear form</button> <button class="btn" id="raz_form_install"><i class="icon-repeat"></i> Clear form</button>
......
...@@ -73,7 +73,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. ...@@ -73,7 +73,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
{/if} {/if}
{/foreach} {/foreach}
</tbody> </tbody>
{if $is_at_least_admin_of_1_project && $login_user} {if $is_ng6_admin}
<tfoot> <tfoot>
<tr> <tr>
<th align="left" colspan="4"> <th align="left" colspan="4">
......
...@@ -38,6 +38,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. ...@@ -38,6 +38,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<ul id="myTab" class="nav nav-tabs"> <ul id="myTab" class="nav nav-tabs">
<li class="active"><a href="#statistics" data-toggle="tab">Statistics</a></li> <li class="active"><a href="#statistics" data-toggle="tab">Statistics</a></li>
<li><a href="#wf_monitoring" data-toggle="tab">Workflows monitoring</a></li> <li><a href="#wf_monitoring" data-toggle="tab">Workflows monitoring</a></li>
<li><a href="#admin_management" data-toggle="tab">Admin management</a></li>
</ul> </ul>
<div id="myTabContent" class="tab-content"> <div id="myTabContent" class="tab-content">
...@@ -158,7 +159,71 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. ...@@ -158,7 +159,71 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<div class="tab-pane fade" id="wf_monitoring"></div> <div class="tab-pane fade" id="wf_monitoring"></div>
<div class="tab-pane fade" id="admin_management">
<div id="admin_users">
<p>This table allows you to add a user to the list of ng6 administrator</p>
<table class="table table-striped table-bordered dataTable" id="users_data_table">
<thead>
<tr>
<th><center><input type="checkbox" id="chk_all_user"></center></th>
<th nowrap>Login</th>
<th>Last name</th>
<th>First name</th>
<th>Email</th>
</tr>
</thead>
<tbody>
{foreach from=$ng6_admin_users key=c_user_id item=user_values}
{* highlight user personnal line *}
{assign var="emphasis" value=""}
{if $user_values.id==$user_id}
{assign var="emphasis" value="tx-nG6-pi1-line-emphasis"}
{/if}
<tr id="tr_user_{$user_values.id}" class="{$emphasis}">
{if $user_values.id == $user_id }
<td></td>
{else}
<td><center><input type="checkbox" id="chk_user_{$user_values.id}" value="user_{$user_values.id}" /></center></td>
{/if}
<td>{$user_values.username}</td>
<td>{$user_values.last_name}</td>
<td>{$user_values.first_name}</td>
<td>{$user_values.email}</td>
</tr>
{/foreach}
</tbody>
<tfoot>
<tr>
<th align="left" colspan="8">
With selection :
<div class="btn-group">
<button id="add_admin" type="button" class="btn btn-small" ><i class="icon-plus"></i> add administrator</button>
<button id="del_admin" type="button" class="btn multipleu-selection-btn btn-small"><i class="icon-minus"></i> delete administrator</button>
</div>
</th>
</tr>
</tfoot>
</table>
</div>
</div>
</div>
</div>
{* Modal initialization *}
{* Global tmpl *}
<div id="ng6modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="modal-label-tmpl" aria-hidden="true">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
<h3 id="modal-label-tmpl">Modal header</h3>
</div> </div>
<div id="modal-body-tmpl" class="modal-body"></div>
<div id="modal-foot-tmpl" class="modal-footer"></div>
</div> </div>
<!-- statusModal --> <!-- statusModal -->
......
...@@ -61,6 +61,7 @@ class tx_nG6_pi6 extends tslib_pibase { ...@@ -61,6 +61,7 @@ class tx_nG6_pi6 extends tslib_pibase {
$GLOBALS['TSFE']->additionalHeaderData[$this->prefixId] = ' $GLOBALS['TSFE']->additionalHeaderData[$this->prefixId] = '
<script type="text/javascript" src="'.t3lib_extMgm::siteRelPath($this->extKey).'res/js/jquery-1.8.3.min.js"></script> <script type="text/javascript" src="'.t3lib_extMgm::siteRelPath($this->extKey).'res/js/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="'.t3lib_extMgm::siteRelPath($this->extKey).'res/js/bootstrap.min.js"></script> <script type="text/javascript" src="'.t3lib_extMgm::siteRelPath($this->extKey).'res/js/bootstrap.min.js"></script>
<script type="text/javascript" src="'.t3lib_extMgm::siteRelPath($this->extKey).'res/js/bootstrap-typeahead.js"></script>
<script type="text/javascript" src="'.t3lib_extMgm::siteRelPath($this->extKey).'res/js/tx_nG6_pi6.js"></script> <script type="text/javascript" src="'.t3lib_extMgm::siteRelPath($this->extKey).'res/js/tx_nG6_pi6.js"></script>
<script type="text/javascript" src="'.t3lib_extMgm::siteRelPath($this->extKey).'res/js/highstock.js"></script> <script type="text/javascript" src="'.t3lib_extMgm::siteRelPath($this->extKey).'res/js/highstock.js"></script>
<script type="text/javascript" src="'.t3lib_extMgm::siteRelPath($this->extKey).'res/js/jquery.highcharts.exporting.js"></script> <script type="text/javascript" src="'.t3lib_extMgm::siteRelPath($this->extKey).'res/js/jquery.highcharts.exporting.js"></script>
...@@ -72,6 +73,7 @@ class tx_nG6_pi6 extends tslib_pibase { ...@@ -72,6 +73,7 @@ class tx_nG6_pi6 extends tslib_pibase {
<script type="text/javascript" src="'.t3lib_extMgm::siteRelPath($this->extKey).'res/js/jflow-availablewf.js"></script> <script type="text/javascript" src="'.t3lib_extMgm::siteRelPath($this->extKey).'res/js/jflow-availablewf.js"></script>
<script type="text/javascript" src="'.t3lib_extMgm::siteRelPath($this->extKey).'res/js/jflow-wfform.js"></script> <script type="text/javascript" src="'.t3lib_extMgm::siteRelPath($this->extKey).'res/js/jflow-wfform.js"></script>
<script type="text/javascript" src="'.t3lib_extMgm::siteRelPath($this->extKey).'res/js/jflow-wfstatus.js"></script> <script type="text/javascript" src="'.t3lib_extMgm::siteRelPath($this->extKey).'res/js/jflow-wfstatus.js"></script>
<script type="text/javascript" src="'.t3lib_extMgm::siteRelPath($this->extKey).'res/js/tx_nG6_utils.js"></script>
<link type="text/css" rel="stylesheet" media="screen" href="'.t3lib_extMgm::siteRelPath($this->extKey).'res/css/bootstrap.min.css"/> <link type="text/css" rel="stylesheet" media="screen" href="'.t3lib_extMgm::siteRelPath($this->extKey).'res/css/bootstrap.min.css"/>
<link type="text/css" rel="stylesheet" media="screen" href="'.t3lib_extMgm::siteRelPath($this->extKey).'res/css/DT_bootstrap.css"/> <link type="text/css" rel="stylesheet" media="screen" href="'.t3lib_extMgm::siteRelPath($this->extKey).'res/css/DT_bootstrap.css"/>
<link type="text/css" rel="stylesheet" media="screen" href="'.t3lib_extMgm::siteRelPath($this->extKey).'res/css/tx_nG6.css"/>'; <link type="text/css" rel="stylesheet" media="screen" href="'.t3lib_extMgm::siteRelPath($this->extKey).'res/css/tx_nG6.css"/>';
...@@ -92,6 +94,7 @@ class tx_nG6_pi6 extends tslib_pibase { ...@@ -92,6 +94,7 @@ class tx_nG6_pi6 extends tslib_pibase {
$smarty->assign('server_url', $this->conf['server_url']); $smarty->assign('server_url', $this->conf['server_url']);
$distribution = tx_nG6_db::select_projects_repartition('create_user', 'title'); $distribution = tx_nG6_db::select_projects_repartition('create_user', 'title');
$smarty->assign('distribution', $distribution); $smarty->assign('distribution', $distribution);
$smarty->assign('ng6_admin_users', tx_nG6_db::get_ng6_admin_users() );
return $smarty->fetch('administration_view.tpl'); return $smarty->fetch('administration_view.tpl');
} }
} }
......
...@@ -916,8 +916,9 @@ $(function () { ...@@ -916,8 +916,9 @@ $(function () {
username_val: { required: true }, username_val: { required: true },
user_password_pwd_val: { required: true }, user_password_pwd_val: { required: true },
user_password_pwd2_val: { required: true, equalTo: "#user_password_pwd_val"}, user_password_pwd2_val: { required: true, equalTo: "#user_password_pwd_val"},
project_name_val: { required: true }, title_val : { required : true },
description_val: { required: true } organism_val : { required : true },
location_val : { required : true}
}, },
messages: { messages: {
first_name_val: null, first_name_val: null,
...@@ -926,8 +927,9 @@ $(function () { ...@@ -926,8 +927,9 @@ $(function () {
username_val: null, username_val: null,
user_password_pwd_val: null, user_password_pwd_val: null,
user_password_pwd2_val: "Same password is required", user_password_pwd2_val: "Same password is required",
project_name_val: null, title_val: null,
description_val: null organism_val: null,
location_val: null
}, },
submitHandler: function(form) { submitHandler: function(form) {
var val_url = "index.php?eID=tx_nG6&type=install"; var val_url = "index.php?eID=tx_nG6&type=install";
...@@ -937,6 +939,9 @@ $(function () { ...@@ -937,6 +939,9 @@ $(function () {
val_url += "&password=" + $("#user_password_pwd_val").val(); val_url += "&password=" + $("#user_password_pwd_val").val();
val_url += "&email=" + $("#email_val").val(); val_url += "&email=" + $("#email_val").val();
val_url += "&pid=" + $("#pid").val(); val_url += "&pid=" + $("#pid").val();
val_url += "&title=" + $("#title_val").val();
val_url += "&organism=" + $("#organism_val").val();
val_url += "&location=" + $("#location_val").val();
$.ajax({ $.ajax({
url: val_url, url: val_url,
success: function(val, status, xhr) { success: function(val, status, xhr) {
......
...@@ -66,6 +66,14 @@ $(function () { ...@@ -66,6 +66,14 @@ $(function () {
}) })
}) })
updateUsersButtonStatus();
$("[id^=chk_user_]").change(function() {
updateUsersButtonStatus();
});
$("#chk_all_user").change(function() {
updateUsersButtonStatus();
});
$(":checkbox").change(function(){ $(":checkbox").change(function(){
updateButtons(); updateButtons();
}) })
...@@ -96,8 +104,175 @@ $(function () { ...@@ -96,8 +104,175 @@ $(function () {
$('#statusModal').modal(); $('#statusModal').modal();
}); });
$('#add_admin').click(function(){
$("#modal-label-tmpl").html("Add a new ng6 admin user");
var add_ng6_admin = '<div id="error_message" class="alert alert-error"><button class="close" data-dismiss="alert" type="button">x</button></div>';
add_ng6_admin += '<div class="tx-nG6-pi1-add-new">Seek the user using the autocompletion fields<br /> <br /> ';
add_ng6_admin += '<form class="form-horizontal" id="new_ng6_admin_user">';
add_ng6_admin += ' <input type="hidden" id="userid_val" name="userid_val" />';
add_ng6_admin += ' <div class="control-group">';
add_ng6_admin += ' <label class="control-label">Login</label>';
add_ng6_admin += ' <div class="controls">';
add_ng6_admin += ' <input type="text" id="username_val" class="typeahead" name="username_val" placeholder="Login"/>';
add_ng6_admin += ' </div>';
add_ng6_admin += ' </div>';
add_ng6_admin += ' <div class="control-group">';
add_ng6_admin += ' <label class="control-label">Last name</label>';
add_ng6_admin += ' <div class="controls">';
add_ng6_admin += ' <input type="text" id="last_name_val" class="typeahead" name="last_name_val" placeholder="Last name"/> ';
add_ng6_admin += ' </div>';
add_ng6_admin += ' </div>';
add_ng6_admin += ' <div class="control-group">';
add_ng6_admin += ' <label class="control-label">First name</label>';
add_ng6_admin += ' <div class="controls">';
add_ng6_admin += ' <input type="text" id="first_name_val" class="typeahead" name="first_name_val" placeholder="First name"/>';
add_ng6_admin += ' </div>';
add_ng6_admin += ' </div>';
add_ng6_admin += ' <input type="hidden" id="added_userid_val" name="added_userid_val" />';
add_ng6_admin += '</form>';
add_ng6_admin += '</div>';
$("#modal-body-tmpl").html(add_ng6_admin);