es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Creando una tabla de datos personalizada en Salesforce que permita editar un campo de tiempo.

Estoy creando un componente personalizado de lightning-datatable donde quiero mostrar algunos campos de un objeto personalizado que creé. Uno de esos campos para mostrar, StartTime_c, es de tipo Hora.

Averigüé a partir de la documentación que para mostrar este campo necesito usar el tipo ‘date’ en mi definición de columna dentro de lightning-datatable (por favor, díganme si estoy equivocado aquí y si hay una mejor manera de mostrar solo la hora).

Tengo todo mostrando bien, y puedo actualizar mi código para permitir que la columna StartTime_c sea editable.

El problema es que obtengo un error al intentar guardar cuando realmente edito la celda que contiene una Hora de inicio.

Mi manejador de guardar se ve así (copiado en su mayoría de la documentación):

const fields = {};
fields[IDFIELD.fieldApiName] = event.detail.draftValues[0].Id;
fields[START
TIME.fieldApiName] = event.detail.draftValues[0].StartTime_c;

const recordInput = {fields};

updateRecord(recordInput).then(() => {
this.dispatchEvent(
new ShowToastEvent({
title: ‘Success’,
message: ‘Contact updated’,
variant: ‘success’
})
);

    // Display fresh data in the datatable
    return refreshApex(this.agendaItems).then(() => {
        // Clear all draft values in the datatable
        this.draftValues = [];
    });
  }).catch(error => {
    this.dispatchEvent(
        new ShowToastEvent({
            title: 'Error updating or reloading record',
            message: error.body.message,
            variant: 'error'
        })
    );
  });

Cuando intento guardar, obtengo este error:
Value for field ‘StartTime_c’ is not in ISO 8601 format, Value: 1970-01-01T15: 00: 00.000Z, Runtime class: java.lang.String”

Supongo que pasar el valor que obtengo de la datatable cuando se editó el campo debería funcionar, ya que solo estoy pasando los campos actualizados del evento de guardar.

¿Cómo manejo adecuadamente este campo de Tiempo (que viene como un DateTime debido a que datatable solo admite el tipo de fecha)?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para manejar correctamente el campo “Tiempo” en su lightning-datatable, debe usar el tipo ‘time’ en la definición de su columna en lugar de ‘date’. Esto asegurará que solo se muestre la parte de tiempo de su campo Start_Time__c.

    Cuando se trata de guardar el valor editado, deberá formatear el valor de Tiempo en formato ISO 8601 antes de pasarlo a la función updateRecord. Puede hacer esto utilizando el método toISOString() del objeto Date de JavaScript.

    Aquí hay una función de controlador de guardado actualizada que debería funcionar:

    const fields = {};
    fields[ID_FIELD.fieldApiName] = event.detail.draftValues[0].Id;
    
    // Formatear el valor de Start_Time__c como cadena ISO 8601
    const startTime = new Date('1970-01-01T' + event.detail.draftValues[0].Start_Time__c + 'Z');
    fields[START_TIME.fieldApiName] = startTime.toISOString();
    
    const recordInput = {fields};
    
    updateRecord(recordInput).then(() => {
        // ...
    }).catch(error => {
        // ...
    });
    

    Al crear un nuevo objeto de fecha utilizando la cadena ‘1970-01-01T’ y el valor de tiempo de inicio de la celda editada, puede usar el método toISOString() para obtener la cadena correctamente formateada para el campo Start_Time__c.

    Con este controlador de guardado actualizado, ya no debería recibir el error “El valor para el campo ‘Start_Time__c’ no está en formato ISO 8601”.

Comments are closed.