From 0294b5e89ea7ff23d4f66e0ae6d4403b0be6fdda Mon Sep 17 00:00:00 2001
From: Csaba Tuncsik <csaba@n8n.io>
Date: Tue, 13 Dec 2022 06:56:03 +0100
Subject: [PATCH] fix(editor): Schema view render empty data

---
 .../src/components/N8nAlert/Alert.vue         | 19 +++--
 packages/editor-ui/src/__tests__/setup.ts     |  2 +
 .../src/components/RunDataSchema.test.ts      |  7 --
 .../src/components/RunDataSchema.vue          |  7 +-
 .../src/components/RunDataSchemaItem.vue      |  2 +-
 .../editor-ui/src/components/RunDataTable.vue |  2 +-
 .../__snapshots__/RunDataSchema.test.ts.snap  | 69 +++++++++++--------
 .../src/plugins/i18n/locales/en.json          |  1 +
 8 files changed, 65 insertions(+), 44 deletions(-)

diff --git a/packages/design-system/src/components/N8nAlert/Alert.vue b/packages/design-system/src/components/N8nAlert/Alert.vue
index a216f827b4..1f80edc907 100644
--- a/packages/design-system/src/components/N8nAlert/Alert.vue
+++ b/packages/design-system/src/components/N8nAlert/Alert.vue
@@ -81,11 +81,9 @@ const alertBoxClassNames = computed(() => {
 .alert {
 	display: flex;
 	position: relative;
-	min-height: 60px;
 	border-bottom: 1px solid transparent;
 	align-items: center;
 	justify-content: space-between;
-	padding: $alert-padding;
 
 	&.center {
 		justify-content: center;
@@ -202,6 +200,15 @@ const alertBoxClassNames = computed(() => {
 			}
 		}
 	}
+
+	&.background {
+		min-height: 60px;
+		padding: $alert-padding;
+
+		.icon {
+			padding-left: var(--spacing-2xs);
+		}
+	}
 }
 
 .content {
@@ -213,8 +220,7 @@ const alertBoxClassNames = computed(() => {
 	display: inline-flex;
 	color: inherit;
 	align-items: center;
-	padding-left: var(--spacing-2xs);
-	padding-right: var(--spacing-s);
+	padding-right: var(--spacing-2xs);
 }
 
 .text {
@@ -227,11 +233,14 @@ const alertBoxClassNames = computed(() => {
 	font-size: $alert-title-font-size;
 	line-height: 18px;
 	font-weight: bold;
+
+	+ .description {
+		margin-top: var(--spacing-2xs);
+	}
 }
 
 .description {
 	font-size: $alert-description-font-size;
-	margin: 5px 0 0 0;
 }
 
 .aside {
diff --git a/packages/editor-ui/src/__tests__/setup.ts b/packages/editor-ui/src/__tests__/setup.ts
index 01855f1dd7..aec3867da2 100644
--- a/packages/editor-ui/src/__tests__/setup.ts
+++ b/packages/editor-ui/src/__tests__/setup.ts
@@ -1,6 +1,7 @@
 import '@testing-library/jest-dom';
 import Vue from 'vue';
 import '../plugins';
+import { I18nPlugin } from "@/plugins/i18n";
 
 Vue.config.productionTip = false;
 Vue.config.devtools = false;
@@ -9,4 +10,5 @@ Vue.config.devtools = false;
 // Without having this 3rd party library imported like this, any component test using 'vue-json-pretty' fail with:
 // [Vue warn]: Failed to mount component: template or render function not defined.
 Vue.component('vue-json-pretty', require('vue-json-pretty').default);
+Vue.use((vue) => I18nPlugin(vue));
 
diff --git a/packages/editor-ui/src/components/RunDataSchema.test.ts b/packages/editor-ui/src/components/RunDataSchema.test.ts
index 80acccc806..a37a626597 100644
--- a/packages/editor-ui/src/components/RunDataSchema.test.ts
+++ b/packages/editor-ui/src/components/RunDataSchema.test.ts
@@ -42,13 +42,6 @@ describe('RunDataJsonSchema.vue', () => {
 			},
 			data: [{}],
 		},
-		mocks: {
-			$locale: {
-				baseText() {
-					return '';
-				},
-			},
-		},
 	};
 
 	beforeEach(cleanup);
diff --git a/packages/editor-ui/src/components/RunDataSchema.vue b/packages/editor-ui/src/components/RunDataSchema.vue
index 8010a74842..e14410c4d0 100644
--- a/packages/editor-ui/src/components/RunDataSchema.vue
+++ b/packages/editor-ui/src/components/RunDataSchema.vue
@@ -9,6 +9,7 @@ import { runExternalHook } from "@/mixins/externalHooks";
 import { telemetry } from "@/plugins/telemetry";
 import { IDataObject } from "n8n-workflow";
 import { getSchema, isEmpty, mergeDeep } from "@/utils";
+import { i18n } from '@/plugins/i18n';
 
 type Props = {
 	data: IDataObject[]
@@ -71,7 +72,7 @@ const onDragEnd = (el: HTMLElement) => {
 
 <template>
 	<div :class="$style.schemaWrapper">
-		<div v-if="isDataEmpty" />
+		<n8n-alert v-if="isDataEmpty" :background="false" :description="i18n.baseText('dataMapping.schemaView.emptyData')" />
 		<draggable
 			v-else
 			type="mapping"
@@ -114,6 +115,10 @@ const onDragEnd = (el: HTMLElement) => {
 	height: 100%;
 	width: 100%;
 	background-color: var(--color-background-base);
+
+	div[class*="alert"] {
+		padding: 0 var(--spacing-s);
+	}
 }
 
 .schema {
diff --git a/packages/editor-ui/src/components/RunDataSchemaItem.vue b/packages/editor-ui/src/components/RunDataSchemaItem.vue
index be5c03b50b..411e6bdd2c 100644
--- a/packages/editor-ui/src/components/RunDataSchemaItem.vue
+++ b/packages/editor-ui/src/components/RunDataSchemaItem.vue
@@ -79,7 +79,7 @@ const getIconBySchemaType = (type: Schema['type']): string => {
 			</span>
 		</div>
 		<span v-if="text" :class="$style.text">{{ text }}</span>
-		<input :id="subKey" type="checkbox" checked />
+		<input v-if="level > 0 && isSchemaValueArray" :id="subKey" type="checkbox" checked />
 		<label v-if="level > 0 && isSchemaValueArray" :class="$style.toggle" :for="subKey">
 			<font-awesome-icon icon="angle-up" />
 		</label>
diff --git a/packages/editor-ui/src/components/RunDataTable.vue b/packages/editor-ui/src/components/RunDataTable.vue
index 5d67879cd5..b8c36eae83 100644
--- a/packages/editor-ui/src/components/RunDataTable.vue
+++ b/packages/editor-ui/src/components/RunDataTable.vue
@@ -12,7 +12,7 @@
 					@mouseenter="onMouseEnterCell"
 					@mouseleave="onMouseLeaveCell"
 				>
-					<n8n-text>{{ $locale.baseText('runData.emptyItemHint') }}</n8n-text>
+					<n8n-alert :background="false" :description="$locale.baseText('runData.emptyItemHint')" />
 				</td>
 				<td :class="$style.tableRightMargin"></td>
 			</tr>
diff --git a/packages/editor-ui/src/components/__snapshots__/RunDataSchema.test.ts.snap b/packages/editor-ui/src/components/__snapshots__/RunDataSchema.test.ts.snap
index ec77e1e866..94e4873b9f 100644
--- a/packages/editor-ui/src/components/__snapshots__/RunDataSchema.test.ts.snap
+++ b/packages/editor-ui/src/components/__snapshots__/RunDataSchema.test.ts.snap
@@ -3,24 +3,20 @@
 exports[`RunDataJsonSchema.vue > renders schema for data 1`] = `
 <div>
   <div
-    class="_schemaWrapper_1w572_1"
+    class="_schemaWrapper_1wosl_1"
   >
     <div
       class=""
     >
       <div
-        class="_schema_1w572_1"
+        class="_schema_1wosl_1"
       >
         <div
           class="_item_eg159_1"
         >
           <!---->
           <!---->
-          <input
-            checked="checked"
-            id="object-0-0"
-            type="checkbox"
-          />
+          <!---->
           <!---->
           <div
             class="_sub_eg159_14"
@@ -58,11 +54,7 @@ exports[`RunDataJsonSchema.vue > renders schema for data 1`] = `
               >
                 John
               </span>
-              <input
-                checked="checked"
-                id="string-0-0"
-                type="checkbox"
-              />
+              <!---->
               <!---->
               <!---->
             </div>
@@ -99,11 +91,7 @@ exports[`RunDataJsonSchema.vue > renders schema for data 1`] = `
               >
                 22
               </span>
-              <input
-                checked="checked"
-                id="number-0-1"
-                type="checkbox"
-              />
+              <!---->
               <!---->
               <!---->
             </div>
@@ -187,11 +175,7 @@ exports[`RunDataJsonSchema.vue > renders schema for data 1`] = `
                   >
                     surfing
                   </span>
-                  <input
-                    checked="checked"
-                    id="string-1-0"
-                    type="checkbox"
-                  />
+                  <!---->
                   <!---->
                   <!---->
                 </div>
@@ -230,11 +214,7 @@ exports[`RunDataJsonSchema.vue > renders schema for data 1`] = `
                   >
                     traveling
                   </span>
-                  <input
-                    checked="checked"
-                    id="string-1-1"
-                    type="checkbox"
-                  />
+                  <!---->
                   <!---->
                   <!---->
                 </div>
@@ -255,9 +235,40 @@ exports[`RunDataJsonSchema.vue > renders schema for data 1`] = `
 exports[`RunDataJsonSchema.vue > renders schema for empty data 1`] = `
 <div>
   <div
-    class="_schemaWrapper_1w572_1"
+    class="_schemaWrapper_1wosl_1"
   >
-    <div />
+    <div
+      class="n8n-alert"
+      role="alert"
+    >
+      <div
+        class="_content_1qxmg_213"
+      >
+        <span
+          class="_icon_1qxmg_209"
+        >
+          <span
+            class="n8n-icon n8n-text _compact_e4k11_34 _size-medium_e4k11_19 _regular_e4k11_5"
+          >
+            <font-awesome-icon-stub
+              class="_medium_1pnjy_9"
+              icon="info-circle"
+            />
+          </span>
+        </span>
+        <div
+          class="_text_1qxmg_225"
+        >
+          <!---->
+          <div
+            class="_description_1qxmg_236"
+          >
+            No data to show - item(s) exist, but they’re empty
+          </div>
+        </div>
+      </div>
+      <!---->
+    </div>
   </div>
 </div>
 `;
diff --git a/packages/editor-ui/src/plugins/i18n/locales/en.json b/packages/editor-ui/src/plugins/i18n/locales/en.json
index c39d9d8bfa..4792084a12 100644
--- a/packages/editor-ui/src/plugins/i18n/locales/en.json
+++ b/packages/editor-ui/src/plugins/i18n/locales/en.json
@@ -371,6 +371,7 @@
 	"dataMapping.tableView.tableColumnsExceeded": "Some columns are hidden",
 	"dataMapping.tableView.tableColumnsExceeded.tooltip": "Your data has more than {columnLimit} columns so some are hidden. Switch to {link} to see all data.",
 	"dataMapping.tableView.tableColumnsExceeded.tooltip.link": "JSON view",
+	"dataMapping.schemaView.emptyData": "No data to show - item(s) exist, but they’re empty",
 	"displayWithChange.cancelEdit": "Cancel Edit",
 	"displayWithChange.clickToChange": "Click to Change",
 	"displayWithChange.setValue": "Set Value",