@hipay/hipay-material-ui 1.0.0-beta.8 → 1.0.0-beta.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. package/HiDotsStepper/HiDot.js +151 -0
  2. package/HiDotsStepper/HiDotsStepper.js +146 -0
  3. package/HiDotsStepper/index.js +16 -0
  4. package/HiForm/HiAddressField.js +204 -0
  5. package/HiForm/HiInput.js +1 -1
  6. package/HiForm/index.js +9 -0
  7. package/HiPdfReader/HiPdfReader.js +282 -0
  8. package/HiPdfReader/index.js +16 -0
  9. package/HiSelect/HiSuggestSelect.js +2 -0
  10. package/HiSelectableList/HiSelectableListItem.js +1 -2
  11. package/HiTable/BodyCellBuilder.js +7 -8
  12. package/HiTable/BodyCells/CellLayout.js +20 -18
  13. package/HiTable/BodyCells/CellSentinel.js +12 -4
  14. package/HiTable/BodyRow.js +7 -1
  15. package/HiTable/HeaderCell.js +17 -14
  16. package/HiTable/HiTable.js +13 -4
  17. package/HiTable/HiTableBody.js +26 -12
  18. package/HiTable/HiTableHead.js +22 -5
  19. package/es/HiDotsStepper/HiDot.js +92 -0
  20. package/es/HiDotsStepper/HiDotsStepper.js +83 -0
  21. package/es/HiDotsStepper/index.js +1 -0
  22. package/es/HiForm/HiAddressField.js +142 -0
  23. package/es/HiForm/HiInput.js +1 -1
  24. package/es/HiForm/index.js +2 -1
  25. package/es/HiPdfReader/HiPdfReader.js +198 -0
  26. package/es/HiPdfReader/index.js +1 -0
  27. package/es/HiSelect/HiSuggestSelect.js +2 -0
  28. package/es/HiSelectableList/HiSelectableListItem.js +1 -2
  29. package/es/HiTable/BodyCellBuilder.js +8 -9
  30. package/es/HiTable/BodyCells/CellLayout.js +22 -20
  31. package/es/HiTable/BodyCells/CellSentinel.js +12 -4
  32. package/es/HiTable/BodyRow.js +7 -1
  33. package/es/HiTable/HeaderCell.js +17 -14
  34. package/es/HiTable/HiTable.js +13 -4
  35. package/es/HiTable/HiTableBody.js +22 -9
  36. package/es/HiTable/HiTableHead.js +17 -5
  37. package/es/styles/createHiMuiTheme.js +7 -0
  38. package/index.es.js +1 -1
  39. package/index.js +1 -1
  40. package/package.json +2 -1
  41. package/styles/createHiMuiTheme.js +7 -0
  42. package/umd/hipay-material-ui.development.js +2874 -2606
  43. package/umd/hipay-material-ui.production.min.js +4 -4
@@ -5,6 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.styles = undefined;
7
7
 
8
+ var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
9
+
10
+ var _defineProperty3 = _interopRequireDefault(_defineProperty2);
11
+
8
12
  var _extends2 = require('babel-runtime/helpers/extends');
9
13
 
10
14
  var _extends3 = _interopRequireDefault(_extends2);
@@ -43,6 +47,10 @@ var _propTypes2 = _interopRequireDefault(_propTypes);
43
47
 
44
48
  var _Table = require('material-ui/Table');
45
49
 
50
+ var _classnames = require('classnames');
51
+
52
+ var _classnames2 = _interopRequireDefault(_classnames);
53
+
46
54
  var _styles = require('../styles');
47
55
 
48
56
  var _BodyRow = require('./BodyRow');
@@ -61,12 +69,6 @@ var _constants = require('./constants');
61
69
 
62
70
  var cst = _interopRequireWildcard(_constants);
63
71
 
64
- var _HiTableHead = require('./HiTableHead');
65
-
66
- var _reactProptypeConditionalRequire = require('react-proptype-conditional-require');
67
-
68
- var _reactProptypeConditionalRequire2 = _interopRequireDefault(_reactProptypeConditionalRequire);
69
-
70
72
  function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
71
73
 
72
74
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -75,12 +77,14 @@ var styles = exports.styles = function styles(theme) {
75
77
  return {
76
78
  tbody: {
77
79
  position: 'relative',
78
- display: 'block' /* seperates the tbody from the header */
79
- , width: '100%',
80
+ width: '100%',
80
81
  overflowX: 'hidden',
81
82
  overflowY: 'auto',
82
83
  zIndex: 11
83
84
  },
85
+ tbodyFixedWidth: {
86
+ display: 'block' /* seperates the tbody from the header */
87
+ },
84
88
  tbodyRows: {
85
89
  backgroundColor: theme.palette.background3
86
90
  },
@@ -282,7 +286,8 @@ var HiTableBody = function (_React$Component) {
282
286
  groupByIds = _props.groupByIds,
283
287
  sortedColumnId = _props.sortedColumnId,
284
288
  lookupColumns = _props.lookupColumns,
285
- loading = _props.loading;
289
+ loading = _props.loading,
290
+ fixedColumnWidth = _props.fixedColumnWidth;
286
291
  var _state = this.state,
287
292
  openedParentRowId = _state.openedParentRowId,
288
293
  openedDetailsRowIdList = _state.openedDetailsRowIdList;
@@ -380,7 +385,8 @@ var HiTableBody = function (_React$Component) {
380
385
  row: row,
381
386
  sticky: sticky,
382
387
  tabId: tabId,
383
- view: view
388
+ view: view,
389
+ fixedColumnWidth: fixedColumnWidth
384
390
  });
385
391
 
386
392
  if (hasChildren && openedParentRowId === row.rowId) {
@@ -409,7 +415,8 @@ var HiTableBody = function (_React$Component) {
409
415
  view: view,
410
416
  dense: dense,
411
417
  sticky: sticky,
412
- isDetail: true
418
+ isDetail: true,
419
+ fixedColumnWidth: fixedColumnWidth
413
420
  };
414
421
 
415
422
  tableRows.push(_react2.default.createElement(_BodyRow2.default, (0, _extends3.default)({ key: row.rowId + '-' + detailRow.rowId }, detailRowProps)));
@@ -417,11 +424,13 @@ var HiTableBody = function (_React$Component) {
417
424
  }
418
425
  });
419
426
 
427
+ var tBodyClasses = (0, _classnames2.default)(classes.tbody, (0, _defineProperty3.default)({}, classes.tbodyFixedWidth, fixedColumnWidth));
428
+
420
429
  return _react2.default.createElement(
421
430
  _Table.TableBody,
422
431
  {
423
432
  id: tabId + '-body',
424
- className: classes.tbody,
433
+ className: tBodyClasses,
425
434
  style: (0, _extends3.default)({
426
435
  height: height
427
436
  }, loading && {
@@ -476,6 +485,11 @@ HiTableBody.propTypes = process.env.NODE_ENV !== "production" ? {
476
485
  * Densité d'affichage (joue sur la hauteur des lignes)
477
486
  */
478
487
  dense: _propTypes2.default.bool,
488
+ /**
489
+ * Fixe la taille des colonnes selon le type de vue
490
+ * Sinon les colonnes s'adaptent à l'espace disponible
491
+ */
492
+ fixedColumnWidth: _propTypes2.default.bool,
479
493
  /**
480
494
  * Hauteur du tableau (px)
481
495
  */
@@ -5,6 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.SORTED_COLUMN_ERROR_MESSAGE = exports.styles = undefined;
7
7
 
8
+ var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
9
+
10
+ var _defineProperty3 = _interopRequireDefault(_defineProperty2);
11
+
8
12
  var _extends2 = require('babel-runtime/helpers/extends');
9
13
 
10
14
  var _extends3 = _interopRequireDefault(_extends2);
@@ -43,6 +47,10 @@ var _reactProptypeConditionalRequire = require('react-proptype-conditional-requi
43
47
 
44
48
  var _reactProptypeConditionalRequire2 = _interopRequireDefault(_reactProptypeConditionalRequire);
45
49
 
50
+ var _classnames = require('classnames');
51
+
52
+ var _classnames2 = _interopRequireDefault(_classnames);
53
+
46
54
  var _Table = require('material-ui/Table');
47
55
 
48
56
  var _PlusCircle = require('mdi-material-ui/PlusCircle');
@@ -79,11 +87,13 @@ var styles = exports.styles = function styles(theme) {
79
87
  return {
80
88
  thead: {
81
89
  position: 'relative',
82
- display: 'block' /*seperates the header from the body allowing it to be positioned*/
83
- , width: '100%',
90
+ width: '100%',
84
91
  overflow: 'visible',
85
92
  zIndex: 12
86
93
  },
94
+ theadFixedWidth: {
95
+ display: 'block' /*seperates the header from the body allowing it to be positioned*/
96
+ },
87
97
  theadRow: {
88
98
  backgroundColor: theme.palette.background3,
89
99
  zIndex: 12
@@ -226,7 +236,8 @@ var HiTableHead = function (_React$Component) {
226
236
  sticky = _props.sticky,
227
237
  translations = _props.translations,
228
238
  view = _props.view,
229
- lookupColumns = _props.lookupColumns;
239
+ lookupColumns = _props.lookupColumns,
240
+ fixedColumnWidth = _props.fixedColumnWidth;
230
241
  var _state = this.state,
231
242
  hovered = _state.hovered,
232
243
  openedOrderColumns = _state.openedOrderColumns,
@@ -234,7 +245,7 @@ var HiTableHead = function (_React$Component) {
234
245
 
235
246
 
236
247
  var headerProps = (0, _extends3.default)({
237
- className: classes.thead
248
+ className: (0, _classnames2.default)(classes.thead, (0, _defineProperty3.default)({}, classes.theadFixedWidth, fixedColumnWidth))
238
249
  }, orderable && { onMouseEnter: this.handleEvent, onMouseLeave: this.handleEvent });
239
250
 
240
251
  var unfixedColumnIsSet = false,
@@ -301,7 +312,8 @@ var HiTableHead = function (_React$Component) {
301
312
  fixedWidth: fixed,
302
313
  align: column['align'],
303
314
  sticky: firstColumn && sticky,
304
- lookedUp: lookupColumns.includes(column.colId)
315
+ lookedUp: lookupColumns.includes(column.colId),
316
+ fixedColumnWidth: fixedColumnWidth
305
317
  });
306
318
  }
307
319
  }),
@@ -411,6 +423,11 @@ HiTableHead.propTypes = process.env.NODE_ENV !== "production" ? {
411
423
  * Active le filtre sur les colonnes filtrables
412
424
  */
413
425
  filterable: _propTypes2.default.bool,
426
+ /**
427
+ * Fixe la taille des colonnes selon le type de vue
428
+ * Sinon les colonnes s'adaptent à l'espace disponible
429
+ */
430
+ fixedColumnWidth: _propTypes2.default.bool,
414
431
  /**
415
432
  * Identifiant de la ou des colonnes sur la/lesquelles il y a une 'lookup' search
416
433
  */
@@ -0,0 +1,92 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import classnames from 'classnames';
4
+ import withStyles from '../styles/withStyles';
5
+ import ButtonBase from '../ButtonBase';
6
+
7
+ export const styles = theme => ({
8
+ dot: {
9
+ backgroundColor: theme.palette.dot.neutral,
10
+ borderRadius: '100%',
11
+ width: 12,
12
+ height: 12,
13
+ '&:hover': {
14
+ transform: 'scale(1.2)'
15
+ },
16
+ marginLeft: 12
17
+ },
18
+ dotActive: {
19
+ marginTop: 4,
20
+ marginLeft: 4,
21
+ '&:hover': {
22
+ transform: 'scale(1)'
23
+ }
24
+ },
25
+ dotValidated: {
26
+ backgroundColor: theme.palette.status[116]
27
+ },
28
+ dotRefused: {
29
+ backgroundColor: theme.palette.error.main
30
+ },
31
+ dotAround: {
32
+ backgroundColor: 'transparent',
33
+ borderRadius: '100%',
34
+ width: 24,
35
+ height: 24,
36
+ marginLeft: 6,
37
+ border: '2px solid ' + theme.palette.dot.neutral,
38
+ '&:hover': {
39
+ transform: 'scale(1.2)'
40
+ }
41
+ },
42
+ dotAroundValidated: {
43
+ border: '2px solid ' + theme.palette.status[116]
44
+ },
45
+ dotAroundRefused: {
46
+ border: '2px solid ' + theme.palette.error.main
47
+ }
48
+ });
49
+
50
+ class HiDot extends React.PureComponent {
51
+
52
+ render() {
53
+ const { active, status, classes, onClick } = this.props;
54
+
55
+ const dotAroundClass = classnames(classes.dotAround, {
56
+ [classes.dotAroundValidated]: status === 'validated',
57
+ [classes.dotAroundRefused]: status === 'refused'
58
+ });
59
+
60
+ const dotClassName = classnames(classes.dot, {
61
+ [classes.dotActive]: active,
62
+ [classes.dotRefused]: status === 'refused',
63
+ [classes.dotValidated]: status === 'validated'
64
+ });
65
+
66
+ return React.createElement(
67
+ ButtonBase,
68
+ { disableRipple: true, role: 'button', onClick: onClick },
69
+ active ? React.createElement(
70
+ 'div',
71
+ { className: dotAroundClass },
72
+ React.createElement('div', { className: dotClassName })
73
+ ) : React.createElement('div', { className: dotClassName })
74
+ );
75
+ }
76
+ }
77
+
78
+ HiDot.defaultProps = {
79
+ active: false,
80
+ status: 'unreviewed'
81
+ };
82
+ HiDot.propTypes = process.env.NODE_ENV !== "production" ? {
83
+ active: PropTypes.bool,
84
+ classes: PropTypes.object,
85
+ /**
86
+ * @ignore
87
+ */
88
+ className: PropTypes.string,
89
+ onClick: PropTypes.func,
90
+ status: PropTypes.oneOf(['refused', 'validated', 'unreviewed'])
91
+ } : {};
92
+ export default withStyles(styles, { name: 'MuiHiDot' })(HiDot);
@@ -0,0 +1,83 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import withStyles from '../styles/withStyles';
4
+ import HiDot from './HiDot';
5
+
6
+ export const styles = theme => ({
7
+ dotStepper: {
8
+ width: '100%',
9
+ maxWidth: 200,
10
+ display: 'flex',
11
+ flexDirection: 'row',
12
+ flexWrap: 'nowrap',
13
+ justifyContent: 'center',
14
+ alignItems: 'center'
15
+ }
16
+ });
17
+
18
+ class HiDotsStepper extends React.PureComponent {
19
+
20
+ constructor() {
21
+ super();
22
+
23
+ this.handleClick = activeStep => () => {
24
+ this.props.onChange(activeStep);
25
+ };
26
+
27
+ this.handleNavigation = activeStep => e => {
28
+ let nextStep = activeStep;
29
+ const { steps } = this.props;
30
+
31
+ if (e.key === 'ArrowLeft') nextStep -= 1;
32
+ if (e.key === 'ArrowRight') nextStep += 1;
33
+
34
+ nextStep = (nextStep + steps.length) % steps.length;
35
+
36
+ // Permet la navigation d'un Dot au suivant / précédent
37
+ document.querySelector(`div[tabIndex="${nextStep}"]`).focus();
38
+
39
+ this.props.onChange(nextStep);
40
+ };
41
+
42
+ this.handleClick = this.handleClick.bind(this);
43
+ this.handleNavigation = this.handleNavigation.bind(this);
44
+ }
45
+
46
+ render() {
47
+ const { classes, activeStep, steps } = this.props;
48
+
49
+ const listDots = steps.map((step, idx) => {
50
+ const { id, status } = step;
51
+ return React.createElement(
52
+ 'div',
53
+ {
54
+ key: id,
55
+ tabIndex: id,
56
+ className: classes.dotContainer,
57
+ role: 'navigation',
58
+ onKeyDown: this.handleNavigation(idx)
59
+ },
60
+ React.createElement(HiDot, {
61
+ status: status,
62
+ active: idx === activeStep,
63
+ onClick: this.handleClick(idx)
64
+ })
65
+ );
66
+ });
67
+
68
+ return React.createElement(
69
+ 'div',
70
+ { className: classes.dotStepper },
71
+ listDots
72
+ );
73
+ }
74
+ }
75
+
76
+ HiDotsStepper.propTypes = process.env.NODE_ENV !== "production" ? {
77
+ activeStep: PropTypes.number.isRequired,
78
+ classes: PropTypes.object,
79
+ className: PropTypes.string,
80
+ onChange: PropTypes.func,
81
+ steps: PropTypes.array.isRequired
82
+ } : {};
83
+ export default withStyles(styles, { name: 'MuiHiDotsStepper' })(HiDotsStepper);
@@ -0,0 +1 @@
1
+ export { default } from './HiDotsStepper';
@@ -0,0 +1,142 @@
1
+ import _objectWithoutProperties from 'babel-runtime/helpers/objectWithoutProperties';
2
+ import _extends from 'babel-runtime/helpers/extends';
3
+ // @inheritedComponent HiSuggestSelectField
4
+
5
+ import React from 'react';
6
+ import PropTypes from 'prop-types';
7
+ import HiSuggestSelectField from '../HiSelect/HiSuggestSelectField';
8
+
9
+ /**
10
+ * Champs input adresse pour formulaire
11
+ */
12
+ class HiAddressField extends React.Component {
13
+ constructor(props) {
14
+ super(props);
15
+ this.autocompleteService = null;
16
+
17
+ this.displaySuggestions = (predictions, status) => {
18
+ if (status !== 'OK') {
19
+ // Si l'API renvoie un statut différent de 'OK'
20
+ // (par exemple ZERO_RESULTS), pas de prédictions
21
+ } else {
22
+ // Sinon je mets à jour les options du champ avec les prédictions de GMaps
23
+ const options = [];
24
+ let isExact = false;
25
+ predictions.forEach(prediction => {
26
+ // Si le texte saisi est identique à une des propositions de GMaps,
27
+ // on estime que la valeur de l'adresse est exacte,
28
+ // même sans clic sur une proposition
29
+ isExact = prediction.description === this.value ? true : isExact;
30
+ options.push({
31
+ id: prediction.id,
32
+ label: prediction.description,
33
+ labelHighlight: prediction.description.replace(new RegExp(this.value, 'gi'), '<strong>$&</strong>'),
34
+ icon: prediction.types.indexOf('establishment') >= 0 ? 'domain' : 'map_marker',
35
+ type: 'icon'
36
+ });
37
+ }, this);
38
+ this.setState({ options, isExact });
39
+ }
40
+ };
41
+
42
+ this.state = {
43
+ options: [],
44
+ isExact: false
45
+ };
46
+
47
+ this.handleSearch = this.handleSearch.bind(this);
48
+ this.handleSelect = this.handleSelect.bind(this);
49
+ this.handleReset = this.handleReset.bind(this);
50
+ this.displaySuggestions = this.displaySuggestions.bind(this);
51
+ }
52
+
53
+ /**
54
+ * Au chargement du composant, je définis mon service autocomplete GMaps
55
+ */
56
+ componentDidMount() {
57
+ this.autocompleteService = new google.maps.places.AutocompleteService();
58
+ }
59
+
60
+ handleReset() {
61
+ this.props.onReset();
62
+ this.setState({
63
+ options: [],
64
+ isExact: false
65
+ });
66
+ }
67
+
68
+ handleSearch(event) {
69
+ // Je vérifie que le champ n'est pas vide car l'API lève une exception en cas d'input vide
70
+ if (event.target.value) {
71
+ // Liste des types à rechercher. Voir https://developers.google.com/places/web-service/autocomplete?hl=fr#place_types (ex : ['establishement', 'address']
72
+ const types = [];
73
+ // Liste des codes ISO Alpha-2 des pays où il faut rechercher (ex : ['fr', 'us'])
74
+ const countries = [];
75
+ // À chaque changement, la méthode getPlacesPredictions appelle la méthode
76
+ // displaySuggestions en lui fournissant un tableau de 5 prédictions
77
+ this.value = event.target.value;
78
+ if (this.autocompleteService) {
79
+ this.autocompleteService.getPlacePredictions({
80
+ input: event.target.value,
81
+ types,
82
+ componentRestrictions: { country: countries }
83
+ }, this.displaySuggestions);
84
+ } else {
85
+ // Dans le cas où le service ne peut pas se charger (mode test par exemple).
86
+ this.displaySuggestions([], 'EMPTY_RESULT');
87
+ }
88
+ }
89
+ this.props.onSearch(event);
90
+ // Mise à jour du texte dans l'input
91
+ this.setState(_extends({}, !event.target.value && {
92
+ options: []
93
+ }));
94
+ }
95
+
96
+ handleSelect(event, value) {
97
+ // Mise à jour de la valeur du champ + la valeur de l'adresse est exacte
98
+ this.setState({ options: [], isExact: true });
99
+ this.props.onSelect(event, value.label);
100
+ }
101
+
102
+ render() {
103
+ const _props = this.props,
104
+ { exactOnly, onSearch, onReset, onSelect } = _props,
105
+ otherProps = _objectWithoutProperties(_props, ['exactOnly', 'onSearch', 'onReset', 'onSelect']);
106
+ const { options, isExact } = this.state;
107
+
108
+ // On met le champ en erreur si une adresse exacte est éxigée
109
+ // et si l'adresse courante n'est pas complète
110
+ const showError = exactOnly && !isExact;
111
+
112
+ return React.createElement(HiSuggestSelectField, _extends({
113
+ options: options,
114
+ onSearch: this.handleSearch,
115
+ onReset: this.handleReset,
116
+ onSelect: this.handleSelect,
117
+ isExact: isExact,
118
+ error: showError
119
+ }, otherProps));
120
+ }
121
+ }
122
+
123
+ HiAddressField.propTypes = process.env.NODE_ENV !== "production" ? {
124
+ /**
125
+ * Est-ce qu'on n'accepte que les adresses trouvées par GMaps
126
+ */
127
+ exactOnly: PropTypes.bool,
128
+ /**
129
+ * Callback function called to empty the field.
130
+ */
131
+ onReset: PropTypes.func,
132
+ /**
133
+ * Callback function called when we write in the input.
134
+ */
135
+ onSearch: PropTypes.func,
136
+ /**
137
+ * Callback function called when a suggestion is selected.
138
+ */
139
+ onSelect: PropTypes.func
140
+ } : {};
141
+
142
+ export default HiAddressField;
@@ -50,7 +50,7 @@ export const styles = theme => ({
50
50
  focused: {},
51
51
  error: {
52
52
  border: `1px solid ${theme.palette.negative.normal}`,
53
- paddingLeft: 0,
53
+ paddingLeft: 8,
54
54
  borderRadius: 2
55
55
  },
56
56
  startAdornment: {
@@ -4,4 +4,5 @@ export { default as HiFormLabel } from './HiFormLabel';
4
4
  export { default as HiInput } from './HiInput';
5
5
  export { default as HiPasswordField } from './HiPasswordField';
6
6
  export { default as HiTextField } from './HiTextField';
7
- export { default as HiSearchField } from './HiSearchField';
7
+ export { default as HiSearchField } from './HiSearchField';
8
+ export { default as HiAddressField } from './HiAddressField';