feat: port stroy-bot-works as works page

Tree table of an object's works from Dataverse with add / add child /
edit / delete, "save and add more", units dictionary and parent
re-binding, 1:1 with the legacy web part. Reuses the tree widgets from
the objects page; the parent navigation property lookup is cached as a
single promise so concurrent saves don't race.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Тимур Городецкий
2026-10-16 09:55:54 +05:00
parent bfb3eb7b75
commit 673ace2ba6
16 changed files with 1444 additions and 1 deletions
@@ -0,0 +1,58 @@
// Тексты раздела «Работы» — дословно из stroy-bot-works.
export const WORKS_TEXTS = {
defaultHeader: 'ОБЪЕКТЫ ПРОЕКТА',
addWork: 'Добавить работу',
addFirst: '+ Добавить работу',
columns: {
number: '#',
title: 'Наименование',
unit: 'Ед. изм.',
volume: 'Проектный объём',
date: 'Дата'
},
loading: 'Загрузка данных...',
empty: 'Работы не найдены',
loadError: 'Ошибка загрузки данных. Проверьте настройки подключения к Dataverse.',
worksLoadError: 'Не удалось загрузить список работ из Dataverse',
noValue: '—',
expand: 'Развернуть',
collapse: 'Свернуть',
actions: 'Действия',
menu: {
addChild: 'Добавить дочернюю',
edit: 'Редактировать',
delete: 'Удалить'
},
modal: {
addTitle: 'Добавить работу',
editTitle: 'Редактировать работу',
title: 'НАИМЕНОВАНИЕ',
titlePlaceholder: 'Введите наименование работы',
unit: 'ЕД. ИЗМ.',
unitPlaceholder: 'выберите ед.изм',
volume: 'ПРОЕКТНЫЙ ОБЪЁМ',
volumePlaceholder: '0.000',
parent: 'РОДИТЕЛЬСКАЯ РАБОТА',
// Два пробела — как в старом коде.
noParent: '— без родителя —',
object: 'ОБЪЕКТ',
start: 'ДАТА НАЧАЛА',
finish: 'ДАТА ОКОНЧАНИЯ',
cancel: 'Отмена',
// Два пробела — как в старом коде.
saveMore: 'Сохранить и добавить еще',
add: 'Добавить',
save: 'Сохранить',
saving: 'Сохранение...',
saveError: 'Ошибка при сохранении. Проверьте права доступа к Dataverse.'
},
confirmDelete: {
title: 'Подтвердите удаление',
message: 'Вы уверены, что хотите удалить выбранную работу? Это действие нельзя отменить.',
cancel: 'Отмена',
confirm: 'Удалить'
},
deleteFailed: 'Ошибка при удалении записи.',
deleteError: 'Ошибка при удалении. Проверьте права доступа к Dataverse.'
} as const;