193 lines
5 KiB
JavaScript
193 lines
5 KiB
JavaScript
if(!window.aiBrowseMiniProgram) window.aiBrowseMiniProgram = {};
|
|
|
|
let firstGenerate = true;
|
|
let aiChatView = null;
|
|
const fieldArr = Array.from(Object.values(fields));
|
|
|
|
/**
|
|
* Format datetime.
|
|
*
|
|
* @param {Date?} date
|
|
* @returns {string}
|
|
*/
|
|
function formatDateTime(date = new Date())
|
|
{
|
|
const year = date.getFullYear();
|
|
const month = date.getMonth() + 1;
|
|
const day = date.getDate();
|
|
const hours = date.getHours();
|
|
const minutes = date.getMinutes();
|
|
|
|
const formattedDate = `${year}/${month}/${day}`;
|
|
const formattedTime = `${hours}:${minutes < 10 ? '0' + minutes : minutes}`;
|
|
|
|
return `${formattedDate} ${formattedTime}`;
|
|
}
|
|
|
|
/**
|
|
* Get form value map.
|
|
*/
|
|
function getFormValue()
|
|
{
|
|
const fieldValueMap = new Map();
|
|
fieldArr.forEach(field =>
|
|
{
|
|
const {id, name} = field;
|
|
let $field = $(`[name="field-${id}"]`);
|
|
if(!$field.length) $field = $(`.form-group[data-name="${name}"]`).find('input,textarea,select');
|
|
const picker = zui.FormHelper.globalControls.picker($field, $('#miniProgramForm'));
|
|
fieldValueMap.set(name, picker ? picker.getVal() : $field.prop('value'));
|
|
});
|
|
return fieldValueMap;
|
|
}
|
|
|
|
/**
|
|
* Get required fields.
|
|
*
|
|
* @returns {string[]}
|
|
*/
|
|
function getRequiredFields()
|
|
{
|
|
return fieldArr
|
|
.filter(field => field.required === '1')
|
|
.map(field => field.name);
|
|
}
|
|
|
|
/**
|
|
* Generate prompt string.
|
|
*
|
|
* @param {Map<string, string>} fieldArr
|
|
* @returns {string}
|
|
*/
|
|
function generatePrompt(fieldArr)
|
|
{
|
|
let promptStr = prompt;
|
|
fieldArr.forEach((value, key) =>
|
|
{
|
|
promptStr = promptStr.replace(new RegExp(`\\s<${key}>\\s`, 'g'), value);
|
|
promptStr = promptStr.replace(new RegExp(`\\s<${key}>\\s`, 'g'), value);
|
|
});
|
|
return promptStr;
|
|
}
|
|
|
|
/**
|
|
* Check required fields.
|
|
*
|
|
* @param {string[]} requiredFieldNames
|
|
* @param {Map<string, string>} fieldArr
|
|
* @returns {true|string}
|
|
*/
|
|
function checkRequiredFields(requiredFieldNames, fieldArr)
|
|
{
|
|
for(const name of requiredFieldNames)
|
|
{
|
|
if(!fieldArr.has(name) || !fieldArr.get(name)) return name;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Clear error tip.
|
|
*/
|
|
function clearErrorTip()
|
|
{
|
|
$('.form-container').find('.has-error').removeClass('has-error');
|
|
$('.form-container').find('.form-tip').remove();
|
|
}
|
|
|
|
/**
|
|
* Send message to ai.
|
|
*
|
|
* @param {string} message
|
|
* @param {boolean} renew
|
|
*/
|
|
function sendMessagesToAI(message, renew)
|
|
{
|
|
const postOptions = {content: message, chat: {userPrompt: message, type: 'miniprogram', contexts: [{code: 'zentao-knowledgeLibs', data: {memory: {collections: (knowledgeLibs || '').split(',').filter(Boolean).map(x => `zentao:${x}`)}}}]}};
|
|
aiChatView.$.postMessage(postOptions);
|
|
}
|
|
|
|
window.aiBrowseMiniProgram.initAIChatView = function(options)
|
|
{
|
|
const $aiChatView = $('#aiChatView');
|
|
aiChatView = parent.zui.create('AIChatView', $aiChatView, $.extend({$notDestroyOnDetach: true}, options, {isEmbed: true}));
|
|
if(!parent.isZaiOK) $('.generate-btn').addClass('disabled');
|
|
};
|
|
|
|
window.aiBrowseMiniProgram.startAIChat = function()
|
|
{
|
|
clearErrorTip();
|
|
const fieldArr = getFormValue();
|
|
const requiredFieldNames = getRequiredFields();
|
|
const result = checkRequiredFields(requiredFieldNames, fieldArr);
|
|
if(typeof result === 'string')
|
|
{
|
|
const $container = $('.form-container').find(`[data-name="${result}"]`);
|
|
const fid = $container.attr('data-fid');
|
|
const $formGroup = $container.closest('.form-group');
|
|
$formGroup
|
|
.attr('name', `field-${fid}`)
|
|
.addClass('has-error')
|
|
.append(`<div class="form-tip" id="field-${fid}Tip">${emptyNameWarning.replace('%s', result)}</div>`);
|
|
return;
|
|
}
|
|
|
|
const promptStr = generatePrompt(fieldArr);
|
|
if(firstGenerate)
|
|
{
|
|
$(this).text(regenerateLang);
|
|
firstGenerate = false;
|
|
}
|
|
sendMessagesToAI(promptStr, true);
|
|
};
|
|
|
|
window.aiBrowseMiniProgram.handleStarBtnClick = function()
|
|
{
|
|
const $btn = $(this);
|
|
const url = $btn.attr('data-url');
|
|
$.get(url, function (response)
|
|
{
|
|
if(response.status == '1')
|
|
{
|
|
$btn.children('img').attr('src', 'static/svg/star.svg');
|
|
$btn.attr('data-url', $btn.attr('data-url').replace('false', 'true'));
|
|
}
|
|
else
|
|
{
|
|
$btn.children('img').attr('src', 'static/svg/star-empty.svg');
|
|
$btn.attr('data-url', $btn.attr('data-url').replace('true', 'false'));
|
|
}
|
|
}, 'json');
|
|
};
|
|
|
|
window.aiBrowseMiniProgram.handleRestBtnClick = function()
|
|
{
|
|
try
|
|
{
|
|
$('.form-container .picker-box').each(function()
|
|
{
|
|
$(this).zui('picker').$.clear();
|
|
});
|
|
$('.form-container .form-group .form-field').val('');
|
|
}
|
|
catch (error) {}
|
|
};
|
|
|
|
window.aiBrowseMiniProgram.backToSquare = function()
|
|
{
|
|
window.location.href = $.createLink('aiapp', 'square');
|
|
};
|
|
|
|
window.onPageUnmount = function()
|
|
{
|
|
if(aiChatView) aiChatView.destroy();
|
|
};
|
|
|
|
$(function()
|
|
{
|
|
$('#reload-current').on('click', () =>
|
|
{
|
|
loadCurrentPage('.mini-program');
|
|
});
|
|
});
|