diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/DatasetPanel/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/DatasetPanel/index.tsx
new file mode 100644
index 0000000000000..9fe93b8fb5888
--- /dev/null
+++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/DatasetPanel/index.tsx
@@ -0,0 +1,23 @@
+/**
+ * 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.
+ */
+import React from 'react';
+
+export default function DatasetPanel() {
+ return
Dataset Panel
;
+}
diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/Footer/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/Footer/index.tsx
new file mode 100644
index 0000000000000..07c35741eef3e
--- /dev/null
+++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/Footer/index.tsx
@@ -0,0 +1,23 @@
+/**
+ * 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.
+ */
+import React from 'react';
+
+export default function Footer() {
+ return Footer
;
+}
diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/Header/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/Header/index.tsx
new file mode 100644
index 0000000000000..44f0e19f7bcc6
--- /dev/null
+++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/Header/index.tsx
@@ -0,0 +1,23 @@
+/**
+ * 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.
+ */
+import React from 'react';
+
+export default function Header() {
+ return Header
;
+}
diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/LeftPanel/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/LeftPanel/index.tsx
new file mode 100644
index 0000000000000..5ffb6a12c9ce0
--- /dev/null
+++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/LeftPanel/index.tsx
@@ -0,0 +1,23 @@
+/**
+ * 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.
+ */
+import React from 'react';
+
+export default function LeftPanel() {
+ return Left Panel
;
+}
diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/RightPanel/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/RightPanel/index.tsx
new file mode 100644
index 0000000000000..60f9589aad2ef
--- /dev/null
+++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/RightPanel/index.tsx
@@ -0,0 +1,23 @@
+/**
+ * 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.
+ */
+import React from 'react';
+
+export default function RightPanel() {
+ return Right Panel
;
+}
diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/index.tsx
new file mode 100644
index 0000000000000..974091f1efe9c
--- /dev/null
+++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/index.tsx
@@ -0,0 +1,38 @@
+/**
+ * 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.
+ */
+import React from 'react';
+import Header from './Header';
+import DatasetPanel from './DatasetPanel';
+import LeftPanel from './LeftPanel';
+import RightPanel from './RightPanel';
+import Footer from './Footer';
+
+export default function DatasetPage() {
+ return (
+
+ );
+}
diff --git a/superset-frontend/src/views/routes.tsx b/superset-frontend/src/views/routes.tsx
index dbb9ca2fab858..732686838fa9f 100644
--- a/superset-frontend/src/views/routes.tsx
+++ b/superset-frontend/src/views/routes.tsx
@@ -81,6 +81,14 @@ const DatasetList = lazy(
/* webpackChunkName: "DatasetList" */ 'src/views/CRUD/data/dataset/DatasetList'
),
);
+
+const DatasetPage = lazy(
+ () =>
+ import(
+ /* webpackChunkName: "DatasetEditor" */ 'src/views/CRUD/data/dataset/DatasetPage/index'
+ ),
+);
+
const ExecutionLog = lazy(
() =>
import(
@@ -189,6 +197,14 @@ export const routes: Routes = [
path: '/superset/explore/p',
Component: ExplorePage,
},
+ {
+ path: '/dataset/add/',
+ Component: DatasetPage,
+ },
+ {
+ path: '/dataset/:datasetId',
+ Component: DatasetPage,
+ },
];
const frontEndRoutes = routes
diff --git a/superset/initialization/__init__.py b/superset/initialization/__init__.py
index 588d9b66bfd11..8dfeff9942aba 100644
--- a/superset/initialization/__init__.py
+++ b/superset/initialization/__init__.py
@@ -169,7 +169,7 @@ def init_views(self) -> None:
DatabaseView,
ExcelToDatabaseView,
)
- from superset.views.datasource.views import Datasource
+ from superset.views.datasource.views import DatasetEditor, Datasource
from superset.views.dynamic_plugins import DynamicPluginsView
from superset.views.explore import ExplorePermalinkView, ExploreView
from superset.views.key_value import KV
@@ -289,6 +289,7 @@ def init_views(self) -> None:
appbuilder.add_view_no_menu(Dashboard)
appbuilder.add_view_no_menu(DashboardModelViewAsync)
appbuilder.add_view_no_menu(Datasource)
+ appbuilder.add_view_no_menu(DatasetEditor)
appbuilder.add_view_no_menu(EmbeddedView)
appbuilder.add_view_no_menu(ExploreView)
appbuilder.add_view_no_menu(ExplorePermalinkView)
diff --git a/superset/views/datasource/views.py b/superset/views/datasource/views.py
index 60ee4baddcca2..2c137fab79610 100644
--- a/superset/views/datasource/views.py
+++ b/superset/views/datasource/views.py
@@ -18,10 +18,10 @@
from collections import Counter
from typing import Any
-from flask import request
-from flask_appbuilder import expose
+from flask import redirect, request
+from flask_appbuilder import expose, permission_name
from flask_appbuilder.api import rison
-from flask_appbuilder.security.decorators import has_access_api
+from flask_appbuilder.security.decorators import has_access, has_access_api
from flask_babel import _
from marshmallow import ValidationError
from sqlalchemy.exc import NoSuchTableError
@@ -203,3 +203,27 @@ def samples(self) -> FlaskResponse:
payload=payload,
)
return self.json_response({"result": rv})
+
+
+class DatasetEditor(BaseSupersetView):
+ route_base = "/dataset"
+ class_permission_name = "Dataset"
+
+ @expose("/add/")
+ @has_access
+ @permission_name("read")
+ def root(self) -> FlaskResponse:
+ dev = request.args.get("testing")
+ if dev is not None:
+ return super().render_app_template()
+ return redirect("/")
+
+ @expose("/", methods=["GET"])
+ @has_access
+ @permission_name("read")
+ # pylint: disable=unused-argument
+ def show(self, pk: int) -> FlaskResponse:
+ dev = request.args.get("testing")
+ if dev is not None:
+ return super().render_app_template()
+ return redirect("/")