aiapp->regenerate);
jsVar('emptyNameWarning', $lang->aiapp->emptyNameWarning);
jsVar('clearContextLang', $lang->aiapp->clearContext);
jsVar('newChatTip', $lang->aiapp->newChatTip);
jsVar('newVersionTip', $lang->aiapp->newVersionTip);
jsVar('prompt', $miniProgram->prompt);
jsVar('postLink', createLink('aiapp', 'miniProgramChat', "id={$miniProgram->id}"));
jsVar('messages', $messages);
jsVar('isAppDisabled', $miniProgram->published === '0');
jsVar('hasModels', $hasModels);
jsVar('pathname', $miniProgram->name);
$app->loadLang('ai');
$isDeleted = $miniProgram->deleted === '1';
$formGroups = array();
if(count($fields) !== 0)
{
foreach($fields as $field)
{
if($field->type === 'textarea')
{
$control = textarea(
set::rows(1),
set::name("field-{$field->id}"),
set::placeholder($field->placeholder),
set::disabled($isDeleted || !$hasModels),
set::className('form-field'),
setData('name', $field->name),
setData('fid', $field->id)
);
}
elseif($field->type === 'radio')
{
$options = explode(',', $field->options);
$control = picker(
set::name("field-{$field->id}"),
set::items(array_combine($options, $options)),
set::disabled($isDeleted || !$hasModels),
setData('name', $field->name),
setData('fid', $field->id)
);
}
elseif($field->type === 'checkbox')
{
$options = explode(',', $field->options);
$control = picker(
set::name("field-{$field->id}"),
set::items(array_combine($options, $options)),
set::multiple(true),
set::disabled($isDeleted || !$hasModels),
setData('name', $field->name),
setData('fid', $field->id)
);
}
else
{
$control = input(
set::name("field-{$field->id}"),
set::placeholder($field->placeholder),
set::disabled($isDeleted || !$hasModels),
set::className('form-field'),
setData('name', $field->name),
setData('fid', $field->id)
);
}
$formGroups[] = formGroup(
set::label($field->name),
set::required($field->required === '1'),
$control
);
}
}
jsVar('fields', $fields);
list($iconName, $iconTheme) = explode('-', $miniProgram->icon);
$star = in_array($miniProgram->id, $collectedIDs) ? 'star' : 'star-empty';
$delete = $star === 'star' ? 'true' : 'false';
btn(
setClass('hidden'),
setID('open-dialog'),
setData('toggle', 'modal'),
setData('target', '#disabled-dialog')
);
div(
setClass('modal'),
setData('backdrop', 'static'),
setID('disabled-dialog'),
div(
setClass('modal-dialog shadow size-sm bd-none'),
div(
setClass('modal-content'),
div(
setClass('modal-body'),
html(''),
$lang->aiapp->disabledTip
),
div(
setClass('modal-footer'),
btn(
setClass('primary'),
setData('dismiss', 'modal'),
on::click('window.aiBrowseMiniProgram.backToSquare'),
$lang->confirm
)
)
)
)
);
$starBtn = common::hasPriv('aiapp', 'collectMiniProgram')
? btn(
setClass('ghost btn-star absolute'),
set::size('md'),
setData('url', createLink('aiapp', 'collectMiniProgram', "appID={$miniProgram->id}&delete={$delete}")),
on::click('window.aiBrowseMiniProgram.handleStarBtnClick'),
html(html::image("static/svg/{$star}.svg", "class='$star'")),
$lang->aiapp->collect
)
: null;
$generateBtn = common::hasPriv('aiapp', 'miniProgramChat')
? btn(
setClass('primary block w-full generate-btn'),
set::disabled($isDeleted),
$lang->aiapp->generate,
on::click('window.aiBrowseMiniProgram.startAIChat')
)
: null;
$inputContainer = common::hasPriv('aiapp', 'miniProgramChat')
? div(
setClass('input-container'),
setClass(array('hidden' => !empty($messages))),
html(<<
END),
html(""),
btn(
setClass('ghost send-btn'),
on::click('window.aiBrowseMiniProgram.clearInputAndChat'),
html(<<
END)
)
)
: null;
div(
setClass('mini-program fixed flex'),
div(
setClass('detail col shadow-md h-full flex-none'),
div(
setClass('header relative flex flex-none'),
div(
setID('program-avatar'),
setClass('program-avatar center flex-none'),
setStyle(array('border' => "1px solid {$config->ai->miniPrograms->themeList[$iconTheme][1]}", 'background-color' => $config->ai->miniPrograms->themeList[$iconTheme][0])),
html($config->ai->miniPrograms->iconList[$iconName])
),
div(
setClass('content flex-1 overflow-hidden'),
div(
setClass('title pb-2 ellipsis'),
set::title($miniProgram->name),
$miniProgram->name
),
div(
setClass('desc'),
set::title($miniProgram->desc),
$miniProgram->desc
)
),
$isDeleted
? label(
setClass('danger'),
$lang->aiapp->deleted
)
: $starBtn
),
div(
setClass('body col overflow-hidden', empty($formGroups) ? 'flex-none' : 'flex-1'),
div(
setClass('language-model flex flex-none justify-between items-center'),
div(
setClass('content flex gap-2.5'),
span(
setStyle(array('color' => 'var(--color-slate-700)')),
$lang->aiapp->modelCurrent
),
span($models[$miniProgram->model]),
),
empty($formGroups)
? null
: btn(
setClass('ghost'),
set::size('md'),
set::disabled($isDeleted),
set::icon('trash'),
$lang->aiapp->clear,
on::click('window.aiBrowseMiniProgram.handleRestBtnClick')
)
),
empty($formGroups)
? null
: div(
setClass('form-container p-1 flex-1 overflow-y-auto'),
form(
set::grid(false),
set::actions(array()),
$formGroups
)
)
),
div(
setClass('footer flex-none'),
$generateBtn
)
),
div(
setClass('chat chat-nohistory shadow-md flex-1 center'),
setClass(array('hidden' => !empty($messages))),
div(
setClass('chat-tip flex'),
html(<<
END),
$lang->aiapp->chatTip
)
),
div(
setClass('chat chat-nomodel shadow-md flex-1 center hidden'),
div(
p(
icon(set::name('exclamation'), setClass('mr-2'), setStyle(array('color' => 'rgb(255, 159, 70)'))),
html($lang->aiapp->noModel[0])
),
p(html($lang->aiapp->noModel[1]), setStyle('padding-left', '22px'))
)
),
div(
setClass('chat chat-history shadow-md flex-1 col'),
setClass(array('hidden' => empty($messages))),
div(
setClass('flex-1 message-list'),
),
$inputContainer
)
);
render();