@plusscommunities/pluss-maintenance-web 1.1.37-beta.4 → 1.1.37-beta.6

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.
Files changed (49) hide show
  1. package/dist/index.cjs.js +547 -573
  2. package/dist/index.esm.js +549 -575
  3. package/dist/index.js +6724 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/index.umd.js +548 -574
  6. package/package.json +6 -2
  7. package/.babelrc +0 -3
  8. package/rollup.config.js +0 -59
  9. package/src/actions/JobsActions.js +0 -150
  10. package/src/actions/index.js +0 -1
  11. package/src/actions/types.js +0 -8
  12. package/src/apis/index.js +0 -10
  13. package/src/apis/maintenanceActions.js +0 -203
  14. package/src/apis/reactionActions.js +0 -46
  15. package/src/components/ActivityText.js +0 -57
  16. package/src/components/AnalyticsHub.js +0 -364
  17. package/src/components/Configuration.js +0 -392
  18. package/src/components/JobList.js +0 -1108
  19. package/src/components/JobTypes.js +0 -198
  20. package/src/components/PreviewFull.js +0 -33
  21. package/src/components/PreviewGrid.js +0 -29
  22. package/src/components/PreviewWidget.js +0 -35
  23. package/src/components/ViewFull.js +0 -25
  24. package/src/components/ViewWidget.js +0 -23
  25. package/src/feature.config.js +0 -127
  26. package/src/helper/index.js +0 -26
  27. package/src/images/forms/full.png +0 -0
  28. package/src/images/forms/fullNoTitle.png +0 -0
  29. package/src/images/forms/previewWidget.png +0 -0
  30. package/src/images/forms/widget.png +0 -0
  31. package/src/images/full.png +0 -0
  32. package/src/images/fullNoTitle.png +0 -0
  33. package/src/images/previewWidget.png +0 -0
  34. package/src/images/widget.png +0 -0
  35. package/src/index.js +0 -29
  36. package/src/maintenancePriority.json +0 -5
  37. package/src/maintenanceStatus.json +0 -20
  38. package/src/reducers/MaintenanceReducer.js +0 -49
  39. package/src/screens/AddJob.js +0 -1138
  40. package/src/screens/AddJobType.js +0 -865
  41. package/src/screens/Job.js +0 -1531
  42. package/src/screens/RequestsHub.js +0 -237
  43. package/src/values.config.a.js +0 -63
  44. package/src/values.config.default.js +0 -75
  45. package/src/values.config.enquiry.js +0 -76
  46. package/src/values.config.feedback.js +0 -74
  47. package/src/values.config.food.js +0 -74
  48. package/src/values.config.forms.js +0 -74
  49. package/src/values.config.js +0 -75
package/dist/index.cjs.js CHANGED
@@ -6,12 +6,12 @@ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
6
6
  var React = require('react');
7
7
  var reactRedux = require('react-redux');
8
8
  var reactRouter = require('react-router');
9
- var _ = require('lodash');
10
- var moment = require('moment');
11
- var FontAwesome = require('react-fontawesome');
12
9
  var PlussCore = require('@plusscommunities/pluss-core-web');
13
10
  var reactBootstrap = require('react-bootstrap');
14
11
  var reactRouterDom = require('react-router-dom');
12
+ var FontAwesome = require('react-fontawesome');
13
+ var moment = require('moment');
14
+ var _ = require('lodash');
15
15
  var Textarea = require('react-textarea-autosize');
16
16
  var freeSolidSvgIcons = require('@fortawesome/free-solid-svg-icons');
17
17
 
@@ -37,10 +37,10 @@ function _interopNamespace(e) {
37
37
 
38
38
  var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
39
39
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
40
- var ___default = /*#__PURE__*/_interopDefaultLegacy(_);
41
- var moment__default = /*#__PURE__*/_interopDefaultLegacy(moment);
42
- var FontAwesome__default = /*#__PURE__*/_interopDefaultLegacy(FontAwesome);
43
40
  var PlussCore__namespace = /*#__PURE__*/_interopNamespace(PlussCore);
41
+ var FontAwesome__default = /*#__PURE__*/_interopDefaultLegacy(FontAwesome);
42
+ var moment__default = /*#__PURE__*/_interopDefaultLegacy(moment);
43
+ var ___default = /*#__PURE__*/_interopDefaultLegacy(_);
44
44
  var Textarea__default = /*#__PURE__*/_interopDefaultLegacy(Textarea);
45
45
 
46
46
  const values = {
@@ -112,7 +112,13 @@ const values = {
112
112
  hasHelpButton: true,
113
113
  helpGuideURL: '',
114
114
  stringConfigJobStatus: 'maintenanceJobStatus',
115
- stringConfigHideSeen: 'maintenanceDisableSeen'
115
+ stringConfigHideSeen: 'maintenanceDisableSeen',
116
+ // Comment subscription notification preference
117
+ notificationPreference: {
118
+ key: 'maintenancerequestComments',
119
+ label: 'Maintenance comments',
120
+ permission: 'maintenanceTracking'
121
+ }
116
122
  };
117
123
 
118
124
  // import * as PlussCore from '../../pluss-core/src';
@@ -241,7 +247,8 @@ const FeatureConfig = {
241
247
  init: environment => {
242
248
  FeatureConfig.env = environment;
243
249
  PlussCore__namespace.Config.init(environment);
244
- }
250
+ },
251
+ notificationPreference: values.notificationPreference
245
252
  };
246
253
 
247
254
  const JOBS_LOADED = values.actionJobsLoaded;
@@ -251,15 +258,15 @@ const JOBS_TYPES_LOADED = values.actionJobsTypesLoaded;
251
258
  const JOBS_STATUSES_LOADED = values.actionJobsStatusesLoaded;
252
259
  const JOBS_HIDE_SEEN = values.actionJobsHideSeen;
253
260
 
254
- function ownKeys$8(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; }
255
- function _objectSpread$8(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$8(Object(t), !0).forEach(function (r) { _defineProperty__default["default"](e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$8(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
261
+ 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
+ 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; }
256
263
  const {
257
- Helper: Helper$6,
264
+ Helper: Helper$4,
258
265
  Session: Session$9
259
266
  } = PlussCore__namespace;
260
- const maintenanceActions = {
267
+ const maintenanceActions$1 = {
261
268
  getJobType: (site, typeId) => {
262
- let url = Helper$6.getUrl(values.serviceKey, 'getjobtype');
269
+ let url = Helper$4.getUrl(values.serviceKey, 'getjobtype');
263
270
  return Session$9.authedFunction({
264
271
  method: 'POST',
265
272
  url,
@@ -270,7 +277,7 @@ const maintenanceActions = {
270
277
  });
271
278
  },
272
279
  getJobTypes: (site, id) => {
273
- let url = Helper$6.getUrl(values.serviceKey, 'getjobtypes');
280
+ let url = Helper$4.getUrl(values.serviceKey, 'getjobtypes');
274
281
  return Session$9.authedFunction({
275
282
  method: 'POST',
276
283
  url,
@@ -280,7 +287,7 @@ const maintenanceActions = {
280
287
  });
281
288
  },
282
289
  getJob: (site, id) => {
283
- let url = Helper$6.getUrl(values.serviceKey, 'getJob');
290
+ let url = Helper$4.getUrl(values.serviceKey, 'getJob');
284
291
  return Session$9.authedFunction({
285
292
  method: 'POST',
286
293
  url,
@@ -291,7 +298,7 @@ const maintenanceActions = {
291
298
  });
292
299
  },
293
300
  getJobByJobId: (site, jobId) => {
294
- let url = Helper$6.getUrl(values.serviceKey, 'getJob');
301
+ let url = Helper$4.getUrl(values.serviceKey, 'getJob');
295
302
  return Session$9.authedFunction({
296
303
  method: 'POST',
297
304
  url,
@@ -306,7 +313,7 @@ const maintenanceActions = {
306
313
  let type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
307
314
  return Session$9.authedFunction({
308
315
  method: 'POST',
309
- url: Helper$6.getUrl(values.serviceKey, 'getJobs'),
316
+ url: Helper$4.getUrl(values.serviceKey, 'getJobs'),
310
317
  data: {
311
318
  site,
312
319
  status,
@@ -314,7 +321,7 @@ const maintenanceActions = {
314
321
  }
315
322
  });
316
323
  },
317
- getJobs2: (site, status, type, lastKey) => {
324
+ getJobs2: (site, status, type, priority, assignee, startTime, endTime, search, lastKey) => {
318
325
  const query = {
319
326
  site
320
327
  };
@@ -324,37 +331,57 @@ const maintenanceActions = {
324
331
  if (type) {
325
332
  query.type = type;
326
333
  }
334
+ if (priority) {
335
+ query.priority = priority;
336
+ }
337
+ if (assignee) {
338
+ query.assignee = assignee;
339
+ }
340
+ if (startTime) {
341
+ query.startTime = startTime;
342
+ }
343
+ if (endTime) {
344
+ query.endTime = endTime;
345
+ }
346
+ if (search) {
347
+ query.search = search;
348
+ }
327
349
  if (lastKey) {
328
350
  query.lastKey = JSON.stringify(lastKey);
329
351
  }
330
352
  return Session$9.authedFunction({
331
353
  method: 'GET',
332
- url: Helper$6.getUrl(values.serviceKey, 'get/requests', query)
354
+ url: Helper$4.getUrl(values.serviceKey, 'get/requests', query)
333
355
  });
334
356
  },
357
+ /**
358
+ * @deprecated Use getJobs2 with pagination instead.
359
+ * This method recursively fetches ALL pages which can be slow for large datasets.
360
+ * Only use for CSV export where all data is needed.
361
+ */
335
362
  getJobsRecursive: function (site, status, type, lastKey) {
336
363
  let jobs = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];
337
- return new Promise(resolve => {
338
- maintenanceActions.getJobs2(site, status, type, lastKey).then(jobRes => {
364
+ return new Promise((resolve, reject) => {
365
+ maintenanceActions$1.getJobs2(site, status, type, undefined, undefined, undefined, undefined, undefined, lastKey).then(jobRes => {
339
366
  const newJobs = [...jobs, ...jobRes.data.Items];
340
367
  if (!jobRes.data.LastKey) {
341
368
  return resolve(newJobs);
342
369
  }
343
- return resolve(maintenanceActions.getJobsRecursive(site, status, type, jobRes.data.LastKey, newJobs));
344
- });
370
+ maintenanceActions$1.getJobsRecursive(site, status, type, jobRes.data.LastKey, newJobs).then(resolve).catch(reject);
371
+ }).catch(reject);
345
372
  });
346
373
  },
347
374
  createJob: job => {
348
375
  return Session$9.authedFunction({
349
376
  method: 'POST',
350
- url: Helper$6.getUrl(values.serviceKey, 'sendMaintenance'),
351
- data: _objectSpread$8({}, job)
377
+ url: Helper$4.getUrl(values.serviceKey, 'sendMaintenance'),
378
+ data: _objectSpread$7({}, job)
352
379
  });
353
380
  },
354
381
  editJob: (job, site) => {
355
382
  return Session$9.authedFunction({
356
383
  method: 'POST',
357
- url: Helper$6.getUrl(values.serviceKey, 'editJob'),
384
+ url: Helper$4.getUrl(values.serviceKey, 'editJob'),
358
385
  data: {
359
386
  job,
360
387
  site
@@ -364,7 +391,7 @@ const maintenanceActions = {
364
391
  deleteJob: (site, id) => {
365
392
  return Session$9.authedFunction({
366
393
  method: 'POST',
367
- url: Helper$6.getUrl(values.serviceKey, 'requests/remove'),
394
+ url: Helper$4.getUrl(values.serviceKey, 'requests/remove'),
368
395
  data: {
369
396
  site,
370
397
  id
@@ -374,7 +401,7 @@ const maintenanceActions = {
374
401
  editJobStatus: (id, status) => {
375
402
  return Session$9.authedFunction({
376
403
  method: 'POST',
377
- url: Helper$6.getUrl(values.serviceKey, 'editJobStatus'),
404
+ url: Helper$4.getUrl(values.serviceKey, 'editJobStatus'),
378
405
  data: {
379
406
  id,
380
407
  status
@@ -384,7 +411,7 @@ const maintenanceActions = {
384
411
  editJobPriority: (id, priority) => {
385
412
  return Session$9.authedFunction({
386
413
  method: 'POST',
387
- url: Helper$6.getUrl(values.serviceKey, 'update/priority'),
414
+ url: Helper$4.getUrl(values.serviceKey, 'update/priority'),
388
415
  data: {
389
416
  id,
390
417
  priority
@@ -394,7 +421,7 @@ const maintenanceActions = {
394
421
  assignJob: (jobId, userId) => {
395
422
  return Session$9.authedFunction({
396
423
  method: 'POST',
397
- url: Helper$6.getUrl(values.serviceKey, 'update/assign'),
424
+ url: Helper$4.getUrl(values.serviceKey, 'update/assign'),
398
425
  data: {
399
426
  id: jobId,
400
427
  userId
@@ -404,7 +431,7 @@ const maintenanceActions = {
404
431
  getAssignees: site => {
405
432
  return Session$9.authedFunction({
406
433
  method: 'GET',
407
- url: Helper$6.getUrl(values.serviceKey, 'get/assignees', {
434
+ url: Helper$4.getUrl(values.serviceKey, 'get/assignees', {
408
435
  site
409
436
  })
410
437
  });
@@ -412,7 +439,7 @@ const maintenanceActions = {
412
439
  addNote: (jobId, note, attachments, images) => {
413
440
  return Session$9.authedFunction({
414
441
  method: 'POST',
415
- url: Helper$6.getUrl(values.serviceKey, 'requests/note'),
442
+ url: Helper$4.getUrl(values.serviceKey, 'requests/note'),
416
443
  data: {
417
444
  id: jobId,
418
445
  note,
@@ -425,7 +452,7 @@ const maintenanceActions = {
425
452
  editNote: (jobId, noteId, note, attachments, images) => {
426
453
  return Session$9.authedFunction({
427
454
  method: 'POST',
428
- url: Helper$6.getUrl(values.serviceKey, 'requests/note'),
455
+ url: Helper$4.getUrl(values.serviceKey, 'requests/note'),
429
456
  data: {
430
457
  id: jobId,
431
458
  note,
@@ -439,7 +466,7 @@ const maintenanceActions = {
439
466
  deleteNote: (jobId, noteId) => {
440
467
  return Session$9.authedFunction({
441
468
  method: 'POST',
442
- url: Helper$6.getUrl(values.serviceKey, 'requests/note'),
469
+ url: Helper$4.getUrl(values.serviceKey, 'requests/note'),
443
470
  data: {
444
471
  id: jobId,
445
472
  noteId,
@@ -459,7 +486,7 @@ const maintenanceActions = {
459
486
  };
460
487
  return Session$9.authedFunction({
461
488
  method: 'POST',
462
- url: Helper$6.getUrl(values.serviceKey, 'createJobType'),
489
+ url: Helper$4.getUrl(values.serviceKey, 'createJobType'),
463
490
  data
464
491
  });
465
492
  },
@@ -477,14 +504,14 @@ const maintenanceActions = {
477
504
  if (hasCustomFields && customFields) data.customFields = customFields;
478
505
  return Session$9.authedFunction({
479
506
  method: 'POST',
480
- url: Helper$6.getUrl(values.serviceKey, 'editJobType'),
507
+ url: Helper$4.getUrl(values.serviceKey, 'editJobType'),
481
508
  data
482
509
  });
483
510
  },
484
511
  deleteJobType: (site, id) => {
485
512
  return Session$9.authedFunction({
486
513
  method: 'POST',
487
- url: Helper$6.getUrl(values.serviceKey, 'deleteJobType'),
514
+ url: Helper$4.getUrl(values.serviceKey, 'deleteJobType'),
488
515
  data: {
489
516
  site,
490
517
  id
@@ -494,7 +521,7 @@ const maintenanceActions = {
494
521
  getExternalSync: jobId => {
495
522
  return Session$9.authedFunction({
496
523
  method: 'GET',
497
- url: Helper$6.getUrl(values.serviceKey, 'get/externalsync', {
524
+ url: Helper$4.getUrl(values.serviceKey, 'get/externalsync', {
498
525
  id: jobId
499
526
  })
500
527
  });
@@ -502,7 +529,7 @@ const maintenanceActions = {
502
529
  retrySync: jobId => {
503
530
  return Session$9.authedFunction({
504
531
  method: 'POST',
505
- url: Helper$6.getUrl(values.serviceKey, 'update/retrysync'),
532
+ url: Helper$4.getUrl(values.serviceKey, 'update/retrysync'),
506
533
  data: {
507
534
  id: jobId
508
535
  }
@@ -511,7 +538,7 @@ const maintenanceActions = {
511
538
  };
512
539
 
513
540
  const {
514
- Helper: Helper$5,
541
+ Helper: Helper$3,
515
542
  Session: Session$8
516
543
  } = PlussCore__namespace;
517
544
  const reactionActions = {
@@ -529,7 +556,7 @@ const reactionActions = {
529
556
  }
530
557
  return Session$8.authedFunction({
531
558
  method: 'POST',
532
- url: Helper$5.getUrl('reactions', 'comments/add'),
559
+ url: Helper$3.getUrl('reactions', 'comments/add'),
533
560
  data
534
561
  });
535
562
  },
@@ -552,7 +579,7 @@ const reactionActions = {
552
579
  }
553
580
  return Session$8.authedFunction({
554
581
  method: 'GET',
555
- url: Helper$5.getUrl('reactions', 'comments/get', query)
582
+ url: Helper$3.getUrl('reactions', 'comments/get', query)
556
583
  });
557
584
  }
558
585
  };
@@ -585,30 +612,6 @@ var jobStatusOptions = [
585
612
  }
586
613
  ];
587
614
 
588
- const {
589
- Helper: Helper$4
590
- } = PlussCore__namespace;
591
- const jobsUpdate = (site, isdashboard) => {
592
- return dispatch => {
593
- if (isdashboard) dispatch({
594
- type: JOBS_LOADING
595
- });
596
- maintenanceActions.getJobsRecursive(site).then(res => {
597
- const currentSite = Helper$4.readStorageWithCookie('site');
598
- if (!___default["default"].isEmpty(res) && res[0].site === currentSite) {
599
- dispatch({
600
- type: JOBS_LOADED,
601
- payload: res
602
- });
603
- } else {
604
- dispatch({
605
- type: JOBS_LOADED,
606
- payload: []
607
- });
608
- }
609
- });
610
- };
611
- };
612
615
  const jobsLoaded = events => {
613
616
  return {
614
617
  type: JOBS_LOADED,
@@ -746,8 +749,8 @@ const getJobPriority = priority => {
746
749
  return priorityOption || getDefaultPriority();
747
750
  };
748
751
 
749
- 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; }
750
- 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; }
752
+ function ownKeys$6(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; }
753
+ function _objectSpread$6(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$6(Object(t), !0).forEach(function (r) { _defineProperty__default["default"](e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$6(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
751
754
  const {
752
755
  Session: Session$7,
753
756
  Components: Components$7,
@@ -755,7 +758,155 @@ const {
755
758
  } = PlussCore__namespace;
756
759
  class JobList extends React.Component {
757
760
  constructor(props) {
761
+ var _this;
758
762
  super(props);
763
+ _this = this;
764
+ _defineProperty__default["default"](this, "getAssignees", async () => {
765
+ try {
766
+ const res = await maintenanceActions$1.getAssignees(this.props.auth.site);
767
+ this.setState({
768
+ assignees: res.data.Users
769
+ });
770
+ } catch (error) {
771
+ console.error('getAssignees', error);
772
+ }
773
+ });
774
+ /**
775
+ * Build server-side filter params from current filter state.
776
+ * Translates UI filter selections into API query parameters.
777
+ */
778
+ _defineProperty__default["default"](this, "buildFilterParams", () => {
779
+ const {
780
+ selectedStatusFilter,
781
+ selectedTypeFilter,
782
+ selectedPriorityFilter,
783
+ selectedUserFilter,
784
+ selectedTimeFilterStart,
785
+ selectedTimeFilterEnd,
786
+ searchTerm
787
+ } = this.state;
788
+ const {
789
+ statusTypes
790
+ } = this.props;
791
+ const params = {};
792
+
793
+ // Status filter: translate "All Incomplete" into the actual incomplete statuses
794
+ if (selectedStatusFilter) {
795
+ if (selectedStatusFilter === STATUS_IMCOMPLETE) {
796
+ // Exclude completed statuses - pass all non-completed status texts
797
+ const incompleteStatuses = statusTypes.filter(s => s.category !== STATUS_COMPLETED).map(s => s.text);
798
+ if (incompleteStatuses.length > 0) {
799
+ params.status = incompleteStatuses.join(',');
800
+ }
801
+ } else {
802
+ params.status = selectedStatusFilter;
803
+ }
804
+ }
805
+ if (selectedTypeFilter) {
806
+ params.type = selectedTypeFilter;
807
+ }
808
+ if (selectedPriorityFilter) {
809
+ params.priority = selectedPriorityFilter;
810
+ }
811
+ if (selectedUserFilter) {
812
+ params.assignee = selectedUserFilter;
813
+ }
814
+ if (selectedTimeFilterStart) {
815
+ params.startTime = selectedTimeFilterStart;
816
+ }
817
+ if (selectedTimeFilterEnd) {
818
+ params.endTime = selectedTimeFilterEnd;
819
+ }
820
+ if (searchTerm) {
821
+ params.search = searchTerm;
822
+ }
823
+ return params;
824
+ });
825
+ /**
826
+ * Monotonically increasing ID used to ignore stale fetch results.
827
+ * When a filter changes, fetchJobs() increments this counter. Any
828
+ * in-flight fetch checks the counter before applying results —
829
+ * if it doesn't match, the results are discarded.
830
+ */
831
+ _defineProperty__default["default"](this, "_fetchId", 0);
832
+ /**
833
+ * Fetch a single page from the server using the given lastKey.
834
+ */
835
+ _defineProperty__default["default"](this, "fetchPage", async function () {
836
+ let lastKey = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
837
+ const {
838
+ auth
839
+ } = _this.props;
840
+ const filters = _this.buildFilterParams();
841
+ return maintenanceActions$1.getJobs2(auth.site, filters.status, filters.type, filters.priority, filters.assignee, filters.startTime, filters.endTime, filters.search, lastKey);
842
+ });
843
+ /**
844
+ * Fetch the first page and render immediately.
845
+ */
846
+ _defineProperty__default["default"](this, "fetchJobs", async () => {
847
+ const fetchId = ++this._fetchId;
848
+ this.setState({
849
+ loading: true,
850
+ loadingMore: false
851
+ }, async () => {
852
+ try {
853
+ const res = await this.fetchPage(null);
854
+ if (this._fetchId !== fetchId) return;
855
+ const items = res.data.Items || [];
856
+ const lastKey = res.data.LastKey || null;
857
+ this.setState({
858
+ jobs: items,
859
+ lastKey,
860
+ hasMore: !!lastKey,
861
+ loading: false
862
+ });
863
+ this.props.jobsLoaded(items);
864
+ this.setRequesters(items);
865
+ } catch (error) {
866
+ if (this._fetchId !== fetchId) return;
867
+ console.error('fetchJobs', error);
868
+ this.setState({
869
+ loading: false
870
+ });
871
+ }
872
+ });
873
+ });
874
+ /**
875
+ * Load the next batch of jobs when the user clicks "Load More".
876
+ */
877
+ _defineProperty__default["default"](this, "loadMore", async () => {
878
+ const fetchId = ++this._fetchId;
879
+ const {
880
+ lastKey,
881
+ jobs
882
+ } = this.state;
883
+ this.setState({
884
+ loadingMore: true
885
+ }, async () => {
886
+ try {
887
+ const res = await this.fetchPage(lastKey);
888
+ if (this._fetchId !== fetchId) return;
889
+ const items = res.data.Items || [];
890
+ const newLastKey = res.data.LastKey || null;
891
+ const updatedJobs = [...jobs, ...items];
892
+ this.setState({
893
+ jobs: updatedJobs,
894
+ lastKey: newLastKey,
895
+ hasMore: !!newLastKey,
896
+ loadingMore: false
897
+ });
898
+ if (items.length > 0) {
899
+ this.props.jobsLoaded(items);
900
+ }
901
+ } catch (error) {
902
+ if (this._fetchId !== fetchId) return;
903
+ console.error('loadMore', error);
904
+ this.setState({
905
+ loadingMore: false
906
+ });
907
+ }
908
+ });
909
+ });
759
910
  _defineProperty__default["default"](this, "setRequesters", jobs => {
760
911
  const requesters = ___default["default"].orderBy(___default["default"].uniqBy(jobs.map(j => ({
761
912
  id: j.userID,
@@ -766,30 +917,6 @@ class JobList extends React.Component {
766
917
  requesters
767
918
  });
768
919
  });
769
- _defineProperty__default["default"](this, "getJobs", async () => {
770
- const {
771
- auth
772
- } = this.props;
773
- try {
774
- const res = await maintenanceActions.getJobsRecursive(auth.site);
775
- if (!___default["default"].isEmpty(res) && res[0].site === auth.site) {
776
- this.setRequesters(res);
777
- this.props.jobsLoaded(res);
778
- }
779
- } catch (error) {
780
- console.error('getJobs', error);
781
- }
782
- });
783
- _defineProperty__default["default"](this, "getAssignees", async () => {
784
- try {
785
- const res = await maintenanceActions.getAssignees(this.props.auth.site);
786
- this.setState({
787
- assignees: res.data.Users
788
- });
789
- } catch (error) {
790
- console.error('getAssignees', error);
791
- }
792
- });
793
920
  _defineProperty__default["default"](this, "sortByCol", col => {
794
921
  const {
795
922
  sortColumn,
@@ -809,9 +936,12 @@ class JobList extends React.Component {
809
936
  _defineProperty__default["default"](this, "onRemoveRequest", async request => {
810
937
  if (window.confirm(values.textAreYouSureYouWantToDelete)) {
811
938
  this.props.removeJob(request.id);
939
+ // Remove from local state immediately
940
+ this.setState(prevState => ({
941
+ jobs: prevState.jobs.filter(j => j.id !== request.id)
942
+ }));
812
943
  try {
813
- await maintenanceActions.deleteJob(this.props.auth.site, request.id);
814
- this.getJobs();
944
+ await maintenanceActions$1.deleteJob(this.props.auth.site, request.id);
815
945
  } catch (error) {
816
946
  console.log('onRemoveRequest', error);
817
947
  alert('Something went wrong with the request. Please try again.');
@@ -830,20 +960,20 @@ class JobList extends React.Component {
830
960
  });
831
961
  _defineProperty__default["default"](this, "selectTypeFilter", filter => {
832
962
  this.setState({
833
- selectedTypeFilter: filter
834
- });
963
+ selectedTypeFilter: filter || null
964
+ }, () => this.fetchJobs());
835
965
  this.closeFilter();
836
966
  });
837
967
  _defineProperty__default["default"](this, "selectPriorityFilter", filter => {
838
968
  this.setState({
839
- selectedPriorityFilter: filter
840
- });
969
+ selectedPriorityFilter: filter || null
970
+ }, () => this.fetchJobs());
841
971
  this.closeFilter();
842
972
  });
843
973
  _defineProperty__default["default"](this, "selectStatusFilter", filter => {
844
974
  this.setState({
845
- selectedStatusFilter: filter
846
- });
975
+ selectedStatusFilter: filter || null
976
+ }, () => this.fetchJobs());
847
977
  this.closeFilter();
848
978
  });
849
979
  _defineProperty__default["default"](this, "timeFilterChanged", selectedTimeFilter => {
@@ -887,7 +1017,7 @@ class JobList extends React.Component {
887
1017
  selectedTimeFilterStart: startTime,
888
1018
  selectedTimeFilterEnd: endTime,
889
1019
  selectedTimeFilterText: text
890
- });
1020
+ }, () => this.fetchJobs());
891
1021
  this.closeFilter();
892
1022
  });
893
1023
  _defineProperty__default["default"](this, "removeTimeFilter", () => {
@@ -895,7 +1025,7 @@ class JobList extends React.Component {
895
1025
  selectedTimeFilterStart: null,
896
1026
  selectedTimeFilterEnd: null,
897
1027
  selectedTimeFilterText: null
898
- });
1028
+ }, () => this.fetchJobs());
899
1029
  });
900
1030
  _defineProperty__default["default"](this, "onHandleChange", event => {
901
1031
  var stateChange = {};
@@ -911,7 +1041,7 @@ class JobList extends React.Component {
911
1041
  this.setState({
912
1042
  selectedUserFilter: null,
913
1043
  selectedUserFilterText: null
914
- });
1044
+ }, () => this.fetchJobs());
915
1045
  });
916
1046
  _defineProperty__default["default"](this, "saveUserFilter", () => {
917
1047
  if (!this.state.selectedAssignee) {
@@ -921,7 +1051,7 @@ class JobList extends React.Component {
921
1051
  selectedUserFilter: this.state.selectedAssignee.id,
922
1052
  selectedUserFilterText: this.state.selectedAssignee.displayName,
923
1053
  selectedAssignee: null
924
- });
1054
+ }, () => this.fetchJobs());
925
1055
  }
926
1056
  this.closeFilter();
927
1057
  });
@@ -934,7 +1064,7 @@ class JobList extends React.Component {
934
1064
  this.setState({
935
1065
  selectedRequesterFilter: null,
936
1066
  selectedRequesterFilterText: null
937
- });
1067
+ }, () => this.fetchJobs());
938
1068
  });
939
1069
  _defineProperty__default["default"](this, "saveRequesterFilter", () => {
940
1070
  if (!this.state.selectedRequester) {
@@ -944,7 +1074,7 @@ class JobList extends React.Component {
944
1074
  selectedRequesterFilter: this.state.selectedRequester.id,
945
1075
  selectedRequesterFilterText: this.state.selectedRequester.displayName,
946
1076
  selectedRequester: null
947
- });
1077
+ }, () => this.fetchJobs());
948
1078
  }
949
1079
  this.closeFilter();
950
1080
  });
@@ -955,85 +1085,47 @@ class JobList extends React.Component {
955
1085
  lastSearch: thisSearchTime
956
1086
  });
957
1087
  setTimeout(() => {
958
- // delayed setter to avoid filtering on every keypress
1088
+ // delayed setter to avoid searching on every keypress
959
1089
  if (this.state.lastSearch === thisSearchTime) {
960
1090
  this.setState({
961
1091
  searchTerm: this.state.search
962
- });
1092
+ }, () => this.fetchJobs());
963
1093
  }
964
1094
  }, 500);
965
1095
  });
1096
+ /**
1097
+ * Get the source array for rendering.
1098
+ * With server-side filtering, this is simply the local jobs array
1099
+ * sorted by the user's selected sort column.
1100
+ * The requester filter still applies client-side since the backend
1101
+ * doesn't have a requester/userID filter param.
1102
+ */
966
1103
  _defineProperty__default["default"](this, "getSource", () => {
967
- let source = this.props.source;
1104
+ let source = this.state.jobs;
968
1105
 
969
- // filter by time
970
- if (this.state.selectedTimeFilterStart && this.state.selectedTimeFilterEnd) {
971
- source = ___default["default"].filter(source, r => {
972
- return r.createdUnix >= this.state.selectedTimeFilterStart && r.createdUnix <= this.state.selectedTimeFilterEnd;
973
- });
974
- }
975
-
976
- // filter by type
977
- if (this.state.selectedTypeFilter) {
978
- source = ___default["default"].filter(source, r => {
979
- return r.type === this.state.selectedTypeFilter;
980
- });
981
- }
1106
+ // Filter out deleted items
1107
+ source = ___default["default"].filter(source, ev => ev != null && !ev.Deleted);
982
1108
 
983
- // filter by priority
984
- if (this.state.selectedPriorityFilter) {
985
- const defaultPriority = getDefaultPriority().name;
986
- source = ___default["default"].filter(source, r => {
987
- return r.priority === this.state.selectedPriorityFilter || this.state.selectedPriorityFilter === defaultPriority && ___default["default"].isNil(r.priority);
988
- });
989
- }
990
-
991
- // filter by status
992
- if (this.state.selectedStatusFilter) {
993
- const {
994
- statusTypes
995
- } = this.props;
996
- const defaultStatus = statusTypes.find(s => s.category === STATUS_NOT_ACTIONED);
997
- source = ___default["default"].filter(source, r => {
998
- const status = statusTypes.find(s => s.text === r.status) || defaultStatus;
999
- if (this.state.selectedStatusFilter === STATUS_IMCOMPLETE) {
1000
- return status.category !== STATUS_COMPLETED;
1001
- }
1002
- return status.text === this.state.selectedStatusFilter;
1003
- });
1004
- }
1005
- if (this.state.selectedUserFilter) {
1006
- source = ___default["default"].filter(source, r => {
1007
- return r.AssigneeId === this.state.selectedUserFilter;
1008
- });
1009
- }
1109
+ // Requester filter still client-side (no backend param for userID filtering)
1010
1110
  if (this.state.selectedRequesterFilter) {
1011
1111
  source = ___default["default"].filter(source, r => {
1012
1112
  return r.userID === this.state.selectedRequesterFilter;
1013
1113
  });
1014
1114
  }
1015
- if (!___default["default"].isEmpty(this.state.searchTerm)) {
1016
- source = ___default["default"].filter(source, r => {
1017
- if (r.jobId && r.jobId === this.state.searchTerm) {
1018
- return true;
1019
- }
1020
- if (r.room && r.room.toLowerCase().indexOf(this.state.searchTerm.toLowerCase()) > -1) {
1021
- return true;
1022
- }
1023
- if (r.title && r.title.toLowerCase().indexOf(this.state.searchTerm.toLowerCase()) > -1) {
1024
- return true;
1115
+
1116
+ // Skip sorting while auto-fill is appending results to avoid jumpiness.
1117
+ // Sort is re-applied when the user clicks a column header or when
1118
+ // auto-fill completes.
1119
+ if (!this.state.loadingMore) {
1120
+ source = ___default["default"].sortBy(source, event => {
1121
+ if (this.state.sortColumn === 'assigned') {
1122
+ return event.Assignee ? event.Assignee.displayName : 'Unassigned';
1025
1123
  }
1026
- return false;
1124
+ if (this.state.sortColumn !== 'createdUnix') return event[this.state.sortColumn];
1125
+ return event.createdUnix;
1027
1126
  });
1127
+ if (this.state.sortDesc) source.reverse();
1028
1128
  }
1029
- source = ___default["default"].sortBy(source, event => {
1030
- if (this.state.sortColumn === 'assigned') {
1031
- return event.Assignee ? event.Assignee.displayName : 'Unassigned';
1032
- }
1033
- if (this.state.sortColumn !== 'createdUnix') return event[this.state.sortColumn];
1034
- return event.createdUnix;
1035
- });
1036
- if (this.state.sortDesc) source.reverse();
1037
1129
  return source;
1038
1130
  });
1039
1131
  _defineProperty__default["default"](this, "getCustomFieldValue", field => {
@@ -1113,7 +1205,7 @@ class JobList extends React.Component {
1113
1205
  });
1114
1206
  const customFieldValues = this.getCustomFields(r, customColumns);
1115
1207
  const priority = r.priority || defaultPriority;
1116
- return _objectSpread$7(_objectSpread$7(_objectSpread$7({}, r), customFieldValues), {}, {
1208
+ return _objectSpread$6(_objectSpread$6(_objectSpread$6({}, r), customFieldValues), {}, {
1117
1209
  notes,
1118
1210
  progressTime,
1119
1211
  completedTime,
@@ -1145,13 +1237,60 @@ class JobList extends React.Component {
1145
1237
  exportCsvOpen: false
1146
1238
  });
1147
1239
  });
1240
+ _defineProperty__default["default"](this, "hasActiveFilters", () => {
1241
+ const {
1242
+ selectedTypeFilter,
1243
+ selectedPriorityFilter,
1244
+ selectedStatusFilter,
1245
+ selectedTimeFilterStart,
1246
+ selectedUserFilter,
1247
+ selectedRequesterFilter,
1248
+ searchTerm
1249
+ } = this.state;
1250
+ return !!(selectedTypeFilter || selectedPriorityFilter || selectedStatusFilter || selectedTimeFilterStart || selectedUserFilter || selectedRequesterFilter || searchTerm);
1251
+ });
1252
+ _defineProperty__default["default"](this, "clearAllFilters", () => {
1253
+ this.setState({
1254
+ selectedTypeFilter: null,
1255
+ selectedPriorityFilter: null,
1256
+ selectedStatusFilter: null,
1257
+ selectedTimeFilterStart: null,
1258
+ selectedTimeFilterEnd: null,
1259
+ selectedTimeFilterText: null,
1260
+ selectedUserFilter: null,
1261
+ selectedUserFilterText: null,
1262
+ selectedRequesterFilter: null,
1263
+ selectedRequesterFilterText: null,
1264
+ search: '',
1265
+ searchTerm: ''
1266
+ }, () => this.fetchJobs());
1267
+ });
1148
1268
  this.state = {
1149
- showCompleted: false,
1150
1269
  sortColumn: 'createdUnix',
1151
1270
  sortDesc: true,
1152
1271
  selectedTimeFilter: Analytics$2.getAnalyticsFilterOptions()[1],
1153
1272
  assignees: [],
1154
- requesters: []
1273
+ requesters: [],
1274
+ // Server-side pagination state
1275
+ jobs: [],
1276
+ lastKey: null,
1277
+ hasMore: false,
1278
+ loading: false,
1279
+ loadingMore: false,
1280
+ // Filters (applied to server-side queries)
1281
+ selectedTypeFilter: null,
1282
+ selectedPriorityFilter: null,
1283
+ selectedStatusFilter: null,
1284
+ selectedTimeFilterStart: null,
1285
+ selectedTimeFilterEnd: null,
1286
+ selectedTimeFilterText: null,
1287
+ selectedUserFilter: null,
1288
+ selectedUserFilterText: null,
1289
+ selectedRequesterFilter: null,
1290
+ selectedRequesterFilterText: null,
1291
+ search: '',
1292
+ searchTerm: '',
1293
+ lastSearch: null
1155
1294
  };
1156
1295
  this.exportColumns = [{
1157
1296
  label: 'Select All',
@@ -1211,7 +1350,7 @@ class JobList extends React.Component {
1211
1350
  }
1212
1351
  componentDidMount() {
1213
1352
  this.props.jobStatusesUpdate(this.props.auth.site);
1214
- this.getJobs();
1353
+ this.fetchJobs();
1215
1354
  this.getAssignees();
1216
1355
  }
1217
1356
  renderFilterPopup() {
@@ -1225,7 +1364,7 @@ class JobList extends React.Component {
1225
1364
  minWidth: 400,
1226
1365
  hasPadding: true,
1227
1366
  onClose: this.closeFilter
1228
- }, ___default["default"].sortBy(___default["default"].uniq(this.props.source.map(r => r.type)), t => t.toLowerCase()).map(type => {
1367
+ }, ___default["default"].sortBy(___default["default"].uniq(this.state.jobs.map(r => r.type)), t => t.toLowerCase()).map(type => {
1229
1368
  return /*#__PURE__*/React__default["default"].createElement(Components$7.Tag, {
1230
1369
  key: type,
1231
1370
  onClick: () => {
@@ -1416,7 +1555,7 @@ class JobList extends React.Component {
1416
1555
  const status = ev.status && statusTypes.find(s => s.text === ev.status) || defaultStatus;
1417
1556
  const priority = getJobPriority(ev.priority);
1418
1557
  return /*#__PURE__*/React__default["default"].createElement("tr", {
1419
- key: index
1558
+ key: ev.id || index
1420
1559
  }, /*#__PURE__*/React__default["default"].createElement("td", null, ev.jobId), /*#__PURE__*/React__default["default"].createElement("td", {
1421
1560
  className: "table-TitleColumn"
1422
1561
  }, /*#__PURE__*/React__default["default"].createElement(reactRouterDom.Link, {
@@ -1497,8 +1636,28 @@ class JobList extends React.Component {
1497
1636
  if (col !== this.state.sortColumn) return '';
1498
1637
  return ' table--columnActive';
1499
1638
  }
1639
+ renderLoading() {
1640
+ return /*#__PURE__*/React__default["default"].createElement("div", {
1641
+ className: "flex flex-center-row",
1642
+ style: {
1643
+ padding: 40
1644
+ }
1645
+ }, /*#__PURE__*/React__default["default"].createElement(FontAwesome__default["default"], {
1646
+ style: {
1647
+ fontSize: 32,
1648
+ color: PlussCore.Colours.COLOUR_DUSK_LIGHT
1649
+ },
1650
+ name: "spinner fa-pulse fa-fw"
1651
+ }), /*#__PURE__*/React__default["default"].createElement("span", {
1652
+ className: "marginLeft-16 fontRegular fontSize-14",
1653
+ style: {
1654
+ color: PlussCore.Colours.TEXT_MID
1655
+ }
1656
+ }, "Loading ", values.textTitleRequests, "\u2026"));
1657
+ }
1500
1658
  renderEmpty() {
1501
1659
  const title = this.props.strings["".concat(values.featureKey, "_textTitleRequests")] || values.textTitleRequests;
1660
+ const hasFilters = this.hasActiveFilters();
1502
1661
  return /*#__PURE__*/React__default["default"].createElement("div", {
1503
1662
  style: {
1504
1663
  display: 'flex',
@@ -1510,7 +1669,22 @@ class JobList extends React.Component {
1510
1669
  }
1511
1670
  }, /*#__PURE__*/React__default["default"].createElement("div", {
1512
1671
  className: "emptyState"
1513
- }), /*#__PURE__*/React__default["default"].createElement("div", {
1672
+ }), hasFilters ? /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", {
1673
+ className: "marginTop-32",
1674
+ style: {
1675
+ maxWidth: 500,
1676
+ textAlign: 'center'
1677
+ }
1678
+ }, /*#__PURE__*/React__default["default"].createElement("span", {
1679
+ className: "fontRegular fontSize-13"
1680
+ }, "No ", title.toLowerCase(), " match your current filters.")), /*#__PURE__*/React__default["default"].createElement("div", {
1681
+ className: "marginTop-16"
1682
+ }, /*#__PURE__*/React__default["default"].createElement(Components$7.Button, {
1683
+ inline: true,
1684
+ buttonType: "tertiary",
1685
+ onClick: this.clearAllFilters,
1686
+ isActive: true
1687
+ }, "Clear All Filters"))) : /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", {
1514
1688
  className: "marginTop-32",
1515
1689
  style: {
1516
1690
  maxWidth: 500,
@@ -1526,11 +1700,66 @@ class JobList extends React.Component {
1526
1700
  maxWidth: 500,
1527
1701
  textAlign: 'center'
1528
1702
  }
1529
- }, values.textEmptyExample));
1703
+ }, values.textEmptyExample)));
1704
+ }
1705
+ renderLoadMore() {
1706
+ const {
1707
+ hasMore,
1708
+ loadingMore
1709
+ } = this.state;
1710
+ if (!hasMore && !loadingMore) return null;
1711
+
1712
+ // During background auto-fill, show a subtle spinner without a button
1713
+ if (loadingMore) {
1714
+ return /*#__PURE__*/React__default["default"].createElement("div", {
1715
+ className: "flex flex-center-row",
1716
+ style: {
1717
+ padding: '16px 0'
1718
+ }
1719
+ }, /*#__PURE__*/React__default["default"].createElement(FontAwesome__default["default"], {
1720
+ name: "spinner fa-pulse fa-fw",
1721
+ style: {
1722
+ fontSize: 16,
1723
+ color: PlussCore.Colours.TEXT_MID,
1724
+ marginRight: 8
1725
+ }
1726
+ }), /*#__PURE__*/React__default["default"].createElement("span", {
1727
+ className: "fontRegular fontSize-13",
1728
+ style: {
1729
+ color: PlussCore.Colours.TEXT_MID
1730
+ }
1731
+ }, "Loading more results\u2026"));
1732
+ }
1733
+ return /*#__PURE__*/React__default["default"].createElement("div", {
1734
+ style: {
1735
+ margin: '24px 0 40px 0',
1736
+ position: 'relative',
1737
+ top: -16
1738
+ }
1739
+ }, /*#__PURE__*/React__default["default"].createElement(Components$7.Button, {
1740
+ buttonType: "primary",
1741
+ onClick: this.loadMore,
1742
+ isActive: true,
1743
+ style: {
1744
+ width: '100%'
1745
+ }
1746
+ }, "Load More Results", /*#__PURE__*/React__default["default"].createElement(FontAwesome__default["default"], {
1747
+ name: "plus",
1748
+ style: {
1749
+ marginLeft: 8
1750
+ }
1751
+ })));
1530
1752
  }
1531
1753
  renderContent() {
1532
- if (___default["default"].isEmpty(this.props.source)) return this.renderEmpty();
1533
- return /*#__PURE__*/React__default["default"].createElement(reactBootstrap.Table, {
1754
+ const {
1755
+ loading,
1756
+ loadingMore,
1757
+ jobs
1758
+ } = this.state;
1759
+ if (loading) return this.renderLoading();
1760
+ if (___default["default"].isEmpty(jobs) && !loadingMore) return this.renderEmpty();
1761
+ if (___default["default"].isEmpty(jobs)) return this.renderLoading();
1762
+ return /*#__PURE__*/React__default["default"].createElement("div", null, /*#__PURE__*/React__default["default"].createElement(reactBootstrap.Table, {
1534
1763
  className: "plussTable",
1535
1764
  striped: true,
1536
1765
  bordered: true,
@@ -1613,7 +1842,7 @@ class JobList extends React.Component {
1613
1842
  style: {
1614
1843
  width: 50
1615
1844
  }
1616
- }))), /*#__PURE__*/React__default["default"].createElement("tbody", null, this.renderRequests()));
1845
+ }))), /*#__PURE__*/React__default["default"].createElement("tbody", null, this.renderRequests())), this.renderLoadMore());
1617
1846
  }
1618
1847
  renderFilters() {
1619
1848
  let typeFilter = /*#__PURE__*/React__default["default"].createElement(Components$7.Tag, {
@@ -1662,13 +1891,9 @@ class JobList extends React.Component {
1662
1891
  typeFilter = /*#__PURE__*/React__default["default"].createElement(Components$7.Tag, {
1663
1892
  className: "marginRight-10",
1664
1893
  onClick: () => {
1665
- this.openFilter('type');
1666
- },
1667
- rightIcon: "close",
1668
- rightClick: e => {
1669
- e.stopPropagation();
1670
1894
  this.selectTypeFilter();
1671
1895
  },
1896
+ rightIcon: "close",
1672
1897
  text: this.state.selectedTypeFilter
1673
1898
  });
1674
1899
  }
@@ -1676,13 +1901,9 @@ class JobList extends React.Component {
1676
1901
  priorityFilter = /*#__PURE__*/React__default["default"].createElement(Components$7.Tag, {
1677
1902
  className: "marginRight-10",
1678
1903
  onClick: () => {
1679
- this.openFilter('priority');
1680
- },
1681
- rightIcon: "close",
1682
- rightClick: e => {
1683
- e.stopPropagation();
1684
1904
  this.selectPriorityFilter();
1685
1905
  },
1906
+ rightIcon: "close",
1686
1907
  text: this.state.selectedPriorityFilter
1687
1908
  });
1688
1909
  }
@@ -1690,13 +1911,9 @@ class JobList extends React.Component {
1690
1911
  statusFilter = /*#__PURE__*/React__default["default"].createElement(Components$7.Tag, {
1691
1912
  className: "marginRight-10",
1692
1913
  onClick: () => {
1693
- this.openFilter('status');
1694
- },
1695
- rightIcon: "close",
1696
- rightClick: e => {
1697
- e.stopPropagation();
1698
1914
  this.selectStatusFilter();
1699
1915
  },
1916
+ rightIcon: "close",
1700
1917
  text: this.state.selectedStatusFilter
1701
1918
  });
1702
1919
  }
@@ -1718,13 +1935,9 @@ class JobList extends React.Component {
1718
1935
  userFilter = /*#__PURE__*/React__default["default"].createElement(Components$7.Tag, {
1719
1936
  className: "marginRight-10",
1720
1937
  onClick: () => {
1721
- this.openFilter('user');
1722
- },
1723
- rightIcon: "close",
1724
- rightClick: e => {
1725
- e.stopPropagation();
1726
1938
  this.removeUserFilter();
1727
1939
  },
1940
+ rightIcon: "close",
1728
1941
  text: this.state.selectedUserFilterText
1729
1942
  });
1730
1943
  }
@@ -1732,13 +1945,9 @@ class JobList extends React.Component {
1732
1945
  requesterFilter = /*#__PURE__*/React__default["default"].createElement(Components$7.Tag, {
1733
1946
  className: "marginRight-10",
1734
1947
  onClick: () => {
1735
- this.openFilter('requester');
1736
- },
1737
- rightIcon: "close",
1738
- rightClick: e => {
1739
- e.stopPropagation();
1740
1948
  this.removeRequesterFilter();
1741
1949
  },
1950
+ rightIcon: "close",
1742
1951
  text: this.state.selectedRequesterFilterText
1743
1952
  });
1744
1953
  }
@@ -1816,7 +2025,7 @@ class JobTypes extends React.Component {
1816
2025
  super(props);
1817
2026
  _defineProperty__default["default"](this, "getJobTypes", async () => {
1818
2027
  try {
1819
- const res = await maintenanceActions.getJobTypes(this.props.auth.site);
2028
+ const res = await maintenanceActions$1.getJobTypes(this.props.auth.site);
1820
2029
  if (res.data != null) this.props.jobTypesLoaded(res.data);
1821
2030
  } catch (error) {
1822
2031
  console.error('getJobTypes', error);
@@ -1841,7 +2050,7 @@ class JobTypes extends React.Component {
1841
2050
  _defineProperty__default["default"](this, "onRemoveJobType", async ev => {
1842
2051
  if (!window.confirm("Are you sure you want to delete ".concat(ev.typeName, "?"))) return;
1843
2052
  try {
1844
- await maintenanceActions.deleteJobType(this.props.auth.site, ev.id);
2053
+ await maintenanceActions$1.deleteJobType(this.props.auth.site, ev.id);
1845
2054
  const index = ___default["default"].findIndex(this.state.jobList, job => {
1846
2055
  return job != null && job.id === ev.id;
1847
2056
  });
@@ -2046,12 +2255,12 @@ var JobTypes$1 = reactRedux.connect(mapStateToProps$6, {
2046
2255
  jobTypesUpdate
2047
2256
  })(reactRouter.withRouter(JobTypes));
2048
2257
 
2049
- function ownKeys$6(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; }
2050
- function _objectSpread$6(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$6(Object(t), !0).forEach(function (r) { _defineProperty__default["default"](e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$6(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2258
+ function ownKeys$5(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; }
2259
+ function _objectSpread$5(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$5(Object(t), !0).forEach(function (r) { _defineProperty__default["default"](e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$5(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2051
2260
  const {
2052
2261
  Session: Session$5,
2053
2262
  Components: Components$5,
2054
- Colours: Colours$3
2263
+ Colours: Colours$2
2055
2264
  } = PlussCore__namespace;
2056
2265
  class Configuration extends React.Component {
2057
2266
  constructor(props) {
@@ -2242,43 +2451,43 @@ class Configuration extends React.Component {
2242
2451
  return /*#__PURE__*/React__default["default"].createElement("div", null, /*#__PURE__*/React__default["default"].createElement("p", {
2243
2452
  className: "fontMedium fontSize-36 text-dark"
2244
2453
  }, "Statuses"), /*#__PURE__*/React__default["default"].createElement("div", {
2245
- style: styles$6.statusCategoryHeading
2454
+ style: styles$5.statusCategoryHeading
2246
2455
  }, /*#__PURE__*/React__default["default"].createElement("span", {
2247
2456
  className: "fontMedium fontSize-16 text-bold"
2248
2457
  }, "Status Category")), statusTypes.map((status, index) => {
2249
2458
  return /*#__PURE__*/React__default["default"].createElement("div", {
2250
2459
  key: "".concat(status.text, "_").concat(index),
2251
- style: styles$6.statusTypeContainer
2460
+ style: styles$5.statusTypeContainer
2252
2461
  }, /*#__PURE__*/React__default["default"].createElement("div", {
2253
2462
  key: status.text,
2254
2463
  className: "statusLabel",
2255
- style: _objectSpread$6(_objectSpread$6({}, styles$6.statusTextContainer), {}, {
2464
+ style: _objectSpread$5(_objectSpread$5({}, styles$5.statusTextContainer), {}, {
2256
2465
  backgroundColor: status.color
2257
2466
  })
2258
2467
  }, /*#__PURE__*/React__default["default"].createElement("span", {
2259
2468
  className: "statusLabel_text"
2260
2469
  }, status.text)), /*#__PURE__*/React__default["default"].createElement("div", {
2261
- style: styles$6.statusCategoryContainer
2470
+ style: styles$5.statusCategoryContainer
2262
2471
  }, /*#__PURE__*/React__default["default"].createElement("span", {
2263
2472
  className: "fontMedium fontSize-16 text-dark"
2264
2473
  }, status.category)), /*#__PURE__*/React__default["default"].createElement(FontAwesome__default["default"], {
2265
- style: _objectSpread$6(_objectSpread$6({}, styles$6.statusIcon), {}, {
2474
+ style: _objectSpread$5(_objectSpread$5({}, styles$5.statusIcon), {}, {
2266
2475
  visibility: index === 0 ? 'hidden' : 'visible'
2267
2476
  }),
2268
2477
  name: 'arrow-up',
2269
2478
  onClick: () => this.onMoveStatus(index, true)
2270
2479
  }), /*#__PURE__*/React__default["default"].createElement(FontAwesome__default["default"], {
2271
- style: _objectSpread$6(_objectSpread$6({}, styles$6.statusIcon), {}, {
2480
+ style: _objectSpread$5(_objectSpread$5({}, styles$5.statusIcon), {}, {
2272
2481
  visibility: index === statusTypes.length - 1 ? 'hidden' : 'visible'
2273
2482
  }),
2274
2483
  name: 'arrow-down',
2275
2484
  onClick: () => this.onMoveStatus(index, false)
2276
2485
  }), /*#__PURE__*/React__default["default"].createElement(FontAwesome__default["default"], {
2277
- style: _objectSpread$6({}, styles$6.statusIcon),
2486
+ style: _objectSpread$5({}, styles$5.statusIcon),
2278
2487
  name: "pencil",
2279
2488
  onClick: () => this.onEditStatus(index)
2280
2489
  }), /*#__PURE__*/React__default["default"].createElement(FontAwesome__default["default"], {
2281
- style: _objectSpread$6({}, styles$6.statusIcon),
2490
+ style: _objectSpread$5({}, styles$5.statusIcon),
2282
2491
  name: "minus-circle",
2283
2492
  onClick: () => this.onDeleteStatus(index)
2284
2493
  }));
@@ -2327,8 +2536,8 @@ class Configuration extends React.Component {
2327
2536
  renderSuccess() {
2328
2537
  if (!this.state.success) return null;
2329
2538
  return /*#__PURE__*/React__default["default"].createElement("span", {
2330
- style: _objectSpread$6(_objectSpread$6({}, styles$6.savedText), {}, {
2331
- color: Colours$3.COLOUR_GREEN
2539
+ style: _objectSpread$5(_objectSpread$5({}, styles$5.savedText), {}, {
2540
+ color: Colours$2.COLOUR_GREEN
2332
2541
  })
2333
2542
  }, "Saved");
2334
2543
  }
@@ -2444,7 +2653,7 @@ class Configuration extends React.Component {
2444
2653
  }, this.renderSubmit(), this.renderSuccess()), this.renderNewStatusPopup());
2445
2654
  }
2446
2655
  }
2447
- const styles$6 = {
2656
+ const styles$5 = {
2448
2657
  statusCategoryHeading: {
2449
2658
  marginLeft: 130,
2450
2659
  width: 160,
@@ -2469,7 +2678,7 @@ const styles$6 = {
2469
2678
  fontSize: 20,
2470
2679
  padding: 5,
2471
2680
  marginLeft: 10,
2472
- color: Colours$3.COLOUR_BRANDING_ACTION,
2681
+ color: Colours$2.COLOUR_BRANDING_ACTION,
2473
2682
  visibility: 'visible'
2474
2683
  },
2475
2684
  savedText: {
@@ -2503,52 +2712,6 @@ const {
2503
2712
  class RequestsHub extends React.Component {
2504
2713
  constructor(props) {
2505
2714
  super(props);
2506
- _defineProperty__default["default"](this, "setData", () => {
2507
- const allList = [];
2508
- this.state.allList.forEach(ev => {
2509
- if (ev != null && !ev.Deleted) allList.push(ev);
2510
- });
2511
- const upcoming = ___default["default"].filter(allList, ev => {
2512
- if (!ev) return false;
2513
- if (ev.status && ev.status === 'Completed') return false;
2514
- return true;
2515
- });
2516
- const completed = ___default["default"].filter(allList, ev => {
2517
- if (!ev) return false;
2518
- if (ev.status && ev.status === 'Completed') return true;
2519
- return false;
2520
- });
2521
-
2522
- // console.log('setData', upcoming, completed);
2523
- this.setState({
2524
- allList,
2525
- upcoming,
2526
- completed
2527
- });
2528
- });
2529
- _defineProperty__default["default"](this, "getData", () => {
2530
- const {
2531
- auth
2532
- } = this.props;
2533
- this.setState({
2534
- loadingAll: true
2535
- }, async () => {
2536
- try {
2537
- const res = await maintenanceActions.getJobsRecursive(auth.site);
2538
- this.setState({
2539
- loadingAll: false
2540
- });
2541
- if (!___default["default"].isEmpty(res) && res[0].site === auth.site) {
2542
- this.props.jobsLoaded(res);
2543
- }
2544
- } catch (error) {
2545
- console.error('getData', error);
2546
- this.setState({
2547
- loadingAll: false
2548
- });
2549
- }
2550
- });
2551
- });
2552
2715
  _defineProperty__default["default"](this, "onAddNew", () => {
2553
2716
  const {
2554
2717
  auth
@@ -2575,38 +2738,10 @@ class RequestsHub extends React.Component {
2575
2738
  _defineProperty__default["default"](this, "getSideBarSectionColour", id => this.state.selectedSection === id ? {
2576
2739
  backgroundColor: '#fff'
2577
2740
  } : {});
2578
- _defineProperty__default["default"](this, "renderStats", (stat, loading) => loading ? /*#__PURE__*/React__default["default"].createElement(FontAwesome__default["default"], {
2579
- style: styles$5.spinner,
2580
- name: "spinner fa-pulse fa-fw"
2581
- }) : stat);
2582
2741
  this.state = {
2583
- selectedSection: 'all',
2584
- location: '',
2585
- loadingAll: false,
2586
- loadingSubmissions: false,
2587
- submissionEntries: [],
2588
- allList: [],
2589
- completed: [],
2590
- upcoming: [],
2591
- now: moment__default["default"].utc(),
2592
- onlyFuture: true,
2593
- search: ''
2742
+ selectedSection: 'all'
2594
2743
  };
2595
2744
  }
2596
- UNSAFE_componentWillMount() {
2597
- this.updateProps(this.props);
2598
- }
2599
- componentDidMount() {
2600
- this.getData();
2601
- }
2602
- UNSAFE_componentWillReceiveProps(nextProps) {
2603
- if (!___default["default"].isEqual(this.props.jobs, nextProps.jobs)) this.updateProps(nextProps);
2604
- }
2605
- updateProps(props) {
2606
- this.setState({
2607
- allList: props.jobs
2608
- }, this.setData);
2609
- }
2610
2745
  renderLeftBar() {
2611
2746
  const sectionItems = [];
2612
2747
  if (this.canAddNew()) {
@@ -2676,9 +2811,7 @@ class RequestsHub extends React.Component {
2676
2811
  } else if (this.state.selectedSection === 'config') {
2677
2812
  return /*#__PURE__*/React__default["default"].createElement(Configuration$1, null);
2678
2813
  }
2679
- return /*#__PURE__*/React__default["default"].createElement(JobList$1, {
2680
- source: this.state.allList
2681
- });
2814
+ return /*#__PURE__*/React__default["default"].createElement(JobList$1, null);
2682
2815
  }
2683
2816
  render() {
2684
2817
  return /*#__PURE__*/React__default["default"].createElement("div", {
@@ -2690,50 +2823,24 @@ class RequestsHub extends React.Component {
2690
2823
  }, this.renderRight())));
2691
2824
  }
2692
2825
  }
2693
- const styles$5 = {
2694
- sideBarTitleSection: {
2695
- lineHeight: '40px',
2696
- marginTop: 30,
2697
- marginBottom: 30,
2698
- paddingLeft: 24,
2699
- paddingRight: 24
2700
- },
2701
- sideBarSection: {
2702
- weight: '100%',
2703
- minWidth: 200,
2704
- padding: 32,
2705
- paddingLeft: 24,
2706
- cursor: 'pointer',
2707
- display: 'flex',
2708
- flexDirection: 'column',
2709
- justifyContent: 'center'
2710
- },
2711
- spinner: {
2712
- fontSize: 32,
2713
- color: FeatureConfig.env.colourBrandingOff
2714
- }
2715
- };
2716
2826
  const mapStateToProps$4 = state => {
2717
2827
  const {
2718
2828
  auth
2719
2829
  } = state;
2720
2830
  return {
2721
- jobs: state[values.reducerKey].jobs,
2722
2831
  auth,
2723
2832
  strings: state.strings && state.strings.config || {}
2724
2833
  };
2725
2834
  };
2726
- var RequestsHub$1 = reactRedux.connect(mapStateToProps$4, {
2727
- jobsLoaded
2728
- })(reactRouter.withRouter(RequestsHub));
2835
+ var RequestsHub$1 = reactRedux.connect(mapStateToProps$4)(reactRouter.withRouter(RequestsHub));
2729
2836
 
2730
- function ownKeys$5(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; }
2731
- function _objectSpread$5(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$5(Object(t), !0).forEach(function (r) { _defineProperty__default["default"](e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$5(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2837
+ function ownKeys$4(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; }
2838
+ 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; }
2732
2839
  const {
2733
2840
  Apis: Apis$1,
2734
- Helper: Helper$3,
2841
+ Helper: Helper$2,
2735
2842
  Session: Session$3,
2736
- Colours: Colours$2,
2843
+ Colours: Colours$1,
2737
2844
  Components: Components$3
2738
2845
  } = PlussCore__namespace;
2739
2846
  const IMAGE_SIZE_NOTE = 72;
@@ -2742,7 +2849,7 @@ class Job extends React.Component {
2742
2849
  super(props);
2743
2850
  _defineProperty__default["default"](this, "getJob", async () => {
2744
2851
  try {
2745
- const res = await maintenanceActions.getJob(this.props.auth.site, this.state.jobId);
2852
+ const res = await maintenanceActions$1.getJob(this.props.auth.site, this.state.jobId);
2746
2853
  this.setState({
2747
2854
  updating: false
2748
2855
  });
@@ -2754,7 +2861,7 @@ class Job extends React.Component {
2754
2861
  });
2755
2862
  _defineProperty__default["default"](this, "getAssignees", async () => {
2756
2863
  try {
2757
- const res = await maintenanceActions.getAssignees(this.props.auth.site);
2864
+ const res = await maintenanceActions$1.getAssignees(this.props.auth.site);
2758
2865
  this.setState({
2759
2866
  assignees: res.data.Users
2760
2867
  });
@@ -2767,7 +2874,7 @@ class Job extends React.Component {
2767
2874
  this.setState({
2768
2875
  loadingExternalSync: true
2769
2876
  });
2770
- const res = await maintenanceActions.getExternalSync(this.state.jobId);
2877
+ const res = await maintenanceActions$1.getExternalSync(this.state.jobId);
2771
2878
  this.setState({
2772
2879
  externalSync: res.data,
2773
2880
  loadingExternalSync: false
@@ -2792,7 +2899,7 @@ class Job extends React.Component {
2792
2899
  retrySyncError: null
2793
2900
  });
2794
2901
  try {
2795
- await maintenanceActions.retrySync(job.id);
2902
+ await maintenanceActions$1.retrySync(job.id);
2796
2903
  // Refresh job data to get updated history
2797
2904
  await this.getJob();
2798
2905
  this.setState({
@@ -2815,7 +2922,7 @@ class Job extends React.Component {
2815
2922
  let statusType = statusTypes.find(s => s.text === status);
2816
2923
  if (!statusType) {
2817
2924
  const defaultStatus = statusTypes.find(s => s.category === STATUS_NOT_ACTIONED);
2818
- statusType = _objectSpread$5(_objectSpread$5({}, defaultStatus), {}, {
2925
+ statusType = _objectSpread$4(_objectSpread$4({}, defaultStatus), {}, {
2819
2926
  text: status
2820
2927
  });
2821
2928
  }
@@ -2958,7 +3065,7 @@ class Job extends React.Component {
2958
3065
  // Method to handle user assignment
2959
3066
  _defineProperty__default["default"](this, "onAssignUser", async userId => {
2960
3067
  try {
2961
- const res = await maintenanceActions.assignJob(this.state.jobId, userId);
3068
+ const res = await maintenanceActions$1.assignJob(this.state.jobId, userId);
2962
3069
  this.getJob();
2963
3070
  } catch (err) {
2964
3071
  console.error("onAssignUser", err);
@@ -2970,12 +3077,12 @@ class Job extends React.Component {
2970
3077
  this.setState({
2971
3078
  submittingNote: true
2972
3079
  });
2973
- const res = await (this.state.editingNote ? maintenanceActions.editNote(this.state.jobId, this.state.editingNote, this.state.noteInput, this.state.noteAttachments.map(a => {
3080
+ const res = await (this.state.editingNote ? maintenanceActions$1.editNote(this.state.jobId, this.state.editingNote, this.state.noteInput, this.state.noteAttachments.map(a => {
2974
3081
  return {
2975
3082
  Title: a.Title,
2976
3083
  Source: a.Source
2977
3084
  };
2978
- }), this.state.noteImages) : maintenanceActions.addNote(this.state.jobId, this.state.noteInput, this.state.noteAttachments.map(a => {
3085
+ }), this.state.noteImages) : maintenanceActions$1.addNote(this.state.jobId, this.state.noteInput, this.state.noteAttachments.map(a => {
2979
3086
  return {
2980
3087
  Title: a.Title,
2981
3088
  Source: a.Source
@@ -3003,9 +3110,9 @@ class Job extends React.Component {
3003
3110
  });
3004
3111
  return;
3005
3112
  }
3006
- maintenanceActions.deleteNote(this.state.jobId, n.Id);
3113
+ maintenanceActions$1.deleteNote(this.state.jobId, n.Id);
3007
3114
  const newNotes = ___default["default"].filter(this.state.job.Notes, note => note.Id !== n.Id);
3008
- const newJob = _objectSpread$5({}, this.state.job);
3115
+ const newJob = _objectSpread$4({}, this.state.job);
3009
3116
  newJob.Notes = newNotes;
3010
3117
  this.setState({
3011
3118
  job: newJob,
@@ -3041,7 +3148,7 @@ class Job extends React.Component {
3041
3148
  seen: true,
3042
3149
  status: job.status || "Unassigned"
3043
3150
  };
3044
- await maintenanceActions.editJob(update, auth.site);
3151
+ await maintenanceActions$1.editJob(update, auth.site);
3045
3152
  } catch (error) {
3046
3153
  this.setState({
3047
3154
  updating: false
@@ -3089,13 +3196,13 @@ class Job extends React.Component {
3089
3196
  });
3090
3197
  _defineProperty__default["default"](this, "onSelectPriority", async priority => {
3091
3198
  this.setState({
3092
- job: _objectSpread$5(_objectSpread$5({}, this.state.job), {}, {
3199
+ job: _objectSpread$4(_objectSpread$4({}, this.state.job), {}, {
3093
3200
  priority
3094
3201
  }),
3095
3202
  priorityChangerOpen: false
3096
3203
  });
3097
3204
  try {
3098
- const res = await maintenanceActions.editJobPriority(this.state.job.id, priority);
3205
+ const res = await maintenanceActions$1.editJobPriority(this.state.job.id, priority);
3099
3206
  const {
3100
3207
  job
3101
3208
  } = res.data;
@@ -3114,13 +3221,13 @@ class Job extends React.Component {
3114
3221
  });
3115
3222
  _defineProperty__default["default"](this, "onSelectStatus", async status => {
3116
3223
  this.setState({
3117
- job: _objectSpread$5(_objectSpread$5({}, this.state.job), {}, {
3224
+ job: _objectSpread$4(_objectSpread$4({}, this.state.job), {}, {
3118
3225
  status: status
3119
3226
  }),
3120
3227
  statusChangerOpen: false
3121
3228
  });
3122
3229
  try {
3123
- const res = await maintenanceActions.editJobStatus(this.state.job.id, status);
3230
+ const res = await maintenanceActions$1.editJobStatus(this.state.job.id, status);
3124
3231
  const {
3125
3232
  job
3126
3233
  } = res.data;
@@ -3133,7 +3240,7 @@ class Job extends React.Component {
3133
3240
  }
3134
3241
  });
3135
3242
  this.state = {
3136
- jobId: Helper$3.safeReadParams(props, "jobId") ? props.match.params.jobId : null,
3243
+ jobId: Helper$2.safeReadParams(props, "jobId") ? props.match.params.jobId : null,
3137
3244
  job: null,
3138
3245
  showingSelector: false,
3139
3246
  updating: false,
@@ -3336,7 +3443,7 @@ class Job extends React.Component {
3336
3443
  }, /*#__PURE__*/React__default["default"].createElement("div", {
3337
3444
  className: "imageGrid_image",
3338
3445
  style: {
3339
- backgroundImage: "url('".concat(Helper$3.get1400(image), "')"),
3446
+ backgroundImage: "url('".concat(Helper$2.get1400(image), "')"),
3340
3447
  width: size,
3341
3448
  height: size
3342
3449
  }
@@ -3533,7 +3640,7 @@ class Job extends React.Component {
3533
3640
  }, /*#__PURE__*/React__default["default"].createElement("div", {
3534
3641
  className: "maintenanceNote_top"
3535
3642
  }, this.props.auth && this.props.auth.user && this.props.auth.user.Id === note.User.id && /*#__PURE__*/React__default["default"].createElement(Components$3.SVGIcon, {
3536
- colour: Colours$2.COLOUR_DUSK_LIGHT,
3643
+ colour: Colours$1.COLOUR_DUSK_LIGHT,
3537
3644
  icon: "more15",
3538
3645
  className: "maintenanceNote_moreIcon",
3539
3646
  onClick: () => this.onOpenNoteMenu(index)
@@ -3551,7 +3658,7 @@ class Job extends React.Component {
3551
3658
  }]
3552
3659
  })), /*#__PURE__*/React__default["default"].createElement("p", {
3553
3660
  className: "maintenanceNote_text"
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));
3661
+ }, 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));
3555
3662
  }
3556
3663
  renderAssignment() {
3557
3664
  const {
@@ -3584,7 +3691,7 @@ class Job extends React.Component {
3584
3691
  }, moment__default["default"].utc(e.timestamp).local().format("D MMM YYYY h:mma")), /*#__PURE__*/React__default["default"].createElement("div", {
3585
3692
  className: "statusLabel statusLabel-large statusLabel-full",
3586
3693
  style: {
3587
- backgroundColor: Colours$2.COLOUR_DUSK
3694
+ backgroundColor: Colours$1.COLOUR_DUSK
3588
3695
  }
3589
3696
  }, /*#__PURE__*/React__default["default"].createElement("span", {
3590
3697
  className: "statusLabel_text"
@@ -3592,7 +3699,7 @@ class Job extends React.Component {
3592
3699
  }
3593
3700
  renderExternalSyncEntry(e, i) {
3594
3701
  const isSuccess = e.EntryType === "ExternalIDSet";
3595
- const backgroundColor = isSuccess ? Colours$2.COLOUR_GREEN : Colours$2.COLOUR_RED; // Green for success, red for failure
3702
+ const backgroundColor = isSuccess ? Colours$1.COLOUR_GREEN : Colours$1.COLOUR_RED; // Green for success, red for failure
3596
3703
 
3597
3704
  return /*#__PURE__*/React__default["default"].createElement("div", {
3598
3705
  className: "ticketHistoryEntry",
@@ -3652,7 +3759,7 @@ class Job extends React.Component {
3652
3759
  return /*#__PURE__*/React__default["default"].createElement(FontAwesome__default["default"], {
3653
3760
  style: {
3654
3761
  fontSize: 20,
3655
- color: Colours$2.COLOUR_DUSK_LIGHT,
3762
+ color: Colours$1.COLOUR_DUSK_LIGHT,
3656
3763
  marginLeft: 8
3657
3764
  },
3658
3765
  name: "spinner fa-pulse fa-fw"
@@ -3662,7 +3769,7 @@ class Job extends React.Component {
3662
3769
  className: "statusLabel pointer",
3663
3770
  onClick: this.onRetrySync,
3664
3771
  style: {
3665
- backgroundColor: Colours$2.COLOUR_RED,
3772
+ backgroundColor: Colours$1.COLOUR_RED,
3666
3773
  marginLeft: 8
3667
3774
  }
3668
3775
  }, /*#__PURE__*/React__default["default"].createElement("span", {
@@ -3683,7 +3790,7 @@ class Job extends React.Component {
3683
3790
  className: "userStatusIcon",
3684
3791
  name: "times-circle",
3685
3792
  style: {
3686
- color: Colours$2.COLOUR_RED
3793
+ color: Colours$1.COLOUR_RED
3687
3794
  }
3688
3795
  }), " ", retrySyncError);
3689
3796
  }
@@ -3696,7 +3803,7 @@ class Job extends React.Component {
3696
3803
  className: "userStatusIcon",
3697
3804
  name: "check-circle",
3698
3805
  style: {
3699
- color: Colours$2.COLOUR_GREEN
3806
+ color: Colours$1.COLOUR_GREEN
3700
3807
  }
3701
3808
  }), " ", "Sync retry initiated. Check back shortly for results.");
3702
3809
  }
@@ -3709,7 +3816,7 @@ class Job extends React.Component {
3709
3816
  className: "userStatusIcon",
3710
3817
  name: "times-circle",
3711
3818
  style: {
3712
- color: Colours$2.COLOUR_RED
3819
+ color: Colours$1.COLOUR_RED
3713
3820
  }
3714
3821
  }), " ", "External sync failed. Use the retry button to attempt again.");
3715
3822
  }
@@ -3753,11 +3860,11 @@ class Job extends React.Component {
3753
3860
  } = this.state;
3754
3861
  if (!job || !job.history) return null;
3755
3862
  const source = ___default["default"].sortBy([...job.history.map(e => {
3756
- return _objectSpread$5(_objectSpread$5({}, e), {}, {
3863
+ return _objectSpread$4(_objectSpread$4({}, e), {}, {
3757
3864
  EntryType: e.EntryType || "status"
3758
3865
  });
3759
3866
  }), ...(job.Notes || []).map(e => {
3760
- return _objectSpread$5(_objectSpread$5({}, e), {}, {
3867
+ return _objectSpread$4(_objectSpread$4({}, e), {}, {
3761
3868
  timestamp: e.Timestamp,
3762
3869
  EntryType: "note"
3763
3870
  });
@@ -3906,7 +4013,7 @@ class Job extends React.Component {
3906
4013
  onClick: () => {
3907
4014
  this.onSelectAssignee();
3908
4015
  },
3909
- colour: Colours$2.COLOUR_DUSK
4016
+ colour: Colours$1.COLOUR_DUSK
3910
4017
  })
3911
4018
  }));
3912
4019
  } else {
@@ -3980,14 +4087,14 @@ var Job$1 = reactRedux.connect(mapStateToProps$3, {
3980
4087
  jobStatusesUpdate
3981
4088
  })(reactRouter.withRouter(Job));
3982
4089
 
3983
- function ownKeys$4(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; }
3984
- 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; }
4090
+ function ownKeys$3(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; }
4091
+ function _objectSpread$3(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$3(Object(t), !0).forEach(function (r) { _defineProperty__default["default"](e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$3(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
3985
4092
  const {
3986
4093
  Actions,
3987
4094
  Components: Components$2,
3988
- Helper: Helper$2,
4095
+ Helper: Helper$1,
3989
4096
  Session: Session$2,
3990
- Colours: Colours$1,
4097
+ Colours,
3991
4098
  Apis
3992
4099
  } = PlussCore__namespace;
3993
4100
  class AddJob extends React.Component {
@@ -3997,7 +4104,7 @@ class AddJob extends React.Component {
3997
4104
  _this = this;
3998
4105
  _defineProperty__default["default"](this, "getJob", async () => {
3999
4106
  try {
4000
- const res = await maintenanceActions.getJob(this.props.auth.site, this.state.jobId);
4107
+ const res = await maintenanceActions$1.getJob(this.props.auth.site, this.state.jobId);
4001
4108
  res.data.location = res.data.site;
4002
4109
  const {
4003
4110
  userID,
@@ -4006,7 +4113,7 @@ class AddJob extends React.Component {
4006
4113
  type,
4007
4114
  customFields
4008
4115
  } = res.data;
4009
- this.setState(_objectSpread$4(_objectSpread$4({}, res.data), {}, {
4116
+ this.setState(_objectSpread$3(_objectSpread$3({}, res.data), {}, {
4010
4117
  prevType: type,
4011
4118
  prevCustomFileds: customFields,
4012
4119
  type,
@@ -4031,7 +4138,7 @@ class AddJob extends React.Component {
4031
4138
  });
4032
4139
  _defineProperty__default["default"](this, "getJobTypes", async () => {
4033
4140
  try {
4034
- const res = await maintenanceActions.getJobTypes(this.props.auth.site);
4141
+ const res = await maintenanceActions$1.getJobTypes(this.props.auth.site);
4035
4142
  this.setState({
4036
4143
  types: res.data
4037
4144
  });
@@ -4254,7 +4361,7 @@ class AddJob extends React.Component {
4254
4361
  event.target.value = "";
4255
4362
  });
4256
4363
  _defineProperty__default["default"](this, "onToggleDatePicker", qId => {
4257
- const showDate = _objectSpread$4({}, this.state.showDate);
4364
+ const showDate = _objectSpread$3({}, this.state.showDate);
4258
4365
  showDate[qId] = !showDate[qId];
4259
4366
  this.setState({
4260
4367
  showDate
@@ -4291,7 +4398,7 @@ class AddJob extends React.Component {
4291
4398
  customFields: this.state.customFields
4292
4399
  };
4293
4400
  if (this.state.id != null) {
4294
- maintenanceActions.editJob(job, this.props.auth.site).then(res => {
4401
+ maintenanceActions$1.editJob(job, this.props.auth.site).then(res => {
4295
4402
  this.setState({
4296
4403
  success: true,
4297
4404
  updating: false
@@ -4305,12 +4412,12 @@ class AddJob extends React.Component {
4305
4412
  });
4306
4413
  } else {
4307
4414
  // Create New Job
4308
- maintenanceActions.createJob(job).then(res => {
4415
+ maintenanceActions$1.createJob(job).then(res => {
4309
4416
  this.setState({
4310
4417
  success: true,
4311
4418
  updating: false
4312
4419
  });
4313
- this.props.jobsUpdate(this.props.auth.site);
4420
+ // JobList fetches fresh data on mount — no action needed here
4314
4421
  }).catch(res => {
4315
4422
  this.setState({
4316
4423
  updating: false
@@ -4343,7 +4450,7 @@ class AddJob extends React.Component {
4343
4450
  if (___default["default"].isNil(answer) || ___default["default"].isEmpty(answer)) return true;
4344
4451
  switch (type) {
4345
4452
  case "email":
4346
- return Helper$2.isEmail(answer);
4453
+ return Helper$1.isEmail(answer);
4347
4454
  case "date":
4348
4455
  return moment__default["default"](answer, "YYYY-MM-DD", true).isValid();
4349
4456
  case "time":
@@ -4364,7 +4471,7 @@ class AddJob extends React.Component {
4364
4471
  this.customImageInputs = {};
4365
4472
  this.customDocumentInputs = {};
4366
4473
  this.state = {
4367
- jobId: Helper$2.safeReadParams(this.props, "jobId") ? this.props.match.params.jobId : null,
4474
+ jobId: Helper$1.safeReadParams(this.props, "jobId") ? this.props.match.params.jobId : null,
4368
4475
  job: null,
4369
4476
  showingSelector: false,
4370
4477
  updating: false,
@@ -4716,7 +4823,7 @@ class AddJob extends React.Component {
4716
4823
  return /*#__PURE__*/React__default["default"].createElement("p", {
4717
4824
  className: "visitorSignIn_text-staticText",
4718
4825
  key: fieldId
4719
- }, Helper$2.toParagraphed(field.label, {
4826
+ }, Helper$1.toParagraphed(field.label, {
4720
4827
  marginTop: 10
4721
4828
  }));
4722
4829
  case "date":
@@ -4735,7 +4842,7 @@ class AddJob extends React.Component {
4735
4842
  alwaysShowLabel: true,
4736
4843
  readOnly: true,
4737
4844
  rightContent: !___default["default"].isEmpty(field.answer) && /*#__PURE__*/React__default["default"].createElement(Components$2.SVGIcon, {
4738
- colour: Colours$1.COLOUR_DUSK_LIGHT,
4845
+ colour: Colours.COLOUR_DUSK_LIGHT,
4739
4846
  icon: "close",
4740
4847
  className: "timepicker_clear",
4741
4848
  onClick: () => this.onChangeDateAnswer(fieldId, undefined, false)
@@ -4768,7 +4875,7 @@ class AddJob extends React.Component {
4768
4875
  }
4769
4876
  }),
4770
4877
  rightContent: !___default["default"].isEmpty(field.answer) && /*#__PURE__*/React__default["default"].createElement(Components$2.SVGIcon, {
4771
- colour: Colours$1.COLOUR_DUSK_LIGHT,
4878
+ colour: Colours.COLOUR_DUSK_LIGHT,
4772
4879
  icon: "close",
4773
4880
  className: "timepicker_clear",
4774
4881
  onClick: () => this.onChangeTimeAnswer(fieldId, undefined)
@@ -4971,11 +5078,10 @@ const mapStateToProps$2 = state => {
4971
5078
  return {
4972
5079
  auth,
4973
5080
  strings: state.strings && state.strings.config || {},
4974
- optionOnlyForResidents: Helper$2.getSiteSettingFromState(state, values.optionOnlyForResidents)
5081
+ optionOnlyForResidents: Helper$1.getSiteSettingFromState(state, values.optionOnlyForResidents)
4975
5082
  };
4976
5083
  };
4977
5084
  var AddJob$1 = reactRedux.connect(mapStateToProps$2, {
4978
- jobsUpdate,
4979
5085
  jobsLoaded,
4980
5086
  addRecentlyCreated: Actions.addRecentlyCreated
4981
5087
  })(reactRouter.withRouter(AddJob));
@@ -4983,7 +5089,7 @@ var AddJob$1 = reactRedux.connect(mapStateToProps$2, {
4983
5089
  const {
4984
5090
  Components: Components$1,
4985
5091
  Session: Session$1,
4986
- Helper: Helper$1
5092
+ Helper
4987
5093
  } = PlussCore__namespace;
4988
5094
  const DEFAULT_FIELD = {
4989
5095
  type: 'text',
@@ -4997,7 +5103,7 @@ class AddJobType extends React.Component {
4997
5103
  super(props);
4998
5104
  _defineProperty__default["default"](this, "getJobType", async () => {
4999
5105
  try {
5000
- const res = await maintenanceActions.getJobType(this.props.auth.site, this.state.jobTypeId);
5106
+ const res = await maintenanceActions$1.getJobType(this.props.auth.site, this.state.jobTypeId);
5001
5107
  const {
5002
5108
  typeName,
5003
5109
  email,
@@ -5026,7 +5132,7 @@ class AddJobType extends React.Component {
5026
5132
  const {
5027
5133
  jobTypeEmail
5028
5134
  } = this.state;
5029
- return !___default["default"].isEmpty(jobTypeEmail) && Helper$1.isEmail(jobTypeEmail);
5135
+ return !___default["default"].isEmpty(jobTypeEmail) && Helper.isEmail(jobTypeEmail);
5030
5136
  });
5031
5137
  _defineProperty__default["default"](this, "isJobTypeValid", () => {
5032
5138
  const {
@@ -5169,9 +5275,9 @@ class AddJobType extends React.Component {
5169
5275
  }, async () => {
5170
5276
  try {
5171
5277
  if (jobTypeId) {
5172
- await maintenanceActions.editJobType(site, jobTypeId, jobTypeName, jobTypeEmail, jobTypeDescription, jobTypeLevel, hasCustomFields, customFields);
5278
+ await maintenanceActions$1.editJobType(site, jobTypeId, jobTypeName, jobTypeEmail, jobTypeDescription, jobTypeLevel, hasCustomFields, customFields);
5173
5279
  } else {
5174
- await maintenanceActions.addJobType(site, jobTypeName, jobTypeEmail, jobTypeDescription, jobTypeLevel, hasCustomFields, customFields);
5280
+ await maintenanceActions$1.addJobType(site, jobTypeName, jobTypeEmail, jobTypeDescription, jobTypeLevel, hasCustomFields, customFields);
5175
5281
  }
5176
5282
  this.props.jobTypesUpdate(site);
5177
5283
  this.setState({
@@ -5228,7 +5334,7 @@ class AddJobType extends React.Component {
5228
5334
  }];
5229
5335
  this.state = {
5230
5336
  loading: false,
5231
- jobTypeId: Helper$1.safeReadParams(this.props, 'jobTypeId') ? this.props.match.params.jobTypeId : null,
5337
+ jobTypeId: Helper.safeReadParams(this.props, 'jobTypeId') ? this.props.match.params.jobTypeId : null,
5232
5338
  jobTypeName: '',
5233
5339
  jobTypeEmail: '',
5234
5340
  jobTypeDescription: '',
@@ -5793,14 +5899,10 @@ var AddJobType$1 = reactRedux.connect(mapStateToProps$1, {
5793
5899
  jobTypesUpdate
5794
5900
  })(reactRouter.withRouter(AddJobType));
5795
5901
 
5796
- function ownKeys$3(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; }
5797
- function _objectSpread$3(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$3(Object(t), !0).forEach(function (r) { _defineProperty__default["default"](e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$3(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5798
5902
  const {
5799
5903
  Analytics: Analytics$1,
5800
5904
  Session,
5801
- Components,
5802
- Helper,
5803
- Colours
5905
+ Components
5804
5906
  } = PlussCore__namespace;
5805
5907
  const getInitialState = () => ({
5806
5908
  requests: 0,
@@ -5820,21 +5922,10 @@ const AnalyticsHub = _ref => {
5820
5922
  auth,
5821
5923
  prevText,
5822
5924
  dayCount,
5823
- strings,
5824
- userType,
5825
- userCategory,
5826
- selectedSites
5925
+ strings
5827
5926
  } = _ref;
5828
5927
  const [analyticsData, setAnalyticsData] = React.useState(getInitialState());
5829
5928
  const [isExportOpen, setIsExportOpen] = React.useState(false);
5830
- const [failedSites, setFailedSites] = React.useState([]);
5831
- const [comparisonData, setComparisonData] = React.useState({
5832
- requests: [],
5833
- completedRequests: [],
5834
- comments: [],
5835
- isLoading: true
5836
- });
5837
- const comparisonMode = selectedSites && selectedSites.length > 1;
5838
5929
  const hasAccess = Session.validateAccess(auth.site, values.permissionMaintenanceTracking, auth);
5839
5930
  if (!hasAccess) {
5840
5931
  return null;
@@ -5846,130 +5937,50 @@ const AnalyticsHub = _ref => {
5846
5937
  return strings.sideNav[key];
5847
5938
  })();
5848
5939
  const exportColumns = [{
5849
- label: "Select All",
5850
- key: ""
5851
- }, ...(comparisonMode ? [{
5852
- label: "Site",
5853
- key: "site"
5854
- }] : []), {
5855
- label: "Start Date",
5856
- key: "startDate"
5940
+ label: 'Select All',
5941
+ key: ''
5942
+ }, {
5943
+ label: 'Start Date',
5944
+ key: 'startDate'
5857
5945
  }, {
5858
- label: "End Date",
5859
- key: "endDate"
5946
+ label: 'End Date',
5947
+ key: 'endDate'
5860
5948
  }, {
5861
5949
  label: "".concat(values.textSingularName, "s"),
5862
- key: "requests"
5950
+ key: 'requests'
5863
5951
  }, {
5864
5952
  label: "Completed ".concat(values.textSingularName, "s"),
5865
- key: "completedRequests"
5953
+ key: 'completedRequests'
5866
5954
  }, {
5867
- label: "Comments",
5868
- key: "comments"
5955
+ label: 'Comments',
5956
+ key: 'comments'
5869
5957
  }];
5870
5958
  React.useEffect(() => {
5871
5959
  getData();
5872
- }, [startTime, endTime, userType, userCategory, selectedSites]);
5960
+ }, [startTime, endTime]);
5873
5961
  const getData = async () => {
5874
- try {
5875
- setFailedSites([]);
5876
- if (comparisonMode) {
5877
- setComparisonData({
5878
- requests: [],
5879
- completedRequests: [],
5880
- comments: [],
5881
- isLoading: true
5882
- });
5883
- const multiSiteResultsObj = await Analytics$1.fetchMultiSiteData(selectedSites, async site => {
5884
- const {
5885
- data
5886
- } = await analyticsActions.getAggregateEntityStats(site, values.analyticsKey, startTime, endTime, true, {
5887
- userType,
5888
- userCategory
5889
- });
5890
- return data;
5891
- });
5892
- const roles = auth.user.Roles;
5893
- const failed = Object.entries(multiSiteResultsObj).filter(_ref2 => {
5894
- let [, data] = _ref2;
5895
- return data === null;
5896
- }).map(_ref3 => {
5897
- let [site] = _ref3;
5898
- return Helper.getSiteNameFromRoles(site, roles);
5899
- });
5900
- setFailedSites(failed);
5901
- const multiSiteResults = Object.entries(multiSiteResultsObj).filter(_ref4 => {
5902
- let [, data] = _ref4;
5903
- return data !== null;
5904
- }).map(_ref5 => {
5905
- let [site, data] = _ref5;
5906
- return {
5907
- site,
5908
- data
5909
- };
5910
- });
5911
- const buildComparison = (activityKey, countType) => multiSiteResults.map(result => ({
5912
- name: Helper.getSiteNameFromRoles(result.site, roles),
5913
- value: Analytics$1.countActivities(result.data, activityKey, countType)
5914
- }));
5915
- setComparisonData({
5916
- requests: buildComparison("Request", "total"),
5917
- completedRequests: buildComparison("RequestCompleted", "unique"),
5918
- comments: buildComparison("Comment", "total"),
5919
- isLoading: false
5920
- });
5921
- } else {
5922
- setAnalyticsData(getInitialState());
5923
- const site = selectedSites && selectedSites.length === 1 ? selectedSites[0] : auth.site;
5924
- const timeDifference = endTime - startTime;
5925
- const [currentStatsResponse, prevStatsResponse] = await Promise.all([analyticsActions.getAggregateEntityStats(site, values.analyticsKey, startTime, endTime, true, {
5926
- userType,
5927
- userCategory
5928
- }), analyticsActions.getAggregateEntityStats(site, values.analyticsKey, startTime - timeDifference, startTime, true, {
5929
- userType,
5930
- userCategory
5931
- })]);
5932
- const data = {
5933
- requests: Analytics$1.countActivities(currentStatsResponse.data, "Request", "total"),
5934
- prevRequests: Analytics$1.countActivities(prevStatsResponse.data, "Request", "total"),
5935
- completedRequests: Analytics$1.countActivities(currentStatsResponse.data, "RequestCompleted", "unique"),
5936
- prevCompletedRequests: Analytics$1.countActivities(prevStatsResponse.data, "RequestCompleted", "unique"),
5937
- comments: Analytics$1.countActivities(currentStatsResponse.data, "Comment", "total"),
5938
- prevComments: Analytics$1.countActivities(prevStatsResponse.data, "Comment", "total"),
5939
- isLoading: false
5940
- };
5941
- setAnalyticsData(data);
5942
- }
5943
- } catch (err) {
5944
- if (comparisonMode) {
5945
- setComparisonData(prev => _objectSpread$3(_objectSpread$3({}, prev), {}, {
5946
- isLoading: false
5947
- }));
5948
- } else {
5949
- setAnalyticsData(prev => _objectSpread$3(_objectSpread$3({}, prev), {}, {
5950
- isLoading: false
5951
- }));
5952
- }
5953
- }
5962
+ setAnalyticsData(getInitialState());
5963
+ // Load analytics data here using startTime and endTime
5964
+ const timeDifference = endTime - startTime;
5965
+ 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)]);
5966
+ const data = {
5967
+ requests: Analytics$1.countActivities(currentStatsResponse.data, 'Request', 'total'),
5968
+ prevRequests: Analytics$1.countActivities(prevStatsResponse.data, 'Request', 'total'),
5969
+ completedRequests: Analytics$1.countActivities(currentStatsResponse.data, 'RequestCompleted', 'unique'),
5970
+ prevCompletedRequests: Analytics$1.countActivities(prevStatsResponse.data, 'RequestCompleted', 'unique'),
5971
+ comments: Analytics$1.countActivities(currentStatsResponse.data, 'Comment', 'total'),
5972
+ prevComments: Analytics$1.countActivities(prevStatsResponse.data, 'Comment', 'total'),
5973
+ isLoading: false
5974
+ };
5975
+ setAnalyticsData(data);
5954
5976
  };
5955
5977
  const isReadyToOpenCSV = () => {
5956
- return comparisonMode ? !comparisonData.isLoading : !analyticsData.isLoading;
5978
+ return !analyticsData.isLoading;
5957
5979
  };
5958
5980
  const getExportSource = () => {
5959
- if (comparisonMode) {
5960
- const sites = comparisonData.requests || [];
5961
- return sites.map((site, i) => ({
5962
- site: site.name,
5963
- startDate: moment__default["default"](startTime + 1).format("D-MM-YYYY"),
5964
- endDate: moment__default["default"](endTime).format("D-MM-YYYY"),
5965
- requests: site.value,
5966
- completedRequests: comparisonData.completedRequests[i] && comparisonData.completedRequests[i].value || 0,
5967
- comments: comparisonData.comments[i] && comparisonData.comments[i].value || 0
5968
- }));
5969
- }
5970
5981
  return [{
5971
- startDate: moment__default["default"](startTime + 1).format("D-MM-YYYY"),
5972
- endDate: moment__default["default"](endTime).format("D-MM-YYYY"),
5982
+ startDate: moment__default["default"](startTime + 1).format('D-MM-YYYY'),
5983
+ endDate: moment__default["default"](endTime).format('D-MM-YYYY'),
5973
5984
  requests: analyticsData.requests,
5974
5985
  completedRequests: analyticsData.completedRequests,
5975
5986
  comments: analyticsData.comments
@@ -5980,14 +5991,13 @@ const AnalyticsHub = _ref => {
5980
5991
  return null;
5981
5992
  }
5982
5993
  const source = getExportSource();
5983
- const filterSuffix = [userType, userCategory].filter(Boolean).map(f => f.toLowerCase().replace(/\s+/g, "-")).join("_");
5984
5994
  return /*#__PURE__*/React__default["default"].createElement(Components.ExportCsvPopup, {
5985
5995
  onClose: () => {
5986
5996
  setIsExportOpen(false);
5987
5997
  },
5988
5998
  columns: exportColumns,
5989
5999
  source: source,
5990
- filename: "".concat(values.analyticsKey, "analytics").concat(comparisonMode ? "_comparison" : "").concat(filterSuffix ? "_".concat(filterSuffix) : "", "_").concat(source[0].startDate, "_").concat(source[0].endDate, ".csv")
6000
+ filename: "".concat(values.analyticsKey, "analytics_").concat(source[0].startDate, "_").concat(source[0].endDate, ".csv")
5991
6001
  });
5992
6002
  };
5993
6003
  return /*#__PURE__*/React__default["default"].createElement("div", {
@@ -6004,69 +6014,33 @@ const AnalyticsHub = _ref => {
6004
6014
  },
6005
6015
  isActive: isReadyToOpenCSV(),
6006
6016
  leftIcon: "file-code-o"
6007
- }, "Export CSV")), failedSites.length > 0 && /*#__PURE__*/React__default["default"].createElement(Components.Text, {
6008
- type: "help",
6009
- style: {
6010
- color: Colours.COLOUR_RED,
6011
- marginTop: 8
6012
- }
6013
- }, "Data unavailable for: ", failedSites.join(", ")), /*#__PURE__*/React__default["default"].createElement("div", {
6017
+ }, "Export CSV")), /*#__PURE__*/React__default["default"].createElement("div", {
6014
6018
  className: "analyticsSection dashboardSection_content"
6015
- }, (() => {
6016
- const chartSuffix = [selectedSites && selectedSites.length > 0 ? "&sites=".concat(selectedSites.join(",")) : "", userType ? "&userType=".concat(encodeURIComponent(userType)) : "", userCategory ? "&userCategory=".concat(encodeURIComponent(userCategory)) : ""].join("");
6017
- if (comparisonMode) {
6018
- return /*#__PURE__*/React__default["default"].createElement("div", {
6019
- style: {
6020
- display: "flex",
6021
- flexDirection: "column",
6022
- gap: 16
6023
- }
6024
- }, /*#__PURE__*/React__default["default"].createElement(Components.ComparisonStatBox, {
6025
- title: "".concat(featureTitle, " Requests"),
6026
- data: comparisonData.requests,
6027
- prevText: prevText,
6028
- viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=Request&countType=total&dayCount=").concat(dayCount).concat(chartSuffix),
6029
- isLoading: comparisonData.isLoading
6030
- }), /*#__PURE__*/React__default["default"].createElement(Components.ComparisonStatBox, {
6031
- title: "Completed ".concat(featureTitle, " Requests"),
6032
- data: comparisonData.completedRequests,
6033
- prevText: prevText,
6034
- viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=RequestCompleted&countType=unique&dayCount=").concat(dayCount).concat(chartSuffix),
6035
- isLoading: comparisonData.isLoading
6036
- }), /*#__PURE__*/React__default["default"].createElement(Components.ComparisonStatBox, {
6037
- title: "".concat(featureTitle, " Comments"),
6038
- data: comparisonData.comments,
6039
- prevText: prevText,
6040
- viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=Comment&countType=total&dayCount=").concat(dayCount).concat(chartSuffix),
6041
- isLoading: comparisonData.isLoading
6042
- }));
6043
- }
6044
- return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(Components.StatBox, {
6045
- title: "".concat(featureTitle, " Requests"),
6046
- icon: freeSolidSvgIcons.faWrench,
6047
- value: analyticsData.requests,
6048
- previousValue: analyticsData.prevRequests,
6049
- prevText: prevText,
6050
- viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=Request&countType=total&dayCount=").concat(dayCount).concat(chartSuffix),
6051
- isLoading: analyticsData.isLoading
6052
- }), /*#__PURE__*/React__default["default"].createElement(Components.StatBox, {
6053
- title: "Completed ".concat(featureTitle, " Requests"),
6054
- icon: freeSolidSvgIcons.faCircleCheck,
6055
- value: analyticsData.completedRequests,
6056
- previousValue: analyticsData.prevCompletedRequests,
6057
- prevText: prevText,
6058
- viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=RequestCompleted&countType=unique&dayCount=").concat(dayCount).concat(chartSuffix),
6059
- isLoading: analyticsData.isLoading
6060
- }), /*#__PURE__*/React__default["default"].createElement(Components.StatBox, {
6061
- title: "".concat(featureTitle, " Comments"),
6062
- icon: freeSolidSvgIcons.faComment,
6063
- value: analyticsData.comments,
6064
- previousValue: analyticsData.prevComments,
6065
- prevText: prevText,
6066
- viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=Comment&countType=total&dayCount=").concat(dayCount).concat(chartSuffix),
6067
- isLoading: analyticsData.isLoading
6068
- }));
6069
- })()));
6019
+ }, /*#__PURE__*/React__default["default"].createElement(Components.StatBox, {
6020
+ title: "".concat(featureTitle, " Requests"),
6021
+ icon: freeSolidSvgIcons.faWrench,
6022
+ value: analyticsData.requests,
6023
+ previousValue: analyticsData.prevRequests,
6024
+ prevText: prevText,
6025
+ viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=Request&countType=total&dayCount=").concat(dayCount),
6026
+ isLoading: analyticsData.isLoading
6027
+ }), /*#__PURE__*/React__default["default"].createElement(Components.StatBox, {
6028
+ title: "Completed ".concat(featureTitle, " Requests"),
6029
+ icon: freeSolidSvgIcons.faCircleCheck,
6030
+ value: analyticsData.completedRequests,
6031
+ previousValue: analyticsData.prevCompletedRequests,
6032
+ prevText: prevText,
6033
+ viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=RequestCompleted&countType=unique&dayCount=").concat(dayCount),
6034
+ isLoading: analyticsData.isLoading
6035
+ }), /*#__PURE__*/React__default["default"].createElement(Components.StatBox, {
6036
+ title: "".concat(featureTitle, " Comments"),
6037
+ icon: freeSolidSvgIcons.faComment,
6038
+ value: analyticsData.comments,
6039
+ previousValue: analyticsData.prevComments,
6040
+ prevText: prevText,
6041
+ viewGraphLink: "/chart?entity=".concat(values.analyticsKey, "&startTime=").concat(startTime, "&endTime=").concat(endTime, "&key=Comment&countType=total&dayCount=").concat(dayCount),
6042
+ isLoading: analyticsData.isLoading
6043
+ })));
6070
6044
  };
6071
6045
  const mapStateToProps = state => {
6072
6046
  const {