186 lines
14 KiB
JavaScript
186 lines
14 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.RoutesScreen = void 0;
|
|
var tslib_1 = require("tslib");
|
|
var React = tslib_1.__importStar(require("react"));
|
|
var models_1 = require("../../models");
|
|
var ui_1 = require("../ui");
|
|
var EMPTY_FORM = {
|
|
requestTypeId: '',
|
|
routeType: models_1.RouteType.Sequential,
|
|
companyId: '',
|
|
departmentId: '',
|
|
byProject: false,
|
|
requiresControl: false
|
|
};
|
|
var ROUTE_TYPE_OPTIONS = Object.values(models_1.RouteType)
|
|
.filter(function (v) { return v !== models_1.RouteType.None; })
|
|
.map(function (v) { return ({ value: v, label: models_1.routeTypeLabels[v] }); });
|
|
var RoutesScreen = function (_a) {
|
|
var api = _a.api, onOpenSteps = _a.onOpenSteps;
|
|
var _b = React.useState([]), requestTypes = _b[0], setRequestTypes = _b[1];
|
|
var _c = React.useState([]), items = _c[0], setItems = _c[1];
|
|
var _d = React.useState(''), filterRequestTypeId = _d[0], setFilterRequestTypeId = _d[1];
|
|
var _e = React.useState(true), loading = _e[0], setLoading = _e[1];
|
|
var _f = React.useState(), loadError = _f[0], setLoadError = _f[1];
|
|
var _g = React.useState(), editing = _g[0], setEditing = _g[1];
|
|
var _h = React.useState(false), showForm = _h[0], setShowForm = _h[1];
|
|
var _j = React.useState(EMPTY_FORM), form = _j[0], setForm = _j[1];
|
|
var _k = React.useState(), formError = _k[0], setFormError = _k[1];
|
|
var _l = React.useState(false), saving = _l[0], setSaving = _l[1];
|
|
var _m = React.useState(), deleting = _m[0], setDeleting = _m[1];
|
|
var _o = React.useState(), deleteError = _o[0], setDeleteError = _o[1];
|
|
var _p = React.useState(false), deleteBusy = _p[0], setDeleteBusy = _p[1];
|
|
React.useEffect(function () {
|
|
api.requestTypes.list().then(setRequestTypes).catch(function () { });
|
|
}, [api]);
|
|
var load = React.useCallback(function () {
|
|
setLoading(true);
|
|
setLoadError(undefined);
|
|
var requestTypeId = filterRequestTypeId ? Number(filterRequestTypeId) : undefined;
|
|
api.templateRoutes
|
|
.list(requestTypeId)
|
|
.then(setItems)
|
|
.catch(function (e) { return setLoadError(e.message); })
|
|
.finally(function () { return setLoading(false); });
|
|
}, [api, filterRequestTypeId]);
|
|
React.useEffect(function () { load(); }, [load]);
|
|
var requestTypeName = function (id) { var _a, _b; return (_b = (_a = requestTypes.find(function (rt) { return rt.id === id; })) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : "#".concat(id); };
|
|
var openCreate = function () {
|
|
setEditing(undefined);
|
|
setForm(tslib_1.__assign(tslib_1.__assign({}, EMPTY_FORM), { requestTypeId: filterRequestTypeId }));
|
|
setFormError(undefined);
|
|
setShowForm(true);
|
|
};
|
|
var openEdit = function (item) {
|
|
var _a;
|
|
setEditing(item);
|
|
setForm({
|
|
requestTypeId: String(item.requestTypeId),
|
|
routeType: item.routeType,
|
|
companyId: item.companyId,
|
|
departmentId: (_a = item.departmentId) !== null && _a !== void 0 ? _a : '',
|
|
byProject: item.byProject,
|
|
requiresControl: item.requiresControl
|
|
});
|
|
setFormError(undefined);
|
|
setShowForm(true);
|
|
};
|
|
var submit = function () {
|
|
if (!editing && !form.requestTypeId) {
|
|
setFormError('Выберите тип заявки.');
|
|
return;
|
|
}
|
|
if (!form.companyId.trim()) {
|
|
setFormError('Компания обязательна (Guid из справочника api.tnsu.kz).');
|
|
return;
|
|
}
|
|
setSaving(true);
|
|
setFormError(undefined);
|
|
var departmentId = form.departmentId.trim() ? form.departmentId.trim() : null;
|
|
var request = editing
|
|
? api.templateRoutes.update(editing.id, {
|
|
routeType: form.routeType,
|
|
companyId: form.companyId.trim(),
|
|
departmentId: departmentId,
|
|
byProject: form.byProject,
|
|
requiresControl: form.requiresControl
|
|
})
|
|
: api.templateRoutes.create({
|
|
routeType: form.routeType,
|
|
requestTypeId: Number(form.requestTypeId),
|
|
companyId: form.companyId.trim(),
|
|
departmentId: departmentId,
|
|
byProject: form.byProject,
|
|
requiresControl: form.requiresControl
|
|
});
|
|
request
|
|
.then(function () {
|
|
setShowForm(false);
|
|
load();
|
|
})
|
|
.catch(function (e) { return setFormError(e.message); })
|
|
.finally(function () { return setSaving(false); });
|
|
};
|
|
var confirmDelete = function () {
|
|
if (!deleting)
|
|
return;
|
|
setDeleteBusy(true);
|
|
setDeleteError(undefined);
|
|
api.templateRoutes
|
|
.remove(deleting.id)
|
|
.then(function () {
|
|
setDeleting(undefined);
|
|
load();
|
|
})
|
|
.catch(function (e) { return setDeleteError(e.message); })
|
|
.finally(function () { return setDeleteBusy(false); });
|
|
};
|
|
return (React.createElement("div", null,
|
|
React.createElement(ui_1.Breadcrumbs, { items: [{ label: 'Главная' }, { label: 'Маршруты согласования' }] }),
|
|
React.createElement(ui_1.PageHeader, { icon: "route", subtitle: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0441\u043E\u0433\u043B\u0430\u0441\u043E\u0432\u0430\u043D\u0438\u0439", title: "\u041C\u0430\u0440\u0448\u0440\u0443\u0442\u044B \u0441\u043E\u0433\u043B\u0430\u0441\u043E\u0432\u0430\u043D\u0438\u044F", actions: React.createElement(ui_1.Button, { variant: "accent", icon: "plus", onClick: openCreate }, "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043C\u0430\u0440\u0448\u0440\u0443\u0442") }),
|
|
React.createElement("div", { style: { marginBottom: 18, maxWidth: 320 } },
|
|
React.createElement(ui_1.Field, { label: "\u0424\u0438\u043B\u044C\u0442\u0440 \u043F\u043E \u0442\u0438\u043F\u0443 \u0437\u0430\u044F\u0432\u043A\u0438" },
|
|
React.createElement(ui_1.Select, { options: requestTypes.map(function (rt) { return ({ value: String(rt.id), label: rt.name }); }), placeholder: "\u0412\u0441\u0435 \u0442\u0438\u043F\u044B \u0437\u0430\u044F\u0432\u043E\u043A", value: filterRequestTypeId, onChange: function (e) { return setFilterRequestTypeId(e.target.value); } }))),
|
|
loadError && React.createElement(ui_1.Alert, { kind: "err" }, loadError),
|
|
deleteError && React.createElement(ui_1.Alert, { kind: "err" }, deleteError),
|
|
React.createElement(ui_1.DataTable, { columns: [
|
|
{
|
|
key: 'requestType',
|
|
header: 'Тип заявки',
|
|
render: function (r) { return React.createElement(ui_1.PrimaryCell, null, requestTypeName(r.requestTypeId)); }
|
|
},
|
|
{
|
|
key: 'routeType',
|
|
header: 'Тип маршрута',
|
|
render: function (r) { return React.createElement(ui_1.Badge, { variant: r.routeType === models_1.RouteType.Parallel ? 'blue' : 'gold' }, models_1.routeTypeLabels[r.routeType]); }
|
|
},
|
|
{ key: 'company', header: 'Компания', render: function (r) { return React.createElement("code", null, shortGuid(r.companyId)); } },
|
|
{ key: 'department', header: 'Отдел', render: function (r) { return (r.departmentId ? React.createElement("code", null, shortGuid(r.departmentId)) : '—'); } },
|
|
{
|
|
key: 'byProject',
|
|
header: 'По проекту',
|
|
align: 'center',
|
|
render: function (r) { return (r.byProject ? React.createElement(ui_1.Badge, { variant: "ok" }, "\u0414\u0430") : React.createElement(ui_1.Badge, { variant: "neutral" }, "\u041D\u0435\u0442")); }
|
|
},
|
|
{
|
|
key: 'control',
|
|
header: 'Контроль',
|
|
align: 'center',
|
|
render: function (r) { return (r.requiresControl ? React.createElement(ui_1.Badge, { variant: "gold" }, "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F") : React.createElement(ui_1.Badge, { variant: "neutral" }, "\u041D\u0435\u0442")); }
|
|
},
|
|
{
|
|
key: 'actions',
|
|
header: '',
|
|
width: '160px',
|
|
align: 'right',
|
|
render: function (r) { return (React.createElement(ui_1.ActionsCell, null,
|
|
React.createElement(ui_1.Button, { size: "sm", variant: "secondary", icon: "clipboard", onClick: function () { return onOpenSteps(r); } }, "\u0428\u0430\u0433\u0438"),
|
|
React.createElement(ui_1.IconButton, { icon: "edit", label: "\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C", onClick: function () { return openEdit(r); } }),
|
|
React.createElement(ui_1.IconButton, { icon: "trash", label: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C", danger: true, onClick: function () { setDeleteError(undefined); setDeleting(r); } }))); }
|
|
}
|
|
], rows: items, keyOf: function (r) { return r.id; }, emptyMessage: loading ? 'Загрузка...' : 'Маршрутов пока нет.' }),
|
|
showForm && (React.createElement(ui_1.Modal, { title: editing ? "\u041C\u0430\u0440\u0448\u0440\u0443\u0442 #".concat(editing.id) : 'Новый маршрут', onClose: function () { return setShowForm(false); }, footer: React.createElement(React.Fragment, null,
|
|
React.createElement(ui_1.Button, { variant: "secondary", onClick: function () { return setShowForm(false); }, disabled: saving }, "\u041E\u0442\u043C\u0435\u043D\u0430"),
|
|
React.createElement(ui_1.Button, { variant: "accent", icon: "check", onClick: submit, disabled: saving }, saving ? 'Сохранение...' : 'Сохранить')) },
|
|
formError && React.createElement(ui_1.Alert, { kind: "err" }, formError),
|
|
React.createElement(ui_1.FormGrid, null,
|
|
React.createElement(ui_1.Field, { label: "\u0422\u0438\u043F \u0437\u0430\u044F\u0432\u043A\u0438", required: true, full: true },
|
|
React.createElement(ui_1.Select, { options: requestTypes.map(function (rt) { return ({ value: String(rt.id), label: rt.name }); }), placeholder: "\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0442\u0438\u043F \u0437\u0430\u044F\u0432\u043A\u0438", value: form.requestTypeId, disabled: !!editing, onChange: function (e) { return setForm(tslib_1.__assign(tslib_1.__assign({}, form), { requestTypeId: e.target.value })); } })),
|
|
React.createElement(ui_1.Field, { label: "\u0422\u0438\u043F \u043C\u0430\u0440\u0448\u0440\u0443\u0442\u0430", required: true, full: true },
|
|
React.createElement(ui_1.Select, { options: ROUTE_TYPE_OPTIONS, value: form.routeType, onChange: function (e) { return setForm(tslib_1.__assign(tslib_1.__assign({}, form), { routeType: e.target.value })); } })),
|
|
React.createElement(ui_1.Field, { label: "\u041A\u043E\u043C\u043F\u0430\u043D\u0438\u044F (Guid)", required: true, full: true, hint: "\u0418\u0437 \u0441\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A\u0430 api.tnsu.kz." },
|
|
React.createElement(ui_1.TextInput, { value: form.companyId, onChange: function (e) { return setForm(tslib_1.__assign(tslib_1.__assign({}, form), { companyId: e.target.value })); }, placeholder: "00000000-0000-0000-0000-000000000000" })),
|
|
React.createElement(ui_1.Field, { label: "\u041E\u0442\u0434\u0435\u043B (Guid)", full: true, hint: "\u041D\u0435\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E \u2014 \u043C\u0430\u0440\u0448\u0440\u0443\u0442 \u00AB\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E\u00BB \u0434\u043B\u044F \u043A\u043E\u043C\u043F\u0430\u043D\u0438\u0438." },
|
|
React.createElement(ui_1.TextInput, { value: form.departmentId, onChange: function (e) { return setForm(tslib_1.__assign(tslib_1.__assign({}, form), { departmentId: e.target.value })); }, placeholder: "\u041E\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u043F\u0443\u0441\u0442\u044B\u043C \u0434\u043B\u044F \u043C\u0430\u0440\u0448\u0440\u0443\u0442\u0430 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E" })),
|
|
React.createElement(ui_1.Field, { label: "\u041F\u043E \u043F\u0440\u043E\u0435\u043A\u0442\u0443" },
|
|
React.createElement(ui_1.Checkbox, { label: "\u041C\u0430\u0440\u0448\u0440\u0443\u0442 \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0435\u0442 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u044B\u0439 \u043F\u0440\u043E\u0435\u043A\u0442", checked: form.byProject, onChange: function (v) { return setForm(tslib_1.__assign(tslib_1.__assign({}, form), { byProject: v })); } })),
|
|
React.createElement(ui_1.Field, { label: "\u041A\u043E\u043D\u0442\u0440\u043E\u043B\u044C" },
|
|
React.createElement(ui_1.Checkbox, { label: "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0439 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C \u0438\u0441\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F", checked: form.requiresControl, onChange: function (v) { return setForm(tslib_1.__assign(tslib_1.__assign({}, form), { requiresControl: v })); } }))))),
|
|
deleting && (React.createElement(ui_1.ConfirmDialog, { title: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043C\u0430\u0440\u0448\u0440\u0443\u0442?", text: "\u041C\u0430\u0440\u0448\u0440\u0443\u0442 #".concat(deleting.id, " \u0438 \u0432\u0441\u0435 \u0435\u0433\u043E \u0448\u0430\u0433\u0438 \u0431\u0443\u0434\u0443\u0442 \u0443\u0434\u0430\u043B\u0435\u043D\u044B \u0431\u0435\u0437\u0432\u043E\u0437\u0432\u0440\u0430\u0442\u043D\u043E."), confirmLabel: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C", busy: deleteBusy, onCancel: function () { return setDeleting(undefined); }, onConfirm: confirmDelete }))));
|
|
};
|
|
exports.RoutesScreen = RoutesScreen;
|
|
function shortGuid(guid) {
|
|
return guid.length > 8 ? "".concat(guid.slice(0, 8), "\u2026") : guid;
|
|
}
|
|
//# sourceMappingURL=RoutesScreen.js.map
|