@fleetbase/storefront-engine 0.2.4 → 0.2.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 (140) hide show
  1. package/README.md +4 -4
  2. package/addon/components/modals/import-products.hbs +1 -1
  3. package/addon/components/schedule-manager.hbs +2 -2
  4. package/addon/components/widget/customers.hbs +1 -1
  5. package/addon/components/widget/customers.js +7 -4
  6. package/addon/components/widget/orders.js +4 -0
  7. package/addon/controllers/base-controller.js +31 -0
  8. package/addon/controllers/networks/index/network.js +2 -2
  9. package/addon/controllers/networks/index.js +3 -2
  10. package/addon/controllers/products/index/category/new.js +14 -11
  11. package/addon/controllers/products/index/category.js +2 -2
  12. package/addon/controllers/products/index/index.js +2 -2
  13. package/addon/controllers/products/index.js +2 -3
  14. package/addon/models/network.js +0 -1
  15. package/addon/models/product-addon-category.js +10 -1
  16. package/addon/models/product-variant.js +0 -2
  17. package/addon/models/product.js +35 -2
  18. package/addon/routes/customers/index.js +11 -1
  19. package/addon/routes/networks/index.js +9 -0
  20. package/addon/routes/orders/index.js +11 -1
  21. package/addon/routes/products/index.js +8 -2
  22. package/addon/serializers/product.js +16 -0
  23. package/addon/services/storefront.js +81 -0
  24. package/addon/templates/networks/index/network/stores.hbs +2 -2
  25. package/addon/templates/networks/index/network.hbs +1 -1
  26. package/addon/templates/products/index/category/new.hbs +3 -3
  27. package/addon/templates/products/index/category.hbs +20 -3
  28. package/app/controllers/base-controller.js +1 -0
  29. package/assets/sounds/storefront_order_alert.mp3 +0 -0
  30. package/composer.json +3 -3
  31. package/config/environment.js +11 -1
  32. package/extension.json +1 -1
  33. package/index.js +15 -0
  34. package/package.json +132 -125
  35. package/server/src/Auth/Schemas/Storefront.php +31 -39
  36. package/server/src/Console/Commands/NotifyStorefrontOrderNearby.php +9 -11
  37. package/server/src/Expansions/ContactFilterExpansion.php +36 -0
  38. package/server/src/Expansions/EntityExpansion.php +12 -12
  39. package/server/src/Expansions/OrderFilterExpansion.php +31 -0
  40. package/server/src/Expansions/VendorFilterExpansion.php +36 -0
  41. package/server/src/Http/Controllers/ActionController.php +9 -11
  42. package/server/src/Http/Controllers/AddonCategoryController.php +1 -1
  43. package/server/src/Http/Controllers/CustomerController.php +1 -1
  44. package/server/src/Http/Controllers/GatewayController.php +1 -1
  45. package/server/src/Http/Controllers/MetricsController.php +17 -17
  46. package/server/src/Http/Controllers/NetworkController.php +16 -26
  47. package/server/src/Http/Controllers/NotificationChannelController.php +1 -1
  48. package/server/src/Http/Controllers/OrderController.php +18 -22
  49. package/server/src/Http/Controllers/ProductAddonCategoryController.php +1 -2
  50. package/server/src/Http/Controllers/ProductAddonController.php +1 -2
  51. package/server/src/Http/Controllers/ProductController.php +89 -44
  52. package/server/src/Http/Controllers/ProductHourController.php +1 -1
  53. package/server/src/Http/Controllers/ProductVariantController.php +1 -1
  54. package/server/src/Http/Controllers/ProductVariantOptionController.php +1 -1
  55. package/server/src/Http/Controllers/ReviewController.php +1 -1
  56. package/server/src/Http/Controllers/StoreController.php +1 -2
  57. package/server/src/Http/Controllers/StoreHourController.php +1 -1
  58. package/server/src/Http/Controllers/StoreLocationController.php +1 -1
  59. package/server/src/Http/Controllers/StorefrontController.php +0 -2
  60. package/server/src/Http/Controllers/VoteController.php +1 -1
  61. package/server/src/Http/Controllers/v1/CartController.php +16 -26
  62. package/server/src/Http/Controllers/v1/CategoryController.php +3 -4
  63. package/server/src/Http/Controllers/v1/CheckoutController.php +283 -286
  64. package/server/src/Http/Controllers/v1/CustomerController.php +54 -67
  65. package/server/src/Http/Controllers/v1/GatewayControllerController.php +0 -2
  66. package/server/src/Http/Controllers/v1/NetworkController.php +26 -23
  67. package/server/src/Http/Controllers/v1/PaymentMethodController.php +0 -2
  68. package/server/src/Http/Controllers/v1/ProductController.php +1 -4
  69. package/server/src/Http/Controllers/v1/ReviewController.php +31 -35
  70. package/server/src/Http/Controllers/v1/ServiceQuoteController.php +57 -53
  71. package/server/src/Http/Controllers/v1/StoreController.php +8 -16
  72. package/server/src/Http/Filter/AddonCategoryFilter.php +1 -1
  73. package/server/src/Http/Filter/OrderFilter.php +2 -2
  74. package/server/src/Http/Middleware/SetStorefrontSession.php +9 -20
  75. package/server/src/Http/Requests/AddStoreToNetworkCategory.php +3 -3
  76. package/server/src/Http/Requests/CreateCustomerRequest.php +5 -7
  77. package/server/src/Http/Requests/CreateReviewRequest.php +4 -5
  78. package/server/src/Http/Requests/GetServiceQuoteFromCart.php +2 -2
  79. package/server/src/Http/Requests/InitializeCheckoutRequest.php +5 -5
  80. package/server/src/Http/Requests/NetworkActionRequest.php +2 -2
  81. package/server/src/Http/Requests/VerifyCreateCustomerRequest.php +2 -2
  82. package/server/src/Http/Resources/Cart.php +20 -11
  83. package/server/src/Http/Resources/Category.php +12 -11
  84. package/server/src/Http/Resources/Customer.php +15 -14
  85. package/server/src/Http/Resources/Gateway.php +12 -11
  86. package/server/src/Http/Resources/Media.php +9 -8
  87. package/server/src/Http/Resources/Network.php +33 -28
  88. package/server/src/Http/Resources/Product.php +89 -81
  89. package/server/src/Http/Resources/Review.php +14 -13
  90. package/server/src/Http/Resources/ReviewCustomer.php +12 -11
  91. package/server/src/Http/Resources/Store.php +39 -33
  92. package/server/src/Http/Resources/StoreHour.php +9 -8
  93. package/server/src/Http/Resources/StoreLocation.php +9 -9
  94. package/server/src/Imports/ProductsImport.php +0 -2
  95. package/server/src/Jobs/DownloadProductImageUrl.php +7 -4
  96. package/server/src/Listeners/HandleOrderCompleted.php +2 -1
  97. package/server/src/Listeners/HandleOrderDispatched.php +2 -1
  98. package/server/src/Listeners/HandleOrderDriverAssigned.php +2 -1
  99. package/server/src/Listeners/HandleOrderStarted.php +4 -3
  100. package/server/src/Mail/StorefrontNetworkInvite.php +7 -6
  101. package/server/src/Models/AddonCategory.php +2 -4
  102. package/server/src/Models/Cart.php +117 -124
  103. package/server/src/Models/Checkout.php +14 -12
  104. package/server/src/Models/Customer.php +9 -9
  105. package/server/src/Models/Gateway.php +22 -22
  106. package/server/src/Models/Network.php +41 -52
  107. package/server/src/Models/NetworkStore.php +6 -5
  108. package/server/src/Models/NotificationChannel.php +11 -9
  109. package/server/src/Models/PaymentMethod.php +9 -7
  110. package/server/src/Models/Product.php +152 -30
  111. package/server/src/Models/ProductAddon.php +14 -11
  112. package/server/src/Models/ProductAddonCategory.php +9 -8
  113. package/server/src/Models/ProductHour.php +6 -5
  114. package/server/src/Models/ProductStoreLocation.php +7 -5
  115. package/server/src/Models/ProductVariant.php +15 -11
  116. package/server/src/Models/ProductVariantOption.php +12 -9
  117. package/server/src/Models/Review.php +9 -7
  118. package/server/src/Models/Store.php +68 -84
  119. package/server/src/Models/StoreHour.php +6 -5
  120. package/server/src/Models/StoreLocation.php +12 -8
  121. package/server/src/Models/StorefrontModel.php +1 -1
  122. package/server/src/Models/Vote.php +8 -6
  123. package/server/src/Notifications/StorefrontOrderCanceled.php +15 -19
  124. package/server/src/Notifications/StorefrontOrderCompleted.php +15 -19
  125. package/server/src/Notifications/StorefrontOrderCreated.php +31 -36
  126. package/server/src/Notifications/StorefrontOrderDriverAssigned.php +15 -20
  127. package/server/src/Notifications/StorefrontOrderEnroute.php +14 -19
  128. package/server/src/Notifications/StorefrontOrderNearby.php +16 -21
  129. package/server/src/Notifications/StorefrontOrderPreparing.php +15 -18
  130. package/server/src/Notifications/StorefrontOrderReadyForPickup.php +15 -18
  131. package/server/src/Observers/NetworkObserver.php +2 -3
  132. package/server/src/Observers/ProductObserver.php +17 -33
  133. package/server/src/Providers/EventServiceProvider.php +15 -4
  134. package/server/src/Providers/StorefrontServiceProvider.php +8 -10
  135. package/server/src/Support/Metrics.php +12 -12
  136. package/server/src/Support/OrderConfig.php +3 -2
  137. package/server/src/Support/QPay.php +22 -20
  138. package/server/src/Support/Storefront.php +18 -17
  139. package/server/src/routes.php +1 -1
  140. package/tsconfig.declarations.json +10 -0
@@ -1,4 +1,4 @@
1
- <Overlay @position="right" @isResizable={{true}} @noBackdrop={{true}} @width="800px" @minResizeWidth={{700}} @fullHeight={{true}}>
1
+ <Overlay @position="right" @isResizable={{true}} @noBackdrop={{true}} @width="570px" @minResizeWidth={{570}} @fullHeight={{true}}>
2
2
  <Overlay::Header @title="Manage Network" @onPressCancel={{this.transitionBack}} />
3
3
  <Overlay::Body class="p-0i" @increaseInnerBodyHeightBy="0" @wrapperClass="space-y-4 pt-4">
4
4
  <div class="flex flex-col">
@@ -1,4 +1,4 @@
1
- <Overlay @position="right" @noBackdrop={{true}} @width="700px" @fullHeight={{true}} @containerClass="border-l border-transparent dark:border-gray-700">
1
+ <Overlay @position="right" @noBackdrop={{true}} @isResizable={{true}} @width="570px" @fullHeight={{true}} @containerClass="border-l border-transparent dark:border-gray-700">
2
2
  <Overlay::Header @title={{this.overlayTitle}} @titleClass="truncate" @titleWrapperClass="w-3/4" @headerLeftClass="w-70pc" @headerLeftInnerClass="w-full flex-1" @onPressCancel={{this.transitionBack}}>
3
3
  <Button @icon={{this.overlayActionButtonIcon}} @type="primary" @text={{this.overlayActionButtonTitle}} @onClick={{this.saveProduct}} @isLoading={{this.isSaving}} @isSubscriptionRequired={{true}} />
4
4
  </Overlay::Header>
@@ -117,7 +117,7 @@
117
117
  </ContentPanel>
118
118
 
119
119
  <ContentPanel @title="Add-Ons" @open={{this.product.addon_categories.length}} @pad={{false}} @panelBodyWrapperClass="px-0 py-4" @panelBodyClass="bg-white dark:bg-gray-800">
120
- <div class="px-4 py-3">
120
+ <div class="px-4">
121
121
  <div class="flex items-center justify-end mb-3">
122
122
  <Button @text="Select Addon Categories" @icon="plus" @iconPrefix="fas" @onClick={{this.selectAddonCategory}} />
123
123
  </div>
@@ -139,7 +139,7 @@
139
139
  {{#each addonCategory.category.addons as |addon|}}
140
140
  <div class="grid grid-cols-10 gap-1 px-3 py-2 rounded-md border border-gray-200 dark:border-gray-900 dark:text-gray-100 dark:bg-gray-800 bg-gray-200">
141
141
  <div class="flex items-center">
142
- <Checkbox @value={{not-in-array addon.id addonCategory.excluded_addons}} @onToggle={{fn this.excludeAddon index addon}} />
142
+ <Checkbox @value={{not (in-array addon.id addonCategory.excluded_addons)}} @onToggle={{fn this.excludeAddon index addon}} />
143
143
  </div>
144
144
  <div class="col-span-3 flex items-center">
145
145
  {{addon.name}}
@@ -1,6 +1,23 @@
1
- <Layout::Section::Header @title={{concat this.category.name " Products"}} @searchQuery={{this.query}} @onSearch={{perform this.search}}>
2
- <Button @type="default" @text="Edit this category" @icon="edit" @onClick={{fn this.editCategory this.category}} @disabled={{not this.category}} @wrapperClass="mr-2" />
3
- <Button @type="danger" @text="Delete this category" @icon="trash" @onClick={{this.deleteCategory}} @disabled={{not this.category}} />
1
+ <Layout::Section::Header @title={{concat this.category.name " Products"}} @titleClass="truncate" @searchQuery={{this.query}} @onSearch={{perform this.search}}>
2
+ {{!-- <Button @type="default" @text="Edit this category" @textClass="truncate" @icon="edit" @onClick={{fn this.editCategory this.category}} @disabled={{not this.category}} @wrapperClass="mr-2" />
3
+ <Button @type="danger" @text="Delete this category" @textClass="truncate" @icon="trash" @onClick={{this.deleteCategory}} @disabled={{not this.category}} /> --}}
4
+
5
+ {{#if this.category}}
6
+ <DropdownButton @icon="gear" @text="Category" @type="default" @size="sm" @contentClass="dropdown-menu" as |dd|>
7
+ <div class="next-dd-menu">
8
+ <div class="px-1">
9
+ <a href="#" class="next-dd-item" {{on "click" (dropdown-fn dd this.editCategory this.category)}}>
10
+ Edit this category...
11
+ </a>
12
+ </div>
13
+ <div class="px-1">
14
+ <a href="#" class="text-red-500 next-dd-item" {{on "click" (dropdown-fn dd this.deleteCategory)}}>
15
+ Delete this category...
16
+ </a>
17
+ </div>
18
+ </div>
19
+ </DropdownButton>
20
+ {{/if}}
4
21
  </Layout::Section::Header>
5
22
 
6
23
  <div class="h-screen overflow-y-scroll p-6">
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/storefront-engine/controllers/base-controller';
package/composer.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fleetbase/storefront-api",
3
- "version": "0.2.4",
3
+ "version": "0.2.6",
4
4
  "description": "Headless Commerce & Marketplace Extension for Fleetbase",
5
5
  "keywords": [
6
6
  "fleetbase-extension",
@@ -22,8 +22,8 @@
22
22
  ],
23
23
  "require": {
24
24
  "php": "^7.4|^8.0",
25
- "fleetbase/core-api": "^1.3.2",
26
- "fleetbase/fleetops-api": "^0.3.2",
25
+ "fleetbase/core-api": "^1.3.6",
26
+ "fleetbase/fleetops-api": "^0.3.8",
27
27
  "geocoder-php/google-maps-places-provider": "^1.4",
28
28
  "laravel-notification-channels/apn": "^3.8",
29
29
  "laravel-notification-channels/fcm": "^2.7",
@@ -1,11 +1,12 @@
1
1
  /* eslint-env node */
2
2
  'use strict';
3
- const { name } = require('../package');
3
+ const { name, fleetbase } = require('../package');
4
4
 
5
5
  module.exports = function (environment) {
6
6
  let ENV = {
7
7
  modulePrefix: name,
8
8
  environment,
9
+ mountedEngineRoutePrefix: getMountedEngineRoutePrefix(),
9
10
 
10
11
  defaultValues: {
11
12
  categoryImage: getenv('DEFAULT_CATEGORY_IMAGE', 'https://flb-assets.s3.ap-southeast-1.amazonaws.com/images/fallback-placeholder-1.png'),
@@ -16,6 +17,15 @@ module.exports = function (environment) {
16
17
  return ENV;
17
18
  };
18
19
 
20
+ function getMountedEngineRoutePrefix() {
21
+ let mountedEngineRoutePrefix = 'storefront';
22
+ if (fleetbase && typeof fleetbase.route === 'string') {
23
+ mountedEngineRoutePrefix = fleetbase.route;
24
+ }
25
+
26
+ return `console.${mountedEngineRoutePrefix}.`;
27
+ }
28
+
19
29
  function getenv(variable, defaultValue = null) {
20
30
  return process.env[variable] !== undefined ? process.env[variable] : defaultValue;
21
31
  }
package/extension.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "Storefront",
3
- "version": "0.2.4",
3
+ "version": "0.2.6",
4
4
  "description": "Headless Commerce & Marketplace Extension for Fleetbase",
5
5
  "repository": "https://github.com/fleetbase/storefront",
6
6
  "license": "MIT",
package/index.js CHANGED
@@ -2,6 +2,8 @@
2
2
  const { buildEngine } = require('ember-engines/lib/engine-addon');
3
3
  const { name } = require('./package');
4
4
  const Funnel = require('broccoli-funnel');
5
+ const MergeTrees = require('broccoli-merge-trees');
6
+ const path = require('path');
5
7
 
6
8
  module.exports = buildEngine({
7
9
  name,
@@ -23,4 +25,17 @@ module.exports = buildEngine({
23
25
  isDevelopingAddon() {
24
26
  return true;
25
27
  },
28
+
29
+ treeForPublic: function () {
30
+ const publicTree = this._super.treeForPublic.apply(this, arguments);
31
+
32
+ const addonTree = [
33
+ new Funnel(path.join(__dirname, 'assets'), {
34
+ destDir: '/',
35
+ }),
36
+ ];
37
+
38
+ // Merge the addon tree with the existing tree
39
+ return publicTree ? new MergeTrees([publicTree, ...addonTree], { overwrite: true }) : new MergeTrees([...addonTree], { overwrite: true });
40
+ },
26
41
  });
package/package.json CHANGED
@@ -1,127 +1,134 @@
1
1
  {
2
- "name": "@fleetbase/storefront-engine",
3
- "version": "0.2.4",
4
- "description": "Headless Commerce & Marketplace Extension for Fleetbase",
5
- "fleetbase": {
6
- "route": "storefront",
7
- "dashboard": "storefront/int/v1/dashboard"
8
- },
9
- "keywords": [
10
- "fleetbase-extension",
11
- "fleetbase-storefront",
12
- "fleetbase",
13
- "e-commerce",
14
- "headless-commerce",
15
- "headless-marketplace",
16
- "ember-engine",
17
- "ember-addon"
18
- ],
19
- "repository": "https://github.com/fleetbase/storefront",
20
- "license": "MIT",
21
- "author": "Fleetbase Pte Ltd <hello@fleetbase.io>",
22
- "directories": {
23
- "app": "app",
24
- "addon": "addon",
25
- "tests": "tests"
26
- },
27
- "scripts": {
28
- "build": "ember build --environment=production",
29
- "lint": "npm-run-all --aggregate-output --continue-on-error --parallel \"lint:!(fix)\"",
30
- "lint:fix": "npm-run-all --aggregate-output --continue-on-error --parallel lint:*:fix",
31
- "lint:hbs": "ember-template-lint .",
32
- "lint:hbs:fix": "ember-template-lint . --fix",
33
- "lint:js": "eslint . --cache",
34
- "lint:js:fix": "eslint . --fix",
35
- "start": "ember serve",
36
- "test": "npm-run-all lint test:*",
37
- "test:ember": "ember test",
38
- "test:ember-compatibility": "ember try:each",
39
- "publish:npm": "npm config set registry https://registry.npmjs.org/ && npm publish",
40
- "publish:github": "npm config set '@fleetbase:registry' https://npm.pkg.github.com/ && npm publish"
41
- },
42
- "dependencies": {
43
- "@fleetbase/ember-core": "^0.1.7",
44
- "@fleetbase/ember-ui": "^0.2.4",
45
- "@fleetbase/fleetops-data": "^0.1.3",
46
- "@fortawesome/ember-fontawesome": "^0.4.1",
47
- "@fortawesome/fontawesome-svg-core": "^6.4.0",
48
- "@fortawesome/free-solid-svg-icons": "^6.4.0",
49
- "ember-cli-babel": "^7.26.11",
50
- "ember-cli-es6-transform": "^1.0.0",
51
- "ember-cli-htmlbars": "^6.1.0",
52
- "ember-intl": "^6.0.0-beta.6",
53
- "ember-tag-input": "^3.1.0",
54
- "ember-wormhole": "^0.6.0"
55
- },
56
- "devDependencies": {
57
- "@ember/optional-features": "^2.0.0",
58
- "@ember/test-helpers": "^2.8.1",
59
- "@embroider/test-setup": "^1.8.3",
60
- "@glimmer/component": "^1.1.2",
61
- "@glimmer/tracking": "^1.1.2",
62
- "babel-eslint": "^10.1.0",
63
- "broccoli-asset-rev": "^3.0.0",
64
- "broccoli-funnel": "^3.0.8",
65
- "ember-auto-import": "^2.4.2",
66
- "ember-classic-decorator": "^3.0.0",
67
- "ember-cli": "~4.6.0",
68
- "ember-cli-dependency-checker": "^3.3.1",
69
- "ember-cli-inject-live-reload": "^2.1.0",
70
- "ember-cli-sri": "^2.1.1",
71
- "ember-cli-terser": "^4.0.2",
72
- "ember-concurrency": "^2.3.7",
73
- "ember-concurrency-decorators": "^2.0.3",
74
- "ember-data": "~4.6.0",
75
- "ember-disable-prototype-extensions": "^1.1.3",
76
- "ember-engines": "^0.8.23",
77
- "ember-load-initializers": "^2.1.2",
78
- "ember-math-helpers": "^2.18.2",
79
- "ember-page-title": "^7.0.0",
80
- "ember-qunit": "^5.1.5",
81
- "ember-resolver": "^8.0.3",
82
- "ember-responsive": "^5.0.0",
83
- "ember-source": "~4.6.0",
84
- "ember-source-channel-url": "^3.0.0",
85
- "ember-template-lint": "^4.10.1",
86
- "ember-try": "^2.0.0",
87
- "eslint": "^7.32.0",
88
- "eslint-config-prettier": "^8.5.0",
89
- "eslint-plugin-ember": "^11.0.2",
90
- "eslint-plugin-node": "^11.1.0",
91
- "eslint-plugin-prettier": "^4.2.1",
92
- "eslint-plugin-qunit": "^7.3.1",
93
- "loader.js": "^4.7.0",
94
- "npm-run-all": "^4.1.5",
95
- "prettier": "^2.7.1",
96
- "qunit": "^2.19.1",
97
- "qunit-dom": "^2.0.0",
98
- "webpack": "^5.74.0"
99
- },
100
- "peerDependencies": {
101
- "ember-engines": "^0.8.23"
102
- },
103
- "engines": {
104
- "node": "14.* || >= 16"
105
- },
106
- "ember": {
107
- "edition": "octane"
108
- },
109
- "ember-addon": {
110
- "configPath": "tests/dummy/config"
111
- },
112
- "prettier": {
113
- "trailingComma": "es5",
114
- "tabWidth": 4,
115
- "semi": true,
116
- "singleQuote": true,
117
- "printWidth": 190,
118
- "overrides": [
119
- {
120
- "files": "*.hbs",
121
- "options": {
122
- "singleQuote": false
123
- }
124
- }
125
- ]
126
- }
2
+ "name": "@fleetbase/storefront-engine",
3
+ "version": "0.2.6",
4
+ "description": "Headless Commerce & Marketplace Extension for Fleetbase",
5
+ "fleetbase": {
6
+ "route": "storefront",
7
+ "dashboard": "storefront/int/v1/dashboard"
8
+ },
9
+ "keywords": [
10
+ "fleetbase-extension",
11
+ "fleetbase-storefront",
12
+ "fleetbase",
13
+ "e-commerce",
14
+ "headless-commerce",
15
+ "headless-marketplace",
16
+ "ember-engine",
17
+ "ember-addon"
18
+ ],
19
+ "repository": "https://github.com/fleetbase/storefront",
20
+ "license": "MIT",
21
+ "author": "Fleetbase Pte Ltd <hello@fleetbase.io>",
22
+ "directories": {
23
+ "app": "app",
24
+ "addon": "addon",
25
+ "tests": "tests"
26
+ },
27
+ "scripts": {
28
+ "build": "ember build --environment=production",
29
+ "lint": "concurrently \"npm:lint:*(!fix)\" --names \"lint:\"",
30
+ "lint:css": "stylelint \"**/*.css\"",
31
+ "lint:css:fix": "concurrently \"npm:lint:css -- --fix\"",
32
+ "lint:fix": "concurrently \"npm:lint:*:fix\" --names \"fix:\"",
33
+ "lint:hbs": "ember-template-lint .",
34
+ "lint:hbs:fix": "ember-template-lint . --fix",
35
+ "lint:js": "eslint . --cache",
36
+ "lint:js:fix": "eslint . --fix",
37
+ "start": "ember serve",
38
+ "test": "concurrently \"npm:lint\" \"npm:test:*\" --names \"lint,test:\"",
39
+ "test:ember": "ember test",
40
+ "test:ember-compatibility": "ember try:each",
41
+ "publish:npm": "npm config set registry https://registry.npmjs.org/ && npm publish",
42
+ "publish:github": "npm config set '@fleetbase:registry' https://npm.pkg.github.com/ && npm publish"
43
+ },
44
+ "dependencies": {
45
+ "@fleetbase/ember-core": "^0.1.9",
46
+ "@fleetbase/ember-ui": "^0.2.8",
47
+ "@fleetbase/fleetops-data": "^0.1.6",
48
+ "@babel/core": "^7.23.2",
49
+ "@fortawesome/ember-fontawesome": "^0.4.1",
50
+ "@fortawesome/fontawesome-svg-core": "^6.4.0",
51
+ "@fortawesome/free-solid-svg-icons": "^6.4.0",
52
+ "ember-cli-babel": "^8.2.0",
53
+ "ember-cli-htmlbars": "^6.3.0",
54
+ "ember-intl": "6.3.2",
55
+ "ember-tag-input": "^3.1.0",
56
+ "ember-wormhole": "^0.6.0"
57
+ },
58
+ "devDependencies": {
59
+ "@babel/eslint-parser": "^7.22.15",
60
+ "@babel/plugin-proposal-decorators": "^7.23.2",
61
+ "@ember/optional-features": "^2.0.0",
62
+ "@ember/test-helpers": "^3.2.0",
63
+ "@embroider/test-setup": "^3.0.2",
64
+ "@glimmer/component": "^1.1.2",
65
+ "@glimmer/tracking": "^1.1.2",
66
+ "broccoli-asset-rev": "^3.0.0",
67
+ "broccoli-funnel": "^3.0.8",
68
+ "broccoli-merge-trees": "^4.2.0",
69
+ "concurrently": "^8.2.2",
70
+ "ember-auto-import": "^2.6.3",
71
+ "ember-classic-decorator": "^3.0.0",
72
+ "ember-cli": "~5.4.1",
73
+ "ember-cli-clean-css": "^3.0.0",
74
+ "ember-cli-dependency-checker": "^3.3.2",
75
+ "ember-cli-inject-live-reload": "^2.1.0",
76
+ "ember-cli-sri": "^2.1.1",
77
+ "ember-cli-terser": "^4.0.2",
78
+ "ember-concurrency": "^3.1.1",
79
+ "ember-concurrency-decorators": "^2.0.3",
80
+ "ember-data": "^4.12.5",
81
+ "ember-engines": "^0.9.0",
82
+ "ember-load-initializers": "^2.1.2",
83
+ "ember-math-helpers": "^4.0.0",
84
+ "ember-page-title": "^8.0.0",
85
+ "ember-qunit": "^8.0.1",
86
+ "ember-resolver": "^11.0.1",
87
+ "ember-responsive": "^5.0.0",
88
+ "ember-source": "~5.4.0",
89
+ "ember-source-channel-url": "^3.0.0",
90
+ "ember-template-lint": "^5.11.2",
91
+ "ember-try": "^3.0.0",
92
+ "eslint": "^8.52.0",
93
+ "eslint-config-prettier": "^9.0.0",
94
+ "eslint-plugin-ember": "^11.11.1",
95
+ "eslint-plugin-n": "^16.2.0",
96
+ "eslint-plugin-prettier": "^5.0.1",
97
+ "eslint-plugin-qunit": "^8.0.1",
98
+ "loader.js": "^4.7.0",
99
+ "prettier": "^3.0.3",
100
+ "qunit": "^2.20.0",
101
+ "qunit-dom": "^2.0.0",
102
+ "stylelint": "^15.11.0",
103
+ "stylelint-config-standard": "^34.0.0",
104
+ "stylelint-prettier": "^4.0.2",
105
+ "webpack": "^5.89.0"
106
+ },
107
+ "peerDependencies": {
108
+ "ember-engines": "^0.9.0"
109
+ },
110
+ "engines": {
111
+ "node": ">= 18"
112
+ },
113
+ "ember": {
114
+ "edition": "octane"
115
+ },
116
+ "ember-addon": {
117
+ "configPath": "tests/dummy/config"
118
+ },
119
+ "prettier": {
120
+ "trailingComma": "es5",
121
+ "tabWidth": 4,
122
+ "semi": true,
123
+ "singleQuote": true,
124
+ "printWidth": 190,
125
+ "overrides": [
126
+ {
127
+ "files": "*.hbs",
128
+ "options": {
129
+ "singleQuote": false
130
+ }
131
+ }
132
+ ]
133
+ }
127
134
  }
@@ -6,90 +6,82 @@ class Storefront
6
6
  {
7
7
  /**
8
8
  * The permission schema Name.
9
- *
10
- * @var string
11
9
  */
12
10
  public string $name = 'storefront';
13
11
 
14
12
  /**
15
13
  * The permission schema Polict Name.
16
- *
17
- * @var string
18
14
  */
19
15
  public string $policyName = 'Storefront';
20
16
 
21
17
  /**
22
18
  * Guards these permissions should apply to.
23
- *
24
- * @var array
25
19
  */
26
20
  public array $guards = ['web', 'api'];
27
21
 
28
22
  /**
29
23
  * The permission schema resources.
30
- *
31
- * @var array
32
24
  */
33
25
  public array $resources = [
34
26
  [
35
- 'name' => 'order',
36
- 'actions' => ['accept', 'mark-as-ready', 'mark-as-completed', 'reject']
27
+ 'name' => 'order',
28
+ 'actions' => ['accept', 'mark-as-ready', 'mark-as-completed', 'reject'],
37
29
  ],
38
30
  [
39
- 'name' => 'product',
40
- 'actions' => ['import']
31
+ 'name' => 'product',
32
+ 'actions' => ['import'],
41
33
  ],
42
34
  [
43
- 'name' => 'product-addon',
44
- 'actions' => []
35
+ 'name' => 'product-addon',
36
+ 'actions' => [],
45
37
  ],
46
38
  [
47
- 'name' => 'product-addon-category',
48
- 'actions' => []
39
+ 'name' => 'product-addon-category',
40
+ 'actions' => [],
49
41
  ],
50
42
  [
51
- 'name' => 'product-hour',
52
- 'actions' => []
43
+ 'name' => 'product-hour',
44
+ 'actions' => [],
53
45
  ],
54
46
  [
55
- 'name' => 'product-store-location',
56
- 'actions' => []
47
+ 'name' => 'product-store-location',
48
+ 'actions' => [],
57
49
  ],
58
50
  [
59
- 'name' => 'product-variant',
60
- 'actions' => []
51
+ 'name' => 'product-variant',
52
+ 'actions' => [],
61
53
  ],
62
54
  [
63
- 'name' => 'product-variant-option',
64
- 'actions' => []
55
+ 'name' => 'product-variant-option',
56
+ 'actions' => [],
65
57
  ],
66
58
  [
67
- 'name' => 'gateway',
68
- 'actions' => []
59
+ 'name' => 'gateway',
60
+ 'actions' => [],
69
61
  ],
70
62
  [
71
- 'name' => 'notification-channel',
72
- 'actions' => []
63
+ 'name' => 'notification-channel',
64
+ 'actions' => [],
73
65
  ],
74
66
  [
75
- 'name' => 'network',
76
- 'actions' => []
67
+ 'name' => 'network',
68
+ 'actions' => [],
77
69
  ],
78
70
  [
79
- 'name' => 'network-store',
80
- 'actions' => []
71
+ 'name' => 'network-store',
72
+ 'actions' => [],
81
73
  ],
82
74
  [
83
- 'name' => 'store',
84
- 'actions' => []
75
+ 'name' => 'store',
76
+ 'actions' => [],
85
77
  ],
86
78
  [
87
- 'name' => 'store-location',
88
- 'actions' => []
79
+ 'name' => 'store-location',
80
+ 'actions' => [],
89
81
  ],
90
82
  [
91
- 'name' => 'store-hour',
92
- 'actions' => []
93
- ]
83
+ 'name' => 'store-hour',
84
+ 'actions' => [],
85
+ ],
94
86
  ];
95
87
  }
@@ -33,17 +33,17 @@ class NotifyStorefrontOrderNearby extends Command
33
33
  // Get storefront orders that are enroute
34
34
  $orders = $this->getActiveStorefrontOrders();
35
35
 
36
- // Notify and update
36
+ // Notify and update
37
37
  $this->alert('Found (' . $orders->count() . ') Storefront Orders which are Enroute.');
38
38
 
39
39
  // Iterate each order
40
40
  $orders->each(
41
41
  function ($order) {
42
- $origin = $order->payload->getPickupOrFirstWaypoint();
42
+ $origin = $order->payload->getPickupOrFirstWaypoint();
43
43
  $destination = $order->payload->getDropoffOrLastWaypoint();
44
- $matrix = Utils::getDrivingDistanceAndTime($origin, $destination);
45
- $distance = $matrix->distance;
46
- $time = $matrix->time;
44
+ $matrix = Utils::getDrivingDistanceAndTime($origin, $destination);
45
+ $distance = $matrix->distance;
46
+ $time = $matrix->time;
47
47
 
48
48
  if (!$distance || !$time) {
49
49
  return;
@@ -63,21 +63,19 @@ class NotifyStorefrontOrderNearby extends Command
63
63
 
64
64
  /**
65
65
  * Fetches active storefront orders based on certain criteria.
66
- *
67
- * @return \Illuminate\Database\Eloquent\Collection
68
66
  */
69
67
  public function getActiveStorefrontOrders(): \Illuminate\Database\Eloquent\Collection
70
68
  {
71
69
  return Order::where(
72
70
  [
73
- 'status' => 'driver_enroute',
74
- 'type' => 'storefront',
75
- 'dispatched' => true
71
+ 'status' => 'driver_enroute',
72
+ 'type' => 'storefront',
73
+ 'dispatched' => true,
76
74
  ]
77
75
  )->with(
78
76
  [
79
77
  'payload',
80
- 'customer'
78
+ 'customer',
81
79
  ]
82
80
  )
83
81
  ->withoutGlobalScopes()
@@ -0,0 +1,36 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Expansions;
4
+
5
+ use Fleetbase\Build\Expansion;
6
+
7
+ class ContactFilterExpansion implements Expansion
8
+ {
9
+ /**
10
+ * Get the target class to expand.
11
+ *
12
+ * @return string|Class
13
+ */
14
+ public static function target()
15
+ {
16
+ return \Fleetbase\FleetOps\Http\Filter\ContactFilter::class;
17
+ }
18
+
19
+ /**
20
+ * Filter contact's by their storefront order.
21
+ *
22
+ * @return \Closure
23
+ */
24
+ public function storefront()
25
+ {
26
+ return function (?string $storefront) {
27
+ /* @var \Fleetbase\FleetOps\Http\Filter\ContactFilter $this */
28
+ $this->builder->whereHas(
29
+ 'customerOrders',
30
+ function ($query) use ($storefront) {
31
+ $query->where('meta->storefront_id', $storefront);
32
+ }
33
+ );
34
+ };
35
+ }
36
+ }