копирование есть
This commit is contained in:
@@ -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: 'Сотрудники не найдены в справочнике'
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user