ywana-core8 0.0.953 → 0.0.954

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,10 +1,10 @@
1
1
  require('material-design-icons-iconfont/dist/material-design-icons.css');
2
2
  var React = require('react');
3
+ var ResumableJS = require('resumablejs');
3
4
  var RSwitch = require('react-switch');
4
5
  var moment$1 = require('moment');
5
6
  var momentRange = require('moment-range');
6
7
  require('moment/locale/es');
7
- var ResumableJS = require('resumablejs');
8
8
  var reactNotificationsComponent = require('react-notifications-component');
9
9
  require('react-notifications-component/dist/theme.css');
10
10
  var axios = require('axios');
@@ -13,9 +13,9 @@ var equal = require('deep-equal');
13
13
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
14
14
 
15
15
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
16
+ var ResumableJS__default = /*#__PURE__*/_interopDefaultLegacy(ResumableJS);
16
17
  var RSwitch__default = /*#__PURE__*/_interopDefaultLegacy(RSwitch);
17
18
  var moment__default = /*#__PURE__*/_interopDefaultLegacy(moment$1);
18
- var ResumableJS__default = /*#__PURE__*/_interopDefaultLegacy(ResumableJS);
19
19
  var axios__default = /*#__PURE__*/_interopDefaultLegacy(axios);
20
20
  var equal__default = /*#__PURE__*/_interopDefaultLegacy(equal);
21
21
 
@@ -1680,6 +1680,210 @@ var PasswordField = function PasswordField(props) {
1680
1680
  }));
1681
1681
  };
1682
1682
 
1683
+ /**
1684
+ * Upload Area
1685
+ */
1686
+ var UploadArea = function UploadArea(props) {
1687
+ var _props$label = props.label,
1688
+ label = _props$label === void 0 ? 'Add file or drop file here...' : _props$label;
1689
+ var areaElement = React.useRef();
1690
+ var _useState = React.useState(false),
1691
+ drag = _useState[0],
1692
+ setDrag = _useState[1];
1693
+ var resumable = props.resumable;
1694
+ React.useEffect(function () {
1695
+ if (resumable && areaElement) {
1696
+ resumable.assignDrop(areaElement.current);
1697
+ }
1698
+ }, []);
1699
+ var onDragOver = function onDragOver() {
1700
+ setDrag(true);
1701
+ };
1702
+ var onDragLeave = function onDragLeave() {
1703
+ setDrag(false);
1704
+ };
1705
+ var dragging = drag === true ? 'drag-over' : '';
1706
+ return /*#__PURE__*/React__default["default"].createElement("div", {
1707
+ className: "upload-area6 " + dragging,
1708
+ onDragOver: onDragOver,
1709
+ onDragLeave: onDragLeave,
1710
+ ref: areaElement
1711
+ }, /*#__PURE__*/React__default["default"].createElement(UploadIcon, {
1712
+ resumable: resumable
1713
+ }), /*#__PURE__*/React__default["default"].createElement("label", null, label));
1714
+ };
1715
+
1716
+ /**
1717
+ * Upload Icon
1718
+ */
1719
+ var UploadIcon = function UploadIcon(_ref) {
1720
+ var _ref$icon = _ref.icon,
1721
+ icon = _ref$icon === void 0 ? "folder_open" : _ref$icon,
1722
+ resumable = _ref.resumable;
1723
+ var iconElement = React.useRef();
1724
+ React.useEffect(function () {
1725
+ if (resumable && iconElement.current) {
1726
+ resumable.assignBrowse(iconElement.current);
1727
+ }
1728
+ }, [iconElement]);
1729
+ return /*#__PURE__*/React__default["default"].createElement("div", {
1730
+ className: "upload-icon",
1731
+ ref: iconElement
1732
+ }, /*#__PURE__*/React__default["default"].createElement(Icon, {
1733
+ icon: icon,
1734
+ clickable: true
1735
+ }));
1736
+ };
1737
+
1738
+ var UPLOAD_STATES = {
1739
+ IDLE: 0,
1740
+ RUNNING: 1,
1741
+ SUCCESS: 2,
1742
+ ERROR: 3,
1743
+ COMPLETED: 4
1744
+ };
1745
+
1746
+ /**
1747
+ * Upload File
1748
+ */
1749
+ var UploadFile$1 = function UploadFile(_ref) {
1750
+ var file = _ref.file;
1751
+ var icon = file.icon,
1752
+ name = file.name,
1753
+ state = file.state,
1754
+ progress = file.progress,
1755
+ error = file.error;
1756
+ return /*#__PURE__*/React__default["default"].createElement(React.Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", {
1757
+ className: "upload-file"
1758
+ }, icon ? /*#__PURE__*/React__default["default"].createElement(Icon, {
1759
+ icon: icon
1760
+ }) : null, /*#__PURE__*/React__default["default"].createElement("label", null, name), state === UPLOAD_STATES.RUNNING ? /*#__PURE__*/React__default["default"].createElement("main", null, /*#__PURE__*/React__default["default"].createElement(LinearProgress, {
1761
+ progress: progress
1762
+ }), /*#__PURE__*/React__default["default"].createElement(Icon, {
1763
+ icon: "close",
1764
+ clickable: true
1765
+ })) : '', state === UPLOAD_STATES.SUCCESS ? /*#__PURE__*/React__default["default"].createElement("main", null, /*#__PURE__*/React__default["default"].createElement(Icon, {
1766
+ icon: "done"
1767
+ })) : '', state === UPLOAD_STATES.ERROR ? /*#__PURE__*/React__default["default"].createElement("main", null, /*#__PURE__*/React__default["default"].createElement("div", {
1768
+ className: "error"
1769
+ }, error), /*#__PURE__*/React__default["default"].createElement(Icon, {
1770
+ icon: "error"
1771
+ })) : ''));
1772
+ };
1773
+
1774
+ var UploadProgress = function UploadProgress(_ref) {
1775
+ var _ref$files = _ref.files,
1776
+ files = _ref$files === void 0 ? [] : _ref$files;
1777
+ return /*#__PURE__*/React__default["default"].createElement("div", null, files.map(function (file) {
1778
+ var f = {
1779
+ icon: "description",
1780
+ name: file.fileName,
1781
+ progress: file.progress() * 100,
1782
+ state: file.uploadState,
1783
+ error: file.uploadError
1784
+ };
1785
+ return /*#__PURE__*/React__default["default"].createElement(UploadFile$1, {
1786
+ key: f.name,
1787
+ file: f
1788
+ });
1789
+ }));
1790
+ };
1791
+
1792
+ /**
1793
+ * Uploader
1794
+ */
1795
+ var Uploader = function Uploader(_ref) {
1796
+ var icon = _ref.icon,
1797
+ label = _ref.label,
1798
+ _ref$view = _ref.view,
1799
+ view = _ref$view === void 0 ? "area" : _ref$view,
1800
+ target = _ref.target,
1801
+ accept = _ref.accept,
1802
+ _ref$simultaneousUplo = _ref.simultaneousUploads,
1803
+ simultaneousUploads = _ref$simultaneousUplo === void 0 ? 1 : _ref$simultaneousUplo,
1804
+ className = _ref.className,
1805
+ onProgress = _ref.onProgress,
1806
+ onSuccess = _ref.onSuccess,
1807
+ onError = _ref.onError,
1808
+ onComplete = _ref.onComplete;
1809
+ var resumable = React.useMemo(function () {
1810
+ var config = {
1811
+ target: target,
1812
+ chunkSize: 1 * 1024 * 1024,
1813
+ simultaneousUploads: simultaneousUploads,
1814
+ testChunks: false,
1815
+ throttleProgressCallbacks: 1,
1816
+ fileType: accept
1817
+ };
1818
+ var resumable = new ResumableJS__default["default"](config);
1819
+ resumable.on('fileAdded', onFileAdded);
1820
+ resumable.on('fileProgress', onFileProgress);
1821
+ resumable.on('fileSuccess', onFileSuccess);
1822
+ resumable.on('fileError', onFileError);
1823
+ resumable.on('complete', onAllComplete);
1824
+ return resumable;
1825
+ }, []);
1826
+ var _useState = React.useState(0),
1827
+ setProgress = _useState[1];
1828
+ var _useState2 = React.useState(UPLOAD_STATES.IDLE),
1829
+ state = _useState2[0],
1830
+ setState = _useState2[1];
1831
+ var _useState3 = React.useState([]),
1832
+ files = _useState3[0],
1833
+ setFiles = _useState3[1];
1834
+ function onFileAdded(file) {
1835
+ files.push(file);
1836
+ setFiles(files);
1837
+ setState(UPLOAD_STATES.RUNNING);
1838
+ resumable.upload();
1839
+ }
1840
+ function onFileProgress(file) {
1841
+ file.uploadState = UPLOAD_STATES.RUNNING;
1842
+ var progress = file.progress();
1843
+ setProgress(progress);
1844
+ if (onProgress) onProgress(files);
1845
+ }
1846
+ function onFileSuccess(file, message) {
1847
+ file.uploadState = UPLOAD_STATES.SUCCESS;
1848
+ if (onSuccess) onSuccess(file, message);
1849
+ }
1850
+ function onFileError(file, message) {
1851
+ file.uploadState = UPLOAD_STATES.ERROR;
1852
+ file.uploadError = message;
1853
+ if (onError) onError(file, message);
1854
+ }
1855
+ function onAllComplete() {
1856
+ setState(UPLOAD_STATES.COMPLETED);
1857
+ if (onComplete) onComplete(files);
1858
+ }
1859
+ function renderView() {
1860
+ switch (view) {
1861
+ case "area":
1862
+ return /*#__PURE__*/React__default["default"].createElement(UploadArea, {
1863
+ resumable: resumable,
1864
+ icon: icon,
1865
+ label: label
1866
+ });
1867
+ case "icon":
1868
+ return /*#__PURE__*/React__default["default"].createElement(UploadIcon, {
1869
+ resumable: resumable,
1870
+ icon: icon
1871
+ });
1872
+ default:
1873
+ return /*#__PURE__*/React__default["default"].createElement(UploadArea, {
1874
+ resumable: resumable,
1875
+ icon: icon,
1876
+ label: label
1877
+ });
1878
+ }
1879
+ }
1880
+ return /*#__PURE__*/React__default["default"].createElement("div", {
1881
+ className: "uploader " + className
1882
+ }, state === UPLOAD_STATES.IDLE ? renderView() : /*#__PURE__*/React__default["default"].createElement(UploadProgress, {
1883
+ files: files
1884
+ }));
1885
+ };
1886
+
1683
1887
  var isFunction$1 = function isFunction(value) {
1684
1888
  return value && (Object.prototype.toString.call(value) === "[object Function]" || "function" === typeof value || value instanceof Function);
1685
1889
  };
@@ -2063,6 +2267,12 @@ var DataTableCell = function DataTableCell(_ref6) {
2063
2267
  return _onChange(row.id, id, value);
2064
2268
  }
2065
2269
  });
2270
+ case "Image":
2271
+ return /*#__PURE__*/React__default["default"].createElement(ImageCellViewer, {
2272
+ id: id,
2273
+ value: cell,
2274
+ uploadURL: column.uploadURL
2275
+ });
2066
2276
  default:
2067
2277
  return cell;
2068
2278
  }
@@ -2113,14 +2323,30 @@ var DataTableCell = function DataTableCell(_ref6) {
2113
2323
  }, render(column.type));
2114
2324
  };
2115
2325
 
2326
+ /**
2327
+ * Image Cell Viewer
2328
+ */
2329
+ var ImageCellViewer = function ImageCellViewer(_ref7) {
2330
+ var value = _ref7.value,
2331
+ uploadURL = _ref7.uploadURL;
2332
+ var canUpload = uploadURL ? true : false;
2333
+ return canUpload ? /*#__PURE__*/React__default["default"].createElement(Uploader, {
2334
+ view: "icon",
2335
+ icon: "cloud_upload",
2336
+ target: uploadURL
2337
+ }) : /*#__PURE__*/React__default["default"].createElement("img", {
2338
+ src: value
2339
+ });
2340
+ };
2341
+
2116
2342
  /**
2117
2343
  * Entity Cell Viewer
2118
2344
  * @param {*} param0
2119
2345
  * @returns
2120
2346
  */
2121
- var EntityCellViewer = function EntityCellViewer(_ref7) {
2122
- var item = _ref7.item,
2123
- value = _ref7.value;
2347
+ var EntityCellViewer = function EntityCellViewer(_ref8) {
2348
+ var item = _ref8.item,
2349
+ value = _ref8.value;
2124
2350
  var fields = Object.values(item).filter(function (field) {
2125
2351
  return field.column === true;
2126
2352
  });
@@ -2185,9 +2411,9 @@ var EntityCellViewer = function EntityCellViewer(_ref7) {
2185
2411
  /**
2186
2412
  * Boolean Cell Viewer
2187
2413
  */
2188
- var BooleanCellViewer = function BooleanCellViewer(_ref8) {
2189
- var _ref8$value = _ref8.value,
2190
- value = _ref8$value === void 0 ? false : _ref8$value;
2414
+ var BooleanCellViewer = function BooleanCellViewer(_ref9) {
2415
+ var _ref9$value = _ref9.value,
2416
+ value = _ref9$value === void 0 ? false : _ref9$value;
2191
2417
  var icon = value === true ? "check_box" : "check_box_outline_blank";
2192
2418
  return /*#__PURE__*/React__default["default"].createElement(Icon, {
2193
2419
  icon: icon
@@ -2197,10 +2423,10 @@ var BooleanCellViewer = function BooleanCellViewer(_ref8) {
2197
2423
  /**
2198
2424
  * NumberCellViewer
2199
2425
  */
2200
- var NumberCellViewer = function NumberCellViewer(_ref9) {
2201
- var value = _ref9.value,
2202
- format = _ref9.format,
2203
- maxDecimals = _ref9.maxDecimals;
2426
+ var NumberCellViewer = function NumberCellViewer(_ref10) {
2427
+ var value = _ref10.value,
2428
+ format = _ref10.format,
2429
+ maxDecimals = _ref10.maxDecimals;
2204
2430
  /*
2205
2431
  function formatNumber(number) {
2206
2432
  // convert number to numeric
@@ -2270,12 +2496,12 @@ var NumberCellViewer = function NumberCellViewer(_ref9) {
2270
2496
  /**
2271
2497
  * String Cell Viewer
2272
2498
  */
2273
- var StringCellViewer = function StringCellViewer(_ref10) {
2274
- var id = _ref10.id,
2275
- value = _ref10.value,
2276
- format = _ref10.format,
2277
- options = _ref10.options,
2278
- action = _ref10.action;
2499
+ var StringCellViewer = function StringCellViewer(_ref11) {
2500
+ var id = _ref11.id,
2501
+ value = _ref11.value,
2502
+ format = _ref11.format,
2503
+ options = _ref11.options,
2504
+ action = _ref11.action;
2279
2505
  function buildOptions() {
2280
2506
  var opts = typeof options === 'function' ? options() : options;
2281
2507
  return opts;
@@ -2345,12 +2571,12 @@ var StringCellViewer = function StringCellViewer(_ref10) {
2345
2571
  /**
2346
2572
  * String Cell Editor
2347
2573
  */
2348
- var StringCellEditor = function StringCellEditor(_ref11) {
2349
- var id = _ref11.id,
2350
- _ref11$value = _ref11.value,
2351
- value = _ref11$value === void 0 ? '' : _ref11$value,
2352
- options = _ref11.options,
2353
- onChange = _ref11.onChange;
2574
+ var StringCellEditor = function StringCellEditor(_ref12) {
2575
+ var id = _ref12.id,
2576
+ _ref12$value = _ref12.value,
2577
+ value = _ref12$value === void 0 ? '' : _ref12$value,
2578
+ options = _ref12.options,
2579
+ onChange = _ref12.onChange;
2354
2580
  function change(id, value) {
2355
2581
  if (onChange) onChange(id, value);
2356
2582
  }
@@ -3900,210 +4126,6 @@ var EventCard = function EventCard(props) {
3900
4126
  }, title);
3901
4127
  };
3902
4128
 
3903
- /**
3904
- * Upload Area
3905
- */
3906
- var UploadArea = function UploadArea(props) {
3907
- var _props$label = props.label,
3908
- label = _props$label === void 0 ? 'Add file or drop file here...' : _props$label;
3909
- var areaElement = React.useRef();
3910
- var _useState = React.useState(false),
3911
- drag = _useState[0],
3912
- setDrag = _useState[1];
3913
- var resumable = props.resumable;
3914
- React.useEffect(function () {
3915
- if (resumable && areaElement) {
3916
- resumable.assignDrop(areaElement.current);
3917
- }
3918
- }, []);
3919
- var onDragOver = function onDragOver() {
3920
- setDrag(true);
3921
- };
3922
- var onDragLeave = function onDragLeave() {
3923
- setDrag(false);
3924
- };
3925
- var dragging = drag === true ? 'drag-over' : '';
3926
- return /*#__PURE__*/React__default["default"].createElement("div", {
3927
- className: "upload-area6 " + dragging,
3928
- onDragOver: onDragOver,
3929
- onDragLeave: onDragLeave,
3930
- ref: areaElement
3931
- }, /*#__PURE__*/React__default["default"].createElement(UploadIcon, {
3932
- resumable: resumable
3933
- }), /*#__PURE__*/React__default["default"].createElement("label", null, label));
3934
- };
3935
-
3936
- /**
3937
- * Upload Icon
3938
- */
3939
- var UploadIcon = function UploadIcon(_ref) {
3940
- var _ref$icon = _ref.icon,
3941
- icon = _ref$icon === void 0 ? "folder_open" : _ref$icon,
3942
- resumable = _ref.resumable;
3943
- var iconElement = React.useRef();
3944
- React.useEffect(function () {
3945
- if (resumable && iconElement.current) {
3946
- resumable.assignBrowse(iconElement.current);
3947
- }
3948
- }, [iconElement]);
3949
- return /*#__PURE__*/React__default["default"].createElement("div", {
3950
- className: "upload-icon",
3951
- ref: iconElement
3952
- }, /*#__PURE__*/React__default["default"].createElement(Icon, {
3953
- icon: icon,
3954
- clickable: true
3955
- }));
3956
- };
3957
-
3958
- var UPLOAD_STATES = {
3959
- IDLE: 0,
3960
- RUNNING: 1,
3961
- SUCCESS: 2,
3962
- ERROR: 3,
3963
- COMPLETED: 4
3964
- };
3965
-
3966
- /**
3967
- * Upload File
3968
- */
3969
- var UploadFile$1 = function UploadFile(_ref) {
3970
- var file = _ref.file;
3971
- var icon = file.icon,
3972
- name = file.name,
3973
- state = file.state,
3974
- progress = file.progress,
3975
- error = file.error;
3976
- return /*#__PURE__*/React__default["default"].createElement(React.Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", {
3977
- className: "upload-file"
3978
- }, icon ? /*#__PURE__*/React__default["default"].createElement(Icon, {
3979
- icon: icon
3980
- }) : null, /*#__PURE__*/React__default["default"].createElement("label", null, name), state === UPLOAD_STATES.RUNNING ? /*#__PURE__*/React__default["default"].createElement("main", null, /*#__PURE__*/React__default["default"].createElement(LinearProgress, {
3981
- progress: progress
3982
- }), /*#__PURE__*/React__default["default"].createElement(Icon, {
3983
- icon: "close",
3984
- clickable: true
3985
- })) : '', state === UPLOAD_STATES.SUCCESS ? /*#__PURE__*/React__default["default"].createElement("main", null, /*#__PURE__*/React__default["default"].createElement(Icon, {
3986
- icon: "done"
3987
- })) : '', state === UPLOAD_STATES.ERROR ? /*#__PURE__*/React__default["default"].createElement("main", null, /*#__PURE__*/React__default["default"].createElement("div", {
3988
- className: "error"
3989
- }, error), /*#__PURE__*/React__default["default"].createElement(Icon, {
3990
- icon: "error"
3991
- })) : ''));
3992
- };
3993
-
3994
- var UploadProgress = function UploadProgress(_ref) {
3995
- var _ref$files = _ref.files,
3996
- files = _ref$files === void 0 ? [] : _ref$files;
3997
- return /*#__PURE__*/React__default["default"].createElement("div", null, files.map(function (file) {
3998
- var f = {
3999
- icon: "description",
4000
- name: file.fileName,
4001
- progress: file.progress() * 100,
4002
- state: file.uploadState,
4003
- error: file.uploadError
4004
- };
4005
- return /*#__PURE__*/React__default["default"].createElement(UploadFile$1, {
4006
- key: f.name,
4007
- file: f
4008
- });
4009
- }));
4010
- };
4011
-
4012
- /**
4013
- * Uploader
4014
- */
4015
- var Uploader = function Uploader(_ref) {
4016
- var icon = _ref.icon,
4017
- label = _ref.label,
4018
- _ref$view = _ref.view,
4019
- view = _ref$view === void 0 ? "area" : _ref$view,
4020
- target = _ref.target,
4021
- accept = _ref.accept,
4022
- _ref$simultaneousUplo = _ref.simultaneousUploads,
4023
- simultaneousUploads = _ref$simultaneousUplo === void 0 ? 1 : _ref$simultaneousUplo,
4024
- className = _ref.className,
4025
- onProgress = _ref.onProgress,
4026
- onSuccess = _ref.onSuccess,
4027
- onError = _ref.onError,
4028
- onComplete = _ref.onComplete;
4029
- var resumable = React.useMemo(function () {
4030
- var config = {
4031
- target: target,
4032
- chunkSize: 1 * 1024 * 1024,
4033
- simultaneousUploads: simultaneousUploads,
4034
- testChunks: false,
4035
- throttleProgressCallbacks: 1,
4036
- fileType: accept
4037
- };
4038
- var resumable = new ResumableJS__default["default"](config);
4039
- resumable.on('fileAdded', onFileAdded);
4040
- resumable.on('fileProgress', onFileProgress);
4041
- resumable.on('fileSuccess', onFileSuccess);
4042
- resumable.on('fileError', onFileError);
4043
- resumable.on('complete', onAllComplete);
4044
- return resumable;
4045
- }, []);
4046
- var _useState = React.useState(0),
4047
- setProgress = _useState[1];
4048
- var _useState2 = React.useState(UPLOAD_STATES.IDLE),
4049
- state = _useState2[0],
4050
- setState = _useState2[1];
4051
- var _useState3 = React.useState([]),
4052
- files = _useState3[0],
4053
- setFiles = _useState3[1];
4054
- function onFileAdded(file) {
4055
- files.push(file);
4056
- setFiles(files);
4057
- setState(UPLOAD_STATES.RUNNING);
4058
- resumable.upload();
4059
- }
4060
- function onFileProgress(file) {
4061
- file.uploadState = UPLOAD_STATES.RUNNING;
4062
- var progress = file.progress();
4063
- setProgress(progress);
4064
- if (onProgress) onProgress(files);
4065
- }
4066
- function onFileSuccess(file, message) {
4067
- file.uploadState = UPLOAD_STATES.SUCCESS;
4068
- if (onSuccess) onSuccess(file, message);
4069
- }
4070
- function onFileError(file, message) {
4071
- file.uploadState = UPLOAD_STATES.ERROR;
4072
- file.uploadError = message;
4073
- if (onError) onError(file, message);
4074
- }
4075
- function onAllComplete() {
4076
- setState(UPLOAD_STATES.COMPLETED);
4077
- if (onComplete) onComplete(files);
4078
- }
4079
- function renderView() {
4080
- switch (view) {
4081
- case "area":
4082
- return /*#__PURE__*/React__default["default"].createElement(UploadArea, {
4083
- resumable: resumable,
4084
- icon: icon,
4085
- label: label
4086
- });
4087
- case "icon":
4088
- return /*#__PURE__*/React__default["default"].createElement(UploadIcon, {
4089
- resumable: resumable,
4090
- icon: icon
4091
- });
4092
- default:
4093
- return /*#__PURE__*/React__default["default"].createElement(UploadArea, {
4094
- resumable: resumable,
4095
- icon: icon,
4096
- label: label
4097
- });
4098
- }
4099
- }
4100
- return /*#__PURE__*/React__default["default"].createElement("div", {
4101
- className: "uploader " + className
4102
- }, state === UPLOAD_STATES.IDLE ? renderView() : /*#__PURE__*/React__default["default"].createElement(UploadProgress, {
4103
- files: files
4104
- }));
4105
- };
4106
-
4107
4129
  /**
4108
4130
  * Page Context
4109
4131
  */