* Refactor browse view of store.

This commit is contained in:
zhaoke
2023-07-14 15:00:00 +08:00
parent 5aee93ed28
commit e9091153c0
5 changed files with 205 additions and 6 deletions
+1
View File
@@ -688,6 +688,7 @@ $lang->navGroup->app = 'devops';
$lang->navGroup->pipeline = 'devops';
$lang->navGroup->devopssetting = 'devops';
$lang->navGroup->space = 'devops';
$lang->navGroup->store = 'devops';
$lang->navGroup->instance = 'devops';
$lang->navGroup->company = 'system';
+9
View File
@@ -0,0 +1,9 @@
.app-name {font-size: 16px; font-weight: 700; display: inline-block;padding: 8px 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: middle;}
#storeTree .tree-item {cursor: pointer;}
.store-item {justify-content: space-between;}
.tree li.tree-item.selected{color: #438EFF !important;}
#storePager {background: white; margin-top: 20px; padding: 6px 15px; display: flex; justify-content: end; font-weight: 700; color: rgb(131, 138, 157);}
#storePager .ghost {color: rgb(131, 138, 157);}
#mainContent > .icon-search {display: none;}
#storeTree {background: white; padding: 20px;}
#cloudAppContainer .install-btn {padding-left: 25px; padding-right: 25px;}
+51
View File
@@ -0,0 +1,51 @@
var checkedCategories = {};
/**
* 菜单点击刷新数据。
* Refresh data when click menu item.
*/
window.treeClick = function(info)
{
if (info.item.items && info.item.items.length > 0) return;
if(checkedCategories[info.item.id] != undefined)
{
$('#' + info.item.id).parent().removeClass('selected');
delete checkedCategories[info.item.id];
}
else
{
$('#' + info.item.id).parent().addClass('selected');
checkedCategories[info.item.id] = true;
}
const form = new FormData();
form.append('keyword', $('#name').val());
Object.keys(checkedCategories).forEach((id) => form.append('categories[]', id));
postAndLoadPage(link, form, '#cloudAppContainer');
}
/**
* 安装应用。
* Install app.
*/
window.installApp = function()
{
zui.Modal.open({
url: $(this).data('url'),
id: 'installModal'
});
}
$('#mainContent').on('keydown', '#name', function(event)
{
console.log(1111, event.key);
if (event.key === 'Enter')
{
const form = new FormData();
form.append('keyword', $('#name').val());
Object.keys(checkedCategories).forEach((id) => form.append('categories[]', id));
postAndLoadPage(link, form, '#cloudAppContainer');
}
});
+4 -6
View File
@@ -6,7 +6,7 @@ $lang->store->author = '发布者';
$lang->store->empty = '暂无应用';
$lang->store->install = '安装';
$lang->store->customInstall = '自定义安装';
$lang->store->searchApp = '查找应用';
$lang->store->searchApp = '请输入应用名称';
$lang->store->testChannel = '测试版';
$lang->store->stableChannel = '稳定版';
$lang->store->appBasicInfo = '基本信息';
@@ -21,8 +21,6 @@ $lang->store->gitUrl = '应用源码';
$lang->store->dockerfileUrl = 'Dockerfile';
$lang->store->forumUrl = '论坛';
$lang->store->sortTypes = array();
$lang->store->sortTypes['id'] = '默认';
$lang->store->sortTypes['create_time'] = '最新上架';
$lang->store->sortTypes['update_time'] = '最近更新';
//$lang->store->sortTypes['name'] = '名称';
$lang->store->featureBar['browse']['id'] = '默认';
$lang->store->featureBar['browse']['create_time'] = '最新上架';
$lang->store->featureBar['browse']['update_time'] = '最近更新';
+140
View File
@@ -0,0 +1,140 @@
<?php
declare(strict_types=1);
/**
* The browse view file of store 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 Ke Zhao<zhaoke@easycorp.ltd>
* @package store
* @link http://www.zentao.net
*/
namespace zin;
$tree = array();
foreach($categories as $id => $category)
{
$tree[] = array(
'id' => $id,
'parent' => 0,
'name' => $category,
'key' => 'storeTree-' . $id,
);
}
jsVar('tree', $tree);
jsVar('postCategories', $postCategories);
jsVar('link', inLink('browse', "sortType=$sortType"));
$setting = usePager();
$cloudApps = array_chunk($cloudApps, 3);
$groups = array();
foreach ($cloudApps as $group)
{
$items = array();
if(count($group) < 3) $group = array_merge($group, array_fill(count($group) - 1, 3 - count($group), new stdclass()));
foreach($group as $cloudApp)
{
if(empty($cloudApp->id))
{
$items[] = div(setClass('flex-1 p-2 content-between flex col store-item'));
continue;
}
$items[] = div
(
setClass('flex-1 bg-white shadow p-2 content-between flex col store-item state'),
on::click("openUrl('" . $this->createLink('store', 'appview', "id=$cloudApp->id") . "')"),
div
(
setStyle('height', '100px'),
setClass('flex border-b border-light'),
img(set::src($cloudApp->logo), setStyle(array('width' => '80px', 'height' => '80px'))),
div
(
setClass('ml-4'),
div($cloudApp->alias, setClass('app-name'), span($cloudApp->app_version, setClass('ml-5 label lighter rounded-full'))),
div($cloudApp->introduction, setClass('line-2'))
)
),
div
(
setClass('mt-5 flex justify-between'),
span
(
$lang->store->author,
span($cloudApp->author, setClass('font-semibold ml-2'))
),
btn
(
$lang->store->install,
setClass('primary btn size-sm install-btn'),
setData('prevent', true),
setData('toggle', 'modal'),
setData('url', $this->createLink('instance', 'install', "id={$cloudApp->id}")),
on::click('installApp', array('stop' => true)),
)
)
);
}
$groups[] = div
(
setClass('flex gap-5 mt-5'),
...$items
);
}
div
(
setID('cloudAppContainer'),
setClass('mb-5 flex col'),
div
(
setClass('flex'),
featureBar
(
set::current($sortType),
set::linkParams("sortType={key}"),
),
toolbar
(
formGroup
(
set::name('name'),
set::control(array
(
'type' => 'inputControl',
'prefix' => icon('search'),
'prefixWidth' => 'icon',
'placeholder' => $lang->store->searchApp,
'value' => $keyword,
)),
),
),
),
div(...$groups),
pager(
setID('storePager'),
set::page($setting['page']),
set::recTotal($setting['recTotal']),
set::recPerPage($setting['recPerPage']),
set::linkCreator($setting['linkCreator']),
set::items($setting['items']),
set::gap($setting['gap']),
),
);
sidebar
(
tree
(
set::id('storeTree'),
set::items($tree),
set::onClickItem(jsRaw('window.treeClick')),
)
);