You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by kl...@apache.org on 2022/08/20 06:40:04 UTC

[incubator-devlake] branch main updated: fix: use camel-case props for adv json samples (#2782)

This is an automated email from the ASF dual-hosted git repository.

klesh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git


The following commit(s) were added to refs/heads/main by this push:
     new 466fe9c2 fix: use camel-case props for adv json samples (#2782)
466fe9c2 is described below

commit 466fe9c208c20e6c90d4ad82c1ebfc71a3b50eaa
Author: Julien Chinapen <ju...@merico.dev>
AuthorDate: Sat Aug 20 02:40:00 2022 -0400

    fix: use camel-case props for adv json samples (#2782)
    
    * fix: use camel-case props for adv json samples
    
    * refactor: update related properties to camel-case
    
    * feat: add application error fallback ui mode
    
    * chore: apply linting cleanups
---
 config-ui/src/App.js                               |  62 ++++++-------
 config-ui/src/components/ErrorBoundary.jsx         | 103 +++++++++++++++++++++
 .../src/components/blueprints/DataScopesGrid.jsx   |   4 +-
 .../blueprints/create-workflow/AdvancedJSON.jsx    |   2 +-
 config-ui/src/data/pipeline-config-samples/dbt.js  |   4 +-
 .../src/data/pipeline-config-samples/default.js    |  16 ++--
 .../src/data/pipeline-config-samples/feishu.js     |   4 +-
 .../data/pipeline-config-samples/gitextractor.js   |   4 +-
 .../src/data/pipeline-config-samples/github.js     |   4 +-
 .../src/data/pipeline-config-samples/gitlab.js     |   4 +-
 .../src/data/pipeline-config-samples/jenkins.js    |   4 +-
 config-ui/src/data/pipeline-config-samples/jira.js |   4 +-
 .../src/data/pipeline-config-samples/refdiff.js    |   4 +-
 .../src/data/pipeline-config-samples/starrocks.js  |   4 +-
 .../src/pages/blueprints/blueprint-settings.jsx    |  52 +++++------
 15 files changed, 188 insertions(+), 87 deletions(-)

diff --git a/config-ui/src/App.js b/config-ui/src/App.js
index 8161293d..94d37fa0 100644
--- a/config-ui/src/App.js
+++ b/config-ui/src/App.js
@@ -19,7 +19,7 @@
 import React from 'react'
 import {
   BrowserRouter as Router,
-  Route,
+  Route
 } from 'react-router-dom'
 
 import 'normalize.css'
@@ -32,6 +32,7 @@ import '@fontsource/inter/variable-full.css'
 // Theme variables (@styles/theme.scss) injected via Webpack w/ @sass-loader additionalData option!
 // import '@/styles/theme.scss'
 
+import ErrorBoundary from '@/components/ErrorBoundary'
 import Configure from './pages/configure/index'
 import Integration from '@/pages/configure/integration/index'
 import ManageIntegration from '@/pages/configure/integration/manage'
@@ -52,62 +53,59 @@ import Connections from '@/pages/connections/index'
 function App () {
   return (
     <Router>
-      {/* Admin */}
       <Route exact path='/'>
-        <Integration />
+        <ErrorBoundary>
+          <Integration />
+        </ErrorBoundary>
       </Route>
       <Route path='/integrations/:providerId'>
-        <ManageIntegration />
+        <ErrorBoundary>
+          <ManageIntegration />
+        </ErrorBoundary>
       </Route>
       <Route path='/connections/add/:providerId'>
-        <AddConnection />
-      </Route>
-      <Route path='/connections/edit/:providerId/:connectionId'>
-        <EditConnection />
+        <ErrorBoundary>
+          <AddConnection />
+        </ErrorBoundary>
       </Route>
       <Route path='/connections/configure/:providerId/:connectionId'>
-        <ConfigureConnection />
+        <ErrorBoundary>
+          <ConfigureConnection />
+        </ErrorBoundary>
       </Route>
       <Route exact path='/integrations'>
-        <Integration />
-      </Route>
-      <Route exact path='/triggers'>
-        <Triggers />
-      </Route>
-      <Route exact path='/pipelines/create'>
-        <CreatePipeline />
-      </Route>
-      <Route exact path='/pipelines'>
-        <Pipelines />
-      </Route>
-      <Route exact path='/pipelines/activity'>
-        <PipelineActivity />
-      </Route>
-      <Route exact path='/pipelines/activity/:pId'>
-        <PipelineActivity />
+        <ErrorBoundary>
+          <Integration />
+        </ErrorBoundary>
       </Route>
       <Route exact path='/blueprints/create'>
-        <CreateBlueprint />
+        <ErrorBoundary>
+          <CreateBlueprint />
+        </ErrorBoundary>
       </Route>
       <Route exact path='/blueprints/detail/:bId'>
-        <BlueprintDetail />
+        <ErrorBoundary>
+          <BlueprintDetail />
+        </ErrorBoundary>
       </Route>
       <Route exact path='/blueprints/settings/:bId'>
-        <BlueprintSettings />
+        <ErrorBoundary>
+          <BlueprintSettings />
+        </ErrorBoundary>
       </Route>
       <Route exact path='/blueprints'>
-        <Blueprints />
+        <ErrorBoundary>
+          <Blueprints />
+        </ErrorBoundary>
       </Route>
       <Route exact path='/connections'>
         <Connections />
       </Route>
-      <Route exact path='/lake/api/configuration'>
-        <Configure />
-      </Route>
       <Route exact path='/offline'>
         <Offline />
       </Route>
     </Router>
+
   )
 }
 
diff --git a/config-ui/src/components/ErrorBoundary.jsx b/config-ui/src/components/ErrorBoundary.jsx
new file mode 100644
index 00000000..daefc1a7
--- /dev/null
+++ b/config-ui/src/components/ErrorBoundary.jsx
@@ -0,0 +1,103 @@
+/*
+ * 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, { Fragment } from 'react'
+import { withRouter } from 'react-router-dom'
+import { Button, Intent, Icon, Colors, Elevation, Card } from '@blueprintjs/core'
+import Nav from '@/components/Nav'
+import Sidebar from '@/components/Sidebar'
+import AppCrumbs from '@/components/Breadcrumbs'
+import Content from '@/components/Content'
+import ContentLoader from '@/components/loaders/ContentLoader'
+import { ReactComponent as Logo } from '@/images/devlake-logo.svg'
+import { ReactComponent as LogoText } from '@/images/devlake-textmark.svg'
+
+class ErrorBoundary extends React.Component {
+  constructor (props) {
+    super(props)
+    this.state = {
+      hasError: false,
+      error: null,
+      errorInfo: null
+    }
+  }
+
+  static getDerivedStateFromError (error) {
+    console.log('>>> DEVLAKE APP ERROR:', error)
+    return { hasError: true, error: error }
+  }
+
+  componentDidCatch (error, errorInfo) {
+    console.log('>>> DEVLAKE ERROR STACKTRACE:', errorInfo, error)
+  }
+
+  render () {
+    if (this.state.hasError) {
+      return (
+        <>
+          <div className='container'>
+            <Nav />
+            <Content>
+              <main className='main' style={{ marginLeft: 0 }}>
+                <div className='headlineContainer'>
+                  <div style={{ display: 'flex', justifyContent: 'center' }}>
+                    <div>
+                      <div className='devlake-logo' style={{ margin: 0 }}>
+                        <Logo width={48} height={48} className='logo' />
+                        <LogoText width={100} height={13} className='logo-textmark' />
+                      </div>
+                      <h1 style={{ margin: 0, textAlign: 'center' }}>
+                        Application Error
+                      </h1>
+                      <Card elevation={Elevation.TWO} style={{ margin: '18px 0', maxWidth: '700px' }}>
+                        <h2 style={{ margin: 0 }}>
+                          <span style={{ display: 'inline-block', marginRight: '10px' }}>
+                            <Icon icon='error' color={Colors.RED5} size={16} />
+                          </span>
+                          {this.state.error?.toString() || 'Unknown Error'}
+                        </h2>
+                        <p style={{ margin: 0 }}>
+                          Please try again, if the problem persists include the above error message when filing a bug report on <strong>GitHub</strong>.
+                          You can also message us on <strong>Slack</strong> to engage with community members for solutions to common issues.
+                        </p>
+                        <p style={{ margin: '18px 0 0 0', textAlign: 'center' }}>
+                          <Button onClick={() => this.props.history.push('/')} text='Continue' intent={Intent.PRIMARY} />
+                          <a
+                            href='https://github.com/apache/incubator-devlake'
+                            className='bp3-button bp3-outlined'
+                            target='_blank'
+                            style={{ marginLeft: '10px' }}
+                            rel='noreferrer'
+                          >
+                            Visit GitHub
+                          </a>
+                        </p>
+                      </Card>
+                    </div>
+                  </div>
+                </div>
+              </main>
+            </Content>
+          </div>
+        </>
+      )
+    }
+
+    return this.props.children
+  }
+}
+export default withRouter(ErrorBoundary)
diff --git a/config-ui/src/components/blueprints/DataScopesGrid.jsx b/config-ui/src/components/blueprints/DataScopesGrid.jsx
index b7c13609..c1ccd540 100644
--- a/config-ui/src/components/blueprints/DataScopesGrid.jsx
+++ b/config-ui/src/components/blueprints/DataScopesGrid.jsx
@@ -204,9 +204,9 @@ const DataScopesGrid = (props) => {
               }}
             >
               <Button
-                disabled={[Providers.JENKINS, Providers.TAPD].includes(c.providerId)}
+                disabled={mode === BlueprintMode.NORMAL && [Providers.JENKINS, Providers.TAPD].includes(c.providerId)}
                 icon='annotation'
-                intent={c.providerId === Providers.JENKINS ? Intent.NONE : Intent.PRIMARY}
+                intent={mode === BlueprintMode.NORMAL && c.providerId === Providers.JENKINS ? Intent.NONE : Intent.PRIMARY}
                 size={12}
                 small
                 minimal
diff --git a/config-ui/src/components/blueprints/create-workflow/AdvancedJSON.jsx b/config-ui/src/components/blueprints/create-workflow/AdvancedJSON.jsx
index 5d6f165c..9bf0076c 100644
--- a/config-ui/src/components/blueprints/create-workflow/AdvancedJSON.jsx
+++ b/config-ui/src/components/blueprints/create-workflow/AdvancedJSON.jsx
@@ -99,7 +99,7 @@ const AdvancedJSON = (props) => {
         <Card
           className='code-editor-card'
           interactive={false}
-          elevation={elevation}
+          elevation={Elevation.ZERO}
           style={{ padding: '2px', minWidth: '320px', width: '100%', maxWidth: '100%', marginBottom: '20px', ...cardStyle }}
         >
           <TextArea
diff --git a/config-ui/src/data/pipeline-config-samples/dbt.js b/config-ui/src/data/pipeline-config-samples/dbt.js
index f9199f01..025e17f4 100644
--- a/config-ui/src/data/pipeline-config-samples/dbt.js
+++ b/config-ui/src/data/pipeline-config-samples/dbt.js
@@ -18,8 +18,8 @@
 const dbtConfig = [
   [
     {
-      Plugin: 'dbt',
-      Options: {
+      plugin: 'dbt',
+      options: {
         projectPath: '/var/www/html/my-project',
         projectName: 'myproject',
         projectTarget: 'dev',
diff --git a/config-ui/src/data/pipeline-config-samples/default.js b/config-ui/src/data/pipeline-config-samples/default.js
index 99c7c144..3d34d317 100644
--- a/config-ui/src/data/pipeline-config-samples/default.js
+++ b/config-ui/src/data/pipeline-config-samples/default.js
@@ -18,28 +18,28 @@
 const defaultConfig = [
   [
     {
-      Plugin: 'gitlab',
-      Options: {
+      plugin: 'gitlab',
+      options: {
         projectId: 8967944,
         connectionId: 1
       }
     },
     {
-      Plugin: 'jira',
-      Options: {
+      plugin: 'jira',
+      options: {
         boardId: 8,
         connectionId: 1
       }
     },
     {
-      Plugin: 'jenkins',
-      Options: {
+      plugin: 'jenkins',
+      options: {
         connectionId: 1
       }
     },
     {
-      Plugin: 'github',
-      Options: {
+      plugin: 'github',
+      options: {
         repo: 'lake',
         owner: 'merico-dev',
         connectionId: 1
diff --git a/config-ui/src/data/pipeline-config-samples/feishu.js b/config-ui/src/data/pipeline-config-samples/feishu.js
index 0498e699..877b38fa 100644
--- a/config-ui/src/data/pipeline-config-samples/feishu.js
+++ b/config-ui/src/data/pipeline-config-samples/feishu.js
@@ -18,8 +18,8 @@
 const feishuConfig = [
   [
     {
-      Plugin: 'feishu',
-      Options: {}
+      plugin: 'feishu',
+      options: {}
     }
   ]
 ]
diff --git a/config-ui/src/data/pipeline-config-samples/gitextractor.js b/config-ui/src/data/pipeline-config-samples/gitextractor.js
index b9e99185..25448473 100644
--- a/config-ui/src/data/pipeline-config-samples/gitextractor.js
+++ b/config-ui/src/data/pipeline-config-samples/gitextractor.js
@@ -18,8 +18,8 @@
 const gitextractorConfig = [
   [
     {
-      Plugin: 'gitextractor',
-      Options: {
+      plugin: 'gitextractor',
+      options: {
         url: 'https://github.com/apache/incubator-devlake.git',
         repoId: 'github:GithubRepo:384111310'
       }
diff --git a/config-ui/src/data/pipeline-config-samples/github.js b/config-ui/src/data/pipeline-config-samples/github.js
index 3432f983..528009e2 100644
--- a/config-ui/src/data/pipeline-config-samples/github.js
+++ b/config-ui/src/data/pipeline-config-samples/github.js
@@ -16,8 +16,8 @@
  *
  */
 const githubConfig = [[{
-  Plugin: 'github',
-  Options: {
+  plugin: 'github',
+  options: {
     repo: 'lake',
     owner: 'merico-dev',
     connectionId: 1
diff --git a/config-ui/src/data/pipeline-config-samples/gitlab.js b/config-ui/src/data/pipeline-config-samples/gitlab.js
index a2d84bd3..e93c66cd 100644
--- a/config-ui/src/data/pipeline-config-samples/gitlab.js
+++ b/config-ui/src/data/pipeline-config-samples/gitlab.js
@@ -16,8 +16,8 @@
  *
  */
 const gitlabConfig = [[{
-  Plugin: 'gitlab',
-  Options: {
+  plugin: 'gitlab',
+  options: {
     projectId: 278964,
     connectionId: 1
   }
diff --git a/config-ui/src/data/pipeline-config-samples/jenkins.js b/config-ui/src/data/pipeline-config-samples/jenkins.js
index 1bf29637..d6d98b57 100644
--- a/config-ui/src/data/pipeline-config-samples/jenkins.js
+++ b/config-ui/src/data/pipeline-config-samples/jenkins.js
@@ -18,8 +18,8 @@
 const jenkinsConfig = [
   [
     {
-      Plugin: 'jenkins',
-      Options: {
+      plugin: 'jenkins',
+      options: {
         connectionId: 1
       }
     }
diff --git a/config-ui/src/data/pipeline-config-samples/jira.js b/config-ui/src/data/pipeline-config-samples/jira.js
index 02a4d455..511499fc 100644
--- a/config-ui/src/data/pipeline-config-samples/jira.js
+++ b/config-ui/src/data/pipeline-config-samples/jira.js
@@ -18,8 +18,8 @@
 const jiraConfig = [
   [
     {
-      Plugin: 'jira',
-      Options: {
+      plugin: 'jira',
+      options: {
         connectionId: 1,
         boardId: 8,
         since: '2006-01-02T15:04:05Z'
diff --git a/config-ui/src/data/pipeline-config-samples/refdiff.js b/config-ui/src/data/pipeline-config-samples/refdiff.js
index 969640c2..678a645e 100644
--- a/config-ui/src/data/pipeline-config-samples/refdiff.js
+++ b/config-ui/src/data/pipeline-config-samples/refdiff.js
@@ -18,8 +18,8 @@
 const refdiffConfig = [
   [
     {
-      Plugin: 'refdiff',
-      Options: {
+      plugin: 'refdiff',
+      options: {
         repoId: 'github:GithubRepo:384111310',
         pairs: [
           { newRef: 'refs/tags/v0.6.0', oldRef: 'refs/tags/0.5.0' },
diff --git a/config-ui/src/data/pipeline-config-samples/starrocks.js b/config-ui/src/data/pipeline-config-samples/starrocks.js
index 40631d2b..a6031392 100644
--- a/config-ui/src/data/pipeline-config-samples/starrocks.js
+++ b/config-ui/src/data/pipeline-config-samples/starrocks.js
@@ -18,8 +18,8 @@
 const starRocksConfig = [
   [
     {
-      Plugin: 'starrocks',
-      Options: {
+      plugin: 'starrocks',
+      options: {
         host: '127.0.0.1',
         port: 9030,
         user: 'root',
diff --git a/config-ui/src/pages/blueprints/blueprint-settings.jsx b/config-ui/src/pages/blueprints/blueprint-settings.jsx
index f2a30163..5b7c636e 100644
--- a/config-ui/src/pages/blueprints/blueprint-settings.jsx
+++ b/config-ui/src/pages/blueprints/blueprint-settings.jsx
@@ -586,13 +586,13 @@ const BlueprintSettings = (props) => {
       : []
     // @todo: handle multi-stage
     const getAdvancedGithubProjects = (t, providerId) => [Providers.GITHUB].includes(providerId)
-      ? [`${t.Options.owner}/${t.Options?.repo}`]
+      ? [`${t.options?.owner}/${t.options?.repo}`]
       : []
     const getAdvancedGitlabProjects = (t, providerId) => [Providers.GITLAB].includes(providerId)
-      ? [t.Options?.projectId]
+      ? [t.options?.projectId]
       : []
     const getAdvancedJiraBoards = (t, providerId) => [Providers.JIRA].includes(providerId)
-      ? [t.Options?.boardId]
+      ? [t.options?.boardId]
       : []
     // @todo: migrate to data scopes manager
     if (activeBlueprint?.id && activeBlueprint?.mode === BlueprintMode.NORMAL) {
@@ -604,7 +604,7 @@ const BlueprintSettings = (props) => {
           connectionId: c.connectionId,
           value: c.connectionId,
           provider: integrationsData.find((i) => i.id === c.plugin),
-          providerLabel: ProviderLabels[c.plugin.toUpperCase()],
+          providerLabel: ProviderLabels[c.plugin?.toUpperCase()],
           providerId: c.plugin,
           plugin: c.plugin,
           icon: ProviderIcons[c.plugin] ? ProviderIcons[c.plugin](18, 18) : null,
@@ -642,34 +642,34 @@ const BlueprintSettings = (props) => {
       setConnections(
         activeBlueprint?.plan?.flat().map((c, cIdx) => ({
           ...c,
-          id: connectionsList.find(lC => lC.value === c.Options.connectionId && lC.provider === c.Plugin)?.id,
-          connectionId: c.Options?.connectionId,
-          value: c.Options?.connectionId,
-          provider: integrationsData.find((i) => i.id === c.Plugin),
-          providerLabel: ProviderLabels[c.Plugin.toUpperCase()],
-          plugin: c.Plugin,
-          providerId: c.Plugin,
-          icon: ProviderIcons[c.Plugin] ? ProviderIcons[c.Plugin](18, 18) : null,
-          name: allProviderConnections.find(pC => pC.connectionId === c.Options.connectionId && pC.provider === c.Plugin)?.name || `Connection ID #${c.Options.connectionId || cIdx}`,
-          projects: [Providers.GITLAB].includes(c.Plugin)
-            ? getAdvancedGitlabProjects(c, c.Plugin)
-            : getAdvancedGithubProjects(c, c.Plugin),
+          id: connectionsList.find(lC => lC.value === c.options?.connectionId && lC.provider === c.plugin)?.id,
+          connectionId: c.options?.connectionId,
+          value: c.options?.connectionId,
+          provider: integrationsData.find((i) => i.id === c.plugin),
+          providerLabel: ProviderLabels[c.plugin?.toUpperCase()],
+          plugin: c.plugin,
+          providerId: c.plugin,
+          icon: ProviderIcons[c.plugin] ? ProviderIcons[c.plugin](18, 18) : null,
+          name: allProviderConnections.find(pC => pC.connectionId === c.options?.connectionId && pC.provider === c.plugin)?.name || `Connection ID #${c.options?.connectionId || cIdx}`,
+          projects: [Providers.GITLAB].includes(c.plugin)
+            ? getAdvancedGitlabProjects(c, c.plugin)
+            : getAdvancedGithubProjects(c, c.plugin),
           // entities: DEFAULT_DATA_ENTITIES.map(e => e.title),
           entities: ['-'],
-          entitityList: getDefaultEntities(c.Plugin),
-          boards: [Providers.JIRA].includes(c.Plugin)
-            ? getAdvancedJiraBoards(c, c.Plugin).map(bId => `Board ${bId}`)
+          entitityList: getDefaultEntities(c.plugin),
+          boards: [Providers.JIRA].includes(c.plugin)
+            ? getAdvancedJiraBoards(c, c.plugin).map(bId => `Board ${bId}`)
             : [],
-          boardIds: [Providers.JIRA].includes(c.Plugin)
-            ? getAdvancedJiraBoards(c, c.Plugin)
+          boardIds: [Providers.JIRA].includes(c.plugin)
+            ? getAdvancedJiraBoards(c, c.plugin)
             : [],
-          boardList: [Providers.JIRA].includes(c.Plugin)
-            ? getAdvancedJiraBoards(c, c.Plugin).map(bId => `Board ${bId}`)
+          boardList: [Providers.JIRA].includes(c.plugin)
+            ? getAdvancedJiraBoards(c, c.plugin).map(bId => `Board ${bId}`)
             : [],
           transformations: {},
           // transformationStates: ['-'],
-          transformationStates: typeof c.Options?.transformationRules === 'object' &&
-            Object.values(c.Options?.transformationRules).some(v => (Array.isArray(v) && v.length > 0) || v.toString().length > 0)
+          transformationStates: typeof c.options?.transformationRules === 'object' &&
+            Object.values(c.options?.transformationRules).some(v => (Array.isArray(v) && v.length > 0) || v.toString().length > 0)
             ? ['Added'] : ['-'],
           scope: c,
           task: c,
@@ -814,7 +814,7 @@ const BlueprintSettings = (props) => {
     setBlueprintConnections(
       connections.map(
         c => connectionsList.find(
-          cItem => cItem.connectionId === c.connectionId && cItem.provider === c.provider.id
+          cItem => cItem.connectionId === c.connectionId && cItem.provider === c.provider?.id
         )
       )
     )