12.1.0 • Published 12 months ago

@mamba/flatlist v12.1.0

Weekly downloads
-
License
Apache-2.0
Repository
-
Last release
12 months ago

Flatlist

O componente Flatlist serve para renderizar listas simples e básicas com utilização de setas(UP / DOWN) do teclado e touch.

PropriedadesDescriçãoTipoPadrão
renderItemRecebe o Component onde os items serão renderizadosComponentnull
renderTitleDefine um component para ser usado Título das seções. Caso seja omitido, sera renderizado um título padrãoComponentnull
dataRecebe um objeto com os itens que seram renderizadosobjectnull
dataSectionRecebe um objeto com os itens que seram renderizados em sessõesobjectnull
classNameClasse a ser adicionado ao elemento pai do componentestring
styleDefine os estilos para o container pai do FlatList, podendo ser uma string ou um objeto de propriedades CSS em JavaScriptstringobject
separatorDefine um separador para as seções. Caso seja omitido, sera renderizado o separador padrãoComponentnull
showSeparatorDefine se deve mostrar o separadorbooleantrue
intersectSelectedEventsPrevine chamadas iguais de eventos: itemSelectedonSelectedbooleanfalse
autoSelectOnTouchDefine se dispara a classe para realçar o item quando for selecionado por touchbooleantrue
autoShortcutsDefine se os shortcuts serão gerados automaticamente com base nos índices (max. 0-9)booleanfalse
decoratorDefine um objeto padrão que irá para todos os items da listagemobjectundefined
decoratorOverridesDefine um objeto que irá sobrescrever a propriedade decorator.objectundefined
overrideEnterKeystrokeDefine se o FlatList sempre vai ter prioridade no evento de enter do tecladobooleantrue
disableEnterKeystrokeDefine se o FlatList deve habilitar ou desabilitar o evento de enterbooleanfalse
disabledPermite desabilitar os eventos da FlatList e das Rowsbooleanfalse
selectedIndexDefine a linha que irá estar selecionada quando for criado a listanumber0
navBarPermite habilitar a barra de navegação pelo touch ou teclas de setabooleanfalse
navDownLabelTexto definido para o botão de descerstringDiminuir
navUpLabelTexto definido para o botão de subirstringAumentar
showPrefixDefine se deve mostrar o prefixobooleantrue

Métodos

MétodoDescrição
render(current?: any[] \| Record<string, any>)Renderiza a lista com o estado atual ou passando uma lista customizada.
setSelected(rowData: DefaultRowProps \| Record<string, any>, isKeystroke = false)Seleciona um item da lista programaticamente.
hide()Esconde a lista. Útil para não precisar redesenhar a lista em alguns cenários e salvar processamento.
show()Mostra a lista.

Eventos

<Flatlist ... on:active="itemActive(event)" on:selected="itemSelected(event)" />

EventosDisparado quando ...Tipo
activeRecebe os propriedades do item que esta ativo/selecionadofunction(event)
selectedRecebe os propriedades do item que foi selecionado por click ou tecladofunction(event)
setupConfigura elemento que recebe entrada(input) como primeiro item para ser simulado como linha da lista. ⚠️ Este elemento precisa ser uma referência de um HTMLElement. Se o componente Svelte pai desse elemento DOM tiver a propriedade autofocus, também precisa ser retirado. O setupFirstFocusable retorna true ou false se obteve todos os requisitos.function({ setupFirstFocusable: ({ element, forwardedRef = undefined }) => Boolean })

Exemplo de configuração do on:setup

Declarando um método on:setup no Flatlist e o Input que irá funcionar como linha da lista:

<!-- Lembre-se de não setar a propriedade `autofocus`, senão terá um comportamento inadequado. -->
<MoneyInput ref:moneyInput />

<FlatList ... on:setup="setupFlatlist(event)" />

Exemplo de método:

<script>
  export default {
    methods: {
      setupFlatlist({ setupFirstFocusable }) {
        const { refs: { moneyInput: element } = {} } = this;

        // Verificando se o componente pai esta renderizado
        if (element && element.refs && element.refs.amountInput) {
          // Desconstruindo o <input> da lista de referências do pai
          const { amountInput } = element.refs;

          // Chama a função
          setupFirstFocusable({
            element: amountInput,
            forwardedRef: 'input',
          });
        }
      },
    },
  };
</script>

Passando Data

Data é um array de objetos que irão compor os items da lista. Todas as propriedades do objeto serão repassadas para o componente renderItem com exceção das propriedades shortcut e onSelected, na qual o faz o uso para:

  • O shortcut que você definir será usado para criar atalhos do teclado no component.
  • O onSelected é usado como método para quando o item for selecionado.
  • Outras propriedades serão passadas normalmente para o componente declarado no renderItem.
const data = [
  {
    label: {
      value: 'Row 1',
    },
    shortcut: 1,
    onSelected: ({ sectionIndex, index, position, data }) => {
      /*
       * In this case, this anonymous function can call this script methods
       */
      console.log(index, sectionIndex, position, data); // 0 0 1 {label: {…}, shortcut: 1, onSelected: ƒ}
    },
  },
  {
    label: {
      value: 'Row 2',
    },
    shortcut: 2,
  },
  false && {
    // Conditional item
    label: {
      value: 'Row 3',
    },
    shortcut: 3,
  },
];

Método onSelect da row

Função anônima
  • A função anônima pode chamar qualquer método da página:

    // FlatList data
    const data = [
      {
        shortcut: 1
        label: {
          value: 'My Row',
        },
        onSelected: (item) => {
          const { someProp } = this.get();
    
          this.itemHandler(item, someProp);
        },
      }
    ];
    // ... Page methods
    methods: {
      itemHandler(item, someProp) {
        // ... do something with item and someProp
      },
    },
Executar um método que retorne uma função
  • Executando um método no onSelect, irá chamar a função desejada quando a lista for montada, possibilitando retornar uma função dinâmica.

    // FlatList data
    const data = [
      {
        shortcut: 1
        label: {
          value: 'Choose your destiny',
        },
        onSelected: this.getSelectedHandler(),
      }
    ];
    // ... Page methods
    methods: {
      getSelectedHandler() {
        if(myCondition) return (itemData) => {
          console.log('Condition function', itemData);
        };
    
        return (itemData) => {
          console.log('Default function', itemData);
        };
      },
    },
Referênciando um método da página
  • Você pode referenciar um método da página para ser usado no onSelected, mas o this de dentro do escopo da função referenciada, será a referência de seu objeto.

    // FlatList data
    const data = [
      {
        shortcut: 1
        label: {
          value: 'Some row',
        },
        onSelected: this.itemHandler,
      }
    ];
    // ... Page methods
    methods: {
      itemHandler() { // Without bind
        console.log(this) // { label: { value: 'Some row' }}, shortcut: 1, onSelected: function... }
      },
    },
  • Para referenciar métodos do mesmo componente/página, quando executada de dentro do escopo da função, use bind na referência do onSelect:

    // FlatList data
    const data = [
      {
        label: 'Item row',
        onSelected: this.itemHandler.bind(this),
      },
    ];
    // ... Page methods
    methods: {
      anotherMethod() {
        // ...
      },
      itemHandler() { // With bind
        this.anotherMethod();
      },
    },

Múltiplas seções

Útil para renderizar múltiplas listas com contextos diferentes.

const dataSection = [
  {
    title: 'Título da seção',
    data: [ ... ]
  }
]
PropriedadesDescriçãoTipo
titleÉ usada para renderizar um título antes da lista. A omissão dela faz com que nenhum título seja renderizado.string
dataArray de objetos que irão compor os items da seção.array

Exemplo de renderItem

<!-- Item.html -->

<!-- <FlatList /> envia `isActive` para seu component, podendo ser udado para realçar o elemento selecionado -->
<div class:active="isActive">
  <!-- Recebe `label` do `data`  -->
  {label}
</div>

<style>
  .active {
    background: #f00;
  }
</style>

Item de lista padrão

O FlatList exporta um componente padrão para ser usado na propriedade renderItem dele:

Exemplo:

<FlatList data="{dataList}" renderItem="{DefaultRow}" decorator="{GetDefaultDecorator}" />

<script>
  import { DefaultRow, FlatList, GetDefaultDecorator } from '@mamba/flatlist/index.js';
  export default {
    components: {
      FlatList,
    },
    helpers: {
      DefaultRow,
      GetDefaultDecorator,
    },
    data() {
      return {
        // Row items
        dataList: [],
      };
    },
  };
</script>

Decoradores

Como decoradores define um objeto padrão que irá aplicar para todos os items da listagem sem a necessidade de colocar manualmente em cada objeto de sua lista, o FlatList exporta um decorador padrão, o GetDefaultDecorator:

import { GetDefaultDecorator } from '@mamba/flatlist/index.js';

GetDefaultDecorator é um objeto pré-definido que ja entrega os padrões de layout para cada modelo de POS.

  • Se alguma lista tiver muitas variações do padrão, você pode definir seu prórpio decorator, ou se precisar alterar algum detalhe do padrão, use o decoratorOverrides.
  • decoratorOverrides pode ser usado para sobrescrever alguma propriedade padrão para todas as linhas, ou por modelo de POS específico, como por exemplo, tirar os prefixos:
<FlatList ... decorator={GetDefaultDecorator} decoratorOverrides={{ prefix: null }} />

Por modelo:

<FlatList ... decorator={GetDefaultDecorator} decoratorOverrides={{ S920: { prefix: null } }} />

Estrutura do DefaultRow

A estrutura do objeto que irá compor o array para o DefaultRow é diferente, tendo várias propriedades para customiza-lo:

type Alignment = 'start' | 'center' | 'end';

declare type Component = void;

interface ComponentView {
  // Fixture value
  value?: () => Component | any;

  /* If Value is component, set its props like:
   * props: {
   *   checked: true,
   * },
   */
  props?: object;

  /* If Value is component, set its events like:
   * on: {
   *   change: () => console.log('change'),
   * },
   */
  on?: object;
}

interface Fixture extends ComponentView {
  // Styles
  style?: object;
  wrapperStyle?: object;
  contentStyle?: object;
}

type SelectEvent = {
  data: DefaultRowProps;
  index: number;
  position: number;
  renderItemRefs: Component;
  telemetryEmitType: 'KEYBOARD' | 'TOUCH';
};

interface DefaultRowProps {
  // Action when selected with touch, keyboard action, or shortcut.
  onSelected?: (event: SelectEvent) => {};

  // The keyboard shortcut
  shortcut?: number | string;

  // Row top level style
  wrapperStyle?: object;

  // Row content container style (don't include and/start fixtures container)
  contentStyle?: object;

  // If row should highlighted or not
  highlightSelect?: boolean;

  // The highlight color
  highlightColor?: string;

  // If the row should have minimal spaces
  small?: boolean;

  // Whether the line should behave without internal spaces so that your children can fill it.
  fill?: boolean;

  // Vertical items align
  align?: Alignment;

  // Useful to put anything before the label
  startFixture?: Fixture;

  // If you dont want work with labels, you can inject your own main content in the row.
  customView?: ComponentView;

  // show or not chevron icon on all lines
  showChevron?: boolean;

  // Row labels
  label?: {
    value: string;
    description?: string;
    style?: object;

    // Anything immediate before label. Can be a function that will receive the row position
    prefix?: (position: number) => string | number;
    prefixStyle?: object;
  };

  rightLabel?: {
    value: string;
    description?: string;
    style?: object;

    // Anything immediate next to righLabel. Can be a function that will compute some value
    sufix?: () => string | number;
    sufixStyle?: object;
  };

  // Useful to put anything after the label or rightLabel block
  endFixture?: Fixture;
}

Acesse as ref do DefaultRow

Utilize para acessa o elemento e ter acesso as suas funcionalidades, como States e Funções .

Exemplo
interface DefaultRowProps = {
  // Action when selected with touch, keyboard action, or shortcut.
  onSelected: function(event) {
    const { endFixture } = event.renderItemRefs;
    endFixture.updateProps({
      checked: true,
    });
  },
}

Estilos

O DefaultRow possúi propriedades de estilo para customizar suas partes como style, wrapperStyle e contentStyle. O valor delas é um objeto de propriedades CSS em JavaScript:

{
  label: {
    value: 'Item',
  },
  style: {
    fontSize: '14px',
    borderBottomWidth: '2px',
  },
}
12.0.0

1 year ago

12.1.0

12 months ago

11.0.3

1 year ago

11.0.2

1 year ago

11.0.1

2 years ago

11.0.0

2 years ago

10.0.1

2 years ago

10.0.2

2 years ago

10.3.2

2 years ago

10.3.3

2 years ago

10.3.0

2 years ago

10.3.1

2 years ago

9.6.0

2 years ago

9.7.0

2 years ago

9.5.0

2 years ago

9.4.1

2 years ago

9.4.0

2 years ago

9.2.1

2 years ago

9.1.0

2 years ago

9.3.1

2 years ago

9.3.0

2 years ago

9.2.0

2 years ago

9.0.3

2 years ago

6.3.0

3 years ago

6.2.1

3 years ago

6.2.0

3 years ago

8.0.1

3 years ago

8.0.0

3 years ago

8.0.2

2 years ago

9.0.2

2 years ago

9.0.1

2 years ago

9.0.0

2 years ago

6.1.2

3 years ago

6.1.3

3 years ago

6.1.0

3 years ago

6.0.2

3 years ago

5.2.0

3 years ago

5.1.0

3 years ago

5.0.0

3 years ago

6.0.1

3 years ago

6.0.0

3 years ago

4.3.5

3 years ago

4.3.4

3 years ago

4.3.3

3 years ago

4.2.1

3 years ago

4.2.0

3 years ago

4.1.3

3 years ago

4.1.2

4 years ago

4.1.0

4 years ago

4.1.1

4 years ago

4.0.1

4 years ago

4.0.0

4 years ago

4.0.2

4 years ago

3.7.2

4 years ago

3.7.1

4 years ago

3.7.0

4 years ago

3.6.9

4 years ago

3.6.8

4 years ago

3.6.7

4 years ago

3.6.6

4 years ago

3.6.5

4 years ago

3.6.4

4 years ago

3.6.3

4 years ago

3.6.2

4 years ago

3.6.1

4 years ago

3.5.7

4 years ago

3.6.0

4 years ago

3.5.6

4 years ago

3.5.5

4 years ago

3.5.4

4 years ago

3.5.3

4 years ago

3.5.2

4 years ago

3.5.1

4 years ago

3.5.0

4 years ago