import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, Output } from "@angular/core"; import { SdInputValidate } from "@simplysm/sd-angular"; import { StringUtil } from "@simplysm/sd-core-common"; import { faAngleDown } from "@fortawesome/pro-light-svg-icons/faAngleDown"; @Component({ selector: "sdm-select", changeDetection: ChangeDetectionStrategy.OnPush, template: `
`, styles: [/* language=SCSS */ ` @import "../../scss/mixins"; :host { position: relative; display: block; @include mobile-active-effect(true); > select { display: block; width: 100%; padding: calc(var(--gap-sm) + 1px) 0 calc(var(--gap-sm) - 1px); border: none; border-bottom: 2px solid var(--border-color); background: transparent; font-size: var(--font-size-default); font-family: var(--font-family); line-height: var(--line-height); color: var(--text-brightness-default); transition: border-color 0.3s; appearance: none; } > ._icon { position: absolute; top: 0; right: 0; padding: calc(var(--gap-sm) + 1px) 0 calc(var(--gap-sm) - 1px); color: var(--text-brightness-lighter); } &[sd-invalid=true] { > select { border-bottom-color: var(--theme-color-danger-default); } } > select { &:focus { border-color: var(--theme-color-primary-default); } &:disabled { border-bottom-color: transparent; color: var(--text-brightness-light); } } &[sd-disabled=true] { @include mobile-active-effect(false); > ._icon { display: none; } } &[sd-size=sm] { > select { padding: calc(var(--gap-xs) + 1px) 0 calc(var(--gap-xs) - 1px); } } &[sd-size=lg] { > select { font-size: var(--font-size-lg); padding: calc(var(--gap-default) + 1px) 0 calc(var(--gap-default) - 1px); } } &[sd-inline=true] { display: inline-block; > select { display: inline-block; width: auto; } } &[sd-inset=true] { > select { border: none; &:focus { outline: 1px solid var(--theme-color-primary-default); } } } } `] }) export class SdmSelectControl { public icons = { falAngleDown: faAngleDown }; @Input() @SdInputValidate(String) public title?: string; @Input() @SdInputValidate(String) public value?: string; @Output() public readonly valueChange = new EventEmitter(); @Input() @SdInputValidate(Boolean) @HostBinding("attr.sd-disabled") public disabled?: boolean; @Input() @SdInputValidate(Boolean) public required?: boolean; @Input() @SdInputValidate(Boolean) @HostBinding("attr.sd-inline") public inline?: boolean; @Input() @SdInputValidate(Boolean) @HostBinding("attr.sd-inset") public inset?: boolean; @Input() @SdInputValidate({ type: String, includes: ["sm", "lg"] }) @HostBinding("attr.sd-size") public size?: "sm" | "lg"; @Input("select.style") @SdInputValidate(String) public selectStyle?: string; @Input("select.class") @SdInputValidate(String) public selectClass?: string; public onChange(event: Event): void { const el = event.target as HTMLSelectElement; if (this.valueChange.observed) { this.valueChange.emit(StringUtil.isNullOrEmpty(el.value) ? undefined : el.value); } else { this.value = StringUtil.isNullOrEmpty(el.value) ? undefined : el.value; } } }