Files
sisai-world/views/mgr.html
2025-10-06 21:31:13 +09:00

869 lines
35 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html
lang="en-US"
class="light-style"
>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"
/>
<title>SisAi world</title>
<meta name="description" id="site_desc" content="" />
<!-- Favicon -->
<link rel="icon" type="image/x-icon" href="files/favicon.ico" />
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Public+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap"
rel="stylesheet"
/>
<!-- Icons. Uncomment required icon fonts -->
<link rel="stylesheet" href="files/boxicons.css" />
<!-- Core CSS -->
<link rel="stylesheet" href="files/core.css" class="template-customizer-core-css" />
<link rel="stylesheet" href="files/theme-default.css" class="template-customizer-theme-css" />
<link rel="stylesheet" href="files/demo.css" />
<!-- Vendors CSS -->
<link rel="stylesheet" href="files/perfect-scrollbar.css" />
<script src="files/jquery.js"></script>
<!-- Helpers -->
<script src="files/helpers.js"></script>
<!--! Template customizer & Theme config files MUST be included after core stylesheets and helpers.js in the <head> section -->
<!--? Config: Mandatory theme config file contain global vars & default theme options, Set your preferred theme option in this file. -->
<script src="files/config.js"></script>
<script src="files/ua-parser.js"></script>
<link rel="stylesheet" href="files/spinner.css" />
<script src="files/amipro_utils.js?v=20230401402"></script>
<!-- script src="files/dfido2-lib.js?v=20230813"></!-->
<script src="files/portal.js?v=20230828"></script>
<script>
lang_map = new Map();
lang_map.set("en-US", "Total users");
lang_map.set("zh-CN", "总用户数");
lang_map.set("ja", "総ユーザー数");
i18n_messages.set("label_total_users", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Failed authentications in past weeks");
lang_map.set("zh-CN", "最近4周失败认证数");
lang_map.set("ja", "直近4週間失敗認証数");
i18n_messages.set("label_fail_auth", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Total authentications in past weeks");
lang_map.set("zh-CN", "最近4周总认证数");
lang_map.set("ja", "直近4週間総認証数");
i18n_messages.set("label_total_auth", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Active users in past weeks");
lang_map.set("zh-CN", "最近4周活跃用户数");
lang_map.set("ja", "直近4週間アクティブユーザー数");
i18n_messages.set("label_active_users", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Users list");
lang_map.set("zh-CN", "用户列表");
lang_map.set("ja", "ユーザーリスト");
i18n_messages.set("label_users_list", lang_map);
lang_map = new Map();
lang_map.set("en-US", "User email address");
lang_map.set("zh-CN", "用户邮件地址");
lang_map.set("ja", "ユーザーメールアドレス");
i18n_messages.set("label_mgr_email", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Role");
lang_map.set("zh-CN", "角色");
lang_map.set("ja", "ロール");
i18n_messages.set("label_mgr_role", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Manager");
lang_map.set("zh-CN", "管理员");
lang_map.set("ja", "管理者");
i18n_messages.set("sel_mgr_role_editor", lang_map);
lang_map = new Map();
lang_map.set("zh-CN", "邀请的空间");
lang_map.set("ja", "招待されたスペース");
lang_map.set("en-US", "Invited space");
i18n_messages.set("label_sel_invt_space", lang_map);
lang_map = new Map();
lang_map.set("zh-CN", "普通用户");
lang_map.set("ja", "一般ユーザー");
lang_map.set("en-US", "Normal user");
i18n_messages.set("sel_mgr_role_viewer", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Invite User");
lang_map.set("zh-CN", "邀请用户");
lang_map.set("ja", "ユーザー招待");
i18n_messages.set("btn_add", lang_map);
lang_map = new Map();
lang_map.set("en-US", "All domains");
lang_map.set("zh-CN", "所有域");
lang_map.set("ja", "すべてのドメイン");
i18n_messages.set("label_all_domains", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Search...");
lang_map.set("zh-CN", "搜索...");
lang_map.set("ja", "検索...");
i18n_messages.set("label_search", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Input correct Email address, please!");
lang_map.set("zh-CN", "请输入准确邮件地址!");
lang_map.set("ja", "メールアドレスを正しく入力してください!");
i18n_messages.set("msg_mgr_input", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Cannot invite yourself!");
lang_map.set("zh-CN", "不能邀请自己!");
lang_map.set("ja", "自分を招待することはできません!");
i18n_messages.set("msg_mgr_self", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Sent inviting email from support@amipro.me.\n"+
"Please let user to check email and click the link to join.\n"+
"Please check spam folder if user can't find the email.");
lang_map.set("zh-CN", "已经从 support@amipro.me 发送邀请邮件到用户的邮箱,\n请通知用户查收邮件并点击邮件中的链接来接受邀请。\n"+
"如果没有收到邮件,请用户检查垃圾邮件文件夹。");
lang_map.set("ja", "support@amipro.meから招待メールを送信しました、\n"+
"電子メールを確認し、電子メール内のリンクをクリックして招待を受け入れるようにユーザーに通知してください。\n"+
"メールが見つからない場合は、迷惑メール フォルダを確認してください。");
i18n_messages.set("title_sent_invite_email", lang_map);
lang_map = new Map();
lang_map.set("zh-CN", "从空间移除");
lang_map.set("ja", "スペースから削除");
lang_map.set("en-US", "Remove from space");
i18n_messages.set("btn_unspace", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Recovery link");
lang_map.set("zh-CN", "恢复链接");
lang_map.set("ja", "リカバリー・リンク");
i18n_messages.set("btn_link", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Users can register their devices by clicking this link without authentication. Please send this link to users with a secure method. The link will be expired in 15 minutes.\n(Link has been copied to clipboard)");
lang_map.set("zh-CN", "用户可以无需进行身份验证即可通过点击此链接而注册其设备。请通过安全的方式将此链接发送给用户。链接将在15分钟后过期。\n链接已经拷贝至剪贴板");
lang_map.set("ja", "ユーザーは、このリンクをクリックすることで、認証なしにデバイスを登録できます。このリンクを安全な方法でユーザーに送信してください。リンクは15分で期限切れになります。\nリンクはクリップボードにコピーされました");
i18n_messages.set("msg_link", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Devices");
lang_map.set("zh-CN", "设备");
lang_map.set("ja", "デバイス");
i18n_messages.set("btn_devices", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Are you sure to remove this account from group?");
lang_map.set("zh-CN", "确定要移出此账户吗?");
lang_map.set("ja", "このアカウントをグループから削除してもよろしいですか?");
i18n_messages.set("msg_remove_account", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Are you sure to delete this device?");
lang_map.set("zh-CN", "确定要删除此设备吗?");
lang_map.set("ja", "このデバイスを削除してもよろしいですか?");
i18n_messages.set("msg_del_device", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Delete");
lang_map.set("zh-CN", "删除");
lang_map.set("ja", "削除");
i18n_messages.set("btn_delete", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Failed to delete device");
lang_map.set("zh-CN", "删除设备失败");
lang_map.set("ja", "デバイスの削除に失敗しました");
i18n_messages.set("msg_del_dvc_fail", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Failed to remove account from group");
lang_map.set("zh-CN", "账户移出组失败");
lang_map.set("ja", "アカウントをグループから削除できませんでした");
i18n_messages.set("msg_remove_acc_fail", lang_map);
lang_map = new Map();
lang_map.set("en-US", "System error. Please try later.");
lang_map.set("zh-CN", "系统错误,请稍后再试。");
lang_map.set("ja", "システムエラー。後でもう一度お試しください。");
i18n_messages.set("msg_sys_fail", lang_map);
lang_map = new Map();
lang_map.set("en-US", "No devices");
lang_map.set("zh-CN", "尚无设备");
lang_map.set("ja", "デバイスなし");
i18n_messages.set("msg_no_device", lang_map);
lang_map = new Map();
lang_map.set("zh-CN", "尚无可以管理的空间,请到空间市场中创建");
lang_map.set("ja", "管理できるスペースがありません。スペースマーケットで作成してください。");
lang_map.set("en-US", "No space to manage, please create in space market.");
i18n_messages.set("label_no_space", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Space market");
lang_map.set("zh-CN", "空间市场");
lang_map.set("ja", "スペースマーケット");
i18n_messages.set("label_market", lang_map);
lang_map = new Map();
lang_map.set("zh-CN", "确定要修改自身的权限吗?");
lang_map.set("ja", "自分の権限を変更してもよろしいですか?");
lang_map.set("en-US", "Are you sure to change your role?");
i18n_messages.set("msg_chg_self_role", lang_map);
lang_map = new Map();
lang_map.set("zh-CN", "确定将此账号从该空间移除吗?");
lang_map.set("ja", "このアカウントをこのスペースから削除してもよろしいですか?");
lang_map.set("en-US", "Are you sure to remove this account from this space?");
i18n_messages.set("msg_unspace", lang_map);
lang_map = new Map();
lang_map.set("zh-CN", "确定将自己的账号从该空间移除吗?");
lang_map.set("ja", "自分のアカウントをこのスペースから削除してもよろしいですか?");
lang_map.set("en-US", "Are you sure to remove your account from this space?");
i18n_messages.set("msg_unspace_self", lang_map);
$(async function () {
$("#user_nickname").text(sessionStorage.getItem("nickname")?sessionStorage.getItem("nickname"):"");
showSpinner();
await listSpaces();
if($('#sel_invt_space').children().length == 0){
$('#no_space_table').show();
$('#invt_table').hide();
}else{
$('#no_space_table').hide();
$('#invt_table').show();
}
//$('#input_search').prop('placeholder', getI18NText(i18n_messages, 'label_search'));
/*$('#input_search').on('keypress', function(e) {
if (e.keyCode === 13) {
changed_search = true;
listMgrs();
}
});*/
listSpaceUsers();
hideSpinner();
});
async function listSpaces(){
showSpinner();
var lstJson = {};
lstJson["role_type"] = 1;
const response = await fetch("/listspacenms", {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(lstJson)
})
if(response.status == 200){
const resp = await response.json();
if (resp.status=='OK') {
var sel_html = '';
if(resp.spaces.length == 0){
$('#no_space_table').show();
$('#invt_table').hide();
}else{
for(let space of resp.spaces){
sel_html += '<option value="'+space.space_id+'">'+ getI18NJsonText(space.space_name)+'</option>';
}
$('#sel_invt_space').html(sel_html);
}
}else{
alert(getI18NText(i18n_messages, 'msg_sys_err'));
}
}else if(response.status == 440){
window.location.href = "/login.html";
}else{
alert(getI18NText(i18n_messages, 'msg_sys_err'));
}
hideSpinner();
}
async function inviteMgr(){
if(checkInput()){
showSpinner();
var lstJson = {};
lstJson["email"] = $('#input_mgr_email').val().trim();
lstJson["role"] = $('#sel_mgr_role').val();
lstJson["space_id"] = $('#sel_invt_space').val();
try{
const response = await fetch("/sendinvtmail", {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(lstJson)
})
hideSpinner();
if(response.status == 200){
const resp = await response.json();
if (resp.status=='OK') {
alert(getI18NText(i18n_messages, 'title_sent_invite_email'));
}else{
alert(getI18NText(i18n_messages, 'msg_sys_err'));
}
}else{
alert(getI18NText(i18n_messages, 'msg_sys_err'));
}
}catch(err){
alert(getI18NText(i18n_messages, 'msg_sys_err'));
}finally{
hideSpinner();
}
}
}
function checkInput(){
const mgremail = $('#input_mgr_email').val().trim()
if(!checkEmailFormat(mgremail)){
alert($('#msg_mgr_input').html())
return false;
}
else if(mgremail == sessionStorage.getItem('email')){
alert($('#msg_mgr_self').html())
return false;
}else return true;
}
//Copy text to clipboard
function copyToClipboard(text) {
setTimeout(function(){
var dummy = document.createElement("textarea");
document.body.appendChild(dummy);
dummy.value = text;
dummy.select();
document.execCommand("copy");
document.body.removeChild(dummy);
}, 300);
}
var changed_search = false;
async function listSpaceUsers(){
showSpinner();
$('#div_list_more').hide();
/*if($("#input_search").val()){
lstJson["search"] = encodeURIComponent($("#input_search").val());
}*/
/*if(changed_search){
$("#users_list").html('');
changed_search = false;
}*/
$("#users_list").html('');
var resp = await fetch("/listspcusrs", {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({})
});
const result = await resp.json();
if ('OK' === result.status) {
let lst_html = $("#users_list").html();
for(let space of result.list){
var users_html = '';
//Find my self role
var my_role = 0;
for(let user of space.users){
if(user.account_id == sessionStorage.getItem("uid")){
my_role = user.role;
break;
}
}
for(let user of space.users){
var map = new Map();
map.set("user_name", getI18NJsonText(user.account_name));
map.set("user_email", user.account_email);
map.set("space_id", space.space_id);
map.set("user_id", user.account_id);
map.set("label_normal_user", getI18NText(i18n_messages, 'sel_mgr_role_viewer'));
map.set("label_manager", getI18NText(i18n_messages, 'sel_mgr_role_editor'));
map.set("label_remove", getI18NText(i18n_messages, 'btn_unspace'));
map.set("selected_0", user.role == 0?"selected":"");
map.set("selected_1", user.role == 1?"selected":"");
if(my_role == 1){
users_html += replaceTemplate(document.getElementById('list_user_template_mgr').innerHTML, map);
}else{
users_html += replaceTemplate(document.getElementById('list_user_template_user').innerHTML, map);
}
}
var map = new Map();
map.set("space_id", space.space_id);
map.set("space_name", getI18NJsonText(space.space_name));
map.set("user_list", "<table style='width:98%;'>"+users_html+"</table>");
lst_html += replaceTemplate(document.getElementById('list_space_template').innerHTML, map);
}
document.getElementById('users_list').innerHTML = lst_html;
}
/*else{
const msg = getI18NErrorMessage(result.errorMessage);
alert(msg?msg:result.errorMessage);
}*/
//if(result.users && result.users.length >= lstJson["limit"])$('#div_list_more').show();
hideSpinner();
}
async function changedRole(space_id, user_id){
if(user_id == sessionStorage.getItem('uid') && !confirm(getI18NText(i18n_messages, 'msg_chg_self_role'))){
window.location.reload();
return;
}
var lstJson = {};
lstJson["space_id"] = space_id;
lstJson["user_id"] = user_id;
lstJson["role"] = $('#sel_role_'+space_id+'_'+user_id).val();
const response = await fetch("/chgrlusr", {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(lstJson)
})
if(response.status == 200){
const resp = await response.json();
if (resp.status=='OK') {
//alert('Role changed');
if(user_id == sessionStorage.getItem('uid')){
window.location.reload();
}
}else{
alert(getI18NText(i18n_messages, 'msg_sys_err'));
window.location.reload();
}
}else{
alert(getI18NText(i18n_messages, 'msg_sys_err'));
window.location.reload();
}
}
async function unspaceUser(space_id, user_id){
var msgtxt;
if(user_id == sessionStorage.getItem('uid'))msgtxt = getI18NText(i18n_messages, 'msg_unspace_self');
else msgtxt = getI18NText(i18n_messages, 'msg_unspace');
if(!confirm(msgtxt)){
return;
}
showSpinner();
var lstJson = {};
lstJson["space_id"] = space_id;
lstJson["user_id"] = user_id;
const response = await fetch("/unspcusr", {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(lstJson)
})
if(response.status == 200){
const resp = await response.json();
if (resp.status=='OK') {
//alert('User removed');
if(user_id == sessionStorage.getItem('uid')){
window.location.reload();
}else $('#user_tr_'+space_id+"_"+user_id).remove();
}else{
alert(getI18NText(i18n_messages, 'msg_sys_err'));
}
}else{
alert(getI18NText(i18n_messages, 'msg_sys_err'));
}
hideSpinner();
}
function replaceTemplate(template, replaceMap){
var newTemplate = template;
for (var [key, value] of replaceMap) {
newTemplate = newTemplate.replace(new RegExp('\\['+key+'\\]', 'g'), value);
}
return newTemplate;
}
function checkEmailFormat(email){
if(!email || 0>=email.length)return false;
if(!email.match(/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/))return false;
return true;
}
//Copy text to clipboard
function copyToClipboard(text) {
setTimeout(function(){
var dummy = document.createElement("textarea");
document.body.appendChild(dummy);
dummy.value = text;
dummy.select();
document.execCommand("copy");
document.body.removeChild(dummy);
}, 300);
}
function showSpinner() {
$('#sel_domain').prop('disabled', true);
document.getElementById("spinner").style.display = "block";
}
function hideSpinner() {
$('#sel_domain').prop('disabled', false);
document.getElementById("spinner").style.display = "none";
}
</script>
</head>
<body>
<!-- Layout wrapper -->
<div class="layout-wrapper layout-content-navbar">
<div class="layout-container">
<!-- Menu -->
<aside id="layout-menu" class="layout-menu menu-vertical menu bg-menu-theme">
<div class="app-brand demo">
<a href="top.html" class="app-brand-link">
<span class="app-brand-logo demo">
<img src="files/favicon.ico" alt="SisAi" width="45%" style="display: block; margin: 10%;" />
</span>
</a>
</div>
<div class="menu-inner-shadow"></div>
<ul class="menu-inner py-1">
<li class="menu-item">
<a href="top.html" class="menu-link">
<i class="menu-icon tf-icons bx bx-home-circle"></i>
<div data-i18n="Analytics" id="menu_conversation">Conversation</div>
</a>
</li>
<li class="menu-item">
<a href="settings.html" class="menu-link">
<i class="menu-icon tf-icons bx bx-cog"></i>
<div data-i18n="Analytics" id="menu_settings">Settings</div>
</a>
</li>
<li class="menu-item">
<a href="market.html" class="menu-link">
<i class="menu-icon tf-icons bx bx-store-alt"></i>
<div data-i18n="Analytics" id="menu_market">market</div>
</a>
</li>
<li class="menu-item">
<a href="builder.html" class="menu-link">
<i class="menu-icon tf-icons bx bx-wrench"></i>
<div data-i18n="Analytics" id="menu_builder">Space Builder</div>
</a>
</li>
<li class="menu-item active">
<a href="mgr.html" class="menu-link" onclick="javascript:return false;">
<i class="menu-icon tf-icons bx bx-user"></i>
<div data-i18n="Analytics" id="menu_mgr">Managers</div>
</a>
</li>
<li class="menu-item">
<a href="docs.html" class="menu-link">
<i class="menu-icon tf-icons bx bx-file"></i>
<div data-i18n="Analytics" id="menu_docs">Documents</div>
</a>
</li>
</ul>
</aside>
<!-- / Menu -->
<!-- Layout container -->
<div class="layout-page">
<!-- Navbar -->
<nav
class="layout-navbar container-xxl navbar navbar-expand-xl navbar-detached align-items-center bg-navbar-theme"
id="layout-navbar"
>
<div class="layout-menu-toggle navbar-nav align-items-xl-center me-3 me-xl-0 d-xl-none">
<a class="nav-item nav-link px-0 me-xl-4" href="javascript:void(0)">
<i class="bx bx-menu bx-sm"></i>
</a>
</div>
<div class="navbar-nav-right d-flex align-items-center" id="navbar-collapse">
<div class="navbar-nav align-items-center">
<div class="nav-item d-flex align-items-center">
SisAi World
</div>
</div>
<ul class="navbar-nav flex-row align-items-center ms-auto">
<!-- User -->
<li class="nav-item navbar-dropdown dropdown-user dropdown">
<a class="nav-link dropdown-toggle hide-arrow" href="javascript:void(0);" data-bs-toggle="dropdown">
<div class="avatar avatar-online">
<img src="files/avatar.png" alt class="w-px-40 h-auto rounded-circle" />
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<a class="dropdown-item" href="#">
<div class="d-flex">
<div class="flex-shrink-0 me-3">
<div class="avatar avatar-online">
<img src="files/avatar.png" alt class="w-px-40 h-auto rounded-circle" />
</div>
</div>
<div class="flex-grow-1">
<span class="fw-semibold d-block" id="user_nickname">A manager</span>
<!-- small class="text-muted">Admin</!-->
</div>
</div>
</a>
</li>
<!-- li>
<div class="dropdown-divider"></div>
</>
<li>
<a class="dropdown-item" href="devices.html">
<i class="bx bx-mobile-alt me-2"></i>
<span class="align-middle" id="label_device_mng">Device management</span>
</a>
</li>
<li>
<a class="dropdown-item" href="#">
<span class="d-flex align-items-center align-middle">
<i class="flex-shrink-0 bx bx-credit-card me-2"></i>
<span class="flex-grow-1 align-middle">Billing</span>
<span class="flex-shrink-0 badge badge-center rounded-pill bg-danger w-px-20 h-px-20">!</span>
</span>
</a>
</li -->
<li>
<div class="dropdown-divider"></div>
</li>
<li>
<a class="dropdown-item" href="login.html">
<i class="bx bx-power-off me-2"></i>
<span class="align-middle" id="label_logout">Log Out</span>
</a>
</li>
</ul>
</li>
<!--/ User -->
</ul>
</div>
</nav>
<!-- / Navbar -->
<!-- Content wrapper -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 container-p-y">
<div id="msg_mgr_input" style="display:none;">Input email address, please!</div>
<div id="msg_mgr_self" style="display:none;">Cannot invite yourself!</div>
<div class="row">
<div class="col-md-12 col-lg-12 order-2 mb-4">
<div class="card h-100">
<div class="card-header d-flex align-items-center justify-content-between">
<h5 class="card-title m-0 me-2" id="label_users_list">Manager list</h5>
<div id="no_space_table" style="display: none;">
<h6 id="label_no_space" >No space, please create in space market.</h6>
<a href="market.html" style="font-size: larger;" id="label_market">market</a>
</div>
<div class="row" style="width: 90%;" id="invt_table">
<div class="col-md-6 col-lg-3 order-2 mb-4">
<div class="form-floating">
<input type="text" class="form-control" id="input_mgr_email" placeholder="email address">
<label for="input_mgr_email" id="label_mgr_email">Email address</label>
</div>
</div>
<div class="col-md-6 col-lg-3 order-2 mb-4">
<div class="form-floating">
<select class="form-select" id="sel_invt_space" aria-label="Users' space">
</select>
<label for="sel_invt_space" id="label_sel_invt_space">Invite to space</label>
</div>
</div>
<div class="col-md-6 col-lg-3 order-2 mb-4">
<div class="form-floating">
<select class="form-select" id="sel_mgr_role" aria-label="Users' role">
<option value="0" id="sel_mgr_role_viewer">User</option>
<option value="1" id="sel_mgr_role_editor">Manager</option>
</select>
<label for="sel_mgr_role" id="label_mgr_role">Manager's role</label>
</div>
</div>
<div class="col-md-6 col-lg-3 order-2 mb-4" style="text-align: right;">
<button style="white-space:nowrap;height: 3.5rem;width: 90%; max-width: 200pt;" class="btn btn-info" onclick="inviteMgr();" id="btn_add">Invite manager</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="list_user_template_mgr" style="display: none;">
<div class="row" id="user_tr_[space_id]_[user_id]">
<div class="col-md-6 col-lg-3 order-2 mb-4">[user_name]</div>
<div class="col-md-6 col-lg-3 order-2 mb-4">[user_email]</div>
<div class="col-md-6 col-lg-3 order-2 mb-4">
<select class="form-select" style="width: 100pt;" id="sel_role_[space_id]_[user_id]" onchange="changedRole([space_id],[user_id]);">
<option value="0" [selected_0]>[label_normal_user]</option>
<option value="1" [selected_1]>[label_manager]</option>
</select>
</div>
<div class="col-md-6 col-lg-3 order-2 mb-4">
<button class="btn btn-danger" style="word-wrap: unset;" onclick="unspaceUser([space_id],[user_id]);">[label_remove]</button>
</div>
</div>
</div>
<div id="list_user_template_user" style="display: none;">
<div class="row">
<div class="col-md-6 col-lg-3 order-2 mb-4">[user_name]</div>
<div class="col-md-6 col-lg-3 order-2 mb-4">[user_email]</div>
<div class="col-md-12 col-lg-6 order-2 mb-4"></div>
</div>
</div>
<div id="list_space_template" style="display: none;">
<div class="col-md-12 col-lg-12 order-2 mb-4">
<div class="card h-100">
<div class="card-header d-flex align-items-center justify-content-between">
<div class="navbar-nav align-items-center"><p class="fw-semibold d-block">[space_name]</p></div>
</div>
<div class="card-body">
[user_list]
</div>
</div>
</div>
</div>
<div class="row" id="users_list">
</div>
</div>
<div id="spinner" class="spinner">
<div class="spinner-icon"></div>
</div>
<div class="card text-center" style="display: none;position: fixed; top: 10px; left: auto; width: 50%; z-index: 9999;"
id="popup_info">
<div class="card-body">
<h5 class="card-title" id="popup_title">Title</h5>
<p class="card-text" id="popup_msg">Msg</p>
<a href="javascript:$('#popup_info').hide();" class="btn btn-primary">OK</a>
</div>
</div>
<!-- / Content -->
<!-- Footer -->
<footer class="content-footer footer bg-footer-theme">
<div class="container-xxl d-flex flex-wrap justify-content-between py-2 flex-md-row flex-column">
<div class="mb-2 mb-md-0">
©
<script>
document.write(new Date().getFullYear());
</script>
<a href="#" target="_blank" class="footer-link fw-bolder">amiPro(Powered by OpenAI-4o)</a>
</div>
<div class="mb-2 mb-md-0">
<a href="payinf.html" target="_blank" class="footer-link">特定商取引法に基づく表記</a>
</div>
<div>
<a
href="mailto:support@amipro.me?subject=contact"
target="_blank"
class="footer-link me-4"
id="title_contact"
>Contact</a
>
</div>
</div>
</footer>
<!-- / Footer -->
<div class="content-backdrop fade"></div>
</div>
<!-- Content wrapper -->
</div>
<!-- / Layout page -->
</div>
<!-- Overlay -->
<div class="layout-overlay layout-menu-toggle"></div>
</div>
<!-- / Layout wrapper -->
<!-- Core JS -->
<script src="files/popper.js"></script>
<script src="files/bootstrap.js"></script>
<script src="files/perfect-scrollbar.js"></script>
<script src="files/menu.js"></script>
<script src="files/main.js"></script>
<!-- endbuild -->
<!-- Page JS -->
<script src="files/dashboards-analytics.js"></script>
<!-- Place this tag in your head or just before your close body tag. -->
<script async defer src="https://buttons.github.io/buttons.js"></script>
</body>
</html>