2019-01-15 18:53:27 -05:00
|
|
|
# Licensed to the Apache Software Foundation (ASF) under one
|
|
|
|
# or more contributor license agreements. See the NOTICE file
|
|
|
|
# distributed with this work for additional information
|
|
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
|
|
# to you under the Apache License, Version 2.0 (the
|
|
|
|
# "License"); you may not use this file except in compliance
|
|
|
|
# with the License. You may obtain a copy of the License at
|
|
|
|
#
|
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
#
|
|
|
|
# Unless required by applicable law or agreed to in writing,
|
|
|
|
# software distributed under the License is distributed on an
|
|
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
|
|
# KIND, either express or implied. See the License for the
|
|
|
|
# specific language governing permissions and limitations
|
|
|
|
# under the License.
|
2018-04-07 15:55:05 -04:00
|
|
|
"""Unit tests for Superset"""
|
|
|
|
import json
|
|
|
|
import unittest
|
|
|
|
|
|
|
|
from flask import escape
|
2019-01-17 18:48:40 -05:00
|
|
|
from sqlalchemy import func
|
2018-04-07 15:55:05 -04:00
|
|
|
|
|
|
|
from superset import db, security_manager
|
|
|
|
from superset.connectors.sqla.models import SqlaTable
|
|
|
|
from superset.models import core as models
|
|
|
|
from .base_tests import SupersetTestCase
|
|
|
|
|
|
|
|
|
|
|
|
class DashboardTests(SupersetTestCase):
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
super(DashboardTests, self).__init__(*args, **kwargs)
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def setUpClass(cls):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def tearDown(self):
|
|
|
|
pass
|
|
|
|
|
2018-07-24 18:23:30 -04:00
|
|
|
def get_mock_positions(self, dash):
|
|
|
|
positions = {
|
|
|
|
'DASHBOARD_VERSION_KEY': 'v2',
|
|
|
|
}
|
|
|
|
for i, slc in enumerate(dash.slices):
|
|
|
|
id = 'DASHBOARD_CHART_TYPE-{}'.format(i)
|
|
|
|
d = {
|
|
|
|
'type': 'DASHBOARD_CHART_TYPE',
|
|
|
|
'id': id,
|
|
|
|
'children': [],
|
|
|
|
'meta': {
|
|
|
|
'width': 4,
|
|
|
|
'height': 50,
|
|
|
|
'chartId': slc.id,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
positions[id] = d
|
|
|
|
return positions
|
|
|
|
|
2018-04-07 15:55:05 -04:00
|
|
|
def test_dashboard(self):
|
|
|
|
self.login(username='admin')
|
|
|
|
urls = {}
|
|
|
|
for dash in db.session.query(models.Dashboard).all():
|
|
|
|
urls[dash.dashboard_title] = dash.url
|
|
|
|
for title, url in urls.items():
|
|
|
|
assert escape(title) in self.client.get(url).data.decode('utf-8')
|
|
|
|
|
2019-01-17 18:48:40 -05:00
|
|
|
def test_new_dashboard(self):
|
|
|
|
self.login(username='admin')
|
|
|
|
dash_count_before = db.session.query(func.count(models.Dashboard.id)).first()[0]
|
|
|
|
url = '/dashboard/new/'
|
|
|
|
resp = self.get_resp(url)
|
|
|
|
self.assertIn('[ untitled dashboard ]', resp)
|
|
|
|
dash_count_after = db.session.query(func.count(models.Dashboard.id)).first()[0]
|
|
|
|
self.assertEquals(dash_count_before + 1, dash_count_after)
|
|
|
|
|
2018-04-07 15:55:05 -04:00
|
|
|
def test_dashboard_modes(self):
|
|
|
|
self.login(username='admin')
|
|
|
|
dash = (
|
|
|
|
db.session.query(models.Dashboard)
|
|
|
|
.filter_by(slug='births')
|
|
|
|
.first()
|
|
|
|
)
|
[wip] dashboard builder v2 (#4528)
* [dashboard builder] Add dir structure for dashboard/v2, simplified Header, split pane, Draggable side panel
[grid] add <DashboardGrid />, <ResizableContainer />, and initial grid components.
[grid] gridComponents/ directory, add fixtures/ directory and test layout, add <Column />
[grid] working grid with gutters
[grid] design tweaks and polish, add <Tabs />
[header] add gradient header logo and favicon
[dnd] begin adding dnd functionality
[dnd] add util/isValidChild.js
[react-beautiful-dnd] iterate on dnd until blocked
[dnd] refactor to use react-dnd
[react-dnd] refactor to use composable <DashboardComponent /> structure
[dnd] factor out DashboardComponent, let components render dropInidcator and set draggableRef, add draggable tabs
[dnd] refactor to use redux, add DashboardComponent and DashboardGrid containers
[dragdroppable] rename horizontal/vertical => row/column
[builder] refactor into HoverMenu, add WithPopoverMenu
[builder] add editable header and disableDragDrop prop for Dragdroppable's
[builder] make tabs editable
[builder] add generic popover dropdown and header row style editability
[builder] add hover rowStyle dropdown, make row styles editable
[builder] add some new component icons, add popover with delete to charts
[builder] add preview icons, add popover menu to rows.
[builder] add IconButton and RowStyleDropdown
[resizable] use ResizableContainer instead of DimensionProvider, fix resize and delete bugs
[builder] fix bug with spacer
[builder] clean up, header.size => header.headerSize
[builder] support more drag/drop combinations by wrapping some components in rows upon drop. fix within list drop index. refactor some utils.
[builder][tabs] fix broken add tab button
[dashboard builder] don't pass dashboard layout to all dashboard components, improve drop indicator logic, fix delete component pure component bug
[dnd] refactor drop position logic
* fix rebase error, clean up css organization and use @less vars
* [dashboard-builder] add top-level tabs + undo-redo (#4626)
* [top-level-tabs] initial working version of top-level tabs
* [top-level-tabs] simplify redux and disable ability to displace top-level tabs with other tabs
* [top-level-tabs] improve tab drag and drop css
* [undo-redo] add redux undo redo
* [dnd] clean up dropResult shape, add new component source id + type, use css for drop indicator instead of styles and fix tab indicators.
* [top-level-tabs] add 'Collapse tab content' to delete tabs button
* [dnd] add depth validation to drag and drop logic
* [dashboard-builder] add resize action, enforce minimum width of columns, column children inherit column size when necessary, meta.rowStyle => meta.background, add background to columns
* [dashboard-builder] make sure getChildWidth returns a number
* [dashboard builder] static layout + toasts (#4763)
* [dashboard-builder] remove spacer component
* [dashboard-builder] better transparent indicator, better grid gutter logic, no dragging top-level tabs, headers are multiples of grid unit, fix row height granularity, update redux state key dashboard => dashboardLayout
* [dashboard-builder] don't blast column child dimensions on resize
* [dashboard-builder] ResizableContainer min size can't be smaller than size, fix row style, role=none on WithPopoverMenu container
* [edit mode] add edit mode to redux and propogate to all <DashboardComponent />s
* [toasts] add Toast component, ToastPresenter container and component, and toast redux actions + reducers
* [dashboard-builder] add info toast when dropResult overflows parent
* [dashboard builder] git mv to src/ post-rebase
* Dashboard builder rebased + linted (#4849)
* define dashboard redux state
* update dashboard state reducer
* dashboard layout converter + grid render
* builder pane + slice adder
* Dashboard header + slice header controls
* fix linting
* 2nd code review comments
* [dashboard builder] improve perf (#4855)
* address major perf + css issues
[dashboard builder] fix dashboard filters and some css
[dashboard builder] use VIZ_TYPES, move stricter .eslintrc to dashboard/, more css fixes
[builder] delete GridCell and GridLayout, remove some unused css. fix broken tabs.
* [builder] fix errors post-rebase
* [builder] add support for custom DragDroppable drag layer and add AddSliceDragPreview
* [AddSliceDragPreview] fix type check
* [dashboard builder] add prettier and update all files
* [dashboard builder] merge v2/ directory int dashboard/
* [dashboard builder] move component/*Container => containers/*
* add sticky tabs + sidepane, better tabs perf, better container hierarchy, better chart header (#4893)
* dashboard header, slice header UI improvement
* add slider and sticky
* dashboard header, slice header UI improvement
* make builder pane floating
* [dashboard builder] add sticky top-level tabs, refactor for performant tabs
* [dashboard builder] visually distinct containers, icons for undo-redo, fix some isValidChild bugs
* [dashboard builder] better undo redo <> save changes state, notify upon reaching undo limit
* [dashboard builder] hook up edit + create component actions to saved-state pop.
* [dashboard builder] visual refinement, refactor Dashboard header content and updates into layout for undo-redo, refactor save dashboard modal to use toasts instead of notify.
* [dashboard builder] refactor chart name update logic to use layout for undo redo, save slice name changes on dashboard save
* add slider and sticky
* [dashboard builder] fix layout converter slice_id + chartId type casting, don't change grid size upon edit (perf)
* [dashboard builder] don't set version key in getInitialState
* [dashboard builder] make top level tabs addition/removal undoable, fix double sticky tabs + side panel.
* [dashboard builder] fix sticky tabs offset bug
* [dashboard builder] fix drag preview width, css polish, fix rebase issue
* [dashboard builder] fix side pane labels and hove z-index
* Markdown for dashboard (#4962)
* fix dashboard server-side unit tests (#5009)
* Dashboard save button (#4979)
* save button
* fix slices list height
* save custom css
* merge save-dash changes from dashboard v1
https://github.com/apache/incubator-superset/pull/4900
https://github.com/apache/incubator-superset/pull/5051
* [dashboard v2] check for default_filters before json_loads-ing them (#5064)
[dashboard v2] check for default_filters before json-loads-ing them
* [dashboard v2] fix bugs from rebase
* [dashboard v2] tests! (#5066)
* [dashboard v2][tests] add tests for newComponentFactory, isValidChild, dropOverflowsParent, and dnd-reorder
* [dashboard v2][tests] add tests for componentIsResizable, findParentId, getChartIdsFromLayout, newEntitiesFromDrop, and getDropPosition
* [dashboard v2][tests] add mockStore, mockState, and tests for DragDroppable, DashboardBuilder, DashboardGrid, ToastPresenter, and Toast
* [dashboard builder][tests] separate files for state tree fixtures, add ChartHolder, Chart, Divider, Header, Row tests and WithDragDropContext helper
* [dashboard v2][tests] fix dragdrop context with util/getDragDropManager, add test for menu/* and resizable/*, and new components
* [dashboard v2][tests] fix and re-write Dashboard tests, add getFormDataWithExtraFilters_spec
* [dashboard v2][tests] add reducer tests, fix lint error
* [dashboard-v2][tests] add actions/dashboardLayout_spec
* [dashboard v2] fix some prop bugs, open side pane on edit, fix slice name bug
* [dashboard v2] fix slice name save bug
* [dashboard v2] fix lint errors
* [dashboard v2] fix filters bug and add test
* [dashboard v2] fix getFormDataWithExtraFilters_spec
* [dashboard v2] logging updates (#5087)
* [dashboard v2] initial logging refactor
* [dashboard v2] clean up logger
* [logger] update explore with new log events, add refresh dashboard + refresh dashboard chart actions
* [logging] add logger_spec.js, fix reducers/dashboardState_spec + gridComponents/Chart_spec
* [dashboard v2][logging] refactor for bulk logging in python
* [logging] tweak python, fix and remove dup start_offset entries
* [dashboard v2][logging] add dashboard_first_load event
* [dashboard v2][logging] add slice_ids to dashboard pane load event
* [tests] fix npm test script
* Fix: update slices list when add/remove multiple slices (#5138)
* [dashboard v2] add v1 switch (#5126)
* [dashboard] copy all dashboard v1 into working v1 switch
* [dashboard] add functional v1 <> v2 switch with messaging
* [dashboard] add v2 logging to v1 dashboard, add read-v2-changes link, add client logging to track v1 <> v2 switches
* [dashboard] Remove default values for feedback url + v2 auto convert date
* [dashboard v2] fix misc UI/UX issues
* [dashboard v2] fix Markdown persistance issues and css, fix copy dash title, don't enforce shallow hovering with drop indicator
* [dashboard v2] improve non-shallow drop target UX, fix Markdown drop indicator, clarify slice adder filter/sort
* [dashboard v2] delete empty rows on drag or delete events that leave them without children, add test
* [dashboard v2] improve v1<>v2 switch modals, add convert to v2 badge in v1, fix unsaved changes issue in preview mode, don't auto convert column child widths for now
* [dashboard v2][dnd] add drop position cache to fix non-shallow drops
* [dashboard] fix test script with glob instead of recurse, fix tests, add temp fix for tab nesting, ignore v1 lint errors
* [dashboard] v2 badge style tweaks, add back v1 _set_dash_metadata for v1 editing
* [dashboard] fix python linting and tests
* [dashboard] lint tests
* add slice from explore view (#5141)
* Fix dashboard position row data (#5131)
* add slice_name to markdown
(cherry picked from commit 14b01f1)
* set min grid width be 1 column
* remove empty column
* check total columns count <= 12
* scan position data and fix rows
* fix dashboard url with default_filters
* [dashboard v2] better grid drop ux, fix tab bugs 🐛 (#5151)
* [dashboard v2] add empty droptarget to dashboard grid for better ux and update test
* [dashboard] reset tab index upon top-level tab deletion, fix findparentid bug
* [dashboard] update v1<>v2 modal link for tracking
* Fix: Should pass slice_can_edit flag down (#5159)
* [dash builder fix] combine markdown and slice name, slice picker height (#5165)
* combine markdown code and markdown slice name
* allow dynamic height for slice picker cell
* add word break for long datasource name
* [fix] new dashboard state (#5213)
* [dashboard v2] ui + ux fixes (#5208)
* [dashboard v2] use <Loading /> throughout, small loading gif, improve row/column visual hierarchy, add cached data pop
* [dashboard v2] lots of polish
* [dashboard v2] remove markdown padding on edit, more opaque slice drag preview, unsavedChanges=true upon moving a component, fix initial load logging.
* [dashboard v2] gray loading.gif, sticky header, undo/redo keyboard shortcuts, fix move component saved changes update, v0 double scrollbar fix
* [dashboard v2] move UndoRedoKeylisteners into Header, render only in edit mode, show visual feedback for keyboard shortcut, hide hover menu in top-level tabs
* [dashboard v2] fix grid + sidepane height issues
* [dashboard v2] add auto-resize functionality, update tests. cache findParentId results.
* [dashboard v2][tests] add getDetailedComponentWidth_spec.js
* [dashboard v2] fix lint
* [fix] layout converter fix (#5218)
* [fix] layout converter fix
* add changed_on into initial sliceEntity data
* add unit tests for SliceAdder component
* remove old fixtures file
* [dashboard v2] remove webpack-cli, fresh yarn.lock post-rebase
* [dashboard v2] lint javascript
* [dashboard v2] fix python tests
* [Fix] import/export dash in V2 (#5273)
* [dashboard v2] add markdown tests (#5275)
* [dashboard v2] add Markdown tests
* [dashboard v2][mocks] fix markdown mock
2018-06-25 12:17:22 -04:00
|
|
|
url = dash.url
|
|
|
|
if dash.url.find('?') == -1:
|
|
|
|
url += '?'
|
|
|
|
else:
|
|
|
|
url += '&'
|
|
|
|
resp = self.get_resp(url + 'edit=true&standalone=true')
|
2018-04-07 15:55:05 -04:00
|
|
|
self.assertIn('editMode": true', resp)
|
|
|
|
self.assertIn('standalone_mode": true', resp)
|
2019-02-04 19:44:17 -05:00
|
|
|
self.assertIn('<body class="standalone">', resp)
|
2018-04-07 15:55:05 -04:00
|
|
|
|
|
|
|
def test_save_dash(self, username='admin'):
|
|
|
|
self.login(username=username)
|
|
|
|
dash = db.session.query(models.Dashboard).filter_by(
|
|
|
|
slug='births').first()
|
2018-07-24 18:23:30 -04:00
|
|
|
positions = self.get_mock_positions(dash)
|
2018-04-07 15:55:05 -04:00
|
|
|
data = {
|
|
|
|
'css': '',
|
|
|
|
'expanded_slices': {},
|
2018-07-24 18:23:30 -04:00
|
|
|
'positions': positions,
|
2018-04-07 15:55:05 -04:00
|
|
|
'dashboard_title': dash.dashboard_title,
|
|
|
|
}
|
|
|
|
url = '/superset/save_dash/{}/'.format(dash.id)
|
|
|
|
resp = self.get_resp(url, data=dict(data=json.dumps(data)))
|
|
|
|
self.assertIn('SUCCESS', resp)
|
|
|
|
|
|
|
|
def test_save_dash_with_filter(self, username='admin'):
|
|
|
|
self.login(username=username)
|
|
|
|
dash = db.session.query(models.Dashboard).filter_by(
|
|
|
|
slug='world_health').first()
|
|
|
|
|
2018-07-24 18:23:30 -04:00
|
|
|
positions = self.get_mock_positions(dash)
|
2018-04-07 15:55:05 -04:00
|
|
|
filters = {str(dash.slices[0].id): {'region': ['North America']}}
|
|
|
|
default_filters = json.dumps(filters)
|
|
|
|
data = {
|
|
|
|
'css': '',
|
|
|
|
'expanded_slices': {},
|
2018-07-24 18:23:30 -04:00
|
|
|
'positions': positions,
|
2018-04-07 15:55:05 -04:00
|
|
|
'dashboard_title': dash.dashboard_title,
|
|
|
|
'default_filters': default_filters,
|
|
|
|
}
|
|
|
|
|
|
|
|
url = '/superset/save_dash/{}/'.format(dash.id)
|
|
|
|
resp = self.get_resp(url, data=dict(data=json.dumps(data)))
|
|
|
|
self.assertIn('SUCCESS', resp)
|
|
|
|
|
|
|
|
updatedDash = db.session.query(models.Dashboard).filter_by(
|
|
|
|
slug='world_health').first()
|
|
|
|
new_url = updatedDash.url
|
|
|
|
self.assertIn('region', new_url)
|
|
|
|
|
|
|
|
resp = self.get_resp(new_url)
|
|
|
|
self.assertIn('North America', resp)
|
|
|
|
|
2018-06-27 14:00:50 -04:00
|
|
|
def test_save_dash_with_invalid_filters(self, username='admin'):
|
|
|
|
self.login(username=username)
|
|
|
|
dash = db.session.query(models.Dashboard).filter_by(
|
|
|
|
slug='world_health').first()
|
|
|
|
|
|
|
|
# add an invalid filter slice
|
2018-07-24 18:23:30 -04:00
|
|
|
positions = self.get_mock_positions(dash)
|
2018-06-27 14:00:50 -04:00
|
|
|
filters = {str(99999): {'region': ['North America']}}
|
|
|
|
default_filters = json.dumps(filters)
|
|
|
|
data = {
|
|
|
|
'css': '',
|
|
|
|
'expanded_slices': {},
|
2018-07-24 18:23:30 -04:00
|
|
|
'positions': positions,
|
2018-06-27 14:00:50 -04:00
|
|
|
'dashboard_title': dash.dashboard_title,
|
|
|
|
'default_filters': default_filters,
|
|
|
|
}
|
|
|
|
|
|
|
|
url = '/superset/save_dash/{}/'.format(dash.id)
|
|
|
|
resp = self.get_resp(url, data=dict(data=json.dumps(data)))
|
|
|
|
self.assertIn('SUCCESS', resp)
|
|
|
|
|
|
|
|
updatedDash = db.session.query(models.Dashboard).filter_by(
|
|
|
|
slug='world_health').first()
|
|
|
|
new_url = updatedDash.url
|
|
|
|
self.assertNotIn('region', new_url)
|
|
|
|
|
2018-04-07 15:55:05 -04:00
|
|
|
def test_save_dash_with_dashboard_title(self, username='admin'):
|
|
|
|
self.login(username=username)
|
|
|
|
dash = (
|
|
|
|
db.session.query(models.Dashboard)
|
|
|
|
.filter_by(slug='births')
|
|
|
|
.first()
|
|
|
|
)
|
|
|
|
origin_title = dash.dashboard_title
|
2018-07-24 18:23:30 -04:00
|
|
|
positions = self.get_mock_positions(dash)
|
2018-04-07 15:55:05 -04:00
|
|
|
data = {
|
|
|
|
'css': '',
|
|
|
|
'expanded_slices': {},
|
2018-07-24 18:23:30 -04:00
|
|
|
'positions': positions,
|
2018-04-07 15:55:05 -04:00
|
|
|
'dashboard_title': 'new title',
|
|
|
|
}
|
|
|
|
url = '/superset/save_dash/{}/'.format(dash.id)
|
|
|
|
self.get_resp(url, data=dict(data=json.dumps(data)))
|
|
|
|
updatedDash = (
|
|
|
|
db.session.query(models.Dashboard)
|
|
|
|
.filter_by(slug='births')
|
|
|
|
.first()
|
|
|
|
)
|
|
|
|
self.assertEqual(updatedDash.dashboard_title, 'new title')
|
[wip] dashboard builder v2 (#4528)
* [dashboard builder] Add dir structure for dashboard/v2, simplified Header, split pane, Draggable side panel
[grid] add <DashboardGrid />, <ResizableContainer />, and initial grid components.
[grid] gridComponents/ directory, add fixtures/ directory and test layout, add <Column />
[grid] working grid with gutters
[grid] design tweaks and polish, add <Tabs />
[header] add gradient header logo and favicon
[dnd] begin adding dnd functionality
[dnd] add util/isValidChild.js
[react-beautiful-dnd] iterate on dnd until blocked
[dnd] refactor to use react-dnd
[react-dnd] refactor to use composable <DashboardComponent /> structure
[dnd] factor out DashboardComponent, let components render dropInidcator and set draggableRef, add draggable tabs
[dnd] refactor to use redux, add DashboardComponent and DashboardGrid containers
[dragdroppable] rename horizontal/vertical => row/column
[builder] refactor into HoverMenu, add WithPopoverMenu
[builder] add editable header and disableDragDrop prop for Dragdroppable's
[builder] make tabs editable
[builder] add generic popover dropdown and header row style editability
[builder] add hover rowStyle dropdown, make row styles editable
[builder] add some new component icons, add popover with delete to charts
[builder] add preview icons, add popover menu to rows.
[builder] add IconButton and RowStyleDropdown
[resizable] use ResizableContainer instead of DimensionProvider, fix resize and delete bugs
[builder] fix bug with spacer
[builder] clean up, header.size => header.headerSize
[builder] support more drag/drop combinations by wrapping some components in rows upon drop. fix within list drop index. refactor some utils.
[builder][tabs] fix broken add tab button
[dashboard builder] don't pass dashboard layout to all dashboard components, improve drop indicator logic, fix delete component pure component bug
[dnd] refactor drop position logic
* fix rebase error, clean up css organization and use @less vars
* [dashboard-builder] add top-level tabs + undo-redo (#4626)
* [top-level-tabs] initial working version of top-level tabs
* [top-level-tabs] simplify redux and disable ability to displace top-level tabs with other tabs
* [top-level-tabs] improve tab drag and drop css
* [undo-redo] add redux undo redo
* [dnd] clean up dropResult shape, add new component source id + type, use css for drop indicator instead of styles and fix tab indicators.
* [top-level-tabs] add 'Collapse tab content' to delete tabs button
* [dnd] add depth validation to drag and drop logic
* [dashboard-builder] add resize action, enforce minimum width of columns, column children inherit column size when necessary, meta.rowStyle => meta.background, add background to columns
* [dashboard-builder] make sure getChildWidth returns a number
* [dashboard builder] static layout + toasts (#4763)
* [dashboard-builder] remove spacer component
* [dashboard-builder] better transparent indicator, better grid gutter logic, no dragging top-level tabs, headers are multiples of grid unit, fix row height granularity, update redux state key dashboard => dashboardLayout
* [dashboard-builder] don't blast column child dimensions on resize
* [dashboard-builder] ResizableContainer min size can't be smaller than size, fix row style, role=none on WithPopoverMenu container
* [edit mode] add edit mode to redux and propogate to all <DashboardComponent />s
* [toasts] add Toast component, ToastPresenter container and component, and toast redux actions + reducers
* [dashboard-builder] add info toast when dropResult overflows parent
* [dashboard builder] git mv to src/ post-rebase
* Dashboard builder rebased + linted (#4849)
* define dashboard redux state
* update dashboard state reducer
* dashboard layout converter + grid render
* builder pane + slice adder
* Dashboard header + slice header controls
* fix linting
* 2nd code review comments
* [dashboard builder] improve perf (#4855)
* address major perf + css issues
[dashboard builder] fix dashboard filters and some css
[dashboard builder] use VIZ_TYPES, move stricter .eslintrc to dashboard/, more css fixes
[builder] delete GridCell and GridLayout, remove some unused css. fix broken tabs.
* [builder] fix errors post-rebase
* [builder] add support for custom DragDroppable drag layer and add AddSliceDragPreview
* [AddSliceDragPreview] fix type check
* [dashboard builder] add prettier and update all files
* [dashboard builder] merge v2/ directory int dashboard/
* [dashboard builder] move component/*Container => containers/*
* add sticky tabs + sidepane, better tabs perf, better container hierarchy, better chart header (#4893)
* dashboard header, slice header UI improvement
* add slider and sticky
* dashboard header, slice header UI improvement
* make builder pane floating
* [dashboard builder] add sticky top-level tabs, refactor for performant tabs
* [dashboard builder] visually distinct containers, icons for undo-redo, fix some isValidChild bugs
* [dashboard builder] better undo redo <> save changes state, notify upon reaching undo limit
* [dashboard builder] hook up edit + create component actions to saved-state pop.
* [dashboard builder] visual refinement, refactor Dashboard header content and updates into layout for undo-redo, refactor save dashboard modal to use toasts instead of notify.
* [dashboard builder] refactor chart name update logic to use layout for undo redo, save slice name changes on dashboard save
* add slider and sticky
* [dashboard builder] fix layout converter slice_id + chartId type casting, don't change grid size upon edit (perf)
* [dashboard builder] don't set version key in getInitialState
* [dashboard builder] make top level tabs addition/removal undoable, fix double sticky tabs + side panel.
* [dashboard builder] fix sticky tabs offset bug
* [dashboard builder] fix drag preview width, css polish, fix rebase issue
* [dashboard builder] fix side pane labels and hove z-index
* Markdown for dashboard (#4962)
* fix dashboard server-side unit tests (#5009)
* Dashboard save button (#4979)
* save button
* fix slices list height
* save custom css
* merge save-dash changes from dashboard v1
https://github.com/apache/incubator-superset/pull/4900
https://github.com/apache/incubator-superset/pull/5051
* [dashboard v2] check for default_filters before json_loads-ing them (#5064)
[dashboard v2] check for default_filters before json-loads-ing them
* [dashboard v2] fix bugs from rebase
* [dashboard v2] tests! (#5066)
* [dashboard v2][tests] add tests for newComponentFactory, isValidChild, dropOverflowsParent, and dnd-reorder
* [dashboard v2][tests] add tests for componentIsResizable, findParentId, getChartIdsFromLayout, newEntitiesFromDrop, and getDropPosition
* [dashboard v2][tests] add mockStore, mockState, and tests for DragDroppable, DashboardBuilder, DashboardGrid, ToastPresenter, and Toast
* [dashboard builder][tests] separate files for state tree fixtures, add ChartHolder, Chart, Divider, Header, Row tests and WithDragDropContext helper
* [dashboard v2][tests] fix dragdrop context with util/getDragDropManager, add test for menu/* and resizable/*, and new components
* [dashboard v2][tests] fix and re-write Dashboard tests, add getFormDataWithExtraFilters_spec
* [dashboard v2][tests] add reducer tests, fix lint error
* [dashboard-v2][tests] add actions/dashboardLayout_spec
* [dashboard v2] fix some prop bugs, open side pane on edit, fix slice name bug
* [dashboard v2] fix slice name save bug
* [dashboard v2] fix lint errors
* [dashboard v2] fix filters bug and add test
* [dashboard v2] fix getFormDataWithExtraFilters_spec
* [dashboard v2] logging updates (#5087)
* [dashboard v2] initial logging refactor
* [dashboard v2] clean up logger
* [logger] update explore with new log events, add refresh dashboard + refresh dashboard chart actions
* [logging] add logger_spec.js, fix reducers/dashboardState_spec + gridComponents/Chart_spec
* [dashboard v2][logging] refactor for bulk logging in python
* [logging] tweak python, fix and remove dup start_offset entries
* [dashboard v2][logging] add dashboard_first_load event
* [dashboard v2][logging] add slice_ids to dashboard pane load event
* [tests] fix npm test script
* Fix: update slices list when add/remove multiple slices (#5138)
* [dashboard v2] add v1 switch (#5126)
* [dashboard] copy all dashboard v1 into working v1 switch
* [dashboard] add functional v1 <> v2 switch with messaging
* [dashboard] add v2 logging to v1 dashboard, add read-v2-changes link, add client logging to track v1 <> v2 switches
* [dashboard] Remove default values for feedback url + v2 auto convert date
* [dashboard v2] fix misc UI/UX issues
* [dashboard v2] fix Markdown persistance issues and css, fix copy dash title, don't enforce shallow hovering with drop indicator
* [dashboard v2] improve non-shallow drop target UX, fix Markdown drop indicator, clarify slice adder filter/sort
* [dashboard v2] delete empty rows on drag or delete events that leave them without children, add test
* [dashboard v2] improve v1<>v2 switch modals, add convert to v2 badge in v1, fix unsaved changes issue in preview mode, don't auto convert column child widths for now
* [dashboard v2][dnd] add drop position cache to fix non-shallow drops
* [dashboard] fix test script with glob instead of recurse, fix tests, add temp fix for tab nesting, ignore v1 lint errors
* [dashboard] v2 badge style tweaks, add back v1 _set_dash_metadata for v1 editing
* [dashboard] fix python linting and tests
* [dashboard] lint tests
* add slice from explore view (#5141)
* Fix dashboard position row data (#5131)
* add slice_name to markdown
(cherry picked from commit 14b01f1)
* set min grid width be 1 column
* remove empty column
* check total columns count <= 12
* scan position data and fix rows
* fix dashboard url with default_filters
* [dashboard v2] better grid drop ux, fix tab bugs 🐛 (#5151)
* [dashboard v2] add empty droptarget to dashboard grid for better ux and update test
* [dashboard] reset tab index upon top-level tab deletion, fix findparentid bug
* [dashboard] update v1<>v2 modal link for tracking
* Fix: Should pass slice_can_edit flag down (#5159)
* [dash builder fix] combine markdown and slice name, slice picker height (#5165)
* combine markdown code and markdown slice name
* allow dynamic height for slice picker cell
* add word break for long datasource name
* [fix] new dashboard state (#5213)
* [dashboard v2] ui + ux fixes (#5208)
* [dashboard v2] use <Loading /> throughout, small loading gif, improve row/column visual hierarchy, add cached data pop
* [dashboard v2] lots of polish
* [dashboard v2] remove markdown padding on edit, more opaque slice drag preview, unsavedChanges=true upon moving a component, fix initial load logging.
* [dashboard v2] gray loading.gif, sticky header, undo/redo keyboard shortcuts, fix move component saved changes update, v0 double scrollbar fix
* [dashboard v2] move UndoRedoKeylisteners into Header, render only in edit mode, show visual feedback for keyboard shortcut, hide hover menu in top-level tabs
* [dashboard v2] fix grid + sidepane height issues
* [dashboard v2] add auto-resize functionality, update tests. cache findParentId results.
* [dashboard v2][tests] add getDetailedComponentWidth_spec.js
* [dashboard v2] fix lint
* [fix] layout converter fix (#5218)
* [fix] layout converter fix
* add changed_on into initial sliceEntity data
* add unit tests for SliceAdder component
* remove old fixtures file
* [dashboard v2] remove webpack-cli, fresh yarn.lock post-rebase
* [dashboard v2] lint javascript
* [dashboard v2] fix python tests
* [Fix] import/export dash in V2 (#5273)
* [dashboard v2] add markdown tests (#5275)
* [dashboard v2] add Markdown tests
* [dashboard v2][mocks] fix markdown mock
2018-06-25 12:17:22 -04:00
|
|
|
# bring back dashboard original title
|
2018-04-07 15:55:05 -04:00
|
|
|
data['dashboard_title'] = origin_title
|
|
|
|
self.get_resp(url, data=dict(data=json.dumps(data)))
|
|
|
|
|
2019-03-29 09:35:22 -04:00
|
|
|
def test_save_dash_with_colors(self, username='admin'):
|
|
|
|
self.login(username=username)
|
|
|
|
dash = (
|
|
|
|
db.session.query(models.Dashboard)
|
|
|
|
.filter_by(slug='births')
|
|
|
|
.first()
|
|
|
|
)
|
|
|
|
positions = self.get_mock_positions(dash)
|
|
|
|
new_label_colors = {
|
|
|
|
'data value': 'random color',
|
|
|
|
}
|
|
|
|
data = {
|
|
|
|
'css': '',
|
|
|
|
'expanded_slices': {},
|
|
|
|
'positions': positions,
|
|
|
|
'dashboard_title': dash.dashboard_title,
|
|
|
|
'color_namespace': 'Color Namespace Test',
|
|
|
|
'color_scheme': 'Color Scheme Test',
|
|
|
|
'label_colors': new_label_colors,
|
|
|
|
|
|
|
|
}
|
|
|
|
url = '/superset/save_dash/{}/'.format(dash.id)
|
|
|
|
self.get_resp(url, data=dict(data=json.dumps(data)))
|
|
|
|
updatedDash = (
|
|
|
|
db.session.query(models.Dashboard)
|
|
|
|
.filter_by(slug='births')
|
|
|
|
.first()
|
|
|
|
)
|
|
|
|
self.assertIn('color_namespace', updatedDash.json_metadata)
|
|
|
|
self.assertIn('color_scheme', updatedDash.json_metadata)
|
|
|
|
self.assertIn('label_colors', updatedDash.json_metadata)
|
|
|
|
# bring back original dashboard
|
|
|
|
del data['color_namespace']
|
|
|
|
del data['color_scheme']
|
|
|
|
del data['label_colors']
|
|
|
|
self.get_resp(url, data=dict(data=json.dumps(data)))
|
|
|
|
|
2018-04-07 15:55:05 -04:00
|
|
|
def test_copy_dash(self, username='admin'):
|
|
|
|
self.login(username=username)
|
|
|
|
dash = db.session.query(models.Dashboard).filter_by(
|
|
|
|
slug='births').first()
|
2018-07-24 18:23:30 -04:00
|
|
|
positions = self.get_mock_positions(dash)
|
2019-03-29 09:35:22 -04:00
|
|
|
new_label_colors = {
|
|
|
|
'data value': 'random color',
|
|
|
|
}
|
2018-04-07 15:55:05 -04:00
|
|
|
data = {
|
|
|
|
'css': '',
|
|
|
|
'duplicate_slices': False,
|
|
|
|
'expanded_slices': {},
|
2018-07-24 18:23:30 -04:00
|
|
|
'positions': positions,
|
2018-04-07 15:55:05 -04:00
|
|
|
'dashboard_title': 'Copy Of Births',
|
2019-03-29 09:35:22 -04:00
|
|
|
'color_namespace': 'Color Namespace Test',
|
|
|
|
'color_scheme': 'Color Scheme Test',
|
|
|
|
'label_colors': new_label_colors,
|
2018-04-07 15:55:05 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
# Save changes to Births dashboard and retrieve updated dash
|
|
|
|
dash_id = dash.id
|
|
|
|
url = '/superset/save_dash/{}/'.format(dash_id)
|
|
|
|
self.client.post(url, data=dict(data=json.dumps(data)))
|
|
|
|
dash = db.session.query(models.Dashboard).filter_by(
|
|
|
|
id=dash_id).first()
|
|
|
|
orig_json_data = dash.data
|
|
|
|
|
|
|
|
# Verify that copy matches original
|
|
|
|
url = '/superset/copy_dash/{}/'.format(dash_id)
|
|
|
|
resp = self.get_json_resp(url, data=dict(data=json.dumps(data)))
|
|
|
|
self.assertEqual(resp['dashboard_title'], 'Copy Of Births')
|
|
|
|
self.assertEqual(resp['position_json'], orig_json_data['position_json'])
|
|
|
|
self.assertEqual(resp['metadata'], orig_json_data['metadata'])
|
2018-07-01 11:47:57 -04:00
|
|
|
# check every attribute in each dashboard's slices list,
|
|
|
|
# exclude modified and changed_on attribute
|
|
|
|
for index, slc in enumerate(orig_json_data['slices']):
|
|
|
|
for key in slc:
|
|
|
|
if key not in ['modified', 'changed_on']:
|
|
|
|
self.assertEqual(slc[key], resp['slices'][index][key])
|
2018-04-07 15:55:05 -04:00
|
|
|
|
|
|
|
def test_add_slices(self, username='admin'):
|
|
|
|
self.login(username=username)
|
|
|
|
dash = db.session.query(models.Dashboard).filter_by(
|
|
|
|
slug='births').first()
|
|
|
|
new_slice = db.session.query(models.Slice).filter_by(
|
2018-11-19 18:27:25 -05:00
|
|
|
slice_name='Energy Force Layout').first()
|
2018-04-07 15:55:05 -04:00
|
|
|
existing_slice = db.session.query(models.Slice).filter_by(
|
|
|
|
slice_name='Name Cloud').first()
|
|
|
|
data = {
|
|
|
|
'slice_ids': [new_slice.data['slice_id'],
|
|
|
|
existing_slice.data['slice_id']],
|
|
|
|
}
|
|
|
|
url = '/superset/add_slices/{}/'.format(dash.id)
|
|
|
|
resp = self.client.post(url, data=dict(data=json.dumps(data)))
|
|
|
|
assert 'SLICES ADDED' in resp.data.decode('utf-8')
|
|
|
|
|
|
|
|
dash = db.session.query(models.Dashboard).filter_by(
|
|
|
|
slug='births').first()
|
|
|
|
new_slice = db.session.query(models.Slice).filter_by(
|
2018-11-19 18:27:25 -05:00
|
|
|
slice_name='Energy Force Layout').first()
|
2018-04-07 15:55:05 -04:00
|
|
|
assert new_slice in dash.slices
|
|
|
|
assert len(set(dash.slices)) == len(dash.slices)
|
|
|
|
|
|
|
|
# cleaning up
|
|
|
|
dash = db.session.query(models.Dashboard).filter_by(
|
|
|
|
slug='births').first()
|
|
|
|
dash.slices = [
|
2018-11-19 18:27:25 -05:00
|
|
|
o for o in dash.slices if o.slice_name != 'Energy Force Layout']
|
2018-04-07 15:55:05 -04:00
|
|
|
db.session.commit()
|
|
|
|
|
[wip] dashboard builder v2 (#4528)
* [dashboard builder] Add dir structure for dashboard/v2, simplified Header, split pane, Draggable side panel
[grid] add <DashboardGrid />, <ResizableContainer />, and initial grid components.
[grid] gridComponents/ directory, add fixtures/ directory and test layout, add <Column />
[grid] working grid with gutters
[grid] design tweaks and polish, add <Tabs />
[header] add gradient header logo and favicon
[dnd] begin adding dnd functionality
[dnd] add util/isValidChild.js
[react-beautiful-dnd] iterate on dnd until blocked
[dnd] refactor to use react-dnd
[react-dnd] refactor to use composable <DashboardComponent /> structure
[dnd] factor out DashboardComponent, let components render dropInidcator and set draggableRef, add draggable tabs
[dnd] refactor to use redux, add DashboardComponent and DashboardGrid containers
[dragdroppable] rename horizontal/vertical => row/column
[builder] refactor into HoverMenu, add WithPopoverMenu
[builder] add editable header and disableDragDrop prop for Dragdroppable's
[builder] make tabs editable
[builder] add generic popover dropdown and header row style editability
[builder] add hover rowStyle dropdown, make row styles editable
[builder] add some new component icons, add popover with delete to charts
[builder] add preview icons, add popover menu to rows.
[builder] add IconButton and RowStyleDropdown
[resizable] use ResizableContainer instead of DimensionProvider, fix resize and delete bugs
[builder] fix bug with spacer
[builder] clean up, header.size => header.headerSize
[builder] support more drag/drop combinations by wrapping some components in rows upon drop. fix within list drop index. refactor some utils.
[builder][tabs] fix broken add tab button
[dashboard builder] don't pass dashboard layout to all dashboard components, improve drop indicator logic, fix delete component pure component bug
[dnd] refactor drop position logic
* fix rebase error, clean up css organization and use @less vars
* [dashboard-builder] add top-level tabs + undo-redo (#4626)
* [top-level-tabs] initial working version of top-level tabs
* [top-level-tabs] simplify redux and disable ability to displace top-level tabs with other tabs
* [top-level-tabs] improve tab drag and drop css
* [undo-redo] add redux undo redo
* [dnd] clean up dropResult shape, add new component source id + type, use css for drop indicator instead of styles and fix tab indicators.
* [top-level-tabs] add 'Collapse tab content' to delete tabs button
* [dnd] add depth validation to drag and drop logic
* [dashboard-builder] add resize action, enforce minimum width of columns, column children inherit column size when necessary, meta.rowStyle => meta.background, add background to columns
* [dashboard-builder] make sure getChildWidth returns a number
* [dashboard builder] static layout + toasts (#4763)
* [dashboard-builder] remove spacer component
* [dashboard-builder] better transparent indicator, better grid gutter logic, no dragging top-level tabs, headers are multiples of grid unit, fix row height granularity, update redux state key dashboard => dashboardLayout
* [dashboard-builder] don't blast column child dimensions on resize
* [dashboard-builder] ResizableContainer min size can't be smaller than size, fix row style, role=none on WithPopoverMenu container
* [edit mode] add edit mode to redux and propogate to all <DashboardComponent />s
* [toasts] add Toast component, ToastPresenter container and component, and toast redux actions + reducers
* [dashboard-builder] add info toast when dropResult overflows parent
* [dashboard builder] git mv to src/ post-rebase
* Dashboard builder rebased + linted (#4849)
* define dashboard redux state
* update dashboard state reducer
* dashboard layout converter + grid render
* builder pane + slice adder
* Dashboard header + slice header controls
* fix linting
* 2nd code review comments
* [dashboard builder] improve perf (#4855)
* address major perf + css issues
[dashboard builder] fix dashboard filters and some css
[dashboard builder] use VIZ_TYPES, move stricter .eslintrc to dashboard/, more css fixes
[builder] delete GridCell and GridLayout, remove some unused css. fix broken tabs.
* [builder] fix errors post-rebase
* [builder] add support for custom DragDroppable drag layer and add AddSliceDragPreview
* [AddSliceDragPreview] fix type check
* [dashboard builder] add prettier and update all files
* [dashboard builder] merge v2/ directory int dashboard/
* [dashboard builder] move component/*Container => containers/*
* add sticky tabs + sidepane, better tabs perf, better container hierarchy, better chart header (#4893)
* dashboard header, slice header UI improvement
* add slider and sticky
* dashboard header, slice header UI improvement
* make builder pane floating
* [dashboard builder] add sticky top-level tabs, refactor for performant tabs
* [dashboard builder] visually distinct containers, icons for undo-redo, fix some isValidChild bugs
* [dashboard builder] better undo redo <> save changes state, notify upon reaching undo limit
* [dashboard builder] hook up edit + create component actions to saved-state pop.
* [dashboard builder] visual refinement, refactor Dashboard header content and updates into layout for undo-redo, refactor save dashboard modal to use toasts instead of notify.
* [dashboard builder] refactor chart name update logic to use layout for undo redo, save slice name changes on dashboard save
* add slider and sticky
* [dashboard builder] fix layout converter slice_id + chartId type casting, don't change grid size upon edit (perf)
* [dashboard builder] don't set version key in getInitialState
* [dashboard builder] make top level tabs addition/removal undoable, fix double sticky tabs + side panel.
* [dashboard builder] fix sticky tabs offset bug
* [dashboard builder] fix drag preview width, css polish, fix rebase issue
* [dashboard builder] fix side pane labels and hove z-index
* Markdown for dashboard (#4962)
* fix dashboard server-side unit tests (#5009)
* Dashboard save button (#4979)
* save button
* fix slices list height
* save custom css
* merge save-dash changes from dashboard v1
https://github.com/apache/incubator-superset/pull/4900
https://github.com/apache/incubator-superset/pull/5051
* [dashboard v2] check for default_filters before json_loads-ing them (#5064)
[dashboard v2] check for default_filters before json-loads-ing them
* [dashboard v2] fix bugs from rebase
* [dashboard v2] tests! (#5066)
* [dashboard v2][tests] add tests for newComponentFactory, isValidChild, dropOverflowsParent, and dnd-reorder
* [dashboard v2][tests] add tests for componentIsResizable, findParentId, getChartIdsFromLayout, newEntitiesFromDrop, and getDropPosition
* [dashboard v2][tests] add mockStore, mockState, and tests for DragDroppable, DashboardBuilder, DashboardGrid, ToastPresenter, and Toast
* [dashboard builder][tests] separate files for state tree fixtures, add ChartHolder, Chart, Divider, Header, Row tests and WithDragDropContext helper
* [dashboard v2][tests] fix dragdrop context with util/getDragDropManager, add test for menu/* and resizable/*, and new components
* [dashboard v2][tests] fix and re-write Dashboard tests, add getFormDataWithExtraFilters_spec
* [dashboard v2][tests] add reducer tests, fix lint error
* [dashboard-v2][tests] add actions/dashboardLayout_spec
* [dashboard v2] fix some prop bugs, open side pane on edit, fix slice name bug
* [dashboard v2] fix slice name save bug
* [dashboard v2] fix lint errors
* [dashboard v2] fix filters bug and add test
* [dashboard v2] fix getFormDataWithExtraFilters_spec
* [dashboard v2] logging updates (#5087)
* [dashboard v2] initial logging refactor
* [dashboard v2] clean up logger
* [logger] update explore with new log events, add refresh dashboard + refresh dashboard chart actions
* [logging] add logger_spec.js, fix reducers/dashboardState_spec + gridComponents/Chart_spec
* [dashboard v2][logging] refactor for bulk logging in python
* [logging] tweak python, fix and remove dup start_offset entries
* [dashboard v2][logging] add dashboard_first_load event
* [dashboard v2][logging] add slice_ids to dashboard pane load event
* [tests] fix npm test script
* Fix: update slices list when add/remove multiple slices (#5138)
* [dashboard v2] add v1 switch (#5126)
* [dashboard] copy all dashboard v1 into working v1 switch
* [dashboard] add functional v1 <> v2 switch with messaging
* [dashboard] add v2 logging to v1 dashboard, add read-v2-changes link, add client logging to track v1 <> v2 switches
* [dashboard] Remove default values for feedback url + v2 auto convert date
* [dashboard v2] fix misc UI/UX issues
* [dashboard v2] fix Markdown persistance issues and css, fix copy dash title, don't enforce shallow hovering with drop indicator
* [dashboard v2] improve non-shallow drop target UX, fix Markdown drop indicator, clarify slice adder filter/sort
* [dashboard v2] delete empty rows on drag or delete events that leave them without children, add test
* [dashboard v2] improve v1<>v2 switch modals, add convert to v2 badge in v1, fix unsaved changes issue in preview mode, don't auto convert column child widths for now
* [dashboard v2][dnd] add drop position cache to fix non-shallow drops
* [dashboard] fix test script with glob instead of recurse, fix tests, add temp fix for tab nesting, ignore v1 lint errors
* [dashboard] v2 badge style tweaks, add back v1 _set_dash_metadata for v1 editing
* [dashboard] fix python linting and tests
* [dashboard] lint tests
* add slice from explore view (#5141)
* Fix dashboard position row data (#5131)
* add slice_name to markdown
(cherry picked from commit 14b01f1)
* set min grid width be 1 column
* remove empty column
* check total columns count <= 12
* scan position data and fix rows
* fix dashboard url with default_filters
* [dashboard v2] better grid drop ux, fix tab bugs 🐛 (#5151)
* [dashboard v2] add empty droptarget to dashboard grid for better ux and update test
* [dashboard] reset tab index upon top-level tab deletion, fix findparentid bug
* [dashboard] update v1<>v2 modal link for tracking
* Fix: Should pass slice_can_edit flag down (#5159)
* [dash builder fix] combine markdown and slice name, slice picker height (#5165)
* combine markdown code and markdown slice name
* allow dynamic height for slice picker cell
* add word break for long datasource name
* [fix] new dashboard state (#5213)
* [dashboard v2] ui + ux fixes (#5208)
* [dashboard v2] use <Loading /> throughout, small loading gif, improve row/column visual hierarchy, add cached data pop
* [dashboard v2] lots of polish
* [dashboard v2] remove markdown padding on edit, more opaque slice drag preview, unsavedChanges=true upon moving a component, fix initial load logging.
* [dashboard v2] gray loading.gif, sticky header, undo/redo keyboard shortcuts, fix move component saved changes update, v0 double scrollbar fix
* [dashboard v2] move UndoRedoKeylisteners into Header, render only in edit mode, show visual feedback for keyboard shortcut, hide hover menu in top-level tabs
* [dashboard v2] fix grid + sidepane height issues
* [dashboard v2] add auto-resize functionality, update tests. cache findParentId results.
* [dashboard v2][tests] add getDetailedComponentWidth_spec.js
* [dashboard v2] fix lint
* [fix] layout converter fix (#5218)
* [fix] layout converter fix
* add changed_on into initial sliceEntity data
* add unit tests for SliceAdder component
* remove old fixtures file
* [dashboard v2] remove webpack-cli, fresh yarn.lock post-rebase
* [dashboard v2] lint javascript
* [dashboard v2] fix python tests
* [Fix] import/export dash in V2 (#5273)
* [dashboard v2] add markdown tests (#5275)
* [dashboard v2] add Markdown tests
* [dashboard v2][mocks] fix markdown mock
2018-06-25 12:17:22 -04:00
|
|
|
def test_remove_slices(self, username='admin'):
|
|
|
|
self.login(username=username)
|
|
|
|
dash = db.session.query(models.Dashboard).filter_by(
|
|
|
|
slug='births').first()
|
|
|
|
origin_slices_length = len(dash.slices)
|
|
|
|
|
2018-07-24 18:23:30 -04:00
|
|
|
positions = self.get_mock_positions(dash)
|
|
|
|
# remove one chart
|
|
|
|
chart_keys = []
|
|
|
|
for key in positions.keys():
|
|
|
|
if key.startswith('DASHBOARD_CHART_TYPE'):
|
|
|
|
chart_keys.append(key)
|
|
|
|
positions.pop(chart_keys[0])
|
|
|
|
|
[wip] dashboard builder v2 (#4528)
* [dashboard builder] Add dir structure for dashboard/v2, simplified Header, split pane, Draggable side panel
[grid] add <DashboardGrid />, <ResizableContainer />, and initial grid components.
[grid] gridComponents/ directory, add fixtures/ directory and test layout, add <Column />
[grid] working grid with gutters
[grid] design tweaks and polish, add <Tabs />
[header] add gradient header logo and favicon
[dnd] begin adding dnd functionality
[dnd] add util/isValidChild.js
[react-beautiful-dnd] iterate on dnd until blocked
[dnd] refactor to use react-dnd
[react-dnd] refactor to use composable <DashboardComponent /> structure
[dnd] factor out DashboardComponent, let components render dropInidcator and set draggableRef, add draggable tabs
[dnd] refactor to use redux, add DashboardComponent and DashboardGrid containers
[dragdroppable] rename horizontal/vertical => row/column
[builder] refactor into HoverMenu, add WithPopoverMenu
[builder] add editable header and disableDragDrop prop for Dragdroppable's
[builder] make tabs editable
[builder] add generic popover dropdown and header row style editability
[builder] add hover rowStyle dropdown, make row styles editable
[builder] add some new component icons, add popover with delete to charts
[builder] add preview icons, add popover menu to rows.
[builder] add IconButton and RowStyleDropdown
[resizable] use ResizableContainer instead of DimensionProvider, fix resize and delete bugs
[builder] fix bug with spacer
[builder] clean up, header.size => header.headerSize
[builder] support more drag/drop combinations by wrapping some components in rows upon drop. fix within list drop index. refactor some utils.
[builder][tabs] fix broken add tab button
[dashboard builder] don't pass dashboard layout to all dashboard components, improve drop indicator logic, fix delete component pure component bug
[dnd] refactor drop position logic
* fix rebase error, clean up css organization and use @less vars
* [dashboard-builder] add top-level tabs + undo-redo (#4626)
* [top-level-tabs] initial working version of top-level tabs
* [top-level-tabs] simplify redux and disable ability to displace top-level tabs with other tabs
* [top-level-tabs] improve tab drag and drop css
* [undo-redo] add redux undo redo
* [dnd] clean up dropResult shape, add new component source id + type, use css for drop indicator instead of styles and fix tab indicators.
* [top-level-tabs] add 'Collapse tab content' to delete tabs button
* [dnd] add depth validation to drag and drop logic
* [dashboard-builder] add resize action, enforce minimum width of columns, column children inherit column size when necessary, meta.rowStyle => meta.background, add background to columns
* [dashboard-builder] make sure getChildWidth returns a number
* [dashboard builder] static layout + toasts (#4763)
* [dashboard-builder] remove spacer component
* [dashboard-builder] better transparent indicator, better grid gutter logic, no dragging top-level tabs, headers are multiples of grid unit, fix row height granularity, update redux state key dashboard => dashboardLayout
* [dashboard-builder] don't blast column child dimensions on resize
* [dashboard-builder] ResizableContainer min size can't be smaller than size, fix row style, role=none on WithPopoverMenu container
* [edit mode] add edit mode to redux and propogate to all <DashboardComponent />s
* [toasts] add Toast component, ToastPresenter container and component, and toast redux actions + reducers
* [dashboard-builder] add info toast when dropResult overflows parent
* [dashboard builder] git mv to src/ post-rebase
* Dashboard builder rebased + linted (#4849)
* define dashboard redux state
* update dashboard state reducer
* dashboard layout converter + grid render
* builder pane + slice adder
* Dashboard header + slice header controls
* fix linting
* 2nd code review comments
* [dashboard builder] improve perf (#4855)
* address major perf + css issues
[dashboard builder] fix dashboard filters and some css
[dashboard builder] use VIZ_TYPES, move stricter .eslintrc to dashboard/, more css fixes
[builder] delete GridCell and GridLayout, remove some unused css. fix broken tabs.
* [builder] fix errors post-rebase
* [builder] add support for custom DragDroppable drag layer and add AddSliceDragPreview
* [AddSliceDragPreview] fix type check
* [dashboard builder] add prettier and update all files
* [dashboard builder] merge v2/ directory int dashboard/
* [dashboard builder] move component/*Container => containers/*
* add sticky tabs + sidepane, better tabs perf, better container hierarchy, better chart header (#4893)
* dashboard header, slice header UI improvement
* add slider and sticky
* dashboard header, slice header UI improvement
* make builder pane floating
* [dashboard builder] add sticky top-level tabs, refactor for performant tabs
* [dashboard builder] visually distinct containers, icons for undo-redo, fix some isValidChild bugs
* [dashboard builder] better undo redo <> save changes state, notify upon reaching undo limit
* [dashboard builder] hook up edit + create component actions to saved-state pop.
* [dashboard builder] visual refinement, refactor Dashboard header content and updates into layout for undo-redo, refactor save dashboard modal to use toasts instead of notify.
* [dashboard builder] refactor chart name update logic to use layout for undo redo, save slice name changes on dashboard save
* add slider and sticky
* [dashboard builder] fix layout converter slice_id + chartId type casting, don't change grid size upon edit (perf)
* [dashboard builder] don't set version key in getInitialState
* [dashboard builder] make top level tabs addition/removal undoable, fix double sticky tabs + side panel.
* [dashboard builder] fix sticky tabs offset bug
* [dashboard builder] fix drag preview width, css polish, fix rebase issue
* [dashboard builder] fix side pane labels and hove z-index
* Markdown for dashboard (#4962)
* fix dashboard server-side unit tests (#5009)
* Dashboard save button (#4979)
* save button
* fix slices list height
* save custom css
* merge save-dash changes from dashboard v1
https://github.com/apache/incubator-superset/pull/4900
https://github.com/apache/incubator-superset/pull/5051
* [dashboard v2] check for default_filters before json_loads-ing them (#5064)
[dashboard v2] check for default_filters before json-loads-ing them
* [dashboard v2] fix bugs from rebase
* [dashboard v2] tests! (#5066)
* [dashboard v2][tests] add tests for newComponentFactory, isValidChild, dropOverflowsParent, and dnd-reorder
* [dashboard v2][tests] add tests for componentIsResizable, findParentId, getChartIdsFromLayout, newEntitiesFromDrop, and getDropPosition
* [dashboard v2][tests] add mockStore, mockState, and tests for DragDroppable, DashboardBuilder, DashboardGrid, ToastPresenter, and Toast
* [dashboard builder][tests] separate files for state tree fixtures, add ChartHolder, Chart, Divider, Header, Row tests and WithDragDropContext helper
* [dashboard v2][tests] fix dragdrop context with util/getDragDropManager, add test for menu/* and resizable/*, and new components
* [dashboard v2][tests] fix and re-write Dashboard tests, add getFormDataWithExtraFilters_spec
* [dashboard v2][tests] add reducer tests, fix lint error
* [dashboard-v2][tests] add actions/dashboardLayout_spec
* [dashboard v2] fix some prop bugs, open side pane on edit, fix slice name bug
* [dashboard v2] fix slice name save bug
* [dashboard v2] fix lint errors
* [dashboard v2] fix filters bug and add test
* [dashboard v2] fix getFormDataWithExtraFilters_spec
* [dashboard v2] logging updates (#5087)
* [dashboard v2] initial logging refactor
* [dashboard v2] clean up logger
* [logger] update explore with new log events, add refresh dashboard + refresh dashboard chart actions
* [logging] add logger_spec.js, fix reducers/dashboardState_spec + gridComponents/Chart_spec
* [dashboard v2][logging] refactor for bulk logging in python
* [logging] tweak python, fix and remove dup start_offset entries
* [dashboard v2][logging] add dashboard_first_load event
* [dashboard v2][logging] add slice_ids to dashboard pane load event
* [tests] fix npm test script
* Fix: update slices list when add/remove multiple slices (#5138)
* [dashboard v2] add v1 switch (#5126)
* [dashboard] copy all dashboard v1 into working v1 switch
* [dashboard] add functional v1 <> v2 switch with messaging
* [dashboard] add v2 logging to v1 dashboard, add read-v2-changes link, add client logging to track v1 <> v2 switches
* [dashboard] Remove default values for feedback url + v2 auto convert date
* [dashboard v2] fix misc UI/UX issues
* [dashboard v2] fix Markdown persistance issues and css, fix copy dash title, don't enforce shallow hovering with drop indicator
* [dashboard v2] improve non-shallow drop target UX, fix Markdown drop indicator, clarify slice adder filter/sort
* [dashboard v2] delete empty rows on drag or delete events that leave them without children, add test
* [dashboard v2] improve v1<>v2 switch modals, add convert to v2 badge in v1, fix unsaved changes issue in preview mode, don't auto convert column child widths for now
* [dashboard v2][dnd] add drop position cache to fix non-shallow drops
* [dashboard] fix test script with glob instead of recurse, fix tests, add temp fix for tab nesting, ignore v1 lint errors
* [dashboard] v2 badge style tweaks, add back v1 _set_dash_metadata for v1 editing
* [dashboard] fix python linting and tests
* [dashboard] lint tests
* add slice from explore view (#5141)
* Fix dashboard position row data (#5131)
* add slice_name to markdown
(cherry picked from commit 14b01f1)
* set min grid width be 1 column
* remove empty column
* check total columns count <= 12
* scan position data and fix rows
* fix dashboard url with default_filters
* [dashboard v2] better grid drop ux, fix tab bugs 🐛 (#5151)
* [dashboard v2] add empty droptarget to dashboard grid for better ux and update test
* [dashboard] reset tab index upon top-level tab deletion, fix findparentid bug
* [dashboard] update v1<>v2 modal link for tracking
* Fix: Should pass slice_can_edit flag down (#5159)
* [dash builder fix] combine markdown and slice name, slice picker height (#5165)
* combine markdown code and markdown slice name
* allow dynamic height for slice picker cell
* add word break for long datasource name
* [fix] new dashboard state (#5213)
* [dashboard v2] ui + ux fixes (#5208)
* [dashboard v2] use <Loading /> throughout, small loading gif, improve row/column visual hierarchy, add cached data pop
* [dashboard v2] lots of polish
* [dashboard v2] remove markdown padding on edit, more opaque slice drag preview, unsavedChanges=true upon moving a component, fix initial load logging.
* [dashboard v2] gray loading.gif, sticky header, undo/redo keyboard shortcuts, fix move component saved changes update, v0 double scrollbar fix
* [dashboard v2] move UndoRedoKeylisteners into Header, render only in edit mode, show visual feedback for keyboard shortcut, hide hover menu in top-level tabs
* [dashboard v2] fix grid + sidepane height issues
* [dashboard v2] add auto-resize functionality, update tests. cache findParentId results.
* [dashboard v2][tests] add getDetailedComponentWidth_spec.js
* [dashboard v2] fix lint
* [fix] layout converter fix (#5218)
* [fix] layout converter fix
* add changed_on into initial sliceEntity data
* add unit tests for SliceAdder component
* remove old fixtures file
* [dashboard v2] remove webpack-cli, fresh yarn.lock post-rebase
* [dashboard v2] lint javascript
* [dashboard v2] fix python tests
* [Fix] import/export dash in V2 (#5273)
* [dashboard v2] add markdown tests (#5275)
* [dashboard v2] add Markdown tests
* [dashboard v2][mocks] fix markdown mock
2018-06-25 12:17:22 -04:00
|
|
|
data = {
|
|
|
|
'css': '',
|
|
|
|
'expanded_slices': {},
|
|
|
|
'positions': positions,
|
|
|
|
'dashboard_title': dash.dashboard_title,
|
|
|
|
}
|
|
|
|
|
|
|
|
# save dash
|
|
|
|
dash_id = dash.id
|
|
|
|
url = '/superset/save_dash/{}/'.format(dash_id)
|
|
|
|
self.client.post(url, data=dict(data=json.dumps(data)))
|
|
|
|
dash = db.session.query(models.Dashboard).filter_by(
|
|
|
|
id=dash_id).first()
|
|
|
|
|
|
|
|
# verify slices data
|
|
|
|
data = dash.data
|
|
|
|
self.assertEqual(len(data['slices']), origin_slices_length - 1)
|
|
|
|
|
2018-04-07 15:55:05 -04:00
|
|
|
def test_public_user_dashboard_access(self):
|
|
|
|
table = (
|
|
|
|
db.session
|
|
|
|
.query(SqlaTable)
|
|
|
|
.filter_by(table_name='birth_names')
|
|
|
|
.one()
|
|
|
|
)
|
|
|
|
# Try access before adding appropriate permissions.
|
|
|
|
self.revoke_public_access_to_table(table)
|
|
|
|
self.logout()
|
|
|
|
|
2018-08-03 15:46:48 -04:00
|
|
|
resp = self.get_resp('/chart/list/')
|
2018-04-07 15:55:05 -04:00
|
|
|
self.assertNotIn('birth_names</a>', resp)
|
|
|
|
|
2018-08-03 15:46:48 -04:00
|
|
|
resp = self.get_resp('/dashboard/list/')
|
2018-04-07 15:55:05 -04:00
|
|
|
self.assertNotIn('/superset/dashboard/births/', resp)
|
|
|
|
|
|
|
|
self.grant_public_access_to_table(table)
|
|
|
|
|
|
|
|
# Try access after adding appropriate permissions.
|
2018-08-03 15:46:48 -04:00
|
|
|
self.assertIn('birth_names', self.get_resp('/chart/list/'))
|
2018-04-07 15:55:05 -04:00
|
|
|
|
2018-08-03 15:46:48 -04:00
|
|
|
resp = self.get_resp('/dashboard/list/')
|
2018-04-07 15:55:05 -04:00
|
|
|
self.assertIn('/superset/dashboard/births/', resp)
|
|
|
|
|
|
|
|
self.assertIn('Births', self.get_resp('/superset/dashboard/births/'))
|
|
|
|
|
|
|
|
# Confirm that public doesn't have access to other datasets.
|
2018-08-03 15:46:48 -04:00
|
|
|
resp = self.get_resp('/chart/list/')
|
2018-04-07 15:55:05 -04:00
|
|
|
self.assertNotIn('wb_health_population</a>', resp)
|
|
|
|
|
2018-08-03 15:46:48 -04:00
|
|
|
resp = self.get_resp('/dashboard/list/')
|
2018-04-07 15:55:05 -04:00
|
|
|
self.assertNotIn('/superset/dashboard/world_health/', resp)
|
|
|
|
|
|
|
|
def test_dashboard_with_created_by_can_be_accessed_by_public_users(self):
|
|
|
|
self.logout()
|
|
|
|
table = (
|
|
|
|
db.session
|
|
|
|
.query(SqlaTable)
|
|
|
|
.filter_by(table_name='birth_names')
|
|
|
|
.one()
|
|
|
|
)
|
|
|
|
self.grant_public_access_to_table(table)
|
|
|
|
|
|
|
|
dash = db.session.query(models.Dashboard).filter_by(
|
|
|
|
slug='births').first()
|
|
|
|
dash.owners = [security_manager.find_user('admin')]
|
|
|
|
dash.created_by = security_manager.find_user('admin')
|
|
|
|
db.session.merge(dash)
|
|
|
|
db.session.commit()
|
|
|
|
|
|
|
|
assert 'Births' in self.get_resp('/superset/dashboard/births/')
|
|
|
|
|
|
|
|
def test_only_owners_can_save(self):
|
|
|
|
dash = (
|
|
|
|
db.session
|
|
|
|
.query(models.Dashboard)
|
|
|
|
.filter_by(slug='births')
|
|
|
|
.first()
|
|
|
|
)
|
|
|
|
dash.owners = []
|
|
|
|
db.session.merge(dash)
|
|
|
|
db.session.commit()
|
|
|
|
self.test_save_dash('admin')
|
|
|
|
|
|
|
|
self.logout()
|
|
|
|
self.assertRaises(
|
|
|
|
Exception, self.test_save_dash, 'alpha')
|
|
|
|
|
|
|
|
alpha = security_manager.find_user('alpha')
|
|
|
|
|
|
|
|
dash = (
|
|
|
|
db.session
|
|
|
|
.query(models.Dashboard)
|
|
|
|
.filter_by(slug='births')
|
|
|
|
.first()
|
|
|
|
)
|
|
|
|
dash.owners = [alpha]
|
|
|
|
db.session.merge(dash)
|
|
|
|
db.session.commit()
|
|
|
|
self.test_save_dash('alpha')
|
|
|
|
|
2018-06-20 15:08:16 -04:00
|
|
|
def test_owners_can_view_empty_dashboard(self):
|
|
|
|
dash = (
|
|
|
|
db.session
|
|
|
|
.query(models.Dashboard)
|
|
|
|
.filter_by(slug='empty_dashboard')
|
|
|
|
.first()
|
|
|
|
)
|
|
|
|
if not dash:
|
|
|
|
dash = models.Dashboard()
|
|
|
|
dash.dashboard_title = 'Empty Dashboard'
|
|
|
|
dash.slug = 'empty_dashboard'
|
|
|
|
else:
|
|
|
|
dash.slices = []
|
|
|
|
dash.owners = []
|
|
|
|
db.session.merge(dash)
|
|
|
|
db.session.commit()
|
|
|
|
|
|
|
|
gamma_user = security_manager.find_user('gamma')
|
|
|
|
self.login(gamma_user.username)
|
|
|
|
|
2018-08-03 15:46:48 -04:00
|
|
|
resp = self.get_resp('/dashboard/list/')
|
2018-06-20 15:08:16 -04:00
|
|
|
self.assertNotIn('/superset/dashboard/empty_dashboard/', resp)
|
|
|
|
|
|
|
|
dash = (
|
|
|
|
db.session
|
|
|
|
.query(models.Dashboard)
|
|
|
|
.filter_by(slug='empty_dashboard')
|
|
|
|
.first()
|
|
|
|
)
|
|
|
|
dash.owners = [gamma_user]
|
|
|
|
db.session.merge(dash)
|
|
|
|
db.session.commit()
|
|
|
|
|
2018-08-03 15:46:48 -04:00
|
|
|
resp = self.get_resp('/dashboard/list/')
|
2018-06-20 15:08:16 -04:00
|
|
|
self.assertIn('/superset/dashboard/empty_dashboard/', resp)
|
|
|
|
|
2018-04-07 15:55:05 -04:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
unittest.main()
|