Advertisement
giovani-rubim

mapInputUpdate.js

Apr 14th, 2020
317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {
  2.     class AcceptMap {
  3.         constructor(values) {
  4.             if (typeof values === 'string') {
  5.                 values = values.trim().split(/\s+/);
  6.             }
  7.             values.forEach(value => this[value] = true);
  8.         }
  9.     }
  10.     class RejectMap {
  11.         constructor(values) {
  12.             if (typeof values === 'string') {
  13.                 values = values.trim().split(/\s+/);
  14.             }
  15.             values.forEach(value => this[value] = true);
  16.         }
  17.     }
  18.     const check = (value, condition) => {
  19.         if (condition instanceof AcceptMap) {
  20.             return value in condition;
  21.         }
  22.         if (condition instanceof RejectMap) {
  23.             return !(value in condition);
  24.         }
  25.         if (condition instanceof Object) {
  26.             return !!condition[value];
  27.         }
  28.         return value == condition;
  29.     };
  30.  
  31.     // Amarra a configuração de alguns elementos ao valor de uma input após determinado evento
  32.     // selector: Selector do campo
  33.     // affected: Objeto onde o nome de cada atributo indica um selector dos elementos afetados e o
  34.     // valor do atributo indica a condição aplicada a estes elementos.
  35.     // Se a condição for um objeto, cada nome de atributo deste objeto será um possível valor
  36.     // consiedrado para a input, o valor do atributo deve ser um boolean que indica se este valor é
  37.     // aceito ou não.
  38.     // Se a condição não for um objeto, quando o valor da input for igual ao valor desta condição
  39.     // então a condição será considerada aceita
  40.     // event: evento que verifica as condições e atualiza os elementos
  41.     // effect: Função de atualização aplicada. Receberá dois argumentos, os elementos em questão e
  42.     // um boolean indicando se a condição foi aceita
  43.     // default_value: Valor considerado enquanto a input estiver vazia
  44.     // dynamic: Indica se a busca pelos selectors dos elementos afetados deve ser feita a toda
  45.     // atualização ou apenas no momento da chamada desta função
  46.     const mapInputUpdate = ({selector, affected, event, effect, default_value, dynamic=false}) => {
  47.         const input = $(selector);
  48.         const type = input.attr('type');
  49.         const map = {};
  50.         if (!dynamic) {
  51.             for (let selector in affected) {
  52.                 map[selector] = $(selector);
  53.             }
  54.         }
  55.         const update = () => {
  56.             const value = (type==='radio'?input.filter(':checked'):input).val() || default_value;
  57.             for (let selector in affected) {
  58.                 const condition = affected[selector];
  59.                 effect(dynamic? $(selector): map[selector], check(value, condition));
  60.             }
  61.         };
  62.         input.bind(event, update);
  63.         update();
  64.         return update;
  65.     };
  66.  
  67.     // Amarra a visibilidade de elementos ao valor de uma input
  68.     // #Parâemtros
  69.     // * name: Valor do atributo 'name' da input;
  70.     // * object: Para cada atributo deste objeto o nome representará um selector e o valor será a
  71.     // condição para que este objeto seja visível. Caso o valor (condição) seja um objeto usará este
  72.     // objeto como um mapa de condições onde cada chave é um possível valor da input e o valor
  73.     // indica se ele ficará visível nesta condição. Se o valor do atributo não for um objeto então o
  74.     // valor da input deverá ser igual a este valor para que os elementos do selector fiquem
  75.     // visíveis Retorna o método que atualiza a visibilidade dos elementos
  76.     // * def (opcional): Valor default, caso a input ainda não tenha um valor, o valor de def será
  77.     // considerado como o valor da input
  78.     const bindInputVisibility = (name, affected, default_value) => mapInputUpdate({
  79.         selector: `[name="${ name }"]`,
  80.         affected, default_value,
  81.         event: 'change',
  82.         effect: (target, accepted) => accepted? target.show(): target.hide(),
  83.     });
  84.  
  85.     window.mapInputUpdate = mapInputUpdate;
  86.     window.bindInputVisibility = bindInputVisibility;
  87.     window.MapValue = {
  88.         accept: values => new AcceptMap(values),
  89.         reject: values => new RejectMap(values),
  90.     };
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement