@plusscommunities/pluss-maintenance-app 8.0.17-beta.4 → 8.0.17-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -3,7 +3,7 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
|
|
|
3
3
|
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
4
4
|
import React, { Component } from "react";
|
|
5
5
|
import { Text } from "@plusscommunities/pluss-core-app/components";
|
|
6
|
-
import { View, StyleSheet, FlatList, TouchableOpacity } from "react-native";
|
|
6
|
+
import { View, StyleSheet, FlatList, TouchableOpacity, Animated } from "react-native";
|
|
7
7
|
import _ from "lodash";
|
|
8
8
|
import { connect } from "react-redux";
|
|
9
9
|
import { maintenanceActions } from "../apis";
|
|
@@ -16,6 +16,9 @@ class MaintenanceList extends Component {
|
|
|
16
16
|
constructor(props) {
|
|
17
17
|
super(props);
|
|
18
18
|
_defineProperty(this, "_refreshCounter", 0);
|
|
19
|
+
_defineProperty(this, "_filterApplying", false);
|
|
20
|
+
_defineProperty(this, "_filterDataReady", false);
|
|
21
|
+
_defineProperty(this, "_overlayOpacity", new Animated.Value(0));
|
|
19
22
|
_defineProperty(this, "refresh", overrideFilters => {
|
|
20
23
|
const currentCounter = ++this._refreshCounter;
|
|
21
24
|
this.onLoadingChanged(true, async () => {
|
|
@@ -30,6 +33,9 @@ class MaintenanceList extends Component {
|
|
|
30
33
|
const jobs = res.data.Items;
|
|
31
34
|
const lastKey = res.data.LastKey;
|
|
32
35
|
|
|
36
|
+
// Signal that the API response is ready before dispatching to Redux
|
|
37
|
+
this._filterDataReady = true;
|
|
38
|
+
|
|
33
39
|
// Always replace jobs on refresh (filters are server-side)
|
|
34
40
|
this.props.jobsLoaded(jobs);
|
|
35
41
|
this.setState({
|
|
@@ -148,8 +154,21 @@ class MaintenanceList extends Component {
|
|
|
148
154
|
}
|
|
149
155
|
filteredList.unshift(jobIdMatch);
|
|
150
156
|
}
|
|
157
|
+
|
|
158
|
+
// During a filter transition, don't clear the list until the API
|
|
159
|
+
// response has arrived and been processed. This prevents the empty
|
|
160
|
+
// state from flashing when jobs transiently drop to [].
|
|
161
|
+
if (this._filterApplying && !this._filterDataReady && filteredList.length === 0) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
151
164
|
this.setState({
|
|
152
165
|
filteredList
|
|
166
|
+
}, () => {
|
|
167
|
+
if (this._filterDataReady) {
|
|
168
|
+
this._filterApplying = false;
|
|
169
|
+
this._filterDataReady = false;
|
|
170
|
+
this._showOverlay(false);
|
|
171
|
+
}
|
|
153
172
|
});
|
|
154
173
|
});
|
|
155
174
|
_defineProperty(this, "onLoadingChanged", (loading, callback) => {
|
|
@@ -176,6 +195,9 @@ class MaintenanceList extends Component {
|
|
|
176
195
|
});
|
|
177
196
|
});
|
|
178
197
|
_defineProperty(this, "onSelectFilter", selected => {
|
|
198
|
+
this._filterApplying = true;
|
|
199
|
+
this._filterDataReady = false;
|
|
200
|
+
this._showOverlay(true);
|
|
179
201
|
this.props.jobsFilterLoaded(selected);
|
|
180
202
|
this.onToggleFilter();
|
|
181
203
|
// Reset pagination but keep old list visible while loading
|
|
@@ -229,10 +251,17 @@ class MaintenanceList extends Component {
|
|
|
229
251
|
visible: true
|
|
230
252
|
}));
|
|
231
253
|
});
|
|
254
|
+
_defineProperty(this, "_showOverlay", visible => {
|
|
255
|
+
Animated.timing(this._overlayOpacity, {
|
|
256
|
+
toValue: visible ? 1 : 0,
|
|
257
|
+
duration: 200,
|
|
258
|
+
useNativeDriver: true
|
|
259
|
+
}).start();
|
|
260
|
+
});
|
|
232
261
|
this.state = {
|
|
233
262
|
types: [],
|
|
234
263
|
filteredList: props.jobs,
|
|
235
|
-
loading:
|
|
264
|
+
loading: false,
|
|
236
265
|
loadingMore: false,
|
|
237
266
|
hasMore: true,
|
|
238
267
|
lastKey: null,
|
|
@@ -264,7 +293,7 @@ class MaintenanceList extends Component {
|
|
|
264
293
|
return !_.isEmpty(jobfilters.status) || !_.isEmpty(jobfilters.priority) || !_.isEmpty(jobfilters.type) || !_.isEmpty(jobfilters.assignee);
|
|
265
294
|
}
|
|
266
295
|
renderEmptyList() {
|
|
267
|
-
if (this.state.loading) return null;
|
|
296
|
+
if (this.state.loading || this._filterApplying) return null;
|
|
268
297
|
const hasFilters = this.hasFiltersActive();
|
|
269
298
|
return /*#__PURE__*/React.createElement(View, {
|
|
270
299
|
style: {
|
|
@@ -346,6 +375,17 @@ class MaintenanceList extends Component {
|
|
|
346
375
|
onEndReachedThreshold: 0.5
|
|
347
376
|
});
|
|
348
377
|
}
|
|
378
|
+
renderFilterOverlay() {
|
|
379
|
+
if (!this._filterApplying) return null;
|
|
380
|
+
return /*#__PURE__*/React.createElement(Animated.View, {
|
|
381
|
+
style: [styles.filterOverlay, {
|
|
382
|
+
opacity: this._overlayOpacity
|
|
383
|
+
}],
|
|
384
|
+
pointerEvents: "none"
|
|
385
|
+
}, /*#__PURE__*/React.createElement(View, {
|
|
386
|
+
style: styles.filterOverlayInner
|
|
387
|
+
}, /*#__PURE__*/React.createElement(Components.LoadingCircles, null)));
|
|
388
|
+
}
|
|
349
389
|
renderFilterPopup() {
|
|
350
390
|
const {
|
|
351
391
|
jobfilters
|
|
@@ -368,7 +408,7 @@ class MaintenanceList extends Component {
|
|
|
368
408
|
render() {
|
|
369
409
|
return /*#__PURE__*/React.createElement(View, {
|
|
370
410
|
style: [styles.container, this.props.style]
|
|
371
|
-
}, this.renderList(), this.renderFilterPopup());
|
|
411
|
+
}, this.renderList(), this.renderFilterOverlay(), this.renderFilterPopup());
|
|
372
412
|
}
|
|
373
413
|
}
|
|
374
414
|
const styles = StyleSheet.create({
|
|
@@ -432,6 +472,16 @@ const styles = StyleSheet.create({
|
|
|
432
472
|
clearFiltersText: {
|
|
433
473
|
fontFamily: "sf-semibold",
|
|
434
474
|
fontSize: 15
|
|
475
|
+
},
|
|
476
|
+
filterOverlay: {
|
|
477
|
+
...StyleSheet.absoluteFillObject,
|
|
478
|
+
justifyContent: "center",
|
|
479
|
+
alignItems: "center",
|
|
480
|
+
backgroundColor: "rgba(255, 255, 255, 0.7)"
|
|
481
|
+
},
|
|
482
|
+
filterOverlayInner: {
|
|
483
|
+
padding: 20,
|
|
484
|
+
borderRadius: 12
|
|
435
485
|
}
|
|
436
486
|
});
|
|
437
487
|
const mapStateToProps = state => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","Component","Text","View","StyleSheet","FlatList","TouchableOpacity","_","connect","maintenanceActions","jobsLoaded","jobAdded","jobsAdded","jobStatusesUpdate","jobHideSeenUpdate","jobsFilterLoaded","MaintenanceListItem","FilterPopupMenu","Components","Colours","Helper","values","MaintenanceList","constructor","props","_defineProperty","overrideFilters","currentCounter","_refreshCounter","onLoadingChanged","jobfilters","res","getJobs2","site","status","priority","type","assignee","jobs","data","Items","lastKey","LastKey","setState","hasMore","error","console","log","loading","loadingMore","searchText","state","newJobs","newLastKey","getJobTypes","getSite","types","map","t","label","typeName","value","splice","jobId","job","getJobByJobId","source","filteredList","jobIdMatch","find","j","filter","room","toLowerCase","indexOf","fetchJob","jobIndex","unshift","callback","isEmpty","resetDataSource","showFilterPopup","selected","onToggleFilter","refresh","filterTexts","push","statusText","priorityText","assigneeName","join","emptyFilters","onSelectFilter","createElement","style","styles","LoadingIndicator","visible","componentDidMount","refreshTypes","componentDidUpdate","prevProps","dataUpdated","isEqual","getEmptyStateText","options","EmptyText","userCategory","emptyRequestsStaff","emptyRequestsUser","hasFiltersActive","renderEmptyList","hasFilters","marginHorizontal","alignItems","EmptyStateMain","title","onPress","clearFilters","clearFiltersButton","clearFiltersText","color","colourBrandingMain","renderFilterButton","filterButton","filterButtonText","getFilterButtonText","renderSearch","hasPermission","searchContainer","GenericInput","placeholder","textEntityName","onChangeText","onSearchText","onSubmitEditing","onSearchSubmit","squaredCorners","hasClear","returnKeyType","renderListHeader","ListHeaderComponent","height","renderList","keyboardShouldPersistTaps","flex","contentContainerStyle","paddingBottom","keyExtractor","item","id","renderItem","itemStyle","ListEmptyComponent","ListFooterComponent","renderListFooter","onEndReached","loadMore","onEndReachedThreshold","renderFilterPopup","onClose","render","container","create","backgroundColor","filterContainerOuter","flexDirection","justifyContent","paddingHorizontal","paddingVertical","filterTitle","fontFamily","fontSize","letterSpacing","filterContainer","filterText","marginRight","filterIcon","marginTop","borderRadius","borderWidth","borderColor","mapStateToProps","user","notifications","reducerKey","jobsOrdered","orderBy","includes","permissions","category","getMainBrandingColourFromState","updateKey","statusTypes","jobstatuses","forwardRef"],"sources":["MaintenanceList.js"],"sourcesContent":["import React, { Component } from \"react\";\nimport { Text } from \"@plusscommunities/pluss-core-app/components\";\nimport { View, StyleSheet, FlatList, TouchableOpacity } from \"react-native\";\nimport _ from \"lodash\";\nimport { connect } from \"react-redux\";\nimport { maintenanceActions } from \"../apis\";\nimport {\n\tjobsLoaded,\n\tjobAdded,\n\tjobsAdded,\n\tjobStatusesUpdate,\n\tjobHideSeenUpdate,\n\tjobsFilterLoaded,\n} from \"../actions\";\nimport MaintenanceListItem from \"../components/MaintenanceListItem\";\nimport FilterPopupMenu from \"./FilterPopupMenu\";\nimport { Components, Colours, Helper } from \"../core.config\";\nimport { values } from \"../values.config\";\n\nclass MaintenanceList extends Component {\n\t_refreshCounter = 0;\n\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t\ttypes: [],\n\t\t\tfilteredList: props.jobs,\n\t\t\tloading: true,\n\t\t\tloadingMore: false,\n\t\t\thasMore: true,\n\t\t\tlastKey: null,\n\t\t\tsearchText: \"\",\n\t\t\tshowFilterPopup: false,\n\t\t};\n\t}\n\n\tcomponentDidMount() {\n\t\tthis.props.jobStatusesUpdate(this.props.site);\n\t\tthis.props.jobHideSeenUpdate(this.props.site);\n\t\tthis.refresh();\n\t\tthis.refreshTypes();\n\t\tthis.resetDataSource();\n\t}\n\n\tcomponentDidUpdate(prevProps) {\n\t\tif (!prevProps.dataUpdated && this.props.dataUpdated) this.refresh();\n\t\tif (\n\t\t\t!_.isEqual(prevProps.jobs, this.props.jobs) ||\n\t\t\t!_.isEqual(prevProps.jobfilters, this.props.jobfilters)\n\t\t)\n\t\t\tthis.resetDataSource();\n\t}\n\n\trefresh = (overrideFilters) => {\n\t\tconst currentCounter = ++this._refreshCounter;\n\t\tthis.onLoadingChanged(true, async () => {\n\t\t\ttry {\n\t\t\t\tconst jobfilters = overrideFilters || this.props.jobfilters;\n\t\t\t\tconst res = await maintenanceActions.getJobs2(\n\t\t\t\t\tthis.props.site,\n\t\t\t\t\tjobfilters.status,\n\t\t\t\t\tjobfilters.priority,\n\t\t\t\t\tjobfilters.type,\n\t\t\t\t\tnull, // No lastKey = first page\n\t\t\t\t\tjobfilters.assignee,\n\t\t\t\t);\n\n\t\t\t\t// Discard stale responses from earlier filter changes\n\t\t\t\tif (currentCounter !== this._refreshCounter) return;\n\n\t\t\t\tconst jobs = res.data.Items;\n\t\t\t\tconst lastKey = res.data.LastKey;\n\n\t\t\t\t// Always replace jobs on refresh (filters are server-side)\n\t\t\t\tthis.props.jobsLoaded(jobs);\n\n\t\t\t\tthis.setState({\n\t\t\t\t\tlastKey,\n\t\t\t\t\thasMore: !!lastKey,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tif (currentCounter !== this._refreshCounter) return;\n\t\t\t\tconsole.log(\"refresh error\", error);\n\t\t\t} finally {\n\t\t\t\tif (currentCounter === this._refreshCounter) {\n\t\t\t\t\tthis.onLoadingChanged(false);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\tloadMore = () => {\n\t\tconst { loading, loadingMore, hasMore, lastKey, searchText } = this.state;\n\n\t\t// Don't load if already loading, no more pages, or during search\n\t\tif (loading || loadingMore || !hasMore || !lastKey || searchText) return;\n\n\t\tthis.setState({ loadingMore: true }, async () => {\n\t\t\ttry {\n\t\t\t\tconst { jobfilters } = this.props;\n\t\t\t\tconst res = await maintenanceActions.getJobs2(\n\t\t\t\t\tthis.props.site,\n\t\t\t\t\tjobfilters.status,\n\t\t\t\t\tjobfilters.priority,\n\t\t\t\t\tjobfilters.type,\n\t\t\t\t\tlastKey,\n\t\t\t\t\tjobfilters.assignee,\n\t\t\t\t);\n\n\t\t\t\tconst newJobs = res.data.Items;\n\t\t\t\tconst newLastKey = res.data.LastKey;\n\n\t\t\t\t// Append to existing jobs\n\t\t\t\tthis.props.jobsAdded(newJobs);\n\n\t\t\t\tthis.setState({\n\t\t\t\t\tlastKey: newLastKey,\n\t\t\t\t\thasMore: !!newLastKey,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconsole.log(\"loadMore error\", error);\n\t\t\t} finally {\n\t\t\t\tthis.setState({ loadingMore: false });\n\t\t\t}\n\t\t});\n\t};\n\n\trefreshTypes = async () => {\n\t\tconst { data } = await maintenanceActions.getJobTypes(\n\t\t\tHelper.getSite(this.props.site),\n\t\t);\n\t\tconst types = data.map((t) => {\n\t\t\treturn { label: t.typeName, value: t.typeName };\n\t\t});\n\t\ttypes.splice(0, 0, { label: \"All\", value: \"\" });\n\t\t// console.log('refreshTypes', types);\n\t\tthis.setState({ types });\n\t};\n\n\tfetchJob = (jobId) => {\n\t\tif (this.state.loading) return;\n\n\t\tthis.onLoadingChanged(true, async () => {\n\t\t\ttry {\n\t\t\t\tconst job = await maintenanceActions.getJobByJobId(\n\t\t\t\t\tthis.props.site,\n\t\t\t\t\tjobId,\n\t\t\t\t);\n\t\t\t\t// console.log('fetchJob', job?.data);\n\t\t\t\tthis.props.jobAdded(job.data);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.log(\"fetchJob error\", error);\n\t\t\t} finally {\n\t\t\t\tthis.onLoadingChanged(false);\n\t\t\t}\n\t\t});\n\t};\n\n\tgetEmptyStateText() {\n\t\tif (this.props.options && !_.isEmpty(this.props.options.EmptyText)) {\n\t\t\treturn this.props.options.EmptyText;\n\t\t}\n\t\treturn this.props.userCategory === \"staff\"\n\t\t\t? values.emptyRequestsStaff\n\t\t\t: values.emptyRequestsUser;\n\t}\n\n\tresetDataSource = (source = \"\") => {\n\t\tconst { searchText } = this.state;\n\t\tconst { jobs } = this.props;\n\n\t\tlet filteredList = jobs;\n\t\tlet jobIdMatch = null;\n\n\t\t// Client-side search filtering (search is not supported server-side)\n\t\tif (searchText) {\n\t\t\tjobIdMatch = _.find(jobs, (j) => j.jobId === searchText);\n\t\t\tfilteredList = jobs.filter((j) => {\n\t\t\t\tif (\n\t\t\t\t\tj.room &&\n\t\t\t\t\tj.room.toLowerCase().indexOf(searchText.toLowerCase()) > -1\n\t\t\t\t) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\t\t\tif (!jobIdMatch) this.fetchJob(searchText);\n\t\t}\n\n\t\t// Note: status, priority, type, and assignee filters are applied server-side\n\t\t// via getJobs2, so no client-side filtering needed for those\n\n\t\tif (jobIdMatch) {\n\t\t\tconst jobIndex = filteredList.indexOf(jobIdMatch);\n\t\t\tif (jobIndex > -1) {\n\t\t\t\tfilteredList.splice(jobIndex, 1);\n\t\t\t}\n\t\t\tfilteredList.unshift(jobIdMatch);\n\t\t}\n\n\t\tthis.setState({ filteredList });\n\t};\n\n\tonLoadingChanged = (loading, callback) => {\n\t\tthis.setState({ loading }, () => {\n\t\t\tif (this.props.onLoadingChanged)\n\t\t\t\tthis.props.onLoadingChanged(this.state.loading);\n\t\t\tif (callback) callback();\n\t\t});\n\t};\n\n\tonSearchText = (value) => {\n\t\tthis.setState({ searchText: value }, () => {\n\t\t\tif (_.isEmpty(this.state.searchText)) this.resetDataSource(\"search\");\n\t\t});\n\t};\n\n\tonSearchSubmit = () => {\n\t\tthis.resetDataSource(\"search\");\n\t};\n\n\tonToggleFilter = () => {\n\t\tthis.setState({ showFilterPopup: !this.state.showFilterPopup });\n\t};\n\n\tonSelectFilter = (selected) => {\n\t\tthis.props.jobsFilterLoaded(selected);\n\t\tthis.onToggleFilter();\n\t\t// Reset pagination but keep old list visible while loading\n\t\t// Pass filters directly to avoid stale props from async Redux update\n\t\tthis.setState({ lastKey: null, hasMore: true }, () => {\n\t\t\tthis.refresh(selected);\n\t\t});\n\t};\n\n\tgetFilterButtonText = () => {\n\t\tconst { jobfilters } = this.props;\n\t\tconst filterTexts = [];\n\t\tif (!_.isEmpty(jobfilters.status)) {\n\t\t\tfilterTexts.push(jobfilters.statusText);\n\t\t}\n\t\tif (!_.isEmpty(jobfilters.priority)) {\n\t\t\tfilterTexts.push(jobfilters.priorityText);\n\t\t}\n\t\tif (!_.isEmpty(jobfilters.type)) {\n\t\t\tfilterTexts.push(jobfilters.type);\n\t\t}\n\t\tif (!_.isEmpty(jobfilters.assignee)) {\n\t\t\tfilterTexts.push(jobfilters.assigneeName);\n\t\t}\n\t\tif (_.isEmpty(filterTexts)) {\n\t\t\treturn \"Filter\";\n\t\t}\n\t\treturn `Filtering by ${filterTexts.join(\", \")}`;\n\t};\n\n\thasFiltersActive() {\n\t\tconst { jobfilters } = this.props;\n\t\treturn (\n\t\t\t!_.isEmpty(jobfilters.status) ||\n\t\t\t!_.isEmpty(jobfilters.priority) ||\n\t\t\t!_.isEmpty(jobfilters.type) ||\n\t\t\t!_.isEmpty(jobfilters.assignee)\n\t\t);\n\t}\n\n\tclearFilters = () => {\n\t\tconst emptyFilters = {\n\t\t\tstatus: \"\",\n\t\t\tstatusText: \"\",\n\t\t\tpriority: \"\",\n\t\t\tpriorityText: \"\",\n\t\t\ttype: \"\",\n\t\t\tassignee: \"\",\n\t\t\tassigneeName: \"\",\n\t\t};\n\t\tthis.onSelectFilter(emptyFilters);\n\t};\n\n\trenderEmptyList() {\n\t\tif (this.state.loading) return null;\n\n\t\tconst hasFilters = this.hasFiltersActive();\n\n\t\treturn (\n\t\t\t<View style={{ marginHorizontal: 16, alignItems: \"center\" }}>\n\t\t\t\t<Components.EmptyStateMain\n\t\t\t\t\ttitle={\n\t\t\t\t\t\thasFilters\n\t\t\t\t\t\t\t? \"No requests match your filters\"\n\t\t\t\t\t\t\t: this.getEmptyStateText()\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t\t{hasFilters && (\n\t\t\t\t\t<TouchableOpacity\n\t\t\t\t\t\tonPress={this.clearFilters}\n\t\t\t\t\t\tstyle={styles.clearFiltersButton}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\tstyle={[\n\t\t\t\t\t\t\t\tstyles.clearFiltersText,\n\t\t\t\t\t\t\t\t{ color: this.props.colourBrandingMain },\n\t\t\t\t\t\t\t]}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tClear filters\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</TouchableOpacity>\n\t\t\t\t)}\n\t\t\t</View>\n\t\t);\n\t}\n\n\trenderFilterButton() {\n\t\treturn (\n\t\t\t<TouchableOpacity onPress={this.onToggleFilter}>\n\t\t\t\t<View style={styles.filterButton}>\n\t\t\t\t\t<Text\n\t\t\t\t\t\tstyle={[\n\t\t\t\t\t\t\tstyles.filterButtonText,\n\t\t\t\t\t\t\t{ color: this.props.colourBrandingMain },\n\t\t\t\t\t\t]}\n\t\t\t\t\t>\n\t\t\t\t\t\t{this.getFilterButtonText()}\n\t\t\t\t\t</Text>\n\t\t\t\t</View>\n\t\t\t</TouchableOpacity>\n\t\t);\n\t}\n\n\trenderSearch() {\n\t\tif (!this.props.hasPermission) return null;\n\n\t\treturn (\n\t\t\t<View style={styles.searchContainer}>\n\t\t\t\t<Components.GenericInput\n\t\t\t\t\tplaceholder={`Search by ${values.textEntityName} ID or Address`}\n\t\t\t\t\tvalue={this.state.searchText}\n\t\t\t\t\tonChangeText={this.onSearchText}\n\t\t\t\t\tonSubmitEditing={this.onSearchSubmit}\n\t\t\t\t\tsquaredCorners\n\t\t\t\t\thasClear\n\t\t\t\t\t// keyboardType={'numeric'}\n\t\t\t\t\treturnKeyType={\"done\"}\n\t\t\t\t/>\n\t\t\t</View>\n\t\t);\n\t}\n\n\trenderListHeader() {\n\t\tconst { ListHeaderComponent } = this.props;\n\t\treturn (\n\t\t\t<View>\n\t\t\t\t{ListHeaderComponent ? (\n\t\t\t\t\tListHeaderComponent\n\t\t\t\t) : (\n\t\t\t\t\t<View style={{ height: 8 }} />\n\t\t\t\t)}\n\t\t\t\t{this.renderFilterButton()}\n\t\t\t\t{this.renderSearch()}\n\t\t\t</View>\n\t\t);\n\t}\n\n\trenderList() {\n\t\tconst { filteredList } = this.state;\n\n\t\treturn (\n\t\t\t<FlatList\n\t\t\t\tkeyboardShouldPersistTaps=\"always\"\n\t\t\t\tstyle={{ flex: 1 }}\n\t\t\t\tcontentContainerStyle={{ paddingBottom: 16 }}\n\t\t\t\tdata={filteredList}\n\t\t\t\tkeyExtractor={(item) => item.id}\n\t\t\t\trenderItem={({ item }) => (\n\t\t\t\t\t<MaintenanceListItem style={this.props.itemStyle} job={item} />\n\t\t\t\t)}\n\t\t\t\tListEmptyComponent={this.renderEmptyList()}\n\t\t\t\tListHeaderComponent={this.renderListHeader()}\n\t\t\t\tListFooterComponent={this.renderListFooter()}\n\t\t\t\tonEndReached={this.loadMore}\n\t\t\t\tonEndReachedThreshold={0.5}\n\t\t\t/>\n\t\t);\n\t}\n\n\trenderListFooter = () => {\n\t\tif (!this.state.loadingMore) return null;\n\n\t\treturn (\n\t\t\t<View style={styles.loadingMore}>\n\t\t\t\t<Components.LoadingIndicator visible={true} />\n\t\t\t</View>\n\t\t);\n\t};\n\n\trenderFilterPopup() {\n\t\tconst { jobfilters } = this.props;\n\t\tconst { showFilterPopup, types } = this.state;\n\t\tif (!showFilterPopup) return null;\n\n\t\treturn (\n\t\t\t<FilterPopupMenu\n\t\t\t\tsite={this.props.site}\n\t\t\t\ttypes={types}\n\t\t\t\tstatus={jobfilters.status}\n\t\t\t\tpriority={jobfilters.priority}\n\t\t\t\tassignee={jobfilters.assignee}\n\t\t\t\ttype={jobfilters.type}\n\t\t\t\tonClose={this.onSelectFilter}\n\t\t\t/>\n\t\t);\n\t}\n\n\trender() {\n\t\treturn (\n\t\t\t<View style={[styles.container, this.props.style]}>\n\t\t\t\t{this.renderList()}\n\t\t\t\t{this.renderFilterPopup()}\n\t\t\t</View>\n\t\t);\n\t}\n}\n\nconst styles = StyleSheet.create({\n\tcontainer: {\n\t\tflex: 1,\n\t\tbackgroundColor: \"#fff\",\n\t},\n\tfilterContainerOuter: {\n\t\tflexDirection: \"row\",\n\t\tjustifyContent: \"space-between\",\n\t\talignItems: \"center\",\n\t\tpaddingHorizontal: 16,\n\t\tpaddingVertical: 16,\n\t},\n\tfilterTitle: {\n\t\tfontFamily: \"sf-bold\",\n\t\tfontSize: 11,\n\t\tletterSpacing: 0.8,\n\t\tcolor: \"#4d4d4d\",\n\t},\n\tfilterContainer: {\n\t\tflexDirection: \"row\",\n\t\talignItems: \"center\",\n\t},\n\tfilterText: {\n\t\tfontFamily: \"sf-semibold\",\n\t\tfontSize: 16,\n\t\tmarginRight: 6,\n\t},\n\tfilterIcon: {\n\t\tfontSize: 20,\n\t},\n\tsearchContainer: {\n\t\tflexDirection: \"row\",\n\t\talignItems: \"center\",\n\t\tpaddingBottom: 8,\n\t\tpaddingHorizontal: 16,\n\t},\n\tfilterButton: {\n\t\tpaddingBottom: 8,\n\t\tpaddingHorizontal: 16,\n\t\tflexDirection: \"row-reverse\",\n\t},\n\tfilterButtonText: {\n\t\tfontFamily: \"sf-semibold\",\n\t\tfontSize: 16,\n\t},\n\tloadingMore: {\n\t\tpaddingVertical: 20,\n\t\talignItems: \"center\",\n\t},\n\tclearFiltersButton: {\n\t\tmarginTop: 12,\n\t\tpaddingVertical: 10,\n\t\tpaddingHorizontal: 24,\n\t\tborderRadius: 8,\n\t\tborderWidth: 1,\n\t\tborderColor: \"#ccc\",\n\t\tbackgroundColor: \"#f9f9f9\",\n\t},\n\tclearFiltersText: {\n\t\tfontFamily: \"sf-semibold\",\n\t\tfontSize: 15,\n\t},\n});\n\nconst mapStateToProps = (state) => {\n\tconst { user, notifications } = state;\n\tconst jobs = state[values.reducerKey];\n\tconst jobsOrdered = _.orderBy(jobs.jobs, [\"createdUnix\"], [\"desc\"]);\n\tconst hasPermission = _.includes(user.permissions, \"maintenanceTracking\");\n\n\treturn {\n\t\thasPermission,\n\t\tjobs: jobsOrdered,\n\t\tsite: user.site,\n\t\tuserCategory: user.category,\n\t\tcolourBrandingMain: Colours.getMainBrandingColourFromState(state),\n\t\tdataUpdated: notifications.dataUpdated[values.updateKey],\n\t\tstatusTypes: state[values.reducerKey].jobstatuses,\n\t\tjobfilters: state[values.reducerKey].jobfilters || {},\n\t};\n};\n\nexport default connect(\n\tmapStateToProps,\n\t{\n\t\tjobsLoaded,\n\t\tjobAdded,\n\t\tjobsAdded,\n\t\tjobStatusesUpdate,\n\t\tjobHideSeenUpdate,\n\t\tjobsFilterLoaded,\n\t},\n\tnull,\n\t{\n\t\tforwardRef: true,\n\t},\n)(MaintenanceList);\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","Component","Text","View","StyleSheet","FlatList","TouchableOpacity","Animated","_","connect","maintenanceActions","jobsLoaded","jobAdded","jobsAdded","jobStatusesUpdate","jobHideSeenUpdate","jobsFilterLoaded","MaintenanceListItem","FilterPopupMenu","Components","Colours","Helper","values","MaintenanceList","constructor","props","_defineProperty","Value","overrideFilters","currentCounter","_refreshCounter","onLoadingChanged","jobfilters","res","getJobs2","site","status","priority","type","assignee","jobs","data","Items","lastKey","LastKey","_filterDataReady","setState","hasMore","error","console","log","loading","loadingMore","searchText","state","newJobs","newLastKey","getJobTypes","getSite","types","map","t","label","typeName","value","splice","jobId","job","getJobByJobId","source","filteredList","jobIdMatch","find","j","filter","room","toLowerCase","indexOf","fetchJob","jobIndex","unshift","_filterApplying","length","_showOverlay","callback","isEmpty","resetDataSource","showFilterPopup","selected","onToggleFilter","refresh","filterTexts","push","statusText","priorityText","assigneeName","join","emptyFilters","onSelectFilter","createElement","style","styles","LoadingIndicator","visible","timing","_overlayOpacity","toValue","duration","useNativeDriver","start","componentDidMount","refreshTypes","componentDidUpdate","prevProps","dataUpdated","isEqual","getEmptyStateText","options","EmptyText","userCategory","emptyRequestsStaff","emptyRequestsUser","hasFiltersActive","renderEmptyList","hasFilters","marginHorizontal","alignItems","EmptyStateMain","title","onPress","clearFilters","clearFiltersButton","clearFiltersText","color","colourBrandingMain","renderFilterButton","filterButton","filterButtonText","getFilterButtonText","renderSearch","hasPermission","searchContainer","GenericInput","placeholder","textEntityName","onChangeText","onSearchText","onSubmitEditing","onSearchSubmit","squaredCorners","hasClear","returnKeyType","renderListHeader","ListHeaderComponent","height","renderList","keyboardShouldPersistTaps","flex","contentContainerStyle","paddingBottom","keyExtractor","item","id","renderItem","itemStyle","ListEmptyComponent","ListFooterComponent","renderListFooter","onEndReached","loadMore","onEndReachedThreshold","renderFilterOverlay","filterOverlay","opacity","pointerEvents","filterOverlayInner","LoadingCircles","renderFilterPopup","onClose","render","container","create","backgroundColor","filterContainerOuter","flexDirection","justifyContent","paddingHorizontal","paddingVertical","filterTitle","fontFamily","fontSize","letterSpacing","filterContainer","filterText","marginRight","filterIcon","marginTop","borderRadius","borderWidth","borderColor","absoluteFillObject","padding","mapStateToProps","user","notifications","reducerKey","jobsOrdered","orderBy","includes","permissions","category","getMainBrandingColourFromState","updateKey","statusTypes","jobstatuses","forwardRef"],"sources":["MaintenanceList.js"],"sourcesContent":["import React, { Component } from \"react\";\nimport { Text } from \"@plusscommunities/pluss-core-app/components\";\nimport { View, StyleSheet, FlatList, TouchableOpacity, Animated } from \"react-native\";\nimport _ from \"lodash\";\nimport { connect } from \"react-redux\";\nimport { maintenanceActions } from \"../apis\";\nimport {\n\tjobsLoaded,\n\tjobAdded,\n\tjobsAdded,\n\tjobStatusesUpdate,\n\tjobHideSeenUpdate,\n\tjobsFilterLoaded,\n} from \"../actions\";\nimport MaintenanceListItem from \"../components/MaintenanceListItem\";\nimport FilterPopupMenu from \"./FilterPopupMenu\";\nimport { Components, Colours, Helper } from \"../core.config\";\nimport { values } from \"../values.config\";\n\nclass MaintenanceList extends Component {\n\t_refreshCounter = 0;\n\t_filterApplying = false;\n\t_filterDataReady = false;\n\t_overlayOpacity = new Animated.Value(0);\n\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t\ttypes: [],\n\t\t\tfilteredList: props.jobs,\n\t\t\tloading: false,\n\t\t\tloadingMore: false,\n\t\t\thasMore: true,\n\t\t\tlastKey: null,\n\t\t\tsearchText: \"\",\n\t\t\tshowFilterPopup: false,\n\t\t};\n\t}\n\n\tcomponentDidMount() {\n\t\tthis.props.jobStatusesUpdate(this.props.site);\n\t\tthis.props.jobHideSeenUpdate(this.props.site);\n\t\tthis.refresh();\n\t\tthis.refreshTypes();\n\t\tthis.resetDataSource();\n\t}\n\n\tcomponentDidUpdate(prevProps) {\n\t\tif (!prevProps.dataUpdated && this.props.dataUpdated) this.refresh();\n\t\tif (\n\t\t\t!_.isEqual(prevProps.jobs, this.props.jobs) ||\n\t\t\t!_.isEqual(prevProps.jobfilters, this.props.jobfilters)\n\t\t)\n\t\t\tthis.resetDataSource();\n\t}\n\n\trefresh = (overrideFilters) => {\n\t\tconst currentCounter = ++this._refreshCounter;\n\t\tthis.onLoadingChanged(true, async () => {\n\t\t\ttry {\n\t\t\t\tconst jobfilters = overrideFilters || this.props.jobfilters;\n\t\t\t\tconst res = await maintenanceActions.getJobs2(\n\t\t\t\t\tthis.props.site,\n\t\t\t\t\tjobfilters.status,\n\t\t\t\t\tjobfilters.priority,\n\t\t\t\t\tjobfilters.type,\n\t\t\t\t\tnull, // No lastKey = first page\n\t\t\t\t\tjobfilters.assignee,\n\t\t\t\t);\n\n\t\t\t\t// Discard stale responses from earlier filter changes\n\t\t\t\tif (currentCounter !== this._refreshCounter) return;\n\n\t\t\t\tconst jobs = res.data.Items;\n\t\t\t\tconst lastKey = res.data.LastKey;\n\n\t\t\t\t// Signal that the API response is ready before dispatching to Redux\n\t\t\t\tthis._filterDataReady = true;\n\n\t\t\t\t// Always replace jobs on refresh (filters are server-side)\n\t\t\t\tthis.props.jobsLoaded(jobs);\n\n\t\t\t\tthis.setState({\n\t\t\t\t\tlastKey,\n\t\t\t\t\thasMore: !!lastKey,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tif (currentCounter !== this._refreshCounter) return;\n\t\t\t\tconsole.log(\"refresh error\", error);\n\t\t\t} finally {\n\t\t\t\tif (currentCounter === this._refreshCounter) {\n\t\t\t\t\tthis.onLoadingChanged(false);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\tloadMore = () => {\n\t\tconst { loading, loadingMore, hasMore, lastKey, searchText } = this.state;\n\n\t\t// Don't load if already loading, no more pages, or during search\n\t\tif (loading || loadingMore || !hasMore || !lastKey || searchText) return;\n\n\t\tthis.setState({ loadingMore: true }, async () => {\n\t\t\ttry {\n\t\t\t\tconst { jobfilters } = this.props;\n\t\t\t\tconst res = await maintenanceActions.getJobs2(\n\t\t\t\t\tthis.props.site,\n\t\t\t\t\tjobfilters.status,\n\t\t\t\t\tjobfilters.priority,\n\t\t\t\t\tjobfilters.type,\n\t\t\t\t\tlastKey,\n\t\t\t\t\tjobfilters.assignee,\n\t\t\t\t);\n\n\t\t\t\tconst newJobs = res.data.Items;\n\t\t\t\tconst newLastKey = res.data.LastKey;\n\n\t\t\t\t// Append to existing jobs\n\t\t\t\tthis.props.jobsAdded(newJobs);\n\n\t\t\t\tthis.setState({\n\t\t\t\t\tlastKey: newLastKey,\n\t\t\t\t\thasMore: !!newLastKey,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconsole.log(\"loadMore error\", error);\n\t\t\t} finally {\n\t\t\t\tthis.setState({ loadingMore: false });\n\t\t\t}\n\t\t});\n\t};\n\n\trefreshTypes = async () => {\n\t\tconst { data } = await maintenanceActions.getJobTypes(\n\t\t\tHelper.getSite(this.props.site),\n\t\t);\n\t\tconst types = data.map((t) => {\n\t\t\treturn { label: t.typeName, value: t.typeName };\n\t\t});\n\t\ttypes.splice(0, 0, { label: \"All\", value: \"\" });\n\t\t// console.log('refreshTypes', types);\n\t\tthis.setState({ types });\n\t};\n\n\tfetchJob = (jobId) => {\n\t\tif (this.state.loading) return;\n\n\t\tthis.onLoadingChanged(true, async () => {\n\t\t\ttry {\n\t\t\t\tconst job = await maintenanceActions.getJobByJobId(\n\t\t\t\t\tthis.props.site,\n\t\t\t\t\tjobId,\n\t\t\t\t);\n\t\t\t\t// console.log('fetchJob', job?.data);\n\t\t\t\tthis.props.jobAdded(job.data);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.log(\"fetchJob error\", error);\n\t\t\t} finally {\n\t\t\t\tthis.onLoadingChanged(false);\n\t\t\t}\n\t\t});\n\t};\n\n\tgetEmptyStateText() {\n\t\tif (this.props.options && !_.isEmpty(this.props.options.EmptyText)) {\n\t\t\treturn this.props.options.EmptyText;\n\t\t}\n\t\treturn this.props.userCategory === \"staff\"\n\t\t\t? values.emptyRequestsStaff\n\t\t\t: values.emptyRequestsUser;\n\t}\n\n\tresetDataSource = (source = \"\") => {\n\t\tconst { searchText } = this.state;\n\t\tconst { jobs } = this.props;\n\n\t\tlet filteredList = jobs;\n\t\tlet jobIdMatch = null;\n\n\t\t// Client-side search filtering (search is not supported server-side)\n\t\tif (searchText) {\n\t\t\tjobIdMatch = _.find(jobs, (j) => j.jobId === searchText);\n\t\t\tfilteredList = jobs.filter((j) => {\n\t\t\t\tif (\n\t\t\t\t\tj.room &&\n\t\t\t\t\tj.room.toLowerCase().indexOf(searchText.toLowerCase()) > -1\n\t\t\t\t) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\t\t\tif (!jobIdMatch) this.fetchJob(searchText);\n\t\t}\n\n\t\t// Note: status, priority, type, and assignee filters are applied server-side\n\t\t// via getJobs2, so no client-side filtering needed for those\n\n\t\tif (jobIdMatch) {\n\t\t\tconst jobIndex = filteredList.indexOf(jobIdMatch);\n\t\t\tif (jobIndex > -1) {\n\t\t\t\tfilteredList.splice(jobIndex, 1);\n\t\t\t}\n\t\t\tfilteredList.unshift(jobIdMatch);\n\t\t}\n\n\t\t// During a filter transition, don't clear the list until the API\n\t\t// response has arrived and been processed. This prevents the empty\n\t\t// state from flashing when jobs transiently drop to [].\n\t\tif (\n\t\t\tthis._filterApplying &&\n\t\t\t!this._filterDataReady &&\n\t\t\tfilteredList.length === 0\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setState({ filteredList }, () => {\n\t\t\tif (this._filterDataReady) {\n\t\t\t\tthis._filterApplying = false;\n\t\t\t\tthis._filterDataReady = false;\n\t\t\t\tthis._showOverlay(false);\n\t\t\t}\n\t\t});\n\t};\n\n\tonLoadingChanged = (loading, callback) => {\n\t\tthis.setState({ loading }, () => {\n\t\t\tif (this.props.onLoadingChanged)\n\t\t\t\tthis.props.onLoadingChanged(this.state.loading);\n\t\t\tif (callback) callback();\n\t\t});\n\t};\n\n\tonSearchText = (value) => {\n\t\tthis.setState({ searchText: value }, () => {\n\t\t\tif (_.isEmpty(this.state.searchText)) this.resetDataSource(\"search\");\n\t\t});\n\t};\n\n\tonSearchSubmit = () => {\n\t\tthis.resetDataSource(\"search\");\n\t};\n\n\tonToggleFilter = () => {\n\t\tthis.setState({ showFilterPopup: !this.state.showFilterPopup });\n\t};\n\n\tonSelectFilter = (selected) => {\n\t\tthis._filterApplying = true;\n\t\tthis._filterDataReady = false;\n\t\tthis._showOverlay(true);\n\t\tthis.props.jobsFilterLoaded(selected);\n\t\tthis.onToggleFilter();\n\t\t// Reset pagination but keep old list visible while loading\n\t\t// Pass filters directly to avoid stale props from async Redux update\n\t\tthis.setState({ lastKey: null, hasMore: true }, () => {\n\t\t\tthis.refresh(selected);\n\t\t});\n\t};\n\n\tgetFilterButtonText = () => {\n\t\tconst { jobfilters } = this.props;\n\t\tconst filterTexts = [];\n\t\tif (!_.isEmpty(jobfilters.status)) {\n\t\t\tfilterTexts.push(jobfilters.statusText);\n\t\t}\n\t\tif (!_.isEmpty(jobfilters.priority)) {\n\t\t\tfilterTexts.push(jobfilters.priorityText);\n\t\t}\n\t\tif (!_.isEmpty(jobfilters.type)) {\n\t\t\tfilterTexts.push(jobfilters.type);\n\t\t}\n\t\tif (!_.isEmpty(jobfilters.assignee)) {\n\t\t\tfilterTexts.push(jobfilters.assigneeName);\n\t\t}\n\t\tif (_.isEmpty(filterTexts)) {\n\t\t\treturn \"Filter\";\n\t\t}\n\t\treturn `Filtering by ${filterTexts.join(\", \")}`;\n\t};\n\n\thasFiltersActive() {\n\t\tconst { jobfilters } = this.props;\n\t\treturn (\n\t\t\t!_.isEmpty(jobfilters.status) ||\n\t\t\t!_.isEmpty(jobfilters.priority) ||\n\t\t\t!_.isEmpty(jobfilters.type) ||\n\t\t\t!_.isEmpty(jobfilters.assignee)\n\t\t);\n\t}\n\n\tclearFilters = () => {\n\t\tconst emptyFilters = {\n\t\t\tstatus: \"\",\n\t\t\tstatusText: \"\",\n\t\t\tpriority: \"\",\n\t\t\tpriorityText: \"\",\n\t\t\ttype: \"\",\n\t\t\tassignee: \"\",\n\t\t\tassigneeName: \"\",\n\t\t};\n\t\tthis.onSelectFilter(emptyFilters);\n\t};\n\n\trenderEmptyList() {\n\t\tif (this.state.loading || this._filterApplying) return null;\n\n\t\tconst hasFilters = this.hasFiltersActive();\n\n\t\treturn (\n\t\t\t<View style={{ marginHorizontal: 16, alignItems: \"center\" }}>\n\t\t\t\t<Components.EmptyStateMain\n\t\t\t\t\ttitle={\n\t\t\t\t\t\thasFilters\n\t\t\t\t\t\t\t? \"No requests match your filters\"\n\t\t\t\t\t\t\t: this.getEmptyStateText()\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t\t{hasFilters && (\n\t\t\t\t\t<TouchableOpacity\n\t\t\t\t\t\tonPress={this.clearFilters}\n\t\t\t\t\t\tstyle={styles.clearFiltersButton}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\tstyle={[\n\t\t\t\t\t\t\t\tstyles.clearFiltersText,\n\t\t\t\t\t\t\t\t{ color: this.props.colourBrandingMain },\n\t\t\t\t\t\t\t]}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tClear filters\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</TouchableOpacity>\n\t\t\t\t)}\n\t\t\t</View>\n\t\t);\n\t}\n\n\trenderFilterButton() {\n\t\treturn (\n\t\t\t<TouchableOpacity onPress={this.onToggleFilter}>\n\t\t\t\t<View style={styles.filterButton}>\n\t\t\t\t\t<Text\n\t\t\t\t\t\tstyle={[\n\t\t\t\t\t\t\tstyles.filterButtonText,\n\t\t\t\t\t\t\t{ color: this.props.colourBrandingMain },\n\t\t\t\t\t\t]}\n\t\t\t\t\t>\n\t\t\t\t\t\t{this.getFilterButtonText()}\n\t\t\t\t\t</Text>\n\t\t\t\t</View>\n\t\t\t</TouchableOpacity>\n\t\t);\n\t}\n\n\trenderSearch() {\n\t\tif (!this.props.hasPermission) return null;\n\n\t\treturn (\n\t\t\t<View style={styles.searchContainer}>\n\t\t\t\t<Components.GenericInput\n\t\t\t\t\tplaceholder={`Search by ${values.textEntityName} ID or Address`}\n\t\t\t\t\tvalue={this.state.searchText}\n\t\t\t\t\tonChangeText={this.onSearchText}\n\t\t\t\t\tonSubmitEditing={this.onSearchSubmit}\n\t\t\t\t\tsquaredCorners\n\t\t\t\t\thasClear\n\t\t\t\t\t// keyboardType={'numeric'}\n\t\t\t\t\treturnKeyType={\"done\"}\n\t\t\t\t/>\n\t\t\t</View>\n\t\t);\n\t}\n\n\trenderListHeader() {\n\t\tconst { ListHeaderComponent } = this.props;\n\t\treturn (\n\t\t\t<View>\n\t\t\t\t{ListHeaderComponent ? (\n\t\t\t\t\tListHeaderComponent\n\t\t\t\t) : (\n\t\t\t\t\t<View style={{ height: 8 }} />\n\t\t\t\t)}\n\t\t\t\t{this.renderFilterButton()}\n\t\t\t\t{this.renderSearch()}\n\t\t\t</View>\n\t\t);\n\t}\n\n\trenderList() {\n\t\tconst { filteredList } = this.state;\n\n\t\treturn (\n\t\t\t<FlatList\n\t\t\t\tkeyboardShouldPersistTaps=\"always\"\n\t\t\t\tstyle={{ flex: 1 }}\n\t\t\t\tcontentContainerStyle={{ paddingBottom: 16 }}\n\t\t\t\tdata={filteredList}\n\t\t\t\tkeyExtractor={(item) => item.id}\n\t\t\t\trenderItem={({ item }) => (\n\t\t\t\t\t<MaintenanceListItem style={this.props.itemStyle} job={item} />\n\t\t\t\t)}\n\t\t\t\tListEmptyComponent={this.renderEmptyList()}\n\t\t\t\tListHeaderComponent={this.renderListHeader()}\n\t\t\t\tListFooterComponent={this.renderListFooter()}\n\t\t\t\tonEndReached={this.loadMore}\n\t\t\t\tonEndReachedThreshold={0.5}\n\t\t\t/>\n\t\t);\n\t}\n\n\trenderListFooter = () => {\n\t\tif (!this.state.loadingMore) return null;\n\n\t\treturn (\n\t\t\t<View style={styles.loadingMore}>\n\t\t\t\t<Components.LoadingIndicator visible={true} />\n\t\t\t</View>\n\t\t);\n\t};\n\n\t_showOverlay = (visible) => {\n\t\tAnimated.timing(this._overlayOpacity, {\n\t\t\ttoValue: visible ? 1 : 0,\n\t\t\tduration: 200,\n\t\t\tuseNativeDriver: true,\n\t\t}).start();\n\t};\n\n\trenderFilterOverlay() {\n\t\tif (!this._filterApplying) return null;\n\n\t\treturn (\n\t\t\t<Animated.View\n\t\t\t\tstyle={[\n\t\t\t\t\tstyles.filterOverlay,\n\t\t\t\t\t{ opacity: this._overlayOpacity },\n\t\t\t\t]}\n\t\t\t\tpointerEvents=\"none\"\n\t\t\t>\n\t\t\t\t<View style={styles.filterOverlayInner}>\n\t\t\t\t\t<Components.LoadingCircles />\n\t\t\t\t</View>\n\t\t\t</Animated.View>\n\t\t);\n\t}\n\n\trenderFilterPopup() {\n\t\tconst { jobfilters } = this.props;\n\t\tconst { showFilterPopup, types } = this.state;\n\t\tif (!showFilterPopup) return null;\n\n\t\treturn (\n\t\t\t<FilterPopupMenu\n\t\t\t\tsite={this.props.site}\n\t\t\t\ttypes={types}\n\t\t\t\tstatus={jobfilters.status}\n\t\t\t\tpriority={jobfilters.priority}\n\t\t\t\tassignee={jobfilters.assignee}\n\t\t\t\ttype={jobfilters.type}\n\t\t\t\tonClose={this.onSelectFilter}\n\t\t\t/>\n\t\t);\n\t}\n\n\trender() {\n\t\treturn (\n\t\t\t<View style={[styles.container, this.props.style]}>\n\t\t\t\t{this.renderList()}\n\t\t\t\t{this.renderFilterOverlay()}\n\t\t\t\t{this.renderFilterPopup()}\n\t\t\t</View>\n\t\t);\n\t}\n}\n\nconst styles = StyleSheet.create({\n\tcontainer: {\n\t\tflex: 1,\n\t\tbackgroundColor: \"#fff\",\n\t},\n\tfilterContainerOuter: {\n\t\tflexDirection: \"row\",\n\t\tjustifyContent: \"space-between\",\n\t\talignItems: \"center\",\n\t\tpaddingHorizontal: 16,\n\t\tpaddingVertical: 16,\n\t},\n\tfilterTitle: {\n\t\tfontFamily: \"sf-bold\",\n\t\tfontSize: 11,\n\t\tletterSpacing: 0.8,\n\t\tcolor: \"#4d4d4d\",\n\t},\n\tfilterContainer: {\n\t\tflexDirection: \"row\",\n\t\talignItems: \"center\",\n\t},\n\tfilterText: {\n\t\tfontFamily: \"sf-semibold\",\n\t\tfontSize: 16,\n\t\tmarginRight: 6,\n\t},\n\tfilterIcon: {\n\t\tfontSize: 20,\n\t},\n\tsearchContainer: {\n\t\tflexDirection: \"row\",\n\t\talignItems: \"center\",\n\t\tpaddingBottom: 8,\n\t\tpaddingHorizontal: 16,\n\t},\n\tfilterButton: {\n\t\tpaddingBottom: 8,\n\t\tpaddingHorizontal: 16,\n\t\tflexDirection: \"row-reverse\",\n\t},\n\tfilterButtonText: {\n\t\tfontFamily: \"sf-semibold\",\n\t\tfontSize: 16,\n\t},\n\tloadingMore: {\n\t\tpaddingVertical: 20,\n\t\talignItems: \"center\",\n\t},\n\tclearFiltersButton: {\n\t\tmarginTop: 12,\n\t\tpaddingVertical: 10,\n\t\tpaddingHorizontal: 24,\n\t\tborderRadius: 8,\n\t\tborderWidth: 1,\n\t\tborderColor: \"#ccc\",\n\t\tbackgroundColor: \"#f9f9f9\",\n\t},\n\tclearFiltersText: {\n\t\tfontFamily: \"sf-semibold\",\n\t\tfontSize: 15,\n\t},\n\tfilterOverlay: {\n\t\t...StyleSheet.absoluteFillObject,\n\t\tjustifyContent: \"center\",\n\t\talignItems: \"center\",\n\t\tbackgroundColor: \"rgba(255, 255, 255, 0.7)\",\n\t},\n\tfilterOverlayInner: {\n\t\tpadding: 20,\n\t\tborderRadius: 12,\n\t},\n});\n\nconst mapStateToProps = (state) => {\n\tconst { user, notifications } = state;\n\tconst jobs = state[values.reducerKey];\n\tconst jobsOrdered = _.orderBy(jobs.jobs, [\"createdUnix\"], [\"desc\"]);\n\tconst hasPermission = _.includes(user.permissions, \"maintenanceTracking\");\n\n\treturn {\n\t\thasPermission,\n\t\tjobs: jobsOrdered,\n\t\tsite: user.site,\n\t\tuserCategory: user.category,\n\t\tcolourBrandingMain: Colours.getMainBrandingColourFromState(state),\n\t\tdataUpdated: notifications.dataUpdated[values.updateKey],\n\t\tstatusTypes: state[values.reducerKey].jobstatuses,\n\t\tjobfilters: state[values.reducerKey].jobfilters || {},\n\t};\n};\n\nexport default connect(\n\tmapStateToProps,\n\t{\n\t\tjobsLoaded,\n\t\tjobAdded,\n\t\tjobsAdded,\n\t\tjobStatusesUpdate,\n\t\tjobHideSeenUpdate,\n\t\tjobsFilterLoaded,\n\t},\n\tnull,\n\t{\n\t\tforwardRef: true,\n\t},\n)(MaintenanceList);\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plusscommunities/pluss-maintenance-app",
|
|
3
|
-
"version": "8.0.17-beta.
|
|
3
|
+
"version": "8.0.17-beta.6",
|
|
4
4
|
"description": "Extension package to enable maintenance on Pluss Communities Platform",
|
|
5
5
|
"main": "dist/module/index.js",
|
|
6
6
|
"module": "dist/module/index.js",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React, { Component } from "react";
|
|
2
2
|
import { Text } from "@plusscommunities/pluss-core-app/components";
|
|
3
|
-
import { View, StyleSheet, FlatList, TouchableOpacity } from "react-native";
|
|
3
|
+
import { View, StyleSheet, FlatList, TouchableOpacity, Animated } from "react-native";
|
|
4
4
|
import _ from "lodash";
|
|
5
5
|
import { connect } from "react-redux";
|
|
6
6
|
import { maintenanceActions } from "../apis";
|
|
@@ -19,6 +19,9 @@ import { values } from "../values.config";
|
|
|
19
19
|
|
|
20
20
|
class MaintenanceList extends Component {
|
|
21
21
|
_refreshCounter = 0;
|
|
22
|
+
_filterApplying = false;
|
|
23
|
+
_filterDataReady = false;
|
|
24
|
+
_overlayOpacity = new Animated.Value(0);
|
|
22
25
|
|
|
23
26
|
constructor(props) {
|
|
24
27
|
super(props);
|
|
@@ -26,7 +29,7 @@ class MaintenanceList extends Component {
|
|
|
26
29
|
this.state = {
|
|
27
30
|
types: [],
|
|
28
31
|
filteredList: props.jobs,
|
|
29
|
-
loading:
|
|
32
|
+
loading: false,
|
|
30
33
|
loadingMore: false,
|
|
31
34
|
hasMore: true,
|
|
32
35
|
lastKey: null,
|
|
@@ -72,6 +75,9 @@ class MaintenanceList extends Component {
|
|
|
72
75
|
const jobs = res.data.Items;
|
|
73
76
|
const lastKey = res.data.LastKey;
|
|
74
77
|
|
|
78
|
+
// Signal that the API response is ready before dispatching to Redux
|
|
79
|
+
this._filterDataReady = true;
|
|
80
|
+
|
|
75
81
|
// Always replace jobs on refresh (filters are server-side)
|
|
76
82
|
this.props.jobsLoaded(jobs);
|
|
77
83
|
|
|
@@ -199,7 +205,24 @@ class MaintenanceList extends Component {
|
|
|
199
205
|
filteredList.unshift(jobIdMatch);
|
|
200
206
|
}
|
|
201
207
|
|
|
202
|
-
|
|
208
|
+
// During a filter transition, don't clear the list until the API
|
|
209
|
+
// response has arrived and been processed. This prevents the empty
|
|
210
|
+
// state from flashing when jobs transiently drop to [].
|
|
211
|
+
if (
|
|
212
|
+
this._filterApplying &&
|
|
213
|
+
!this._filterDataReady &&
|
|
214
|
+
filteredList.length === 0
|
|
215
|
+
) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
this.setState({ filteredList }, () => {
|
|
220
|
+
if (this._filterDataReady) {
|
|
221
|
+
this._filterApplying = false;
|
|
222
|
+
this._filterDataReady = false;
|
|
223
|
+
this._showOverlay(false);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
203
226
|
};
|
|
204
227
|
|
|
205
228
|
onLoadingChanged = (loading, callback) => {
|
|
@@ -225,6 +248,9 @@ class MaintenanceList extends Component {
|
|
|
225
248
|
};
|
|
226
249
|
|
|
227
250
|
onSelectFilter = (selected) => {
|
|
251
|
+
this._filterApplying = true;
|
|
252
|
+
this._filterDataReady = false;
|
|
253
|
+
this._showOverlay(true);
|
|
228
254
|
this.props.jobsFilterLoaded(selected);
|
|
229
255
|
this.onToggleFilter();
|
|
230
256
|
// Reset pagination but keep old list visible while loading
|
|
@@ -279,7 +305,7 @@ class MaintenanceList extends Component {
|
|
|
279
305
|
};
|
|
280
306
|
|
|
281
307
|
renderEmptyList() {
|
|
282
|
-
if (this.state.loading) return null;
|
|
308
|
+
if (this.state.loading || this._filterApplying) return null;
|
|
283
309
|
|
|
284
310
|
const hasFilters = this.hasFiltersActive();
|
|
285
311
|
|
|
@@ -394,6 +420,32 @@ class MaintenanceList extends Component {
|
|
|
394
420
|
);
|
|
395
421
|
};
|
|
396
422
|
|
|
423
|
+
_showOverlay = (visible) => {
|
|
424
|
+
Animated.timing(this._overlayOpacity, {
|
|
425
|
+
toValue: visible ? 1 : 0,
|
|
426
|
+
duration: 200,
|
|
427
|
+
useNativeDriver: true,
|
|
428
|
+
}).start();
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
renderFilterOverlay() {
|
|
432
|
+
if (!this._filterApplying) return null;
|
|
433
|
+
|
|
434
|
+
return (
|
|
435
|
+
<Animated.View
|
|
436
|
+
style={[
|
|
437
|
+
styles.filterOverlay,
|
|
438
|
+
{ opacity: this._overlayOpacity },
|
|
439
|
+
]}
|
|
440
|
+
pointerEvents="none"
|
|
441
|
+
>
|
|
442
|
+
<View style={styles.filterOverlayInner}>
|
|
443
|
+
<Components.LoadingCircles />
|
|
444
|
+
</View>
|
|
445
|
+
</Animated.View>
|
|
446
|
+
);
|
|
447
|
+
}
|
|
448
|
+
|
|
397
449
|
renderFilterPopup() {
|
|
398
450
|
const { jobfilters } = this.props;
|
|
399
451
|
const { showFilterPopup, types } = this.state;
|
|
@@ -416,6 +468,7 @@ class MaintenanceList extends Component {
|
|
|
416
468
|
return (
|
|
417
469
|
<View style={[styles.container, this.props.style]}>
|
|
418
470
|
{this.renderList()}
|
|
471
|
+
{this.renderFilterOverlay()}
|
|
419
472
|
{this.renderFilterPopup()}
|
|
420
473
|
</View>
|
|
421
474
|
);
|
|
@@ -484,6 +537,16 @@ const styles = StyleSheet.create({
|
|
|
484
537
|
fontFamily: "sf-semibold",
|
|
485
538
|
fontSize: 15,
|
|
486
539
|
},
|
|
540
|
+
filterOverlay: {
|
|
541
|
+
...StyleSheet.absoluteFillObject,
|
|
542
|
+
justifyContent: "center",
|
|
543
|
+
alignItems: "center",
|
|
544
|
+
backgroundColor: "rgba(255, 255, 255, 0.7)",
|
|
545
|
+
},
|
|
546
|
+
filterOverlayInner: {
|
|
547
|
+
padding: 20,
|
|
548
|
+
borderRadius: 12,
|
|
549
|
+
},
|
|
487
550
|
});
|
|
488
551
|
|
|
489
552
|
const mapStateToProps = (state) => {
|