@plusscommunities/pluss-maintenance-web 1.0.22 → 1.0.26-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs.js CHANGED
@@ -13,13 +13,13 @@ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
13
13
  var _regeneratorRuntime = require('@babel/runtime/regenerator');
14
14
  var React = require('react');
15
15
  var reactRedux = require('react-redux');
16
+ var reactRouter = require('react-router');
16
17
  var _ = require('lodash');
17
18
  var moment = require('moment');
18
19
  var FontAwesome = require('react-fontawesome');
19
20
  var PlussCore = require('@plusscommunities/pluss-core-web');
20
21
  var Cookies = require('js-cookie');
21
22
  var reactBootstrap = require('react-bootstrap');
22
- var reactRouter = require('react-router');
23
23
  var reactRouterDom = require('react-router-dom');
24
24
  var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
25
25
  var Textarea = require('react-textarea-autosize');
@@ -67,7 +67,7 @@ var Textarea__default = /*#__PURE__*/_interopDefaultLegacy(Textarea);
67
67
  // import * as PlussCore from '../../pluss-core/src';
68
68
  var FeatureConfig = {
69
69
  key: 'maintenance',
70
- aliases: ['maintenanceTracking', 'maintenanceTypes'],
70
+ aliases: ['maintenanceTracking', 'maintenanceTypes', 'maintenancerequest'],
71
71
  singularName: 'Request',
72
72
  description: 'Submit maintenance requests and track the progress.',
73
73
  emptyText: 'Your Requests will show here',
@@ -165,95 +165,10 @@ var FeatureConfig = {
165
165
  }
166
166
  };
167
167
 
168
- // export const SET_AUTH = 'set_auth';
169
- // export const LOGOUT = 'LOGOUT';
170
- // export const CHANGE_SITE = 'CHANGE_SITE';
171
- // export const UPDATE_PROFILE = 'UPDATE_PROFILE';
172
- // export const EVENTS_LOADED = 'events_loaded';
173
- // export const EVENTS_UPDATED = 'EVENTS_UPDATED';
174
- // export const EVENT_REMOVED = 'event_removed';
175
- // export const EVENTS_MANAGED_LOADED = 'EVENTS_MANAGED_LOADED';
176
- // export const AVAILABLE_EVENTS_LOADED = 'AVAILABLE_EVENTS_LOADED';
177
- // export const EVENT_SUBMISSIONS_LOADED = 'EVENT_SUBMISSIONS_LOADED';
178
- // export const EVENT_SUBMISSION_REMOVED = 'EVENT_SUBMISSION_REMOVED';
179
- // export const EVENTS_PURGE = 'events_purge';
180
- // export const EVENT_DASHBOARD_LOADING = 'EVENT_DASHBOARD_LOADING';
181
- // export const EVENT_SUBMISSIONS_DASHBOARD_LOADING = 'EVENT_SUBMISSIONS_DASHBOARD_LOADING';
182
- // export const FEEDBACK_LOADED = 'feedback_loaded';
183
- // export const FEEDBACK_REMOVED = 'feedback_removed';
184
- // export const POLLS_LOADED = 'polls_loaded';
185
- // export const POLL_REMOVED = 'poll_removed';
186
- // export const POLL_UPDATED = 'poll_updated';
187
- // export const DISHES_LOADED = 'DISHES_LOADED';
188
- // export const UPDATE_DISH = 'UPDATE_DISH';
189
- // export const DISH_REMOVED = 'DISH_REMOVED';
190
- // export const MENU_REMOVED = 'menu_removed';
191
- // export const NEWS_LOADED = 'NEWS_LOADED';
192
- // export const NEWS_UPDATED = 'NEWS_UPDATED';
193
- // export const NEWS_REMOVED = 'NEWS_REMOVED';
194
- // export const NEWS_SUBMISSIONS_LOADED = 'NEWS_SUBMISSIONS_LOADED';
195
- // export const NEWS_SUBMISSION_REMOVED = 'NEWS_SUBMISSION_REMOVED';
196
- // export const NEWS_PURGE = 'NEWS_PURGE';
197
- // export const NEWS_DASHBOARD_LOADING = 'NEWS_DASHBOARD_LOADING';
198
- // export const NEWS_SUBMISSIONS_DASHBOARD_LOADING = 'NEWS_SUBMISSIONS_DASHBOARD_LOADING';
199
- // export const TICKETS_LOADED = 'TICKETS_LOADED';
200
- // export const SET_LOCAL = 'SET_LOCAL';
201
- // export const ADD_RECENTLY_CREATED = 'ADD_RECENTLY_CREATED';
202
168
  var JOBS_LOADED = 'JOBS_LOADED';
203
169
  var JOBS_REMOVED = 'JOBS_REMOVED';
204
- var JOBS_TYPES_LOADED = 'JOBS_TYPES_LOADED'; // export const JOBS_TYPES_REMOVED = 'JOBS_TYPES_REMOVED';
205
- // export const JOBS_PURGE = 'JOBS_PURGE';
206
-
207
- var JOBS_LOADING = 'JOBS_LOADING'; // export const KEYS_LOADED = 'KEYS_LOADED';
208
- // export const KEY_REMOVED = 'KEY_REMOVED';
209
- // export const KEYS_PURGE = 'KEYS_PURGE';
210
- // export const USERS_LOADED = 'USERS_LOADED';
211
- // export const USER_REMOVED = 'USER_REMOVED';
212
- // export const USERS_PURGE = 'USERS_PURGE';
213
- // export const USERS_LOADING = 'USERS_LOADING';
214
- // export const USERS_RESIDENT_COUNT_SET = 'USERS_RESIDENT_COUNT_SET';
215
- // export const CONTACTS_LOADED = 'CONTACTS_LOADED';
216
- // export const CONTACT_REMOVED = 'CONTACT_REMOVED';
217
- // export const CONTACTS_PURGE = 'CONTACTS_PURGE';
218
- // export const MAPS_LOADED = 'MAPS_LOADED';
219
- // export const MAP_REMOVED = 'MAP_REMOVED';
220
- // export const MAPS_PURGE = 'MAPS_PURGE';
221
- // export const OFFERS_LOADED = 'OFFERS_LOADED';
222
- // export const OFFER_REMOVED = 'OFFER_REMOVED';
223
- // export const OFFERS_PURGE = 'OFFERS_PURGE';
224
- // export const INFOPAGES_LOADED = 'INFOPAGES_LOADED';
225
- // export const INFOPAGE_REMOVED = 'INFOPAGE_REMOVED';
226
- // export const INFOPAGES_PURGE = 'INFOPAGES_PURGE';
227
- // export const WELCOMEPAGES_LOADED = 'WELCOMEPAGES_LOADED';
228
- // export const WELCOMEPAGE_REMOVED = 'WELCOMEPAGE_REMOVED';
229
- // export const WELCOMEPAGES_PURGE = 'WELCOMEPAGES_PURGE';
230
- // export const SERVICE_REMOVED = 'SERVICE_REMOVED';
231
- // export const SERVICES_LOADED = 'SERVICES_LOADED';
232
- // export const SERVICES_UPDATED = 'SERVICES_UPDATED';
233
- // export const SERVICES_DASHBOARD_LOADING = 'SERVICES_DASHBOARD_LOADING';
234
- // export const ALERT_REMOVED = 'ALERT_REMOVED';
235
- // export const ALERTS_LOADED = 'ALERTS_LOADED';
236
- // export const ALERTS_UPDATED = 'ALERTS_UPDATED';
237
- // export const ALERTS_DASHBOARD_LOADING = 'ALERTS_DASHBOARD_LOADING';
238
- // export const IMAGE_LIBRARY_DASHBOARD_LOADING = 'IMAGE_LIBRARY_DASHBOARD_LOADING';
239
- // export const IMAGE_LIBRARY_LOADED = 'IMAGE_LIBRARY_LOADED';
240
- // export const IMAGE_FOLDER_UPDATED = 'IMAGE_FOLDER_UPDATED';
241
- // export const IMAGE_FOLDER_REMOVED = 'IMAGE_FOLDER_REMOVED';
242
- // export const FACILITIES_LOADING = 'FACILITIES_LOADING';
243
- // export const FACILITIES_LOADED = 'FACILITIES_LOADED';
244
- // export const FACILITY_REMOVED = 'FACILITY_REMOVED';
245
- // export const FACILITIES_PURGE = 'FACILITIES_PURGE';
246
- // export const SET_NAV_DATA = 'SET_NAV_DATA';
247
- // export const DEVICES_LOADED = 'DEVICES_LOADED';
248
- // export const DEVICE_REMOVED = 'DEVICE_REMOVED';
249
- // export const DEVICE_VIEWS_LOADED = 'DEVICE_VIEWS_LOADED';
250
- // export const DEVICES_PURGE = 'DEVICES_PURGE';
251
- // export const FORMS_LOADED = 'FORMS_LOADED';
252
- // export const FORM_REMOVED = 'FORM_REMOVED';
253
- // export const FORM_UPDATED = 'FORM_UPDATED';
254
- // export const FORM_SUBMISSIONS_LOADED = 'FORM_SUBMISSIONS_LOADED';
255
- // export const WHITE_LABEL_LOADED = 'WHITE_LABEL_LOADED';
256
- // export const WHITE_LABEL_PURGE = 'WHITE_LABEL_PURGE';
170
+ var JOBS_TYPES_LOADED = 'JOBS_TYPES_LOADED';
171
+ var JOBS_LOADING = 'JOBS_LOADING';
257
172
 
258
173
  function ownKeys$4(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
259
174
 
@@ -406,12 +321,14 @@ var maintenanceActions = {
406
321
  var Helper$3 = PlussCore__namespace.Helper,
407
322
  Session$5 = PlussCore__namespace.Session;
408
323
  var reactionActions = {
409
- addComment: function addComment(entityId, entityType, site, comment, image) {
324
+ addComment: function addComment(entityId, entityType, entityName, site, comment, image, parentId) {
410
325
  var data = {
411
326
  entityId: entityId,
412
327
  entityType: entityType,
328
+ entityName: entityName,
413
329
  site: site,
414
- comment: comment
330
+ comment: comment,
331
+ parentId: parentId
415
332
  };
416
333
 
417
334
  if (!___default['default'].isEmpty(image)) {
@@ -552,8 +469,7 @@ var StatusTypes = {
552
469
  function _createSuper$a(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$a(); return function _createSuperInternal() { var Super = _getPrototypeOf__default['default'](Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf__default['default'](this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn__default['default'](this, result); }; }
553
470
 
554
471
  function _isNativeReflectConstruct$a() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
555
- var Session$4 = PlussCore__namespace.Session,
556
- Components$4 = PlussCore__namespace.Components;
472
+ var Session$4 = PlussCore__namespace.Session;
557
473
 
558
474
  var JobList = /*#__PURE__*/function (_Component) {
559
475
  _inherits__default['default'](JobList, _Component);
@@ -661,10 +577,6 @@ var JobList = /*#__PURE__*/function (_Component) {
661
577
  };
662
578
  }());
663
579
 
664
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onOpenJobTypes", function () {
665
- _this.props.history.push('/requestTypes');
666
- });
667
-
668
580
  _this.state = {
669
581
  showCompleted: false,
670
582
  sortColumn: 'createdUnix',
@@ -804,27 +716,6 @@ var JobList = /*#__PURE__*/function (_Component) {
804
716
  }
805
717
  }, "Example might be; Fix my light bulb, hand rail is broken, or please send flowers to Mum."));
806
718
  }
807
- }, {
808
- key: "renderButtons",
809
- value: function renderButtons() {
810
- if (!Session$4.validateAccess(this.props.auth.site, 'maintenanceTypes', this.props.auth)) return null;
811
- return /*#__PURE__*/React__default['default'].createElement("div", {
812
- className: "flex-reverse"
813
- }, /*#__PURE__*/React__default['default'].createElement(Components$4.Button, {
814
- inline: true,
815
- buttonType: "primaryAction",
816
- onClick: this.onOpenJobTypes,
817
- isActive: true
818
- }, /*#__PURE__*/React__default['default'].createElement("div", {
819
- className: "flex flex-row flex-center"
820
- }, /*#__PURE__*/React__default['default'].createElement(Components$4.SVGIcon, {
821
- colour: '#fff',
822
- icon: "maintenance2",
823
- height: "17px"
824
- }), /*#__PURE__*/React__default['default'].createElement("div", {
825
- className: "marginLeft-10"
826
- }, "Request Types"))));
827
- }
828
719
  }, {
829
720
  key: "renderContent",
830
721
  value: function renderContent() {
@@ -896,7 +787,9 @@ var JobList = /*#__PURE__*/function (_Component) {
896
787
  style: {
897
788
  minWidth: '100%'
898
789
  }
899
- }, this.renderButtons(), this.renderContent());
790
+ }, this.renderContent(), /*#__PURE__*/React__default['default'].createElement("div", {
791
+ className: "hub_tidioPadding"
792
+ }));
900
793
  }
901
794
  }]);
902
795
 
@@ -920,1308 +813,1234 @@ var JobList$1 = reactRedux.connect(mapStateToProps$4, {
920
813
  function _createSuper$9(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$9(); return function _createSuperInternal() { var Super = _getPrototypeOf__default['default'](Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf__default['default'](this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn__default['default'](this, result); }; }
921
814
 
922
815
  function _isNativeReflectConstruct$9() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
923
- var Components$3 = PlussCore__namespace.Components,
924
- Session$3 = PlussCore__namespace.Session;
816
+ var Session$3 = PlussCore__namespace.Session,
817
+ Components$3 = PlussCore__namespace.Components,
818
+ Helper$2 = PlussCore__namespace.Helper;
925
819
 
926
- var RequestsHub = /*#__PURE__*/function (_Component) {
927
- _inherits__default['default'](RequestsHub, _Component);
820
+ var JobTypes = /*#__PURE__*/function (_Component) {
821
+ _inherits__default['default'](JobTypes, _Component);
928
822
 
929
- var _super = _createSuper$9(RequestsHub);
823
+ var _super = _createSuper$9(JobTypes);
930
824
 
931
- function RequestsHub(props) {
825
+ function JobTypes(props) {
932
826
  var _this;
933
827
 
934
- _classCallCheck__default['default'](this, RequestsHub);
828
+ _classCallCheck__default['default'](this, JobTypes);
935
829
 
936
830
  _this = _super.call(this, props);
937
831
 
938
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "setData", function () {
939
- var allList = [];
832
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "getJobTypes", /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee() {
833
+ var res;
834
+ return _regeneratorRuntime__default['default'].wrap(function _callee$(_context) {
835
+ while (1) {
836
+ switch (_context.prev = _context.next) {
837
+ case 0:
838
+ _context.prev = 0;
839
+ _context.next = 3;
840
+ return maintenanceActions.getJobTypes(_this.props.auth.site);
940
841
 
941
- _this.state.allList.forEach(function (ev) {
942
- if (ev != null && !ev.Deleted) allList.push(ev);
943
- });
842
+ case 3:
843
+ res = _context.sent;
844
+ if (res.data != null) _this.props.jobTypesLoaded(res.data);
845
+ _context.next = 10;
846
+ break;
944
847
 
945
- var upcoming = ___default['default'].filter(allList, function (ev) {
946
- if (!ev) return false;
947
- if (ev.status && ev.status === 'Completed') return false;
948
- return true;
949
- });
848
+ case 7:
849
+ _context.prev = 7;
850
+ _context.t0 = _context["catch"](0);
851
+ console.error('getJobTypes', _context.t0);
950
852
 
951
- var completed = ___default['default'].filter(allList, function (ev) {
952
- if (!ev) return false;
953
- if (ev.status && ev.status === 'Completed') return true;
954
- return false;
955
- }); // console.log('setData', upcoming, completed);
853
+ case 10:
854
+ _context.prev = 10;
956
855
 
856
+ _this.setState({
857
+ loading: false
858
+ });
957
859
 
958
- _this.setState({
959
- allList: allList,
960
- upcoming: upcoming,
961
- completed: completed
962
- });
860
+ return _context.finish(10);
861
+
862
+ case 13:
863
+ case "end":
864
+ return _context.stop();
865
+ }
866
+ }
867
+ }, _callee, null, [[0, 7, 10, 13]]);
868
+ })));
869
+
870
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "sortByCol", function (col) {
871
+ if (_this.state.sortColumn === col) {
872
+ _this.setState({
873
+ sortDesc: !_this.state.sortDesc
874
+ });
875
+ } else {
876
+ _this.setState({
877
+ sortColumn: col,
878
+ sortDesc: false
879
+ });
880
+ }
963
881
  });
964
882
 
965
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "getData", function () {
966
- var auth = _this.props.auth;
883
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "validateEmail", function () {
884
+ var jobTypeEmail = _this.state.jobTypeEmail;
885
+ return !___default['default'].isEmpty(jobTypeEmail) && Helper$2.isEmail(jobTypeEmail);
886
+ });
967
887
 
968
- _this.setState({
969
- loadingAll: true
970
- }, /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee() {
971
- var res;
972
- return _regeneratorRuntime__default['default'].wrap(function _callee$(_context) {
888
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "isJobTypeValid", function () {
889
+ var _this$state = _this.state,
890
+ jobTypeName = _this$state.jobTypeName,
891
+ jobTypeDescription = _this$state.jobTypeDescription;
892
+ if (___default['default'].isEmpty(jobTypeName)) return false;
893
+ if (!_this.validateEmail()) return false;
894
+ if (___default['default'].isEmpty(jobTypeDescription)) return false;
895
+ return true;
896
+ });
897
+
898
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onRemoveJobType", /*#__PURE__*/function () {
899
+ var _ref2 = _asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee2(ev) {
900
+ var index, newJobTypes;
901
+ return _regeneratorRuntime__default['default'].wrap(function _callee2$(_context2) {
973
902
  while (1) {
974
- switch (_context.prev = _context.next) {
903
+ switch (_context2.prev = _context2.next) {
975
904
  case 0:
976
- _context.prev = 0;
977
- _context.next = 3;
978
- return maintenanceActions.getJobs(auth.site);
905
+ if (window.confirm("Are you sure you want to delete ".concat(ev.typeName, "?"))) {
906
+ _context2.next = 2;
907
+ break;
908
+ }
979
909
 
980
- case 3:
981
- res = _context.sent;
910
+ return _context2.abrupt("return");
982
911
 
983
- // console.log('getData', res.data);
984
- _this.setState({
985
- loadingAll: false
912
+ case 2:
913
+ _context2.prev = 2;
914
+ _context2.next = 5;
915
+ return maintenanceActions.deleteJobType(_this.props.auth.site, ev.id);
916
+
917
+ case 5:
918
+ index = ___default['default'].findIndex(_this.state.jobList, function (job) {
919
+ return job != null && job.id === ev.id;
986
920
  });
987
921
 
988
- if (res.data != null && !___default['default'].isEmpty(res.data) && res.data[0].site === auth.site) {
989
- _this.props.jobsLoaded(res.data);
922
+ if (index > -1) {
923
+ newJobTypes = _toConsumableArray__default['default'](_this.state.jobList);
924
+ newJobTypes[index].Deleted = true;
925
+
926
+ _this.props.jobTypesLoaded(newJobTypes);
990
927
  }
991
928
 
992
- _context.next = 12;
929
+ _context2.next = 13;
993
930
  break;
994
931
 
995
- case 8:
996
- _context.prev = 8;
997
- _context.t0 = _context["catch"](0);
998
- console.error('getData', _context.t0);
999
-
1000
- _this.setState({
1001
- loadingAll: false
1002
- });
932
+ case 9:
933
+ _context2.prev = 9;
934
+ _context2.t0 = _context2["catch"](2);
935
+ console.error('onRemoveJobType', _context2.t0);
936
+ alert('Something went wrong with the request. Please try again.');
1003
937
 
1004
- case 12:
938
+ case 13:
1005
939
  case "end":
1006
- return _context.stop();
940
+ return _context2.stop();
1007
941
  }
1008
942
  }
1009
- }, _callee, null, [[0, 8]]);
1010
- })));
1011
- });
943
+ }, _callee2, null, [[2, 9]]);
944
+ }));
1012
945
 
1013
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onAddNew", function () {
1014
- var auth = _this.props.auth;
946
+ return function (_x) {
947
+ return _ref2.apply(this, arguments);
948
+ };
949
+ }());
1015
950
 
1016
- if (Session$3.validateAccess(auth.site, 'maintenanceTracking', auth)) {
1017
- _this.props.history.push("/requestsHub/job");
1018
- }
1019
- });
951
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onShowJobType", function () {
952
+ var job = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
1020
953
 
1021
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "canAddNew", function (isClass) {
1022
- var auth = _this.props.auth;
1023
- if (Session$3.validateAccess(auth.site, 'maintenanceTracking', auth)) return isClass ? '' : true;
1024
- return isClass ? ' hub-sideContent-topButton--hide' : false;
954
+ _this.setState({
955
+ showJobType: true,
956
+ jobTypeId: job ? job.id : null,
957
+ jobTypeName: job ? job.typeName : '',
958
+ jobTypeEmail: job ? job.email : '',
959
+ jobTypeDescription: job ? job.description : '',
960
+ jobTypeLevel: job ? job.level : 1
961
+ });
1025
962
  });
1026
963
 
1027
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "getSideBarSectionColour", function (id) {
1028
- return _this.state.selectedSection === id ? {
1029
- backgroundColor: '#fff'
1030
- } : {};
1031
- });
964
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onHideJobType", function () {
965
+ if (_this.state.submitting) return;
1032
966
 
1033
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "renderStats", function (stat, loading) {
1034
- return loading ? /*#__PURE__*/React__default['default'].createElement(FontAwesome__default['default'], {
1035
- style: styles$4.spinner,
1036
- name: "spinner fa-pulse fa-fw"
1037
- }) : stat;
967
+ _this.setState({
968
+ showWarnings: false,
969
+ showJobType: false,
970
+ jobTypeId: null,
971
+ jobTypeName: '',
972
+ jobTypeEmail: '',
973
+ jobTypeDescription: '',
974
+ jobTypeLevel: 1
975
+ });
1038
976
  });
1039
977
 
1040
- _this.state = {
1041
- selectedSection: 'upcoming',
1042
- location: '',
1043
- loadingAll: false,
1044
- loadingSubmissions: false,
1045
- submissionEntries: [],
1046
- allList: [],
1047
- completed: [],
1048
- upcoming: [],
1049
- now: moment__default['default'].utc(),
1050
- onlyFuture: true,
1051
- search: ''
1052
- };
1053
- return _this;
1054
- }
978
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onHandleChange", function (event) {
979
+ var stateChange = {};
980
+ stateChange[event.target.getAttribute('id')] = event.target.value;
1055
981
 
1056
- _createClass__default['default'](RequestsHub, [{
1057
- key: "UNSAFE_componentWillMount",
1058
- value: function UNSAFE_componentWillMount() {
1059
- this.updateProps(this.props);
1060
- }
1061
- }, {
1062
- key: "componentDidMount",
1063
- value: function componentDidMount() {
1064
- this.getData();
1065
- }
1066
- }, {
1067
- key: "UNSAFE_componentWillReceiveProps",
1068
- value: function UNSAFE_componentWillReceiveProps(nextProps) {
1069
- if (!___default['default'].isEqual(this.props.jobs, nextProps.jobs)) this.updateProps(nextProps);
1070
- }
1071
- }, {
1072
- key: "updateProps",
1073
- value: function updateProps(props) {
1074
- this.setState({
1075
- allList: props.jobs
1076
- }, this.setData);
1077
- }
1078
- }, {
1079
- key: "renderLeftBar",
1080
- value: function renderLeftBar() {
1081
- var _this2 = this;
982
+ _this.setState(stateChange);
983
+ });
1082
984
 
1083
- return /*#__PURE__*/React__default['default'].createElement("div", {
1084
- className: "hub-sideContent"
1085
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1086
- className: "hub-sideContent-topButton"
1087
- }), /*#__PURE__*/React__default['default'].createElement("div", {
1088
- style: {
1089
- paddingLeft: 15,
1090
- width: '100%'
1091
- }
1092
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1093
- className: "fontMedium fontSize-32 text-dark",
1094
- style: styles$4.sideBarTitleSection
1095
- }, "Maintenance requests"), /*#__PURE__*/React__default['default'].createElement("div", {
1096
- onClick: function onClick() {
1097
- _this2.setState({
1098
- selectedSection: 'completed'
1099
- });
1100
- },
1101
- className: "sideBarSection",
1102
- style: this.getSideBarSectionColour('completed')
1103
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1104
- className: "fontMedium fontSize-36 text-dark",
1105
- style: {
1106
- lineHeight: '50px'
1107
- }
1108
- }, this.renderStats(this.state.completed.length, this.state.loadingAll)), /*#__PURE__*/React__default['default'].createElement("div", {
1109
- className: "fontRegular fontSize-16 text-light lineHeight-22"
1110
- }, "Complete")), /*#__PURE__*/React__default['default'].createElement("div", {
1111
- onClick: function onClick() {
1112
- _this2.setState({
1113
- selectedSection: 'upcoming'
1114
- });
1115
- },
1116
- className: "sideBarSection",
1117
- style: this.getSideBarSectionColour('upcoming')
1118
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1119
- className: "fontMedium fontSize-36 text-dark",
1120
- style: {
1121
- lineHeight: '50px'
1122
- }
1123
- }, this.renderStats(this.state.upcoming.length, this.state.loadingAll)), /*#__PURE__*/React__default['default'].createElement("div", {
1124
- className: "fontRegular fontSize-16 text-light lineHeight-22"
1125
- }, "Incomplete"))));
1126
- }
1127
- }, {
1128
- key: "renderRight",
1129
- value: function renderRight() {
1130
- return /*#__PURE__*/React__default['default'].createElement(JobList$1, {
1131
- source: this.state.selectedSection === 'completed' ? this.state.completed : this.state.upcoming
1132
- });
1133
- }
1134
- }, {
1135
- key: "render",
1136
- value: function render() {
1137
- return /*#__PURE__*/React__default['default'].createElement("div", {
1138
- className: "hub-wrapperContainer"
1139
- }, this.renderLeftBar(), /*#__PURE__*/React__default['default'].createElement("div", {
1140
- className: "hub-headerContentWrapper"
1141
- }, /*#__PURE__*/React__default['default'].createElement(Components$3.Header, null, this.canAddNew() && /*#__PURE__*/React__default['default'].createElement(Components$3.AddButton, {
1142
- onClick: this.onAddNew,
1143
- text: "NEW REQUEST"
1144
- })), /*#__PURE__*/React__default['default'].createElement("div", {
1145
- className: "hub-contentWrapper"
1146
- }, this.renderRight())));
1147
- }
1148
- }]);
1149
-
1150
- return RequestsHub;
1151
- }(React.Component);
1152
-
1153
- var styles$4 = {
1154
- sideBarTitleSection: {
1155
- lineHeight: '40px',
1156
- marginTop: 30,
1157
- marginBottom: 30,
1158
- paddingLeft: 24,
1159
- paddingRight: 24
1160
- },
1161
- sideBarSection: {
1162
- weight: '100%',
1163
- minWidth: 200,
1164
- padding: 32,
1165
- paddingLeft: 24,
1166
- cursor: 'pointer',
1167
- display: 'flex',
1168
- flexDirection: 'column',
1169
- justifyContent: 'center'
1170
- },
1171
- spinner: {
1172
- fontSize: 32,
1173
- color: FeatureConfig.env.colourBrandingOff
1174
- }
1175
- };
1176
-
1177
- var mapStateToProps$3 = function mapStateToProps(state) {
1178
- var jobs = state.maintenance.jobs;
1179
- var auth = state.auth;
1180
- return {
1181
- jobs: jobs,
1182
- auth: auth
1183
- };
1184
- };
1185
-
1186
- var RequestsHub$1 = reactRedux.connect(mapStateToProps$3, {
1187
- jobsLoaded: jobsLoaded
1188
- })(RequestsHub);
1189
-
1190
- function ownKeys$3(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
1191
-
1192
- function _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$3(Object(source), true).forEach(function (key) { _defineProperty__default['default'](target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$3(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
1193
-
1194
- function _createSuper$8(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$8(); return function _createSuperInternal() { var Super = _getPrototypeOf__default['default'](Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf__default['default'](this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn__default['default'](this, result); }; }
985
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onSave", function () {
986
+ var site = _this.props.auth.site;
987
+ var _this$state2 = _this.state,
988
+ submitting = _this$state2.submitting,
989
+ jobTypeId = _this$state2.jobTypeId,
990
+ jobTypeName = _this$state2.jobTypeName,
991
+ jobTypeEmail = _this$state2.jobTypeEmail,
992
+ jobTypeDescription = _this$state2.jobTypeDescription,
993
+ jobTypeLevel = _this$state2.jobTypeLevel;
994
+ if (submitting) return;
1195
995
 
1196
- function _isNativeReflectConstruct$8() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
1197
- var Apis = PlussCore__namespace.Apis,
1198
- Helper$2 = PlussCore__namespace.Helper,
1199
- Session$2 = PlussCore__namespace.Session,
1200
- Colours = PlussCore__namespace.Colours,
1201
- Components$2 = PlussCore__namespace.Components;
996
+ if (!_this.isJobTypeValid()) {
997
+ _this.setState({
998
+ showWarnings: true
999
+ });
1202
1000
 
1203
- var Job = /*#__PURE__*/function (_Component) {
1204
- _inherits__default['default'](Job, _Component);
1001
+ return;
1002
+ }
1205
1003
 
1206
- var _super = _createSuper$8(Job);
1004
+ _this.setState({
1005
+ submitting: true
1006
+ }, /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee3() {
1007
+ return _regeneratorRuntime__default['default'].wrap(function _callee3$(_context3) {
1008
+ while (1) {
1009
+ switch (_context3.prev = _context3.next) {
1010
+ case 0:
1011
+ _context3.prev = 0;
1207
1012
 
1208
- function Job(props) {
1209
- var _this;
1013
+ if (!jobTypeId) {
1014
+ _context3.next = 6;
1015
+ break;
1016
+ }
1210
1017
 
1211
- _classCallCheck__default['default'](this, Job);
1018
+ _context3.next = 4;
1019
+ return maintenanceActions.editJobType(site, jobTypeId, jobTypeName, jobTypeEmail, jobTypeDescription, jobTypeLevel);
1212
1020
 
1213
- _this = _super.call(this, props);
1021
+ case 4:
1022
+ _context3.next = 8;
1023
+ break;
1214
1024
 
1215
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "getJob", /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee() {
1216
- var res;
1217
- return _regeneratorRuntime__default['default'].wrap(function _callee$(_context) {
1218
- while (1) {
1219
- switch (_context.prev = _context.next) {
1220
- case 0:
1221
- _context.prev = 0;
1222
- _context.next = 3;
1223
- return maintenanceActions.getJob(_this.props.auth.site, _this.state.jobId);
1025
+ case 6:
1026
+ _context3.next = 8;
1027
+ return maintenanceActions.addJobType(site, jobTypeName, jobTypeEmail, jobTypeDescription, jobTypeLevel);
1224
1028
 
1225
- case 3:
1226
- res = _context.sent;
1029
+ case 8:
1030
+ _this.props.jobTypesUpdate(site);
1227
1031
 
1228
- _this.setState({
1229
- updating: false
1230
- });
1032
+ _this.setState({
1033
+ submitting: false
1034
+ }, _this.onHideJobType);
1231
1035
 
1232
- res.data.location = res.data.site;
1036
+ _context3.next = 17;
1037
+ break;
1233
1038
 
1234
- _this.setJob(res.data);
1039
+ case 12:
1040
+ _context3.prev = 12;
1041
+ _context3.t0 = _context3["catch"](0);
1042
+ console.error('onSave', _context3.t0);
1235
1043
 
1236
- _context.next = 12;
1237
- break;
1044
+ _this.setState({
1045
+ submitting: false
1046
+ });
1238
1047
 
1239
- case 9:
1240
- _context.prev = 9;
1241
- _context.t0 = _context["catch"](0);
1242
- console.error('getJob', _context.t0);
1048
+ alert('Something went wrong with the request. Please try again.');
1243
1049
 
1244
- case 12:
1245
- case "end":
1246
- return _context.stop();
1050
+ case 17:
1051
+ case "end":
1052
+ return _context3.stop();
1053
+ }
1247
1054
  }
1248
- }
1249
- }, _callee, null, [[0, 9]]);
1250
- })));
1251
-
1252
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "setJob", function (job) {
1253
- job.typeIcon = job.type === 'General' ? 'wrench' : 'tree';
1254
- job.typeColour = job.type === 'General' ? '#666' : 'green';
1255
-
1256
- if (___default['default'].isEmpty(job.lastActivity)) {
1257
- job.lastActivity = '-- --';
1258
- job.noActivity = true;
1259
- }
1260
-
1261
- if (___default['default'].isEmpty(job.status)) {
1262
- job.status = 'Unassigned';
1263
- job.notStatus = true;
1264
- }
1265
-
1266
- if (___default['default'].isEmpty(job.audience)) {
1267
- job.audience = [{
1268
- displayName: 'Unassigned',
1269
- isEmpty: true
1270
- }];
1271
- }
1272
-
1273
- var needToMarkSeen = false;
1055
+ }, _callee3, null, [[0, 12]]);
1056
+ })));
1057
+ });
1274
1058
 
1275
- if (!job.seen) {
1276
- job.seen = true;
1277
- needToMarkSeen = true;
1278
- }
1059
+ _this.state = {
1060
+ jobList: [],
1061
+ showCompleted: false,
1062
+ sortColumn: 'name',
1063
+ sortDesc: false,
1064
+ loading: true,
1065
+ showJobType: false,
1066
+ jobTypeId: null,
1067
+ jobTypeName: '',
1068
+ jobTypeEmail: '',
1069
+ jobTypeDescription: '',
1070
+ jobTypeLevel: 1,
1071
+ showWarnings: false,
1072
+ submitting: false
1073
+ };
1074
+ return _this;
1075
+ }
1279
1076
 
1280
- _this.setState({
1281
- job: job
1282
- }, function () {
1283
- if (needToMarkSeen) _this.markSeen();
1077
+ _createClass__default['default'](JobTypes, [{
1078
+ key: "componentWillMount",
1079
+ value: function componentWillMount() {
1080
+ this.updateProps(this.props);
1081
+ Session$3.checkLoggedIn(this, this.props.auth);
1082
+ }
1083
+ }, {
1084
+ key: "componentDidMount",
1085
+ value: function componentDidMount() {
1086
+ this.getJobTypes();
1087
+ }
1088
+ }, {
1089
+ key: "componentWillReceiveProps",
1090
+ value: function componentWillReceiveProps(nextProps) {
1091
+ this.updateProps(nextProps);
1092
+ }
1093
+ }, {
1094
+ key: "updateProps",
1095
+ value: function updateProps(props) {
1096
+ this.setState({
1097
+ jobList: props.jobtypes
1284
1098
  });
1099
+ }
1100
+ }, {
1101
+ key: "renderList",
1102
+ value: function renderList() {
1103
+ var _this2 = this;
1285
1104
 
1286
- _this.props.jobsLoaded([job]);
1287
- });
1288
-
1289
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "editJob", function () {});
1105
+ var source = ___default['default'].sortBy(this.state.jobList, this.state.sortColumn);
1290
1106
 
1291
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "isReadyToSaveNote", function () {
1292
- var _this$state = _this.state,
1293
- noteAttachments = _this$state.noteAttachments,
1294
- noteInput = _this$state.noteInput;
1295
- if (___default['default'].some(noteAttachments, function (n) {
1296
- return n.Uploading;
1297
- })) return false;
1298
- return !___default['default'].isEmpty(noteInput) || !___default['default'].isEmpty(noteAttachments);
1299
- });
1300
-
1301
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onOpenAddNote", function () {
1302
- _this.setState({
1303
- addNoteOpen: true,
1304
- editingNote: null
1305
- });
1306
- });
1307
-
1308
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onCloseAddNote", function () {
1309
- var newState = {
1310
- addNoteOpen: false,
1311
- editingNote: null
1312
- };
1313
-
1314
- if (!!_this.state.editingNote) {
1315
- newState.noteInput = '';
1316
- newState.noteAttachments = [];
1317
- }
1318
-
1319
- _this.setState(newState);
1320
- });
1321
-
1322
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onOpenNoteMenu", function (index) {
1323
- if (_this.state.noteMenuOpen === index) {
1324
- _this.setState({
1325
- noteMenuOpen: null
1326
- });
1327
- } else {
1328
- _this.setState({
1329
- noteMenuOpen: index
1330
- });
1331
- }
1332
- });
1333
-
1334
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onHandlePDFFileChange", function (event) {
1335
- var file = event.target.files[0];
1336
- if (!file || _this.state.uploadingNoteAttachment) return;
1337
-
1338
- var noteAttachments = _toConsumableArray__default['default'](_this.state.noteAttachments);
1339
-
1340
- var newAttachment = {
1341
- Uploading: true,
1342
- Title: file.name
1343
- };
1344
- noteAttachments.push(newAttachment);
1345
-
1346
- _this.setState({
1347
- noteAttachments: noteAttachments
1107
+ if (this.state.sortDesc) source.reverse();
1108
+ source = ___default['default'].filter(source, function (ev) {
1109
+ if (!ev) return false;
1110
+ if (ev.Deleted) return false;
1111
+ return true;
1348
1112
  });
1113
+ return source.map(function (ev, index) {
1114
+ if (ev != null) {
1115
+ return /*#__PURE__*/React__default['default'].createElement("tr", {
1116
+ key: index
1117
+ }, /*#__PURE__*/React__default['default'].createElement("td", {
1118
+ className: "table-TitleColumn"
1119
+ }, /*#__PURE__*/React__default['default'].createElement("a", {
1120
+ onClick: function onClick() {
1121
+ return _this2.onShowJobType(ev);
1122
+ }
1123
+ }, ev.typeName)), /*#__PURE__*/React__default['default'].createElement("td", null, ev.description), /*#__PURE__*/React__default['default'].createElement("td", null, ev.email), /*#__PURE__*/React__default['default'].createElement("td", {
1124
+ className: "table-options"
1125
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
1126
+ style: {
1127
+ display: 'flex',
1128
+ alignItems: 'center'
1129
+ }
1130
+ }, Session$3.validateAccess(_this2.props.auth.site, 'maintenanceTypes', _this2.props.auth) && /*#__PURE__*/React__default['default'].createElement("a", {
1131
+ onClick: function onClick() {
1132
+ return _this2.onShowJobType(ev);
1133
+ }
1134
+ }, /*#__PURE__*/React__default['default'].createElement(FontAwesome__default['default'], {
1135
+ style: {
1136
+ fontSize: 20,
1137
+ padding: 5,
1138
+ marginLeft: 12,
1139
+ cursor: 'pointer'
1140
+ },
1141
+ name: "pencil"
1142
+ })), Session$3.validateAccess(_this2.props.auth.site, 'maintenanceTypes', _this2.props.auth) && /*#__PURE__*/React__default['default'].createElement("a", {
1143
+ onClick: function onClick() {
1144
+ return _this2.onRemoveJobType(ev);
1145
+ }
1146
+ }, /*#__PURE__*/React__default['default'].createElement(FontAwesome__default['default'], {
1147
+ style: {
1148
+ fontSize: 20,
1149
+ padding: 5,
1150
+ marginLeft: 8,
1151
+ cursor: 'pointer'
1152
+ },
1153
+ name: "minus-circle"
1154
+ })))));
1155
+ }
1349
1156
 
1350
- Apis.fileActions.uploadMediaAsync(file, file.name).then(function (fileRes) {
1351
- newAttachment.Source = fileRes;
1352
- newAttachment.Uploading = false;
1353
-
1354
- _this.setState({
1355
- noteAttachments: _toConsumableArray__default['default'](_this.state.noteAttachments)
1356
- });
1357
- }).catch(function (uploadErrorRes) {
1358
- console.log(uploadErrorRes);
1359
- newAttachment.Uploading = false;
1360
-
1361
- _this.setState({
1362
- noteAttachments: _toConsumableArray__default['default'](_this.state.noteAttachments)
1363
- });
1157
+ return null;
1364
1158
  });
1365
- event.target.value = '';
1366
- });
1367
-
1368
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onRemoveAttachment", function (a) {
1369
- var index = _this.state.noteAttachments.indexOf(a);
1159
+ }
1160
+ }, {
1161
+ key: "renderView",
1162
+ value: function renderView() {
1163
+ var _this3 = this;
1370
1164
 
1371
- if (index > -1) {
1372
- var newAttachments = _toConsumableArray__default['default'](_this.state.noteAttachments);
1165
+ return /*#__PURE__*/React__default['default'].createElement(reactBootstrap.Table, {
1166
+ className: "plussTable",
1167
+ striped: true,
1168
+ bordered: true,
1169
+ condensed: true,
1170
+ hover: true,
1171
+ style: {
1172
+ minWidth: '100%'
1173
+ }
1174
+ }, /*#__PURE__*/React__default['default'].createElement("thead", null, /*#__PURE__*/React__default['default'].createElement("tr", null, /*#__PURE__*/React__default['default'].createElement("th", {
1175
+ style: {
1176
+ cursor: 'pointer'
1177
+ },
1178
+ onClick: function onClick() {
1179
+ return _this3.sortByCol('name');
1180
+ }
1181
+ }, "Request type"), /*#__PURE__*/React__default['default'].createElement("th", {
1182
+ style: {
1183
+ cursor: 'pointer'
1184
+ },
1185
+ onClick: function onClick() {
1186
+ return _this3.sortByCol('name');
1187
+ }
1188
+ }, "Type Description"), /*#__PURE__*/React__default['default'].createElement("th", {
1189
+ style: {
1190
+ cursor: 'pointer'
1191
+ },
1192
+ onClick: function onClick() {
1193
+ return _this3.sortByCol('email');
1194
+ }
1195
+ }, "Email"), /*#__PURE__*/React__default['default'].createElement("th", {
1196
+ style: {
1197
+ width: 70
1198
+ }
1199
+ }))), /*#__PURE__*/React__default['default'].createElement("tbody", null, this.renderList()));
1200
+ }
1201
+ }, {
1202
+ key: "renderEmpty",
1203
+ value: function renderEmpty() {
1204
+ return /*#__PURE__*/React__default['default'].createElement("div", {
1205
+ style: {
1206
+ display: 'flex',
1207
+ flexDirection: 'column',
1208
+ flex: 1,
1209
+ justifyContent: 'center',
1210
+ alignItems: 'center',
1211
+ marginTop: 32
1212
+ }
1213
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
1214
+ className: "emptyState"
1215
+ }), /*#__PURE__*/React__default['default'].createElement("div", {
1216
+ className: "marginTop-32",
1217
+ style: {
1218
+ maxWidth: 500,
1219
+ textAlign: 'center'
1220
+ }
1221
+ }, /*#__PURE__*/React__default['default'].createElement("span", {
1222
+ className: "fontRegular fontSize-13"
1223
+ }, "Please add the many categories of request types that exist in your village which work alongside the Maintenance area.")), /*#__PURE__*/React__default['default'].createElement("div", {
1224
+ className: "marginTop-8 fontRegular fontSize-13",
1225
+ style: {
1226
+ maxWidth: 500,
1227
+ textAlign: 'center'
1228
+ }
1229
+ }, "Examples might be; OH&S, Electrical, General. Remember to add a description too."));
1230
+ }
1231
+ }, {
1232
+ key: "renderContent",
1233
+ value: function renderContent() {
1234
+ if (___default['default'].isEmpty(this.state.jobList)) return this.renderEmpty();
1235
+ return this.renderView();
1236
+ }
1237
+ }, {
1238
+ key: "renderJobTypes",
1239
+ value: function renderJobTypes() {
1240
+ var _this4 = this;
1373
1241
 
1374
- newAttachments.splice(index, 1);
1242
+ var _this$state3 = this.state,
1243
+ jobList = _this$state3.jobList,
1244
+ loading = _this$state3.loading;
1375
1245
 
1376
- _this.setState({
1377
- noteAttachments: newAttachments
1378
- });
1246
+ if (jobList.length === 0 && loading) {
1247
+ return /*#__PURE__*/React__default['default'].createElement("div", {
1248
+ style: {
1249
+ minWidth: '100%'
1250
+ }
1251
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
1252
+ className: "padding-60 paddingVertical-40",
1253
+ style: {
1254
+ textAlign: 'center'
1255
+ }
1256
+ }, /*#__PURE__*/React__default['default'].createElement(FontAwesome__default['default'], {
1257
+ style: {
1258
+ fontSize: 30,
1259
+ color: FeatureConfig.env.colourBrandingOff
1260
+ },
1261
+ name: "spinner fa-pulse fa-fw"
1262
+ })));
1379
1263
  }
1380
- });
1381
-
1382
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onConfirmAddNote", /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee2() {
1383
- var res;
1384
- return _regeneratorRuntime__default['default'].wrap(function _callee2$(_context2) {
1385
- while (1) {
1386
- switch (_context2.prev = _context2.next) {
1387
- case 0:
1388
- if (_this.isReadyToSaveNote()) {
1389
- _context2.next = 2;
1390
- break;
1391
- }
1392
-
1393
- return _context2.abrupt("return");
1394
1264
 
1395
- case 2:
1396
- _context2.prev = 2;
1265
+ return /*#__PURE__*/React__default['default'].createElement("div", {
1266
+ style: {
1267
+ minWidth: '100%'
1268
+ }
1269
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
1270
+ className: "marginBottom-32"
1271
+ }, /*#__PURE__*/React__default['default'].createElement(Components$3.AddButton, {
1272
+ onClick: function onClick() {
1273
+ return _this4.onShowJobType();
1274
+ },
1275
+ text: "NEW REQUEST TYPE"
1276
+ })), this.renderContent());
1277
+ }
1278
+ }, {
1279
+ key: "renderNewUserTypePopup",
1280
+ value: function renderNewUserTypePopup() {
1281
+ var _this5 = this;
1397
1282
 
1398
- _this.setState({
1399
- submittingNote: true
1400
- });
1283
+ var _this$state4 = this.state,
1284
+ submitting = _this$state4.submitting,
1285
+ showJobType = _this$state4.showJobType,
1286
+ jobTypeId = _this$state4.jobTypeId,
1287
+ showWarnings = _this$state4.showWarnings,
1288
+ jobTypeName = _this$state4.jobTypeName,
1289
+ jobTypeEmail = _this$state4.jobTypeEmail,
1290
+ jobTypeDescription = _this$state4.jobTypeDescription;
1291
+ if (!showJobType) return null;
1292
+ return /*#__PURE__*/React__default['default'].createElement(Components$3.Popup, {
1293
+ maxWidth: 800,
1294
+ hasPadding: true,
1295
+ buttons: [{
1296
+ type: 'primaryAction',
1297
+ onClick: this.onSave,
1298
+ isActive: !submitting && this.isJobTypeValid(),
1299
+ text: submitting ? 'Saving...' : 'Save',
1300
+ className: 'popupButton'
1301
+ }, {
1302
+ type: 'outlinedAction',
1303
+ onClick: this.onHideJobType,
1304
+ isActive: !submitting,
1305
+ text: 'Cancel',
1306
+ className: 'popupButton'
1307
+ }],
1308
+ onClose: this.onHideJobType,
1309
+ title: jobTypeId ? 'Edit Request Type' : 'Create New Request Type'
1310
+ }, /*#__PURE__*/React__default['default'].createElement(Components$3.GenericInput, {
1311
+ id: "jobTypeName",
1312
+ type: "text",
1313
+ label: "Request type title",
1314
+ placeholder: "Request type title",
1315
+ value: jobTypeName,
1316
+ onChange: this.onHandleChange,
1317
+ isRequired: true,
1318
+ isValid: function isValid() {
1319
+ return !___default['default'].isEmpty(jobTypeName);
1320
+ },
1321
+ showError: function showError() {
1322
+ return showWarnings && ___default['default'].isEmpty(jobTypeName);
1323
+ },
1324
+ alwaysShowLabel: true
1325
+ }), /*#__PURE__*/React__default['default'].createElement(Components$3.GenericInput, {
1326
+ id: "jobTypeEmail",
1327
+ type: "text",
1328
+ label: "Email",
1329
+ placeholder: "Request email",
1330
+ help: "This is the email address that'll receive service requests of this type",
1331
+ value: jobTypeEmail,
1332
+ onChange: this.onHandleChange,
1333
+ isRequired: true,
1334
+ isValid: this.validateEmail,
1335
+ showError: function showError() {
1336
+ return showWarnings && !_this5.validateEmail();
1337
+ },
1338
+ alwaysShowLabel: true
1339
+ }), /*#__PURE__*/React__default['default'].createElement(Components$3.GenericInput, {
1340
+ id: "jobTypeDescription",
1341
+ type: "text",
1342
+ label: "Description",
1343
+ placeholder: "Add a description. ",
1344
+ help: "This description will be visible to the people to help them select the correct request type.",
1345
+ value: jobTypeDescription,
1346
+ onChange: this.onHandleChange,
1347
+ isRequired: true,
1348
+ isValid: function isValid() {
1349
+ return !___default['default'].isEmpty(jobTypeDescription);
1350
+ },
1351
+ showError: function showError() {
1352
+ return showWarnings && ___default['default'].isEmpty(jobTypeDescription);
1353
+ },
1354
+ alwaysShowLabel: true
1355
+ }));
1356
+ }
1357
+ }, {
1358
+ key: "render",
1359
+ value: function render() {
1360
+ return /*#__PURE__*/React__default['default'].createElement("div", {
1361
+ style: {
1362
+ minWidth: '100%'
1363
+ }
1364
+ }, /*#__PURE__*/React__default['default'].createElement("div", null, this.renderJobTypes()), this.renderNewUserTypePopup(), /*#__PURE__*/React__default['default'].createElement("div", {
1365
+ className: "hub_tidioPadding"
1366
+ }));
1367
+ }
1368
+ }]);
1401
1369
 
1402
- _context2.next = 6;
1403
- return _this.state.editingNote ? maintenanceActions.editNote(_this.state.jobId, _this.state.editingNote, _this.state.noteInput, _this.state.noteAttachments.map(function (a) {
1404
- return {
1405
- Title: a.Title,
1406
- Source: a.Source
1407
- };
1408
- })) : maintenanceActions.addNote(_this.state.jobId, _this.state.noteInput, _this.state.noteAttachments.map(function (a) {
1409
- return {
1410
- Title: a.Title,
1411
- Source: a.Source
1412
- };
1413
- }));
1370
+ return JobTypes;
1371
+ }(React.Component);
1414
1372
 
1415
- case 6:
1416
- res = _context2.sent;
1373
+ var mapStateToProps$3 = function mapStateToProps(state) {
1374
+ var jobtypes = state.maintenance.jobtypes;
1375
+ var auth = state.auth;
1376
+ return {
1377
+ jobtypes: jobtypes,
1378
+ auth: auth
1379
+ };
1380
+ };
1417
1381
 
1418
- _this.setState({
1419
- job: res.data.job,
1420
- submittingNote: false,
1421
- addNoteOpen: false,
1422
- noteInput: '',
1423
- noteAttachments: [],
1424
- editingNote: null
1425
- }, function () {
1426
- _this.props.jobsLoaded([_this.state.job]);
1427
- });
1382
+ var JobTypes$1 = reactRedux.connect(mapStateToProps$3, {
1383
+ jobTypesLoaded: jobTypesLoaded,
1384
+ jobTypesUpdate: jobTypesUpdate
1385
+ })(reactRouter.withRouter(JobTypes));
1428
1386
 
1429
- _context2.next = 13;
1430
- break;
1387
+ function _createSuper$8(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$8(); return function _createSuperInternal() { var Super = _getPrototypeOf__default['default'](Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf__default['default'](this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn__default['default'](this, result); }; }
1431
1388
 
1432
- case 10:
1433
- _context2.prev = 10;
1434
- _context2.t0 = _context2["catch"](2);
1435
- console.error('onConfirmAddNote', _context2.t0);
1389
+ function _isNativeReflectConstruct$8() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
1390
+ var Components$2 = PlussCore__namespace.Components,
1391
+ Session$2 = PlussCore__namespace.Session;
1436
1392
 
1437
- case 13:
1438
- case "end":
1439
- return _context2.stop();
1440
- }
1441
- }
1442
- }, _callee2, null, [[2, 10]]);
1443
- })));
1393
+ var RequestsHub = /*#__PURE__*/function (_Component) {
1394
+ _inherits__default['default'](RequestsHub, _Component);
1444
1395
 
1445
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onDeleteNote", function (n) {
1446
- if (!window.confirm('Are you sure you want to delete that note?')) {
1447
- _this.setState({
1448
- noteMenuOpen: null
1449
- });
1396
+ var _super = _createSuper$8(RequestsHub);
1450
1397
 
1451
- return;
1452
- }
1398
+ function RequestsHub(props) {
1399
+ var _this;
1453
1400
 
1454
- maintenanceActions.deleteNote(_this.state.jobId, n.Id);
1401
+ _classCallCheck__default['default'](this, RequestsHub);
1455
1402
 
1456
- var newNotes = ___default['default'].filter(_this.state.job.Notes, function (note) {
1457
- return note.Id !== n.Id;
1458
- });
1403
+ _this = _super.call(this, props);
1459
1404
 
1460
- var newJob = _objectSpread$3({}, _this.state.job);
1405
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "setData", function () {
1406
+ var allList = [];
1461
1407
 
1462
- newJob.Notes = newNotes;
1408
+ _this.state.allList.forEach(function (ev) {
1409
+ if (ev != null && !ev.Deleted) allList.push(ev);
1410
+ });
1463
1411
 
1464
- _this.setState({
1465
- job: newJob,
1466
- noteMenuOpen: null
1412
+ var upcoming = ___default['default'].filter(allList, function (ev) {
1413
+ if (!ev) return false;
1414
+ if (ev.status && ev.status === 'Completed') return false;
1415
+ return true;
1467
1416
  });
1468
- });
1469
1417
 
1470
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onOpenEditNote", function (n) {
1418
+ var completed = ___default['default'].filter(allList, function (ev) {
1419
+ if (!ev) return false;
1420
+ if (ev.status && ev.status === 'Completed') return true;
1421
+ return false;
1422
+ }); // console.log('setData', upcoming, completed);
1423
+
1424
+
1471
1425
  _this.setState({
1472
- noteAttachments: n.Attachments || [],
1473
- noteInput: n.Note || '',
1474
- addNoteOpen: true,
1475
- editingNote: n.Id,
1476
- noteMenuOpen: null
1426
+ allList: allList,
1427
+ upcoming: upcoming,
1428
+ completed: completed
1477
1429
  });
1478
1430
  });
1479
1431
 
1480
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "markSeen", function () {
1481
- var job = _this.state.job;
1482
- var auth = _this.props.auth; // Must have maintenance permission and not the requester
1483
-
1484
- if (!Session$2.validateAccess(auth.site, 'maintenanceTracking', auth)) return;
1485
- if (auth.user.Id === job.userID) return;
1432
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "getData", function () {
1433
+ var auth = _this.props.auth;
1486
1434
 
1487
1435
  _this.setState({
1488
- updating: true
1489
- }, /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee3() {
1490
- var update;
1491
- return _regeneratorRuntime__default['default'].wrap(function _callee3$(_context3) {
1436
+ loadingAll: true
1437
+ }, /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee() {
1438
+ var res;
1439
+ return _regeneratorRuntime__default['default'].wrap(function _callee$(_context) {
1492
1440
  while (1) {
1493
- switch (_context3.prev = _context3.next) {
1441
+ switch (_context.prev = _context.next) {
1494
1442
  case 0:
1495
- _context3.prev = 0;
1496
- update = {
1497
- id: job.id,
1498
- seen: true,
1499
- status: job.status || 'Unassigned'
1500
- };
1501
- _context3.next = 4;
1502
- return maintenanceActions.editJob(update, auth.site);
1443
+ _context.prev = 0;
1444
+ _context.next = 3;
1445
+ return maintenanceActions.getJobs(auth.site);
1503
1446
 
1504
- case 4:
1505
- _context3.next = 11;
1447
+ case 3:
1448
+ res = _context.sent;
1449
+
1450
+ // console.log('getData', res.data);
1451
+ _this.setState({
1452
+ loadingAll: false
1453
+ });
1454
+
1455
+ if (res.data != null && !___default['default'].isEmpty(res.data) && res.data[0].site === auth.site) {
1456
+ _this.props.jobsLoaded(res.data);
1457
+ }
1458
+
1459
+ _context.next = 12;
1506
1460
  break;
1507
1461
 
1508
- case 6:
1509
- _context3.prev = 6;
1510
- _context3.t0 = _context3["catch"](0);
1462
+ case 8:
1463
+ _context.prev = 8;
1464
+ _context.t0 = _context["catch"](0);
1465
+ console.error('getData', _context.t0);
1511
1466
 
1512
1467
  _this.setState({
1513
- updating: false
1468
+ loadingAll: false
1514
1469
  });
1515
1470
 
1516
- console.log('markSeen error', _context3.t0);
1517
- alert('Something went wrong with the request. Please try again.');
1518
-
1519
- case 11:
1471
+ case 12:
1520
1472
  case "end":
1521
- return _context3.stop();
1473
+ return _context.stop();
1522
1474
  }
1523
1475
  }
1524
- }, _callee3, null, [[0, 6]]);
1476
+ }, _callee, null, [[0, 8]]);
1525
1477
  })));
1526
1478
  });
1527
1479
 
1528
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "getComments", function () {
1529
- reactionActions.getComments(_this.state.jobId, 'maintenancerequest', 0).then(function (res) {
1530
- _this.setState({
1531
- comments: res.data
1532
- });
1533
- });
1480
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onAddNew", function () {
1481
+ var auth = _this.props.auth;
1482
+
1483
+ if (Session$2.validateAccess(auth.site, 'maintenanceTracking', auth)) {
1484
+ _this.props.history.push("/requestsHub/job");
1485
+ }
1534
1486
  });
1535
1487
 
1536
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onAddComment", /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee4() {
1537
- var _this$state2, commentInput, jobId, job, comments, res;
1538
-
1539
- return _regeneratorRuntime__default['default'].wrap(function _callee4$(_context4) {
1540
- while (1) {
1541
- switch (_context4.prev = _context4.next) {
1542
- case 0:
1543
- _this$state2 = _this.state, commentInput = _this$state2.commentInput, jobId = _this$state2.jobId, job = _this$state2.job, comments = _this$state2.comments;
1544
- _context4.prev = 1;
1545
-
1546
- _this.setState({
1547
- commentInput: ''
1548
- });
1549
-
1550
- _context4.next = 5;
1551
- return reactionActions.addComment(jobId, 'maintenancerequest', job.site, commentInput);
1552
-
1553
- case 5:
1554
- res = _context4.sent;
1555
-
1556
- _this.setState({
1557
- comments: [].concat(_toConsumableArray__default['default'](comments), [res.data])
1558
- });
1559
-
1560
- _context4.next = 12;
1561
- break;
1562
-
1563
- case 9:
1564
- _context4.prev = 9;
1565
- _context4.t0 = _context4["catch"](1);
1566
- console.error('onAddComment', _context4.t0);
1567
-
1568
- case 12:
1569
- case "end":
1570
- return _context4.stop();
1571
- }
1572
- }
1573
- }, _callee4, null, [[1, 9]]);
1574
- })));
1575
-
1576
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onHandleChange", function (event) {
1577
- var stateChange = {};
1578
- stateChange[event.target.getAttribute('id')] = event.target.value;
1579
-
1580
- _this.setState(stateChange);
1488
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "canAddNew", function (isClass) {
1489
+ var auth = _this.props.auth;
1490
+ if (Session$2.validateAccess(auth.site, 'maintenanceTracking', auth)) return isClass ? '' : true;
1491
+ return isClass ? ' hub-sideContent-topButton--hide' : false;
1581
1492
  });
1582
1493
 
1583
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onToggleStatusChanger", function () {
1584
- _this.setState({
1585
- statusChangerOpen: !_this.state.statusChangerOpen
1586
- });
1494
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "getSideBarSectionColour", function (id) {
1495
+ return _this.state.selectedSection === id ? {
1496
+ backgroundColor: '#fff'
1497
+ } : {};
1587
1498
  });
1588
1499
 
1589
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onSelectStatus", /*#__PURE__*/function () {
1590
- var _ref5 = _asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee5(status) {
1591
- var res;
1592
- return _regeneratorRuntime__default['default'].wrap(function _callee5$(_context5) {
1593
- while (1) {
1594
- switch (_context5.prev = _context5.next) {
1595
- case 0:
1596
- _this.setState({
1597
- job: _objectSpread$3(_objectSpread$3({}, _this.state.job), {}, {
1598
- status: status
1599
- }),
1600
- statusChangerOpen: false
1601
- });
1602
-
1603
- _context5.prev = 1;
1604
- _context5.next = 4;
1605
- return maintenanceActions.editJobStatus(_this.state.job.id, status);
1606
-
1607
- case 4:
1608
- res = _context5.sent;
1609
-
1610
- _this.setState({
1611
- job: res.data.job
1612
- }, function () {
1613
- _this.props.jobsLoaded([_this.state.job]);
1614
- });
1615
-
1616
- _context5.next = 11;
1617
- break;
1618
-
1619
- case 8:
1620
- _context5.prev = 8;
1621
- _context5.t0 = _context5["catch"](1);
1622
- console.error('onSelectStatus', _context5.t0);
1623
-
1624
- case 11:
1625
- case "end":
1626
- return _context5.stop();
1627
- }
1628
- }
1629
- }, _callee5, null, [[1, 8]]);
1630
- }));
1631
-
1632
- return function (_x) {
1633
- return _ref5.apply(this, arguments);
1634
- };
1635
- }());
1500
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "renderStats", function (stat, loading) {
1501
+ return loading ? /*#__PURE__*/React__default['default'].createElement(FontAwesome__default['default'], {
1502
+ style: styles$4.spinner,
1503
+ name: "spinner fa-pulse fa-fw"
1504
+ }) : stat;
1505
+ });
1636
1506
 
1637
1507
  _this.state = {
1638
- jobId: Helper$2.safeReadParams(props, 'jobId') ? props.match.params.jobId : null,
1639
- job: null,
1640
- showingSelector: false,
1641
- updating: false,
1642
- comments: [],
1643
- commentInput: '',
1644
- loadingComments: false,
1645
- statusChangerOpen: false,
1646
- addNoteOpen: false,
1647
- noteAttachments: [],
1648
- noteInput: ''
1508
+ selectedSection: 'all',
1509
+ location: '',
1510
+ loadingAll: false,
1511
+ loadingSubmissions: false,
1512
+ submissionEntries: [],
1513
+ allList: [],
1514
+ completed: [],
1515
+ upcoming: [],
1516
+ now: moment__default['default'].utc(),
1517
+ onlyFuture: true,
1518
+ search: ''
1649
1519
  };
1650
1520
  return _this;
1651
1521
  }
1652
1522
 
1653
- _createClass__default['default'](Job, [{
1654
- key: "UNSAFE_componentWillReceiveProps",
1655
- value: function UNSAFE_componentWillReceiveProps(nextProps) {
1656
- Session$2.checkLoggedIn(this, this.props.auth);
1523
+ _createClass__default['default'](RequestsHub, [{
1524
+ key: "UNSAFE_componentWillMount",
1525
+ value: function UNSAFE_componentWillMount() {
1526
+ this.updateProps(this.props);
1657
1527
  }
1658
1528
  }, {
1659
1529
  key: "componentDidMount",
1660
1530
  value: function componentDidMount() {
1661
- if (this.state.jobId) {
1662
- this.getJob();
1663
- this.getComments();
1664
- }
1531
+ this.getData();
1665
1532
  }
1666
1533
  }, {
1667
- key: "renderStatusLabel",
1668
- value: function renderStatusLabel() {
1669
- if (!this.state.job.status) return null;
1670
- var auth = this.props.auth;
1671
-
1672
- if (Session$2.validateAccess(auth.site, 'maintenanceTracking', auth)) {
1673
- return /*#__PURE__*/React__default['default'].createElement("div", {
1674
- className: "statusLabel pointer",
1675
- onClick: this.onToggleStatusChanger,
1676
- style: {
1677
- backgroundColor: StatusTypes[this.state.job.status].color
1678
- }
1679
- }, /*#__PURE__*/React__default['default'].createElement("span", {
1680
- className: "statusLabel_text"
1681
- }, StatusTypes[this.state.job.status].text), this.renderStatusChanger());
1682
- }
1683
-
1684
- return /*#__PURE__*/React__default['default'].createElement("div", {
1685
- className: "statusLabel",
1686
- style: {
1687
- backgroundColor: StatusTypes[this.state.job.status].color
1688
- }
1689
- }, /*#__PURE__*/React__default['default'].createElement("span", {
1690
- className: "statusLabel_text"
1691
- }, StatusTypes[this.state.job.status].text));
1534
+ key: "UNSAFE_componentWillReceiveProps",
1535
+ value: function UNSAFE_componentWillReceiveProps(nextProps) {
1536
+ if (!___default['default'].isEqual(this.props.jobs, nextProps.jobs)) this.updateProps(nextProps);
1692
1537
  }
1693
1538
  }, {
1694
- key: "renderNotesButton",
1695
- value: function renderNotesButton() {
1696
- var auth = this.props.auth;
1697
- if (!Session$2.validateAccess(auth.site, 'maintenanceTracking', auth)) return null;
1698
- return /*#__PURE__*/React__default['default'].createElement("div", {
1699
- className: "statusLabel pointer",
1700
- onClick: this.onOpenAddNote,
1701
- style: {
1702
- backgroundColor: FeatureConfig.env.colourBrandingMain,
1703
- marginLeft: 8
1704
- }
1705
- }, /*#__PURE__*/React__default['default'].createElement("span", {
1706
- className: "statusLabel_text"
1707
- }, "Add Note"));
1539
+ key: "updateProps",
1540
+ value: function updateProps(props) {
1541
+ this.setState({
1542
+ allList: props.jobs
1543
+ }, this.setData);
1708
1544
  }
1709
1545
  }, {
1710
- key: "renderStatusChanger",
1711
- value: function renderStatusChanger() {
1546
+ key: "renderLeftBar",
1547
+ value: function renderLeftBar() {
1712
1548
  var _this2 = this;
1713
1549
 
1714
- if (!this.state.statusChangerOpen) return null;
1715
- return /*#__PURE__*/React__default['default'].createElement("div", {
1716
- className: "statusChanger statusChanger-maintenance"
1717
- }, Object.keys(StatusTypes).map(function (statusKey) {
1718
- return /*#__PURE__*/React__default['default'].createElement("div", {
1719
- key: statusKey,
1720
- className: "statusLabel",
1550
+ var sectionItems = [];
1551
+
1552
+ if (this.canAddNew()) {
1553
+ sectionItems.push({
1554
+ type: 'newButton',
1555
+ text: 'New Request',
1556
+ onClick: this.onAddNew
1557
+ });
1558
+ }
1559
+
1560
+ sectionItems.push({
1561
+ type: 'navItem',
1562
+ text: 'View Requests',
1563
+ icon: 'maintenance',
1564
+ selected: this.state.selectedSection === 'all',
1565
+ onClick: function onClick() {
1566
+ _this2.setState({
1567
+ selectedSection: 'all'
1568
+ });
1569
+ }
1570
+ });
1571
+
1572
+ if (Session$2.validateAccess(this.props.auth.site, 'maintenanceTypes', this.props.auth)) {
1573
+ sectionItems.push({
1574
+ type: 'navItem',
1575
+ text: 'Request Types',
1576
+ icon: 'maintenance2',
1577
+ isSVG: true,
1578
+ selected: this.state.selectedSection === 'requestTypes',
1721
1579
  onClick: function onClick() {
1722
- return _this2.onSelectStatus(statusKey);
1723
- },
1724
- style: {
1725
- backgroundColor: StatusTypes[statusKey].color
1580
+ _this2.setState({
1581
+ selectedSection: 'requestTypes'
1582
+ });
1726
1583
  }
1727
- }, /*#__PURE__*/React__default['default'].createElement("span", {
1728
- className: "statusLabel_text"
1729
- }, StatusTypes[statusKey].text));
1730
- }));
1584
+ });
1585
+ }
1586
+
1587
+ return /*#__PURE__*/React__default['default'].createElement(Components$2.HubSidebar, {
1588
+ sections: [{
1589
+ title: 'Requests',
1590
+ items: sectionItems
1591
+ }]
1592
+ });
1731
1593
  }
1732
1594
  }, {
1733
- key: "renderComment",
1734
- value: function renderComment(c) {
1735
- return /*#__PURE__*/React__default['default'].createElement("div", {
1736
- key: c.Id,
1737
- className: "comment"
1738
- }, /*#__PURE__*/React__default['default'].createElement("p", {
1739
- className: "comment_text"
1740
- }, Helper$2.toParagraphed(c.Comment)), /*#__PURE__*/React__default['default'].createElement("div", {
1741
- className: "comment_bottom"
1742
- }, /*#__PURE__*/React__default['default'].createElement(Components$2.ProfilePic, {
1743
- className: "comment_profilePic",
1744
- size: 25,
1745
- image: c.User.profilePic
1746
- }), /*#__PURE__*/React__default['default'].createElement("p", {
1747
- className: "comment_name"
1748
- }, c.User.displayName), /*#__PURE__*/React__default['default'].createElement("p", {
1749
- className: "comment_time"
1750
- }, moment__default['default'].utc(c.Timestamp).local().format('D MMM YYYY • h:mma'))));
1595
+ key: "renderRight",
1596
+ value: function renderRight() {
1597
+ if (this.state.selectedSection === 'requestTypes') {
1598
+ return /*#__PURE__*/React__default['default'].createElement(JobTypes$1, null);
1599
+ }
1600
+
1601
+ return /*#__PURE__*/React__default['default'].createElement(JobList$1, {
1602
+ source: this.state.allList
1603
+ });
1751
1604
  }
1752
1605
  }, {
1753
- key: "renderCommentSection",
1754
- value: function renderCommentSection() {
1755
- var _this3 = this;
1756
-
1757
- if (this.state.loadingComments) return null;
1606
+ key: "render",
1607
+ value: function render() {
1758
1608
  return /*#__PURE__*/React__default['default'].createElement("div", {
1759
- className: "padding-60 paddingLeft-20"
1760
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1761
- className: "newTopBar paddingLeft-40"
1762
- }, /*#__PURE__*/React__default['default'].createElement(Components$2.Text, {
1763
- type: "formTitleSmall",
1764
- className: "marginBottom-16"
1765
- }, "Page Views"), /*#__PURE__*/React__default['default'].createElement("div", {
1766
- className: "commentSection"
1767
- }, this.state.comments.map(function (c) {
1768
- return _this3.renderComment(c);
1769
- })), /*#__PURE__*/React__default['default'].createElement("div", {
1770
- className: "commentReply"
1771
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1772
- className: "commentReply_button".concat(!___default['default'].isEmpty(this.state.commentInput) ? ' commentReply_button-active' : ''),
1773
- onClick: this.onAddComment
1774
- }, /*#__PURE__*/React__default['default'].createElement(FontAwesome__default['default'], {
1775
- className: "commentReply_icon",
1776
- name: "paper-plane-o"
1777
- })), /*#__PURE__*/React__default['default'].createElement(Textarea__default['default'], {
1778
- id: "commentInput",
1779
- placeholder: "Reply here...",
1780
- type: "text",
1781
- className: "commentReply_input",
1782
- value: this.state.commentInput,
1783
- onChange: function onChange(e) {
1784
- return _this3.onHandleChange(e);
1785
- }
1786
- }))));
1787
- }
1788
- }, {
1789
- key: "renderInner",
1790
- value: function renderInner() {
1791
- if (this.state.job == null) return null;
1792
- return /*#__PURE__*/React__default['default'].createElement("div", {
1793
- style: {
1794
- paddingBottom: 40
1795
- }
1796
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1797
- className: "padding-60 paddingVertical-40 bottomDivideBorder relative"
1798
- }, /*#__PURE__*/React__default['default'].createElement(Components$2.Text, {
1799
- type: "formTitleLarge",
1800
- className: "marginBottom-24"
1801
- }, this.state.job.title || 'Request'), /*#__PURE__*/React__default['default'].createElement("div", {
1802
- className: "marginTop-16"
1803
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1804
- className: 'fieldLabel'
1805
- }, "Request date"), /*#__PURE__*/React__default['default'].createElement("div", {
1806
- className: 'fontRegular fontSize-16 text-dark marginTop-5'
1807
- }, moment__default['default'].utc(this.state.job.createdTime).local().format('D MMM YY'))), /*#__PURE__*/React__default['default'].createElement("div", {
1808
- className: "marginTop-16"
1809
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1810
- className: 'fieldLabel'
1811
- }, "Type"), /*#__PURE__*/React__default['default'].createElement("div", {
1812
- className: 'fontRegular fontSize-16 text-dark marginTop-5'
1813
- }, this.state.job.type)), /*#__PURE__*/React__default['default'].createElement("div", {
1814
- className: "marginTop-16"
1815
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1816
- className: 'fieldLabel'
1817
- }, "Location"), /*#__PURE__*/React__default['default'].createElement("div", {
1818
- className: 'fontRegular fontSize-16 text-dark marginTop-5'
1819
- }, this.state.job.room)), /*#__PURE__*/React__default['default'].createElement("div", {
1820
- className: "marginTop-16"
1821
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1822
- className: 'fieldLabel'
1823
- }, "Description ", this.state.job.image ? '- (image supplied)' : ''), /*#__PURE__*/React__default['default'].createElement("div", {
1824
- className: 'fontRegular fontSize-16 text-dark marginTop-5'
1825
- }, this.state.job.description))), /*#__PURE__*/React__default['default'].createElement("div", {
1826
- className: "padding-60 paddingVertical-40 bottomDivideBorder"
1827
- }, /*#__PURE__*/React__default['default'].createElement(Components$2.Text, {
1828
- type: "formTitleSmall",
1829
- className: "marginBottom-16"
1830
- }, "Contact Details"), /*#__PURE__*/React__default['default'].createElement("div", {
1831
- className: "marginTop-16"
1832
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1833
- className: 'fieldLabel'
1834
- }, "Name"), /*#__PURE__*/React__default['default'].createElement("div", {
1835
- className: 'fontRegular fontSize-16 text-dark marginTop-5'
1836
- }, this.state.job.userName)), /*#__PURE__*/React__default['default'].createElement("div", {
1837
- className: "marginTop-16"
1838
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1839
- className: 'fieldLabel'
1840
- }, "Contact number"), /*#__PURE__*/React__default['default'].createElement("div", {
1841
- className: 'fontRegular fontSize-16 text-dark marginTop-5'
1842
- }, ___default['default'].isEmpty(this.state.job.phone) ? 'No phone provided' : this.state.job.phone)), /*#__PURE__*/React__default['default'].createElement("div", {
1843
- className: "marginTop-16"
1844
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1845
- className: 'fieldLabel'
1846
- }, "Should person be home?"), /*#__PURE__*/React__default['default'].createElement("div", {
1847
- className: 'fontRegular fontSize-16 text-dark marginTop-5'
1848
- }, this.state.job.isHome ? 'Yes' : 'No')), this.state.job.isHome && this.state.job.homeText && /*#__PURE__*/React__default['default'].createElement("div", {
1849
- className: "marginTop-16"
1850
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1851
- className: 'fieldLabel'
1852
- }, "When"), /*#__PURE__*/React__default['default'].createElement("div", {
1853
- className: 'fontRegular fontSize-16 text-dark marginTop-5'
1854
- }, this.state.job.homeText))), (this.state.job.image || this.state.job.images) && /*#__PURE__*/React__default['default'].createElement("div", {
1855
- className: "padding-60 paddingVertical-40 bottomDivideBorder"
1856
- }, /*#__PURE__*/React__default['default'].createElement(Components$2.Text, {
1857
- type: "formTitleSmall",
1858
- className: "marginBottom-16"
1859
- }, "Image"), /*#__PURE__*/React__default['default'].createElement("div", {
1860
- style: {
1861
- marginTop: 16,
1862
- height: 180,
1863
- width: 260,
1864
- borderRadius: 4,
1865
- border: '1px solid #aaa',
1866
- backgroundColor: '#ddd',
1867
- backgroundImage: "url(".concat(this.state.job.thumbnail, ")"),
1868
- backgroundPosition: 'center'
1869
- }
1870
- })), this.renderCommentSection());
1609
+ className: "hub-wrapperContainer"
1610
+ }, this.renderLeftBar(), /*#__PURE__*/React__default['default'].createElement("div", {
1611
+ className: "hub-headerContentWrapper"
1612
+ }, /*#__PURE__*/React__default['default'].createElement(Components$2.Header, null), /*#__PURE__*/React__default['default'].createElement("div", {
1613
+ className: "hub-contentWrapper"
1614
+ }, this.renderRight())));
1871
1615
  }
1872
- }, {
1873
- key: "renderHistoryEntry",
1874
- value: function renderHistoryEntry(e, i) {
1875
- var job = this.state.job;
1876
- var entryToUse = e || {
1877
- timestamp: job.createdTime,
1878
- status: 'Unassigned',
1879
- user: {
1880
- displayName: job.userName,
1881
- id: job.userID,
1882
- profilePic: job.userProfilePic
1616
+ }]);
1617
+
1618
+ return RequestsHub;
1619
+ }(React.Component);
1620
+
1621
+ var styles$4 = {
1622
+ sideBarTitleSection: {
1623
+ lineHeight: '40px',
1624
+ marginTop: 30,
1625
+ marginBottom: 30,
1626
+ paddingLeft: 24,
1627
+ paddingRight: 24
1628
+ },
1629
+ sideBarSection: {
1630
+ weight: '100%',
1631
+ minWidth: 200,
1632
+ padding: 32,
1633
+ paddingLeft: 24,
1634
+ cursor: 'pointer',
1635
+ display: 'flex',
1636
+ flexDirection: 'column',
1637
+ justifyContent: 'center'
1638
+ },
1639
+ spinner: {
1640
+ fontSize: 32,
1641
+ color: FeatureConfig.env.colourBrandingOff
1642
+ }
1643
+ };
1644
+
1645
+ var mapStateToProps$2 = function mapStateToProps(state) {
1646
+ var jobs = state.maintenance.jobs;
1647
+ var auth = state.auth;
1648
+ return {
1649
+ jobs: jobs,
1650
+ auth: auth
1651
+ };
1652
+ };
1653
+
1654
+ var RequestsHub$1 = reactRedux.connect(mapStateToProps$2, {
1655
+ jobsLoaded: jobsLoaded
1656
+ })(reactRouter.withRouter(RequestsHub));
1657
+
1658
+ function ownKeys$3(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
1659
+
1660
+ function _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$3(Object(source), true).forEach(function (key) { _defineProperty__default['default'](target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$3(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
1661
+
1662
+ function _createSuper$7(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$7(); return function _createSuperInternal() { var Super = _getPrototypeOf__default['default'](Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf__default['default'](this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn__default['default'](this, result); }; }
1663
+
1664
+ function _isNativeReflectConstruct$7() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
1665
+ var Apis = PlussCore__namespace.Apis,
1666
+ Helper$1 = PlussCore__namespace.Helper,
1667
+ Session$1 = PlussCore__namespace.Session,
1668
+ Colours = PlussCore__namespace.Colours,
1669
+ Components$1 = PlussCore__namespace.Components;
1670
+
1671
+ var Job = /*#__PURE__*/function (_Component) {
1672
+ _inherits__default['default'](Job, _Component);
1673
+
1674
+ var _super = _createSuper$7(Job);
1675
+
1676
+ function Job(props) {
1677
+ var _this;
1678
+
1679
+ _classCallCheck__default['default'](this, Job);
1680
+
1681
+ _this = _super.call(this, props);
1682
+
1683
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "getJob", /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee() {
1684
+ var res;
1685
+ return _regeneratorRuntime__default['default'].wrap(function _callee$(_context) {
1686
+ while (1) {
1687
+ switch (_context.prev = _context.next) {
1688
+ case 0:
1689
+ _context.prev = 0;
1690
+ _context.next = 3;
1691
+ return maintenanceActions.getJob(_this.props.auth.site, _this.state.jobId);
1692
+
1693
+ case 3:
1694
+ res = _context.sent;
1695
+
1696
+ _this.setState({
1697
+ updating: false
1698
+ });
1699
+
1700
+ res.data.location = res.data.site;
1701
+
1702
+ _this.setJob(res.data);
1703
+
1704
+ _context.next = 12;
1705
+ break;
1706
+
1707
+ case 9:
1708
+ _context.prev = 9;
1709
+ _context.t0 = _context["catch"](0);
1710
+ console.error('getJob', _context.t0);
1711
+
1712
+ case 12:
1713
+ case "end":
1714
+ return _context.stop();
1715
+ }
1883
1716
  }
1717
+ }, _callee, null, [[0, 9]]);
1718
+ })));
1719
+
1720
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "setJob", function (job) {
1721
+ job.typeIcon = job.type === 'General' ? 'wrench' : 'tree';
1722
+ job.typeColour = job.type === 'General' ? '#666' : 'green';
1723
+
1724
+ if (___default['default'].isEmpty(job.lastActivity)) {
1725
+ job.lastActivity = '-- --';
1726
+ job.noActivity = true;
1727
+ }
1728
+
1729
+ if (___default['default'].isEmpty(job.status)) {
1730
+ job.status = 'Unassigned';
1731
+ job.notStatus = true;
1732
+ }
1733
+
1734
+ if (___default['default'].isEmpty(job.audience)) {
1735
+ job.audience = [{
1736
+ displayName: 'Unassigned',
1737
+ isEmpty: true
1738
+ }];
1739
+ }
1740
+
1741
+ var needToMarkSeen = false;
1742
+
1743
+ if (!job.seen) {
1744
+ job.seen = true;
1745
+ needToMarkSeen = true;
1746
+ }
1747
+
1748
+ _this.setState({
1749
+ job: job
1750
+ }, function () {
1751
+ if (needToMarkSeen) _this.markSeen();
1752
+ });
1753
+
1754
+ _this.props.jobsLoaded([job]);
1755
+ });
1756
+
1757
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "editJob", function () {});
1758
+
1759
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "isReadyToSaveNote", function () {
1760
+ var _this$state = _this.state,
1761
+ noteAttachments = _this$state.noteAttachments,
1762
+ noteInput = _this$state.noteInput;
1763
+ if (___default['default'].some(noteAttachments, function (n) {
1764
+ return n.Uploading;
1765
+ })) return false;
1766
+ return !___default['default'].isEmpty(noteInput) || !___default['default'].isEmpty(noteAttachments);
1767
+ });
1768
+
1769
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onOpenAddNote", function () {
1770
+ _this.setState({
1771
+ addNoteOpen: true,
1772
+ editingNote: null
1773
+ });
1774
+ });
1775
+
1776
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onCloseAddNote", function () {
1777
+ var newState = {
1778
+ addNoteOpen: false,
1779
+ editingNote: null
1884
1780
  };
1885
- return /*#__PURE__*/React__default['default'].createElement("div", {
1886
- className: "ticketHistoryEntry",
1887
- key: i
1888
- }, /*#__PURE__*/React__default['default'].createElement("p", {
1889
- className: "ticketHistoryEntry_timestamp"
1890
- }, moment__default['default'].utc(entryToUse.timestamp).local().format('D MMM YYYY h:mma')), /*#__PURE__*/React__default['default'].createElement("div", {
1891
- className: "statusLabel statusLabel-large statusLabel-full",
1892
- style: {
1893
- backgroundColor: StatusTypes[entryToUse.status].color
1894
- }
1895
- }, /*#__PURE__*/React__default['default'].createElement("span", {
1896
- className: "statusLabel_text"
1897
- }, e ? "Marked as ".concat(StatusTypes[entryToUse.status].text) : 'Job opened')));
1898
- }
1899
- }, {
1900
- key: "renderNote",
1901
- value: function renderNote(note, index) {
1902
- var _this4 = this;
1903
1781
 
1904
- return /*#__PURE__*/React__default['default'].createElement("div", {
1905
- className: "ticketHistoryEntry",
1906
- key: index
1907
- }, /*#__PURE__*/React__default['default'].createElement("p", {
1908
- className: "ticketHistoryEntry_timestamp"
1909
- }, moment__default['default'].utc(note.Timestamp).local().format('D MMM YYYY h:mma')), /*#__PURE__*/React__default['default'].createElement("div", {
1910
- className: "statusLabel statusLabel-large statusLabel-full",
1911
- style: {
1912
- backgroundColor: '#6e79c5'
1913
- }
1914
- }, /*#__PURE__*/React__default['default'].createElement("span", {
1915
- className: "statusLabel_text"
1916
- }, "Staff Notes")), /*#__PURE__*/React__default['default'].createElement("div", {
1917
- className: "maintenanceNote"
1918
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1919
- className: "maintenanceNote_top"
1920
- }, this.props.auth && this.props.auth.user && this.props.auth.user.Id === note.User.id && /*#__PURE__*/React__default['default'].createElement(Components$2.SVGIcon, {
1921
- colour: Colours.COLOUR_DUSK_LIGHT,
1922
- icon: "more15",
1923
- className: "maintenanceNote_moreIcon",
1924
- onClick: function onClick() {
1925
- return _this4.onOpenNoteMenu(index);
1926
- }
1927
- }), /*#__PURE__*/React__default['default'].createElement("p", {
1928
- className: "maintenanceNote_name"
1929
- }, note.User.displayName), this.state.noteMenuOpen === index && /*#__PURE__*/React__default['default'].createElement(Components$2.MoreMenu, {
1930
- options: [{
1931
- key: 'edit',
1932
- text: 'Edit',
1933
- onPress: function onPress() {
1934
- return _this4.onOpenEditNote(note);
1935
- }
1936
- }, {
1937
- key: 'delete',
1938
- text: 'Delete',
1939
- onPress: function onPress() {
1940
- return _this4.onDeleteNote(note);
1941
- }
1942
- }]
1943
- })), /*#__PURE__*/React__default['default'].createElement("p", {
1944
- className: "maintenanceNote_text"
1945
- }, Helper$2.toParagraphed(note.Note)), note.Attachments.map(function (a, i) {
1946
- return _this4.renderAttachment(a, i);
1947
- })));
1948
- }
1949
- }, {
1950
- key: "renderOverview",
1951
- value: function renderOverview() {
1952
- var _this5 = this;
1782
+ if (!!_this.state.editingNote) {
1783
+ newState.noteInput = '';
1784
+ newState.noteAttachments = [];
1785
+ }
1953
1786
 
1954
- var job = this.state.job;
1955
- if (!job || !job.history) return null;
1787
+ _this.setState(newState);
1788
+ });
1789
+
1790
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onOpenNoteMenu", function (index) {
1791
+ if (_this.state.noteMenuOpen === index) {
1792
+ _this.setState({
1793
+ noteMenuOpen: null
1794
+ });
1795
+ } else {
1796
+ _this.setState({
1797
+ noteMenuOpen: index
1798
+ });
1799
+ }
1800
+ });
1801
+
1802
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onHandlePDFFileChange", function (event) {
1803
+ var file = event.target.files[0];
1804
+ if (!file || _this.state.uploadingNoteAttachment) return;
1805
+
1806
+ var noteAttachments = _toConsumableArray__default['default'](_this.state.noteAttachments);
1807
+
1808
+ var newAttachment = {
1809
+ Uploading: true,
1810
+ Title: file.name
1811
+ };
1812
+ noteAttachments.push(newAttachment);
1813
+
1814
+ _this.setState({
1815
+ noteAttachments: noteAttachments
1816
+ });
1817
+
1818
+ Apis.fileActions.uploadMediaAsync(file, file.name).then(function (fileRes) {
1819
+ newAttachment.Source = fileRes;
1820
+ newAttachment.Uploading = false;
1821
+
1822
+ _this.setState({
1823
+ noteAttachments: _toConsumableArray__default['default'](_this.state.noteAttachments)
1824
+ });
1825
+ }).catch(function (uploadErrorRes) {
1826
+ console.log(uploadErrorRes);
1827
+ newAttachment.Uploading = false;
1828
+
1829
+ _this.setState({
1830
+ noteAttachments: _toConsumableArray__default['default'](_this.state.noteAttachments)
1831
+ });
1832
+ });
1833
+ event.target.value = '';
1834
+ });
1835
+
1836
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onRemoveAttachment", function (a) {
1837
+ var index = _this.state.noteAttachments.indexOf(a);
1838
+
1839
+ if (index > -1) {
1840
+ var newAttachments = _toConsumableArray__default['default'](_this.state.noteAttachments);
1841
+
1842
+ newAttachments.splice(index, 1);
1843
+
1844
+ _this.setState({
1845
+ noteAttachments: newAttachments
1846
+ });
1847
+ }
1848
+ });
1849
+
1850
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onConfirmAddNote", /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee2() {
1851
+ var res;
1852
+ return _regeneratorRuntime__default['default'].wrap(function _callee2$(_context2) {
1853
+ while (1) {
1854
+ switch (_context2.prev = _context2.next) {
1855
+ case 0:
1856
+ if (_this.isReadyToSaveNote()) {
1857
+ _context2.next = 2;
1858
+ break;
1859
+ }
1860
+
1861
+ return _context2.abrupt("return");
1862
+
1863
+ case 2:
1864
+ _context2.prev = 2;
1865
+
1866
+ _this.setState({
1867
+ submittingNote: true
1868
+ });
1956
1869
 
1957
- var source = ___default['default'].sortBy([].concat(_toConsumableArray__default['default'](job.history.map(function (e) {
1958
- return _objectSpread$3(_objectSpread$3({}, e), {}, {
1959
- EntryType: 'status'
1960
- });
1961
- })), _toConsumableArray__default['default']((job.Notes || []).map(function (e) {
1962
- return _objectSpread$3(_objectSpread$3({}, e), {}, {
1963
- timestamp: e.Timestamp,
1964
- EntryType: 'note'
1965
- });
1966
- }))), 'timestamp');
1870
+ _context2.next = 6;
1871
+ return _this.state.editingNote ? maintenanceActions.editNote(_this.state.jobId, _this.state.editingNote, _this.state.noteInput, _this.state.noteAttachments.map(function (a) {
1872
+ return {
1873
+ Title: a.Title,
1874
+ Source: a.Source
1875
+ };
1876
+ })) : maintenanceActions.addNote(_this.state.jobId, _this.state.noteInput, _this.state.noteAttachments.map(function (a) {
1877
+ return {
1878
+ Title: a.Title,
1879
+ Source: a.Source
1880
+ };
1881
+ }));
1967
1882
 
1968
- return /*#__PURE__*/React__default['default'].createElement("div", {
1969
- className: "padding-32 paddingVertical-40 bottomDivideBorder relative"
1970
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1971
- className: "newTopBar clearfix flex flex-reverse"
1972
- }, this.renderNotesButton(), this.renderStatusLabel(), /*#__PURE__*/React__default['default'].createElement(Components$2.Text, {
1973
- type: "formTitleSmall",
1974
- className: "flex-1"
1975
- }, "Status History")), this.renderHistoryEntry(null, -1), ___default['default'].map(source, function (e, i) {
1976
- switch (e.EntryType) {
1977
- case 'status':
1978
- return _this5.renderHistoryEntry(e, i);
1883
+ case 6:
1884
+ res = _context2.sent;
1979
1885
 
1980
- case 'note':
1981
- return _this5.renderNote(e, i);
1982
- }
1983
- }));
1984
- }
1985
- }, {
1986
- key: "renderButtons",
1987
- value: function renderButtons() {
1988
- return /*#__PURE__*/React__default['default'].createElement("div", null, /*#__PURE__*/React__default['default'].createElement(Components$2.Button, {
1989
- inline: true,
1990
- buttonType: "tertiary",
1991
- onClick: function onClick() {
1992
- window.history.back();
1993
- },
1994
- isActive: true,
1995
- style: {
1996
- marginRight: 16
1997
- }
1998
- }, "Back"), Session$2.validateAccess(this.props.auth.site, 'maintenanceTracking', this.props.auth) && !___default['default'].isEmpty(this.state.job) && /*#__PURE__*/React__default['default'].createElement(reactRouterDom.Link, {
1999
- to: "/requestsHub/job/".concat(this.state.jobId)
2000
- }, /*#__PURE__*/React__default['default'].createElement(Components$2.Button, {
2001
- inline: true,
2002
- style: {
2003
- marginRight: 25
2004
- },
2005
- buttonType: "outlined",
2006
- isActive: true,
2007
- onClick: this.editJob
2008
- }, "Edit Details")));
2009
- }
2010
- }, {
2011
- key: "renderAttachment",
2012
- value: function renderAttachment(attachment, index, onRemove) {
2013
- if (!attachment) return null;
2014
- return /*#__PURE__*/React__default['default'].createElement(Components$2.Attachment, {
2015
- key: index,
2016
- uploading: attachment.Uploading,
2017
- source: attachment.Source,
2018
- title: attachment.Title,
2019
- onRemove: onRemove ? function () {
2020
- return onRemove(attachment);
2021
- } : undefined
2022
- });
2023
- }
2024
- }, {
2025
- key: "renderAddNotePopup",
2026
- value: function renderAddNotePopup() {
2027
- var _this6 = this;
1886
+ _this.setState({
1887
+ job: res.data.job,
1888
+ submittingNote: false,
1889
+ addNoteOpen: false,
1890
+ noteInput: '',
1891
+ noteAttachments: [],
1892
+ editingNote: null
1893
+ }, function () {
1894
+ _this.props.jobsLoaded([_this.state.job]);
1895
+ });
2028
1896
 
2029
- if (!this.state.addNoteOpen) return null;
1897
+ _context2.next = 13;
1898
+ break;
2030
1899
 
2031
- if (this.state.submittingNote) {
2032
- return /*#__PURE__*/React__default['default'].createElement(Components$2.Popup, {
2033
- title: "Saving Note",
2034
- maxWidth: 600,
2035
- hasPadding: true
2036
- }, /*#__PURE__*/React__default['default'].createElement("div", {
2037
- className: "flex flex-center-row"
2038
- }, /*#__PURE__*/React__default['default'].createElement(FontAwesome__default['default'], {
2039
- className: "spinner",
2040
- name: "spinner fa-pulse fa-fw"
2041
- })));
2042
- }
1900
+ case 10:
1901
+ _context2.prev = 10;
1902
+ _context2.t0 = _context2["catch"](2);
1903
+ console.error('onConfirmAddNote', _context2.t0);
2043
1904
 
2044
- return /*#__PURE__*/React__default['default'].createElement(Components$2.Popup, {
2045
- title: "".concat(this.state.editingNote ? 'Edit' : 'Add', " Note"),
2046
- onClose: this.onCloseAddNote,
2047
- maxWidth: 600,
2048
- hasPadding: true,
2049
- buttons: [{
2050
- type: 'primary',
2051
- onClick: this.onConfirmAddNote,
2052
- isActive: this.isReadyToSaveNote(),
2053
- text: 'Save'
2054
- }, {
2055
- type: 'tertiary',
2056
- onClick: this.onCloseAddNote,
2057
- isActive: true,
2058
- text: 'Cancel'
2059
- }]
2060
- }, /*#__PURE__*/React__default['default'].createElement(Components$2.GenericInput, {
2061
- id: "noteInput",
2062
- type: "textarea",
2063
- componentClass: "textarea",
2064
- value: this.state.noteInput,
2065
- placeholder: "Enter note",
2066
- onChange: function onChange(e) {
2067
- return _this6.onHandleChange(e);
2068
- },
2069
- inputStyle: {
2070
- width: 400
2071
- }
2072
- }), /*#__PURE__*/React__default['default'].createElement(Components$2.Text, {
2073
- type: "h5"
2074
- }, "Attachments"), this.state.noteAttachments.map(function (a, i) {
2075
- return _this6.renderAttachment(a, i, _this6.onRemoveAttachment);
2076
- }), /*#__PURE__*/React__default['default'].createElement("input", {
2077
- ref: function ref(input) {
2078
- return _this6.attachmentInput = input;
2079
- },
2080
- id: "attachmentInput",
2081
- type: "file",
2082
- className: "fileInput",
2083
- onChange: function onChange(e) {
2084
- return _this6.onHandlePDFFileChange(e);
2085
- },
2086
- accept: "application/pdf"
2087
- }), /*#__PURE__*/React__default['default'].createElement("div", {
2088
- className: "iconTextButton",
2089
- onClick: function onClick() {
2090
- _this6.attachmentInput.click();
1905
+ case 13:
1906
+ case "end":
1907
+ return _context2.stop();
1908
+ }
2091
1909
  }
2092
- }, /*#__PURE__*/React__default['default'].createElement(FontAwesome__default['default'], {
2093
- className: "iconTextButton_icon",
2094
- name: "paperclip"
2095
- }), /*#__PURE__*/React__default['default'].createElement("p", {
2096
- className: "iconTextButton_text"
2097
- }, "Add Attachment")));
2098
- }
2099
- }, {
2100
- key: "render",
2101
- value: function render() {
2102
- return /*#__PURE__*/React__default['default'].createElement(Components$2.OverlayPage, null, this.renderAddNotePopup(), /*#__PURE__*/React__default['default'].createElement(Components$2.OverlayPageContents, null, /*#__PURE__*/React__default['default'].createElement(Components$2.OverlayPageSection, {
2103
- className: "pageSectionWrapper--newPopup"
2104
- }, this.renderInner()), /*#__PURE__*/React__default['default'].createElement(Components$2.OverlayPageSection, {
2105
- className: "pageSectionWrapper--newPopupSide pageSectionWrapper--newPopupSide-fixedWidth"
2106
- }, this.renderOverview())), /*#__PURE__*/React__default['default'].createElement(Components$2.OverlayPageBottomButtons, null, this.renderButtons()));
2107
- }
2108
- }]);
1910
+ }, _callee2, null, [[2, 10]]);
1911
+ })));
2109
1912
 
2110
- return Job;
2111
- }(React.Component);
1913
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onDeleteNote", function (n) {
1914
+ if (!window.confirm('Are you sure you want to delete that note?')) {
1915
+ _this.setState({
1916
+ noteMenuOpen: null
1917
+ });
2112
1918
 
2113
- var mapStateToProps$2 = function mapStateToProps(state) {
2114
- var auth = state.auth;
2115
- return {
2116
- auth: auth
2117
- };
2118
- };
1919
+ return;
1920
+ }
2119
1921
 
2120
- var Job$1 = reactRedux.connect(mapStateToProps$2, {
2121
- jobsLoaded: jobsLoaded
2122
- })(reactRouter.withRouter(Job));
1922
+ maintenanceActions.deleteNote(_this.state.jobId, n.Id);
2123
1923
 
2124
- function _createSuper$7(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$7(); return function _createSuperInternal() { var Super = _getPrototypeOf__default['default'](Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf__default['default'](this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn__default['default'](this, result); }; }
1924
+ var newNotes = ___default['default'].filter(_this.state.job.Notes, function (note) {
1925
+ return note.Id !== n.Id;
1926
+ });
2125
1927
 
2126
- function _isNativeReflectConstruct$7() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
2127
- var Actions = PlussCore__namespace.Actions,
2128
- Components$1 = PlussCore__namespace.Components,
2129
- Helper$1 = PlussCore__namespace.Helper,
2130
- Session$1 = PlussCore__namespace.Session;
1928
+ var newJob = _objectSpread$3({}, _this.state.job);
2131
1929
 
2132
- var AddJob = /*#__PURE__*/function (_Component) {
2133
- _inherits__default['default'](AddJob, _Component);
1930
+ newJob.Notes = newNotes;
2134
1931
 
2135
- var _super = _createSuper$7(AddJob);
1932
+ _this.setState({
1933
+ job: newJob,
1934
+ noteMenuOpen: null
1935
+ });
1936
+ });
2136
1937
 
2137
- function AddJob(props) {
2138
- var _this;
1938
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onOpenEditNote", function (n) {
1939
+ _this.setState({
1940
+ noteAttachments: n.Attachments || [],
1941
+ noteInput: n.Note || '',
1942
+ addNoteOpen: true,
1943
+ editingNote: n.Id,
1944
+ noteMenuOpen: null
1945
+ });
1946
+ });
2139
1947
 
2140
- _classCallCheck__default['default'](this, AddJob);
1948
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "markSeen", function () {
1949
+ var job = _this.state.job;
1950
+ var auth = _this.props.auth; // Must have maintenance permission and not the requester
2141
1951
 
2142
- _this = _super.call(this, props);
1952
+ if (!Session$1.validateAccess(auth.site, 'maintenanceTracking', auth)) return;
1953
+ if (auth.user.Id === job.userID) return;
2143
1954
 
2144
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "getJob", /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee() {
2145
- var res;
2146
- return _regeneratorRuntime__default['default'].wrap(function _callee$(_context) {
2147
- while (1) {
2148
- switch (_context.prev = _context.next) {
2149
- case 0:
2150
- _context.prev = 0;
2151
- _context.next = 3;
2152
- return maintenanceActions.getJob(_this.props.auth.site, _this.state.jobId);
1955
+ _this.setState({
1956
+ updating: true
1957
+ }, /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee3() {
1958
+ var update;
1959
+ return _regeneratorRuntime__default['default'].wrap(function _callee3$(_context3) {
1960
+ while (1) {
1961
+ switch (_context3.prev = _context3.next) {
1962
+ case 0:
1963
+ _context3.prev = 0;
1964
+ update = {
1965
+ id: job.id,
1966
+ seen: true,
1967
+ status: job.status || 'Unassigned'
1968
+ };
1969
+ _context3.next = 4;
1970
+ return maintenanceActions.editJob(update, auth.site);
2153
1971
 
2154
- case 3:
2155
- res = _context.sent;
2156
- res.data.location = res.data.site;
1972
+ case 4:
1973
+ _context3.next = 11;
1974
+ break;
2157
1975
 
2158
- _this.setState(res.data);
1976
+ case 6:
1977
+ _context3.prev = 6;
1978
+ _context3.t0 = _context3["catch"](0);
2159
1979
 
2160
- _context.next = 11;
2161
- break;
1980
+ _this.setState({
1981
+ updating: false
1982
+ });
2162
1983
 
2163
- case 8:
2164
- _context.prev = 8;
2165
- _context.t0 = _context["catch"](0);
2166
- console.error('getJob', _context.t0);
1984
+ console.log('markSeen error', _context3.t0);
1985
+ alert('Something went wrong with the request. Please try again.');
2167
1986
 
2168
- case 11:
2169
- case "end":
2170
- return _context.stop();
1987
+ case 11:
1988
+ case "end":
1989
+ return _context3.stop();
1990
+ }
2171
1991
  }
2172
- }
2173
- }, _callee, null, [[0, 8]]);
2174
- })));
1992
+ }, _callee3, null, [[0, 6]]);
1993
+ })));
1994
+ });
2175
1995
 
2176
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "getJobTypes", /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee2() {
2177
- var res;
2178
- return _regeneratorRuntime__default['default'].wrap(function _callee2$(_context2) {
1996
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "getComments", function () {
1997
+ reactionActions.getComments(_this.state.jobId, 'maintenancerequest', 0).then(function (res) {
1998
+ _this.setState({
1999
+ comments: res.data
2000
+ });
2001
+ });
2002
+ });
2003
+
2004
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onAddComment", /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee4() {
2005
+ var _this$state2, commentInput, jobId, job, comments, res;
2006
+
2007
+ return _regeneratorRuntime__default['default'].wrap(function _callee4$(_context4) {
2179
2008
  while (1) {
2180
- switch (_context2.prev = _context2.next) {
2009
+ switch (_context4.prev = _context4.next) {
2181
2010
  case 0:
2182
- _context2.prev = 0;
2183
- _context2.next = 3;
2184
- return maintenanceActions.getJobTypes(_this.props.auth.site);
2185
-
2186
- case 3:
2187
- res = _context2.sent;
2011
+ _this$state2 = _this.state, commentInput = _this$state2.commentInput, jobId = _this$state2.jobId, job = _this$state2.job, comments = _this$state2.comments;
2012
+ _context4.prev = 1;
2188
2013
 
2189
2014
  _this.setState({
2190
- types: res.data
2015
+ commentInput: ''
2191
2016
  });
2192
2017
 
2193
- _this.getDefaultJob();
2018
+ _context4.next = 5;
2019
+ return reactionActions.addComment(jobId, 'maintenancerequest', job.title, job.site, commentInput);
2194
2020
 
2195
- _context2.next = 11;
2021
+ case 5:
2022
+ res = _context4.sent;
2023
+
2024
+ _this.setState({
2025
+ comments: [].concat(_toConsumableArray__default['default'](comments), [res.data])
2026
+ });
2027
+
2028
+ _context4.next = 12;
2196
2029
  break;
2197
2030
 
2198
- case 8:
2199
- _context2.prev = 8;
2200
- _context2.t0 = _context2["catch"](0);
2201
- console.error('getJobTypes', _context2.t0);
2031
+ case 9:
2032
+ _context4.prev = 9;
2033
+ _context4.t0 = _context4["catch"](1);
2034
+ console.error('onAddComment', _context4.t0);
2202
2035
 
2203
- case 11:
2036
+ case 12:
2204
2037
  case "end":
2205
- return _context2.stop();
2038
+ return _context4.stop();
2206
2039
  }
2207
2040
  }
2208
- }, _callee2, null, [[0, 8]]);
2041
+ }, _callee4, null, [[1, 9]]);
2209
2042
  })));
2210
2043
 
2211
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "getDefaultJob", function () {
2212
- if (_this.state.types.length !== 0 && _this.state.jobId == null) {
2213
- _this.setState({
2214
- type: _this.state.types[0].typeName
2215
- });
2216
- }
2217
- });
2218
-
2219
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onSelectType", function (key, e) {
2220
- _this.setState({
2221
- type: key
2222
- });
2223
- });
2224
-
2225
2044
  _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onHandleChange", function (event) {
2226
2045
  var stateChange = {};
2227
2046
  stateChange[event.target.getAttribute('id')] = event.target.value;
@@ -2229,348 +2048,534 @@ var AddJob = /*#__PURE__*/function (_Component) {
2229
2048
  _this.setState(stateChange);
2230
2049
  });
2231
2050
 
2232
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onSave", function () {
2051
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onToggleStatusChanger", function () {
2233
2052
  _this.setState({
2234
- showWarnings: false
2053
+ statusChangerOpen: !_this.state.statusChangerOpen
2235
2054
  });
2055
+ });
2236
2056
 
2237
- if (!_this.validateForm()) {
2238
- _this.setState({
2239
- showWarnings: true
2240
- });
2241
-
2242
- return;
2243
- }
2244
-
2245
- if (_this.state.updating) return;
2057
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onSelectStatus", /*#__PURE__*/function () {
2058
+ var _ref5 = _asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee5(status) {
2059
+ var res;
2060
+ return _regeneratorRuntime__default['default'].wrap(function _callee5$(_context5) {
2061
+ while (1) {
2062
+ switch (_context5.prev = _context5.next) {
2063
+ case 0:
2064
+ _this.setState({
2065
+ job: _objectSpread$3(_objectSpread$3({}, _this.state.job), {}, {
2066
+ status: status
2067
+ }),
2068
+ statusChangerOpen: false
2069
+ });
2246
2070
 
2247
- _this.setState({
2248
- updating: true
2249
- });
2071
+ _context5.prev = 1;
2072
+ _context5.next = 4;
2073
+ return maintenanceActions.editJobStatus(_this.state.job.id, status);
2250
2074
 
2251
- var job = {
2252
- id: _this.state.id,
2253
- userID: _this.state.userID,
2254
- userName: _this.state.userName,
2255
- room: _this.state.room,
2256
- phone: _this.state.phone,
2257
- location: _this.state.location,
2258
- title: _this.state.title,
2259
- description: _this.state.description,
2260
- isHome: _this.state.isHome,
2261
- homeText: _this.state.homeText,
2262
- type: _this.state.type,
2263
- date: null,
2264
- image: _this.state.image
2265
- };
2075
+ case 4:
2076
+ res = _context5.sent;
2266
2077
 
2267
- if (_this.state.id != null) {
2268
- maintenanceActions.editJob(job, _this.props.auth.site).then(function (res) {
2269
- _this.setState({
2270
- success: true,
2271
- updating: false
2272
- });
2078
+ _this.setState({
2079
+ job: res.data.job
2080
+ }, function () {
2081
+ _this.props.jobsLoaded([_this.state.job]);
2082
+ });
2273
2083
 
2274
- _this.props.jobsLoaded([job]);
2275
- }).catch(function (res) {
2276
- _this.setState({
2277
- updating: false
2278
- });
2084
+ _context5.next = 11;
2085
+ break;
2279
2086
 
2280
- alert('Something went wrong with the request. Please try again.');
2281
- });
2282
- } else {
2283
- // Create New Job
2284
- job.userID = 'undefined';
2285
- maintenanceActions.createJob(job).then(function (res) {
2286
- _this.setState({
2287
- success: true,
2288
- updating: false
2289
- });
2087
+ case 8:
2088
+ _context5.prev = 8;
2089
+ _context5.t0 = _context5["catch"](1);
2090
+ console.error('onSelectStatus', _context5.t0);
2290
2091
 
2291
- _this.props.jobsUpdate(_this.props.auth.site);
2292
- }).catch(function (res) {
2293
- _this.setState({
2294
- updating: false
2295
- });
2092
+ case 11:
2093
+ case "end":
2094
+ return _context5.stop();
2095
+ }
2096
+ }
2097
+ }, _callee5, null, [[1, 8]]);
2098
+ }));
2296
2099
 
2297
- alert('Something went wrong with the request. Please try again.');
2298
- });
2299
- }
2300
- });
2100
+ return function (_x) {
2101
+ return _ref5.apply(this, arguments);
2102
+ };
2103
+ }());
2301
2104
 
2302
2105
  _this.state = {
2303
- jobId: Helper$1.safeReadParams(_this.props, 'jobId') ? _this.props.match.params.jobId : null,
2106
+ jobId: Helper$1.safeReadParams(props, 'jobId') ? props.match.params.jobId : null,
2304
2107
  job: null,
2305
2108
  showingSelector: false,
2306
2109
  updating: false,
2307
- connected: false,
2308
- types: [],
2309
- id: null,
2310
- userID: '',
2311
- userName: '',
2312
- room: '',
2313
- phone: '',
2314
- location: _this.props.auth.site,
2315
- title: '',
2316
- description: '',
2317
- isHome: false,
2318
- homeText: '',
2319
- type: 'General',
2320
- image: null,
2321
- thumbnail: null,
2322
- showWarnings: false,
2323
- success: false
2110
+ comments: [],
2111
+ commentInput: '',
2112
+ loadingComments: false,
2113
+ statusChangerOpen: false,
2114
+ addNoteOpen: false,
2115
+ noteAttachments: [],
2116
+ noteInput: ''
2324
2117
  };
2325
2118
  return _this;
2326
2119
  }
2327
2120
 
2328
- _createClass__default['default'](AddJob, [{
2329
- key: "UNSAFE_componentWillMount",
2330
- value: function UNSAFE_componentWillMount() {
2121
+ _createClass__default['default'](Job, [{
2122
+ key: "UNSAFE_componentWillReceiveProps",
2123
+ value: function UNSAFE_componentWillReceiveProps(nextProps) {
2331
2124
  Session$1.checkLoggedIn(this, this.props.auth);
2332
2125
  }
2333
2126
  }, {
2334
- key: "componentDidMount",
2335
- value: function componentDidMount() {
2336
- this.getJobTypes();
2337
- if (this.state.jobId) this.getJob();
2338
- this.props.addRecentlyCreated('maintenance');
2127
+ key: "componentDidMount",
2128
+ value: function componentDidMount() {
2129
+ if (this.state.jobId) {
2130
+ this.getJob();
2131
+ this.getComments();
2132
+ }
2133
+ }
2134
+ }, {
2135
+ key: "renderStatusLabel",
2136
+ value: function renderStatusLabel() {
2137
+ if (!this.state.job.status) return null;
2138
+ var auth = this.props.auth;
2139
+
2140
+ if (Session$1.validateAccess(auth.site, 'maintenanceTracking', auth)) {
2141
+ return /*#__PURE__*/React__default['default'].createElement("div", {
2142
+ className: "statusLabel pointer",
2143
+ onClick: this.onToggleStatusChanger,
2144
+ style: {
2145
+ backgroundColor: StatusTypes[this.state.job.status].color
2146
+ }
2147
+ }, /*#__PURE__*/React__default['default'].createElement("span", {
2148
+ className: "statusLabel_text"
2149
+ }, StatusTypes[this.state.job.status].text), this.renderStatusChanger());
2150
+ }
2151
+
2152
+ return /*#__PURE__*/React__default['default'].createElement("div", {
2153
+ className: "statusLabel",
2154
+ style: {
2155
+ backgroundColor: StatusTypes[this.state.job.status].color
2156
+ }
2157
+ }, /*#__PURE__*/React__default['default'].createElement("span", {
2158
+ className: "statusLabel_text"
2159
+ }, StatusTypes[this.state.job.status].text));
2160
+ }
2161
+ }, {
2162
+ key: "renderNotesButton",
2163
+ value: function renderNotesButton() {
2164
+ var auth = this.props.auth;
2165
+ if (!Session$1.validateAccess(auth.site, 'maintenanceTracking', auth)) return null;
2166
+ return /*#__PURE__*/React__default['default'].createElement("div", {
2167
+ className: "statusLabel pointer",
2168
+ onClick: this.onOpenAddNote,
2169
+ style: {
2170
+ backgroundColor: FeatureConfig.env.colourBrandingMain,
2171
+ marginLeft: 8
2172
+ }
2173
+ }, /*#__PURE__*/React__default['default'].createElement("span", {
2174
+ className: "statusLabel_text"
2175
+ }, "Add Note"));
2339
2176
  }
2340
2177
  }, {
2341
- key: "renderTypeOptions",
2342
- value: function renderTypeOptions() {
2178
+ key: "renderStatusChanger",
2179
+ value: function renderStatusChanger() {
2343
2180
  var _this2 = this;
2344
2181
 
2345
- var source = this.state.types;
2346
- return source.map(function (ev) {
2347
- if (ev != null) {
2348
- return /*#__PURE__*/React__default['default'].createElement(reactBootstrap.MenuItem, {
2349
- key: ev.typeName,
2350
- eventKey: ev.typeName,
2351
- active: _this2.state.type === ev.typeName
2352
- }, ev.typeName);
2353
- }
2182
+ if (!this.state.statusChangerOpen) return null;
2183
+ return /*#__PURE__*/React__default['default'].createElement("div", {
2184
+ className: "statusChanger statusChanger-maintenance"
2185
+ }, Object.keys(StatusTypes).map(function (statusKey) {
2186
+ return /*#__PURE__*/React__default['default'].createElement("div", {
2187
+ key: statusKey,
2188
+ className: "statusLabel",
2189
+ onClick: function onClick() {
2190
+ return _this2.onSelectStatus(statusKey);
2191
+ },
2192
+ style: {
2193
+ backgroundColor: StatusTypes[statusKey].color
2194
+ }
2195
+ }, /*#__PURE__*/React__default['default'].createElement("span", {
2196
+ className: "statusLabel_text"
2197
+ }, StatusTypes[statusKey].text));
2198
+ }));
2199
+ }
2200
+ }, {
2201
+ key: "renderComment",
2202
+ value: function renderComment(c) {
2203
+ return /*#__PURE__*/React__default['default'].createElement("div", {
2204
+ key: c.Id,
2205
+ className: "comment"
2206
+ }, /*#__PURE__*/React__default['default'].createElement("p", {
2207
+ className: "comment_text"
2208
+ }, Helper$1.toParagraphed(c.Comment)), /*#__PURE__*/React__default['default'].createElement("div", {
2209
+ className: "comment_bottom"
2210
+ }, /*#__PURE__*/React__default['default'].createElement(Components$1.ProfilePic, {
2211
+ className: "comment_profilePic",
2212
+ size: 25,
2213
+ image: c.User.profilePic
2214
+ }), /*#__PURE__*/React__default['default'].createElement("p", {
2215
+ className: "comment_name"
2216
+ }, c.User.displayName), /*#__PURE__*/React__default['default'].createElement("p", {
2217
+ className: "comment_time"
2218
+ }, moment__default['default'].utc(c.Timestamp).local().format('D MMM YYYY • h:mma'))));
2219
+ }
2220
+ }, {
2221
+ key: "renderCommentSection",
2222
+ value: function renderCommentSection() {
2223
+ var _this3 = this;
2354
2224
 
2355
- return null;
2356
- });
2225
+ if (this.state.loadingComments) return null;
2226
+ return /*#__PURE__*/React__default['default'].createElement("div", {
2227
+ className: "padding-60 paddingLeft-20"
2228
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
2229
+ className: "newTopBar paddingLeft-40"
2230
+ }, /*#__PURE__*/React__default['default'].createElement(Components$1.Text, {
2231
+ type: "formTitleSmall",
2232
+ className: "marginBottom-16"
2233
+ }, "Comments"), /*#__PURE__*/React__default['default'].createElement("div", {
2234
+ className: "commentSection"
2235
+ }, this.state.comments.map(function (c) {
2236
+ return _this3.renderComment(c);
2237
+ })), /*#__PURE__*/React__default['default'].createElement("div", {
2238
+ className: "commentReply"
2239
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
2240
+ className: "commentReply_button".concat(!___default['default'].isEmpty(this.state.commentInput) ? ' commentReply_button-active' : ''),
2241
+ onClick: this.onAddComment
2242
+ }, /*#__PURE__*/React__default['default'].createElement(FontAwesome__default['default'], {
2243
+ className: "commentReply_icon",
2244
+ name: "paper-plane-o"
2245
+ })), /*#__PURE__*/React__default['default'].createElement(Textarea__default['default'], {
2246
+ id: "commentInput",
2247
+ placeholder: "Reply here...",
2248
+ type: "text",
2249
+ className: "commentReply_input",
2250
+ value: this.state.commentInput,
2251
+ onChange: function onChange(e) {
2252
+ return _this3.onHandleChange(e);
2253
+ }
2254
+ }))));
2357
2255
  }
2358
2256
  }, {
2359
- key: "renderSuccess",
2360
- value: function renderSuccess() {
2361
- if (!this.state.success) return null;
2362
- return /*#__PURE__*/React__default['default'].createElement(Components$1.SuccessPopup, {
2363
- text: "Maintenance request has been ".concat(this.state.id != null ? 'edited' : 'added'),
2364
- buttons: [{
2365
- type: 'outlined',
2366
- onClick: function onClick() {
2367
- window.history.back();
2368
- },
2369
- text: "Back to Maintenance"
2257
+ key: "renderInner",
2258
+ value: function renderInner() {
2259
+ if (this.state.job == null) return null;
2260
+ return /*#__PURE__*/React__default['default'].createElement("div", {
2261
+ style: {
2262
+ paddingBottom: 40
2263
+ }
2264
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
2265
+ className: "padding-60 paddingVertical-40 bottomDivideBorder relative"
2266
+ }, /*#__PURE__*/React__default['default'].createElement(Components$1.Text, {
2267
+ type: "formTitleLarge",
2268
+ className: "marginBottom-24"
2269
+ }, this.state.job.title || 'Request'), /*#__PURE__*/React__default['default'].createElement("div", {
2270
+ className: "marginTop-16"
2271
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
2272
+ className: 'fieldLabel'
2273
+ }, "Request date"), /*#__PURE__*/React__default['default'].createElement("div", {
2274
+ className: 'fontRegular fontSize-16 text-dark marginTop-5'
2275
+ }, moment__default['default'].utc(this.state.job.createdTime).local().format('D MMM YY'))), /*#__PURE__*/React__default['default'].createElement("div", {
2276
+ className: "marginTop-16"
2277
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
2278
+ className: 'fieldLabel'
2279
+ }, "Type"), /*#__PURE__*/React__default['default'].createElement("div", {
2280
+ className: 'fontRegular fontSize-16 text-dark marginTop-5'
2281
+ }, this.state.job.type)), /*#__PURE__*/React__default['default'].createElement("div", {
2282
+ className: "marginTop-16"
2283
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
2284
+ className: 'fieldLabel'
2285
+ }, "Location"), /*#__PURE__*/React__default['default'].createElement("div", {
2286
+ className: 'fontRegular fontSize-16 text-dark marginTop-5'
2287
+ }, this.state.job.room)), /*#__PURE__*/React__default['default'].createElement("div", {
2288
+ className: "marginTop-16"
2289
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
2290
+ className: 'fieldLabel'
2291
+ }, "Description ", this.state.job.image ? '- (image supplied)' : ''), /*#__PURE__*/React__default['default'].createElement("div", {
2292
+ className: 'fontRegular fontSize-16 text-dark marginTop-5'
2293
+ }, this.state.job.description))), /*#__PURE__*/React__default['default'].createElement("div", {
2294
+ className: "padding-60 paddingVertical-40 bottomDivideBorder"
2295
+ }, /*#__PURE__*/React__default['default'].createElement(Components$1.Text, {
2296
+ type: "formTitleSmall",
2297
+ className: "marginBottom-16"
2298
+ }, "Contact Details"), /*#__PURE__*/React__default['default'].createElement("div", {
2299
+ className: "marginTop-16"
2300
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
2301
+ className: 'fieldLabel'
2302
+ }, "Name"), /*#__PURE__*/React__default['default'].createElement("div", {
2303
+ className: 'fontRegular fontSize-16 text-dark marginTop-5'
2304
+ }, this.state.job.userName)), /*#__PURE__*/React__default['default'].createElement("div", {
2305
+ className: "marginTop-16"
2306
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
2307
+ className: 'fieldLabel'
2308
+ }, "Contact number"), /*#__PURE__*/React__default['default'].createElement("div", {
2309
+ className: 'fontRegular fontSize-16 text-dark marginTop-5'
2310
+ }, ___default['default'].isEmpty(this.state.job.phone) ? 'No phone provided' : this.state.job.phone)), /*#__PURE__*/React__default['default'].createElement("div", {
2311
+ className: "marginTop-16"
2312
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
2313
+ className: 'fieldLabel'
2314
+ }, "Should person be home?"), /*#__PURE__*/React__default['default'].createElement("div", {
2315
+ className: 'fontRegular fontSize-16 text-dark marginTop-5'
2316
+ }, this.state.job.isHome ? 'Yes' : 'No')), this.state.job.isHome && this.state.job.homeText && /*#__PURE__*/React__default['default'].createElement("div", {
2317
+ className: "marginTop-16"
2318
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
2319
+ className: 'fieldLabel'
2320
+ }, "When"), /*#__PURE__*/React__default['default'].createElement("div", {
2321
+ className: 'fontRegular fontSize-16 text-dark marginTop-5'
2322
+ }, this.state.job.homeText))), (this.state.job.image || this.state.job.images) && /*#__PURE__*/React__default['default'].createElement("div", {
2323
+ className: "padding-60 paddingVertical-40 bottomDivideBorder"
2324
+ }, /*#__PURE__*/React__default['default'].createElement(Components$1.Text, {
2325
+ type: "formTitleSmall",
2326
+ className: "marginBottom-16"
2327
+ }, "Image"), /*#__PURE__*/React__default['default'].createElement("div", {
2328
+ style: {
2329
+ marginTop: 16,
2330
+ height: 180,
2331
+ width: 260,
2332
+ borderRadius: 4,
2333
+ border: '1px solid #aaa',
2334
+ backgroundColor: '#ddd',
2335
+ backgroundImage: "url(".concat(this.state.job.thumbnail, ")"),
2336
+ backgroundPosition: 'center'
2337
+ }
2338
+ })), this.renderCommentSection());
2339
+ }
2340
+ }, {
2341
+ key: "renderHistoryEntry",
2342
+ value: function renderHistoryEntry(e, i) {
2343
+ var job = this.state.job;
2344
+ var entryToUse = e || {
2345
+ timestamp: job.createdTime,
2346
+ status: 'Unassigned',
2347
+ user: {
2348
+ displayName: job.userName,
2349
+ id: job.userID,
2350
+ profilePic: job.userProfilePic
2351
+ }
2352
+ };
2353
+ return /*#__PURE__*/React__default['default'].createElement("div", {
2354
+ className: "ticketHistoryEntry",
2355
+ key: i
2356
+ }, /*#__PURE__*/React__default['default'].createElement("p", {
2357
+ className: "ticketHistoryEntry_timestamp"
2358
+ }, moment__default['default'].utc(entryToUse.timestamp).local().format('D MMM YYYY h:mma')), /*#__PURE__*/React__default['default'].createElement("div", {
2359
+ className: "statusLabel statusLabel-large statusLabel-full",
2360
+ style: {
2361
+ backgroundColor: StatusTypes[entryToUse.status].color
2362
+ }
2363
+ }, /*#__PURE__*/React__default['default'].createElement("span", {
2364
+ className: "statusLabel_text"
2365
+ }, e ? "Marked as ".concat(StatusTypes[entryToUse.status].text) : 'Job opened')));
2366
+ }
2367
+ }, {
2368
+ key: "renderNote",
2369
+ value: function renderNote(note, index) {
2370
+ var _this4 = this;
2371
+
2372
+ return /*#__PURE__*/React__default['default'].createElement("div", {
2373
+ className: "ticketHistoryEntry",
2374
+ key: index
2375
+ }, /*#__PURE__*/React__default['default'].createElement("p", {
2376
+ className: "ticketHistoryEntry_timestamp"
2377
+ }, moment__default['default'].utc(note.Timestamp).local().format('D MMM YYYY h:mma')), /*#__PURE__*/React__default['default'].createElement("div", {
2378
+ className: "statusLabel statusLabel-large statusLabel-full",
2379
+ style: {
2380
+ backgroundColor: '#6e79c5'
2381
+ }
2382
+ }, /*#__PURE__*/React__default['default'].createElement("span", {
2383
+ className: "statusLabel_text"
2384
+ }, "Staff Notes")), /*#__PURE__*/React__default['default'].createElement("div", {
2385
+ className: "maintenanceNote"
2386
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
2387
+ className: "maintenanceNote_top"
2388
+ }, this.props.auth && this.props.auth.user && this.props.auth.user.Id === note.User.id && /*#__PURE__*/React__default['default'].createElement(Components$1.SVGIcon, {
2389
+ colour: Colours.COLOUR_DUSK_LIGHT,
2390
+ icon: "more15",
2391
+ className: "maintenanceNote_moreIcon",
2392
+ onClick: function onClick() {
2393
+ return _this4.onOpenNoteMenu(index);
2394
+ }
2395
+ }), /*#__PURE__*/React__default['default'].createElement("p", {
2396
+ className: "maintenanceNote_name"
2397
+ }, note.User.displayName), this.state.noteMenuOpen === index && /*#__PURE__*/React__default['default'].createElement(Components$1.MoreMenu, {
2398
+ options: [{
2399
+ key: 'edit',
2400
+ text: 'Edit',
2401
+ onPress: function onPress() {
2402
+ return _this4.onOpenEditNote(note);
2403
+ }
2404
+ }, {
2405
+ key: 'delete',
2406
+ text: 'Delete',
2407
+ onPress: function onPress() {
2408
+ return _this4.onDeleteNote(note);
2409
+ }
2370
2410
  }]
2371
- });
2372
- }
2373
- }, {
2374
- key: "validateForm",
2375
- value: function validateForm() {
2376
- if (___default['default'].isEmpty(this.state.userName)) return false;
2377
- if (___default['default'].isEmpty(this.state.room)) return false;
2378
- if (___default['default'].isEmpty(this.state.title)) return false;
2379
- if (this.state.isHome && ___default['default'].isEmpty(this.state.homeText)) return false;
2380
- return true;
2411
+ })), /*#__PURE__*/React__default['default'].createElement("p", {
2412
+ className: "maintenanceNote_text"
2413
+ }, Helper$1.toParagraphed(note.Note)), note.Attachments.map(function (a, i) {
2414
+ return _this4.renderAttachment(a, i);
2415
+ })));
2381
2416
  }
2382
2417
  }, {
2383
- key: "renderSubmit",
2384
- value: function renderSubmit() {
2385
- var _this3 = this;
2418
+ key: "renderOverview",
2419
+ value: function renderOverview() {
2420
+ var _this5 = this;
2386
2421
 
2387
- if (this.state.updating) {
2388
- return /*#__PURE__*/React__default['default'].createElement(Components$1.Button, {
2389
- buttonType: "secondary"
2390
- }, "Saving...");
2391
- }
2422
+ var job = this.state.job;
2423
+ if (!job || !job.history) return null;
2424
+
2425
+ var source = ___default['default'].sortBy([].concat(_toConsumableArray__default['default'](job.history.map(function (e) {
2426
+ return _objectSpread$3(_objectSpread$3({}, e), {}, {
2427
+ EntryType: 'status'
2428
+ });
2429
+ })), _toConsumableArray__default['default']((job.Notes || []).map(function (e) {
2430
+ return _objectSpread$3(_objectSpread$3({}, e), {}, {
2431
+ timestamp: e.Timestamp,
2432
+ EntryType: 'note'
2433
+ });
2434
+ }))), 'timestamp');
2435
+
2436
+ return /*#__PURE__*/React__default['default'].createElement("div", {
2437
+ className: "padding-32 paddingVertical-40 bottomDivideBorder relative"
2438
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
2439
+ className: "newTopBar clearfix flex flex-reverse"
2440
+ }, this.renderNotesButton(), this.renderStatusLabel(), /*#__PURE__*/React__default['default'].createElement(Components$1.Text, {
2441
+ type: "formTitleSmall",
2442
+ className: "flex-1"
2443
+ }, "Status History")), this.renderHistoryEntry(null, -1), ___default['default'].map(source, function (e, i) {
2444
+ switch (e.EntryType) {
2445
+ case 'status':
2446
+ return _this5.renderHistoryEntry(e, i);
2392
2447
 
2448
+ case 'note':
2449
+ return _this5.renderNote(e, i);
2450
+ }
2451
+ }));
2452
+ }
2453
+ }, {
2454
+ key: "renderButtons",
2455
+ value: function renderButtons() {
2393
2456
  return /*#__PURE__*/React__default['default'].createElement("div", null, /*#__PURE__*/React__default['default'].createElement(Components$1.Button, {
2394
2457
  inline: true,
2395
2458
  buttonType: "tertiary",
2396
2459
  onClick: function onClick() {
2397
- return _this3.props.history.push('/requestsHub');
2460
+ window.history.back();
2398
2461
  },
2399
2462
  isActive: true,
2400
2463
  style: {
2401
2464
  marginRight: 16
2402
2465
  }
2403
- }, "Cancel"), /*#__PURE__*/React__default['default'].createElement(Components$1.Button, {
2466
+ }, "Back"), Session$1.validateAccess(this.props.auth.site, 'maintenanceTracking', this.props.auth) && !___default['default'].isEmpty(this.state.job) && /*#__PURE__*/React__default['default'].createElement(reactRouterDom.Link, {
2467
+ to: "/requestsHub/job/".concat(this.state.jobId)
2468
+ }, /*#__PURE__*/React__default['default'].createElement(Components$1.Button, {
2404
2469
  inline: true,
2405
- buttonType: "primary",
2406
- onClick: this.onSave,
2407
- isActive: this.validateForm()
2408
- }, "Save"));
2470
+ style: {
2471
+ marginRight: 25
2472
+ },
2473
+ buttonType: "outlined",
2474
+ isActive: true,
2475
+ onClick: this.editJob
2476
+ }, "Edit Details")));
2409
2477
  }
2410
2478
  }, {
2411
- key: "renderMain",
2412
- value: function renderMain() {
2413
- var _this4 = this;
2479
+ key: "renderAttachment",
2480
+ value: function renderAttachment(attachment, index, onRemove) {
2481
+ if (!attachment) return null;
2482
+ return /*#__PURE__*/React__default['default'].createElement(Components$1.Attachment, {
2483
+ key: index,
2484
+ uploading: attachment.Uploading,
2485
+ source: attachment.Source,
2486
+ title: attachment.Title,
2487
+ onRemove: onRemove ? function () {
2488
+ return onRemove(attachment);
2489
+ } : undefined
2490
+ });
2491
+ }
2492
+ }, {
2493
+ key: "renderAddNotePopup",
2494
+ value: function renderAddNotePopup() {
2495
+ var _this6 = this;
2414
2496
 
2415
- return /*#__PURE__*/React__default['default'].createElement("div", {
2416
- style: {
2417
- marginBottom: 15
2418
- }
2419
- }, /*#__PURE__*/React__default['default'].createElement("div", {
2420
- className: "padding-60 paddingVertical-40 bottomDivideBorder"
2421
- }, /*#__PURE__*/React__default['default'].createElement(Components$1.Text, {
2422
- type: "formTitleLarge",
2423
- className: "marginBottom-24"
2424
- }, this.state.infoId == null ? 'New' : 'Edit', " Request"), /*#__PURE__*/React__default['default'].createElement(Components$1.GenericInput, {
2425
- id: "userName",
2426
- type: "text",
2427
- label: "Name",
2428
- placeholder: "Insert name here",
2429
- value: this.state.userName,
2430
- onChange: function onChange(e) {
2431
- return _this4.onHandleChange(e);
2432
- },
2433
- isRequired: true,
2434
- alwaysShowLabel: true,
2435
- isValid: function isValid() {
2436
- return !___default['default'].isEmpty(_this4.state.userName);
2437
- },
2438
- showError: function showError() {
2439
- return _this4.state.showWarnings && ___default['default'].isEmpty(_this4.state.userName);
2440
- }
2441
- }), /*#__PURE__*/React__default['default'].createElement(Components$1.GenericInput, {
2442
- id: "room",
2443
- type: "text",
2444
- label: "Location",
2445
- placeholder: "Insert address here",
2446
- value: this.state.room,
2447
- onChange: function onChange(e) {
2448
- return _this4.onHandleChange(e);
2449
- },
2450
- isRequired: true,
2451
- alwaysShowLabel: true,
2452
- isValid: function isValid() {
2453
- return !___default['default'].isEmpty(_this4.state.room);
2454
- },
2455
- showError: function showError() {
2456
- return _this4.state.showWarnings && ___default['default'].isEmpty(_this4.state.room);
2457
- }
2458
- }), /*#__PURE__*/React__default['default'].createElement(Components$1.GenericInput, {
2459
- id: "phone",
2460
- type: "text",
2461
- label: "Contact number",
2462
- placeholder: "04XX XXX XXX",
2463
- value: this.state.phone // showError={this.state.showWarnings && !this.validateImage()}
2464
- ,
2465
- onChange: function onChange(e) {
2466
- return _this4.onHandleChange(e);
2467
- },
2468
- alwaysShowLabel: true
2469
- }), /*#__PURE__*/React__default['default'].createElement("div", {
2470
- style: {
2471
- marginBottom: 15
2472
- }
2473
- }, /*#__PURE__*/React__default['default'].createElement(Components$1.Text, {
2474
- type: "formLabel"
2475
- }, "Job Type"), /*#__PURE__*/React__default['default'].createElement(reactBootstrap.DropdownButton, {
2476
- style: {
2477
- minWidth: 80
2478
- },
2479
- bsStyle: "default",
2480
- title: this.state.type,
2481
- id: "typeSelect",
2482
- onSelect: this.onSelectType
2483
- }, this.renderTypeOptions())), /*#__PURE__*/React__default['default'].createElement(Components$1.GenericInput, {
2484
- id: "title",
2485
- label: "Title for the work required",
2486
- type: "textarea",
2487
- placeholder: "Title for the work required",
2488
- value: this.state.title,
2489
- onChange: function onChange(e) {
2490
- return _this4.onHandleChange(e);
2491
- },
2492
- inputStyle: {
2493
- height: 80
2494
- },
2495
- isRequired: true,
2496
- isValid: function isValid() {
2497
- return !___default['default'].isEmpty(_this4.state.title);
2498
- },
2499
- showError: function showError() {
2500
- return _this4.state.showWarnings && ___default['default'].isEmpty(_this4.state.title);
2501
- },
2502
- alwaysShowLabel: true
2503
- }), /*#__PURE__*/React__default['default'].createElement(Components$1.GenericInput, {
2504
- id: "description",
2505
- label: "Description of work required",
2506
- type: "textarea",
2507
- placeholder: "Description of work required",
2508
- value: this.state.description,
2509
- onChange: function onChange(e) {
2510
- return _this4.onHandleChange(e);
2511
- },
2512
- inputStyle: {
2513
- height: 80
2514
- },
2515
- alwaysShowLabel: true
2516
- }), /*#__PURE__*/React__default['default'].createElement(Components$1.RadioButton, {
2517
- label: "Person must be home during work?",
2518
- isActive: this.state.isHome,
2519
- options: [{
2520
- Label: 'No',
2521
- Value: false,
2522
- onChange: function onChange() {
2523
- return _this4.setState({
2524
- isHome: false
2525
- });
2526
- }
2497
+ if (!this.state.addNoteOpen) return null;
2498
+
2499
+ if (this.state.submittingNote) {
2500
+ return /*#__PURE__*/React__default['default'].createElement(Components$1.Popup, {
2501
+ title: "Saving Note",
2502
+ maxWidth: 600,
2503
+ hasPadding: true
2504
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
2505
+ className: "flex flex-center-row"
2506
+ }, /*#__PURE__*/React__default['default'].createElement(FontAwesome__default['default'], {
2507
+ className: "spinner",
2508
+ name: "spinner fa-pulse fa-fw"
2509
+ })));
2510
+ }
2511
+
2512
+ return /*#__PURE__*/React__default['default'].createElement(Components$1.Popup, {
2513
+ title: "".concat(this.state.editingNote ? 'Edit' : 'Add', " Note"),
2514
+ onClose: this.onCloseAddNote,
2515
+ maxWidth: 600,
2516
+ hasPadding: true,
2517
+ buttons: [{
2518
+ type: 'primary',
2519
+ onClick: this.onConfirmAddNote,
2520
+ isActive: this.isReadyToSaveNote(),
2521
+ text: 'Save'
2527
2522
  }, {
2528
- Label: 'Yes',
2529
- Value: true,
2530
- onChange: function onChange() {
2531
- return _this4.setState({
2532
- isHome: true
2533
- });
2534
- }
2523
+ type: 'tertiary',
2524
+ onClick: this.onCloseAddNote,
2525
+ isActive: true,
2526
+ text: 'Cancel'
2535
2527
  }]
2536
- }), this.state.isHome && /*#__PURE__*/React__default['default'].createElement(Components$1.GenericInput, {
2537
- style: {
2538
- marginTop: 16
2539
- },
2540
- label: "Description of person's available times",
2541
- id: "homeText",
2528
+ }, /*#__PURE__*/React__default['default'].createElement(Components$1.GenericInput, {
2529
+ id: "noteInput",
2542
2530
  type: "textarea",
2543
- placeholder: "Description of person's available times",
2544
- value: this.state.homeText,
2531
+ componentClass: "textarea",
2532
+ value: this.state.noteInput,
2533
+ placeholder: "Enter note",
2545
2534
  onChange: function onChange(e) {
2546
- return _this4.onHandleChange(e);
2547
- },
2548
- inputStyle: {
2549
- height: 80
2535
+ return _this6.onHandleChange(e);
2550
2536
  },
2551
- isRequired: true,
2552
- isValid: function isValid() {
2553
- return !___default['default'].isEmpty(_this4.state.homeText);
2537
+ inputStyle: {
2538
+ width: 400
2539
+ }
2540
+ }), /*#__PURE__*/React__default['default'].createElement(Components$1.Text, {
2541
+ type: "h5"
2542
+ }, "Attachments"), this.state.noteAttachments.map(function (a, i) {
2543
+ return _this6.renderAttachment(a, i, _this6.onRemoveAttachment);
2544
+ }), /*#__PURE__*/React__default['default'].createElement("input", {
2545
+ ref: function ref(input) {
2546
+ return _this6.attachmentInput = input;
2554
2547
  },
2555
- showError: function showError() {
2556
- return _this4.state.showWarnings && ___default['default'].isEmpty(_this4.state.homeText);
2548
+ id: "attachmentInput",
2549
+ type: "file",
2550
+ className: "fileInput",
2551
+ onChange: function onChange(e) {
2552
+ return _this6.onHandlePDFFileChange(e);
2557
2553
  },
2558
- alwaysShowLabel: true
2559
- })));
2554
+ accept: "application/pdf"
2555
+ }), /*#__PURE__*/React__default['default'].createElement("div", {
2556
+ className: "iconTextButton",
2557
+ onClick: function onClick() {
2558
+ _this6.attachmentInput.click();
2559
+ }
2560
+ }, /*#__PURE__*/React__default['default'].createElement(FontAwesome__default['default'], {
2561
+ className: "iconTextButton_icon",
2562
+ name: "paperclip"
2563
+ }), /*#__PURE__*/React__default['default'].createElement("p", {
2564
+ className: "iconTextButton_text"
2565
+ }, "Add Attachment")));
2560
2566
  }
2561
2567
  }, {
2562
2568
  key: "render",
2563
2569
  value: function render() {
2564
- var success = this.state.success;
2565
- return /*#__PURE__*/React__default['default'].createElement(Components$1.OverlayPage, null, /*#__PURE__*/React__default['default'].createElement(Components$1.OverlayPageContents, {
2566
- noBottomButtons: success
2567
- }, /*#__PURE__*/React__default['default'].createElement(Components$1.OverlayPageSection, {
2570
+ return /*#__PURE__*/React__default['default'].createElement(Components$1.OverlayPage, null, this.renderAddNotePopup(), /*#__PURE__*/React__default['default'].createElement(Components$1.OverlayPageContents, null, /*#__PURE__*/React__default['default'].createElement(Components$1.OverlayPageSection, {
2568
2571
  className: "pageSectionWrapper--newPopup"
2569
- }, /*#__PURE__*/React__default['default'].createElement("div", null, this.renderSuccess(), !success && this.renderMain()))), /*#__PURE__*/React__default['default'].createElement(Components$1.OverlayPageBottomButtons, null, this.renderSubmit()));
2572
+ }, this.renderInner()), /*#__PURE__*/React__default['default'].createElement(Components$1.OverlayPageSection, {
2573
+ className: "pageSectionWrapper--newPopupSide pageSectionWrapper--newPopupSide-fixedWidth"
2574
+ }, this.renderOverview())), /*#__PURE__*/React__default['default'].createElement(Components$1.OverlayPageBottomButtons, null, this.renderButtons()));
2570
2575
  }
2571
2576
  }]);
2572
2577
 
2573
- return AddJob;
2578
+ return Job;
2574
2579
  }(React.Component);
2575
2580
 
2576
2581
  var mapStateToProps$1 = function mapStateToProps(state) {
@@ -2580,32 +2585,31 @@ var mapStateToProps$1 = function mapStateToProps(state) {
2580
2585
  };
2581
2586
  };
2582
2587
 
2583
- var AddJob$1 = reactRedux.connect(mapStateToProps$1, {
2584
- jobsUpdate: jobsUpdate,
2585
- jobsLoaded: jobsLoaded,
2586
- addRecentlyCreated: Actions.addRecentlyCreated
2587
- })(reactRouter.withRouter(AddJob));
2588
+ var Job$1 = reactRedux.connect(mapStateToProps$1, {
2589
+ jobsLoaded: jobsLoaded
2590
+ })(reactRouter.withRouter(Job));
2588
2591
 
2589
2592
  function _createSuper$6(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$6(); return function _createSuperInternal() { var Super = _getPrototypeOf__default['default'](Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf__default['default'](this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn__default['default'](this, result); }; }
2590
2593
 
2591
2594
  function _isNativeReflectConstruct$6() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
2592
- var Session = PlussCore__namespace.Session,
2595
+ var Actions = PlussCore__namespace.Actions,
2593
2596
  Components = PlussCore__namespace.Components,
2594
- Helper = PlussCore__namespace.Helper;
2597
+ Helper = PlussCore__namespace.Helper,
2598
+ Session = PlussCore__namespace.Session;
2595
2599
 
2596
- var JobTypes = /*#__PURE__*/function (_Component) {
2597
- _inherits__default['default'](JobTypes, _Component);
2600
+ var AddJob = /*#__PURE__*/function (_Component) {
2601
+ _inherits__default['default'](AddJob, _Component);
2598
2602
 
2599
- var _super = _createSuper$6(JobTypes);
2603
+ var _super = _createSuper$6(AddJob);
2600
2604
 
2601
- function JobTypes(props) {
2605
+ function AddJob(props) {
2602
2606
  var _this;
2603
2607
 
2604
- _classCallCheck__default['default'](this, JobTypes);
2608
+ _classCallCheck__default['default'](this, AddJob);
2605
2609
 
2606
2610
  _this = _super.call(this, props);
2607
2611
 
2608
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "getJobTypes", /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee() {
2612
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "getJob", /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee() {
2609
2613
  var res;
2610
2614
  return _regeneratorRuntime__default['default'].wrap(function _callee$(_context) {
2611
2615
  while (1) {
@@ -2613,141 +2617,76 @@ var JobTypes = /*#__PURE__*/function (_Component) {
2613
2617
  case 0:
2614
2618
  _context.prev = 0;
2615
2619
  _context.next = 3;
2616
- return maintenanceActions.getJobTypes(_this.props.auth.site);
2620
+ return maintenanceActions.getJob(_this.props.auth.site, _this.state.jobId);
2617
2621
 
2618
2622
  case 3:
2619
2623
  res = _context.sent;
2620
- if (res.data != null) _this.props.jobTypesLoaded(res.data);
2621
- _context.next = 10;
2622
- break;
2623
-
2624
- case 7:
2625
- _context.prev = 7;
2626
- _context.t0 = _context["catch"](0);
2627
- console.error('getJobTypes', _context.t0);
2624
+ res.data.location = res.data.site;
2628
2625
 
2629
- case 10:
2630
- _context.prev = 10;
2626
+ _this.setState(res.data);
2631
2627
 
2632
- _this.setState({
2633
- loading: false
2634
- });
2628
+ _context.next = 11;
2629
+ break;
2635
2630
 
2636
- return _context.finish(10);
2631
+ case 8:
2632
+ _context.prev = 8;
2633
+ _context.t0 = _context["catch"](0);
2634
+ console.error('getJob', _context.t0);
2637
2635
 
2638
- case 13:
2636
+ case 11:
2639
2637
  case "end":
2640
2638
  return _context.stop();
2641
2639
  }
2642
2640
  }
2643
- }, _callee, null, [[0, 7, 10, 13]]);
2641
+ }, _callee, null, [[0, 8]]);
2644
2642
  })));
2645
2643
 
2646
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "sortByCol", function (col) {
2647
- if (_this.state.sortColumn === col) {
2648
- _this.setState({
2649
- sortDesc: !_this.state.sortDesc
2650
- });
2651
- } else {
2652
- _this.setState({
2653
- sortColumn: col,
2654
- sortDesc: false
2655
- });
2656
- }
2657
- });
2658
-
2659
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "validateEmail", function () {
2660
- var jobTypeEmail = _this.state.jobTypeEmail;
2661
- return !___default['default'].isEmpty(jobTypeEmail) && Helper.isEmail(jobTypeEmail);
2662
- });
2663
-
2664
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "isJobTypeValid", function () {
2665
- var _this$state = _this.state,
2666
- jobTypeName = _this$state.jobTypeName,
2667
- jobTypeDescription = _this$state.jobTypeDescription;
2668
- if (___default['default'].isEmpty(jobTypeName)) return false;
2669
- if (!_this.validateEmail()) return false;
2670
- if (___default['default'].isEmpty(jobTypeDescription)) return false;
2671
- return true;
2672
- });
2673
-
2674
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onRemoveJobType", /*#__PURE__*/function () {
2675
- var _ref2 = _asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee2(ev) {
2676
- var index, newJobTypes;
2677
- return _regeneratorRuntime__default['default'].wrap(function _callee2$(_context2) {
2678
- while (1) {
2679
- switch (_context2.prev = _context2.next) {
2680
- case 0:
2681
- if (window.confirm("Are you sure you want to delete ".concat(ev.typeName, "?"))) {
2682
- _context2.next = 2;
2683
- break;
2684
- }
2685
-
2686
- return _context2.abrupt("return");
2687
-
2688
- case 2:
2689
- _context2.prev = 2;
2690
- _context2.next = 5;
2691
- return maintenanceActions.deleteJobType(_this.props.auth.site, ev.id);
2644
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "getJobTypes", /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee2() {
2645
+ var res;
2646
+ return _regeneratorRuntime__default['default'].wrap(function _callee2$(_context2) {
2647
+ while (1) {
2648
+ switch (_context2.prev = _context2.next) {
2649
+ case 0:
2650
+ _context2.prev = 0;
2651
+ _context2.next = 3;
2652
+ return maintenanceActions.getJobTypes(_this.props.auth.site);
2692
2653
 
2693
- case 5:
2694
- index = ___default['default'].findIndex(_this.state.jobList, function (job) {
2695
- return job != null && job.id === ev.id;
2696
- });
2654
+ case 3:
2655
+ res = _context2.sent;
2697
2656
 
2698
- if (index > -1) {
2699
- newJobTypes = _toConsumableArray__default['default'](_this.state.jobList);
2700
- newJobTypes[index].Deleted = true;
2657
+ _this.setState({
2658
+ types: res.data
2659
+ });
2701
2660
 
2702
- _this.props.jobTypesLoaded(newJobTypes);
2703
- }
2661
+ _this.getDefaultJob();
2704
2662
 
2705
- _context2.next = 13;
2706
- break;
2663
+ _context2.next = 11;
2664
+ break;
2707
2665
 
2708
- case 9:
2709
- _context2.prev = 9;
2710
- _context2.t0 = _context2["catch"](2);
2711
- console.error('onRemoveJobType', _context2.t0);
2712
- alert('Something went wrong with the request. Please try again.');
2666
+ case 8:
2667
+ _context2.prev = 8;
2668
+ _context2.t0 = _context2["catch"](0);
2669
+ console.error('getJobTypes', _context2.t0);
2713
2670
 
2714
- case 13:
2715
- case "end":
2716
- return _context2.stop();
2717
- }
2671
+ case 11:
2672
+ case "end":
2673
+ return _context2.stop();
2718
2674
  }
2719
- }, _callee2, null, [[2, 9]]);
2720
- }));
2721
-
2722
- return function (_x) {
2723
- return _ref2.apply(this, arguments);
2724
- };
2725
- }());
2726
-
2727
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onShowJobType", function () {
2728
- var job = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
2675
+ }
2676
+ }, _callee2, null, [[0, 8]]);
2677
+ })));
2729
2678
 
2730
- _this.setState({
2731
- showJobType: true,
2732
- jobTypeId: job ? job.id : null,
2733
- jobTypeName: job ? job.typeName : '',
2734
- jobTypeEmail: job ? job.email : '',
2735
- jobTypeDescription: job ? job.description : '',
2736
- jobTypeLevel: job ? job.level : 1
2737
- });
2679
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "getDefaultJob", function () {
2680
+ if (_this.state.types.length !== 0 && _this.state.jobId == null) {
2681
+ _this.setState({
2682
+ type: _this.state.types[0].typeName
2683
+ });
2684
+ }
2738
2685
  });
2739
2686
 
2740
- _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onHideJobType", function () {
2741
- if (_this.state.submitting) return;
2742
-
2687
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onSelectType", function (key, e) {
2743
2688
  _this.setState({
2744
- showWarnings: false,
2745
- showJobType: false,
2746
- jobTypeId: null,
2747
- jobTypeName: '',
2748
- jobTypeEmail: '',
2749
- jobTypeDescription: '',
2750
- jobTypeLevel: 1
2689
+ type: key
2751
2690
  });
2752
2691
  });
2753
2692
 
@@ -2759,17 +2698,11 @@ var JobTypes = /*#__PURE__*/function (_Component) {
2759
2698
  });
2760
2699
 
2761
2700
  _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onSave", function () {
2762
- var site = _this.props.auth.site;
2763
- var _this$state2 = _this.state,
2764
- submitting = _this$state2.submitting,
2765
- jobTypeId = _this$state2.jobTypeId,
2766
- jobTypeName = _this$state2.jobTypeName,
2767
- jobTypeEmail = _this$state2.jobTypeEmail,
2768
- jobTypeDescription = _this$state2.jobTypeDescription,
2769
- jobTypeLevel = _this$state2.jobTypeLevel;
2770
- if (submitting) return;
2701
+ _this.setState({
2702
+ showWarnings: false
2703
+ });
2771
2704
 
2772
- if (!_this.isJobTypeValid()) {
2705
+ if (!_this.validateForm()) {
2773
2706
  _this.setState({
2774
2707
  showWarnings: true
2775
2708
  });
@@ -2777,391 +2710,349 @@ var JobTypes = /*#__PURE__*/function (_Component) {
2777
2710
  return;
2778
2711
  }
2779
2712
 
2780
- _this.setState({
2781
- submitting: true
2782
- }, /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee3() {
2783
- return _regeneratorRuntime__default['default'].wrap(function _callee3$(_context3) {
2784
- while (1) {
2785
- switch (_context3.prev = _context3.next) {
2786
- case 0:
2787
- _context3.prev = 0;
2788
-
2789
- if (!jobTypeId) {
2790
- _context3.next = 6;
2791
- break;
2792
- }
2793
-
2794
- _context3.next = 4;
2795
- return maintenanceActions.editJobType(site, jobTypeId, jobTypeName, jobTypeEmail, jobTypeDescription, jobTypeLevel);
2796
-
2797
- case 4:
2798
- _context3.next = 8;
2799
- break;
2800
-
2801
- case 6:
2802
- _context3.next = 8;
2803
- return maintenanceActions.addJobType(site, jobTypeName, jobTypeEmail, jobTypeDescription, jobTypeLevel);
2713
+ if (_this.state.updating) return;
2804
2714
 
2805
- case 8:
2806
- _this.props.jobTypesUpdate(site);
2715
+ _this.setState({
2716
+ updating: true
2717
+ });
2807
2718
 
2808
- _this.setState({
2809
- submitting: false
2810
- }, _this.onHideJobType);
2719
+ var job = {
2720
+ id: _this.state.id,
2721
+ userID: _this.state.userID,
2722
+ userName: _this.state.userName,
2723
+ room: _this.state.room,
2724
+ phone: _this.state.phone,
2725
+ location: _this.state.location,
2726
+ title: _this.state.title,
2727
+ description: _this.state.description,
2728
+ isHome: _this.state.isHome,
2729
+ homeText: _this.state.homeText,
2730
+ type: _this.state.type,
2731
+ date: null,
2732
+ image: _this.state.image
2733
+ };
2811
2734
 
2812
- _context3.next = 17;
2813
- break;
2735
+ if (_this.state.id != null) {
2736
+ maintenanceActions.editJob(job, _this.props.auth.site).then(function (res) {
2737
+ _this.setState({
2738
+ success: true,
2739
+ updating: false
2740
+ });
2814
2741
 
2815
- case 12:
2816
- _context3.prev = 12;
2817
- _context3.t0 = _context3["catch"](0);
2818
- console.error('onSave', _context3.t0);
2742
+ _this.props.jobsLoaded([job]);
2743
+ }).catch(function (res) {
2744
+ _this.setState({
2745
+ updating: false
2746
+ });
2819
2747
 
2820
- _this.setState({
2821
- submitting: false
2822
- });
2748
+ alert('Something went wrong with the request. Please try again.');
2749
+ });
2750
+ } else {
2751
+ // Create New Job
2752
+ job.userID = 'undefined';
2753
+ maintenanceActions.createJob(job).then(function (res) {
2754
+ _this.setState({
2755
+ success: true,
2756
+ updating: false
2757
+ });
2823
2758
 
2824
- alert('Something went wrong with the request. Please try again.');
2759
+ _this.props.jobsUpdate(_this.props.auth.site);
2760
+ }).catch(function (res) {
2761
+ _this.setState({
2762
+ updating: false
2763
+ });
2825
2764
 
2826
- case 17:
2827
- case "end":
2828
- return _context3.stop();
2829
- }
2830
- }
2831
- }, _callee3, null, [[0, 12]]);
2832
- })));
2765
+ alert('Something went wrong with the request. Please try again.');
2766
+ });
2767
+ }
2833
2768
  });
2834
2769
 
2835
2770
  _this.state = {
2836
- jobList: [],
2837
- showCompleted: false,
2838
- sortColumn: 'name',
2839
- sortDesc: false,
2840
- loading: true,
2841
- showJobType: false,
2842
- jobTypeId: null,
2843
- jobTypeName: '',
2844
- jobTypeEmail: '',
2845
- jobTypeDescription: '',
2846
- jobTypeLevel: 1,
2771
+ jobId: Helper.safeReadParams(_this.props, 'jobId') ? _this.props.match.params.jobId : null,
2772
+ job: null,
2773
+ showingSelector: false,
2774
+ updating: false,
2775
+ connected: false,
2776
+ types: [],
2777
+ id: null,
2778
+ userID: '',
2779
+ userName: '',
2780
+ room: '',
2781
+ phone: '',
2782
+ location: _this.props.auth.site,
2783
+ title: '',
2784
+ description: '',
2785
+ isHome: false,
2786
+ homeText: '',
2787
+ type: 'General',
2788
+ image: null,
2789
+ thumbnail: null,
2847
2790
  showWarnings: false,
2848
- submitting: false
2791
+ success: false
2849
2792
  };
2850
2793
  return _this;
2851
2794
  }
2852
2795
 
2853
- _createClass__default['default'](JobTypes, [{
2854
- key: "componentWillMount",
2855
- value: function componentWillMount() {
2856
- this.updateProps(this.props);
2796
+ _createClass__default['default'](AddJob, [{
2797
+ key: "UNSAFE_componentWillMount",
2798
+ value: function UNSAFE_componentWillMount() {
2857
2799
  Session.checkLoggedIn(this, this.props.auth);
2858
2800
  }
2859
2801
  }, {
2860
2802
  key: "componentDidMount",
2861
2803
  value: function componentDidMount() {
2862
2804
  this.getJobTypes();
2805
+ if (this.state.jobId) this.getJob();
2806
+ this.props.addRecentlyCreated('maintenance');
2863
2807
  }
2864
2808
  }, {
2865
- key: "componentWillReceiveProps",
2866
- value: function componentWillReceiveProps(nextProps) {
2867
- this.updateProps(nextProps);
2868
- }
2869
- }, {
2870
- key: "updateProps",
2871
- value: function updateProps(props) {
2872
- this.setState({
2873
- jobList: props.jobtypes
2874
- });
2875
- }
2876
- }, {
2877
- key: "renderList",
2878
- value: function renderList() {
2809
+ key: "renderTypeOptions",
2810
+ value: function renderTypeOptions() {
2879
2811
  var _this2 = this;
2880
2812
 
2881
- var source = ___default['default'].sortBy(this.state.jobList, this.state.sortColumn);
2882
-
2883
- if (this.state.sortDesc) source.reverse();
2884
- source = ___default['default'].filter(source, function (ev) {
2885
- if (!ev) return false;
2886
- if (ev.Deleted) return false;
2887
- return true;
2888
- });
2889
- return source.map(function (ev, index) {
2813
+ var source = this.state.types;
2814
+ return source.map(function (ev) {
2890
2815
  if (ev != null) {
2891
- return /*#__PURE__*/React__default['default'].createElement("tr", {
2892
- key: index
2893
- }, /*#__PURE__*/React__default['default'].createElement("td", {
2894
- className: "table-TitleColumn"
2895
- }, /*#__PURE__*/React__default['default'].createElement("a", {
2896
- onClick: function onClick() {
2897
- return _this2.onShowJobType(ev);
2898
- }
2899
- }, ev.typeName)), /*#__PURE__*/React__default['default'].createElement("td", null, ev.description), /*#__PURE__*/React__default['default'].createElement("td", null, ev.email), /*#__PURE__*/React__default['default'].createElement("td", {
2900
- className: "table-options"
2901
- }, /*#__PURE__*/React__default['default'].createElement("div", {
2902
- style: {
2903
- display: 'flex',
2904
- alignItems: 'center'
2905
- }
2906
- }, Session.validateAccess(_this2.props.auth.site, 'maintenanceTypes', _this2.props.auth) && /*#__PURE__*/React__default['default'].createElement("a", {
2907
- onClick: function onClick() {
2908
- return _this2.onShowJobType(ev);
2909
- }
2910
- }, /*#__PURE__*/React__default['default'].createElement(FontAwesome__default['default'], {
2911
- style: {
2912
- fontSize: 20,
2913
- padding: 5,
2914
- marginLeft: 12,
2915
- cursor: 'pointer'
2916
- },
2917
- name: "pencil"
2918
- })), Session.validateAccess(_this2.props.auth.site, 'maintenanceTypes', _this2.props.auth) && /*#__PURE__*/React__default['default'].createElement("a", {
2919
- onClick: function onClick() {
2920
- return _this2.onRemoveJobType(ev);
2921
- }
2922
- }, /*#__PURE__*/React__default['default'].createElement(FontAwesome__default['default'], {
2923
- style: {
2924
- fontSize: 20,
2925
- padding: 5,
2926
- marginLeft: 8,
2927
- cursor: 'pointer'
2928
- },
2929
- name: "minus-circle"
2930
- })))));
2816
+ return /*#__PURE__*/React__default['default'].createElement(reactBootstrap.MenuItem, {
2817
+ key: ev.typeName,
2818
+ eventKey: ev.typeName,
2819
+ active: _this2.state.type === ev.typeName
2820
+ }, ev.typeName);
2931
2821
  }
2932
2822
 
2933
2823
  return null;
2934
2824
  });
2935
2825
  }
2936
2826
  }, {
2937
- key: "renderView",
2938
- value: function renderView() {
2939
- var _this3 = this;
2940
-
2941
- return /*#__PURE__*/React__default['default'].createElement(reactBootstrap.Table, {
2942
- className: "plussTable",
2943
- striped: true,
2944
- bordered: true,
2945
- condensed: true,
2946
- hover: true,
2947
- style: {
2948
- minWidth: '100%'
2949
- }
2950
- }, /*#__PURE__*/React__default['default'].createElement("thead", null, /*#__PURE__*/React__default['default'].createElement("tr", null, /*#__PURE__*/React__default['default'].createElement("th", {
2951
- style: {
2952
- cursor: 'pointer'
2953
- },
2954
- onClick: function onClick() {
2955
- return _this3.sortByCol('name');
2956
- }
2957
- }, "Request type"), /*#__PURE__*/React__default['default'].createElement("th", {
2958
- style: {
2959
- cursor: 'pointer'
2960
- },
2961
- onClick: function onClick() {
2962
- return _this3.sortByCol('name');
2963
- }
2964
- }, "Type Description"), /*#__PURE__*/React__default['default'].createElement("th", {
2965
- style: {
2966
- cursor: 'pointer'
2967
- },
2968
- onClick: function onClick() {
2969
- return _this3.sortByCol('email');
2970
- }
2971
- }, "Email"), /*#__PURE__*/React__default['default'].createElement("th", {
2972
- style: {
2973
- width: 70
2974
- }
2975
- }))), /*#__PURE__*/React__default['default'].createElement("tbody", null, this.renderList()));
2976
- }
2977
- }, {
2978
- key: "renderEmpty",
2979
- value: function renderEmpty() {
2980
- return /*#__PURE__*/React__default['default'].createElement("div", {
2981
- style: {
2982
- display: 'flex',
2983
- flexDirection: 'column',
2984
- flex: 1,
2985
- justifyContent: 'center',
2986
- alignItems: 'center',
2987
- marginTop: 32
2988
- }
2989
- }, /*#__PURE__*/React__default['default'].createElement("div", {
2990
- className: "emptyState"
2991
- }), /*#__PURE__*/React__default['default'].createElement("div", {
2992
- className: "marginTop-32",
2993
- style: {
2994
- maxWidth: 500,
2995
- textAlign: 'center'
2996
- }
2997
- }, /*#__PURE__*/React__default['default'].createElement("span", {
2998
- className: "fontRegular fontSize-13"
2999
- }, "Please add the many categories of request types that exist in your village which work alongside the Maintenance area.")), /*#__PURE__*/React__default['default'].createElement("div", {
3000
- className: "marginTop-8 fontRegular fontSize-13",
3001
- style: {
3002
- maxWidth: 500,
3003
- textAlign: 'center'
3004
- }
3005
- }, "Examples might be; OH&S, Electrical, General. Remember to add a description too."));
2827
+ key: "renderSuccess",
2828
+ value: function renderSuccess() {
2829
+ if (!this.state.success) return null;
2830
+ return /*#__PURE__*/React__default['default'].createElement(Components.SuccessPopup, {
2831
+ text: "Maintenance request has been ".concat(this.state.id != null ? 'edited' : 'added'),
2832
+ buttons: [{
2833
+ type: 'outlined',
2834
+ onClick: function onClick() {
2835
+ window.history.back();
2836
+ },
2837
+ text: "Back to Maintenance"
2838
+ }]
2839
+ });
3006
2840
  }
3007
- }, {
3008
- key: "renderContent",
3009
- value: function renderContent() {
3010
- if (___default['default'].isEmpty(this.state.jobList)) return this.renderEmpty();
3011
- return this.renderView();
2841
+ }, {
2842
+ key: "validateForm",
2843
+ value: function validateForm() {
2844
+ if (___default['default'].isEmpty(this.state.userName)) return false;
2845
+ if (___default['default'].isEmpty(this.state.room)) return false;
2846
+ if (___default['default'].isEmpty(this.state.title)) return false;
2847
+ if (this.state.isHome && ___default['default'].isEmpty(this.state.homeText)) return false;
2848
+ return true;
3012
2849
  }
3013
2850
  }, {
3014
- key: "renderJobTypes",
3015
- value: function renderJobTypes() {
3016
- var _this4 = this;
3017
-
3018
- var _this$state3 = this.state,
3019
- jobList = _this$state3.jobList,
3020
- loading = _this$state3.loading;
2851
+ key: "renderSubmit",
2852
+ value: function renderSubmit() {
2853
+ var _this3 = this;
3021
2854
 
3022
- if (jobList.length === 0 && loading) {
3023
- return /*#__PURE__*/React__default['default'].createElement("div", {
3024
- style: {
3025
- minWidth: '100%'
3026
- }
3027
- }, /*#__PURE__*/React__default['default'].createElement("div", {
3028
- className: "padding-60 paddingVertical-40",
3029
- style: {
3030
- textAlign: 'center'
3031
- }
3032
- }, /*#__PURE__*/React__default['default'].createElement(FontAwesome__default['default'], {
3033
- style: {
3034
- fontSize: 30,
3035
- color: FeatureConfig.env.colourBrandingOff
3036
- },
3037
- name: "spinner fa-pulse fa-fw"
3038
- })));
2855
+ if (this.state.updating) {
2856
+ return /*#__PURE__*/React__default['default'].createElement(Components.Button, {
2857
+ buttonType: "secondary"
2858
+ }, "Saving...");
3039
2859
  }
3040
2860
 
3041
- return /*#__PURE__*/React__default['default'].createElement("div", {
3042
- style: {
3043
- minWidth: '100%'
3044
- }
3045
- }, /*#__PURE__*/React__default['default'].createElement("div", {
3046
- className: "flex flex-row flex-center flex-between marginBottom-32"
3047
- }, /*#__PURE__*/React__default['default'].createElement(Components.PageTitle, null, "Request Types"), /*#__PURE__*/React__default['default'].createElement(Components.AddButton, {
2861
+ return /*#__PURE__*/React__default['default'].createElement("div", null, /*#__PURE__*/React__default['default'].createElement(Components.Button, {
2862
+ inline: true,
2863
+ buttonType: "tertiary",
3048
2864
  onClick: function onClick() {
3049
- return _this4.onShowJobType();
2865
+ return _this3.props.history.push('/requestsHub');
3050
2866
  },
3051
- text: "NEW REQUEST TYPE"
3052
- })), this.renderContent());
2867
+ isActive: true,
2868
+ style: {
2869
+ marginRight: 16
2870
+ }
2871
+ }, "Cancel"), /*#__PURE__*/React__default['default'].createElement(Components.Button, {
2872
+ inline: true,
2873
+ buttonType: "primary",
2874
+ onClick: this.onSave,
2875
+ isActive: this.validateForm()
2876
+ }, "Save"));
3053
2877
  }
3054
2878
  }, {
3055
- key: "renderNewUserTypePopup",
3056
- value: function renderNewUserTypePopup() {
3057
- var _this5 = this;
2879
+ key: "renderMain",
2880
+ value: function renderMain() {
2881
+ var _this4 = this;
3058
2882
 
3059
- var _this$state4 = this.state,
3060
- submitting = _this$state4.submitting,
3061
- showJobType = _this$state4.showJobType,
3062
- jobTypeId = _this$state4.jobTypeId,
3063
- showWarnings = _this$state4.showWarnings,
3064
- jobTypeName = _this$state4.jobTypeName,
3065
- jobTypeEmail = _this$state4.jobTypeEmail,
3066
- jobTypeDescription = _this$state4.jobTypeDescription;
3067
- if (!showJobType) return null;
3068
- return /*#__PURE__*/React__default['default'].createElement(Components.Popup, {
3069
- maxWidth: 800,
3070
- hasPadding: true,
3071
- buttons: [{
3072
- type: 'primaryAction',
3073
- onClick: this.onSave,
3074
- isActive: !submitting && this.isJobTypeValid(),
3075
- text: submitting ? 'Saving...' : 'Save',
3076
- className: 'popupButton'
3077
- }, {
3078
- type: 'outlinedAction',
3079
- onClick: this.onHideJobType,
3080
- isActive: !submitting,
3081
- text: 'Cancel',
3082
- className: 'popupButton'
3083
- }],
3084
- onClose: this.onHideJobType,
3085
- title: jobTypeId ? 'Edit Request Type' : 'Create New Request Type'
3086
- }, /*#__PURE__*/React__default['default'].createElement(Components.GenericInput, {
3087
- id: "jobTypeName",
2883
+ return /*#__PURE__*/React__default['default'].createElement("div", {
2884
+ style: {
2885
+ marginBottom: 15
2886
+ }
2887
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
2888
+ className: "padding-60 paddingVertical-40 bottomDivideBorder"
2889
+ }, /*#__PURE__*/React__default['default'].createElement(Components.Text, {
2890
+ type: "formTitleLarge",
2891
+ className: "marginBottom-24"
2892
+ }, this.state.infoId == null ? 'New' : 'Edit', " Request"), /*#__PURE__*/React__default['default'].createElement(Components.GenericInput, {
2893
+ id: "userName",
3088
2894
  type: "text",
3089
- label: "Request type title",
3090
- placeholder: "Request type title",
3091
- value: jobTypeName,
3092
- onChange: this.onHandleChange,
2895
+ label: "Name",
2896
+ placeholder: "Insert name here",
2897
+ value: this.state.userName,
2898
+ onChange: function onChange(e) {
2899
+ return _this4.onHandleChange(e);
2900
+ },
3093
2901
  isRequired: true,
2902
+ alwaysShowLabel: true,
3094
2903
  isValid: function isValid() {
3095
- return !___default['default'].isEmpty(jobTypeName);
2904
+ return !___default['default'].isEmpty(_this4.state.userName);
3096
2905
  },
3097
2906
  showError: function showError() {
3098
- return showWarnings && ___default['default'].isEmpty(jobTypeName);
2907
+ return _this4.state.showWarnings && ___default['default'].isEmpty(_this4.state.userName);
2908
+ }
2909
+ }), /*#__PURE__*/React__default['default'].createElement(Components.GenericInput, {
2910
+ id: "room",
2911
+ type: "text",
2912
+ label: "Location",
2913
+ placeholder: "Insert address here",
2914
+ value: this.state.room,
2915
+ onChange: function onChange(e) {
2916
+ return _this4.onHandleChange(e);
3099
2917
  },
3100
- alwaysShowLabel: true
2918
+ isRequired: true,
2919
+ alwaysShowLabel: true,
2920
+ isValid: function isValid() {
2921
+ return !___default['default'].isEmpty(_this4.state.room);
2922
+ },
2923
+ showError: function showError() {
2924
+ return _this4.state.showWarnings && ___default['default'].isEmpty(_this4.state.room);
2925
+ }
3101
2926
  }), /*#__PURE__*/React__default['default'].createElement(Components.GenericInput, {
3102
- id: "jobTypeEmail",
2927
+ id: "phone",
3103
2928
  type: "text",
3104
- label: "Email",
3105
- placeholder: "Request email",
3106
- help: "This is the email address that'll receive service requests of this type",
3107
- value: jobTypeEmail,
3108
- onChange: this.onHandleChange,
2929
+ label: "Contact number",
2930
+ placeholder: "04XX XXX XXX",
2931
+ value: this.state.phone // showError={this.state.showWarnings && !this.validateImage()}
2932
+ ,
2933
+ onChange: function onChange(e) {
2934
+ return _this4.onHandleChange(e);
2935
+ },
2936
+ alwaysShowLabel: true
2937
+ }), /*#__PURE__*/React__default['default'].createElement("div", {
2938
+ style: {
2939
+ marginBottom: 15
2940
+ }
2941
+ }, /*#__PURE__*/React__default['default'].createElement(Components.Text, {
2942
+ type: "formLabel"
2943
+ }, "Job Type"), /*#__PURE__*/React__default['default'].createElement(reactBootstrap.DropdownButton, {
2944
+ style: {
2945
+ minWidth: 80
2946
+ },
2947
+ bsStyle: "default",
2948
+ title: this.state.type,
2949
+ id: "typeSelect",
2950
+ onSelect: this.onSelectType
2951
+ }, this.renderTypeOptions())), /*#__PURE__*/React__default['default'].createElement(Components.GenericInput, {
2952
+ id: "title",
2953
+ label: "Title for the work required",
2954
+ type: "textarea",
2955
+ placeholder: "Title for the work required",
2956
+ value: this.state.title,
2957
+ onChange: function onChange(e) {
2958
+ return _this4.onHandleChange(e);
2959
+ },
2960
+ inputStyle: {
2961
+ height: 80
2962
+ },
3109
2963
  isRequired: true,
3110
- isValid: this.validateEmail,
2964
+ isValid: function isValid() {
2965
+ return !___default['default'].isEmpty(_this4.state.title);
2966
+ },
3111
2967
  showError: function showError() {
3112
- return showWarnings && !_this5.validateEmail();
2968
+ return _this4.state.showWarnings && ___default['default'].isEmpty(_this4.state.title);
3113
2969
  },
3114
2970
  alwaysShowLabel: true
3115
2971
  }), /*#__PURE__*/React__default['default'].createElement(Components.GenericInput, {
3116
- id: "jobTypeDescription",
3117
- type: "text",
3118
- label: "Description",
3119
- placeholder: "Add a description. ",
3120
- help: "This description will be visible to the people to help them select the correct request type.",
3121
- value: jobTypeDescription,
3122
- onChange: this.onHandleChange,
2972
+ id: "description",
2973
+ label: "Description of work required",
2974
+ type: "textarea",
2975
+ placeholder: "Description of work required",
2976
+ value: this.state.description,
2977
+ onChange: function onChange(e) {
2978
+ return _this4.onHandleChange(e);
2979
+ },
2980
+ inputStyle: {
2981
+ height: 80
2982
+ },
2983
+ alwaysShowLabel: true
2984
+ }), /*#__PURE__*/React__default['default'].createElement(Components.RadioButton, {
2985
+ label: "Person must be home during work?",
2986
+ isActive: this.state.isHome,
2987
+ options: [{
2988
+ Label: 'No',
2989
+ Value: false,
2990
+ onChange: function onChange() {
2991
+ return _this4.setState({
2992
+ isHome: false
2993
+ });
2994
+ }
2995
+ }, {
2996
+ Label: 'Yes',
2997
+ Value: true,
2998
+ onChange: function onChange() {
2999
+ return _this4.setState({
3000
+ isHome: true
3001
+ });
3002
+ }
3003
+ }]
3004
+ }), this.state.isHome && /*#__PURE__*/React__default['default'].createElement(Components.GenericInput, {
3005
+ style: {
3006
+ marginTop: 16
3007
+ },
3008
+ label: "Description of person's available times",
3009
+ id: "homeText",
3010
+ type: "textarea",
3011
+ placeholder: "Description of person's available times",
3012
+ value: this.state.homeText,
3013
+ onChange: function onChange(e) {
3014
+ return _this4.onHandleChange(e);
3015
+ },
3016
+ inputStyle: {
3017
+ height: 80
3018
+ },
3123
3019
  isRequired: true,
3124
3020
  isValid: function isValid() {
3125
- return !___default['default'].isEmpty(jobTypeDescription);
3021
+ return !___default['default'].isEmpty(_this4.state.homeText);
3126
3022
  },
3127
3023
  showError: function showError() {
3128
- return showWarnings && ___default['default'].isEmpty(jobTypeDescription);
3024
+ return _this4.state.showWarnings && ___default['default'].isEmpty(_this4.state.homeText);
3129
3025
  },
3130
3026
  alwaysShowLabel: true
3131
- }));
3027
+ })));
3132
3028
  }
3133
3029
  }, {
3134
3030
  key: "render",
3135
3031
  value: function render() {
3136
- return /*#__PURE__*/React__default['default'].createElement("div", {
3137
- className: "hub-wrapperContainer"
3138
- }, /*#__PURE__*/React__default['default'].createElement("div", {
3139
- className: "hub-headerContentWrapper"
3140
- }, /*#__PURE__*/React__default['default'].createElement(Components.Header, null), /*#__PURE__*/React__default['default'].createElement("div", {
3141
- className: "hub-contentWrapper",
3142
- style: {
3143
- position: 'relative'
3144
- }
3145
- }, this.renderJobTypes()), this.renderNewUserTypePopup()));
3032
+ var success = this.state.success;
3033
+ return /*#__PURE__*/React__default['default'].createElement(Components.OverlayPage, null, /*#__PURE__*/React__default['default'].createElement(Components.OverlayPageContents, {
3034
+ noBottomButtons: success
3035
+ }, /*#__PURE__*/React__default['default'].createElement(Components.OverlayPageSection, {
3036
+ className: "pageSectionWrapper--newPopup"
3037
+ }, /*#__PURE__*/React__default['default'].createElement("div", null, this.renderSuccess(), !success && this.renderMain()))), /*#__PURE__*/React__default['default'].createElement(Components.OverlayPageBottomButtons, null, this.renderSubmit()));
3146
3038
  }
3147
3039
  }]);
3148
3040
 
3149
- return JobTypes;
3041
+ return AddJob;
3150
3042
  }(React.Component);
3151
3043
 
3152
3044
  var mapStateToProps = function mapStateToProps(state) {
3153
- var jobtypes = state.maintenance.jobtypes;
3154
3045
  var auth = state.auth;
3155
3046
  return {
3156
- jobtypes: jobtypes,
3157
3047
  auth: auth
3158
3048
  };
3159
3049
  };
3160
3050
 
3161
- var JobTypes$1 = reactRedux.connect(mapStateToProps, {
3162
- jobTypesLoaded: jobTypesLoaded,
3163
- jobTypesUpdate: jobTypesUpdate
3164
- })(reactRouter.withRouter(JobTypes));
3051
+ var AddJob$1 = reactRedux.connect(mapStateToProps, {
3052
+ jobsUpdate: jobsUpdate,
3053
+ jobsLoaded: jobsLoaded,
3054
+ addRecentlyCreated: Actions.addRecentlyCreated
3055
+ })(reactRouter.withRouter(AddJob));
3165
3056
 
3166
3057
  function ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
3167
3058
 
@@ -3556,8 +3447,7 @@ var Reducers = {
3556
3447
  var Screens = {
3557
3448
  RequestsHub: RequestsHub$1,
3558
3449
  Job: Job$1,
3559
- AddJob: AddJob$1,
3560
- JobTypes: JobTypes$1
3450
+ AddJob: AddJob$1
3561
3451
  };
3562
3452
 
3563
3453
  exports.ActivityText = ActivityText;