@fleetbase/storefront-engine 0.4.8 → 0.4.10

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.
@@ -40,6 +40,15 @@ export default class ProductsIndexCategoryNewController extends BaseController {
40
40
  return this.productsIndexCategoryController?.category ?? null;
41
41
  }
42
42
 
43
+ get variantTabs() {
44
+ const variants = this.product.variants ?? [];
45
+ return variants.map((v) => ({
46
+ label: v.name,
47
+ id: v.public_id ?? v.name,
48
+ variant: v,
49
+ }));
50
+ }
51
+
43
52
  /** overlay options */
44
53
  @tracked overlayTitle = 'New Product';
45
54
  @tracked overlayActionButtonTitle = 'Create Product';
@@ -117,6 +126,7 @@ export default class ProductsIndexCategoryNewController extends BaseController {
117
126
  subject_uuid: this.product.id,
118
127
  subject_type: 'storefront:product',
119
128
  type: 'storefront_product',
129
+ resize: 'md',
120
130
  },
121
131
  (uploadedFile) => {
122
132
  this.product.files.pushObject(uploadedFile);
@@ -100,25 +100,6 @@
100
100
  <div>
101
101
  <MetadataEditor @value={{this.product.meta}} @onChange={{fn (mut this.product.meta)}} />
102
102
  </div>
103
- {{!-- {{#each this.product.meta_array as |metaField index|}}
104
- <div class="px-4 py-3 border-b border-gray-200 dark:border-gray-700">
105
- <div class="input-group">
106
- <div class="flex justify-between items-center mb-1">
107
- <Input
108
- class="form-input border-0 px-2 py-1 m-0 bg-white dark:bg-gray-900 shadow-none"
109
- @value={{metaField.label}}
110
- disabled={{unauthorized}}
111
- placeholder={{metaField.label}}
112
- />
113
- <a href="javascript:;" class="text-xs" tabindex="-1" disabled={{unauthorized}} {{on "click" (fn this.removeMetaField index)}}>
114
- <FaIcon @icon="trash" @size="sm" class="mr-1" />
115
- Remove
116
- </a>
117
- </div>
118
- <Input class="w-full form-input" @value={{metaField.value}} placeholder={{metaField.label}} disabled={{unauthorized}} />
119
- </div>
120
- </div>
121
- {{/each}} --}}
122
103
  </ContentPanel>
123
104
 
124
105
  <InputGroup>
@@ -130,7 +111,7 @@
130
111
  />
131
112
  </InputGroup>
132
113
 
133
- <div class="store-boolean-settings">
114
+ <div class="store-boolean-settings mb-4">
134
115
  <div class="input-group mb-0">
135
116
  <Checkbox @value={{this.product.is_service}} @onToggle={{fn (mut this.product.is_service)}} @disabled={{unauthorized}}>
136
117
  <FaIcon @icon="house-leave" class="text-indigo-400 mx-2" /><span class="dark:text-gray-100 text-sm">This is a service</span>
@@ -164,18 +145,19 @@
164
145
  </div>
165
146
  </div>
166
147
 
167
- <ContentPanel @title="Variants" @open={{true}} @wrapperClass="bordered-top">
168
- <div class="flex items-center justify-end">
169
- <Button @text="New Variant" @icon="plus" @iconPrefix="fas" @onClick={{this.createProductVariant}} @permission="storefront create product-variant" />
170
- </div>
171
- <Tabs class="overlay-content-panel" as |Tab|>
172
- {{#each this.product.variants as |variant|}}
173
- <Tab @title={{variant.name}}>
148
+ <ContentPanel @title="Variants" @open={{true}} @wrapperClass="bordered-top" @panelBodyWrapperClass="px-0i">
149
+ <TabNavigation @tabs={{this.variantTabs}}>
150
+ <:actions>
151
+ <Button @text="New Variant" @size="xs" @icon="plus" @iconPrefix="fas" @onClick={{this.createProductVariant}} @permission="storefront create product-variant" />
152
+ </:actions>
153
+ <:default as |activeTab|>
154
+ {{#let activeTab.variant as |variant|}}
174
155
  <div class="px-4 py-3">
175
156
  <div class="flex items-center justify-end mb-3">
176
157
  <Button
177
158
  class="mr-2"
178
159
  @type="danger"
160
+ @size="xs"
179
161
  @text="Remove Variant"
180
162
  @icon="trash"
181
163
  @onClick={{fn this.removeProductVariant variant}}
@@ -184,6 +166,7 @@
184
166
  <Button
185
167
  class="mr-2"
186
168
  @type="warning"
169
+ @size="xs"
187
170
  @text="Edit Variant"
188
171
  @icon="pencil"
189
172
  @onClick={{fn this.editProductVariant variant}}
@@ -192,6 +175,7 @@
192
175
  <Button
193
176
  @text={{concat "New " (lowercase variant.name) " option"}}
194
177
  @icon="plus"
178
+ @size="xs"
195
179
  @iconPrefix="fas"
196
180
  @onClick={{fn this.addVariantOption variant}}
197
181
  @permission="storefront create product-variant-option"
@@ -238,9 +222,9 @@
238
222
  {{/each}}
239
223
  </div>
240
224
  </div>
241
- </Tab>
242
- {{/each}}
243
- </Tabs>
225
+ {{/let}}
226
+ </:default>
227
+ </TabNavigation>
244
228
  </ContentPanel>
245
229
 
246
230
  <ContentPanel @title="Add-Ons" @open={{true}} @wrapperClass="bordered-top">
@@ -248,6 +232,7 @@
248
232
  <Button
249
233
  @text="Select Addon Categories"
250
234
  @icon="plus"
235
+ @size="xs"
251
236
  @iconPrefix="fas"
252
237
  @onClick={{perform this.promptSelectAddonCategories}}
253
238
  @permission="storefront list product-addon"
@@ -43,11 +43,11 @@
43
43
  @infiniteScroll={{true}}
44
44
  @renderInPlace={{true}}
45
45
  @onChange={{fn (mut this.selectedCustomers)}}
46
- @triggerClass="form-select form-input w-full min-h-[38px] min-h-38px"
46
+ @triggerClass="form-select form-input w-full"
47
47
  as |model|
48
48
  >
49
49
  <div class="flex flex-row space-x-2">
50
- <div>
50
+ <div class="hide-from-trigger">
51
51
  <Image
52
52
  src={{model.photo_url}}
53
53
  @fallbackSrc={{config "defaultValues.customerImage"}}
@@ -58,9 +58,9 @@
58
58
  />
59
59
  </div>
60
60
  <div>
61
- <div class="font-semibold">{{model.name}}</div>
62
- <div class="text-xs">{{n-a model.email}}</div>
63
- <div class="text-xs">{{n-a model.phone}}</div>
61
+ <div class="font-semibold normalize-in-trigger">{{model.name}}</div>
62
+ <div class="text-xs hide-from-trigger">{{n-a model.email}}</div>
63
+ <div class="text-xs hide-from-trigger">{{n-a model.phone}}</div>
64
64
  </div>
65
65
  </div>
66
66
  </ModelSelectMultiple>
package/composer.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fleetbase/storefront-api",
3
- "version": "0.4.8",
3
+ "version": "0.4.10",
4
4
  "description": "Headless Commerce & Marketplace Extension for Fleetbase",
5
5
  "keywords": [
6
6
  "fleetbase-extension",
package/extension.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "Storefront",
3
- "version": "0.4.8",
3
+ "version": "0.4.10",
4
4
  "description": "Headless Commerce & Marketplace Extension for Fleetbase",
5
5
  "repository": "https://github.com/fleetbase/storefront",
6
6
  "license": "AGPL-3.0-or-later",
package/index.js CHANGED
@@ -8,16 +8,6 @@ const path = require('path');
8
8
  module.exports = buildEngine({
9
9
  name,
10
10
 
11
- postprocessTree(type, tree) {
12
- if (type === 'css') {
13
- tree = new Funnel(tree, {
14
- exclude: ['**/@fleetbase/ember-ui/**/*.css'],
15
- });
16
- }
17
-
18
- return tree;
19
- },
20
-
21
11
  lazyLoading: {
22
12
  enabled: true,
23
13
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fleetbase/storefront-engine",
3
- "version": "0.4.8",
3
+ "version": "0.4.10",
4
4
  "description": "Headless Commerce & Marketplace Extension for Fleetbase",
5
5
  "fleetbase": {
6
6
  "route": "storefront",
@@ -44,9 +44,9 @@
44
44
  },
45
45
  "dependencies": {
46
46
  "@babel/core": "^7.23.2",
47
- "@fleetbase/ember-core": "^0.3.7",
48
- "@fleetbase/ember-ui": "^0.3.12",
49
- "@fleetbase/fleetops-data": "^0.1.23",
47
+ "@fleetbase/ember-core": "^0.3.9",
48
+ "@fleetbase/ember-ui": "^0.3.15",
49
+ "@fleetbase/fleetops-data": "^0.1.24",
50
50
  "@fortawesome/ember-fontawesome": "^2.0.0",
51
51
  "@fortawesome/fontawesome-svg-core": "6.4.0",
52
52
  "@fortawesome/free-brands-svg-icons": "6.4.0",
@@ -20,7 +20,7 @@ class CatalogController extends Controller
20
20
  $results = [];
21
21
 
22
22
  if (session('storefront_store')) {
23
- $results = Catalog::queryWithRequest($request, function (&$query) use ($limit, $offset) {
23
+ $results = Catalog::queryWithRequestCached($request, function (&$query) use ($limit, $offset) {
24
24
  $query->where('subject_uuid', session('storefront_store'));
25
25
 
26
26
  if ($limit) {
@@ -23,7 +23,7 @@ class CategoryController extends Controller
23
23
  $results = [];
24
24
 
25
25
  if (session('storefront_store')) {
26
- $results = Category::queryWithRequest($request, function (&$query) use ($request) {
26
+ $results = Category::queryWithRequestCached($request, function (&$query) use ($request) {
27
27
  $query->select([DB::raw('public_id as id'), 'public_id', 'uuid', 'parent_uuid', 'icon_file_uuid', 'name', 'description', 'tags', 'translations', 'icon', 'slug', 'created_at'])->where(['owner_uuid' => session('storefront_store'), 'for' => 'storefront_product']);
28
28
 
29
29
  // only parent categories
@@ -67,7 +67,7 @@ class CategoryController extends Controller
67
67
  })->first();
68
68
 
69
69
  if ($store) {
70
- $results = Category::queryWithRequest($request, function (&$query) use ($store, $request) {
70
+ $results = Category::queryWithRequestCached($request, function (&$query) use ($store, $request) {
71
71
  $query->select([DB::raw('public_id as id'), 'public_id', 'uuid', 'parent_uuid', 'icon_file_uuid', 'name', 'icon', 'description', 'tags', 'translations', 'slug', 'created_at'])->where(['owner_uuid' => $store->uuid, 'for' => 'storefront_product']);
72
72
 
73
73
  // only parent categories
@@ -102,7 +102,7 @@ class CategoryController extends Controller
102
102
  }
103
103
  }
104
104
  } else {
105
- $results = Category::queryWithRequest($request, function (&$query) use ($request) {
105
+ $results = Category::queryWithRequestCached($request, function (&$query) use ($request) {
106
106
  $query->select([DB::raw('public_id as id'), 'public_id', 'uuid', 'parent_uuid', 'name', 'icon', 'description', 'tags', 'translations', 'slug', 'created_at'])->where(['owner_uuid' => session('storefront_network'), 'for' => 'storefront_network']);
107
107
 
108
108
  // only parent categories
@@ -74,7 +74,7 @@ class CustomerController extends Controller
74
74
  return response()->apiError('Not authorized to view customers orders');
75
75
  }
76
76
 
77
- $results = Order::queryWithRequest($request, function (&$query) use ($customer) {
77
+ $results = Order::queryWithRequestCached($request, function (&$query) use ($customer) {
78
78
  $query->where('customer_uuid', $customer->uuid)->whereNull('deleted_at')->withoutGlobalScopes();
79
79
 
80
80
  // dont query any master orders if its a network
@@ -102,7 +102,7 @@ class CustomerController extends Controller
102
102
  return response()->apiError('Not authorized to view customers places');
103
103
  }
104
104
 
105
- $results = Place::queryWithRequest($request, function (&$query) use ($customer) {
105
+ $results = Place::queryWithRequestCached($request, function (&$query) use ($customer) {
106
106
  $query->where('owner_uuid', $customer->uuid);
107
107
  });
108
108
 
@@ -341,7 +341,7 @@ class CustomerController extends Controller
341
341
  */
342
342
  public function query(Request $request)
343
343
  {
344
- $results = Contact::queryWithRequest($request, function (&$query, $request) {
344
+ $results = Contact::queryWithRequestCached($request, function (&$query, $request) {
345
345
  $query->where(['type' => 'customer', 'company_uuid' => session('company')]);
346
346
  });
347
347
 
@@ -22,7 +22,7 @@ class FoodTruckController extends Controller
22
22
  $results = [];
23
23
 
24
24
  if (session('storefront_store')) {
25
- $results = FoodTruck::queryWithRequest($request, function (&$query) use ($limit, $offset) {
25
+ $results = FoodTruck::queryWithRequestCached($request, function (&$query) use ($limit, $offset) {
26
26
  $query->where('store_uuid', session('storefront_store'));
27
27
 
28
28
  if ($limit) {
@@ -327,7 +327,7 @@ class ProductController extends Controller
327
327
  */
328
328
  public function query(Request $request)
329
329
  {
330
- $results = Product::queryWithRequest($request, function (&$query, $request) {
330
+ $results = Product::queryWithRequestCached($request, function (&$query, $request) {
331
331
  // for stores
332
332
  if (session('storefront_store')) {
333
333
  $query->where(['store_uuid' => session('storefront_store')]);
@@ -33,7 +33,7 @@ class ReviewController extends Controller
33
33
  }
34
34
 
35
35
  if (session('storefront_store')) {
36
- $results = Review::queryWithRequest($request, function (&$query) use ($limit, $offset) {
36
+ $results = Review::queryWithRequestCached($request, function (&$query) use ($limit, $offset) {
37
37
  $query->where('subject_uuid', session('storefront_store'));
38
38
 
39
39
  if ($limit) {
@@ -59,7 +59,7 @@ class ReviewController extends Controller
59
59
  return response()->json(['error' => 'Cannot find reviews for store'], 400);
60
60
  }
61
61
 
62
- $results = Review::queryWithRequest($request, function (&$query) use ($store, $limit, $offset) {
62
+ $results = Review::queryWithRequestCached($request, function (&$query) use ($store, $limit, $offset) {
63
63
  $query->where('subject_uuid', $store->uuid);
64
64
 
65
65
  if ($limit) {
@@ -5,7 +5,6 @@ namespace Fleetbase\Storefront\Http\Controllers\v1;
5
5
  use Fleetbase\FleetOps\Http\Resources\v1\ServiceQuote as ServiceQuoteResource;
6
6
  use Fleetbase\FleetOps\Models\Entity;
7
7
  use Fleetbase\FleetOps\Models\IntegratedVendor;
8
- use Fleetbase\FleetOps\Models\OrderConfig;
9
8
  use Fleetbase\FleetOps\Models\Place;
10
9
  use Fleetbase\FleetOps\Models\ServiceQuote;
11
10
  use Fleetbase\FleetOps\Models\ServiceQuoteItem;
@@ -19,6 +18,7 @@ use Fleetbase\Storefront\Models\FoodTruck;
19
18
  use Fleetbase\Storefront\Models\Product;
20
19
  use Fleetbase\Storefront\Models\Store;
21
20
  use Fleetbase\Storefront\Models\StoreLocation;
21
+ use Fleetbase\Storefront\Support\Storefront;
22
22
  use Fleetbase\Support\Utils as CoreUtils;
23
23
  use Illuminate\Support\Str;
24
24
 
@@ -102,11 +102,11 @@ class ServiceQuoteController extends Controller
102
102
  $serviceQuotes = collect();
103
103
 
104
104
  // get order configurations for ecommerce / task
105
- $orderConfig = OrderConfig::resolveFromIdentifier($config);
105
+ $orderConfig = Storefront::getSessionOrderConfig();
106
106
  $orderConfigKey = data_get($orderConfig, 'key', 'storefront');
107
107
 
108
108
  // get service rates for config type
109
- $serviceRates = ServiceRate::where('service_type', $orderConfigKey)->get();
109
+ $serviceRates = ServiceRate::where(['company_uuid' => session('company'), 'service_type' => $orderConfigKey])->get();
110
110
 
111
111
  // if no service rates send an empty quote
112
112
  if ($serviceRates->isEmpty()) {
@@ -290,11 +290,11 @@ class ServiceQuoteController extends Controller
290
290
  $serviceQuotes = collect();
291
291
 
292
292
  // get order configurations for ecommerce / task
293
- $orderConfig = OrderConfig::resolveFromIdentifier($config);
293
+ $orderConfig = Storefront::getSessionOrderConfig();
294
294
  $orderConfigKey = data_get($orderConfig, 'key', 'storefront');
295
295
 
296
296
  // get service rates for config type
297
- $serviceRates = ServiceRate::where('service_type', $orderConfigKey)->get();
297
+ $serviceRates = ServiceRate::where(['company_uuid' => session('company'), 'service_type' => $orderConfigKey])->get();
298
298
 
299
299
  // if no service rates send an empty quote
300
300
  if ($serviceRates->isEmpty()) {
@@ -8,6 +8,7 @@ use Fleetbase\Models\Company;
8
8
  use Fleetbase\Models\User;
9
9
  use Fleetbase\Traits\Expirable;
10
10
  use Fleetbase\Traits\HasApiModelBehavior;
11
+ use Fleetbase\Traits\HasApiModelCache;
11
12
  use Fleetbase\Traits\HasPublicId;
12
13
  use Fleetbase\Traits\HasUuid;
13
14
  use Illuminate\Support\Arr;
@@ -19,6 +20,7 @@ class Cart extends StorefrontModel
19
20
  use HasUuid;
20
21
  use HasPublicId;
21
22
  use HasApiModelBehavior;
23
+ use HasApiModelCache;
22
24
  use Expirable;
23
25
 
24
26
  /**
@@ -6,6 +6,7 @@ use Fleetbase\Casts\Json;
6
6
  use Fleetbase\Models\Company;
7
7
  use Fleetbase\Models\User;
8
8
  use Fleetbase\Traits\HasApiModelBehavior;
9
+ use Fleetbase\Traits\HasApiModelCache;
9
10
  use Fleetbase\Traits\HasPublicid;
10
11
  use Fleetbase\Traits\HasUuid;
11
12
  use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -17,6 +18,7 @@ class Catalog extends StorefrontModel
17
18
  use HasUuid;
18
19
  use HasPublicid;
19
20
  use HasApiModelBehavior;
21
+ use HasApiModelCache;
20
22
 
21
23
  /**
22
24
  * The type of public ID to generate.
@@ -9,6 +9,7 @@ use Fleetbase\FleetOps\Models\Zone;
9
9
  use Fleetbase\LaravelMysqlSpatial\Types\Point;
10
10
  use Fleetbase\Storefront\Http\Resources\FoodTruck as FoodTruckResource;
11
11
  use Fleetbase\Traits\HasApiModelBehavior;
12
+ use Fleetbase\Traits\HasApiModelCache;
12
13
  use Fleetbase\Traits\HasPublicid;
13
14
  use Fleetbase\Traits\HasUuid;
14
15
  use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -22,6 +23,7 @@ class FoodTruck extends StorefrontModel
22
23
  use HasUuid;
23
24
  use HasPublicid;
24
25
  use HasApiModelBehavior;
26
+ use HasApiModelCache;
25
27
  use SoftDeletes;
26
28
 
27
29
  /**
@@ -13,6 +13,7 @@ use Fleetbase\Models\Invite;
13
13
  use Fleetbase\Models\User;
14
14
  use Fleetbase\Storefront\Support\Storefront;
15
15
  use Fleetbase\Traits\HasApiModelBehavior;
16
+ use Fleetbase\Traits\HasApiModelCache;
16
17
  use Fleetbase\Traits\HasOptionsAttributes;
17
18
  use Fleetbase\Traits\HasPublicid;
18
19
  use Fleetbase\Traits\HasUuid;
@@ -26,6 +27,7 @@ class Network extends StorefrontModel
26
27
  use HasUuid;
27
28
  use HasPublicid;
28
29
  use HasApiModelBehavior;
30
+ use HasApiModelCache;
29
31
  use HasOptionsAttributes;
30
32
  use HasSlug;
31
33
  use Searchable;
@@ -9,6 +9,7 @@ use Fleetbase\Models\Category;
9
9
  use Fleetbase\Models\File;
10
10
  use Fleetbase\Models\User;
11
11
  use Fleetbase\Traits\HasApiModelBehavior;
12
+ use Fleetbase\Traits\HasApiModelCache;
12
13
  use Fleetbase\Traits\HasMetaAttributes;
13
14
  use Fleetbase\Traits\HasPublicid;
14
15
  use Fleetbase\Traits\HasUuid;
@@ -30,6 +31,7 @@ class Product extends StorefrontModel
30
31
  use HasUuid;
31
32
  use HasPublicid;
32
33
  use HasApiModelBehavior;
34
+ use HasApiModelCache;
33
35
  use HasMetaAttributes;
34
36
  use HasSlug;
35
37
  use Searchable;
@@ -5,6 +5,7 @@ namespace Fleetbase\Storefront\Models;
5
5
  use Fleetbase\Models\File;
6
6
  use Fleetbase\Models\User;
7
7
  use Fleetbase\Traits\HasApiModelBehavior;
8
+ use Fleetbase\Traits\HasApiModelCache;
8
9
  use Fleetbase\Traits\HasPublicid;
9
10
  use Fleetbase\Traits\HasUuid;
10
11
 
@@ -13,6 +14,7 @@ class Review extends StorefrontModel
13
14
  use HasUuid;
14
15
  use HasPublicid;
15
16
  use HasApiModelBehavior;
17
+ use HasApiModelCache;
16
18
 
17
19
  /**
18
20
  * The type of public Id to generate.
@@ -13,6 +13,7 @@ use Fleetbase\Models\User;
13
13
  use Fleetbase\Storefront\Support\Storefront;
14
14
  use Fleetbase\Support\Utils as FleetbaseUtils;
15
15
  use Fleetbase\Traits\HasApiModelBehavior;
16
+ use Fleetbase\Traits\HasApiModelCache;
16
17
  use Fleetbase\Traits\HasMetaAttributes;
17
18
  use Fleetbase\Traits\HasOptionsAttributes;
18
19
  use Fleetbase\Traits\HasPublicid;
@@ -28,6 +29,7 @@ class Store extends StorefrontModel
28
29
  use HasUuid;
29
30
  use HasPublicid;
30
31
  use HasApiModelBehavior;
32
+ use HasApiModelCache;
31
33
  use HasOptionsAttributes;
32
34
  use HasMetaAttributes;
33
35
  use HasSlug;
@@ -256,6 +256,22 @@ class Storefront
256
256
  return $orderConfig;
257
257
  }
258
258
 
259
+ /**
260
+ * Get the current store or networks order config.
261
+ *
262
+ * @return \Fleetbase\Storefront\Models\OrderConfig|null
263
+ */
264
+ public static function getSessionOrderConfig(): ?OrderConfig
265
+ {
266
+ if ($about = static::about()) {
267
+ $about->loadMissing('orderConfig');
268
+
269
+ return $about->orderConfig ?? static::getDefaultOrderConfig();
270
+ }
271
+
272
+ return static::getDefaultOrderConfig();
273
+ }
274
+
259
275
  /**
260
276
  * Get the default Storefront OrderConfig for the "current" company context.
261
277
  *