diff --git a/app/resources/js/views/admin/AdminSupplierPricesView.vue b/app/resources/js/views/admin/AdminSupplierPricesView.vue
index 27cc5b86..493b22d5 100644
--- a/app/resources/js/views/admin/AdminSupplierPricesView.vue
+++ b/app/resources/js/views/admin/AdminSupplierPricesView.vue
@@ -12,6 +12,7 @@
density="compact"
hide-details
variant="plain"
+ :aria-label="`Cost (₽) для ${item.name}`"
/>
@@ -24,10 +25,17 @@
density="compact"
hide-details
variant="plain"
+ :aria-label="`Quality для ${item.name}`"
/>
-
+
diff --git a/app/tests/Frontend/AdminSupplierPricesView.spec.ts b/app/tests/Frontend/AdminSupplierPricesView.spec.ts
index bf06af90..8d668fac 100644
--- a/app/tests/Frontend/AdminSupplierPricesView.spec.ts
+++ b/app/tests/Frontend/AdminSupplierPricesView.spec.ts
@@ -58,4 +58,25 @@ describe('AdminSupplierPricesView', () => {
const inputs = wrapper.findAll('input[type="number"]');
expect(inputs.length).toBeGreaterThanOrEqual(6);
});
+
+ it('each input/switch has explicit aria-label combining supplier name + field role', async () => {
+ const wrapper = mount(AdminSupplierPricesView, { global: { plugins: [vuetify] } });
+ await new Promise((r) => setTimeout(r, 50));
+ // 3 suppliers × 3 fields = 9 controls
+ const expectedLabels = [
+ 'Cost (₽) для B1 — Сайты и Звонки',
+ 'Quality для B1 — Сайты и Звонки',
+ 'Active для B1 — Сайты и Звонки',
+ 'Cost (₽) для B2 — SMS',
+ 'Quality для B2 — SMS',
+ 'Active для B2 — SMS',
+ 'Cost (₽) для B3 — SMS',
+ 'Quality для B3 — SMS',
+ 'Active для B3 — SMS',
+ ];
+ for (const label of expectedLabels) {
+ const node = wrapper.find(`[aria-label="${label}"]`);
+ expect(node.exists(), `aria-label="${label}" not found`).toBe(true);
+ }
+ });
});