@plusscommunities/pluss-maintenance-app 6.0.14-beta.2 → 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.
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 +1 -1
  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,
@@ -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
  };