673 lines
24 KiB
JavaScript
673 lines
24 KiB
JavaScript
import {ad as w, r as R, j as e, S as L, ae as $, a1 as U, af as v, ac as p, a2 as I, a3 as x, a4 as m, a7 as f, a5 as M, a6 as P, ag as O, t as Q, ah as G, ai as _, s as V, e as b, X as E, aj as A, ak as N, al as z, am as q, an as T, c as H} from "./index-CdMy-Rhi.js";
|
||
import {L as F} from "./List-Xt0hH74q.js";
|
||
import {s as D} from "./ServicesPage.module-BAnCpO1K.js";
|
||
/**
|
||
* @license @tabler/icons-react v3.21.0 - MIT
|
||
*
|
||
* This source code is licensed under the MIT license.
|
||
* See the LICENSE file in the root directory of this source tree.
|
||
*/
|
||
var X = w("outline", "arrow-down", "IconArrowDown", [["path", {
|
||
d: "M12 5l0 14",
|
||
key: "svg-0"
|
||
}], ["path", {
|
||
d: "M18 13l-6 6",
|
||
key: "svg-1"
|
||
}], ["path", {
|
||
d: "M6 13l6 6",
|
||
key: "svg-2"
|
||
}]]);
|
||
/**
|
||
* @license @tabler/icons-react v3.21.0 - MIT
|
||
*
|
||
* This source code is licensed under the MIT license.
|
||
* See the LICENSE file in the root directory of this source tree.
|
||
*/
|
||
var J = w("outline", "arrow-up", "IconArrowUp", [["path", {
|
||
d: "M12 5l0 14",
|
||
key: "svg-0"
|
||
}], ["path", {
|
||
d: "M18 11l-6 -6",
|
||
key: "svg-1"
|
||
}], ["path", {
|
||
d: "M6 11l6 -6",
|
||
key: "svg-2"
|
||
}]]);
|
||
/**
|
||
* @license @tabler/icons-react v3.21.0 - MIT
|
||
*
|
||
* This source code is licensed under the MIT license.
|
||
* See the LICENSE file in the root directory of this source tree.
|
||
*/
|
||
var W = w("outline", "download", "IconDownload", [["path", {
|
||
d: "M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2",
|
||
key: "svg-0"
|
||
}], ["path", {
|
||
d: "M7 11l5 5l5 -5",
|
||
key: "svg-1"
|
||
}], ["path", {
|
||
d: "M12 4l0 12",
|
||
key: "svg-2"
|
||
}]]);
|
||
/**
|
||
* @license @tabler/icons-react v3.21.0 - MIT
|
||
*
|
||
* This source code is licensed under the MIT license.
|
||
* See the LICENSE file in the root directory of this source tree.
|
||
*/
|
||
var Y = w("outline", "file-type-pdf", "IconFileTypePdf", [["path", {
|
||
d: "M14 3v4a1 1 0 0 0 1 1h4",
|
||
key: "svg-0"
|
||
}], ["path", {
|
||
d: "M5 12v-7a2 2 0 0 1 2 -2h7l5 5v4",
|
||
key: "svg-1"
|
||
}], ["path", {
|
||
d: "M5 18h1.5a1.5 1.5 0 0 0 0 -3h-1.5v6",
|
||
key: "svg-2"
|
||
}], ["path", {
|
||
d: "M17 18h2",
|
||
key: "svg-3"
|
||
}], ["path", {
|
||
d: "M20 15h-3v6",
|
||
key: "svg-4"
|
||
}], ["path", {
|
||
d: "M11 15v6h1a2 2 0 0 0 2 -2v-2a2 2 0 0 0 -2 -2h-1z",
|
||
key: "svg-5"
|
||
}]]);
|
||
const Z = () => {
|
||
const t = r => r.priceRanges.length == 0 ? e.jsxs(e.Fragment, {
|
||
children: [r.price, "₽"]
|
||
}) : e.jsx(e.Fragment, {
|
||
children: e.jsx(F, {
|
||
children: r.priceRanges.map(n => e.jsx(F.Item, {
|
||
children: `${n.fromQuantity} - ${n.toQuantity}: ${n.price}₽`
|
||
}, n.id))
|
||
})
|
||
});
|
||
return R.useMemo( () => [{
|
||
accessorKey: "category",
|
||
header: "Категория",
|
||
accessorFn: r => `${r.category.name}`,
|
||
enableColumnOrdering: !0,
|
||
enableSorting: !1
|
||
}, {
|
||
accessorKey: "name",
|
||
header: "Услуга",
|
||
enableGrouping: !1,
|
||
enableSorting: !1,
|
||
Cell: ({row: r, cell: n}) => r.original.isPlaceholder ? "" : n.renderValue()
|
||
}, {
|
||
accessorKey: "price",
|
||
header: "Цена",
|
||
enableGrouping: !1,
|
||
enableSorting: !1,
|
||
Cell: ({row: r}) => r.original.isPlaceholder ? "" : t(r.original)
|
||
}, {
|
||
accessorKey: "cost",
|
||
header: "Себестоимость",
|
||
enableGrouping: !1,
|
||
enableSorting: !1,
|
||
Cell: ({row: r}) => r.original.isPlaceholder ? "" : `${r.original.cost}₽`
|
||
}], [])
|
||
}
|
||
;
|
||
var h = (t => (t[t.DEAL_SERVICE = 0] = "DEAL_SERVICE",
|
||
t[t.PRODUCT_SERVICE = 1] = "PRODUCT_SERVICE",
|
||
t[t.SERVICES_KITS = 2] = "SERVICES_KITS",
|
||
t))(h || {});
|
||
const ee = [{
|
||
label: "Для товара",
|
||
value: "1"
|
||
}, {
|
||
label: "Для сделки",
|
||
value: "0"
|
||
}, {
|
||
label: "Наборы услуг",
|
||
value: "2"
|
||
}]
|
||
, te = t => e.jsx(L, {
|
||
data: ee,
|
||
...t
|
||
})
|
||
, re = ({items: t, onDelete: r, onChange: n, serviceType: u, editMode: S}) => {
|
||
const s = $()
|
||
, l = Z()
|
||
, C = t.map(a => a.category).map(a => u === h.DEAL_SERVICE ? a.dealServiceRank : a.productServiceRank)
|
||
, d = C.sort()[0]
|
||
, c = C.sort()[C.length - 1]
|
||
, g = a => {
|
||
n && f.openContextModal({
|
||
modal: "createService",
|
||
title: "Создание услуги",
|
||
withCloseButton: !1,
|
||
innerProps: {
|
||
onChange: o => n(o),
|
||
element: a
|
||
}
|
||
})
|
||
}
|
||
;
|
||
return e.jsx(U, {
|
||
data: t,
|
||
columns: l,
|
||
restProps: {
|
||
enableGrouping: !0,
|
||
initialState: {
|
||
grouping: ["category"]
|
||
},
|
||
state: {
|
||
columnVisibility: {
|
||
"mrt-row-drag": S
|
||
}
|
||
},
|
||
enableColumnActions: !1,
|
||
enableRowOrdering: !0,
|
||
mantineRowDragHandleProps: ({table: a}) => ({
|
||
onDragEnd: () => {
|
||
const {draggingRow: o, hoveredRow: i} = a.getState();
|
||
!(i != null && i.original) || !(o != null && o.original) || v.reorderService({
|
||
requestBody: {
|
||
drainingServiceId: o.original.id,
|
||
hoveredServiceId: i.original.id
|
||
}
|
||
}).then( ({ok: y, message: K}) => {
|
||
if (!y) {
|
||
p.guess(y, {
|
||
message: K
|
||
});
|
||
return
|
||
}
|
||
s.invalidateQueries({
|
||
queryKey: ["getAllServices"]
|
||
}).then( () => {}
|
||
)
|
||
}
|
||
)
|
||
}
|
||
}),
|
||
displayColumnDefOptions: {
|
||
"mrt-row-drag": {
|
||
AggregatedCell: ({row: a}) => {
|
||
const o = u === h.DEAL_SERVICE ? a.original.category.dealServiceRank : a.original.category.productServiceRank;
|
||
return e.jsxs(I, {
|
||
gap: "xs",
|
||
children: [e.jsx(x, {
|
||
label: "Поднять вверх",
|
||
children: e.jsx(m, {
|
||
disabled: o === d,
|
||
onClick: () => {
|
||
v.reorderServiceCategory({
|
||
requestBody: {
|
||
serviceType: u,
|
||
categoryId: a.original.category.id,
|
||
moveDown: !1,
|
||
moveUp: !0
|
||
}
|
||
}).then( ({ok: i, message: y}) => {
|
||
if (!i) {
|
||
p.guess(i, {
|
||
message: y
|
||
});
|
||
return
|
||
}
|
||
s.invalidateQueries({
|
||
queryKey: ["getAllServices"]
|
||
}).then( () => {}
|
||
)
|
||
}
|
||
)
|
||
}
|
||
,
|
||
variant: "default",
|
||
children: e.jsx(J, {})
|
||
})
|
||
}), e.jsx(x, {
|
||
label: "Опустить вниз",
|
||
children: e.jsx(m, {
|
||
disabled: o === c,
|
||
onClick: () => {
|
||
v.reorderServiceCategory({
|
||
requestBody: {
|
||
serviceType: u,
|
||
categoryId: a.original.category.id,
|
||
moveDown: !0,
|
||
moveUp: !1
|
||
}
|
||
}).then( ({ok: i, message: y}) => {
|
||
if (!i) {
|
||
p.guess(i, {
|
||
message: y
|
||
});
|
||
return
|
||
}
|
||
s.invalidateQueries({
|
||
queryKey: ["getAllServices"]
|
||
}).then( () => {}
|
||
)
|
||
}
|
||
)
|
||
}
|
||
,
|
||
variant: "default",
|
||
children: e.jsx(X, {})
|
||
})
|
||
})]
|
||
})
|
||
}
|
||
},
|
||
"mrt-row-actions": {
|
||
AggregatedCell: ({row: a}) => S && e.jsxs(I, {
|
||
gap: "xs",
|
||
children: [e.jsx(x, {
|
||
label: "Редактировать категорию",
|
||
children: e.jsx(m, {
|
||
onClick: () => {
|
||
f.openContextModal({
|
||
modal: "createServiceCategory",
|
||
title: "Создание категории",
|
||
withCloseButton: !1,
|
||
innerProps: {
|
||
element: a.original.category,
|
||
onChange: o => {
|
||
v.updateServiceCategory({
|
||
requestBody: {
|
||
category: o
|
||
}
|
||
}).then( ({ok: i, message: y}) => {
|
||
p.guess(i, {
|
||
message: y
|
||
}),
|
||
i && s.invalidateQueries({
|
||
queryKey: ["getAllServices"]
|
||
}).then( () => {}
|
||
)
|
||
}
|
||
)
|
||
}
|
||
}
|
||
})
|
||
}
|
||
,
|
||
variant: "default",
|
||
children: e.jsx(M, {})
|
||
})
|
||
}), e.jsx(x, {
|
||
label: "Удалить категорию",
|
||
children: e.jsx(m, {
|
||
onClick: () => {
|
||
f.openConfirmModal({
|
||
title: "Удаление категории",
|
||
children: `Вы уверены, что хотите удалить категорию: ${a.original.category.name}?`,
|
||
onConfirm: () => {
|
||
v.deleteServiceCategory({
|
||
requestBody: {
|
||
categoryId: a.original.category.id
|
||
}
|
||
}).then( ({ok: o, message: i}) => {
|
||
p.guess(o, {
|
||
message: i
|
||
}),
|
||
o && s.invalidateQueries({
|
||
queryKey: ["getAllServices"]
|
||
}).then( () => {}
|
||
)
|
||
}
|
||
)
|
||
}
|
||
})
|
||
}
|
||
,
|
||
variant: "default",
|
||
children: e.jsx(P, {})
|
||
})
|
||
})]
|
||
})
|
||
}
|
||
},
|
||
enableRowActions: !0,
|
||
renderRowActions: ({row: a}) => e.jsxs(I, {
|
||
display: a.original.isPlaceholder ? "none" : "flex",
|
||
gap: "xs",
|
||
children: [e.jsx(x, {
|
||
label: "Редактировать",
|
||
children: e.jsx(m, {
|
||
onClick: () => g(a.original),
|
||
variant: "default",
|
||
children: e.jsx(M, {})
|
||
})
|
||
}), e.jsx(x, {
|
||
label: "Удалить",
|
||
children: e.jsx(m, {
|
||
onClick: () => {
|
||
r && r(a.original)
|
||
}
|
||
,
|
||
variant: "default",
|
||
children: e.jsx(P, {})
|
||
})
|
||
})]
|
||
})
|
||
}
|
||
})
|
||
}
|
||
, ae = () => R.useMemo( () => [{
|
||
accessorKey: "name",
|
||
header: "Название набора"
|
||
}, {
|
||
header: "Кол-во услуг",
|
||
Cell: ({row: t}) => t.original.services.length
|
||
}], [])
|
||
, ne = ({items: t, onDelete: r, onChange: n}) => {
|
||
const u = ae()
|
||
, S = s => {
|
||
n && f.openContextModal({
|
||
modal: "serviceKitModalForm",
|
||
title: "Создание набора услуг",
|
||
withCloseButton: !1,
|
||
innerProps: {
|
||
element: s,
|
||
onChange: n
|
||
}
|
||
})
|
||
}
|
||
;
|
||
return e.jsx(U, {
|
||
data: t,
|
||
columns: u,
|
||
restProps: {
|
||
enableSorting: !1,
|
||
enableColumnActions: !1,
|
||
enableRowActions: !0,
|
||
renderRowActions: ({row: s}) => e.jsxs(I, {
|
||
gap: "md",
|
||
children: [e.jsx(x, {
|
||
label: "Редактировать",
|
||
children: e.jsx(m, {
|
||
onClick: () => S(s.original),
|
||
variant: "default",
|
||
children: e.jsx(M, {})
|
||
})
|
||
}), e.jsx(x, {
|
||
label: "Удалить",
|
||
children: e.jsx(m, {
|
||
onClick: () => {}
|
||
,
|
||
variant: "default",
|
||
children: e.jsx(P, {})
|
||
})
|
||
})]
|
||
})
|
||
}
|
||
})
|
||
}
|
||
, se = () => {
|
||
const {services: t, refetch: r} = O({
|
||
withPlaceholders: !0
|
||
})
|
||
, n = () => {
|
||
f.openContextModal({
|
||
modal: "createService",
|
||
title: "Создание услуги",
|
||
withCloseButton: !1,
|
||
innerProps: {
|
||
onCreate: u
|
||
}
|
||
})
|
||
}
|
||
, u = d => {
|
||
v.createService({
|
||
requestBody: {
|
||
service: d
|
||
}
|
||
}).then(async ({ok: c, message: g}) => {
|
||
p.guess(c, {
|
||
message: g
|
||
}),
|
||
c && await r()
|
||
}
|
||
)
|
||
}
|
||
, S = () => {
|
||
f.openContextModal({
|
||
modal: "createServiceCategory",
|
||
title: "Создание категории",
|
||
withCloseButton: !1,
|
||
innerProps: {
|
||
onCreate: s
|
||
}
|
||
})
|
||
}
|
||
, s = d => {
|
||
v.createServiceCategory({
|
||
requestBody: {
|
||
category: d
|
||
}
|
||
}).then( ({ok: c, message: g}) => p.guess(c, {
|
||
message: g
|
||
}))
|
||
}
|
||
;
|
||
return {
|
||
services: t,
|
||
onCreateClick: n,
|
||
onServiceDelete: d => {
|
||
f.openConfirmModal({
|
||
title: "Удаление услуги",
|
||
children: e.jsxs(Q, {
|
||
children: ['Вы уверены, что хотите удалить услугу "', d.name, '"?']
|
||
}),
|
||
onConfirm: () => {
|
||
v.deleteService({
|
||
requestBody: {
|
||
serviceId: d.id
|
||
}
|
||
}).then(async ({ok: c, message: g}) => {
|
||
p.guess(c, {
|
||
message: g
|
||
}),
|
||
c && await r()
|
||
}
|
||
)
|
||
}
|
||
,
|
||
labels: {
|
||
confirm: "Удалить",
|
||
cancel: "Отмена"
|
||
}
|
||
})
|
||
}
|
||
,
|
||
onServiceUpdate: d => {
|
||
v.updateService({
|
||
requestBody: {
|
||
data: d
|
||
}
|
||
}).then(async ({ok: c, message: g}) => {
|
||
p.guess(c, {
|
||
message: g
|
||
}),
|
||
c && await r()
|
||
}
|
||
)
|
||
}
|
||
,
|
||
onCreateCategoryClick: S
|
||
}
|
||
}
|
||
, ie = () => {
|
||
const {objects: t, refetch: r} = G()
|
||
, n = s => {
|
||
v.createServicesKit({
|
||
requestBody: {
|
||
data: {
|
||
..._.omit(s, ["services", "id"]),
|
||
servicesIds: s.services.map(l => l.id)
|
||
}
|
||
}
|
||
}).then(async ({ok: l, message: C}) => {
|
||
p.guess(l, {
|
||
message: C
|
||
}),
|
||
l && await r()
|
||
}
|
||
)
|
||
}
|
||
;
|
||
return {
|
||
onKitCreateClick: () => {
|
||
f.openContextModal({
|
||
modal: "serviceKitModalForm",
|
||
title: "Создание набора услуг",
|
||
withCloseButton: !1,
|
||
innerProps: {
|
||
onCreate: n
|
||
}
|
||
})
|
||
}
|
||
,
|
||
onKitUpdate: s => {
|
||
v.updateServicesKit({
|
||
requestBody: {
|
||
data: {
|
||
..._.omit(s, ["services"]),
|
||
servicesIds: s.services.map(l => l.id)
|
||
}
|
||
}
|
||
}).then(async ({ok: l, message: C}) => {
|
||
p.guess(l, {
|
||
message: C
|
||
}),
|
||
l && await r()
|
||
}
|
||
)
|
||
}
|
||
,
|
||
servicesKits: t
|
||
}
|
||
}
|
||
, oe = () => {
|
||
const [t,r] = R.useState(h.DEAL_SERVICE)
|
||
, [n,u] = R.useState(!1)
|
||
, {services: S, onServiceDelete: s, onServiceUpdate: l, onCreateClick: C, onCreateCategoryClick: d} = se()
|
||
, {servicesKits: c, onKitUpdate: g, onKitCreateClick: a} = ie()
|
||
, o = () => {
|
||
switch (t) {
|
||
case h.SERVICES_KITS:
|
||
return e.jsx(ne, {
|
||
items: c,
|
||
onChange: g
|
||
});
|
||
case h.DEAL_SERVICE:
|
||
case h.PRODUCT_SERVICE:
|
||
{
|
||
const j = S.filter(k => k.serviceType === t).sort( (k, B) => t === h.DEAL_SERVICE ? k.category.dealServiceRank.localeCompare(B.category.dealServiceRank) : k.category.productServiceRank.localeCompare(B.category.productServiceRank));
|
||
return e.jsx(re, {
|
||
onDelete: s,
|
||
onChange: l,
|
||
items: j,
|
||
serviceType: t,
|
||
editMode: n
|
||
})
|
||
}
|
||
}
|
||
}
|
||
, i = () => {
|
||
switch (t) {
|
||
case h.SERVICES_KITS:
|
||
return e.jsx(E, {
|
||
onClick: a,
|
||
variant: "default",
|
||
children: "Создать набор"
|
||
});
|
||
case h.DEAL_SERVICE:
|
||
case h.PRODUCT_SERVICE:
|
||
return e.jsxs(I, {
|
||
align: "center",
|
||
gap: b(10),
|
||
children: [e.jsxs("div", {
|
||
style: {
|
||
display: "grid",
|
||
gridAutoFlow: "column",
|
||
gridAutoColumns: "1fr",
|
||
width: "max-content",
|
||
gap: b(10)
|
||
},
|
||
children: [e.jsx(E, {
|
||
onClick: C,
|
||
variant: "default",
|
||
children: "Создать услугу"
|
||
}), e.jsx(E, {
|
||
onClick: d,
|
||
variant: "default",
|
||
children: "Создать категорию"
|
||
}), e.jsxs(A, {
|
||
withArrow: !0,
|
||
shadow: "md",
|
||
children: [e.jsx(A.Target, {
|
||
children: e.jsx(E, {
|
||
leftSection: e.jsx(W, {}),
|
||
variant: "default",
|
||
children: "Скачать"
|
||
})
|
||
}), e.jsx(A.Dropdown, {
|
||
children: e.jsxs(I, {
|
||
direction: "column",
|
||
gap: b(10),
|
||
children: [
|
||
e.jsx(E, {
|
||
onClick: y,
|
||
variant: "default",
|
||
leftSection: e.jsx(Y, {}),
|
||
children: "В формате PDF"
|
||
}), /*
|
||
e.jsx(E, {
|
||
onClick: K,
|
||
variant: "default",
|
||
leftSection: e.jsx(N, {}),
|
||
children: "В формате Excel"
|
||
})
|
||
*/
|
||
]
|
||
})
|
||
|
||
})]
|
||
})]
|
||
}), e.jsx(z, {
|
||
variant: "default",
|
||
label: "Режим редактирования",
|
||
checked: n,
|
||
onChange: () => u(!n)
|
||
})]
|
||
})
|
||
}
|
||
}
|
||
, y = () => {
|
||
const j = q();
|
||
T.saveAs("/api/v1/service/export-list/pdf", `прайс_лист_${j}.pdf`)
|
||
}
|
||
, K = () => {
|
||
const j = q();
|
||
T.saveAs("/api/v1/service/export-list/excel", `прайс_лист_${j}.xlsx`)
|
||
}
|
||
;
|
||
return e.jsxs("div", {
|
||
className: D.container,
|
||
children: [e.jsx(V, {
|
||
children: e.jsxs("div", {
|
||
className: D["top-panel"],
|
||
children: [i(), e.jsx(te, {
|
||
className: D["top-panel-last-item"],
|
||
value: t.toString(),
|
||
onChange: j => r(parseInt(j))
|
||
})]
|
||
})
|
||
}), e.jsx(V, {
|
||
children: o()
|
||
})]
|
||
})
|
||
}
|
||
, ue = H("/services")({
|
||
component: oe
|
||
});
|
||
export {ue as Route};
|