Skip to content

Organizacion

Ruta: /teacher/organization · Atajo: g o · Sidebar: Organizacion

La pagina de Organizacion contiene el gestor de etiquetas (tags) y el gestor de categorias de clase del profesor. Las etiquetas se usan para clasificar templates, recursos, sesiones y servicios. Las categorias son las columnas del tablero Kanban en Mi Material.

Organization page

Cabecera:

  • Titulo “Etiquetas” + descripcion
  • Boton “Importar de biblioteca” (icono Download)
  • Boton ”+ Nueva etiqueta” (icono Plus)

Buscador de etiquetas: Input con icono Search encima de la tabla. Filtro client-side case-insensitive por nombre. Si no hay resultados para la busqueda, se muestra mensaje “Sin resultados para «…»”. El buscador solo aparece cuando hay al menos una etiqueta.

Tabla de etiquetas:

  • Checkbox de seleccion (individual + “seleccionar todas”)
  • Icono GripVertical (drag handle funcional — reordenacion con dnd-kit)
  • Punto de color (background color)
  • Nombre de la etiqueta
  • Columna “Usos” — conteo total de usos del tag (templates + recursos + sesiones + servicios), alineada a la derecha
  • Boton editar (lapiz)
  • Boton borrar (papelera)
  • Hover: fila se resalta
  • Seleccionada: fondo primary-50

Reordenacion drag-and-drop: Integrado con dnd-kit via SortableTagRow. Al soltar una fila, se llama POST /teacher/tags/reorder con el nuevo orden de IDs. La mutacion usa useReorderTags (campo tagIds, HTTP PATCH, query key ['tags']).

Modo seleccion multiple: Cuando hay tags seleccionados, aparece barra flotante con:

  • Badge de conteo (“3 etiquetas”)
  • Boton “Cambiar color” — abre color picker para aplicar el mismo color a todos los tags seleccionados de una sola vez
  • Boton rojo “Eliminar”
  • Boton gris “Cancelar”

Estado vacio: Icono Tags + “Sin etiquetas” + boton ”+ Nueva etiqueta”

  • Nombre (requerido)
  • Color (input type=color + hex display + preview badge)
  • Boton “Guardar” (deshabilitado si nombre vacio)

Deteccion de duplicados: case-insensitive, devuelve flag _duplicate sin error.

Desde el menu de acciones de una etiqueta (tres puntos) o desde la barra de seleccion multiple, el profesor puede fusionar dos etiquetas similares (ej. “Gramatica” y “gramatica”):

  • Se elige el tag “fuente” (el que desaparece) y el tag “destino” (el que se conserva)
  • El backend reasigna todas las referencias de junction tables (template_tags, resource_tags, session_tags, service_tags) al tag destino
  • El tag fuente se soft-delete tras el merge
  • Se muestra ConfirmDialog con un resumen de los usos que seran reasignados

Sheet con 4 grupos de presets predefinidos:

GrupoEtiquetasEjemplo
Skills7Gramatica, Vocabulario, Pronunciacion…
Activity Types8Juegos, Conversacion, Debate…
Exam Prep5DELE, SIELE, AP Spanish…
Topics7Cultura, Viajes, Negocios…

Cada grupo es colapsable con:

  • Checkbox “seleccionar grupo completo”
  • Checkboxes individuales por tag
  • Tags ya importados marcados con “Ya importado” (deshabilitados, 50% opacidad)

Footer sticky con boton “Importar N seleccionadas” y boton “Importar todos los grupos” que selecciona y envia todos los tags de todos los grupos en una sola accion (excluye los ya importados).


Bloque CategoryManager debajo del gestor de etiquetas. Las categorias son las columnas del tablero Kanban en Mi Material (tabla class_categories).

Cabecera:

  • Titulo “Categorias” + descripcion
  • Boton “Importar de biblioteca” (icono Download)
  • Boton ”+ Nueva categoria” (icono Plus)

Tabla de categorias:

  • Icono GripVertical (drag handle funcional — reordenacion con dnd-kit)
  • Punto de color (background color)
  • Nombre de la categoria
  • Boton editar (lapiz)
  • Boton borrar (papelera)

Reordenacion drag-and-drop: Mismo patron que tags. Al soltar, llama POST /teacher/class-categories/reorder con categoryIds en el nuevo orden.

Estado vacio: Icono equivalente + “Sin categorias” + boton ”+ Nueva categoria”

  • Nombre (requerido)
  • Color (color picker identico al de etiquetas)
  • Boton “Guardar” (deshabilitado si nombre vacio)

Sheet con 3 grupos de presets predefinidos:

GrupoCategoriasEjemplo
mcer_levels6A1, A2, B1, B2, C1, C2
themes6Conversacion, Gramatica, Vocabulario…
dele_levels6DELE A2, DELE B1, DELE B2…

La importacion de categorias importa el grupo completo (no permite seleccion individual de items dentro del grupo, a diferencia de los presets de tags).


FeatureDescripcionEstadoImplementado
Cambio de color en masaLa barra de seleccion multiple incluye un boton “Cambiar color” que aplica el mismo color a todos los tags seleccionadosBatch 3
Importacion de multiples grupos a la vezBoton “Importar todos los grupos” en el footer del sheet de presetsBatch 3
Merge de tagsFusion de dos etiquetas via menu de acciones o seleccion multipleBatch 3
Tag iconsLos tags solo tienen color. Podrian tener un icono asociado ademas del colorImplementado ✅

No hay bugs conocidos en esta pagina.


ArchivoProposito
apps/web/src/routes/teacher/organization.lazy.tsxPagina completa (tag manager + category manager)
apps/web/src/components/organization/CategoryManager.tsxComponente de categorias con CRUD y dnd-kit
apps/api/src/routes/teacher/tags.tsRutas HTTP de tags
apps/api/src/services/scheduling/tag-service.tsCRUD + presets + reorder
apps/api/src/routes/teacher/class-categories.tsRutas HTTP de categorias
apps/api/src/services/scheduling/class-category-service.tsCRUD + presets + reorder categorias
EndpointMetodoProposito
/teacher/tagsGETLista de tags (ordenados por sortOrder) — incluye campo usageCount por tag
/teacher/tags/presetsGETPresets con marca “ya importado”
/teacher/tagsPOSTCrear tag
/teacher/tags/:idPATCHEditar tag
/teacher/tags/:idDELETESoft-delete tag
/teacher/tags/bulk-deletePOSTBorrado multiple
/teacher/tags/reorderPOSTReordenar tags (campo tagIds)
/teacher/tags/import-presetPOSTImportar desde preset

Shape de usageCount (campo opcional en cada tag del listado):

interface TagUsageCount {
templates: number; // usos en template_tags
resources: number; // usos en resource_tags
sessions: number; // usos en session_tags
services: number; // usos en service_tags
total: number; // suma de los cuatro
}

El dialog de confirmacion de borrado individual usa usageCount para mostrar un mensaje detallado cuando total > 0: “Esta etiqueta se usa en N templates, N recursos, N sesiones y N servicios.” Si total === 0, el dialog muestra solo el nombre sin aviso adicional.

EndpointMetodoProposito
/teacher/class-categoriesGET/POSTLista/crear categorias
/teacher/class-categories/:idPATCH/DELETEEditar/borrar
/teacher/class-categories/reorderPOSTReordenar categorias (campo categoryIds)
/teacher/class-categories/import-presetPOSTImportar presets (solo acepta presetKey: mcer_levels, themes, dele_levels)
useQuery({ queryKey: ['tags'], queryFn: ... })
useQuery({ queryKey: ['tag-presets'], queryFn: ..., enabled: importSheetOpen })
useQuery({ queryKey: ['class-categories'], queryFn: ... })
useQuery({ queryKey: ['category-presets'], queryFn: ..., enabled: importSheetOpen })