The AOC Framework
github logodiscord logo

FRONTEND

<aoc-grid> #

Este componente se usa para mostrar una tabla (o lista) de modelos, con paginación y una barra de herramientas.

Inputs #

Nombre Tipo Descripción
modelConfig AocModelConfig El model-config
columns AocGridColumn[] Array de columnas para definir el grid
restOptions AocRestOptions Las opciones de carga para la api rest
where AocFilterQuery Condiciones de búsqueda que se mezclarán con restOptions
groupColumns AocGridGroupColumn[][] Encabezados para agrupaciones de columnas
addSearchInput boolean Añadir un input de texto para búsqueda
searchInputPlaceholder string Texto "Buscar..."
buttonConfig AocGridToolbarButtonConfig Configuración de botones de la barra de herramientas
customSort (sortEvent: AocUiTableCustomSortEvent,
queryOrderMapArray: AocQueryOrderMap[]) => void
Función para definir ordenación de columnas personalizada
rowLimits AocUiPaginatorRowLimitOptions Define los límites de filas para el paginador
groupConfig AocGridGroupConfig Configuración de grupos (los grupos son agupaciones de filas)
emptyGroupDescriptor string Etiqueta para filas que no pertenecen a ningún grupo
autoExpandAllRows boolean Autoexpandir todas las filas
rowNgStyle AocGridRowNgStyle Estilo para filas, puede ser una función
rowNgClass AocGridRowNgClass Clase para filas, puede ser una función
selectMode 'single' or 'multiple' (por defecto) or null/undefined Selección única, múltiple, o no se permite selección
autoSelectFirst boolean (false por defecto) Autoseleccionar primer elemento después de cargar
selectionStyle 'normal' o 'chechbox' Estilo de selección, normal con control y mayús, o con checkboxes
modelEmitter AocModelEmitter Emisor para la selección del modelo
modelListener AocModelListener Estructura de gestión de cambios en el modelo
dynamicFormGroupConfig AocDynFormGroup Configuración de FormGroup dinámico

Outputs #

Nombre Tipo Descripción
whereChange AocFilterQuery Emite el cambio de la condición where
restOptionsChange AocRestOptions Emite el cambio en las restOptions
selectionChange Array Emite el cambio de la selección de modelos
modelsChange Array Emite el cambio de modelos
loadingChange boolean Emite el cambio del estado de carga

Ejemplo #

<aoc-grid [modelConfig]="modelConfig" [columns]="columns">
  <ng-template aocGridCell="current" let-isCurrent="value">
    <span *ngIf="isCurrent" class="material-symbols-rounded">check</span>
  </ng-template>
</aoc-grid>
protected modelConfig = inject(FiscalYearModelConfig);
protected columns: AocGridColumn<FiscalYear>[] = [
  {
    header: FiscalYear.i18n.IS_CURRENT,
    display: [ FiscalYear.field.IS_CURRENT, aocUiTplRef('current') ],
    size: '8rem',
    align: 'center'
  },
  {
    header: FiscalYear.i18n.YEAR,
    display: FiscalYear.field.YEAR,
    defaultSort: 'desc'
  }
];

Ejemplo completo en quest-client/src/app/features/schemas/common/fiscal-year/fiscal-year-grid.component.ts

Ejemplo avanzado #

En este grid de ejemplo de cliente (Customer) vemos las columnas de código, nombre legal, nombre comercial, teléfonos y correo electrónico. Además, en la primera columna dibujaremos una tarta de aniversario si es el cumpleaños del cliente.

<aoc-grid [modelConfig]="modelConfig" [columns]="columns" [where]="where" [restOptions]="restOptions">
  <!-- Add some filters to the right of the toolbar -->
  <ng-template aocUiToolbar="right" [formGroup]="filterFormGroup">
    <aoc-ui-item>
      <input type="checkbox" aocUiInputCheckbox="Today's birthdate" formControlName="byBirthday">
    </aoc-ui-item>
    <aoc-ui-item>
      <app-gender-autocomplete allow="none" formControlName="byGender" placeholder="Filter by gender..."></app-gender-autocomplete>
    </aoc-ui-item>
  </ng-template>
  <!-- Draw cake icon if it's the customer birthday -->
  <ng-template aocGridCell="birthday" let-isBirthday="value">
    <span *ngIf="isBirthday" class="material-symbols-rounded" aocUiTooltip="Todays is his/her day...">cake</span>
  </ng-template>
  <!-- Email template to be able to send a mail via mailto -->
  <ng-template aocGridCell="email" let-email="value">
    <a *ngIf="email" href="mailto:{{email}}" target="_blank">{{email}}</a>
  </ng-template>
  <!-- Expander to show the full address -->
  <ng-template aocUiTableTemplate="rowExpansion" let-rowData>
    <p>{{rowData.addressTemplate.street_number ?? 'No number'}} {{rowData.addressTemplate.street_name}} {{rowData.addressTemplate.streetSuffix.name}}</p>
    <p>
      Additional data: {{rowData.addressTemplate.additional_data ?? 'None'}} |
      Floor: {{rowData.addressTemplate.floor ?? 'None'}} |
      Door: {{rowData.addressTemplate.door ?? 'None'}} |
      Block: {{rowData.addressTemplate.block ?? 'None'}} |
      Area: {{rowData.addressTemplate.area ?? 'None'}}
    </p>
    <p>{{rowData.addressTemplate.city}} - {{rowData.addressTemplate.state}} - {{rowData.addressTemplate.zip_code}} - {{rowData.addressTemplate.country.name}}</p>
  </ng-template>
</aoc-grid>
ngOnInit() {
  const today = new Date();
  this.columns = [
    {
      header: '',
      display: [
        Customer.field.BIRTHDATE,
        (birthdate: Date) => getDayOfYear(birthdate) === getDayOfYear(today),
        aocUiTplRef('birthday')
      ],
      size: '4rem',
      align: 'center',
      sortable: false
    },
    {
      header: 'Code',
      display: Customer.field.CODE,
      defaultSort: 'asc',
      size: '8rem',
      align: 'right'
    },
    {
      header: 'Legal name',
      display: [ Customer.embedded.LEGAL_DATA_TEMPLATE, (ldt: LegalDataTemplate) => `${ldt.legal_name} (${ldt.document_number})` ],
      orderBy: {
        legalDataTemplate: { legal_name: 'auto' }
      }
    },
    {
      header: 'Trade name',
      display: Customer.field.TRADE_NAME
    },
    {
      header: 'Phones',
      display: customer => [customer.phone1, customer.phone2].filter(p => p?.trim()).join(' - '),
      orderBy: {
        phone1: 'auto',
        phone2: 'auto'
      }
    },
    {
      header: 'Email',
      display: [ Customer.field.EMAIL, aocUiTplRef('email') ],
      orderBy: { email: 'auto' }
    }
  ];

  this.filterSubscription = this.filterFormGroup.valueChanges.subscribe(filters => {
    this.where = {};
    if (filters.byGender) {
      this.where.gender = filters.byGender;
    }
    if (filters.byBirthday) {
      this.restOptions.filters = { filterByBirthday: {} }
    } else {
      this.restOptions.filters = {};
    }
  });
}

Ejemplo completo en quest-client/src/app/features/schemas/customers/customer/customer-grid.component.ts

API #

Definición completa en la API.

Por favor, busque en Issues y Discussions en Github para más información

© 2025 Atlantis of Code. All rights reserved.
All trademarks are the property of their respective owners.