* add square page.

This commit is contained in:
dingyongliang
2024-02-19 14:35:38 +08:00
parent 509d069235
commit 453b24f3db
17 changed files with 316 additions and 14 deletions
+39
View File
@@ -135,6 +135,45 @@ class ai extends control
$this->display();
}
public function square($category = 'discovery', $recTotal = 0, $recPerPage = 15, $pageID = 1)
{
$this->app->loadClass('pager', true);
$pager = new pager($recTotal, $recPerPage, $pageID);
$collectedIDs = null;
if($category === 'collection')
{
$collectedIDs = $this->ai->getCollectedMiniProgramIDs($this->app->user->id, $pager);
$miniPrograms = $this->ai->getMiniProgramsByID($collectedIDs);
}
else if($category === 'discovery')
{
}
else if($category === 'latest')
{
$miniPrograms = $this->ai->getMiniPrograms('', 'active', 'createdDate_desc', $pager);
}
else
{
$miniPrograms = $this->ai->getMiniPrograms($category, 'active', 'createdDate_desc', $pager);
}
$this->view->collectedIDs = empty($collectedIDs) ? $this->ai->getCollectedMiniProgramIDs($this->app->user->id) : $collectedIDs;
$this->view->category = $category;
$this->view->categoryList = array_merge($this->lang->ai->miniPrograms->squareCategories, $this->lang->ai->miniPrograms->categoryList, $this->ai->getCustomCategory());
$this->view->pager = $pager;
$this->view->miniPrograms = $miniPrograms ?: array();
$this->view->title = $this->lang->ai->miniPrograms->common;
$this->display();
}
public function collectMiniProgram($appID, $delete = 'false')
{
$this->ai->collectMiniProgram($this->app->user->id, $appID, $delete);
return $this->send(array('status' => ($delete === 'true' ? '0' : '1')));
}
/**
* List mini programs.
*
+89
View File
@@ -0,0 +1,89 @@
.miniprogram-container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
gap: 8px;
background: #FCFDFE;
padding: 8px;
}
.miniprogram-card {
position: relative;
border-radius: 2px;
border: 1px solid #EEE;
background-color: #FCFDFE;
height: 140px;
padding: 16px;
display: flex;
flex-direction: column;
overflow: hidden;
gap: 6px;
}
.program-content {
display: flex;
flex-wrap: nowrap;
flex: auto;
overflow: hidden;
gap: 16px;
}
.program-text {
height: 100%;
overflow: hidden;
flex: auto;
}
.program-text .title {
margin-bottom: 16px;
font-size: 13px;
font-weight: 400;
}
.program-text .desc {
font-size: 12px;
color: #838A9D;
display: -webkit-box;
overflow: hidden;
text-overflow: ellipsis;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.program-avatar {
display: flex;
align-items: center;
flex: none;
}
.program-actions {
display: flex;
justify-content: space-between;
align-items: center;
flex: none;
}
.program-actions .badge {
font-size: 12px;
color: #313C52;
border: 1px solid #DEDEDE;
padding: 4px;
border-radius: 3px;
display: flex;
justify-content: center;
align-items: center;
height: 20px;
max-width: 120px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.table-footer {
margin-top: 8px;
}
.btn-star {
display: flex;
align-items: center;
gap: 2px;
}
+21
View File
@@ -0,0 +1,21 @@
$(function()
{
$('.btn-star').on('click', function()
{
const $btn = $(this);
const url = $btn.data('url');
$.get(url, function(response)
{
if(response.status == '1')
{
$btn.children('img').attr('src', 'static/svg/star.svg');
$btn.data('url', $btn.data('url').replace('false', 'true'));
}
else
{
$btn.children('img').attr('src', 'static/svg/star-empty.svg');
$btn.data('url', $btn.data('url').replace('true', 'false'));
}
}, 'json');
});
});
+4 -1
View File
@@ -415,9 +415,12 @@ $lang->ai->miniPrograms->download = 'Download Zentao Client';
$lang->ai->miniPrograms->category = 'Category';
$lang->ai->miniPrograms->icon = 'Icon';
$lang->ai->miniPrograms->desc = 'Introduction';
$lang->ai->miniPrograms->categoryList = array('writing' => 'writing', 'statistics' => 'statistics', 'creative' => 'creative', 'raiders' => 'Guideline ', 'schedule' => 'schedule');
$lang->ai->miniPrograms->categoryList = array('writing' => 'Writing', 'statistics' => 'Statistics', 'creative' => 'Creative', 'raiders' => 'Guideline ', 'schedule' => 'Schedule');
$lang->ai->miniPrograms->modelList = array('openai-GPT35 ' => 'openai/GPT-3.5');
$lang->ai->miniPrograms->allCategories = array('' => 'All categories');
$lang->ai->miniPrograms->squareCategories = array('collection' => 'My collection', 'discovery' => 'Discovery', 'latest' => 'Latest');
$lang->ai->miniPrograms->collect = 'Collect';
$lang->ai->miniPrograms->more = 'More';
$lang->ai->miniPrograms->iconModification = 'Icon modification';
$lang->ai->miniPrograms->customBackground = 'Custom background Color';
$lang->ai->miniPrograms->customIcon = 'Custom icon';
+4 -1
View File
@@ -415,9 +415,12 @@ $lang->ai->miniPrograms->download = 'Download Zentao Client';
$lang->ai->miniPrograms->category = 'Category';
$lang->ai->miniPrograms->icon = 'Icon';
$lang->ai->miniPrograms->desc = 'Introduction';
$lang->ai->miniPrograms->categoryList = array('writing' => 'writing', 'statistics' => 'statistics', 'creative' => 'creative', 'raiders' => 'Guideline ', 'schedule' => 'schedule');
$lang->ai->miniPrograms->categoryList = array('writing' => 'Writing', 'statistics' => 'Statistics', 'creative' => 'Creative', 'raiders' => 'Guideline ', 'schedule' => 'Schedule');
$lang->ai->miniPrograms->modelList = array('openai-GPT35 ' => 'openai/GPT-3.5');
$lang->ai->miniPrograms->allCategories = array('' => 'All categories');
$lang->ai->miniPrograms->squareCategories = array('collection' => 'My collection', 'discovery' => 'Discovery', 'latest' => 'Latest');
$lang->ai->miniPrograms->collect = 'Collect';
$lang->ai->miniPrograms->more = 'More';
$lang->ai->miniPrograms->iconModification = 'Icon modification';
$lang->ai->miniPrograms->customBackground = 'Custom background Color';
$lang->ai->miniPrograms->customIcon = 'Custom icon';
+4 -1
View File
@@ -415,9 +415,12 @@ $lang->ai->miniPrograms->download = 'Download Zentao Client';
$lang->ai->miniPrograms->category = 'Category';
$lang->ai->miniPrograms->icon = 'Icon';
$lang->ai->miniPrograms->desc = 'Introduction';
$lang->ai->miniPrograms->categoryList = array('writing' => 'writing', 'statistics' => 'statistics', 'creative' => 'creative', 'raiders' => 'Guideline ', 'schedule' => 'schedule');
$lang->ai->miniPrograms->categoryList = array('writing' => 'Writing', 'statistics' => 'Statistics', 'creative' => 'Creative', 'raiders' => 'Guideline ', 'schedule' => 'Schedule');
$lang->ai->miniPrograms->modelList = array('openai-GPT35 ' => 'openai/GPT-3.5');
$lang->ai->miniPrograms->allCategories = array('' => 'All categories');
$lang->ai->miniPrograms->squareCategories = array('collection' => 'My collection', 'discovery' => 'Discovery', 'latest' => 'Latest');
$lang->ai->miniPrograms->collect = 'Collect';
$lang->ai->miniPrograms->more = 'More';
$lang->ai->miniPrograms->iconModification = 'Icon modification';
$lang->ai->miniPrograms->customBackground = 'Custom background Color';
$lang->ai->miniPrograms->customIcon = 'Custom icon';
+3
View File
@@ -417,6 +417,9 @@ $lang->ai->miniPrograms->icon = '图标';
$lang->ai->miniPrograms->desc = '简介';
$lang->ai->miniPrograms->categoryList = array('writing' => '写作', 'statistics' => '统计', 'creative' => '创意', 'raiders' => '攻略', 'schedule' => '日程');
$lang->ai->miniPrograms->allCategories = array('' => '所有分组');
$lang->ai->miniPrograms->squareCategories = array('collection' => '我的收藏', 'discovery' => '发现', 'latest' => '最新');
$lang->ai->miniPrograms->collect = '收藏';
$lang->ai->miniPrograms->more = '更多';
$lang->ai->miniPrograms->modelList = array('openai-gpt35' => 'OpenAI / GPT-3.5');
$lang->ai->miniPrograms->iconModification = '图标修改';
$lang->ai->miniPrograms->customBackground = '自定义背景色';
+51 -2
View File
@@ -310,7 +310,22 @@ class aiModel extends model
}
/**
* Get mini program by app id.
* Get mini programs by appid.
*
* @param array $id
* @access public
* @return object
*/
public function getMiniProgramsByID($ids)
{
return $this->dao->select('*')
->from(TABLE_MINIPROGRAM)
->where('id')->in($ids)
->fetchAll();
}
/**
* Get mini program by appid.
*
* @param string $id
* @access public
@@ -324,6 +339,40 @@ class aiModel extends model
->fetch();
}
public function getCollectedMiniProgramIDs($userID, $pager = null)
{
$programs = $this->dao->select('*')
->from(TABLE_MINIPROGRAMSTAR)
->where('userID')->eq($userID)
->orderBy('createdDate_desc')
->page($pager)
->fetchAll('appID');
return array_keys($programs);
}
public function collectMiniProgram($userID, $appID, $delete = 'false')
{
if($delete === 'true')
{
$this->dao->delete()
->from(TABLE_MINIPROGRAMSTAR)
->where('userID')->eq($userID)
->andWhere('appID')->eq($appID)
->exec();
return !dao::isError();
}
$data = new stdClass();
$data->appID = $appID;
$data->userID = $userID;
$data->createdDate = helper::now();
$this->dao->insert(TABLE_MINIPROGRAMSTAR)
->data($data)
->exec();
return !dao::isError();
}
public function getCustomCategory()
{
return $this->dao->select('`key`,`value`')
@@ -401,7 +450,7 @@ class aiModel extends model
->orderBy($order)
->page($pager)
->fetchAll();
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'miniProgram');
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'miniprogram');
return $progarms;
}
+10 -9
View File
@@ -1,4 +1,5 @@
<?php
/**
* The ai mini programs view file of ai module of ZenTaoPMS.
*
@@ -11,7 +12,7 @@
?>
<?php include '../../common/view/header.html.php'; ?>
<?php
$finalList = array_merge($categoryList, $lang->ai->miniPrograms->allCategories);
$finalList = array_merge($categoryList, $lang->ai->miniPrograms->allCategories);
?>
<div id="mainMenu" class="clearfix">
<div id="sidebarHeader">
@@ -103,8 +104,8 @@
<table class="main-table table has-sort-head table-fixed">
<thead>
<tr>
<?php $vars = "category=$category&status=$status&orderBy=%s&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}";?>
<th class="c-id" style="width: 70px;"><?php common::printOrderLink('id', $orderBy, $vars, 'ID');?></th>
<?php $vars = "category=$category&status=$status&orderBy=%s&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}"; ?>
<th class="c-id" style="width: 70px;"><?php common::printOrderLink('id', $orderBy, $vars, 'ID'); ?></th>
<th class="c-name" style="width: 30%;"><?= $lang->prompt->name; ?></th>
<th class="c-status"><?= $lang->prompt->status; ?></th>
<th class="c-category"><?= $lang->prompt->module; ?></th>
@@ -127,9 +128,9 @@
<td class="c-actions">
<?php $isPublished = $miniProgram->published === '1'; ?>
<?php
echo $isPublished
? "<button class='btn' disabled title='{$lang->ai->prompts->action->edit}'><i class='icon-edit text-primary'></i></button>"
: "<a class='btn' title='{$lang->ai->prompts->action->edit}' href='{$this->createLink('ai', 'createMiniProgram', "appID=$miniProgram->id")}'><i class='icon-edit text-primary'></i></a>";
echo $isPublished
? "<button class='btn' disabled title='{$lang->ai->prompts->action->edit}'><i class='icon-edit text-primary'></i></button>"
: "<a class='btn' title='{$lang->ai->prompts->action->edit}' href='{$this->createLink('ai', 'createMiniProgram', "appID=$miniProgram->id")}'><i class='icon-edit text-primary'></i></a>";
?>
<button
class="btn iframe"
@@ -156,9 +157,9 @@
</tbody>
</table>
<div class='table-footer'>
<div class="table-statistic"><?= sprintf($lang->ai->miniPrograms->summary, count($miniPrograms));?></div>
<?php $pager->show('right', 'pagerjs');?>
</div>
<div class="table-statistic"><?= sprintf($lang->ai->miniPrograms->summary, count($miniPrograms)); ?></div>
<?php $pager->show('right', 'pagerjs'); ?>
</div>
</div>
</div>
</div>
+81
View File
@@ -0,0 +1,81 @@
<?php
/**
* The ai mini programs view file of ai module of ZenTaoPMS.
*
* @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
* @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
* @author Wenrui LI <liwenrui@easycorp.ltd>
* @package ai
* @link https://www.zentao.net
*/
?>
<?php include '../../common/view/header.html.php'; ?>
<div id="mainMenu">
<div class="btn-toolbar pull-left">
<?php if(count($categoryList) <= 9): ?>
<?php foreach($categoryList as $key => $value): ?>
<a href="<?= $this->createLink('ai', 'square', "category=$key"); ?>" class="btn btn-link<?php if($category === $key) echo ' btn-active-text'; ?>">
<span class="text"><?= $value; ?></span>
<?= $category === $key ? '<span class="label label-light label-badge" style="margin-left: 4px;">' . $pager->recTotal . '</span>' : ''; ?>
</a>
<?php endforeach; ?>
<?php else : ?>
<?php foreach(array_slice($categoryList, 0, 8) as $key => $value): ?>
<a href="<?= $this->createLink('ai', 'square', "category=$key"); ?>" class="btn btn-link<?php if($category === $key) echo ' btn-active-text'; ?>">
<span class="text"><?= $value; ?></span>
<?= $category === $key ? '<span class="label label-light label-badge" style="margin-left: 4px;">' . $pager->recTotal . '</span>' : ''; ?>
</a>
<?php endforeach; ?>
<div class="btn-group">
<?php $moreCategoryList = array_slice($categoryList, 8); ?>
<a class="btn btn-link" data-toggle="dropdown"><?= array_key_exists($category, $moreCategoryList) ? ($moreCategoryList[$category] . '<span class="label label-light label-badge" style="margin-left: 4px;">' . $pager->recTotal . '</span>') : $lang->ai->miniPrograms->more; ?><span class="caret"></span></a>
<ul class="dropdown-menu">
<?php foreach($moreCategoryList as $key => $value): ?>
<li <?php if($category === $key) echo 'class="active"'; ?>><a href="<?= $this->createLink('ai', 'square', "category=$key"); ?>"><?= $value; ?></a></li>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
</div>
</div>
<div id="mainContent" class="main-row fade">
<div class="miniprogram-container">
<?php foreach($miniPrograms as $miniProgram) : ?>
<div class="miniprogram-card">
<div class="program-content">
<div class="program-text">
<header class="title">
<?= $miniProgram->name; ?>
</header>
<div class="desc">
<?= $miniProgram->desc; ?>
</div>
</div>
<div class="program-avatar">
<?php list($iconName, $iconTheme) = explode('-', $miniProgram->icon); ?>
<button class="btn btn-icon" style="width: 46px; height: 46px; border-radius: 50%; display: flex; justify-content: center; align-items: center; border: 1px solid <?= $config->ai->miniPrograms->themeList[$iconTheme][1]; ?>; background-color: <?= $config->ai->miniPrograms->themeList[$iconTheme][0]; ?>">
<?= $config->ai->miniPrograms->iconList[$iconName]; ?>
</button>
</div>
</div>
<div class="program-actions">
<div class="badge"><?= $categoryList[$miniProgram->category]; ?></div>
<?php
$star = in_array($miniProgram->id, $collectedIDs) ? 'star' : 'star-empty';
$delete = $star === 'star' ? 'true' : 'false';
?>
<button class="btn btn-link btn-star" data-url="<?= $this->createLink('ai', 'collectMiniProgram', "appID={$miniProgram->id}&delete={$delete}"); ?>">
<?= html::image("static/svg/{$star}.svg", "class='$star'");?>
<?= $lang->ai->miniPrograms->collect; ?>
</button>
</div>
</div>
<?php endforeach; ?>
</div>
<div class='table-footer'>
<div class="table-statistic"><?= sprintf($lang->ai->miniPrograms->summary, count($miniPrograms)); ?></div>
<?php $pager->show('right', 'pagerjs'); ?>
</div>
</div>
<?php include '../../common/view/footer.html.php'; ?>
+1
View File
@@ -24,6 +24,7 @@ $lang->review = new stdclass();
$lang->milestone = new stdclass();
$lang->qa = new stdclass();
$lang->doc = new stdclass();
$lang->ai = new stdclass();
$lang->system = new stdclass();
$lang->testcase = new stdclass();
$lang->testtask = new stdclass();
+1
View File
@@ -181,6 +181,7 @@ $lang->kanban->common = 'Kanban';
$lang->qa->common = 'QA';
$lang->devops->common = 'DevOps';
$lang->doc->common = 'Doc';
$lang->ai->miniProgram = 'mini program';
$lang->repo->common = 'Code Repo';
$lang->repo->codeRepo = 'Code Repo';
$lang->bi->common = 'BI';
+1
View File
@@ -181,6 +181,7 @@ $lang->kanban->common = 'Kanban';
$lang->qa->common = 'QA';
$lang->devops->common = 'DevOps';
$lang->doc->common = 'Doc';
$lang->ai->miniProgram = 'mini program';
$lang->repo->common = 'Code Repo';
$lang->repo->codeRepo = 'Code Repo';
$lang->bi->common = 'BI';
+1
View File
@@ -181,6 +181,7 @@ $lang->kanban->common = 'Kanban';
$lang->qa->common = 'QA';
$lang->devops->common = 'DevOps';
$lang->doc->common = 'Doc';
$lang->ai->miniProgram = 'mini program';
$lang->repo->common = 'Code Repo';
$lang->repo->codeRepo = 'Code Repo';
$lang->bi->common = 'BI';
+4
View File
@@ -9,6 +9,7 @@ $lang->navIcons['qa'] = "<i class='icon icon-test'></i>";
$lang->navIcons['devops'] = "<i class='icon icon-devops'></i>";
$lang->navIcons['kanban'] = "<i class='icon icon-kanban'></i>";
$lang->navIcons['doc'] = "<i class='icon icon-doc'></i>";
$lang->navIcons['ai'] = "<i class='icon icon-ztf'></i>";
$lang->navIcons['bi'] = "<i class='icon icon-statistic'></i>";
$lang->navIcons['system'] = "<i class='icon icon-group'></i>";
$lang->navIcons['admin'] = "<i class='icon icon-cog-outline'></i>";
@@ -23,6 +24,7 @@ $lang->navIconNames['qa'] = 'test';
$lang->navIconNames['devops'] = 'devops';
$lang->navIconNames['kanban'] = 'kanban';
$lang->navIconNames['doc'] = 'doc';
$lang->navIconNames['ai'] = 'ztf';
$lang->navIconNames['bi'] = 'statistic';
$lang->navIconNames['system'] = 'group';
$lang->navIconNames['admin'] = 'cog-outline';
@@ -56,6 +58,7 @@ $lang->mainNav->qa = "{$lang->navIcons['qa']} {$lang->qa->common}|qa|inde
$lang->mainNav->devops = "{$lang->navIcons['devops']} DevOps|repo|maintain|";
$lang->mainNav->kanban = "{$lang->navIcons['kanban']} {$lang->kanban->common}|kanban|space|";
$lang->mainNav->doc = "{$lang->navIcons['doc']} {$lang->doc->common}|doc|index|";
$lang->mainNav->ai = "{$lang->navIcons['ai']} {$lang->ai->miniProgram}|ai|square|";
$lang->mainNav->bi = "{$lang->navIcons['bi']} {$lang->bi->common}|screen|browse|";
$lang->mainNav->system = "{$lang->navIcons['system']} {$lang->system->common}|my|team|";
$lang->mainNav->admin = "{$lang->navIcons['admin']} {$lang->admin->common}|admin|index|";
@@ -71,6 +74,7 @@ $lang->mainNav->menuOrder[30] = 'qa';
$lang->mainNav->menuOrder[35] = 'devops';
$lang->mainNav->menuOrder[40] = 'kanban';
$lang->mainNav->menuOrder[45] = 'doc';
$lang->mainNav->menuOrder[47] = 'ai';
$lang->mainNav->menuOrder[50] = 'bi';
$lang->mainNav->menuOrder[55] = 'system';
$lang->mainNav->menuOrder[60] = 'admin';
+1
View File
@@ -181,6 +181,7 @@ $lang->kanban->common = '看板';
$lang->qa->common = '测试';
$lang->devops->common = 'DevOps';
$lang->doc->common = '文档';
$lang->ai->miniProgram = '小程序';
$lang->repo->common = '代码库';
$lang->repo->codeRepo = '代码库';
$lang->bi->common = 'BI';
+1
View File
@@ -155,6 +155,7 @@ $lang->kanban->common = '看板';
$lang->qa->common = '測試';
$lang->devops->common = 'DevOps';
$lang->doc->common = '文檔';
$lang->ai->miniProgram = '小程式';
$lang->repo->common = '代碼庫';
$lang->repo->codeRepo = '代碼庫';
$lang->report->common = '统计';