first commit

This commit is contained in:
2025-08-02 16:30:27 +02:00
commit 23646bfcee
14851 changed files with 1750626 additions and 0 deletions

View File

@@ -0,0 +1,84 @@
{extends "../list.tpl"}
{block css append}
<link href="./static/js/jquery.tree-drag-drop.css?t={$header.date}" rel="stylesheet" media="screen">
<style>
{$sizeSum = 0}
{foreach $columns.fields as $name => $column}
{if ($column.wpjAdmin and !isSuperuser()) or $column.visible == 'N'}
{continue}
{/if}
{$sizeSum = $sizeSum + $column.size}
{/foreach}
{if $sizeSum > 0}{$singlePartRelSize = 100/$sizeSum}{else}{$singlePartRelSize = 10}{/if}
{$partCounter = 0}
{foreach $columns.fields as $name => $column}
{if ($column.wpjAdmin and !isSuperuser()) or $column.visible == 'N'}
{continue}
{/if}
.tdd-row > .tdd-column-{$column@index + 1} {
left: {$singlePartRelSize*$partCounter}%;
width: {$singlePartRelSize*$column.size}%;
}
{$partCounter = $partCounter + $column.size}
{/foreach}
</style>
<link href="./static/js/jquery.tree-drag-drop.css?t={$header.date}" rel="stylesheet" media="screen">
{/block}
{block js append}
<script src="./static/js/jquery.tree-drag-drop.js?t={$header.date}"></script>
{/block}
{block "list-filter"}{/block}
{block bottomPagination}{/block}
{block name="list-panel-class"}menu-list{/block}
{block listTable}
<div class="tdd-row thh-row">
{foreach $columns.fields as $label => $column}
{if ($column.wpjAdmin and !isSuperuser()) or $column.visible == 'N'}
{continue}
{/if}
<div class="tdd-column tdd-column-{$column@index + 1} {$view->resolveCallable($column.class, $entry) nofilter}">
<small>{$object->printHeaderLabel($column.title, $column)}&nbsp;</small>
</div>
{/foreach}
</div>
{function printTree}
{foreach $data as $entry}
{$width = 500 - ($entry.level * 26)}
<li class="node {$view->resolveCallable($tableDef.class, $entry)}" data-id="{$view->getListRowValue($entry, $tableDef.id)}">
<div class="nodeWrapper tdd-row">
{foreach $tableDef.fields as $name => $column}
<div class="list_item tdd-column tdd-column-{$column@index + 1} {$view->resolveCallable($column.class, $entry) nofilter}">
{$view->printListRowItem($column, $entry)}
</div>
{/foreach}
</div>
{if !empty($entry.submenu)}
<ul class="tdd-tree">
{printTree data=$entry.submenu tableDef=$tableDef}
</ul>
{/if}
</li>
{/foreach}
{/function}
<div class="treeDragDrop table" id="treeDragDrop_artsections">
<ul class="tdd-tree nestedSortable nestedSortableRoot">
{printTree data=$SQL tableDef=$columns}
</ul>
</div>
{/block}
{block unsortable}unsortable{/block}
<script type="text/javascript">
{block onready append}
initListTree('sections', "{$ctrl.currUrl.Rel nofilter}&acn=drag");
{/block}
</script>

View File

@@ -0,0 +1,15 @@
{extends "list.tpl"}
<script>
{block onready append}
$('body').on('click', '[data-rename]', function() {
var $this = $(this),
newName = window.prompt("Zadejte nové jméno zálohy", $this.data('rename'));
if (newName)
window.location = $this.attr('href') + '&new_name=' + newName;
return false;
});
{/block}
</script>

View File

@@ -0,0 +1,216 @@
{extends "../list.tpl"}
{block css append}
<style>
{$sizeSum = 0}
{foreach $columns.fields as $name => $column}
{if ($column.wpjAdmin and !isSuperuser()) or $column.visible == 'N'}
{continue}
{/if}
{$sizeSum = $sizeSum + $column.size}
{/foreach}
{if $sizeSum > 0}{$singlePartRelSize = 100/$sizeSum}{else}{$singlePartRelSize = 10}{/if}
{$partCounter = 0}
{foreach $columns.fields as $name => $column}
{if ($column.wpjAdmin and !isSuperuser()) or $column.visible == 'N'}
{continue}
{/if}
.tdd-row > .tdd-column-{$column@index + 1} {
left: {$singlePartRelSize*$partCounter}%;
width: {$singlePartRelSize*$column.size}%;
}
{$partCounter = $partCounter + $column.size}
{/foreach}
</style>
{/block}
{block name="list-panel-class"}menu-list{/block}
{block addFilter}
{* todo podle sekcí ?? *}
{*<div class="filter-item">
{if $smarty.get.opened == 'all'}
<a class="btn btn-xs btn-ghost" href="launch.php?s={$view->getPageHandler()}&type={$view->getListName()}">
<i class="bi bi-dash-circle m-r-1"></i>Sbalit vše
</a>
{else}
<a class="btn btn-xs btn-ghost" href="launch.php?s={$view->getPageHandler()}&type={$view->getListName()}&opened=all">
<i class="bi bi-plus-circle m-r-1"></i>Rozbalit vše
</a>
{/if}
</div>*}
{/block}
{block "list-filter-pager"}
{if $pager}
<div class="filter-item">
<span class="small text-muted">
{$pager.total|number_format:0:".":" "}&nbsp;položek
</span>
</div>
{/if}
{/block}
{block "list-filter-columns-settings"}{/block}
{block listTable}
<div class="tdd-row thh-row">
{foreach $columns.fields as $label => $column}
{if ($column.wpjAdmin and !isSuperuser()) or $column.visible == 'N'}
{continue}
{/if}
<div class="tdd-column tdd-column-{$column@index + 1} {$view->resolveCallable($column.class, $entry) nofilter}">
<small>{$object->printHeaderLabel($column.title, $column)}&nbsp;</small>
</div>
{/foreach}
</div>
<div class="table">
{foreach $SQL.menu as $menuID => $menu}
<div data-node-id="{$menuID}">
<div class="sections-root">
<div class="tdd-row">
{* todo dynamic column index *}
<div class="tdd-column tdd-column-1">
<strong>{$menu.name}</strong>
</div>
<div class="tdd-column tdd-column-2">
{if isSuperuser() and $menuID}
<a href="javascript:nw('menu', {$menu.id}, '')">[{$menuID}] {if $menu.code}[{$menu.code}]{/if}</a>
{/if}
</div>
<div class="tdd-column tdd-column-5 columnBtns">
<div class="dropdown">
<a class="btn btn-success btn-block btn-sm dropdown-toggle" data-toggle="dropdown" id="newItemDropdown_{$menuID}">
<span class="bi bi-plus-lg m-r-1"></span>{'nestNewItem'|translate:'menulinks'}
</a>
<ul class="dropdown-menu">
{foreach $SQL.menuItemTypes as $typeID => $typeName}
<li>
<a href="javascript:nw('menu', '0', '{$menuID}&amp;data[type]={$typeID}{if $menuID !== ''}&amp;data[id_menu]={$menuID}{/if}&amp;data[parent]={if $menuID === ''}null{else}{$menuID}{/if}');">
<span class="{$SQL.menuItemTypesClasses[$typeID]}"></span> {'add'|cat:$typeName|translate:'menulinks'}
</a>
</li>
{/foreach}
</ul>
</div>
</div>
</div>
</div>
<form action="" method="post">
{function printTree}
{foreach $data as $entry}
<li class="node {$view->resolveCallable($tableDef.class, $entry)}" data-node-id="{$view->getListRowValue($entry, $tableDef.id)}">
<div class="nodeWrapper tdd-row">
{foreach $tableDef.fields as $name => $column}
<div class="list_item tdd-column tdd-column-{$column@index + 1} {$view->resolveCallable($column.class, $entry) nofilter}">
{$view->printListRowItem($column, $entry)}
</div>
{/foreach}
</div>
{if !empty($entry.submenu)}
<ul>
{printTree data=$entry.submenu tableDef=$tableDef}
</ul>
{/if}
</li>
{/foreach}
{/function}
<div class="treeDragDrop table" id="treeDragDrop_{if $menuID}{$menuID}{else}null{/if}">
<ul class="tdd-tree nestedSortable nestedSortableRoot">
{printTree data=$menu['submenu'] tableDef=$columns}
</ul>
</div>
</form>
</div>
{/foreach}
</div>
{/block}
{block js append}
<script src="./static/js/jquery.mjs.nestedSortable.js"></script>
{/block}
<script type="text/javascript">
{block onready append}
$('.nestedSortableRoot').on('click', '.opener', function(event) {
event.preventDefault();
$(this).closest('li').toggleClass('mjs-nestedSortable-collapsed').toggleClass('mjs-nestedSortable-expanded');
$(this).toggleClass('bi-plus-circle').toggleClass('bi-dash-circle');
return false;
});
var sortableContainers = [];
{foreach $SQL.menu as $menuID => $menu}
{*initListTree("sections", "{$ctrl.currUrl.Rel nofilter}&acn=drag&id_menu={$id_menu}", '#treeDragDrop_{$id_menu}');*}
var nodesContainer = $('#treeDragDrop_{if $menuID}{$menuID}{else}null{/if} > ul');
sortableContainers.push(nodesContainer);
nodesContainer.nestedSortable({
handle: '.drag-drop-mover',
items: 'li.node',
listType: 'ul',
toleranceElement: '> div.nodeWrapper',
placeholder: 'placeholder',
isTree: true,
connectWith: '.nestedSortableRoot',
start: function(event, ui) {
ui.item.startPos = ui.item.index();
var $parent = ui.item.parents('[data-node-id]');
ui.item.startParent = $parent.length ? $parent.data('node-id') : null;
},
update: function(event, ui) {
// fire only once when moving between multiple nestedSortables (use the update method of the target)
// https://stackoverflow.com/a/7340208
if (this !== ui.item.closest('.nestedSortableRoot')[0]) {
return;
}
$.each(sortableContainers, function(index, sortable) {
sortable.nestedSortable('disable');
});
// fix collapse toggle
$('.nestedSortableRoot .node').each(function(index, el) {
var $node = $(el);
var $nodeToggle = $node.find('> .nodeWrapper > .nodeToggle');
if ($node.find('> ul > .node').length) {
$nodeToggle.fadeIn();
} else {
$nodeToggle.fadeOut();
}
if ($node.is('.mjs-nestedSortable-expanded')) {
$nodeToggle.find('> span').addClass('glyphicon-minus-sign').removeClass('glyphicon-plus-sign');
}
});
var $parent = ui.item.parents('[data-node-id]');
var data = {ldelim}tree: {ldelim}{rdelim}{rdelim};
data['tree']['id'] = ui.item.data('node-id');
if ($parent.length) {
data['tree']['target'] = $parent.data('node-id');
}
data['tree']['position'] = ui.item.index();
// up or down?
if (ui.item.startParent === data['tree']['target'] && ui.item.startPos <= data['tree']['position']) {
data['tree']['position'] += 1;
}
$.post('{$ctrl.currUrl.Rel nofilter}&acn=drag&menuID={if $menuID}{$menuID}{else}null{/if}', data, function(res) {
//console.log (res.data.msg);
//TODO: error handling
return true;
});
$.each(sortableContainers, function(index, sortable) {
sortable.nestedSortable('enable');
});
},
});
{/foreach}
{/block}
</script>
{block unsortable}unsortable{/block}
{block bottomPagination}
{/block}

View File

@@ -0,0 +1,131 @@
{extends "../list.tpl"}
{block "content"}
<form method="post" id="payments-form">
<script>
var $form = $('#payments-form');
</script>
{$smarty.block.parent}
</form>
{/block}
{block name="list-filter" prepend}
{$addItem = $object->getAddItem()}
{if !$addItem}
<div class="panel-heading">
<div class="panel-group panel-group-lists" id="orderPayments">
<div>
<div class="row bottom-space">
{if $module.POS}
<div class="col-md-3 control-label">
<strong>Fyzicky v kase: </strong> {$in_pos|format_price}
</div>
{/if}
<div class="col-md-{if $module.POS}}2{else}5{/if}">
<a href="#" data-form-add class="btn btn-sm btn-success pull-left"><span class="glyphicon glyphicon-plus"></span>&nbsp;Přidat platbu</a>
</div>
{ifmodule BANK_AUTO_PAYMENTS__FIO_BANK}
<div class="col-md-2 col-md-offset-1 text-right">
<button type="submit" name="acn" value="fioCheckPayments" href="" class="btn btn-sm btn-success btn-block">
<span class="glyphicon glyphicon-credit-card"></span>&nbsp;Zkontrolovat platby
</button>
</div>
{elsemodule}
<div class="col-md-3">
</div>
{/ifmodule}
{if $module.POS}
<div class="col-md-2 text-right">
<a href="launch.php?s=printCenter.php&type=order&ID=1&set=POSClosure&date_from={$smarty.get.dateFrom}&date_to={$smarty.get.dateTo}&{if $specific_pos}specific_pos={$specific_pos}{/if}"
class="btn btn-sm btn-primary btn-block"
target="_blank">
<span class="glyphicon glyphicon-print"></span>&nbsp;Vytisknout pokladní uzávěrku
</a>
</div>
{/if}
{if $module.POS || $module.NEW_POS}
<div class="col-md-2 {if !$module.POS}col-md-offset-2{/if}">
<button type='button' class="btn btn-sm btn-block btn-primary" name="action" value="multiInvoicePrint" onclick='$.redirectPost({ url:"launch.php?s=printCenter.php&type=order&set=order&", data: $form.serializeArray(), target:"Tisk faktur" })'> <span class="glyphicon glyphicon-print"></span> Vytisknout faktury</button>
</div>
{/if}
</div>
<div id="addItem">
<div class="panel panel-heading panel-header">
<div class="row">
<div class="col-md-3 control-label">
<strong>Poznámka</strong>
</div>
<div class="col-md-2 control-label">
<strong>Přijato</strong>
</div>
<div class="col-md-2 control-label">
<strong>Vydáno</strong>
</div>
</div>
</div>
<form method="post" action="">
<div class="panel panel-body panel-send" id="orderPayments">
<div class="form-group" data-form-new>
<div class="row">
<div class="col-md-3">
<input type="text" class="form-control input-sm" name="data[orderPayments][0][note]" value=""/>
</div>
<div class="col-md-2">
<div class="input-group">
<input type="text" class="form-control input-sm" name="data[orderPayments][0][inserted]" value=""/>
<span class="input-group-addon">{$dbcfg.currency}</span>
</div>
</div>
<div class="col-md-2">
<div class="input-group">
<input type="text" class="form-control input-sm" name="data[orderPayments][0][choosed]" value=""/>
<span class="input-group-addon">{$dbcfg.currency}</span>
</div>
</div>
<div class="col-md-1">
<input type="submit" name="Submit" class="btn btn-sm btn-primary pull-left" value="Přidat" />
</div>
</div>
</div>
</div>
<input type="checkbox" style="display:none" name="cash" id="order_payments_show_in_cash" {if $smarty.get.cash || $smarty.post.cash}checked{/if}>
</form>
</div>
</div>
</div>
</div>
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function() {
if ($form) {
$form.on('keypress', function(event) {
if (event.key === 'Enter') {
event.preventDefault();
$form.find('input[type="submit"][name="Submit"]').trigger('click');
}
});
}
});
initForm({
selector: '#orderPayments',
beforeAdd: function(original){
var $new = original();
$new.find(':input[type=text]').val('');
$new.find(':input[type=submit]').remove('');
}
});
{*
var checked = JSON.parse(localStorage.getItem("order_payments_show_in_cash"));
if (checked == true){
{if !$smarty.get.cash}
window.location.href = window.location.href+'&cash=1';
{/if}
}
*}
</script>
{/if}
{/block}

View File

@@ -0,0 +1,125 @@
{extends "../list.tpl"}
{block 'table-class'}table table-striped{/block}
{block "list-filter" append}
{if !empty($sold)}
<div class="panel-heading">
<div class="row">
<div class="col-md-3">
Prodejnost: <strong>Celkem</strong>: {$sold_total}
</div>
{foreach $sold as $year}
<div class="col-md-2">
<strong>{$year.year}</strong>: {$year.count}ks
</div>
{/foreach}
</div>
</div>
{/if}
{/block}
{block content}
<style>
{block "list-styles"}
/* Delivery type statuses */
{foreach $styles as $id => $style}
{if $style.value}
.badge-{$id} {
background-color: {$style.value};
border-color: {$style.value};
}
{else}
.badge-{$id} {
background: transparent;
border-color: transparent;
padding: 0;
border-radius: 0;
}
{/if}
{/foreach}
/* Order statuses */
{foreach getOrderStatuses() as $id => $status}
{if $dbcfg.highlight_order_rows == "Y"}
{if $status.color}
.status{$id}, .status{$id} td {
background-color: {$status.color|color_lighter:13};
}
.status{$id}:hover, .status{$id}:hover td {
background-color: {$status.color|color_lighter:10};
}
{/if}
tr.storno, tr.storno td {
background-color: #f3cacb;
}
tr.storno:hover, tr.storno:hover td {
background-color: {'#f3cacb'|color_lighter:-5};
}
{/if}
{if $status.color and $id != 0}
.badge.status-{$id} {
background-color: #{$status.color};
border-color: #{$status.color};
}
{/if}
{/foreach}
{/block}
</style>
{$smarty.block.parent}
{/block}
{block buttons prepend}
{$sum = $view->getTotalPriceSum()}
{if $sum}
<div class="well well-sm m-b-0">
Cena celkem: {$sum|format_price}
</div>
{/if}
{/block}
<script type="text/javascript">
{block onready append}
{block js_autoreload}
{if !$dbcfg.autoreload_orders_list || $dbcfg.autoreload_orders_list == "Y"}
var minute_timeout = false;
var second_timeout = false;
setTimeout(function()
{
minute_timeout = true;
if (minute_timeout && second_timeout)
{
customRefresh();
window.location.reload();
}
}, 60000);
reloader();
function reloader()
{
resetTimer('orderList', 20000, function()
{
second_timeout = true;
if (minute_timeout && second_timeout)
{
customRefresh();
window.location.reload();
}
})
}
$(document).mousedown(function(){
reloader();
});
$(document).keydown(function(){
reloader();
});
{/if}
{/block}
{/block}
</script>

View File

@@ -0,0 +1,149 @@
{extends "list.tpl"}
{block 'list-header-check'}
<div class="checkbox">
<input type="checkbox" name="select-all" id="select-all" checked/>
<label for="select-all">{*Zaškrtnout vše*}</label>
</div>
{/block}
{block 'table-class'}table table-mass-process{/block}
{block content}
<style>
{block "list-styles"}
/* Order statuses */
{foreach getOrderStatuses() as $id => $status}
{if $status.color and $id != 0}
.badge.status-{$id} {
background-color: #{$status.color};
border-color: #{$status.color};
}
{/if}
{/foreach}
{/block}
</style>
<form method="post" id="balikobot-form">
{$smarty.block.parent}
</form>
<script>
var $form = $('#balikobot-form');
$('#select-all').click(function(event) {
if (this.checked) {
$form.find(':checkbox').each(function() {
this.checked = true;
});
} else {
$form.find(':checkbox').each(function() {
this.checked = false;
});
}
});
var unchecked = localStorage.getItem('listcheckedbalikonos');
if (unchecked) {
unchecked = JSON.parse(unchecked);
for (var i = 0; i < unchecked.length; i++) {
$("[value='" + unchecked[i] + "']").prop('checked', false);
}
localStorage.removeItem('listcheckedbalikonos');
}
$("thead a").click(function() {
var orders = $("[name='orders[]']:not(:checked)");
var unchecked = [];
for (var i = 0; i < orders.length; i++) {
unchecked.push(orders.eq(i).val());
}
localStorage.setItem('listcheckedbalikonos', JSON.stringify(unchecked));
});
</script>
{/block}
{block bottomPagination}
<div class="pagination-sticky">
{include "utils/pager.tpl"}
<div class="pagination-buttons">
{block buttons}
<div class="{if $pageCount > 5}dropup{else}dropdown{/if} dropup-actions">
<button class="btn dropdown-toggle" type="button" id="massProcessDropdownTrigger" data-toggle="dropdown">
Tisk
</button>
<ul class="dropdown-menu" aria-labelledby="adminActionsDropdownTrigger" id="massProcessDropdown">
{block buttons_dropup}
<li>
<a href=""
onclick='$.redirectPost({ url:"launch.php?s=printCenter.php&type=order&set=order&", data:$form.serializeArray(), target:"Tisk faktur" });return false;'>
HTML faktury</a>
</li>
<li>
<a href=""
onclick='$.redirectPost({ url:"launch.php?s=printCenterPDF.php&type=order&set=multiplePDF&invoice_force=2", data:$form.serializeArray(), target:"Tisk faktur" });return false;'>
PDF faktury</a>
</li>
<li>
<a href=""
onclick='$.redirectPost({ url:"launch.php?s=printCenter.php&type=order&set=order&template=orderViewprintPickingList.tpl", data:$form.serializeArray(), target:"Tisk vychystávacího listu" });return false;'>
Vychystávací listy</a>
</li>
<li>
<a href=""
onclick='$.redirectPost({ url:"launch.php?s=printCenter.php&type=orders&template=massOrderViewprintPickingList.tpl", data:$form.serializeArray(), target:"Tisk hromadného vychystávacího listu" });return false;'>
Hromadný vychystávací list</a>
</li>
<li>
<a href=""
onclick='$.redirectPost({ url:"launch.php?s=printCenter.php&type=order&recap=1", data:$form.serializeArray(), target:"Tisk rekapitulace objednávky" });return false;'>
Rekapitulace objednávky</a>
</li>
{/block}
</ul>
</div>
{/block}
{block delivery_buttons}{/block}
{if !$smarty.get.balikonos}
<div class="status-change">
<div class="chosen-wrapper">
{if $pageCount <= 5}
{$css_class = "selecter selecter-down"}
{else}
{$css_class = "selecter selecter-up"}
{/if}
{print_select name="status" var=$cfg.Order.Status.global selected=$cfg.Modules.orders_mass_process.invoice_default_to
param='form="balikobot-form"' class=$css_class}
</div>
<div class="checkbox">
<input type="checkbox" name="donotsend" value="ON" class="check" id="donotsend">
<label for="donotsend"><strong>Ne</strong>odesílat zákazníkovi e-mail</label>
</div>
<button type='submit' name=acn class="btn btn-primary" value="multiInvoiceChangeStatus" form="balikobot-form"
onclick="if (!confirm('Opravdu chcete změnit stav?')) return false;">Změnit stav
</button>
</div>
{/if}
{if findModule("balikonos")}
{if $cfg.Modules.balikonos.provider === 'balikobot'}
<button type='button' class="btn btn-primary" name=action value=balikonos data-submit-loading
onclick='$.redirectPost({ url:"launch.php?s=list.php&type=balikobot&action=insert{if $smarty.get.balikobot_user}&balikobot_user={$smarty.get.balikobot_user}{/if}", data:$form.serializeArray() })'>
Nahrát do Balíkobota
</button>
{else}
<button type='button' class="btn btn-primary" name=action value=balikonos data-submit-loading
onclick='$.redirectPost({ url:"launch.php?s=list.php&type=balikonos&action=insert", data:$form.serializeArray() })'>
Nahrát do Balíkonoše
</button>
{/if}
{/if}
</div>
</div>
{/block}

View File

@@ -0,0 +1,181 @@
{extends "../list.tpl"}
{block "list-filter"}
{/block}
{block "list-wrapper-class"}list-photos{/block}
{block "list-panel-class"}{/block}
{block listTable}
<div class="row">
<form data-photos-container class="photos-selection-container">
<div class="{if $searchWnd}col-md-2 col-sm-3 col-xs-6{else}col-md-1 col-sm-2 col-xs-4{/if}" data-uploader-wrapper>
<div class="file-uploader" data-file-upload>
<div id="file-uploader"></div>
</div>
</div>
<div data-file-upload-list
class="{if $searchWnd}col-md-2 col-sm-3 col-xs-6{else}col-md-1 col-sm-2 col-xs-4{/if} photos photos-file-upload-list"></div>
{foreach from=$SQL item=image}
<div class="{if $searchWnd}col-md-2 col-sm-3 col-xs-6{else}col-md-1 col-sm-2 col-xs-4{/if} photos">
{if getVal('multiSelect')}
<div class="checkbox">
<input type="checkbox" id="checkbox_{$image.id}" data-photo="{$image.id}" class="check">
<label for="checkbox_{$image.id}"></label>
</div>
{/if}
<div class="thumbnail">
{if $image.id_video}
<span class="glyphicon glyphicon-film"></span>
{/if}
{if $image.image_tablet || $image.image_mobile}
<span class="glyphicon glyphicon-phone"></span>
{/if}
<a href="{if getVal('multiSelect')}#photo{else}javascript:{if $searchWnd}searchResult('{$image.id}'){else}nw('photo', '{$image.id}'){/if};{/if}">
<img src="{static_url url=$image.img.src}" class="img-rounded img-responsive" alt="">
</a>
{if $image.descr}
<div class="caption text-center list_item">{$image.descr}</div>
{/if}
</div>
</div>
{/foreach}
</form>
</div>
{/block}
{block bottomPagination}
<div class="row footer window-btns">
<div class="col-xs-8">
{include "utils/pager.tpl"}
</div>
<div class="col-xs-4">
{if getVal('multiSelect')}
<button class="btn btn-primary btn-block submitPhotosSelectionBtn" data-submit-selection-btn>Vybrat obrázky</button>
{/if}
</div>
</div>
{/block}
{* Image uploader *}
{block js append}
<script src="/admin/static/fineuploader/jquery.fine-uploader.min.js"></script>
<script type="text/template" id="qq-simple-thumbnails-template">
<div class="qq-uploader-selector qq-uploader">
<div class="qq-upload-drop-area-selector qq-upload-drop-area" qq-hide-dropzone>
<div>
<span></span>Přesuňte soubory sem
</div>
</div>
<div class="qq-upload-button-selector">
<p>
<strong>Nahrát obrázek{ifmodule VIDEOS} nebo video{/ifmodule}</strong>
<small>podporované formáty jsou .jpg, .jpeg, .png, .webp, .avif, .gif{if {find_module name='videos'}}, .mp4, .mkv, .m4a{/if}</small>
</p>
</div>
<span class="qq-drop-processing-selector qq-drop-processing">
<span class="qq-drop-processing-spinner-selector qq-drop-processing-spinner"></span>
<span>Zpracovávám soubory...</span>
</span>
<div class="qq-upload-list-selector qq-upload-list">
<div class="qq-upload-instance">
<span class="qq-upload-spinner-selector qq-upload-spinner"></span>
<input class="qq-edit-filename-selector qq-edit-filename" tabindex="0" type="text">
<a class="qq-upload-cancel-selector qq-upload-cancel" href="#">Zrušit <span class="fc icons_close"></span></a>
<span class="qq-upload-status-text-selector qq-upload-status-text"></span>
<span class="qq-upload-file-selector qq-upload-file"></span>
</div>
</div>
</div>
</script>
{/block}
<script>
{block onready append}
// Keep in sync with engine/admin/templates/adminPhotos.tpl !!
var $el = $('[data-file-upload]');
var $fileUploader = $el.find('#file-uploader');
var extensions = ['jpeg', 'jpg', 'png', 'svg', 'webp', 'avif', 'gif'];
{ifModule VIDEOS}
extensions.push('mp4', 'mkv', 'm4a', 'm4v', 'mov');
{/ifModule}
var uploaderOptions = {
template: 'qq-simple-thumbnails-template',
listElement: $('[data-file-upload-list]')[0],
thumbnails: {
placeholders: {
waitingPath: 'static/fineuploader/placeholders/waiting-generic.png',
notAvailablePath: 'static/fineuploader/placeholders/not_available-generic.png',
},
},
request: {
inputName: 'uploader',
endpoint: 'launch.php?s=list.php&type=photos&acn=uploadImage&photos_type={$smarty.get.photos_type}',
},
blobProperties: {
name: 'filename',
},
validation: {
allowedExtensions: extensions,
},
callbacks: {
onComplete: function(id, name, response) {
var imageId = response.id;
if (response.success) {
var href = '#photo';
{if !getVal('multiSelect')}
href = "javascript:{if $searchWnd}searchResult('" + imageId + "'){else}nw('photo', '" + imageId + "'){/if};";
{/if}
var $photo = $('<div class="{if $searchWnd}col-md-2 col-sm-3 col-xs-6{else}col-md-1 col-sm-2 col-xs-4{/if} photos">\n' +
'{if getVal('multiSelect')}<div class="checkbox">' +
'<input type="checkbox" id="checkbox_' + imageId + '" data-photo="' + imageId + '" class="check" checked="checked">' +
'<label for="checkbox_' + imageId + '"></label></div>{/if}' +
' <div class="thumbnail">\n' +
' <a href="' + href + '">\n' +
' <img src="" class="img-rounded img-responsive" alt="">\n' +
' </a>' +
' <div class="caption text-center list_item">' + name + '</div>' +
' </div>' +
' </div>');
$fileUploader.fineUploader('drawThumbnail', id, $photo.find('img'), 250, false);
$('[data-uploader-wrapper]').after($photo);
}
},
onAllComplete: function(succeeded, failed) {
if (!failed.length) {
$('[data-file-upload-list]').empty();
}
},
},
maxConnections: 1,
};
$fileUploader.fineUploader(uploaderOptions);
{if getVal('multiSelect')}
var $photosContainer = $('[data-photos-container]');
$photosContainer.on('click', '.thumbnail > a', function(event) {
event.preventDefault();
var $checkbox = $(this).closest('.photos').find('input[type=checkbox]');
$checkbox.prop('checked', !$checkbox.prop('checked'));
});
$('[data-submit-selection-btn]').on('click', function(event) {
event.preventDefault();
var selectedIDs = [];
$photosContainer.find('[data-photo]:checked').each(function(index, el) {
selectedIDs.push($(el).attr('data-photo'));
});
searchResult(selectedIDs);
});
{/if}
{/block}
</script>

View File

@@ -0,0 +1,13 @@
{extends "../list.tpl"}
{block name="list-filter"}
<div class="panel-heading">
<div class="row">
{ifmodule POS}
<div class="col-md-3">
<strong>Fyzicky v kase: </strong>{$var.in_pos|format_price}
</div>
{/ifmodule}
</div>
</div>
{/block}

View File

@@ -0,0 +1,767 @@
{function printDefaultField style="" maxlength="" attributes=""}
<input data-type="{$namefield}" type="text" class="input full-size" name="{$item.input[0]}[{$IDpr}]" value="{$row[$item.field]}" onchange="update(this,'{$IDpr}')" {if $maxlength}maxlength="{$maxlength}"{/if} {if $style}style="{$style}"{/if} {$attributes} />
{/function}
{function printCustomDataField style="" maxlength="" attributes=""}
<input data-type="{$namefield}" type="text" class="input full-size" name="{$item.input[0]}[{$IDpr}][{$item.input[1]}]" value="{$row[$item.field]}" onchange="update(this,'{$IDpr}')" {if $maxlength}maxlength="{$maxlength}"{/if} {if $style}style="{$style}"{/if} {$attributes} />
{/function}
{function printUnitSelection}
{if $param.unit|count > 1}
<span class="param-unit">
<select class='selecter unit noflex' name="parameters[{$IDpr}][{$IDp}][{$param.value_id}][unit]" {$event}>
{foreach $param.unit as $key => $unit}
<option value="{$unit}" {if $unit == $param.row.unit}selected{/if}>{$unit}</option>
{/foreach}
</select>
</span>
{else}
{$param.unit[0]}
{/if}
{/function}
{function printField}
{$ret = $object->printEditField($key, $row, $IDpr)}
{if $ret !== false && mb_substr($namefield, 0, 10) === 'figureFeed'}
{$data = $view->getFeedData($item.feed.id, $IDpr)}
{switch $item.item}
{case "title"}
<input data-type="{$namefield}" type="text" class="input full-size" name="feed[{$IDpr}][{$item.feed.id}][{$item.item}]" value="{$data[$item.item]}" onchange="update(this,'{$IDpr}')" maxlength="255" />
{/case}
{case "active"}
{$figures = ['' => 'Nerozhoduje', '1' => 'Ano', '0' => 'Ne']}
{if !$IDpr}
{$figures['-1'] = "Vyberte"}
{$data[$item.item] = "-1"}
{/if}
{$param = "onchange='update(this, {$IDpr})'"}
{print_select name="feed[{$IDpr}][{$item.feed.id}][{$item.item}]" var=$figures selected=$data[$item.item] param=$param}
{/case}
{case "cpc"}
<input type="text" class="input" name="feed[{$IDpr}][{$item.feed.id}][{$item.item}]" size="10" maxlength="50" value="{$data[$item.item]}" onchange="update(this,'{$IDpr}')" />
{/case}
{case "gift_text"}
<input type="text" class="input" name="feed[{$IDpr}][{$item.feed.id}][{$item.item}]" maxlength="160" value="{$data[$item.item]}" onchange="update(this,'{$IDpr}')" />
{/case}
{case "id_section"}
<select class="ajax-selecter" name="feed[{$IDpr}][{$item.feed.id}][{$item.item}]" data-type="feed_{if $item.feed.section_mapping}{$item.feed.section_mapping}{else}{$item.feed.type}{/if}" data-text-single="Vyberte sekci">
<option value="{$data[$item.item]}" selected>{$data['section_name']}</option>
</select>
{/case}
{default}
{printDefaultField}
{/switch}
{elseif $ret !== false && mb_strpos($namefield, 'storeItems') !== false}
{$data = $view->getStoresData($item.store.id, $IDpr)}
<input data-type="{$namefield}" type="text" class="input full-size" name="store[{$IDpr}][{$item.store.id}][{$item.item}]" value="{$data[$item.item]}" onchange="update(this,'{$IDpr}')"/>
{elseif $ret !== false && mb_substr($namefield, 0, 15) === 'figurePriceList'}
{$data = $view->getPriceListData($item.priceList.id, $IDpr)}
<input data-type="{$namefield}" type="text" class="input full-size" name="priceList[{$IDpr}][{$item.priceList.id}][{$item.item}]" value="{$data[$item.item]}" onchange="update(this,'{$IDpr}')" maxlength="255" />
{elseif mb_substr($namefield, 0, 15) === 'figureParameter'}
{$IDp = $item.parameter}
<div class="multi-item" data-multi-id="{$IDpr}" data-id_parameter="{$IDp}" data-multi="item">
{if findModule('products_parameters', 'configurations')}
<div>
<label>
<input type="hidden" name="parameters_configurations[{$IDpr}][{$IDp}][enabled]" value="N">
<input type="checkbox" name="parameters_configurations[{$IDpr}][{$IDp}][enabled]" value="Y"
{if $view->productHasParametersConfigurations($IDpr, $IDp)}checked="checked"{/if}
onchange="update(this, '{$IDpr}')">
Volitelné u produktu
<a class="help-tip" data-toggle="tooltip"
title="Požadovat od zákazníka vybrat hodnotu parametru před vložením do košíku. Zvolíte-li příplatek, tato částka se přičte k ceně produktu.">
<i class="bi bi-question-circle"></i>
</a>
</label>
</div>
{/if}
{foreach $ret as $key => $param}
<div class="param-row" data-multi="row" data-multi-id="{$param.value_id}">
{if $param.value_type == 'list'}
<select type="text"
name="parameters[{$IDpr}][{$IDp}][{$param.value_id}][value]"
class="selecter"
data-preload="ParametersValuesOnly"
data-filter-type="autocomplete" data-autocomplete="parametersListValuesByParameter"
data-autocomplete-params="id_parameter={$IDp}" onchange="update(this,'{$IDpr}')">
<option value=""></option>
<option value="{$param.value}" selected="selected"></option>
</select>
{else}
<input type="text" class="input fullflex" style="min-width: 50px;" name="parameters[{$IDpr}][{$IDp}][{$param.value_id}][value]" size="10" maxlength="255" value="{$param.value}"/>
{/if}
<div class="unit">{printUnitSelection}</div>
{if findModule('products_parameters', 'configurations')}
<label>
Příplatek:
<input type="text" style="width: 60px;" class="input" name="parameters[{$IDpr}][{$IDp}][{$param.value_id}][price]"
size="10" maxlength="50" value="{$param.row.configuration_price}" onchange="update(this,'{$IDpr}')"/>
</label>
{/if}
<input data-multi="delete" class="hidden" type="checkbox" name="parameters[{$IDpr}][{$IDp}][{$param.value_id}][delete]"/>
<span class="label noflex" data-multi="add" title="Přidat parametr"><i class="glyphicon glyphicon-plus"></i></span>
<span class="label noflex" data-multi="del" title="Odebrat parametr"><i class="glyphicon glyphicon-minus"></i></span>
</div>
{/foreach}
{elseif $ret !== false}
{switch $namefield}
{case "figureProducer"}
{$name = $view->getProducerName($row.producer)}
{print_select name="producer[{$IDpr}]" var=[$row.producer => $view->getProducerName($row.producer)] param="data-type='producers' data-value='{$name}'" class="ajax-selecter"}
{/case}
{case "figureDiscount"}
{printDefaultField style="width: calc(100% - 2em);"}&nbsp;%
{/case}
{case "figureLongDescr"}
<textarea name="longDescr[{$IDpr}]" rows="14" cols="30">{$row.long_descr}</textarea>
{insert_wysiwyg target="longDescr[{$IDpr}]" type="ProductDescription"}
<script type="text/javascript">
CKEDITOR.instances['longDescr[{$IDpr}]'].on('change', function() {
var me = this;
resetTimer('longDescr', 200, function() {
me.updateElement();
update(me.element.$, '{$IDpr}');
});
});
</script>
{/case}
{case "figureParamsDescr"}
<textarea name="paramsDescr[{$IDpr}]" rows="14" cols="30">{$row.parameters}</textarea>
{insert_wysiwyg target="paramsDescr[{$IDpr}]" type="ProductDescription"}
<script type="text/javascript">
CKEDITOR.instances['paramsDescr[{$IDpr}]'].on('change', function() {
var me = this;
resetTimer('paramsDescr', 200, function() {
me.updateElement();
update(me.element.$, '{$IDpr}');
});
});
</script>
{/case}
{case "figureFigure"}
{$figures = ['Y' => 'Viditelné', 'N' => 'Skryté', 'O' => 'Prodej ukončen']}
{if !$row.figure}
{$figures['0'] = "Nezvoleno"}
{$row.figure = "0"}
{/if}
{$param = "id='figures{$IDpr}' onchange='update(this, {$IDpr})'"}
{print_select name="figures[{$IDpr}]" var=$figures selected=$row.figure param=$param}
{/case}
{case 'figureCharge'}
<div style="white-space: nowrap;">
<div style="float: left;">
{$param = "onchange='update(this, {$IDpr})'"}
{print_select name="charge_id[{$IDpr}]" var=$CHARGES selected=$row.charge_id param=$param}
</div>
<div>
<span class="small" for="charge_included{$IDpr}" style="padding: 0px 3px; opacity:.5;">&nbsp;included:</span>
<input type="checkbox" id="charge_included{$IDpr}" name="charge_included[{$IDpr}]"
onchange="update(this,'{$IDpr}')" value="Y" {$row['charge_included']|checked:'Y'} />
</div>
</div>
{/case}
{case "figureCollections"}
<div class="multi-item" data-multi-id="{$IDpr}" data-multi="item">
{foreach $ret.own as $key => $product}
<div class="section-row" data-multi="row" data-multi-id="{$key}">
<div class="fullflex">
<select class="ajax-selecter" name="collections[{$IDpr}][{$key}][id_product_related]" data-type="product_id">
<option value="{$product.id}" selected>{$product.title}</option>
</select>
</div>
<input data-multi="delete" class="hidden" type="checkbox" name="collections[{$IDpr}][{$key}][delete]"/>
<span class="label noflex" data-multi="add" title="Přidat"><i class="glyphicon glyphicon-plus"></i></span>
<span class="label noflex" data-multi="del" title="Odebrat"><i class="glyphicon glyphicon-minus"></i></span>
</div>
{/foreach}
{if !empty($ret.others)}<br /><strong>v cizích:</strong>{/if}
{foreach $ret.others as $product}
<a href="javascript:nw('product', '{$product.id}', 'noopener');" tabindex="-1">
{$product.title}
</a>
<br />
{/foreach}
</div>
{/case}
{case "figureProductSets"}
<div class="multi-item" data-multi-id="{$IDpr}" data-multi="item">
{foreach $ret as $key => $product}
<div class="section-row" data-multi="row" data-multi-id="{$key}">
<div class="fullflex">
<select class="ajax-selecter" name="sets[{$IDpr}][{$key}][id_product_set]" data-type="product_id">
<option value="{$product.id}" selected>{$product.title}</option>
</select>
</div>
<input data-multi="delete" class="hidden" type="checkbox" name="sets[{$IDpr}][{$key}][delete]"/>
<span class="label noflex" data-multi="add" title="Přidat"><i class="glyphicon glyphicon-plus"></i></span>
<span class="label noflex" data-multi="del" title="Odebrat"><i class="glyphicon glyphicon-minus"></i></span>
</div>
{/foreach}
</div>
{/case}
{case "figureProductGifts"}
<div class="multi-item" data-multi-id="{$IDpr}" data-multi="item">
{foreach $ret as $key => $product}
<div class="section-row" data-multi="row" data-multi-id="{$key}">
<div class="fullflex">
<select class="ajax-selecter" name="gifts[{$IDpr}][{$key}][id_product_gift]" data-type="product_id">
<option value="{$product.id}" selected>{$product.title}</option>
</select>
</div>
<input data-multi="delete" class="hidden" type="checkbox" name="gifts[{$IDpr}][{$key}][delete]"/>
<span class="label noflex" data-multi="add" title="Přidat"><i class="glyphicon glyphicon-plus"></i></span>
<span class="label noflex" data-multi="del" title="Odebrat"><i class="glyphicon glyphicon-minus"></i></span>
</div>
{/foreach}
</div>
{/case}
{case "figureProductLabels"}
<div class="multi-item" data-multi-id="{$IDpr}" data-multi="item">
{foreach $ret as $key => $label}
<div class="section-row" data-multi="row" data-multi-id="{$key}">
<div class="fullflex">
<select class="ajax-selecter" name="labels[{$IDpr}][{$key}][id_label]" data-type="labels">
<option value="{$label.id}" selected>{$label.name}</option>
</select>
</div>
<input data-multi="delete" class="hidden" type="checkbox" name="labels[{$IDpr}][{$key}][delete]"/>
<span class="label noflex" data-multi="add" title="Přidat"><i class="glyphicon glyphicon-plus"></i></span>
<span class="label noflex" data-multi="del" title="Odebrat"><i class="glyphicon glyphicon-minus"></i></span>
</div>
{/foreach}
</div>
{/case}
{case "figurePhotos"}
<div class="photos-items" style="display: inline; float: left;" data-id="{$IDpr}">
<input type="hidden" class="prod-id" name="photo[{$IDpr}]" value="{$IDpr}" onchange="update(this,'{$IDpr}')">
<span class="photos-row-form" style="float:left; display:none">
<input type="hidden" class="photo-id" name="photos[{$IDpr}][][id_photo]" value="">
{if $IDpr}
<a style="cursor: pointer; position: relative;top: 25px;left: 65px;">
<span class="list-no glyphicon glyphicon-remove-circle photos-del">
<i>Smazat obrázek</i>
</span>
</a>
{/if}
<span class="thumbnail" style="margin: 0"><img class="img-rounded" style="height:80px !important;" src="" title="Obrázek č. " /></span>
{if !empty($cfg.Photo.kind)}
<span>
<select class="selecter" name="photos[{$IDpr}][{$key}][show_in_lead]">
{foreach $cfg.Photo.kind as $type => $name}
<option {if $photo.show_in_lead == $type}selected{/if} value="{$type}">{$name}</option>
{/foreach}
</select>
</span>
{/if}
</span>
<div style="float:right ">
{* <input type="hidden" class="input photo-name" name="photos[{$IDpr}][]" id="photo{$IDpr}" size="45" maxlength="80" value="" onchange="update(this,'{$IDpr}')" />*}
<a href="" title="Vyhledat obrázek" class="btn btn-sm add-photo {if $IDpr}disabled{/if}" id="photo{$IDpr}">
<span class=" glyphicon glyphicon-search"></span>
</a>
</div>
{foreach $ret as $key => $photo}
<span class="photos-row" style="float:left;max-width: 88px !important;">
<input type="hidden" name="photos[{$IDpr}][{$key}][id_photo]" value="{$photo.id}">
<a style="cursor: pointer; position: relative;top: 25px;left: 65px;">
<span class="list-no glyphicon glyphicon-remove-circle photos-del disabled">
<i>Smazat obrázek</i>
</span>
</a>
<span class="thumbnail" style="margin: 0">
<img class="img-rounded" style="height:80px !important;" src="{$photo.src}" title="Obrázek č. {$photo.id}" />
</span>
{if !empty($cfg.Photo.kind)}
<span>
<select class="selecter" name="photos[{$IDpr}][{$key}][show_in_lead]">
{foreach $cfg.Photo.kind as $type => $name}
<option {if $photo.show_in_lead == $type}selected{/if} value="{$type}">{$name}</option>
{/foreach}
</select>
</span>
{/if}
</span>
{/foreach}
</div>
{/case}
{case "figureRelated"}
<div class="multi-item" data-multi-id="{$IDpr}" data-multi="item">
{foreach $ret as $key => $product}
<div class="section-row" data-multi="row" data-multi-id="{$key}">
<div class="fullflex">
<select class="ajax-selecter" name="products_related[{$IDpr}][{$key}][id_rel_product]" data-type="product_id">
<option value="{$product.id_rel_product}" selected>{$product.title}</option>
</select>
</div>
{if $view->productsRelatedTypes}
<div style="width:100px !important;">
{print_select var=$view->productsRelatedTypes name="products_related[{$IDpr}][{$key}][type]" selected=$product.type}
</div>
{/if}
<input data-multi="delete" class="hidden" type="checkbox" name="products_related[{$IDpr}][{$key}][delete]"/>
<span class="label noflex" data-multi="add" title="Přidat sekci"><i class="glyphicon glyphicon-plus"></i></span>
<span class="label noflex" data-multi="del" title="Odebrat sekci"><i class="glyphicon glyphicon-minus"></i></span>
</div>
{/foreach}
</div>
{/case}
{case "figureMetaTitle"}
{printDefaultField maxlength=70}
{/case}
{case "figureMetaDescription"}
<textarea class="form-control input-sm" name="metaDescription[{$IDpr}]" maxlength="250" onclick="update(this,'{$IDpr}')">{$row.meta_description}</textarea>
{/case}
{case "figureMetaKeywords"}
{printDefaultField maxlength=100}
{/case}
{case "figureAttachments"}
<div class="multi-item" data-multi-id="{$IDpr}" data-multi="item">
{foreach array_merge($ret, [[]]) as $key => $attach}
<div class="section-row row attachments" style="margin-left: 0;" data-multi="row" data-multi-id="{$attach@iteration}">
<div class="col-md-5">
<div class="input-group">
<input type="text" class="input" style="width: 220px;" id="attachLink" name="attachments[{$IDpr}][{$attach@iteration}][link]" value="{$attach.link}" placeholder="{'attachmentNote'|translate:"products"}"/>
<div class="input-group-btn attach" style="width: 20px;">
{insert_file_browse link="attachLink"}
</div>
</div>
</div>
<div class="col-md-4">
<input type="text" class="input" style="width: 220px;" name="attachments[{$IDpr}][{$attach@iteration}][title]" value="{$attach.title}" placeholder="Název přílohy"/>
</div>
{ifmodule ATTACHMENTS__ATTACHMENTS_TYPES}
<div class="col-md-4">
<select title="Vyberte typ" name="attachments[{$IDpr}][{$attach@iteration}][type]" class="selecter">
{foreach $cfg['Modules']['attachments']['attachments_types'] as $code => $label}
<option value="{$code}" {if $code == $attach.type}selected{/if}>{$label}</option>
{/foreach}
</select>
</div>
{/ifmodule}
<input data-multi="delete" class="hidden" type="checkbox" name="attachments[{$IDpr}][{$attach@iteration}][delete]"/>
<span class="label noflex" data-multi="add" title="Přidat článek"><i class="glyphicon glyphicon-plus"></i></span>
<span class="label noflex" data-multi="del" title="Odebrat článek"><i class="glyphicon glyphicon-minus"></i></span>
</div>
{/foreach}
</div>
{/case}
{case "productsLinks"}
<div class="multi-item" data-multi-id="{$IDpr}" data-multi="item">
{foreach array_merge($ret, [[]]) as $key => $link}
<div class="section-row row attachments" style="margin-left: 0;" data-multi="row" data-multi-id="{$link@iteration}">
<div class="col-md-5">
<div class="input-group">
<input type="text" class="input" style="width: 250px;" id="attachLink" name="links[{$IDpr}][{$link@iteration}][link]" value="{$link.link}" placeholder="{'attachmentNote'|translate:"products"}" />
<div class="input-group-btn attach" style="width: 20px;">
</div>
</div>
</div>
<div class="col-md-4">
<input type="text" class="input" style="width: 230px;" name="links[{$IDpr}][{$link@iteration}][title]" value="{$link.title}" placeholder="Název odkazu"/>
</div>
{if !empty($cfg.Links.Types)}
<div class="col-md-2">
<select title="{'linkType'|translate}" name="links[{$IDpr}][{$link@iteration}][type]" class="selecter">
{foreach $cfg.Links.Types as $name => $title}
<option value="{$name}" {if $link.type == $name}selected{/if}>{$title}</option>
{/foreach}
</select>
</div>
{/if}
<input data-multi="delete" class="hidden" type="checkbox" name="links[{$IDpr}][{$link@iteration}][delete]"/>
<span class="label noflex" data-multi="add" title="Přidat článek"><i class="glyphicon glyphicon-plus"></i></span>
<span class="label noflex" data-multi="del" title="Odebrat článek"><i class="glyphicon glyphicon-minus"></i></span>
</div>
{/foreach}
</div>
{/case}
{case "figureCategory"}
<div class="multi-item" data-multi-id="{$IDpr}" data-multi="item">
{foreach $ret as $key => $section}
<div class="section-row" data-multi="row" data-multi-id="{$section.id_section}">
<div class="fullflex">
{$section = $view->getSectionInfo($section.id_section)}
<select data-visibleOnly="false" class="ajax-selecter" name="sections[{$IDpr}][{$section.id_section}][id_section]" data-type="categories" data-value="{$section.name}">
<option value="{$section.id_section}" selected>{$section.path}</option>
</select>
</div>
<input data-multi="delete" class="hidden" type="checkbox" name="sections[{$IDpr}][{$section.id_section}][delete]"/>
<span class="label noflex" data-multi="add" title="Přidat sekci"><i class="glyphicon glyphicon-plus"></i></span>
<span class="label noflex" data-multi="del" title="Odebrat sekci"><i class="glyphicon glyphicon-minus"></i></span>
</div>
{/foreach}
</div>
{/case}
{case "figureTemplates"}
<div class="multi-item" data-multi-id="{$IDpr}" data-multi="item">
{foreach $ret as $template}
<div class="param-row" data-multi="row" data-multi-id="{$template@iteration}">
<div class="fullflex">
<select class="ajax-selecter" name="templates[{$IDpr}][{$template@iteration}][id_template]" data-type="templates">
<option value="{$template.id}" selected>{$template.name}</option>
</select>
</div>
<input data-multi="delete" class="hidden" type="checkbox" name="templates[{$IDpr}][{$template@iteration}][delete]"/>
<span class="label noflex" data-multi="add" title="Přidat šablonu"><i class="glyphicon glyphicon-plus"></i></span>
<span class="label noflex" data-multi="del" title="Odebrat šablonu"><i class="glyphicon glyphicon-minus"></i></span>
</div>
{/foreach}
</div>
{/case}
{case "figureQuantityDiscount"}
<div class="multi-item" data-multi-id="{$IDpr}" data-multi="item">
{foreach $ret as $discount}
<div class="param-row" data-multi="row" data-multi-id="{$discount@iteration}">
<div class="fullflex">
od <input type="text" class="input fullflex" name="quantity_discount[{$IDpr}][{$discount@iteration}][pieces]" size="15" maxlength="255" value="{$discount.pieces}"/> ks
<input type="text" class="input fullflex" name="quantity_discount[{$IDpr}][{$discount@iteration}][discount]" size="15" maxlength="255" value="{$discount.discount}"/> %
<input type="hidden" name="quantity_discount[{$IDpr}][{$discount@iteration}][id]" value="{$discount.id}">
</div>
<input data-multi="delete" class="hidden" type="checkbox" name="quantity_discount[{$IDpr}][{$discount@iteration}][delete]"/>
<span class="label noflex" data-multi="add" title="Přidat slevu"><i class="glyphicon glyphicon-plus"></i></span>
<span class="label noflex" data-multi="del" title="Odebrat slevu"><i class="glyphicon glyphicon-minus"></i></span>
</div>
{/foreach}
</div>
{/case}
{case "figureCodeOfSuppliers"}
<div class="multi-item" data-multi-id="{$IDpr}" data-multi="item">
{foreach $ret as $code}
<div class="param-row" data-multi="row" data-multi-id="{$code['id']}">
<div style="clear: both;">
<span style="width: 24%;display: inline-block;">
{$param = "onchange='update(this, {$IDpr})'"}
{print_select name="codeOfSuppliers[{$IDpr}][{$code['id']|default:0}][supplier]" var=$view->suppliers selected=$code['id_supplier'] param=$param}
</span>
<input type="text" name="codeOfSuppliers[{$IDpr}][{$code['id']|default:0}][code]" maxlength=50 value="{$code['code']}" style="width: 25%;" placeholder="Kód dodavatele">
<input type="text" name="codeOfSuppliers[{$IDpr}][{$code['id']|default:0}][ean]" maxlength=50 value="{$code['ean']}" style="width: 25%;" placeholder="EAN dodavatele">
<input type="text" name="codeOfSuppliers[{$IDpr}][{$code['id']|default:0}][in_store]" maxlength=50 value="{$code['in_store']}" style="width: 24%;" placeholder="Počet kusů dodavatele">
</div>
<input data-multi="delete" class="hidden" type="checkbox" name="codeOfSuppliers[{$IDpr}][{$code['id']|default:0}][delete]"/>
<span class="label noflex" data-multi="add" title="Přidat šablonu"><i class="glyphicon glyphicon-plus"></i></span>
<span class="label noflex" data-multi="del" title="Odebrat šablonu"><i class="glyphicon glyphicon-minus"></i></span>
</div>
{/foreach}
</div>
{/case}
{case 'figureEAN'}
<input type="text" class="input" name="ean[{$IDpr}]" size="13" maxlength="20" value="{formatEAN($row['ean'])}" onchange="update(this,'{$IDpr}')" />
{/case}
{case 'figureShowMax'}
<input type="text" class="input" name="in_store_show_max[{$IDpr}]" size="5" maxlength="10" value="{$row['in_store_show_max']}" onchange="update(this,'{$IDpr}')" />
{/case}
{case 'figureNote'}
<input type="text" class="input" name="note[{$IDpr}]" size="10" maxlength="50" value="{$row['note']}" onchange="update(this,'{$IDpr}')" />
{/case}
{case 'figureInStoreMin'}
<input type="text" class="input" name="in_store_min[{$IDpr}]" size="10" maxlength="50" value="{$row['in_store_min']}" onchange="update(this,'{$IDpr}')" />
{/case}
{case 'figureMaxCPC'}
<input type="text" class="input" name="max_cpc[{$IDpr}]" size="10" maxlength="50" value="{$row['max_cpc']}" onchange="update(this,'{$IDpr}')" />
{/case}
{case 'figurePriceFinal'}
{if !empty($row)}
{$price = calcPrice($row['price'], getVat($row['vat']), $row['discount'])}
{else}
{$price = ''}
{/if}
<input type="text" class="input" name="priceFinal[{$IDpr}]" size="15" value="{$price}" onkeypress="checkInputData('float')" onchange="update(this,'{$IDpr}')" />
<input type="hidden" class="input" name="priceFinalVat[{$IDpr}]" value="{$row['vat']}" />
<input type="hidden" class="input" name="priceFinalPrice[{$IDpr}]" value="{$row['price']}" />
{/case}
{case 'figurePosition'}
<input type="text" class="input" name="position[{$IDpr}]" size="10" maxlength="50" value="{$row['position']}" onchange="update(this,'{$IDpr}')" />
{/case}
{case 'figureShowInFeed'}
<div align="center">
<input type="checkbox" id="show_in_feed{$IDpr}" name="show_in_feed[{$IDpr}]"
onchange="update(this,'{$IDpr}')" value="1" {$row['show_in_feed']|checked:'Y'} />
<label for="show_in_feed{$IDpr}">&nbsp;Ano</label>
</div>
{/case}
{case 'figureSerialNumberRequire'}
<div align="center">
<input type="checkbox" id="serial_number_require{$IDpr}" name="serial_number_require[{$IDpr}]"
onchange="update(this,'{$IDpr}')" value="1" {$row['serial_number_require']|checked:'Y'} />
<label for="serial_number_require{$IDpr}">&nbsp;Ano</label>
</div>
{/case}
{case 'figureShowInSearch'}
<div align="center">
<input type="checkbox" id="show_in_search{$IDpr}" name="show_in_search[{$IDpr}]"
onchange="update(this,'{$IDpr}')" value="1" {$row['show_in_search']|checked:'Y'} />
<label for="show_in_search{$IDpr}">&nbsp;Ano</label>
</div>
{/case}
{case 'figureProductUnits'}
{$units = $view->getProductUnits()}
{if !$row.unit}
{$units['0'] = "Nezvoleno"}
{$row.unit = "0"}
{/if}
{print_select name="product_unit[{$IDpr}]" var=$units selected=$row.unit}
{/case}
{case 'figureMeasureUnit'}
{$units = $view->getProductUnits()}
{if !$row.measure_unit}
{$units['0'] = "Nezvoleno"}
{$row.unit = "0"}
{/if}
{print_select name="measure_unit[{$IDpr}]" var=$units selected=$row.measure_unit}
{/case}
{case 'figureParamGroups'}
<div>
<select class="selecter ajax-selecter productsFrm_id_parameter_group" name="paramGroups[{$IDpr}]" data-type="parameter_groups" data-autocomplete="parameter_groups" data-preload="parameterGroups" onchange="update(this,'{$IDpr}')" >
<option value="{$row['id_parameter_group']}" selected></option>
</select>
</div>
{/case}
{case 'figurePrintLabels'}
<div>
<input placeholder="1" class="form-control input-sm" style="width:65px;float:left;height:32px; border-bottom-right-radius: 0px; border-top-right-radius: 0px; margin-top:-1px" type="figurePrintLabels" name="printLabels[{$IDpr}]" value="" onchange="update(this,'{$IDpr}')">
<span class="input-group-btn">
<a href="javascript:void(0)" onclick="submitPrintCenter('{$IDpr}')" class="btn btn-primary btn-sm" title="vytisknout"><span class="glyphicon glyphicon-print"></span></a>
</span>
</div>
{/case}
{case 'figureDateAdded'}
<input type="text" id="dateAdded{$IDpr}" class="input" name="dateAdded[{$IDpr}]" size="45" maxlength="80" {if $row['date_added']} value="{date('d.m.Y H:i:s', strtotime($row['date_added']))}" {/if} onchange="update(this,`{$IDpr}`)" autocomplete="off" />
{insert_calendar selector="#dateAdded`$IDpr`" format='datetime'}
{/case}
{case 'figureStockInDate'}
<input type="text" id="stockInDate{$IDpr}" class="input" name="stockInDate[{$IDpr}]" size="45" maxlength="80" {if $row['date_stock_in']} value="{date('d.m.Y H:i:s', strtotime($row['date_stock_in']))}" {/if} onchange="update(this,`{$IDpr}`)" autocomplete="off" />
{insert_calendar selector="#stockInDate`$IDpr`" format='datetime'}
{/case}
{case "articlesProduct"}
<div class="multi-item" data-multi-id="{$IDpr}" data-multi="item">
{foreach $ret as $article}
<div class="param-row" data-multi="row" data-multi-id="{$article@iteration}">
<div class="fullflex">
<select class="ajax-selecter" name="articles_product[{$IDpr}][{$article@iteration}][id]" data-type="article">
<option value="{$article.id}" selected>{$article.title}</option>
</select>
</div>
<input data-multi="delete" class="hidden" type="checkbox" name="articles_product[{$IDpr}][{$article@iteration}][delete]"/>
<span class="label noflex" data-multi="add" title="Přidat článek"><i class="glyphicon glyphicon-plus"></i></span>
<span class="label noflex" data-multi="del" title="Odebrat článek"><i class="glyphicon glyphicon-minus"></i></span>
</div>
{/foreach}
</div>
{/case}
{case "productsCharges"}
<div class="multi-item" data-multi-id="{$IDpr}" data-multi="item">
{foreach array_merge($ret, [[]]) as $charge}
<div class="param-row" data-multi="row" data-multi-id="{$charge@iteration}">
<div class="fullflex">
<select class="ajax-selecter" name="products_charges[{$IDpr}][{$charge@iteration}][id]" data-type="product_charge">
<option value="{$charge.id}" selected>{$charge.title}</option>
</select>
</div>
<input data-multi="delete" class="hidden" type="checkbox" name="products_charges[{$IDpr}][{$charge@iteration}][delete]"/>
<span class="label noflex" data-multi="add" title="Přidat příplatek"><i class="glyphicon glyphicon-plus"></i></span>
<span class="label noflex" data-multi="del" title="Odebrat příplatek"><i class="glyphicon glyphicon-minus"></i></span>
</div>
{/foreach}
</div>
{/case}
{case "figureDimensions"}
<div class="multi-item" data-multi-id="{$IDpr}" data-multi="item">
<div class="param-row" data-multi="row" data-multi-id="{$IDpr}">
<div style="clear: both;">
{foreach $item.input as $key => $inputName}
<input type="text" name="{$inputName}[{$IDpr}]" value="{$row[$inputName]}" onchange="update(this,'{$IDpr}')" style="{if $inputName === 'depth'}width:24%;{else}width:25%;{/if}" placeholder="{$inputName|translate} [cm]" title="{$inputName|translate} [cm]">
{/foreach}
</div>
</div>
</div>
{/case}
{case "figureOssVats"}
{$ossName = $view->getOssCategoryName($row.id_cn)}
<div style="max-width: 500px !important;">
{print_select name="id_cn[{$IDpr}]" var=[''=>'',$row.id_cn => $ossName] selected=$row.id_cn param="data-type='ossVatsCategories' data-value='{$ossName}'" class="ajax-selecter"}
</div>
{/case}
{default}
{capture name="pfExtend" assign="pfExtend"}
{block "printField"}{/block}
{/capture}
{$customField = $pfExtend|strip:""}
{if $customField != ""}
{$customField nofilter}
{elseif $item.input[0] == 'data'}
{printCustomDataField}
{else}
{printDefaultField}
{/if}
{/switch}
{/if}
{/function}
{block "list-filter"}
{$param2 = ['figure' => $figure, 'prepare' => 1, 'filter' => $filter]}
{$param2 = http_build_query($param2)}
{include file="utils/listFilter.tpl" productsMassModification=1}
{/block}
<form method="POST" action="launch.php?s=list.php&type=productsMassModification&page={$pager.number}&{if $smarty.get.order}&order={$smarty.get.order}{/if}{if $smarty.get.adminFilter}&adminFilter={$smarty.get.adminFilter}{/if}" class="viewParams masseditform" role="form">
<input type="submit" name="submitSave" class="hidden" value="1" />
<input type="submit" name="submitSaveAndNext" class="hidden" value="1" />
<table class="table table-striped panel panel-default {block unsortable}{/block} massEditTable unselectable" width="100%">
{* Header columns *}
<thead>
{foreach $columns.fields as $label => $column}
{if $column@iteration > 1}
<th style="width: 35px;"></th>
{/if}
<th {if $column@iteration == 1}data-name{/if}>
{strip}
<div style='width:{$column['size']}px;'>
{if $orderParam.sort == $label}
{if $orderParam.direction == 'DESC'}
{$order = ""}
{else}
{$order = "-"}
{/if}
{else}
{$order = ""}
{/if}
{if $pager}
<a href='{$pager->getUrl(["order" => $order|cat:$label ])}' title="Setřídit sestupně podle sloupce {$label}">
{$label}
{if $orderParam.sort == $label}
<span class="glyphicon glyphicon-chevron-{if $order == ''}down{else}up{/if}"></span>
{/if}
{if $column.parameter}
<a href="javascript:nw('parameter', '{$column.parameter}', 'noopener');">
<span class="badge badge-default" style="margin-left: 10px">
<i class="glyphicon glyphicon-cog"></i>
</span>
</a>
{/if}
</a>
{else}
{$label}
{/if}
</div>
{/strip}
</th>
{/foreach}
<th class="spacer" width="90%">
</th>
</thead>
{* Mass modification *}
<tr class="massEditRow">
<td>
{'editAll'|translate}
</td>
{foreach $editItems as $key => $item}
{if $figure[$key]}
{printField namefield=$key row=array() IDpr=0}
{/if}
{/foreach}
<td class="spacer">
</td>
</tr>
{* Products *}
{$lastIDpr = -1}
{foreach $SQL as $row}
{$IDpr = $row.id}
{if !$figure.Variants || $lastIDpr != $IDpr}
{$lastIDpr = $IDpr}
<tr data-id="{$IDpr}">
<td title="{$row.title}" data-name>
<div class="list_item">
<a href="javascript:nw('product', '{$IDpr}', 'noopener');" tabindex="-1">
{$row.title}
</a>
<input type="hidden" name="ID[]" value="{$IDpr}" />
</div>
</td>
{foreach $editItems as $key => $item}
{if $figure[$key]}
{printField namefield=$key row=$row IDpr=$IDpr}
{/if}
{/foreach}
<td class="spacer">
</td>
</tr>
{/if}
{if $figure.Variants}
{$variations = $object->getVariations($row.pv_id)}
{foreach $variations as $rowv}
{$rowv['price'] = $rowv['pv_price']}
{$IDpr = 'v'|cat:$rowv['id']}
<tr class="variation" data-id="{$IDpr}">
<td title="{$rowv.title}" data-name>
<div class="list_item">
{$rowv.title}
<input type="hidden" name="ID[]" value="{$IDpr}" />
</div>
</td>
{foreach $editItems as $key => $item}
{if $figure[$key]}
{if array_search($key, $editVariantKeys) === false}
<td></td><td></td>
{else}
{printField namefield=$key row=$rowv IDpr=$IDpr}
{/if}
{/if}
{/foreach}
<td></td>
</tr>
{/foreach}
{/if}
{if $row@iteration is div by 100}
{flush nocache}
{/if}
{/foreach}
</table>
</form>

View File

@@ -0,0 +1,286 @@
{extends "../frame.tpl"}
{block "css-entry" append}
{encore_entry_link_tags entry='list' build='admin'}
{/block}
{block "js-onready" append}
{asset_compile}
<script src="./static/js/ProductsMassModification.js"></script>
{/asset_compile}
{/block}
{block body_class}class="list-mass-modification"{/block}
{block "content"}
<div class="container-fluid">
<form method="POST" action="launch.php?s=list.php&type=productsMassModification{if $smarty.get.order}&order={$smarty.get.order}{/if}" class="viewParams"
role="form">
<div class="row">
<input type="hidden" name="s" value="list.php">
<input type="hidden" name="type" value="productsMassModification">
<div class="col-xs-12">
<div class="panel panel-success first" id="massmodification_panel_wrapper">
<div class="panel-heading panel-heading-flex panel-heading-massmodification">
<p class="panel-title">{'massModification'|translate}</p>
<a href="#" class="panel-heading-close" data-massmodification-clear>
{'reset'|translate:'productsFilter'}
<span class="glyphicon glyphicon-remove"></span>
</a>
<script type="text/javascript">
$('#massmodification_panel_wrapper').on('click', '[data-massmodification-clear]', function(){
$('#massmodification_panel_wrapper').find(':input[type="checkbox"]:checked').removeAttr('checked');
$('#massmodification_panel_wrapper').find('select option:selected').removeAttr('selected');
$('#massmodification_panel_wrapper').find('select + .chosen-container').find('.search-choice').remove();
});
</script>
</div>
<div class="panel-body" id="search2">
<div class="row">
{foreach $figureItems.items as $name => $items}
<div class="col-md-2 col-xs-12 control-label">
<h1 class="h4 main-panel-title">{$name|translate}</h1>
{foreach $items as $item_figure}
<div class="checkbox pull-left" style="width:100%;">
<input type="checkbox" name="figure[{$item_figure.key_name}]" value="ON"
id="x2{$item_figure.key_name}" {$figure[$item_figure.key_name]|checked}
class="check">
<label for="x2{$item_figure.key_name}">{$item_figure.name}</label>
</div>
{/foreach}
</div>
{/foreach}
</div>
<div class="row">
{if {find_module name='products_parameters'}}
<br>
<div class="col-md-6" id="figureParameters">
<h1 class="h4 main-panel-title">Parametry</h1>
<div class="row">
<div class="col-md-4">
<div class="checkbox pull-left">
<input id="ParametersInCategory" type="checkbox"
name="figure[ParametersInCategory]"
value="ON" {$figure.ParametersInCategory|checked} class="check">
<label for="ParametersInCategory">Ve vybrané kategorii</label>
</div>
<div class="checkbox pull-left">
<input id="ParametersEmpty" type="checkbox" name="find[ParametersEmpty]"
value="ON" {$find.ParametersEmpty|checked} class="check">
<label for="ParametersEmpty">Pouze nevyplněné</label>
</div>
</div>
<div class="col-md-6 control-label">
<select name="figure[params][]" multiple='multiple' class="selecter small">
{foreach $params as $param_id => $param}
<option value="{$param_id}" {$param_id|selected:$figure.params}>{$param.name}</option>
{/foreach}
</select>
</div>
</div>
</div>
{/if}
<div class="col-md-6" id="figureFeed">
<h1 class="h4 main-panel-title">Feedy</h1>
<div class="row">
<div class="col-md-6 control-label">
<select name="figure[feeds][]" multiple='multiple' class="selecter small">
{foreach $view->getFeeds() as $feed}
<option value="{$feed.id}" {$feed.id|selected:$figure.feeds}>{$feed.name}</option>
{/foreach}
</select>
</div>
<div class="col-md-6 control-label">
{foreach $view->getFeedFields() as $field => $feedItem}
<div class="checkbox pull-left">
<input type="checkbox" name="figure[feed{$field}]" value="ON"
id="x2feed{$field}" {$figure["feed{$field}"]|checked}
class="check">
<label for="x2feed{$field}">{$feedItem.title}</label>
</div>
{/foreach}
</div>
</div>
</div>
{if {find_module name="pricelists"}}
<div class="col-md-6" id="figurePriceLists">
<h1 class="h4 main-panel-title">Ceníky</h1>
<div class="row">
<div class="col-md-6 control-label">
<select name="figure[pricelists][]" multiple='multiple' class="selecter small">
{foreach $view->getPriceLists() as $priceList}
<option value="{$priceList.id}" {$priceList.id|selected:$figure.pricelists}>{$priceList.name}</option>
{/foreach}
</select>
</div>
<div class="col-md-6 control-label">
{foreach $view->getPriceListFields() as $field => $priceListItem}
<div class="checkbox pull-left">
<input type="checkbox" name="figure[priceList{$field}]" value="ON" id="priceList{$field}" {$figure['priceList'|cat:{$field}]|checked} class="check">
<label for="priceList{$field}">{$priceListItem.title}</label>
</div>
{/foreach}
</div>
</div>
</div>
{/if}
{if {find_module name="stores"}}
<div class="col-md-6" id="figureStores">
<h1 class="h4 main-panel-title">Sklady</h1>
<div class="row">
<div class="col-md-6 control-label">
<select name="figure[stores][]" multiple='multiple' class="selecter small">
{foreach $view->getStores() as $store}
<option value="{$store.id}" {$store.id|selected:$figure.stores}>{$store.name}</option>
{/foreach}
</select>
</div>
<div class="col-md-6 control-label">
{foreach $view->getStoresFields() as $field => $storeItem}
<div class="checkbox pull-left">
<input type="checkbox" name="figure[store{$field}]" value="ON"
id="x2store{$field}" {$figure["store$field"]|checked}
class="check">
<label for="x2store{$field}">{$storeItem.title}</label>
</div>
{/foreach}
</div>
</div>
</div>
{/if}
</div>
</div>
</div>
</div>
<div class="col-xs-12">
{include "block.productsFilter.tpl" }
</div>
<div class="col-xs-12 col-md-4">
<div class="panel panel-info">
<div class="panel-heading">{'view'|translate}</div>
<div class="panel-body">
<div class="form-group horizontal">
<div class="col-md-3 control-label right"><label>{'itemCount'|translate}</label></div>
<div class="col-md-3">
{print_select name="figure[divide]" var=$figureDivide selected=$figure.divide param='data-width="auto"'}
</div>
<div class="col-md-6">
<div class="checkbox pull-left">
<input id="showVariants" type="checkbox" name="figure[Variants]"
value="1" {$figure.Variants|checked} class="check"/>
<label for="showVariants">{'showVar'|translate}</label>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-8">
<div class="panel panel-info">
<div class="panel-heading">{'search'|translate}</div>
<div class="panel-body">
<div class="form-group horizontal">
<div class="col-md-2">
<input type="text" name="find[Title]" value="{$find.Title}"
class="form-control input-sm" placeholder="{'name'|translate}"/>
</div>
<div class="col-md-2">
<input type="text" name="find[Description]" value="{$find.Description}"
class="form-control input-sm" placeholder="{'other'|translate}"/>
</div>
<div class="col-md-2">
<div class="input-group">
<input type="text" name="find[Code]" value="{$find.Code}" class="form-control input-sm"
placeholder="{'code'|translate}" id="paste">
<span class="input-group-btn">
<button type="button" class="btn btn-sm" title="Zvětšit" data-toggle="modal" data-target="#codeModal">
<span class="glyphicon glyphicon-resize-full"></span>
</button>
</span>
</div>
{include "utils/codesModal.tpl" modal_id="codeModal" title="Kódy/EANy produktů"}
<script>
initCodesModal('#paste', '#paste-modal', '#codeModal')
</script>
</div>
<div class="col-md-2">
<div class="checkbox pull-left">
<input type="checkbox" id="CodeEmpty" name="find[CodeEmpty]"
value="ON" {$find.CodeEmpty|checked} class="check"/>
<label for="CodeEmpty">{'empty'|translate}</label>
</div>
</div>
{if $cfg.Modules.products.note}
<div class="col-md-2">
<input type="text" name="find[Note]" value="{$find.Note}"
class="form-control input-sm" placeholder="Poznámka"/>
</div>
<div class="col-md-2">
<div class="checkbox pull-left">
<input type="checkbox" id="NoteEmpty" name="find[NoteEmpty]"
value="ON" {$find.NoteEmpty|checked} class="check"/>
<label for="NoteEmpty">prázdná</label>
</div>
</div>
{/if}
</div>
</div>
</div>
</div>
</div>
<div class="row" style="margin-bottom:20px; display: flex; align-items: center;">
<div class="col-md-3 col-lg-2 col-xs-12">
{* je vedle paginace ale v jinym formu *}
<input type="hidden" name="prepare"
value="{if !empty($smarty.get.prepare)}{$smarty.get.prepare}{elseif !empty($smarty.post.prepare)}{$smarty.post.prepare}{/if}"
class="check"/>
<input type="submit" name="submitSettings" class="btn btn-primary btn-block"
value="{'changeView'|translate}">
</div>
<div class="col-md-3 col-lg-2 col-xs-12 text-right" style="flex-grow: 1; color: #555;">
Počet produktů: {$pager.total}
</div>
</div>
</form>
</div>
<div class="container-fluid">
{include "list/products.massModification.fields.tpl"}
</div>
<div class="container-fluid footer">
<div class="row window-btns">
<div class="slide-right">
<div class="col-md-3 col-lg-2">
<input type="submit" name="submitSave" class="btn btn-success btn-block" data-submit
value="{'save'|translate}"/>
</div>
<div class="col-md-3 col-lg-2">
{if $pager.count > 1}
<input type="submit" name="submitSaveAndNext" class="btn btn-success btn-block" data-submit
value="{'saveNext'|translate}"
{if $pager.number == $pager.count}disabled='disabled'{/if} />
{/if}
</div>
<div class="pull-right">
{include file="utils/pager.tpl"}
</div>
</div>
</div>
</div>
</div>
{/block}

View File

@@ -0,0 +1,12 @@
{extends "list.tpl"}
{block "content" prepend}
<style>
tr.up td {
background-color: #FF858D;
}
tr.down td {
background-color: #DADDFC;
}
</style>
{/block}

View File

@@ -0,0 +1,38 @@
{extends "../list.tpl"}
{block "list-filter" append}
{* todo *}
{if !isset($filtersStorage)}
<div class="panel-heading">
<div class="row">
{if !empty($filtersValue)}
{foreach $filtersValue as $filter}
<div class="col-md-2 no-margin">
<div class="list_filter">
<select name="IDpr" class="selecter input-sm">
{$filter@key}
{foreach $filter as $option}
<option value="{$option@key}" {if $option.choiced == true}selected{/if}>{$option.name}</option>
{/foreach}
</select>
</div>
</div>
{/foreach}
<script type="text/javascript">
$(".list_filter select").on('change',function (e) {
$this = $(this);
window.location.href = window.location.href + "&" + $this.serialize();
});
</script>
{/if}
</div>
</div>
{/if}
{/block}
<script type="text/javascript">
{block onready append}
sortableList("products");
{/block}
</script>

View File

@@ -0,0 +1,78 @@
{extends "../list.tpl"}
{block body_class}class="list-reviews"{/block}
{block "content"}
<form method="post" action="launch.php?s=list.php&type=reviews&type_list={$smarty.get.type_list}">
{$smarty.block.parent}
</form>
{/block}
{block bottomPagination}
<div class="row">
<div class="col-md-6">
{paginationList pager=$pager}
</div>
{if $smarty.get.type_list=='ShowNotConfirmed'}
<div class="col-md-2 col-md-offset-4">
<input type="submit" name="Submit" class="btn btn-primary btn-block" value="Schválit vše"/>
</div>
{/if}
</div>
{/block}
<script>
{block onready append}
$('[data-form-delete]').on('click', function() {
var row = $(this).closest('tr');
var reviewId = row.find('[data-form-delete-input]').data('formDeleteInput');
var data = { };
data[reviewId] = { 'delete': 1 };
$.ajax({
type: 'POST',
url: 'launch.php?s=list.php&type=reviews',
data: {
'data': {
'reviews': data
}
},
success: function(msg) {
row.fadeOut(500);
showInfoMessage("Smazáno", 'success');
row.remove();
},
error: function() {
showInfoMessage("Chyba při odeslání. Obnovte prosím stránku a zkuste to znovu.", 'error');
}
});
});
$('[data-form-top]').on('click', function() {
var row = $(this).closest('tr');
var reviewId = row.find('[data-form-top-input]').data('formTopInput');
var data = { };
data[reviewId] = { 'top': 1 };
$.ajax({
type: 'POST',
url: 'launch.php?s=list.php&type=reviews',
data: {
'data': {
'reviews': data
}
},
success: function(msg) {
{if $smarty.get.type_list!='ShowNotConfirmed'}
row.find('.review-figure').html('{KupShop\CatalogBundle\Util\ReviewsUtil::$rank[5]|translate:'reviews'}');
row.find('.review-top').addClass('disabled');
{else}
row.fadeOut(500);
{/if}
showInfoMessage("Uloženo", 'success');
row.remove();
},
error: function() {
showInfoMessage("Chyba při odeslání. Obnovte prosím stránku a zkuste to znovu.", 'error');
}
});
});
{/block}
</script>

View File

@@ -0,0 +1,40 @@
{function printTree}
{foreach $data as $entry}
{if !$zero && $entry.id === 0}
{continue}
{/if}
{$width = 500 - ($entry.level * 26)}
<li class="node {$view->resolveCallable($tableDef.class, $entry)}"
data-id="{$view->getListRowValue($entry, $tableDef.id)}">
<div class="nodeWrapper tdd-row">
{foreach $tableDef.fields as $name => $column}
{if ($column.wpjAdmin and !isSuperuser()) or $column.visible == 'N'}
{continue}
{/if}
<div class="list_item {if $isEditing}is-editable{/if} tdd-column tdd-column-{$column@index + 1} {$view->resolveCallable($column.class, $entry) nofilter}">
{$view->printListRowItem($column, $entry)}
</div>
{/foreach}
</div>
{if !empty($entry.children) && ($openedSections == 'all' || in_array($entry.id, $openedSections))}
<ul class="tdd-tree">
{printTree data=$entry.children tableDef=$tableDef}
</ul>
{/if}
</li>
{/foreach}
{/function}
{if $SQL[0].id === 0}
<div class="table">
<ul class="sections-root">
{printTree data=[$SQL[0]] tableDef=$columns zero=true}
</ul>
</div>
{/if}
<div class="treeDragDrop sections-sortable table" id="sectionsRoot">
<ul class="tdd-tree nestedSortable nestedSortableRoot">
{printTree data=$SQL tableDef=$columns}
</ul>
</div>

View File

@@ -0,0 +1,247 @@
{extends "../list.tpl"}
{block css append}
<style>
{$sizeSum = 0}
{foreach $columns.fields as $name => $column}
{if ($column.wpjAdmin and !isSuperuser()) or $column.visible == 'N'}
{continue}
{/if}
{$sizeSum = $sizeSum + $column.size}
{/foreach}
{if $sizeSum > 0}{$singlePartRelSize = 100/$sizeSum}{else}{$singlePartRelSize = 10}{/if}
{$partCounter = 0}
{foreach $columns.fields as $name => $column}
{if ($column.wpjAdmin and !isSuperuser()) or $column.visible == 'N'}
{continue}
{/if}
.tdd-row > .tdd-column-{$column@index + 1} {
left: {$singlePartRelSize*$partCounter}%;
width: {$singlePartRelSize*$column.size}%;
}
{$partCounter = $partCounter + $column.size}
{/foreach}
</style>
{/block}
{block js append}
<script src="./static/js/jquery.mjs.nestedSortable.js"></script>
{/block}
{block name="list-panel-class"}menu-list{/block}
{block 'list-filter'}
<div class="wpj-panel-heading">
<div class="list-filters-wrapper">
<div class="list-filters-left">
<div class="filter-item">
{if $smarty.get.opened == 'all'}
<a class="btn btn-xs btn-ghost" href="launch.php?s={$view->getPageHandler()}&type={$view->getListName()}">
<i class="bi bi-dash-circle m-r-1"></i>Sbalit vše
</a>
{else}
<a class="btn btn-xs btn-ghost" href="launch.php?s={$view->getPageHandler()}&type={$view->getListName()}&opened=all">
<i class="bi bi-plus-circle m-r-1"></i>Rozbalit vše
</a>
{/if}
</div>
</div>
<div class="list-filters-right">
<div class="filter-item">
<button title="Upravit zobrazení sloupců" onclick="nw('ListColumns', '', 'pg={$smarty.get.type}')"
class="btn btn-xs btn-ghost">
<i class="bi bi-arrows-move m-r-1"></i>{'editListColumns'|translate:'filters'}
</button>
</div>
</div>
</div>
</div>
{/block}
{block listTable}
{block 'sections-header'}
<div class="tdd-row thh-row">
{foreach $columns.fields as $label => $column}
{if ($column.wpjAdmin and !isSuperuser()) or $column.visible == 'N'}
{continue}
{/if}
<div class="tdd-column tdd-column-{$column@index + 1} {$view->resolveCallable($column.class, $entry) nofilter}">
<small>{$object->printHeaderLabel($column.title, $column)}&nbsp;</small>
</div>
{/foreach}
</div>
{/block}
<div class="table">
{include "./sections.ajax.tpl"}
</div>
{/block}
{block bottomPagination}
<div class="pagination-sticky">
<div class="pagination-buttons">
{if findModule('products_sections', 'virtual_to_db')}
<div class="filter-item">
<a href="launch.php?s=list.php&type={$view->getListName()}&acn=generateVirtualSections"
class="btn btn-danger"
title="Přegeneruje virtuální sekce, které se jinak přegeneovávájí jednou za dvě hodiny.">
Přegenerovat virtuální sekce
</a>
</div>
{/if}
{block "list-filter-mass-edit"}
{if $showMassEdit}
<a title="Hromadná úprava" href="launch.php?s=listEdit.php&type={$view->getListName()}"
class="btn btn-secondary"><span class="bi bi-list-check m-r-1"></span>Hromadná úprava
</a>
{/if}
{/block}
</div>
</div>
{/block}
{block unsortable}unsortable{/block}
<script>
{block onready append}
function setCookie(c_name, value, exdays) {
var exdate = new Date();
exdate.setDate(exdate.getDate() + exdays);
var c_value = encodeURIComponent(value) + '; path=/' + (exdays == null ? '' : '; expires=' + exdate.toUTCString());
document.cookie = c_name + '=' + c_value;
}
const getOpened = () => $.map($('.treeDragDrop').find('li .opener:not(.plus)'), function(elem) {
return $(elem).closest("li").data("id");
});
function customRefresh(url) {
const openedBranches = getOpened();
if (openedBranches.length) {
setCookie('products_list_opened_sections', JSON.stringify(openedBranches))
}
setWindowStorage("listPosition_x", window.scrollY, window);
var js = $('.highRow').find("td a[href^=javascript]").attr('href');
var ID;
if (typeof js == 'undefined')
ID = 0;
else
ID = js.replace(/javascript:nw\(\'(.+)'\, '(\d+)'\, '(.*)'\);/, '$2');
setWindowStorage("listHighRow", ID, window);
}
{literal}
function initListTreeAjax(name, url, selector) {
var $tree = $(selector ? selector : '#sectionsRoot > ul');
$('#sectionsRoot > ul').nestedSortable({
handle: '.drag-drop-mover',
items: '.node',
listType: 'ul',
toleranceElement: '> .nodeWrapper',
placeholder: 'placeholder',
isTree: true,
connectWith: '.nestedSortableRoot',
start: function(event, ui) {
/* on drag start find index and parent id of moved item */
ui.item.startPos = ui.item.index();
var $parent = ui.item.parents('[data-id]');
ui.item.startParent = $parent.length ? $parent.data('id') : null;
},
update: function(event, ui) {
var $parent = ui.item.parents('[data-id]');
var $prev = ui.item.prev();
var $next = ui.item.next();
var data = {
tree: {
id: ui.item.data('id'),
position: ui.item.index()
}
};
if ($parent.length) {
data['tree']['target'] = $parent.data('id');
}
if ($prev.length) {
data['tree']['after'] = $prev.data('id');
}
if ($next.length) {
data['tree']['before'] = $next.data('id');
}
// up or down?
if (ui.item.startParent === data['tree']['target'] && ui.item.startPos <= data['tree']['position']) {
data['tree']['position'] += 1;
}
$.post(url, data, function(res) {
//TODO: error handling
return true;
});
},
});
$tree.on("click", "li .opener:not(.disabled)", function() {
var $li = $(this).closest("li");
var $this = $(this);
var $ul = $li.children("ul").first();
var id = $li.data("id");
const toggleOpen = () => {
$this.removeClass("plus").addClass('minus');
$li.removeClass('mjs-nestedSortable-collapsed').addClass('mjs-nestedSortable-expanded');
}
const toggleClosed = () => {
$this.removeClass("minus").addClass('plus');
$li.addClass('mjs-nestedSortable-collapsed').removeClass('mjs-nestedSortable-expanded');
}
if (!$this.is(".plus")) {
toggleClosed();
} else {
if ($ul.length < 1) {
$.ajax({
url: window.location,
type: "get",
data: {
root: id
},
success: function(response) {
$li.append($(response).html());
toggleOpen();
{/literal}
{block subsectionLoaded}
{/block}
{literal}
},
error: function() {
showInfoMessage('Chyba při načítání podsekcí', 'danger');
}
});
} else {
toggleOpen();
}
}
return false;
});
return this;
}
{/literal}
initListTreeAjax("sections", "{$ctrl.currUrl.Rel nofilter}&acn=drag");
{/block}
</script>

View File

@@ -0,0 +1,90 @@
{extends "../list.tpl"}
{block buttons_dropup}
<li>
<a href="{$ctrl.currUrl.Rel}&acn=StockInExport" title="Export naskladnění s položkami">
Export naskladnění s položkami
</a>
</li>
{/block}
{block "list-content" append}
{if isset($price)}
<div class="col-md-12">
<div class="well">
Cena celkem: <b>{$price|format_price}</b>
</div>
</div>
{/if}
{if $smarty.get.index == 'future'}
<div class="col-md-2 col-md-offset-10">
<div class="well">
<input type="button" class="btn btn-primary btn-block" onClick="massStockIn();" value="Hromadná kontrola"/>
</div>
</div>
<script type="text/javascript">
function massStockIn() {
let checked = $('input[name="stockIns"]:checked').map(function () {
return this.value;
}).get().join('_');
nw('stockInCheck', checked);
}
</script>
{/if}
{/block}
{block name="list-filter" append}
{if !empty($var.closure_now.with_vat)}
<div class="panel-heading">
<div class="row">
<div class="col-md-3 control-label">
<strong>Aktuální hodnota skladu: </strong>
</div>
<div class="col-md-3">
<strong>{$var.closure_now.with_vat|format_price} </strong>s DPH
</div>
<div class="col-md-3">
<strong> {$var.closure_now.without_vat|format_price} </strong>bez DPH
</div>
<div class="col-md-2">
<a href="?s=list.php&type=stockIn&acn=exportCurrentStore" class="btn btn-primary">Exportovat aktuální hodnotu skladu</a>
</div>
</div>
{if !empty($var.closure_last)}
<div class="row">
<div class="col-md-3 control-label">
<strong>Poslední uzávěrka: </strong>
</div>
<div class="col-md-3">
<strong>{$var.closure_last.without_vat|format_price} </strong>bez DPH
</div>
<div class="col-md-1 control-label">
<strong>Rozdíl: </strong>
</div>
<div class="col-md-3">
<strong> {{$var.closure_now.without_vat-$var.closure_last.without_vat}|format_price} </strong>bez DPH
</div>
</div>
{/if}
</div>
{/if}
{/block}
<script>
{block onready append}
var reload_timer;
timeout_reload();
$(document).on('click', 'input', function () {
clearTimeout(reload_timer);
timeout_reload();
});
function timeout_reload() {
reload_timer = setTimeout(function () {
window.location.reload(1);
}, 60 * 1000);
}
{/block}
</script>

View File

@@ -0,0 +1,62 @@
{extends "../list.tpl"}
{block 'table-class' append} stockInMissingTable {/block}
<script type="text/javascript">
{block onready append}
let constData = {
{if $smarty.get.sellInterval}sellInterval: {$smarty.get.sellInterval},{/if}
{if $smarty.get.interval}interval: {$smarty.get.interval},{/if}
};
function initStockInMissingTableAjax(name, url, selector) {
var $table = $(selector ? selector : '.stockInMissingTable');
$table.on("click", '[data-acn="OrdersOfSupplierAdd"]', function (e) {
e.preventDefault();
var $this = $(this);
var addData = $this.data('adddata');
$pieces = $this.parent().prev().find('[name="pieces"]');
addData.pieces = $pieces.val() || $pieces.attr('placeholder');
addData.pieces = /^\d+$/.test(addData.pieces) ? parseInt(addData.pieces) : 0;
if(addData.pieces <= 0) {
return;
}
var $tr = $this.closest('tr').parent().closest('tr');
$.ajax({
url: 'launch.php?s=list.php&type=stockInMissing',
type: "post",
data: {
...constData,
data: addData
},
success: function (response) {
$tr.replaceWith($(response).find('.stockInMissingTable > tbody > tr').first());
},
error: function (xhr) {
showInfoMessage('Chyba při objednání produktů', 'danger');
}
});
});
return this;
}
initStockInMissingTableAjax("stockInMissing", "{$ctrl.currUrl.Rel nofilter}");
$('.stockInMissingTable').on("click", '[data-acn="OrdersAdd"]', function (e) {
e.preventDefault();
const $this = $(this);
$this.parents('tr.no-row-click').siblings().removeClass('highRow');
$this.parents('tr.no-row-click').addClass('highRow');
const addData = $this.data('adddata');
let order_url = addData.order_url.replaceAll('{ldelim}CODE{rdelim}', addData.code);
const target = 'supplier' + addData.id_supplier.toString();
const win = window.top.open(order_url, target, '');
win.focus();
});
{/block}
</script>