@plusscommunities/pluss-maintenance-web 1.1.36 → 1.1.37-beta.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.
package/dist/index.cjs.js CHANGED
@@ -112,13 +112,7 @@ const values = {
112
112
  hasHelpButton: true,
113
113
  helpGuideURL: '',
114
114
  stringConfigJobStatus: 'maintenanceJobStatus',
115
- stringConfigHideSeen: 'maintenanceDisableSeen',
116
- // Comment subscription notification preference
117
- notificationPreference: {
118
- key: 'maintenancerequestComments',
119
- label: 'Maintenance comments',
120
- permission: 'maintenanceTracking'
121
- }
115
+ stringConfigHideSeen: 'maintenanceDisableSeen'
122
116
  };
123
117
 
124
118
  // import * as PlussCore from '../../pluss-core/src';
@@ -247,8 +241,7 @@ const FeatureConfig = {
247
241
  init: environment => {
248
242
  FeatureConfig.env = environment;
249
243
  PlussCore__namespace.Config.init(environment);
250
- },
251
- notificationPreference: values.notificationPreference
244
+ }
252
245
  };
253
246
 
254
247
  const JOBS_LOADED = values.actionJobsLoaded;
@@ -261,12 +254,12 @@ const JOBS_HIDE_SEEN = values.actionJobsHideSeen;
261
254
  function ownKeys$7(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
262
255
  function _objectSpread$7(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$7(Object(t), !0).forEach(function (r) { _defineProperty__default["default"](e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$7(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
263
256
  const {
264
- Helper: Helper$5,
257
+ Helper: Helper$6,
265
258
  Session: Session$9
266
259
  } = PlussCore__namespace;
267
260
  const maintenanceActions = {
268
261
  getJobType: (site, typeId) => {
269
- let url = Helper$5.getUrl(values.serviceKey, 'getjobtype');
262
+ let url = Helper$6.getUrl(values.serviceKey, 'getjobtype');
270
263
  return Session$9.authedFunction({
271
264
  method: 'POST',
272
265
  url,
@@ -277,7 +270,7 @@ const maintenanceActions = {
277
270
  });
278
271
  },
279
272
  getJobTypes: (site, id) => {
280
- let url = Helper$5.getUrl(values.serviceKey, 'getjobtypes');
273
+ let url = Helper$6.getUrl(values.serviceKey, 'getjobtypes');
281
274
  return Session$9.authedFunction({
282
275
  method: 'POST',
283
276
  url,
@@ -287,7 +280,7 @@ const maintenanceActions = {
287
280
  });
288
281
  },
289
282
  getJob: (site, id) => {
290
- let url = Helper$5.getUrl(values.serviceKey, 'getJob');
283
+ let url = Helper$6.getUrl(values.serviceKey, 'getJob');
291
284
  return Session$9.authedFunction({
292
285
  method: 'POST',
293
286
  url,
@@ -298,7 +291,7 @@ const maintenanceActions = {
298
291
  });
299
292
  },
300
293
  getJobByJobId: (site, jobId) => {
301
- let url = Helper$5.getUrl(values.serviceKey, 'getJob');
294
+ let url = Helper$6.getUrl(values.serviceKey, 'getJob');
302
295
  return Session$9.authedFunction({
303
296
  method: 'POST',
304
297
  url,
@@ -313,7 +306,7 @@ const maintenanceActions = {
313
306
  let type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
314
307
  return Session$9.authedFunction({
315
308
  method: 'POST',
316
- url: Helper$5.getUrl(values.serviceKey, 'getJobs'),
309
+ url: Helper$6.getUrl(values.serviceKey, 'getJobs'),
317
310
  data: {
318
311
  site,
319
312
  status,
@@ -336,7 +329,7 @@ const maintenanceActions = {
336
329
  }
337
330
  return Session$9.authedFunction({
338
331
  method: 'GET',
339
- url: Helper$5.getUrl(values.serviceKey, 'get/requests', query)
332
+ url: Helper$6.getUrl(values.serviceKey, 'get/requests', query)
340
333
  });
341
334
  },
342
335
  getJobsRecursive: function (site, status, type, lastKey) {
@@ -354,14 +347,14 @@ const maintenanceActions = {
354
347
  createJob: job => {
355
348
  return Session$9.authedFunction({
356
349
  method: 'POST',
357
- url: Helper$5.getUrl(values.serviceKey, 'sendMaintenance'),
350
+ url: Helper$6.getUrl(values.serviceKey, 'sendMaintenance'),
358
351
  data: _objectSpread$7({}, job)
359
352
  });
360
353
  },
361
354
  editJob: (job, site) => {
362
355
  return Session$9.authedFunction({
363
356
  method: 'POST',
364
- url: Helper$5.getUrl(values.serviceKey, 'editJob'),
357
+ url: Helper$6.getUrl(values.serviceKey, 'editJob'),
365
358
  data: {
366
359
  job,
367
360
  site
@@ -371,7 +364,7 @@ const maintenanceActions = {
371
364
  deleteJob: (site, id) => {
372
365
  return Session$9.authedFunction({
373
366
  method: 'POST',
374
- url: Helper$5.getUrl(values.serviceKey, 'requests/remove'),
367
+ url: Helper$6.getUrl(values.serviceKey, 'requests/remove'),
375
368
  data: {
376
369
  site,
377
370
  id
@@ -381,7 +374,7 @@ const maintenanceActions = {
381
374
  editJobStatus: (id, status) => {
382
375
  return Session$9.authedFunction({
383
376
  method: 'POST',
384
- url: Helper$5.getUrl(values.serviceKey, 'editJobStatus'),
377
+ url: Helper$6.getUrl(values.serviceKey, 'editJobStatus'),
385
378
  data: {
386
379
  id,
387
380
  status
@@ -391,7 +384,7 @@ const maintenanceActions = {
391
384
  editJobPriority: (id, priority) => {
392
385
  return Session$9.authedFunction({
393
386
  method: 'POST',
394
- url: Helper$5.getUrl(values.serviceKey, 'update/priority'),
387
+ url: Helper$6.getUrl(values.serviceKey, 'update/priority'),
395
388
  data: {
396
389
  id,
397
390
  priority
@@ -401,7 +394,7 @@ const maintenanceActions = {
401
394
  assignJob: (jobId, userId) => {
402
395
  return Session$9.authedFunction({
403
396
  method: 'POST',
404
- url: Helper$5.getUrl(values.serviceKey, 'update/assign'),
397
+ url: Helper$6.getUrl(values.serviceKey, 'update/assign'),
405
398
  data: {
406
399
  id: jobId,
407
400
  userId
@@ -411,7 +404,7 @@ const maintenanceActions = {
411
404
  getAssignees: site => {
412
405
  return Session$9.authedFunction({
413
406
  method: 'GET',
414
- url: Helper$5.getUrl(values.serviceKey, 'get/assignees', {
407
+ url: Helper$6.getUrl(values.serviceKey, 'get/assignees', {
415
408
  site
416
409
  })
417
410
  });
@@ -419,7 +412,7 @@ const maintenanceActions = {
419
412
  addNote: (jobId, note, attachments, images) => {
420
413
  return Session$9.authedFunction({
421
414
  method: 'POST',
422
- url: Helper$5.getUrl(values.serviceKey, 'requests/note'),
415
+ url: Helper$6.getUrl(values.serviceKey, 'requests/note'),
423
416
  data: {
424
417
  id: jobId,
425
418
  note,
@@ -432,7 +425,7 @@ const maintenanceActions = {
432
425
  editNote: (jobId, noteId, note, attachments, images) => {
433
426
  return Session$9.authedFunction({
434
427
  method: 'POST',
435
- url: Helper$5.getUrl(values.serviceKey, 'requests/note'),
428
+ url: Helper$6.getUrl(values.serviceKey, 'requests/note'),
436
429
  data: {
437
430
  id: jobId,
438
431
  note,
@@ -446,7 +439,7 @@ const maintenanceActions = {
446
439
  deleteNote: (jobId, noteId) => {
447
440
  return Session$9.authedFunction({
448
441
  method: 'POST',
449
- url: Helper$5.getUrl(values.serviceKey, 'requests/note'),
442
+ url: Helper$6.getUrl(values.serviceKey, 'requests/note'),
450
443
  data: {
451
444
  id: jobId,
452
445
  noteId,
@@ -466,7 +459,7 @@ const maintenanceActions = {
466
459
  };
467
460
  return Session$9.authedFunction({
468
461
  method: 'POST',
469
- url: Helper$5.getUrl(values.serviceKey, 'createJobType'),
462
+ url: Helper$6.getUrl(values.serviceKey, 'createJobType'),
470
463
  data
471
464
  });
472
465
  },
@@ -484,14 +477,14 @@ const maintenanceActions = {
484
477
  if (hasCustomFields && customFields) data.customFields = customFields;
485
478
  return Session$9.authedFunction({
486
479
  method: 'POST',
487
- url: Helper$5.getUrl(values.serviceKey, 'editJobType'),
480
+ url: Helper$6.getUrl(values.serviceKey, 'editJobType'),
488
481
  data
489
482
  });
490
483
  },
491
484
  deleteJobType: (site, id) => {
492
485
  return Session$9.authedFunction({
493
486
  method: 'POST',
494
- url: Helper$5.getUrl(values.serviceKey, 'deleteJobType'),
487
+ url: Helper$6.getUrl(values.serviceKey, 'deleteJobType'),
495
488
  data: {
496
489
  site,
497
490
  id
@@ -501,7 +494,7 @@ const maintenanceActions = {
501
494
  getExternalSync: jobId => {
502
495
  return Session$9.authedFunction({
503
496
  method: 'GET',
504
- url: Helper$5.getUrl(values.serviceKey, 'get/externalsync', {
497
+ url: Helper$6.getUrl(values.serviceKey, 'get/externalsync', {
505
498
  id: jobId
506
499
  })
507
500
  });
@@ -509,7 +502,7 @@ const maintenanceActions = {
509
502
  retrySync: jobId => {
510
503
  return Session$9.authedFunction({
511
504
  method: 'POST',
512
- url: Helper$5.getUrl(values.serviceKey, 'update/retrysync'),
505
+ url: Helper$6.getUrl(values.serviceKey, 'update/retrysync'),
513
506
  data: {
514
507
  id: jobId
515
508
  }
@@ -518,7 +511,7 @@ const maintenanceActions = {
518
511
  };
519
512
 
520
513
  const {
521
- Helper: Helper$4,
514
+ Helper: Helper$5,
522
515
  Session: Session$8
523
516
  } = PlussCore__namespace;
524
517
  const reactionActions = {
@@ -536,7 +529,7 @@ const reactionActions = {
536
529
  }
537
530
  return Session$8.authedFunction({
538
531
  method: 'POST',
539
- url: Helper$4.getUrl('reactions', 'comments/add'),
532
+ url: Helper$5.getUrl('reactions', 'comments/add'),
540
533
  data
541
534
  });
542
535
  },
@@ -559,7 +552,7 @@ const reactionActions = {
559
552
  }
560
553
  return Session$8.authedFunction({
561
554
  method: 'GET',
562
- url: Helper$4.getUrl('reactions', 'comments/get', query)
555
+ url: Helper$5.getUrl('reactions', 'comments/get', query)
563
556
  });
564
557
  }
565
558
  };
@@ -593,7 +586,7 @@ var jobStatusOptions = [
593
586
  ];
594
587
 
595
588
  const {
596
- Helper: Helper$3
589
+ Helper: Helper$4
597
590
  } = PlussCore__namespace;
598
591
  const jobsUpdate = (site, isdashboard) => {
599
592
  return dispatch => {
@@ -601,7 +594,7 @@ const jobsUpdate = (site, isdashboard) => {
601
594
  type: JOBS_LOADING
602
595
  });
603
596
  maintenanceActions.getJobsRecursive(site).then(res => {
604
- const currentSite = Helper$3.readStorageWithCookie('site');
597
+ const currentSite = Helper$4.readStorageWithCookie('site');
605
598
  if (!___default["default"].isEmpty(res) && res[0].site === currentSite) {
606
599
  dispatch({
607
600
  type: JOBS_LOADED,
@@ -2738,7 +2731,7 @@ function ownKeys$4(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymb
2738
2731
  function _objectSpread$4(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$4(Object(t), !0).forEach(function (r) { _defineProperty__default["default"](e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$4(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2739
2732
  const {
2740
2733
  Apis: Apis$1,
2741
- Helper: Helper$2,
2734
+ Helper: Helper$3,
2742
2735
  Session: Session$3,
2743
2736
  Colours: Colours$1,
2744
2737
  Components: Components$3
@@ -3140,7 +3133,7 @@ class Job extends React.Component {
3140
3133
  }
3141
3134
  });
3142
3135
  this.state = {
3143
- jobId: Helper$2.safeReadParams(props, "jobId") ? props.match.params.jobId : null,
3136
+ jobId: Helper$3.safeReadParams(props, "jobId") ? props.match.params.jobId : null,
3144
3137
  job: null,
3145
3138
  showingSelector: false,
3146
3139
  updating: false,
@@ -3343,7 +3336,7 @@ class Job extends React.Component {
3343
3336
  }, /*#__PURE__*/React__default["default"].createElement("div", {
3344
3337
  className: "imageGrid_image",
3345
3338
  style: {
3346
- backgroundImage: "url('".concat(Helper$2.get1400(image), "')"),
3339
+ backgroundImage: "url('".concat(Helper$3.get1400(image), "')"),
3347
3340
  width: size,
3348
3341
  height: size
3349
3342
  }
@@ -3558,7 +3551,7 @@ class Job extends React.Component {
3558
3551
  }]
3559
3552
  })), /*#__PURE__*/React__default["default"].createElement("p", {
3560
3553
  className: "maintenanceNote_text"
3561
- }, Helper$2.toParagraphed(note.Note)), note.Attachments.map((a, i) => this.renderAttachment(a, i)), note.Images && note.Images.length > 0 ? this.renderImageGrid(note.Images, IMAGE_SIZE_NOTE) : null));
3554
+ }, Helper$3.toParagraphed(note.Note)), note.Attachments.map((a, i) => this.renderAttachment(a, i)), note.Images && note.Images.length > 0 ? this.renderImageGrid(note.Images, IMAGE_SIZE_NOTE) : null));
3562
3555
  }
3563
3556
  renderAssignment() {
3564
3557
  const {
@@ -3992,7 +3985,7 @@ function _objectSpread$3(e) { for (var r = 1; r < arguments.length; r++) { var t
3992
3985
  const {
3993
3986
  Actions,
3994
3987
  Components: Components$2,
3995
- Helper: Helper$1,
3988
+ Helper: Helper$2,
3996
3989
  Session: Session$2,
3997
3990
  Colours,
3998
3991
  Apis
@@ -4350,7 +4343,7 @@ class AddJob extends React.Component {
4350
4343
  if (___default["default"].isNil(answer) || ___default["default"].isEmpty(answer)) return true;
4351
4344
  switch (type) {
4352
4345
  case "email":
4353
- return Helper$1.isEmail(answer);
4346
+ return Helper$2.isEmail(answer);
4354
4347
  case "date":
4355
4348
  return moment__default["default"](answer, "YYYY-MM-DD", true).isValid();
4356
4349
  case "time":
@@ -4371,7 +4364,7 @@ class AddJob extends React.Component {
4371
4364
  this.customImageInputs = {};
4372
4365
  this.customDocumentInputs = {};
4373
4366
  this.state = {
4374
- jobId: Helper$1.safeReadParams(this.props, "jobId") ? this.props.match.params.jobId : null,
4367
+ jobId: Helper$2.safeReadParams(this.props, "jobId") ? this.props.match.params.jobId : null,
4375
4368
  job: null,
4376
4369
  showingSelector: false,
4377
4370
  updating: false,
@@ -4723,7 +4716,7 @@ class AddJob extends React.Component {
4723
4716
  return /*#__PURE__*/React__default["default"].createElement("p", {
4724
4717
  className: "visitorSignIn_text-staticText",
4725
4718
  key: fieldId
4726
- }, Helper$1.toParagraphed(field.label, {
4719
+ }, Helper$2.toParagraphed(field.label, {
4727
4720
  marginTop: 10
4728
4721
  }));
4729
4722
  case "date":
@@ -4978,7 +4971,7 @@ const mapStateToProps$2 = state => {
4978
4971
  return {
4979
4972
  auth,
4980
4973
  strings: state.strings && state.strings.config || {},
4981
- optionOnlyForResidents: Helper$1.getSiteSettingFromState(state, values.optionOnlyForResidents)
4974
+ optionOnlyForResidents: Helper$2.getSiteSettingFromState(state, values.optionOnlyForResidents)
4982
4975
  };
4983
4976
  };
4984
4977
  var AddJob$1 = reactRedux.connect(mapStateToProps$2, {
@@ -4990,7 +4983,7 @@ var AddJob$1 = reactRedux.connect(mapStateToProps$2, {
4990
4983
  const {
4991
4984
  Components: Components$1,
4992
4985
  Session: Session$1,
4993
- Helper
4986
+ Helper: Helper$1
4994
4987
  } = PlussCore__namespace;
4995
4988
  const DEFAULT_FIELD = {
4996
4989
  type: 'text',
@@ -5033,7 +5026,7 @@ class AddJobType extends React.Component {
5033
5026
  const {
5034
5027
  jobTypeEmail
5035
5028
  } = this.state;
5036
- return !___default["default"].isEmpty(jobTypeEmail) && Helper.isEmail(jobTypeEmail);
5029
+ return !___default["default"].isEmpty(jobTypeEmail) && Helper$1.isEmail(jobTypeEmail);
5037
5030
  });
5038
5031
  _defineProperty__default["default"](this, "isJobTypeValid", () => {
5039
5032
  const {
@@ -5235,7 +5228,7 @@ class AddJobType extends React.Component {
5235
5228
  }];
5236
5229
  this.state = {
5237
5230
  loading: false,
5238
- jobTypeId: Helper.safeReadParams(this.props, 'jobTypeId') ? this.props.match.params.jobTypeId : null,
5231
+ jobTypeId: Helper$1.safeReadParams(this.props, 'jobTypeId') ? this.props.match.params.jobTypeId : null,
5239
5232
  jobTypeName: '',
5240
5233
  jobTypeEmail: '',
5241
5234
  jobTypeDescription: '',
@@ -5803,7 +5796,8 @@ var AddJobType$1 = reactRedux.connect(mapStateToProps$1, {
5803
5796
  const {
5804
5797
  Analytics: Analytics$1,
5805
5798
  Session,
5806
- Components
5799
+ Components,
5800
+ Helper
5807
5801
  } = PlussCore__namespace;
5808
5802
  const getInitialState = () => ({
5809
5803
  requests: 0,
@@ -5823,10 +5817,20 @@ const AnalyticsHub = _ref => {
5823
5817
  auth,
5824
5818
  prevText,
5825
5819
  dayCount,
5826
- strings
5820
+ strings,
5821
+ userType,
5822
+ userCategory,
5823
+ selectedSites
5827
5824
  } = _ref;
5828
5825
  const [analyticsData, setAnalyticsData] = React.useState(getInitialState());
5829
5826
  const [isExportOpen, setIsExportOpen] = React.useState(false);
5827
+ const [comparisonData, setComparisonData] = React.useState({
5828
+ requests: [],
5829
+ completedRequests: [],
5830
+ comments: [],
5831
+ isLoading: true
5832
+ });
5833
+ const comparisonMode = selectedSites && selectedSites.length > 1;
5830
5834
  const hasAccess = Session.validateAccess(auth.site, values.permissionMaintenanceTracking, auth);
5831
5835
  if (!hasAccess) {
5832
5836
  return null;
@@ -5838,50 +5842,92 @@ const AnalyticsHub = _ref => {
5838
5842
  return strings.sideNav[key];
5839
5843
  })();
5840
5844
  const exportColumns = [{
5841
- label: 'Select All',
5842
- key: ''
5845
+ label: "Select All",
5846
+ key: ""
5843
5847
  }, {
5844
- label: 'Start Date',
5845
- key: 'startDate'
5848
+ label: "Start Date",
5849
+ key: "startDate"
5846
5850
  }, {
5847
- label: 'End Date',
5848
- key: 'endDate'
5851
+ label: "End Date",
5852
+ key: "endDate"
5849
5853
  }, {
5850
5854
  label: "".concat(values.textSingularName, "s"),
5851
- key: 'requests'
5855
+ key: "requests"
5852
5856
  }, {
5853
5857
  label: "Completed ".concat(values.textSingularName, "s"),
5854
- key: 'completedRequests'
5858
+ key: "completedRequests"
5855
5859
  }, {
5856
- label: 'Comments',
5857
- key: 'comments'
5860
+ label: "Comments",
5861
+ key: "comments"
5858
5862
  }];
5859
5863
  React.useEffect(() => {
5860
5864
  getData();
5861
- }, [startTime, endTime]);
5865
+ }, [startTime, endTime, userType, userCategory, selectedSites]);
5862
5866
  const getData = async () => {
5863
- setAnalyticsData(getInitialState());
5864
- // Load analytics data here using startTime and endTime
5865
- const timeDifference = endTime - startTime;
5866
- const [currentStatsResponse, prevStatsResponse] = await Promise.all([analyticsActions.getAggregateEntityStats(auth.site, values.analyticsKey, startTime, endTime, true), analyticsActions.getAggregateEntityStats(auth.site, values.analyticsKey, startTime - timeDifference, startTime, true)]);
5867
- const data = {
5868
- requests: Analytics$1.countActivities(currentStatsResponse.data, 'Request', 'total'),
5869
- prevRequests: Analytics$1.countActivities(prevStatsResponse.data, 'Request', 'total'),
5870
- completedRequests: Analytics$1.countActivities(currentStatsResponse.data, 'RequestCompleted', 'unique'),
5871
- prevCompletedRequests: Analytics$1.countActivities(prevStatsResponse.data, 'RequestCompleted', 'unique'),
5872
- comments: Analytics$1.countActivities(currentStatsResponse.data, 'Comment', 'total'),
5873
- prevComments: Analytics$1.countActivities(prevStatsResponse.data, 'Comment', 'total'),
5874
- isLoading: false
5875
- };
5876
- setAnalyticsData(data);
5867
+ if (comparisonMode) {
5868
+ setComparisonData({
5869
+ requests: [],
5870
+ completedRequests: [],
5871
+ comments: [],
5872
+ isLoading: true
5873
+ });
5874
+ const multiSiteResultsObj = await Analytics$1.fetchMultiSiteData(selectedSites, async site => {
5875
+ const {
5876
+ data
5877
+ } = await analyticsActions.getAggregateEntityStats(site, values.analyticsKey, startTime, endTime, true, {
5878
+ userType,
5879
+ userCategory
5880
+ });
5881
+ return data;
5882
+ });
5883
+ const multiSiteResults = Object.entries(multiSiteResultsObj).map(_ref2 => {
5884
+ let [site, data] = _ref2;
5885
+ return {
5886
+ site,
5887
+ data
5888
+ };
5889
+ });
5890
+ const roles = auth.user.Roles;
5891
+ const buildComparison = (activityKey, countType) => multiSiteResults.map(result => ({
5892
+ name: Helper.getSiteNameFromRoles(result.site, roles),
5893
+ value: Analytics$1.countActivities(result.data, activityKey, countType)
5894
+ }));
5895
+ setComparisonData({
5896
+ requests: buildComparison("Request", "total"),
5897
+ completedRequests: buildComparison("RequestCompleted", "unique"),
5898
+ comments: buildComparison("Comment", "total"),
5899
+ isLoading: false
5900
+ });
5901
+ } else {
5902
+ setAnalyticsData(getInitialState());
5903
+ const site = selectedSites && selectedSites.length === 1 ? selectedSites[0] : auth.site;
5904
+ const timeDifference = endTime - startTime;
5905
+ const [currentStatsResponse, prevStatsResponse] = await Promise.all([analyticsActions.getAggregateEntityStats(site, values.analyticsKey, startTime, endTime, true, {
5906
+ userType,
5907
+ userCategory
5908
+ }), analyticsActions.getAggregateEntityStats(site, values.analyticsKey, startTime - timeDifference, startTime, true, {
5909
+ userType,
5910
+ userCategory
5911
+ })]);
5912
+ const data = {
5913
+ requests: Analytics$1.countActivities(currentStatsResponse.data, "Request", "total"),
5914
+ prevRequests: Analytics$1.countActivities(prevStatsResponse.data, "Request", "total"),
5915
+ completedRequests: Analytics$1.countActivities(currentStatsResponse.data, "RequestCompleted", "unique"),
5916
+ prevCompletedRequests: Analytics$1.countActivities(prevStatsResponse.data, "RequestCompleted", "unique"),
5917
+ comments: Analytics$1.countActivities(currentStatsResponse.data, "Comment", "total"),
5918
+ prevComments: Analytics$1.countActivities(prevStatsResponse.data, "Comment", "total"),
5919
+ isLoading: false
5920
+ };
5921
+ setAnalyticsData(data);
5922
+ }
5877
5923
  };
5878
5924
  const isReadyToOpenCSV = () => {
5879
- return !analyticsData.isLoading;
5925
+ return comparisonMode ? !comparisonData.isLoading : !analyticsData.isLoading;
5880
5926
  };
5881
5927
  const getExportSource = () => {
5882
5928
  return [{
5883
- startDate: moment__default["default"](startTime + 1).format('D-MM-YYYY'),
5884
- endDate: moment__default["default"](endTime).format('D-MM-YYYY'),
5929
+ startDate: moment__default["default"](startTime + 1).format("D-MM-YYYY"),
5930
+ endDate: moment__default["default"](endTime).format("D-MM-YYYY"),
5885
5931
  requests: analyticsData.requests,
5886
5932
  completedRequests: analyticsData.completedRequests,
5887
5933
  comments: analyticsData.comments
@@ -5917,31 +5963,61 @@ const AnalyticsHub = _ref => {
5917
5963
  leftIcon: "file-code-o"
5918
5964
  }, "Export CSV")), /*#__PURE__*/React__default["default"].createElement("div", {
5919
5965
  className: "analyticsSection dashboardSection_content"
5920
- }, /*#__PURE__*/React__default["default"].createElement(Components.StatBox, {
5921
- title: "".concat(featureTitle, " Requests"),
5922
- icon: freeSolidSvgIcons.faWrench,
5923
- value: analyticsData.requests,
5924
- previousValue: analyticsData.prevRequests,
5925
- prevText: prevText,
5926
- viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=Request&countType=total&dayCount=").concat(dayCount),
5927
- isLoading: analyticsData.isLoading
5928
- }), /*#__PURE__*/React__default["default"].createElement(Components.StatBox, {
5929
- title: "Completed ".concat(featureTitle, " Requests"),
5930
- icon: freeSolidSvgIcons.faCircleCheck,
5931
- value: analyticsData.completedRequests,
5932
- previousValue: analyticsData.prevCompletedRequests,
5933
- prevText: prevText,
5934
- viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=RequestCompleted&countType=unique&dayCount=").concat(dayCount),
5935
- isLoading: analyticsData.isLoading
5936
- }), /*#__PURE__*/React__default["default"].createElement(Components.StatBox, {
5937
- title: "".concat(featureTitle, " Comments"),
5938
- icon: freeSolidSvgIcons.faComment,
5939
- value: analyticsData.comments,
5940
- previousValue: analyticsData.prevComments,
5941
- prevText: prevText,
5942
- viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=Comment&countType=total&dayCount=").concat(dayCount),
5943
- isLoading: analyticsData.isLoading
5944
- })));
5966
+ }, (() => {
5967
+ const chartSuffix = [selectedSites && selectedSites.length > 0 ? "&sites=".concat(selectedSites.join(",")) : "", userType ? "&userType=".concat(encodeURIComponent(userType)) : "", userCategory ? "&userCategory=".concat(encodeURIComponent(userCategory)) : ""].join("");
5968
+ if (comparisonMode) {
5969
+ return /*#__PURE__*/React__default["default"].createElement("div", {
5970
+ style: {
5971
+ display: "flex",
5972
+ flexDirection: "column",
5973
+ gap: 16
5974
+ }
5975
+ }, /*#__PURE__*/React__default["default"].createElement(Components.ComparisonStatBox, {
5976
+ title: "".concat(featureTitle, " Requests"),
5977
+ data: comparisonData.requests,
5978
+ prevText: prevText,
5979
+ viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=Request&countType=total&dayCount=").concat(dayCount).concat(chartSuffix),
5980
+ isLoading: comparisonData.isLoading
5981
+ }), /*#__PURE__*/React__default["default"].createElement(Components.ComparisonStatBox, {
5982
+ title: "Completed ".concat(featureTitle, " Requests"),
5983
+ data: comparisonData.completedRequests,
5984
+ prevText: prevText,
5985
+ viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=RequestCompleted&countType=unique&dayCount=").concat(dayCount).concat(chartSuffix),
5986
+ isLoading: comparisonData.isLoading
5987
+ }), /*#__PURE__*/React__default["default"].createElement(Components.ComparisonStatBox, {
5988
+ title: "".concat(featureTitle, " Comments"),
5989
+ data: comparisonData.comments,
5990
+ prevText: prevText,
5991
+ viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=Comment&countType=total&dayCount=").concat(dayCount).concat(chartSuffix),
5992
+ isLoading: comparisonData.isLoading
5993
+ }));
5994
+ }
5995
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(Components.StatBox, {
5996
+ title: "".concat(featureTitle, " Requests"),
5997
+ icon: freeSolidSvgIcons.faWrench,
5998
+ value: analyticsData.requests,
5999
+ previousValue: analyticsData.prevRequests,
6000
+ prevText: prevText,
6001
+ viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=Request&countType=total&dayCount=").concat(dayCount).concat(chartSuffix),
6002
+ isLoading: analyticsData.isLoading
6003
+ }), /*#__PURE__*/React__default["default"].createElement(Components.StatBox, {
6004
+ title: "Completed ".concat(featureTitle, " Requests"),
6005
+ icon: freeSolidSvgIcons.faCircleCheck,
6006
+ value: analyticsData.completedRequests,
6007
+ previousValue: analyticsData.prevCompletedRequests,
6008
+ prevText: prevText,
6009
+ viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=RequestCompleted&countType=unique&dayCount=").concat(dayCount).concat(chartSuffix),
6010
+ isLoading: analyticsData.isLoading
6011
+ }), /*#__PURE__*/React__default["default"].createElement(Components.StatBox, {
6012
+ title: "".concat(featureTitle, " Comments"),
6013
+ icon: freeSolidSvgIcons.faComment,
6014
+ value: analyticsData.comments,
6015
+ previousValue: analyticsData.prevComments,
6016
+ prevText: prevText,
6017
+ viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=Comment&countType=total&dayCount=").concat(dayCount).concat(chartSuffix),
6018
+ isLoading: analyticsData.isLoading
6019
+ }));
6020
+ })()));
5945
6021
  };
5946
6022
  const mapStateToProps = state => {
5947
6023
  const {