@urbanos/react-discovery-ui 2.1.56 → 2.1.57

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.
@@ -51,6 +51,7 @@ var CodeEditor = /*#__PURE__*/function (_React$Component) {
51
51
  },
52
52
  padding: 10,
53
53
  onBlur: this.props.onBlur,
54
+ ignoreTabKey: true,
54
55
  style: {
55
56
  fontFamily: '"Fira code", "Fira Mono", monospace',
56
57
  fontSize: 12,
@@ -175,8 +175,6 @@ var DataTable = function DataTable(_ref) {
175
175
  if (coords) activateCell(coords.row, coords.col);
176
176
  };
177
177
  var dataRows = table.getRowModel().rows;
178
- var pageIndex = pagination.pageIndex;
179
- var pageSize = pagination.pageSize;
180
178
  return /*#__PURE__*/_react.default.createElement("div", {
181
179
  style: {
182
180
  height: '400px',
@@ -184,30 +182,22 @@ var DataTable = function DataTable(_ref) {
184
182
  }
185
183
  }, /*#__PURE__*/_react.default.createElement("table", {
186
184
  ref: tableRef,
187
- role: "table",
188
185
  tabIndex: 0,
189
- "aria-activedescendant": activeCellId,
190
- "aria-rowcount": dataRows.length + 1,
191
- "aria-colcount": columns.length,
192
186
  style: {
193
- width: table.getTotalSize()
187
+ width: table.getTotalSize() == 0 ? '100%' : table.getTotalSize()
194
188
  },
195
189
  onClick: handleTableClick
196
190
  }, /*#__PURE__*/_react.default.createElement("caption", null, datasetName ? "".concat(datasetName, " Dataset Preview") : 'Dataset Preview'), /*#__PURE__*/_react.default.createElement("thead", null, table.getHeaderGroups().map(function (headerGroup) {
197
191
  return /*#__PURE__*/_react.default.createElement("tr", {
198
- key: headerGroup.id,
199
- role: "row",
200
- "aria-rowindex": 1
192
+ key: headerGroup.id
201
193
  }, headerGroup.headers.map(function (header, colIndex) {
202
194
  var _header$column$column;
203
195
  return /*#__PURE__*/_react.default.createElement("th", {
204
196
  key: header.id,
205
197
  id: colHeaderId(colIndex),
206
- role: "columnheader",
207
198
  scope: "col",
208
199
  "data-row": 0,
209
200
  "data-col": colIndex,
210
- "aria-colindex": colIndex + 1,
211
201
  className: "".concat(((_header$column$column = header.column.columnDef.meta) === null || _header$column$column === void 0 ? void 0 : _header$column$column.headerClassName) || 'table-header').concat(activeCellId === colHeaderId(colIndex) ? ' active-cell' : ''),
212
202
  style: {
213
203
  width: header.getSize(),
@@ -220,40 +210,30 @@ var DataTable = function DataTable(_ref) {
220
210
  "aria-hidden": "true"
221
211
  }));
222
212
  }));
223
- })), /*#__PURE__*/_react.default.createElement("tbody", null, dataRows.length === 0 ? /*#__PURE__*/_react.default.createElement("tr", {
224
- role: "row"
225
- }, /*#__PURE__*/_react.default.createElement("td", {
226
- role: "gridcell",
227
- colSpan: columns.length,
213
+ })), /*#__PURE__*/_react.default.createElement("tbody", null, dataRows.length === 0 ? /*#__PURE__*/_react.default.createElement("tr", null, /*#__PURE__*/_react.default.createElement("td", {
214
+ colSpan: Math.max(columns.length, 1),
228
215
  className: "no-data-message"
229
216
  }, "No rows found")) : dataRows.map(function (row, rowIndex) {
230
217
  var tableRow = rowIndex + 1;
231
- var ariaRowIndex = pageIndex * pageSize + rowIndex + 2; // +1 for header, +1 for 1-based
232
218
  return /*#__PURE__*/_react.default.createElement("tr", {
233
219
  key: row.id,
234
- role: "row",
235
- "aria-rowindex": ariaRowIndex,
236
220
  className: rowIndex % 2 === 0 ? 'striped-row' : ''
237
221
  }, row.getVisibleCells().map(function (cell, colIndex) {
238
222
  var content = (0, _reactTable.flexRender)(cell.column.columnDef.cell, cell.getContext());
239
223
  return colIndex === 0 ? /*#__PURE__*/_react.default.createElement("th", {
240
224
  key: cell.id,
241
225
  id: rowHeaderId(rowIndex),
242
- role: "rowheader",
243
226
  scope: "row",
244
227
  headers: colHeaderId(0),
245
228
  "data-row": tableRow,
246
229
  "data-col": colIndex,
247
- "aria-colindex": 1,
248
230
  className: "row-header".concat(activeCellId === rowHeaderId(rowIndex) ? ' active-cell' : '')
249
231
  }, content) : /*#__PURE__*/_react.default.createElement("td", {
250
232
  key: cell.id,
251
233
  id: dataCellId(rowIndex, colIndex),
252
- role: "gridcell",
253
234
  headers: "".concat(colHeaderId(colIndex), " ").concat(rowHeaderId(rowIndex)),
254
235
  "data-row": tableRow,
255
236
  "data-col": colIndex,
256
- "aria-colindex": colIndex + 1,
257
237
  className: activeCellId === dataCellId(rowIndex, colIndex) ? 'active-cell' : undefined
258
238
  }, content);
259
239
  }));
@@ -266,6 +246,9 @@ var DataTable = function DataTable(_ref) {
266
246
  disabled: !table.getCanPreviousPage(),
267
247
  "aria-label": "Previous page"
268
248
  }, '<'), /*#__PURE__*/_react.default.createElement("span", null, "Page", ' ', /*#__PURE__*/_react.default.createElement("input", {
249
+ id: "page-number-input",
250
+ type: "number",
251
+ label: "Page number input",
269
252
  "data-testid": "page-number-input",
270
253
  value: table.getState().pagination.pageIndex + 1,
271
254
  onChange: function onChange(e) {
@@ -88,7 +88,6 @@ var MetadataTable = function MetadataTable(_ref) {
88
88
  })));
89
89
  };
90
90
  var _default = exports.default = function _default(_ref2) {
91
- var _dataset$homepage, _dataset$sourceUrl, _dataset$license, _dataset$license2;
92
91
  var dataset = _ref2.dataset;
93
92
  if (!dataset) return /*#__PURE__*/_react.default.createElement("div", null);
94
93
  var referenceUrls = dataset.referenceUrls || [];
@@ -119,10 +118,8 @@ var _default = exports.default = function _default(_ref2) {
119
118
  }, {
120
119
  Field: 'Data Dictionary URL',
121
120
  Value: dataset.describedByUrl ? /*#__PURE__*/_react.default.createElement("a", {
122
- role: "link",
123
121
  href: dataset.describedByUrl,
124
122
  target: "_blank",
125
- "aria-label": "Data Dictionary URL",
126
123
  rel: "noreferrer"
127
124
  }, dataset.describedByUrl) : /*#__PURE__*/_react.default.createElement("span", null, "Unavailable")
128
125
  }, {
@@ -137,46 +134,38 @@ var _default = exports.default = function _default(_ref2) {
137
134
  }, {
138
135
  Field: 'Homepage URL',
139
136
  Value: dataset.homepage ? /*#__PURE__*/_react.default.createElement("a", {
140
- role: "link",
141
137
  href: dataset.homepage,
142
138
  target: "_blank",
143
- "aria-label": "Homepage URL",
144
139
  rel: "noreferrer"
145
- }, (_dataset$homepage = dataset.homepage) !== null && _dataset$homepage !== void 0 ? _dataset$homepage : 'Unavailable') : /*#__PURE__*/_react.default.createElement("span", null, "Unavailable")
140
+ }, dataset.homepage) : /*#__PURE__*/_react.default.createElement("span", null, "Unavailable")
146
141
  }, {
147
142
  Field: 'Related Documents',
148
143
  Value: referenceUrls.length === 0 ? /*#__PURE__*/_react.default.createElement("span", null, "None") : referenceUrls.map(function (url) {
149
144
  return /*#__PURE__*/_react.default.createElement("div", {
150
145
  key: url
151
146
  }, /*#__PURE__*/_react.default.createElement("a", {
152
- role: "link",
153
147
  href: url,
154
148
  target: "_blank",
155
- "aria-label": "Related Document URL",
156
149
  rel: "noreferrer"
157
150
  }, url));
158
151
  })
159
152
  }, {
160
153
  Field: 'Source URL',
161
154
  Value: dataset.sourceUrl ? /*#__PURE__*/_react.default.createElement("a", {
162
- role: "link",
163
155
  href: dataset.sourceUrl,
164
156
  target: "_blank",
165
- "aria-label": "Source URL",
166
157
  rel: "noreferrer"
167
- }, (_dataset$sourceUrl = dataset.sourceUrl) !== null && _dataset$sourceUrl !== void 0 ? _dataset$sourceUrl : 'Unavailable') : /*#__PURE__*/_react.default.createElement("span", null, "Unavailable")
158
+ }, dataset.sourceUrl) : /*#__PURE__*/_react.default.createElement("span", null, "Unavailable")
168
159
  }, {
169
160
  Field: 'Source Type',
170
161
  Value: dataset.sourceType
171
162
  }, {
172
163
  Field: 'License',
173
164
  Value: dataset.license ? /*#__PURE__*/_react.default.createElement("a", {
174
- role: "link",
175
165
  href: dataset.license,
176
166
  target: "_blank",
177
- "aria-label": (_dataset$license = dataset.license) !== null && _dataset$license !== void 0 ? _dataset$license : 'Unavailable',
178
167
  rel: "noreferrer"
179
- }, (_dataset$license2 = dataset.license) !== null && _dataset$license2 !== void 0 ? _dataset$license2 : 'Unavailable') : /*#__PURE__*/_react.default.createElement("span", null, "Unavailable")
168
+ }, dataset.license) : /*#__PURE__*/_react.default.createElement("span", null, "Unavailable")
180
169
  }, {
181
170
  Field: 'Category',
182
171
  Value: dataset.catagories
@@ -205,7 +194,6 @@ var _default = exports.default = function _default(_ref2) {
205
194
  function mailto(email, name) {
206
195
  if (email) {
207
196
  return /*#__PURE__*/_react.default.createElement("a", {
208
- role: "link",
209
197
  href: 'mailto:' + email
210
198
  }, name);
211
199
  } else {
@@ -83,9 +83,6 @@ dataset-detail-view {
83
83
  min-width:400px;
84
84
  padding:4%;
85
85
  }
86
- dataset-view .header {
87
- display:none;
88
- }
89
86
  .left-section, .right-section {
90
87
  width:100%;
91
88
  float:none;
@@ -41,12 +41,21 @@ var _default = exports.default = /*#__PURE__*/function (_Component) {
41
41
  _this = _callSuper(this, _default);
42
42
  _this.state = {
43
43
  index: 0,
44
- localTitle: ''
44
+ localTitle: '',
45
+ isMobileMenuOpen: false
45
46
  };
46
47
  return _this;
47
48
  }
48
49
  _inherits(_default, _Component);
49
50
  return _createClass(_default, [{
51
+ key: "selectTab",
52
+ value: function selectTab(tabIndex) {
53
+ this.setState({
54
+ index: tabIndex,
55
+ isMobileMenuOpen: false
56
+ });
57
+ }
58
+ }, {
50
59
  key: "generateVisualizationLink",
51
60
  value: function generateVisualizationLink() {
52
61
  return this.props.visualizationId && (0, _reactRouter.generatePath)(_routes.default.visualizationView, {
@@ -117,9 +126,7 @@ var _default = exports.default = /*#__PURE__*/function (_Component) {
117
126
  className: "dataset-view",
118
127
  selectedIndex: this.state.index,
119
128
  onSelect: function onSelect(tabIndex) {
120
- return _this2.setState({
121
- index: tabIndex
122
- });
129
+ return _this2.selectTab(tabIndex);
123
130
  }
124
131
  }, /*#__PURE__*/_react.default.createElement(_reactTabs.TabList, {
125
132
  className: "header"
@@ -148,7 +155,39 @@ var _default = exports.default = /*#__PURE__*/function (_Component) {
148
155
  target: "_blank",
149
156
  href: "https://plotly.com/chart-studio-help/tutorials/#basic",
150
157
  rel: "noreferrer"
151
- }, "Plot.ly Help")))), this.isNotDatasetDetailsTab() && /*#__PURE__*/_react.default.createElement("span", {
158
+ }, "Plot.ly Help")))), /*#__PURE__*/_react.default.createElement("div", {
159
+ className: "mobile-tab-menu"
160
+ }, /*#__PURE__*/_react.default.createElement("button", {
161
+ type: "button",
162
+ className: "mobile-tab-toggle",
163
+ onClick: function onClick() {
164
+ return _this2.setState(function (_ref2) {
165
+ var isMobileMenuOpen = _ref2.isMobileMenuOpen;
166
+ return {
167
+ isMobileMenuOpen: !isMobileMenuOpen
168
+ };
169
+ });
170
+ },
171
+ "aria-label": "Open tab menu",
172
+ "aria-expanded": this.state.isMobileMenuOpen
173
+ }, "\u2630"), this.state.isMobileMenuOpen && /*#__PURE__*/_react.default.createElement("div", {
174
+ className: "mobile-tab-dropdown"
175
+ }, /*#__PURE__*/_react.default.createElement("button", {
176
+ type: "button",
177
+ onClick: function onClick() {
178
+ return _this2.selectTab(0);
179
+ }
180
+ }, "Dataset Details"), /*#__PURE__*/_react.default.createElement("button", {
181
+ type: "button",
182
+ onClick: function onClick() {
183
+ return _this2.selectTab(1);
184
+ }
185
+ }, "Write SQL"), this.isVisualizationEnabled() && /*#__PURE__*/_react.default.createElement("button", {
186
+ type: "button",
187
+ onClick: function onClick() {
188
+ return _this2.selectTab(2);
189
+ }
190
+ }, "Visualize"))), this.isNotDatasetDetailsTab() && /*#__PURE__*/_react.default.createElement("span", {
152
191
  className: "action-area"
153
192
  }, /*#__PURE__*/_react.default.createElement(_visualizationListMenuItem.default, {
154
193
  isAuthenticated: this.props.auth.isAuthenticated
@@ -92,4 +92,56 @@ dataset-view {
92
92
  loading-element {
93
93
  @include default-loading-icon();
94
94
  }
95
+
96
+ .mobile-tab-menu {
97
+ display: none;
98
+ position: relative;
99
+ }
100
+
101
+ @media only screen and (max-width: 600px) {
102
+ .header {
103
+ display: flex;
104
+ align-items: center;
105
+ justify-content: space-between;
106
+ }
107
+
108
+ .tab-area {
109
+ font-size: small;
110
+ }
111
+
112
+ .react-tabs__tab {
113
+ padding: 6px 12px;
114
+ }
115
+
116
+ .mobile-tab-menu {
117
+ display: block;
118
+ }
119
+
120
+ .mobile-tab-toggle {
121
+ border: 0;
122
+ background: transparent;
123
+ font-size: 22px;
124
+ padding: 8px 12px;
125
+ cursor: pointer;
126
+ }
127
+
128
+ .mobile-tab-dropdown {
129
+ position: absolute;
130
+ top: calc(100% + 4px);
131
+ left: 0;
132
+ z-index: 20;
133
+ background: white;
134
+ border: 1px solid $light-grey;
135
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
136
+ }
137
+
138
+ .mobile-tab-dropdown button {
139
+ display: block;
140
+ width: 100%;
141
+ text-align: left;
142
+ padding: 10px 12px;
143
+ border: 0;
144
+ background: white;
145
+ }
146
+ }
95
147
  }
@@ -1,5 +1,5 @@
1
1
  import { shallow } from 'enzyme'
2
- import { Tab, TabPanel, TabList } from 'react-tabs'
2
+ import { Tab, TabPanel, TabList, Tabs } from 'react-tabs'
3
3
 
4
4
  import DatasetView from './dataset-view'
5
5
  import QueryView from '../query-view'
@@ -62,6 +62,60 @@ describe('dataset view', () => {
62
62
  expect(subject.find(VisualizationSaveMenuItem)).toHaveLength(0)
63
63
  expect(subject.find(VisualizationListMenuItem)).toHaveLength(0)
64
64
  })
65
+
66
+ describe('mobile tab menu', () => {
67
+ it('renders mobile menu toggle button', () => {
68
+ const mobileMenuToggle = subject.find('.mobile-tab-toggle')
69
+ expect(mobileMenuToggle).toHaveLength(1)
70
+ expect(mobileMenuToggle.prop('aria-expanded')).toBe(false)
71
+ })
72
+
73
+ it('toggles dropdown open and closed when menu button is clicked', () => {
74
+ subject.find('.mobile-tab-toggle').simulate('click')
75
+ expect(subject.state('isMobileMenuOpen')).toBe(true)
76
+ expect(subject.find('.mobile-tab-dropdown')).toHaveLength(1)
77
+
78
+ subject.find('.mobile-tab-toggle').simulate('click')
79
+ expect(subject.state('isMobileMenuOpen')).toBe(false)
80
+ expect(subject.find('.mobile-tab-dropdown')).toHaveLength(0)
81
+ })
82
+
83
+ it('selecting Dataset Details from dropdown sets index to 0 and closes menu', () => {
84
+ subject.setState({ index: 2, isMobileMenuOpen: true })
85
+
86
+ subject.find('.mobile-tab-dropdown button').at(0).simulate('click')
87
+
88
+ expect(subject.state('index')).toBe(0)
89
+ expect(subject.state('isMobileMenuOpen')).toBe(false)
90
+ })
91
+
92
+ it('selecting Write SQL from dropdown sets index to 1 and closes menu', () => {
93
+ subject.setState({ index: 0, isMobileMenuOpen: true })
94
+
95
+ subject.find('.mobile-tab-dropdown button').at(1).simulate('click')
96
+
97
+ expect(subject.state('index')).toBe(1)
98
+ expect(subject.state('isMobileMenuOpen')).toBe(false)
99
+ })
100
+
101
+ it('selecting Visualize from dropdown sets index to 2 when visualizations are enabled', () => {
102
+ subject.setState({ index: 0, isMobileMenuOpen: true })
103
+
104
+ subject.find('.mobile-tab-dropdown button').at(2).simulate('click')
105
+
106
+ expect(subject.state('index')).toBe(2)
107
+ expect(subject.state('isMobileMenuOpen')).toBe(false)
108
+ })
109
+
110
+ it('closes mobile menu when selecting a tab via Tabs onSelect callback', () => {
111
+ subject.setState({ isMobileMenuOpen: true })
112
+
113
+ subject.find(Tabs).prop('onSelect')(1)
114
+
115
+ expect(subject.state('index')).toBe(1)
116
+ expect(subject.state('isMobileMenuOpen')).toBe(false)
117
+ })
118
+ })
65
119
  })
66
120
 
67
121
  describe('Visualizations when DISABLE_VISUALIZATIONS is true', () => {
@@ -87,6 +141,11 @@ describe('Visualizations when DISABLE_VISUALIZATIONS is true', () => {
87
141
  const test = subject.find('#plotlyhelp')
88
142
  expect(test.length).toEqual(0)
89
143
  })
144
+
145
+ it('does not have the visualize option in the mobile tab dropdown', () => {
146
+ subject.find('.mobile-tab-toggle').simulate('click')
147
+ expect(subject.find('.mobile-tab-dropdown button')).toHaveLength(2)
148
+ })
90
149
  })
91
150
 
92
151
  describe('dataset view when dataset is not loaded', () => {
@@ -107,9 +107,4 @@ visualization-view {
107
107
  .visualization--selected {
108
108
  display: flex;
109
109
  }
110
- @media only screen and (max-width: 600px) {
111
- .header {
112
- display:none;
113
- }
114
- }
115
110
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urbanos/react-discovery-ui",
3
- "version": "2.1.56",
3
+ "version": "2.1.57",
4
4
  "description": "React component for dataset discovery UI",
5
5
  "main": "./lib/ReactDiscoveryUI.js",
6
6
  "repository": {