feat: pestaña Stock por almacén en el lote (consulta estándar batch-stock del módulo sapdb; sin base configurada no aparece)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
5db5de65ad
commit
6887f9e474
11 files changed
+207
-7
No files matched your search
@@ -0,0 +1,51 @@
|
||||
import { ChangeDetectionStrategy, Component, computed, inject, input, resource } from '@angular/core';
|
||||
import { apiErrorMessage } from '../../core/api';
|
||||
import { SapDbApi } from '../../core/sl/sapdb-api';
|
||||
import type { DetailColumn } from './grid.types';
|
||||
import { RowsTable } from './rows-table';
|
||||
|
||||
/** Tabla de solo lectura con el resultado de una consulta registrada a la base de SAP (el stock de un lote por almacén). */
|
||||
@Component({
|
||||
selector: 'sbo-query-table',
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
imports: [RowsTable],
|
||||
template: `
|
||||
@if (result.error()) {
|
||||
<p class="err" role="alert">{{ error() }}</p>
|
||||
} @else if (result.isLoading()) {
|
||||
<p class="hint">Consultando…</p>
|
||||
} @else {
|
||||
<sbo-rows-table [columns]="columns()" [rows]="rows()" [readonly]="true" [removable]="false" [hideEmptyBy]="hideEmptyBy() ?? null" [hideEmptyLabel]="hideEmptyLabel()" emptyText="Sin datos." />
|
||||
@if (result.value()?.truncated) {
|
||||
<p class="hint">Hay más filas de las que se muestran.</p>
|
||||
}
|
||||
}
|
||||
`,
|
||||
styles: `
|
||||
:host { display: block; }
|
||||
.hint { margin: 6px 0; color: var(--quiet); }
|
||||
.err { margin: 6px 0; color: var(--err); }
|
||||
`,
|
||||
})
|
||||
export class QueryTable {
|
||||
private readonly api = inject(SapDbApi);
|
||||
|
||||
readonly query = input.required<string>();
|
||||
readonly params = input.required<Record<string, unknown>>();
|
||||
readonly columns = input.required<readonly DetailColumn[]>();
|
||||
readonly hideEmptyBy = input<readonly string[]>();
|
||||
readonly hideEmptyLabel = input('Ocultar las filas en 0');
|
||||
|
||||
/** La consulta y sus parámetros como texto: quien nos usa puede armar un objeto nuevo en cada ciclo y no por eso se vuelve a consultar. */
|
||||
private readonly request = computed(() => JSON.stringify({ query: this.query(), params: this.params() }));
|
||||
|
||||
protected readonly result = resource({
|
||||
params: () => this.request(),
|
||||
loader: ({ params }) => {
|
||||
const r = JSON.parse(params) as { query: string; params: Record<string, unknown> };
|
||||
return this.api.run(r.query, r.params);
|
||||
},
|
||||
});
|
||||
protected readonly rows = computed(() => (this.result.hasValue() ? this.result.value().rows : []));
|
||||
protected readonly error = computed(() => apiErrorMessage(this.result.error()));
|
||||
}
|
||||
Reference in new issue
Block a user