@plusscommunities/pluss-maintenance-app 7.0.2-auth.0 → 7.0.18
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/module/apis/index.js +1 -0
- package/dist/module/apis/index.js.map +1 -1
- package/dist/module/apis/userActions.js +23 -0
- package/dist/module/apis/userActions.js.map +1 -0
- package/dist/module/index.js +2 -0
- package/dist/module/index.js.map +1 -1
- package/dist/module/screens/MaintenanceUserPicker.js +130 -0
- package/dist/module/screens/MaintenanceUserPicker.js.map +1 -0
- package/dist/module/screens/ServiceRequest.js +152 -11
- package/dist/module/screens/ServiceRequest.js.map +1 -1
- package/dist/module/values.config.a.js +1 -0
- package/dist/module/values.config.a.js.map +1 -1
- package/dist/module/values.config.default.js +1 -0
- package/dist/module/values.config.default.js.map +1 -1
- package/dist/module/values.config.enquiry.js +1 -0
- package/dist/module/values.config.enquiry.js.map +1 -1
- package/dist/module/values.config.feedback.js +1 -0
- package/dist/module/values.config.feedback.js.map +1 -1
- package/dist/module/values.config.food.js +1 -0
- package/dist/module/values.config.food.js.map +1 -1
- package/dist/module/values.config.forms.js +1 -0
- package/dist/module/values.config.forms.js.map +1 -1
- package/dist/module/values.config.js +1 -0
- package/dist/module/values.config.js.map +1 -1
- package/package.json +3 -7
- package/src/apis/index.js +1 -0
- package/src/apis/userActions.js +21 -0
- package/src/index.js +2 -0
- package/src/screens/MaintenanceUserPicker.js +107 -0
- package/src/screens/ServiceRequest.js +157 -18
- package/src/values.config.a.js +1 -0
- package/src/values.config.default.js +1 -0
- package/src/values.config.enquiry.js +1 -0
- package/src/values.config.feedback.js +1 -0
- package/src/values.config.food.js +1 -0
- package/src/values.config.forms.js +1 -0
- package/src/values.config.js +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Apis","stringActions"],"sources":["index.js"],"sourcesContent":["import { Apis } from '../core.config';\n\nexport const stringActions = Apis.stringActions;\n\nexport * from './maintenanceActions';\n"],"mappings":"AAAA,SAASA,IAAI,QAAQ,gBAAgB;AAErC,OAAO,MAAMC,aAAa,GAAGD,IAAI,CAACC,aAAa;AAE/C,cAAc,sBAAsB","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["Apis","stringActions"],"sources":["index.js"],"sourcesContent":["import { Apis } from '../core.config';\n\nexport const stringActions = Apis.stringActions;\n\nexport * from './maintenanceActions';\nexport * from './userActions';\n"],"mappings":"AAAA,SAASA,IAAI,QAAQ,gBAAgB;AAErC,OAAO,MAAMC,aAAa,GAAGD,IAAI,CAACC,aAAa;AAE/C,cAAc,sBAAsB;AACpC,cAAc,eAAe","ignoreList":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Helper, Session } from '../core.config';
|
|
2
|
+
export const userActions = {
|
|
3
|
+
getSiteUsers: async site => {
|
|
4
|
+
return Session.authedFunction({
|
|
5
|
+
method: 'GET',
|
|
6
|
+
url: Helper.getUrl('users', 'users/site', {
|
|
7
|
+
site,
|
|
8
|
+
compact: true
|
|
9
|
+
})
|
|
10
|
+
});
|
|
11
|
+
},
|
|
12
|
+
fetchUser: async (site, userId) => {
|
|
13
|
+
return Session.authedFunction({
|
|
14
|
+
method: 'POST',
|
|
15
|
+
url: Helper.getUrl('users', 'getsingle'),
|
|
16
|
+
data: {
|
|
17
|
+
site,
|
|
18
|
+
userId
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=userActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Helper","Session","userActions","getSiteUsers","site","authedFunction","method","url","getUrl","compact","fetchUser","userId","data"],"sources":["userActions.js"],"sourcesContent":["import { Helper, Session } from '../core.config';\n\nexport const userActions = {\n getSiteUsers: async site => {\n return Session.authedFunction({\n method: 'GET',\n url: Helper.getUrl('users', 'users/site', { site, compact: true }),\n });\n },\n\n fetchUser: async (site, userId) => {\n return Session.authedFunction({\n method: 'POST',\n url: Helper.getUrl('users', 'getsingle'),\n data: {\n site,\n userId,\n },\n });\n },\n};\n"],"mappings":"AAAA,SAASA,MAAM,EAAEC,OAAO,QAAQ,gBAAgB;AAEhD,OAAO,MAAMC,WAAW,GAAG;EACzBC,YAAY,EAAE,MAAMC,IAAI,IAAI;IAC1B,OAAOH,OAAO,CAACI,cAAc,CAAC;MAC5BC,MAAM,EAAE,KAAK;MACbC,GAAG,EAAEP,MAAM,CAACQ,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE;QAAEJ,IAAI;QAAEK,OAAO,EAAE;MAAK,CAAC;IACnE,CAAC,CAAC;EACJ,CAAC;EAEDC,SAAS,EAAE,MAAAA,CAAON,IAAI,EAAEO,MAAM,KAAK;IACjC,OAAOV,OAAO,CAACI,cAAc,CAAC;MAC5BC,MAAM,EAAE,MAAM;MACdC,GAAG,EAAEP,MAAM,CAACQ,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC;MACxCI,IAAI,EAAE;QACJR,IAAI;QACJO;MACF;IACF,CAAC,CAAC;EACJ;AACF,CAAC","ignoreList":[]}
|
package/dist/module/index.js
CHANGED
|
@@ -3,6 +3,7 @@ import RequestDetail from './screens/RequestDetail';
|
|
|
3
3
|
import ServiceRequest from './screens/ServiceRequest';
|
|
4
4
|
import JobTypePicker from './screens/JobTypePicker';
|
|
5
5
|
import RequestNotes from './screens/RequestNotes';
|
|
6
|
+
import MaintenanceUserPicker from './screens/MaintenanceUserPicker';
|
|
6
7
|
import JobsReducer from './reducers/JobsReducer';
|
|
7
8
|
import { values } from './values.config';
|
|
8
9
|
export const Reducers = (() => {
|
|
@@ -17,6 +18,7 @@ export const Screens = (() => {
|
|
|
17
18
|
screens[values.screenServiceRequest] = ServiceRequest;
|
|
18
19
|
screens[values.screenJobTypePicker] = JobTypePicker;
|
|
19
20
|
screens[values.screenRequestNotes] = RequestNotes;
|
|
21
|
+
screens[values.screenUserPicker] = MaintenanceUserPicker;
|
|
20
22
|
return screens;
|
|
21
23
|
})();
|
|
22
24
|
export { default as Config } from './feature.config';
|
package/dist/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MaintenancePage","RequestDetail","ServiceRequest","JobTypePicker","RequestNotes","JobsReducer","values","Reducers","reducers","reducerKey","Screens","screens","screenMaintenance","screenRequestDetail","screenServiceRequest","screenJobTypePicker","screenRequestNotes","default","Config","WidgetSmall","WidgetLarge"],"sources":["index.js"],"sourcesContent":["import MaintenancePage from './screens/MaintenancePage';\nimport RequestDetail from './screens/RequestDetail';\nimport ServiceRequest from './screens/ServiceRequest';\nimport JobTypePicker from './screens/JobTypePicker';\nimport RequestNotes from './screens/RequestNotes';\nimport JobsReducer from './reducers/JobsReducer';\nimport { values } from './values.config';\n\nexport const Reducers = (() => {\n const reducers = {};\n reducers[values.reducerKey] = JobsReducer;\n return reducers;\n})();\nexport const Screens = (() => {\n const screens = {};\n screens[values.screenMaintenance] = MaintenancePage;\n screens[values.screenRequestDetail] = RequestDetail;\n screens[values.screenServiceRequest] = ServiceRequest;\n screens[values.screenJobTypePicker] = JobTypePicker;\n screens[values.screenRequestNotes] = RequestNotes;\n return screens;\n})();\nexport { default as Config } from './feature.config';\nexport { default as WidgetSmall } from './components/WidgetSmall';\nexport { default as WidgetLarge } from './components/WidgetLarge';\n"],"mappings":"AAAA,OAAOA,eAAe,MAAM,2BAA2B;AACvD,OAAOC,aAAa,MAAM,yBAAyB;AACnD,OAAOC,cAAc,MAAM,0BAA0B;AACrD,OAAOC,aAAa,MAAM,yBAAyB;AACnD,OAAOC,YAAY,MAAM,wBAAwB;AACjD,OAAOC,WAAW,MAAM,wBAAwB;AAChD,SAASC,MAAM,QAAQ,iBAAiB;AAExC,OAAO,MAAMC,QAAQ,GAAG,CAAC,MAAM;EAC7B,MAAMC,QAAQ,GAAG,CAAC,CAAC;EACnBA,QAAQ,CAACF,MAAM,CAACG,UAAU,CAAC,GAAGJ,WAAW;EACzC,OAAOG,QAAQ;AACjB,CAAC,EAAE,CAAC;AACJ,OAAO,MAAME,OAAO,GAAG,CAAC,MAAM;EAC5B,MAAMC,OAAO,GAAG,CAAC,CAAC;EAClBA,OAAO,CAACL,MAAM,CAACM,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"names":["MaintenancePage","RequestDetail","ServiceRequest","JobTypePicker","RequestNotes","MaintenanceUserPicker","JobsReducer","values","Reducers","reducers","reducerKey","Screens","screens","screenMaintenance","screenRequestDetail","screenServiceRequest","screenJobTypePicker","screenRequestNotes","screenUserPicker","default","Config","WidgetSmall","WidgetLarge"],"sources":["index.js"],"sourcesContent":["import MaintenancePage from './screens/MaintenancePage';\nimport RequestDetail from './screens/RequestDetail';\nimport ServiceRequest from './screens/ServiceRequest';\nimport JobTypePicker from './screens/JobTypePicker';\nimport RequestNotes from './screens/RequestNotes';\nimport MaintenanceUserPicker from './screens/MaintenanceUserPicker';\nimport JobsReducer from './reducers/JobsReducer';\nimport { values } from './values.config';\n\nexport const Reducers = (() => {\n const reducers = {};\n reducers[values.reducerKey] = JobsReducer;\n return reducers;\n})();\nexport const Screens = (() => {\n const screens = {};\n screens[values.screenMaintenance] = MaintenancePage;\n screens[values.screenRequestDetail] = RequestDetail;\n screens[values.screenServiceRequest] = ServiceRequest;\n screens[values.screenJobTypePicker] = JobTypePicker;\n screens[values.screenRequestNotes] = RequestNotes;\n screens[values.screenUserPicker] = MaintenanceUserPicker;\n return screens;\n})();\nexport { default as Config } from './feature.config';\nexport { default as WidgetSmall } from './components/WidgetSmall';\nexport { default as WidgetLarge } from './components/WidgetLarge';\n"],"mappings":"AAAA,OAAOA,eAAe,MAAM,2BAA2B;AACvD,OAAOC,aAAa,MAAM,yBAAyB;AACnD,OAAOC,cAAc,MAAM,0BAA0B;AACrD,OAAOC,aAAa,MAAM,yBAAyB;AACnD,OAAOC,YAAY,MAAM,wBAAwB;AACjD,OAAOC,qBAAqB,MAAM,iCAAiC;AACnE,OAAOC,WAAW,MAAM,wBAAwB;AAChD,SAASC,MAAM,QAAQ,iBAAiB;AAExC,OAAO,MAAMC,QAAQ,GAAG,CAAC,MAAM;EAC7B,MAAMC,QAAQ,GAAG,CAAC,CAAC;EACnBA,QAAQ,CAACF,MAAM,CAACG,UAAU,CAAC,GAAGJ,WAAW;EACzC,OAAOG,QAAQ;AACjB,CAAC,EAAE,CAAC;AACJ,OAAO,MAAME,OAAO,GAAG,CAAC,MAAM;EAC5B,MAAMC,OAAO,GAAG,CAAC,CAAC;EAClBA,OAAO,CAACL,MAAM,CAACM,iBAAiB,CAAC,GAAGb,eAAe;EACnDY,OAAO,CAACL,MAAM,CAACO,mBAAmB,CAAC,GAAGb,aAAa;EACnDW,OAAO,CAACL,MAAM,CAACQ,oBAAoB,CAAC,GAAGb,cAAc;EACrDU,OAAO,CAACL,MAAM,CAACS,mBAAmB,CAAC,GAAGb,aAAa;EACnDS,OAAO,CAACL,MAAM,CAACU,kBAAkB,CAAC,GAAGb,YAAY;EACjDQ,OAAO,CAACL,MAAM,CAACW,gBAAgB,CAAC,GAAGb,qBAAqB;EACxD,OAAOO,OAAO;AAChB,CAAC,EAAE,CAAC;AACJ,SAASO,OAAO,IAAIC,MAAM,QAAQ,kBAAkB;AACpD,SAASD,OAAO,IAAIE,WAAW,QAAQ,0BAA0B;AACjE,SAASF,OAAO,IAAIG,WAAW,QAAQ,0BAA0B","ignoreList":[]}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
2
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
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
|
+
import React, { Component } from 'react';
|
|
5
|
+
import _ from 'lodash';
|
|
6
|
+
import { TouchableOpacity, View, ScrollView, Text } from 'react-native';
|
|
7
|
+
import { connect } from 'react-redux';
|
|
8
|
+
import { Icon } from 'react-native-elements';
|
|
9
|
+
import { Services } from '../feature.config';
|
|
10
|
+
import { Components, Colours } from '../core.config';
|
|
11
|
+
class MaintenanceUserPicker extends Component {
|
|
12
|
+
constructor(...args) {
|
|
13
|
+
super(...args);
|
|
14
|
+
_defineProperty(this, "state", {
|
|
15
|
+
currentUser: null
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
UNSAFE_componentWillMount() {
|
|
19
|
+
this.setState({
|
|
20
|
+
currentUser: this.props.currentUser
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
onPressBack() {
|
|
24
|
+
Services.navigation.goBack();
|
|
25
|
+
}
|
|
26
|
+
onUserPress(user) {
|
|
27
|
+
this.props.onSelectUser(user);
|
|
28
|
+
this.setState({
|
|
29
|
+
currentUser: user
|
|
30
|
+
});
|
|
31
|
+
setTimeout(() => {
|
|
32
|
+
this.onPressBack();
|
|
33
|
+
}, 200);
|
|
34
|
+
}
|
|
35
|
+
renderMain() {
|
|
36
|
+
if (_.isEmpty(this.props.users)) {
|
|
37
|
+
return /*#__PURE__*/React.createElement(View, {
|
|
38
|
+
style: {
|
|
39
|
+
marginTop: 16
|
|
40
|
+
}
|
|
41
|
+
}, /*#__PURE__*/React.createElement(Components.Spinner, null));
|
|
42
|
+
}
|
|
43
|
+
return /*#__PURE__*/React.createElement(Components.FormCard, {
|
|
44
|
+
style: {
|
|
45
|
+
marginTop: 16
|
|
46
|
+
}
|
|
47
|
+
}, this.renderOptions());
|
|
48
|
+
}
|
|
49
|
+
renderOptions() {
|
|
50
|
+
return this.props.users.map((user, index) => {
|
|
51
|
+
return /*#__PURE__*/React.createElement(TouchableOpacity, {
|
|
52
|
+
key: index,
|
|
53
|
+
onPress: this.onUserPress.bind(this, user)
|
|
54
|
+
}, /*#__PURE__*/React.createElement(Components.FormCardSection, {
|
|
55
|
+
label: user.displayName,
|
|
56
|
+
labelStyle: {
|
|
57
|
+
height: 0,
|
|
58
|
+
margin: 0
|
|
59
|
+
},
|
|
60
|
+
hasUnderline: true,
|
|
61
|
+
hasContent: true
|
|
62
|
+
}, /*#__PURE__*/React.createElement(View, {
|
|
63
|
+
style: styles.rowContainer
|
|
64
|
+
}, /*#__PURE__*/React.createElement(View, {
|
|
65
|
+
style: styles.userContainer
|
|
66
|
+
}, /*#__PURE__*/React.createElement(Components.ProfilePic, {
|
|
67
|
+
ProfilePic: user.profilePic,
|
|
68
|
+
Diameter: 30
|
|
69
|
+
}), /*#__PURE__*/React.createElement(Text, {
|
|
70
|
+
style: styles.labelText
|
|
71
|
+
}, user.displayName)), /*#__PURE__*/React.createElement(Icon, {
|
|
72
|
+
name: "check-circle",
|
|
73
|
+
type: "font-awesome",
|
|
74
|
+
iconStyle: [{
|
|
75
|
+
color: '#d5d9e0',
|
|
76
|
+
fontSize: 20
|
|
77
|
+
}, _.isEqual(user, this.state.currentUser) && {
|
|
78
|
+
color: Colours.COLOUR_GREEN
|
|
79
|
+
}]
|
|
80
|
+
}))));
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
render() {
|
|
84
|
+
return /*#__PURE__*/React.createElement(View, {
|
|
85
|
+
style: styles.container
|
|
86
|
+
}, /*#__PURE__*/React.createElement(Components.Header, {
|
|
87
|
+
leftIcon: "angle-left",
|
|
88
|
+
onPressLeft: this.onPressBack.bind(this),
|
|
89
|
+
text: "Select user"
|
|
90
|
+
}), /*#__PURE__*/React.createElement(ScrollView, {
|
|
91
|
+
style: {
|
|
92
|
+
flex: 1
|
|
93
|
+
}
|
|
94
|
+
}, this.renderMain()));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const styles = {
|
|
98
|
+
container: {
|
|
99
|
+
flex: 1,
|
|
100
|
+
position: 'relative',
|
|
101
|
+
backgroundColor: '#f0f0f5'
|
|
102
|
+
},
|
|
103
|
+
row: {
|
|
104
|
+
flexDirection: 'row',
|
|
105
|
+
alignItems: 'center',
|
|
106
|
+
minHeight: 22
|
|
107
|
+
},
|
|
108
|
+
text: {
|
|
109
|
+
flex: 1,
|
|
110
|
+
fontFamily: 'sf-regular',
|
|
111
|
+
fontSize: 14,
|
|
112
|
+
color: Colours.TEXT_DARK
|
|
113
|
+
},
|
|
114
|
+
rowContainer: {
|
|
115
|
+
flexDirection: 'row',
|
|
116
|
+
justifyContent: 'space-between'
|
|
117
|
+
},
|
|
118
|
+
userContainer: {
|
|
119
|
+
flexDirection: 'row',
|
|
120
|
+
alignItems: 'center'
|
|
121
|
+
},
|
|
122
|
+
labelText: {
|
|
123
|
+
fontFamily: 'sf-medium',
|
|
124
|
+
fontSize: 16,
|
|
125
|
+
color: Colours.TEXT_DARK,
|
|
126
|
+
marginLeft: 8
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
export default connect(null, {})(MaintenanceUserPicker);
|
|
130
|
+
//# sourceMappingURL=MaintenanceUserPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","Component","_","TouchableOpacity","View","ScrollView","Text","connect","Icon","Services","Components","Colours","MaintenanceUserPicker","constructor","args","_defineProperty","currentUser","UNSAFE_componentWillMount","setState","props","onPressBack","navigation","goBack","onUserPress","user","onSelectUser","setTimeout","renderMain","isEmpty","users","createElement","style","marginTop","Spinner","FormCard","renderOptions","map","index","key","onPress","bind","FormCardSection","label","displayName","labelStyle","height","margin","hasUnderline","hasContent","styles","rowContainer","userContainer","ProfilePic","profilePic","Diameter","labelText","name","type","iconStyle","color","fontSize","isEqual","state","COLOUR_GREEN","render","container","Header","leftIcon","onPressLeft","text","flex","position","backgroundColor","row","flexDirection","alignItems","minHeight","fontFamily","TEXT_DARK","justifyContent","marginLeft"],"sources":["MaintenanceUserPicker.js"],"sourcesContent":["import React, { Component } from 'react';\nimport _ from 'lodash';\nimport { TouchableOpacity, View, ScrollView, Text } from 'react-native';\nimport { connect } from 'react-redux';\nimport { Icon } from 'react-native-elements';\nimport { Services } from '../feature.config';\nimport { Components, Colours } from '../core.config';\n\nclass MaintenanceUserPicker extends Component {\n state = {\n currentUser: null,\n };\n\n UNSAFE_componentWillMount() {\n this.setState({ currentUser: this.props.currentUser });\n }\n\n onPressBack() {\n Services.navigation.goBack();\n }\n\n onUserPress(user) {\n this.props.onSelectUser(user);\n this.setState({ currentUser: user });\n setTimeout(() => {\n this.onPressBack();\n }, 200);\n }\n\n renderMain() {\n if (_.isEmpty(this.props.users)) {\n return (\n <View style={{ marginTop: 16 }}>\n <Components.Spinner />\n </View>\n );\n }\n\n return <Components.FormCard style={{ marginTop: 16 }}>{this.renderOptions()}</Components.FormCard>;\n }\n\n renderOptions() {\n return this.props.users.map((user, index) => {\n return (\n <TouchableOpacity key={index} onPress={this.onUserPress.bind(this, user)}>\n <Components.FormCardSection label={user.displayName} labelStyle={{ height: 0, margin: 0 }} hasUnderline hasContent>\n <View style={styles.rowContainer}>\n <View style={styles.userContainer}>\n <Components.ProfilePic ProfilePic={user.profilePic} Diameter={30} />\n <Text style={styles.labelText}>{user.displayName}</Text>\n </View>\n <Icon\n name=\"check-circle\"\n type=\"font-awesome\"\n iconStyle={[{ color: '#d5d9e0', fontSize: 20 }, _.isEqual(user, this.state.currentUser) && { color: Colours.COLOUR_GREEN }]}\n />\n </View>\n </Components.FormCardSection>\n </TouchableOpacity>\n );\n });\n }\n\n render() {\n return (\n <View style={styles.container}>\n <Components.Header leftIcon=\"angle-left\" onPressLeft={this.onPressBack.bind(this)} text=\"Select user\" />\n <ScrollView style={{ flex: 1 }}>{this.renderMain()}</ScrollView>\n </View>\n );\n }\n}\n\nconst styles = {\n container: {\n flex: 1,\n position: 'relative',\n backgroundColor: '#f0f0f5',\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n minHeight: 22,\n },\n text: {\n flex: 1,\n fontFamily: 'sf-regular',\n fontSize: 14,\n color: Colours.TEXT_DARK,\n },\n rowContainer: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n userContainer: {\n flexDirection: 'row',\n alignItems: 'center',\n },\n labelText: {\n fontFamily: 'sf-medium',\n fontSize: 16,\n color: Colours.TEXT_DARK,\n marginLeft: 8,\n },\n};\n\nexport default connect(null, {})(MaintenanceUserPicker);"],"mappings":"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","ignoreList":[]}
|
|
@@ -9,7 +9,7 @@ import _ from 'lodash';
|
|
|
9
9
|
import moment from 'moment';
|
|
10
10
|
import { connect } from 'react-redux';
|
|
11
11
|
import { jobAdded } from '../actions';
|
|
12
|
-
import { maintenanceActions } from '../apis';
|
|
12
|
+
import { maintenanceActions, userActions } from '../apis';
|
|
13
13
|
import { Services } from '../feature.config';
|
|
14
14
|
import { Components, Colours, Helper, Config } from '../core.config';
|
|
15
15
|
import { values } from '../values.config';
|
|
@@ -17,6 +17,50 @@ const PHOTO_SIZE = (Dimensions.get('window').width - 64) / 3;
|
|
|
17
17
|
class MaintenanceRequest extends Component {
|
|
18
18
|
constructor(props) {
|
|
19
19
|
super(props);
|
|
20
|
+
_defineProperty(this, "checkUserPermissions", async () => {
|
|
21
|
+
var _this$props$permissio;
|
|
22
|
+
// PC-1255: Check if user has userManagement permission
|
|
23
|
+
const hasUserManagement = ((_this$props$permissio = this.props.permissions) === null || _this$props$permissio === void 0 ? void 0 : _this$props$permissio.includes('userManagement')) || false;
|
|
24
|
+
if (hasUserManagement) {
|
|
25
|
+
this.setState({
|
|
26
|
+
canCreateOnBehalf: true
|
|
27
|
+
});
|
|
28
|
+
// Load site users for picker
|
|
29
|
+
await this.loadSiteUsers();
|
|
30
|
+
} else {
|
|
31
|
+
// Default to logged-in user for non-staff or staff without permission
|
|
32
|
+
this.setDefaultUser();
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
_defineProperty(this, "loadSiteUsers", async () => {
|
|
36
|
+
try {
|
|
37
|
+
const response = await userActions.getSiteUsers(this.props.site);
|
|
38
|
+
// PC-1255: Load all users (not just residents) to match web admin behavior
|
|
39
|
+
const users = _.sortBy(response.data.Items || [], u => (u.displayName || '').toLowerCase());
|
|
40
|
+
this.setState({
|
|
41
|
+
users
|
|
42
|
+
});
|
|
43
|
+
} catch (error) {
|
|
44
|
+
console.log('Error loading site users:', error);
|
|
45
|
+
// Fall back to default user if loading fails
|
|
46
|
+
this.setDefaultUser();
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
_defineProperty(this, "setDefaultUser", () => {
|
|
50
|
+
if (this.props.userType !== 'KIOSK') {
|
|
51
|
+
const defaultUser = {
|
|
52
|
+
userId: this.props.uid,
|
|
53
|
+
displayName: this.props.displayName,
|
|
54
|
+
profilePic: this.props.profilePic
|
|
55
|
+
};
|
|
56
|
+
this.setState({
|
|
57
|
+
selectedUser: defaultUser,
|
|
58
|
+
userName: this.props.displayName,
|
|
59
|
+
roomNumber: this.props.unit,
|
|
60
|
+
phone: !_.isEmpty(this.props.phoneNumber) ? this.props.phoneNumber : ''
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
});
|
|
20
64
|
_defineProperty(this, "onChangeName", userName => {
|
|
21
65
|
const update = {
|
|
22
66
|
userName
|
|
@@ -26,6 +70,47 @@ class MaintenanceRequest extends Component {
|
|
|
26
70
|
}
|
|
27
71
|
this.setState(update);
|
|
28
72
|
});
|
|
73
|
+
// PC-1255: Handle user picker navigation
|
|
74
|
+
_defineProperty(this, "onPressUser", () => {
|
|
75
|
+
const {
|
|
76
|
+
users,
|
|
77
|
+
selectedUser
|
|
78
|
+
} = this.state;
|
|
79
|
+
if (!users || users.length === 0) return;
|
|
80
|
+
Services.navigation.navigate(values.screenUserPicker, {
|
|
81
|
+
currentUser: selectedUser,
|
|
82
|
+
users,
|
|
83
|
+
onSelectUser: this.onSelectUser.bind(this)
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
// PC-1255: Handle user selection and auto-populate contact details
|
|
87
|
+
_defineProperty(this, "onSelectUser", async user => {
|
|
88
|
+
const update = {
|
|
89
|
+
selectedUser: user,
|
|
90
|
+
userName: user.displayName
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
// PC-1255: Try to fetch full user details for auto-population
|
|
94
|
+
try {
|
|
95
|
+
// getSiteUsers returns 'Id', but fetchUser expects 'userId'
|
|
96
|
+
const userId = user.userId || user.Id;
|
|
97
|
+
const response = await userActions.fetchUser(this.props.site, userId);
|
|
98
|
+
if (response.data && response.data.user) {
|
|
99
|
+
const userDetails = response.data.user;
|
|
100
|
+
if (userDetails.phoneNumber) {
|
|
101
|
+
update.phone = userDetails.phoneNumber;
|
|
102
|
+
}
|
|
103
|
+
if (userDetails.unit) {
|
|
104
|
+
update.roomNumber = userDetails.unit;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
} catch (error) {
|
|
108
|
+
// Permission denied (403) or other error - continue without auto-population
|
|
109
|
+
// User can still manually enter contact details
|
|
110
|
+
console.log('Could not fetch user details for auto-population:', error);
|
|
111
|
+
}
|
|
112
|
+
this.setState(update);
|
|
113
|
+
});
|
|
29
114
|
_defineProperty(this, "onChangeAnswer", (fieldId, answer) => {
|
|
30
115
|
const update = {
|
|
31
116
|
customFields: _.cloneDeep(this.state.customFields)
|
|
@@ -463,7 +548,11 @@ class MaintenanceRequest extends Component {
|
|
|
463
548
|
isDateTimePickerVisible: false,
|
|
464
549
|
popUpType: 'date',
|
|
465
550
|
dateFieldId: null,
|
|
466
|
-
imageFieldId: null
|
|
551
|
+
imageFieldId: null,
|
|
552
|
+
// PC-1255: On-behalf request fields
|
|
553
|
+
canCreateOnBehalf: false,
|
|
554
|
+
selectedUser: null,
|
|
555
|
+
users: []
|
|
467
556
|
};
|
|
468
557
|
this.checkThumb = null;
|
|
469
558
|
this.keyboardTypes = {
|
|
@@ -473,13 +562,7 @@ class MaintenanceRequest extends Component {
|
|
|
473
562
|
};
|
|
474
563
|
}
|
|
475
564
|
componentDidMount() {
|
|
476
|
-
|
|
477
|
-
this.setState({
|
|
478
|
-
userName: this.props.displayName,
|
|
479
|
-
roomNumber: this.props.unit,
|
|
480
|
-
phone: !_.isEmpty(this.props.phoneNumber) ? this.props.phoneNumber : ''
|
|
481
|
-
});
|
|
482
|
-
}
|
|
565
|
+
this.checkUserPermissions();
|
|
483
566
|
this.getJobTypes();
|
|
484
567
|
}
|
|
485
568
|
componentWillUnmount() {
|
|
@@ -592,6 +675,15 @@ class MaintenanceRequest extends Component {
|
|
|
592
675
|
error: null,
|
|
593
676
|
showError: false
|
|
594
677
|
});
|
|
678
|
+
|
|
679
|
+
// PC-1255: Validate user selection for on-behalf requests
|
|
680
|
+
if (this.state.canCreateOnBehalf && !this.state.selectedUser) {
|
|
681
|
+
console.log('submitRequest - no user selected for on-behalf request');
|
|
682
|
+
this.setState({
|
|
683
|
+
showError: true
|
|
684
|
+
});
|
|
685
|
+
return;
|
|
686
|
+
}
|
|
595
687
|
if (title.length === 0 || !roomNumber || roomNumber.length === 0) {
|
|
596
688
|
console.log('submitRequest - error', {
|
|
597
689
|
title,
|
|
@@ -954,6 +1046,7 @@ class MaintenanceRequest extends Component {
|
|
|
954
1046
|
}, customFields.map((field, i) => this.renderField(field, i)));
|
|
955
1047
|
}
|
|
956
1048
|
renderForm() {
|
|
1049
|
+
var _this$state$selectedU, _this$state$selectedU2, _this$state$selectedU3;
|
|
957
1050
|
const {
|
|
958
1051
|
customFields,
|
|
959
1052
|
loadingTypes
|
|
@@ -984,7 +1077,37 @@ class MaintenanceRequest extends Component {
|
|
|
984
1077
|
style: {
|
|
985
1078
|
marginTop: 16
|
|
986
1079
|
}
|
|
987
|
-
}, /*#__PURE__*/React.createElement(Components.FormCardSection, {
|
|
1080
|
+
}, this.state.canCreateOnBehalf && /*#__PURE__*/React.createElement(Components.FormCardSection, {
|
|
1081
|
+
label: 'Select User',
|
|
1082
|
+
textValue: (_this$state$selectedU = this.state.selectedUser) === null || _this$state$selectedU === void 0 ? void 0 : _this$state$selectedU.displayName,
|
|
1083
|
+
hasContent: true,
|
|
1084
|
+
hasUnderline: true,
|
|
1085
|
+
required: true,
|
|
1086
|
+
errorText: "Please select a user.",
|
|
1087
|
+
showError: this.state.showError && !this.state.selectedUser,
|
|
1088
|
+
sectionStyle: {
|
|
1089
|
+
borderBottomWidth: 1,
|
|
1090
|
+
borderBottomColor: Colours.LINEGREY
|
|
1091
|
+
}
|
|
1092
|
+
}, /*#__PURE__*/React.createElement(TouchableOpacity, {
|
|
1093
|
+
onPress: this.onPressUser
|
|
1094
|
+
}, /*#__PURE__*/React.createElement(View, {
|
|
1095
|
+
style: styles.userPickerContainer
|
|
1096
|
+
}, /*#__PURE__*/React.createElement(View, {
|
|
1097
|
+
style: styles.profileContainer
|
|
1098
|
+
}, /*#__PURE__*/React.createElement(Components.ProfilePic, {
|
|
1099
|
+
ProfilePic: (_this$state$selectedU2 = this.state.selectedUser) === null || _this$state$selectedU2 === void 0 ? void 0 : _this$state$selectedU2.profilePic,
|
|
1100
|
+
Diameter: 30
|
|
1101
|
+
}), /*#__PURE__*/React.createElement(Text, {
|
|
1102
|
+
style: styles.nameText
|
|
1103
|
+
}, ((_this$state$selectedU3 = this.state.selectedUser) === null || _this$state$selectedU3 === void 0 ? void 0 : _this$state$selectedU3.displayName) || 'Select User')), /*#__PURE__*/React.createElement(Icon, {
|
|
1104
|
+
name: "angle-right",
|
|
1105
|
+
type: "font-awesome",
|
|
1106
|
+
iconStyle: [styles.sectionTitle, {
|
|
1107
|
+
fontSize: 20,
|
|
1108
|
+
color: this.props.colourBrandingMain
|
|
1109
|
+
}]
|
|
1110
|
+
})))), !this.state.canCreateOnBehalf && /*#__PURE__*/React.createElement(Components.FormCardSection, {
|
|
988
1111
|
label: 'Name',
|
|
989
1112
|
placeholder: 'Enter your name',
|
|
990
1113
|
textValue: this.state.userName,
|
|
@@ -1405,6 +1528,22 @@ const styles = {
|
|
|
1405
1528
|
},
|
|
1406
1529
|
removeDocumentIcon: {
|
|
1407
1530
|
fontSize: 24
|
|
1531
|
+
},
|
|
1532
|
+
// PC-1255: User picker styles
|
|
1533
|
+
userPickerContainer: {
|
|
1534
|
+
flexDirection: 'row',
|
|
1535
|
+
justifyContent: 'space-between',
|
|
1536
|
+
alignItems: 'center'
|
|
1537
|
+
},
|
|
1538
|
+
profileContainer: {
|
|
1539
|
+
flexDirection: 'row',
|
|
1540
|
+
alignItems: 'center'
|
|
1541
|
+
},
|
|
1542
|
+
nameText: {
|
|
1543
|
+
fontFamily: 'sf-medium',
|
|
1544
|
+
fontSize: 16,
|
|
1545
|
+
color: Colours.TEXT_DARK,
|
|
1546
|
+
marginLeft: 8
|
|
1408
1547
|
}
|
|
1409
1548
|
};
|
|
1410
1549
|
const mapStateToProps = state => {
|
|
@@ -1419,7 +1558,8 @@ const mapStateToProps = state => {
|
|
|
1419
1558
|
uid,
|
|
1420
1559
|
site,
|
|
1421
1560
|
unit,
|
|
1422
|
-
phoneNumber
|
|
1561
|
+
phoneNumber,
|
|
1562
|
+
permissions
|
|
1423
1563
|
} = user;
|
|
1424
1564
|
return {
|
|
1425
1565
|
connected: connection.connected,
|
|
@@ -1430,6 +1570,7 @@ const mapStateToProps = state => {
|
|
|
1430
1570
|
site,
|
|
1431
1571
|
unit,
|
|
1432
1572
|
phoneNumber,
|
|
1573
|
+
permissions,
|
|
1433
1574
|
colourBrandingMain: Colours.getMainBrandingColourFromState(state),
|
|
1434
1575
|
strings: ((_state$strings = state.strings) === null || _state$strings === void 0 ? void 0 : _state$strings.config) || {}
|
|
1435
1576
|
};
|