import {type CSSResultGroup, html, unsafeCSS} from 'lit';
import {property} from "lit/decorators.js";
import ZincElement from '../../internal/zinc-element';
import type ZnDataSelect from "../data-select";
import type ZnDataTable from "../data-table";
import type ZnInput from "../input";
import type ZnQueryBuilder from "../query-builder";
import type ZnSelect from "../select";
import styles from './filter-wrapper.scss';
type AllowedInputElement =
HTMLInputElement
| HTMLSelectElement
| HTMLTextAreaElement
| ZnInput
| ZnSelect
| ZnDataSelect
| ZnQueryBuilder
/**
* @summary Short summary of the component's intended use.
* @documentation https://zinc.style/components/filter-wrapper
* @status experimental
* @since 1.0
*
* @dependency zn-example
*
* @event zn-event-name - Emitted as an example.
*
* @slot - The default slot.
* @slot example - An example slot.
*
* @csspart base - The component's base wrapper.
*
* @cssproperty --example - An example CSS custom property.
*/
export default class ZnFilterWrapper extends ZincElement {
static styles: CSSResultGroup = unsafeCSS(styles);
@property() button: string = 'Filter';
private hasSubmitButton: boolean = false;
handleSubmit = (event: Event) => {
event.preventDefault();
const dataTable: ZnDataTable | null = this.closest('zn-data-table');
if (dataTable) {
const allowedInputs = ['zn-input', 'zn-select', 'zn-query-builder', 'zn-data-select', 'zn-datepicker', 'input', 'select', 'textarea'];
const inputs = Array.from(this.querySelectorAll(allowedInputs.join(','))) as AllowedInputElement[];
const params: Record = {};
inputs.forEach(input => {
if (!input.value && input.hasAttribute('omit-empty')) {
return;
}
params[input.name] = input.value as string;
});
dataTable.requestParams = params;
dataTable.refresh();
}
}
connectedCallback() {
super.connectedCallback();
const button: HTMLElement | null = this.querySelector('zn-button[submit]');
if (button) {
this.hasSubmitButton = true;
button.addEventListener('click', this.handleSubmit);
}
}
private renderDefaultButton() {
return html`
${this.button}
`;
}
render() {
return html`
${this.hasSubmitButton ? '' : this.renderDefaultButton()}
`;
}
}