@plusscommunities/pluss-maintenance-app 1.1.12 → 1.2.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.
Files changed (44) hide show
  1. package/dist/module/actions/JobActions.js +14 -0
  2. package/dist/module/actions/JobActions.js.map +1 -0
  3. package/dist/module/actions/index.js +2 -0
  4. package/dist/module/actions/index.js.map +1 -0
  5. package/dist/module/actions/types.js +3 -0
  6. package/dist/module/actions/types.js.map +1 -0
  7. package/dist/module/apis/generalActions.js +145 -0
  8. package/dist/module/apis/generalActions.js.map +1 -0
  9. package/dist/module/apis/index.js +2 -0
  10. package/dist/module/apis/index.js.map +1 -0
  11. package/dist/module/components/MaintenanceList.js +240 -0
  12. package/dist/module/components/MaintenanceList.js.map +1 -0
  13. package/dist/module/components/MaintenanceListItem.js +282 -0
  14. package/dist/module/components/MaintenanceListItem.js.map +1 -0
  15. package/dist/module/components/MaintenanceWidgetItem.js +161 -0
  16. package/dist/module/components/MaintenanceWidgetItem.js.map +1 -0
  17. package/dist/module/components/StatusSelectorPopup.js +93 -0
  18. package/dist/module/components/StatusSelectorPopup.js.map +1 -0
  19. package/dist/module/components/WidgetLarge.js +12 -0
  20. package/dist/module/components/WidgetLarge.js.map +1 -0
  21. package/dist/module/components/WidgetSmall.js +185 -0
  22. package/dist/module/components/WidgetSmall.js.map +1 -0
  23. package/dist/module/core.config.js +17 -0
  24. package/dist/module/core.config.js.map +1 -0
  25. package/dist/module/feature.config.js +91 -0
  26. package/dist/module/feature.config.js.map +1 -0
  27. package/dist/module/helper.js +28 -0
  28. package/dist/module/helper.js.map +1 -0
  29. package/dist/module/images/speechbubble.png +0 -0
  30. package/dist/module/index.js +20 -0
  31. package/dist/module/index.js.map +1 -0
  32. package/dist/module/reducers/JobsReducer.js +59 -0
  33. package/dist/module/reducers/JobsReducer.js.map +1 -0
  34. package/dist/module/screens/JobTypePicker.js +139 -0
  35. package/dist/module/screens/JobTypePicker.js.map +1 -0
  36. package/dist/module/screens/MaintenancePage.js +99 -0
  37. package/dist/module/screens/MaintenancePage.js.map +1 -0
  38. package/dist/module/screens/RequestDetail.js +839 -0
  39. package/dist/module/screens/RequestDetail.js.map +1 -0
  40. package/dist/module/screens/RequestNotes.js +420 -0
  41. package/dist/module/screens/RequestNotes.js.map +1 -0
  42. package/dist/module/screens/ServiceRequest.js +803 -0
  43. package/dist/module/screens/ServiceRequest.js.map +1 -0
  44. package/package.json +27 -14
@@ -0,0 +1,14 @@
1
+ import { JOBS_LOADED, JOB_ADDED } from './types';
2
+ export const jobsLoaded = jobs => {
3
+ return {
4
+ type: JOBS_LOADED,
5
+ payload: jobs
6
+ };
7
+ };
8
+ export const jobAdded = job => {
9
+ return {
10
+ type: JOB_ADDED,
11
+ payload: job
12
+ };
13
+ };
14
+ //# sourceMappingURL=JobActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["JobActions.js"],"names":["JOBS_LOADED","JOB_ADDED","jobsLoaded","jobs","type","payload","jobAdded","job"],"mappings":"AAAA,SAASA,WAAT,EAAsBC,SAAtB,QAAuC,SAAvC;AAEA,OAAO,MAAMC,UAAU,GAAGC,IAAI,IAAI;AAChC,SAAO;AACLC,IAAAA,IAAI,EAAEJ,WADD;AAELK,IAAAA,OAAO,EAAEF;AAFJ,GAAP;AAID,CALM;AAOP,OAAO,MAAMG,QAAQ,GAAGC,GAAG,IAAI;AAC7B,SAAO;AACLH,IAAAA,IAAI,EAAEH,SADD;AAELI,IAAAA,OAAO,EAAEE;AAFJ,GAAP;AAID,CALM","sourcesContent":["import { JOBS_LOADED, JOB_ADDED } from './types';\n\nexport const jobsLoaded = jobs => {\n return {\n type: JOBS_LOADED,\n payload: jobs,\n };\n};\n\nexport const jobAdded = job => {\n return {\n type: JOB_ADDED,\n payload: job,\n };\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export * from './JobActions';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.js"],"names":[],"mappings":"AAAA,cAAc,cAAd","sourcesContent":["export * from './JobActions';\n"]}
@@ -0,0 +1,3 @@
1
+ export const JOBS_LOADED = 'JOBS_LOADED';
2
+ export const JOB_ADDED = 'JOB_ADDED';
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["types.js"],"names":["JOBS_LOADED","JOB_ADDED"],"mappings":"AAAA,OAAO,MAAMA,WAAW,GAAG,aAApB;AACP,OAAO,MAAMC,SAAS,GAAG,WAAlB","sourcesContent":["export const JOBS_LOADED = 'JOBS_LOADED';\nexport const JOB_ADDED = 'JOB_ADDED';\n"]}
@@ -0,0 +1,145 @@
1
+ // import axios from 'axios';
2
+ // import { getUrl } from './helper';
3
+ // import { authedFunction } from '../js';
4
+ import { Helper, Session } from '../core.config';
5
+ export const generalActions = {
6
+ getJob: (site, jobId) => {
7
+ return Session.authedFunction({
8
+ method: 'POST',
9
+ url: Helper.getUrl('maintenance', 'getJob'),
10
+ data: {
11
+ site,
12
+ jobId
13
+ }
14
+ });
15
+ },
16
+ getJobs: site => {
17
+ return Session.authedFunction({
18
+ method: 'POST',
19
+ url: Helper.getUrl('maintenance', 'getJobs'),
20
+ data: {
21
+ site
22
+ }
23
+ });
24
+ },
25
+ sendMaintenanceRequest: (userID, userName, phone, room, title, description, date, type, images, location, isHome, homeText) => {
26
+ const request = {
27
+ method: 'POST',
28
+ url: Helper.getUrl('maintenance', 'sendMaintenance'),
29
+ data: {
30
+ userID,
31
+ userName,
32
+ phone,
33
+ room,
34
+ title,
35
+ description,
36
+ date,
37
+ type,
38
+ images,
39
+ location,
40
+ isHome,
41
+ homeText
42
+ }
43
+ };
44
+ return Session.authedFunction(request);
45
+ },
46
+ editJob: (job, site) => {
47
+ return Session.authedFunction({
48
+ method: 'POST',
49
+ url: Helper.getUrl('maintenance', 'editJob'),
50
+ data: {
51
+ job,
52
+ site
53
+ }
54
+ });
55
+ },
56
+ editJobStatus: (id, status) => {
57
+ return Session.authedFunction({
58
+ method: 'POST',
59
+ url: Helper.getUrl('maintenance', 'editJobStatus'),
60
+ data: {
61
+ id,
62
+ status
63
+ }
64
+ });
65
+ },
66
+ addNote: (jobId, note, attachments) => {
67
+ return Session.authedFunction({
68
+ method: 'POST',
69
+ url: Helper.getUrl('maintenance', 'requests/note'),
70
+ data: {
71
+ id: jobId,
72
+ note,
73
+ attachments,
74
+ action: 'AddNote'
75
+ }
76
+ });
77
+ },
78
+ editNote: (jobId, noteId, note, attachments) => {
79
+ return Session.authedFunction({
80
+ method: 'POST',
81
+ url: Helper.getUrl('maintenance', 'requests/note'),
82
+ data: {
83
+ id: jobId,
84
+ note,
85
+ attachments,
86
+ noteId,
87
+ action: 'EditNote'
88
+ }
89
+ });
90
+ },
91
+ deleteNote: (jobId, noteId) => {
92
+ return Session.authedFunction({
93
+ method: 'POST',
94
+ url: Helper.getUrl('maintenance', 'requests/note'),
95
+ data: {
96
+ id: jobId,
97
+ noteId,
98
+ action: 'DeleteNote'
99
+ }
100
+ });
101
+ },
102
+ // getWeeklyMenu: async time => {
103
+ // //deprecated
104
+ // return null;
105
+ // },
106
+ getJobTypes: async site => {
107
+ const url = Helper.getUrl('maintenance', 'getjobtypes');
108
+ return Session.authedFunction({
109
+ method: 'POST',
110
+ url,
111
+ data: {
112
+ site
113
+ }
114
+ });
115
+ } // sendBookingRequest: async bookingInfo => {
116
+ // return authedFunction({
117
+ // method: 'POST',
118
+ // data: {
119
+ // bookingInfo,
120
+ // },
121
+ // url: getUrl('utility', 'sendBookingRequest'),
122
+ // });
123
+ // },
124
+ // getString: async (site, id, useDefault) => {
125
+ // return axios({
126
+ // method: 'GET',
127
+ // url: getUrl('strings', `get/${site}_${id}`, useDefault ? { useDefault } : undefined),
128
+ // }).catch(error => {
129
+ // console.log('getString error', error);
130
+ // throw error;
131
+ // });
132
+ // },
133
+ // getGeneralTerms: async () => {
134
+ // return axios({
135
+ // method: 'GET',
136
+ // url: 'https://pluss.plussapp.com.au/strings-prd/get/plussSpace_termsofuse',
137
+ // });
138
+ // },
139
+ // declineTerms: async (site, userID) => {
140
+ // //deprecated
141
+ // return null;
142
+ // },
143
+
144
+ };
145
+ //# sourceMappingURL=generalActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["generalActions.js"],"names":["Helper","Session","generalActions","getJob","site","jobId","authedFunction","method","url","getUrl","data","getJobs","sendMaintenanceRequest","userID","userName","phone","room","title","description","date","type","images","location","isHome","homeText","request","editJob","job","editJobStatus","id","status","addNote","note","attachments","action","editNote","noteId","deleteNote","getJobTypes"],"mappings":"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","sourcesContent":["// import axios from 'axios';\n// import { getUrl } from './helper';\n// import { authedFunction } from '../js';\nimport { Helper, Session } from '../core.config';\n\nexport const generalActions = {\n getJob: (site, jobId) => {\n return Session.authedFunction({\n method: 'POST',\n url: Helper.getUrl('maintenance', 'getJob'),\n data: { site, jobId },\n });\n },\n getJobs: site => {\n return Session.authedFunction({\n method: 'POST',\n url: Helper.getUrl('maintenance', 'getJobs'),\n data: { site },\n });\n },\n sendMaintenanceRequest: (userID, userName, phone, room, title, description, date, type, images, location, isHome, homeText) => {\n const request = {\n method: 'POST',\n url: Helper.getUrl('maintenance', 'sendMaintenance'),\n data: {\n userID,\n userName,\n phone,\n room,\n title,\n description,\n date,\n type,\n images,\n location,\n isHome,\n homeText,\n },\n };\n return Session.authedFunction(request);\n },\n editJob: (job, site) => {\n return Session.authedFunction({\n method: 'POST',\n url: Helper.getUrl('maintenance', 'editJob'),\n data: { job, site },\n });\n },\n editJobStatus: (id, status) => {\n return Session.authedFunction({\n method: 'POST',\n url: Helper.getUrl('maintenance', 'editJobStatus'),\n data: { id, status },\n });\n },\n addNote: (jobId, note, attachments) => {\n return Session.authedFunction({\n method: 'POST',\n url: Helper.getUrl('maintenance', 'requests/note'),\n data: {\n id: jobId,\n note,\n attachments,\n action: 'AddNote',\n },\n });\n },\n editNote: (jobId, noteId, note, attachments) => {\n return Session.authedFunction({\n method: 'POST',\n url: Helper.getUrl('maintenance', 'requests/note'),\n data: {\n id: jobId,\n note,\n attachments,\n noteId,\n action: 'EditNote',\n },\n });\n },\n deleteNote: (jobId, noteId) => {\n return Session.authedFunction({\n method: 'POST',\n url: Helper.getUrl('maintenance', 'requests/note'),\n data: {\n id: jobId,\n noteId,\n action: 'DeleteNote',\n },\n });\n },\n // getWeeklyMenu: async time => {\n // //deprecated\n // return null;\n // },\n getJobTypes: async site => {\n const url = Helper.getUrl('maintenance', 'getjobtypes');\n return Session.authedFunction({\n method: 'POST',\n url,\n data: { site },\n });\n },\n // sendBookingRequest: async bookingInfo => {\n // return authedFunction({\n // method: 'POST',\n // data: {\n // bookingInfo,\n // },\n // url: getUrl('utility', 'sendBookingRequest'),\n // });\n // },\n // getString: async (site, id, useDefault) => {\n // return axios({\n // method: 'GET',\n // url: getUrl('strings', `get/${site}_${id}`, useDefault ? { useDefault } : undefined),\n // }).catch(error => {\n // console.log('getString error', error);\n // throw error;\n // });\n // },\n // getGeneralTerms: async () => {\n // return axios({\n // method: 'GET',\n // url: 'https://pluss.plussapp.com.au/strings-prd/get/plussSpace_termsofuse',\n // });\n // },\n // declineTerms: async (site, userID) => {\n // //deprecated\n // return null;\n // },\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export * from './generalActions';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.js"],"names":[],"mappings":"AAAA,cAAc,kBAAd","sourcesContent":["export * from './generalActions';\n"]}
@@ -0,0 +1,240 @@
1
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
+
3
+ import React, { Component } from 'react';
4
+ import { View, StyleSheet, FlatList, TouchableOpacity, Text } from 'react-native';
5
+ import { Icon } from 'react-native-elements';
6
+ import _ from 'lodash';
7
+ import { connect } from 'react-redux';
8
+ import { generalActions } from '../apis';
9
+ import { jobsLoaded } from '../actions';
10
+ import MaintenanceListItem from '../components/MaintenanceListItem';
11
+ import StatusSelectorPopup from './StatusSelectorPopup';
12
+ import { Components, Colours, Config } from '../core.config';
13
+ const SHOW_ALL_STATUS = 'Show All';
14
+
15
+ class MaintenanceList extends Component {
16
+ constructor(props) {
17
+ super(props);
18
+
19
+ _defineProperty(this, "refresh", () => {
20
+ this.onLoadingChanged(true, async () => {
21
+ try {
22
+ const res = await generalActions.getJobs(this.props.site);
23
+ this.props.jobsLoaded(res.data);
24
+ } catch (error) {
25
+ console.log('refresh error', error);
26
+ } finally {
27
+ this.onLoadingChanged(false);
28
+ }
29
+ });
30
+ });
31
+
32
+ _defineProperty(this, "onLoadingChanged", (loading, callback) => {
33
+ this.setState({
34
+ loading
35
+ }, () => {
36
+ if (this.props.onLoadingChanged) this.props.onLoadingChanged(this.state.loading);
37
+ if (callback) callback();
38
+ });
39
+ });
40
+
41
+ _defineProperty(this, "onPressFilter", () => {
42
+ this.setState({
43
+ showStatusPopup: true
44
+ });
45
+ });
46
+
47
+ _defineProperty(this, "onCloseFilter", () => {
48
+ this.setState({
49
+ showStatusPopup: false
50
+ });
51
+ });
52
+
53
+ _defineProperty(this, "onSelectStatus", selectedStatus => {
54
+ this.setState({
55
+ showStatusPopup: false,
56
+ selectedStatus
57
+ });
58
+ });
59
+
60
+ this.state = {
61
+ loading: false,
62
+ selectedStatus: SHOW_ALL_STATUS,
63
+ showStatusPopup: false
64
+ };
65
+ }
66
+
67
+ componentDidMount() {
68
+ this.refresh();
69
+ }
70
+
71
+ componentDidUpdate(prevProps) {
72
+ if (!_.isEqual(prevProps.statuses, this.props.statuses) && !this.props.statuses.includes(this.state.selectedStatus)) {
73
+ // Reset selected status if not exists
74
+ this.setState({
75
+ selectedStatus: SHOW_ALL_STATUS
76
+ });
77
+ }
78
+
79
+ if (!prevProps.dataUpdated && this.props.dataUpdated) this.refresh();
80
+ }
81
+
82
+ getEmptyStateText() {
83
+ if (this.props.options && !_.isEmpty(this.props.options.EmptyText)) {
84
+ return this.props.options.EmptyText;
85
+ }
86
+
87
+ return this.props.userCategory === 'staff' ? Config.env.strings.EMPTY_REQUESTS_STAFF : Config.env.strings.EMPTY_REQUESTS_USER;
88
+ }
89
+
90
+ renderEmptyList() {
91
+ return this.state.loading ? null : /*#__PURE__*/React.createElement(Components.EmptyStateMain, {
92
+ title: this.getEmptyStateText(),
93
+ style: {
94
+ marginHorizontal: 16
95
+ }
96
+ });
97
+ }
98
+
99
+ renderFilter() {
100
+ var _this$props$statuses;
101
+
102
+ if (((_this$props$statuses = this.props.statuses) === null || _this$props$statuses === void 0 ? void 0 : _this$props$statuses.length) <= 1) return;
103
+ return /*#__PURE__*/React.createElement(View, {
104
+ style: styles.filterContainerOuter
105
+ }, /*#__PURE__*/React.createElement(Text, {
106
+ style: styles.filterTitle
107
+ }, "FILTER"), /*#__PURE__*/React.createElement(TouchableOpacity, {
108
+ onPress: this.onPressFilter
109
+ }, /*#__PURE__*/React.createElement(View, {
110
+ style: styles.filterContainer
111
+ }, /*#__PURE__*/React.createElement(Text, {
112
+ style: [styles.filterText, {
113
+ color: this.props.colourBrandingMain
114
+ }]
115
+ }, this.state.selectedStatus || SHOW_ALL_STATUS), /*#__PURE__*/React.createElement(Icon, {
116
+ name: "angle-down",
117
+ type: "font-awesome",
118
+ iconStyle: [styles.filterIcon, {
119
+ color: this.props.colourBrandingMain
120
+ }]
121
+ }))));
122
+ }
123
+
124
+ renderListHeader() {
125
+ return /*#__PURE__*/React.createElement(View, null, this.props.ListHeaderComponent, this.renderFilter());
126
+ }
127
+
128
+ renderList() {
129
+ const {
130
+ selectedStatus
131
+ } = this.state;
132
+ const {
133
+ jobs
134
+ } = this.props;
135
+ const filteredList = selectedStatus === SHOW_ALL_STATUS ? jobs : jobs.filter(job => job.status === selectedStatus);
136
+ return /*#__PURE__*/React.createElement(FlatList, {
137
+ keyboardShouldPersistTaps: "always",
138
+ style: {
139
+ flex: 1
140
+ },
141
+ contentContainerStyle: {
142
+ paddingBottom: 16
143
+ },
144
+ data: filteredList,
145
+ keyExtractor: item => item.id,
146
+ renderItem: _ref => {
147
+ let {
148
+ item
149
+ } = _ref;
150
+ return /*#__PURE__*/React.createElement(MaintenanceListItem, {
151
+ style: this.props.itemStyle,
152
+ job: item
153
+ });
154
+ },
155
+ ListEmptyComponent: this.renderEmptyList(),
156
+ ListHeaderComponent: this.renderListHeader()
157
+ });
158
+ } // renderAddButton() {
159
+ // return this.props.enableAdd ? <Components.AddContentButton /> : null;
160
+ // }
161
+
162
+
163
+ renderStatusPopup() {
164
+ if (!this.state.showStatusPopup) return null;
165
+ return /*#__PURE__*/React.createElement(StatusSelectorPopup, {
166
+ filter: this.props.statuses,
167
+ includeAll: true,
168
+ allText: SHOW_ALL_STATUS,
169
+ onClose: this.onCloseFilter,
170
+ onSelect: this.onSelectStatus
171
+ });
172
+ }
173
+
174
+ render() {
175
+ return /*#__PURE__*/React.createElement(View, {
176
+ style: [styles.container, this.props.style]
177
+ }, this.renderList());
178
+ }
179
+
180
+ }
181
+
182
+ const styles = StyleSheet.create({
183
+ container: {
184
+ flex: 1,
185
+ backgroundColor: '#fff'
186
+ },
187
+ filterContainerOuter: {
188
+ flexDirection: 'row',
189
+ justifyContent: 'space-between',
190
+ alignItems: 'center',
191
+ paddingHorizontal: 16,
192
+ paddingVertical: 16
193
+ },
194
+ filterTitle: {
195
+ fontFamily: 'sf-bold',
196
+ fontSize: 11,
197
+ letterSpacing: 0.8,
198
+ color: '#4d4d4d'
199
+ },
200
+ filterContainer: {
201
+ flexDirection: 'row',
202
+ alignItems: 'center'
203
+ },
204
+ filterText: {
205
+ fontFamily: 'sf-semibold',
206
+ fontSize: 16,
207
+ marginRight: 6
208
+ },
209
+ filterIcon: {
210
+ fontSize: 20
211
+ }
212
+ });
213
+
214
+ const mapStateToProps = state => {
215
+ const {
216
+ user,
217
+ jobs,
218
+ notifications
219
+ } = state;
220
+
221
+ const jobsOrdered = _.orderBy(jobs.jobs, ['createdUnix'], ['desc']);
222
+
223
+ const statuses = _.uniq(jobsOrdered.map(job => job.status));
224
+
225
+ return {
226
+ jobs: jobsOrdered,
227
+ statuses,
228
+ site: user.site,
229
+ userCategory: user.category,
230
+ colourBrandingMain: Colours.getMainBrandingColourFromState(state),
231
+ dataUpdated: notifications.dataUpdated['jobs']
232
+ };
233
+ };
234
+
235
+ export default connect(mapStateToProps, {
236
+ jobsLoaded
237
+ }, null, {
238
+ forwardRef: true
239
+ })(MaintenanceList);
240
+ //# sourceMappingURL=MaintenanceList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["MaintenanceList.js"],"names":["React","Component","View","StyleSheet","FlatList","TouchableOpacity","Text","Icon","_","connect","generalActions","jobsLoaded","MaintenanceListItem","StatusSelectorPopup","Components","Colours","Config","SHOW_ALL_STATUS","MaintenanceList","constructor","props","onLoadingChanged","res","getJobs","site","data","error","console","log","loading","callback","setState","state","showStatusPopup","selectedStatus","componentDidMount","refresh","componentDidUpdate","prevProps","isEqual","statuses","includes","dataUpdated","getEmptyStateText","options","isEmpty","EmptyText","userCategory","env","strings","EMPTY_REQUESTS_STAFF","EMPTY_REQUESTS_USER","renderEmptyList","marginHorizontal","renderFilter","length","styles","filterContainerOuter","filterTitle","onPressFilter","filterContainer","filterText","color","colourBrandingMain","filterIcon","renderListHeader","ListHeaderComponent","renderList","jobs","filteredList","filter","job","status","flex","paddingBottom","item","id","itemStyle","renderStatusPopup","onCloseFilter","onSelectStatus","render","container","style","create","backgroundColor","flexDirection","justifyContent","alignItems","paddingHorizontal","paddingVertical","fontFamily","fontSize","letterSpacing","marginRight","mapStateToProps","user","notifications","jobsOrdered","orderBy","uniq","map","category","getMainBrandingColourFromState","forwardRef"],"mappings":";;AAAA,OAAOA,KAAP,IAAgBC,SAAhB,QAAiC,OAAjC;AACA,SAASC,IAAT,EAAeC,UAAf,EAA2BC,QAA3B,EAAqCC,gBAArC,EAAuDC,IAAvD,QAAmE,cAAnE;AACA,SAASC,IAAT,QAAqB,uBAArB;AACA,OAAOC,CAAP,MAAc,QAAd;AACA,SAASC,OAAT,QAAwB,aAAxB;AACA,SAASC,cAAT,QAA+B,SAA/B;AACA,SAASC,UAAT,QAA2B,YAA3B;AACA,OAAOC,mBAAP,MAAgC,mCAAhC;AACA,OAAOC,mBAAP,MAAgC,uBAAhC;AACA,SAASC,UAAT,EAAqBC,OAArB,EAA8BC,MAA9B,QAA4C,gBAA5C;AAEA,MAAMC,eAAe,GAAG,UAAxB;;AAEA,MAAMC,eAAN,SAA8BjB,SAA9B,CAAwC;AACtCkB,EAAAA,WAAW,CAACC,KAAD,EAAQ;AACjB,UAAMA,KAAN;;AADiB,qCAsBT,MAAM;AACd,WAAKC,gBAAL,CAAsB,IAAtB,EAA4B,YAAY;AACtC,YAAI;AACF,gBAAMC,GAAG,GAAG,MAAMZ,cAAc,CAACa,OAAf,CAAuB,KAAKH,KAAL,CAAWI,IAAlC,CAAlB;AACA,eAAKJ,KAAL,CAAWT,UAAX,CAAsBW,GAAG,CAACG,IAA1B;AACD,SAHD,CAGE,OAAOC,KAAP,EAAc;AACdC,UAAAA,OAAO,CAACC,GAAR,CAAY,eAAZ,EAA6BF,KAA7B;AACD,SALD,SAKU;AACR,eAAKL,gBAAL,CAAsB,KAAtB;AACD;AACF,OATD;AAUD,KAjCkB;;AAAA,8CA0CA,CAACQ,OAAD,EAAUC,QAAV,KAAuB;AACxC,WAAKC,QAAL,CAAc;AAAEF,QAAAA;AAAF,OAAd,EAA2B,MAAM;AAC/B,YAAI,KAAKT,KAAL,CAAWC,gBAAf,EAAiC,KAAKD,KAAL,CAAWC,gBAAX,CAA4B,KAAKW,KAAL,CAAWH,OAAvC;AACjC,YAAIC,QAAJ,EAAcA,QAAQ;AACvB,OAHD;AAID,KA/CkB;;AAAA,2CAiDH,MAAM;AACpB,WAAKC,QAAL,CAAc;AAAEE,QAAAA,eAAe,EAAE;AAAnB,OAAd;AACD,KAnDkB;;AAAA,2CAqDH,MAAM;AACpB,WAAKF,QAAL,CAAc;AAAEE,QAAAA,eAAe,EAAE;AAAnB,OAAd;AACD,KAvDkB;;AAAA,4CAyDFC,cAAc,IAAI;AACjC,WAAKH,QAAL,CAAc;AAAEE,QAAAA,eAAe,EAAE,KAAnB;AAA0BC,QAAAA;AAA1B,OAAd;AACD,KA3DkB;;AAGjB,SAAKF,KAAL,GAAa;AACXH,MAAAA,OAAO,EAAE,KADE;AAEXK,MAAAA,cAAc,EAAEjB,eAFL;AAGXgB,MAAAA,eAAe,EAAE;AAHN,KAAb;AAKD;;AAEDE,EAAAA,iBAAiB,GAAG;AAClB,SAAKC,OAAL;AACD;;AAEDC,EAAAA,kBAAkB,CAACC,SAAD,EAAY;AAC5B,QAAI,CAAC9B,CAAC,CAAC+B,OAAF,CAAUD,SAAS,CAACE,QAApB,EAA8B,KAAKpB,KAAL,CAAWoB,QAAzC,CAAD,IAAuD,CAAC,KAAKpB,KAAL,CAAWoB,QAAX,CAAoBC,QAApB,CAA6B,KAAKT,KAAL,CAAWE,cAAxC,CAA5D,EAAqH;AACnH;AACA,WAAKH,QAAL,CAAc;AAAEG,QAAAA,cAAc,EAAEjB;AAAlB,OAAd;AACD;;AACD,QAAI,CAACqB,SAAS,CAACI,WAAX,IAA0B,KAAKtB,KAAL,CAAWsB,WAAzC,EAAsD,KAAKN,OAAL;AACvD;;AAeDO,EAAAA,iBAAiB,GAAG;AAClB,QAAI,KAAKvB,KAAL,CAAWwB,OAAX,IAAsB,CAACpC,CAAC,CAACqC,OAAF,CAAU,KAAKzB,KAAL,CAAWwB,OAAX,CAAmBE,SAA7B,CAA3B,EAAoE;AAClE,aAAO,KAAK1B,KAAL,CAAWwB,OAAX,CAAmBE,SAA1B;AACD;;AACD,WAAO,KAAK1B,KAAL,CAAW2B,YAAX,KAA4B,OAA5B,GAAsC/B,MAAM,CAACgC,GAAP,CAAWC,OAAX,CAAmBC,oBAAzD,GAAgFlC,MAAM,CAACgC,GAAP,CAAWC,OAAX,CAAmBE,mBAA1G;AACD;;AAqBDC,EAAAA,eAAe,GAAG;AAChB,WAAO,KAAKpB,KAAL,CAAWH,OAAX,GAAqB,IAArB,gBAA4B,oBAAC,UAAD,CAAY,cAAZ;AAA2B,MAAA,KAAK,EAAE,KAAKc,iBAAL,EAAlC;AAA4D,MAAA,KAAK,EAAE;AAAEU,QAAAA,gBAAgB,EAAE;AAApB;AAAnE,MAAnC;AACD;;AAEDC,EAAAA,YAAY,GAAG;AAAA;;AACb,QAAI,8BAAKlC,KAAL,CAAWoB,QAAX,8EAAqBe,MAArB,KAA+B,CAAnC,EAAsC;AAEtC,wBACE,oBAAC,IAAD;AAAM,MAAA,KAAK,EAAEC,MAAM,CAACC;AAApB,oBACE,oBAAC,IAAD;AAAM,MAAA,KAAK,EAAED,MAAM,CAACE;AAApB,gBADF,eAEE,oBAAC,gBAAD;AAAkB,MAAA,OAAO,EAAE,KAAKC;AAAhC,oBACE,oBAAC,IAAD;AAAM,MAAA,KAAK,EAAEH,MAAM,CAACI;AAApB,oBACE,oBAAC,IAAD;AAAM,MAAA,KAAK,EAAE,CAACJ,MAAM,CAACK,UAAR,EAAoB;AAAEC,QAAAA,KAAK,EAAE,KAAK1C,KAAL,CAAW2C;AAApB,OAApB;AAAb,OACG,KAAK/B,KAAL,CAAWE,cAAX,IAA6BjB,eADhC,CADF,eAIE,oBAAC,IAAD;AAAM,MAAA,IAAI,EAAC,YAAX;AAAwB,MAAA,IAAI,EAAC,cAA7B;AAA4C,MAAA,SAAS,EAAE,CAACuC,MAAM,CAACQ,UAAR,EAAoB;AAAEF,QAAAA,KAAK,EAAE,KAAK1C,KAAL,CAAW2C;AAApB,OAApB;AAAvD,MAJF,CADF,CAFF,CADF;AAaD;;AAEDE,EAAAA,gBAAgB,GAAG;AACjB,wBACE,oBAAC,IAAD,QACG,KAAK7C,KAAL,CAAW8C,mBADd,EAEG,KAAKZ,YAAL,EAFH,CADF;AAMD;;AAEDa,EAAAA,UAAU,GAAG;AACX,UAAM;AAAEjC,MAAAA;AAAF,QAAqB,KAAKF,KAAhC;AACA,UAAM;AAAEoC,MAAAA;AAAF,QAAW,KAAKhD,KAAtB;AACA,UAAMiD,YAAY,GAAGnC,cAAc,KAAKjB,eAAnB,GAAqCmD,IAArC,GAA4CA,IAAI,CAACE,MAAL,CAAYC,GAAG,IAAIA,GAAG,CAACC,MAAJ,KAAetC,cAAlC,CAAjE;AAEA,wBACE,oBAAC,QAAD;AACE,MAAA,yBAAyB,EAAC,QAD5B;AAEE,MAAA,KAAK,EAAE;AAAEuC,QAAAA,IAAI,EAAE;AAAR,OAFT;AAGE,MAAA,qBAAqB,EAAE;AAAEC,QAAAA,aAAa,EAAE;AAAjB,OAHzB;AAIE,MAAA,IAAI,EAAEL,YAJR;AAKE,MAAA,YAAY,EAAEM,IAAI,IAAIA,IAAI,CAACC,EAL7B;AAME,MAAA,UAAU,EAAE;AAAA,YAAC;AAAED,UAAAA;AAAF,SAAD;AAAA,4BAAc,oBAAC,mBAAD;AAAqB,UAAA,KAAK,EAAE,KAAKvD,KAAL,CAAWyD,SAAvC;AAAkD,UAAA,GAAG,EAAEF;AAAvD,UAAd;AAAA,OANd;AAOE,MAAA,kBAAkB,EAAE,KAAKvB,eAAL,EAPtB;AAQE,MAAA,mBAAmB,EAAE,KAAKa,gBAAL;AARvB,MADF;AAYD,GA9GqC,CAgHtC;AACA;AACA;;;AAEAa,EAAAA,iBAAiB,GAAG;AAClB,QAAI,CAAC,KAAK9C,KAAL,CAAWC,eAAhB,EAAiC,OAAO,IAAP;AAEjC,wBACE,oBAAC,mBAAD;AACE,MAAA,MAAM,EAAE,KAAKb,KAAL,CAAWoB,QADrB;AAEE,MAAA,UAAU,MAFZ;AAGE,MAAA,OAAO,EAAEvB,eAHX;AAIE,MAAA,OAAO,EAAE,KAAK8D,aAJhB;AAKE,MAAA,QAAQ,EAAE,KAAKC;AALjB,MADF;AASD;;AAEDC,EAAAA,MAAM,GAAG;AACP,wBACE,oBAAC,IAAD;AAAM,MAAA,KAAK,EAAE,CAACzB,MAAM,CAAC0B,SAAR,EAAmB,KAAK9D,KAAL,CAAW+D,KAA9B;AAAb,OACG,KAAKhB,UAAL,EADH,CADF;AAOD;;AA1IqC;;AA6IxC,MAAMX,MAAM,GAAGrD,UAAU,CAACiF,MAAX,CAAkB;AAC/BF,EAAAA,SAAS,EAAE;AACTT,IAAAA,IAAI,EAAE,CADG;AAETY,IAAAA,eAAe,EAAE;AAFR,GADoB;AAK/B5B,EAAAA,oBAAoB,EAAE;AACpB6B,IAAAA,aAAa,EAAE,KADK;AAEpBC,IAAAA,cAAc,EAAE,eAFI;AAGpBC,IAAAA,UAAU,EAAE,QAHQ;AAIpBC,IAAAA,iBAAiB,EAAE,EAJC;AAKpBC,IAAAA,eAAe,EAAE;AALG,GALS;AAY/BhC,EAAAA,WAAW,EAAE;AACXiC,IAAAA,UAAU,EAAE,SADD;AAEXC,IAAAA,QAAQ,EAAE,EAFC;AAGXC,IAAAA,aAAa,EAAE,GAHJ;AAIX/B,IAAAA,KAAK,EAAE;AAJI,GAZkB;AAkB/BF,EAAAA,eAAe,EAAE;AACf0B,IAAAA,aAAa,EAAE,KADA;AAEfE,IAAAA,UAAU,EAAE;AAFG,GAlBc;AAsB/B3B,EAAAA,UAAU,EAAE;AACV8B,IAAAA,UAAU,EAAE,aADF;AAEVC,IAAAA,QAAQ,EAAE,EAFA;AAGVE,IAAAA,WAAW,EAAE;AAHH,GAtBmB;AA2B/B9B,EAAAA,UAAU,EAAE;AACV4B,IAAAA,QAAQ,EAAE;AADA;AA3BmB,CAAlB,CAAf;;AAgCA,MAAMG,eAAe,GAAG/D,KAAK,IAAI;AAC/B,QAAM;AAAEgE,IAAAA,IAAF;AAAQ5B,IAAAA,IAAR;AAAc6B,IAAAA;AAAd,MAAgCjE,KAAtC;;AACA,QAAMkE,WAAW,GAAG1F,CAAC,CAAC2F,OAAF,CAAU/B,IAAI,CAACA,IAAf,EAAqB,CAAC,aAAD,CAArB,EAAsC,CAAC,MAAD,CAAtC,CAApB;;AACA,QAAM5B,QAAQ,GAAGhC,CAAC,CAAC4F,IAAF,CAAOF,WAAW,CAACG,GAAZ,CAAgB9B,GAAG,IAAIA,GAAG,CAACC,MAA3B,CAAP,CAAjB;;AAEA,SAAO;AACLJ,IAAAA,IAAI,EAAE8B,WADD;AAEL1D,IAAAA,QAFK;AAGLhB,IAAAA,IAAI,EAAEwE,IAAI,CAACxE,IAHN;AAILuB,IAAAA,YAAY,EAAEiD,IAAI,CAACM,QAJd;AAKLvC,IAAAA,kBAAkB,EAAEhD,OAAO,CAACwF,8BAAR,CAAuCvE,KAAvC,CALf;AAMLU,IAAAA,WAAW,EAAEuD,aAAa,CAACvD,WAAd,CAA0B,MAA1B;AANR,GAAP;AAQD,CAbD;;AAeA,eAAejC,OAAO,CAACsF,eAAD,EAAkB;AAAEpF,EAAAA;AAAF,CAAlB,EAAkC,IAAlC,EAAwC;AAAE6F,EAAAA,UAAU,EAAE;AAAd,CAAxC,CAAP,CAAqEtF,eAArE,CAAf","sourcesContent":["import React, { Component } from 'react';\nimport { View, StyleSheet, FlatList, TouchableOpacity, Text } from 'react-native';\nimport { Icon } from 'react-native-elements';\nimport _ from 'lodash';\nimport { connect } from 'react-redux';\nimport { generalActions } from '../apis';\nimport { jobsLoaded } from '../actions';\nimport MaintenanceListItem from '../components/MaintenanceListItem';\nimport StatusSelectorPopup from './StatusSelectorPopup';\nimport { Components, Colours, Config } from '../core.config';\n\nconst SHOW_ALL_STATUS = 'Show All';\n\nclass MaintenanceList extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n loading: false,\n selectedStatus: SHOW_ALL_STATUS,\n showStatusPopup: false,\n };\n }\n\n componentDidMount() {\n this.refresh();\n }\n\n componentDidUpdate(prevProps) {\n if (!_.isEqual(prevProps.statuses, this.props.statuses) && !this.props.statuses.includes(this.state.selectedStatus)) {\n // Reset selected status if not exists\n this.setState({ selectedStatus: SHOW_ALL_STATUS });\n }\n if (!prevProps.dataUpdated && this.props.dataUpdated) this.refresh();\n }\n\n refresh = () => {\n this.onLoadingChanged(true, async () => {\n try {\n const res = await generalActions.getJobs(this.props.site);\n this.props.jobsLoaded(res.data);\n } catch (error) {\n console.log('refresh error', error);\n } finally {\n this.onLoadingChanged(false);\n }\n });\n };\n\n getEmptyStateText() {\n if (this.props.options && !_.isEmpty(this.props.options.EmptyText)) {\n return this.props.options.EmptyText;\n }\n return this.props.userCategory === 'staff' ? Config.env.strings.EMPTY_REQUESTS_STAFF : Config.env.strings.EMPTY_REQUESTS_USER;\n }\n\n onLoadingChanged = (loading, callback) => {\n this.setState({ loading }, () => {\n if (this.props.onLoadingChanged) this.props.onLoadingChanged(this.state.loading);\n if (callback) callback();\n });\n };\n\n onPressFilter = () => {\n this.setState({ showStatusPopup: true });\n };\n\n onCloseFilter = () => {\n this.setState({ showStatusPopup: false });\n };\n\n onSelectStatus = selectedStatus => {\n this.setState({ showStatusPopup: false, selectedStatus });\n };\n\n renderEmptyList() {\n return this.state.loading ? null : <Components.EmptyStateMain title={this.getEmptyStateText()} style={{ marginHorizontal: 16 }} />;\n }\n\n renderFilter() {\n if (this.props.statuses?.length <= 1) return;\n\n return (\n <View style={styles.filterContainerOuter}>\n <Text style={styles.filterTitle}>FILTER</Text>\n <TouchableOpacity onPress={this.onPressFilter}>\n <View style={styles.filterContainer}>\n <Text style={[styles.filterText, { color: this.props.colourBrandingMain }]}>\n {this.state.selectedStatus || SHOW_ALL_STATUS}\n </Text>\n <Icon name=\"angle-down\" type=\"font-awesome\" iconStyle={[styles.filterIcon, { color: this.props.colourBrandingMain }]} />\n </View>\n </TouchableOpacity>\n </View>\n );\n }\n\n renderListHeader() {\n return (\n <View>\n {this.props.ListHeaderComponent}\n {this.renderFilter()}\n </View>\n );\n }\n\n renderList() {\n const { selectedStatus } = this.state;\n const { jobs } = this.props;\n const filteredList = selectedStatus === SHOW_ALL_STATUS ? jobs : jobs.filter(job => job.status === selectedStatus);\n\n return (\n <FlatList\n keyboardShouldPersistTaps=\"always\"\n style={{ flex: 1 }}\n contentContainerStyle={{ paddingBottom: 16 }}\n data={filteredList}\n keyExtractor={item => item.id}\n renderItem={({ item }) => <MaintenanceListItem style={this.props.itemStyle} job={item} />}\n ListEmptyComponent={this.renderEmptyList()}\n ListHeaderComponent={this.renderListHeader()}\n />\n );\n }\n\n // renderAddButton() {\n // return this.props.enableAdd ? <Components.AddContentButton /> : null;\n // }\n\n renderStatusPopup() {\n if (!this.state.showStatusPopup) return null;\n\n return (\n <StatusSelectorPopup\n filter={this.props.statuses}\n includeAll\n allText={SHOW_ALL_STATUS}\n onClose={this.onCloseFilter}\n onSelect={this.onSelectStatus}\n />\n );\n }\n\n render() {\n return (\n <View style={[styles.container, this.props.style]}>\n {this.renderList()}\n {/* {this.renderAddButton()} */}\n {/* {this.renderStatusPopup()} */}\n </View>\n );\n }\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: '#fff',\n },\n filterContainerOuter: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingHorizontal: 16,\n paddingVertical: 16,\n },\n filterTitle: {\n fontFamily: 'sf-bold',\n fontSize: 11,\n letterSpacing: 0.8,\n color: '#4d4d4d',\n },\n filterContainer: {\n flexDirection: 'row',\n alignItems: 'center',\n },\n filterText: {\n fontFamily: 'sf-semibold',\n fontSize: 16,\n marginRight: 6,\n },\n filterIcon: {\n fontSize: 20,\n },\n});\n\nconst mapStateToProps = state => {\n const { user, jobs, notifications } = state;\n const jobsOrdered = _.orderBy(jobs.jobs, ['createdUnix'], ['desc']);\n const statuses = _.uniq(jobsOrdered.map(job => job.status));\n\n return {\n jobs: jobsOrdered,\n statuses,\n site: user.site,\n userCategory: user.category,\n colourBrandingMain: Colours.getMainBrandingColourFromState(state),\n dataUpdated: notifications.dataUpdated['jobs'],\n };\n};\n\nexport default connect(mapStateToProps, { jobsLoaded }, null, { forwardRef: true })(MaintenanceList);\n"]}