@fleetbase/storefront-engine 0.0.1

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 (296) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +32 -0
  3. package/addon/adapters/addon-category.js +1 -0
  4. package/addon/adapters/customer.js +1 -0
  5. package/addon/adapters/gateway.js +1 -0
  6. package/addon/adapters/network.js +1 -0
  7. package/addon/adapters/notification-channel.js +1 -0
  8. package/addon/adapters/product-addon-category.js +1 -0
  9. package/addon/adapters/product-addon.js +1 -0
  10. package/addon/adapters/product-hour.js +1 -0
  11. package/addon/adapters/product-store-location.js +1 -0
  12. package/addon/adapters/product-variant-option.js +1 -0
  13. package/addon/adapters/product-variant.js +1 -0
  14. package/addon/adapters/product.js +1 -0
  15. package/addon/adapters/store-hour.js +1 -0
  16. package/addon/adapters/store-location.js +1 -0
  17. package/addon/adapters/store.js +1 -0
  18. package/addon/adapters/storefront.js +5 -0
  19. package/addon/components/file-record.hbs +22 -0
  20. package/addon/components/file-record.js +43 -0
  21. package/addon/components/modals/add-store-hours.hbs +8 -0
  22. package/addon/components/modals/add-stores-to-network.hbs +5 -0
  23. package/addon/components/modals/assign-driver.hbs +25 -0
  24. package/addon/components/modals/create-first-store.hbs +21 -0
  25. package/addon/components/modals/create-gateway.hbs +35 -0
  26. package/addon/components/modals/create-network-category.hbs +50 -0
  27. package/addon/components/modals/create-network.hbs +20 -0
  28. package/addon/components/modals/create-new-variant.hbs +15 -0
  29. package/addon/components/modals/create-notification-channel.hbs +45 -0
  30. package/addon/components/modals/create-product-category.hbs +30 -0
  31. package/addon/components/modals/create-store.hbs +9 -0
  32. package/addon/components/modals/edit-network.hbs +1 -0
  33. package/addon/components/modals/import-products.hbs +97 -0
  34. package/addon/components/modals/incoming-order.hbs +242 -0
  35. package/addon/components/modals/manage-addons.hbs +50 -0
  36. package/addon/components/modals/manage-addons.js +86 -0
  37. package/addon/components/modals/order-ready-assign-driver.hbs +36 -0
  38. package/addon/components/modals/select-addon-category.hbs +5 -0
  39. package/addon/components/modals/share-network.hbs +35 -0
  40. package/addon/components/modals/store-location-form.hbs +30 -0
  41. package/addon/components/order-card.hbs +1 -0
  42. package/addon/components/order-card.js +3 -0
  43. package/addon/components/schedule-manager.hbs +22 -0
  44. package/addon/components/schedule-manager.js +73 -0
  45. package/addon/components/settings-container.hbs +7 -0
  46. package/addon/components/store-selector.hbs +21 -0
  47. package/addon/components/store-selector.js +20 -0
  48. package/addon/components/widget/customers.hbs +44 -0
  49. package/addon/components/widget/customers.js +53 -0
  50. package/addon/components/widget/orders.hbs +111 -0
  51. package/addon/components/widget/orders.js +248 -0
  52. package/addon/components/widget/storefront-metrics.hbs +54 -0
  53. package/addon/components/widget/storefront-metrics.js +61 -0
  54. package/addon/controllers/application.js +33 -0
  55. package/addon/controllers/customers/index.js +267 -0
  56. package/addon/controllers/home.js +3 -0
  57. package/addon/controllers/networks/index/network/customers.js +3 -0
  58. package/addon/controllers/networks/index/network/index.js +147 -0
  59. package/addon/controllers/networks/index/network/orders.js +3 -0
  60. package/addon/controllers/networks/index/network/stores.js +370 -0
  61. package/addon/controllers/networks/index/network.js +29 -0
  62. package/addon/controllers/networks/index.js +138 -0
  63. package/addon/controllers/orders/index.js +331 -0
  64. package/addon/controllers/products/index/category/edit.js +62 -0
  65. package/addon/controllers/products/index/category/new.js +287 -0
  66. package/addon/controllers/products/index/category.js +163 -0
  67. package/addon/controllers/products/index/index/edit.js +1 -0
  68. package/addon/controllers/products/index/index.js +136 -0
  69. package/addon/controllers/products/index.js +203 -0
  70. package/addon/controllers/settings/api.js +3 -0
  71. package/addon/controllers/settings/gateways.js +110 -0
  72. package/addon/controllers/settings/index.js +102 -0
  73. package/addon/controllers/settings/locations.js +186 -0
  74. package/addon/controllers/settings/notifications.js +102 -0
  75. package/addon/engine.js +19 -0
  76. package/addon/helpers/get-tip-amount.js +5 -0
  77. package/addon/models/addon-category.js +6 -0
  78. package/addon/models/gateway.js +46 -0
  79. package/addon/models/network.js +166 -0
  80. package/addon/models/notification-channel.js +47 -0
  81. package/addon/models/product-addon-category.js +41 -0
  82. package/addon/models/product-addon.js +41 -0
  83. package/addon/models/product-hour.js +72 -0
  84. package/addon/models/product-store-location.js +41 -0
  85. package/addon/models/product-variant-option.js +39 -0
  86. package/addon/models/product-variant.js +44 -0
  87. package/addon/models/product.js +208 -0
  88. package/addon/models/store-hour.js +72 -0
  89. package/addon/models/store-location.js +93 -0
  90. package/addon/models/store.js +100 -0
  91. package/addon/routes/application.js +47 -0
  92. package/addon/routes/customers/index/edit.js +3 -0
  93. package/addon/routes/customers/index.js +25 -0
  94. package/addon/routes/home.js +3 -0
  95. package/addon/routes/networks/index/network/customers.js +3 -0
  96. package/addon/routes/networks/index/network/index.js +15 -0
  97. package/addon/routes/networks/index/network/orders.js +3 -0
  98. package/addon/routes/networks/index/network/stores.js +28 -0
  99. package/addon/routes/networks/index/network.js +10 -0
  100. package/addon/routes/networks/index.js +19 -0
  101. package/addon/routes/orders/index/edit.js +3 -0
  102. package/addon/routes/orders/index/new.js +3 -0
  103. package/addon/routes/orders/index/view.js +3 -0
  104. package/addon/routes/orders/index.js +29 -0
  105. package/addon/routes/products/index/category/edit.js +15 -0
  106. package/addon/routes/products/index/category/new.js +7 -0
  107. package/addon/routes/products/index/category.js +54 -0
  108. package/addon/routes/products/index/index/edit.js +1 -0
  109. package/addon/routes/products/index/index.js +22 -0
  110. package/addon/routes/products/index.js +21 -0
  111. package/addon/routes/settings/api.js +10 -0
  112. package/addon/routes/settings/gateways.js +11 -0
  113. package/addon/routes/settings/index.js +16 -0
  114. package/addon/routes/settings/locations.js +14 -0
  115. package/addon/routes/settings/notifications.js +11 -0
  116. package/addon/routes.js +48 -0
  117. package/addon/serializers/addon-category.js +15 -0
  118. package/addon/serializers/network.js +19 -0
  119. package/addon/serializers/notification-channel.js +15 -0
  120. package/addon/serializers/product-addon-category.js +15 -0
  121. package/addon/serializers/product-variant.js +15 -0
  122. package/addon/serializers/product.js +20 -0
  123. package/addon/serializers/store-location.js +17 -0
  124. package/addon/serializers/store.js +19 -0
  125. package/addon/services/storefront.js +208 -0
  126. package/addon/templates/application.hbs +16 -0
  127. package/addon/templates/customers/index/edit.hbs +2 -0
  128. package/addon/templates/customers/index.hbs +22 -0
  129. package/addon/templates/home.hbs +7 -0
  130. package/addon/templates/networks/index/network/customers.hbs +2 -0
  131. package/addon/templates/networks/index/network/index.hbs +254 -0
  132. package/addon/templates/networks/index/network/orders.hbs +2 -0
  133. package/addon/templates/networks/index/network/stores.hbs +164 -0
  134. package/addon/templates/networks/index/network.hbs +38 -0
  135. package/addon/templates/networks/index.hbs +60 -0
  136. package/addon/templates/orders/index/edit.hbs +2 -0
  137. package/addon/templates/orders/index/new.hbs +2 -0
  138. package/addon/templates/orders/index/view.hbs +2 -0
  139. package/addon/templates/orders/index.hbs +22 -0
  140. package/addon/templates/products/index/category/edit.hbs +1 -0
  141. package/addon/templates/products/index/category/new.hbs +248 -0
  142. package/addon/templates/products/index/category.hbs +41 -0
  143. package/addon/templates/products/index/index/edit.hbs +1 -0
  144. package/addon/templates/products/index/index.hbs +40 -0
  145. package/addon/templates/products/index.hbs +22 -0
  146. package/addon/templates/settings/api.hbs +18 -0
  147. package/addon/templates/settings/gateways.hbs +48 -0
  148. package/addon/templates/settings/index.hbs +229 -0
  149. package/addon/templates/settings/locations.hbs +39 -0
  150. package/addon/templates/settings/notifications.hbs +35 -0
  151. package/addon/templates/settings.hbs +30 -0
  152. package/addon/utils/get-gateway-schemas.js +34 -0
  153. package/addon/utils/get-notification-schemas.js +18 -0
  154. package/app/adapters/addon-category.js +1 -0
  155. package/app/adapters/gateway.js +1 -0
  156. package/app/adapters/network.js +1 -0
  157. package/app/adapters/notification-channel.js +1 -0
  158. package/app/adapters/product-addon-category.js +1 -0
  159. package/app/adapters/product-addon.js +1 -0
  160. package/app/adapters/product-hour.js +1 -0
  161. package/app/adapters/product-store-location.js +1 -0
  162. package/app/adapters/product-variant-option.js +1 -0
  163. package/app/adapters/product-variant.js +1 -0
  164. package/app/adapters/product.js +1 -0
  165. package/app/adapters/store-hour.js +1 -0
  166. package/app/adapters/store-location.js +1 -0
  167. package/app/adapters/store.js +1 -0
  168. package/app/adapters/storefront.js +1 -0
  169. package/app/components/file-record.js +1 -0
  170. package/app/components/modals/add-store-hours.js +1 -0
  171. package/app/components/modals/add-stores-to-network.js +1 -0
  172. package/app/components/modals/assign-driver.js +1 -0
  173. package/app/components/modals/create-first-store.js +1 -0
  174. package/app/components/modals/create-gateway.js +1 -0
  175. package/app/components/modals/create-network-category.js +1 -0
  176. package/app/components/modals/create-network.js +1 -0
  177. package/app/components/modals/create-new-variant.js +1 -0
  178. package/app/components/modals/create-notification-channel.js +1 -0
  179. package/app/components/modals/create-product-category.js +1 -0
  180. package/app/components/modals/create-store.js +1 -0
  181. package/app/components/modals/edit-network.js +1 -0
  182. package/app/components/modals/import-products.js +1 -0
  183. package/app/components/modals/incoming-order.js +1 -0
  184. package/app/components/modals/manage-addons.js +1 -0
  185. package/app/components/modals/order-ready-assign-driver.js +1 -0
  186. package/app/components/modals/select-addon-category.js +1 -0
  187. package/app/components/modals/share-network.js +1 -0
  188. package/app/components/modals/store-location-form.js +1 -0
  189. package/app/components/order-card.js +1 -0
  190. package/app/components/schedule-manager.js +1 -0
  191. package/app/components/settings-container.js +1 -0
  192. package/app/components/store-selector.js +1 -0
  193. package/app/components/widget/customers.js +1 -0
  194. package/app/components/widget/orders.js +1 -0
  195. package/app/components/widget/storefront-metrics.js +1 -0
  196. package/app/controllers/application.js +1 -0
  197. package/app/controllers/customers/index.js +1 -0
  198. package/app/controllers/home.js +1 -0
  199. package/app/controllers/networks/index/network/customers.js +1 -0
  200. package/app/controllers/networks/index/network/index.js +1 -0
  201. package/app/controllers/networks/index/network/orders.js +1 -0
  202. package/app/controllers/networks/index/network/stores.js +1 -0
  203. package/app/controllers/networks/index/network.js +1 -0
  204. package/app/controllers/networks/index.js +1 -0
  205. package/app/controllers/orders/index.js +1 -0
  206. package/app/controllers/products/index/category/edit.js +1 -0
  207. package/app/controllers/products/index/category/new.js +1 -0
  208. package/app/controllers/products/index/category.js +1 -0
  209. package/app/controllers/products/index/index/edit.js +1 -0
  210. package/app/controllers/products/index/index.js +1 -0
  211. package/app/controllers/products/index.js +1 -0
  212. package/app/controllers/settings/api.js +1 -0
  213. package/app/controllers/settings/gateways.js +1 -0
  214. package/app/controllers/settings/index.js +1 -0
  215. package/app/controllers/settings/locations.js +1 -0
  216. package/app/controllers/settings/notifications.js +1 -0
  217. package/app/helpers/get-tip-amount.js +1 -0
  218. package/app/models/addon-category.js +1 -0
  219. package/app/models/gateway.js +1 -0
  220. package/app/models/network.js +1 -0
  221. package/app/models/notification-channel.js +1 -0
  222. package/app/models/product-addon-category.js +1 -0
  223. package/app/models/product-addon.js +1 -0
  224. package/app/models/product-hour.js +1 -0
  225. package/app/models/product-store-location.js +1 -0
  226. package/app/models/product-variant-option.js +1 -0
  227. package/app/models/product-variant.js +1 -0
  228. package/app/models/product.js +1 -0
  229. package/app/models/store-hour.js +1 -0
  230. package/app/models/store-location.js +1 -0
  231. package/app/models/store.js +1 -0
  232. package/app/routes/application.js +1 -0
  233. package/app/routes/customers/index/edit.js +1 -0
  234. package/app/routes/customers/index.js +1 -0
  235. package/app/routes/home.js +1 -0
  236. package/app/routes/networks/index/network/customers.js +1 -0
  237. package/app/routes/networks/index/network/index.js +1 -0
  238. package/app/routes/networks/index/network/orders.js +1 -0
  239. package/app/routes/networks/index/network/stores.js +1 -0
  240. package/app/routes/networks/index/network.js +1 -0
  241. package/app/routes/networks/index.js +1 -0
  242. package/app/routes/orders/index/edit.js +1 -0
  243. package/app/routes/orders/index/new.js +1 -0
  244. package/app/routes/orders/index/view.js +1 -0
  245. package/app/routes/orders/index.js +1 -0
  246. package/app/routes/products/index/category/edit.js +1 -0
  247. package/app/routes/products/index/category/new.js +1 -0
  248. package/app/routes/products/index/category.js +1 -0
  249. package/app/routes/products/index/index/edit.js +1 -0
  250. package/app/routes/products/index/index.js +1 -0
  251. package/app/routes/products/index.js +1 -0
  252. package/app/routes/settings/api.js +1 -0
  253. package/app/routes/settings/gateways.js +1 -0
  254. package/app/routes/settings/index.js +1 -0
  255. package/app/routes/settings/locations.js +1 -0
  256. package/app/routes/settings/notifications.js +1 -0
  257. package/app/serializers/addon-category.js +1 -0
  258. package/app/serializers/network.js +1 -0
  259. package/app/serializers/notification-channel.js +1 -0
  260. package/app/serializers/product-addon-category.js +1 -0
  261. package/app/serializers/product-variant.js +1 -0
  262. package/app/serializers/product.js +1 -0
  263. package/app/serializers/store-location.js +1 -0
  264. package/app/serializers/store.js +1 -0
  265. package/app/services/storefront.js +1 -0
  266. package/app/templates/customers/index/edit.js +1 -0
  267. package/app/templates/customers/index.js +1 -0
  268. package/app/templates/home.js +1 -0
  269. package/app/templates/networks/index/network/customers.js +1 -0
  270. package/app/templates/networks/index/network/index.js +1 -0
  271. package/app/templates/networks/index/network/orders.js +1 -0
  272. package/app/templates/networks/index/network/stores.js +1 -0
  273. package/app/templates/networks/index/network.js +1 -0
  274. package/app/templates/networks/index.js +1 -0
  275. package/app/templates/orders/index/edit.js +1 -0
  276. package/app/templates/orders/index/new.js +1 -0
  277. package/app/templates/orders/index/view.js +1 -0
  278. package/app/templates/orders/index.js +1 -0
  279. package/app/templates/products/index/category/edit.js +1 -0
  280. package/app/templates/products/index/category/new.js +1 -0
  281. package/app/templates/products/index/category.js +1 -0
  282. package/app/templates/products/index/index/edit.js +1 -0
  283. package/app/templates/products/index/index.js +1 -0
  284. package/app/templates/products/index.js +1 -0
  285. package/app/templates/settings/api.js +1 -0
  286. package/app/templates/settings/gateways.js +1 -0
  287. package/app/templates/settings/index.js +1 -0
  288. package/app/templates/settings/locations.js +1 -0
  289. package/app/templates/settings/notifications.js +1 -0
  290. package/app/templates/settings.js +1 -0
  291. package/app/utils/get-gateway-schemas.js +1 -0
  292. package/app/utils/get-notification-schemas.js +1 -0
  293. package/config/environment.js +21 -0
  294. package/index.js +22 -0
  295. package/package.json +123 -0
  296. package/pnpm-lock.yaml +12509 -0
@@ -0,0 +1,40 @@
1
+ <Layout::Section::Header @title="All Products" @searchQuery={{this.query}} @onSearch={{perform this.search}} />
2
+
3
+ <Layout::Section::Body>
4
+ <div class="h-screen overflow-y-scroll p-6">
5
+ <div class="grid grid-cols-2 md:grid-cols-4 gap-4">
6
+ {{#each @model as |product|}}
7
+ <div class="border border-gray-200 bg-white dark:bg-gray-900 dark:text-gray-100 dark:border-gray-700 text-center rounded-md px-2 py-3">
8
+ <div class="flex flex-col items-center justify-center overflow-hidden">
9
+ <div class="mb-3 flex items-center justify-center">
10
+ <img src={{product.primary_image_url}} alt={{product.name}} class="w-24 h-24" />
11
+ </div>
12
+ <h4 class="font-semibold mb-1">{{product.name}}</h4>
13
+ <p class="text-sm truncate">{{product.description}}</p>
14
+ <p class="mb-2 text-sm text-green-400">{{format-currency product.price product.currency}}</p>
15
+ <div class="flex items-center justify-evenly space-x-4">
16
+ <LinkTo @route="products.index.index.edit" @model={{product}} class="text-sm">
17
+ <FaIcon @icon="pencil" class="mr-1" />
18
+ <span class="destroy-action">Edit</span>
19
+ </LinkTo>
20
+ <a href="javascript:;" class="destroy-action text-sm" {{on "click" (fn this.deleteProduct product)}}>
21
+ <FaIcon @icon="trash" class="text-red-500 mr-1" />
22
+ <span class="destroy-action">Delete</span>
23
+ </a>
24
+ </div>
25
+ </div>
26
+ </div>
27
+ {{else}}
28
+ <div>
29
+ <h3 class="dark:text-gray-100 text-opacity-75 text-sm">No products</h3>
30
+ </div>
31
+ {{/each}}
32
+ </div>
33
+ </div>
34
+ </Layout::Section::Body>
35
+
36
+ <Layout::Section::Footer>
37
+ <Pagination @meta={{@model.meta}} @currentPage={{this.page}} @onPageChange={{fn (mut this.page)}} />
38
+ </Layout::Section::Footer>
39
+
40
+ {{outlet}}
@@ -0,0 +1,22 @@
1
+ <Layout::Section::Header @title="Products">
2
+ <Button @type="magic" @icon="tags" @text="Manage Addons" class="mr-2 flex-shrink-0" @onClick={{this.manageAddons}} />
3
+ <Button @type="primary" @icon="plus" @iconPrefix="fas" @text="New" class="mr-2 flex-shrink-0" @onClick={{this.createNewProduct}} @disabled={{not this.category}} @helpText={{unless this.category "Select a category to create a product within"}} />
4
+ <Button @icon="file-import" @text="Import" class="mr-2" @wrapperClass="hidden lg:flex flex-shrink-0" @onClick={{this.importProducts}} />
5
+ <Button @icon="long-arrow-up" @iconClass="rotate-icon-45" @wrapperClass="hidden lg:flex flex-shrink-0" @text="Export" />
6
+ </Layout::Section::Header>
7
+
8
+ <Layout::Section::Body class="section-content flex flex-col lg:flex-row">
9
+ <AsideItemScroller @title="Product Categories" @resource="category" @items={{@model}} @titleKey="name" @onCreate={{this.createNewProductCategory}} @onInit={{this.setAsideScroller}} @customTopItemComponent="aside-item-scroller/item" @customTopItemText="All Products" @customTopItemOnClick={{this.viewAllProducts}} @customTopItemClass="border-t border-gray-200 dark:border-gray-700" as |category dd|>
10
+ <a href="javascript:;" class="aside-item-link cursor-pointer flex w-full md:px-6 md:py-5" {{on "click" (fn this.switchCategory category)}}>
11
+ <div class="flex items-center justify-between">
12
+ <div>
13
+ <h4>{{category.name}}</h4>
14
+ </div>
15
+ </div>
16
+ </a>
17
+ </AsideItemScroller>
18
+
19
+ <div id="productsViewPort" class="w-full h-full">
20
+ {{outlet}}
21
+ </div>
22
+ </Layout::Section::Body>
@@ -0,0 +1,18 @@
1
+ <SettingsContainer>
2
+ <form>
3
+ <div class="space-y-6">
4
+ <div>
5
+ <h1 class="text-lg leading-6 font-bold text-gray-900 dark:text-gray-100">
6
+ API Settings
7
+ </h1>
8
+ <p class="mt-1 text-sm text-gray-500">
9
+ Access key for Storefront API & Integrations.
10
+ </p>
11
+ </div>
12
+
13
+ <InputGroup @name="Store Key" @helpText="This is your store key, use this to enable apps and integrations for your storefront.">
14
+ <ClickToReveal @value={{@model.key}} @clickToCopy={{true}} class="form-input disabled" />
15
+ </InputGroup>
16
+ </div>
17
+ </form>
18
+ </SettingsContainer>
@@ -0,0 +1,48 @@
1
+ <SettingsContainer>
2
+ <form>
3
+ <div class="space-y-6">
4
+ <div class="flex justify-between">
5
+ <div>
6
+ <h1 class="text-lg leading-6 font-bold text-gray-900 dark:text-gray-100">
7
+ Gateway Settings
8
+ </h1>
9
+ <p class="mt-1 text-sm text-gray-500">
10
+ Add or manage your payment gateway settings here.
11
+ </p>
12
+ </div>
13
+ <div>
14
+ <Button @icon="plus" @iconPrefix="fas" @type="primary" @text="Create new gateway" @onClick={{this.createGateway}} />
15
+ </div>
16
+ </div>
17
+
18
+ {{#each this.gateways as |gateway|}}
19
+ <ContentPanel @title={{gateway.name}} @open={{true}} @pad={{true}}>
20
+ <InputGroup @name="Gateway name" @value={{gateway.name}} @helpText="Give your payment gateway a name, this will only be relevent internally" />
21
+ <InputGroup @name="Gateway code" @value={{gateway.code}} @disabled={{true}} @helpText="Identifier code used to identify gateway to the SDK" />
22
+ <InputGroup @name="Callback URL" @value={{gateway.callback_url}} @helpText="Callback URL if applicable" />
23
+ <InputGroup @name="Return URL" @value={{gateway.return_url}} @helpText="Return URL if applicable" />
24
+ <div class="input-group">
25
+ <Checkbox @value={{gateway.sandbox}} @label="This is a sandbox gateway" @onToggle={{fn (mut gateway.sandbox)}} />
26
+ </div>
27
+ <div>
28
+ <h4 class="mb-2 font-semibold text-sm dark:text-white">Config</h4>
29
+ {{#each-in gateway.config as |key value|}}
30
+ {{#if (is-bool-value value)}}
31
+ <div class="input-group">
32
+ <Checkbox @value={{value}} @label={{humanize key}} />
33
+ </div>
34
+ {{else}}
35
+ <InputGroup @name={{humanize key}}>
36
+ <Input class="form-input w-full" placeholder={{humanize key}} @value={{value}} />
37
+ </InputGroup>
38
+ {{/if}}
39
+ {{/each-in}}
40
+ </div>
41
+ <div>
42
+ <Button @size="sm" @type="danger" @icon="trash" @text="Delete payment gateway" @onClick={{fn this.deleteGateway gateway}} />
43
+ </div>
44
+ </ContentPanel>
45
+ {{/each}}
46
+ </div>
47
+ </form>
48
+ </SettingsContainer>
@@ -0,0 +1,229 @@
1
+ <SettingsContainer>
2
+ <form class="h-screen" {{on "submit" this.saveSettings}}>
3
+ <div class="space-y-4 h-screen">
4
+ <div>
5
+ <h1 class="text-lg leading-6 font-bold text-gray-900 dark:text-gray-100">
6
+ General Settings
7
+ </h1>
8
+ <p class="mt-1 text-sm text-gray-500">
9
+ Provide the general settings for your storefront.
10
+ </p>
11
+ </div>
12
+
13
+ <InputGroup @id="storefront_name_input" @name="Name" @value={{@model.name}} @placeholder="Storefront Name" @helpText="The name of your store." />
14
+ <InputGroup @name="Description" @value={{@model.description}} @placeholder="Storefront Description" @helpText="Give your store a brief description to let users know what you sell." />
15
+ <InputGroup @name="Tags">
16
+ <TagInput class="form-input" @placeholder="Add tags" @allowSpacesInTags={{true}} @tags={{@model.tags}} @addTag={{this.addTag}} @removeTagAtIndex={{this.removeTag}} as |tag|>
17
+ {{tag}}
18
+ </TagInput>
19
+ </InputGroup>
20
+ <InputGroup @name="Currency">
21
+ <CurrencySelect @value={{@model.currency}} @onSelect={{fn (mut @model.currency)}} @triggerClass="w-full form-select" />
22
+ </InputGroup>
23
+
24
+ <ContentPanel @title="Contact & Social" @open={{false}} @pad={{true}}>
25
+ <InputGroup @name="Phone">
26
+ <PhoneInput @value={{@model.phone}} @onInput={{fn (mut @model.phone)}} class="form-input w-full" />
27
+ </InputGroup>
28
+ <InputGroup @name="Website" @value={{@model.website}} @placeholder="Website" @helpText="Your business website URL." />
29
+ <InputGroup @name="Facebook" @value={{@model.facebook}} @placeholder="Facebook ID" @helpText="Your business Facebook page ID." />
30
+ <InputGroup @name="Instagram" @value={{@model.instagram}} @placeholder="Instagram Username" @helpText="Your business Instagram username." />
31
+ <InputGroup @name="Twitter" @value={{@model.twitter}} @placeholder="Twitter Username" @helpText="Your business Twitter username." />
32
+ </ContentPanel>
33
+
34
+ <ContentPanel @title="Logo & Backdrop" @open={{false}} @pad={{true}}>
35
+ <InputGroup @name="Logo" @helpText="Logo for your store.">
36
+ <div class="flex flex-row items-center">
37
+ <img src={{@model.logo_url}} alt={{concat @model.name " logo"}} class="h-20 w-64 border dark:border-gray-900 rounded-md mr-4" />
38
+ <FileUpload @name="logo" @accept="image/*" @onFileAdded={{fn this.uploadFile "storefront_logo"}} as |queue|>
39
+ <a tabindex={{0}} class="flex items-center px-0 mt-2 text-xs no-underline truncate btn btn-sm btn-default">
40
+ {{#if queue.files.length}}
41
+ <Spinner class="mr-1" />
42
+ <span>
43
+ Uploading...
44
+ </span>
45
+ {{else}}
46
+ <FaIcon @icon="image" class="mr-1" />
47
+ <span>
48
+ Upload new logo
49
+ </span>
50
+ {{/if}}
51
+ </a>
52
+ </FileUpload>
53
+ </div>
54
+ </InputGroup>
55
+
56
+ <InputGroup @name="Backdrop" @helpText="Optional banner or background image for your store.">
57
+ <div class="flex flex-row items-center">
58
+ <img src={{@model.backdrop_url}} alt={{concat @model.name " backdrop"}} class="h-20 w-64 border dark:border-gray-900 rounded-md mr-4" />
59
+ <FileUpload @name="backdrop" @accept="image/*" @onFileAdded={{fn this.uploadFile "storefront_backdrop"}} as |queue|>
60
+ <a tabindex={{0}} class="flex items-center px-0 mt-2 text-xs no-underline truncate btn btn-sm btn-default">
61
+ {{#if queue.files.length}}
62
+ <Spinner class="mr-1" />
63
+ <span>
64
+ Uploading...
65
+ </span>
66
+ {{else}}
67
+ <FaIcon @icon="image" class="mr-1" />
68
+ <span>
69
+ Upload new backdrop
70
+ </span>
71
+ {{/if}}
72
+ </a>
73
+ </FileUpload>
74
+ </div>
75
+ </InputGroup>
76
+ </ContentPanel>
77
+
78
+ <ContentPanel @title="Images & Videos" @open={{false}} @pad={{false}} @panelBodyWrapperClass="px-0 py-4" @panelBodyClass="bg-white dark:bg-gray-800">
79
+ <div class="p-6">
80
+ {{#if this.isUploading}}
81
+ <div class="min-h-56 dropzone w-full rounded px-4 py-8 min-h bg-black bg-opacity-25 text-gray-900 dark:text-white text-center flex flex-col items-center justify-center border-2 border-dashed border-gray-200 dark:border-indigo-500">
82
+ <div class="flex items-center justify-center py-5">
83
+ <PageLoader class="text-sm dar:text-gray-100" @loadingMessage="Uploading..." />
84
+ </div>
85
+ </div>
86
+ {{else}}
87
+ <FileDropzone @name="files" @multiple={{true}} @onFileAdded={{fn this.queueFile}} @accept={{join "," this.acceptedFileTypes}} class="dropzone file-dropzone" as |dropzone queue|>
88
+ {{#if dropzone.active}}
89
+ {{#if dropzone.valid}}
90
+ Drop to upload
91
+ {{else}}
92
+ Invalid
93
+ {{/if}}
94
+ {{else if queue.files.length}}
95
+ <div class="my-2">
96
+ <FaIcon @icon="photo-video" class="text-indigo-500 mr-2" />
97
+ {{pluralize queue.files.length "file"}}
98
+ ready for upload.
99
+ </div>
100
+ <div class="my-2">({{queue.progress}}%)</div>
101
+ {{else}}
102
+ <h4 class="font-semibold mb-8">
103
+ <FaIcon @icon="photo-video" @size="2x" class="text-indigo-500 mr-2" />
104
+ Upload Images & Videos
105
+ </h4>
106
+ <div>
107
+ {{#if dropzone.supported}}
108
+ <p class="text-base font-semibold my-5">Drag and drop image and video files onto this dropzone</p>
109
+ {{/if}}
110
+ <FileUpload @name="files" @for="files" @accept={{join "," this.acceptedFileTypes}} @multiple={{true}} @onFileAdded={{fn this.queueFile}}>
111
+ <a tabindex={{0}} class="btn btn-magic cursor-pointer ml-1">or select files to upload.</a>
112
+ </FileUpload>
113
+ </div>
114
+ {{/if}}
115
+ </FileDropzone>
116
+ {{#if this.uploadQueue}}
117
+ <div class="mx-4 my-6">
118
+ <div class="flex items-center justify-between mb-4">
119
+ <span class="leading-6 dark:text-gray-100">Upload Queue</span>
120
+ </div>
121
+ <div class="space-y-2 mb-5">
122
+ {{#each this.uploadQueue as |file|}}
123
+ <div class="flex items-center justify-between bg-green-100 border border-gray-300 dark:border-gray-900 py-2 shadow-sm rounded-lg px-4">
124
+ <div class="text-sm text-green-900">{{file.name}}</div>
125
+ <div class="flex items-center text-sm">
126
+ <Spinner class="text-green-400 mr-2" />
127
+ <span class="font-bold text-green-400">{{round file.progress}}%</span>
128
+ </div>
129
+ </div>
130
+ {{/each}}
131
+ </div>
132
+ </div>
133
+ {{/if}}
134
+ <div>
135
+ <div class="grid grid-cols-2 md:grid-cols-3 gap-3 mt-6">
136
+ {{#each @model.files as |file|}}
137
+ <FileRecord @file={{file}} @onDelete={{this.removeFile}} />
138
+ {{/each}}
139
+ </div>
140
+ </div>
141
+ {{/if}}
142
+ </div>
143
+ </ContentPanel>
144
+
145
+ <ContentPanel @title="Alerts" @open={{false}} @pad={{true}} @panelBodyClass="bg-white dark:bg-gray-800">
146
+ <div>
147
+ <p class="dark:text-gray-100 mb-4">Configure who should be alerted for certain events.</p>
148
+ <InputGroup @name="New order alert" @wrapperClass="mb-0">
149
+ <ModelSelectMultiple @modelName="user" @selectedModel={{@model.alertable.for_new_order}} @placeholder="Select users to alert for new order" @triggerClass="form-select form-input multiple" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn this.makeAlertable "for_new_order"}} as |model|>
150
+ {{model.name}}
151
+ </ModelSelectMultiple>
152
+ </InputGroup>
153
+ </div>
154
+ </ContentPanel>
155
+
156
+ <div class="store-boolean-settings">
157
+ <div class="input-group">
158
+ <Toggle @isToggled={{@model.online}} @onToggle={{fn (mut @model.online)}}>
159
+ <FaIcon @icon="plug" class="text-gray-600 dark:text-gray-400 mx-2" /><span class="dark:text-gray-100 text-sm">Online</span>
160
+ </Toggle>
161
+ </div>
162
+ <div class="input-group">
163
+ <Toggle @isToggled={{@model.options.tax_enabled}} @onToggle={{fn (mut @model.options.tax_enabled)}}>
164
+ <FaIcon @icon="percent" class="text-gray-600 dark:text-gray-400 mx-2" /><span class="dark:text-gray-100 text-sm">Enable tax</span>
165
+ </Toggle>
166
+ {{#if @model.options.tax_enabled}}
167
+ <InputGroup @wrapperClass="mb-0 mt-2" @type="number" @name="Tax Percentage" @value={{@model.options.tax_percentage}} @placeholder="Tax Percentage" @helpText="The sales tax percentage to apply to orders." />
168
+ {{/if}}
169
+ </div>
170
+ <div class="input-group">
171
+ <Toggle @isToggled={{@model.options.auto_accept_orders}} @onToggle={{fn (mut @model.options.auto_accept_orders)}}>
172
+ <FaIcon @icon="robot" class="text-gray-600 dark:text-gray-400 mx-2" /><span class="dark:text-gray-100 text-sm">Auto accept incoming orders</span>
173
+ </Toggle>
174
+ </div>
175
+ <div class="input-group">
176
+ <Toggle @isToggled={{@model.options.auto_dispatch}} @onToggle={{fn (mut @model.options.auto_dispatch)}}>
177
+ <FaIcon @icon="paper-plane" class="text-gray-600 dark:text-gray-400 mx-2" /><span class="dark:text-gray-100 text-sm">Auto dispatch orders</span>
178
+ </Toggle>
179
+ </div>
180
+ <div class="input-group">
181
+ <Toggle @isToggled={{@model.options.require_pod}} @onToggle={{fn (mut @model.options.require_pod)}}>
182
+ <FaIcon @icon="signature" class="text-gray-600 dark:text-gray-400 mx-2" /><span class="dark:text-gray-100 text-sm">Require proof of delivery</span>
183
+ </Toggle>
184
+ {{#if @model.options.require_pod}}
185
+ <InputGroup @wrapperClass="mb-0 mt-2" @name="Proof of Delivery Method">
186
+ <Select @options={{this.podMethods}} @optionValue="value" @optionLabel="name" @value={{@model.pod_method}} @onSelect={{fn (mut @model.pod_method)}} class="w-full" />
187
+ </InputGroup>
188
+ {{/if}}
189
+ </div>
190
+ <div class="input-group">
191
+ <Toggle @isToggled={{@model.options.cod_enabled}} @onToggle={{fn (mut @model.options.cod_enabled)}}>
192
+ <FaIcon @icon="money-bill-wave" class="text-gray-600 dark:text-gray-400 mx-2" /><span class="dark:text-gray-100 text-sm">Enable cash on delivery</span>
193
+ </Toggle>
194
+ </div>
195
+ <div class="input-group">
196
+ <Toggle @isToggled={{@model.options.pickup_enabled}} @onToggle={{fn (mut @model.options.pickup_enabled)}}>
197
+ <FaIcon @icon="person-booth" class="text-gray-600 dark:text-gray-400 mx-2" /><span class="dark:text-gray-100 text-sm">Enable order pickup</span>
198
+ </Toggle>
199
+ </div>
200
+ <div class="input-group">
201
+ <Toggle @isToggled={{@model.options.tips_enabled}} @onToggle={{fn (mut @model.options.tips_enabled)}}>
202
+ <FaIcon @icon="cash-register" class="text-gray-600 dark:text-gray-400 mx-2" /><span class="dark:text-gray-100 text-sm">Enable tips</span>
203
+ </Toggle>
204
+ </div>
205
+ <div class="input-group">
206
+ <Toggle @isToggled={{@model.options.delivery_tips_enabled}} @onToggle={{fn (mut @model.options.delivery_tips_enabled)}}>
207
+ <FaIcon @icon="face-smile" class="text-gray-600 dark:text-gray-400 mx-2" /><span class="dark:text-gray-100 text-sm">Enable delivery tips</span>
208
+ </Toggle>
209
+ </div>
210
+ {{!-- <div class="input-group">
211
+ <Toggle @isToggled={{@model.options.integrated_vendors_enabled}} @onToggle={{fn (mut @model.options.integrated_vendors_enabled)}}>
212
+ <FaIcon @icon="truck" class="text-gray-600 dark:text-gray-400 mx-2" /><span class="dark:text-gray-100 text-sm">Enable integrated vendors</span>
213
+ </Toggle>
214
+ {{#if @model.options.integrated_vendors_enabled}}
215
+ <InputGroup @name="Select integrated vendors to use" @wrapperClass="mt-2 mb-0">
216
+ <ModelSelectMultiple @modelName="integrated-vendor" @selectedModel={{@model.options.integrated_vendors}} @placeholder="Select integrated vendors to use" @triggerClass="form-select form-input multiple" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn (mut @model.options.integrated_vendors)}} as |model|>
217
+ {{model.name}}
218
+ </ModelSelectMultiple>
219
+ </InputGroup>
220
+ {{/if}}
221
+ </div> --}}
222
+ </div>
223
+
224
+ <div class="flex justify-end pb-12">
225
+ <Button @buttonType="submit" @type="primary" @text="Save Changes" @icon="save" @size="lg" @isLoading={{this.isLoading}} @onClick={{this.saveSettings}} />
226
+ </div>
227
+ </div>
228
+ </form>
229
+ </SettingsContainer>
@@ -0,0 +1,39 @@
1
+ <SettingsContainer>
2
+ <form>
3
+ <div class="space-y-6">
4
+ <div class="flex flex-col md:flex-row justify-between">
5
+ <div>
6
+ <h1 class="text-lg leading-6 font-bold text-gray-900 dark:text-gray-100">
7
+ Location Settings
8
+ </h1>
9
+ <p class="mt-1 text-sm text-gray-500">
10
+ Manage your stores operating locations and hours.
11
+ </p>
12
+ </div>
13
+ <div>
14
+ <Button @wrapperClass="flex-shrink-0" @icon="plus" @iconPrefix="fas" @type="primary" @text="Create new location" @onClick={{this.createNewLocation}} />
15
+ </div>
16
+ </div>
17
+
18
+ {{#each @model as |storeLocation|}}
19
+ <ContentPanel @title={{storeLocation.name}} @open={{true}} @pad={{true}}>
20
+ <div class="flex items-center justify-between mb-4">
21
+ <div>
22
+ <h4 class="dark:text-gray-100 text-base font-semibold">Manage store hours</h4>
23
+ </div>
24
+ <div class="flex items-center">
25
+ <Button @icon="edit" @text="Edit" @onClick={{fn this.editStoreLocation storeLocation}} @wrapperClass="mr-2" />
26
+ <Button @icon="trash" @type="danger" @text="Delete" @onClick={{fn this.removeStoreLocation storeLocation}} />
27
+ </div>
28
+ </div>
29
+ <div class="mb-6 uppercase dark:text-gray-100">
30
+ {{storeLocation.address}}
31
+ </div>
32
+ <div>
33
+ <ScheduleManager @subject={{storeLocation}} @subjectKey="store_location_uuid" @hourModelType="store-hour" class="grid grid-cols-1 gap-4 lg:grid-cols-2 lg:gap-2" />
34
+ </div>
35
+ </ContentPanel>
36
+ {{/each}}
37
+ </div>
38
+ </form>
39
+ </SettingsContainer>
@@ -0,0 +1,35 @@
1
+ <SettingsContainer>
2
+ <form>
3
+ <div class="space-y-6">
4
+ <div class="flex justify-between">
5
+ <div class="w-3/4">
6
+ <h1 class="text-lg leading-6 font-bold text-gray-900 dark:text-gray-100">
7
+ Notification Settings
8
+ </h1>
9
+ <p class="mt-1 text-sm text-gray-500">
10
+ Configure notification channels for your storefront, each notification channel additionally can
11
+ have
12
+ it's own rules and options.
13
+ </p>
14
+ </div>
15
+ <div>
16
+ <Button @icon="plus" @iconPrefix="fas" @type="primary" @text="New channel" @onClick={{this.createChannel}} />
17
+ </div>
18
+ </div>
19
+
20
+ <div class="space-y-3">
21
+ {{#each this.channels as |notificationChannel|}}
22
+ <div class="flex px-4 py-2 items-center justify-between shadow-sm rounded-md dark:bg-gray-900 bg-gray-200">
23
+ <div>
24
+ <span class="dark:text-gray-50">{{notificationChannel.name}}</span>
25
+ </div>
26
+ <div class="flex items-center">
27
+ <Button @size="xs" @type="default" @text="Edit" @wrapperClass="mr-2" @onClick={{fn this.editChannel notificationChannel}} />
28
+ <Button @size="xs" @type="danger" @text="Delete" @onClick={{fn this.deleteChannel notificationChannel}} />
29
+ </div>
30
+ </div>
31
+ {{/each}}
32
+ </div>
33
+ </div>
34
+ </form>
35
+ </SettingsContainer>
@@ -0,0 +1,30 @@
1
+ <Layout::Section::Header @title="Settings" class="align-items-unset" @actionsWrapperClass="align-items-end-i">
2
+ <div class="ui-tabs w-full border-b-0i">
3
+ <nav>
4
+ <LinkTo @route="settings.index" class="ui-tab">
5
+ <FaIcon @icon="cog" @prefix="fas" class="mr-1" />
6
+ <span>General</span>
7
+ </LinkTo>
8
+ <LinkTo @route="settings.locations" class="ui-tab">
9
+ <FaIcon @icon="map-marker-alt" class="mr-1" />
10
+ <span>Locations</span>
11
+ </LinkTo>
12
+ <LinkTo @route="settings.gateways" class="ui-tab">
13
+ <FaIcon @icon="cash-register" class="mr-1" />
14
+ <span>Gateways</span>
15
+ </LinkTo>
16
+ <LinkTo @route="settings.api" class="ui-tab">
17
+ <FaIcon @icon="code" class="mr-1" />
18
+ <span>API</span>
19
+ </LinkTo>
20
+ <LinkTo @route="settings.notifications" class="ui-tab">
21
+ <FaIcon @icon="bells" class="mr-1" />
22
+ <span>Notifications</span>
23
+ </LinkTo>
24
+ </nav>
25
+ </div>
26
+ </Layout::Section::Header>
27
+
28
+ <Layout::Section::Body>
29
+ {{outlet}}
30
+ </Layout::Section::Body>
@@ -0,0 +1,34 @@
1
+ export default function getGatewaySchemas() {
2
+ const schemas = {
3
+ stripe: {
4
+ secret_key: '',
5
+ publishable_key: '',
6
+ show_postal_code: true,
7
+ ideal_payment: false,
8
+ fpx_payment: false,
9
+ },
10
+ braintree: {
11
+ merchant_id: '',
12
+ public_key: '',
13
+ private_key: '',
14
+ tokenization_key: '',
15
+ },
16
+ qpay: {
17
+ username: '',
18
+ password: '',
19
+ invoice_id: '',
20
+ },
21
+ manual: {
22
+ public_key: '',
23
+ private_key: '',
24
+ key_id: '',
25
+ key_secret: '',
26
+ email: '',
27
+ name: '',
28
+ details: '',
29
+ payment_instructions: '',
30
+ },
31
+ };
32
+
33
+ return schemas;
34
+ }
@@ -0,0 +1,18 @@
1
+ export default function getNotificationSchemas() {
2
+ const schemas = {
3
+ apn: {
4
+ key_id: '',
5
+ team_id: '',
6
+ app_bundle_id: '',
7
+ private_key_content: '',
8
+ production: true,
9
+ },
10
+ fcm: {
11
+ firebase_credentials_json: '',
12
+ firebase_database_url: '',
13
+ firebase_project_name: '',
14
+ },
15
+ };
16
+
17
+ return schemas;
18
+ }
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/adapters/addon-category';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/adapters/gateway';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/adapters/network';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/adapters/notification-channel';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/adapters/product-addon-category';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/adapters/product-addon';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/adapters/product-hour';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/adapters/product-store-location';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/adapters/product-variant-option';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/adapters/product-variant';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/adapters/product';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/adapters/store-hour';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/adapters/store-location';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/adapters/store';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/adapters/storefront';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/components/file-record';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/components/modals/add-store-hours';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/components/modals/add-stores-to-network';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/components/modals/assign-driver';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/components/modals/create-first-store';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/components/modals/create-gateway';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/components/modals/create-network-category';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/components/modals/create-network';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/components/modals/create-new-variant';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/components/modals/create-notification-channel';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/components/modals/create-product-category';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/components/modals/create-store';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/components/modals/edit-network';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/components/modals/import-products';