@plusscommunities/pluss-maintenance-web-forms 1.1.36 → 1.1.37-beta.1

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: 'https://www.plusscommunities.com/forms-feature',
114
114
  stringConfigJobStatus: 'maintenanceJobStatusForms',
115
- stringConfigHideSeen: 'maintenanceDisableSeenForms',
116
- // Comment subscription notification preference
117
- notificationPreference: {
118
- key: 'maintenancerequestFormsComments',
119
- label: 'Forms comments',
120
- permission: 'maintenanceTrackingForms'
121
- }
115
+ stringConfigHideSeen: 'maintenanceDisableSeenForms'
122
116
  };
123
117
 
124
118
  // import * as PlussCore from '../../pluss-core/src';
@@ -241,8 +235,7 @@ const FeatureConfig = {
241
235
  init: environment => {
242
236
  FeatureConfig.env = environment;
243
237
  PlussCore__namespace.Config.init(environment);
244
- },
245
- notificationPreference: values.notificationPreference
238
+ }
246
239
  };
247
240
 
248
241
  const JOBS_LOADED = values.actionJobsLoaded;
@@ -255,12 +248,12 @@ const JOBS_HIDE_SEEN = values.actionJobsHideSeen;
255
248
  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; }
256
249
  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; }
257
250
  const {
258
- Helper: Helper$5,
251
+ Helper: Helper$6,
259
252
  Session: Session$9
260
253
  } = PlussCore__namespace;
261
254
  const maintenanceActions = {
262
255
  getJobType: (site, typeId) => {
263
- let url = Helper$5.getUrl(values.serviceKey, 'getjobtype');
256
+ let url = Helper$6.getUrl(values.serviceKey, 'getjobtype');
264
257
  return Session$9.authedFunction({
265
258
  method: 'POST',
266
259
  url,
@@ -271,7 +264,7 @@ const maintenanceActions = {
271
264
  });
272
265
  },
273
266
  getJobTypes: (site, id) => {
274
- let url = Helper$5.getUrl(values.serviceKey, 'getjobtypes');
267
+ let url = Helper$6.getUrl(values.serviceKey, 'getjobtypes');
275
268
  return Session$9.authedFunction({
276
269
  method: 'POST',
277
270
  url,
@@ -281,7 +274,7 @@ const maintenanceActions = {
281
274
  });
282
275
  },
283
276
  getJob: (site, id) => {
284
- let url = Helper$5.getUrl(values.serviceKey, 'getJob');
277
+ let url = Helper$6.getUrl(values.serviceKey, 'getJob');
285
278
  return Session$9.authedFunction({
286
279
  method: 'POST',
287
280
  url,
@@ -292,7 +285,7 @@ const maintenanceActions = {
292
285
  });
293
286
  },
294
287
  getJobByJobId: (site, jobId) => {
295
- let url = Helper$5.getUrl(values.serviceKey, 'getJob');
288
+ let url = Helper$6.getUrl(values.serviceKey, 'getJob');
296
289
  return Session$9.authedFunction({
297
290
  method: 'POST',
298
291
  url,
@@ -307,7 +300,7 @@ const maintenanceActions = {
307
300
  let type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
308
301
  return Session$9.authedFunction({
309
302
  method: 'POST',
310
- url: Helper$5.getUrl(values.serviceKey, 'getJobs'),
303
+ url: Helper$6.getUrl(values.serviceKey, 'getJobs'),
311
304
  data: {
312
305
  site,
313
306
  status,
@@ -330,7 +323,7 @@ const maintenanceActions = {
330
323
  }
331
324
  return Session$9.authedFunction({
332
325
  method: 'GET',
333
- url: Helper$5.getUrl(values.serviceKey, 'get/requests', query)
326
+ url: Helper$6.getUrl(values.serviceKey, 'get/requests', query)
334
327
  });
335
328
  },
336
329
  getJobsRecursive: function (site, status, type, lastKey) {
@@ -348,14 +341,14 @@ const maintenanceActions = {
348
341
  createJob: job => {
349
342
  return Session$9.authedFunction({
350
343
  method: 'POST',
351
- url: Helper$5.getUrl(values.serviceKey, 'sendMaintenance'),
344
+ url: Helper$6.getUrl(values.serviceKey, 'sendMaintenance'),
352
345
  data: _objectSpread$7({}, job)
353
346
  });
354
347
  },
355
348
  editJob: (job, site) => {
356
349
  return Session$9.authedFunction({
357
350
  method: 'POST',
358
- url: Helper$5.getUrl(values.serviceKey, 'editJob'),
351
+ url: Helper$6.getUrl(values.serviceKey, 'editJob'),
359
352
  data: {
360
353
  job,
361
354
  site
@@ -365,7 +358,7 @@ const maintenanceActions = {
365
358
  deleteJob: (site, id) => {
366
359
  return Session$9.authedFunction({
367
360
  method: 'POST',
368
- url: Helper$5.getUrl(values.serviceKey, 'requests/remove'),
361
+ url: Helper$6.getUrl(values.serviceKey, 'requests/remove'),
369
362
  data: {
370
363
  site,
371
364
  id
@@ -375,7 +368,7 @@ const maintenanceActions = {
375
368
  editJobStatus: (id, status) => {
376
369
  return Session$9.authedFunction({
377
370
  method: 'POST',
378
- url: Helper$5.getUrl(values.serviceKey, 'editJobStatus'),
371
+ url: Helper$6.getUrl(values.serviceKey, 'editJobStatus'),
379
372
  data: {
380
373
  id,
381
374
  status
@@ -385,7 +378,7 @@ const maintenanceActions = {
385
378
  editJobPriority: (id, priority) => {
386
379
  return Session$9.authedFunction({
387
380
  method: 'POST',
388
- url: Helper$5.getUrl(values.serviceKey, 'update/priority'),
381
+ url: Helper$6.getUrl(values.serviceKey, 'update/priority'),
389
382
  data: {
390
383
  id,
391
384
  priority
@@ -395,7 +388,7 @@ const maintenanceActions = {
395
388
  assignJob: (jobId, userId) => {
396
389
  return Session$9.authedFunction({
397
390
  method: 'POST',
398
- url: Helper$5.getUrl(values.serviceKey, 'update/assign'),
391
+ url: Helper$6.getUrl(values.serviceKey, 'update/assign'),
399
392
  data: {
400
393
  id: jobId,
401
394
  userId
@@ -405,7 +398,7 @@ const maintenanceActions = {
405
398
  getAssignees: site => {
406
399
  return Session$9.authedFunction({
407
400
  method: 'GET',
408
- url: Helper$5.getUrl(values.serviceKey, 'get/assignees', {
401
+ url: Helper$6.getUrl(values.serviceKey, 'get/assignees', {
409
402
  site
410
403
  })
411
404
  });
@@ -413,7 +406,7 @@ const maintenanceActions = {
413
406
  addNote: (jobId, note, attachments, images) => {
414
407
  return Session$9.authedFunction({
415
408
  method: 'POST',
416
- url: Helper$5.getUrl(values.serviceKey, 'requests/note'),
409
+ url: Helper$6.getUrl(values.serviceKey, 'requests/note'),
417
410
  data: {
418
411
  id: jobId,
419
412
  note,
@@ -426,7 +419,7 @@ const maintenanceActions = {
426
419
  editNote: (jobId, noteId, note, attachments, images) => {
427
420
  return Session$9.authedFunction({
428
421
  method: 'POST',
429
- url: Helper$5.getUrl(values.serviceKey, 'requests/note'),
422
+ url: Helper$6.getUrl(values.serviceKey, 'requests/note'),
430
423
  data: {
431
424
  id: jobId,
432
425
  note,
@@ -440,7 +433,7 @@ const maintenanceActions = {
440
433
  deleteNote: (jobId, noteId) => {
441
434
  return Session$9.authedFunction({
442
435
  method: 'POST',
443
- url: Helper$5.getUrl(values.serviceKey, 'requests/note'),
436
+ url: Helper$6.getUrl(values.serviceKey, 'requests/note'),
444
437
  data: {
445
438
  id: jobId,
446
439
  noteId,
@@ -460,7 +453,7 @@ const maintenanceActions = {
460
453
  };
461
454
  return Session$9.authedFunction({
462
455
  method: 'POST',
463
- url: Helper$5.getUrl(values.serviceKey, 'createJobType'),
456
+ url: Helper$6.getUrl(values.serviceKey, 'createJobType'),
464
457
  data
465
458
  });
466
459
  },
@@ -478,14 +471,14 @@ const maintenanceActions = {
478
471
  if (hasCustomFields && customFields) data.customFields = customFields;
479
472
  return Session$9.authedFunction({
480
473
  method: 'POST',
481
- url: Helper$5.getUrl(values.serviceKey, 'editJobType'),
474
+ url: Helper$6.getUrl(values.serviceKey, 'editJobType'),
482
475
  data
483
476
  });
484
477
  },
485
478
  deleteJobType: (site, id) => {
486
479
  return Session$9.authedFunction({
487
480
  method: 'POST',
488
- url: Helper$5.getUrl(values.serviceKey, 'deleteJobType'),
481
+ url: Helper$6.getUrl(values.serviceKey, 'deleteJobType'),
489
482
  data: {
490
483
  site,
491
484
  id
@@ -495,7 +488,7 @@ const maintenanceActions = {
495
488
  getExternalSync: jobId => {
496
489
  return Session$9.authedFunction({
497
490
  method: 'GET',
498
- url: Helper$5.getUrl(values.serviceKey, 'get/externalsync', {
491
+ url: Helper$6.getUrl(values.serviceKey, 'get/externalsync', {
499
492
  id: jobId
500
493
  })
501
494
  });
@@ -503,7 +496,7 @@ const maintenanceActions = {
503
496
  retrySync: jobId => {
504
497
  return Session$9.authedFunction({
505
498
  method: 'POST',
506
- url: Helper$5.getUrl(values.serviceKey, 'update/retrysync'),
499
+ url: Helper$6.getUrl(values.serviceKey, 'update/retrysync'),
507
500
  data: {
508
501
  id: jobId
509
502
  }
@@ -512,7 +505,7 @@ const maintenanceActions = {
512
505
  };
513
506
 
514
507
  const {
515
- Helper: Helper$4,
508
+ Helper: Helper$5,
516
509
  Session: Session$8
517
510
  } = PlussCore__namespace;
518
511
  const reactionActions = {
@@ -530,7 +523,7 @@ const reactionActions = {
530
523
  }
531
524
  return Session$8.authedFunction({
532
525
  method: 'POST',
533
- url: Helper$4.getUrl('reactions', 'comments/add'),
526
+ url: Helper$5.getUrl('reactions', 'comments/add'),
534
527
  data
535
528
  });
536
529
  },
@@ -553,7 +546,7 @@ const reactionActions = {
553
546
  }
554
547
  return Session$8.authedFunction({
555
548
  method: 'GET',
556
- url: Helper$4.getUrl('reactions', 'comments/get', query)
549
+ url: Helper$5.getUrl('reactions', 'comments/get', query)
557
550
  });
558
551
  }
559
552
  };
@@ -587,7 +580,7 @@ var jobStatusOptions = [
587
580
  ];
588
581
 
589
582
  const {
590
- Helper: Helper$3
583
+ Helper: Helper$4
591
584
  } = PlussCore__namespace;
592
585
  const jobsUpdate = (site, isdashboard) => {
593
586
  return dispatch => {
@@ -595,7 +588,7 @@ const jobsUpdate = (site, isdashboard) => {
595
588
  type: JOBS_LOADING
596
589
  });
597
590
  maintenanceActions.getJobsRecursive(site).then(res => {
598
- const currentSite = Helper$3.readStorageWithCookie('site');
591
+ const currentSite = Helper$4.readStorageWithCookie('site');
599
592
  if (!___default["default"].isEmpty(res) && res[0].site === currentSite) {
600
593
  dispatch({
601
594
  type: JOBS_LOADED,
@@ -2732,7 +2725,7 @@ function ownKeys$4(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymb
2732
2725
  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; }
2733
2726
  const {
2734
2727
  Apis: Apis$1,
2735
- Helper: Helper$2,
2728
+ Helper: Helper$3,
2736
2729
  Session: Session$3,
2737
2730
  Colours: Colours$1,
2738
2731
  Components: Components$3
@@ -3134,7 +3127,7 @@ class Job extends React.Component {
3134
3127
  }
3135
3128
  });
3136
3129
  this.state = {
3137
- jobId: Helper$2.safeReadParams(props, "jobId") ? props.match.params.jobId : null,
3130
+ jobId: Helper$3.safeReadParams(props, "jobId") ? props.match.params.jobId : null,
3138
3131
  job: null,
3139
3132
  showingSelector: false,
3140
3133
  updating: false,
@@ -3337,7 +3330,7 @@ class Job extends React.Component {
3337
3330
  }, /*#__PURE__*/React__default["default"].createElement("div", {
3338
3331
  className: "imageGrid_image",
3339
3332
  style: {
3340
- backgroundImage: "url('".concat(Helper$2.get1400(image), "')"),
3333
+ backgroundImage: "url('".concat(Helper$3.get1400(image), "')"),
3341
3334
  width: size,
3342
3335
  height: size
3343
3336
  }
@@ -3552,7 +3545,7 @@ class Job extends React.Component {
3552
3545
  }]
3553
3546
  })), /*#__PURE__*/React__default["default"].createElement("p", {
3554
3547
  className: "maintenanceNote_text"
3555
- }, 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));
3548
+ }, 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));
3556
3549
  }
3557
3550
  renderAssignment() {
3558
3551
  const {
@@ -3986,7 +3979,7 @@ function _objectSpread$3(e) { for (var r = 1; r < arguments.length; r++) { var t
3986
3979
  const {
3987
3980
  Actions,
3988
3981
  Components: Components$2,
3989
- Helper: Helper$1,
3982
+ Helper: Helper$2,
3990
3983
  Session: Session$2,
3991
3984
  Colours,
3992
3985
  Apis
@@ -4344,7 +4337,7 @@ class AddJob extends React.Component {
4344
4337
  if (___default["default"].isNil(answer) || ___default["default"].isEmpty(answer)) return true;
4345
4338
  switch (type) {
4346
4339
  case "email":
4347
- return Helper$1.isEmail(answer);
4340
+ return Helper$2.isEmail(answer);
4348
4341
  case "date":
4349
4342
  return moment__default["default"](answer, "YYYY-MM-DD", true).isValid();
4350
4343
  case "time":
@@ -4365,7 +4358,7 @@ class AddJob extends React.Component {
4365
4358
  this.customImageInputs = {};
4366
4359
  this.customDocumentInputs = {};
4367
4360
  this.state = {
4368
- jobId: Helper$1.safeReadParams(this.props, "jobId") ? this.props.match.params.jobId : null,
4361
+ jobId: Helper$2.safeReadParams(this.props, "jobId") ? this.props.match.params.jobId : null,
4369
4362
  job: null,
4370
4363
  showingSelector: false,
4371
4364
  updating: false,
@@ -4717,7 +4710,7 @@ class AddJob extends React.Component {
4717
4710
  return /*#__PURE__*/React__default["default"].createElement("p", {
4718
4711
  className: "visitorSignIn_text-staticText",
4719
4712
  key: fieldId
4720
- }, Helper$1.toParagraphed(field.label, {
4713
+ }, Helper$2.toParagraphed(field.label, {
4721
4714
  marginTop: 10
4722
4715
  }));
4723
4716
  case "date":
@@ -4972,7 +4965,7 @@ const mapStateToProps$2 = state => {
4972
4965
  return {
4973
4966
  auth,
4974
4967
  strings: state.strings && state.strings.config || {},
4975
- optionOnlyForResidents: Helper$1.getSiteSettingFromState(state, values.optionOnlyForResidents)
4968
+ optionOnlyForResidents: Helper$2.getSiteSettingFromState(state, values.optionOnlyForResidents)
4976
4969
  };
4977
4970
  };
4978
4971
  var AddJob$1 = reactRedux.connect(mapStateToProps$2, {
@@ -4984,7 +4977,7 @@ var AddJob$1 = reactRedux.connect(mapStateToProps$2, {
4984
4977
  const {
4985
4978
  Components: Components$1,
4986
4979
  Session: Session$1,
4987
- Helper
4980
+ Helper: Helper$1
4988
4981
  } = PlussCore__namespace;
4989
4982
  const DEFAULT_FIELD = {
4990
4983
  type: 'text',
@@ -5027,7 +5020,7 @@ class AddJobType extends React.Component {
5027
5020
  const {
5028
5021
  jobTypeEmail
5029
5022
  } = this.state;
5030
- return !___default["default"].isEmpty(jobTypeEmail) && Helper.isEmail(jobTypeEmail);
5023
+ return !___default["default"].isEmpty(jobTypeEmail) && Helper$1.isEmail(jobTypeEmail);
5031
5024
  });
5032
5025
  _defineProperty__default["default"](this, "isJobTypeValid", () => {
5033
5026
  const {
@@ -5229,7 +5222,7 @@ class AddJobType extends React.Component {
5229
5222
  }];
5230
5223
  this.state = {
5231
5224
  loading: false,
5232
- jobTypeId: Helper.safeReadParams(this.props, 'jobTypeId') ? this.props.match.params.jobTypeId : null,
5225
+ jobTypeId: Helper$1.safeReadParams(this.props, 'jobTypeId') ? this.props.match.params.jobTypeId : null,
5233
5226
  jobTypeName: '',
5234
5227
  jobTypeEmail: '',
5235
5228
  jobTypeDescription: '',
@@ -5781,7 +5774,8 @@ var AddJobType$1 = reactRedux.connect(mapStateToProps$1, {
5781
5774
  const {
5782
5775
  Analytics: Analytics$1,
5783
5776
  Session,
5784
- Components
5777
+ Components,
5778
+ Helper
5785
5779
  } = PlussCore__namespace;
5786
5780
  const getInitialState = () => ({
5787
5781
  requests: 0,
@@ -5801,10 +5795,21 @@ const AnalyticsHub = _ref => {
5801
5795
  auth,
5802
5796
  prevText,
5803
5797
  dayCount,
5804
- strings
5798
+ strings,
5799
+ userType,
5800
+ userCategory,
5801
+ selectedSites
5805
5802
  } = _ref;
5806
5803
  const [analyticsData, setAnalyticsData] = React.useState(getInitialState());
5807
5804
  const [isExportOpen, setIsExportOpen] = React.useState(false);
5805
+ const [failedSites, setFailedSites] = React.useState([]);
5806
+ const [comparisonData, setComparisonData] = React.useState({
5807
+ requests: [],
5808
+ completedRequests: [],
5809
+ comments: [],
5810
+ isLoading: true
5811
+ });
5812
+ const comparisonMode = selectedSites && selectedSites.length > 1;
5808
5813
  const hasAccess = Session.validateAccess(auth.site, values.permissionMaintenanceTracking, auth);
5809
5814
  if (!hasAccess) {
5810
5815
  return null;
@@ -5816,50 +5821,120 @@ const AnalyticsHub = _ref => {
5816
5821
  return strings.sideNav[key];
5817
5822
  })();
5818
5823
  const exportColumns = [{
5819
- label: 'Select All',
5820
- key: ''
5821
- }, {
5822
- label: 'Start Date',
5823
- key: 'startDate'
5824
+ label: "Select All",
5825
+ key: ""
5826
+ }, ...(comparisonMode ? [{
5827
+ label: "Site",
5828
+ key: "site"
5829
+ }] : []), {
5830
+ label: "Start Date",
5831
+ key: "startDate"
5824
5832
  }, {
5825
- label: 'End Date',
5826
- key: 'endDate'
5833
+ label: "End Date",
5834
+ key: "endDate"
5827
5835
  }, {
5828
5836
  label: "".concat(values.textSingularName, "s"),
5829
- key: 'requests'
5837
+ key: "requests"
5830
5838
  }, {
5831
5839
  label: "Completed ".concat(values.textSingularName, "s"),
5832
- key: 'completedRequests'
5840
+ key: "completedRequests"
5833
5841
  }, {
5834
- label: 'Comments',
5835
- key: 'comments'
5842
+ label: "Comments",
5843
+ key: "comments"
5836
5844
  }];
5837
5845
  React.useEffect(() => {
5838
5846
  getData();
5839
- }, [startTime, endTime]);
5847
+ }, [startTime, endTime, userType, userCategory, selectedSites]);
5840
5848
  const getData = async () => {
5841
- setAnalyticsData(getInitialState());
5842
- // Load analytics data here using startTime and endTime
5843
- const timeDifference = endTime - startTime;
5844
- 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)]);
5845
- const data = {
5846
- requests: Analytics$1.countActivities(currentStatsResponse.data, 'Request', 'total'),
5847
- prevRequests: Analytics$1.countActivities(prevStatsResponse.data, 'Request', 'total'),
5848
- completedRequests: Analytics$1.countActivities(currentStatsResponse.data, 'RequestCompleted', 'unique'),
5849
- prevCompletedRequests: Analytics$1.countActivities(prevStatsResponse.data, 'RequestCompleted', 'unique'),
5850
- comments: Analytics$1.countActivities(currentStatsResponse.data, 'Comment', 'total'),
5851
- prevComments: Analytics$1.countActivities(prevStatsResponse.data, 'Comment', 'total'),
5852
- isLoading: false
5853
- };
5854
- setAnalyticsData(data);
5849
+ if (comparisonMode) {
5850
+ setComparisonData({
5851
+ requests: [],
5852
+ completedRequests: [],
5853
+ comments: [],
5854
+ isLoading: true
5855
+ });
5856
+ const multiSiteResultsObj = await Analytics$1.fetchMultiSiteData(selectedSites, async site => {
5857
+ const {
5858
+ data
5859
+ } = await analyticsActions.getAggregateEntityStats(site, values.analyticsKey, startTime, endTime, true, {
5860
+ userType,
5861
+ userCategory
5862
+ });
5863
+ return data;
5864
+ });
5865
+ const roles = auth.user.Roles;
5866
+ const failed = Object.entries(multiSiteResultsObj).filter(_ref2 => {
5867
+ let [, data] = _ref2;
5868
+ return data === null;
5869
+ }).map(_ref3 => {
5870
+ let [site] = _ref3;
5871
+ return Helper.getSiteNameFromRoles(site, roles);
5872
+ });
5873
+ setFailedSites(failed);
5874
+ const multiSiteResults = Object.entries(multiSiteResultsObj).filter(_ref4 => {
5875
+ let [, data] = _ref4;
5876
+ return data !== null;
5877
+ }).map(_ref5 => {
5878
+ let [site, data] = _ref5;
5879
+ return {
5880
+ site,
5881
+ data
5882
+ };
5883
+ });
5884
+ const buildComparison = (activityKey, countType) => multiSiteResults.map(result => ({
5885
+ name: Helper.getSiteNameFromRoles(result.site, roles),
5886
+ value: Analytics$1.countActivities(result.data, activityKey, countType)
5887
+ }));
5888
+ setComparisonData({
5889
+ requests: buildComparison("Request", "total"),
5890
+ completedRequests: buildComparison("RequestCompleted", "unique"),
5891
+ comments: buildComparison("Comment", "total"),
5892
+ isLoading: false
5893
+ });
5894
+ } else {
5895
+ setAnalyticsData(getInitialState());
5896
+ const site = selectedSites && selectedSites.length === 1 ? selectedSites[0] : auth.site;
5897
+ const timeDifference = endTime - startTime;
5898
+ const [currentStatsResponse, prevStatsResponse] = await Promise.all([analyticsActions.getAggregateEntityStats(site, values.analyticsKey, startTime, endTime, true, {
5899
+ userType,
5900
+ userCategory
5901
+ }), analyticsActions.getAggregateEntityStats(site, values.analyticsKey, startTime - timeDifference, startTime, true, {
5902
+ userType,
5903
+ userCategory
5904
+ })]);
5905
+ const data = {
5906
+ requests: Analytics$1.countActivities(currentStatsResponse.data, "Request", "total"),
5907
+ prevRequests: Analytics$1.countActivities(prevStatsResponse.data, "Request", "total"),
5908
+ completedRequests: Analytics$1.countActivities(currentStatsResponse.data, "RequestCompleted", "unique"),
5909
+ prevCompletedRequests: Analytics$1.countActivities(prevStatsResponse.data, "RequestCompleted", "unique"),
5910
+ comments: Analytics$1.countActivities(currentStatsResponse.data, "Comment", "total"),
5911
+ prevComments: Analytics$1.countActivities(prevStatsResponse.data, "Comment", "total"),
5912
+ isLoading: false
5913
+ };
5914
+ setAnalyticsData(data);
5915
+ }
5855
5916
  };
5856
5917
  const isReadyToOpenCSV = () => {
5857
- return !analyticsData.isLoading;
5918
+ return comparisonMode ? !comparisonData.isLoading : !analyticsData.isLoading;
5858
5919
  };
5859
5920
  const getExportSource = () => {
5921
+ if (comparisonMode) {
5922
+ const sites = comparisonData.requests || [];
5923
+ return sites.map((site, i) => {
5924
+ var _comparisonData$compl, _comparisonData$comme;
5925
+ return {
5926
+ site: site.name,
5927
+ startDate: moment__default["default"](startTime + 1).format("D-MM-YYYY"),
5928
+ endDate: moment__default["default"](endTime).format("D-MM-YYYY"),
5929
+ requests: site.value,
5930
+ completedRequests: ((_comparisonData$compl = comparisonData.completedRequests[i]) === null || _comparisonData$compl === void 0 ? void 0 : _comparisonData$compl.value) || 0,
5931
+ comments: ((_comparisonData$comme = comparisonData.comments[i]) === null || _comparisonData$comme === void 0 ? void 0 : _comparisonData$comme.value) || 0
5932
+ };
5933
+ });
5934
+ }
5860
5935
  return [{
5861
- startDate: moment__default["default"](startTime + 1).format('D-MM-YYYY'),
5862
- endDate: moment__default["default"](endTime).format('D-MM-YYYY'),
5936
+ startDate: moment__default["default"](startTime + 1).format("D-MM-YYYY"),
5937
+ endDate: moment__default["default"](endTime).format("D-MM-YYYY"),
5863
5938
  requests: analyticsData.requests,
5864
5939
  completedRequests: analyticsData.completedRequests,
5865
5940
  comments: analyticsData.comments
@@ -5870,13 +5945,14 @@ const AnalyticsHub = _ref => {
5870
5945
  return null;
5871
5946
  }
5872
5947
  const source = getExportSource();
5948
+ const filterSuffix = [userType, userCategory].filter(Boolean).map(f => f.toLowerCase().replace(/\s+/g, '-')).join('_');
5873
5949
  return /*#__PURE__*/React__default["default"].createElement(Components.ExportCsvPopup, {
5874
5950
  onClose: () => {
5875
5951
  setIsExportOpen(false);
5876
5952
  },
5877
5953
  columns: exportColumns,
5878
5954
  source: source,
5879
- filename: "".concat(values.analyticsKey, "analytics_").concat(source[0].startDate, "_").concat(source[0].endDate, ".csv")
5955
+ filename: "".concat(values.analyticsKey, "analytics").concat(comparisonMode ? '_comparison' : '').concat(filterSuffix ? "_".concat(filterSuffix) : '', "_").concat(source[0].startDate, "_").concat(source[0].endDate, ".csv")
5880
5956
  });
5881
5957
  };
5882
5958
  return /*#__PURE__*/React__default["default"].createElement("div", {
@@ -5893,33 +5969,68 @@ const AnalyticsHub = _ref => {
5893
5969
  },
5894
5970
  isActive: isReadyToOpenCSV(),
5895
5971
  leftIcon: "file-code-o"
5896
- }, "Export CSV")), /*#__PURE__*/React__default["default"].createElement("div", {
5972
+ }, "Export CSV")), failedSites.length > 0 && /*#__PURE__*/React__default["default"].createElement(Components.Text, {
5973
+ type: "help",
5974
+ style: {
5975
+ color: '#c02743'
5976
+ }
5977
+ }, "Data unavailable for: ", failedSites.join(', ')), /*#__PURE__*/React__default["default"].createElement("div", {
5897
5978
  className: "analyticsSection dashboardSection_content"
5898
- }, /*#__PURE__*/React__default["default"].createElement(Components.StatBox, {
5899
- title: "".concat(featureTitle, " Requests"),
5900
- icon: freeSolidSvgIcons.faWrench,
5901
- value: analyticsData.requests,
5902
- previousValue: analyticsData.prevRequests,
5903
- prevText: prevText,
5904
- viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=Request&countType=total&dayCount=").concat(dayCount),
5905
- isLoading: analyticsData.isLoading
5906
- }), /*#__PURE__*/React__default["default"].createElement(Components.StatBox, {
5907
- title: "Completed ".concat(featureTitle, " Requests"),
5908
- icon: freeSolidSvgIcons.faCircleCheck,
5909
- value: analyticsData.completedRequests,
5910
- previousValue: analyticsData.prevCompletedRequests,
5911
- prevText: prevText,
5912
- viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=RequestCompleted&countType=unique&dayCount=").concat(dayCount),
5913
- isLoading: analyticsData.isLoading
5914
- }), /*#__PURE__*/React__default["default"].createElement(Components.StatBox, {
5915
- title: "".concat(featureTitle, " Comments"),
5916
- icon: freeSolidSvgIcons.faComment,
5917
- value: analyticsData.comments,
5918
- previousValue: analyticsData.prevComments,
5919
- prevText: prevText,
5920
- viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=Comment&countType=total&dayCount=").concat(dayCount),
5921
- isLoading: analyticsData.isLoading
5922
- })));
5979
+ }, (() => {
5980
+ const chartSuffix = [selectedSites && selectedSites.length > 0 ? "&sites=".concat(selectedSites.join(",")) : "", userType ? "&userType=".concat(encodeURIComponent(userType)) : "", userCategory ? "&userCategory=".concat(encodeURIComponent(userCategory)) : ""].join("");
5981
+ if (comparisonMode) {
5982
+ return /*#__PURE__*/React__default["default"].createElement("div", {
5983
+ style: {
5984
+ display: "flex",
5985
+ flexDirection: "column",
5986
+ gap: 16
5987
+ }
5988
+ }, /*#__PURE__*/React__default["default"].createElement(Components.ComparisonStatBox, {
5989
+ title: "".concat(featureTitle, " Requests"),
5990
+ data: comparisonData.requests,
5991
+ prevText: prevText,
5992
+ viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=Request&countType=total&dayCount=").concat(dayCount).concat(chartSuffix),
5993
+ isLoading: comparisonData.isLoading
5994
+ }), /*#__PURE__*/React__default["default"].createElement(Components.ComparisonStatBox, {
5995
+ title: "Completed ".concat(featureTitle, " Requests"),
5996
+ data: comparisonData.completedRequests,
5997
+ prevText: prevText,
5998
+ viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=RequestCompleted&countType=unique&dayCount=").concat(dayCount).concat(chartSuffix),
5999
+ isLoading: comparisonData.isLoading
6000
+ }), /*#__PURE__*/React__default["default"].createElement(Components.ComparisonStatBox, {
6001
+ title: "".concat(featureTitle, " Comments"),
6002
+ data: comparisonData.comments,
6003
+ prevText: prevText,
6004
+ viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=Comment&countType=total&dayCount=").concat(dayCount).concat(chartSuffix),
6005
+ isLoading: comparisonData.isLoading
6006
+ }));
6007
+ }
6008
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(Components.StatBox, {
6009
+ title: "".concat(featureTitle, " Requests"),
6010
+ icon: freeSolidSvgIcons.faWrench,
6011
+ value: analyticsData.requests,
6012
+ previousValue: analyticsData.prevRequests,
6013
+ prevText: prevText,
6014
+ viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=Request&countType=total&dayCount=").concat(dayCount).concat(chartSuffix),
6015
+ isLoading: analyticsData.isLoading
6016
+ }), /*#__PURE__*/React__default["default"].createElement(Components.StatBox, {
6017
+ title: "Completed ".concat(featureTitle, " Requests"),
6018
+ icon: freeSolidSvgIcons.faCircleCheck,
6019
+ value: analyticsData.completedRequests,
6020
+ previousValue: analyticsData.prevCompletedRequests,
6021
+ prevText: prevText,
6022
+ viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=RequestCompleted&countType=unique&dayCount=").concat(dayCount).concat(chartSuffix),
6023
+ isLoading: analyticsData.isLoading
6024
+ }), /*#__PURE__*/React__default["default"].createElement(Components.StatBox, {
6025
+ title: "".concat(featureTitle, " Comments"),
6026
+ icon: freeSolidSvgIcons.faComment,
6027
+ value: analyticsData.comments,
6028
+ previousValue: analyticsData.prevComments,
6029
+ prevText: prevText,
6030
+ viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=Comment&countType=total&dayCount=").concat(dayCount).concat(chartSuffix),
6031
+ isLoading: analyticsData.isLoading
6032
+ }));
6033
+ })()));
5923
6034
  };
5924
6035
  const mapStateToProps = state => {
5925
6036
  const {