feat(ui): add session sidebar search and bulk selection

Adds an optional session filter bar to the left sidebar with title search across parent/child sessions and a scoped Select All. Introduces multi-select checkboxes, bulk delete with clear selection controls, and confirmation dialogs for both single and bulk deletions using the existing alert dialog flow. Updates session i18n strings across supported locales.
This commit is contained in:
Shantur Rathore
2026-01-30 17:34:25 +00:00
parent 67f5f830a3
commit 1af01680ee
8 changed files with 429 additions and 41 deletions

View File

@@ -30,8 +30,27 @@ export const sessionMessages = {
"sessionList.copyId.success": "Session ID copied",
"sessionList.copyId.error": "Unable to copy session ID",
"sessionList.delete.error": "Unable to delete session",
"sessionList.delete.title": "Delete session",
"sessionList.delete.confirmMessage": "Delete \"{label}\"? This cannot be undone.",
"sessionList.delete.confirmLabel": "Delete",
"sessionList.delete.cancelLabel": "Cancel",
"sessionList.rename.error": "Unable to rename session",
"sessionList.filter.placeholder": "Search sessions…",
"sessionList.filter.ariaLabel": "Search sessions",
"sessionList.selection.selectAllLabel": "Select all",
"sessionList.selection.selectAllAriaLabel": "Select all sessions",
"sessionList.selection.clearLabel": "Clear",
"sessionList.selection.clearAriaLabel": "Clear selection",
"sessionList.selection.checkboxAriaLabel": "Select session",
"sessionList.bulkDelete.button": "Delete {count}",
"sessionList.bulkDelete.ariaLabel": "Delete {count} selected sessions",
"sessionList.bulkDelete.title": "Delete sessions",
"sessionList.bulkDelete.confirmMessage": "Delete {count} selected sessions? This cannot be undone.",
"sessionList.bulkDelete.confirmLabel": "Delete",
"sessionList.bulkDelete.cancelLabel": "Cancel",
"sessionList.bulkDelete.error": "Unable to delete {count} sessions",
"sessionRenameDialog.title": "Rename Session",
"sessionRenameDialog.description.withLabel": "Update the title for \"{label}\".",
"sessionRenameDialog.description.default": "Set a new title for this session.",

View File

@@ -30,8 +30,27 @@ export const sessionMessages = {
"sessionList.copyId.success": "ID de sesión copiado",
"sessionList.copyId.error": "No se pudo copiar el ID de sesión",
"sessionList.delete.error": "No se pudo eliminar la sesión",
"sessionList.delete.title": "Eliminar sesión",
"sessionList.delete.confirmMessage": "¿Eliminar \"{label}\"? Esto no se puede deshacer.",
"sessionList.delete.confirmLabel": "Eliminar",
"sessionList.delete.cancelLabel": "Cancelar",
"sessionList.rename.error": "No se pudo renombrar la sesión",
"sessionList.filter.placeholder": "Buscar sesiones…",
"sessionList.filter.ariaLabel": "Buscar sesiones",
"sessionList.selection.selectAllLabel": "Seleccionar todo",
"sessionList.selection.selectAllAriaLabel": "Seleccionar todas las sesiones",
"sessionList.selection.clearLabel": "Limpiar",
"sessionList.selection.clearAriaLabel": "Limpiar selección",
"sessionList.selection.checkboxAriaLabel": "Seleccionar sesión",
"sessionList.bulkDelete.button": "Eliminar {count}",
"sessionList.bulkDelete.ariaLabel": "Eliminar {count} sesiones seleccionadas",
"sessionList.bulkDelete.title": "Eliminar sesiones",
"sessionList.bulkDelete.confirmMessage": "¿Eliminar {count} sesiones seleccionadas? Esto no se puede deshacer.",
"sessionList.bulkDelete.confirmLabel": "Eliminar",
"sessionList.bulkDelete.cancelLabel": "Cancelar",
"sessionList.bulkDelete.error": "No se pudieron eliminar {count} sesiones",
"sessionRenameDialog.title": "Renombrar sesión",
"sessionRenameDialog.description.withLabel": "Actualiza el título de \"{label}\".",
"sessionRenameDialog.description.default": "Establece un nuevo título para esta sesión.",

View File

@@ -30,8 +30,27 @@ export const sessionMessages = {
"sessionList.copyId.success": "ID de session copié",
"sessionList.copyId.error": "Impossible de copier l'ID de session",
"sessionList.delete.error": "Impossible de supprimer la session",
"sessionList.delete.title": "Supprimer la session",
"sessionList.delete.confirmMessage": "Supprimer \"{label}\" ? Cette action est irréversible.",
"sessionList.delete.confirmLabel": "Supprimer",
"sessionList.delete.cancelLabel": "Annuler",
"sessionList.rename.error": "Impossible de renommer la session",
"sessionList.filter.placeholder": "Rechercher des sessions…",
"sessionList.filter.ariaLabel": "Rechercher des sessions",
"sessionList.selection.selectAllLabel": "Tout sélectionner",
"sessionList.selection.selectAllAriaLabel": "Sélectionner toutes les sessions",
"sessionList.selection.clearLabel": "Effacer",
"sessionList.selection.clearAriaLabel": "Effacer la sélection",
"sessionList.selection.checkboxAriaLabel": "Sélectionner la session",
"sessionList.bulkDelete.button": "Supprimer {count}",
"sessionList.bulkDelete.ariaLabel": "Supprimer {count} sessions sélectionnées",
"sessionList.bulkDelete.title": "Supprimer des sessions",
"sessionList.bulkDelete.confirmMessage": "Supprimer {count} sessions sélectionnées ? Cette action est irréversible.",
"sessionList.bulkDelete.confirmLabel": "Supprimer",
"sessionList.bulkDelete.cancelLabel": "Annuler",
"sessionList.bulkDelete.error": "Impossible de supprimer {count} sessions",
"sessionRenameDialog.title": "Renommer la session",
"sessionRenameDialog.description.withLabel": "Mettre à jour le titre de \"{label}\".",
"sessionRenameDialog.description.default": "Définir un nouveau titre pour cette session.",

View File

@@ -30,8 +30,27 @@ export const sessionMessages = {
"sessionList.copyId.success": "セッション ID をコピーしました",
"sessionList.copyId.error": "セッション ID をコピーできません",
"sessionList.delete.error": "セッションを削除できません",
"sessionList.delete.title": "セッションを削除",
"sessionList.delete.confirmMessage": "\"{label}\" を削除しますか?この操作は元に戻せません。",
"sessionList.delete.confirmLabel": "削除",
"sessionList.delete.cancelLabel": "キャンセル",
"sessionList.rename.error": "セッション名を変更できません",
"sessionList.filter.placeholder": "セッションを検索…",
"sessionList.filter.ariaLabel": "セッションを検索",
"sessionList.selection.selectAllLabel": "すべて選択",
"sessionList.selection.selectAllAriaLabel": "すべてのセッションを選択",
"sessionList.selection.clearLabel": "クリア",
"sessionList.selection.clearAriaLabel": "選択をクリア",
"sessionList.selection.checkboxAriaLabel": "セッションを選択",
"sessionList.bulkDelete.button": "{count} 件を削除",
"sessionList.bulkDelete.ariaLabel": "選択した {count} 件のセッションを削除",
"sessionList.bulkDelete.title": "セッションを削除",
"sessionList.bulkDelete.confirmMessage": "選択した {count} 件のセッションを削除しますか?この操作は元に戻せません。",
"sessionList.bulkDelete.confirmLabel": "削除",
"sessionList.bulkDelete.cancelLabel": "キャンセル",
"sessionList.bulkDelete.error": "{count} 件のセッションを削除できません",
"sessionRenameDialog.title": "セッション名を変更",
"sessionRenameDialog.description.withLabel": "\"{label}\" のタイトルを更新します。",
"sessionRenameDialog.description.default": "このセッションの新しいタイトルを設定します。",

View File

@@ -30,8 +30,27 @@ export const sessionMessages = {
"sessionList.copyId.success": "ID сессии скопирован",
"sessionList.copyId.error": "Не удалось скопировать ID сессии",
"sessionList.delete.error": "Не удалось удалить сессию",
"sessionList.delete.title": "Удалить сессию",
"sessionList.delete.confirmMessage": "Удалить \"{label}\"? Это действие нельзя отменить.",
"sessionList.delete.confirmLabel": "Удалить",
"sessionList.delete.cancelLabel": "Отмена",
"sessionList.rename.error": "Не удалось переименовать сессию",
"sessionList.filter.placeholder": "Поиск сессий…",
"sessionList.filter.ariaLabel": "Поиск сессий",
"sessionList.selection.selectAllLabel": "Выбрать все",
"sessionList.selection.selectAllAriaLabel": "Выбрать все сессии",
"sessionList.selection.clearLabel": "Очистить",
"sessionList.selection.clearAriaLabel": "Очистить выбор",
"sessionList.selection.checkboxAriaLabel": "Выбрать сессию",
"sessionList.bulkDelete.button": "Удалить {count}",
"sessionList.bulkDelete.ariaLabel": "Удалить {count} выбранных сессий",
"sessionList.bulkDelete.title": "Удалить сессии",
"sessionList.bulkDelete.confirmMessage": "Удалить {count} выбранных сессий? Это действие нельзя отменить.",
"sessionList.bulkDelete.confirmLabel": "Удалить",
"sessionList.bulkDelete.cancelLabel": "Отмена",
"sessionList.bulkDelete.error": "Не удалось удалить {count} сессий",
"sessionRenameDialog.title": "Переименовать сессию",
"sessionRenameDialog.description.withLabel": "Обновите название для \"{label}\".",
"sessionRenameDialog.description.default": "Установите новое название для этой сессии.",

View File

@@ -30,8 +30,27 @@ export const sessionMessages = {
"sessionList.copyId.success": "已复制会话 ID",
"sessionList.copyId.error": "无法复制会话 ID",
"sessionList.delete.error": "无法删除会话",
"sessionList.delete.title": "删除会话",
"sessionList.delete.confirmMessage": "删除“{label}”?此操作无法撤销。",
"sessionList.delete.confirmLabel": "删除",
"sessionList.delete.cancelLabel": "取消",
"sessionList.rename.error": "无法重命名会话",
"sessionList.filter.placeholder": "搜索会话…",
"sessionList.filter.ariaLabel": "搜索会话",
"sessionList.selection.selectAllLabel": "全选",
"sessionList.selection.selectAllAriaLabel": "选择所有会话",
"sessionList.selection.clearLabel": "清除",
"sessionList.selection.clearAriaLabel": "清除选择",
"sessionList.selection.checkboxAriaLabel": "选择会话",
"sessionList.bulkDelete.button": "删除 {count}",
"sessionList.bulkDelete.ariaLabel": "删除已选择的 {count} 个会话",
"sessionList.bulkDelete.title": "删除会话",
"sessionList.bulkDelete.confirmMessage": "删除已选择的 {count} 个会话?此操作无法撤销。",
"sessionList.bulkDelete.confirmLabel": "删除",
"sessionList.bulkDelete.cancelLabel": "取消",
"sessionList.bulkDelete.error": "无法删除 {count} 个会话",
"sessionRenameDialog.title": "重命名会话",
"sessionRenameDialog.description.withLabel": "更新“{label}”的标题。",
"sessionRenameDialog.description.default": "为此会话设置新标题。",