@feedmepos/mf-order-setting 0.0.2 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. package/.env.dev +13 -0
  2. package/.env.example +11 -0
  3. package/.env.prod +12 -0
  4. package/.eslintrc.cjs +15 -0
  5. package/.nvmrc +1 -0
  6. package/.prettierrc.json +8 -0
  7. package/.vscode/extensions.json +8 -0
  8. package/README.md +31 -0
  9. package/dist/KioskSettingView-BTDNtWJ1.js +4 -0
  10. package/{app-gcisgtft.js → dist/app-XcwzVa60.js} +7363 -7390
  11. package/dist/app.js +6 -0
  12. package/dist/frontend/mf-order/src/app.d.ts +4 -0
  13. package/dist/frontend/mf-order/src/router/routes.d.ts +3 -0
  14. package/dist/frontend/mf-order/src/views/order-settings/sms/SmsSetting.vue.d.ts +2 -0
  15. package/dist/frontend/mf-order/tsconfig.app.tsbuildinfo +1 -0
  16. package/env.d.ts +95 -0
  17. package/index.html +16 -0
  18. package/package.json +5 -4
  19. package/postcss.config.js +6 -0
  20. package/public/favicon.ico +0 -0
  21. package/src/App.vue +19 -0
  22. package/src/Entry.vue +42 -0
  23. package/src/api/auth/index.ts +20 -0
  24. package/src/api/delivery/index.ts +15 -0
  25. package/src/api/index.ts +171 -0
  26. package/src/api/kiosk/index.ts +22 -0
  27. package/src/api/menu/index.ts +13 -0
  28. package/src/api/order/index.ts +15 -0
  29. package/src/api/order-setting/index.ts +25 -0
  30. package/src/api/public-setting/index.ts +11 -0
  31. package/src/api/remoteOrder/index.ts +142 -0
  32. package/src/api/restaurant-setting/index.ts +55 -0
  33. package/src/api/table-setting/index.ts +30 -0
  34. package/src/app.ts +7 -0
  35. package/src/assets/base.css +6 -0
  36. package/src/assets/images/no-data.svg +35 -0
  37. package/src/assets/logo.svg +1 -0
  38. package/src/assets/main.css +1 -0
  39. package/src/components/GoogleMap.vue +216 -0
  40. package/src/components/RestaurantSelection.vue +34 -0
  41. package/src/components/index.ts +7 -0
  42. package/src/components/snackbar.ts +44 -0
  43. package/src/components/type.ts +103 -0
  44. package/src/composables/index.ts +7 -0
  45. package/src/composables/loading/index.ts +51 -0
  46. package/src/composables/search.ts +18 -0
  47. package/src/helpers/currency.ts +6 -0
  48. package/src/helpers/date.ts +29 -0
  49. package/src/helpers/iteration.ts +87 -0
  50. package/src/helpers/map.ts +92 -0
  51. package/src/helpers/menu.ts +166 -0
  52. package/src/helpers/number.ts +25 -0
  53. package/src/helpers/object.ts +12 -0
  54. package/src/helpers/profile.ts +52 -0
  55. package/src/i18n.ts +43 -0
  56. package/src/index.d.ts +3 -0
  57. package/src/main.ts +77 -0
  58. package/src/modules/kiosk/interface.ts +16 -0
  59. package/src/modules/order-setting/interface.ts +4 -0
  60. package/src/modules/order-setting/kiosk/interface.ts +52 -0
  61. package/src/plugins/google-maps.ts +28 -0
  62. package/src/router/index.ts +10 -0
  63. package/src/router/routes.ts +43 -0
  64. package/src/stores/app/index.ts +58 -0
  65. package/src/stores/iframe/index.ts +23 -0
  66. package/src/stores/kiosk/index.ts +40 -0
  67. package/src/stores/kiosk/mapper.ts +25 -0
  68. package/src/stores/menu/menu.ts +258 -0
  69. package/src/stores/order-setting/index.ts +61 -0
  70. package/src/stores/order-setting/mapper.ts +104 -0
  71. package/src/stores/restaurant/index.ts +138 -0
  72. package/src/stores/table-settings.ts +160 -0
  73. package/src/stores/type.ts +65 -0
  74. package/src/utils/constants/route.ts +15 -0
  75. package/src/utils/number.ts +16 -0
  76. package/src/utils/object.ts +15 -0
  77. package/src/views/all-orders/ActionMenuCell.vue +92 -0
  78. package/src/views/all-orders/FilterRestaurant.vue +71 -0
  79. package/src/views/all-orders/FilterStatus.vue +121 -0
  80. package/src/views/all-orders/FilterStatusMenu.vue +44 -0
  81. package/src/views/all-orders/Orders.vue +524 -0
  82. package/src/views/all-orders/ReflowOrder.vue +105 -0
  83. package/src/views/all-orders/UpdateDeliveryOrderDialog.vue +313 -0
  84. package/src/views/all-orders/order.ts +584 -0
  85. package/src/views/feedme-express/FeedMeExpress.vue +139 -0
  86. package/src/views/feedme-express/FeedMeExpressSummary.vue +62 -0
  87. package/src/views/kiosk/KioskSummary.vue +74 -0
  88. package/src/views/kiosk/KioskView.vue +140 -0
  89. package/src/views/kiosk/devices/KioskDeviceCard.vue +105 -0
  90. package/src/views/kiosk/devices/KioskDeviceDetail.vue +28 -0
  91. package/src/views/kiosk/devices/KioskDevicesView.vue +27 -0
  92. package/src/views/kiosk/devices/KioskOtpDialog.vue +15 -0
  93. package/src/views/kiosk/devices/KioskUnbindConfirm.vue +28 -0
  94. package/src/views/kiosk/settings/KioskDineInSection.vue +86 -0
  95. package/src/views/kiosk/settings/KioskDisplayStandSection.vue +98 -0
  96. package/src/views/kiosk/settings/KioskPickAtCounterSection.vue +25 -0
  97. package/src/views/kiosk/settings/KioskSettingView.vue +61 -0
  98. package/src/views/kiosk/settings/KioskTakeawaySection.vue +39 -0
  99. package/src/views/order-settings/OrderSettingsView.vue +52 -0
  100. package/src/views/order-settings/components/RestaurantSelector.vue +77 -0
  101. package/src/views/order-settings/delivery/DeliverySetting.vue +799 -0
  102. package/src/views/order-settings/delivery/LocalDelivery.vue +0 -0
  103. package/src/views/order-settings/delivery/components/ManualIntegratedDeliverySetting.vue +167 -0
  104. package/src/views/order-settings/delivery/delivery.data.ts +75 -0
  105. package/src/views/order-settings/delivery/delivery.ts +41 -0
  106. package/src/views/order-settings/delivery/inhouse/CurrencyInput.vue +47 -0
  107. package/src/views/order-settings/delivery/inhouse/DeliveryCustomTime.vue +235 -0
  108. package/src/views/order-settings/delivery/inhouse/DeliveryOrder.vue +236 -0
  109. package/src/views/order-settings/delivery/inhouse/DeliveryTime.vue +143 -0
  110. package/src/views/order-settings/delivery/inhouse/InHouseDelivery.vue +186 -0
  111. package/src/views/order-settings/delivery/inhouse/TimePicker.vue +76 -0
  112. package/src/views/order-settings/delivery/inhouse/ZoneDialog.vue +143 -0
  113. package/src/views/order-settings/delivery/integrated-delivery/FeedmeDelivery.vue +244 -0
  114. package/src/views/order-settings/delivery/integrated-delivery/FoodpandaCampaignDialog.vue +110 -0
  115. package/src/views/order-settings/delivery/integrated-delivery/FoodpandaSetting.vue +261 -0
  116. package/src/views/order-settings/delivery/integrated-delivery/GrabfoodSetting.vue +128 -0
  117. package/src/views/order-settings/delivery/integrated-delivery/IntegratedDelivery.vue +272 -0
  118. package/src/views/order-settings/delivery/integrated-delivery/ShopeefoodSetting.vue +135 -0
  119. package/src/views/order-settings/delivery/integrated.data.interface.ts +0 -0
  120. package/src/views/order-settings/dinein/DineInSetting.vue +128 -0
  121. package/src/views/order-settings/dinein/OfflinePaymentTypeDialog.vue +51 -0
  122. package/src/views/order-settings/dinein/OfflinePaymentTypeDialogContent.vue +44 -0
  123. package/src/views/order-settings/dinein/PaymentType.vue +172 -0
  124. package/src/views/order-settings/pickup/AddressInput.vue +48 -0
  125. package/src/views/order-settings/pickup/CustomPayment.vue +84 -0
  126. package/src/views/order-settings/pickup/PaymentSidesheet.vue +167 -0
  127. package/src/views/order-settings/pickup/PickUpPointDialog.vue +125 -0
  128. package/src/views/order-settings/pickup/PickUpPointDialogContent.vue +95 -0
  129. package/src/views/order-settings/pickup/PickUpSetting.vue +233 -0
  130. package/src/views/order-settings/pickup/PickUpSettingDialog.vue +148 -0
  131. package/src/views/order-settings/pickup/PickUpSideSheet.vue +15 -0
  132. package/src/views/order-settings/pickup/Preorder.vue +139 -0
  133. package/src/views/order-settings/servicecharge/RateInput.vue +34 -0
  134. package/src/views/order-settings/servicecharge/ServiceChargeRule.vue +453 -0
  135. package/src/views/order-settings/servicecharge/ServiceChargeSetting.vue +233 -0
  136. package/src/views/order-settings/sms/SmsSetting.vue +162 -0
  137. package/tailwind.config.js +20 -0
  138. package/tsconfig.app.json +25 -0
  139. package/tsconfig.json +18 -0
  140. package/tsconfig.node.json +16 -0
  141. package/vite.config.ts +60 -0
  142. package/KioskSettingView-BRJpaAwI.js +0 -4
  143. package/app.js +0 -5
  144. package/frontend/mf-order/src/app.d.ts +0 -2
  145. package/frontend/mf-order/tsconfig.app.tsbuildinfo +0 -1
  146. package/style.css +0 -1
  147. package/{common → dist/common}/booking/index.d.ts +0 -0
  148. package/{common → dist/common}/config/bank/index.d.ts +0 -0
  149. package/{common → dist/common}/config/bank/malaysia.d.ts +0 -0
  150. package/{common → dist/common}/config/bank/singapore.d.ts +0 -0
  151. package/{common → dist/common}/config/index.d.ts +0 -0
  152. package/{common → dist/common}/convertor/index.d.ts +0 -0
  153. package/{common → dist/common}/index.d.ts +0 -0
  154. package/{common → dist/common}/number/index.d.ts +0 -0
  155. package/{common → dist/common}/sms/index.d.ts +0 -0
  156. package/{common → dist/common}/util/index.d.ts +0 -0
  157. package/{favicon.ico → dist/favicon.ico} +0 -0
  158. package/{frontend → dist/frontend}/mf-order/src/App.vue.d.ts +0 -0
  159. package/{frontend/mf-order/src/views/all-orders/Orders.vue.d.ts → dist/frontend/mf-order/src/Entry.vue.d.ts} +0 -0
  160. package/{frontend → dist/frontend}/mf-order/src/api/auth/index.d.ts +0 -0
  161. package/{frontend → dist/frontend}/mf-order/src/api/delivery/index.d.ts +0 -0
  162. package/{frontend → dist/frontend}/mf-order/src/api/index.d.ts +0 -0
  163. package/{frontend → dist/frontend}/mf-order/src/api/kiosk/index.d.ts +0 -0
  164. package/{frontend → dist/frontend}/mf-order/src/api/menu/index.d.ts +0 -0
  165. package/{frontend → dist/frontend}/mf-order/src/api/order/index.d.ts +0 -0
  166. package/{frontend → dist/frontend}/mf-order/src/api/order-setting/index.d.ts +0 -0
  167. package/{frontend → dist/frontend}/mf-order/src/api/public-setting/index.d.ts +0 -0
  168. package/{frontend → dist/frontend}/mf-order/src/api/remoteOrder/index.d.ts +0 -0
  169. package/{frontend → dist/frontend}/mf-order/src/api/restaurant-setting/index.d.ts +0 -0
  170. package/{frontend → dist/frontend}/mf-order/src/api/table-setting/index.d.ts +0 -0
  171. package/{frontend → dist/frontend}/mf-order/src/components/GoogleMap.vue.d.ts +0 -0
  172. package/{frontend → dist/frontend}/mf-order/src/components/RestaurantSelection.vue.d.ts +0 -0
  173. package/{frontend → dist/frontend}/mf-order/src/components/index.d.ts +0 -0
  174. package/{frontend → dist/frontend}/mf-order/src/components/snackbar.d.ts +0 -0
  175. package/{frontend → dist/frontend}/mf-order/src/components/type.d.ts +0 -0
  176. package/{frontend → dist/frontend}/mf-order/src/composables/index.d.ts +0 -0
  177. package/{frontend → dist/frontend}/mf-order/src/composables/loading/index.d.ts +0 -0
  178. package/{frontend → dist/frontend}/mf-order/src/composables/search.d.ts +0 -0
  179. package/{frontend → dist/frontend}/mf-order/src/helpers/currency.d.ts +0 -0
  180. package/{frontend → dist/frontend}/mf-order/src/helpers/date.d.ts +0 -0
  181. package/{frontend → dist/frontend}/mf-order/src/helpers/iteration.d.ts +0 -0
  182. package/{frontend → dist/frontend}/mf-order/src/helpers/map.d.ts +0 -0
  183. package/{frontend → dist/frontend}/mf-order/src/helpers/menu.d.ts +0 -0
  184. package/{frontend → dist/frontend}/mf-order/src/helpers/number.d.ts +0 -0
  185. package/{frontend → dist/frontend}/mf-order/src/helpers/object.d.ts +0 -0
  186. package/{frontend → dist/frontend}/mf-order/src/helpers/profile.d.ts +0 -0
  187. package/{frontend → dist/frontend}/mf-order/src/i18n.d.ts +0 -0
  188. package/{frontend → dist/frontend}/mf-order/src/main.d.ts +0 -0
  189. package/{frontend → dist/frontend}/mf-order/src/modules/kiosk/interface.d.ts +0 -0
  190. package/{frontend → dist/frontend}/mf-order/src/modules/order-setting/interface.d.ts +0 -0
  191. package/{frontend → dist/frontend}/mf-order/src/modules/order-setting/kiosk/interface.d.ts +0 -0
  192. package/{frontend → dist/frontend}/mf-order/src/plugins/google-maps.d.ts +0 -0
  193. package/{frontend → dist/frontend}/mf-order/src/router/index.d.ts +0 -0
  194. package/{frontend → dist/frontend}/mf-order/src/stores/app/index.d.ts +0 -0
  195. package/{frontend → dist/frontend}/mf-order/src/stores/iframe/index.d.ts +0 -0
  196. package/{frontend → dist/frontend}/mf-order/src/stores/kiosk/index.d.ts +0 -0
  197. package/{frontend → dist/frontend}/mf-order/src/stores/kiosk/mapper.d.ts +0 -0
  198. package/{frontend → dist/frontend}/mf-order/src/stores/menu/menu.d.ts +0 -0
  199. package/{frontend → dist/frontend}/mf-order/src/stores/order-setting/index.d.ts +0 -0
  200. package/{frontend → dist/frontend}/mf-order/src/stores/order-setting/mapper.d.ts +0 -0
  201. package/{frontend → dist/frontend}/mf-order/src/stores/restaurant/index.d.ts +0 -0
  202. package/{frontend → dist/frontend}/mf-order/src/stores/table-settings.d.ts +0 -0
  203. package/{frontend → dist/frontend}/mf-order/src/stores/type.d.ts +0 -0
  204. package/{frontend → dist/frontend}/mf-order/src/utils/constants/route.d.ts +0 -0
  205. package/{frontend → dist/frontend}/mf-order/src/utils/number.d.ts +0 -0
  206. package/{frontend → dist/frontend}/mf-order/src/utils/object.d.ts +0 -0
  207. package/{frontend → dist/frontend}/mf-order/src/views/all-orders/ActionMenuCell.vue.d.ts +0 -0
  208. package/{frontend → dist/frontend}/mf-order/src/views/all-orders/FilterRestaurant.vue.d.ts +0 -0
  209. package/{frontend → dist/frontend}/mf-order/src/views/all-orders/FilterStatus.vue.d.ts +0 -0
  210. package/{frontend → dist/frontend}/mf-order/src/views/all-orders/FilterStatusMenu.vue.d.ts +0 -0
  211. package/{frontend/mf-order/src/views/feedme-express/FeedMeExpress.vue.d.ts → dist/frontend/mf-order/src/views/all-orders/Orders.vue.d.ts} +0 -0
  212. package/{frontend → dist/frontend}/mf-order/src/views/all-orders/ReflowOrder.vue.d.ts +0 -0
  213. package/{frontend → dist/frontend}/mf-order/src/views/all-orders/UpdateDeliveryOrderDialog.vue.d.ts +0 -0
  214. package/{frontend → dist/frontend}/mf-order/src/views/all-orders/order.d.ts +2 -2
  215. package/{frontend/mf-order/src/views/kiosk/KioskView.vue.d.ts → dist/frontend/mf-order/src/views/feedme-express/FeedMeExpress.vue.d.ts} +0 -0
  216. package/{frontend → dist/frontend}/mf-order/src/views/feedme-express/FeedMeExpressSummary.vue.d.ts +0 -0
  217. package/{frontend → dist/frontend}/mf-order/src/views/kiosk/KioskSummary.vue.d.ts +0 -0
  218. package/{frontend/mf-order/src/views/order-settings/OrderSettingsView.vue.d.ts → dist/frontend/mf-order/src/views/kiosk/KioskView.vue.d.ts} +0 -0
  219. package/{frontend → dist/frontend}/mf-order/src/views/kiosk/devices/KioskDeviceCard.vue.d.ts +0 -0
  220. package/{frontend → dist/frontend}/mf-order/src/views/kiosk/devices/KioskDeviceDetail.vue.d.ts +0 -0
  221. package/{frontend → dist/frontend}/mf-order/src/views/kiosk/devices/KioskDevicesView.vue.d.ts +0 -0
  222. package/{frontend → dist/frontend}/mf-order/src/views/kiosk/devices/KioskOtpDialog.vue.d.ts +0 -0
  223. package/{frontend → dist/frontend}/mf-order/src/views/kiosk/devices/KioskUnbindConfirm.vue.d.ts +0 -0
  224. package/{frontend → dist/frontend}/mf-order/src/views/kiosk/settings/KioskDineInSection.vue.d.ts +0 -0
  225. package/{frontend → dist/frontend}/mf-order/src/views/kiosk/settings/KioskDisplayStandSection.vue.d.ts +0 -0
  226. package/{frontend → dist/frontend}/mf-order/src/views/kiosk/settings/KioskPickAtCounterSection.vue.d.ts +0 -0
  227. package/{frontend → dist/frontend}/mf-order/src/views/kiosk/settings/KioskSettingView.vue.d.ts +0 -0
  228. package/{frontend → dist/frontend}/mf-order/src/views/kiosk/settings/KioskTakeawaySection.vue.d.ts +0 -0
  229. package/{frontend/mf-order/src/views/order-settings/delivery/LocalDelivery.vue.d.ts → dist/frontend/mf-order/src/views/order-settings/OrderSettingsView.vue.d.ts} +0 -0
  230. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/components/RestaurantSelector.vue.d.ts +0 -0
  231. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/delivery/DeliverySetting.vue.d.ts +0 -0
  232. package/{frontend/mf-order/src/views/order-settings/dinein/DineInSetting.vue.d.ts → dist/frontend/mf-order/src/views/order-settings/delivery/LocalDelivery.vue.d.ts} +0 -0
  233. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/delivery/components/ManualIntegratedDeliverySetting.vue.d.ts +0 -0
  234. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/delivery/delivery.d.ts +0 -0
  235. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/delivery/delivery.data.d.ts +0 -0
  236. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/delivery/inhouse/CurrencyInput.vue.d.ts +0 -0
  237. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/delivery/inhouse/DeliveryCustomTime.vue.d.ts +0 -0
  238. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/delivery/inhouse/DeliveryOrder.vue.d.ts +0 -0
  239. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/delivery/inhouse/DeliveryTime.vue.d.ts +0 -0
  240. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/delivery/inhouse/InHouseDelivery.vue.d.ts +0 -0
  241. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/delivery/inhouse/TimePicker.vue.d.ts +0 -0
  242. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/delivery/inhouse/ZoneDialog.vue.d.ts +0 -0
  243. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/delivery/integrated-delivery/FeedmeDelivery.vue.d.ts +0 -0
  244. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/delivery/integrated-delivery/FoodpandaCampaignDialog.vue.d.ts +0 -0
  245. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/delivery/integrated-delivery/FoodpandaSetting.vue.d.ts +0 -0
  246. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/delivery/integrated-delivery/GrabfoodSetting.vue.d.ts +0 -0
  247. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/delivery/integrated-delivery/IntegratedDelivery.vue.d.ts +0 -0
  248. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/delivery/integrated-delivery/ShopeefoodSetting.vue.d.ts +0 -0
  249. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/delivery/integrated.data.interface.d.ts +0 -0
  250. package/{frontend/mf-order/src/views/order-settings/pickup/PickUpSideSheet.vue.d.ts → dist/frontend/mf-order/src/views/order-settings/dinein/DineInSetting.vue.d.ts} +0 -0
  251. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/dinein/OfflinePaymentTypeDialog.vue.d.ts +0 -0
  252. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/dinein/OfflinePaymentTypeDialogContent.vue.d.ts +0 -0
  253. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/dinein/PaymentType.vue.d.ts +0 -0
  254. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/pickup/AddressInput.vue.d.ts +0 -0
  255. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/pickup/CustomPayment.vue.d.ts +0 -0
  256. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/pickup/PaymentSidesheet.vue.d.ts +0 -0
  257. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/pickup/PickUpPointDialog.vue.d.ts +0 -0
  258. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/pickup/PickUpPointDialogContent.vue.d.ts +0 -0
  259. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/pickup/PickUpSetting.vue.d.ts +0 -0
  260. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/pickup/PickUpSettingDialog.vue.d.ts +0 -0
  261. package/{frontend/mf-order/src/views/order-settings/servicecharge/ServiceChargeSetting.vue.d.ts → dist/frontend/mf-order/src/views/order-settings/pickup/PickUpSideSheet.vue.d.ts} +0 -0
  262. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/pickup/Preorder.vue.d.ts +0 -0
  263. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/servicecharge/RateInput.vue.d.ts +0 -0
  264. package/{frontend → dist/frontend}/mf-order/src/views/order-settings/servicecharge/ServiceChargeRule.vue.d.ts +0 -0
  265. package/{frontend/mf-order/src/views/order-settings/sms/SmsSetting.vue.d.ts → dist/frontend/mf-order/src/views/order-settings/servicecharge/ServiceChargeSetting.vue.d.ts} +0 -0
  266. package/{package → dist/package}/entity/booking/booking.do.d.ts +0 -0
  267. package/{package → dist/package}/entity/booking/booking.dto.d.ts +0 -0
  268. package/{package → dist/package}/entity/booking/booking.enum.d.ts +0 -0
  269. package/{package → dist/package}/entity/business/business.dto.d.ts +0 -0
  270. package/{package → dist/package}/entity/clickup/clickup.dto.d.ts +0 -0
  271. package/{package → dist/package}/entity/cursor/cursor.dto.d.ts +0 -0
  272. package/{package → dist/package}/entity/delivery/delivery.do.d.ts +0 -0
  273. package/{package → dist/package}/entity/delivery/delivery.dto.d.ts +28 -28
  274. package/{package → dist/package}/entity/delivery/delivery.enum.d.ts +0 -0
  275. package/{package → dist/package}/entity/delivery/gateway/grab.dto.d.ts +0 -0
  276. package/{package → dist/package}/entity/delivery/gateway/grab.enum.d.ts +0 -0
  277. package/{package → dist/package}/entity/delivery/gateway/kosmo.dto.d.ts +0 -0
  278. package/{package → dist/package}/entity/delivery/gateway/kosmo.enum.d.ts +0 -0
  279. package/{package → dist/package}/entity/delivery/gateway/manual.dto.d.ts +0 -0
  280. package/{package → dist/package}/entity/delivery/gateway/manual.enum.d.ts +0 -0
  281. package/{package → dist/package}/entity/delivery/gateway/pandago.dto.d.ts +2 -2
  282. package/{package → dist/package}/entity/delivery/gateway/pandago.enum.d.ts +0 -0
  283. package/{package → dist/package}/entity/delivery/linked-delivery.do.d.ts +0 -0
  284. package/{package → dist/package}/entity/food-court/food-court.do.d.ts +0 -0
  285. package/{package → dist/package}/entity/food-court/food-court.dto.d.ts +0 -0
  286. package/{package → dist/package}/entity/food-court/food-court.enum.d.ts +0 -0
  287. package/{package → dist/package}/entity/food-court/order.do.d.ts +0 -0
  288. package/{package → dist/package}/entity/food-court/order.dto.d.ts +0 -0
  289. package/{package → dist/package}/entity/general/dateTime.dto.d.ts +0 -0
  290. package/{package → dist/package}/entity/general/number.dto.d.ts +0 -0
  291. package/{package → dist/package}/entity/general/search.dto.d.ts +0 -0
  292. package/{package → dist/package}/entity/incoming-order/incoming-order-to-bill.dto.d.ts +0 -0
  293. package/{package → dist/package}/entity/incoming-order/incoming-order.do.d.ts +0 -0
  294. package/{package → dist/package}/entity/incoming-order/incoming-order.dto.d.ts +0 -0
  295. package/{package → dist/package}/entity/incoming-order/incoming-order.enum.d.ts +0 -0
  296. package/{package → dist/package}/entity/index.d.ts +0 -0
  297. package/{package → dist/package}/entity/kiosk/kiosk.do.d.ts +0 -0
  298. package/{package → dist/package}/entity/kiosk/kiosk.dto.d.ts +0 -0
  299. package/{package → dist/package}/entity/kiosk/marketing/marketing.dto.d.ts +0 -0
  300. package/{package → dist/package}/entity/kiosk/scanner/scanner.do.d.ts +0 -0
  301. package/{package → dist/package}/entity/kiosk/scanner/scanner.dto.d.ts +0 -0
  302. package/{package → dist/package}/entity/kiosk/scanner/scanner.enum.d.ts +0 -0
  303. package/{package → dist/package}/entity/marketing/marketing.dto.d.ts +0 -0
  304. package/{package → dist/package}/entity/member/member.dto.d.ts +0 -0
  305. package/{package → dist/package}/entity/money/money.enum.d.ts +0 -0
  306. package/{package → dist/package}/entity/order/dine-in/dine-in.do.d.ts +0 -0
  307. package/{package → dist/package}/entity/order/dine-in/dine-in.dto.d.ts +0 -0
  308. package/{package → dist/package}/entity/order/dine-in/qr.do.d.ts +0 -0
  309. package/{package → dist/package}/entity/order/dine-in/reservation.do.d.ts +0 -0
  310. package/{package → dist/package}/entity/order/dine-in/reservation.dto.d.ts +0 -0
  311. package/{package → dist/package}/entity/order/effects/effect.dto.d.ts +0 -0
  312. package/{package → dist/package}/entity/order/effects/effect.enum.d.ts +0 -0
  313. package/{package → dist/package}/entity/order/menu/menu.dto.d.ts +0 -0
  314. package/{package → dist/package}/entity/order/order-item/order-item.dto.d.ts +0 -0
  315. package/{package → dist/package}/entity/order/order.do.d.ts +0 -0
  316. package/{package → dist/package}/entity/order/order.dto.d.ts +4 -4
  317. package/{package → dist/package}/entity/order/order.enum.d.ts +0 -0
  318. package/{package → dist/package}/entity/order/payment/payment.dto.d.ts +0 -0
  319. package/{package → dist/package}/entity/order/pickup/pickup.do.d.ts +0 -0
  320. package/{package → dist/package}/entity/order/pickup/pickup.dto.d.ts +0 -0
  321. package/{package → dist/package}/entity/order/timeslot/timeslot.dto.d.ts +0 -0
  322. package/{package → dist/package}/entity/order/timeslot/timeslot.enum.d.ts +0 -0
  323. package/{package → dist/package}/entity/order-platform/base-integration.do.d.ts +0 -0
  324. package/{package → dist/package}/entity/order-platform/foodpanda/foodpanda-menu.dto.d.ts +48 -48
  325. package/{package → dist/package}/entity/order-platform/foodpanda/foodpanda-order.do.d.ts +16 -16
  326. package/{package → dist/package}/entity/order-platform/foodpanda/foodpanda-order.dto.d.ts +6 -6
  327. package/{package → dist/package}/entity/order-platform/foodpanda/foodpanda-settings.do.d.ts +0 -0
  328. package/{package → dist/package}/entity/order-platform/foodpanda/foodpanda-settings.dto.d.ts +0 -0
  329. package/{package → dist/package}/entity/order-platform/foodpanda/foodpanda.enum.d.ts +0 -0
  330. package/{package → dist/package}/entity/order-platform/grabfood/grabfood-menu.do.d.ts +0 -0
  331. package/{package → dist/package}/entity/order-platform/grabfood/grabfood-order.do.d.ts +0 -0
  332. package/{package → dist/package}/entity/order-platform/grabfood/grabfood-settings.do.d.ts +0 -0
  333. package/{package → dist/package}/entity/order-platform/grabfood/grabfood.dto.d.ts +0 -0
  334. package/{package → dist/package}/entity/order-platform/grabfood/grabfood.enum.d.ts +0 -0
  335. package/{package → dist/package}/entity/order-platform/menu.dto.d.ts +0 -0
  336. package/{package → dist/package}/entity/order-platform/order-platform.dto.d.ts +0 -0
  337. package/{package → dist/package}/entity/order-platform/order-platform.enum.d.ts +0 -0
  338. package/{package → dist/package}/entity/order-platform/shopeefood/shopeefood-menu.do.d.ts +0 -0
  339. package/{package → dist/package}/entity/order-platform/shopeefood/shopeefood-order.do.d.ts +20 -20
  340. /package/{package → dist/package}/entity/order-platform/shopeefood/shopeefood-order.dto.d.ts +0 -0
  341. /package/{package → dist/package}/entity/order-platform/shopeefood/shopeefood-settings.do.d.ts +0 -0
  342. /package/{package → dist/package}/entity/order-platform/shopeefood/shopeefood-settings.dto.d.ts +0 -0
  343. /package/{package → dist/package}/entity/order-platform/shopeefood/shopeefood.enum.d.ts +0 -0
  344. /package/{package → dist/package}/entity/order-setting/customization/color.do.d.ts +0 -0
  345. /package/{package → dist/package}/entity/order-setting/customization/color.dto.d.ts +0 -0
  346. /package/{package → dist/package}/entity/order-setting/kiosk/kiosk.do.d.ts +0 -0
  347. /package/{package → dist/package}/entity/order-setting/kiosk/kiosk.dto.d.ts +0 -0
  348. /package/{package → dist/package}/entity/order-setting/order-setting.do.d.ts +0 -0
  349. /package/{package → dist/package}/entity/order-setting/order-setting.dto.d.ts +0 -0
  350. /package/{package → dist/package}/entity/order-setting/queue/queue.do.d.ts +0 -0
  351. /package/{package → dist/package}/entity/order-setting/queue/queue.dto.d.ts +0 -0
  352. /package/{package → dist/package}/entity/order-setting/reservation/reservation.do.d.ts +0 -0
  353. /package/{package → dist/package}/entity/order-setting/reservation/reservation.dto.d.ts +0 -0
  354. /package/{package → dist/package}/entity/order-setting/sequence/sequence.do.d.ts +0 -0
  355. /package/{package → dist/package}/entity/order-setting/sequence/sequence.dto.d.ts +0 -0
  356. /package/{package → dist/package}/entity/order-setting/sms/sms.do.d.ts +0 -0
  357. /package/{package → dist/package}/entity/order-setting/sms/sms.dto.d.ts +0 -0
  358. /package/{package → dist/package}/entity/order-setting/sms/sms.enum.d.ts +0 -0
  359. /package/{package → dist/package}/entity/order-setting/upselling/upselling.do.d.ts +0 -0
  360. /package/{package → dist/package}/entity/order-setting/upselling/upselling.dto.d.ts +0 -0
  361. /package/{package → dist/package}/entity/order-setting/v3/v3.do.d.ts +0 -0
  362. /package/{package → dist/package}/entity/order-setting/v3/v3.dto.d.ts +0 -0
  363. /package/{package → dist/package}/entity/pagination/pagination.dto.d.ts +0 -0
  364. /package/{package → dist/package}/entity/payment/payment.enum.d.ts +0 -0
  365. /package/{package → dist/package}/entity/printer/printer.do.d.ts +0 -0
  366. /package/{package → dist/package}/entity/queue/queue.do.d.ts +0 -0
  367. /package/{package → dist/package}/entity/queue/queue.dto.d.ts +0 -0
  368. /package/{package → dist/package}/entity/queue/queue.enum.d.ts +0 -0
  369. /package/{package → dist/package}/entity/restaurant/restaurant.dto.d.ts +0 -0
  370. /package/{package → dist/package}/entity/user/user.do.d.ts +0 -0
  371. /package/{package → dist/package}/entity/websocket/websocket.dto.d.ts +0 -0
  372. /package/{package → dist/package}/entity/websocket/websocket.enum.d.ts +0 -0
@@ -0,0 +1,44 @@
1
+ <template>
2
+ <div>
3
+ <FmMenu>
4
+ <template #menu-button>
5
+ <FmButton
6
+ variant="tertiary"
7
+ :label="`Status: ${selectedFilter || 'All'}`"
8
+ append-icon="expand_more"
9
+ class="text-fm-color-typo-secondary"
10
+ :style="{ backgroundColor: '#F2F2F7' }"
11
+ />
12
+ </template>
13
+ <FmMenuItem
14
+ :key="'all'"
15
+ :model-value="selectedFilter === null"
16
+ label="All"
17
+ @click="updateFilter(null)"
18
+ />
19
+ <FmMenuItem
20
+ v-for="status in options"
21
+ :key="status.value"
22
+ :model-value="selectedFilter === status.value"
23
+ :label="status.label"
24
+ @click="updateFilter(status.value)"
25
+ />
26
+ </FmMenu>
27
+ </div>
28
+ </template>
29
+
30
+ <script setup lang="ts">
31
+ const props = defineProps<{
32
+ options: { label: string; value: string }[]
33
+ selectedFilter: string | null
34
+ filterType: string
35
+ }>()
36
+
37
+ const emit = defineEmits<{
38
+ (e: 'update:filter', value: { filterType: string; value: string | null }): void
39
+ }>()
40
+
41
+ function updateFilter(value: string | null) {
42
+ emit('update:filter', { filterType: props.filterType, value })
43
+ }
44
+ </script>
@@ -0,0 +1,524 @@
1
+ <script setup lang="ts">
2
+ import { sentenceCase } from 'change-case'
3
+ import { onMounted, ref, computed, watch, h } from 'vue'
4
+ import { F_ORDER_TYPE, FdoRestaurant } from '@feedmepos/core/entity'
5
+ import { orderPlatforms, type Order } from './order'
6
+ import { formatCurrency } from '@/helpers/currency'
7
+ import type { ColumnDef, FmTabProps } from '@feedmepos/ui-library'
8
+ import { useCoreStore } from '@feedmepos/mf-common'
9
+ import { OrderQueryDto } from '@feedmepos/ordering/package/entity'
10
+ import { format, parseISO } from 'date-fns'
11
+ import { restaurantApi } from '@/api/restaurant-setting'
12
+ import ActionMenuCell from './ActionMenuCell.vue'
13
+ import FilterStatus from './FilterStatus.vue'
14
+ import { F_DELIVERY_STATUS } from '@feedmepos/ordering/package/entity'
15
+ import { useDialog } from '@feedmepos/ui-library'
16
+ import ReflowOrder from './ReflowOrder.vue'
17
+ import FilterRestaurant from './FilterRestaurant.vue'
18
+ import { useSnackbarFunctions } from '@/components/snackbar'
19
+ import { remoteOrderApi } from '@/api/remoteOrder'
20
+ import { QInfiniteScroll } from 'quasar'
21
+ const { showSuccess, showError } = useSnackbarFunctions()
22
+
23
+ const loadingPage = ref(true)
24
+ const orders = ref<Order<any>[]>([])
25
+ const orderPlatform = ref(orderPlatforms.FEEDME)
26
+ const menuI = ref<{ label: string; value: FdoRestaurant }[]>([])
27
+ const singleModelValue = ref<FdoRestaurant | null>(null)
28
+ const selectedTab = ref('feedme')
29
+ const tempOrderType = ref<F_ORDER_TYPE[]>([])
30
+ const multiModelValue = ref<Record<string, boolean>>({})
31
+ const selectedFpStatusFilter = ref<string | null>(null)
32
+ const selectedShopeeFoodStatusFilter = ref<string | null>(null)
33
+ const selectedGfStatusFilter = ref<string | null>(null)
34
+ const selectedFeedMeStatusFilter = ref<string | null>(null)
35
+ const restaurant = ref<FdoRestaurant>()
36
+ const loading = ref(false)
37
+ const hasMoreOrder = ref(true)
38
+ const searchValue = ref('')
39
+
40
+ const dataLoadPerReq = 50
41
+ const skip = ref(0)
42
+ const filterSlot = ref('')
43
+ const orderTypes = ref<F_ORDER_TYPE[]>([F_ORDER_TYPE.Enum.DELIVERY])
44
+ const orderTypeFilterOptions = Object.values(F_ORDER_TYPE.Enum).map((type) => ({
45
+ label: sentenceCase(type),
46
+ value: type
47
+ }))
48
+
49
+ const hasFilterRestaurant = computed(() => !!restaurant.value)
50
+ const getOrderReq = computed<OrderQueryDto>(() => ({
51
+ limit: dataLoadPerReq,
52
+ skip: skip.value,
53
+ type: orderTypes.value,
54
+ restaurant: restaurant.value?._id,
55
+ slot: filterSlot.value,
56
+ deliveryStatus: hasFilterRestaurant.value
57
+ ? undefined
58
+ : [
59
+ F_DELIVERY_STATUS.Enum.COMPLETE,
60
+ F_DELIVERY_STATUS.Enum.CANCELED,
61
+ F_DELIVERY_STATUS.Enum.RETURNED
62
+ ]
63
+ }))
64
+ const orderSettingData = computed(() => {
65
+ if (!orders.value.length) return []
66
+
67
+ return orders.value.map((order) => {
68
+ const quoteDeliveryFee = formatCurrency(order.doc?.option?.quoteDeliveryFee?.total) ?? 0
69
+ const actualDeliveryFee = formatCurrency(order.doc?.option?.providers?.at(-1)?.deliveryFee) ?? 0
70
+ const allocatingAt = order.doc?.option?.allocatingAt
71
+ const driverAllocated = allocatingAt ? format(parseISO(allocatingAt), 'dd MMM yyyy, h:mma') : ''
72
+
73
+ return {
74
+ createdAt: order.orderAt?.format('DD MMM YYYY, h:mmA'),
75
+ restaurant: order.restaurant,
76
+ type: sentenceCase(order.orderType),
77
+ slot: order.slot,
78
+ seqNumber: order.seqNumber,
79
+ status: sentenceCase(order.status),
80
+ deliveryFee: `${quoteDeliveryFee} / ${actualDeliveryFee}`,
81
+ driver: driverAllocated
82
+ }
83
+ })
84
+ })
85
+
86
+ const extraInfo = computed((): ColumnDef<any>[] =>
87
+ (orderPlatform.value.extraInfo ?? []).map((info) => ({
88
+ accessorKey: info.name,
89
+ meta: { width: info.option?.style },
90
+ enableSorting: false,
91
+ header: info.label,
92
+ cell: (v: any) => {
93
+ const status = v.row.original.status
94
+ return info.name === 'status'
95
+ ? h('div', { class: getClassForStatus(status) }, status)
96
+ : h('div', {}, v.row.original[info.name])
97
+ }
98
+ }))
99
+ )
100
+
101
+ const columns = computed((): ColumnDef<any>[] => [
102
+ {
103
+ accessorKey: 'createdAt',
104
+ header: () => 'Created at',
105
+ meta: {
106
+ width: '250px'
107
+ },
108
+ enableSorting: false
109
+ },
110
+ {
111
+ accessorKey: 'restaurant.name',
112
+ header: () => 'Restaurant',
113
+ meta: {
114
+ width: '300px'
115
+ },
116
+ enableSorting: false
117
+ },
118
+ {
119
+ accessorKey: 'type',
120
+ header: () => 'Order type',
121
+ enableSorting: false
122
+ },
123
+ {
124
+ accessorKey: 'slot',
125
+ header: () => 'Slot',
126
+ enableSorting: false
127
+ },
128
+ ...extraInfo.value,
129
+ {
130
+ accessorKey: 'action',
131
+ header: () => '',
132
+ meta: {
133
+ width: '50px'
134
+ },
135
+ cell: ({ row }) => {
136
+ const orderId = row.original.slot
137
+ const order = orders.value.find((order) => order.slot === orderId)
138
+
139
+ return h(ActionMenuCell, {
140
+ order: order,
141
+ onActionCompleted: (updatedOrder: any) => updateOrder(row.index, updatedOrder)
142
+ })
143
+ },
144
+ enableSorting: false
145
+ }
146
+ ])
147
+
148
+ const filteredOrderSettingData = computed(() => {
149
+ switch (selectedTab.value) {
150
+ case 'foodpanda':
151
+ return orderSettingData.value.filter(
152
+ (item) =>
153
+ selectedFpStatusFilter.value === null || item.status === selectedFpStatusFilter.value
154
+ )
155
+ case 'shopeefood':
156
+ return orderSettingData.value.filter(
157
+ (item) =>
158
+ selectedShopeeFoodStatusFilter.value === null ||
159
+ item.status === selectedShopeeFoodStatusFilter.value
160
+ )
161
+ case 'grabfood':
162
+ return orderSettingData.value.filter(
163
+ (item) =>
164
+ selectedGfStatusFilter.value === null || item.status === selectedGfStatusFilter.value
165
+ )
166
+ case 'feedme':
167
+ return orderSettingData.value.filter(
168
+ (item) =>
169
+ selectedFeedMeStatusFilter.value === null ||
170
+ item.status === selectedFeedMeStatusFilter.value
171
+ )
172
+ default:
173
+ return orderSettingData.value
174
+ }
175
+ })
176
+
177
+ const selectedLabels = computed(() => {
178
+ const selected = Object.keys(multiModelValue.value)
179
+ .filter((key) => multiModelValue.value[key])
180
+ .map((key) => sentenceCase(key))
181
+
182
+ return selected.length === orderTypeFilterOptions.length
183
+ ? 'Order type: All'
184
+ : selected.length
185
+ ? `Order type: ${selected.join(', ')}`
186
+ : 'Order type: Not set'
187
+ })
188
+
189
+ async function loadOrders() {
190
+ try {
191
+ loading.value = true
192
+ const newOrders = await orderPlatform.value.getOrders(getOrderReq.value)
193
+ if (newOrders.length === 0) {
194
+ hasMoreOrder.value = false
195
+ return
196
+ }
197
+ orders.value = [...orders.value, ...newOrders]
198
+ hasMoreOrder.value = newOrders.length >= dataLoadPerReq
199
+ if (hasMoreOrder.value) {
200
+ skip.value += dataLoadPerReq
201
+ }
202
+ } catch (err) {
203
+ hasMoreOrder.value = false
204
+ } finally {
205
+ loading.value = false
206
+ }
207
+ }
208
+
209
+ function updateOrder(index: number, order?: Order<any>) {
210
+ if (order) orders.value.splice(index, 1, order)
211
+ }
212
+
213
+ const resetFilter = ref(false)
214
+
215
+ const resetProps = computed(() => {
216
+ if (resetFilter.value) {
217
+ return {
218
+ reset: true
219
+ }
220
+ }
221
+ return {}
222
+ })
223
+
224
+ async function reset() {
225
+ restaurant.value = undefined
226
+ filterSlot.value = ''
227
+ singleModelValue.value = null
228
+ orderTypes.value = [F_ORDER_TYPE.Enum.DELIVERY]
229
+ tempOrderType.value = orderTypes.value
230
+ selectedFpStatusFilter.value = null
231
+ selectedGfStatusFilter.value = null
232
+ selectedShopeeFoodStatusFilter.value = null
233
+ resetFilter.value = true
234
+ setTimeout(() => {
235
+ resetFilter.value = false
236
+ }, 0)
237
+
238
+ await refetchOrders()
239
+ }
240
+
241
+ async function refetchOrders() {
242
+ loadingPage.value = true
243
+ skip.value = 0
244
+ orders.value = []
245
+ hasMoreOrder.value = true
246
+ await loadOrders()
247
+ loadingPage.value = false
248
+ }
249
+
250
+ function updateTempOrderType() {
251
+ tempOrderType.value = Object.keys(multiModelValue.value).filter(
252
+ (key) => multiModelValue.value[key]
253
+ ) as F_ORDER_TYPE[]
254
+ }
255
+
256
+ function applyOrderTypeFilter() {
257
+ orderTypes.value = tempOrderType.value
258
+ refetchOrders()
259
+ }
260
+
261
+ function waitForSessionUserInitialization(): Promise<void> {
262
+ return new Promise((resolve) => {
263
+ const interval = setInterval(() => {
264
+ if (useCoreStore().sessionUser.value) {
265
+ clearInterval(interval)
266
+ resolve()
267
+ }
268
+ }, 100)
269
+ })
270
+ }
271
+
272
+ function initializeMultiModelValue() {
273
+ for (const item of orderTypeFilterOptions) {
274
+ multiModelValue.value[item.value] = orderTypes.value.includes(item.value)
275
+ }
276
+ }
277
+
278
+ type StatusType =
279
+ | 'Accepted'
280
+ | 'Draft'
281
+ | 'New'
282
+ | 'Rejected'
283
+ | 'Pending'
284
+ | 'Cancelled'
285
+ | 'Declined'
286
+ | 'Pending payment'
287
+
288
+ function getClassForStatus(status: StatusType): string {
289
+ const baseClass =
290
+ ' bg-fm-color-system-primary-100 fm-typo-en-body-md-600 border fm-corner-radius-lg w-max gap-8 p-4 '
291
+ const statusClasses: Record<StatusType, string> = {
292
+ Draft: baseClass + 'text-fm-color-typo-primary',
293
+ Accepted: baseClass + 'text-fm-color-typo-success bg-fm-color-system-success-100',
294
+ New: baseClass + 'text-fm-color-typo-warning bg-fm-color-system-warning-100',
295
+ Pending: baseClass + 'text-fm-color-typo-warning bg-fm-color-system-warning-100',
296
+ 'Pending payment': baseClass + 'text-fm-color-typo-warning bg-fm-color-system-warning-100',
297
+ Rejected: baseClass + 'text-fm-color-typo-error bg-fm-color-system-error-100',
298
+ Declined: baseClass + 'text-fm-color-typo-error bg-fm-color-system-error-100',
299
+ Cancelled: baseClass + 'text-fm-color-typo-error bg-fm-color-system-error-100'
300
+ }
301
+ return statusClasses[status] || baseClass + 'text-fm-color-typo-primary'
302
+ }
303
+
304
+ function toggleItem(value: string | number): void {
305
+ multiModelValue.value[value] = !multiModelValue.value[value]
306
+ updateTempOrderType()
307
+ applyOrderTypeFilter()
308
+ }
309
+
310
+ watch(singleModelValue, (newValue) => {
311
+ if (newValue) {
312
+ restaurant.value = newValue
313
+ refetchOrders()
314
+ }
315
+ })
316
+
317
+ watch(
318
+ tempOrderType,
319
+ (newSelection) => {
320
+ const newSelectionSet = new Set(newSelection)
321
+ for (const key in multiModelValue.value) {
322
+ multiModelValue.value[key] = newSelectionSet.has(key as F_ORDER_TYPE)
323
+ }
324
+ },
325
+ { immediate: true }
326
+ )
327
+
328
+ watch(selectedTab, async (newPlatform) => {
329
+ switch (newPlatform) {
330
+ case 'feedme':
331
+ await selectOrderPlatform('FEEDME')
332
+ break
333
+ case 'grabfood':
334
+ await selectOrderPlatform('GRAB_FOOD')
335
+ break
336
+ case 'foodpanda':
337
+ await selectOrderPlatform('FOOD_PANDA')
338
+ break
339
+ case 'shopeefood':
340
+ await selectOrderPlatform('SHOPEE_FOOD')
341
+ }
342
+ })
343
+
344
+ onMounted(async () => {
345
+ if (!useCoreStore().sessionUser.value) {
346
+ await waitForSessionUserInitialization()
347
+ }
348
+ const res = await restaurantApi.admin.readAllManagable()
349
+ menuI.value = res.map((item: any) => ({
350
+ label: item.profile.name,
351
+ value: item as FdoRestaurant
352
+ }))
353
+
354
+ await loadOrders()
355
+ loadingPage.value = false
356
+
357
+ initializeMultiModelValue()
358
+ })
359
+
360
+ const menuItems: FmTabProps[] = [
361
+ { label: 'FeedMe', value: 'feedme' },
362
+ { label: 'Grabfood', value: 'grabfood' },
363
+ { label: 'Foodpanda', value: 'foodpanda' },
364
+ { label: 'Shopeefood', value: 'shopeefood' }
365
+ ]
366
+
367
+ async function selectOrderPlatform(platform: string) {
368
+ orderPlatform.value = orderPlatforms[platform]
369
+ loadingPage.value = true
370
+ await refetchOrders()
371
+ loadingPage.value = false
372
+ }
373
+
374
+ const dialog = useDialog()
375
+
376
+ const openDialog = () => {
377
+ let reflowData: any
378
+ dialog
379
+ .open({
380
+ title: 'Reflow order',
381
+ primaryActions: { text: 'Reflow', close: false },
382
+ contentComponent: ReflowOrder,
383
+ contentComponentProps: {
384
+ menuItems: menuI.value,
385
+ 'onUpdate:modelValue': (v: any) => {
386
+ reflowData = v
387
+ }
388
+ }
389
+ })
390
+ .onPrimary(async () => {
391
+ const { platformValue, restaurant, slot, formattedDate } = reflowData
392
+ const res = await reflowOrder(platformValue, restaurant, slot, formattedDate)
393
+ if (res) {
394
+ dialog.close()
395
+ await refetchOrders()
396
+ }
397
+ })
398
+ }
399
+
400
+ async function reflowOrder(
401
+ platformValue: string,
402
+ restaurant: FdoRestaurant,
403
+ slot: string,
404
+ formattedDate: string
405
+ ) {
406
+ try {
407
+ if (!platformValue) {
408
+ showError('Platform is required')
409
+ return
410
+ }
411
+
412
+ if (!restaurant) {
413
+ showError('Restaurant is required')
414
+ return
415
+ }
416
+
417
+ if (platformValue === 'grabfood') {
418
+ await remoteOrderApi.integratedDelivery.reflowGfOrderNotInDb({
419
+ restaurantId: restaurant._id,
420
+ slot: `GF-${slot}`,
421
+ date: formattedDate
422
+ })
423
+ } else if (platformValue === 'foodpanda') {
424
+ await remoteOrderApi.integratedDelivery.reflowFpOrderNotInDb({
425
+ restaurantId: restaurant._id,
426
+ slot: slot
427
+ })
428
+ }
429
+
430
+ showSuccess('Order reflowed successfully')
431
+ return true
432
+ } catch (error: any) {
433
+ const errorMessage = error?.message || 'An unknown error occurred. Please try again.'
434
+ showError(`${errorMessage}`)
435
+ }
436
+ }
437
+
438
+ function handleRestaurantSelected(restaurant: FdoRestaurant) {
439
+ singleModelValue.value = restaurant
440
+ }
441
+
442
+ function onLoad(index: number, done: () => void) {
443
+ if (hasMoreOrder.value && !loading.value) {
444
+ loadOrders().finally(done)
445
+ } else {
446
+ done()
447
+ }
448
+ }
449
+ </script>
450
+
451
+ <template>
452
+ <div>
453
+ <FmTabs v-model:model-value="selectedTab" :items="menuItems" :disabled="loadingPage" />
454
+ </div>
455
+ <div class="flex justify-between items-center mb-5 mt-5">
456
+ <div class="flex items-center space-x-4">
457
+ <FilterRestaurant
458
+ :menu-items="menuI"
459
+ label="All restaurant"
460
+ v-model="singleModelValue"
461
+ @restaurant-selected="handleRestaurantSelected"
462
+ />
463
+
464
+ <FmMenu :close-on-click="false" v-if="selectedTab === 'feedme'">
465
+ <template #menu-button>
466
+ <FmButton
467
+ variant="tertiary"
468
+ :label="selectedLabels"
469
+ prepend-icon="takeout_dining"
470
+ append-icon="expand_more"
471
+ class="text-fm-color-typo-secondary"
472
+ :style="{ backgroundColor: '#F2F2F7' }"
473
+ />
474
+ </template>
475
+ <FmMenuItem
476
+ v-for="item in orderTypeFilterOptions"
477
+ :key="item.value"
478
+ :model-value="multiModelValue[item.value] || false"
479
+ has-checkbox
480
+ :label="item.label"
481
+ @click="toggleItem(item.value)"
482
+ />
483
+ </FmMenu>
484
+ <FilterStatus
485
+ :selected-tab="selectedTab"
486
+ :has-restaurant="hasFilterRestaurant"
487
+ :reset="resetProps.reset"
488
+ @update:selectedFpStatusFilter="(value) => (selectedFpStatusFilter = value)"
489
+ @update:selectedShopeeFoodStatusFilter="(value) => (selectedShopeeFoodStatusFilter = value)"
490
+ @update:selectedGfStatusFilter="(value) => (selectedGfStatusFilter = value)"
491
+ @update:selectedFeedMeStatusFilter="
492
+ (value: string | null) => (selectedFeedMeStatusFilter = value)
493
+ "
494
+ />
495
+ </div>
496
+
497
+ <div class="flex items-center">
498
+ <FmButton label="Reflow order" @click="openDialog" class="mr-5" />
499
+ <FmSearch v-model:modelValue="searchValue" placeholder="Search" />
500
+ <FmButton icon="sync" variant="tertiary" @click="reset" class="ml-2" />
501
+ </div>
502
+ </div>
503
+
504
+ <div v-if="loadingPage" class="flex justify-center h-3/5">
505
+ <FmCircularProgress size="xxl" />
506
+ </div>
507
+
508
+ <div class="flex-nowrap text-nowrap">
509
+ <q-infinite-scroll @load="onLoad" :offset="250">
510
+ <FmTable
511
+ v-if="!loadingPage && filteredOrderSettingData.length > 0"
512
+ :row-data="filteredOrderSettingData"
513
+ :column-defs="columns"
514
+ :search-value="searchValue"
515
+ :hideFooter="true"
516
+ :pageSize="filteredOrderSettingData.length"
517
+ />
518
+ </q-infinite-scroll>
519
+ <FmCircularProgress size="xl" v-if="hasMoreOrder && !loadingPage"/>
520
+ <div v-if="!loadingPage && filteredOrderSettingData.length === 0" class="m-5">
521
+ No results found.
522
+ </div>
523
+ </div>
524
+ </template>
@@ -0,0 +1,105 @@
1
+ <script lang="ts" setup>
2
+ import { FdoRestaurant } from '@feedmepos/core/entity'
3
+ import { ref, watch } from 'vue'
4
+ import { useSnackbarFunctions } from '@/components/snackbar'
5
+ import FilterRestaurant from './FilterRestaurant.vue'
6
+ import moment from 'moment'
7
+
8
+ const platformOptions = [
9
+ { label: 'GrabFood', value: 'grabfood' },
10
+ { label: 'FoodPanda', value: 'foodpanda' }
11
+ ]
12
+
13
+ const selectedPlatform = ref<string | null>(null)
14
+ const selectedRestaurant = ref<FdoRestaurant | null>(null)
15
+ const slotValue = ref('')
16
+
17
+ const dateValue = ref<Date>(new Date())
18
+ const dateString = moment(dateValue.value).format('YYYY-MM-DD')
19
+ const formattedDate = ref<string | null>(dateString)
20
+ const props = defineProps<{
21
+ menuItems: { label: string; value: FdoRestaurant }[]
22
+ }>()
23
+ const menuI = ref<{ label: string; value: FdoRestaurant }[]>(props.menuItems)
24
+
25
+ const singleModelValue = ref<FdoRestaurant | null>(null)
26
+
27
+ const emits = defineEmits<{
28
+ (
29
+ e: 'update:model-value',
30
+ payload: {
31
+ platformValue: string | null
32
+ restaurant: FdoRestaurant | null
33
+ slot: string
34
+ formattedDate: string | null
35
+ }
36
+ ): void
37
+ }>()
38
+
39
+ function emitUpdate() {
40
+ emits('update:model-value', {
41
+ platformValue: selectedPlatform.value,
42
+ restaurant: selectedRestaurant.value,
43
+ slot: slotValue.value,
44
+ formattedDate: formattedDate.value
45
+ })
46
+ }
47
+
48
+ function handleRestaurantSelected(restaurant: FdoRestaurant) {
49
+ selectedRestaurant.value = restaurant
50
+ emitUpdate()
51
+ }
52
+
53
+ watch([selectedPlatform, selectedRestaurant, slotValue, formattedDate], () => {
54
+ emitUpdate()
55
+ })
56
+ </script>
57
+
58
+ <template>
59
+ <div>
60
+ <FilterRestaurant
61
+ :menu-items="menuI"
62
+ label="Please select restaurant"
63
+ v-model="singleModelValue"
64
+ @restaurant-selected="handleRestaurantSelected"
65
+ />
66
+ <div class="mt-5"></div>
67
+ <FmSelect v-model="selectedPlatform" label="Platform" :items="platformOptions" />
68
+
69
+ <div class="mt-3"></div>
70
+ <FmTextField
71
+ v-model="slotValue"
72
+ label="Slot"
73
+ placeholder="Enter slot"
74
+ v-if="['grabfood', 'foodpanda'].includes(selectedPlatform ?? '')"
75
+ :rules="[(val) => !!val || 'This field is required']"
76
+ >
77
+ <template #prepend>
78
+ {{ selectedPlatform === 'grabfood' ? 'GF-' : 'FP-' }}
79
+ </template>
80
+ </FmTextField>
81
+
82
+ <div v-if="selectedPlatform === 'grabfood'">
83
+ <div class="mt-3"></div>
84
+ <FmDatePicker
85
+ v-model="dateString"
86
+ label="Date"
87
+ :rules="[
88
+ (val: any) => {
89
+ const today = new Date()
90
+ const selectedDate = new Date(val)
91
+ if (selectedDate > today) {
92
+ return 'Date cannot be in the future'
93
+ }
94
+ return true
95
+ }
96
+ ]"
97
+ @update:modelValue="
98
+ (v: any) => {
99
+ formattedDate = v
100
+ }
101
+ "
102
+ />
103
+ </div>
104
+ </div>
105
+ </template>