meilisearch-admin/app/components/button.js

125 lines
2.6 KiB
JavaScript
Raw Normal View History

2022-03-27 13:04:08 +00:00
import Component from '@glimmer/component';
import { action } from '@ember/object';
import { tracked } from '@glimmer/tracking';
2022-09-02 12:01:26 +00:00
import { hbs } from 'ember-template-imports';
import { Loading } from 'ember-mdi';
import { on } from '@ember/modifier';
import eq from '../helpers/eq';
export const commonClasses =
'inline-flex items-center px-3 py-2 leading-4 text-sm cursor-pointer border hover:opacity-80 active:opacity-60 focus:outline-none text-black border-gray-dark';
export const primaryStyleClasses = 'text-primary border-primary';
2022-03-27 13:04:08 +00:00
export default class ButtonComponent extends Component {
2022-09-02 12:01:26 +00:00
static template = hbs`
<button
disabled={{this.disabled}}
type={{this.type}}
class="
{{commonClasses}}
{{if (eq this.style 'primary') primaryStyleClasses}}
{{if @group 'first:rounded-l-md last:rounded-r-md' 'rounded-md'}}
"
...attributes
{{on 'click' this.handleClick}}
>
{{#if this.isPending}}
<Loading @spin={{true}} class="mx-1" />
{{else if @icon}}
<@icon class="mx-1" />
{{/if}}
{{#if this.text}}
<span class="mx-1">
{{this.text}}
</span>
{{/if}}
</button>
`;
2022-03-27 13:04:08 +00:00
@tracked _state = 'default';
2022-05-07 08:36:29 +00:00
get style() {
return this.args.style ?? 'default';
}
get size() {
return this.args.size ?? 'default';
}
2022-03-30 06:58:35 +00:00
get isActive() {
return (
this.args.group &&
this.args.value &&
this.args.group.args.value === this.args.value
);
}
2022-03-27 13:04:08 +00:00
get disabled() {
if (this.args.disabled !== undefined) {
return this.args.disabled;
}
return this.isPending;
}
get type() {
return this.args.type ?? 'button';
}
get state() {
return this.args.state ?? this._state;
}
set state(state) {
this._state = state;
}
get isPending() {
return this.state === 'pending';
}
get isFulfilled() {
return this.state === 'fulfilled';
}
get isRejected() {
return this.state === 'rejected';
}
get isSettled() {
return this.isFulfilled || this.isRejected;
}
get text() {
2022-04-27 11:07:57 +00:00
return this.args[`${this.state}Text`] ?? this.args.text;
2022-03-27 13:04:08 +00:00
}
@action
2022-09-02 07:18:37 +00:00
async handleClick(event) {
2022-03-27 13:04:08 +00:00
if (typeof this.args.onClick !== 'function') {
return;
}
2022-09-02 07:18:37 +00:00
event.preventDefault();
2022-03-27 13:04:08 +00:00
try {
2022-04-27 11:07:57 +00:00
const maybePromise = this.args.onClick(this.args.value);
2022-03-27 13:04:08 +00:00
2022-04-27 11:07:57 +00:00
if (typeof maybePromise?.then === 'function') {
this.state = 'pending';
await maybePromise;
if (!this.isDestroyed) {
this.state = 'fulfilled';
}
2022-03-27 13:04:08 +00:00
}
} catch (error) {
if (!this.isDestroyed) {
this.state = 'rejected';
}
throw error;
}
}
}