znt/module/store/ui/browse.html.php

146 lines
4.6 KiB
PHP

<?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 https://www.zentao.net
*/
namespace zin;
$tree = array();
foreach($categories as $id => $category)
{
$item = new stdclass();
$item->id = $id;
$item->parent = 0;
$item->name = $category;
$item->url = helper::createLink('store', 'browse', "sortType=$sortType&categoryID=$id");
$tree[] = $item;
}
jsVar('tree', $tree);
jsVar('postCategories', '');
jsVar('sortType', $sortType);
jsVar('currentCategoryID', $currentCategoryID);
$setting = usePager();
$cloudApps = array_chunk($cloudApps, 3);
$groups = array();
$canInstall = hasPriv('instance', 'manage');
if(!empty($cloudApps))
{
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 open-url'),
set('data-url', createLink('store', 'appview', "id=$cloudApp->id")),
div
(
setStyle('height', '100px'),
setClass('flex border-b border-lighter'),
!empty($cloudApp->logo) ? img(set::src($cloudApp->logo), setStyle(array('width' => '80px', 'height' => '80px'))) : null,
div
(
setClass('ml-4'),
div($cloudApp->alias, setClass('app-name'), span($cloudApp->app_version, setClass('ml-5 label gray-pale 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'))
),
$canInstall ? btn
(
$lang->store->install,
setClass('primary btn size-sm install-btn'),
setData('prevent', true),
setData('toggle', 'modal'),
setData('size', 'sm'),
in_array($cloudApp->id, $installedApps) ? setData('confirm', $lang->store->alreadyInstalled) : null,
setData('url', $this->createLink('space', 'createApplication', "id={$cloudApp->id}")),
on::click('installApp', array('stop' => true))
) : null
)
);
}
$groups[] = div
(
setClass('flex gap-5 mt-5'),
...$items
);
}
}
$closeLink = createLink('store', 'browse', "sortType=$sortType");
featureBar
(
set::current($sortType),
set::linkParams("sortType={key}")
);
toolbar
(
formGroup
(
set::name('name'),
on::keyup('searchApp'),
set::control(array
(
'id' => 'searchName',
'type' => 'inputControl',
'prefixWidth' => 'icon',
'placeholder' => $lang->store->searchApp,
'value' => $keyword
))
)
);
div
(
setID('cloudAppContainer'),
setClass('mb-5 flex col'),
div(...$groups),
count($cloudApps) ? pager(
set::props(array('id' => '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'])
) : null
);
sidebar
(
moduleMenu(set(array
(
'modules' => $tree,
'activeKey' => $currentCategoryID,
'closeLink' => $closeLink,
'showDisplay' => false
)))
);