@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.
Files changed (37) hide show
  1. package/dist/module/apis/index.js +1 -0
  2. package/dist/module/apis/index.js.map +1 -1
  3. package/dist/module/apis/userActions.js +23 -0
  4. package/dist/module/apis/userActions.js.map +1 -0
  5. package/dist/module/index.js +2 -0
  6. package/dist/module/index.js.map +1 -1
  7. package/dist/module/screens/MaintenanceUserPicker.js +130 -0
  8. package/dist/module/screens/MaintenanceUserPicker.js.map +1 -0
  9. package/dist/module/screens/ServiceRequest.js +152 -11
  10. package/dist/module/screens/ServiceRequest.js.map +1 -1
  11. package/dist/module/values.config.a.js +1 -0
  12. package/dist/module/values.config.a.js.map +1 -1
  13. package/dist/module/values.config.default.js +1 -0
  14. package/dist/module/values.config.default.js.map +1 -1
  15. package/dist/module/values.config.enquiry.js +1 -0
  16. package/dist/module/values.config.enquiry.js.map +1 -1
  17. package/dist/module/values.config.feedback.js +1 -0
  18. package/dist/module/values.config.feedback.js.map +1 -1
  19. package/dist/module/values.config.food.js +1 -0
  20. package/dist/module/values.config.food.js.map +1 -1
  21. package/dist/module/values.config.forms.js +1 -0
  22. package/dist/module/values.config.forms.js.map +1 -1
  23. package/dist/module/values.config.js +1 -0
  24. package/dist/module/values.config.js.map +1 -1
  25. package/package.json +3 -7
  26. package/src/apis/index.js +1 -0
  27. package/src/apis/userActions.js +21 -0
  28. package/src/index.js +2 -0
  29. package/src/screens/MaintenanceUserPicker.js +107 -0
  30. package/src/screens/ServiceRequest.js +157 -18
  31. package/src/values.config.a.js +1 -0
  32. package/src/values.config.default.js +1 -0
  33. package/src/values.config.enquiry.js +1 -0
  34. package/src/values.config.feedback.js +1 -0
  35. package/src/values.config.food.js +1 -0
  36. package/src/values.config.forms.js +1 -0
  37. package/src/values.config.js +1 -0
@@ -1,4 +1,5 @@
1
1
  import { Apis } from '../core.config';
2
2
  export const stringActions = Apis.stringActions;
3
3
  export * from './maintenanceActions';
4
+ export * from './userActions';
4
5
  //# sourceMappingURL=index.js.map
@@ -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":[]}
@@ -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';
@@ -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,GAAGZ,eAAe;EACnDW,OAAO,CAACL,MAAM,CAACO,mBAAmB,CAAC,GAAGZ,aAAa;EACnDU,OAAO,CAACL,MAAM,CAACQ,oBAAoB,CAAC,GAAGZ,cAAc;EACrDS,OAAO,CAACL,MAAM,CAACS,mBAAmB,CAAC,GAAGZ,aAAa;EACnDQ,OAAO,CAACL,MAAM,CAACU,kBAAkB,CAAC,GAAGZ,YAAY;EACjD,OAAOO,OAAO;AAChB,CAAC,EAAE,CAAC;AACJ,SAASM,OAAO,IAAIC,MAAM,QAAQ,kBAAkB;AACpD,SAASD,OAAO,IAAIE,WAAW,QAAQ,0BAA0B;AACjE,SAASF,OAAO,IAAIG,WAAW,QAAQ,0BAA0B","ignoreList":[]}
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
- if (this.props.userType !== 'KIOSK') {
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
  };