From 8ebf5ac1372b58081b4db7ae754943f739ba79bc Mon Sep 17 00:00:00 2001
From: Kacper Donat <kadet1090@gmail.com>
Date: Tue, 11 Feb 2020 20:12:33 +0100
Subject: [PATCH] #22 - Fix missing icon in favourites adder

---
 resources/components/favourites/save.html |  2 +-
 resources/components/ui/icon.html         |  2 +-
 resources/ts/components/ui/icon.ts        | 17 ++++++++++++-----
 3 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/resources/components/favourites/save.html b/resources/components/favourites/save.html
index 3f223e3..544dc83 100644
--- a/resources/components/favourites/save.html
+++ b/resources/components/favourites/save.html
@@ -6,7 +6,7 @@
                    :class="{ 'is-invalid': errors.name.length > 0 }" id="favourite_add_name"
                    v-model="name" v-autofocus/>
             <button class="btn btn-sm btn-dark" type="submit">
-                <ui-icon class="add" />
+                <ui-icon icon="add" />
             </button>
             <div v-if="errors.name.length > 0" class="invalid-feedback">
                 <p v-for="error in errors.name">{{ error }}</p>
diff --git a/resources/components/ui/icon.html b/resources/components/ui/icon.html
index 4fd3d67..f9f2d25 100644
--- a/resources/components/ui/icon.html
+++ b/resources/components/ui/icon.html
@@ -1,4 +1,4 @@
-<fa v-bind="definition" v-if="type === 'simple'"/>
+<fa v-bind="attrs" v-if="type === 'simple'"/>
 <fa-layers v-else-if="type === 'stacked'">
     <fa :icon="props.icon" v-bind="props" v-for="(props, index) in definition.icons" :key="index"/>
 </fa-layers>
diff --git a/resources/ts/components/ui/icon.ts b/resources/ts/components/ui/icon.ts
index 0fe37c1..419db53 100644
--- a/resources/ts/components/ui/icon.ts
+++ b/resources/ts/components/ui/icon.ts
@@ -15,7 +15,7 @@ import {
     faInfoCircle,
     faMapMarkerAlt,
     faMoon,
-    faQuestionCircle,
+    faQuestionCircle, faQuestionSquare,
     faSearch,
     faSign,
     faStar,
@@ -60,6 +60,7 @@ const messageTypeIcons: Dictionary<Icon> = {
 
 const definitions: Dictionary<Icon> = {
     'favourite': simple(faStar),
+    'unknown': simple(faQuestionSquare),
     'add': simple(faCheck),
     'add-all': simple(faCheckDouble),
     'remove-stop': simple(faTimes),
@@ -113,14 +114,20 @@ export class UiIcon extends Vue {
         validator: value => typeof value === "object" || Object.keys(definitions).includes(value),
         required: true,
     })
-    icon: keyof typeof definitions;
+    icon: string | IconDefinition;
 
-    get definition() {
-        return {...(typeof this.icon === "string" ? definitions[this.icon] : { icon: this.icon }), ...this.$attrs};
+    get definition(): Icon {
+        return typeof this.icon === "string"
+            ? definitions[this.icon] || definitions['unknown']
+            : { icon: this.icon as IconDefinition, type: "simple" };
+    }
+
+    get attrs() {
+        return { ...this.definition, ...this.$attrs };
     }
 
     get type() {
-        return definitions[this.icon].type;
+        return this.definition.type;
     }
 }