@easyquery/core 7.3.4 → 7.3.5-rc01

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.
@@ -1,10 +1,10 @@
1
1
 
2
2
  /*
3
- * EasyQuery.JS Core v7.3.4
3
+ * EasyQuery.JS Core v7.3.5-rc01
4
4
  * Copyright 2024 Korzh.com
5
5
  * Licensed under MIT
6
6
  *
7
- * Build time: 17.11.2024 18:54:26
7
+ * Build time: 17.12.2024 17:27:59
8
8
  */
9
9
 
10
10
  'use strict';
@@ -3614,7 +3614,7 @@ class BrowserQueryStorage {
3614
3614
  }
3615
3615
  newQuery(options) {
3616
3616
  return new Promise((resolve, reject) => {
3617
- const query = new Query(this.context.getModel(), null, { context: this.context });
3617
+ const query = this.context.createQuery();
3618
3618
  query.reset();
3619
3619
  query.setDefaultName();
3620
3620
  if (options) {
@@ -3853,7 +3853,7 @@ class EqQueryFileLoader {
3853
3853
  const blob = new Blob([responseData]);
3854
3854
  const dispositionHeader = request.getXMLHttpRequest().getResponseHeader("Content-Disposition");
3855
3855
  let fileName = dispositionHeader
3856
- ? dispositionHeader.match(/filename="(.*)"/)[1]
3856
+ ? dispositionHeader.match(/filename="?([^"]*)"?$/)[1]
3857
3857
  : 'query.json';
3858
3858
  if (options.fileName) {
3859
3859
  fileName = options.fileName
@@ -4002,13 +4002,6 @@ class EqServiceProvider {
4002
4002
  return EqServiceProvider._instance;
4003
4003
  }
4004
4004
  constructor() {
4005
- this.modelLoader = null;
4006
- this.queryStorage = null;
4007
- this.querySynchronizer = null;
4008
- this.dataFetcher = null;
4009
- this.valueListResolver = null;
4010
- this.queryFileLoader = null;
4011
- this.aggrCalculator = null;
4012
4005
  this.services = {};
4013
4006
  this.httpClient = new core.HttpClient();
4014
4007
  this.httpClient.defaultHeaders['x-eqjs-version'] = '7.3.0';
@@ -4018,16 +4011,12 @@ class EqServiceProvider {
4018
4011
  this.modelLoaderResolver = (context) => new EqServerModelLoader(context);
4019
4012
  this.queryStorageResolver = (context) => new BrowserQueryStorage(context);
4020
4013
  this.querySynchronizerResolver = (context) => new EqServerQuerySynchronizer(context);
4021
- this.vlrResolver = (context) => new EqServerValueListResolver(context);
4014
+ this.vllResolver = (context) => new EqServerValueListResolver(context);
4022
4015
  this.dataFetcherResolver = (context) => new EqServerDataFetcher(context);
4023
4016
  this.queryFileLoaderResolver = (context) => new EqQueryFileLoader(context);
4024
4017
  this.aggrCalculatoResolver = (context) => new DefaultAggregatesCalculator(context);
4025
4018
  }
4026
4019
  reset() {
4027
- this.modelStorage = null;
4028
- this.modelLoader = null;
4029
- this.queryStorage = null;
4030
- this.querySynchronizer = null;
4031
4020
  }
4032
4021
  getHttpClient() {
4033
4022
  return this.httpClient;
@@ -4044,108 +4033,90 @@ class EqServiceProvider {
4044
4033
  }
4045
4034
  return this.queryResolver(context);
4046
4035
  }
4047
- getModelLoader(context) {
4048
- if (!this.modelLoader) {
4049
- if (!this.modelLoaderResolver) {
4050
- throw 'ModelLoaderResolver is not defined';
4051
- }
4052
- this.modelLoader = this.modelLoaderResolver(context);
4053
- }
4054
- return this.modelLoader;
4055
- }
4056
- getModelStorage(context) {
4057
- if (!this.modelStorage) {
4058
- if (!this.modelStorageResolver) {
4059
- throw 'ModelStorageResolver is not defined';
4060
- }
4061
- this.modelStorage = this.modelStorageResolver(context);
4062
- }
4063
- return this.modelStorage;
4064
- }
4065
- getQueryStorage(context) {
4066
- if (!this.queryStorage) {
4067
- if (!this.queryStorageResolver) {
4068
- throw 'QueryStorageResolver is not defined';
4069
- }
4070
- this.queryStorage = this.queryStorageResolver(context);
4071
- }
4072
- return this.queryStorage;
4073
- }
4074
- getQuerySynchronizer(context) {
4075
- if (!this.querySynchronizer) {
4076
- if (!this.querySynchronizerResolver) {
4077
- throw 'QuerySynchronizerResolver is not defined';
4078
- }
4079
- this.querySynchronizer = this.querySynchronizerResolver(context);
4080
- }
4081
- return this.querySynchronizer;
4082
- }
4083
- getDataFetcher(context) {
4084
- if (!this.dataFetcher) {
4085
- if (!this.dataFetcherResolver) {
4086
- throw 'DataFetcherResolver is not defined';
4087
- }
4088
- this.dataFetcher = this.dataFetcherResolver(context);
4089
- }
4090
- return this.dataFetcher;
4091
- }
4092
- getValueListResolver(context) {
4093
- if (!this.valueListResolver) {
4094
- if (!this.vlrResolver) {
4095
- throw 'Resolver for ValueListResolver is not defined';
4096
- }
4097
- this.valueListResolver = this.vlrResolver(context);
4098
- }
4099
- return this.valueListResolver;
4100
- }
4101
- getQueryFileLoader(context) {
4102
- if (!this.queryFileLoader) {
4103
- if (!this.queryFileLoaderResolver) {
4104
- throw 'Resolver for QueryFileLoader is not defined';
4105
- }
4106
- this.queryFileLoader = this.queryFileLoaderResolver(context);
4107
- }
4108
- return this.queryFileLoader;
4109
- }
4110
- getAggregatesCalculator(context) {
4111
- if (!this.aggrCalculator) {
4112
- if (!this.aggrCalculatoResolver) {
4113
- throw 'Resolver for AggregatesCalculator is not defined';
4114
- }
4115
- this.aggrCalculator = this.aggrCalculatoResolver(context);
4116
- }
4117
- return this.aggrCalculator;
4118
- }
4119
4036
  registerDataModelResolver(resolver) {
4120
4037
  this.modelResolver = resolver;
4121
4038
  }
4039
+ getDataModelResolver() {
4040
+ return this.modelResolver;
4041
+ }
4122
4042
  registerQueryResolver(resolver) {
4123
4043
  this.queryResolver = resolver;
4124
4044
  }
4045
+ getQueryResolver() {
4046
+ return this.queryResolver;
4047
+ }
4125
4048
  registerModelLoaderResolver(resolver) {
4126
4049
  this.modelLoaderResolver = resolver;
4127
4050
  }
4051
+ getModelLoaderResolver() {
4052
+ if (!this.modelLoaderResolver) {
4053
+ throw 'ModelLoaderResolver is not defined';
4054
+ }
4055
+ return this.modelLoaderResolver;
4056
+ }
4128
4057
  registerModelStorageResolver(resolver) {
4129
4058
  this.modelStorageResolver = resolver;
4130
4059
  }
4060
+ getModelStorageResolver() {
4061
+ if (!this.modelStorageResolver) {
4062
+ throw 'ModelStorageResolver is not defined';
4063
+ }
4064
+ return this.modelStorageResolver;
4065
+ }
4131
4066
  registerQueryStorageResolver(resolver) {
4132
4067
  this.queryStorageResolver = resolver;
4133
4068
  }
4069
+ getQueryStorageResolver() {
4070
+ if (!this.queryStorageResolver) {
4071
+ throw 'QueryStorageResolver is not defined';
4072
+ }
4073
+ return this.queryStorageResolver;
4074
+ }
4134
4075
  registerDataFetcherResolver(resolver) {
4135
4076
  this.dataFetcherResolver = resolver;
4136
4077
  }
4078
+ getDataFetcherResolver() {
4079
+ if (!this.dataFetcherResolver) {
4080
+ throw 'DataFetcherResolver is not defined';
4081
+ }
4082
+ return this.dataFetcherResolver;
4083
+ }
4137
4084
  registerQuerySyncronizerResolver(resolver) {
4138
4085
  this.querySynchronizerResolver = resolver;
4139
4086
  }
4140
- registerValueListResolver(resolver) {
4141
- this.vlrResolver = resolver;
4087
+ getQuerySynchronizerResolver() {
4088
+ if (!this.querySynchronizerResolver) {
4089
+ throw 'QuerySynchronizerResolver is not defined';
4090
+ }
4091
+ return this.querySynchronizerResolver;
4092
+ }
4093
+ registerValueListLoaderResolver(resolver) {
4094
+ this.vllResolver = resolver;
4095
+ }
4096
+ getValueListLoaderResolver() {
4097
+ if (!this.vllResolver) {
4098
+ throw 'Resolver for ValueListLoader is not defined';
4099
+ }
4100
+ return this.vllResolver;
4142
4101
  }
4143
4102
  registerQueryFileLoaderResolver(resolver) {
4144
4103
  this.queryFileLoaderResolver = resolver;
4145
4104
  }
4105
+ getQueryFileLoaderResolver() {
4106
+ if (!this.queryFileLoaderResolver) {
4107
+ throw 'Resolver for QueryFileLoader is not defined';
4108
+ }
4109
+ return this.queryFileLoaderResolver;
4110
+ }
4146
4111
  registerAggregatesCalculator(resolver) {
4147
4112
  this.aggrCalculatoResolver = resolver;
4148
4113
  }
4114
+ getAggregatesCalculatorResolver() {
4115
+ if (!this.aggrCalculatoResolver) {
4116
+ throw 'Resolver for AggregatesCalculator is not defined';
4117
+ }
4118
+ return this.aggrCalculatoResolver;
4119
+ }
4149
4120
  registerService(serviceId, serviceResolver) {
4150
4121
  this.services[serviceId] = serviceResolver;
4151
4122
  }
@@ -4220,7 +4191,7 @@ class EqServerExporter {
4220
4191
  const blob = new Blob([responseData]);
4221
4192
  const dispositionHeader = request.getXMLHttpRequest().getResponseHeader("Content-Disposition");
4222
4193
  const filename = dispositionHeader
4223
- ? dispositionHeader.match(/filename="(.*)"/)[1]
4194
+ ? dispositionHeader.match(/filename="?([^"]*)"?$/)[1]
4224
4195
  : 'export-data.' + format;
4225
4196
  if (window.navigator['msSaveOrOpenBlob']) {
4226
4197
  // Internet Explorer
@@ -4323,6 +4294,13 @@ class EqContext {
4323
4294
  columnTitleFormat: null //means it will be the same as attributeFormat
4324
4295
  };
4325
4296
  this.servicesInitialized = false;
4297
+ this.modelLoader = null;
4298
+ this.queryStorage = null;
4299
+ this.querySynchronizer = null;
4300
+ this.dataFetcher = null;
4301
+ this.valueListLoader = null;
4302
+ this.queryFileLoader = null;
4303
+ this.aggrCalculator = null;
4326
4304
  this.internalListCache = {};
4327
4305
  this.loadModelOnStart = true;
4328
4306
  this.loadQueryOnStart = false;
@@ -4430,6 +4408,62 @@ class EqContext {
4430
4408
  getServices() {
4431
4409
  return this.eqServices;
4432
4410
  }
4411
+ getModelLoader() {
4412
+ if (!this.modelLoader) {
4413
+ const modelLoaderResolver = this.eqServices.getModelLoaderResolver();
4414
+ this.modelLoader = modelLoaderResolver(this);
4415
+ }
4416
+ return this.modelLoader;
4417
+ }
4418
+ getModelStorage() {
4419
+ if (!this.modelStorage) {
4420
+ const modelStorageResolver = this.eqServices.getModelStorageResolver();
4421
+ this.modelStorage = modelStorageResolver(this);
4422
+ }
4423
+ return this.modelStorage;
4424
+ }
4425
+ getQueryStorage() {
4426
+ if (!this.queryStorage) {
4427
+ const queryStorageResolver = this.eqServices.getQueryStorageResolver();
4428
+ this.queryStorage = queryStorageResolver(this);
4429
+ }
4430
+ return this.queryStorage;
4431
+ }
4432
+ getQuerySynchronizer() {
4433
+ if (!this.querySynchronizer) {
4434
+ const querySynchronizerResolver = this.eqServices.getQuerySynchronizerResolver();
4435
+ this.querySynchronizer = querySynchronizerResolver(this);
4436
+ }
4437
+ return this.querySynchronizer;
4438
+ }
4439
+ getDataFetcher() {
4440
+ if (!this.dataFetcher) {
4441
+ const dataFetcherResolver = this.eqServices.getDataFetcherResolver();
4442
+ this.dataFetcher = dataFetcherResolver(this);
4443
+ }
4444
+ return this.dataFetcher;
4445
+ }
4446
+ getValueListLoader() {
4447
+ if (!this.valueListLoader) {
4448
+ const vllResolver = this.eqServices.getValueListLoaderResolver();
4449
+ this.valueListLoader = vllResolver(this);
4450
+ }
4451
+ return this.valueListLoader;
4452
+ }
4453
+ getQueryFileLoader() {
4454
+ if (!this.queryFileLoader) {
4455
+ const queryFileLoaderResolver = this.eqServices.getQueryFileLoaderResolver();
4456
+ this.queryFileLoader = queryFileLoaderResolver(this);
4457
+ }
4458
+ return this.queryFileLoader;
4459
+ }
4460
+ getAggregatesCalculator() {
4461
+ if (!this.aggrCalculator) {
4462
+ const aggrCalculatorResolver = this.eqServices.getAggregatesCalculatorResolver();
4463
+ this.aggrCalculator = aggrCalculatorResolver(this);
4464
+ }
4465
+ return this.aggrCalculator;
4466
+ }
4433
4467
  /**
4434
4468
  * Activates `Enterprise` functionality of the library. Works only with @easyquery/enterprise packag and a proper license key.
4435
4469
  * @param keyOrInitCallback The license key or a callback wich is called after
@@ -4618,9 +4652,9 @@ class EqContext {
4618
4652
  this.initialQuery = options.initialQuery;
4619
4653
  this.defaultQueryId = options.defaultQueryId || '';
4620
4654
  this.defaultModelId = options.defaultModelId || '__default';
4621
- const modelLoader = this.eqServices.getModelLoader(this);
4655
+ const modelLoader = this.getModelLoader();
4622
4656
  modelLoader.init(options);
4623
- const queryStorage = this.eqServices.getQueryStorage(this);
4657
+ const queryStorage = this.getQueryStorage();
4624
4658
  queryStorage.init(options);
4625
4659
  if (options.useDefaultExporters !== false) {
4626
4660
  this.addDefaultExporters();
@@ -4980,7 +5014,7 @@ class EqContext {
4980
5014
  action: exports.EqAction.GetValueList,
4981
5015
  text: 'Loading values'
4982
5016
  }, exports.WidgetGroup.Result);
4983
- const valueListResolver = this.eqServices.getValueListResolver(this);
5017
+ const valueListResolver = this.getValueListLoader();
4984
5018
  valueListResolver.loadValueList(options)
4985
5019
  .then((values) => {
4986
5020
  this.endProcess({
@@ -5027,7 +5061,7 @@ class EqContext {
5027
5061
  action: exports.EqAction.LoadModel,
5028
5062
  text: 'Loading model: ' + modelId
5029
5063
  }, exports.WidgetGroup.Model);
5030
- const modelLoader = this.eqServices.getModelLoader(this);
5064
+ const modelLoader = this.getModelLoader();
5031
5065
  return modelLoader.startModelLoading(options)
5032
5066
  .then((value) => {
5033
5067
  if (value) {
@@ -5070,7 +5104,7 @@ class EqContext {
5070
5104
  });
5071
5105
  }
5072
5106
  callWhenModelLoaded(callFunc) {
5073
- const modelLoader = this.eqServices.getModelLoader(this);
5107
+ const modelLoader = this.getModelLoader();
5074
5108
  modelLoader.getModelPromise().then(() => {
5075
5109
  callFunc();
5076
5110
  });
@@ -5087,7 +5121,7 @@ class EqContext {
5087
5121
  */
5088
5122
  loadQuery(options) {
5089
5123
  options = options || {};
5090
- const modelLoader = this.eqServices.getModelLoader(this);
5124
+ const modelLoader = this.getModelLoader();
5091
5125
  this.clearResult();
5092
5126
  modelLoader.getModelPromise()
5093
5127
  .then(() => {
@@ -5101,7 +5135,7 @@ class EqContext {
5101
5135
  action: exports.EqAction.LoadQuery,
5102
5136
  text: "Query loading: " + queryId
5103
5137
  }, exports.WidgetGroup.Query);
5104
- const queryStorage = this.eqServices.getQueryStorage(this);
5138
+ const queryStorage = this.getQueryStorage();
5105
5139
  queryStorage.loadQuery(options)
5106
5140
  .then((data) => {
5107
5141
  if (data) {
@@ -5153,7 +5187,7 @@ class EqContext {
5153
5187
  * Usually it contains `success`, `error` callbacks
5154
5188
  */
5155
5189
  loadQueryList(options) {
5156
- const modelLoader = this.eqServices.getModelLoader(this);
5190
+ const modelLoader = this.getModelLoader();
5157
5191
  modelLoader.getModelPromise()
5158
5192
  .then(() => {
5159
5193
  this.startQueryListLoading(options);
@@ -5169,7 +5203,7 @@ class EqContext {
5169
5203
  }
5170
5204
  startQueryListLoading(options) {
5171
5205
  options = options || {};
5172
- const queryStorage = this.eqServices.getQueryStorage(this);
5206
+ const queryStorage = this.getQueryStorage();
5173
5207
  const queryListLoadingPromise = queryStorage.getQueryList(options);
5174
5208
  queryListLoadingPromise
5175
5209
  .then((queries) => {
@@ -5234,7 +5268,7 @@ class EqContext {
5234
5268
  action: exports.EqAction.NewQuery,
5235
5269
  text: 'New query creation...'
5236
5270
  }, exports.WidgetGroup.Query);
5237
- const queryStorage = this.eqServices.getQueryStorage(this);
5271
+ const queryStorage = this.getQueryStorage();
5238
5272
  queryStorage.newQuery(options)
5239
5273
  .then((queryData) => {
5240
5274
  if (queryData) {
@@ -5281,7 +5315,7 @@ class EqContext {
5281
5315
  action: exports.EqAction.SaveQuery,
5282
5316
  text: 'Query saving: ' + query.getId()
5283
5317
  }, exports.WidgetGroup.Query);
5284
- const queryStorage = this.eqServices.getQueryStorage(this);
5318
+ const queryStorage = this.getQueryStorage();
5285
5319
  queryStorage.saveQuery(options)
5286
5320
  .then((data) => {
5287
5321
  this.endProcess({
@@ -5324,7 +5358,7 @@ class EqContext {
5324
5358
  action: exports.EqAction.RemoveQuery,
5325
5359
  text: 'Query deleting: ' + query.getId()
5326
5360
  }, exports.WidgetGroup.Query);
5327
- const queryStorage = this.eqServices.getQueryStorage(this);
5361
+ const queryStorage = this.getQueryStorage();
5328
5362
  queryStorage.removeQuery(options)
5329
5363
  .then(() => {
5330
5364
  query.reset();
@@ -5366,7 +5400,7 @@ class EqContext {
5366
5400
  action: exports.EqAction.SyncQuery,
5367
5401
  text: 'Query syncing: ' + query.getId()
5368
5402
  }, exports.WidgetGroup.Query);
5369
- const querySyncrhonizer = this.eqServices.getQuerySynchronizer(this);
5403
+ const querySyncrhonizer = this.getQuerySynchronizer();
5370
5404
  querySyncrhonizer.syncQuery(options)
5371
5405
  .then((result) => {
5372
5406
  this.resultStatement = result && result.statement
@@ -5451,7 +5485,7 @@ class EqContext {
5451
5485
  this.resultStatement = result.statement;
5452
5486
  this.refreshWidgets(exports.WidgetGroup.Statement);
5453
5487
  }
5454
- const aggrCalculator = this.getServices().getAggregatesCalculator(this);
5488
+ const aggrCalculator = this.getAggregatesCalculator();
5455
5489
  aggrCalculator.reset();
5456
5490
  this.resultContent = result;
5457
5491
  if (result.resultSet) {
@@ -5489,7 +5523,7 @@ class EqContext {
5489
5523
  action: exports.EqAction.GetQueryFile,
5490
5524
  text: 'Getting query file: ' + query.getId()
5491
5525
  }, exports.WidgetGroup.Query);
5492
- const queryFileLoader = this.getServices().getQueryFileLoader(this);
5526
+ const queryFileLoader = this.getQueryFileLoader();
5493
5527
  queryFileLoader.getQueryFile(options)
5494
5528
  .then(() => {
5495
5529
  this.endProcess({
@@ -5520,7 +5554,7 @@ class EqContext {
5520
5554
  action: exports.EqAction.UploadQueryFile,
5521
5555
  text: 'Uploading query file: ' + query.getId()
5522
5556
  }, exports.WidgetGroup.Query);
5523
- const queryFileLoader = this.getServices().getQueryFileLoader(this);
5557
+ const queryFileLoader = this.getQueryFileLoader();
5524
5558
  queryFileLoader.uploadQueryFile(options)
5525
5559
  .then((data) => {
5526
5560
  query.loadFromData(data);
@@ -5551,6 +5585,7 @@ class EqContext {
5551
5585
  fetchDataChunk(options) {
5552
5586
  const queryId = this.getQuery().getId();
5553
5587
  let fetchOptions = options || {};
5588
+ fetchOptions.data = fetchOptions.data || {}; // add empty data property for convenience
5554
5589
  if (this.useStoredQueryOnFetch) {
5555
5590
  fetchOptions.queryId = this.query.getId();
5556
5591
  }
@@ -5561,7 +5596,7 @@ class EqContext {
5561
5596
  action: exports.EqAction.FetchData,
5562
5597
  text: 'Fetching data for the query: ' + queryId
5563
5598
  }, exports.WidgetGroup.Result);
5564
- const dataFetcher = this.eqServices.getDataFetcher(this);
5599
+ const dataFetcher = this.getDataFetcher();
5565
5600
  dataFetcher.fetchData(fetchOptions)
5566
5601
  .then((result) => {
5567
5602
  if (result.statement) {
@@ -5596,7 +5631,7 @@ class EqContext {
5596
5631
  }
5597
5632
  onResultTableUpdate() {
5598
5633
  const aggrSettings = this.query.getAggregationSettings();
5599
- const calculator = this.getServices().getAggregatesCalculator(this);
5634
+ const calculator = this.getAggregatesCalculator();
5600
5635
  if (aggrSettings.needAggrCalculation() && calculator.needRecalculation()) {
5601
5636
  calculator.calculate({
5602
5637
  maxLevel: aggrSettings.getGroups().length + 1,
@@ -5634,7 +5669,7 @@ class EqContext {
5634
5669
  action: exports.EqAction.FetchData,
5635
5670
  text: 'DrillDown executing: ' + queryId
5636
5671
  }, exports.WidgetGroup.Result);
5637
- const queryExecutor = this.eqServices.getDataFetcher(this);
5672
+ const queryExecutor = this.getDataFetcher();
5638
5673
  queryExecutor.fetchData(options)
5639
5674
  .then((result) => {
5640
5675
  this.endProcess({
@@ -5677,31 +5712,32 @@ class EqContext {
5677
5712
  *
5678
5713
  */
5679
5714
  exportResult(options) {
5680
- options = options || {};
5681
- options.chunk = options.chunk || EmptyChunk;
5715
+ let exportOptions = options || {};
5716
+ exportOptions.chunk = exportOptions.chunk || EmptyChunk;
5717
+ exportOptions.data = exportOptions.data || {}; //add data property for convenience
5682
5718
  if (this.beforeExportResult) {
5683
- this.beforeExportResult(this, options);
5719
+ this.beforeExportResult(this, exportOptions);
5684
5720
  }
5685
- const format = options.format;
5721
+ const format = exportOptions.format;
5686
5722
  if (format) {
5687
5723
  const exporter = this.getExporter(format);
5688
5724
  if (exporter) {
5689
5725
  const queryId = this.getQuery().getId();
5690
5726
  if (this.useStoredQueryOnFetch) {
5691
- options.queryId = queryId;
5727
+ exportOptions.queryId = queryId;
5692
5728
  }
5693
5729
  this.startProcess({
5694
5730
  action: exports.EqAction.ExportResult,
5695
5731
  text: 'Exporting result for query: ' + queryId
5696
5732
  }, exports.WidgetGroup.Result);
5697
5733
  const localeSettings = core.i18n.getLocaleSettings();
5698
- options.settings = localeSettings;
5734
+ exportOptions.settings = localeSettings;
5699
5735
  const aggrSettings = this.query.getAggregationSettings();
5700
5736
  if (aggrSettings.hasAggregates()
5701
5737
  && (aggrSettings.hasGrandTotals() || aggrSettings.hasGroups())) {
5702
- options.aggregates = aggrSettings.saveToData();
5738
+ exportOptions.aggregates = aggrSettings.saveToData();
5703
5739
  }
5704
- exporter.export(options)
5740
+ exporter.export(exportOptions)
5705
5741
  .then((result) => {
5706
5742
  this.fireEvent('exportResult');
5707
5743
  this.endProcess({
@@ -5709,8 +5745,8 @@ class EqContext {
5709
5745
  action: exports.EqAction.ExportResult,
5710
5746
  text: `The result set for query [${queryId}] has been successfully exported`
5711
5747
  }, exports.WidgetGroup.Result);
5712
- if (options.success) {
5713
- options.success();
5748
+ if (exportOptions.success) {
5749
+ exportOptions.success();
5714
5750
  }
5715
5751
  })
5716
5752
  .catch((error) => {
@@ -5721,8 +5757,8 @@ class EqContext {
5721
5757
  text: errorMessage,
5722
5758
  sourceError: error
5723
5759
  }, exports.WidgetGroup.Result);
5724
- if (options.error) {
5725
- options.error(errorMessage, 'ExportResult');
5760
+ if (exportOptions.error) {
5761
+ exportOptions.error(errorMessage, 'ExportResult');
5726
5762
  }
5727
5763
  });
5728
5764
  }
@@ -1,13 +1,13 @@
1
1
 
2
2
  /*
3
- * EasyQuery.JS Core v7.3.4
3
+ * EasyQuery.JS Core v7.3.5-rc01
4
4
  * Copyright 2024 Korzh.com
5
5
  * Licensed under MIT
6
6
  *
7
- * Build time: 17.11.2024 18:54:26
7
+ * Build time: 17.12.2024 17:27:59
8
8
  */
9
9
 
10
- import { i18n, DataType, utils, ValueEditor, MetaEntityAttr, MetaEntity, EditorTag, MetaData, EventEmitter, AggregationSettings, HttpClient, EasyDataTable } from '@easydata/core';
10
+ import { i18n, DataType, utils, ValueEditor, MetaEntity, MetaEntityAttr, EditorTag, MetaData, EventEmitter, AggregationSettings, HttpClient, EasyDataTable } from '@easydata/core';
11
11
  export { i18n } from '@easydata/core';
12
12
 
13
13
  /**
@@ -3613,7 +3613,7 @@ class BrowserQueryStorage {
3613
3613
  }
3614
3614
  newQuery(options) {
3615
3615
  return new Promise((resolve, reject) => {
3616
- const query = new Query(this.context.getModel(), null, { context: this.context });
3616
+ const query = this.context.createQuery();
3617
3617
  query.reset();
3618
3618
  query.setDefaultName();
3619
3619
  if (options) {
@@ -3852,7 +3852,7 @@ class EqQueryFileLoader {
3852
3852
  const blob = new Blob([responseData]);
3853
3853
  const dispositionHeader = request.getXMLHttpRequest().getResponseHeader("Content-Disposition");
3854
3854
  let fileName = dispositionHeader
3855
- ? dispositionHeader.match(/filename="(.*)"/)[1]
3855
+ ? dispositionHeader.match(/filename="?([^"]*)"?$/)[1]
3856
3856
  : 'query.json';
3857
3857
  if (options.fileName) {
3858
3858
  fileName = options.fileName
@@ -4001,13 +4001,6 @@ class EqServiceProvider {
4001
4001
  return EqServiceProvider._instance;
4002
4002
  }
4003
4003
  constructor() {
4004
- this.modelLoader = null;
4005
- this.queryStorage = null;
4006
- this.querySynchronizer = null;
4007
- this.dataFetcher = null;
4008
- this.valueListResolver = null;
4009
- this.queryFileLoader = null;
4010
- this.aggrCalculator = null;
4011
4004
  this.services = {};
4012
4005
  this.httpClient = new HttpClient();
4013
4006
  this.httpClient.defaultHeaders['x-eqjs-version'] = '7.3.0';
@@ -4017,16 +4010,12 @@ class EqServiceProvider {
4017
4010
  this.modelLoaderResolver = (context) => new EqServerModelLoader(context);
4018
4011
  this.queryStorageResolver = (context) => new BrowserQueryStorage(context);
4019
4012
  this.querySynchronizerResolver = (context) => new EqServerQuerySynchronizer(context);
4020
- this.vlrResolver = (context) => new EqServerValueListResolver(context);
4013
+ this.vllResolver = (context) => new EqServerValueListResolver(context);
4021
4014
  this.dataFetcherResolver = (context) => new EqServerDataFetcher(context);
4022
4015
  this.queryFileLoaderResolver = (context) => new EqQueryFileLoader(context);
4023
4016
  this.aggrCalculatoResolver = (context) => new DefaultAggregatesCalculator(context);
4024
4017
  }
4025
4018
  reset() {
4026
- this.modelStorage = null;
4027
- this.modelLoader = null;
4028
- this.queryStorage = null;
4029
- this.querySynchronizer = null;
4030
4019
  }
4031
4020
  getHttpClient() {
4032
4021
  return this.httpClient;
@@ -4043,108 +4032,90 @@ class EqServiceProvider {
4043
4032
  }
4044
4033
  return this.queryResolver(context);
4045
4034
  }
4046
- getModelLoader(context) {
4047
- if (!this.modelLoader) {
4048
- if (!this.modelLoaderResolver) {
4049
- throw 'ModelLoaderResolver is not defined';
4050
- }
4051
- this.modelLoader = this.modelLoaderResolver(context);
4052
- }
4053
- return this.modelLoader;
4054
- }
4055
- getModelStorage(context) {
4056
- if (!this.modelStorage) {
4057
- if (!this.modelStorageResolver) {
4058
- throw 'ModelStorageResolver is not defined';
4059
- }
4060
- this.modelStorage = this.modelStorageResolver(context);
4061
- }
4062
- return this.modelStorage;
4063
- }
4064
- getQueryStorage(context) {
4065
- if (!this.queryStorage) {
4066
- if (!this.queryStorageResolver) {
4067
- throw 'QueryStorageResolver is not defined';
4068
- }
4069
- this.queryStorage = this.queryStorageResolver(context);
4070
- }
4071
- return this.queryStorage;
4072
- }
4073
- getQuerySynchronizer(context) {
4074
- if (!this.querySynchronizer) {
4075
- if (!this.querySynchronizerResolver) {
4076
- throw 'QuerySynchronizerResolver is not defined';
4077
- }
4078
- this.querySynchronizer = this.querySynchronizerResolver(context);
4079
- }
4080
- return this.querySynchronizer;
4081
- }
4082
- getDataFetcher(context) {
4083
- if (!this.dataFetcher) {
4084
- if (!this.dataFetcherResolver) {
4085
- throw 'DataFetcherResolver is not defined';
4086
- }
4087
- this.dataFetcher = this.dataFetcherResolver(context);
4088
- }
4089
- return this.dataFetcher;
4090
- }
4091
- getValueListResolver(context) {
4092
- if (!this.valueListResolver) {
4093
- if (!this.vlrResolver) {
4094
- throw 'Resolver for ValueListResolver is not defined';
4095
- }
4096
- this.valueListResolver = this.vlrResolver(context);
4097
- }
4098
- return this.valueListResolver;
4099
- }
4100
- getQueryFileLoader(context) {
4101
- if (!this.queryFileLoader) {
4102
- if (!this.queryFileLoaderResolver) {
4103
- throw 'Resolver for QueryFileLoader is not defined';
4104
- }
4105
- this.queryFileLoader = this.queryFileLoaderResolver(context);
4106
- }
4107
- return this.queryFileLoader;
4108
- }
4109
- getAggregatesCalculator(context) {
4110
- if (!this.aggrCalculator) {
4111
- if (!this.aggrCalculatoResolver) {
4112
- throw 'Resolver for AggregatesCalculator is not defined';
4113
- }
4114
- this.aggrCalculator = this.aggrCalculatoResolver(context);
4115
- }
4116
- return this.aggrCalculator;
4117
- }
4118
4035
  registerDataModelResolver(resolver) {
4119
4036
  this.modelResolver = resolver;
4120
4037
  }
4038
+ getDataModelResolver() {
4039
+ return this.modelResolver;
4040
+ }
4121
4041
  registerQueryResolver(resolver) {
4122
4042
  this.queryResolver = resolver;
4123
4043
  }
4044
+ getQueryResolver() {
4045
+ return this.queryResolver;
4046
+ }
4124
4047
  registerModelLoaderResolver(resolver) {
4125
4048
  this.modelLoaderResolver = resolver;
4126
4049
  }
4050
+ getModelLoaderResolver() {
4051
+ if (!this.modelLoaderResolver) {
4052
+ throw 'ModelLoaderResolver is not defined';
4053
+ }
4054
+ return this.modelLoaderResolver;
4055
+ }
4127
4056
  registerModelStorageResolver(resolver) {
4128
4057
  this.modelStorageResolver = resolver;
4129
4058
  }
4059
+ getModelStorageResolver() {
4060
+ if (!this.modelStorageResolver) {
4061
+ throw 'ModelStorageResolver is not defined';
4062
+ }
4063
+ return this.modelStorageResolver;
4064
+ }
4130
4065
  registerQueryStorageResolver(resolver) {
4131
4066
  this.queryStorageResolver = resolver;
4132
4067
  }
4068
+ getQueryStorageResolver() {
4069
+ if (!this.queryStorageResolver) {
4070
+ throw 'QueryStorageResolver is not defined';
4071
+ }
4072
+ return this.queryStorageResolver;
4073
+ }
4133
4074
  registerDataFetcherResolver(resolver) {
4134
4075
  this.dataFetcherResolver = resolver;
4135
4076
  }
4077
+ getDataFetcherResolver() {
4078
+ if (!this.dataFetcherResolver) {
4079
+ throw 'DataFetcherResolver is not defined';
4080
+ }
4081
+ return this.dataFetcherResolver;
4082
+ }
4136
4083
  registerQuerySyncronizerResolver(resolver) {
4137
4084
  this.querySynchronizerResolver = resolver;
4138
4085
  }
4139
- registerValueListResolver(resolver) {
4140
- this.vlrResolver = resolver;
4086
+ getQuerySynchronizerResolver() {
4087
+ if (!this.querySynchronizerResolver) {
4088
+ throw 'QuerySynchronizerResolver is not defined';
4089
+ }
4090
+ return this.querySynchronizerResolver;
4091
+ }
4092
+ registerValueListLoaderResolver(resolver) {
4093
+ this.vllResolver = resolver;
4094
+ }
4095
+ getValueListLoaderResolver() {
4096
+ if (!this.vllResolver) {
4097
+ throw 'Resolver for ValueListLoader is not defined';
4098
+ }
4099
+ return this.vllResolver;
4141
4100
  }
4142
4101
  registerQueryFileLoaderResolver(resolver) {
4143
4102
  this.queryFileLoaderResolver = resolver;
4144
4103
  }
4104
+ getQueryFileLoaderResolver() {
4105
+ if (!this.queryFileLoaderResolver) {
4106
+ throw 'Resolver for QueryFileLoader is not defined';
4107
+ }
4108
+ return this.queryFileLoaderResolver;
4109
+ }
4145
4110
  registerAggregatesCalculator(resolver) {
4146
4111
  this.aggrCalculatoResolver = resolver;
4147
4112
  }
4113
+ getAggregatesCalculatorResolver() {
4114
+ if (!this.aggrCalculatoResolver) {
4115
+ throw 'Resolver for AggregatesCalculator is not defined';
4116
+ }
4117
+ return this.aggrCalculatoResolver;
4118
+ }
4148
4119
  registerService(serviceId, serviceResolver) {
4149
4120
  this.services[serviceId] = serviceResolver;
4150
4121
  }
@@ -4219,7 +4190,7 @@ class EqServerExporter {
4219
4190
  const blob = new Blob([responseData]);
4220
4191
  const dispositionHeader = request.getXMLHttpRequest().getResponseHeader("Content-Disposition");
4221
4192
  const filename = dispositionHeader
4222
- ? dispositionHeader.match(/filename="(.*)"/)[1]
4193
+ ? dispositionHeader.match(/filename="?([^"]*)"?$/)[1]
4223
4194
  : 'export-data.' + format;
4224
4195
  if (window.navigator['msSaveOrOpenBlob']) {
4225
4196
  // Internet Explorer
@@ -4322,6 +4293,13 @@ class EqContext {
4322
4293
  columnTitleFormat: null //means it will be the same as attributeFormat
4323
4294
  };
4324
4295
  this.servicesInitialized = false;
4296
+ this.modelLoader = null;
4297
+ this.queryStorage = null;
4298
+ this.querySynchronizer = null;
4299
+ this.dataFetcher = null;
4300
+ this.valueListLoader = null;
4301
+ this.queryFileLoader = null;
4302
+ this.aggrCalculator = null;
4325
4303
  this.internalListCache = {};
4326
4304
  this.loadModelOnStart = true;
4327
4305
  this.loadQueryOnStart = false;
@@ -4429,6 +4407,62 @@ class EqContext {
4429
4407
  getServices() {
4430
4408
  return this.eqServices;
4431
4409
  }
4410
+ getModelLoader() {
4411
+ if (!this.modelLoader) {
4412
+ const modelLoaderResolver = this.eqServices.getModelLoaderResolver();
4413
+ this.modelLoader = modelLoaderResolver(this);
4414
+ }
4415
+ return this.modelLoader;
4416
+ }
4417
+ getModelStorage() {
4418
+ if (!this.modelStorage) {
4419
+ const modelStorageResolver = this.eqServices.getModelStorageResolver();
4420
+ this.modelStorage = modelStorageResolver(this);
4421
+ }
4422
+ return this.modelStorage;
4423
+ }
4424
+ getQueryStorage() {
4425
+ if (!this.queryStorage) {
4426
+ const queryStorageResolver = this.eqServices.getQueryStorageResolver();
4427
+ this.queryStorage = queryStorageResolver(this);
4428
+ }
4429
+ return this.queryStorage;
4430
+ }
4431
+ getQuerySynchronizer() {
4432
+ if (!this.querySynchronizer) {
4433
+ const querySynchronizerResolver = this.eqServices.getQuerySynchronizerResolver();
4434
+ this.querySynchronizer = querySynchronizerResolver(this);
4435
+ }
4436
+ return this.querySynchronizer;
4437
+ }
4438
+ getDataFetcher() {
4439
+ if (!this.dataFetcher) {
4440
+ const dataFetcherResolver = this.eqServices.getDataFetcherResolver();
4441
+ this.dataFetcher = dataFetcherResolver(this);
4442
+ }
4443
+ return this.dataFetcher;
4444
+ }
4445
+ getValueListLoader() {
4446
+ if (!this.valueListLoader) {
4447
+ const vllResolver = this.eqServices.getValueListLoaderResolver();
4448
+ this.valueListLoader = vllResolver(this);
4449
+ }
4450
+ return this.valueListLoader;
4451
+ }
4452
+ getQueryFileLoader() {
4453
+ if (!this.queryFileLoader) {
4454
+ const queryFileLoaderResolver = this.eqServices.getQueryFileLoaderResolver();
4455
+ this.queryFileLoader = queryFileLoaderResolver(this);
4456
+ }
4457
+ return this.queryFileLoader;
4458
+ }
4459
+ getAggregatesCalculator() {
4460
+ if (!this.aggrCalculator) {
4461
+ const aggrCalculatorResolver = this.eqServices.getAggregatesCalculatorResolver();
4462
+ this.aggrCalculator = aggrCalculatorResolver(this);
4463
+ }
4464
+ return this.aggrCalculator;
4465
+ }
4432
4466
  /**
4433
4467
  * Activates `Enterprise` functionality of the library. Works only with @easyquery/enterprise packag and a proper license key.
4434
4468
  * @param keyOrInitCallback The license key or a callback wich is called after
@@ -4617,9 +4651,9 @@ class EqContext {
4617
4651
  this.initialQuery = options.initialQuery;
4618
4652
  this.defaultQueryId = options.defaultQueryId || '';
4619
4653
  this.defaultModelId = options.defaultModelId || '__default';
4620
- const modelLoader = this.eqServices.getModelLoader(this);
4654
+ const modelLoader = this.getModelLoader();
4621
4655
  modelLoader.init(options);
4622
- const queryStorage = this.eqServices.getQueryStorage(this);
4656
+ const queryStorage = this.getQueryStorage();
4623
4657
  queryStorage.init(options);
4624
4658
  if (options.useDefaultExporters !== false) {
4625
4659
  this.addDefaultExporters();
@@ -4979,7 +5013,7 @@ class EqContext {
4979
5013
  action: EqAction.GetValueList,
4980
5014
  text: 'Loading values'
4981
5015
  }, WidgetGroup.Result);
4982
- const valueListResolver = this.eqServices.getValueListResolver(this);
5016
+ const valueListResolver = this.getValueListLoader();
4983
5017
  valueListResolver.loadValueList(options)
4984
5018
  .then((values) => {
4985
5019
  this.endProcess({
@@ -5026,7 +5060,7 @@ class EqContext {
5026
5060
  action: EqAction.LoadModel,
5027
5061
  text: 'Loading model: ' + modelId
5028
5062
  }, WidgetGroup.Model);
5029
- const modelLoader = this.eqServices.getModelLoader(this);
5063
+ const modelLoader = this.getModelLoader();
5030
5064
  return modelLoader.startModelLoading(options)
5031
5065
  .then((value) => {
5032
5066
  if (value) {
@@ -5069,7 +5103,7 @@ class EqContext {
5069
5103
  });
5070
5104
  }
5071
5105
  callWhenModelLoaded(callFunc) {
5072
- const modelLoader = this.eqServices.getModelLoader(this);
5106
+ const modelLoader = this.getModelLoader();
5073
5107
  modelLoader.getModelPromise().then(() => {
5074
5108
  callFunc();
5075
5109
  });
@@ -5086,7 +5120,7 @@ class EqContext {
5086
5120
  */
5087
5121
  loadQuery(options) {
5088
5122
  options = options || {};
5089
- const modelLoader = this.eqServices.getModelLoader(this);
5123
+ const modelLoader = this.getModelLoader();
5090
5124
  this.clearResult();
5091
5125
  modelLoader.getModelPromise()
5092
5126
  .then(() => {
@@ -5100,7 +5134,7 @@ class EqContext {
5100
5134
  action: EqAction.LoadQuery,
5101
5135
  text: "Query loading: " + queryId
5102
5136
  }, WidgetGroup.Query);
5103
- const queryStorage = this.eqServices.getQueryStorage(this);
5137
+ const queryStorage = this.getQueryStorage();
5104
5138
  queryStorage.loadQuery(options)
5105
5139
  .then((data) => {
5106
5140
  if (data) {
@@ -5152,7 +5186,7 @@ class EqContext {
5152
5186
  * Usually it contains `success`, `error` callbacks
5153
5187
  */
5154
5188
  loadQueryList(options) {
5155
- const modelLoader = this.eqServices.getModelLoader(this);
5189
+ const modelLoader = this.getModelLoader();
5156
5190
  modelLoader.getModelPromise()
5157
5191
  .then(() => {
5158
5192
  this.startQueryListLoading(options);
@@ -5168,7 +5202,7 @@ class EqContext {
5168
5202
  }
5169
5203
  startQueryListLoading(options) {
5170
5204
  options = options || {};
5171
- const queryStorage = this.eqServices.getQueryStorage(this);
5205
+ const queryStorage = this.getQueryStorage();
5172
5206
  const queryListLoadingPromise = queryStorage.getQueryList(options);
5173
5207
  queryListLoadingPromise
5174
5208
  .then((queries) => {
@@ -5233,7 +5267,7 @@ class EqContext {
5233
5267
  action: EqAction.NewQuery,
5234
5268
  text: 'New query creation...'
5235
5269
  }, WidgetGroup.Query);
5236
- const queryStorage = this.eqServices.getQueryStorage(this);
5270
+ const queryStorage = this.getQueryStorage();
5237
5271
  queryStorage.newQuery(options)
5238
5272
  .then((queryData) => {
5239
5273
  if (queryData) {
@@ -5280,7 +5314,7 @@ class EqContext {
5280
5314
  action: EqAction.SaveQuery,
5281
5315
  text: 'Query saving: ' + query.getId()
5282
5316
  }, WidgetGroup.Query);
5283
- const queryStorage = this.eqServices.getQueryStorage(this);
5317
+ const queryStorage = this.getQueryStorage();
5284
5318
  queryStorage.saveQuery(options)
5285
5319
  .then((data) => {
5286
5320
  this.endProcess({
@@ -5323,7 +5357,7 @@ class EqContext {
5323
5357
  action: EqAction.RemoveQuery,
5324
5358
  text: 'Query deleting: ' + query.getId()
5325
5359
  }, WidgetGroup.Query);
5326
- const queryStorage = this.eqServices.getQueryStorage(this);
5360
+ const queryStorage = this.getQueryStorage();
5327
5361
  queryStorage.removeQuery(options)
5328
5362
  .then(() => {
5329
5363
  query.reset();
@@ -5365,7 +5399,7 @@ class EqContext {
5365
5399
  action: EqAction.SyncQuery,
5366
5400
  text: 'Query syncing: ' + query.getId()
5367
5401
  }, WidgetGroup.Query);
5368
- const querySyncrhonizer = this.eqServices.getQuerySynchronizer(this);
5402
+ const querySyncrhonizer = this.getQuerySynchronizer();
5369
5403
  querySyncrhonizer.syncQuery(options)
5370
5404
  .then((result) => {
5371
5405
  this.resultStatement = result && result.statement
@@ -5450,7 +5484,7 @@ class EqContext {
5450
5484
  this.resultStatement = result.statement;
5451
5485
  this.refreshWidgets(WidgetGroup.Statement);
5452
5486
  }
5453
- const aggrCalculator = this.getServices().getAggregatesCalculator(this);
5487
+ const aggrCalculator = this.getAggregatesCalculator();
5454
5488
  aggrCalculator.reset();
5455
5489
  this.resultContent = result;
5456
5490
  if (result.resultSet) {
@@ -5488,7 +5522,7 @@ class EqContext {
5488
5522
  action: EqAction.GetQueryFile,
5489
5523
  text: 'Getting query file: ' + query.getId()
5490
5524
  }, WidgetGroup.Query);
5491
- const queryFileLoader = this.getServices().getQueryFileLoader(this);
5525
+ const queryFileLoader = this.getQueryFileLoader();
5492
5526
  queryFileLoader.getQueryFile(options)
5493
5527
  .then(() => {
5494
5528
  this.endProcess({
@@ -5519,7 +5553,7 @@ class EqContext {
5519
5553
  action: EqAction.UploadQueryFile,
5520
5554
  text: 'Uploading query file: ' + query.getId()
5521
5555
  }, WidgetGroup.Query);
5522
- const queryFileLoader = this.getServices().getQueryFileLoader(this);
5556
+ const queryFileLoader = this.getQueryFileLoader();
5523
5557
  queryFileLoader.uploadQueryFile(options)
5524
5558
  .then((data) => {
5525
5559
  query.loadFromData(data);
@@ -5550,6 +5584,7 @@ class EqContext {
5550
5584
  fetchDataChunk(options) {
5551
5585
  const queryId = this.getQuery().getId();
5552
5586
  let fetchOptions = options || {};
5587
+ fetchOptions.data = fetchOptions.data || {}; // add empty data property for convenience
5553
5588
  if (this.useStoredQueryOnFetch) {
5554
5589
  fetchOptions.queryId = this.query.getId();
5555
5590
  }
@@ -5560,7 +5595,7 @@ class EqContext {
5560
5595
  action: EqAction.FetchData,
5561
5596
  text: 'Fetching data for the query: ' + queryId
5562
5597
  }, WidgetGroup.Result);
5563
- const dataFetcher = this.eqServices.getDataFetcher(this);
5598
+ const dataFetcher = this.getDataFetcher();
5564
5599
  dataFetcher.fetchData(fetchOptions)
5565
5600
  .then((result) => {
5566
5601
  if (result.statement) {
@@ -5595,7 +5630,7 @@ class EqContext {
5595
5630
  }
5596
5631
  onResultTableUpdate() {
5597
5632
  const aggrSettings = this.query.getAggregationSettings();
5598
- const calculator = this.getServices().getAggregatesCalculator(this);
5633
+ const calculator = this.getAggregatesCalculator();
5599
5634
  if (aggrSettings.needAggrCalculation() && calculator.needRecalculation()) {
5600
5635
  calculator.calculate({
5601
5636
  maxLevel: aggrSettings.getGroups().length + 1,
@@ -5633,7 +5668,7 @@ class EqContext {
5633
5668
  action: EqAction.FetchData,
5634
5669
  text: 'DrillDown executing: ' + queryId
5635
5670
  }, WidgetGroup.Result);
5636
- const queryExecutor = this.eqServices.getDataFetcher(this);
5671
+ const queryExecutor = this.getDataFetcher();
5637
5672
  queryExecutor.fetchData(options)
5638
5673
  .then((result) => {
5639
5674
  this.endProcess({
@@ -5676,31 +5711,32 @@ class EqContext {
5676
5711
  *
5677
5712
  */
5678
5713
  exportResult(options) {
5679
- options = options || {};
5680
- options.chunk = options.chunk || EmptyChunk;
5714
+ let exportOptions = options || {};
5715
+ exportOptions.chunk = exportOptions.chunk || EmptyChunk;
5716
+ exportOptions.data = exportOptions.data || {}; //add data property for convenience
5681
5717
  if (this.beforeExportResult) {
5682
- this.beforeExportResult(this, options);
5718
+ this.beforeExportResult(this, exportOptions);
5683
5719
  }
5684
- const format = options.format;
5720
+ const format = exportOptions.format;
5685
5721
  if (format) {
5686
5722
  const exporter = this.getExporter(format);
5687
5723
  if (exporter) {
5688
5724
  const queryId = this.getQuery().getId();
5689
5725
  if (this.useStoredQueryOnFetch) {
5690
- options.queryId = queryId;
5726
+ exportOptions.queryId = queryId;
5691
5727
  }
5692
5728
  this.startProcess({
5693
5729
  action: EqAction.ExportResult,
5694
5730
  text: 'Exporting result for query: ' + queryId
5695
5731
  }, WidgetGroup.Result);
5696
5732
  const localeSettings = i18n.getLocaleSettings();
5697
- options.settings = localeSettings;
5733
+ exportOptions.settings = localeSettings;
5698
5734
  const aggrSettings = this.query.getAggregationSettings();
5699
5735
  if (aggrSettings.hasAggregates()
5700
5736
  && (aggrSettings.hasGrandTotals() || aggrSettings.hasGroups())) {
5701
- options.aggregates = aggrSettings.saveToData();
5737
+ exportOptions.aggregates = aggrSettings.saveToData();
5702
5738
  }
5703
- exporter.export(options)
5739
+ exporter.export(exportOptions)
5704
5740
  .then((result) => {
5705
5741
  this.fireEvent('exportResult');
5706
5742
  this.endProcess({
@@ -5708,8 +5744,8 @@ class EqContext {
5708
5744
  action: EqAction.ExportResult,
5709
5745
  text: `The result set for query [${queryId}] has been successfully exported`
5710
5746
  }, WidgetGroup.Result);
5711
- if (options.success) {
5712
- options.success();
5747
+ if (exportOptions.success) {
5748
+ exportOptions.success();
5713
5749
  }
5714
5750
  })
5715
5751
  .catch((error) => {
@@ -5720,8 +5756,8 @@ class EqContext {
5720
5756
  text: errorMessage,
5721
5757
  sourceError: error
5722
5758
  }, WidgetGroup.Result);
5723
- if (options.error) {
5724
- options.error(errorMessage, 'ExportResult');
5759
+ if (exportOptions.error) {
5760
+ exportOptions.error(errorMessage, 'ExportResult');
5725
5761
  }
5726
5762
  });
5727
5763
  }
@@ -7,7 +7,7 @@ import { DataModelStorage } from '../main/model_storage';
7
7
  import { QueryStorage } from '../main/query_storage';
8
8
  import { QuerySynchronizer } from '../main/query_synchronizer';
9
9
  import { DataFetcher } from '../main/data_fetcher';
10
- import { EqValueListResolver } from '../main/value_list_resolver';
10
+ import { EqValueListLoader } from '../main/value_list_resolver';
11
11
  import { QueryFileLoader } from '../main/query_file_loader';
12
12
  export declare class EqServiceProvider {
13
13
  private static _instance;
@@ -15,20 +15,12 @@ export declare class EqServiceProvider {
15
15
  private httpClient;
16
16
  private queryResolver;
17
17
  private modelResolver;
18
- private modelStorage;
19
- private modelLoader;
20
- private queryStorage;
21
- private querySynchronizer;
22
- private dataFetcher;
23
- private valueListResolver;
24
- private queryFileLoader;
25
- private aggrCalculator;
26
18
  private modelStorageResolver;
27
19
  private modelLoaderResolver;
28
20
  private queryStorageResolver;
29
21
  private querySynchronizerResolver;
30
22
  private dataFetcherResolver;
31
- private vlrResolver;
23
+ private vllResolver;
32
24
  private queryFileLoaderResolver;
33
25
  private aggrCalculatoResolver;
34
26
  constructor();
@@ -36,24 +28,26 @@ export declare class EqServiceProvider {
36
28
  getHttpClient(): HttpClient;
37
29
  createDataModel(context: EqContext): DataModel;
38
30
  createQuery(context: EqContext): Query;
39
- getModelLoader(context: EqContext): EqModelLoader;
40
- getModelStorage(context: EqContext): DataModelStorage;
41
- getQueryStorage(context: EqContext): QueryStorage;
42
- getQuerySynchronizer(context: EqContext): QuerySynchronizer;
43
- getDataFetcher(context: EqContext): DataFetcher;
44
- getValueListResolver(context: EqContext): EqValueListResolver;
45
- getQueryFileLoader(context: EqContext): QueryFileLoader;
46
- getAggregatesCalculator(context: EqContext): AggregatesCalculator;
47
31
  registerDataModelResolver(resolver: (context: EqContext) => DataModel): void;
32
+ getDataModelResolver(): (context: EqContext) => DataModel;
48
33
  registerQueryResolver(resolver: (context: EqContext) => Query): void;
34
+ getQueryResolver(): (context: EqContext) => Query;
49
35
  registerModelLoaderResolver(resolver: (context: EqContext) => EqModelLoader): void;
36
+ getModelLoaderResolver(): (context: EqContext) => EqModelLoader;
50
37
  registerModelStorageResolver(resolver: (context: EqContext) => DataModelStorage): void;
38
+ getModelStorageResolver(): (context: EqContext) => DataModelStorage;
51
39
  registerQueryStorageResolver(resolver: (context: EqContext) => QueryStorage): void;
40
+ getQueryStorageResolver(): (context: EqContext) => QueryStorage;
52
41
  registerDataFetcherResolver(resolver: (context: EqContext) => DataFetcher): void;
42
+ getDataFetcherResolver(): (context: EqContext) => DataFetcher;
53
43
  registerQuerySyncronizerResolver(resolver: (context: EqContext) => QuerySynchronizer): void;
54
- registerValueListResolver(resolver: (context: EqContext) => EqValueListResolver): void;
44
+ getQuerySynchronizerResolver(): (context: EqContext) => QuerySynchronizer;
45
+ registerValueListLoaderResolver(resolver: (context: EqContext) => EqValueListLoader): void;
46
+ getValueListLoaderResolver(): (context: EqContext) => EqValueListLoader;
55
47
  registerQueryFileLoaderResolver(resolver: (context: EqContext) => QueryFileLoader): void;
48
+ getQueryFileLoaderResolver(): (context: EqContext) => QueryFileLoader;
56
49
  registerAggregatesCalculator(resolver: (context: EqContext) => AggregatesCalculator): void;
50
+ getAggregatesCalculatorResolver(): (context: EqContext) => AggregatesCalculator;
57
51
  private services;
58
52
  registerService<T>(serviceId: string, serviceResolver: () => T): void;
59
53
  getService<T>(serviceId: string): T | undefined;
@@ -1,7 +1,7 @@
1
1
  import { EqContext } from '../main/context';
2
2
  import { QuerySynchronizer, SyncOptions } from '../main/query_synchronizer';
3
3
  export declare class EqServerQuerySynchronizer implements QuerySynchronizer {
4
- private context;
4
+ protected context: EqContext;
5
5
  constructor(context: EqContext);
6
6
  syncQuery(options?: SyncOptions): Promise<any>;
7
7
  }
@@ -1,6 +1,6 @@
1
- import { EqValueListResolver, LoadValueListOptions, ValueListItem } from '../main/value_list_resolver';
1
+ import { EqValueListLoader, LoadValueListOptions, ValueListItem } from '../main/value_list_resolver';
2
2
  import { EqContext } from '../main/context';
3
- export declare class EqServerValueListResolver implements EqValueListResolver {
3
+ export declare class EqServerValueListResolver implements EqValueListLoader {
4
4
  private context;
5
5
  constructor(context: EqContext);
6
6
  loadValueList(options?: LoadValueListOptions): Promise<ValueListItem[]>;
@@ -1,6 +1,13 @@
1
- import { EasyDataTable } from '@easydata/core';
1
+ import { EasyDataTable, AggregatesCalculator } from '@easydata/core';
2
2
  import { i18n } from '@easydata/core';
3
3
  import { EqServiceProvider } from '../common/eq_services';
4
+ import { EqModelLoader } from '../main/model_loader';
5
+ import { DataModelStorage } from '../main/model_storage';
6
+ import { QueryStorage } from '../main/query_storage';
7
+ import { QuerySynchronizer } from '../main/query_synchronizer';
8
+ import { DataFetcher } from '../main/data_fetcher';
9
+ import { EqValueListLoader } from '../main/value_list_resolver';
10
+ import { QueryFileLoader } from '../main/query_file_loader';
4
11
  import { DataModel } from '../dm/data_model';
5
12
  import { EntityAttr } from '../dm/entity';
6
13
  import { ModelPlainData } from '../dm/dto/dm_data';
@@ -28,6 +35,14 @@ export declare class EqContext {
28
35
  options: EqContextOptions;
29
36
  private servicesInitialized;
30
37
  private eqServices;
38
+ private modelStorage;
39
+ private modelLoader;
40
+ private queryStorage;
41
+ private querySynchronizer;
42
+ private dataFetcher;
43
+ private valueListLoader;
44
+ private queryFileLoader;
45
+ private aggrCalculator;
31
46
  private internalListCache;
32
47
  private externalListCache?;
33
48
  private dataModel;
@@ -62,6 +77,14 @@ export declare class EqContext {
62
77
  private afterGroupFetch?;
63
78
  constructor();
64
79
  getServices(): EqServiceProvider;
80
+ getModelLoader(): EqModelLoader;
81
+ getModelStorage(): DataModelStorage;
82
+ getQueryStorage(): QueryStorage;
83
+ getQuerySynchronizer(): QuerySynchronizer;
84
+ getDataFetcher(): DataFetcher;
85
+ getValueListLoader(): EqValueListLoader;
86
+ getQueryFileLoader(): QueryFileLoader;
87
+ getAggregatesCalculator(): AggregatesCalculator;
65
88
  /**
66
89
  * Activates `Enterprise` functionality of the library. Works only with @easyquery/enterprise packag and a proper license key.
67
90
  * @param keyOrInitCallback The license key or a callback wich is called after
@@ -13,6 +13,6 @@ export interface ValueListItem {
13
13
  text?: string;
14
14
  items?: ValueListItem[];
15
15
  }
16
- export interface EqValueListResolver {
16
+ export interface EqValueListLoader {
17
17
  loadValueList(options?: LoadValueListOptions): Promise<ValueListItem[]>;
18
18
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easyquery/core",
3
- "version": "7.3.4",
3
+ "version": "7.3.5-rc01",
4
4
  "description": "EasyQuery.JS Community core modules",
5
5
  "types": "./dist/types/public_api.d.ts",
6
6
  "main": "./dist/easyquery.core.cjs.js",