копирование есть

This commit is contained in:
gorbenko.pavel
2026-08-14 14:03:38 +05:00
parent 10f70609ad
commit d052fd41b8
10 changed files with 540 additions and 10 deletions
+50 -1
View File
@@ -187,6 +187,38 @@ export const texts = {
controlLabel: 'Контроль',
controlCheckbox: 'Требуется отдельный контроль исполнения',
validationRequestType: 'Выберите тип заявки.',
// ---- Копирование маршрута ----
copy: 'Копировать',
copyTitle: (routeId: number): string => `Копия маршрута #${routeId}`,
copyAction: 'Создать копию',
copyInProgress: 'Копирование...',
copyHint:
'Копия создаётся для того же типа заявки вместе со всеми шагами. Маршрут различается по компании, ' +
'отделу и признаку «по проекту» — измените хотя бы одно из них, иначе копия совпадёт с исходным маршрутом.',
copySource: (requestTypeName: string, company: string, department: string): string =>
`Копируем: ${requestTypeName} · ${company} · ${department}`,
copyStepsCount: (count: number): string =>
`Шагов будет скопировано: ${count} ${pluralRu(count, ['шаг', 'шага', 'шагов'])}`,
copyStepsLoading: 'Загрузка шагов исходного маршрута...',
copyStepsEmpty: 'В исходном маршруте нет шагов — копия будет пустой.',
validationCopySame:
'Копия совпадает с исходным маршрутом. Измените компанию, отдел или признак «по проекту» — ' +
'иначе такой маршрут уже существует.',
// Роль в проекте допустима только у маршрута с признаком «по проекту» (проверка
// на бэкенде, TemplateRouteStepService) — предупреждаем ДО копирования, иначе
// копия сорвётся на середине переноса шагов.
copyProjectRoleWarning: (count: number): string =>
`В исходном маршруте ${count} ${pluralRu(count, ['шаг', 'шага', 'шагов'])} с ролью в проекте. ` +
'Без признака «по проекту» такие шаги скопировать нельзя — включите его или удалите эти шаги в исходном маршруте.',
copyStepFailed: (orderNo: number, message: string): string =>
`Не удалось скопировать шаг ${orderNo}: ${message}`,
// Частично скопированный маршрут опаснее, чем несозданный: он бы резолвился
// с недостающими согласующими. Поэтому при ошибке копию удаляем целиком.
copyRolledBack: 'Копия не создана — маршрут удалён, чтобы не остался наполовину скопированным.',
copyRollbackFailed: (routeId: number): string =>
`ВНИМАНИЕ: маршрут #${routeId} создан, но шаги скопированы не полностью, и удалить его автоматически не вышло. Удалите маршрут вручную.`,
deleteTitle: 'Удалить маршрут?',
deleteText: (routeId: number): string =>
`Маршрут #${routeId} и все его шаги будут удалены безвозвратно.`
@@ -232,6 +264,20 @@ export const texts = {
executorPlaceholder: 'Выберите сотрудника',
positionLabel: 'Должность',
positionHint: 'Ищется в справочнике api.tnsu.kz по компании инициатора.',
// Подсказка «кого найдёт эта должность» — считается по загруженному справочнику.
positionPreviewLoading: 'Проверяем по справочнику сотрудников...',
positionPreviewFound: (count: number): string =>
count === 1
? 'Сейчас эту должность занимает:'
: `Эту должность занимают ${count} ${pluralRu(count, ['сотрудник', 'сотрудника', 'сотрудников'])} — ` +
'на согласование пойдёт тот, чья компания совпадёт с компанией инициатора:',
positionPreviewNone:
'Точно такой должности в справочнике нет — на резолве шаг останется без исполнителя. Проверьте написание.',
positionPreviewSimilar: 'Похожие должности в справочнике (нажмите, чтобы подставить точное написание):',
/** Сколько ещё человек занимают ту же должность, кроме показанного. */
positionPreviewMore: (count: number): string =>
`и ещё ${count} ${pluralRu(count, ['человек', 'человека', 'человек'])}`,
positionPreviewNoDictionary: 'Справочник сотрудников недоступен — проверить должность не удалось.',
positionPlaceholder: 'Главный инженер',
projectRoleLabel: 'Роль в проекте',
headTypeLabel: 'Тип руководителя',
@@ -385,7 +431,10 @@ export const texts = {
missingInDictionary: 'Нет в справочнике',
loadingDictionary: 'Загрузка справочника...',
searching: 'Поиск...',
employeeSearchPlaceholder: 'Поиск по ФИО или email...',
// Не перечисляем поля: искать можно и по ФИО, и по email, и по должности
// (см. toEmployeeOption — должность попадает в sublabel, а SearchableSelect
// ищет и по нему). Перечисление всё равно устарело бы при следующем поле.
employeeSearchPlaceholder: 'Поиск...',
employeesEmpty: 'Сотрудники не найдены в справочнике'
}
};