
## client/custom/modules/hyb-report/src/views/report-studio/index.js
57:                 this.$el.find('.report-name-status').text('Đang chỉnh sửa...').css('color', '#fbbf24');
63:                 this.$el.find('.report-name-status').text('Đã cập nhật tên').css('color', '#10b981');
77:                     Espo.Ui.error('Sếp ơi, chưa đặt tên cho Báo cáo kìa!');
83:                 Espo.Ui.notify('Đang lưu báo cáo...', 'info', true);
95:                     Espo.Ui.success('Đã lưu thành công!');
98:                     Espo.Ui.error('Lỗi khi lưu báo cáo!');

## client/custom/modules/hyb-report/src/views/report-studio/studio-page.js
238:                 Espo.Ui.error('Datasource selector chưa sẵn sàng');
347:                 Espo.Ui.error('Vui lòng nhập tên widget');
362:             Espo.Ui.notify('Đang lưu...', 'info', true);
382:                     Espo.Ui.notify('Đã tạo widget thành công', 'success', 2000);
386:                     Espo.Ui.error('Lỗi tạo widget: ' + (err.message || err));
402:                     Espo.Ui.notify('Đã cập nhật widget', 'success', 2000);
406:                     Espo.Ui.error('Lỗi cập nhật widget: ' + (err.message || err));

## client/custom/modules/hyb-report/src/views/fields/metrics-array.js
105:             if (!label) { Espo.Ui.error('Sếp phải đặt Tên (Label) trước khi khóa Tag nhé!'); return; }
107:             if (isDuplicate) { Espo.Ui.error('Tên Tag này bị trùng rồi sếp ơi!'); return; }
139:                 Espo.Ui.warning(`Đã đạt giới hạn ${MatrixUtil.CONFIG.MAX_METRICS} phép tính!`);

## client/custom/modules/hyb-report/src/views/report-viewer/index.js
42:                 .catch(err => { Espo.Ui.error('Error fetching layout', true); });
121:                         Espo.Ui.notify(this.translate('Widget Removed', 'messages', 'HybReport'), 'success', 1000);
152:                 Espo.Ui.notify(this.translate('savingLayout', 'messages', 'HybReport'), 'info', true);
154:                     Espo.Ui.notify(this.translate('layoutSaved', 'messages', 'HybReport'), 'success', 1000);

## client/custom/modules/hyb-report/src/views/c-report-dashboard/helpers/navigation-shell.js
77:             Espo.Ui.notify(viewer.translate('savingLayout', 'messages', 'HybReport'), 'info', true);
79:                 Espo.Ui.notify(viewer.translate('layoutSaved', 'messages', 'HybReport'), 'success', 1000);
98:                 Espo.Ui.warning('Vui lòng chọn dashboard trước.');

## client/custom/modules/hyb-report/src/controllers/c-report-dashboard.js
27:                 Espo.Ui.error('Missing dashboardId param');
62:                 Espo.Ui.error('Missing widget id');
81:                     Espo.Ui.error('Không thể tải dữ liệu widget');
