Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions core/components/minishop3/controllers/mgr/orders.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public function loadCustomCssJs()
$this->addJavascript($this->ms3->config['jsUrl'] . 'mgr/orders/orders.wrapper.js');

$config = $this->ms3->config;
$config['order_show_drafts'] = (bool) $this->modx->getOption('ms3_order_show_drafts', null, false);
$this->addHtml('<script>Object.assign(ms3.config, ' . json_encode($config) . ');</script>');

$this->addCss($this->ms3->config['assetsUrl'] . 'css/mgr/vue-dist/primeicons.min.css');
Expand Down
2 changes: 2 additions & 0 deletions core/components/minishop3/lexicon/en/vue.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -489,6 +489,8 @@
$_lang['orders_title'] = 'Orders';
$_lang['orders_month'] = 'Orders';
$_lang['orders_month_sum'] = 'Total sum';
$_lang['orders_stat_tooltip'] = 'Count and sum for placed orders only; drafts are not included';
$_lang['ms3_orders_show_drafts'] = 'Show drafts';
$_lang['order_num'] = 'Number';
$_lang['order_customer'] = 'Customer';
$_lang['order_status'] = 'Status';
Expand Down
2 changes: 2 additions & 0 deletions core/components/minishop3/lexicon/ru/vue.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -489,6 +489,8 @@
$_lang['orders_title'] = 'Заказы';
$_lang['orders_month'] = 'Заказов';
$_lang['orders_month_sum'] = 'На сумму';
$_lang['orders_stat_tooltip'] = 'Количество и сумма по оформленным заказам; черновики не учитываются';
$_lang['ms3_orders_show_drafts'] = 'Показывать черновики';
$_lang['order_num'] = 'Номер';
$_lang['order_customer'] = 'Клиент';
$_lang['order_status'] = 'Статус';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,11 +155,7 @@ public function getList(array $params = []): array
}
}

$showDrafts = $this->modx->getOption('ms3_order_show_drafts', null, false);
if (!$showDrafts) {
$statusDrafts = (int) $this->modx->getOption('ms3_status_draft', null, 1) ?: 1;
$c->where(['status_id:!=' => $statusDrafts]);
}
$this->applyDraftVisibilityFilter($c, $params);

if (!empty($query)) {
if (is_numeric($query)) {
Expand Down Expand Up @@ -1535,6 +1531,41 @@ protected function getOrdersStats(array $params = []): array
];
}

/**
* Whether draft orders should be included in the manager orders list query.
*
* When `show_drafts` is present in request params it overrides `ms3_order_show_drafts`.
* The Vue orders grid always sends this flag (initialized from ms3.config.order_show_drafts).
*/
protected function shouldShowDrafts(array $params): bool
{
$default = (bool) $this->modx->getOption('ms3_order_show_drafts', null, false);

if (!array_key_exists('show_drafts', $params)) {
return $default;
}

$value = $params['show_drafts'];
if ($value === '' || $value === null) {
return $default;
}

return filter_var($value, FILTER_VALIDATE_BOOLEAN);
}

/**
* Exclude draft status from getList query unless drafts are explicitly shown.
*/
protected function applyDraftVisibilityFilter($c, array $params): void
{
if ($this->shouldShowDrafts($params)) {
return;
}

$statusDrafts = (int) $this->modx->getOption('ms3_status_draft', null, 1) ?: 1;
$c->where(['status_id:!=' => $statusDrafts]);
}

/**
* Apply filter to query
*
Expand Down
52 changes: 49 additions & 3 deletions vueManager/src/components/OrdersGrid.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import { useLexicon } from '@vuetools/useLexicon'
import Button from 'primevue/button'
import Card from 'primevue/card'
import Checkbox from 'primevue/checkbox'
import Column from 'primevue/column'
import ConfirmDialog from 'primevue/confirmdialog'
import DataTable from 'primevue/datatable'
Expand All @@ -20,6 +21,20 @@ import ActionsColumn from './ActionsColumn.vue'
const toast = useToast()
const { _ } = useLexicon()

const ms3Config = typeof ms3 !== 'undefined' ? ms3.config : null
const showDrafts = ref(Boolean(ms3Config?.order_show_drafts))

/** Filter keys sent as direct API params (not filter_ prefix). */
const DIRECT_FILTER_KEYS = new Set([
'query',
'status_id',
'delivery_id',
'payment_id',
'context_key',
'createdon_from',
'createdon_to',
])

// Bulk selection
const {
selectedItems,
Expand Down Expand Up @@ -73,13 +88,13 @@ async function loadOrders() {
limit: rows.value,
sort: sortField.value,
dir: sortOrder.value === 1 ? 'ASC' : 'DESC',
show_drafts: showDrafts.value ? 1 : 0,
}

// Apply filter values
Object.keys(filterValues.value).forEach(key => {
const value = filterValues.value[key]
if (value !== null && value !== undefined && value !== '') {
// Handle daterange type
const filterConfig = filters.value[key]
if (filterConfig?.type === 'daterange' && Array.isArray(value)) {
if (value[0]) {
Expand All @@ -90,8 +105,10 @@ async function loadOrders() {
}
} else if (filterConfig?.type === 'datepicker' && value) {
params[key] = formatDateForApi(value)
} else {
} else if (DIRECT_FILTER_KEYS.has(key)) {
params[key] = value
} else {
params[`filter_${key}`] = value
}
}
})
Expand Down Expand Up @@ -373,6 +390,11 @@ const hasActiveFilters = computed(() => {
return Object.values(filterValues.value).some(v => v !== null && v !== '' && v !== undefined)
})

function toggleShowDrafts() {
first.value = 0
loadOrders()
}

/**
* Load grid configuration
*/
Expand Down Expand Up @@ -547,7 +569,7 @@ onMounted(async () => {
@click="createNewOrder"
/>
</div>
<div class="grid-stats">
<div class="grid-stats" :title="_('orders_stat_tooltip')">
<span class="stat-item">
<i class="pi pi-calendar"></i>
{{ _('orders_month') }}: <strong>{{ stats.month_total }}</strong>
Expand Down Expand Up @@ -648,6 +670,15 @@ onMounted(async () => {

<!-- Filter buttons -->
<div class="filter-buttons">
<div class="show-drafts-toggle">
<Checkbox
v-model="showDrafts"
input-id="orders-show-drafts"
binary
@change="toggleShowDrafts"
/>
<label for="orders-show-drafts">{{ _('ms3_orders_show_drafts') }}</label>
</div>
<Button
:label="_('apply_filters')"
icon="pi pi-filter"
Expand Down Expand Up @@ -824,6 +855,7 @@ onMounted(async () => {
gap: 1.5rem;
font-size: 0.9rem;
color: var(--ms3-text-muted);
cursor: help;
}

.stat-item {
Expand Down Expand Up @@ -876,7 +908,21 @@ onMounted(async () => {

.filter-buttons {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
}

.show-drafts-toggle {
display: flex;
align-items: center;
gap: 0.5rem;
margin-right: auto;
}

.show-drafts-toggle label {
cursor: pointer;
user-select: none;
}

/* Bulk actions toolbar */
Expand Down