@esolve/ng-esolve-connect 0.142.0 → 0.144.0

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.
@@ -304,7 +304,7 @@ class EsolveCategoryTreeItem {
304
304
  get tiny_image_src() {
305
305
  return this.getImagePath('tiny');
306
306
  }
307
- constructor(type, esolve_id, parent_id, description, sef_description, short_description, sort_priority, active, display_only, image_name, seo_title, seo_keywords, seo_description, children) {
307
+ constructor(type, esolve_id, parent_id, description, sef_description, short_description, sort_priority, active, display_only, image_name, seo_title, seo_keywords, seo_description, children, cart_sort, stock_sort) {
308
308
  this.type = type;
309
309
  this.esolve_id = esolve_id;
310
310
  this.parent_id = parent_id;
@@ -316,6 +316,8 @@ class EsolveCategoryTreeItem {
316
316
  this.display_only = display_only;
317
317
  this.image_name = image_name;
318
318
  this.id = '';
319
+ this.cart_sort = null;
320
+ this.stock_sort = null;
319
321
  this.image_path = '';
320
322
  if (this.type === 'category') {
321
323
  this.id = `<<CAT>>${this.esolve_id}`;
@@ -332,6 +334,18 @@ class EsolveCategoryTreeItem {
332
334
  seo_title = this.description;
333
335
  }
334
336
  this.seo_details = new EsolveSeoInfo(seo_title, seo_description, seo_keywords);
337
+ if (cart_sort) {
338
+ this.cart_sort = {
339
+ field: cart_sort.sort,
340
+ order: cart_sort.order,
341
+ };
342
+ }
343
+ if (stock_sort) {
344
+ this.stock_sort = {
345
+ field: stock_sort.sort,
346
+ order: stock_sort.order,
347
+ };
348
+ }
335
349
  }
336
350
  getImagePath(image_size) {
337
351
  if (this.image_name !== '') {
@@ -473,13 +487,13 @@ class EsolveCategoryTreeService {
473
487
  esolve_id = tree_record.id;
474
488
  parent_id = tree_record.menu_id;
475
489
  }
476
- tree_items.push(new EsolveCategoryTreeItem(tree_record.type, esolve_id, parent_id, tree_record.description, tree_record.sef_description, tree_record.seo_description, tree_record.sort_priority, tree_record.active, tree_record.display_only, tree_record.image, tree_record.seo_page_title, tree_record.seo_keywords, tree_record.short_description, children));
490
+ tree_items.push(new EsolveCategoryTreeItem(tree_record.type, esolve_id, parent_id, tree_record.description, tree_record.sef_description, tree_record.seo_description, tree_record.sort_priority, tree_record.active, tree_record.display_only, tree_record.image, tree_record.seo_page_title, tree_record.seo_keywords, tree_record.short_description, children, tree_record.cart_sort, tree_record.stock_sort));
477
491
  }
478
492
  }
479
493
  return tree_items;
480
494
  }
481
495
  processTreeItem(record) {
482
- return new EsolveCategoryTreeItem(record.type, record.id, record.parent_id, record.description, record.sef_description, record.short_description, record.sort_priority, record.active, record.display_only, record.image, record.seo_page_title, record.seo_keywords, record.seo_description);
496
+ return new EsolveCategoryTreeItem(record.type, record.id, record.parent_id, record.description, record.sef_description, record.short_description, record.sort_priority, record.active, record.display_only, record.image, record.seo_page_title, record.seo_keywords, record.seo_description, undefined, record.cart_sort, record.stock_sort);
483
497
  }
484
498
  processID(id) {
485
499
  let type;
@@ -1100,6 +1114,26 @@ class EsolveStockLeadTimes {
1100
1114
  }
1101
1115
  }
1102
1116
 
1117
+ class EsolveStockLinkedCategory {
1118
+ constructor(linked_category) {
1119
+ /**
1120
+ * ID of the linked category
1121
+ */
1122
+ this.category_id = '';
1123
+ /**
1124
+ * ID of the linked subcategory
1125
+ */
1126
+ this.subcategory_id = 0;
1127
+ /**
1128
+ * Whether this linked category is the default for the stock item
1129
+ */
1130
+ this.is_default = false;
1131
+ this.category_id = linked_category.category_id ?? '';
1132
+ this.subcategory_id = +(linked_category.subcategory_id ?? 0);
1133
+ this.is_default = !!linked_category.is_default;
1134
+ }
1135
+ }
1136
+
1103
1137
  /**
1104
1138
  * Price of eSolve stock item
1105
1139
  */
@@ -1409,6 +1443,10 @@ class EsolveStockItemBase {
1409
1443
  * Sizes
1410
1444
  */
1411
1445
  this.sizes = [];
1446
+ /**
1447
+ * Linked categories the stock item belongs to
1448
+ */
1449
+ this.linked_categories = [];
1412
1450
  /**
1413
1451
  * Material id
1414
1452
  */
@@ -1522,6 +1560,11 @@ class EsolveStockItemBase {
1522
1560
  if (record.lead_times) {
1523
1561
  this.lead_times = new EsolveStockLeadTimes(record.lead_times);
1524
1562
  }
1563
+ if (record.linked_categories && record.linked_categories.length > 0) {
1564
+ for (const linked_category of record.linked_categories) {
1565
+ this.linked_categories.push(new EsolveStockLinkedCategory(linked_category));
1566
+ }
1567
+ }
1525
1568
  if (record.custom_fields) {
1526
1569
  this.custom_fields = record.custom_fields;
1527
1570
  }
@@ -2255,6 +2298,12 @@ class EsolveStockService {
2255
2298
  if (options.is_active) {
2256
2299
  params = params.set('is_active', options.is_active);
2257
2300
  }
2301
+ if (options.override_fields_set) {
2302
+ params = params.set('override_fields_set', options.override_fields_set);
2303
+ }
2304
+ if (options.custom_field_config_names) {
2305
+ params = params.set('custom_field_config_names', options.custom_field_config_names.join(','));
2306
+ }
2258
2307
  if (options.category_id) {
2259
2308
  params = params.set('category_id', options.category_id);
2260
2309
  }
@@ -6172,6 +6221,7 @@ class EsolveLocation {
6172
6221
  this.website_url = record.website_url;
6173
6222
  this.image_name = record.image_name ?? '';
6174
6223
  this.image_last_modified = record.image_last_modified ?? '';
6224
+ this.sef_name = record.sef_name ?? '';
6175
6225
  this.address = new EsolveLocationAddress(record.street, record.suburb, record.city, record.province, record.country, record.postal_code, +record.latitude, +record.longitude);
6176
6226
  this.pobox_address = new EsolveLocationPOBoxAddress(record.pobox, record.pobox_city, record.pobox_postal_code);
6177
6227
  const telnumbers = [];
@@ -7087,12 +7137,25 @@ class EsolveAccountService {
7087
7137
  .pipe(map$1((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => {
7088
7138
  if (!response.login_required) {
7089
7139
  const session_data = response.session_data;
7140
+ const additional_data = http_response.additional_data;
7141
+ let token = undefined;
7142
+ let expiry_date_unix = undefined;
7143
+ let grace_unix = undefined;
7144
+ if (!Array.isArray(additional_data)) {
7145
+ token = additional_data.key;
7146
+ expiry_date_unix =
7147
+ +additional_data.expiry_time;
7148
+ grace_unix = +additional_data.grace_period;
7149
+ }
7090
7150
  this.sessionService.handleUpdateSession({
7091
7151
  user_id: +response.esolve_id,
7092
7152
  location_id: +session_data.location_id,
7093
7153
  addresses_id: +session_data.addresses_id,
7094
7154
  shipping_id: +session_data.shipping_id,
7095
7155
  clients_id: +session_data.clients_id,
7156
+ token,
7157
+ expiry_date_unix,
7158
+ grace_unix,
7096
7159
  });
7097
7160
  }
7098
7161
  return new EsolveResetPasswordResult(response);
@@ -8893,6 +8956,79 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
8893
8956
  }]
8894
8957
  }] });
8895
8958
 
8959
+ class EsolveEnquiryFormField {
8960
+ constructor(record) {
8961
+ this.id = 0;
8962
+ this.identifier = '';
8963
+ this.type = '';
8964
+ this.label = '';
8965
+ this.description = '';
8966
+ this.required = false;
8967
+ this.placeholder = '';
8968
+ this.character_length = 255;
8969
+ this.options = [];
8970
+ this.accept = '';
8971
+ this.layout_row = 0;
8972
+ if (record) {
8973
+ this.id = +(record.id ?? 0);
8974
+ this.identifier = record.identifier ?? '';
8975
+ this.type = record.type ?? '';
8976
+ this.label = record.label ?? '';
8977
+ this.description = record.description ?? '';
8978
+ this.required = !!record.required;
8979
+ this.layout_row = +(record.layout_row ?? 0);
8980
+ if ('placeholder' in record) {
8981
+ this.placeholder = record.placeholder ?? '';
8982
+ }
8983
+ if ('character_length' in record) {
8984
+ this.character_length = +(record.character_length ?? 255);
8985
+ }
8986
+ if ('options' in record) {
8987
+ this.options = record.options ?? [];
8988
+ }
8989
+ if ('accept' in record) {
8990
+ this.accept = record.accept ?? '';
8991
+ }
8992
+ }
8993
+ }
8994
+ }
8995
+
8996
+ class EsolveEnquiryFormSubmissionResult {
8997
+ constructor(result) {
8998
+ this.success = false;
8999
+ this.message = '';
9000
+ this.invalid_field_identifiers = [];
9001
+ this.success = result.success;
9002
+ this.message = result.message;
9003
+ this.invalid_field_identifiers =
9004
+ result.invalid_field_identifiers ?? [];
9005
+ }
9006
+ }
9007
+
9008
+ class EsolveEnquiryForm {
9009
+ constructor(record) {
9010
+ this.id = 0;
9011
+ this.identifier = '';
9012
+ this.title = '';
9013
+ this.description = '';
9014
+ this.success_message = '';
9015
+ this.fields = [];
9016
+ if (record) {
9017
+ this.id = +(record.id ?? 0);
9018
+ this.identifier = record.identifier ?? '';
9019
+ this.title = record.title ?? '';
9020
+ this.description = record.description ?? '';
9021
+ this.success_message = record.success_message ?? '';
9022
+ this.fields = this.processFields(record.fields ?? []);
9023
+ }
9024
+ }
9025
+ processFields(fields) {
9026
+ return fields.map((field) => {
9027
+ return new EsolveEnquiryFormField(field);
9028
+ });
9029
+ }
9030
+ }
9031
+
8896
9032
  class EsolveEnquiryResult extends EsolveResponseResult {
8897
9033
  constructor(response) {
8898
9034
  super(response);
@@ -8901,6 +9037,80 @@ class EsolveEnquiryResult extends EsolveResponseResult {
8901
9037
  }
8902
9038
  }
8903
9039
 
9040
+ class EsolveEnquiryFormsService {
9041
+ constructor() {
9042
+ this.http = inject(HttpClient);
9043
+ this.config = inject(EsolveConfigService);
9044
+ this.errorHandler = inject(EsolveErrorHandlerService);
9045
+ }
9046
+ /**
9047
+ * Fetch an enquiry form definition by its id or string identifier.
9048
+ *
9049
+ * @param params - Either `{ id: number }` or `{ identifier: string }`
9050
+ *
9051
+ * @returns an Observable of type EsolveEnquiryForm
9052
+ */
9053
+ getEnquiryForm(params) {
9054
+ let httpParams = new HttpParams();
9055
+ if ('id' in params) {
9056
+ httpParams = httpParams.set('enquiry_forms_id', params.id);
9057
+ }
9058
+ else {
9059
+ httpParams = httpParams.set('identifier', params.identifier);
9060
+ }
9061
+ return this.http
9062
+ .get(`${this.config.api_url}/get-enquiry-form.php`, { params: httpParams })
9063
+ .pipe(map((response) => {
9064
+ const record = response.records;
9065
+ if (!record || Array.isArray(record)) {
9066
+ throw response;
9067
+ }
9068
+ return new EsolveEnquiryForm(record);
9069
+ }));
9070
+ }
9071
+ /**
9072
+ * Submit a completed enquiry form.
9073
+ *
9074
+ * Resolves with the submit result — does not reject on validation failure.
9075
+ * Check `result.success` and `result.invalid_field_identifiers` to handle
9076
+ * field-level validation errors without clearing the form.
9077
+ *
9078
+ * Captcha fields (`captcha_key`, `captcha_code`) should be appended to
9079
+ * `form_data` by the caller when captcha is enabled.
9080
+ *
9081
+ * @param params - Either `{ id: number }` or `{ identifier: string }`
9082
+ * @param form_data - Completed form data; file fields appended as `File` objects
9083
+ *
9084
+ * @returns an Observable of type EsolveEnquiryFormSubmissionResult
9085
+ */
9086
+ submitEnquiryForm(params, form_data) {
9087
+ let http_params = new HttpParams();
9088
+ if ('id' in params) {
9089
+ http_params = http_params.set('enquiry_forms_id', params.id);
9090
+ }
9091
+ else {
9092
+ http_params = http_params.set('identifier', params.identifier);
9093
+ }
9094
+ return this.http
9095
+ .post(`${this.config.api_url}/set-enquiry-form-submission.php`, form_data, {
9096
+ responseType: 'json',
9097
+ observe: 'body',
9098
+ params: http_params,
9099
+ })
9100
+ .pipe(map((http_response) => new EsolveEnquiryFormSubmissionResult(http_response.additional_data)), catchError((errorRes) => {
9101
+ return this.errorHandler.handleHttpPostError('set-enquiry-form-submission', errorRes);
9102
+ }));
9103
+ }
9104
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: EsolveEnquiryFormsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
9105
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: EsolveEnquiryFormsService, providedIn: 'root' }); }
9106
+ }
9107
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: EsolveEnquiryFormsService, decorators: [{
9108
+ type: Injectable,
9109
+ args: [{
9110
+ providedIn: 'root',
9111
+ }]
9112
+ }] });
9113
+
8904
9114
  class EsolveEnquiryService {
8905
9115
  constructor() {
8906
9116
  this.config = inject(EsolveConfigService);
@@ -9604,6 +9814,76 @@ class EsolveCompetitionEntryResult extends EsolveResponseResult {
9604
9814
  }
9605
9815
  }
9606
9816
 
9817
+ class EsolveCompetitionEntry {
9818
+ constructor(record) {
9819
+ this.id = '';
9820
+ this.code = '';
9821
+ this.title = '';
9822
+ this.submitted_by = '';
9823
+ this.file_type = 'image';
9824
+ this.file_url = '';
9825
+ this.preview_url = '';
9826
+ this.date_submitted = '';
9827
+ this.status = 'pending';
9828
+ this.up_votes = 0;
9829
+ this.down_votes = 0;
9830
+ this.has_voted = false;
9831
+ if (record) {
9832
+ this.id = record.id ?? '';
9833
+ this.code = record.code ?? '';
9834
+ this.title = record.title ?? '';
9835
+ this.submitted_by = record.submitted_by ?? '';
9836
+ this.file_type = record.file_type ?? 'image';
9837
+ this.file_url = record.file_url ?? '';
9838
+ this.preview_url = record.preview_url ?? '';
9839
+ this.date_submitted = record.date_submitted ?? '';
9840
+ this.status = record.status ?? 'pending';
9841
+ this.up_votes = +(record.up_votes ?? 0);
9842
+ this.down_votes = +(record.down_votes ?? 0);
9843
+ this.has_voted = !!record.has_voted;
9844
+ this.text_content = record.text_content;
9845
+ }
9846
+ }
9847
+ }
9848
+
9849
+ /**
9850
+ * Public competition statistics returned by the `get-competitions.php` service.
9851
+ */
9852
+ class EsolveCompetitionStats {
9853
+ constructor(record) {
9854
+ /**
9855
+ * Total approved entries submitted to the competition.
9856
+ */
9857
+ this.total_entries = 0;
9858
+ /**
9859
+ * Total up + down votes cast across all competition entries.
9860
+ */
9861
+ this.total_votes = 0;
9862
+ if (record) {
9863
+ this.total_entries = +(record.total_entries ?? 0);
9864
+ this.total_votes = +(record.total_votes ?? 0);
9865
+ }
9866
+ }
9867
+ }
9868
+
9869
+ class EsolveCompetitionVoteResult extends EsolveResponseResult {
9870
+ constructor(record) {
9871
+ super(record);
9872
+ this.success = false;
9873
+ this.entry_id = '';
9874
+ this.dowhat = 'up';
9875
+ this.up_votes = 0;
9876
+ this.down_votes = 0;
9877
+ this.has_voted = false;
9878
+ this.success = true;
9879
+ this.entry_id = record.entry_id ?? '';
9880
+ this.dowhat = record.dowhat ?? 'up';
9881
+ this.up_votes = +(record.up_votes ?? 0);
9882
+ this.down_votes = +(record.down_votes ?? 0);
9883
+ this.has_voted = !!record.has_voted;
9884
+ }
9885
+ }
9886
+
9607
9887
  class EsolveCompetitionWinner {
9608
9888
  constructor(record) {
9609
9889
  /**
@@ -9684,6 +9964,18 @@ class EsolveCompetition {
9684
9964
  * Competition requires text submission
9685
9965
  */
9686
9966
  this.require_text = false;
9967
+ /**
9968
+ * Allow document (PDF/PPTX/DOCX) submissions
9969
+ */
9970
+ this.require_document = false;
9971
+ /**
9972
+ * Whether public voting on entries is enabled for this competition
9973
+ */
9974
+ this.enable_voting = true;
9975
+ /**
9976
+ * Whether new entries require moderator approval before they appear
9977
+ */
9978
+ this.require_approval = false;
9687
9979
  /**
9688
9980
  * List of competition winners
9689
9981
  */
@@ -9692,6 +9984,10 @@ class EsolveCompetition {
9692
9984
  * Display a count down timer
9693
9985
  */
9694
9986
  this.display_timer = false;
9987
+ /**
9988
+ * Public competition statistics (entries and votes)
9989
+ */
9990
+ this.stats = new EsolveCompetitionStats();
9695
9991
  if (record) {
9696
9992
  this.id = +(record.id ?? 0);
9697
9993
  this.identifier = record.identifier ?? '';
@@ -9714,8 +10010,14 @@ class EsolveCompetition {
9714
10010
  this.require_audio = !!+(record.audio_attachment ?? false);
9715
10011
  this.require_video = !!+(record.video_attachment ?? false);
9716
10012
  this.require_image = !!+(record.image_attachment ?? false);
10013
+ this.require_document = !!+(record.document_attachment ?? false);
9717
10014
  this.require_text = !!+(record.text ?? false);
10015
+ this.enable_voting = !!+(record.enable_voting ?? true);
10016
+ this.require_approval = !!+(record.require_approval ?? false);
9718
10017
  this.display_timer = !!+(record.display_timer ?? false);
10018
+ if (record.stats) {
10019
+ this.stats = new EsolveCompetitionStats(record.stats);
10020
+ }
9719
10021
  const winners = record.winners;
9720
10022
  if (winners && winners.length > 0) {
9721
10023
  for (const winner of winners) {
@@ -9811,6 +10113,49 @@ class EsolveCompetitionsService {
9811
10113
  return this.errorHandler.handleHttpPostError('set-competition-entry', errorRes);
9812
10114
  }));
9813
10115
  }
10116
+ /**
10117
+ * Retrieve a paginated list of approved entries for a competition.
10118
+ *
10119
+ * @param competitions_id - eSolve ID of the competition.
10120
+ * @param page - 1-based page number (optional).
10121
+ * @param rows - entries per page (optional).
10122
+ *
10123
+ * @returns an Observable of EsolveCompetitionEntry[].
10124
+ */
10125
+ getCompetitionEntries(competitions_id, page, rows) {
10126
+ let params = new HttpParams({
10127
+ fromObject: { competitions_id },
10128
+ });
10129
+ if (page != null) {
10130
+ params = params.set('page', page);
10131
+ }
10132
+ if (rows != null) {
10133
+ params = params.set('rows', rows);
10134
+ }
10135
+ return this.http
10136
+ .get(`${this.config.api_url}/get-competition-entries.php`, { params })
10137
+ .pipe(map$1((response) => (response.records ?? []).map((record) => new EsolveCompetitionEntry(record))), catchError$1(() => of([])));
10138
+ }
10139
+ /**
10140
+ * Cast or retract a vote on a competition entry.
10141
+ *
10142
+ * @param competition_entry_id - UUID of the entry to vote on.
10143
+ * @param dowhat - `'up'` to upvote (default) or `'down'` to downvote.
10144
+ *
10145
+ * @returns an Observable of EsolveCompetitionVoteResult.
10146
+ */
10147
+ setCompetitionVote(competition_entry_id, dowhat = 'up') {
10148
+ const body = { competition_entry_id, dowhat };
10149
+ return this.http
10150
+ .post(`${this.config.api_url}/set-competition-vote.php`, body, {
10151
+ headers: {
10152
+ 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;',
10153
+ },
10154
+ responseType: 'json',
10155
+ observe: 'body',
10156
+ })
10157
+ .pipe(map$1((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => new EsolveCompetitionVoteResult(response))), catchError$1((errorRes) => this.errorHandler.handleHttpPostError('set-competition-vote', errorRes)));
10158
+ }
9814
10159
  getCompetitionSingle(params) {
9815
10160
  return this.getCompetitionRecords(params).pipe(map$1((records) => {
9816
10161
  const record = records[0];
@@ -10999,6 +11344,142 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
10999
11344
  }]
11000
11345
  }] });
11001
11346
 
11347
+ /**
11348
+ * One labelled product grid within a `product_catalog` (`multi_grid`) chat
11349
+ * result — e.g. "Under R500", "Best sellers". `items` are built the same way
11350
+ * `EsolveChatIntentResult.items` builds `product_search` results, just
11351
+ * grouped under a label instead of a single flat list. `link` is an optional
11352
+ * "View more" target the consumer can build a route from — `null` when the
11353
+ * server couldn't resolve any of this group's filters to a real
11354
+ * category/subcategory/brand/tag.
11355
+ */
11356
+ class EsolveChatProductGroup {
11357
+ constructor(record) {
11358
+ this.label = record.label ?? '';
11359
+ this.items = (record.items ?? []).map((r) => new EsolveStockItemBase(r));
11360
+ this.link = record.link ?? null;
11361
+ }
11362
+ }
11363
+
11364
+ class EsolveChatIntentResult {
11365
+ constructor(response) {
11366
+ this.intent = response.intent;
11367
+ this.parameters = response.parameters;
11368
+ this.reply = response.reply;
11369
+ this.history = response.history;
11370
+ this.context = response.context ?? '';
11371
+ this.display_hint = response.display_hint ?? 'text';
11372
+ this.suggestions = response.suggestions ?? [];
11373
+ const data = response.data;
11374
+ if ((this.intent === 'product_search' || this.intent === 'add_to_basket') &&
11375
+ Array.isArray(data)) {
11376
+ // For `add_to_basket`, `items` holds the single item that was added
11377
+ // to the cart (empty when no match was found or the add failed).
11378
+ this.items = data.map((r) => new EsolveStockItemBase(r));
11379
+ this.groups = [];
11380
+ this.locations = [];
11381
+ this.brands = [];
11382
+ }
11383
+ else if (this.intent === 'product_catalog' && Array.isArray(data)) {
11384
+ this.items = [];
11385
+ this.groups = data.map((g) => new EsolveChatProductGroup(g));
11386
+ this.locations = [];
11387
+ this.brands = [];
11388
+ }
11389
+ else if (this.intent === 'directions' && Array.isArray(data)) {
11390
+ this.items = [];
11391
+ this.groups = [];
11392
+ this.locations = data.map((r) => new EsolveLocation(r));
11393
+ this.brands = [];
11394
+ }
11395
+ else if (this.intent === 'list_brands' && Array.isArray(data)) {
11396
+ this.items = [];
11397
+ this.groups = [];
11398
+ this.locations = [];
11399
+ this.brands = data.map((r) => new EsolveManufacturer(r));
11400
+ }
11401
+ else {
11402
+ this.items = [];
11403
+ this.groups = [];
11404
+ this.locations = [];
11405
+ this.brands = [];
11406
+ }
11407
+ }
11408
+ }
11409
+
11410
+ class EsolveChatService {
11411
+ constructor() {
11412
+ this.http = inject(HttpClient);
11413
+ this.config = inject(EsolveConfigService);
11414
+ this.errorHandler = inject(EsolveErrorHandlerService);
11415
+ }
11416
+ /**
11417
+ * Send a free-text message to the chat assistant (AI classification).
11418
+ *
11419
+ * The caller is responsible for persisting `result.history` and
11420
+ * `result.context` between turns and passing them back on the next call.
11421
+ * The server caps history at 50 messages and summarises automatically.
11422
+ *
11423
+ * @param message The user's message (max 1024 chars; truncated server-side).
11424
+ * @param history History from the previous `EsolveChatIntentResult.history`.
11425
+ * Pass an empty array to start a new conversation.
11426
+ * @param context Pass back `EsolveChatIntentResult.context` from the previous
11427
+ * turn so the AI can answer follow-up questions about results
11428
+ * currently shown on screen. Omit or pass `null` / `''` when
11429
+ * there are no current results. Never stored in history.
11430
+ */
11431
+ sendMessage(message, history = [], context) {
11432
+ const body = { message, history };
11433
+ if (context) {
11434
+ body.context = context;
11435
+ }
11436
+ return this.post(body);
11437
+ }
11438
+ /**
11439
+ * Dispatch a structured suggestion-chip tap directly — no AI round trip.
11440
+ *
11441
+ * Use this when the consumer taps a chip whose `intent` is a server intent
11442
+ * (`product_search`, `product_catalog`, `add_to_basket`, `directions`,
11443
+ * `list_brands`). Client-action intents (`view_cart`, `checkout`) are handled
11444
+ * locally by the consumer and never reach this method.
11445
+ *
11446
+ * @param intent One of the 5 server intents.
11447
+ * @param parameters The chip's `parameters` (sent back verbatim).
11448
+ * @param history History from the previous `EsolveChatIntentResult.history`.
11449
+ * @param phrase The chip's phrase, recorded as the user turn in history.
11450
+ * Omit to let the server fall back to `parameters.query`.
11451
+ */
11452
+ dispatchIntent(intent, parameters, history = [], phrase) {
11453
+ const body = { intent, parameters, history };
11454
+ if (phrase) {
11455
+ body.phrase = phrase;
11456
+ }
11457
+ return this.post(body);
11458
+ }
11459
+ post(body) {
11460
+ return this.http
11461
+ .post(`${this.config.api_url}/set-chat-intent.php`, body)
11462
+ .pipe(map$1((response) => {
11463
+ if (response.type === 'error') {
11464
+ throw response;
11465
+ }
11466
+ const data = response.additional_data;
11467
+ if (Array.isArray(data) || !data) {
11468
+ throw response;
11469
+ }
11470
+ return new EsolveChatIntentResult(data);
11471
+ }), catchError$1((errorRes) => this.errorHandler.handleHttpPostError('set-chat-intent', errorRes)));
11472
+ }
11473
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: EsolveChatService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
11474
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: EsolveChatService, providedIn: 'root' }); }
11475
+ }
11476
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: EsolveChatService, decorators: [{
11477
+ type: Injectable,
11478
+ args: [{
11479
+ providedIn: 'root',
11480
+ }]
11481
+ }] });
11482
+
11002
11483
  /*
11003
11484
  * Public API Surface of ng-esolve-connect
11004
11485
  */
@@ -11007,5 +11488,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
11007
11488
  * Generated bundle index. Do not edit.
11008
11489
  */
11009
11490
 
11010
- export { ESOLVE_CONNECT_CONFIG, ESOLVE_EURUS_AUTO_LOGIN, EsolveAccountConfirmationResult, EsolveAccountPayment, EsolveAccountService, EsolveAdditionalStockImage, EsolveAddress, EsolveAddressResult, EsolveAffiliate, EsolveAffiliateCheckResult, EsolveAffiliateLinkResult, EsolveAffiliateService, EsolveAlbum, EsolveAlbumImage, EsolveAlbumImageList, EsolveAlbumList, EsolveAlbumsService, EsolveAsset, EsolveAssetsService, EsolveAuthService, EsolveBankingDetails, EsolveBanner, EsolveBannerImage, EsolveBannerImageHotspot, EsolveBannerService, EsolveBannerVideo, EsolveCaptcha, EsolveCaptchaService, EsolveCareer, EsolveCareersService, EsolveCartAlternative, EsolveCartErrorHandlerService, EsolveCartItem, EsolveCartItemError, EsolveCartPromotionProgressItem, EsolveCartPromotionProgressQualifyingItem, EsolveCartService, EsolveCartStockItem, EsolveCartTaxBreakdown, EsolveCartTotals, EsolveCategoryTreeItem, EsolveCategoryTreeService, EsolveCdnSrcDirective, EsolveChangePasswordResult, EsolveCheckoutResult, EsolveClientAsset, EsolveClientAssetList, EsolveColour, EsolveColoursService, EsolveCompetition, EsolveCompetitionDates, EsolveCompetitionEntryResult, EsolveCompetitionWinner, EsolveCompetitionsService, EsolveConfigService, EsolveCookieService, EsolveCountry, EsolveCountryService, EsolveCoupon, EsolveCouponsService, EsolveDeliveriesService, EsolveDelivery, EsolveDeliveryCategoryTotals, EsolveDeliveryList, EsolveDeliveryStatus, EsolveDependantItem, EsolveDeviceService, EsolveEmptyCartResult, EsolveEmptyWishlistResult, EsolveEnquiryResult, EsolveEnquiryService, EsolveErpDocumentRequest, EsolveErpDocumentsRequestResult, EsolveErrorHandlerService, EsolveEvent, EsolveEventTargetService, EsolveEventType, EsolveFilterFactory, EsolveGenericFilter, EsolveGeocodeAddressResult, EsolveGeocodeCoordsResult, EsolveGeocodeResult, EsolveGeocoderService, EsolveHttpError, EsolveLinkedAsset, EsolveLinkedStockItem, EsolveList, EsolveLocation, EsolveLocationAddress, EsolveLocationContactInfo, EsolveLocationGEO, EsolveLocationList, EsolveLocationPOBoxAddress, EsolveLocationTradingDay, EsolveLocationTradingTimes, EsolveLocationUpdateResult, EsolveLocationsService, EsolveManufacturer, EsolveManufacturersService, EsolveMaterial, EsolveMaterialsService, EsolveMediaStockItem, EsolveMenuItem, EsolveMenuService, EsolveMultipleSelectFilter, EsolveNewsArticle, EsolveNewsArticleAuthor, EsolveNewsArticleList, EsolveNewsGroup, EsolveNewsService, EsolveNewsletterResult, EsolveNotificationButtonAction, EsolveNotificationDates, EsolveNotificationsService, EsolveOtp, EsolveOtpService, EsolveOtpValidation, EsolvePaymentMethod, EsolvePaymentResult, EsolvePaymentService, EsolveRange, EsolveRangeFilter, EsolveRangesService, EsolveRecipeStockItem, EsolveRegistrationResult, EsolveResetPasswordResult, EsolveResponseHandlerService, EsolveResponseResult, EsolveResult, EsolveReview, EsolveReviewList, EsolveReviewResult, EsolveReviewsService, EsolveSearchCleanResult, EsolveSearchResult, EsolveSearchResultItem, EsolveSearchService, EsolveSearchVectorizeResult, EsolveSeoInfo, EsolveSeoService, EsolveSessionAddressUpdateResult, EsolveSessionClientUpdateResult, EsolveSessionMetadataService, EsolveSessionService, EsolveSessionShippingUpdateResult, EsolveSetDeviceResult, EsolveSetNotifyResult, EsolveSettings, EsolveSettingsService, EsolveShippingCost, EsolveShippingCostItem, EsolveShippingMethod, EsolveShippingService, EsolveShippingTotals, EsolveSingleSelectFilter, EsolveSpecial, EsolveSpecialDates, EsolveSpecialImage, EsolveSpecialImageCollection, EsolveSpecialsService, EsolveStatement, EsolveStatementAgeing, EsolveStatementBalances, EsolveStatementTransaction, EsolveStockBadge, EsolveStockBarcode, EsolveStockGroup, EsolveStockGroupItem, EsolveStockImage, EsolveStockImageCollection, EsolveStockItem, EsolveStockItemBase, EsolveStockItemList, EsolveStockItemLocationLevel, EsolveStockLeadTimes, EsolveStockPrice, EsolveStockReviewsReport, EsolveStockService, EsolveStockTransactionSales, EsolveSuggestedStockItem, EsolveSupplier, EsolveSuppliersService, EsolveSystemNotification, EsolveSystemNotificationType, EsolveTag, EsolveTagsService, EsolveTimeSlot, EsolveTimeSlotConfig, EsolveTimeSlotDate, EsolveTimeSlotDays, EsolveTimeSlotTimes, EsolveToggleFilter, EsolveTopic, EsolveTopicService, EsolveTransaction, EsolveTransactionAddress, EsolveTransactionAnalyticsData, EsolveTransactionApprovalResult, EsolveTransactionClient, EsolveTransactionDelivery, EsolveTransactionItem, EsolveTransactionItemPrice, EsolveTransactionList, EsolveTransactionLocation, EsolveTransactionPaymentMethod, EsolveTransactionPick, EsolveTransactionShippingMethod, EsolveTransactionTimeSlot, EsolveTransactionUser, EsolveTransactionsService, EsolveUserAccount, EsolveUserAccountBusiness, EsolveUserAccountContact, EsolveUserAccountResult, EsolveUserClientAccount, EsolveUserClientAccountBalances, EsolveUserDevice, EsolveVaultItem, EsolveVaultItemResult, EsolveVoucher, EsolveVouchersService, EsolveWalletBalances, EsolveWalletService, EsolveWalletTransaction, EsolveWalletTransactionsList, EsolveWishlistItem, EsolveWishlistService, NgEsolveConnectModule, esolveAuthInterceptor, esolveHexHash, esolveUnauthorizedErrorInterceptor, isEsolveCdnPath, isFtgCdnPath, isLegacyEsolveCdnPath, processEsolveImageSrc, provideEsolveImageLoader, provideNgEsolveConnect };
11491
+ export { ESOLVE_CONNECT_CONFIG, ESOLVE_EURUS_AUTO_LOGIN, EsolveAccountConfirmationResult, EsolveAccountPayment, EsolveAccountService, EsolveAdditionalStockImage, EsolveAddress, EsolveAddressResult, EsolveAffiliate, EsolveAffiliateCheckResult, EsolveAffiliateLinkResult, EsolveAffiliateService, EsolveAlbum, EsolveAlbumImage, EsolveAlbumImageList, EsolveAlbumList, EsolveAlbumsService, EsolveAsset, EsolveAssetsService, EsolveAuthService, EsolveBankingDetails, EsolveBanner, EsolveBannerImage, EsolveBannerImageHotspot, EsolveBannerService, EsolveBannerVideo, EsolveCaptcha, EsolveCaptchaService, EsolveCareer, EsolveCareersService, EsolveCartAlternative, EsolveCartErrorHandlerService, EsolveCartItem, EsolveCartItemError, EsolveCartPromotionProgressItem, EsolveCartPromotionProgressQualifyingItem, EsolveCartService, EsolveCartStockItem, EsolveCartTaxBreakdown, EsolveCartTotals, EsolveCategoryTreeItem, EsolveCategoryTreeService, EsolveCdnSrcDirective, EsolveChangePasswordResult, EsolveChatIntentResult, EsolveChatProductGroup, EsolveChatService, EsolveCheckoutResult, EsolveClientAsset, EsolveClientAssetList, EsolveColour, EsolveColoursService, EsolveCompetition, EsolveCompetitionDates, EsolveCompetitionEntry, EsolveCompetitionEntryResult, EsolveCompetitionStats, EsolveCompetitionVoteResult, EsolveCompetitionWinner, EsolveCompetitionsService, EsolveConfigService, EsolveCookieService, EsolveCountry, EsolveCountryService, EsolveCoupon, EsolveCouponsService, EsolveDeliveriesService, EsolveDelivery, EsolveDeliveryCategoryTotals, EsolveDeliveryList, EsolveDeliveryStatus, EsolveDependantItem, EsolveDeviceService, EsolveEmptyCartResult, EsolveEmptyWishlistResult, EsolveEnquiryForm, EsolveEnquiryFormField, EsolveEnquiryFormSubmissionResult, EsolveEnquiryFormsService, EsolveEnquiryResult, EsolveEnquiryService, EsolveErpDocumentRequest, EsolveErpDocumentsRequestResult, EsolveErrorHandlerService, EsolveEvent, EsolveEventTargetService, EsolveEventType, EsolveFilterFactory, EsolveGenericFilter, EsolveGeocodeAddressResult, EsolveGeocodeCoordsResult, EsolveGeocodeResult, EsolveGeocoderService, EsolveHttpError, EsolveLinkedAsset, EsolveLinkedStockItem, EsolveList, EsolveLocation, EsolveLocationAddress, EsolveLocationContactInfo, EsolveLocationGEO, EsolveLocationList, EsolveLocationPOBoxAddress, EsolveLocationTradingDay, EsolveLocationTradingTimes, EsolveLocationUpdateResult, EsolveLocationsService, EsolveManufacturer, EsolveManufacturersService, EsolveMaterial, EsolveMaterialsService, EsolveMediaStockItem, EsolveMenuItem, EsolveMenuService, EsolveMultipleSelectFilter, EsolveNewsArticle, EsolveNewsArticleAuthor, EsolveNewsArticleList, EsolveNewsGroup, EsolveNewsService, EsolveNewsletterResult, EsolveNotificationButtonAction, EsolveNotificationDates, EsolveNotificationsService, EsolveOtp, EsolveOtpService, EsolveOtpValidation, EsolvePaymentMethod, EsolvePaymentResult, EsolvePaymentService, EsolveRange, EsolveRangeFilter, EsolveRangesService, EsolveRecipeStockItem, EsolveRegistrationResult, EsolveResetPasswordResult, EsolveResponseHandlerService, EsolveResponseResult, EsolveResult, EsolveReview, EsolveReviewList, EsolveReviewResult, EsolveReviewsService, EsolveSearchCleanResult, EsolveSearchResult, EsolveSearchResultItem, EsolveSearchService, EsolveSearchVectorizeResult, EsolveSeoInfo, EsolveSeoService, EsolveSessionAddressUpdateResult, EsolveSessionClientUpdateResult, EsolveSessionMetadataService, EsolveSessionService, EsolveSessionShippingUpdateResult, EsolveSetDeviceResult, EsolveSetNotifyResult, EsolveSettings, EsolveSettingsService, EsolveShippingCost, EsolveShippingCostItem, EsolveShippingMethod, EsolveShippingService, EsolveShippingTotals, EsolveSingleSelectFilter, EsolveSpecial, EsolveSpecialDates, EsolveSpecialImage, EsolveSpecialImageCollection, EsolveSpecialsService, EsolveStatement, EsolveStatementAgeing, EsolveStatementBalances, EsolveStatementTransaction, EsolveStockBadge, EsolveStockBarcode, EsolveStockGroup, EsolveStockGroupItem, EsolveStockImage, EsolveStockImageCollection, EsolveStockItem, EsolveStockItemBase, EsolveStockItemList, EsolveStockItemLocationLevel, EsolveStockLeadTimes, EsolveStockLinkedCategory, EsolveStockPrice, EsolveStockReviewsReport, EsolveStockService, EsolveStockTransactionSales, EsolveSuggestedStockItem, EsolveSupplier, EsolveSuppliersService, EsolveSystemNotification, EsolveSystemNotificationType, EsolveTag, EsolveTagsService, EsolveTimeSlot, EsolveTimeSlotConfig, EsolveTimeSlotDate, EsolveTimeSlotDays, EsolveTimeSlotTimes, EsolveToggleFilter, EsolveTopic, EsolveTopicService, EsolveTransaction, EsolveTransactionAddress, EsolveTransactionAnalyticsData, EsolveTransactionApprovalResult, EsolveTransactionClient, EsolveTransactionDelivery, EsolveTransactionItem, EsolveTransactionItemPrice, EsolveTransactionList, EsolveTransactionLocation, EsolveTransactionPaymentMethod, EsolveTransactionPick, EsolveTransactionShippingMethod, EsolveTransactionTimeSlot, EsolveTransactionUser, EsolveTransactionsService, EsolveUserAccount, EsolveUserAccountBusiness, EsolveUserAccountContact, EsolveUserAccountResult, EsolveUserClientAccount, EsolveUserClientAccountBalances, EsolveUserDevice, EsolveVaultItem, EsolveVaultItemResult, EsolveVoucher, EsolveVouchersService, EsolveWalletBalances, EsolveWalletService, EsolveWalletTransaction, EsolveWalletTransactionsList, EsolveWishlistItem, EsolveWishlistService, NgEsolveConnectModule, esolveAuthInterceptor, esolveHexHash, esolveUnauthorizedErrorInterceptor, isEsolveCdnPath, isFtgCdnPath, isLegacyEsolveCdnPath, processEsolveImageSrc, provideEsolveImageLoader, provideNgEsolveConnect };
11011
11492
  //# sourceMappingURL=esolve-ng-esolve-connect.mjs.map