copper-ui
Version:
Modern React UI components library with TypeScript support, built on top of Ant Design
1,565 lines • 146 kB
JavaScript
import { createParser as ht, parseAsString as J, parseAsArrayOf as Ce, parseAsBoolean as Lt, useQueryStates as ie, parseAsInteger as Qe } from "nuqs";
import * as B from "react";
import { useState as V, useEffect as bt, useCallback as _t, useMemo as L, createContext as Vt, useContext as Bt, memo as je, useRef as xt } from "react";
import { jsx as o, jsxs as y, Fragment as z } from "react/jsx-runtime";
import { Tooltip as we, Tag as yt, Button as be, Radio as Ht, DatePicker as wt, Popover as Ut, Input as Pe, InputNumber as Xe, Select as vt, Checkbox as Jt, Empty as Ke, Pagination as Qt, ConfigProvider as Xt, Typography as kt, Badge as fe, Timeline as Kt, Spin as Zt } from "antd";
import { CloseOutlined as qt, CloseCircleFilled as er, CheckOutlined as tr, QuestionCircleOutlined as rr, FilterFilled as nr, CaretUpOutlined as ar, CaretDownOutlined as or, ArrowRightOutlined as ir, LoadingOutlined as lr } from "@ant-design/icons";
import xe from "dayjs";
import { parse as sr, format as Ae } from "date-fns";
import cr, { clsx as dr } from "clsx";
import { flexRender as Ze, useReactTable as ur, getCoreRowModel as mr } from "@tanstack/react-table";
function fr(e, t) {
const [r, n] = V(e);
return bt(() => {
const a = setTimeout(() => {
n(e);
}, t);
return () => {
clearTimeout(a);
};
}, [e]), r;
}
const pr = ht({
parse: (e) => {
try {
const t = JSON.parse(e);
return typeof t == "object" && t !== null && "value" in t && "label" in t ? t : null;
} catch {
return null;
}
},
serialize: (e) => typeof e == "object" && e !== null && "value" in e && "label" in e ? JSON.stringify(e) : JSON.stringify(null)
}), gr = ht({
parse: (e) => {
try {
const t = JSON.parse(e);
return Array.isArray(t) && t.every(
(n) => typeof n == "object" && n !== null && "value" in n && "label" in n
) ? t : null;
} catch {
return null;
}
},
serialize: (e) => Array.isArray(e) && e.every(
(r) => typeof r == "object" && r !== null && "value" in r && "label" in r
) ? JSON.stringify(e) : JSON.stringify(null)
}), hr = (e, t) => {
const r = {}, n = (a, c, i, s) => {
switch (a) {
case "boolean":
r[c] = Lt;
break;
case "multiselect":
r[c] = Ce(J);
break;
case "date-range":
r[c] = Ce(J);
break;
case "date":
r[c] = J;
break;
case "select":
r[c] = J;
break;
case "radio":
r[c] = J.withDefault(s ?? null);
break;
case "checkbox":
r[c] = Ce(J);
break;
case "custom":
r[c] = i ? gr : pr;
break;
default:
r[c] = J;
}
};
for (const a of e)
if (a.filter) {
const c = a.filter.id ?? a.definition.id, i = a.filter.type === "custom" && "isMultiple" in a.filter && a.filter.isMultiple;
n(a.filter.type, c, i);
}
for (const a of t)
n(a.type, a.id, void 0, a.default);
return r;
}, Ca = ({
columns: e,
quickFilters: t,
filtersDebounceDelay: r = 300,
debounceFields: n
}) => {
const [a, c] = V({
field: "",
order: "asc"
}), [i, s] = ie({
pageIndex: Qe.withDefault(0),
pageSize: Qe.withDefault(10)
}), [l, d] = V(0), u = _t(
(T) => {
T && l !== T && d(T);
},
[l]
), m = L(
() => hr(e, (t == null ? void 0 : t.filters) ?? []),
[e, t]
), [h, w] = ie(m), b = L(() => n || e.filter((S) => {
var O, j;
return ((O = S.filter) == null ? void 0 : O.type) === "input" || ((j = S.filter) == null ? void 0 : j.type) === "input-number";
}).map((S) => {
var O;
return ((O = S.filter) == null ? void 0 : O.id) ?? S.definition.id;
}), [e, n]), k = L(() => {
const T = {};
return b.forEach((S) => {
T[S] = h[S];
}), T;
}, [h, b]), N = fr(k, r), M = L(() => {
const T = { ...h };
return b.forEach((S) => {
const O = S;
O in N && (T[O] = N[O]);
}), T;
}, [h, N, b]);
return L(
() => ({
sort: a,
setSort: c,
pagination: i,
setPagination: s,
totalPages: l,
filters: h,
debouncedFilters: M,
filterParsers: m,
setFilters: w,
quickFilters: t,
setTotalPages: u
}),
[
a,
c,
i,
s,
l,
h,
M,
m,
w,
t,
u
]
);
};
function le(e) {
"@babel/helpers - typeof";
return le = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(t) {
return typeof t;
} : function(t) {
return t && typeof Symbol == "function" && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t;
}, le(e);
}
function br(e, t) {
if (le(e) != "object" || !e) return e;
var r = e[Symbol.toPrimitive];
if (r !== void 0) {
var n = r.call(e, t);
if (le(n) != "object") return n;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (t === "string" ? String : Number)(e);
}
function xr(e) {
var t = br(e, "string");
return le(t) == "symbol" ? t : t + "";
}
function yr(e, t, r) {
return (t = xr(t)) in e ? Object.defineProperty(e, t, {
value: r,
enumerable: !0,
configurable: !0,
writable: !0
}) : e[t] = r, e;
}
function qe(e, t) {
var r = Object.keys(e);
if (Object.getOwnPropertySymbols) {
var n = Object.getOwnPropertySymbols(e);
t && (n = n.filter(function(a) {
return Object.getOwnPropertyDescriptor(e, a).enumerable;
})), r.push.apply(r, n);
}
return r;
}
function et(e) {
for (var t = 1; t < arguments.length; t++) {
var r = arguments[t] != null ? arguments[t] : {};
t % 2 ? qe(Object(r), !0).forEach(function(n) {
yr(e, n, r[n]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : qe(Object(r)).forEach(function(n) {
Object.defineProperty(e, n, Object.getOwnPropertyDescriptor(r, n));
});
}
return e;
}
var wr = {
yearFormat: "YYYY",
dayFormat: "D",
cellMeridiemFormat: "A",
monthBeforeYear: !0
}, vr = et(et({}, wr), {}, {
locale: "ru_RU",
today: "Сегодня",
now: "Сейчас",
backToToday: "Текущая дата",
ok: "ОК",
clear: "Очистить",
week: "Неделя",
month: "Месяц",
year: "Год",
timeSelect: "Выбрать время",
dateSelect: "Выбрать дату",
monthSelect: "Выбрать месяц",
yearSelect: "Выбрать год",
decadeSelect: "Выбрать десятилетие",
dateFormat: "D-M-YYYY",
dateTimeFormat: "D-M-YYYY HH:mm:ss",
previousMonth: "Предыдущий месяц (PageUp)",
nextMonth: "Следующий месяц (PageDown)",
previousYear: "Предыдущий год (Control + left)",
nextYear: "Следующий год (Control + right)",
previousDecade: "Предыдущее десятилетие",
nextDecade: "Следущее десятилетие",
previousCentury: "Предыдущий век",
nextCentury: "Следующий век"
});
const Nt = {
placeholder: "Выберите время",
rangePlaceholder: ["Время начала", "Время окончания"]
}, ye = {
lang: Object.assign({
placeholder: "Выберите дату",
yearPlaceholder: "Выберите год",
quarterPlaceholder: "Выберите квартал",
monthPlaceholder: "Выберите месяц",
weekPlaceholder: "Выберите неделю",
rangePlaceholder: ["Начальная дата", "Конечная дата"],
rangeYearPlaceholder: ["Начальный год", "Год окончания"],
rangeMonthPlaceholder: ["Начальный месяц", "Конечный месяц"],
rangeWeekPlaceholder: ["Начальная неделя", "Конечная неделя"],
shortWeekDays: ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"],
shortMonths: ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"]
}, vr),
timePickerLocale: Object.assign({}, Nt)
};
var kr = {
// Options
items_per_page: "/ стр.",
jump_to: "Перейти",
jump_to_confirm: "подтвердить",
page: "Страница",
// Pagination
prev_page: "Назад",
next_page: "Вперед",
prev_5: "Предыдущие 5",
next_5: "Следующие 5",
prev_3: "Предыдущие 3",
next_3: "Следующие 3",
page_size: "размер страницы"
};
const F = "${label} не является типом ${type}", tt = {
locale: "ru",
Pagination: kr,
DatePicker: ye,
TimePicker: Nt,
Calendar: ye,
global: {
placeholder: "Пожалуйста выберите",
close: "Закрыть"
},
Table: {
filterTitle: "Фильтр",
filterConfirm: "OK",
filterReset: "Сбросить",
filterEmptyText: "Без фильтров",
filterCheckAll: "Выбрать все элементы",
filterSearchPlaceholder: "Поиск в фильтрах",
emptyText: "Нет данных",
selectAll: "Выбрать всё",
selectInvert: "Инвертировать выбор",
selectNone: "Очистить все данные",
selectionAll: "Выбрать все данные",
sortTitle: "Сортировка",
expand: "Развернуть строку",
collapse: "Свернуть строку",
triggerDesc: "Нажмите для сортировки по убыванию",
triggerAsc: "Нажмите для сортировки по возрастанию",
cancelSort: "Нажмите, чтобы отменить сортировку"
},
Tour: {
Next: "Далее",
Previous: "Назад",
Finish: "Завершить"
},
Modal: {
okText: "OK",
cancelText: "Отмена",
justOkText: "OK"
},
Popconfirm: {
okText: "OK",
cancelText: "Отмена"
},
Transfer: {
titles: ["", ""],
searchPlaceholder: "Поиск",
itemUnit: "элем.",
itemsUnit: "элем.",
remove: "Удалить",
selectAll: "Выбрать все данные",
deselectAll: "Очистить все данные",
selectCurrent: "Выбрать текущую страницу",
selectInvert: "Инвертировать выбор",
removeAll: "Удалить все данные",
removeCurrent: "Удалить текущую страницу"
},
Upload: {
uploading: "Загрузка...",
removeFile: "Удалить файл",
uploadError: "При загрузке произошла ошибка",
previewFile: "Предпросмотр файла",
downloadFile: "Загрузить файл"
},
Empty: {
description: "Нет данных"
},
Icon: {
icon: "иконка"
},
Text: {
edit: "Редактировать",
copy: "Копировать",
copied: "Скопировано",
expand: "Раскрыть",
collapse: "Свернуть"
},
Form: {
optional: "(необязательно)",
defaultValidateMessages: {
default: "Ошибка проверки поля ${label}",
required: "Пожалуйста, введите ${label}",
enum: "${label} должен быть одним из [${enum}]",
whitespace: "${label} не может быть пустым",
date: {
format: "${label} не правильный формат даты",
parse: "${label} не может быть преобразовано в дату",
invalid: "${label} не является корректной датой"
},
types: {
string: F,
method: F,
array: F,
object: F,
number: F,
date: F,
boolean: F,
integer: F,
float: F,
regexp: F,
email: F,
url: F,
hex: F
},
string: {
len: "${label} должна быть ${len} символов",
min: "${label} должна быть больше или равна ${min} символов",
max: "${label} должна быть меньше или равна ${max} символов",
range: "Длина ${label} должна быть между ${min}-${max} символами"
},
number: {
len: "${label} должна быть равна ${len}",
min: "${label} должна быть больше или равна ${min}",
max: "${label} должна быть меньше или равна ${max}",
range: "${label} должна быть между ${min}-${max}"
},
array: {
len: "Количество элементов ${label} должно быть равно ${len}",
min: "Количество элементов ${label} должно быть больше или равно ${min}",
max: "Количество элементов ${label} должно быть меньше или равно ${max}",
range: "Количество элементов ${label} должно быть между ${min} и ${max}"
},
pattern: {
mismatch: "${label} не соответствует шаблону ${pattern}"
}
}
},
Image: {
preview: "Предпросмотр"
},
QRCode: {
expired: "QR-код устарел",
refresh: "Обновить"
},
ColorPicker: {
presetEmpty: "Пустой",
transparent: "Прозрачный",
singleColor: "Один цвет",
gradientColor: "Градиент"
}
}, Ct = Vt(void 0), Nr = () => {
const e = Bt(Ct);
if (!e)
throw new Error("useTableContext must be used within a TableProvider");
return e;
}, D = ({ when: e, children: t, elseComponent: r }) => e ? t : r || null, Cr = (e) => Object.entries(e).filter(
([, t]) => t != null && t !== "" && (Array.isArray(t) ? t.length > 0 : !0)
), Mr = (e, t = [], r = []) => {
const n = r.find((c) => c.id === e);
if (n)
return n.label;
const a = t.find((c) => {
var i;
return (((i = c.filter) == null ? void 0 : i.id) ?? c.definition.id) === e;
});
return a && typeof a.definition.header == "string" ? a.definition.header : e;
}, rt = (e, t) => {
if (t && t.definition.mapping) {
const r = t.definition.mapping.find((n) => n.value === e);
if (r)
return String(r.label);
}
return isNaN(new Date(e).getTime()) ? String(e) : Mt(e);
}, Mt = (e) => {
try {
return new Date(e).toLocaleDateString("ru-RU");
} catch {
return e;
}
}, Tr = (e, t, r = [], n = []) => {
if (typeof t == "object" && t !== null && "label" in t)
return String(t.label);
if (Array.isArray(t) && t.length > 0 && typeof t[0] == "object" && t[0] !== null && "label" in t[0] && "value" in t[0])
return t.map((s) => s.label).join(", ");
const a = n.find((s) => s.id === e);
if (a && a.options) {
if (Array.isArray(t) && a.type === "checkbox")
return t.map((l) => {
const d = a.options.find((u) => String(u.value) === String(l));
return String(d ? d.label : l);
}).filter(Boolean).join(", ");
if (Array.isArray(t)) {
const s = a.options.find(
(l) => typeof l.value == "string" && l.value === JSON.stringify(t)
);
if (s)
return String(s.label);
} else {
const s = a.options.find((l) => l.value === t);
if (s)
return String(s.label);
}
}
const c = r.find((s) => {
var l;
return (((l = s.filter) == null ? void 0 : l.id) ?? s.definition.id) === e;
});
if (c && c.filter && (c.filter.type === "select" || c.filter.type === "multiselect") && "options" in c.filter && Array.isArray(c.filter.options)) {
const s = c.filter.options;
if (Array.isArray(t))
if (c.filter.type === "multiselect") {
const l = t.map((d) => {
var u;
return (u = s.find((m) => m.value === d)) == null ? void 0 : u.label;
}).filter(Boolean);
if (l.length)
return l.join(", ");
} else {
const l = s.find(
(d) => typeof d.value == "string" && d.value === JSON.stringify(t)
);
if (l)
return String(l.label);
}
else {
const l = s.find((d) => d.value === t);
if (l)
return String(l.label);
}
}
const i = c == null ? void 0 : c.definition;
if (i && i.mapping) {
const s = i.mapping.find((l) => l.value === t);
if (s)
return String(s.label);
}
return Array.isArray(t) && t.some(
(s) => !isNaN(xe(s, s.split(".").length === 2 ? "MM.YYYY" : "DD.MM.YYYY").valueOf())
) && t.length === 2 ? t.map((s) => rt(s)).join(" - ") : Array.isArray(t) ? t.map((l) => rt(l, c)).join(", ") : typeof t == "string" && t.includes("T") && !(t.includes("[") || t.includes("]") || t.includes("{") || t.includes("}")) ? Mt(t) : typeof t == "boolean" ? t ? "Да" : "Нет" : String(t);
}, Sr = ({
filterParsers: e,
columns: t = [],
quickFilters: r = []
}) => {
const [n, a] = ie(e), c = L(() => Cr(n), [n]), i = (d) => {
a({ [d]: null });
}, s = () => {
const d = Object.keys(n).reduce(
(u, m) => (u[m] = null, u),
{}
);
a(d);
}, l = L(
() => c.map(([d, u]) => ({
fieldName: d,
value: u,
label: Mr(d, t, r),
displayValue: Tr(d, u, t, r)
})),
[c, t, r]
);
return {
filters: n,
activeFilters: c,
processedFilters: l,
resetFilter: i,
resetAllFilters: s,
hasActiveFilters: c.length > 0
};
}, Pr = ({
filterParsers: e,
columns: t = [],
quickFilters: r = []
}) => {
const { processedFilters: n, resetFilter: a, resetAllFilters: c, hasActiveFilters: i } = Sr({
filterParsers: e,
columns: t,
quickFilters: r
});
return i ? /* @__PURE__ */ o("div", { className: "mb-[10px] flex items-center gap-2", children: /* @__PURE__ */ y("div", { className: "flex flex-wrap gap-[8px]", children: [
n.map(({ fieldName: s, label: l, displayValue: d }) => /* @__PURE__ */ o(z, { children: /* @__PURE__ */ o(D, { when: l, children: /* @__PURE__ */ y("div", { className: "flex items-center gap-1", children: [
/* @__PURE__ */ y("span", { className: "text-xs", children: [
l,
":"
] }),
/* @__PURE__ */ o(we, { title: d, children: /* @__PURE__ */ o(
yt,
{
closable: !0,
closeIcon: /* @__PURE__ */ o(qt, { className: "hover:text-neutral-70 h-3 w-3 text-neutral-50" }),
onClose: () => a(s),
className: "max-w-[460px]",
style: {
display: "inline-flex",
alignItems: "center",
maxWidth: "460px"
},
children: /* @__PURE__ */ o(
"span",
{
className: "text-neutral-80 text-xs",
style: {
overflow: "hidden",
textOverflow: "ellipsis",
whiteSpace: "nowrap",
maxWidth: "420px"
},
children: d
}
)
}
) })
] }) }) }, s)),
/* @__PURE__ */ o(D, { when: n.find((s) => s.label), children: /* @__PURE__ */ y(be, { type: "link", size: "small", onClick: c, children: [
/* @__PURE__ */ o(er, {}),
"Сбросить все"
] }) })
] }) }) : null;
};
function C(...e) {
return dr(e);
}
const Ar = ({ value: e, onChange: t, options: r, className: n, style: a, ...c }) => {
const i = Array.isArray(e) ? e : [], s = (d) => {
const u = String(d), m = i.includes(u) ? i.filter((h) => h !== u) : [...i, u];
t(m);
}, l = {
className: C(n, "!w-max whitespace-nowrap"),
style: a,
...c
};
return /* @__PURE__ */ o(be.Group, { ...l, children: r == null ? void 0 : r.map((d) => {
const u = i.includes(String(d.value));
return /* @__PURE__ */ o(
be,
{
size: "middle",
type: u ? "primary" : "default",
onClick: () => s(d.value),
children: d.label
},
d.value
);
}) });
}, zr = ({ value: e, onChange: t, options: r, className: n, style: a, ...c }) => {
const i = (l) => {
t(l);
}, s = {
className: C(n, "!w-max whitespace-nowrap"),
style: a,
...c
};
return /* @__PURE__ */ o(
Ht.Group,
{
block: !0,
optionType: "button",
value: e,
options: r,
onChange: (l) => i(l.target.value),
...s
}
);
}, Or = ({ value: e, onChange: t, children: r, className: n, style: a, styles: c, ...i }) => {
const s = (typeof i.format == "string" ? i.format : "DD-MM-YYYY").toLowerCase().replace("mm", "MM"), l = (w) => w && sr(w, s, /* @__PURE__ */ new Date()).toISOString(), [d, u] = V(!1), m = e ? xe(e) : void 0, h = {
className: C(n),
style: {
position: "absolute",
left: 0,
top: "80%",
width: "0",
height: "0",
opacity: 0,
...a
},
styles: {
popup: {
root: {
// width: "264px",
padding: 0
}
},
...c
},
...i
};
return /* @__PURE__ */ y("div", { children: [
/* @__PURE__ */ o("div", { onClick: () => u(!0), children: r }),
/* @__PURE__ */ o(
wt,
{
value: m,
open: d,
onOpenChange: u,
onChange: (w, b) => {
t == null || t(l(Array.isArray(b) ? b[0] : b));
},
...h
}
)
] });
}, Gr = ({ value: e, onChange: t, children: r, className: n, style: a, styles: c, ...i }) => {
const s = (w) => w, l = typeof i.format == "string" ? i.format : "DD-MM-YYYY", [d, u] = V(!1), m = [
e != null && e[0] ? xe(e == null ? void 0 : e[0], l) : null,
e != null && e[1] ? xe(e == null ? void 0 : e[1], l) : null
], h = {
className: C(n),
style: {
position: "absolute",
left: 0,
top: "80%",
width: "0",
height: "0",
opacity: 0,
...a
},
styles: {
popup: {
root: {
// width: "264px",
padding: 0
}
},
...c
},
...i
};
return /* @__PURE__ */ y("div", { children: [
/* @__PURE__ */ o("div", { onClick: () => u(!0), children: r }),
/* @__PURE__ */ o(
wt.RangePicker,
{
value: m,
open: d,
onOpenChange: u,
onChange: (w, b) => {
t == null || t(s(b));
},
...h
}
)
] });
}, Rr = ({ children: e, slot: t }) => /* @__PURE__ */ o(
Ut,
{
classNames: {
body: "!p-[8px]"
},
trigger: "click",
placement: "bottom",
arrow: !1,
content: t,
children: e
}
), ze = je(
({
value: e,
onChange: t,
children: r,
type: n = "string",
className: a,
style: c,
...i
}) => {
const s = (d) => {
t(d);
}, l = {
className: C("!w-[248px]", a),
style: c,
...i
};
return /* @__PURE__ */ o(
D,
{
when: r,
elseComponent: n === "string" ? /* @__PURE__ */ o(Pe, { value: e ?? "", onChange: (d) => s(d.target.value), ...l }) : /* @__PURE__ */ o(Xe, { value: e, onChange: (d) => s(d ?? ""), ...l }),
children: /* @__PURE__ */ o(
Rr,
{
slot: n === "string" ? /* @__PURE__ */ o(Pe, { value: e ?? "", onChange: (d) => s(d.target.value), ...l }) : /* @__PURE__ */ o(Xe, { value: e, onChange: (d) => s(d ?? ""), ...l }),
children: r
}
)
}
);
}
);
ze.displayName = "FilterInput";
const Oe = je(
({
value: e,
onChange: t,
children: r,
className: n,
style: a,
styles: c,
...i
}) => {
const [s, l] = V(null), [d, u] = V(!1);
let m, h, w;
const b = (N) => {
t(N);
};
if (i.mode === "multiple") {
const N = Array.isArray(e) ? e : [];
m = ((i == null ? void 0 : i.options) ?? []).map((M) => M == null ? void 0 : M.value), h = m.length === N.length, w = N.length > 0 && N.length < m.length;
}
const k = {
className: C(n),
style: {
position: "absolute",
left: 0,
top: "80%",
width: "0",
height: "0",
opacity: 0,
...a
},
styles: {
popup: {
root: {
width: "264px"
}
},
...c
},
...i
};
return /* @__PURE__ */ y("div", { children: [
/* @__PURE__ */ o("div", { onClick: () => u(!0), children: r }),
/* @__PURE__ */ o(
vt,
{
value: e,
open: d,
onOpenChange: u,
onChange: (N) => b(N),
searchValue: s ?? "",
popupRender: (N) => /* @__PURE__ */ y(z, { children: [
/* @__PURE__ */ o(D, { when: i.showSearch, children: /* @__PURE__ */ o(Pe, { value: s ?? "", onChange: (M) => l(M.target.value) }) }),
/* @__PURE__ */ o("div", { className: "h-1" }),
/* @__PURE__ */ o(D, { when: i.mode === "multiple", children: /* @__PURE__ */ o(
Jt,
{
indeterminate: w,
checked: h,
onChange: (M) => b(M.target.checked ? m : null),
className: "border-neutral-40 h-[32px] w-full items-center! border-b-[1px] pl-[12px]!",
children: "Выбрать все"
}
) }),
N
] }),
...k
}
)
] });
}
);
Oe.displayName = "FilterSelect";
const $e = je(
({
fieldName: e,
filterProps: t,
filterParsers: r,
filterType: n,
children: a,
className: c
}) => {
const [i, s] = ie(r), l = i[e], d = (h) => {
s({ [e]: h });
}, m = {
value: l,
onChange: d,
onReset: () => d(null),
...t,
className: C(c, t == null ? void 0 : t.className),
style: { ...t == null ? void 0 : t.style },
...t == null ? void 0 : t.props
};
switch (n) {
case "boolean":
return null;
case "multiselect":
return /* @__PURE__ */ o(Oe, { ...m, mode: "multiple", menuItemSelectedIcon: /* @__PURE__ */ o(tr, {}), children: a });
case "date":
return /* @__PURE__ */ o(Or, { ...m, children: a });
case "date-range":
return /* @__PURE__ */ o(Gr, { ...m, children: a });
// case "range":
// return <FilterRange {...props}>{children}</FilterRange>;
case "input":
return /* @__PURE__ */ o(ze, { ...m, children: a });
case "input-number":
return /* @__PURE__ */ o(ze, { ...m, type: "number", children: a });
case "select":
return /* @__PURE__ */ o(Oe, { ...m, children: a });
case "radio":
return /* @__PURE__ */ o(zr, { ...m });
case "checkbox":
return /* @__PURE__ */ o(Ar, { ...m });
case "custom":
if (t != null && t.render || t != null && t.renderMultiple) {
const h = t == null ? void 0 : t.isMultiple;
if (h && (t != null && t.renderMultiple)) {
const w = l, b = [];
return /* @__PURE__ */ o("div", { className: m.className, style: m.style, children: t.renderMultiple(
w || b,
d,
a
) });
} else if (!h && (t != null && t.render)) {
const w = l, b = { value: "", label: "" };
return /* @__PURE__ */ o("div", { className: m.className, style: m.style, children: t.render(
w || b,
d,
a
) });
}
}
return /* @__PURE__ */ o(z, { children: a });
default:
return null;
}
}
);
$e.displayName = "FilterCommon";
const Dr = ({ quickFilters: e, filterParsers: t }) => /* @__PURE__ */ y("div", { className: "flex items-center gap-[12px]", children: [
/* @__PURE__ */ o(D, { when: e.label, children: /* @__PURE__ */ y("div", { className: "flex items-center gap-[4px]", children: [
/* @__PURE__ */ o("span", { children: e.label }),
/* @__PURE__ */ o(D, { when: e.tooltip, children: /* @__PURE__ */ o(we, { title: e.tooltip, children: /* @__PURE__ */ o(rr, { className: "!text-neutral-60 cursor-help" }) }) }),
/* @__PURE__ */ o("span", { children: ":" })
] }) }),
e.filters.map((r) => /* @__PURE__ */ y("div", { className: "flex w-max items-center gap-[8px]", children: [
/* @__PURE__ */ o(D, { when: r.label, children: /* @__PURE__ */ y("div", { children: [
r.label,
":"
] }) }),
/* @__PURE__ */ o(
$e,
{
filterParsers: t,
fieldName: r.id,
filterType: r.type,
filterProps: r,
className: r.className
}
)
] }, r.id))
] }), Ir = ({ children: e, cell: t }) => {
switch (t) {
case "date":
if (e)
return /* @__PURE__ */ o(z, { children: Ae(e, "dd.MM.yyyy") });
}
return /* @__PURE__ */ o("div", { className: C("flex items-center", t === "number" && "justify-end"), children: e });
}, Fr = ({
className: e,
id: t,
filterId: r,
sortId: n,
sortable: a,
// dataType,
children: c,
filterType: i,
filterParsers: s,
tooltip: l,
filterProps: d
}) => {
const { sort: u, setSort: m } = Nr(), h = n ?? t, w = r ?? t, b = () => {
(u == null ? void 0 : u.field) !== h || !(u != null && u.order) ? m == null || m({ field: h, order: "asc" }) : u.order === "asc" ? m == null || m({ field: h, order: "desc" }) : m == null || m({ field: null, order: null });
}, [k] = ie(s), N = Array.isArray(k[w]) ? k[w].length > 0 : !!k[w];
return /* @__PURE__ */ y(we, { title: l == null ? void 0 : l.content, className: "flex items-center gap-[4px]", children: [
/* @__PURE__ */ o("div", { className: "text-neutral-70", children: c }),
/* @__PURE__ */ y(
"div",
{
className: C(
"flex w-full items-center justify-between gap-[4px]",
// dataType === "string" && "justify-start",
// dataType === "number" && "justify-end",
e
),
children: [
/* @__PURE__ */ o(
$e,
{
filterParsers: s,
filterType: i,
fieldName: w,
filterProps: d,
children: /* @__PURE__ */ o(be, { type: "text", className: "!px-1", size: "small", children: i && w && /* @__PURE__ */ o(
nr,
{
color: N ? "#1677ff" : "inherit",
style: { color: N ? "#1677ff" : "inherit" },
className: C(
"h-4 w-4",
"opacity-15 ease-in hover:opacity-20",
N ? "!opacity-100 hover:!opacity-60" : ""
)
}
) })
}
),
/* @__PURE__ */ o(D, { when: a, children: /* @__PURE__ */ y(
"div",
{
className: C(
"ml-1 flex cursor-pointer flex-col items-center justify-center select-none",
(u == null ? void 0 : u.field) === h ? "text-primary" : "text-neutral-300",
"hover:text-neutral-600"
),
onClick: b,
children: [
/* @__PURE__ */ o(
ar,
{
className: C(
"-mb-[4px] leading-none transition-colors",
(u == null ? void 0 : u.field) === h && (u == null ? void 0 : u.order) === "asc" ? "!text-[#1677ff]" : "text-neutral-300"
),
style: { fontSize: "13px" }
}
),
/* @__PURE__ */ o(
or,
{
className: C(
"leading-none transition-colors",
(u == null ? void 0 : u.field) === h && (u == null ? void 0 : u.order) === "desc" ? "!text-[#1677ff]" : "text-neutral-300"
),
style: { fontSize: "13px" }
}
)
]
}
) })
]
}
)
] });
}, jr = (e, t) => {
const r = [];
for (const n of e) {
const a = { ...n.definition }, c = n.dataType ?? "string", i = (s) => {
var l;
return n.definition.mapping ? ((l = n.definition.mapping.find((d) => d.value === s)) == null ? void 0 : l.label) ?? s : s;
};
switch (typeof n.definition.cell == "function" ? a.cell = n.definition.cell : a.cell = ({ getValue: s, row: l }) => /* @__PURE__ */ o(Ir, { row: l, cell: n.definition.cell, children: i(s()) }), typeof a.header) {
case "string":
a.header = () => {
var l, d, u, m;
return /* @__PURE__ */ o(
Fr,
{
filterProps: (() => {
if (!n.filter) return {};
const h = {
className: n.filter.className,
style: n.filter.style,
styles: n.filter.styles,
props: n.filter.props
};
return n.filter.type === "multiselect" || n.filter.type === "select" ? {
...h,
options: n.filter.options
} : n.filter.type === "custom" ? {
...h,
render: n.filter.render,
renderMultiple: "isMultiple" in n.filter && n.filter.isMultiple ? n.filter.render : void 0,
isMultiple: "isMultiple" in n.filter ? n.filter.isMultiple : !1
} : h;
})(),
filterParsers: t.filterParsers,
sortable: (l = n.sort) == null ? void 0 : l.enabled,
id: n.definition.id,
filterId: (d = n.filter) == null ? void 0 : d.id,
sortId: (u = n.sort) == null ? void 0 : u.id,
dataType: c,
filterType: (m = n.filter) == null ? void 0 : m.type,
tooltip: n.definition.headerTooltip,
children: n.definition.header
}
);
};
break;
}
r.push(a);
}
return r;
};
function nt(e, t = !1, r = !1) {
var s;
const n = e.getIsPinned(), a = t && ((s = e.columnDef) == null ? void 0 : s.headerRightBorder) && r, c = [];
t && c.push("0 -1px #DBE0E7 inset");
let i;
return n && (i = t ? "#fafafa" : "#ffffff"), {
boxShadow: c.length > 0 ? c.join(", ") : void 0,
left: n === "left" ? `${e.getStart("left")}px` : void 0,
right: n === "right" ? `${e.getAfter("right")}px` : void 0,
position: n ? "sticky" : "relative",
minWidth: e.columnDef.minSize,
width: e.columnDef.size,
maxWidth: e.columnDef.maxSize,
zIndex: n ? t ? 20 : 10 : 0,
// Заголовки закрепленных колонок имеют самый высокий z-index
backgroundColor: i,
hasRightBorder: a
};
}
const Tt = B.forwardRef(
({ className: e, ...t }, r) => /* @__PURE__ */ o("div", { className: "relative w-full", children: /* @__PURE__ */ o("table", { ref: r, className: C("w-full caption-bottom bg-white", e), ...t }) })
);
Tt.displayName = "Table";
const St = B.forwardRef(
({ className: e, ...t }, r) => /* @__PURE__ */ o("thead", { ref: r, className: C("border-neutral-30 border-t border-b", e), ...t })
);
St.displayName = "TableHeader";
const Pt = B.forwardRef(
({ className: e, children: t, ...r }, n) => /* @__PURE__ */ o("tbody", { ref: n, className: C("[&_tr:last-child]:border-0", e), ...r, children: t })
);
Pt.displayName = "TableBody";
const $r = B.forwardRef(
({ className: e, ...t }, r) => /* @__PURE__ */ o(
"tfoot",
{
ref: r,
className: C("bg-neutral-80/50 font-medium dark:bg-neutral-800/50 [&>tr]:last:border-b-0", e),
...t
}
)
);
$r.displayName = "TableFooter";
const he = B.forwardRef(
({ className: e, ...t }, r) => /* @__PURE__ */ o("tr", { ref: r, className: C("data-[state=selected]:bg-neutral-50", e), ...t })
);
he.displayName = "TableRow";
const At = B.forwardRef(
({ className: e, ...t }, r) => /* @__PURE__ */ o(
"th",
{
ref: r,
className: C(
"text-neutral-60 h-12 bg-white px-2 text-left align-middle text-xs font-normal text-nowrap whitespace-nowrap [&:has([role=checkbox])]:pr-0",
e
),
...t
}
)
);
At.displayName = "TableHead";
const Ge = B.forwardRef(
({ className: e, ...t }, r) => /* @__PURE__ */ o(
"td",
{
ref: r,
className: C(
"bg-white px-2 py-1 align-middle text-nowrap whitespace-nowrap [&:has([role=checkbox])]:pr-0",
e
),
...t
}
)
);
Ge.displayName = "TableCell";
const Wr = B.forwardRef(
({ className: e, ...t }, r) => /* @__PURE__ */ o("caption", { ref: r, className: C("mt-4 text-sm text-neutral-500 dark:text-neutral-400", e), ...t })
);
Wr.displayName = "TableCaption";
const Yr = ({
table: e,
isNoData: t,
isLoading: r,
// pagination,
isFirstSummaryRow: n,
emptyState: a,
countColumns: c,
minHeight: i = "200px",
maxHeight: s
}) => /* @__PURE__ */ y(z, { children: [
/* @__PURE__ */ o(D, { when: t && !r, children: /* @__PURE__ */ o(
"div",
{
className: "absolute z-0 flex",
style: {
top: "50%",
left: "50%",
transform: "translate(-50%, calc(-50% + 40px))"
},
children: /* @__PURE__ */ o("div", { className: "sticky top-0 left-0 z-20 w-full h-full bg-white", children: /* @__PURE__ */ o("div", { className: "flex flex-col items-center justify-center gap-2 text-neutral-60", children: /* @__PURE__ */ o(
D,
{
when: a == null ? void 0 : a.custom,
elseComponent: /* @__PURE__ */ o(
Ke,
{
styles: {
image: {
width: "110px !important",
height: "69px !important"
}
},
image: Ke.PRESENTED_IMAGE_SIMPLE,
description: (a == null ? void 0 : a.description) ?? "Нет данных"
}
),
children: a == null ? void 0 : a.custom
}
) }) })
}
) }),
/* @__PURE__ */ o(
"div",
{
className: "relative flex flex-col",
style: {
minHeight: i,
maxHeight: s,
...s && { overflowY: "auto" }
},
"data-debug-height": `min:${i}, max:${s || "none"}`,
children: /* @__PURE__ */ y(Tt, { className: "border-separate table-fixed border-spacing-0", children: [
/* @__PURE__ */ o(St, { className: "sticky top-0 z-[15] border-none", children: e.getHeaderGroups().map((l) => /* @__PURE__ */ o(he, { children: l.headers.map((d) => {
const u = nt(d.column, !0, !0), { hasRightBorder: m, ...h } = u, w = d.column.getIsPinned(), b = w === "left" && d.column.getIsLastColumn("left"), k = w === "right" && d.column.getIsFirstColumn("right");
return /* @__PURE__ */ o(
At,
{
style: { ...h, height: "40px" },
className: C(
m && "table-header-right-border",
"transition-all duration-200 ease-in-out",
b && "!border-neutral-30 !border-r",
k && "!border-neutral-30 !border-l"
),
children: d.isPlaceholder ? null : Ze(d.column.columnDef.header, d.getContext())
},
d.id
);
}) }, l.id)) }),
/* @__PURE__ */ o(Pt, { className: "relative", children: /* @__PURE__ */ o(
D,
{
when: !r,
elseComponent: /* @__PURE__ */ o(z, { children: Array.from({ length: 10 }).fill(null).map((l, d) => /* @__PURE__ */ o(he, { children: /* @__PURE__ */ o(Ge, { colSpan: c, children: /* @__PURE__ */ o("div", { className: "h-6 rounded bg-neutral-20 animate-pulse" }) }, d) }, d)) }),
children: e.getRowModel().rows.map((l) => /* @__PURE__ */ o(he, { "data-state": l.getIsSelected() && "selected", className: "group", children: l.getVisibleCells().map((d) => {
const u = d.column.getIsPinned(), m = u === "left" && d.column.getIsLastColumn("left"), h = u === "right" && d.column.getIsFirstColumn("right");
return /* @__PURE__ */ o(
Ge,
{
style: { ...nt(d.column) },
className: C(
"group-hover:bg-neutral-10",
"transition-all duration-200 ease-in-out",
m && "!border-neutral-30 !border-r",
h && "!border-neutral-30 !border-l",
d.row.index === 0 && n && "!bg-neutral-20 font-bold"
),
children: Ze(d.column.columnDef.cell, d.getContext())
},
d.id
);
}) }, l.id))
}
) })
] })
}
)
] }), Er = ({
columns: e,
data: t,
isNoData: r,
pagination: n,
setPagination: a,
totalPages: c,
isLoading: i,
filterParsers: s,
isFirstSummaryRow: l,
minHeight: d = "200px",
maxHeight: u,
columnPinning: m,
...h
}) => {
const w = d === "auto", b = L(() => jr(e, { filterParsers: s }), [e, s]), k = ur({
columns: b,
data: t,
getCoreRowModel: mr(),
onPaginationChange: void 0,
state: {
pagination: n,
columnPinning: m ?? { left: [], right: [] }
}
});
return /* @__PURE__ */ y(z, { children: [
/* @__PURE__ */ o("div", { className: `w-full overflow-x-scroll ${w ? "overflow-y-visible" : "flex-1 overflow-y-scroll"}`, children: /* @__PURE__ */ o(
Yr,
{
isFirstSummaryRow: l,
pagination: n,
setPagination: a,
totalPages: c,
table: k,
isLoading: i ?? !1,
isNoData: r,
countColumns: e.length,
minHeight: d,
maxHeight: u,
...h
}
) }),
/* @__PURE__ */ o("div", { className: "flex items-center justify-between py-[8px]", children: /* @__PURE__ */ y("div", { className: "flex items-center gap-[12px]", children: [
/* @__PURE__ */ o(
Qt,
{
current: n.pageIndex + 1,
total: c * n.pageSize,
pageSize: n.pageSize,
onChange: (N) => a({
pageIndex: N - 1,
pageSize: n.pageSize
}),
showSizeChanger: !1
}
),
/* @__PURE__ */ o(
vt,
{
showSearch: !1,
value: n.pageSize,
onChange: (N) => a({
pageIndex: 0,
pageSize: N
}),
options: [
{
value: 10,
label: "10/стр"
},
{
value: 20,
label: "20/стр"
},
{
value: 30,
label: "30/стр"
},
{
value: 40,
label: "40/стр"
},
{
value: 50,
label: "50/стр"
},
{
value: 100,
label: "100/стр"
}
]
}
)
] }) })
] });
}, Lr = {
...ye,
lang: {
...ye.lang,
fieldDateFormat: "DD.MM.YYYY",
fieldDateTimeFormat: "DD.MM.YYYY HH:mm:ss",
yearFormat: "YYYY",
cellYearFormat: "YYYY"
}
}, _r = {
...tt,
DatePicker: {
...tt.DatePicker,
lang: Lr.lang
}
}, Ma = ({
columns: e,
data: t,
isLoading: r,
sort: n,
setSort: a,
pagination: c,
setPagination: i,
totalPages: s,
filterParsers: l,
isFirstSummaryRow: d = !0,
quickFilters: u,
minHeight: m = "200px",
maxHeight: h,
...w
}) => {
var M;
const b = m === "auto", k = (t == null ? void 0 : t.length) === 0, N = xt(!0);
return bt(() => {
N.current && e.forEach((T) => {
var S;
(S = T.sort) != null && S.enabled && T.sort.default && (a({
field: T.sort.id ?? T.definition.id,
order: T.sort.default
}), N.current = !1);
});
}, [e, a]), /* @__PURE__ */ o(Xt, { locale: _r, children: /* @__PURE__ */ o("div", { className: `relative flex flex-col p-4 ${b ? "" : "h-full"}`, children: /* @__PURE__ */ y(Ct.Provider, { value: { sort: n, setSort: a }, children: [
/* @__PURE__ */ o("div", { className: "mb-[10px] flex items-center justify-between", children: /* @__PURE__ */ o(D, { when: (M = u == null ? void 0 : u.filters) == null ? void 0 : M.length, children: /* @__PURE__ */ o(Dr, { quickFilters: u, filterParsers: l }) }) }),
/* @__PURE__ */ o(Pr, { filterParsers: l, columns: e, quickFilters: u == null ? void 0 : u.filters }),
/* @__PURE__ */ o(
Er,
{
isLoading: r,
totalPages: s,
columns: e,
filterParsers: l,
data: t,
isNoData: k,
pagination: c,
setPagination: i,
isFirstSummaryRow: d,
minHeight: m,
maxHeight: h,
...w
}
)
] }) }) });
}, { Link: at, Text: te } = kt, Vr = ({ createdBy: e, fields: t, type: r, timePassed: n }) => {
const a = {
form: { text: "Анкета", color: "default" },
docs: { text: "Документ", color: "processing" },
notice: { text: "Уведомление", color: "warning" },
updated: { text: "Актуализация", color: "success" }
};
return /* @__PURE__ */ y("div", { children: [
/* @__PURE__ */ y("div", { className: "flex items-center gap-1 pb-[4px]", children: [
typeof r == "string" && r !== "form" && /* @__PURE__ */ y(z, { children: [
/* @__PURE__ */ o(yt, { className: "!mr-0", color: a[r].color, children: a[r].text }),
/* @__PURE__ */ o(fe, { status: "default" })
] }),
typeof r == "object" && /* @__PURE__ */ y(z, { children: [
r.node,
/* @__PURE__ */ o(fe, { status: "default" })
] }),
/* @__PURE__ */ o(at, { href: void 0, target: "_blank", title: "Нет адреса", children: e.fio }),
n && typeof n == "string" && /* @__PURE__ */ y(z, { children: [
/* @__PURE__ */ o(fe, { status: "default" }),
/* @__PURE__ */ o(at, { href: void 0, target: "_blank", title: "Нет адреса", children: n })
] }),
n && typeof n == "object" && /* @__PURE__ */ y(z, { children: [
/* @__PURE__ */ o(fe, { status: "default" }),
n.node
] })
] }),
/* @__PURE__ */ y("div", { className: "flex flex-col gap-[4px]", children: [
Array.isArray(t) && t.map(({ id: c, field: i, newValue: s, oldValue: l }) => /* @__PURE__ */ o("div", { className: "flex flex-wrap items-center gap-x-1", children: /* @__PURE__ */ y(
D,
{
when: s !== l,
elseComponent: /* @__PURE__ */ y(z, { children: [
/* @__PURE__ */ y(te, { type: "secondary", children: [
i,
":"
] }),
/* @__PURE__ */ o(te, { children: s || "-" })
] }),
children: [
/* @__PURE__ */ y(te, { type: "secondary", children: [
i,
":"
] }),
/* @__PURE__ */ o(te, { children: l || "-" }),
/* @__PURE__ */ o(ir, { className: "!text-[14px] !text-black/45" }),
/* @__PURE__ */ o(te, { children: s || "-" })
]
}
) }, c)),
!Array.isArray(t) && typeof t == "object" && /* @__PURE__ */ o(z, { children: t.node })
] })
] });
};
function Me(e) {
return (t = {}) => {
const r = t.width ? String(t.width) : e.defaultWidth;
return e.formats[r] || e.formats[e.defaultWidth];
};
}
function re(e) {
return (t, r) => {
const n = r != null && r.context ? String(r.context) : "standalone";
let a;
if (n === "formatting" && e.formattingValues) {
const i = e.defaultFormattingWidth || e.defaultWidth, s = r != null && r.width ? String(r.width) : i;
a = e.formattingValues[s] || e.formattingValues[i];
} else {
const i = e.defaultWidth, s = r != null && r.width ? String(r.width) : e.defaultWidth;
a = e.values[s] || e.values[i];
}
const c = e.argumentCallback ? e.argumentCallback(t) : t;
return a[c];
};
}
function ne(e) {
return (t, r = {}) => {
const n = r.width, a = n && e.matchPatterns[n] || e.matchPatterns[e.defaultMatchWidth], c = t.match(a);
if (!c)
return null;
const i = c[0], s = n && e.parsePatterns[n] || e.parsePatterns[e.defaultParseWidth], l = Array.isArray(s) ? Hr(s, (m) => m.test(i)) : (
// [TODO] -- I challenge you to fix the type
Br(s, (m) => m.test(i))
);
let d;
d = e.valueCallback ? e.valueCallback(l) : l, d = r.valueCallback ? (
// [TODO] -- I challenge you to fix the type
r.valueCallback(d)
) : d;
const u = t.slice(i.length);
return { value: d, rest: u };
};
}
function Br(e, t) {
for (const r in e)
if (Object.prototype.hasOwnProperty.call(e, r) && t(e[r]))
return r;
}
function Hr(e, t) {
for (let r = 0; r < e.length; r++)
if (t(e[r]))
return r;
}
function Ur(e) {
return (t, r = {}) => {
const n = t.match(e.matchPattern);
if (!n) return null;
const a = n[0], c = t.match(e.parsePattern);
if (!c) return null;
let i = e.valueCallback ? e.valueCallback(c[0]) : c[0];
i = r.valueCallback ? r.valueCallback(i) : i;
const s = t.slice(a.length);
return { value: i, rest: s };
};
}
const ot = Symbol.for("constructDateFrom");
function zt(e, t) {
return typeof e == "function" ? e(t) : e && typeof e == "object" && ot in e ? e[ot](t) : e instanceof Date ? new e.constructor(t) : new Date(t);
}
function Jr(e, ...t) {
const r = zt.bind(
null,
e || t.find((n) => typeof n == "object")
);
return t.map(r);
}
let Qr = {};
function Xr() {
return Qr;
}
function Kr(e, t) {
return zt(t || e, e);
}
function it(e, t) {
var s, l, d, u;
const r = Xr(), n = (t == null ? void 0 : t.weekStartsOn) ?? ((l = (s = t == null ? void 0 : t.locale) == null ? void 0 : s.options) == null ? void 0 : l.weekStartsOn) ?? r.weekStartsOn ?? ((u = (d = r.locale) == null ? void 0 : d.options) == null ? void 0 : u.weekStartsOn) ?? 0, a = Kr(e, t == null ? void 0 : t.in), c = a.getDay(), i = (c < n ? 7 : 0) + c - n;
return a.setDate(a.getDate() - i), a.setHours(0, 0, 0, 0), a;
}
function lt(e, t, r) {
const [n, a] = Jr(
r == null ? void 0 : r.in,
e,
t
);
return +it(n, r) == +it(a, r);
}
function ae(e, t) {
if (e.one !== void 0 && t === 1)
return e.one;
const r = t % 10, n = t % 100;
return r === 1 && n !== 11 ? e.singularNominative.replace("{{count}}", String(t)) : r >= 2 && r <= 4 && (n < 10 || n > 20) ? e.singularGenitive.replace("{{count}}", String(t)) : e.pluralGenitive.replace("{{count}}", String(t));
}
function R(e) {
return (t, r) => r != null && r.addSuffix ? r.comparison && r.comparison > 0 ? e.future ? ae(e.future, t) : "через " + ae(e.regular, t) : e.past ? ae(e.past, t) : ae(e.regular, t) + " назад" : ae(e.regular, t);
}
const Zr = {
lessThanXSeconds: R({
regular: {
one: "меньше секунды",
singularNominative: "меньше {{count}} секунды",
singularGenitive: "меньше {{count}} секунд",
pluralGenitive: "меньше {{count}} секунд"
},
future: {
one: "меньше, чем через секунду",
singularNominative: "меньше, чем через {{count}} секунду",
singularGenitive: "меньше, чем через {{count}} секунды",
pluralGenitive: "меньше, чем через {{count}} секунд"
}
}),
xSeconds: R({
regular: {
singularNominative: "{{count}} секунда",
singularGenitive: "{{count}} секунды",
pluralGenitive: "{{count}} секунд"
},
past: {
singularNominative: "{{count}} секунду назад",
singularGenitive: "{{count}} секунды назад",
pluralGenitive: "{{count}} секунд назад"
},
future: {
singularNominative: "через {{count}} секунду",
singu