каркас вроде есть
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.DashboardScreen = void 0;
|
||||
var tslib_1 = require("tslib");
|
||||
var React = tslib_1.__importStar(require("react"));
|
||||
var ui_1 = require("../ui");
|
||||
var DashboardScreen = function (_a) {
|
||||
var api = _a.api, onNavigate = _a.onNavigate;
|
||||
var _b = React.useState(), requestTypesCount = _b[0], setRequestTypesCount = _b[1];
|
||||
var _c = React.useState(), routesCount = _c[0], setRoutesCount = _c[1];
|
||||
React.useEffect(function () {
|
||||
api.requestTypes.list().then(function (items) { return setRequestTypesCount(items.length); }).catch(function () { return setRequestTypesCount(undefined); });
|
||||
api.templateRoutes.list().then(function (items) { return setRoutesCount(items.length); }).catch(function () { return setRoutesCount(undefined); });
|
||||
}, [api]);
|
||||
return (React.createElement("div", null,
|
||||
React.createElement(ui_1.StatRow, null,
|
||||
React.createElement(ui_1.StatCard, { label: "\u0422\u0438\u043F\u043E\u0432 \u0437\u0430\u044F\u0432\u043E\u043A", value: requestTypesCount !== null && requestTypesCount !== void 0 ? requestTypesCount : '—' }),
|
||||
React.createElement(ui_1.StatCard, { label: "\u041C\u0430\u0440\u0448\u0440\u0443\u0442\u043E\u0432 \u0441\u043E\u0433\u043B\u0430\u0441\u043E\u0432\u0430\u043D\u0438\u044F", value: routesCount !== null && routesCount !== void 0 ? routesCount : '—' })),
|
||||
React.createElement("div", { style: { fontSize: 10, textTransform: 'uppercase', letterSpacing: 1.6, color: 'var(--gray-400)', fontWeight: 600, marginBottom: 12 } }, "\u0420\u0430\u0437\u0434\u0435\u043B\u044B"),
|
||||
React.createElement("hr", { style: { height: 1, background: 'linear-gradient(90deg, var(--gold-400), transparent 70%)', border: 0, margin: '6px 0 22px' } }),
|
||||
React.createElement(ui_1.CardGrid, null,
|
||||
React.createElement(ui_1.NavCard, { icon: "clipboard", title: "\u0422\u0438\u043F\u044B \u0437\u0430\u044F\u0432\u043E\u043A", description: "\u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u0442\u0438\u043F\u043E\u0432 \u0437\u0430\u044F\u0432\u043E\u043A \u0438 \u0438\u0445 \u0441\u0442\u0440\u0430\u043D\u0438\u0446", onClick: function () { return onNavigate('requestTypes'); } }),
|
||||
React.createElement(ui_1.NavCard, { icon: "route", title: "\u041C\u0430\u0440\u0448\u0440\u0443\u0442\u044B \u0441\u043E\u0433\u043B\u0430\u0441\u043E\u0432\u0430\u043D\u0438\u044F", description: "\u041C\u0430\u0440\u0448\u0440\u0443\u0442\u044B, \u0448\u0430\u0433\u0438 \u0438 \u0438\u0441\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u0438", onClick: function () { return onNavigate('routes'); } }),
|
||||
React.createElement(ui_1.NavCard, { icon: "search", title: "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043C\u0430\u0440\u0448\u0440\u0443\u0442\u0430", description: "\u041A\u0430\u043A \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u0441\u044F \u043C\u0430\u0440\u0448\u0440\u0443\u0442 \u0434\u043B\u044F \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0433\u043E \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F", onClick: function () { return onNavigate('resolve'); } }))));
|
||||
};
|
||||
exports.DashboardScreen = DashboardScreen;
|
||||
//# sourceMappingURL=DashboardScreen.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"DashboardScreen.js","sourceRoot":"","sources":["../../../../../src/webparts/approvalAdmin/components/screens/DashboardScreen.tsx"],"names":[],"mappings":";;;;AAAA,mDAA+B;AAG/B,4BAA6D;AAOtD,IAAM,eAAe,GAAoC,UAAC,EAAmB;QAAjB,GAAG,SAAA,EAAE,UAAU,gBAAA;IAC1E,IAAA,KAA4C,KAAK,CAAC,QAAQ,EAAsB,EAA/E,iBAAiB,QAAA,EAAE,oBAAoB,QAAwC,CAAC;IACjF,IAAA,KAAgC,KAAK,CAAC,QAAQ,EAAsB,EAAnE,WAAW,QAAA,EAAE,cAAc,QAAwC,CAAC;IAE3E,KAAK,CAAC,SAAS,CAAC;QACd,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,UAAA,KAAK,IAAI,OAAA,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAlC,CAAkC,CAAC,CAAC,KAAK,CAAC,cAAM,OAAA,oBAAoB,CAAC,SAAS,CAAC,EAA/B,CAA+B,CAAC,CAAC;QACvH,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,UAAA,KAAK,IAAI,OAAA,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,EAA5B,CAA4B,CAAC,CAAC,KAAK,CAAC,cAAM,OAAA,cAAc,CAAC,SAAS,CAAC,EAAzB,CAAyB,CAAC,CAAC;IAC/G,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEV,OAAO,CACL;QACE,oBAAC,YAAO;YACN,oBAAC,aAAQ,IAAC,KAAK,EAAC,qEAAc,EAAC,KAAK,EAAE,iBAAiB,aAAjB,iBAAiB,cAAjB,iBAAiB,GAAI,GAAG,GAAI;YAClE,oBAAC,aAAQ,IAAC,KAAK,EAAC,iIAAwB,EAAC,KAAK,EAAE,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,GAAG,GAAI,CAC9D;QAEV,6BAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,iDAEnI;QACN,4BAAI,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,0DAA0D,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,GAAI;QACrI,oBAAC,aAAQ;YACP,oBAAC,YAAO,IACN,IAAI,EAAC,WAAW,EAChB,KAAK,EAAC,+DAAa,EACnB,WAAW,EAAC,iMAAsC,EAClD,OAAO,EAAE,cAAM,OAAA,UAAU,CAAC,cAAc,CAAC,EAA1B,CAA0B,GACzC;YACF,oBAAC,YAAO,IACN,IAAI,EAAC,OAAO,EACZ,KAAK,EAAC,2HAAuB,EAC7B,WAAW,EAAC,sJAA8B,EAC1C,OAAO,EAAE,cAAM,OAAA,UAAU,CAAC,QAAQ,CAAC,EAApB,CAAoB,GACnC;YACF,oBAAC,YAAO,IACN,IAAI,EAAC,QAAQ,EACb,KAAK,EAAC,mGAAmB,EACzB,WAAW,EAAC,2RAAqD,EACjE,OAAO,EAAE,cAAM,OAAA,UAAU,CAAC,SAAS,CAAC,EAArB,CAAqB,GACpC,CACO,CACP,CACP,CAAC;AACJ,CAAC,CAAC;AA1CW,QAAA,eAAe,mBA0C1B","sourcesContent":["import * as React from 'react';\nimport { ApprovalRouteApi } from '../../services/api';\nimport { ScreenKey } from '../app/types';\nimport { CardGrid, NavCard, StatCard, StatRow } from '../ui';\n\nexport interface IDashboardScreenProps {\n api: ApprovalRouteApi;\n onNavigate: (key: ScreenKey) => void;\n}\n\nexport const DashboardScreen: React.FC<IDashboardScreenProps> = ({ api, onNavigate }) => {\n const [requestTypesCount, setRequestTypesCount] = React.useState<number | undefined>();\n const [routesCount, setRoutesCount] = React.useState<number | undefined>();\n\n React.useEffect(() => {\n api.requestTypes.list().then(items => setRequestTypesCount(items.length)).catch(() => setRequestTypesCount(undefined));\n api.templateRoutes.list().then(items => setRoutesCount(items.length)).catch(() => setRoutesCount(undefined));\n }, [api]);\n\n return (\n <div>\n <StatRow>\n <StatCard label=\"Типов заявок\" value={requestTypesCount ?? '—'} />\n <StatCard label=\"Маршрутов согласования\" value={routesCount ?? '—'} />\n </StatRow>\n\n <div style={{ fontSize: 10, textTransform: 'uppercase', letterSpacing: 1.6, color: 'var(--gray-400)', fontWeight: 600, marginBottom: 12 }}>\n Разделы\n </div>\n <hr style={{ height: 1, background: 'linear-gradient(90deg, var(--gold-400), transparent 70%)', border: 0, margin: '6px 0 22px' }} />\n <CardGrid>\n <NavCard\n icon=\"clipboard\"\n title=\"Типы заявок\"\n description=\"Справочник типов заявок и их страниц\"\n onClick={() => onNavigate('requestTypes')}\n />\n <NavCard\n icon=\"route\"\n title=\"Маршруты согласования\"\n description=\"Маршруты, шаги и исполнители\"\n onClick={() => onNavigate('routes')}\n />\n <NavCard\n icon=\"search\"\n title=\"Проверка маршрута\"\n description=\"Как разрешится маршрут для конкретного пользователя\"\n onClick={() => onNavigate('resolve')}\n />\n </CardGrid>\n </div>\n );\n};\n"]}
|
||||
+105
@@ -0,0 +1,105 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.RequestTypesScreen = void 0;
|
||||
var tslib_1 = require("tslib");
|
||||
var React = tslib_1.__importStar(require("react"));
|
||||
var ui_1 = require("../ui");
|
||||
var EMPTY_FORM = { name: '', pageUrl: '' };
|
||||
var RequestTypesScreen = function (_a) {
|
||||
var api = _a.api;
|
||||
var _b = React.useState([]), items = _b[0], setItems = _b[1];
|
||||
var _c = React.useState(true), loading = _c[0], setLoading = _c[1];
|
||||
var _d = React.useState(), loadError = _d[0], setLoadError = _d[1];
|
||||
var _e = React.useState(), editing = _e[0], setEditing = _e[1];
|
||||
var _f = React.useState(false), showForm = _f[0], setShowForm = _f[1];
|
||||
var _g = React.useState(EMPTY_FORM), form = _g[0], setForm = _g[1];
|
||||
var _h = React.useState(), formError = _h[0], setFormError = _h[1];
|
||||
var _j = React.useState(false), saving = _j[0], setSaving = _j[1];
|
||||
var _k = React.useState(), deleting = _k[0], setDeleting = _k[1];
|
||||
var _l = React.useState(), deleteError = _l[0], setDeleteError = _l[1];
|
||||
var _m = React.useState(false), deleteBusy = _m[0], setDeleteBusy = _m[1];
|
||||
var load = React.useCallback(function () {
|
||||
setLoading(true);
|
||||
setLoadError(undefined);
|
||||
api.requestTypes
|
||||
.list()
|
||||
.then(setItems)
|
||||
.catch(function (e) { return setLoadError(e.message); })
|
||||
.finally(function () { return setLoading(false); });
|
||||
}, [api]);
|
||||
React.useEffect(function () { load(); }, [load]);
|
||||
var openCreate = function () {
|
||||
setEditing(undefined);
|
||||
setForm(EMPTY_FORM);
|
||||
setFormError(undefined);
|
||||
setShowForm(true);
|
||||
};
|
||||
var openEdit = function (item) {
|
||||
setEditing(item);
|
||||
setForm({ name: item.name, pageUrl: item.pageUrl });
|
||||
setFormError(undefined);
|
||||
setShowForm(true);
|
||||
};
|
||||
var submit = function () {
|
||||
if (!form.name.trim() || !form.pageUrl.trim()) {
|
||||
setFormError('Заполните имя и Url страницы.');
|
||||
return;
|
||||
}
|
||||
setSaving(true);
|
||||
setFormError(undefined);
|
||||
var request = editing
|
||||
? api.requestTypes.update(editing.id, { name: form.name.trim(), pageUrl: form.pageUrl.trim() })
|
||||
: api.requestTypes.create({ name: form.name.trim(), pageUrl: form.pageUrl.trim() });
|
||||
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.requestTypes
|
||||
.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: "clipboard", subtitle: "\u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A", title: "\u0422\u0438\u043F\u044B \u0437\u0430\u044F\u0432\u043E\u043A", actions: React.createElement(ui_1.Button, { variant: "accent", icon: "plus", onClick: openCreate }, "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0442\u0438\u043F") }),
|
||||
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: 'name', header: 'Название', render: function (r) { return React.createElement(ui_1.PrimaryCell, null, r.name); } },
|
||||
{ key: 'url', header: 'Url страницы', render: function (r) { return r.pageUrl; } },
|
||||
{
|
||||
key: 'actions',
|
||||
header: '',
|
||||
width: '100px',
|
||||
align: 'right',
|
||||
render: function (r) { return (React.createElement(ui_1.ActionsCell, null,
|
||||
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 ? 'Редактировать тип заявки' : 'Новый тип заявки', 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: "\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435", required: true, full: true },
|
||||
React.createElement(ui_1.TextInput, { value: form.name, onChange: function (e) { return setForm(tslib_1.__assign(tslib_1.__assign({}, form), { name: e.target.value })); }, placeholder: "\u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0417\u0430\u044F\u0432\u043A\u0430 \u043D\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u0438\u0440\u043E\u0432\u043A\u0443" })),
|
||||
React.createElement(ui_1.Field, { label: "Url \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B", required: true, full: true, hint: "\u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u0444\u043E\u0440\u043C\u044B \u0437\u0430\u044F\u0432\u043A\u0438 \u043D\u0430 \u043F\u043E\u0440\u0442\u0430\u043B\u0435." },
|
||||
React.createElement(ui_1.TextInput, { value: form.pageUrl, onChange: function (e) { return setForm(tslib_1.__assign(tslib_1.__assign({}, form), { pageUrl: e.target.value })); }, placeholder: "/pages/business-trip" }))))),
|
||||
deleting && (React.createElement(ui_1.ConfirmDialog, { title: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0442\u0438\u043F \u0437\u0430\u044F\u0432\u043A\u0438?", text: "\u0422\u0438\u043F \u00AB".concat(deleting.name, "\u00BB \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043B\u0451\u043D \u0431\u0435\u0437\u0432\u043E\u0437\u0432\u0440\u0430\u0442\u043D\u043E. \u0421\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435 \u043C\u0430\u0440\u0448\u0440\u0443\u0442\u044B \u043C\u043E\u0433\u0443\u0442 \u043F\u0435\u0440\u0435\u0441\u0442\u0430\u0442\u044C \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044C\u0441\u044F."), confirmLabel: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C", busy: deleteBusy, onCancel: function () { return setDeleting(undefined); }, onConfirm: confirmDelete }))));
|
||||
};
|
||||
exports.RequestTypesScreen = RequestTypesScreen;
|
||||
//# sourceMappingURL=RequestTypesScreen.js.map
|
||||
+1
File diff suppressed because one or more lines are too long
@@ -0,0 +1,78 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ResolveScreen = 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 STATUS_OPTIONS = [models_1.RouteStepStatus.Approval, models_1.RouteStepStatus.Execution]
|
||||
.map(function (v) { return ({ value: v, label: models_1.routeStepStatusLabels[v] }); });
|
||||
var ResolveScreen = function (_a) {
|
||||
var api = _a.api, currentUserEmail = _a.currentUserEmail;
|
||||
var _b = React.useState([]), requestTypes = _b[0], setRequestTypes = _b[1];
|
||||
var _c = React.useState(''), requestTypeId = _c[0], setRequestTypeId = _c[1];
|
||||
var _d = React.useState(''), userEmail = _d[0], setUserEmail = _d[1];
|
||||
var _e = React.useState(''), projectId = _e[0], setProjectId = _e[1];
|
||||
var _f = React.useState(models_1.RouteStepStatus.Approval), status = _f[0], setStatus = _f[1];
|
||||
var _g = React.useState(false), busy = _g[0], setBusy = _g[1];
|
||||
var _h = React.useState(), error = _h[0], setError = _h[1];
|
||||
var _j = React.useState(), result = _j[0], setResult = _j[1];
|
||||
React.useEffect(function () {
|
||||
api.requestTypes.list().then(setRequestTypes).catch(function () { });
|
||||
}, [api]);
|
||||
var run = function () {
|
||||
if (!requestTypeId) {
|
||||
setError('Выберите тип заявки.');
|
||||
return;
|
||||
}
|
||||
setBusy(true);
|
||||
setError(undefined);
|
||||
setResult(undefined);
|
||||
api.templateRoutes
|
||||
.resolve({
|
||||
requestTypeId: Number(requestTypeId),
|
||||
userEmail: userEmail.trim() || undefined,
|
||||
projectId: projectId.trim() || undefined,
|
||||
status: status
|
||||
})
|
||||
.then(setResult)
|
||||
.catch(function (e) { return setError(e.message); })
|
||||
.finally(function () { return setBusy(false); });
|
||||
};
|
||||
return (React.createElement("div", null,
|
||||
React.createElement(ui_1.Breadcrumbs, { items: [{ label: 'Главная' }, { label: 'Проверка маршрута' }] }),
|
||||
React.createElement(ui_1.PageHeader, { icon: "search", subtitle: "\u0414\u0438\u0430\u0433\u043D\u043E\u0441\u0442\u0438\u043A\u0430", title: "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u044F \u043C\u0430\u0440\u0448\u0440\u0443\u0442\u0430" }),
|
||||
React.createElement("div", { style: { background: '#fff', borderRadius: 14, padding: 26, boxShadow: 'var(--sh-1)', border: '1px solid var(--gray-200)', marginBottom: 24 } },
|
||||
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: requestTypeId, onChange: function (e) { return setRequestTypeId(e.target.value); } })),
|
||||
React.createElement(ui_1.Field, { label: "Email \u0438\u043D\u0438\u0446\u0438\u0430\u0442\u043E\u0440\u0430", hint: currentUserEmail ? "\u041F\u0443\u0441\u0442\u043E = \u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C (".concat(currentUserEmail, ").") : 'Пусто = текущий пользователь из токена.' },
|
||||
React.createElement(ui_1.TextInput, { value: userEmail, onChange: function (e) { return setUserEmail(e.target.value); }, placeholder: "user@tnsu.kz" })),
|
||||
React.createElement(ui_1.Field, { label: "Id \u043F\u0440\u043E\u0435\u043A\u0442\u0430 (Guid)", hint: "\u0417\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435, \u0435\u0441\u043B\u0438 \u043C\u0430\u0440\u0448\u0440\u0443\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u043F\u0440\u043E\u0435\u043A\u0442\u0430." },
|
||||
React.createElement(ui_1.TextInput, { value: projectId, onChange: function (e) { return setProjectId(e.target.value); }, placeholder: "\u041D\u0435\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E" })),
|
||||
React.createElement(ui_1.Field, { label: "\u0421\u0442\u0430\u0442\u0443\u0441", required: true },
|
||||
React.createElement(ui_1.Select, { options: STATUS_OPTIONS, value: status, onChange: function (e) { return setStatus(e.target.value); } }))),
|
||||
React.createElement("div", { style: { marginTop: 18 } },
|
||||
React.createElement(ui_1.Button, { variant: "accent", icon: "search", onClick: run, disabled: busy }, busy ? 'Проверка...' : 'Проверить'))),
|
||||
error && React.createElement(ui_1.Alert, { kind: "err" }, error),
|
||||
result && (React.createElement(React.Fragment, null,
|
||||
React.createElement(ui_1.Alert, { kind: "ok" },
|
||||
"\u041C\u0430\u0440\u0448\u0440\u0443\u0442 #",
|
||||
result.routeId,
|
||||
" \u00B7 ",
|
||||
models_1.routeTypeLabels[result.routeType],
|
||||
result.requiresControl ? ' · требуется контроль исполнения' : ''),
|
||||
React.createElement(ui_1.DataTable, { columns: [
|
||||
{ key: 'order', header: '№', width: '50px', render: function (r) { return r.orderNo; } },
|
||||
{ key: 'executor', header: 'Исполнитель', render: function (r) { var _a; return React.createElement(ui_1.PrimaryCell, null, (_a = r.executorEmail) !== null && _a !== void 0 ? _a : '—'); } },
|
||||
{ key: 'position', header: 'Должность', render: function (r) { var _a; return (_a = r.position) !== null && _a !== void 0 ? _a : '—'; } },
|
||||
{
|
||||
key: 'reassign',
|
||||
header: 'Переназначение',
|
||||
align: 'center',
|
||||
render: function (r) { return (r.allowReassignToOtherApprovers ? 'Разрешено' : 'Нет'); }
|
||||
}
|
||||
], rows: result.steps, keyOf: function (r) { return r.id; }, emptyMessage: "\u041C\u0430\u0440\u0448\u0440\u0443\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u043B\u0441\u044F \u0431\u0435\u0437 \u0448\u0430\u0433\u043E\u0432 \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0441\u0442\u0430\u0442\u0443\u0441\u0430." })))));
|
||||
};
|
||||
exports.ResolveScreen = ResolveScreen;
|
||||
//# sourceMappingURL=ResolveScreen.js.map
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,213 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.RouteStepsScreen = void 0;
|
||||
var tslib_1 = require("tslib");
|
||||
var React = tslib_1.__importStar(require("react"));
|
||||
var models_1 = require("../../models");
|
||||
var ui_1 = require("../ui");
|
||||
function emptyForm(nextOrderNo) {
|
||||
return {
|
||||
orderNo: String(nextOrderNo),
|
||||
status: models_1.RouteStepStatus.Approval,
|
||||
kind: 'email',
|
||||
executorEmail: '',
|
||||
position: '',
|
||||
projectRole: models_1.ProjectRole.ProjectManager,
|
||||
headType: models_1.HeadType.Chief,
|
||||
allowReassignToOtherApprovers: false
|
||||
};
|
||||
}
|
||||
var STATUS_OPTIONS = [models_1.RouteStepStatus.Approval, models_1.RouteStepStatus.Execution]
|
||||
.map(function (v) { return ({ value: v, label: models_1.routeStepStatusLabels[v] }); });
|
||||
var PROJECT_ROLE_OPTIONS = Object.values(models_1.ProjectRole)
|
||||
.filter(function (v) { return v !== models_1.ProjectRole.None; })
|
||||
.map(function (v) { return ({ value: v, label: models_1.projectRoleLabels[v] }); });
|
||||
var HEAD_TYPE_OPTIONS = Object.values(models_1.HeadType)
|
||||
.filter(function (v) { return v !== models_1.HeadType.None; })
|
||||
.map(function (v) { return ({ value: v, label: models_1.headTypeLabels[v] }); });
|
||||
var RouteStepsScreen = function (_a) {
|
||||
var api = _a.api, route = _a.route, requestTypeName = _a.requestTypeName, onBack = _a.onBack;
|
||||
var _b = React.useState([]), items = _b[0], setItems = _b[1];
|
||||
var _c = React.useState(true), loading = _c[0], setLoading = _c[1];
|
||||
var _d = React.useState(), loadError = _d[0], setLoadError = _d[1];
|
||||
var _e = React.useState(), warning = _e[0], setWarning = _e[1];
|
||||
var _f = React.useState(), editing = _f[0], setEditing = _f[1];
|
||||
var _g = React.useState(false), showForm = _g[0], setShowForm = _g[1];
|
||||
var _h = React.useState(emptyForm(1)), form = _h[0], setForm = _h[1];
|
||||
var _j = React.useState(), formError = _j[0], setFormError = _j[1];
|
||||
var _k = React.useState(false), saving = _k[0], setSaving = _k[1];
|
||||
var _l = React.useState(), deleting = _l[0], setDeleting = _l[1];
|
||||
var _m = React.useState(), deleteError = _m[0], setDeleteError = _m[1];
|
||||
var _o = React.useState(false), deleteBusy = _o[0], setDeleteBusy = _o[1];
|
||||
var load = React.useCallback(function () {
|
||||
setLoading(true);
|
||||
setLoadError(undefined);
|
||||
api.templateRouteSteps
|
||||
.list(route.id)
|
||||
.then(setItems)
|
||||
.catch(function (e) { return setLoadError(e.message); })
|
||||
.finally(function () { return setLoading(false); });
|
||||
}, [api, route.id]);
|
||||
React.useEffect(function () { load(); }, [load]);
|
||||
var openCreate = function () {
|
||||
setEditing(undefined);
|
||||
var nextOrder = items.length > 0 ? Math.max.apply(Math, items.map(function (s) { return s.orderNo; })) + 1 : 1;
|
||||
setForm(emptyForm(nextOrder));
|
||||
setFormError(undefined);
|
||||
setShowForm(true);
|
||||
};
|
||||
var openEdit = function (item) {
|
||||
var _a, _b;
|
||||
setEditing(item);
|
||||
setForm({
|
||||
orderNo: String(item.orderNo),
|
||||
status: item.status,
|
||||
kind: (0, models_1.detectExecutorKind)(item),
|
||||
executorEmail: (_a = item.executorEmail) !== null && _a !== void 0 ? _a : '',
|
||||
position: (_b = item.position) !== null && _b !== void 0 ? _b : '',
|
||||
projectRole: item.projectRole && item.projectRole !== models_1.ProjectRole.None ? item.projectRole : models_1.ProjectRole.ProjectManager,
|
||||
headType: item.headType && item.headType !== models_1.HeadType.None ? item.headType : models_1.HeadType.Chief,
|
||||
allowReassignToOtherApprovers: item.allowReassignToOtherApprovers
|
||||
});
|
||||
setFormError(undefined);
|
||||
setShowForm(true);
|
||||
};
|
||||
var submit = function () {
|
||||
var orderNo = Number(form.orderNo);
|
||||
if (!orderNo || orderNo < 1) {
|
||||
setFormError('Порядковый номер шага обязателен.');
|
||||
return;
|
||||
}
|
||||
if (form.kind === 'email' && !form.executorEmail.trim()) {
|
||||
setFormError('Укажите email исполнителя.');
|
||||
return;
|
||||
}
|
||||
if (form.kind === 'position' && !form.position.trim()) {
|
||||
setFormError('Укажите должность.');
|
||||
return;
|
||||
}
|
||||
var payload = {
|
||||
orderNo: orderNo,
|
||||
status: form.status,
|
||||
allowReassignToOtherApprovers: form.allowReassignToOtherApprovers,
|
||||
executorEmail: form.kind === 'email' ? form.executorEmail.trim() : null,
|
||||
position: form.kind === 'position' ? form.position.trim() : null,
|
||||
projectRole: form.kind === 'projectRole' ? form.projectRole : null,
|
||||
headType: form.kind === 'headType' ? form.headType : null
|
||||
};
|
||||
setSaving(true);
|
||||
setFormError(undefined);
|
||||
var request = editing
|
||||
? api.templateRouteSteps.update(route.id, editing.id, payload)
|
||||
: api.templateRouteSteps.create(route.id, payload);
|
||||
request
|
||||
.then(function (step) {
|
||||
var _a;
|
||||
setShowForm(false);
|
||||
setWarning((_a = step.warning) !== null && _a !== void 0 ? _a : undefined);
|
||||
load();
|
||||
})
|
||||
.catch(function (e) { return setFormError(e.message); })
|
||||
.finally(function () { return setSaving(false); });
|
||||
};
|
||||
var confirmDelete = function () {
|
||||
if (!deleting)
|
||||
return;
|
||||
setDeleteBusy(true);
|
||||
setDeleteError(undefined);
|
||||
api.templateRouteSteps
|
||||
.remove(route.id, deleting.id)
|
||||
.then(function () {
|
||||
setDeleting(undefined);
|
||||
load();
|
||||
})
|
||||
.catch(function (e) { return setDeleteError(e.message); })
|
||||
.finally(function () { return setDeleteBusy(false); });
|
||||
};
|
||||
var sorted = tslib_1.__spreadArray([], items, true).sort(function (a, b) { return a.orderNo - b.orderNo; });
|
||||
return (React.createElement("div", null,
|
||||
React.createElement(ui_1.Breadcrumbs, { items: [
|
||||
{ label: 'Главная' },
|
||||
{ label: 'Маршруты согласования', onClick: onBack },
|
||||
{ label: "\u0428\u0430\u0433\u0438 \u043C\u0430\u0440\u0448\u0440\u0443\u0442\u0430 #".concat(route.id) }
|
||||
] }),
|
||||
React.createElement(ui_1.PageHeader, { icon: "flag-check", subtitle: "".concat(requestTypeName, " \u00B7 ").concat(models_1.routeTypeLabels[route.routeType]), title: "\u041C\u0430\u0440\u0448\u0440\u0443\u0442 #".concat(route.id), actions: React.createElement(React.Fragment, null,
|
||||
React.createElement(ui_1.Button, { variant: "ghost", icon: "arrow-left", onClick: onBack }, "\u041A \u043C\u0430\u0440\u0448\u0440\u0443\u0442\u0430\u043C"),
|
||||
React.createElement(ui_1.Button, { variant: "accent", icon: "plus", onClick: openCreate }, "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0448\u0430\u0433")) }),
|
||||
warning && React.createElement(ui_1.Alert, { kind: "warn" }, warning),
|
||||
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: 'order', header: '№', width: '50px', render: function (r) { return r.orderNo; } },
|
||||
{
|
||||
key: 'executor',
|
||||
header: 'Исполнитель',
|
||||
render: function (r) { return React.createElement(ui_1.PrimaryCell, null, describeExecutor(r)); }
|
||||
},
|
||||
{
|
||||
key: 'status',
|
||||
header: 'Статус',
|
||||
render: function (r) { return (React.createElement(ui_1.Badge, { variant: r.status === models_1.RouteStepStatus.Approval ? 'gold' : 'blue' }, models_1.routeStepStatusLabels[r.status])); }
|
||||
},
|
||||
{
|
||||
key: 'reassign',
|
||||
header: 'Переназначение',
|
||||
align: 'center',
|
||||
render: function (r) { return (r.allowReassignToOtherApprovers ? React.createElement(ui_1.Badge, { variant: "ok" }, "\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u043E") : React.createElement(ui_1.Badge, { variant: "neutral" }, "\u041D\u0435\u0442")); }
|
||||
},
|
||||
{
|
||||
key: 'actions',
|
||||
header: '',
|
||||
width: '100px',
|
||||
align: 'right',
|
||||
render: function (r) { return (React.createElement(ui_1.ActionsCell, null,
|
||||
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: sorted, keyOf: function (r) { return r.id; }, emptyMessage: loading ? 'Загрузка...' : 'Шагов пока нет — добавьте первый.' }),
|
||||
showForm && (React.createElement(ui_1.Modal, { title: editing ? "\u0428\u0430\u0433 #".concat(editing.orderNo) : 'Новый шаг маршрута', 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: "\u041F\u043E\u0440\u044F\u0434\u043A\u043E\u0432\u044B\u0439 \u043D\u043E\u043C\u0435\u0440", required: true },
|
||||
React.createElement(ui_1.TextInput, { type: "number", min: 1, value: form.orderNo, onChange: function (e) { return setForm(tslib_1.__assign(tslib_1.__assign({}, form), { orderNo: e.target.value })); } })),
|
||||
React.createElement(ui_1.Field, { label: "\u0421\u0442\u0430\u0442\u0443\u0441 \u0448\u0430\u0433\u0430", required: true },
|
||||
React.createElement(ui_1.Select, { options: STATUS_OPTIONS, value: form.status, onChange: function (e) { return setForm(tslib_1.__assign(tslib_1.__assign({}, form), { status: e.target.value })); } })),
|
||||
React.createElement(ui_1.Field, { label: "\u041A\u0442\u043E \u0438\u0441\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C", required: true, full: true, hint: "\u0414\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u043E \u0440\u043E\u0432\u043D\u043E \u043E\u0434\u043D\u043E \u0438\u0437 \u043F\u043E\u043B\u0435\u0439." },
|
||||
React.createElement(ui_1.RadioGroup, { name: "executorKind", value: form.kind, onChange: function (kind) { return setForm(tslib_1.__assign(tslib_1.__assign({}, form), { kind: kind })); }, options: [
|
||||
{ value: 'email', label: 'Конкретный сотрудник (email)' },
|
||||
{ value: 'position', label: 'По должности в компании инициатора' },
|
||||
{
|
||||
value: 'projectRole',
|
||||
label: 'По роли в проекте',
|
||||
disabled: !route.byProject,
|
||||
disabledHint: 'Недоступно: маршрут не учитывает проект (по проекту = нет).'
|
||||
},
|
||||
{ value: 'headType', label: 'По типу руководителя' }
|
||||
] })),
|
||||
form.kind === 'email' && (React.createElement(ui_1.Field, { label: "Email \u0438\u0441\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044F", required: true, full: true },
|
||||
React.createElement(ui_1.TextInput, { value: form.executorEmail, onChange: function (e) { return setForm(tslib_1.__assign(tslib_1.__assign({}, form), { executorEmail: e.target.value })); }, placeholder: "user@tnsu.kz" }))),
|
||||
form.kind === 'position' && (React.createElement(ui_1.Field, { label: "\u0414\u043E\u043B\u0436\u043D\u043E\u0441\u0442\u044C", required: true, full: true, hint: "\u0418\u0449\u0435\u0442\u0441\u044F \u0432 \u0441\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A\u0435 api.tnsu.kz \u043F\u043E \u043A\u043E\u043C\u043F\u0430\u043D\u0438\u0438 \u0438\u043D\u0438\u0446\u0438\u0430\u0442\u043E\u0440\u0430." },
|
||||
React.createElement(ui_1.TextInput, { value: form.position, onChange: function (e) { return setForm(tslib_1.__assign(tslib_1.__assign({}, form), { position: e.target.value })); }, placeholder: "\u0413\u043B\u0430\u0432\u043D\u044B\u0439 \u0438\u043D\u0436\u0435\u043D\u0435\u0440" }))),
|
||||
form.kind === 'projectRole' && (React.createElement(ui_1.Field, { label: "\u0420\u043E\u043B\u044C \u0432 \u043F\u0440\u043E\u0435\u043A\u0442\u0435", required: true, full: true },
|
||||
React.createElement(ui_1.Select, { options: PROJECT_ROLE_OPTIONS, value: form.projectRole, onChange: function (e) { return setForm(tslib_1.__assign(tslib_1.__assign({}, form), { projectRole: e.target.value })); } }))),
|
||||
form.kind === 'headType' && (React.createElement(ui_1.Field, { label: "\u0422\u0438\u043F \u0440\u0443\u043A\u043E\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044F", required: true, full: true },
|
||||
React.createElement(ui_1.Select, { options: HEAD_TYPE_OPTIONS, value: form.headType, onChange: function (e) { return setForm(tslib_1.__assign(tslib_1.__assign({}, form), { headType: e.target.value })); } }))),
|
||||
React.createElement(ui_1.Field, { label: "\u041F\u0435\u0440\u0435\u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435", full: true },
|
||||
React.createElement(ui_1.Checkbox, { label: "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u043F\u0435\u0440\u0435\u043D\u0430\u0437\u043D\u0430\u0447\u0430\u0442\u044C \u0434\u0440\u0443\u0433\u0438\u043C \u0441\u043E\u0433\u043B\u0430\u0441\u0443\u044E\u0449\u0438\u043C", checked: form.allowReassignToOtherApprovers, onChange: function (v) { return setForm(tslib_1.__assign(tslib_1.__assign({}, form), { allowReassignToOtherApprovers: v })); } }))))),
|
||||
deleting && (React.createElement(ui_1.ConfirmDialog, { title: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0448\u0430\u0433?", text: "\u0428\u0430\u0433 #".concat(deleting.orderNo, " \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043B\u0451\u043D \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.RouteStepsScreen = RouteStepsScreen;
|
||||
function describeExecutor(step) {
|
||||
if (step.executorEmail)
|
||||
return step.executorEmail;
|
||||
if (step.position)
|
||||
return step.position;
|
||||
if (step.projectRole && step.projectRole !== models_1.ProjectRole.None)
|
||||
return "\u0420\u043E\u043B\u044C: ".concat(models_1.projectRoleLabels[step.projectRole]);
|
||||
if (step.headType && step.headType !== models_1.HeadType.None)
|
||||
return "\u0420\u0443\u043A\u043E\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C: ".concat(models_1.headTypeLabels[step.headType]);
|
||||
return '—';
|
||||
}
|
||||
//# sourceMappingURL=RouteStepsScreen.js.map
|
||||
+1
File diff suppressed because one or more lines are too long
@@ -0,0 +1,186 @@
|
||||
"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 },
|
||||
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, 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)", 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
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user