@gpa-gemstone/common-pages 0.0.104 → 0.0.105

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. package/lib/ErrorBoundary.d.ts +17 -17
  2. package/lib/ErrorBoundary.js +91 -68
  3. package/lib/Note.d.ts +22 -22
  4. package/lib/Note.js +256 -230
  5. package/lib/SearchBar.d.ts +37 -37
  6. package/lib/SearchBar.js +203 -180
  7. package/lib/SelectionPopup.d.ts +42 -42
  8. package/lib/SelectionPopup.js +93 -90
  9. package/lib/Setting.d.ts +8 -8
  10. package/lib/Setting.js +151 -125
  11. package/lib/SliceInterfaces.d.ts +76 -76
  12. package/lib/SliceInterfaces.js +2 -2
  13. package/lib/StandardSelectPopup.d.ts +20 -20
  14. package/lib/StandardSelectPopup.js +135 -109
  15. package/lib/TimeFilter/QuickSelects.d.ts +7 -0
  16. package/lib/TimeFilter/QuickSelects.js +240 -0
  17. package/lib/TimeFilter.d.ts +26 -0
  18. package/lib/TimeFilter.js +270 -0
  19. package/lib/TimeWindowUtils.d.ts +33 -0
  20. package/lib/TimeWindowUtils.js +121 -0
  21. package/lib/ValueList/ByValueList.d.ts +10 -10
  22. package/lib/ValueList/ByValueList.js +141 -115
  23. package/lib/ValueList/Group.d.ts +11 -11
  24. package/lib/ValueList/Group.js +97 -71
  25. package/lib/ValueList/GroupForm.d.ts +9 -9
  26. package/lib/ValueList/GroupForm.js +74 -51
  27. package/lib/ValueList/GroupInfo.d.ts +8 -8
  28. package/lib/ValueList/GroupInfo.js +95 -69
  29. package/lib/ValueList/GroupItem.d.ts +9 -9
  30. package/lib/ValueList/GroupItem.js +142 -116
  31. package/lib/ValueList/ItemForm.d.ts +9 -9
  32. package/lib/ValueList/ItemForm.js +82 -59
  33. package/lib/index.d.ts +12 -11
  34. package/lib/index.js +50 -45
  35. package/lib/user/AdditionalField.d.ts +26 -26
  36. package/lib/user/AdditionalField.js +290 -264
  37. package/lib/user/ByUser.d.ts +12 -12
  38. package/lib/user/ByUser.js +174 -148
  39. package/lib/user/User.d.ts +14 -14
  40. package/lib/user/User.js +97 -71
  41. package/lib/user/UserForm.d.ts +12 -12
  42. package/lib/user/UserForm.js +166 -143
  43. package/lib/user/UserInfo.d.ts +7 -7
  44. package/lib/user/UserInfo.js +123 -97
  45. package/lib/user/UserPermissions.d.ts +8 -8
  46. package/lib/user/UserPermissions.js +106 -83
  47. package/package.json +9 -8
@@ -1,12 +1,12 @@
1
- /// <reference types="react" />
2
- import { SystemCenter, Application } from '@gpa-gemstone/application-typings';
3
- import { IAdditionalFieldSlice, IGenericSlice, IUserAccountSlice } from '../SliceInterfaces';
4
- interface IProps {
5
- UserSlice: IUserAccountSlice;
6
- AdditionalFieldSlice: IAdditionalFieldSlice<Application.Types.iAdditionalUserField, Application.Types.iAdditionalUserFieldValue>;
7
- ValueListItemSlice: IGenericSlice<SystemCenter.Types.ValueListItem>;
8
- ValueListGroupSlice: IGenericSlice<SystemCenter.Types.ValueListGroup>;
9
- OnUserSelect: (userID: string) => void;
10
- }
11
- declare function ByUser(props: IProps): JSX.Element;
12
- export default ByUser;
1
+ import * as React from 'react';
2
+ import { SystemCenter, Application } from '@gpa-gemstone/application-typings';
3
+ import { IAdditionalFieldSlice, IGenericSlice, IUserAccountSlice } from '../SliceInterfaces';
4
+ interface IProps {
5
+ UserSlice: IUserAccountSlice;
6
+ AdditionalFieldSlice: IAdditionalFieldSlice<Application.Types.iAdditionalUserField, Application.Types.iAdditionalUserFieldValue>;
7
+ ValueListItemSlice: IGenericSlice<SystemCenter.Types.ValueListItem>;
8
+ ValueListGroupSlice: IGenericSlice<SystemCenter.Types.ValueListGroup>;
9
+ OnUserSelect: (userID: string) => void;
10
+ }
11
+ declare function ByUser(props: IProps): React.JSX.Element;
12
+ export default ByUser;
@@ -1,148 +1,174 @@
1
- "use strict";
2
- // ******************************************************************************************************
3
- // ByUser.tsx - Gbtc
4
- //
5
- // Copyright © 2020, Grid Protection Alliance. All Rights Reserved.
6
- //
7
- // Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See
8
- // the NOTICE file distributed with this work for additional information regarding copyright ownership.
9
- // The GPA licenses this file to you under the MIT License (MIT), the "License"; you may not use this
10
- // file except in compliance with the License. You may obtain a copy of the License at:
11
- //
12
- // http://opensource.org/licenses/MIT
13
- //
14
- // Unless agreed to in writing, the subject software distributed under the License is distributed on an
15
- // "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the
16
- // License for the specific language governing permissions and limitations.
17
- //
18
- // Code Modification History:
19
- // ----------------------------------------------------------------------------------------------------
20
- // 07/14/2021 - C. Lackner
21
- // Generated original version of source code.
22
- // ******************************************************************************************************
23
- var __assign = (this && this.__assign) || function () {
24
- __assign = Object.assign || function(t) {
25
- for (var s, i = 1, n = arguments.length; i < n; i++) {
26
- s = arguments[i];
27
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
28
- t[p] = s[p];
29
- }
30
- return t;
31
- };
32
- return __assign.apply(this, arguments);
33
- };
34
- Object.defineProperty(exports, "__esModule", { value: true });
35
- var React = require("react");
36
- var react_table_1 = require("@gpa-gemstone/react-table");
37
- var gpa_symbols_1 = require("@gpa-gemstone/gpa-symbols");
38
- var react_interactive_1 = require("@gpa-gemstone/react-interactive");
39
- var CryptoJS = require("crypto-js");
40
- var _ = require("lodash");
41
- var UserForm_1 = require("./UserForm");
42
- var react_redux_1 = require("react-redux");
43
- var defaultSearchcols = [
44
- { label: 'First Name', key: 'FirstName', type: 'string', isPivotField: false },
45
- { label: 'Last Name', key: 'LastName', type: 'string', isPivotField: false },
46
- { label: 'Location', key: 'Location', type: 'string', isPivotField: false },
47
- { label: 'Phone', key: 'Phone', type: 'string', isPivotField: false },
48
- { label: 'Email', key: 'Email', type: 'string', isPivotField: false },
49
- ];
50
- function ByUser(props) {
51
- var dispatch = (0, react_redux_1.useDispatch)();
52
- var search = (0, react_redux_1.useSelector)(props.UserSlice.SearchFilters);
53
- var data = (0, react_redux_1.useSelector)(props.UserSlice.SearchResults);
54
- var userStatus = (0, react_redux_1.useSelector)(props.UserSlice.Status);
55
- var searchStatus = (0, react_redux_1.useSelector)(props.UserSlice.SearchStatus);
56
- var sortField = (0, react_redux_1.useSelector)(props.UserSlice.SortField);
57
- var ascending = (0, react_redux_1.useSelector)(props.UserSlice.Ascending);
58
- var currentUserAccount = (0, react_redux_1.useSelector)(props.UserSlice.CurrentUser);
59
- var adlFields = (0, react_redux_1.useSelector)(props.AdditionalFieldSlice.Fields);
60
- var adlFieldStatus = (0, react_redux_1.useSelector)(props.AdditionalFieldSlice.FieldStatus);
61
- var _a = React.useState(defaultSearchcols), filterableList = _a[0], setFilterableList = _a[1];
62
- var _b = React.useState(false), showModal = _b[0], setShowModal = _b[1];
63
- var _c = React.useState([]), userError = _c[0], setUserError = _c[1];
64
- var valueListItems = (0, react_redux_1.useSelector)(props.ValueListItemSlice.Data);
65
- var valueListItemStatus = (0, react_redux_1.useSelector)(props.ValueListItemSlice.Status);
66
- var valueListGroups = (0, react_redux_1.useSelector)(props.ValueListGroupSlice.Data);
67
- var valueListGroupStatus = (0, react_redux_1.useSelector)(props.ValueListGroupSlice.Status);
68
- var _d = React.useState('unintiated'), pageStatus = _d[0], setPageStatus = _d[1];
69
- React.useEffect(function () {
70
- if (userStatus === 'error' || adlFieldStatus === 'error' || valueListItemStatus === 'error' || valueListGroupStatus === 'error')
71
- setPageStatus('error');
72
- else if (userStatus === 'loading' || adlFieldStatus === 'loading' || valueListItemStatus === 'loading' || valueListGroupStatus === 'loading')
73
- setPageStatus('loading');
74
- else
75
- setPageStatus('idle');
76
- }, [userStatus, adlFieldStatus, valueListItemStatus, valueListGroupStatus]);
77
- React.useEffect(function () {
78
- if (adlFieldStatus === 'unintiated' || adlFieldStatus === 'changed')
79
- dispatch(props.AdditionalFieldSlice.FetchField());
80
- }, [dispatch, adlFieldStatus]);
81
- React.useEffect(function () {
82
- dispatch(props.UserSlice.DBSearch({ sortField: sortField, ascending: ascending, filter: search }));
83
- dispatch(props.UserSlice.SetNewUser());
84
- }, [dispatch]);
85
- React.useEffect(function () {
86
- if (valueListItemStatus === 'unintiated' || valueListItemStatus === 'changed')
87
- dispatch(props.ValueListItemSlice.Fetch());
88
- }, [dispatch, valueListItemStatus]);
89
- React.useEffect(function () {
90
- if (valueListGroupStatus === 'unintiated' || valueListGroupStatus === 'changed')
91
- dispatch(props.ValueListGroupSlice.Fetch());
92
- }, [dispatch, valueListGroupStatus]);
93
- React.useEffect(function () {
94
- function ConvertType(type) {
95
- if (type === 'string' || type === 'integer' || type === 'number' || type === 'datetime' || type === 'boolean')
96
- return { type: type };
97
- return { type: 'enum', enum: [{ Label: type, Value: type }] };
98
- }
99
- var ordered = _.orderBy(defaultSearchcols.concat(adlFields.map(function (item) { return (__assign({ label: "[AF] " + item.FieldName, key: item.FieldName }, ConvertType(item.Type))); })), ['label'], ["asc"]);
100
- setFilterableList(ordered);
101
- }, [adlFields]);
102
- if (pageStatus === 'error')
103
- return React.createElement("div", { style: { width: '100%', height: '100%' } },
104
- React.createElement(react_interactive_1.ServerErrorIcon, { Show: true, Label: 'A Server Error Occured. Please Reload the Application' }));
105
- return (React.createElement("div", { style: { width: '100%', height: '100%' } },
106
- React.createElement(react_interactive_1.LoadingScreen, { Show: pageStatus === 'loading' }),
107
- React.createElement(react_interactive_1.SearchBar, { CollumnList: filterableList, SetFilter: function (flds) { return dispatch(props.UserSlice.DBSearch({ sortField: sortField, ascending: ascending, filter: flds })); }, Direction: 'left', defaultCollumn: { label: 'Last Name', key: 'LastName', type: 'string', isPivotField: false }, Width: '50%', Label: 'Search', ShowLoading: searchStatus === 'loading', ResultNote: searchStatus === 'error' ? 'Could not complete Search' : 'Found ' + data.length + ' UserAccounts', GetEnum: function (setOptions, field) {
108
- if (field.type !== 'enum' || field.enum === undefined || field.enum.length !== 1)
109
- return function () { };
110
- var grpName = (field.enum !== undefined ? field.enum[0].Value.toLowerCase() : '');
111
- var grpIndex = valueListGroups.findIndex(function (g) { return g.Name.toLowerCase() === grpName; });
112
- if (grpIndex < 0)
113
- return function () { };
114
- setOptions(valueListItems.filter(function (v) { return v.GroupID === valueListGroups[grpIndex].ID; }).map(function (item) { return ({ Value: item.ID.toString(), Label: item.Value }); }));
115
- return function () { };
116
- } },
117
- React.createElement("li", { className: "nav-item", style: { width: '15%', paddingRight: 10 } },
118
- React.createElement("fieldset", { className: "border", style: { padding: '10px', height: '100%' } },
119
- React.createElement("legend", { className: "w-auto", style: { fontSize: 'large' } }, "Actions:"),
120
- React.createElement("form", null,
121
- React.createElement("button", { className: "btn btn-primary", onClick: function (event) { event.preventDefault(); setShowModal(true); } }, "Add User"))))),
122
- React.createElement("div", { style: { width: '100%', height: 'calc( 100% - 136px)' } },
123
- React.createElement(react_table_1.default, { cols: [
124
- { key: 'Name', field: 'Name', label: 'User Name', headerStyle: { width: '10%' }, rowStyle: { width: '10%' } },
125
- { key: 'FirstName', field: 'FirstName', label: 'First Name', headerStyle: { width: '10%' }, rowStyle: { width: '10%' } },
126
- { key: 'LastName', field: 'LastName', label: 'Last Name', headerStyle: { width: '10%' }, rowStyle: { width: '10%' } },
127
- { key: 'Phone', field: 'Phone', label: 'Phone', headerStyle: { width: '10%' }, rowStyle: { width: '10%' } },
128
- { key: 'Email', field: 'Email', label: 'Email', headerStyle: { width: 'auto' }, rowStyle: { width: 'auto' } },
129
- { key: 'scroll', label: '', headerStyle: { width: 17, padding: 0 }, rowStyle: { width: 0, padding: 0 } },
130
- ], tableClass: "table table-hover", data: data, sortKey: sortField, ascending: ascending, onSort: function (d) {
131
- if (d.colField === undefined)
132
- return;
133
- if (d.colField !== sortField)
134
- dispatch(props.UserSlice.DBSearch({ sortField: sortField, ascending: !ascending, filter: search }));
135
- else
136
- dispatch(props.UserSlice.DBSearch({ sortField: d.colField, ascending: true, filter: search }));
137
- }, onClick: function (d) { return props.OnUserSelect(d.row.ID); }, theadStyle: { fontSize: 'smaller', display: 'table', tableLayout: 'fixed', width: '100%' }, tbodyStyle: { display: 'block', overflowY: 'scroll', maxHeight: window.innerHeight - 300, width: '100%' }, rowStyle: { fontSize: 'smaller', display: 'table', tableLayout: 'fixed', width: '100%' }, selected: function (item) { return false; } })),
138
- React.createElement(react_interactive_1.Modal, { Show: showModal, Size: 'lg', ShowCancel: false, ShowX: true, ConfirmText: 'Save', Title: 'Add User', CallBack: function (confirm) {
139
- if (confirm)
140
- dispatch(props.UserSlice.DBAction({ verb: 'POST', record: __assign(__assign({}, currentUserAccount), { Password: CryptoJS.SHA256(currentUserAccount.Password + "0").toString(CryptoJS.enc.Base64) }) }));
141
- dispatch(props.UserSlice.SetNewUser());
142
- setShowModal(false);
143
- }, ConfirmShowToolTip: userError.length > 0, ConfirmToolTipContent: userError.map(function (t, i) { return React.createElement("p", { key: i },
144
- gpa_symbols_1.CrossMark,
145
- " ",
146
- t); }), DisableConfirm: userError.length > 0 }, currentUserAccount !== undefined ? React.createElement(UserForm_1.default, { UserAccount: currentUserAccount, Setter: function (u) { return dispatch(props.UserSlice.SetCurrentUser(u)); }, Edit: false, SetErrors: setUserError, UserSlice: props.UserSlice }) : null)));
147
- }
148
- exports.default = ByUser;
1
+ "use strict";
2
+ // ******************************************************************************************************
3
+ // ByUser.tsx - Gbtc
4
+ //
5
+ // Copyright © 2020, Grid Protection Alliance. All Rights Reserved.
6
+ //
7
+ // Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See
8
+ // the NOTICE file distributed with this work for additional information regarding copyright ownership.
9
+ // The GPA licenses this file to you under the MIT License (MIT), the "License"; you may not use this
10
+ // file except in compliance with the License. You may obtain a copy of the License at:
11
+ //
12
+ // http://opensource.org/licenses/MIT
13
+ //
14
+ // Unless agreed to in writing, the subject software distributed under the License is distributed on an
15
+ // "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the
16
+ // License for the specific language governing permissions and limitations.
17
+ //
18
+ // Code Modification History:
19
+ // ----------------------------------------------------------------------------------------------------
20
+ // 07/14/2021 - C. Lackner
21
+ // Generated original version of source code.
22
+ // ******************************************************************************************************
23
+ var __assign = (this && this.__assign) || function () {
24
+ __assign = Object.assign || function(t) {
25
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
26
+ s = arguments[i];
27
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
28
+ t[p] = s[p];
29
+ }
30
+ return t;
31
+ };
32
+ return __assign.apply(this, arguments);
33
+ };
34
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
35
+ if (k2 === undefined) k2 = k;
36
+ var desc = Object.getOwnPropertyDescriptor(m, k);
37
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
38
+ desc = { enumerable: true, get: function() { return m[k]; } };
39
+ }
40
+ Object.defineProperty(o, k2, desc);
41
+ }) : (function(o, m, k, k2) {
42
+ if (k2 === undefined) k2 = k;
43
+ o[k2] = m[k];
44
+ }));
45
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
46
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
47
+ }) : function(o, v) {
48
+ o["default"] = v;
49
+ });
50
+ var __importStar = (this && this.__importStar) || function (mod) {
51
+ if (mod && mod.__esModule) return mod;
52
+ var result = {};
53
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
54
+ __setModuleDefault(result, mod);
55
+ return result;
56
+ };
57
+ var __importDefault = (this && this.__importDefault) || function (mod) {
58
+ return (mod && mod.__esModule) ? mod : { "default": mod };
59
+ };
60
+ Object.defineProperty(exports, "__esModule", { value: true });
61
+ var React = __importStar(require("react"));
62
+ var react_table_1 = __importDefault(require("@gpa-gemstone/react-table"));
63
+ var gpa_symbols_1 = require("@gpa-gemstone/gpa-symbols");
64
+ var react_interactive_1 = require("@gpa-gemstone/react-interactive");
65
+ var CryptoJS = __importStar(require("crypto-js"));
66
+ var _ = __importStar(require("lodash"));
67
+ var UserForm_1 = __importDefault(require("./UserForm"));
68
+ var react_redux_1 = require("react-redux");
69
+ var defaultSearchcols = [
70
+ { label: 'First Name', key: 'FirstName', type: 'string', isPivotField: false },
71
+ { label: 'Last Name', key: 'LastName', type: 'string', isPivotField: false },
72
+ { label: 'Location', key: 'Location', type: 'string', isPivotField: false },
73
+ { label: 'Phone', key: 'Phone', type: 'string', isPivotField: false },
74
+ { label: 'Email', key: 'Email', type: 'string', isPivotField: false },
75
+ ];
76
+ function ByUser(props) {
77
+ var dispatch = (0, react_redux_1.useDispatch)();
78
+ var search = (0, react_redux_1.useSelector)(props.UserSlice.SearchFilters);
79
+ var data = (0, react_redux_1.useSelector)(props.UserSlice.SearchResults);
80
+ var userStatus = (0, react_redux_1.useSelector)(props.UserSlice.Status);
81
+ var searchStatus = (0, react_redux_1.useSelector)(props.UserSlice.SearchStatus);
82
+ var sortField = (0, react_redux_1.useSelector)(props.UserSlice.SortField);
83
+ var ascending = (0, react_redux_1.useSelector)(props.UserSlice.Ascending);
84
+ var currentUserAccount = (0, react_redux_1.useSelector)(props.UserSlice.CurrentUser);
85
+ var adlFields = (0, react_redux_1.useSelector)(props.AdditionalFieldSlice.Fields);
86
+ var adlFieldStatus = (0, react_redux_1.useSelector)(props.AdditionalFieldSlice.FieldStatus);
87
+ var _a = React.useState(defaultSearchcols), filterableList = _a[0], setFilterableList = _a[1];
88
+ var _b = React.useState(false), showModal = _b[0], setShowModal = _b[1];
89
+ var _c = React.useState([]), userError = _c[0], setUserError = _c[1];
90
+ var valueListItems = (0, react_redux_1.useSelector)(props.ValueListItemSlice.Data);
91
+ var valueListItemStatus = (0, react_redux_1.useSelector)(props.ValueListItemSlice.Status);
92
+ var valueListGroups = (0, react_redux_1.useSelector)(props.ValueListGroupSlice.Data);
93
+ var valueListGroupStatus = (0, react_redux_1.useSelector)(props.ValueListGroupSlice.Status);
94
+ var _d = React.useState('unintiated'), pageStatus = _d[0], setPageStatus = _d[1];
95
+ React.useEffect(function () {
96
+ if (userStatus === 'error' || adlFieldStatus === 'error' || valueListItemStatus === 'error' || valueListGroupStatus === 'error')
97
+ setPageStatus('error');
98
+ else if (userStatus === 'loading' || adlFieldStatus === 'loading' || valueListItemStatus === 'loading' || valueListGroupStatus === 'loading')
99
+ setPageStatus('loading');
100
+ else
101
+ setPageStatus('idle');
102
+ }, [userStatus, adlFieldStatus, valueListItemStatus, valueListGroupStatus]);
103
+ React.useEffect(function () {
104
+ if (adlFieldStatus === 'unintiated' || adlFieldStatus === 'changed')
105
+ dispatch(props.AdditionalFieldSlice.FetchField());
106
+ }, [dispatch, adlFieldStatus]);
107
+ React.useEffect(function () {
108
+ dispatch(props.UserSlice.DBSearch({ sortField: sortField, ascending: ascending, filter: search }));
109
+ dispatch(props.UserSlice.SetNewUser());
110
+ }, [dispatch]);
111
+ React.useEffect(function () {
112
+ if (valueListItemStatus === 'unintiated' || valueListItemStatus === 'changed')
113
+ dispatch(props.ValueListItemSlice.Fetch());
114
+ }, [dispatch, valueListItemStatus]);
115
+ React.useEffect(function () {
116
+ if (valueListGroupStatus === 'unintiated' || valueListGroupStatus === 'changed')
117
+ dispatch(props.ValueListGroupSlice.Fetch());
118
+ }, [dispatch, valueListGroupStatus]);
119
+ React.useEffect(function () {
120
+ function ConvertType(type) {
121
+ if (type === 'string' || type === 'integer' || type === 'number' || type === 'datetime' || type === 'boolean')
122
+ return { type: type };
123
+ return { type: 'enum', enum: [{ Label: type, Value: type }] };
124
+ }
125
+ var ordered = _.orderBy(defaultSearchcols.concat(adlFields.map(function (item) { return (__assign({ label: "[AF] ".concat(item.FieldName), key: item.FieldName }, ConvertType(item.Type))); })), ['label'], ["asc"]);
126
+ setFilterableList(ordered);
127
+ }, [adlFields]);
128
+ if (pageStatus === 'error')
129
+ return React.createElement("div", { style: { width: '100%', height: '100%' } },
130
+ React.createElement(react_interactive_1.ServerErrorIcon, { Show: true, Label: 'A Server Error Occured. Please Reload the Application' }));
131
+ return (React.createElement("div", { style: { width: '100%', height: '100%' } },
132
+ React.createElement(react_interactive_1.LoadingScreen, { Show: pageStatus === 'loading' }),
133
+ React.createElement(react_interactive_1.SearchBar, { CollumnList: filterableList, SetFilter: function (flds) { return dispatch(props.UserSlice.DBSearch({ sortField: sortField, ascending: ascending, filter: flds })); }, Direction: 'left', defaultCollumn: { label: 'Last Name', key: 'LastName', type: 'string', isPivotField: false }, Width: '50%', Label: 'Search', ShowLoading: searchStatus === 'loading', ResultNote: searchStatus === 'error' ? 'Could not complete Search' : 'Found ' + data.length + ' UserAccounts', GetEnum: function (setOptions, field) {
134
+ if (field.type !== 'enum' || field.enum === undefined || field.enum.length !== 1)
135
+ return function () { };
136
+ var grpName = (field.enum !== undefined ? field.enum[0].Value.toLowerCase() : '');
137
+ var grpIndex = valueListGroups.findIndex(function (g) { return g.Name.toLowerCase() === grpName; });
138
+ if (grpIndex < 0)
139
+ return function () { };
140
+ setOptions(valueListItems.filter(function (v) { return v.GroupID === valueListGroups[grpIndex].ID; }).map(function (item) { return ({ Value: item.ID.toString(), Label: item.Value }); }));
141
+ return function () { };
142
+ } },
143
+ React.createElement("li", { className: "nav-item", style: { width: '15%', paddingRight: 10 } },
144
+ React.createElement("fieldset", { className: "border", style: { padding: '10px', height: '100%' } },
145
+ React.createElement("legend", { className: "w-auto", style: { fontSize: 'large' } }, "Actions:"),
146
+ React.createElement("form", null,
147
+ React.createElement("button", { className: "btn btn-primary", onClick: function (event) { event.preventDefault(); setShowModal(true); } }, "Add User"))))),
148
+ React.createElement("div", { style: { width: '100%', height: 'calc( 100% - 136px)' } },
149
+ React.createElement(react_table_1.default, { cols: [
150
+ { key: 'Name', field: 'Name', label: 'User Name', headerStyle: { width: '10%' }, rowStyle: { width: '10%' } },
151
+ { key: 'FirstName', field: 'FirstName', label: 'First Name', headerStyle: { width: '10%' }, rowStyle: { width: '10%' } },
152
+ { key: 'LastName', field: 'LastName', label: 'Last Name', headerStyle: { width: '10%' }, rowStyle: { width: '10%' } },
153
+ { key: 'Phone', field: 'Phone', label: 'Phone', headerStyle: { width: '10%' }, rowStyle: { width: '10%' } },
154
+ { key: 'Email', field: 'Email', label: 'Email', headerStyle: { width: 'auto' }, rowStyle: { width: 'auto' } },
155
+ { key: 'scroll', label: '', headerStyle: { width: 17, padding: 0 }, rowStyle: { width: 0, padding: 0 } },
156
+ ], tableClass: "table table-hover", data: data, sortKey: sortField, ascending: ascending, onSort: function (d) {
157
+ if (d.colField === undefined)
158
+ return;
159
+ if (d.colField !== sortField)
160
+ dispatch(props.UserSlice.DBSearch({ sortField: sortField, ascending: !ascending, filter: search }));
161
+ else
162
+ dispatch(props.UserSlice.DBSearch({ sortField: d.colField, ascending: true, filter: search }));
163
+ }, onClick: function (d) { return props.OnUserSelect(d.row.ID); }, theadStyle: { fontSize: 'smaller', display: 'table', tableLayout: 'fixed', width: '100%' }, tbodyStyle: { display: 'block', overflowY: 'scroll', maxHeight: window.innerHeight - 300, width: '100%' }, rowStyle: { fontSize: 'smaller', display: 'table', tableLayout: 'fixed', width: '100%' }, selected: function (item) { return false; } })),
164
+ React.createElement(react_interactive_1.Modal, { Show: showModal, Size: 'lg', ShowCancel: false, ShowX: true, ConfirmText: 'Save', Title: 'Add User', CallBack: function (confirm) {
165
+ if (confirm)
166
+ dispatch(props.UserSlice.DBAction({ verb: 'POST', record: __assign(__assign({}, currentUserAccount), { Password: CryptoJS.SHA256(currentUserAccount.Password + "0").toString(CryptoJS.enc.Base64) }) }));
167
+ dispatch(props.UserSlice.SetNewUser());
168
+ setShowModal(false);
169
+ }, ConfirmShowToolTip: userError.length > 0, ConfirmToolTipContent: userError.map(function (t, i) { return React.createElement("p", { key: i },
170
+ gpa_symbols_1.CrossMark,
171
+ " ",
172
+ t); }), DisableConfirm: userError.length > 0 }, currentUserAccount !== undefined ? React.createElement(UserForm_1.default, { UserAccount: currentUserAccount, Setter: function (u) { return dispatch(props.UserSlice.SetCurrentUser(u)); }, Edit: false, SetErrors: setUserError, UserSlice: props.UserSlice }) : null)));
173
+ }
174
+ exports.default = ByUser;
@@ -1,14 +1,14 @@
1
- /// <reference types="react" />
2
- import { Application, SystemCenter } from '@gpa-gemstone/application-typings';
3
- import { IAdditionalFieldSlice, IGenericSlice, ISecurityRoleSlice, IUserAccountSlice } from '../SliceInterfaces';
4
- interface IProps {
5
- UserID: string;
6
- OnDelete: () => void;
7
- SecurityRoleSlice: ISecurityRoleSlice;
8
- UserSlice: IUserAccountSlice;
9
- AdditionalFieldSlice: IAdditionalFieldSlice<Application.Types.iAdditionalUserField, Application.Types.iAdditionalUserFieldValue>;
10
- ValueListItemSlice: IGenericSlice<SystemCenter.Types.ValueListItem>;
11
- ValueListGroupSlice: IGenericSlice<SystemCenter.Types.ValueListGroup>;
12
- }
13
- declare function User(props: IProps): JSX.Element;
14
- export default User;
1
+ import * as React from 'react';
2
+ import { Application, SystemCenter } from '@gpa-gemstone/application-typings';
3
+ import { IAdditionalFieldSlice, IGenericSlice, ISecurityRoleSlice, IUserAccountSlice } from '../SliceInterfaces';
4
+ interface IProps {
5
+ UserID: string;
6
+ OnDelete: () => void;
7
+ SecurityRoleSlice: ISecurityRoleSlice;
8
+ UserSlice: IUserAccountSlice;
9
+ AdditionalFieldSlice: IAdditionalFieldSlice<Application.Types.iAdditionalUserField, Application.Types.iAdditionalUserFieldValue>;
10
+ ValueListItemSlice: IGenericSlice<SystemCenter.Types.ValueListItem>;
11
+ ValueListGroupSlice: IGenericSlice<SystemCenter.Types.ValueListGroup>;
12
+ }
13
+ declare function User(props: IProps): React.JSX.Element;
14
+ export default User;
package/lib/user/User.js CHANGED
@@ -1,71 +1,97 @@
1
- "use strict";
2
- // ******************************************************************************************************
3
- // User.tsx - Gbtc
4
- //
5
- // Copyright © 2020, Grid Protection Alliance. All Rights Reserved.
6
- //
7
- // Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See
8
- // the NOTICE file distributed with this work for additional information regarding copyright ownership.
9
- // The GPA licenses this file to you under the MIT License (MIT), the "License"; you may not use this
10
- // file except in compliance with the License. You may obtain a copy of the License at:
11
- //
12
- // http://opensource.org/licenses/MIT
13
- //
14
- // Unless agreed to in writing, the subject software distributed under the License is distributed on an
15
- // "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the
16
- // License for the specific language governing permissions and limitations.
17
- //
18
- // Code Modification History:
19
- // ----------------------------------------------------------------------------------------------------
20
- // 07/14/2021 - C. Lackner
21
- // Generated original version of source code.
22
- // ******************************************************************************************************
23
- Object.defineProperty(exports, "__esModule", { value: true });
24
- var React = require("react");
25
- var react_interactive_1 = require("@gpa-gemstone/react-interactive");
26
- var UserInfo_1 = require("./UserInfo");
27
- var UserPermissions_1 = require("./UserPermissions");
28
- var AdditionalField_1 = require("./AdditionalField");
29
- var react_redux_1 = require("react-redux");
30
- var react_forms_1 = require("@gpa-gemstone/react-forms");
31
- function User(props) {
32
- var dispatch = (0, react_redux_1.useDispatch)();
33
- var user = (0, react_redux_1.useSelector)(props.UserSlice.CurrentUser);
34
- var status = (0, react_redux_1.useSelector)(props.UserSlice.Status);
35
- var _a = React.useState('userInfo'), tab = _a[0], setTab = _a[1];
36
- var _b = React.useState(false), showWarning = _b[0], setShowWarning = _b[1];
37
- React.useEffect(function () {
38
- dispatch(props.UserSlice.LoadExistingUser(props.UserID));
39
- }, [dispatch, props.UserID]);
40
- if (status === 'error')
41
- return React.createElement("div", { style: { width: '100%', height: '100%' } },
42
- React.createElement(react_interactive_1.ServerErrorIcon, { Show: true, Label: 'A Server Error Occured. Please Reload the Application' }));
43
- var Tabs = [
44
- { Id: "userInfo", Label: "User Info" },
45
- { Id: "permissions", Label: "Permissions" },
46
- { Id: "additionalFields", Label: "Additional Fields" }
47
- ];
48
- return (React.createElement("div", { style: { width: '100%', height: window.innerHeight - 63, maxHeight: window.innerHeight - 63, overflow: 'hidden', padding: 15 } },
49
- React.createElement("div", { className: "row" },
50
- React.createElement("div", { className: "col" },
51
- React.createElement("h2", null, user != null ? user.FirstName + " " + user.LastName : '')),
52
- React.createElement("div", { className: "col" },
53
- React.createElement("button", { className: "btn btn-danger pull-right", hidden: user == null, onClick: function () { return setShowWarning(true); } }, "Delete User"))),
54
- React.createElement(react_interactive_1.LoadingScreen, { Show: status === 'loading' }),
55
- React.createElement("hr", null),
56
- React.createElement(react_interactive_1.TabSelector, { CurrentTab: tab, SetTab: function (t) { return setTab(t); }, Tabs: Tabs }),
57
- React.createElement("div", { className: "tab-content", style: { maxHeight: window.innerHeight - 235, overflow: 'hidden' } },
58
- React.createElement("div", { className: "tab-pane " + (tab === "userInfo" ? " active" : "fade") },
59
- React.createElement(UserInfo_1.default, { UserSlice: props.UserSlice })),
60
- React.createElement("div", { className: "tab-pane " + (tab === "permissions" ? " active" : "fade") }, user == null ? null : React.createElement(UserPermissions_1.default, { UserID: user.ID, RoleSlice: props.SecurityRoleSlice })),
61
- React.createElement("div", { className: "tab-pane " + (tab === "additionalFields" ? " active" : "fade"), style: { maxHeight: window.innerHeight - 215 } },
62
- React.createElement(AdditionalField_1.default, { Id: props.UserID, AdditionalFieldSlice: props.AdditionalFieldSlice, ValueListItemSlice: props.ValueListItemSlice, ValueListGroupSlice: props.ValueListGroupSlice, EmptyField: { ID: -1, IsSecure: false, FieldName: '', Type: 'string' }, GetFieldValueIndex: function (field, values) { return values.findIndex(function (v) { return v.AdditionalUserFieldID === field.ID; }); }, GetFieldIndex: function (value, fields) { return fields.findIndex(function (f) { return f.ID === value.AdditionalUserFieldID; }); }, FieldKeySelector: function (field) { return (field.ID === -1 ? 'new' : field.ID.toString()); }, ValidateField: function () { return []; }, FieldUI: function (fld, setter) { return React.createElement(react_forms_1.CheckBox, { Record: fld, Field: 'IsSecure', Label: "Secure Data", Setter: setter }); }, CreateValue: function (fld) { return ({ Value: '', ID: -1, UserAccountID: props.UserID, AdditionalUserFieldID: fld.ID }); } }))),
63
- React.createElement(react_interactive_1.Warning, { Message: 'This will permanently remove the User. Are you sure you want to continue?', Title: 'Warning', Show: showWarning, CallBack: function (c) {
64
- setShowWarning(false);
65
- if (c) {
66
- dispatch(props.UserSlice.DBAction({ verb: 'DELETE', record: user }));
67
- props.OnDelete();
68
- }
69
- } })));
70
- }
71
- exports.default = User;
1
+ "use strict";
2
+ // ******************************************************************************************************
3
+ // User.tsx - Gbtc
4
+ //
5
+ // Copyright © 2020, Grid Protection Alliance. All Rights Reserved.
6
+ //
7
+ // Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See
8
+ // the NOTICE file distributed with this work for additional information regarding copyright ownership.
9
+ // The GPA licenses this file to you under the MIT License (MIT), the "License"; you may not use this
10
+ // file except in compliance with the License. You may obtain a copy of the License at:
11
+ //
12
+ // http://opensource.org/licenses/MIT
13
+ //
14
+ // Unless agreed to in writing, the subject software distributed under the License is distributed on an
15
+ // "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the
16
+ // License for the specific language governing permissions and limitations.
17
+ //
18
+ // Code Modification History:
19
+ // ----------------------------------------------------------------------------------------------------
20
+ // 07/14/2021 - C. Lackner
21
+ // Generated original version of source code.
22
+ // ******************************************************************************************************
23
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ var desc = Object.getOwnPropertyDescriptor(m, k);
26
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
27
+ desc = { enumerable: true, get: function() { return m[k]; } };
28
+ }
29
+ Object.defineProperty(o, k2, desc);
30
+ }) : (function(o, m, k, k2) {
31
+ if (k2 === undefined) k2 = k;
32
+ o[k2] = m[k];
33
+ }));
34
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
35
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
36
+ }) : function(o, v) {
37
+ o["default"] = v;
38
+ });
39
+ var __importStar = (this && this.__importStar) || function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ var __importDefault = (this && this.__importDefault) || function (mod) {
47
+ return (mod && mod.__esModule) ? mod : { "default": mod };
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ var React = __importStar(require("react"));
51
+ var react_interactive_1 = require("@gpa-gemstone/react-interactive");
52
+ var UserInfo_1 = __importDefault(require("./UserInfo"));
53
+ var UserPermissions_1 = __importDefault(require("./UserPermissions"));
54
+ var AdditionalField_1 = __importDefault(require("./AdditionalField"));
55
+ var react_redux_1 = require("react-redux");
56
+ var react_forms_1 = require("@gpa-gemstone/react-forms");
57
+ function User(props) {
58
+ var dispatch = (0, react_redux_1.useDispatch)();
59
+ var user = (0, react_redux_1.useSelector)(props.UserSlice.CurrentUser);
60
+ var status = (0, react_redux_1.useSelector)(props.UserSlice.Status);
61
+ var _a = React.useState('userInfo'), tab = _a[0], setTab = _a[1];
62
+ var _b = React.useState(false), showWarning = _b[0], setShowWarning = _b[1];
63
+ React.useEffect(function () {
64
+ dispatch(props.UserSlice.LoadExistingUser(props.UserID));
65
+ }, [dispatch, props.UserID]);
66
+ if (status === 'error')
67
+ return React.createElement("div", { style: { width: '100%', height: '100%' } },
68
+ React.createElement(react_interactive_1.ServerErrorIcon, { Show: true, Label: 'A Server Error Occured. Please Reload the Application' }));
69
+ var Tabs = [
70
+ { Id: "userInfo", Label: "User Info" },
71
+ { Id: "permissions", Label: "Permissions" },
72
+ { Id: "additionalFields", Label: "Additional Fields" }
73
+ ];
74
+ return (React.createElement("div", { style: { width: '100%', height: window.innerHeight - 63, maxHeight: window.innerHeight - 63, overflow: 'hidden', padding: 15 } },
75
+ React.createElement("div", { className: "row" },
76
+ React.createElement("div", { className: "col" },
77
+ React.createElement("h2", null, user != null ? "".concat(user.FirstName, " ").concat(user.LastName) : '')),
78
+ React.createElement("div", { className: "col" },
79
+ React.createElement("button", { className: "btn btn-danger pull-right", hidden: user == null, onClick: function () { return setShowWarning(true); } }, "Delete User"))),
80
+ React.createElement(react_interactive_1.LoadingScreen, { Show: status === 'loading' }),
81
+ React.createElement("hr", null),
82
+ React.createElement(react_interactive_1.TabSelector, { CurrentTab: tab, SetTab: function (t) { return setTab(t); }, Tabs: Tabs }),
83
+ React.createElement("div", { className: "tab-content", style: { maxHeight: window.innerHeight - 235, overflow: 'hidden' } },
84
+ React.createElement("div", { className: "tab-pane " + (tab === "userInfo" ? " active" : "fade") },
85
+ React.createElement(UserInfo_1.default, { UserSlice: props.UserSlice })),
86
+ React.createElement("div", { className: "tab-pane " + (tab === "permissions" ? " active" : "fade") }, user == null ? null : React.createElement(UserPermissions_1.default, { UserID: user.ID, RoleSlice: props.SecurityRoleSlice })),
87
+ React.createElement("div", { className: "tab-pane " + (tab === "additionalFields" ? " active" : "fade"), style: { maxHeight: window.innerHeight - 215 } },
88
+ React.createElement(AdditionalField_1.default, { Id: props.UserID, AdditionalFieldSlice: props.AdditionalFieldSlice, ValueListItemSlice: props.ValueListItemSlice, ValueListGroupSlice: props.ValueListGroupSlice, EmptyField: { ID: -1, IsSecure: false, FieldName: '', Type: 'string' }, GetFieldValueIndex: function (field, values) { return values.findIndex(function (v) { return v.AdditionalUserFieldID === field.ID; }); }, GetFieldIndex: function (value, fields) { return fields.findIndex(function (f) { return f.ID === value.AdditionalUserFieldID; }); }, FieldKeySelector: function (field) { return (field.ID === -1 ? 'new' : field.ID.toString()); }, ValidateField: function () { return []; }, FieldUI: function (fld, setter) { return React.createElement(react_forms_1.CheckBox, { Record: fld, Field: 'IsSecure', Label: "Secure Data", Setter: setter }); }, CreateValue: function (fld) { return ({ Value: '', ID: -1, UserAccountID: props.UserID, AdditionalUserFieldID: fld.ID }); } }))),
89
+ React.createElement(react_interactive_1.Warning, { Message: 'This will permanently remove the User. Are you sure you want to continue?', Title: 'Warning', Show: showWarning, CallBack: function (c) {
90
+ setShowWarning(false);
91
+ if (c) {
92
+ dispatch(props.UserSlice.DBAction({ verb: 'DELETE', record: user }));
93
+ props.OnDelete();
94
+ }
95
+ } })));
96
+ }
97
+ exports.default = User;