diff --git a/app/components/icons/check.js b/app/components/icons/check.js
new file mode 100644
index 0000000..a2f7486
--- /dev/null
+++ b/app/components/icons/check.js
@@ -0,0 +1 @@
+export { Check as default } from 'ember-mdi';
diff --git a/app/components/toast.hbs b/app/components/toast.hbs
index 4de891d..bdb61d3 100644
--- a/app/components/toast.hbs
+++ b/app/components/toast.hbs
@@ -1,6 +1,6 @@
{{#in-element this.toaster.destinationElement insertBefore=null}}
-
-
-
-
-
- {{@text}}
-
-
-
-
diff --git a/app/components/toast/success.js b/app/components/toast/success.js
index 87bf3ac..c4a522b 100644
--- a/app/components/toast/success.js
+++ b/app/components/toast/success.js
@@ -1,3 +1,24 @@
-import Component from '@glimmer/component';
+import ToastThemeComponent from './theme';
+import { Check } from 'ember-mdi';
-export default class ToastSuccessComponent extends Component {}
+export default class ToastSuccessComponent extends ToastThemeComponent {
+ get bg() {
+ return 'bg-success-light';
+ }
+
+ get color() {
+ return null;
+ }
+
+ get borderColor() {
+ return 'border-success';
+ }
+
+ get icon() {
+ return Check;
+ }
+
+ get autoClose() {
+ return true;
+ }
+}
diff --git a/app/components/toast/theme.hbs b/app/components/toast/theme.hbs
new file mode 100644
index 0000000..4dde033
--- /dev/null
+++ b/app/components/toast/theme.hbs
@@ -0,0 +1,35 @@
+
+
+ {{#if this.icon}}
+
+
+
+ {{/if}}
+
+
+ {{#if @header}}
+
{{@header}}
+ {{/if}}
+ {{#if @text}}
+ {{@text}}
+ {{/if}}
+
+
+
+
+
diff --git a/app/components/toast/theme.js b/app/components/toast/theme.js
new file mode 100644
index 0000000..230dce7
--- /dev/null
+++ b/app/components/toast/theme.js
@@ -0,0 +1,19 @@
+import Component from '@glimmer/component';
+
+export default class ToastThemeComponent extends Component {
+ get bg() {
+ return 'bg-base-7';
+ }
+
+ get color() {
+ return null;
+ }
+
+ get borderColor() {
+ return null;
+ }
+
+ get width() {
+ return 'w-80';
+ }
+}
diff --git a/app/controllers/admin/keys/key/edit.js b/app/controllers/admin/keys/key/edit.js
index 7a1d1ff..743ef42 100644
--- a/app/controllers/admin/keys/key/edit.js
+++ b/app/controllers/admin/keys/key/edit.js
@@ -26,6 +26,11 @@ export default class AdminKeysKeyEditController extends Controller {
try {
const key = await this.model.save(value);
+ this.toaster.successToast({
+ header: 'Success',
+ text: 'The key has been successfuly updated',
+ });
+
if (this.router.isActive('admin.keys.key')) {
await this.router.refresh('admin.keys.key', key.uid);
}
diff --git a/app/services/toaster.js b/app/services/toaster.js
index c040fab..ff621ed 100644
--- a/app/services/toaster.js
+++ b/app/services/toaster.js
@@ -3,6 +3,7 @@ import { tracked } from '@glimmer/tracking';
import { hbs } from 'ember-template-imports';
import { action } from '@ember/object';
import SuccessToast from '../components/toast/success';
+import DangerToast from '../components/toast/danger';
import TaskToast from '../components/toast/task';
export default class ToasterService extends Service {
@@ -18,12 +19,23 @@ export default class ToasterService extends Service {
}
@action
- successToast({ text }) {
+ successToast({ text, header }) {
const onClose = () => {
this.container = this.container.filter((item) => item !== wrapper);
};
- const wrapper = hbs`
`;
+ const wrapper = hbs`
`;
+
+ this.container = this.container.concat([wrapper]);
+ }
+
+ @action
+ dangerToast({ text, header }) {
+ const onClose = () => {
+ this.container = this.container.filter((item) => item !== wrapper);
+ };
+
+ const wrapper = hbs`
`;
this.container = this.container.concat([wrapper]);
}
diff --git a/app/utils/query.js b/app/utils/query.js
index bfda9ec..599d40e 100644
--- a/app/utils/query.js
+++ b/app/utils/query.js
@@ -2,6 +2,7 @@ import { instance } from '../instance-initializers/application';
export default function query(path, options = {}) {
const session = instance.lookup('service:session');
+ const toaster = instance.lookup('service:toaster');
const { url, key } = session.data.authenticated;
const defaultHeaders = { 'Content-Type': 'application/json' };
const headers = new Headers(Object.assign(defaultHeaders, options.headers));
@@ -15,13 +16,29 @@ export default function query(path, options = {}) {
Object.assign(options, { headers })
);
- return fetch(req).then((response) => {
- if (response.status === 204) {
- return;
- } else if (response.ok) {
- return response.json();
- } else {
- throw new Error('Network response was not OK');
- }
- });
+ return fetch(req)
+ .then((response) => {
+ if (response.status === 204) {
+ return;
+ } else if (response.ok) {
+ return response.json();
+ } else {
+ response.json().then((reason) => {
+ toaster.dangerToast({
+ header: reason.type,
+ text: reason.message,
+ });
+
+ throw new Error('Network response was not OK');
+ });
+ }
+ })
+ .catch((response) => {
+ response.json().then((reason) => {
+ toaster.dangerToast({
+ header: reason.type,
+ text: reason.message,
+ });
+ });
+ });
}
diff --git a/tests/integration/components/toast/theme-test.js b/tests/integration/components/toast/theme-test.js
new file mode 100644
index 0000000..26c5d8f
--- /dev/null
+++ b/tests/integration/components/toast/theme-test.js
@@ -0,0 +1,26 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from 'meiliadmin/tests/helpers';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | toast/theme', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders', async function (assert) {
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.set('myAction', function(val) { ... });
+
+ await render(hbs`
`);
+
+ assert.dom(this.element).hasText('');
+
+ // Template block usage:
+ await render(hbs`
+
+ template block text
+
+ `);
+
+ assert.dom(this.element).hasText('template block text');
+ });
+});