dce-reactkit 3.2.3 → 3.2.5

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.
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Check if the user is on a mobile device or tablet
3
+ * from https://stackoverflow.com/questions/11381673/detecting-a-mobile-browser
4
+ * @returns true if user is on a mobile device
5
+ */
6
+ declare const isMobileOrTablet: () => boolean;
7
+ export default isMobileOrTablet;
@@ -50,6 +50,7 @@ import initLogCollection from './server/initLogCollection';
50
50
  import getMonthName from './helpers/getMonthName';
51
51
  import genCSV from './helpers/genCSV';
52
52
  import canReviewLogs from './helpers/canReviewLogs';
53
+ import isMobileOrTablet from './helpers/isMobileOrTablet';
53
54
  import ModalButtonType from './types/ModalButtonType';
54
55
  import ModalSize from './types/ModalSize';
55
56
  import ModalType from './types/ModalType';
@@ -65,4 +66,4 @@ import LogBuiltInMetadata from './types/LogBuiltInMetadata';
65
66
  import LogMetadataType from './types/LogMetadataType';
66
67
  import IntelliTableColumn from './types/IntelliTableColumn';
67
68
  import PickableItem from './components/ItemPicker/types/PickableItem';
68
- export { AppWrapper, LoadingSpinner, ErrorBox, Modal, TabBox, RadioButton, CheckboxButton, ButtonInputGroup, SimpleDateChooser, Drawer, PopSuccessMark, PopFailureMark, PopPendingMark, CopiableBox, ItemPicker, LogReviewer, IntelliTable, CSVDownloadButton, alert, confirm, showFatalError, ErrorWithCode, MINUTE_IN_MS, HOUR_IN_MS, DAY_IN_MS, DynamicWord, abbreviate, avg, ceilToNumDecimals, floorToNumDecimals, forceNumIntoBounds, padDecimalZeros, padZerosLeft, roundToNumDecimals, sum, waitMs, getOrdinal, getTimeInfoInET, stubServerEndpoint, startMinWait, getHumanReadableDate, getPartOfDay, stringsToHumanReadableList, onlyKeepLetters, parallelLimit, getMonthName, genCSV, canReviewLogs, visitServerEndpoint, logClientEvent, initServer, genRouteHandler, handleError, handleSuccess, initLogCollection, ModalButtonType, ModalSize, ModalType, ReactKitErrorCode, Variant, DayOfWeek, Log, LogType, LogSource, LogAction, LogBuiltInMetadata, LogMetadataType, IntelliTableColumn, PickableItem, ParamType, };
69
+ export { AppWrapper, LoadingSpinner, ErrorBox, Modal, TabBox, RadioButton, CheckboxButton, ButtonInputGroup, SimpleDateChooser, Drawer, PopSuccessMark, PopFailureMark, PopPendingMark, CopiableBox, ItemPicker, LogReviewer, IntelliTable, CSVDownloadButton, alert, confirm, showFatalError, ErrorWithCode, MINUTE_IN_MS, HOUR_IN_MS, DAY_IN_MS, DynamicWord, abbreviate, avg, ceilToNumDecimals, floorToNumDecimals, forceNumIntoBounds, padDecimalZeros, padZerosLeft, roundToNumDecimals, sum, waitMs, getOrdinal, getTimeInfoInET, stubServerEndpoint, startMinWait, getHumanReadableDate, getPartOfDay, stringsToHumanReadableList, onlyKeepLetters, parallelLimit, getMonthName, genCSV, canReviewLogs, isMobileOrTablet, visitServerEndpoint, logClientEvent, initServer, genRouteHandler, handleError, handleSuccess, initLogCollection, ModalButtonType, ModalSize, ModalType, ReactKitErrorCode, Variant, DayOfWeek, Log, LogType, LogSource, LogAction, LogBuiltInMetadata, LogMetadataType, IntelliTableColumn, PickableItem, ParamType, };
package/dist/index.d.ts CHANGED
@@ -1017,6 +1017,13 @@ declare const genCSV: (data: {
1017
1017
  */
1018
1018
  declare const canReviewLogs: () => Promise<boolean>;
1019
1019
 
1020
+ /**
1021
+ * Check if the user is on a mobile device or tablet
1022
+ * from https://stackoverflow.com/questions/11381673/detecting-a-mobile-browser
1023
+ * @returns true if user is on a mobile device
1024
+ */
1025
+ declare const isMobileOrTablet: () => boolean;
1026
+
1020
1027
  /**
1021
1028
  * List of error codes built into the react kit
1022
1029
  * @author Gabe Abrams
@@ -1065,4 +1072,4 @@ declare const LogBuiltInMetadata: {
1065
1072
  };
1066
1073
  };
1067
1074
 
1068
- export { AppWrapper, ButtonInputGroup, CSVDownloadButton, CheckboxButton, CopiableBox, DAY_IN_MS, DayOfWeek, Drawer, DynamicWord, ErrorBox, ErrorWithCode, HOUR_IN_MS, IntelliTable, IntelliTableColumn, ItemPicker, LoadingSpinner, Log, LogAction, LogBuiltInMetadata, LogMetadataType, LogReviewer, LogSource, LogType, MINUTE_IN_MS, Modal, ModalButtonType, ModalSize, ModalType, ParamType, PickableItem, PopFailureMark, PopPendingMark, PopSuccessMark, RadioButton, ReactKitErrorCode, SimpleDateChooser, TabBox, Variant, abbreviate, alert, avg, canReviewLogs, ceilToNumDecimals, confirm, floorToNumDecimals, forceNumIntoBounds, genCSV, genRouteHandler, getHumanReadableDate, getMonthName, getOrdinal, getPartOfDay, getTimeInfoInET, handleError, handleSuccess, initLogCollection, initServer, logClientEvent, onlyKeepLetters, padDecimalZeros, padZerosLeft, parallelLimit, roundToNumDecimals, showFatalError, startMinWait, stringsToHumanReadableList, stubServerEndpoint, sum, visitServerEndpoint, waitMs };
1075
+ export { AppWrapper, ButtonInputGroup, CSVDownloadButton, CheckboxButton, CopiableBox, DAY_IN_MS, DayOfWeek, Drawer, DynamicWord, ErrorBox, ErrorWithCode, HOUR_IN_MS, IntelliTable, IntelliTableColumn, ItemPicker, LoadingSpinner, Log, LogAction, LogBuiltInMetadata, LogMetadataType, LogReviewer, LogSource, LogType, MINUTE_IN_MS, Modal, ModalButtonType, ModalSize, ModalType, ParamType, PickableItem, PopFailureMark, PopPendingMark, PopSuccessMark, RadioButton, ReactKitErrorCode, SimpleDateChooser, TabBox, Variant, abbreviate, alert, avg, canReviewLogs, ceilToNumDecimals, confirm, floorToNumDecimals, forceNumIntoBounds, genCSV, genRouteHandler, getHumanReadableDate, getMonthName, getOrdinal, getPartOfDay, getTimeInfoInET, handleError, handleSuccess, initLogCollection, initServer, isMobileOrTablet, logClientEvent, onlyKeepLetters, padDecimalZeros, padZerosLeft, parallelLimit, roundToNumDecimals, showFatalError, startMinWait, stringsToHumanReadableList, stubServerEndpoint, sum, visitServerEndpoint, waitMs };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dce-reactkit",
3
- "version": "3.2.3",
3
+ "version": "3.2.5",
4
4
  "description": "Shared components for Harvard DCE apps",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -467,7 +467,7 @@ const columns: IntelliTableColumn[] = [
467
467
  */
468
468
  const genHumanReadableName = (machineReadableName: string) => {
469
469
  let humanReadableName = '';
470
-
470
+
471
471
  // Add chars and spaces
472
472
  const chars = machineReadableName.split('');
473
473
  chars.forEach((char) => {
@@ -477,9 +477,49 @@ const genHumanReadableName = (machineReadableName: string) => {
477
477
  }
478
478
  humanReadableName += char;
479
479
  });
480
+ const words = (
481
+ humanReadableName
482
+ .trim()
483
+ // Split into words
484
+ .split(' ')
485
+ // Filter out whitespace
486
+ .filter((word) => {
487
+ return (word.length > 0);
488
+ })
489
+ // Capitalize first letter
490
+ .map((word) => {
491
+ if (word.length <= 1) {
492
+ return word;
493
+ }
494
+ return `${word.substring(0, 1).toUpperCase()}${word.substring(1)}`;
495
+ })
496
+ );
497
+
498
+ // Handle acronyms by piling words together
499
+ const consolidatedWords: string[] = [];
500
+ let acronym = '';
501
+ words.forEach((word) => {
502
+ if (word.length === 1) {
503
+ // Add on to acronym
504
+ acronym += word;
505
+ } else {
506
+ // Wrap up acronym
507
+ if (acronym.length > 0) {
508
+ consolidatedWords.push(acronym);
509
+ acronym = '';
510
+ }
511
+
512
+ // Full word. Just add it
513
+ consolidatedWords.push(word);
514
+ }
515
+ });
516
+ // Add trailing acronym
517
+ if (acronym.length > 0) {
518
+ consolidatedWords.push(acronym);
519
+ }
480
520
 
481
- // Trim and return
482
- return humanReadableName.trim();
521
+ // Return
522
+ return consolidatedWords.join(' ');
483
523
  };
484
524
 
485
525
  /*------------------------------------------------------------------------*/
@@ -1,19 +1,8 @@
1
- /**
2
- * Check if the user is on mobile
3
- * from https://stackoverflow.com/questions/11381673/detecting-a-mobile-browser
4
- * @returns true if user is on a mobile device
5
- */
6
- const checkIfMobileOrTablet = () => {
7
- try {
8
- let check = false;
9
- ((a) => { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true; })((navigator ?? {}).userAgent || (navigator ?? {}).vendor || ((window as any) ?? {}).opera);
10
- return check;
11
- } catch (err) {
12
- // Probably this code is being executed on a server
13
- return false;
14
- }
15
- };
16
- const isMobileOrTablet = checkIfMobileOrTablet();
1
+ // Import shared types
2
+ import isMobileOrTablet from '../helpers/isMobileOrTablet';
3
+
4
+ // Check if mobile
5
+ const isMobile = isMobileOrTablet();
17
6
 
18
7
  /**
19
8
  * Dynamic words determined by the user's platform
@@ -21,32 +10,32 @@ const isMobileOrTablet = checkIfMobileOrTablet();
21
10
  */
22
11
  const DynamicWord = {
23
12
  Click: (
24
- isMobileOrTablet
13
+ isMobile
25
14
  ? 'tap'
26
15
  : 'click'
27
16
  ),
28
17
  ClickCapitalized: (
29
- isMobileOrTablet
18
+ isMobile
30
19
  ? 'Tap'
31
20
  : 'Click'
32
21
  ),
33
22
  App: (
34
- isMobileOrTablet
23
+ isMobile
35
24
  ? 'app'
36
25
  : 'application'
37
26
  ),
38
27
  AppCapitalized: (
39
- isMobileOrTablet
28
+ isMobile
40
29
  ? 'App'
41
30
  : 'Application'
42
31
  ),
43
32
  Device: (
44
- isMobileOrTablet
33
+ isMobile
45
34
  ? 'device'
46
35
  : 'computer'
47
36
  ),
48
37
  DeviceCapitalized: (
49
- isMobileOrTablet
38
+ isMobile
50
39
  ? 'Device'
51
40
  : 'Computer'
52
41
  ),
@@ -0,0 +1,26 @@
1
+ // True if user is on mobile or tablet
2
+ let cachedResult: boolean | undefined = undefined;
3
+
4
+ /**
5
+ * Check if the user is on a mobile device or tablet
6
+ * from https://stackoverflow.com/questions/11381673/detecting-a-mobile-browser
7
+ * @returns true if user is on a mobile device
8
+ */
9
+ const isMobileOrTablet = () => {
10
+ if (cachedResult !== undefined) {
11
+ return cachedResult;
12
+ }
13
+
14
+ try {
15
+ let check = false;
16
+ ((a) => { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true; })((navigator ?? {}).userAgent || (navigator ?? {}).vendor || ((window as any) ?? {}).opera);
17
+ cachedResult = check;
18
+ return cachedResult;
19
+ } catch (err) {
20
+ // Probably this code is being executed on a server
21
+ cachedResult = false;
22
+ return cachedResult;
23
+ }
24
+ };
25
+
26
+ export default isMobileOrTablet;
package/src/index.ts CHANGED
@@ -59,6 +59,7 @@ import initLogCollection from './server/initLogCollection';
59
59
  import getMonthName from './helpers/getMonthName';
60
60
  import genCSV from './helpers/genCSV';
61
61
  import canReviewLogs from './helpers/canReviewLogs';
62
+ import isMobileOrTablet from './helpers/isMobileOrTablet';
62
63
 
63
64
  // Import types
64
65
  import ModalButtonType from './types/ModalButtonType';
@@ -135,6 +136,7 @@ export {
135
136
  getMonthName,
136
137
  genCSV,
137
138
  canReviewLogs,
139
+ isMobileOrTablet,
138
140
  // Client helpers
139
141
  visitServerEndpoint,
140
142
  logClientEvent,