@plusscommunities/pluss-maintenance-app 6.0.14-beta.3 → 6.0.16-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/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 +2 -2
- 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":";;;AAAA,OAAOA,KAAK,IAAIC,SAAS,QAAQ,OAAO;AACxC,OAAOC,CAAC,MAAM,QAAQ;AACtB,SAASC,gBAAgB,EAAEC,IAAI,EAAEC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AACvE,SAASC,OAAO,QAAQ,aAAa;AACrC,SAASC,IAAI,QAAQ,uBAAuB;AAC5C,SAASC,QAAQ,QAAQ,mBAAmB;AAC5C,SAASC,UAAU,EAAEC,OAAO,QAAQ,gBAAgB;AAEpD,MAAMC,qBAAqB,SAASX,SAAS,CAAC;EAAAY,YAAA,GAAAC,IAAA;IAAA,SAAAA,IAAA;IAAAC,eAAA,gBACpC;MACNC,WAAW,EAAE;IACf,CAAC;EAAA;EAEDC,yBAAyBA,CAAA,EAAG;IAC1B,IAAI,CAACC,QAAQ,CAAC;MAAEF,WAAW,EAAE,IAAI,CAACG,KAAK,CAACH;IAAY,CAAC,CAAC;EACxD;EAEAI,WAAWA,CAAA,EAAG;IACZX,QAAQ,CAACY,UAAU,CAACC,MAAM,CAAC,CAAC;EAC9B;EAEAC,WAAWA,CAACC,IAAI,EAAE;IAChB,IAAI,CAACL,KAAK,CAACM,YAAY,CAACD,IAAI,CAAC;IAC7B,IAAI,CAACN,QAAQ,CAAC;MAAEF,WAAW,EAAEQ;IAAK,CAAC,CAAC;IACpCE,UAAU,CAAC,MAAM;MACf,IAAI,CAACN,WAAW,CAAC,CAAC;IACpB,CAAC,EAAE,GAAG,CAAC;EACT;EAEAO,UAAUA,CAAA,EAAG;IACX,IAAIzB,CAAC,CAAC0B,OAAO,CAAC,IAAI,CAACT,KAAK,CAACU,KAAK,CAAC,EAAE;MAC/B,oBACE7B,KAAA,CAAA8B,aAAA,CAAC1B,IAAI;QAAC2B,KAAK,EAAE;UAAEC,SAAS,EAAE;QAAG;MAAE,gBAC7BhC,KAAA,CAAA8B,aAAA,CAACpB,UAAU,CAACuB,OAAO,MAAE,CACjB,CAAC;IAEX;IAEA,oBAAOjC,KAAA,CAAA8B,aAAA,CAACpB,UAAU,CAACwB,QAAQ;MAACH,KAAK,EAAE;QAAEC,SAAS,EAAE;MAAG;IAAE,GAAE,IAAI,CAACG,aAAa,CAAC,CAAuB,CAAC;EACpG;EAEAA,aAAaA,CAAA,EAAG;IACd,OAAO,IAAI,CAAChB,KAAK,CAACU,KAAK,CAACO,GAAG,CAAC,CAACZ,IAAI,EAAEa,KAAK,KAAK;MAC3C,oBACErC,KAAA,CAAA8B,aAAA,CAAC3B,gBAAgB;QAACmC,GAAG,EAAED,KAAM;QAACE,OAAO,EAAE,IAAI,CAAChB,WAAW,CAACiB,IAAI,CAAC,IAAI,EAAEhB,IAAI;MAAE,gBACvExB,KAAA,CAAA8B,aAAA,CAACpB,UAAU,CAAC+B,eAAe;QAACC,KAAK,EAAElB,IAAI,CAACmB,WAAY;QAACC,UAAU,EAAE;UAAEC,MAAM,EAAE,CAAC;UAAEC,MAAM,EAAE;QAAE,CAAE;QAACC,YAAY;QAACC,UAAU;MAAA,gBAChHhD,KAAA,CAAA8B,aAAA,CAAC1B,IAAI;QAAC2B,KAAK,EAAEkB,MAAM,CAACC;MAAa,gBAC/BlD,KAAA,CAAA8B,aAAA,CAAC1B,IAAI;QAAC2B,KAAK,EAAEkB,MAAM,CAACE;MAAc,gBAChCnD,KAAA,CAAA8B,aAAA,CAACpB,UAAU,CAAC0C,UAAU;QAACA,UAAU,EAAE5B,IAAI,CAAC6B,UAAW;QAACC,QAAQ,EAAE;MAAG,CAAE,CAAC,eACpEtD,KAAA,CAAA8B,aAAA,CAACxB,IAAI;QAACyB,KAAK,EAAEkB,MAAM,CAACM;MAAU,GAAE/B,IAAI,CAACmB,WAAkB,CACnD,CAAC,eACP3C,KAAA,CAAA8B,aAAA,CAACtB,IAAI;QACHgD,IAAI,EAAC,cAAc;QACnBC,IAAI,EAAC,cAAc;QACnBC,SAAS,EAAE,CAAC;UAAEC,KAAK,EAAE,SAAS;UAAEC,QAAQ,EAAE;QAAG,CAAC,EAAE1D,CAAC,CAAC2D,OAAO,CAACrC,IAAI,EAAE,IAAI,CAACsC,KAAK,CAAC9C,WAAW,CAAC,IAAI;UAAE2C,KAAK,EAAEhD,OAAO,CAACoD;QAAa,CAAC;MAAE,CAC7H,CACG,CACoB,CACZ,CAAC;IAEvB,CAAC,CAAC;EACJ;EAEAC,MAAMA,CAAA,EAAG;IACP,oBACEhE,KAAA,CAAA8B,aAAA,CAAC1B,IAAI;MAAC2B,KAAK,EAAEkB,MAAM,CAACgB;IAAU,gBAC5BjE,KAAA,CAAA8B,aAAA,CAACpB,UAAU,CAACwD,MAAM;MAACC,QAAQ,EAAC,YAAY;MAACC,WAAW,EAAE,IAAI,CAAChD,WAAW,CAACoB,IAAI,CAAC,IAAI,CAAE;MAAC6B,IAAI,EAAC;IAAa,CAAE,CAAC,eACxGrE,KAAA,CAAA8B,aAAA,CAACzB,UAAU;MAAC0B,KAAK,EAAE;QAAEuC,IAAI,EAAE;MAAE;IAAE,GAAE,IAAI,CAAC3C,UAAU,CAAC,CAAc,CAC3D,CAAC;EAEX;AACF;AAEA,MAAMsB,MAAM,GAAG;EACbgB,SAAS,EAAE;IACTK,IAAI,EAAE,CAAC;IACPC,QAAQ,EAAE,UAAU;IACpBC,eAAe,EAAE;EACnB,CAAC;EACDC,GAAG,EAAE;IACHC,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE,QAAQ;IACpBC,SAAS,EAAE;EACb,CAAC;EACDP,IAAI,EAAE;IACJC,IAAI,EAAE,CAAC;IACPO,UAAU,EAAE,YAAY;IACxBjB,QAAQ,EAAE,EAAE;IACZD,KAAK,EAAEhD,OAAO,CAACmE;EACjB,CAAC;EACD5B,YAAY,EAAE;IACZwB,aAAa,EAAE,KAAK;IACpBK,cAAc,EAAE;EAClB,CAAC;EACD5B,aAAa,EAAE;IACbuB,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE;EACd,CAAC;EACDpB,SAAS,EAAE;IACTsB,UAAU,EAAE,WAAW;IACvBjB,QAAQ,EAAE,EAAE;IACZD,KAAK,EAAEhD,OAAO,CAACmE,SAAS;IACxBE,UAAU,EAAE;EACd;AACF,CAAC;AAED,eAAezE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAACK,qBAAqB,CAAC","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,
|
@@ -945,6 +1037,7 @@ class MaintenanceRequest extends Component {
|
|
945
1037
|
}, customFields.map((field, i) => this.renderField(field, i)));
|
946
1038
|
}
|
947
1039
|
renderForm() {
|
1040
|
+
var _this$state$selectedU, _this$state$selectedU2, _this$state$selectedU3;
|
948
1041
|
const {
|
949
1042
|
customFields,
|
950
1043
|
loadingTypes
|
@@ -975,7 +1068,37 @@ class MaintenanceRequest extends Component {
|
|
975
1068
|
style: {
|
976
1069
|
marginTop: 16
|
977
1070
|
}
|
978
|
-
}, /*#__PURE__*/React.createElement(Components.FormCardSection, {
|
1071
|
+
}, this.state.canCreateOnBehalf && /*#__PURE__*/React.createElement(Components.FormCardSection, {
|
1072
|
+
label: 'Select User',
|
1073
|
+
textValue: (_this$state$selectedU = this.state.selectedUser) === null || _this$state$selectedU === void 0 ? void 0 : _this$state$selectedU.displayName,
|
1074
|
+
hasContent: true,
|
1075
|
+
hasUnderline: true,
|
1076
|
+
required: true,
|
1077
|
+
errorText: "Please select a user.",
|
1078
|
+
showError: this.state.showError && !this.state.selectedUser,
|
1079
|
+
sectionStyle: {
|
1080
|
+
borderBottomWidth: 1,
|
1081
|
+
borderBottomColor: Colours.LINEGREY
|
1082
|
+
}
|
1083
|
+
}, /*#__PURE__*/React.createElement(TouchableOpacity, {
|
1084
|
+
onPress: this.onPressUser
|
1085
|
+
}, /*#__PURE__*/React.createElement(View, {
|
1086
|
+
style: styles.userPickerContainer
|
1087
|
+
}, /*#__PURE__*/React.createElement(View, {
|
1088
|
+
style: styles.profileContainer
|
1089
|
+
}, /*#__PURE__*/React.createElement(Components.ProfilePic, {
|
1090
|
+
ProfilePic: (_this$state$selectedU2 = this.state.selectedUser) === null || _this$state$selectedU2 === void 0 ? void 0 : _this$state$selectedU2.profilePic,
|
1091
|
+
Diameter: 30
|
1092
|
+
}), /*#__PURE__*/React.createElement(Text, {
|
1093
|
+
style: styles.nameText
|
1094
|
+
}, ((_this$state$selectedU3 = this.state.selectedUser) === null || _this$state$selectedU3 === void 0 ? void 0 : _this$state$selectedU3.displayName) || 'Select User')), /*#__PURE__*/React.createElement(Icon, {
|
1095
|
+
name: "angle-right",
|
1096
|
+
type: "font-awesome",
|
1097
|
+
iconStyle: [styles.sectionTitle, {
|
1098
|
+
fontSize: 20,
|
1099
|
+
color: this.props.colourBrandingMain
|
1100
|
+
}]
|
1101
|
+
})))), !this.state.canCreateOnBehalf && /*#__PURE__*/React.createElement(Components.FormCardSection, {
|
979
1102
|
label: 'Name',
|
980
1103
|
placeholder: 'Enter your name',
|
981
1104
|
textValue: this.state.userName,
|
@@ -1396,6 +1519,22 @@ const styles = {
|
|
1396
1519
|
},
|
1397
1520
|
removeDocumentIcon: {
|
1398
1521
|
fontSize: 24
|
1522
|
+
},
|
1523
|
+
// PC-1255: User picker styles
|
1524
|
+
userPickerContainer: {
|
1525
|
+
flexDirection: 'row',
|
1526
|
+
justifyContent: 'space-between',
|
1527
|
+
alignItems: 'center'
|
1528
|
+
},
|
1529
|
+
profileContainer: {
|
1530
|
+
flexDirection: 'row',
|
1531
|
+
alignItems: 'center'
|
1532
|
+
},
|
1533
|
+
nameText: {
|
1534
|
+
fontFamily: 'sf-medium',
|
1535
|
+
fontSize: 16,
|
1536
|
+
color: Colours.TEXT_DARK,
|
1537
|
+
marginLeft: 8
|
1399
1538
|
}
|
1400
1539
|
};
|
1401
1540
|
const mapStateToProps = state => {
|
@@ -1410,7 +1549,8 @@ const mapStateToProps = state => {
|
|
1410
1549
|
uid,
|
1411
1550
|
site,
|
1412
1551
|
unit,
|
1413
|
-
phoneNumber
|
1552
|
+
phoneNumber,
|
1553
|
+
permissions
|
1414
1554
|
} = user;
|
1415
1555
|
return {
|
1416
1556
|
connected: connection.connected,
|
@@ -1421,6 +1561,7 @@ const mapStateToProps = state => {
|
|
1421
1561
|
site,
|
1422
1562
|
unit,
|
1423
1563
|
phoneNumber,
|
1564
|
+
permissions,
|
1424
1565
|
colourBrandingMain: Colours.getMainBrandingColourFromState(state),
|
1425
1566
|
strings: ((_state$strings = state.strings) === null || _state$strings === void 0 ? void 0 : _state$strings.config) || {}
|
1426
1567
|
};
|