Source: vistas/vistainforme.js

/**
  Vista con el Informe de Alumno (imprimible).
**/
import { Vista } from './vista.js'

export class VistaInforme extends Vista {
  /**
    Constructor de la clase.
    @param {Object} controlador Controlador de la vista.
    @param {Node} base Nodo al que se añadirá la vista.
  **/
  constructor (controlador, base) {
    super(controlador)
    this.base = base
    this.callback = null // Función que se llamará al cerrar el diálogo.

    // Cogemos referencias a los elementos del interfaz
    this.sAlumno = this.base.querySelector("span[data-informe='alumno']")
    this.sCoordinador = this.base.querySelector("span[data-informe='coordinador']")
    this.sGrado = this.base.querySelector("span[data-informe='grado']")
    this.sCiclo = this.base.querySelector("span[data-informe='ciclo']")
    this.sPeriodo = this.base.querySelector("span[data-informe='periodo']")
    this.divValoracion = this.base.querySelector('.grid1')
    this.divEvaluacion = this.base.querySelector('.grid3')
    this.inputTexts = this.base.querySelectorAll('input[type="text"]')
    this.inputRadios = this.base.querySelectorAll('input[type="radio"]')
    this.textAreas = this.base.querySelectorAll('textarea')

    this.tareas = null
    // Asociamos eventos
  }

  /**
    Carga los datos del informe en la vista.
    @param alumno {Alumno} Datos del alumno.
    @param informe {Informe} Datos del informe.
  **/
  async cargar (alumno, informe) {
    this.borrar()
    this.alumno=alumno
    this.informe = informe
    this.sAlumno.textContent = `${alumno.nombre} ${alumno.apellidos}`
    this.sCoordinador.textContent = informe.coordinador
    this.sGrado.textContent = informe.grado
    this.sCiclo.textContent = alumno.titulo
    this.sPeriodo.textContent = informe.periodo
    this.actividades = await this.ponerNotas()
    this.modulos = await this.ponerNotasModulos()
    this._crearGrid(informe.valoracion, this.divValoracion)
    this._anadirModulos(informe.modulos, this.divValoracion)
    //TODO: this._crearGrid(informe.evaluacion, this.divEvaluacion)
  }

  /**
    Borra los campos del informe para evitar que se muestren los del informe anterior.
    Los grids se borran en el método _crearGrid.
  **/
  borrar () {
    this.sAlumno.textContent = ''
    this.sCoordinador.textContent = ''
    this.sCiclo.textContent = ''
    this.sPeriodo.textContent = ''

    for (const input of this.inputTexts) { input.value = '' }

    for (const input of this.inputRadios) { input.checked = false }

    for (const textarea of this.textAreas) { textarea.value = '' }
  }

  _crearGrid (informe, div) {
    // Mejor si primero lo borramos
    while (div.children.length > 0) { div.lastChild.remove() }
    let i=0
    if(div.classList[0]=='grid1'){
      for (const dato of informe) {
        const div1 = document.createElement('div')
        div.appendChild(div1)
        div1.setAttribute('id', 'divInformeActividad_' + dato.orden)
        div1.appendChild(document.createTextNode(dato.titulo))
        
        // Ponemos la calificación
        const div2 = document.createElement('div')
        div.appendChild(div2)
        for(let i=0;i<this.actividades.length;i++){
          if(this.actividades[i].titulo===dato.titulo.split('.-')[1]){
              if(this.actividades[i].nota_final)
                div2.textContent = this.actividades[i].nota_final.substring(0, this.actividades[i].nota_final.length - 2)
                else
                    div2.textContent = '-'
          }
        }
      }
    }
    if(div.classList[0]=='grid3'){
      for (const dato of informe) {
        const div1 = document.createElement('div')
        div.appendChild(div1)
        div1.setAttribute('id', 'divInformeActividad_' + dato.orden)
        div1.appendChild(document.createTextNode(dato.titulo))
        
        // Ponemos la calificación
        const div2 = document.createElement('div')
        div.appendChild(div2)
        for(let i=0;i<this.modulos.length;i++){
          if(this.modulos[i].titulo===dato.titulo.split(' - ')[1]){
            div2.textContent = this.modulos[i].nota_final.substring(0, this.modulos[i].nota_final.length - 2)
          }
        }
      }
    }
  }

  _anadirModulos (modulos, div) {
    for (const modulo of modulos) {
      const divActividad = document.getElementById('divInformeActividad_' + modulo.actividad_orden)
      const span = document.createElement('span')
      divActividad.appendChild(span)
      span.classList.add('modulo')
      span.textContent = modulo.modulo_codigo
      span.setAttribute('title', modulo.modulo_titulo)
      span.style.backgroundColor = modulo.color_fondo
      span.style.color = modulo.color_letra
    }
  }

  /**
   * Devuelve las notas de las actividades del alumno.
   * @returns array
   */
  async ponerNotas(){
    var periodo = this.informe.periodo.split(' ')
    this.actividades = await this.controlador.traerActividadNotas(this.alumno.id,periodo[1])
    return this.actividades
  }

  /**
   * Devuelve las notas de los módulos del alumno.
   * @returns array
   */
  async ponerNotasModulos(){
    var periodo = this.informe.periodo.split(' ')
    this.modulos = await this.controlador.traerModulosNotas(this.alumno.id,periodo[1])
    return this.modulos
  }
}