From: Vladimir Fomichev Date: Mon, 8 Sep 2025 10:35:43 +0000 (+0300) Subject: Мягкое удаление X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=06362649b543425bb96e441921f5a6c2816d13e0;p=erp24_rep%2Fyii-erp24%2F.git Мягкое удаление --- diff --git a/erp24/controllers/MatrixTypeController.php b/erp24/controllers/MatrixTypeController.php index 9d346ce6..ed4e5d16 100644 --- a/erp24/controllers/MatrixTypeController.php +++ b/erp24/controllers/MatrixTypeController.php @@ -116,6 +116,7 @@ class MatrixTypeController extends Controller $child->parent_id = (int)$parent_id; if ($child->save()) { + Yii::$app->session->setFlash('success', 'Запись создана', false); return ['success'=>true,'data'=>['id'=>$child->id, 'name'=>$child->name]]; } return ['success'=>false,'message'=>current($child->getFirstErrors()) ?: 'Ошибка создания']; @@ -129,6 +130,7 @@ class MatrixTypeController extends Controller $model = $this->findModel($id); if (!$model) { + Yii::$app->session->setFlash('error', 'Ошибка изменения активности'); return ['success' => false, 'message' => 'Не найдено']; } @@ -138,6 +140,7 @@ class MatrixTypeController extends Controller try { $model->active = $active; if (!$model->save(false)) { + Yii::$app->session->setFlash('error', 'Ошибка изменения активности'); throw new \RuntimeException('Не удалось сохранить узел'); } @@ -146,10 +149,12 @@ class MatrixTypeController extends Controller } $transaction->commit(); - return ['success' => true]; + Yii::$app->session->setFlash('success', 'Активность записей изменена', false); + return ['success' => true, 'message' => 'Активность записей изменена']; } catch (Throwable $e) { $transaction->rollBack(); + Yii::$app->session->setFlash('error', 'Ошибка изменения активности'); Yii::error($e->getMessage(), 'matrix-type.toggle-active'); return ['success' => false, 'message' => 'Ошибка при сохранении']; } @@ -202,6 +207,7 @@ class MatrixTypeController extends Controller { $model = $this->findModel($id); if (!$model) { + Yii::$app->session->setFlash('error', 'Запись не найдена'); return $this->redirect(['index']); } @@ -219,9 +225,11 @@ class MatrixTypeController extends Controller } $transaction->commit(); + Yii::$app->session->setFlash('success', 'Записи удалены'); return $this->redirect(['index']); } catch (\Throwable $e) { $transaction->rollBack(); + Yii::$app->session->setFlash('error', 'Ошибка удаления записей'); Yii::error($e->getMessage(), 'matrix-type.soft-delete'); return $this->redirect(['index']); } @@ -235,6 +243,7 @@ class MatrixTypeController extends Controller 'deleted_by' => $uid, 'deleted_at' => $now, 'active' => 0, + 'deleted' => 1, ]); if ($result === false) { Yii::error("Ошибка сохранения " . json_encode($matrixType->getErrors(), JSON_UNESCAPED_UNICODE)); @@ -263,7 +272,7 @@ class MatrixTypeController extends Controller */ protected function findModel($id) { - if (($model = MatrixType::find()->where(['id' => $id])->andWhere(['deleted_at' => null])->one()) !== null) { + if (($model = MatrixType::find()->where(['id' => $id])->andWhere(['deleted' => 0])->one()) !== null) { return $model; } diff --git a/erp24/migrations/m250905_090045_add_parentid_active_fields_to_matrix_type_table.php b/erp24/migrations/m250905_090045_add_parentid_active_fields_to_matrix_type_table.php index 08db8437..16236ffd 100644 --- a/erp24/migrations/m250905_090045_add_parentid_active_fields_to_matrix_type_table.php +++ b/erp24/migrations/m250905_090045_add_parentid_active_fields_to_matrix_type_table.php @@ -43,6 +43,13 @@ class m250905_090045_add_parentid_active_fields_to_matrix_type_table extends Mig $this->timestamp()->defaultValue(null)->comment('дата удаления') ); } + if (!$this->db->schema->getTableSchema(self::TABLE_NAME, true)->getColumn('deleted')) { + $this->addColumn( + self::TABLE_NAME, + 'deleted', + $this->tinyInteger()->notNull()->defaultValue(0)->comment('признак удаленного элемента') + ); + } } /** @@ -61,6 +68,8 @@ class m250905_090045_add_parentid_active_fields_to_matrix_type_table extends Mig } if ($this->db->schema->getTableSchema(self::TABLE_NAME, true)->getColumn('deleted_at')) { $this->dropColumn(self::TABLE_NAME, 'deleted_at'); + }if ($this->db->schema->getTableSchema(self::TABLE_NAME, true)->getColumn('deleted')) { + $this->dropColumn(self::TABLE_NAME, 'deleted'); } } diff --git a/erp24/records/MatrixType.php b/erp24/records/MatrixType.php index 4fdeebeb..2af17a87 100644 --- a/erp24/records/MatrixType.php +++ b/erp24/records/MatrixType.php @@ -1,7 +1,6 @@ 'trim'], [['name'], 'required'], - [['created_by', 'updated_by', 'active', 'parent_id'], 'integer'], - [['created_at', 'updated_at'], 'safe'], + [['created_by', 'updated_by', 'deleted_by', 'active', 'parent_id', 'deleted'], 'integer'], + [['created_at', 'updated_at', 'deleted_at'], 'safe'], [['name'], 'string', 'max' => 255], // Уникальность имени в рамках одной группы [ @@ -78,10 +80,13 @@ class MatrixType extends \yii\db\ActiveRecord 'name' => 'Название типа матрицы', 'parent_id' => 'Родительская категория', 'active' => 'Активность', + 'deleted' => 'Удалено', 'created_by' => 'ИД создателя', 'created_at' => 'Дата создания', 'updated_by' => 'ИД редактировавшего', 'updated_at' => 'Дата обновления', + 'deleted_by' => 'ИД удалившего', + 'deleted_at' => 'Дата обновления', ]; } diff --git a/erp24/records/MatrixTypeSearch.php b/erp24/records/MatrixTypeSearch.php index a4fe7421..51f581d6 100644 --- a/erp24/records/MatrixTypeSearch.php +++ b/erp24/records/MatrixTypeSearch.php @@ -21,7 +21,7 @@ class MatrixTypeSearch extends MatrixType $this->load($params, ''); $allTypes = MatrixType::find() - ->andWhere(['deleted_at' => null]) + ->andWhere(['deleted' => 0]) ->orderBy(['parent_id' => SORT_ASC, 'id' => SORT_ASC]) ->all(); diff --git a/erp24/views/matrix-type/index.php b/erp24/views/matrix-type/index.php index 49bfa268..09656b18 100644 --- a/erp24/views/matrix-type/index.php +++ b/erp24/views/matrix-type/index.php @@ -11,10 +11,26 @@ use yii\widgets\ActiveForm; $this->title = 'Управление категориями букетов'; $this->params['breadcrumbs'][] = $this->title; + +$this->registerCssFile(Yii::getAlias('@web') . '/css/matrix-type/index.css'); $this->registerJsFile('/js/matrix-type/index.js', ['position' => \yii\web\View::POS_END]); + ?>
+ session->hasFlash('success')): ?> + + + + session->hasFlash('error')): ?> + +

title) ?>

diff --git a/erp24/web/css/matrix-type/index.css b/erp24/web/css/matrix-type/index.css new file mode 100644 index 00000000..0341ac85 --- /dev/null +++ b/erp24/web/css/matrix-type/index.css @@ -0,0 +1,14 @@ +.loading-spinner { + display: inline-block; + width: 16px; + height: 16px; + border: 2px solid #ccc; + border-top: 2px solid #333; + border-radius: 50%; + animation: spin 0.6s linear infinite; + margin-left: 6px; +} + +@keyframes spin { + 100% { transform: rotate(360deg); } +} diff --git a/erp24/web/js/matrix-type/index.js b/erp24/web/js/matrix-type/index.js index ec2408e0..23c44517 100644 --- a/erp24/web/js/matrix-type/index.js +++ b/erp24/web/js/matrix-type/index.js @@ -80,6 +80,9 @@ var id = checkbox.data('id'); var active = checkbox.is(':checked') ? 1 : 0; + var spinner = $(''); + checkbox.after(spinner); + $.ajax({ url: '/matrix-type/toggle-active', type: 'POST', @@ -94,6 +97,17 @@ checkbox.prop('checked', !active); return; } + var row = checkbox.closest('tr'); + if (active === 0) { + row.css('background', '#ffecec'); + } else { + row.css('background', ''); + } + var alertBox = $(''); + $('.matrix-type-index').prepend(alertBox); if (active === 0 && checkbox.closest('tr').find('td:first').text().trim() !== '') { var nodeId = id; @@ -105,6 +119,9 @@ error: function () { alert('Ошибка сервера'); checkbox.prop('checked', !active); + }, + complete: function () { + spinner.remove(); } }); });