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

1255 lines
53 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=20240620-1"></script>
<script src="files/portal.js"></script>
<script>
lang_map = new Map();
lang_map.set("en-US", "Save");
lang_map.set("zh-CN", "保 存");
lang_map.set("ja", "保 存");
i18n_messages.set("btn_update", lang_map);
lang_map = new Map();
lang_map.set("en-US", "[Create a new template]");
lang_map.set("zh-CN", "<新建空间模板>");
lang_map.set("ja", "<新しいテンプレートを作成>");
i18n_messages.set("label_create_tmpl", lang_map);
lang_map = new Map();
lang_map.set("en-US", "[Create background information type]");
lang_map.set("zh-CN", "<创建背景信息类型>");
lang_map.set("ja", "<背景情報分類を作成>");
i18n_messages.set("label_create_info", lang_map);
lang_map = new Map();
lang_map.set("en-US", "[Create new prompt]");
lang_map.set("zh-CN", "<新建提示>");
lang_map.set("ja", "<新しいプロンプトを作成>");
i18n_messages.set("label_create_prompt", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Background Information");
lang_map.set("zh-CN", "背景信息");
lang_map.set("ja", "背景情報");
i18n_messages.set("label_tmpl_info", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Background Information");
lang_map.set("zh-CN", "背景信息");
lang_map.set("ja", "背景情報");
i18n_messages.set("label_info", lang_map);
lang_map = new Map();
lang_map.set("zh-CN", "背景信息类型名称,文本最大长度为100字。");
lang_map.set("ja", "背景情報の種類名、テキストの最大長は100文字です。");
lang_map.set("en-US", "Background information type name, maximum text length is 100 characters.");
i18n_messages.set("label_info_name", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Basic Information");
lang_map.set("zh-CN", "基本信息");
lang_map.set("ja", "基本情報");
i18n_messages.set("label_basic", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Prompts");
lang_map.set("zh-CN", "推荐提问");
lang_map.set("ja", "おすすめ質問");
i18n_messages.set("label_prompts", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Background information content hint information.");
lang_map.set("zh-CN", "背景信息内容的提示信息。");
lang_map.set("ja", "背景情報の内容のヒント。");
i18n_messages.set("label_info_hint", lang_map);
lang_map = new Map();
lang_map.set("en-US", "User pre-entered background information to avoid repeated input for each question. Classification does not need to be too detailed. The maximum text length for each prompt information is 500 characters.");
lang_map.set("zh-CN", "用户预先输入的背景信息避免每次提问时重复输入。分类无需太过细致。每类提示信息文本最大长度为500字。");
lang_map.set("ja", "ユーザーが事前に入力できる背景情報で、質問するたびに繰り返し入力する必要が無くなります。分類は細かくする必要はありません。分類毎のヒント情報テキストの最大長は500文字です。");
i18n_messages.set("label_info_cmt", lang_map);
lang_map = new Map();
lang_map.set("en-US", "The maximum length of each of the above information texts is 500 words.");
lang_map.set("zh-CN", "以上各信息文本最大长度为500字。");
lang_map.set("ja", "上記の各情報テキストの最大長は500文字です。");
i18n_messages.set("label_prompt_length", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Do you want to leave this page without saving?");
lang_map.set("zh-CN", "您确定要离开此页面而不保存吗?");
lang_map.set("ja", "保存せずにこのページを離れますか?");
i18n_messages.set("msg_saving_alert", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Do you want to switch options without saving?");
lang_map.set("zh-CN", "您确定要切换选项而不保存吗?");
lang_map.set("ja", "保存せずにオプションを切り替えますか?");
i18n_messages.set("msg_opt_saving_alert", lang_map);
lang_map = new Map();
lang_map.set("zh-CN", "您确定要切换模板而不保存吗?");
lang_map.set("ja", "保存せずにテンプレートを切り替えますか?");
lang_map.set("en-US", "Do you want to switch templates without saving?");
i18n_messages.set("msg_tmpl_saving_alert", lang_map);
lang_map = new Map();
lang_map.set("en-US", "The maximum length of the text is 500 characters.");
lang_map.set("zh-CN", "文本最大长度为500字。");
lang_map.set("ja", "テキストの最大長は500文字です。");
i18n_messages.set("label_info_length", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Text is too long.")
lang_map.set("zh-CN", "文本超过最大允许长度。");
lang_map.set("ja", "テキストが長すぎます。");
i18n_messages.set("msg_toolong_text", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Public in Space market")
lang_map.set("zh-CN", "在空间市场中公开");
lang_map.set("ja", "スペースマーケットで公開");
i18n_messages.set("label_public", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Please input content.")
lang_map.set("zh-CN", "请输入内容。");
lang_map.set("ja", "内容を入力してください。");
i18n_messages.set("msg_input_please", lang_map);
lang_map = new Map();
lang_map.set("zh-CN", "请输入提问显示部分。");
lang_map.set("ja", "質問表示部分を入力してください。");
lang_map.set("en-US", "Please input the show part of the prompt.")
i18n_messages.set("msg_input_prmtshow_please", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Template name is too long.")
lang_map.set("zh-CN", "模板名字太长。");
lang_map.set("ja", "テンプレート名が長すぎます。");
i18n_messages.set("msg_toolong_tname", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Template introduction is too long.")
lang_map.set("zh-CN", "模板介绍太长。");
lang_map.set("ja", "テンプレート紹介が長すぎます。");
i18n_messages.set("msg_toolong_tcmt", lang_map);
lang_map = new Map();
lang_map.set("zh-CN", "模板名称,最大长度为100字。");
lang_map.set("ja", "テンプレート名、最大長は100文字です。");
lang_map.set("en-US", "Template name, maximum text length is 100 characters.")
i18n_messages.set("label_tmpl_name", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Template introduction")
lang_map.set("zh-CN", "模板介绍");
lang_map.set("ja", "テンプレート紹介");
i18n_messages.set("label_tmpl_intro", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Prompt hint: tell the user how to use or edit the prompt show part.")
lang_map.set("zh-CN", "提问提示信息:告诉用户如何使用或编辑提问显示部分。");
lang_map.set("ja", "質問ヒント:ユーザーに質問表示部分の使用方法や編集方法を伝えます。");
i18n_messages.set("label_prompt_hint", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Prompt head: input to the AI engine but not show to the user. Protect your intellectual property!")
lang_map.set("zh-CN", "提问信息前缀将输入给AI引擎但不显示给用户。保护您的知识产权");
lang_map.set("ja", "質問ヘッドAIエンジンに入力されますが、ユーザーには表示されません。貴方の知的財産権を保護します");
i18n_messages.set("label_prompt_head", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Prompt foot: input to the AI engine but not show to the user. Protect your intellectual property!")
lang_map.set("zh-CN", "提问信息后缀将输入给AI引擎但不显示给用户。保护您的知识产权");
lang_map.set("ja", "質問フットAIエンジンに入力されますが、ユーザーには表示されません。貴方の知的財産権を保護します");
i18n_messages.set("label_prompt_foot", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Prompt: the show part of the prompt.")
lang_map.set("zh-CN", "提问:提问显示部分。");
lang_map.set("ja", "質問:質問表示部分。");
i18n_messages.set("label_prompt_show", lang_map);
lang_map = new Map();
lang_map.set("en-US", "The name has been used. Please input another one.");
lang_map.set("zh-CN", "名称已被使用,请输入其他名称");
lang_map.set("ja", "名前が使用されています。別の名前を入力してください。");
i18n_messages.set("msg_same_name", 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_info_del", 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_prompt_del", lang_map);
lang_map = new Map();
lang_map.set("zh-CN", "确认删除以下对象吗?");
lang_map.set("en-US", "Do you want to delete the following object?");
lang_map.set("ja", "以下のオブジェクトを削除しますか?");
i18n_messages.set("msg_del_alert", lang_map);
$(async function(){
$("#user_nickname").text(sessionStorage.getItem("nickname")?sessionStorage.getItem("nickname"):"");
showSpinner();
document.getElementById("btn_basic_update").innerHTML = getI18NText(i18n_messages, "btn_update");
document.getElementById("btn_info_update").innerHTML = getI18NText(i18n_messages, "btn_update");
document.getElementById("btn_prompts_update").innerHTML = getI18NText(i18n_messages, "btn_update");
initInputs();
try{
var response = await fetch("/listtmplnms", {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({all_user: false})
});
if(response.status == 200){
const json = await response.json();
var sel_template = document.getElementById("sel_template");
const sel_template_id = sel_template.selectedIndex>=0?sel_template.options[sel_template.selectedIndex].value:'';
for (var i = 0; json.tmpls && i < json.tmpls.length; i++) {
var opt = document.createElement("option");
if (sel_template_id && sel_template_id == json.tmpls[i].tmpl_id) {
opt.selected = true;
}
opt.value = json.tmpls[i].tmpl_id;
opt.innerHTML = getI18NJsonText(json.tmpls[i].tmpl_name);
sel_template.appendChild(opt);
}
opt = document.createElement("option");
opt.value = "create-tmpl";
opt.innerHTML = getI18NText(i18n_messages, "label_create_tmpl");
sel_template.appendChild(opt);
if (!sel_template_id && sel_template.options.length > 0) {
sel_template.options[0].selected = true;
}
changedTemplate();
}else if (response.status == 440) {
window.location.href = "/login.html";
}
}catch(err){
alert(getI18NText(i18n_messages, 'msg_sys_err'));
}finally{
hideSpinner();
}
});
function initInfoInputs(){
var sel_info = document.getElementById("sel_info");
sel_info.innerHTML = "";
var opt = document.createElement("option");
opt.value = "create-info";
opt.innerHTML = getI18NText(i18n_messages, 'label_create_info');
sel_info.appendChild(opt);
var info_hint = document.getElementById("info_hint");
info_hint.value = "";
info_hint.placeholder = getI18NText(i18n_messages, "label_info_hint");
var info_name = document.getElementById("info_name");
info_name.value = "";
info_name.placeholder = getI18NText(i18n_messages, "label_info_name");
document.getElementById("btn_info_del").style.display='none';
}
function initPromptInputs(){
var sel_prompt = document.getElementById("sel_prompt");
sel_prompt.innerHTML = "";
var opt = document.createElement("option");
opt.value = "create-prompt";
opt.innerHTML = getI18NText(i18n_messages, 'label_create_prompt');
sel_prompt.appendChild(opt);
document.getElementById("btn_prompt_del").style.display='none';
setPromptsPlaceholders();
}
function setPromptsPlaceholders(){
var prompt_hint = document.getElementById("prompt_hint");
prompt_hint.value = "";
prompt_hint.placeholder = getI18NText(i18n_messages, "label_prompt_hint");
var prompt_head = document.getElementById("prompt_head");
prompt_head.value = "";
prompt_head.placeholder = getI18NText(i18n_messages, "label_prompt_head");
var prompt_foot = document.getElementById("prompt_foot");
prompt_foot.value = "";
prompt_foot.placeholder = getI18NText(i18n_messages, "label_prompt_foot");
var prompt_show = document.getElementById("prompt_show");
prompt_show.value = "";
prompt_show.placeholder = getI18NText(i18n_messages, "label_prompt_show");
}
function initInputs(){
var tmpl_name = document.getElementById("tmpl_name");
tmpl_name.value = "";
tmpl_name.placeholder = getI18NText(i18n_messages, "label_tmpl_name");
var tmpl_cmt_textarea = document.getElementById("tmpl_cmt_textarea");
tmpl_cmt_textarea.value = "";
tmpl_cmt_textarea.placeholder = getI18NText(i18n_messages, "label_tmpl_intro");
document.getElementById("chk_public").checked = false;
initInfoInputs();
initPromptInputs();
}
async function saveBasic(){
var tnm = document.getElementById("tmpl_name").value;
var tcmt = document.getElementById("tmpl_cmt_textarea").value;
if(tnm.length == 0 || tcmt.length == 0){
alert(getI18NText(i18n_messages, "msg_input_please"));
return;
}
if(tnm.length > 100){
alert(getI18NText(i18n_messages, "msg_toolong_tname"));
return;
}
if(tcmt.length > 500){
alert(getI18NText(i18n_messages, "msg_toolong_tcmt"));
return;
}
showSpinner();
document.getElementById("btn_basic_update").disabled = true;
var lstJson = {};
var sel_template = document.getElementById("sel_template");
var template_id = sel_template.options[sel_template.selectedIndex].value;
if(template_id != "create-tmpl")lstJson["tmpl_id"] = template_id;
try{
var response = await fetch("/chksamenm", {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
type: 'tmpl',
tmpl_id: template_id,
tmpl_name: tnm
}),
});
if(response.status == 200){
const resp = await response.json();
if(resp.status == "OK"){
if(resp.same == true){
alert(getI18NText(i18n_messages, 'msg_same_name'));
hideSpinner();
return;
}
}else window.location.href = "/login.html";
}else {
window.location.href = "/login.html";
}
lstJson["tmpl_name"] = tnm;
lstJson["tmpl_cmt"] = tcmt;
lstJson["language"] = window.navigator.language;
var response = await fetch("/settmplbasic", {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(lstJson)
})
if(response.status == 200){
const json = await response.json();
if(json.status == "OK"){
var sel_template = document.getElementById("sel_template");
var opt = document.createElement("option");
if(template_id != "create-tmpl"){
sel_template.options[sel_template.selectedIndex].innerHTML = tnm;
}else{
opt.value = json.tmpl_id;
opt.innerHTML = tnm;
sel_template.insertBefore(opt, sel_template.options[sel_template.options.length - 1]);
sel_template.options[sel_template.options.length-2].selected = true;
initInfoInputs();
initPromptInputs();
document.getElementById("chk_public").checked = false;
document.getElementById("div_public").style.display = "block";
document.getElementById("div_info").style.display = "block";
document.getElementById("div_prompts").style.display = "block";
}
hideSpinner();
}else{
window.location.href = "/login.html";
}
}else if (response.status == 440) {
window.location.href = "/login.html";
}
}catch(err){
alert(getI18NText(i18n_messages, 'msg_sys_err'));
}finally{
hideSpinner();
}
}
function changedTemplate(){
if(document.getElementById("btn_basic_update").disabled == false ||
document.getElementById("btn_info_update").disabled == false ||
document.getElementById("btn_prompts_update").disabled == false){
if( confirm( getI18NText(i18n_messages, "msg_tmpl_saving_alert") ) == false ){
document.getElementById("sel_template").options[cur_tmpl_index].selected = true;
return;
}
}
document.getElementById("btn_basic_update").disabled = true;
document.getElementById("btn_info_update").disabled = true;
document.getElementById("btn_prompts_update").disabled = true;
var sel_template = document.getElementById("sel_template");
var template_id = sel_template.options[sel_template.selectedIndex].value;
cur_tmpl_index = sel_template.selectedIndex;
if(template_id == "create-tmpl"){
initInputs();
document.getElementById("div_public").style.display = "none";
document.getElementById("div_info").style.display = "none";
document.getElementById("div_prompts").style.display = "none";
}else{
document.getElementById("div_public").style.display = "block";
document.getElementById("div_info").style.display = "block";
document.getElementById("div_prompts").style.display = "block";
loadTemplate(template_id);
}
}
function selectedInfo(){
if(btn_info_update.disabled == false){
if( confirm( getI18NText(i18n_messages, "msg_opt_saving_alert") ) == false ){
document.getElementById("sel_info").options[cur_info_index].selected = true;
return;
}
}
var sel_info = document.getElementById("sel_info");
var info_id = sel_info.options[sel_info.selectedIndex].value;
cur_info_index = sel_info.selectedIndex;
if(info_id == "create-info"){
document.getElementById("btn_info_del").style.display='none';
var info_hint = document.getElementById("info_hint");
info_hint.value = "";
info_hint.placeholder = getI18NText(i18n_messages, "label_info_hint");
var info_name = document.getElementById("info_name");
info_name.value = "";
info_name.placeholder = getI18NText(i18n_messages, "label_info_name");
}else{
document.getElementById("btn_info_del").style.display='block';
var info_hint = document.getElementById("info_hint");
const hint = info_hints.get(parseInt(info_id));
info_hint.value = hint;
var info_name = document.getElementById("info_name");
info_name.value = sel_info.options[sel_info.selectedIndex].innerHTML;
}
}
function selectedPrompt(){
if( btn_prompts_update.disabled == false ){
if(confirm( getI18NText(i18n_messages, "msg_opt_saving_alert") ) == false){
document.getElementById("sel_prompt").options[cur_prompt_index].selected = true;
return;
}
}
var sel_prompt = document.getElementById("sel_prompt");
var prompt_id = sel_prompt.options[sel_prompt.selectedIndex].value;
cur_prompt_index = sel_prompt.selectedIndex;
if(prompt_id == "create-prompt"){
document.getElementById("btn_prompt_del").style.display='none';
setPromptsPlaceholders();
}else{
document.getElementById("btn_prompt_del").style.display='block';
const data=prompts_data.get(parseInt(prompt_id));
var prompt_hint = document.getElementById("prompt_hint");
prompt_hint.value = data.hint;
var prompt_head = document.getElementById("prompt_head");
prompt_head.value = data.head;
var prompt_foot = document.getElementById("prompt_foot");
prompt_foot.value = data.foot;
var prompt_show = document.getElementById("prompt_show");
prompt_show.value = data.show;
}
}
var info_hints = new Map();
var prompts_data = new Map();
var cur_info_index = -1, cur_tmpl_index = -1;
var cur_prompt_index = -1;
async function loadTemplate(tmpl_id){
var lstJson = {};
lstJson["tmpl_id"] = tmpl_id;
lstJson["language"] = window.navigator.language;
try{
var response = await fetch("/gettmplbasic", {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(lstJson)
});
if(response.status == 200){
const json = await response.json();
if(json.status == "OK"){
var tmpl_name = document.getElementById("tmpl_name");
tmpl_name.value = json.tmpl_name;
var tmpl_cmt_textarea = document.getElementById("tmpl_cmt_textarea");
tmpl_cmt_textarea.value = json.tmpl_cmt;
var chk_public = document.getElementById("chk_public");
chk_public.checked = json.is_public == 1;
}else{
window.location.href = "/login.html";
}
}
response = await fetch("/gettmplother", {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({tmpl_id: tmpl_id, language: window.navigator.language})
});
if(response.status == 200){
const json = await response.json();
if(json.status == "OK"){
var sel_info = document.getElementById("sel_info");
sel_info.innerHTML = "";
info_hints.clear();
const info_blocks = json.info_blocks;
for (var i = 0; json.info_blocks && i < json.info_blocks.length; i++) {
var opt = document.createElement("option");
opt.value = json.info_blocks[i].id;
opt.innerHTML = json.info_blocks[i].name;
sel_info.appendChild(opt);
info_hints.set(json.info_blocks[i].id, json.info_blocks[i].cmmt);
}
var opt = document.createElement("option");
opt.value = "create-info";
opt.innerHTML = getI18NText(i18n_messages, 'label_create_info');
sel_info.appendChild(opt);
sel_info.options[0].selected = true;
cur_info_index = 0;
selectedInfo();
setPromptsPlaceholders();
prompts_data.clear();
var sel_prompt = document.getElementById("sel_prompt");
sel_prompt.innerHTML = "";
for (var i = 0; json.prompts && i < json.prompts.length; i++) {
var opt = document.createElement("option");
opt.value = json.prompts[i].id;
opt.innerHTML = json.prompts[i].show.substring(0, 30);
sel_prompt.appendChild(opt);
prompts_data.set(json.prompts[i].id, json.prompts[i]);
}
var opt = document.createElement("option");
opt.value = "create-prompt";
opt.innerHTML = getI18NText(i18n_messages, 'label_create_prompt');
sel_prompt.appendChild(opt);
sel_prompt.options[0].selected = true;
cur_prompt_index = 0;
selectedPrompt();
}else{
window.location.href = "/login.html";
}
}
}catch(err){
alert(getI18NText(i18n_messages, 'msg_sys_err'));
}finally{
hideSpinner();
}
}
async function changedPub(){
var sel_template = document.getElementById("sel_template");
var template_id = sel_template.options[sel_template.selectedIndex].value;
var is_public = document.getElementById("chk_public").checked?1:0;
var lstJson = {};
lstJson["tmpl_id"] = template_id;
lstJson["is_public"] = is_public;
fetch("/settmplpub", {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(lstJson)
});
}
function editedSomething(btn_id){
var btn_update = document.getElementById(btn_id);
btn_update.disabled = false;
}
function changingPage(){
var btn_info_update = document.getElementById("btn_info_update");
var btn_basic_update = document.getElementById("btn_basic_update");
var btn_prompts_update = document.getElementById("btn_prompts_update");
if(btn_info_update.disabled == false || btn_basic_update.disabled == false || btn_prompts_update.disabled == false ){
return confirm( getI18NText(i18n_messages, "msg_saving_alert") );
}
}
async function updateInfo(){
var info_cmt = document.getElementById("info_hint");
var info_name = document.getElementById("info_name");
if(info_cmt.value.length > 5000 || info_name.value.length > 100){
alert(getI18NText(i18n_messages, "msg_toolong_text"));
return;
}
showSpinner();
var sel_template = document.getElementById("sel_template");
var template_id = sel_template.options[sel_template.selectedIndex].value;
var sel_info = document.getElementById("sel_info");
var info_id = sel_info.options[sel_info.selectedIndex].value;
var lstJson = {};
lstJson["tmpl_id"] = template_id;
lstJson["info_name"] = info_name.value;
lstJson["info_cmt"] = info_hint.value;
lstJson["language"] = window.navigator.language;
if(info_id != "create-info")lstJson["info_id"] = info_id;
try{
var response = await fetch("/chksamenm", {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
type: 'info',
tmpl_id: template_id,
info_id: info_id,
info_name: info_name.value
}),
});
if(response.status == 200){
const resp = await response.json();
if(resp.status == "OK"){
if(resp.same == true){
alert(getI18NText(i18n_messages, 'msg_same_name'));
hideSpinner();
return;
}
}else window.location.href = "/login.html";
}else {
window.location.href = "/login.html";
}
var response = await fetch("/settmplinf", {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(lstJson)
});
if(response.status == 200){
const data = await response.json();
if(data.status == "OK"){
var btn_update = document.getElementById("btn_info_update");
btn_update.disabled = true;
if(info_id == "create-info"){
document.getElementById("btn_info_del").style.display='block';
var opt = document.createElement("option");
opt.value = data.info_id;
opt.innerHTML = info_name.value;
sel_info.insertBefore(opt, sel_info.options[sel_info.options.length - 1]);
sel_info.options[sel_info.options.length-2].selected = true;
cur_info_index = sel_info.options.length-2;
info_hints.set(data.info_id, info_hint.value);
}else{
sel_info.options[sel_info.selectedIndex].innerHTML = info_name.value;
info_hints.set(parseInt(info_id), info_hint.value);
}
hideSpinner();
}else{
window.location.href = "/login.html";
}
}else if (response.status == 440) {
window.location.href = "/login.html";
}
}catch(err){
alert(getI18NText(i18n_messages, 'msg_sys_err'));
}finally{
hideSpinner();
}
}
async function updatePrompt(){
var prompt_hint = document.getElementById("prompt_hint");
var prompt_head = document.getElementById("prompt_head");
var prompt_foot = document.getElementById("prompt_foot");
var prompt_show = document.getElementById("prompt_show");
if(prompt_hint.value.length > 500 || prompt_head.value.length > 500 || prompt_foot.value.length > 500 || prompt_show.value.length > 500){
alert(getI18NText(i18n_messages, "msg_toolong_text"));
return;
}
if(prompt_show.value.length == 0){
alert(getI18NText(i18n_messages, "msg_input_prmtshow_please"));
return;
}
showSpinner();
var sel_template = document.getElementById("sel_template");
var template_id = sel_template.options[sel_template.selectedIndex].value;
var sel_prompt = document.getElementById("sel_prompt");
var prompt_id = sel_prompt.options[sel_prompt.selectedIndex].value;
var lstJson = {};
lstJson["tmpl_id"] = template_id;
lstJson["prompt_hint"] = prompt_hint.value;
lstJson["prompt_head"] = prompt_head.value;
lstJson["prompt_foot"] = prompt_foot.value;
lstJson["prompt_show"] = prompt_show.value;
lstJson["language"] = window.navigator.language;
if(prompt_id != "create-prompt")lstJson["prompt_id"] = prompt_id;
try{
var response = await fetch("/settmplprmt", {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(lstJson)
});
if(response.status == 200){
const data = await response.json();
if(data.status == "OK"){
var btn_update = document.getElementById("btn_prompts_update");
btn_update.disabled = true;
if(prompt_id == "create-prompt"){
document.getElementById("btn_prompt_del").style.display='block';
var opt = document.createElement("option");
opt.value = data.prompt_id;
opt.innerHTML = prompt_show.value.substring(0, 30);
sel_prompt.insertBefore(opt, sel_prompt.options[sel_prompt.options.length - 1]);
sel_prompt.options[sel_prompt.options.length-2].selected = true;
cur_prompt_index = sel_prompt.options.length-2;
prompts_data.set(data.prompt_id, {
hint: prompt_hint.value,
head: prompt_head.value,
foot: prompt_foot.value,
show: prompt_show.value
});
}else{
sel_prompt.options[sel_prompt.selectedIndex].innerHTML = prompt_show.value.substring(0, 30);
prompts_data.set(parseInt(prompt_id), {
hint: prompt_hint.value,
head: prompt_head.value,
foot: prompt_foot.value,
show: prompt_show.value
});
}
hideSpinner();
}else{
window.location.href = "/login.html";
}
}else if (response.status == 440) {
window.location.href = "/login.html";
}
}catch(err){
alert(getI18NText(i18n_messages, 'msg_sys_err'));
}finally{
hideSpinner();
}
}
async function delInfo(){
var sel_template = document.getElementById("sel_template");
var template_id = sel_template.options[sel_template.selectedIndex].value;
var sel_info = document.getElementById("sel_info");
var info_id = sel_info.options[sel_info.selectedIndex].value;
if( confirm( getI18NText(i18n_messages, "msg_del_alert")+"\n"+ sel_info.options[sel_info.selectedIndex].innerHTML) == false ) return;
var lstJson = {};
lstJson["tmpl_id"] = template_id;
lstJson["info_id"] = info_id;
showSpinner();
try{
var response = await fetch("/deltmplinf", {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(lstJson)
});
if(response.status == 200){
const data = await response.json();
if(data.status == "OK"){
sel_info.remove(sel_info.selectedIndex);
info_hints.delete(parseInt(info_id));
sel_info.options[0].selected = true;
cur_info_index = 0;
selectedInfo();
hideSpinner();
}else{
window.location.href = "/login.html";
}
}else if (response.status == 440) {
window.location.href = "/login.html";
}
}catch(err){
alert(getI18NText(i18n_messages, 'msg_sys_err'));
}finally{
hideSpinner();
}
}
async function delPrompt(){
var sel_template = document.getElementById("sel_template");
var template_id = sel_template.options[sel_template.selectedIndex].value;
var sel_prompt = document.getElementById("sel_prompt");
var prompt_id = sel_prompt.options[sel_prompt.selectedIndex].value;
if( confirm( getI18NText(i18n_messages, "msg_del_alert")+"\n"+ sel_prompt.options[sel_prompt.selectedIndex].innerHTML) == false ) return;
var lstJson = {};
lstJson["tmpl_id"] = template_id;
lstJson["prompt_id"] = prompt_id;
showSpinner();
try{
var response = await fetch("/deltmplprmt", {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(lstJson)
});
if(response.status == 200){
const data = await response.json();
if(data.status == "OK"){
sel_prompt.remove(sel_prompt.selectedIndex);
prompts_data.delete(parseInt(prompt_id));
sel_prompt.options[0].selected = true;
cur_prompt_index = 0;
selectedPrompt();
hideSpinner();
}else{
window.location.href = "/login.html";
}
}else if (response.status == 440) {
window.location.href = "/login.html";
}
}catch(err){
alert(getI18NText(i18n_messages, 'msg_sys_err'));
}finally{
hideSpinner();
}
}
function showSpinner() {
document.getElementById("spinner").style.display = "block";
}
function hideSpinner() {
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" onclick="return changingPage();">
<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" onclick="return changingPage();">
<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" onclick="return changingPage();">
<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 active">
<a href="builder.html" class="menu-link" onclick="javascript:return false;">
<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">
<a href="mgr.html" class="menu-link" onclick="return changingPage();">
<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" onclick="return chnagingPage();">
<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">
<select class="form-select" id="sel_template" aria-label="selected tmpl" onchange="changedTemplate();">
</select>
</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</small -->
</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 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">
<div class="navbar-nav align-items-center"><p class="fw-semibold d-block" id="label_basic">Basic</p></div>
<button style="width:20%;float: right;white-space:nowrap;padding: 0.4rem 0;" class="btn btn-info" disabled="1" onclick="javascript:saveBasic();" id="btn_basic_update">Save</button>
</div>
<div class="card-body">
<input type="text" class="form-control" style="width: 96%;" placeholder="" id="tmpl_name" oninput="javascript:editedSomething('btn_basic_update');"><br>
<textarea class="form-control" style="width: 96%;height: 60pt;" placeholder="" id="tmpl_cmt_textarea" oninput="javascript:editedSomething('btn_basic_update');">
</textarea>
<p class="text-muted" style="margin-top: 10px;" id="label_info_length"></p>
</div>
</div>
</div>
<div class="col-md-12 col-lg-12 order-2 mb-4" id="div_public">
<div class="card h-100">
<div class="card-body">
<div class="form-check">
<input class="form-check-input" type="checkbox" value="1" id="chk_public" onchange="changedPub();">
<label class="form-check-label" for="chk_public" id="label_public">
Public in Space market
</label>
</div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-12 order-2 mb-4" id="div_info">
<div class="card h-100">
<div class="card-header d-flex align-items-center justify-content-between">
<div class="row" style="width: 100%;">
<div class="col-md-6 col-lg-3 order-2 mb-4">
<div class="navbar-nav align-items-center"><p class="fw-semibold d-block" id="label_info">Info</p></div>
</div>
<div class="col-md-6 col-lg-3 order-2 mb-4">
<div class="navbar-nav align-items-center">
<div class="nav-item d-flex align-items-center">
<select class="form-select" id="sel_info" aria-label="selected info" onchange="selectedInfo();">
</select>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3 order-2 mb-4">
<button style="width:100%;max-width:200pt;float:right;white-space:nowrap;display: none;padding: 0.4rem 0;" class="btn btn-danger" onclick="javascript:delInfo();" id="btn_info_del">Delete</button>
</div>
<div class="col-md-6 col-lg-3 order-2 mb-4">
<button style="width:100%;max-width:200pt;float: right;white-space:nowrap;padding: 0.4rem 0;" class="btn btn-info" disabled="1" onclick="javascript:updateInfo();" id="btn_info_update">Update</button>
</div>
</div>
</div>
<div class="card-body">
<input type="text" class="form-control" style="width: 96%;" placeholder="" id="info_name" oninput="javascript:editedSomething('btn_info_update');"><br>
<textarea class="form-control" style="width: 96%;height: 60pt;" placeholder="" id="info_hint" oninput="javascript:editedSomething('btn_info_update');">
</textarea>
<p class="text-muted" style="margin-top: 10px;" id="label_info_cmt"></p>
</div>
</div>
</div>
<div class="col-md-12 col-lg-12 order-2 mb-4" id="div_prompts">
<div class="card h-100">
<div class="card-header d-flex align-items-center justify-content-between">
<div class="row" style="width: 100%;">
<div class="col-md-6 col-lg-3 order-2 mb-4">
<div class="navbar-nav align-items-center"><p class="fw-semibold d-block" id="label_prompts">Prompts</p></div>
</div>
<div class="col-md-6 col-lg-3 order-2 mb-4">
<div class="navbar-nav align-items-center">
<div class="nav-item d-flex align-items-center">
<select class="form-select" id="sel_prompt" aria-label="selected prompt" onchange="javascript:selectedPrompt();return false;">
</select>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3 order-2 mb-4">
<button style="width:100%;max-width:200pt;float: right;white-space:nowrap;display: none;padding: 0.4rem 0;" class="btn btn-danger" onclick="javascript:delPrompt();" id="btn_prompt_del">Delete</button>
</div>
<div class="col-md-6 col-lg-3 order-2 mb-4">
<button style="width:100%;max-width:200pt;float: right;white-space:nowrap;padding: 0.4rem 0;" class="btn btn-info" disabled="1" onclick="javascript:updatePrompt();" id="btn_prompts_update">Update</button>
</div>
</div>
</div>
<div class="card-body">
<textarea class="form-control" style="width: 96%;height: 100pt;" placeholder="" id="prompt_hint" oninput="javascript:editedSomething('btn_prompts_update');">
</textarea><br>
<textarea class="form-control" style="width: 96%;height: 100pt;border-width: 2pt;" placeholder="" id="prompt_head" oninput="javascript:editedSomething('btn_prompts_update');">
</textarea><br>
<textarea class="form-control" style="width: 96%;height: 100pt;" placeholder="" id="prompt_show" oninput="javascript:editedSomething('btn_prompts_update');">
</textarea><br>
<textarea class="form-control" style="width: 96%;height: 100pt;border-width: 2pt;" placeholder="" id="prompt_foot" oninput="javascript:editedSomething('btn_prompts_update');">
</textarea><br>
<p class="text-muted" style="margin-top: 10px;" id="label_prompt_length"></p>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="spinner" class="spinner">
<div class="spinner-icon"></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>
<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>