Définitions de Widgets

Dans cette page, vous trouverez toutes les définitions de la classe parente dont les enfants peuvent hériter pour devenir un widget ngSurvey.

class NGSWidget {
  static get type() {
    return "NGSWidget"
  }

  /* Modèle HTML qui sera généré avant la création de la classe
     Tous les id et noms de classes CSS seront suffixés par l'uniqueId
     fourni lors de la création du widget */
  static get template() {}

  /* Le modèle HTML est utilisé pendant le temps de conception du formulaire
     Si null, le modèle réel du widget sera rendu */
  static get designTimeTemplate() {}

  /* Modèle HTML utilisé lorsque le formulaire est affiché pour impression */
  static get printTemplate() {}

  /* Style CSS inline qui sera ajouté à la page
     notez que les noms des classes de style seront isolés
     sur l'identifiant unique du widget 
  */
  static get style() {}

  /* Code JavaScript inline qui sera ajouté à 
     la page tant que le widget existe */
  static get script() {}

  static get selectionWidget() {
    return true;
  }

  /* Est-ce que ce widget prend en charge le label, le label est le texte qu'un administrateur de
  l'administrateur peut entrer en utilisant la conception du formulaire et qui sera affiché
  avant le modèle du widget */
  static get hasLabel() {
    return true;
  }

  /* Affiche la boîte de message d'erreur native ngSurvey 
     sous le contrôle
  */
  static get displayErrorMessage() {
    return true;
  }

  /* Préfixera toutes les classes CSS du style du widget
     avec une valeur unique pour éviter les conflits si d'autres composants 
     ont enregistré ces classes sous le même nom.
     Notez que cela n'analysera pas les dépendances CSS externes.
     0 : Pas d'encapsulation
     1 : Shadow CSS - processeur de préfixe natif ngSurvey
  */
  static get encapsulationMode() {
    return 1;
  }

  /* Permet de définir si la réponse est requise ou non
   depuis la page de paramètres de la réponse pour rendre
   la réponse du widget obligatoire pendant le Sondage
  */
  static get required() {
    return false;
  }

  /* Propriétés qui peuvent être définies depuis le concepteur de formulaire pour chaque
   répondre en utilisant ce widget comme type de réponse dans les paramètres de réponse */
  static get propertiesDef() {}

  /* Dépendances de code JavaScript externes qui seront chargées
   avant la création du widget */
  static get jsDependencies() {}

  /* Dépendances de code CSS externes qui seront chargées
   avant la création du widget */
  static get cssDependencies() {}

  /*
    setAnswer; // callback function pour poster une valeur depuis le widget ex : answerPosted(widgetAnswerValue)
    valueChanges$; // Observable qui retourne la valeur du widget
      containerElement;
      labelElement;
      respondentAnswers = [];
      uniqueId;
      answerContext;
      formContext;
      sectionIndex;
      properties;
      initialValue;
      label;
    */

  /* containerElement : élément DOM contenant le modèle
     labelElement : élément DOM contenant le label
     answerContext : Contexte de réponse qui fournit des méthodes d'aide pour interagir avec la réponse
     formContext : Contexte du formulaire qui fournit des méthodes d'aide pour interagir avec le formulaire
     uniqueId : doit être utilisé pour interroger en suffixe les id des éléments du modèle ou les classes css
     properties : valeurs de propriétés spécifiques à l'instance
     setAnswer : fonction qui définira la valeur textuelle donnée du widget setAnswer(textVal) 
     valueChanges : surveillez tout changement de valeur du widget
     */
  constructor(containerElement, labelElement, answerContext, formContext,
    sectionIndex, uniqueId, properties, setAnswerCallback, valueChanges$) {
    this._value = null;
    this._subscribers = [];
    this.containerElement = containerElement;
    this.labelElement = labelElement;
    this.uniqueId = uniqueId;
    this.formContext = formContext;
    this.sectionIndex = sectionIndex;
    this.properties = properties;
    this.answerContext = answerContext;
    this.initialValue = answerContext.initialValue;
    this.valueChanges$ = valueChanges$;
    this.setAnswer = (value) => {
      // Conserve une copie locale de la valeur définie
      this._value = value;

      setAnswerCallback(value);
    };

    this.getLabel$(label => {
      this.label = label;
    })

    this.getRespondentAnswers$(respondentAnswers => {
      this.respondentAnswers = respondentAnswers;
    });

    this.getAnswers$(answers => {
      this.answers = answers;
    });

    this.getQuestions$(questions => {
      this.questions = questions;
    });

  }

  /* Le modèle du widget n'a pas encore été ajouté au DOM
     mais ses propriétés ont déjà été définies 
  */
  build() {}

  /* Le modèle du widget a été ajouté au DOM
     et ses propriétés ont été définies 
  */
  init() {}

  /* S'abonner à l'observable et garder
     une référence pour se désabonner automatiquement
     lorsque le widget est supprimé
  */
  safeSubscribe(obs, next, error, complete) {
    // ajouter au tableau
    if (obs) {
      this._subscribers.push(obs.subscribe(next, error, complete));
    }
  }

  // Bêta - Pas pour la production
  remoteValidate() {
    var validationParams = [];
    for (var key in this.properties) {
      validationParams.push(this.getValidationParam(key, this.properties[key]));
    }
    validationParams.push(this.getValidationParam('secret', '6LeFY6QUAAAAAEwJvr1FYG16rVQpJJ1RQEGV19QM'));
    validationParams.push(this.getValidationParam('response', this._value));
    var remoteValidationParams = {
      validationParams
    }
    return this.formContext.answerService.validate(this.answerContext.answer.id, remoteValidationParams).subscribe(val => {
      console.log('validate')
    });
  }

  // Bêta - Pas pour la production
  remoteValidateProd() {
    var validationParams = [];
    validationParams.push(this.getValidationParam('secret', '6LeFY6QUAAAAAEwJvr1FYG16rVQpJJ1RQEGV19QM'));
    validationParams.push(this.getValidationParam('response', this._value));
    var remoteValidationParams = {
      validationParams
    }
    return this.formContext.answerService.validate(this.answerContext.answer.id, remoteValidationParams).subscribe(val => {
      console.log('validate')
    });
  }

  getValidationParam(name, value) {
    return {
      name,
      valeur
    }
  }

  /* 
    renvoie les propriétés du widget 
    dans le callback
  */
  getProperties$(propsCallback) {
    this.safeSubscribe(this.answerContext.propertie$, propsCallback, null, null)
  }

  getLabel$(labelCallback) {
    this.safeSubscribe(this.answerContext.label$, labelCallback, null, null)
  }

  getValue$(valueCallback) {
    this.safeSubscribe(this.valueChanges$, (value) => {
      // Callback uniquement si la valeur a changé
      if (value != this._value) {
        valueCallback(value);
      }
    }, null, null)
  }

  isDisabled$(stateCallback) {
    this.safeSubscribe(this.answerContext.disabled$, stateCallback, null, null)
  }

  isSelected$(selectionCallback) {
    this.safeSubscribe(this.answerContext.isSelected$, selectionCallback, null, null)
  }

  getRenderMode$(renderModeCallback) {
    this.safeSubscribe(this.answerContext.renderMode$, renderModeCallback, null, null)
  }

  getLanguage$(languageCallback) {
    this.safeSubscribe(this.formContext.language$, languageCallback, null, null)
  }

  getRespondentAnswers$(respondentAnswersCallBack) {
    this.safeSubscribe(this.formContext.respondentAnswers$, respondentAnswersCallBack, null, null)
  }

  getAnswers$(answersCallBack) {
    this.safeSubscribe(this.formContext.answers$, answersCallBack, null, null)
  }

  getQuestions$(questionsCallBack) {
    this.safeSubscribe(this.formContext.questions$, questionsCallBack, null, null)
  }

  /* Sera appelé par le formulaire pour vérifier si la valeur est valide
     Si non valide doit retourner '' (aucun message d'erreur affiché) ou le message d'erreur à afficher
     Si c'est valide retourner null */
  isValid() {
    return null;
  }

  /* Retourne l'élément HTML du DOM qui a été généré 
     à partir du modèle du widget correspondra aux id suffixés du 
     modèle du widget
  */
  getWidgetElementById(id) {
    return this.widgetQuerySelector('#' + id);
  }

  /*
    QuerySelector uniquement dans le conteneur du widget.
    Ajoute l'identifiant unique du widget aux ids (#) pour correspondre 
    aux ids locaux suffixés du modèle du widget 
  */
  widgetQuerySelector(selector) {
    // Ajoute le suffixe id avec l'identifiant unique du widget 
    if (selector.indexOf('#') >= 0) {
      selector += this.uniqueId;
    }
    return this.containerElement.querySelector(selector);
  }

  /*
    QuerySelectorAll uniquement dans le conteneur du widget.
    Ajoute l'identifiant unique du widget aux ids (#) pour correspondre 
    aux ids locaux suffixés du modèle du widget 
  */
  widgetQuerySelectorAll(selector) {
    // Ajoute le suffixe id avec l'identifiant unique du widget 
    if (selector.indexOf('#') >= 0) {
      selector += this.uniqueId;
    }
    return this.containerElement.querySelectorAll(selector);
  }


  /* Nettoie tout ce qui doit être nettoyé
     avant que le widget ne soit détruit du DOM */
  dispose() {}

  _disposeSubscribers() {
    if (this._subscribers) {
      this._subscribers.forEach(subscriber => {
        if (subscriber) {
          subscriber.unsubscribe();
        }
      })
      this._subscribers = [];
    }
  }

  /* Branche les événements du widget pour garder leur 
    état synchronisé */
  _hookEvents() {}

  /* Méthode interne ne doit pas être surchargée */
  _dispose() {
    this._disposeSubscribers();
    this.dispose();
  }

  /*  _value;
    _subscribers = [];*/
}

class NGSSelectionWidget extends NGSWidget {
  static get type() {
    return "NGSSelectionWidget"
  }
  /* containerElement : élément DOM contenant le modèle
     labelElement : élément DOM contenant le label
     answerContext : Contexte de réponse qui fournit des méthodes d'aide pour interagir avec la réponse
     formContext : Contexte du formulaire qui fournit des méthodes d'aide pour interagir avec le formulaire
     uniqueId : doit être utilisé pour interroger en suffixe les id des éléments du modèle ou les classes css
     selectionId : est l'identifiant unique du groupe de sélection
     selectAnswerCallback : fonction qui sera appelée lorsqu'une réponse doit être sélectionnée depuis le widget
     selected$ : observable qui retourne true / false lorsque la réponse est sélectionnée ou désélectionnée
     properties : valeurs de propriétés spécifiques à l'instance
     setAnswer : fonction qui définira la valeur textuelle donnée du widget setAnswer(textVal) */
  constructor(containerElement, labelElement, answerContext, formContext,
    sectionIndex, uniqueId, selectionId, selected, selectedAnswerCallback,
    selected$, properties, setAnswerCallback, valueChanges$) {
    super(containerElement, labelElement, answerContext,
      formContext, sectionIndex, uniqueId, properties, setAnswerCallback, valueChanges$)

    this.selectionId = selectionId;
    this.isSelected = selected;
    this.selected$ = selected$;

    this.selectAnswer = (selected) => {
      // Si ce sont des réponses textuelles, enregistrez la valeur localement (ex : pour les réponses « autre » avec champs et sélections)
      if ((selected !== false && selected !== true) || selected == null || selected.length == 0) {
        this._value = selected;
      }
      selectedAnswerCallback(selected);
    };

    this.isSelected$(selected => {
      this.isSelected = selected;
    });
  }

  isSelected$(selectionCallback) {
    this.safeSubscribe(this.selected$, selectionCallback, null, null)
  }
}

Mis à jour

Ce contenu vous a-t-il été utile ?