imbric-theme 0.3.4 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -75,7 +75,7 @@ Navbar.propTypes = {
75
75
  children: PropTypes.any.isRequired,
76
76
  viewTabsNav: PropTypes.bool,
77
77
  viewOptionsNav: PropTypes.bool,
78
- linkLogout: PropTypes.string,
78
+ linkLogout: PropTypes.func,
79
79
  }
80
80
 
81
81
  Navbar.defaultProps = {
@@ -10,8 +10,10 @@ import Icon from '../../atoms/Icon'
10
10
  import { Horizontal, Vertical } from '../../layout/Spacer/components'
11
11
 
12
12
 
13
- export const ColumnTable = ({ getStyles, children, sortable, accessor, handleSorting, isFilter, columnUppercase, idInput, typeInput, nameInput, placeholder, value, onChange }) => {
13
+ export const ColumnTable = ({ getStyles, handleSorting, columnUppercase, onChangeInput, columnsData }) => {
14
14
 
15
+ const [sortable, setSortable] = useState(true);
16
+ const [accessor, setAccessor] = useState("");
15
17
  const [sortField, setSortField] = useState("");
16
18
  const [order, setOrder] = useState("asc");
17
19
 
@@ -33,91 +35,90 @@ export const ColumnTable = ({ getStyles, children, sortable, accessor, handleSor
33
35
 
34
36
 
35
37
  return (
36
- <th
37
- onClick={sortable ? () => handleSortingChange(accessor) : null}
38
- className={getStyles('column-table', {
39
- 'column-uppercase': columnUppercase,
40
- })}>
41
-
42
-
43
- <Paragraph
44
- size="xs"
45
- isInline
46
- >
47
- {children}
48
- </Paragraph>
49
-
50
- <Horizontal size="xs" />
51
-
52
- {cl === 'default' ?
53
- (<Icon
54
- className=""
55
- name="angleUpDown"
56
- size="xs"
57
- />
58
- ) : cl === '' ? null
59
-
60
- : cl === 'angleDown'
61
- ? (<Icon
62
- className=""
63
- name="angleDown"
64
- size="xs"
65
- />
66
- )
67
- : (<Icon
68
- className=""
69
- name="angleUp"
70
- size="xs"
71
- />
72
- )
73
- }
74
-
75
-
76
- <Vertical size="xs" />
77
-
78
- {isFilter ? (
79
-
80
- <Input
81
- isInputFilter
82
- id={idInput}
83
- value={''}
84
- type={typeInput}
85
- name={nameInput}
86
- onChange={onChange}
87
- placeholder={placeholder}
88
- />) : null
89
- }
90
-
91
- </th>
38
+
39
+ <div className={getStyles('tbl-header')}>
40
+ <table className={getStyles('table')} cellPadding="0" cellSpacing="0" border="0">
41
+ <thead>
42
+ <tr>
43
+
44
+ {columnsData.map((item) => (
45
+ item.activeView ?
46
+ // setSortable(item.sortable)
47
+ // setAccessor()
48
+ (<th
49
+ key={item.idInput}
50
+ className={getStyles('column-table', {
51
+ 'column-uppercase': columnUppercase,
52
+ })}>
53
+
54
+ <span onClick={item.sortable ? () => handleSortingChange(item.accessor) : null}>
55
+ <Paragraph
56
+ size="xs"
57
+ isInline
58
+ >
59
+ {item.title}
60
+ </Paragraph>
61
+
62
+ <Horizontal size="xs" />
63
+
64
+ {cl === "default" ?
65
+ <Icon
66
+ name="angleUpDown"
67
+ size="xs"
68
+ />
69
+ : cl === "" ? null
70
+
71
+ : cl === "angleDown"
72
+ ? <Icon
73
+ name="angleDown"
74
+ size="xs"
75
+ />
76
+
77
+ : <Icon
78
+ name="angleUp"
79
+ size="xs"
80
+ />
81
+
82
+ }
83
+ </span>
84
+
85
+
86
+ <Vertical size="xs" />
87
+
88
+ {item.viewIsFilter ? (
89
+
90
+ <Input
91
+ isInputFilter
92
+ id={item.idInput}
93
+ type={item.typeFilter}
94
+ name={item.nameInput}
95
+ onChange={onChangeInput}
96
+ placeholder={item.placeholder}
97
+ />) : null
98
+ }
99
+
100
+ </th>
101
+ ) : null
102
+ ))}
103
+
104
+ </tr>
105
+ </thead>
106
+ </table>
107
+ </div>
108
+
92
109
  )
93
110
  }
94
111
 
95
112
  ColumnTable.propTypes = {
96
- sortable: PropTypes.bool.isRequired,
97
- accessor: PropTypes.string.isRequired,
98
113
  handleSorting: PropTypes.func.isRequired,
99
- children: PropTypes.string.isRequired,
100
114
  getStyles: PropTypes.func.isRequired,
101
- isFilter: PropTypes.bool,
102
115
  columnUppercase: PropTypes.bool,
103
- idInput: PropTypes.string,
104
- typeInput: PropTypes.oneOf(options.typeInput),
105
- nameInput: PropTypes.string,
106
- placeholder: PropTypes.string,
107
116
  }
108
117
 
109
118
  ColumnTable.defaultProps = {
110
119
  getStyles: () => { },
111
- children: 'NameTh',
112
- sortable: true,
113
- accessor: 'prueba',
114
120
  handleSorting: () => { },
115
121
  columnUppercase: false,
116
- isFilter: true,
117
- idInput: 'prueba',
118
- typeInput: 'text',
119
- nameInput: 'prueba',
120
- placeholder: 'placeholder'
121
122
  }
122
123
 
123
124
  export default withStyles(styles)(ColumnTable)
@@ -6,4 +6,17 @@
6
6
 
7
7
  .column-uppercase {
8
8
  text-transform: uppercase;
9
+ }
10
+
11
+ .table {
12
+ width: 100%;
13
+ table-layout: fixed;
14
+
15
+ }
16
+
17
+ .tbl-header {
18
+ /* background-color: rgba(255, 255, 255, 0.3); */
19
+ /* background-color: -webkit-linear-gradient(left, #25c481, #25b7c4);
20
+ background-color: linear-gradient(to right, #25c481, #25b7c4); */
21
+ border: 1px solid rgba(0, 0, 0, 0.1);
9
22
  }
@@ -13,14 +13,11 @@ export default {
13
13
  title: 'Molecules/ColumnTable',
14
14
  component: ColumnTable,
15
15
  args: {
16
- children: 'NameTh',
17
- sortable: true,
18
- accessor: 'prueba',
19
16
  columnUppercase: false,
20
- isFilter: true
17
+ columnsData: options.columns,
21
18
  },
22
19
  argTypes: {
23
- typeInput: getOptionsArgTypes(options.typeInput),
20
+ // typeInput: getOptionsArgTypes(options.typeInput),
24
21
  },
25
22
  }
26
23
 
@@ -1 +1,111 @@
1
- export const options = { typeInput: ['text', 'password', 'date', 'number'], }
1
+ export const options = {
2
+ typeInput: ['text', 'password', 'date', 'number'],
3
+
4
+ columns: [
5
+ {
6
+ activeView: true,
7
+ sortable: true,
8
+ accessor: 'timeBookingStartRealTimestamp',
9
+ subAccessor: '',
10
+ title: 'Fecha',
11
+ viewIsFilter: true,
12
+ typeFilter: 'date',
13
+ subTypeFilter: false,
14
+ idInput: 'fecha',
15
+ nameInput: 'Fecha',
16
+ placeholder: 'Fecha'
17
+ },
18
+ {
19
+ activeView: true,
20
+ sortable: true,
21
+ accessor: 'passengerName',
22
+ subAccessor: '',
23
+ title: 'Pasajero',
24
+ viewIsFilter: true,
25
+ typeFilter: 'text',
26
+ subTypeFilter: false,
27
+ idInput: 'pasajero',
28
+ nameInput: 'Pasajero',
29
+ placeholder: 'Pasajero'
30
+ },
31
+ {
32
+ activeView: true,
33
+ sortable: true,
34
+ accessor: 'origin',
35
+ subAccessor: 'addressField',
36
+ title: 'Recogida',
37
+ viewIsFilter: true,
38
+ typeFilter: 'text',
39
+ subTypeFilter: false,
40
+ idInput: 'recogida',
41
+ nameInput: 'Recogida',
42
+ placeholder: 'Recogida'
43
+ },
44
+ {
45
+ activeView: true,
46
+ sortable: true,
47
+ accessor: 'destination',
48
+ subAccessor: 'addressField',
49
+ title: 'Destino',
50
+ viewIsFilter: true,
51
+ typeFilter: 'text',
52
+ subTypeFilter: false,
53
+ idInput: 'destino',
54
+ nameInput: 'Destino',
55
+ placeholder: 'Destino'
56
+ },
57
+ {
58
+ activeView: true,
59
+ sortable: true,
60
+ accessor: 'priceCustomer',
61
+ subAccessor: '',
62
+ title: 'Precio',
63
+ viewIsFilter: true,
64
+ typeFilter: 'text',
65
+ subTypeFilter: true,
66
+ idInput: 'precio',
67
+ nameInput: 'Precio',
68
+ placeholder: 'Precio'
69
+ },
70
+ {
71
+ activeView: false,
72
+ sortable: true,
73
+ accessor: 'id',
74
+ subAccessor: '',
75
+ title: 'ID',
76
+ viewIsFilter: true,
77
+ typeFilter: 'number',
78
+ subTypeFilter: false,
79
+ idInput: 'id',
80
+ nameInput: 'id',
81
+ placeholder: 'id'
82
+ },
83
+ {
84
+ activeView: false,
85
+ sortable: true,
86
+ accessor: 'idService',
87
+ subAccessor: '',
88
+ title: 'ID Reserva',
89
+ viewIsFilter: true,
90
+ typeFilter: 'number',
91
+ subTypeFilter: false,
92
+ idInput: 'IDReserva',
93
+ nameInput: 'ID Reserva',
94
+ placeholder: 'ID Reserva'
95
+ },
96
+ {
97
+ activeView: false,
98
+ sortable: true,
99
+ accessor: 'idSupplier',
100
+ subAccessor: '',
101
+ title: 'ID Proveedor',
102
+ viewIsFilter: true,
103
+ typeFilter: 'number',
104
+ subTypeFilter: false,
105
+ idInput: 'IDProveedor',
106
+ nameInput: 'ID Proveedor',
107
+ placeholder: 'ID Proveedor'
108
+ },
109
+ ],
110
+
111
+ }
@@ -11,7 +11,7 @@ import moment from 'moment'
11
11
  import Label from '../../atoms/Label';
12
12
  import { Horizontal, Vertical } from '../../layout/Spacer/components'
13
13
  import Icon from '../../atoms/Icon';
14
-
14
+ import useStateDate from '../../hook/useStateDate';
15
15
  // import 'react-date-range/dist/styles.css'; // main css file
16
16
  // import 'react-date-range/dist/theme/default.css'; // theme css file
17
17
 
@@ -32,34 +32,45 @@ import {
32
32
  } from "date-fns";
33
33
 
34
34
 
35
- export const DatePicker = ({ getStyles, isLayoutDate }) => {
35
+
36
+ export const DatePicker = ({ getStyles, isLayoutDate, onChangeRange }) => {
36
37
 
37
38
  const [isShowCalendar, setShowCalendar] = useState(false);
38
39
 
39
- const [state, setState] = useState([
40
- {
41
- startDate: addDays(new Date(), -59),
42
- endDate: new Date(),
43
- key: 'selection',
44
- }
45
40
 
46
- ]);
41
+ const { state, setState } = useStateDate();
42
+
43
+
44
+ // const [state, setState] = useState([
45
+ // {
46
+ // startDate: addDays(new Date(), -59),
47
+ // endDate: new Date(),
48
+ // key: 'selection',
49
+ // }
50
+
51
+ // ]);
47
52
 
48
53
  moment.locale('es')
49
54
  const format = "DD/MMMM/YYYY";
50
55
 
56
+
57
+ const handleSelectRange = (item) => {
58
+ setState([item.selection])
59
+ }
60
+
51
61
  const handleSelect = (date) => {
52
62
  console.log(date); // native Date object
53
63
  console.log(state)
54
- console.log(date)
55
64
  }
56
65
 
57
66
  const handleClickOpenCalendar = () => {
58
67
  setShowCalendar(true)
68
+ // console.log(state)
59
69
  }
60
70
 
61
71
  const handleClickCloseCalendar = () => {
62
72
  setShowCalendar(false)
73
+ console.log(state)
63
74
  };
64
75
 
65
76
 
@@ -76,7 +87,7 @@ export const DatePicker = ({ getStyles, isLayoutDate }) => {
76
87
 
77
88
  (<DateRange
78
89
  editableDateInputs={true}
79
- onChange={item => setState([item.selection])}
90
+ onChange={item => useStateDate([item.selection])}
80
91
  moveRangeOnFirstSelection={false}
81
92
  ranges={state}
82
93
  />)
@@ -113,7 +124,7 @@ export const DatePicker = ({ getStyles, isLayoutDate }) => {
113
124
  <DateRangePicker
114
125
  locale={locales.es}
115
126
  dateDisplayFormat='d MMMM yyyy'
116
- onChange={item => setState([item.selection])}
127
+ onChange={ item => {handleSelectRange(item); onChangeRange(item);}}
117
128
  showSelectionPreview={false}
118
129
  moveRangeOnFirstSelection={false}
119
130
  months={2}
@@ -200,7 +211,7 @@ export const DatePicker = ({ getStyles, isLayoutDate }) => {
200
211
 
201
212
  {/* <DefinedRange
202
213
  locale={locales.es}
203
- onChange={item => setState([item.selection])}
214
+ onChange={item => useStateDate([item.selection])}
204
215
  ranges={state}
205
216
  /> */}
206
217
  </div>
@@ -213,11 +224,13 @@ export const DatePicker = ({ getStyles, isLayoutDate }) => {
213
224
  DatePicker.propTypes = {
214
225
  getStyles: PropTypes.func.isRequired,
215
226
  isLayoutDate: PropTypes.oneOf(options.typeLayoutDate),
227
+ onChangeRange: PropTypes.func
216
228
  }
217
229
 
218
230
  DatePicker.defaultProps = {
219
231
  getStyles: () => { },
220
- isLayoutDate: 'Calendar'
232
+ isLayoutDate: 'Calendar',
233
+ onChangeRange: () => { },
221
234
  }
222
235
 
223
236
  export default withStyles(styles)(DatePicker)
@@ -4,7 +4,7 @@
4
4
 
5
5
  .date-picker-input {
6
6
  display: flex;
7
- width: 70%;
7
+ /* width: 70%; */
8
8
  }
9
9
 
10
10
  .modalDatePickerRange {
@@ -0,0 +1,47 @@
1
+ import React, { useEffect } from "react";
2
+ import PropTypes from 'prop-types'
3
+
4
+ import styles from './FooterTable.module.css'
5
+ import { options } from './constants'
6
+ import withStyles from '../../hocs/withStyles'
7
+
8
+ export const FooterTable = ({ getStyles, range, setPage, page, slice }) => {
9
+ useEffect(() => {
10
+ if (slice.length < 1 && page !== 1) {
11
+ setPage(page - 1);
12
+ }
13
+ }, [slice, page, setPage]);
14
+
15
+ return (
16
+ <div className={getStyles('footer-table')}>
17
+
18
+ <div className={styles.tableFooter}>
19
+ {range.map((el, index) => (
20
+ <button
21
+ key={index}
22
+ className={`${styles.button} ${page === el ? styles.activeButton : styles.inactiveButton
23
+ }`}
24
+ onClick={() => setPage(el)}
25
+ >
26
+ {el}
27
+ </button>
28
+ ))}
29
+ </div>
30
+
31
+ </div>
32
+
33
+
34
+ )
35
+ }
36
+
37
+ FooterTable.propTypes = {
38
+ // children: PropTypes.node.isRequired,
39
+ getStyles: PropTypes.func.isRequired,
40
+ // type: PropTypes.oneOf(options.types),
41
+ }
42
+
43
+ FooterTable.defaultProps = {
44
+ getStyles: () => { },
45
+ }
46
+
47
+ export default withStyles(styles)(FooterTable)
@@ -0,0 +1,37 @@
1
+ .footer-table {
2
+ display: flex;
3
+ }
4
+
5
+ .tableFooter {
6
+ background-color: #f1f1f1;
7
+ padding: 8px 0px;
8
+ width: 100%;
9
+ font-weight: 500;
10
+ text-align: left;
11
+ font-size: 16px;
12
+ color: #2c3e50;
13
+ border-bottom-left-radius: 15px;
14
+ border-bottom-right-radius: 15px;
15
+ display: flex;
16
+ align-items: center;
17
+ justify-content: center;
18
+ }
19
+
20
+ .button {
21
+ border: none;
22
+ padding: 7px 14px;
23
+ border-radius: 10px;
24
+ cursor: pointer;
25
+ margin-right: 4px;
26
+ margin-left: 4px;
27
+ }
28
+
29
+ .activeButton {
30
+ color: white;
31
+ background: #185adb;
32
+ }
33
+
34
+ .inactiveButton {
35
+ color: #2c3e50;
36
+ background: #f9f9f9;
37
+ }
@@ -0,0 +1,23 @@
1
+ import { FooterTable, styles, options } from '.'
2
+
3
+ import {
4
+ getTemplate,
5
+ getListTemplate,
6
+ getOptionsArgTypes,
7
+ } from '../../helpers/storybook'
8
+
9
+ const Template = getTemplate(FooterTable, styles)
10
+ const ListTemplate = getListTemplate(FooterTable, styles)
11
+
12
+ export default {
13
+ title: 'Molecules/FooterTable',
14
+ component: FooterTable,
15
+ args: {},
16
+ argTypes: {
17
+ // types: getOptionsArgTypes(options.types),
18
+ },
19
+ }
20
+
21
+ export const Default = Template.bind({})
22
+ // export const List = ListTemplate.bind({})
23
+ // List.args = { items: options.types.map((type) => ({ type })) }
@@ -0,0 +1 @@
1
+ export const options = { types: [] }
@@ -0,0 +1,3 @@
1
+ export { default, FooterTable } from './FooterTable'
2
+ export { options } from './constants'
3
+ export { default as styles } from './FooterTable.module.css'
@@ -5,18 +5,64 @@ import styles from './RowTable.module.css'
5
5
  import { options } from './constants'
6
6
  import withStyles from '../../hocs/withStyles'
7
7
 
8
- export const RowTable = ({ children, getStyles }) => {
9
- return <div className={getStyles('row-table')}>{children}</div>
8
+ import Moment from 'react-moment'
9
+
10
+ export const RowTable = ({ getStyles, slice, columnsData }) => {
11
+ return (
12
+ <div className={getStyles('tbl-content')}>
13
+ <table className={getStyles('table')} cellPadding="0" cellSpacing="0" border="0">
14
+ <tbody>
15
+ {slice.map((item, index) => (
16
+
17
+ <tr key={index}>
18
+ {columnsData.map((itemTd) => (
19
+ itemTd.activeView ?
20
+
21
+ (
22
+ itemTd.subAccessor !== '' ?
23
+
24
+ <td className={getStyles('td')} key={[itemTd.accessor]}>{item[itemTd.accessor][itemTd.subAccessor]}</td> :
25
+
26
+ itemTd.typeFilter === 'date' ?
27
+
28
+ <td className={getStyles('td')} key={[itemTd.accessor]}>
29
+ <Moment format="DD/MM/YYYY hh:mm:ss">
30
+ {item[itemTd.accessor]}
31
+ </Moment>
32
+ </td>
33
+
34
+ : itemTd.typeFilter === 'number' ?
35
+
36
+ itemTd.subTypeFilter ?
37
+
38
+ <td className={getStyles('td')} key={[itemTd.accessor]}>{item[itemTd.accessor].toFixed(2).toString().replace(/\./g, ',')} €</td>
39
+ :
40
+ <td className={getStyles('td')} key={[itemTd.accessor]}>{item[itemTd.accessor]}</td>
41
+
42
+ : itemTd.subTypeFilter ?
43
+
44
+ <td className={getStyles('td')} key={[itemTd.accessor]}>{item[itemTd.accessor].toString().replace(/\./g, ',').slice(0, 5)} €</td>
45
+ :
46
+ <td className={getStyles('td')} key={[itemTd.accessor]}>{item[itemTd.accessor]}</td>
47
+
48
+ ) : null
49
+ ))}
50
+ </tr>
51
+
52
+ ))}
53
+ </tbody>
54
+ </table>
55
+ </div>
56
+ )
10
57
  }
11
58
 
12
59
  RowTable.propTypes = {
13
- children: PropTypes.node.isRequired,
14
60
  getStyles: PropTypes.func.isRequired,
15
61
  type: PropTypes.oneOf(options.types),
16
62
  }
17
63
 
18
64
  RowTable.defaultProps = {
19
- getStyles: () => {},
65
+ getStyles: () => { },
20
66
  }
21
67
 
22
68
  export default withStyles(styles)(RowTable)
@@ -1,3 +1,22 @@
1
- .row-table {
2
- display: flex;
1
+ .table {
2
+ width: 100%;
3
+ table-layout: fixed;
4
+
3
5
  }
6
+
7
+ .tbl-content {
8
+ height: max-content;
9
+ overflow-x: auto;
10
+ margin-top: 0px;
11
+ border: 1px solid rgba(0, 0, 0, 0.1);
12
+ }
13
+
14
+ .td {
15
+ padding: 15px;
16
+ text-align: left;
17
+ vertical-align: middle;
18
+ font-weight: 300;
19
+ font-size: 12px;
20
+ color: var(--color-font-base);
21
+ border-bottom: solid 1px rgba(0, 0, 0, 0.1);
22
+ }
@@ -12,12 +12,15 @@ const ListTemplate = getListTemplate(RowTable, styles)
12
12
  export default {
13
13
  title: 'Molecules/RowTable',
14
14
  component: RowTable,
15
- args: {},
15
+ args: {
16
+ slice: options.bookings,
17
+ columnsData: options.columns,
18
+ },
16
19
  argTypes: {
17
- types: getOptionsArgTypes(options.types),
20
+ // types: getOptionsArgTypes(options.types),
18
21
  },
19
22
  }
20
23
 
21
24
  export const Default = Template.bind({})
22
- export const List = ListTemplate.bind({})
23
- List.args = { items: options.types.map((type) => ({ type })) }
25
+ // export const List = ListTemplate.bind({})
26
+ // List.args = { items: options.types.map((type) => ({ type })) }