From 3654e87d0dd48c46790a2df4763e4a073612f974 Mon Sep 17 00:00:00 2001 From: Vladimir Fomichev Date: Fri, 21 Nov 2025 18:04:46 +0300 Subject: [PATCH] =?utf8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81=20?= =?utf8?q?=D1=81=D1=82=D0=B8=D0=BB=D0=B5=D0=B9=20=D0=B8=20=D1=81=D0=BA?= =?utf8?q?=D1=80=D0=B8=D0=BF=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- erp24/views/grade/admin-update.php | 212 +++++---------------------- erp24/views/grade/update.php | 11 +- erp24/web/css/grade/admin-update.css | 14 ++ erp24/web/css/grade/update.css | 11 ++ erp24/web/js/grade/admin-update.js | 141 ++++++++++++++++++ 5 files changed, 209 insertions(+), 180 deletions(-) create mode 100644 erp24/web/css/grade/admin-update.css create mode 100644 erp24/web/css/grade/update.css create mode 100644 erp24/web/js/grade/admin-update.js diff --git a/erp24/views/grade/admin-update.php b/erp24/views/grade/admin-update.php index 77999557..46568bc8 100644 --- a/erp24/views/grade/admin-update.php +++ b/erp24/views/grade/admin-update.php @@ -6,10 +6,12 @@ use dosamigos\datetimepicker\DateTimePicker; use yii\widgets\ActiveForm; use yii\helpers\Html; use yii\helpers\ArrayHelper; +use yii\web\View; use yii_app\helpers\PrintBlockHelper; use yii_app\records\Admin; use yii_app\records\AdminGroup; use yii_app\records\Products1c; +use yii_app\records\EmployeePosition; use yii_app\services\FileService; /** @var Admin $model */ @@ -18,6 +20,38 @@ use yii_app\services\FileService; /** @var array $cityStores */ /** @var array $adminHistoryCategories */ /** @var array $companies */ +/** @var EmployeePosition[] $positions */ + +// Определяем специальные группы с parent_id = 50 (нужно для JS) +$specialGroups = [ + AdminGroup::GROUP_FLORIST_DAY, // 30 + AdminGroup::GROUP_FLORIST_NIGHT, // 35 + AdminGroup::GROUP_FLORIST_SUPPORT_DAY, // 40 + AdminGroup::GROUP_WORKERS, // 45 + AdminGroup::GROUP_ADMINISTRATORS, // 50 + AdminGroup::GROUP_FLORIST_SUPPORT_NIGHT, // 72 + AdminGroup::GROUP_FLORIST, // 89 +]; + +// Ищем группу "Работники магазинов" по имени +$workersGroup = AdminGroup::find()->where(['name' => AdminGroup::GROUP_STORE_WORKERS_NAME])->one(); +if ($workersGroup) { + $specialGroups[] = $workersGroup->id; +} + +// Подключаем CSS и JS файлы +$this->registerCssFile('/css/grade/admin-update.css'); +$this->registerJsFile('/js/grade/admin-update.js', ['position' => View::POS_END, 'depends' => [\yii\web\JqueryAsset::class]]); + +// Передаем PHP переменные в JavaScript +$this->registerJs(" + window.gradeAdminUpdateData = { + specialGroups: " . json_encode($specialGroups, JSON_NUMERIC_CHECK) . ", + adminGroups: " . json_encode($adminGroups ?? [], JSON_UNESCAPED_UNICODE) . ", + positionsData: " . json_encode(ArrayHelper::map($positions ?? [], 'id', 'name'), JSON_UNESCAPED_UNICODE) . ", + groupsData: " . json_encode($adminGroups ?? [], JSON_UNESCAPED_UNICODE) . " + }; +", View::POS_HEAD); ?> @@ -50,27 +84,7 @@ use yii_app\services\FileService; ?> where(['name' => AdminGroup::GROUP_STORE_WORKERS_NAME])->one(); - if ($workersGroup) { - $specialGroups[] = $workersGroup->id; - } - $isSpecialGroup = in_array((int)$model->group_id, $specialGroups); - - // Преобразуем в JSON для использования в JavaScript - $specialGroupsJson = json_encode($specialGroups, JSON_NUMERIC_CHECK); ?>
@@ -92,9 +106,8 @@ use yii_app\services\FileService; ?>
'form-control', + 'class' => 'form-control shift-display-readonly', 'readonly' => true, - 'style' => 'background-color: #e9ecef; cursor: not-allowed;', 'id' => 'shift-display-input' ])) ?>
@@ -276,157 +289,4 @@ use yii_app\services\FileService;
- - - - - \ No newline at end of file + \ No newline at end of file diff --git a/erp24/views/grade/update.php b/erp24/views/grade/update.php index 150d13e3..9b974978 100755 --- a/erp24/views/grade/update.php +++ b/erp24/views/grade/update.php @@ -3,11 +3,15 @@ use yii\widgets\ActiveForm; use yii\helpers\Html; use yii\helpers\ArrayHelper; +use yii\web\View; use \yii\widgets\Pjax; use dosamigos\datetimepicker\DateTimePicker; +// Подключаем CSS файл +$this->registerCssFile('/css/grade/update.css'); + /** @var \yii_app\records\Admin $admin */ /** @var \yii\base\DynamicModel $modelPosition */ /** @var \yii_app\records\EmployeePosition[] $positions */ @@ -101,7 +105,7 @@ use dosamigos\datetimepicker\DateTimePicker;
Текущая группа: adminGroup->name) ?> - ⚠️ Грейд не установлен + ⚠️ Грейд не установлен
Пожалуйста, выберите грейд из списка ниже @@ -151,9 +155,8 @@ use dosamigos\datetimepicker\DateTimePicker;
'form-control', - 'readonly' => true, - 'style' => 'background-color: #e9ecef; cursor: not-allowed;' + 'class' => 'form-control shift-display-readonly', + 'readonly' => true ]) ?>
diff --git a/erp24/web/css/grade/admin-update.css b/erp24/web/css/grade/admin-update.css new file mode 100644 index 00000000..407125ca --- /dev/null +++ b/erp24/web/css/grade/admin-update.css @@ -0,0 +1,14 @@ +.hidden { + display: none; +} + +.has-error select { + border-color: #dc3545 !important; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25) !important; +} + +.shift-display-readonly { + background-color: #e9ecef; + cursor: not-allowed; +} + diff --git a/erp24/web/css/grade/update.css b/erp24/web/css/grade/update.css new file mode 100644 index 00000000..2f9301d4 --- /dev/null +++ b/erp24/web/css/grade/update.css @@ -0,0 +1,11 @@ +/* Стили для страницы назначения грейда (grade/update) */ + +.shift-display-readonly { + background-color: #e9ecef; + cursor: not-allowed; +} + +.grade-error-text { + color: #dc3545; +} + diff --git a/erp24/web/js/grade/admin-update.js b/erp24/web/js/grade/admin-update.js new file mode 100644 index 00000000..b56ab0ac --- /dev/null +++ b/erp24/web/js/grade/admin-update.js @@ -0,0 +1,141 @@ +/** + * JavaScript для страницы редактирования администратора (grade/admin-update) + */ + +function toggleView(e) { + $(e.target).parent().find('.toggleableVisibility').toggleClass('hidden'); +} + +function changeWorkRateVisibility(t) { + if (t.value == 50) { + $('#workRate').show(); + } else { + $('#workRate').hide(); + } + + // Переключаем тип поля должности + changePositionFieldVisibility(t.value); +} + +function changePositionFieldVisibility(groupId) { + var specialGroups = window.gradeAdminUpdateData.specialGroups; // Получаем специальные группы из PHP + + var isSpecialGroup = specialGroups.includes(parseInt(groupId)); + + if (isSpecialGroup) { + $('#positionFieldSpecial').show(); + $('#positionFieldRegular').hide(); + } else { + $('#positionFieldSpecial').hide(); + $('#positionFieldRegular').show(); + // Очищаем поле employee_position_id для не-специальных групп + $('select[name="Admin[employee_position_id]"]').val(''); + } + + // Обновляем поле Смена на основе выбранной группы + updateShiftField(groupId); +} + +/** + * Обновляет поле Смена на основе названия группы + */ +function updateShiftField(groupId) { + var groupsData = window.gradeAdminUpdateData.adminGroups; + var groupName = groupsData[groupId] || ''; + var shiftField = $('#shiftField'); + var shiftInput = $('#shift-display-input'); + + if (!groupName) { + shiftField.hide(); + return; + } + + // Проверяем наличие "день" или "ночь" в названии группы + var groupNameLower = groupName.toLowerCase(); + var shiftValue = null; + + if (groupNameLower.indexOf('день') !== -1) { + shiftValue = 'День'; + } else if (groupNameLower.indexOf('ночь') !== -1) { + shiftValue = 'Ночь'; + } + + if (shiftValue !== null) { + shiftInput.val(shiftValue); + shiftField.show(); + } else { + shiftField.hide(); + } +} + +/** + * Проверка соответствия выбранного грейда и группы + */ +function checkGradeGroupMatch() { + var positionSelect = $('#employee-position-select'); + var groupSelect = $('#group-id-select'); + var alertDiv = $('#grade-group-mismatch-alert'); + + // Проверяем только если выбраны оба значения + if (!positionSelect.length || !groupSelect.length || !positionSelect.val() || !groupSelect.val()) { + alertDiv.hide(); + groupSelect.closest('.form-group').removeClass('has-error'); + return; + } + + var selectedPositionId = positionSelect.val(); + var selectedGroupId = groupSelect.val(); + var positionName = window.gradeAdminUpdateData.positionsData[selectedPositionId] || ''; + var groupName = window.gradeAdminUpdateData.groupsData[selectedGroupId] || ''; + + if (!positionName || !groupName) { + alertDiv.hide(); + groupSelect.closest('.form-group').removeClass('has-error'); + return; + } + + // Нормализуем названия для сравнения (убираем "день", "ночь" и приводим к нижнему регистру) + var normalizedPositionName = positionName.toLowerCase().replace(/\s*(день|ночь)\s*/gi, '').trim(); + var normalizedGroupName = groupName.toLowerCase().replace(/\s*(день|ночь)\s*/gi, '').trim(); + + // Проверяем частичное совпадение + var hasMatch = false; + if (normalizedGroupName.indexOf(normalizedPositionName) !== -1 || + normalizedPositionName.indexOf(normalizedGroupName) !== -1) { + hasMatch = true; + } + + if (!hasMatch) { + // Несовпадение - показываем предупреждение и выделяем поле группы + alertDiv.show(); + groupSelect.closest('.form-group').addClass('has-error'); + groupSelect.css('border-color', '#dc3545'); + groupSelect.css('box-shadow', '0 0 0 0.2rem rgba(220, 53, 69, 0.25)'); + } else { + // Совпадение - скрываем предупреждение и убираем выделение + alertDiv.hide(); + groupSelect.closest('.form-group').removeClass('has-error'); + groupSelect.css('border-color', ''); + groupSelect.css('box-shadow', ''); + } +} + +// Инициализируем поле при загрузке страницы +$(document).ready(function() { + var initialGroupId = $('select[name="Admin[group_id]"]').val(); + changePositionFieldVisibility(initialGroupId); + + // Для не-специальных групп очищаем employee_position_id при загрузке + var specialGroups = window.gradeAdminUpdateData.specialGroups; + var isSpecialGroup = specialGroups.includes(parseInt(initialGroupId)); + if (!isSpecialGroup) { + $('select[name="Admin[employee_position_id]"]').val(''); + } + + // Обновляем поле Смена при загрузке страницы + updateShiftField(initialGroupId); + + // Проверяем соответствие при загрузке страницы + checkGradeGroupMatch(); +}); + -- 2.39.5