diff --git a/module/common/lang/menu.php b/module/common/lang/menu.php index 21283ca958..28e74bbd75 100644 --- a/module/common/lang/menu.php +++ b/module/common/lang/menu.php @@ -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'; diff --git a/module/store/css/browse.ui.css b/module/store/css/browse.ui.css new file mode 100644 index 0000000000..bcb4a11451 --- /dev/null +++ b/module/store/css/browse.ui.css @@ -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;} \ No newline at end of file diff --git a/module/store/js/browse.ui.js b/module/store/js/browse.ui.js new file mode 100644 index 0000000000..da63954006 --- /dev/null +++ b/module/store/js/browse.ui.js @@ -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'); + } +}); \ No newline at end of file diff --git a/module/store/lang/zh-cn.php b/module/store/lang/zh-cn.php index a8630fa27c..0b6543cf42 100644 --- a/module/store/lang/zh-cn.php +++ b/module/store/lang/zh-cn.php @@ -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'] = '最近更新'; diff --git a/module/store/ui/browse.html.php b/module/store/ui/browse.html.php new file mode 100644 index 0000000000..3aae7d5dfd --- /dev/null +++ b/module/store/ui/browse.html.php @@ -0,0 +1,140 @@ + + * @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')), + ) +); \ No newline at end of file