Sfoglia il codice sorgente

Menu Option & Display WIP

master
George Williams 4 anni fa
parent
commit
d1ed8cb3f1

+ 649
- 704
package-lock.json
File diff soppresso perché troppo grande
Vedi File


+ 3
- 3
package.json Vedi File

@@ -17,12 +17,12 @@
17 17
     "core-js": "^2.6.11",
18 18
     "datatables.net": "^1.10.20",
19 19
     "font-awesome": "^4.7.0",
20
-    "jquery": "^3.4.1",
20
+    "jquery": "^3.5.1",
21 21
     "js-sha256": "^0.9.0",
22 22
     "lodash": "^4.17.15",
23 23
     "material-design-icons-iconfont": "^3.0.3",
24 24
     "moment": "^2.24.0",
25
-    "node-sass": "^4.13.1",
25
+    "node-sass": "^4.14.1",
26 26
     "roboto-fontface": "*",
27 27
     "sass-loader": "^7.3.1",
28 28
     "stylus-loader": "^3.0.2",
@@ -33,7 +33,7 @@
33 33
     "vue-eva-icons": "^1.1.1",
34 34
     "vue-fontawesome-icon": "^1.3.0",
35 35
     "vue-image-upload-resize": "^2.3.0",
36
-    "vue-js-modal": "^1.3.33",
36
+    "vue-js-modal": "^1.3.35",
37 37
     "vue-json-excel": "^0.2.98",
38 38
     "vue-router": "^3.1.5",
39 39
     "vue-switches": "^2.0.1",

+ 3
- 0
src/assets/Log.js Vedi File

@@ -47,6 +47,9 @@ const items = {
47 47
   isLoggedIn() {
48 48
     return localStorage.getItem('token') !== undefined && localStorage.getItem('token') !== null;
49 49
   },
50
+  restaurantId() {
51
+    return 1;
52
+  },
50 53
   getUser() {
51 54
     return localStorage.getItem('user') ? JSON.parse(localStorage.getItem('user')) : {};
52 55
   },

+ 131
- 0
src/components/home/menuItems.vue Vedi File

@@ -0,0 +1,131 @@
1
+<template>
2
+  <div class="container">
3
+    <div class="container col-md-12">
4
+      <div class="col-sm-12">
5
+        <div class="about-img-box">
6
+          <img
7
+            :src="menu.logo"
8
+            alt="Restaurant Details"
9
+            class="img-fluid"
10
+            style="width:800px;height:400px; border-radius:10px"
11
+          />
12
+        </div>
13
+        <div class="sinse-box" style="border-radius:10px">
14
+          <h3 class="sinse-title">{{ menu.name }}</h3>
15
+          <p>{{ menu.categories }}</p>
16
+          <ul class="card-info d-flex justify-content-around">
17
+            <li>
18
+              <h4 class="card-info-title">
19
+                <img src="/img/delivery-truck-with-dollar.png" height="30px" width="30px" />
20
+              </h4>
21
+              <span>{{ menu.deliveryFee }}</span>
22
+            </li>
23
+            <li>
24
+              <h4 class="card-info-title">
25
+                <img src="/img/delivery-truck-with-circular-clock.png" height="30px" width="30px" />
26
+              </h4>
27
+              <span>{{ menu.deliveryTime }}</span>
28
+            </li>
29
+          </ul>
30
+          <p>{{ menu.suburb }}, {{ menu.city }}, {{ menu.province }}, {{ menu.postalCode }}</p>
31
+        </div>
32
+      </div>
33
+    </div>
34
+    <!-- TODO: Revisit this -->
35
+    <!-- <div class="container col-md-12">
36
+      <ul v-for="(item, i) in menu.categoryList" :key="i" class="navbar-nav">
37
+        <li style="float: left;">{{item}}</li>
38
+      </ul>
39
+    </div>-->
40
+    <div v-if="!showOptions">
41
+      <div v-for="iMenu in menu.menuList" :key="iMenu.category">
42
+        <div class="row section-t3" style="text-align:left">
43
+          <div class="col-sm-12">
44
+            <div class="title-box-d">
45
+              <h3 class="title-d">{{ iMenu.category }}</h3>
46
+            </div>
47
+          </div>
48
+          <div
49
+            class="col-md-4"
50
+            v-for="(iMenuItem, i) in iMenu.items"
51
+            :key="i"
52
+            style="cursor: pointer;"
53
+          >
54
+            <div class="carousel-item-c" @click="ShowOptions(iMenuItem)">
55
+              <div class="card-box-b card-shadow news-box">
56
+                <div class="img-box-b">
57
+                  <img :src="iMenuItem.image" alt class="img-b img-fluid" />
58
+                </div>
59
+                <div class="card-overlay">
60
+                  <div class="card-header-b">
61
+                    <div class="card-title-b">
62
+                      <h2 class="title-2" style="color: #ffffff;">{{ iMenuItem.name }}</h2>
63
+                    </div>
64
+                    <div class="card-date">
65
+                      <span class="date-a">{{ iMenuItem.description }}</span>
66
+                    </div>
67
+                    <br />
68
+                    <div class="card-category-b">
69
+                      <span class="category-b">
70
+                        <b>{{ iMenuItem.price }}</b>
71
+                      </span>
72
+                    </div>
73
+                  </div>
74
+                </div>
75
+              </div>
76
+            </div>
77
+          </div>
78
+        </div>
79
+      </div>
80
+    </div>
81
+    <div v-else>
82
+      <MenuOptions :showItem="CurrentOption" @CloseOptions="CloseOptions" />
83
+    </div>
84
+  </div>
85
+</template>
86
+
87
+<script>
88
+import { mapState, mapActions } from "vuex";
89
+import MenuOptions from "./menuOptions";
90
+
91
+export default {
92
+  name: "MenuLayout",
93
+  components: {
94
+    MenuOptions
95
+  },
96
+  data() {
97
+    return {
98
+      wait: true,
99
+      radio: "",
100
+      showOptions: false
101
+    };
102
+  },
103
+  methods: {
104
+    ...mapActions("homeMenu", ["getMenu", "getOptions"]),
105
+    ShowOptions(item) {
106
+      this.getOptions(item);
107
+      this.showOptions = true;
108
+    },
109
+    CloseOptions(value) {
110
+      this.showOptions = value;
111
+    }
112
+  },
113
+  computed: {
114
+    ...mapState("homeMenu", ["menu", "options"]),
115
+    CurrentOption() {
116
+      return this.options;
117
+    }
118
+  },
119
+  mounted() {
120
+    this.getMenu(this.$route.params.restautantid);
121
+  }
122
+  // watch: {
123
+  //   options: {
124
+  //     immediate: true,
125
+  //     handler(val, oldVal) {
126
+  //       if (val) this.options = val;
127
+  //     }
128
+  //   }
129
+  // }
130
+};
131
+</script>

+ 172
- 0
src/components/home/menuOptions.vue Vedi File

@@ -0,0 +1,172 @@
1
+<template>
2
+  <div class="container">
3
+    <div class="row" style="text-align:left">
4
+      <!--Column 1 -->
5
+      <div class="col-md-6" style="margin-bottomL 1em">
6
+        <div class="row" style="text-align:left">
7
+          <div class="carousel-item-c">
8
+            <div class="card-box-b card-shadow news-box">
9
+              <div class="img-box-b">
10
+                <img :src="item.image" alt class="img-b img-fluid" />
11
+              </div>
12
+              <div class="card-overlay">
13
+                <div class="card-header-b">
14
+                  <div class="card-title-b">
15
+                    <h2 class="title-2" style="color: #ffffff;">{{ item.name }}</h2>
16
+                  </div>
17
+                  <div class="card-date">
18
+                    <span class="date-a">{{ item.description }}</span>
19
+                  </div>
20
+                  <br />
21
+                  <div class="card-category-b">
22
+                    <span class="category-b">
23
+                      <b>{{ item.displayPrice }}</b>
24
+                    </span>
25
+                  </div>
26
+                </div>
27
+              </div>
28
+            </div>
29
+          </div>
30
+        </div>
31
+        <div class="row">
32
+          <div class="col-md-12" style="margin-top: 1em">
33
+            <div class="row">
34
+              <div class="col-sm-2">
35
+                <button
36
+                  @click="Minus()"
37
+                  class="btn btn-b-n"
38
+                  type="button"
39
+                  style="border-radius:50px"
40
+                >
41
+                  <eva-icon name="minus-outline" fill="white"></eva-icon>
42
+                </button>
43
+              </div>
44
+              <div class="col-sm-1">
45
+                <label style="margin-top: 0.5em">{{qty}}</label>
46
+              </div>
47
+              <div class="col-sm-2">
48
+                <button
49
+                  @click="Plus()"
50
+                  class="btn btn-b-n"
51
+                  type="button"
52
+                  style="border-radius:50px"
53
+                >
54
+                  <eva-icon name="plus-outline" fill="white"></eva-icon>
55
+                </button>
56
+              </div>
57
+              <div class="col-sm-2">
58
+                <label style="margin-top: 0.5em">
59
+                  <b>{{subTotal | toCurrency}}</b>
60
+                </label>
61
+              </div>
62
+            </div>
63
+          </div>
64
+        </div>
65
+      </div>
66
+      <!--Column 2 -->
67
+      <div class="col-md-6" style="margin-bottomL 1em">
68
+        <div class="row" style="text-align:left">
69
+          <div class="container" v-for="(item, i) in item.options" :key="i">
70
+            <div class="row">
71
+              <div class="col-sm-12">
72
+                <div class="title-box-d">
73
+                  <h3 class="title-d">{{ item.description }}</h3>
74
+                </div>
75
+              </div>
76
+            </div>
77
+            <div class="row">
78
+              <div class="col-sm-12">{{ item.subTitle }}</div>
79
+            </div>
80
+            <hr />
81
+            <div class="row" v-for="(choice, i) in item.options" :key="i">
82
+              <div class="col-sm-1">
83
+                <input
84
+                  v-if="item.optionType === 'Multiple' || item.optionType === 'MultipleLimit'"
85
+                  type="checkbox"
86
+                />
87
+                <input v-else type="radio" v-model="radio" :value="choice.description" />
88
+              </div>
89
+              <div class="col-sm-7">
90
+                <label>{{ choice.description }}</label>
91
+              </div>
92
+              <div class="col-sm-2" v-if="choice.price > 0">
93
+                <label>R {{ choice.price }}</label>
94
+              </div>
95
+            </div>
96
+            <hr />
97
+          </div>
98
+        </div>
99
+        <div class="row">
100
+          <div class="col-sm-12">
101
+            <label>Special Instructions</label>
102
+            <div class="input-group-prepend">
103
+              <textarea
104
+                class="form-control editor form-control-lg form-control-a"
105
+                v-model="item.specialInstructions"
106
+              />
107
+            </div>
108
+          </div>
109
+        </div>
110
+      </div>
111
+    </div>
112
+    <div class="row">
113
+      <br />
114
+    </div>
115
+
116
+    <div class="row">
117
+      <div class="col-md-12" style="margin-top: 1em">
118
+        <button @click="AddToCart()" class="btn btn-b-n" type="button">Add To Cart</button>
119
+      </div>
120
+    </div>
121
+    <div class="row">
122
+      <div class="col-md-12" style="margin-top: 1em">
123
+        <button @click="Close()" class="btn btn-b-n" type="button">Back</button>
124
+      </div>
125
+    </div>
126
+  </div>
127
+</template>
128
+
129
+<script>
130
+export default {
131
+  name: "MenuOptions",
132
+  props: {
133
+    showItem: { default: {} }
134
+  },
135
+  data() {
136
+    return {
137
+      wait: true,
138
+      radio: "",
139
+      item: {},
140
+      qty: 1,
141
+      subTotal: 0
142
+    };
143
+  },
144
+  methods: {
145
+    Close() {
146
+      this.$emit("CloseOptions", false);
147
+    },
148
+    Plus() {
149
+      this.qty = this.qty + 1;
150
+      this.subTotal = this.item.price * this.qty;
151
+    },
152
+    Minus() {
153
+      this.qty = this.qty - 1;
154
+      if (this.qty === 0) {
155
+        this.qty = 1;
156
+      }
157
+      this.subTotal = this.item.price * this.qty;
158
+    }
159
+  },
160
+  watch: {
161
+    showItem: {
162
+      immediate: true,
163
+      handler(val, oldVal) {
164
+        if (val) {
165
+          this.item = val;
166
+          this.subTotal = this.item.price;
167
+        }
168
+      }
169
+    }
170
+  }
171
+};
172
+</script>

+ 4
- 4
src/components/home/restaurantsSection.vue Vedi File

@@ -3,7 +3,7 @@
3 3
     <div class="form-group row"></div>
4 4
     <div class="form-group row">
5 5
       <div class="col-md-4" v-for="restaurant in restaurants" :key="restaurant.id">
6
-        <router-link :to="'/Search'">
6
+        <router-link :to="`/Menu/${restaurant.id}`">
7 7
           <div class="card-box-a card-shadow">
8 8
             <div class="img-box-a">
9 9
               <img
@@ -24,14 +24,14 @@
24 24
                     </router-link>
25 25
                   </h2>
26 26
                   <h3 class="card-title-b">
27
-                    <router-link :to="'/Search'" class="link-a">
27
+                    <router-link :to="`/Menu/${restaurant.id}`" class="link-a">
28 28
                       {{
29 29
                       restaurant.suburb
30 30
                       }}
31 31
                     </router-link>
32 32
                   </h3>
33 33
                   <h4 class="card-title-c">
34
-                    <router-link :to="'/Search'" class="link-a">
34
+                    <router-link :to="`/Menu/${restaurant.id}`" class="link-a">
35 35
                       {{
36 36
                       restaurant.subText
37 37
                       }}
@@ -40,7 +40,7 @@
40 40
                 </div>
41 41
                 <div class="card-body-a">
42 42
                   <div class="price-box d-flex"></div>
43
-                  <router-link :to="'/Search'" class="link-a">
43
+                  <router-link :to="`/Menu/${restaurant.id}`" class="link-a">
44 44
                     <span class="ion-ios-arrow-forward"></span>
45 45
                   </router-link>
46 46
                 </div>

+ 4
- 2
src/components/restaurants/restaurantDetails.vue Vedi File

@@ -378,6 +378,7 @@ import ListView from "../shared/listView";
378 378
 import Categories from "../restaurants/restaurantCategorySelect";
379 379
 import TradingHours from "../accounts/tradingHours";
380 380
 import ImageUploader from "vue-image-upload-resize";
381
+import Log from "../../assets/Log";
381 382
 
382 383
 export default {
383 384
   name: "RestaurantDetails",
@@ -399,7 +400,8 @@ export default {
399 400
       ],
400 401
       wait: false,
401 402
       selectedMops: [],
402
-      hasImage: false
403
+      hasImage: false,
404
+      restaurantId: Log.restaurantId()
403 405
     };
404 406
   },
405 407
   methods: {
@@ -506,7 +508,7 @@ export default {
506 508
   },
507 509
   mounted() {
508 510
     this.wait = false;
509
-    this.getRestaurant(5);
511
+    this.getRestaurant(this.restaurantId);
510 512
   },
511 513
   watch: {
512 514
     SavedMops() {

+ 89
- 0
src/components/restaurants/restaurantMenu.vue Vedi File

@@ -0,0 +1,89 @@
1
+<template>
2
+  <div>
3
+    <div class="container">
4
+      <div class="container">
5
+        <div class="row">
6
+          <div class="col-md-12 col-lg-8">
7
+            <div class="title-box-d">
8
+              <br />
9
+              <h1 class="title-d" style="text-align:left; font-size: 250%">Menu</h1>
10
+            </div>
11
+          </div>
12
+        </div>
13
+      </div>
14
+    </div>
15
+    <div class="container">
16
+      <div class="form-group row">
17
+        <div class="col-md-12">
18
+          <ListView
19
+            :items="menuItems"
20
+            :showColumnChooser="false"
21
+            :editable="true"
22
+            :deleteable="true"
23
+            :displayColumns="columns"
24
+            :displayFormats="formats"
25
+            @onEdit="Edit"
26
+            @onDelete="Delete"
27
+            @onNew="New"
28
+          />
29
+        </div>
30
+      </div>
31
+      <div v-if="wait" id="preloader"></div>
32
+    </div>
33
+  </div>
34
+</template>
35
+
36
+<script>
37
+import MenuItem from "../restaurants/restaurantMenuItem";
38
+import ListView from "../shared/listView";
39
+import { mapState, mapActions } from "vuex";
40
+import Log from "../../assets/Log";
41
+
42
+export default {
43
+  name: "RestaurantMenu",
44
+  components: {
45
+    ListView,
46
+    MenuItem
47
+  },
48
+  data() {
49
+    return {
50
+      wait: true,
51
+      menu: {},
52
+      columns: ["category", "name", "description", "price", "image"],
53
+      formats: ["", "", "", "money", "image"],
54
+      restaurantId: Log.restaurantId()
55
+    };
56
+  },
57
+  methods: {
58
+    ...mapActions("menu", ["getMenuItems", "deleteMenuItem"]),
59
+    New() {
60
+      // this.menu = this.menuItem;
61
+      // this.$modal.show("Menu");
62
+      this.$router.push("/MenuItem/0");
63
+    },
64
+    Edit(item) {
65
+      this.menu = item;
66
+      this.$router.push("/MenuItem/" + item.id);
67
+    },
68
+    Delete(item) {
69
+      this.wait = true;
70
+      this.deleteMenuItem(item);
71
+
72
+      this.getMenuItems(this.restaurantId).then(() => {
73
+        this.wait = false;
74
+      });
75
+    }
76
+  },
77
+  computed: {
78
+    ...mapState("menu", ["menuItem", "menuItems"]),
79
+    CurrentMenu() {
80
+      return this.menu;
81
+    }
82
+  },
83
+  mounted() {
84
+    this.getMenuItems(this.restaurantId).then(() => {
85
+      this.wait = false;
86
+    });
87
+  }
88
+};
89
+</script>

+ 5
- 3
src/components/restaurants/restaurantMenuCategories.vue Vedi File

@@ -39,6 +39,7 @@
39 39
 import Category from "../restaurants/restaurantMenuCateory";
40 40
 import ListView from "../shared/listView";
41 41
 import { mapState, mapActions } from "vuex";
42
+import Log from "../../assets/Log";
42 43
 
43 44
 export default {
44 45
   name: "RestaurantCategoryList",
@@ -50,7 +51,8 @@ export default {
50 51
     return {
51 52
       wait: true,
52 53
       category: {},
53
-      columns: ["id", "description"]
54
+      columns: ["description"],
55
+      restaurantId: Log.restaurantId()
54 56
     };
55 57
   },
56 58
   methods: {
@@ -72,7 +74,7 @@ export default {
72 74
       this.deleteCategory(item.id);
73 75
     },
74 76
     CategoryUpdate(item) {
75
-      item.restaurantId = 5;
77
+      item.restaurantId = this.restaurantId;
76 78
       if (item.id == 0) {
77 79
         this.addCategory(item);
78 80
       } else {
@@ -88,7 +90,7 @@ export default {
88 90
     }
89 91
   },
90 92
   mounted() {
91
-    this.getCategories(5).then(() => {
93
+    this.getCategories(this.restaurantId).then(() => {
92 94
       this.wait = false;
93 95
     });
94 96
   }

+ 240
- 0
src/components/restaurants/restaurantMenuItem.vue Vedi File

@@ -0,0 +1,240 @@
1
+<template>
2
+  <div>
3
+    <div class="container">
4
+      <div class="container">
5
+        <div class="row">
6
+          <div class="col-md-12 col-lg-8">
7
+            <div class="title-box-d">
8
+              <br />
9
+              <h1 class="title-d" style="text-align:left; font-size: 250%">Menu Item</h1>
10
+            </div>
11
+          </div>
12
+        </div>
13
+      </div>
14
+    </div>
15
+    <div class="container" v-if="!showOption">
16
+      <div class="row" style="text-align:left">
17
+        <div class="col-md-6" style="margin-bottom: 1em">
18
+          <label>Category</label>
19
+          <div class="input-group-prepend">
20
+            <span class="input-group-text">
21
+              <eva-icon name="credit-card-outline" fill="#24aae1"></eva-icon>
22
+            </span>
23
+            <select class="form-control" v-model="menuItem.category">
24
+              <option v-for="(cat, i) in categories" :key="i">
25
+                {{
26
+                cat.description
27
+                }}
28
+              </option>
29
+            </select>
30
+          </div>
31
+        </div>
32
+      </div>
33
+      <div class="row" style="text-align:left">
34
+        <div class="col-md-6" style="margin-bottom: 1em">
35
+          <label>Name</label>
36
+          <div class="input-group-prepend">
37
+            <span class="input-group-text">
38
+              <eva-icon name="credit-card-outline" fill="#24aae1"></eva-icon>
39
+            </span>
40
+            <input class="form-control" type="text" v-model="menuItem.name" />
41
+          </div>
42
+        </div>
43
+      </div>
44
+      <div class="row" style="text-align:left">
45
+        <div class="col-md-6" style="margin-bottom: 1em">
46
+          <label>Description</label>
47
+          <div class="input-group-prepend">
48
+            <span class="input-group-text">
49
+              <eva-icon name="credit-card-outline" fill="#24aae1"></eva-icon>
50
+            </span>
51
+            <input class="form-control" type="text" v-model="menuItem.description" />
52
+          </div>
53
+        </div>
54
+      </div>
55
+      <div class="row" style="text-align:left">
56
+        <div class="col-md-6" style="margin-bottom: 1em">
57
+          <label>Price</label>
58
+          <div class="input-group-prepend">
59
+            <span class="input-group-text">
60
+              <eva-icon name="credit-card-outline" fill="#24aae1"></eva-icon>
61
+            </span>
62
+            <input class="form-control" type="number" v-model="menuItem.price" />
63
+          </div>
64
+        </div>
65
+      </div>
66
+      <div v-if="!menuItem.image" class="row" style="text-align:left">
67
+        <div class="col-md-6" style="margin-bottom: 1em">
68
+          <label>Image</label>
69
+          <div class="input-group-prepend">
70
+            <image-uploader
71
+              :preview="true"
72
+              :className="['fileinput', { 'fileinput--loaded': hasImage }]"
73
+              capture="environment"
74
+              :debug="1"
75
+              doNotResize="gif"
76
+              :autoRotate="true"
77
+              outputFormat="verbose"
78
+              @input="setImage"
79
+            >
80
+              <label for="fileInput" slot="upload-label">
81
+                <figure>
82
+                  <path
83
+                    class="path1"
84
+                    d="M9.5 19c0 3.59 2.91 6.5 6.5 6.5s6.5-2.91 6.5-6.5-2.91-6.5-6.5-6.5-6.5 2.91-6.5 6.5zM30 8h-7c-0.5-2-1-4-3-4h-8c-2 0-2.5 2-3 4h-7c-1.1 0-2 0.9-2 2v18c0 1.1 0.9 2 2 2h28c1.1 0 2-0.9 2-2v-18c0-1.1-0.9-2-2-2zM16 27.875c-4.902 0-8.875-3.973-8.875-8.875s3.973-8.875 8.875-8.875c4.902 0 8.875 3.973 8.875 8.875s-3.973 8.875-8.875 8.875zM30 14h-4v-2h4v2z"
85
+                  ></path>
86
+                </figure>
87
+              </label>
88
+            </image-uploader>
89
+          </div>
90
+        </div>
91
+      </div>
92
+      <div v-else class="row" style="text-align:left">
93
+        <div class="col-md-6" style="margin-bottom: 1em">
94
+          <img :src="menuItem.image" style="height:100px; width:100px; object-fit: cover;" />
95
+          <br />
96
+          <span class="input-group-text" align="center" style="width:100px" @click="removeImage()">
97
+            <eva-icon name="trash-2-outline" fill="#24aae1"></eva-icon>Delete
98
+          </span>
99
+        </div>
100
+      </div>
101
+      <div class="row" style="text-align:left" v-if="1 === 2">
102
+        <div class="col-md-12" style="margin-bottom: 1em">
103
+          <div class="custom-control custom-switch">
104
+            <label>Override Options</label>
105
+            <input
106
+              style="margin-left: 1px"
107
+              type="checkbox"
108
+              class="custom-control-input"
109
+              id="thCloseSwitch"
110
+              :checked="menuItem.overrideOptions"
111
+              @change="selectionChanged"
112
+            />
113
+            <label
114
+              class="custom-control-label"
115
+              for="thCloseSwitch"
116
+              style="margin-left: 40px"
117
+            >{{menuItem.overrideOptions ? 'Yes - This will override any menu options set on the category' : 'No - This will append category options to the below options'}}</label>
118
+          </div>
119
+        </div>
120
+      </div>
121
+      <div class="row" style="text-align:left" v-if="1 === 2">
122
+        <div class="col-md-12" style="margin-bottomL 1em">
123
+          <label>Options</label>
124
+          <ListView
125
+            :items="menuItem.options"
126
+            @onEdit="OptionEdit"
127
+            @onDelete="OptionDelete"
128
+            @onNew="OptionNew"
129
+          />
130
+        </div>
131
+      </div>
132
+      <div class="row"></div>
133
+      <div class="row">
134
+        <div class="col-md-12" style="margin-bottomL 1em">
135
+          <div class="row offset-md-5">
136
+            <div class="col-md-2">
137
+              <button @click="Save()" class="btn btn-b-n" type="button" data-dismiss="modal">Save</button>
138
+            </div>
139
+            <div class="col-md-2">
140
+              <button @click="Close()" class="btn btn-b-n" type="button" data-dismiss="modal">Close</button>
141
+            </div>
142
+          </div>
143
+        </div>
144
+      </div>
145
+      <div v-if="wait" id="preloader"></div>
146
+    </div>
147
+    <div v-else class="containers">
148
+      <ItemOption @Close="CloseOptions" :menuOption="CurrentOption" />
149
+    </div>
150
+  </div>
151
+</template>
152
+
153
+<script>
154
+import { mapState, mapActions } from "vuex";
155
+import Log from "../../assets/Log";
156
+import ImageUploader from "vue-image-upload-resize";
157
+import ListView from "../shared/listView";
158
+import ItemOption from "./restaurantMenuItemOptions";
159
+
160
+export default {
161
+  name: "MenuItem",
162
+  components: {
163
+    ImageUploader,
164
+    ListView,
165
+    ItemOption
166
+  },
167
+  data() {
168
+    return {
169
+      wait: false,
170
+      hasImage: false,
171
+      restaurantId: Log.restaurantId(),
172
+      showOption: false,
173
+      menuOption: {}
174
+    };
175
+  },
176
+  methods: {
177
+    ...mapActions("menuCategories", ["getCategories"]),
178
+    ...mapActions("menu", ["getMenuItem", "insertMenuItem", "updateMenuItem"]),
179
+    Save() {
180
+      //this.wait = true;
181
+      this.menuItem.restaurantId = this.restaurantId;
182
+      if (this.menuItem.category !== "") {
183
+        var category = this.categories.find(
184
+          c => c.description === this.menuItem.category
185
+        );
186
+        this.menuItem.categoryId = category.id;
187
+      }
188
+      console.log(JSON.stringify(this.menuItem));
189
+
190
+      this.insertMenuItem(this.menuItem).then(fulfilled => {
191
+        this.$router.push("/RestaurantMenu");
192
+      });
193
+    },
194
+    Close() {
195
+      this.$router.push("/RestaurantMenu");
196
+    },
197
+    setImage: function(output) {
198
+      this.hasImage = true;
199
+      this.menuItem.image = output.dataUrl;
200
+    },
201
+    removeImage() {
202
+      this.hasImage = false;
203
+      this.menuItem.image = null;
204
+    },
205
+    selectionChanged() {
206
+      this.menuItem.overrideOptions = !this.menuItem.overrideOptions;
207
+    },
208
+    OptionNew() {
209
+      //new
210
+      this.menuOption = {};
211
+      this.menuOption.options = [];
212
+      this.showOption = true;
213
+    },
214
+    OptionEdit(item) {
215
+      //edit
216
+    },
217
+    OptionDelete(item) {
218
+      //delete
219
+    },
220
+    CloseOptions(item) {
221
+      if (item) {
222
+        this.showOption = false;
223
+      }
224
+    }
225
+  },
226
+  computed: {
227
+    ...mapState("menuCategories", ["categories"]),
228
+    ...mapState("menu", ["menuItem"]),
229
+    CurrentOption() {
230
+      return this.menuOption;
231
+    }
232
+  },
233
+  mounted() {
234
+    this.wait = true;
235
+    this.getCategories(this.restaurantId);
236
+    this.getMenuItem(this.$route.params.itemid);
237
+    this.wait = false;
238
+  }
239
+};
240
+</script>

+ 203
- 0
src/components/restaurants/restaurantMenuItemOptions.vue Vedi File

@@ -0,0 +1,203 @@
1
+<template>
2
+  <div class="container">
3
+    <div class="row">
4
+      <div class="col-md-12" style="margin-bottom: 1em">
5
+        <h1>Menu Option</h1>
6
+      </div>
7
+    </div>
8
+    <div class="row" style="text-align:left">
9
+      <div class="col-md-6" style="margin-bottom: 1em">
10
+        <label>Description</label>
11
+        <div class="input-group-prepend">
12
+          <span class="input-group-text">
13
+            <eva-icon name="credit-card-outline" fill="#24aae1"></eva-icon>
14
+          </span>
15
+          <input class="form-control" type="text" v-model="menuOption.description" />
16
+        </div>
17
+      </div>
18
+    </div>
19
+    <div class="row" style="text-align:left">
20
+      <div class="col-md-6" style="margin-bottom: 1em">
21
+        <label>Option Type</label>
22
+        <div class="input-group-prepend">
23
+          <span class="input-group-text">
24
+            <eva-icon name="credit-card-outline" fill="#24aae1"></eva-icon>
25
+          </span>
26
+          <select class="form-control" v-model="menuOption.optionType">
27
+            <option v-for="item in optionTypes" :value="item.id" :key="item.id">{{item.description}}</option>
28
+          </select>
29
+        </div>
30
+      </div>
31
+      <div class="col-md-6" style="margin-bottom: 1em" v-if="menuOption.optionType === 3">
32
+        <label>Option Limit</label>
33
+        <div class="input-group-prepend">
34
+          <span class="input-group-text">
35
+            <eva-icon name="credit-card-outline" fill="#24aae1"></eva-icon>
36
+          </span>
37
+          <input class="form-control" type="number" v-model="menuOption.optionLimit" />
38
+        </div>
39
+      </div>
40
+    </div>
41
+    <div class="row" style="text-align:left">
42
+      <div class="col-md-6" style="margin-bottom: 1em">
43
+        <label>Is Base Price?</label>
44
+        <div class="input-group-prepend">
45
+          <input
46
+            style="margin-left: 1px"
47
+            type="checkbox"
48
+            class="custom-control-input"
49
+            id="thCloseSwitch"
50
+            :checked="menuOption.isBasePrice"
51
+            @change="selectionChanged"
52
+          />
53
+          <label
54
+            class="custom-control-label"
55
+            for="thCloseSwitch"
56
+            style="margin-left: 40px"
57
+          >{{menuOption.isBasePrice ? 'Yes' : 'No'}}</label>
58
+        </div>
59
+      </div>
60
+    </div>
61
+    <div class="row" style="text-align:left">
62
+      <div class="col-md-6" style="margin-bottom: 1em">
63
+        <label>Rank</label>
64
+        <div class="input-group-prepend">
65
+          <span class="input-group-text">
66
+            <eva-icon name="credit-card-outline" fill="#24aae1"></eva-icon>
67
+          </span>
68
+          <input class="form-control" type="number" v-model="menuOption.rank" />
69
+        </div>
70
+      </div>
71
+    </div>
72
+    <div class="row" style="text-align:left">
73
+      <div class="col-md-12" style="margin-bottom: 1em">
74
+        <label>Options</label>
75
+        <ListView
76
+          :items="menuOption.options"
77
+          :showColumnChooser="false"
78
+          :editable="true"
79
+          :deleteable="true"
80
+          :displayColumns="columns"
81
+          @onEdit="Edit"
82
+          @onDelete="Delete"
83
+          @onNew="New"
84
+        />
85
+        <modal name="OptionItem" :width="600" :height="400">
86
+          <OptionItem @MenuItemUpdated="MenuItemUpdated" :editMenuOptionItem="selectedItem" />
87
+        </modal>
88
+      </div>
89
+    </div>
90
+    <div class="row"></div>
91
+    <div class="row">
92
+      <div class="col-md-12" style="margin-bottomL 1em">
93
+        <div class="row offset-md-5">
94
+          <div class="col-md-2">
95
+            <button @click="Save()" class="btn btn-b-n" type="button" data-dismiss="modal">Save</button>
96
+          </div>
97
+          <div class="col-md-2">
98
+            <button @click="Close()" class="btn btn-b-n" type="button" data-dismiss="modal">Close</button>
99
+          </div>
100
+        </div>
101
+      </div>
102
+    </div>
103
+    <div v-if="wait" id="preloader"></div>
104
+  </div>
105
+</template>
106
+
107
+<script>
108
+import ListView from "../shared/listView";
109
+import { mapState, mapActions } from "vuex";
110
+import OptionItem from "./restaurantMenuOptionItem";
111
+import Log from "../../assets/Log";
112
+
113
+export default {
114
+  name: "MenuOption",
115
+  components: {
116
+    ListView,
117
+    OptionItem
118
+  },
119
+  props: {
120
+    menuOption: { default: {} }
121
+  },
122
+  data() {
123
+    return {
124
+      selectedOption: "Single",
125
+      selectedItem: {},
126
+      isEdit: false,
127
+      columns: ["description", "price", "rank"],
128
+      wait: false,
129
+      restaurantId: Log.restaurantId(),
130
+      menuItemId: 0
131
+    };
132
+  },
133
+  methods: {
134
+    ...mapActions("menuOptions", ["getOptionTypes"]),
135
+    selectionChanged() {
136
+      this.menuOption.isBasePrice = !this.menuOption.isBasePrice;
137
+    },
138
+    Close() {
139
+      this.$emit("Close", true);
140
+    },
141
+    Save() {
142
+      //this.wait = true;
143
+      alert(JSON.stringify(this.menuOption));
144
+      //   if (this.menuOption.categoryDescription !== "All") {
145
+      //     var category = this.categories.find(
146
+      //       c => c.description === this.menuOption.categoryDescription
147
+      //     );
148
+      //     this.menuOption.categoryId = category.id;
149
+      //   } else {
150
+      //     this.menuOption.categoryId = 0;
151
+      //   }
152
+
153
+      //   if (this.menuOption.id === 0) {
154
+      //     this.addMenuOption(this.menuOption).then(result => {
155
+      //       this.$router.push("/MenuOptions");
156
+      //     });
157
+      //   } else {
158
+      //     this.updateMenuOption(this.menuOption);
159
+      //     this.$router.push("/MenuOptions");
160
+      //   }
161
+    },
162
+    New() {
163
+      this.selectedItem = null;
164
+      this.$modal.show("OptionItem");
165
+    },
166
+    Edit(item) {
167
+      this.isEdit = true;
168
+      this.selectedItem = item;
169
+      this.$modal.show("OptionItem");
170
+    },
171
+    Delete(item) {
172
+      this.deleteMenuOptionItem(item);
173
+    },
174
+    MenuItemUpdated(item) {
175
+      //alert(JSON.stringify(item));
176
+      item.menuOptionId = this.menuOption.id;
177
+      if (this.isEdit) {
178
+        this.menuOption.options.push(item);
179
+      }
180
+
181
+      this.$modal.hide("OptionItem");
182
+      this.isEdit = false;
183
+    }
184
+  },
185
+  computed: {
186
+    ...mapState("menuOptions", ["optionTypes"])
187
+  },
188
+  mounted() {
189
+    this.wait = false;
190
+    this.getOptionTypes();
191
+  },
192
+  watch: {
193
+    menuOption: {
194
+      immediate: true,
195
+      handler(val, oldVal) {
196
+        if (val) {
197
+          this.menuOption = val;
198
+        }
199
+      }
200
+    }
201
+  }
202
+};
203
+</script>

+ 217
- 0
src/components/restaurants/restaurantMenuOption.vue Vedi File

@@ -0,0 +1,217 @@
1
+<template>
2
+  <div class="container">
3
+    <div class="row">
4
+      <div class="col-md-12" style="margin-bottom: 1em">
5
+        <h1>Menu Option</h1>
6
+      </div>
7
+    </div>
8
+    <div class="row" style="text-align:left">
9
+      <div class="col-md-6" style="margin-bottom: 1em">
10
+        <label>Menu Category</label>
11
+        <div class="input-group-prepend">
12
+          <span class="input-group-text">
13
+            <eva-icon name="credit-card-outline" fill="#24aae1"></eva-icon>
14
+          </span>
15
+          <select class="form-control" v-model="menuOption.categoryDescription">
16
+            <option>All</option>
17
+            <option v-for="(cat, i) in categories" :key="i">
18
+              {{
19
+              cat.description
20
+              }}
21
+            </option>
22
+          </select>
23
+        </div>
24
+      </div>
25
+    </div>
26
+    <div class="row" style="text-align:left">
27
+      <div class="col-md-6" style="margin-bottom: 1em">
28
+        <label>Description</label>
29
+        <div class="input-group-prepend">
30
+          <span class="input-group-text">
31
+            <eva-icon name="credit-card-outline" fill="#24aae1"></eva-icon>
32
+          </span>
33
+          <input class="form-control" type="text" v-model="menuOption.description" />
34
+        </div>
35
+      </div>
36
+    </div>
37
+    <div class="row" style="text-align:left">
38
+      <div class="col-md-6" style="margin-bottom: 1em">
39
+        <label>Option Type</label>
40
+        <div class="input-group-prepend">
41
+          <span class="input-group-text">
42
+            <eva-icon name="credit-card-outline" fill="#24aae1"></eva-icon>
43
+          </span>
44
+          <select class="form-control" v-model="menuOption.optionType">
45
+            <option v-for="item in optionTypes" :value="item.id" :key="item.id">{{item.description}}</option>
46
+          </select>
47
+        </div>
48
+      </div>
49
+      <div class="col-md-6" style="margin-bottom: 1em" v-if="menuOption.optionType === 3">
50
+        <label>Option Limit</label>
51
+        <div class="input-group-prepend">
52
+          <span class="input-group-text">
53
+            <eva-icon name="credit-card-outline" fill="#24aae1"></eva-icon>
54
+          </span>
55
+          <input class="form-control" type="number" v-model="menuOption.optionLimit" />
56
+        </div>
57
+      </div>
58
+    </div>
59
+    <div class="row" style="text-align:left">
60
+      <div class="col-md-6" style="margin-bottom: 1em">
61
+        <label>Is Base Price?</label>
62
+        <div class="input-group-prepend">
63
+          <input
64
+            style="margin-left: 1px"
65
+            type="checkbox"
66
+            class="custom-control-input"
67
+            id="thCloseSwitch"
68
+            :checked="menuOption.isBasePrice"
69
+            @change="selectionChanged"
70
+          />
71
+          <label
72
+            class="custom-control-label"
73
+            for="thCloseSwitch"
74
+            style="margin-left: 40px"
75
+          >{{menuOption.isBasePrice ? 'Yes' : 'No'}}</label>
76
+        </div>
77
+      </div>
78
+    </div>
79
+    <div class="row" style="text-align:left">
80
+      <div class="col-md-6" style="margin-bottom: 1em">
81
+        <label>Rank</label>
82
+        <div class="input-group-prepend">
83
+          <span class="input-group-text">
84
+            <eva-icon name="credit-card-outline" fill="#24aae1"></eva-icon>
85
+          </span>
86
+          <input class="form-control" type="number" v-model="menuOption.rank" />
87
+        </div>
88
+      </div>
89
+    </div>
90
+    <div class="row" style="text-align:left">
91
+      <div class="col-md-12" style="margin-bottom: 1em">
92
+        <label>Options</label>
93
+        <ListView
94
+          :items="menuOption.options"
95
+          :showColumnChooser="false"
96
+          :editable="true"
97
+          :deleteable="true"
98
+          :displayColumns="columns"
99
+          @onEdit="Edit"
100
+          @onDelete="Delete"
101
+          @onNew="New"
102
+        />
103
+        <modal name="OptionItem" :width="600" :height="400">
104
+          <OptionItem @MenuItemUpdated="MenuItemUpdated" :editMenuOptionItem="selectedItem" />
105
+        </modal>
106
+      </div>
107
+    </div>
108
+    <div class="row"></div>
109
+    <div class="row">
110
+      <div class="col-md-12" style="margin-bottomL 1em">
111
+        <div class="row offset-md-5">
112
+          <div class="col-md-2">
113
+            <button @click="Save()" class="btn btn-b-n" type="button" data-dismiss="modal">Save</button>
114
+          </div>
115
+          <div class="col-md-2">
116
+            <button @click="Close()" class="btn btn-b-n" type="button" data-dismiss="modal">Close</button>
117
+          </div>
118
+        </div>
119
+      </div>
120
+    </div>
121
+    <div v-if="wait" id="preloader"></div>
122
+  </div>
123
+</template>
124
+
125
+<script>
126
+import ListView from "../shared/listView";
127
+import { mapState, mapActions } from "vuex";
128
+import OptionItem from "./restaurantMenuOptionItem";
129
+import Log from "../../assets/Log";
130
+
131
+export default {
132
+  name: "MenuOption",
133
+  components: {
134
+    ListView,
135
+    OptionItem
136
+  },
137
+  data() {
138
+    return {
139
+      selectedOption: "Single",
140
+      selectedItem: {},
141
+      isEdit: false,
142
+      columns: ["description", "price", "rank"],
143
+      wait: false,
144
+      restaurantId: Log.restaurantId(),
145
+      menuItemId: 0
146
+    };
147
+  },
148
+  methods: {
149
+    ...mapActions("menuOptions", [
150
+      "getMenuOption",
151
+      "deleteMenuOptionItem",
152
+      "addMenuOption",
153
+      "updateMenuOption",
154
+      "getOptionTypes"
155
+    ]),
156
+    ...mapActions("menuCategories", ["getCategories"]),
157
+    selectionChanged() {
158
+      this.menuOption.isBasePrice = !this.menuOption.isBasePrice;
159
+    },
160
+    Close() {
161
+      this.$router.push("/MenuOptions");
162
+    },
163
+    Save() {
164
+      this.wait = true;
165
+      if (this.menuOption.categoryDescription !== "All") {
166
+        var category = this.categories.find(
167
+          c => c.description === this.menuOption.categoryDescription
168
+        );
169
+        this.menuOption.categoryId = category.id;
170
+      } else {
171
+        this.menuOption.categoryId = 0;
172
+      }
173
+      alert(JSON.stringify(this.menuOption));
174
+      // if (this.menuOption.id === 0) {
175
+      //   this.addMenuOption(this.menuOption).then(result => {
176
+      //     this.$router.push("/MenuOptions");
177
+      //   });
178
+      // } else {
179
+      //   this.updateMenuOption(this.menuOption);
180
+      //   this.$router.push("/MenuOptions");
181
+      // }
182
+    },
183
+    New() {
184
+      this.selectedItem = null;
185
+      this.$modal.show("OptionItem");
186
+    },
187
+    Edit(item) {
188
+      this.isEdit = true;
189
+      this.selectedItem = item;
190
+      this.$modal.show("OptionItem");
191
+    },
192
+    Delete(item) {
193
+      this.deleteMenuOptionItem(item);
194
+    },
195
+    MenuItemUpdated(item) {
196
+      item.menuOptionId = this.menuOption.id;
197
+      if (item.id === 0 && !this.isEdit) {
198
+        this.menuOption.options.push(item);
199
+      }
200
+
201
+      this.$modal.hide("OptionItem");
202
+      this.isEdit = false;
203
+    }
204
+  },
205
+  computed: {
206
+    ...mapState("menuOptions", ["menuOption", "optionTypes"]),
207
+    ...mapState("menuCategories", ["categories"])
208
+  },
209
+  mounted() {
210
+    this.wait = false;
211
+    this.getCategories(this.restaurantId);
212
+    this.getMenuOption(this.$route.params.optionid);
213
+    this.menuItemId = this.$route.params.menuItemId;
214
+    this.getOptionTypes();
215
+  }
216
+};
217
+</script>

+ 106
- 0
src/components/restaurants/restaurantMenuOptionItem.vue Vedi File

@@ -0,0 +1,106 @@
1
+<template>
2
+  <div class="container">
3
+    <div class="row">
4
+      <div class="col-md-12" style="margin-bottom: 1em">
5
+        <h1>Option Item</h1>
6
+      </div>
7
+    </div>
8
+    <div class="row" style="text-align:left">
9
+      <div class="col-md-12" style="margin-bottom: 1em">
10
+        <label>Description</label>
11
+        <div class="input-group-prepend">
12
+          <span class="input-group-text">
13
+            <eva-icon name="credit-card-outline" fill="#24aae1"></eva-icon>
14
+          </span>
15
+          <input
16
+            class="form-control"
17
+            type="text"
18
+            name="description"
19
+            v-model="menuOptionItem.description"
20
+          />
21
+        </div>
22
+      </div>
23
+    </div>
24
+    <div class="row" style="text-align:left">
25
+      <div class="col-md-12" style="margin-bottom: 1em">
26
+        <label>Price</label>
27
+        <div class="input-group-prepend">
28
+          <span class="input-group-text">
29
+            <eva-icon name="credit-card-outline" fill="#24aae1"></eva-icon>
30
+          </span>
31
+          <input
32
+            class="form-control"
33
+            type="number"
34
+            name="description"
35
+            v-model="menuOptionItem.price"
36
+          />
37
+        </div>
38
+      </div>
39
+    </div>
40
+    <div class="row" style="text-align:left">
41
+      <div class="col-md-12" style="margin-bottom: 1em">
42
+        <label>Rank</label>
43
+        <div class="input-group-prepend">
44
+          <span class="input-group-text">
45
+            <eva-icon name="credit-card-outline" fill="#24aae1"></eva-icon>
46
+          </span>
47
+          <input
48
+            class="form-control"
49
+            type="number"
50
+            name="description"
51
+            v-model="menuOptionItem.rank"
52
+          />
53
+        </div>
54
+      </div>
55
+    </div>
56
+    <div class="row"></div>
57
+    <div class="row">
58
+      <div class="col-md-12" style="margin-bottom: 1em">
59
+        <div class="input-group-prepend">
60
+          <b-button class="btn btn-b-n" @click="Ok">Ok</b-button>
61
+        </div>
62
+      </div>
63
+    </div>
64
+  </div>
65
+</template>
66
+
67
+<script>
68
+import ImageUploader from "vue-image-upload-resize";
69
+
70
+export default {
71
+  name: "MenuOptionItem",
72
+  props: {
73
+    editMenuOptionItem: { default: {} }
74
+  },
75
+  components: {
76
+    ImageUploader
77
+  },
78
+  data() {
79
+    return {
80
+      hasImage: false,
81
+      menuOptionItem: {
82
+        id: 0,
83
+        description: "",
84
+        price: 0,
85
+        rank: 0,
86
+        menuOptionId: 0
87
+      }
88
+    };
89
+  },
90
+  methods: {
91
+    Ok() {
92
+      this.$emit("MenuItemUpdated", this.menuOptionItem);
93
+    }
94
+  },
95
+  watch: {
96
+    editMenuOptionItem: {
97
+      immediate: true,
98
+      handler(val, oldVal) {
99
+        if (val) {
100
+          this.menuOptionItem = val;
101
+        }
102
+      }
103
+    }
104
+  }
105
+};
106
+</script>

+ 94
- 0
src/components/restaurants/restaurantMenuOptions.vue Vedi File

@@ -0,0 +1,94 @@
1
+<template>
2
+  <div>
3
+    <div class="container">
4
+      <div class="container">
5
+        <div class="row">
6
+          <div class="col-md-12 col-lg-8">
7
+            <div class="title-box-d">
8
+              <br />
9
+              <h1 class="title-d" style="text-align:left; font-size: 250%">Menu Options</h1>
10
+            </div>
11
+          </div>
12
+        </div>
13
+      </div>
14
+    </div>
15
+    <div class="container">
16
+      <div class="form-group row">
17
+        <div class="col-md-12">
18
+          <ListView
19
+            :items="menuOptions"
20
+            :showColumnChooser="false"
21
+            :editable="true"
22
+            :deleteable="true"
23
+            :displayColumns="columns"
24
+            :displayHeaders="headers"
25
+            @onEdit="Edit"
26
+            @onDelete="Delete"
27
+            @onNew="New"
28
+          />
29
+        </div>
30
+      </div>
31
+      <div v-if="wait" id="preloader"></div>
32
+    </div>
33
+  </div>
34
+</template>
35
+
36
+<script>
37
+import Category from "../restaurants/restaurantMenuCateory";
38
+import ListView from "../shared/listView";
39
+import { mapState, mapActions } from "vuex";
40
+import Log from "../../assets/Log";
41
+
42
+export default {
43
+  name: "RestaurantCategoryList",
44
+  components: {
45
+    ListView,
46
+    Category
47
+  },
48
+  data() {
49
+    return {
50
+      wait: true,
51
+      columns: [
52
+        "categoryDescription",
53
+        "description",
54
+        "optionTypeDescription",
55
+        "optionLimit",
56
+        "isBasePrice",
57
+        "rank"
58
+      ],
59
+      headers: [
60
+        "Category",
61
+        "Description",
62
+        "Option Type",
63
+        "Option Limit",
64
+        "Base Price",
65
+        "Rank"
66
+      ],
67
+      restautantId: Log.restaurantId()
68
+    };
69
+  },
70
+  methods: {
71
+    ...mapActions("menuOptions", ["getMenuOptions", "deleteMenuOption"]),
72
+    New() {
73
+      this.$router.push("/MenuOption/0");
74
+    },
75
+    Edit(item) {
76
+      this.$router.push("/MenuOption/" + item.id);
77
+    },
78
+    Delete(item) {
79
+      this.deleteMenuOption(item);
80
+    }
81
+  },
82
+  computed: {
83
+    ...mapState("menuOptions", ["menuOptions"]),
84
+    CurrentCategory() {
85
+      return this.category;
86
+    }
87
+  },
88
+  mounted() {
89
+    this.getMenuOptions(this.restautantId).then(() => {
90
+      this.wait = false;
91
+    });
92
+  }
93
+};
94
+</script>

+ 3
- 2
src/components/shared/navBar.vue Vedi File

@@ -99,8 +99,9 @@
99 99
                 >Menu Categories</a>
100 100
                 <a
101 101
                   class="dropdown-item cursor-pointer"
102
-                  @click="routerGoTo('/status/timeshareAdmin')"
103
-                >Menu</a>
102
+                  @click="routerGoTo('/MenuOptions')"
103
+                >Menu Options</a>
104
+                <a class="dropdown-item cursor-pointer" @click="routerGoTo('/RestaurantMenu')">Menu</a>
104 105
                 <a
105 106
                   class="dropdown-item cursor-pointer"
106 107
                   @click="routerGoTo('/status/timeshareAdmin')"

+ 36
- 0
src/router/index.js Vedi File

@@ -16,6 +16,12 @@ import CustomerDetails from "../components/customer/customerDetails.vue";
16 16
 import CustomerOrders from "../components/customer/customerOrders.vue";
17 17
 import CustomerList from "../components/customer/customerList.vue";
18 18
 import RestaurantMenuCategories from "../components/restaurants/restaurantMenuCategories.vue";
19
+import RestaurantMenu from "../components/restaurants/restaurantMenu.vue";
20
+import RestaurantMenuOptions from "../components/restaurants/restaurantMenuOptions.vue";
21
+import RestaurantMenuOption from "../components/restaurants/restaurantMenuOption.vue";
22
+import RestaurantMenuItem from "../components/restaurants/restaurantMenuItem.vue"
23
+import RestaurantMenuItemOptions from "../components/restaurants/restaurantMenuItemOptions.vue";
24
+import MenuItems from "../components/home/menuItems.vue";
19 25
 
20 26
 Vue.use(Router);
21 27
 
@@ -91,6 +97,36 @@ export default new Router({
91 97
       path: "/MenuCategory",
92 98
       name: "MenuCategory",
93 99
       component: RestaurantMenuCategories
100
+    },
101
+    {
102
+      path: "/RestaurantMenu",
103
+      name: "RestaurantMenu",
104
+      component: RestaurantMenu
105
+    },
106
+    {
107
+      path: "/MenuOptions",
108
+      name: "MenuOptions",
109
+      component: RestaurantMenuOptions
110
+    },
111
+    {
112
+      path: "/MenuOption/:optionid",
113
+      name: "MenuOption",
114
+      component: RestaurantMenuOption
115
+    },
116
+    {
117
+      path: "/ItemOption",
118
+      name: "ItemOption",
119
+      component: RestaurantMenuItemOptions
120
+    },
121
+    {
122
+      path: "/MenuItem/:itemid",
123
+      name: "MenuItem",
124
+      component: RestaurantMenuItem
125
+    },
126
+    {
127
+      path: "/Menu/:restautantid",
128
+      name: "MenuItems",
129
+      component: MenuItems
94 130
     }
95 131
   ]
96 132
 });

+ 7
- 1
src/store/index.js Vedi File

@@ -9,6 +9,9 @@ import Restaurant from './modules/restaurants/restaurant';
9 9
 import MOPs from './modules/shared/restaurantMOP'
10 10
 import User from './modules/users/user';
11 11
 import MenuCategories from './modules/restaurants/restaurantMenuCategories';
12
+import MenuOptions from './modules/restaurants/restaurantMenuOptions';
13
+import Menu from './modules/restaurants/restaurantMenu';
14
+import HomeMenu from './modules/restaurants/menu'
12 15
 
13 16
 Vue.use(Vuex);
14 17
 /* eslint no-param-reassign: ["error", { "props": false }] */
@@ -21,6 +24,9 @@ export default new Vuex.Store({
21 24
     restaurant: Restaurant,
22 25
     user: User,
23 26
     mop: MOPs,
24
-    menuCategories: MenuCategories
27
+    menuCategories: MenuCategories,
28
+    menuOptions: MenuOptions,
29
+    menu: Menu,
30
+    homeMenu: HomeMenu
25 31
   },
26 32
 });

+ 34
- 0
src/store/modules/restaurants/menu.js Vedi File

@@ -0,0 +1,34 @@
1
+import axios from 'axios'
2
+
3
+export default {
4
+  namespaced: true,
5
+  state: {
6
+    menu: {},
7
+    options: {}
8
+  },
9
+  mutations: {
10
+    setMenus(state, items) {
11
+      state.menu = items;
12
+    },
13
+    setOptions(state, items) {
14
+      state.options = items;
15
+    }
16
+  },
17
+  getters: {},
18
+  actions: {
19
+    getMenu({
20
+      commit
21
+    }, id) {
22
+      axios
23
+        .get(`/api/menu/${id}`)
24
+        .then(result => commit("setMenus", result.data));
25
+    },
26
+    getOptions({
27
+      commit
28
+    }, item) {
29
+      axios
30
+        .get(`/api/menu/GetOptions/${item.menuId}/${item.categoryId}`)
31
+        .then(result => commit("setOptions", result.data));
32
+    }
33
+  }
34
+}

+ 66
- 0
src/store/modules/restaurants/restaurantMenu.js Vedi File

@@ -0,0 +1,66 @@
1
+import axios from 'axios';
2
+
3
+export default {
4
+  namespaced: true,
5
+  state: {
6
+    menuItem: {},
7
+    menuItems: []
8
+  },
9
+  mutations: {
10
+    setMenuItems(state, items) {
11
+      state.menuItems = items;
12
+    },
13
+    setMenuItem(state, item) {
14
+      state.menuItem = item;
15
+    },
16
+    addMenuItem(state, item) {
17
+      state.menuItem = item;
18
+      state.menuItems.push(item);
19
+    },
20
+    updateMenuItem(state, item) {
21
+      state.menuItem = item;
22
+      //state.menuItems.find(m => m.id === item.id) = item;
23
+    },
24
+    removeMenuItem(state, item) {
25
+      state.menuItems.pop(item);
26
+    }
27
+  },
28
+  getters: {},
29
+  actions: {
30
+    getMenuItem({
31
+      commit
32
+    }, id) {
33
+      axios
34
+        .get(`/api/MenuItem/GetMenuItem/${id}`)
35
+        .then(result => commit("setMenuItem", result.data));
36
+    },
37
+    getMenuItems({
38
+      commit
39
+    }, id) {
40
+      axios
41
+        .get(`/api/MenuItem/${id}`)
42
+        .then(result => commit("setMenuItems", result.data));
43
+    },
44
+    insertMenuItem({
45
+      commit
46
+    }, menuItem) {
47
+      axios
48
+        .post('/api/MenuItem', menuItem)
49
+        .then(result => commit("addMenuItem", result.data));
50
+    },
51
+    updateMenuItem({
52
+      commit
53
+    }, menuItem) {
54
+      axios
55
+        .put('/api/MenuItem', menuItem)
56
+        .then(result => commit("updateMenuItem", menuItem));
57
+    },
58
+    deleteMenuItem({
59
+      commit
60
+    }, menuItem) {
61
+      axios
62
+        .delete(`/api/MenuItem/${menuItem.id}`)
63
+        .then(result => commit("removeMenuItem", menuItem));
64
+    }
65
+  }
66
+}

+ 93
- 0
src/store/modules/restaurants/restaurantMenuOptions.js Vedi File

@@ -0,0 +1,93 @@
1
+import axios from "axios";
2
+import {
3
+  result
4
+} from "lodash";
5
+
6
+export default {
7
+  namespaced: true,
8
+  state: {
9
+    menuOptions: [],
10
+    menuOption: {},
11
+    optionTypes: []
12
+  },
13
+  mutations: {
14
+    setMenuOption(state, menuOption) {
15
+      state.menuOption = menuOption;
16
+      if (state.menuOption.options) {
17
+        state.menuOptionItems = state.menuOption.options;
18
+      }
19
+    },
20
+    setMenuOptions(state, menuOptions) {
21
+      state.menuOptions = menuOptions;
22
+    },
23
+    setOptionTypes(state, types) {
24
+      state.optionTypes = types;
25
+    },
26
+    newMenuOption(state, item) {
27
+      state.menuOptions = item;
28
+      state.menuOption.options.push(item);
29
+    },
30
+    updateMenuOption(state, item) {
31
+      state.menuOptions = item;
32
+      var temp = state.menuOption.options.find(m => m.Id === item.id);
33
+      temp = item;
34
+    },
35
+    removeMenuOption(state, menuOption) {
36
+      state.menuOptions.pop(menuOption);
37
+    },
38
+    removeMenuOptionItem(state, item) {
39
+      state.menuOption.options.pop(item);
40
+    }
41
+  },
42
+  getters: {},
43
+  actions: {
44
+    getMenuOption({
45
+      commit
46
+    }, id) {
47
+      axios.get(`/api/MenuOptions/${id}`).then(result => commit("setMenuOption", result.data));
48
+    },
49
+    getMenuOptions({
50
+      commit
51
+    }, restaurantId) {
52
+      axios
53
+        .get(`/api/MenuOptions/GetRestaurantMenuOptions/${restaurantId}`)
54
+        .then(result => commit("setMenuOptions", result.data));
55
+    },
56
+    getOptionTypes({
57
+      commit
58
+    }) {
59
+      axios
60
+        .get('/api/MenuOptions/GetOptionTypes')
61
+        .then(result => commit("setOptionTypes", result.data));
62
+    },
63
+    addMenuOption({
64
+      commit
65
+    }, menuOption) {
66
+      axios
67
+        .post("/api/MenuOptions", menuOption)
68
+        .then(result => commit("newMenuOption", result.data))
69
+    },
70
+    updateMenuOption({
71
+      commit
72
+    }, menuOption) {
73
+      axios
74
+        .put("/api/MenuOptions", menuOption)
75
+        .then(result => commit("updateMenuOption", result.data))
76
+        .catch(console.error);
77
+    },
78
+    deleteMenuOption({
79
+      commit
80
+    }, menuOption) {
81
+      axios
82
+        .delete(`/api/MenuOptions/${menuOption.id}`)
83
+        .then(result => commit("removeMenuOption", menuOption));
84
+    },
85
+    deleteMenuOptionItem({
86
+      commit
87
+    }, item) {
88
+      axios
89
+        .delete(`/api/MenuOptions/DeleteMenuOptionItem/${item.id}`)
90
+        .then(result => commit("removeMenuOptionItem", item));
91
+    }
92
+  }
93
+};

Loading…
Annulla
Salva