mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-08 17:06:15 -08:00
fix(xtream): scope category bulk actions to search results (#1534)
This commit is contained in:
1 parent
1c56b3ea02
commit
eba68d687e
27 files changed
+461
-52
No files matched your search
@@ -16,6 +16,111 @@ import {
|
||||
} from './electron-test-fixtures';
|
||||
|
||||
test.describe('Electron Xtream Category Management', () => {
|
||||
for (const section of ['Live TV', 'Movies', 'Series']) {
|
||||
test(`bulk edits only filtered ${section} categories and saves or discards the draft`, async ({
|
||||
dataDir,
|
||||
request,
|
||||
}) => {
|
||||
await resetMockServers(request, ['xtream']);
|
||||
const app = await launchElectronApp(dataDir);
|
||||
try {
|
||||
await addXtreamPortal(app.mainWindow, {
|
||||
name: `Filtered ${section}`,
|
||||
});
|
||||
await waitForXtreamWorkspaceReady(app.mainWindow);
|
||||
await openWorkspaceSection(app.mainWindow, section);
|
||||
let dialog = await openManageCategoriesDialog(app.mainWindow);
|
||||
const rows = dialog.locator('.category-item');
|
||||
const names = (
|
||||
await rows.locator('.category-name').allTextContents()
|
||||
).map((name) => name.trim());
|
||||
// The default mock catalog has several matches and nonmatches in every type.
|
||||
const matched = names.filter((name) =>
|
||||
name.toLowerCase().includes('a')
|
||||
);
|
||||
const outside = names.filter(
|
||||
(name) => !name.toLowerCase().includes('a')
|
||||
);
|
||||
expect(matched.length).toBeGreaterThan(1);
|
||||
expect(outside.length).toBeGreaterThan(1);
|
||||
const checkbox = (name: string) =>
|
||||
dialog.getByRole('checkbox', { name, exact: true });
|
||||
await checkbox(outside[0]).uncheck();
|
||||
await checkbox(matched[0]).uncheck();
|
||||
const search = () => dialog.locator('input[type="search"]');
|
||||
await search().fill('a');
|
||||
const select = () =>
|
||||
dialog.getByRole('button', {
|
||||
name: 'Select Filtered',
|
||||
exact: true,
|
||||
});
|
||||
const deselect = () =>
|
||||
dialog.getByRole('button', {
|
||||
name: 'Deselect Filtered',
|
||||
exact: true,
|
||||
});
|
||||
await expect(rows).toHaveCount(matched.length);
|
||||
await expect(select()).toBeEnabled();
|
||||
await expect(deselect()).toBeEnabled();
|
||||
await select().click();
|
||||
await expect(select()).toBeDisabled();
|
||||
await expect(dialog.locator('.selection-info')).toHaveText(
|
||||
`Total selected: ${names.length - 1} / ${names.length}`
|
||||
);
|
||||
await deselect().click();
|
||||
await expect(deselect()).toBeDisabled();
|
||||
await expect(dialog.locator('.selection-info')).toHaveText(
|
||||
`Total selected: ${outside.length - 1} / ${names.length}`
|
||||
);
|
||||
await search().fill('no matching mock category');
|
||||
await expect(select()).toBeDisabled();
|
||||
await expect(deselect()).toBeDisabled();
|
||||
await expect(dialog.locator('.empty-message')).toHaveText(
|
||||
'No matching categories found'
|
||||
);
|
||||
await search().fill('');
|
||||
await expect(checkbox(outside[0])).not.toBeChecked();
|
||||
await expect(checkbox(outside[1])).toBeChecked();
|
||||
for (const name of matched)
|
||||
await expect(checkbox(name)).not.toBeChecked();
|
||||
await dialog
|
||||
.getByRole('button', { name: 'Save', exact: true })
|
||||
.click();
|
||||
await expect(dialog).not.toBeVisible();
|
||||
dialog = await openManageCategoriesDialog(app.mainWindow);
|
||||
await expect(checkbox(outside[0])).not.toBeChecked();
|
||||
await expect(checkbox(outside[1])).toBeChecked();
|
||||
for (const name of matched)
|
||||
await expect(checkbox(name)).not.toBeChecked();
|
||||
await search().fill('A');
|
||||
await select().click();
|
||||
await dialog
|
||||
.getByRole('button', { name: 'Close', exact: true })
|
||||
.click();
|
||||
await expect(dialog).not.toBeVisible();
|
||||
dialog = await openManageCategoriesDialog(app.mainWindow);
|
||||
for (const name of matched)
|
||||
await expect(checkbox(name)).not.toBeChecked();
|
||||
await search().fill('a');
|
||||
await select().click();
|
||||
await dialog
|
||||
.getByRole('button', { name: 'Save', exact: true })
|
||||
.click();
|
||||
await expect(dialog).not.toBeVisible();
|
||||
dialog = await openManageCategoriesDialog(app.mainWindow);
|
||||
for (const name of matched)
|
||||
await expect(checkbox(name)).toBeChecked();
|
||||
await expect(checkbox(outside[0])).not.toBeChecked();
|
||||
await expect(checkbox(outside[1])).toBeChecked();
|
||||
await dialog
|
||||
.getByRole('button', { name: 'Close', exact: true })
|
||||
.click();
|
||||
} finally {
|
||||
await closeElectronApp(app);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
test('hides and restores categories, supports search and bulk actions, and persists hidden selections after refresh', async ({
|
||||
dataDir,
|
||||
request,
|
||||
|
||||
@@ -996,9 +996,11 @@
|
||||
"CATEGORY_MANAGEMENT": {
|
||||
"TITLE": "إدارة الفئات",
|
||||
"LOADING": "جارٍ تحميل الفئات...",
|
||||
"SELECTED": "محدد",
|
||||
"SELECTED": "إجمالي المحدد",
|
||||
"SELECT_ALL": "تحديد الكل",
|
||||
"DESELECT_ALL": "إلغاء تحديد الكل",
|
||||
"SELECT_FILTERED": "تحديد نتائج البحث",
|
||||
"DESELECT_FILTERED": "إلغاء تحديد نتائج البحث",
|
||||
"SEARCH_PLACEHOLDER": "بحث في الفئات...",
|
||||
"NO_RESULTS": "لم يتم العثور على فئات مطابقة",
|
||||
"NO_CATEGORIES": "لا توجد فئات متاحة",
|
||||
|
||||
@@ -996,9 +996,11 @@
|
||||
"CATEGORY_MANAGEMENT": {
|
||||
"TITLE": "تدبير الفئات",
|
||||
"LOADING": "جاري تشريج الفئات...",
|
||||
"SELECTED": "متختار",
|
||||
"SELECTED": "المجموع المختار",
|
||||
"SELECT_ALL": "اختار الكل",
|
||||
"DESELECT_ALL": "حيد الاختيار من الكل",
|
||||
"SELECT_FILTERED": "اختار نتائج البحث",
|
||||
"DESELECT_FILTERED": "حيد الاختيار من نتائج البحث",
|
||||
"SEARCH_PLACEHOLDER": "قلب على فئات...",
|
||||
"NO_RESULTS": "ما تلقاتش حتى فئة مطابقة",
|
||||
"NO_CATEGORIES": "ما كاينش فئات متوفرة",
|
||||
|
||||
@@ -996,9 +996,11 @@
|
||||
"CATEGORY_MANAGEMENT": {
|
||||
"TITLE": "Кіраваць катэгорыямі",
|
||||
"LOADING": "Загрузка катэгорый...",
|
||||
"SELECTED": "Выбрана",
|
||||
"SELECTED": "Усяго выбрана",
|
||||
"SELECT_ALL": "Выбраць усе",
|
||||
"DESELECT_ALL": "Зняць выбар",
|
||||
"SELECT_FILTERED": "Выбраць знойдзеныя",
|
||||
"DESELECT_FILTERED": "Зняць выбар са знойдзеных",
|
||||
"SEARCH_PLACEHOLDER": "Пошук катэгорый...",
|
||||
"NO_RESULTS": "Адпаведных катэгорый не знойдзена",
|
||||
"NO_CATEGORIES": "Няма даступных катэгорый",
|
||||
|
||||
@@ -996,9 +996,11 @@
|
||||
"CATEGORY_MANAGEMENT": {
|
||||
"TITLE": "Kategorien verwalten",
|
||||
"LOADING": "Kategorien werden geladen …",
|
||||
"SELECTED": "Ausgewählt",
|
||||
"SELECTED": "Insgesamt ausgewählt",
|
||||
"SELECT_ALL": "Alle auswählen",
|
||||
"DESELECT_ALL": "Alle abwählen",
|
||||
"SELECT_FILTERED": "Gefilterte auswählen",
|
||||
"DESELECT_FILTERED": "Gefilterte abwählen",
|
||||
"SEARCH_PLACEHOLDER": "Kategorien suchen …",
|
||||
"NO_RESULTS": "Keine passenden Kategorien gefunden",
|
||||
"NO_CATEGORIES": "Keine Kategorien verfügbar",
|
||||
|
||||
@@ -996,9 +996,11 @@
|
||||
"CATEGORY_MANAGEMENT": {
|
||||
"TITLE": "Διαχείριση κατηγοριών",
|
||||
"LOADING": "Φόρτωση κατηγοριών...",
|
||||
"SELECTED": "Επιλεγμένα",
|
||||
"SELECTED": "Σύνολο επιλεγμένων",
|
||||
"SELECT_ALL": "Επιλογή όλων",
|
||||
"DESELECT_ALL": "Αποεπιλογή όλων",
|
||||
"SELECT_FILTERED": "Επιλογή αποτελεσμάτων",
|
||||
"DESELECT_FILTERED": "Αποεπιλογή αποτελεσμάτων",
|
||||
"SEARCH_PLACEHOLDER": "Αναζήτηση κατηγοριών...",
|
||||
"NO_RESULTS": "Δεν βρέθηκαν αντίστοιχες κατηγορίες",
|
||||
"NO_CATEGORIES": "Δεν υπάρχουν διαθέσιμες κατηγορίες",
|
||||
|
||||
@@ -996,9 +996,11 @@
|
||||
"CATEGORY_MANAGEMENT": {
|
||||
"TITLE": "Manage Categories",
|
||||
"LOADING": "Loading categories...",
|
||||
"SELECTED": "Selected",
|
||||
"SELECTED": "Total selected",
|
||||
"SELECT_ALL": "Select All",
|
||||
"DESELECT_ALL": "Deselect All",
|
||||
"SELECT_FILTERED": "Select Filtered",
|
||||
"DESELECT_FILTERED": "Deselect Filtered",
|
||||
"SEARCH_PLACEHOLDER": "Search categories...",
|
||||
"NO_RESULTS": "No matching categories found",
|
||||
"NO_CATEGORIES": "No categories available",
|
||||
|
||||
@@ -996,9 +996,11 @@
|
||||
"CATEGORY_MANAGEMENT": {
|
||||
"TITLE": "Gestionar categorías",
|
||||
"LOADING": "Cargando categorías…",
|
||||
"SELECTED": "Seleccionadas",
|
||||
"SELECTED": "Total seleccionado",
|
||||
"SELECT_ALL": "Seleccionar todo",
|
||||
"DESELECT_ALL": "Deseleccionar todo",
|
||||
"SELECT_FILTERED": "Seleccionar resultados",
|
||||
"DESELECT_FILTERED": "Deseleccionar resultados",
|
||||
"SEARCH_PLACEHOLDER": "Buscar categorías…",
|
||||
"NO_RESULTS": "No se encontraron categorías coincidentes",
|
||||
"NO_CATEGORIES": "No hay categorías disponibles",
|
||||
|
||||
@@ -996,9 +996,11 @@
|
||||
"CATEGORY_MANAGEMENT": {
|
||||
"TITLE": "Gérer les catégories",
|
||||
"LOADING": "Chargement des catégories…",
|
||||
"SELECTED": "Sélectionnées",
|
||||
"SELECTED": "Total sélectionné",
|
||||
"SELECT_ALL": "Tout sélectionner",
|
||||
"DESELECT_ALL": "Tout désélectionner",
|
||||
"SELECT_FILTERED": "Sélectionner les résultats",
|
||||
"DESELECT_FILTERED": "Désélectionner les résultats",
|
||||
"SEARCH_PLACEHOLDER": "Rechercher des catégories…",
|
||||
"NO_RESULTS": "Aucune catégorie correspondante trouvée",
|
||||
"NO_CATEGORIES": "Aucune catégorie disponible",
|
||||
|
||||
@@ -996,9 +996,11 @@
|
||||
"CATEGORY_MANAGEMENT": {
|
||||
"TITLE": "Kategóriák kezelése",
|
||||
"LOADING": "Kategóriák betöltése…",
|
||||
"SELECTED": "Kijelölve",
|
||||
"SELECTED": "Összesen kijelölve",
|
||||
"SELECT_ALL": "Összes kijelölése",
|
||||
"DESELECT_ALL": "Összes kijelölésének megszüntetése",
|
||||
"SELECT_FILTERED": "Találatok kijelölése",
|
||||
"DESELECT_FILTERED": "Találatok kijelölésének megszüntetése",
|
||||
"SEARCH_PLACEHOLDER": "Keresés a kategóriák között…",
|
||||
"NO_RESULTS": "Nem található a keresésnek megfelelő kategória",
|
||||
"NO_CATEGORIES": "Nincs elérhető kategória",
|
||||
|
||||
@@ -996,9 +996,11 @@
|
||||
"CATEGORY_MANAGEMENT": {
|
||||
"TITLE": "Gestisci categorie",
|
||||
"LOADING": "Caricamento categorie...",
|
||||
"SELECTED": "Selezionate",
|
||||
"SELECTED": "Totale selezionate",
|
||||
"SELECT_ALL": "Seleziona tutte",
|
||||
"DESELECT_ALL": "Deseleziona tutte",
|
||||
"SELECT_FILTERED": "Seleziona risultati",
|
||||
"DESELECT_FILTERED": "Deseleziona risultati",
|
||||
"SEARCH_PLACEHOLDER": "Cerca categorie...",
|
||||
"NO_RESULTS": "Nessuna categoria corrispondente",
|
||||
"NO_CATEGORIES": "Nessuna categoria disponibile",
|
||||
|
||||
@@ -996,9 +996,11 @@
|
||||
"CATEGORY_MANAGEMENT": {
|
||||
"TITLE": "カテゴリーを管理",
|
||||
"LOADING": "カテゴリーを読み込み中...",
|
||||
"SELECTED": "選択済み",
|
||||
"SELECTED": "選択済みの合計",
|
||||
"SELECT_ALL": "すべて選択",
|
||||
"DESELECT_ALL": "すべて解除",
|
||||
"SELECT_FILTERED": "検索結果を選択",
|
||||
"DESELECT_FILTERED": "検索結果の選択を解除",
|
||||
"SEARCH_PLACEHOLDER": "カテゴリーを検索...",
|
||||
"NO_RESULTS": "一致するカテゴリーが見つかりません",
|
||||
"NO_CATEGORIES": "利用可能なカテゴリーはありません",
|
||||
|
||||
@@ -996,9 +996,11 @@
|
||||
"CATEGORY_MANAGEMENT": {
|
||||
"TITLE": "카테고리 관리",
|
||||
"LOADING": "카테고리를 불러오는 중...",
|
||||
"SELECTED": "선택됨",
|
||||
"SELECTED": "총 선택 수",
|
||||
"SELECT_ALL": "모두 선택",
|
||||
"DESELECT_ALL": "모두 선택 해제",
|
||||
"SELECT_FILTERED": "검색 결과 선택",
|
||||
"DESELECT_FILTERED": "검색 결과 선택 해제",
|
||||
"SEARCH_PLACEHOLDER": "카테고리 검색...",
|
||||
"NO_RESULTS": "일치하는 카테고리를 찾을 수 없습니다",
|
||||
"NO_CATEGORIES": "사용 가능한 카테고리가 없습니다",
|
||||
|
||||
@@ -996,9 +996,11 @@
|
||||
"CATEGORY_MANAGEMENT": {
|
||||
"TITLE": "Categorieën beheren",
|
||||
"LOADING": "Categorieën laden...",
|
||||
"SELECTED": "Geselecteerd",
|
||||
"SELECTED": "Totaal geselecteerd",
|
||||
"SELECT_ALL": "Alles selecteren",
|
||||
"DESELECT_ALL": "Alles deselecteren",
|
||||
"SELECT_FILTERED": "Resultaten selecteren",
|
||||
"DESELECT_FILTERED": "Resultaten deselecteren",
|
||||
"SEARCH_PLACEHOLDER": "Zoek categorieën...",
|
||||
"NO_RESULTS": "Geen overeenkomende categorieën gevonden",
|
||||
"NO_CATEGORIES": "Geen categorieën beschikbaar",
|
||||
|
||||
@@ -996,9 +996,11 @@
|
||||
"CATEGORY_MANAGEMENT": {
|
||||
"TITLE": "Zarządzaj kategoriami",
|
||||
"LOADING": "Ładowanie kategorii...",
|
||||
"SELECTED": "Zaznaczone",
|
||||
"SELECTED": "Łącznie zaznaczone",
|
||||
"SELECT_ALL": "Zaznacz wszystkie",
|
||||
"DESELECT_ALL": "Odznacz wszystkie",
|
||||
"SELECT_FILTERED": "Zaznacz wyniki",
|
||||
"DESELECT_FILTERED": "Odznacz wyniki",
|
||||
"SEARCH_PLACEHOLDER": "Szukaj kategorii...",
|
||||
"NO_RESULTS": "Nie znaleziono pasujących kategorii",
|
||||
"NO_CATEGORIES": "Brak dostępnych kategorii",
|
||||
|
||||
@@ -996,9 +996,11 @@
|
||||
"CATEGORY_MANAGEMENT": {
|
||||
"TITLE": "Gerenciar categorias",
|
||||
"LOADING": "Carregando categorias...",
|
||||
"SELECTED": "Selecionadas",
|
||||
"SELECTED": "Total selecionado",
|
||||
"SELECT_ALL": "Selecionar todas",
|
||||
"DESELECT_ALL": "Desmarcar todas",
|
||||
"SELECT_FILTERED": "Selecionar resultados",
|
||||
"DESELECT_FILTERED": "Desmarcar resultados",
|
||||
"SEARCH_PLACEHOLDER": "Pesquisar categorias...",
|
||||
"NO_RESULTS": "Nenhuma categoria correspondente encontrada",
|
||||
"NO_CATEGORIES": "Nenhuma categoria disponível",
|
||||
|
||||
@@ -996,9 +996,11 @@
|
||||
"CATEGORY_MANAGEMENT": {
|
||||
"TITLE": "Управление категориями",
|
||||
"LOADING": "Загрузка категорий…",
|
||||
"SELECTED": "Выбрано",
|
||||
"SELECTED": "Всего выбрано",
|
||||
"SELECT_ALL": "Выбрать всё",
|
||||
"DESELECT_ALL": "Снять выделение",
|
||||
"SELECT_FILTERED": "Выбрать найденные",
|
||||
"DESELECT_FILTERED": "Снять выбор с найденных",
|
||||
"SEARCH_PLACEHOLDER": "Поиск категорий…",
|
||||
"NO_RESULTS": "Подходящих категорий не найдено",
|
||||
"NO_CATEGORIES": "Нет доступных категорий",
|
||||
|
||||
@@ -996,9 +996,11 @@
|
||||
"CATEGORY_MANAGEMENT": {
|
||||
"TITLE": "Kategorileri Yönet",
|
||||
"LOADING": "Kategoriler yükleniyor...",
|
||||
"SELECTED": "Seçildi",
|
||||
"SELECTED": "Toplam seçilen",
|
||||
"SELECT_ALL": "Tümünü Seç",
|
||||
"DESELECT_ALL": "Tümünü Kaldır",
|
||||
"SELECT_FILTERED": "Sonuçları seç",
|
||||
"DESELECT_FILTERED": "Sonuçların seçimini kaldır",
|
||||
"SEARCH_PLACEHOLDER": "Kategorileri ara...",
|
||||
"NO_RESULTS": "Eşleşen kategori bulunamadı",
|
||||
"NO_CATEGORIES": "Kategori mevcut değil",
|
||||
|
||||
@@ -996,9 +996,11 @@
|
||||
"CATEGORY_MANAGEMENT": {
|
||||
"TITLE": "管理分类",
|
||||
"LOADING": "正在加载分类…",
|
||||
"SELECTED": "已选择",
|
||||
"SELECTED": "已选总数",
|
||||
"SELECT_ALL": "全选",
|
||||
"DESELECT_ALL": "取消全选",
|
||||
"SELECT_FILTERED": "选择搜索结果",
|
||||
"DESELECT_FILTERED": "取消选择搜索结果",
|
||||
"SEARCH_PLACEHOLDER": "搜索分类…",
|
||||
"NO_RESULTS": "未找到匹配的分类",
|
||||
"NO_CATEGORIES": "没有可用的分类",
|
||||
|
||||
@@ -996,9 +996,11 @@
|
||||
"CATEGORY_MANAGEMENT": {
|
||||
"TITLE": "管理類別",
|
||||
"LOADING": "正在載入類別...",
|
||||
"SELECTED": "已選取",
|
||||
"SELECTED": "已選總數",
|
||||
"SELECT_ALL": "全部選取",
|
||||
"DESELECT_ALL": "全部取消選取",
|
||||
"SELECT_FILTERED": "選取搜尋結果",
|
||||
"DESELECT_FILTERED": "取消選取搜尋結果",
|
||||
"SEARCH_PLACEHOLDER": "搜尋類別...",
|
||||
"NO_RESULTS": "找不到符合的類別",
|
||||
"NO_CATEGORIES": "沒有可用的類別",
|
||||
|
||||
Reference in new issue
Block a user