Compare commits

...

3 Commits

Author SHA1 Message Date
Тимур Городецкий abe7cdbbc3 fix(oid): рекомендованный поставщик зелёным, как в СТ
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-03 16:42:41 +05:00
Тимур Городецкий e50eca4fd4 fix(oid): статус СТ до оповещения — на финале согласования шлём Согласована
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-03 16:34:33 +05:00
Тимур Городецкий fa47373d57 fix(oid): подсказки поиска в диалоге замены не обрезаются
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-03 16:15:03 +05:00
4 changed files with 34 additions and 19 deletions
@@ -135,14 +135,14 @@
border-top: 3px solid $ok !important;
}
.thSupplierRec {
background: $accent-bg !important;
color: $accent-dark;
border-top: 3px solid $accent !important;
background: $ok-bg !important;
color: $ok;
border-top: 3px solid $ok !important;
}
.thSupplierSel {
background: rgba($gold-500, 0.02) !important;
background: rgba($ok, 0.05) !important;
color: $text;
border-top: 5px solid $accent !important;
border-top: 5px solid $ok !important;
}
.supplierHeaderCell {
@@ -162,7 +162,7 @@
.recBadge {
font-size: 10px;
font-weight: 600;
background: $accent;
background: $ok;
color: $surface;
border-radius: 10px;
padding: 1px 6px;
@@ -205,7 +205,7 @@
font-size: 11px;
padding: 2px 10px;
border-radius: 3px;
background: $accent;
background: $ok;
color: $surface;
font-weight: 500;
white-space: nowrap;
@@ -214,7 +214,7 @@
.selBadge {
font-size: 10px;
font-weight: 600;
background: $accent;
background: $ok;
color: $surface;
border-radius: 10px;
padding: 1px 6px;
@@ -198,6 +198,14 @@
overflow-y: auto;
}
// Модификатор для списка внутри диалога (замена согласующего): absolute-подсказки
// обрезались телом диалога (overflow-y: auto). В потоке список раздвигает диалог,
// а при длинном списке скроллится внутри него.
.suggestionsInline {
position: static;
box-shadow: none;
}
.suggestionItem {
display: flex;
flex-direction: column;
@@ -301,7 +301,7 @@ export const Step4Approval: React.FC<Props> = (props) => {
/>
</FormField>
{a.replaceDialog.suggestions.length > 0 && !a.replaceDialog.selected && (
<ul className={styles.suggestions}>
<ul className={`${styles.suggestions} ${styles.suggestionsInline}`}>
{a.replaceDialog.suggestions.map((s) => (
<li
key={s.spId}
@@ -248,26 +248,33 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) {
setChain(updatedChain);
onSave({ approvalChain: updatedChain });
const nextPending = updatedChain.find((m) => m.status === "pending");
if (nextPending) {
if (currentMember.spApprovalId) {
await notify(currentMember.spApprovalId);
}
if (nextPending.spApprovalId) {
await notify(nextPending.spApprovalId);
}
}
const allDone = updatedChain.every(
(m) =>
m.status === "approved" ||
m.status === "skipped" ||
m.status === "recommends"
);
if (allDone) {
// Финал: сначала статус «Согласовано», потом оповещение — иначе поток прочитает
// «На согласовании» и не отправит «Согласована» (а раньше на финале вообще ничего
// не слал, т.к. nextPending уже нет). Порядок как в ветке отклонения.
await service.updateOIDStatus(oid!.id, "approved");
onSave({ oid: { ...oid!, status: "approved" }, approvalChain: updatedChain });
if (currentMember.spApprovalId) {
await notify(currentMember.spApprovalId);
}
onStepComplete(4);
} else {
const nextPending = updatedChain.find((m) => m.status === "pending");
if (nextPending) {
if (currentMember.spApprovalId) {
await notify(currentMember.spApprovalId);
}
if (nextPending.spApprovalId) {
await notify(nextPending.spApprovalId);
}
}
}
} else {
const othersToDelete = chain.filter(