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 */
/** @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);
?>
?>
<?php
- // Определяем специальные группы с parent_id = 50
- $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;
- }
-
$isSpecialGroup = in_array((int)$model->group_id, $specialGroups);
-
- // Преобразуем в JSON для использования в JavaScript
- $specialGroupsJson = json_encode($specialGroups, JSON_NUMERIC_CHECK);
?>
<div id="positionFieldSpecial" style="display: <?= $isSpecialGroup ? 'block' : 'none' ?>;">
?>
<div id="shiftField" style="display: <?= $shiftValue !== null ? 'block' : 'none' ?>;">
<?php PrintBlockHelper::printBlock('Смена', Html::textInput('shift_display', $shiftValue ?? '', [
- 'class' => 'form-control',
+ 'class' => 'form-control shift-display-readonly',
'readonly' => true,
- 'style' => 'background-color: #e9ecef; cursor: not-allowed;',
'id' => 'shift-display-input'
])) ?>
</div>
<?php ActiveForm::end() ?>
</div>
-</div>
-
-<style>
- .hidden {
- display: none;
- }
- .has-error select {
- border-color: #dc3545 !important;
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25) !important;
- }
-</style>
-
-<script>
- 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 = <?= $specialGroupsJson ?>; // Получаем специальные группы из 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 = <?= json_encode($adminGroups, JSON_UNESCAPED_UNICODE) ?>;
- 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();
- }
- }
-
- // Данные для проверки соответствия грейда и группы
- var positionsData = <?= json_encode(ArrayHelper::map($positions, 'id', 'name'), JSON_UNESCAPED_UNICODE) ?>;
- var groupsData = <?= json_encode($adminGroups, JSON_UNESCAPED_UNICODE) ?>;
-
- /**
- * Проверка соответствия выбранного грейда и группы
- */
- 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 = positionsData[selectedPositionId] || '';
- var groupName = 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 = <?= $specialGroupsJson ?>;
- var isSpecialGroup = specialGroups.includes(parseInt(initialGroupId));
- if (!isSpecialGroup) {
- $('select[name="Admin[employee_position_id]"]').val('');
- }
-
- // Обновляем поле Смена при загрузке страницы
- updateShiftField(initialGroupId);
-
- // Проверяем соответствие при загрузке страницы
- checkGradeGroupMatch();
- });
-</script>
\ No newline at end of file
+</div>
\ No newline at end of file
--- /dev/null
+/**
+ * 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();
+});
+