From 98096ae2c5fe1c4a87ef4413dd653b69abfcf7fc Mon Sep 17 00:00:00 2001 From: Alexandre Rousseau Date: Thu, 20 Jun 2024 00:02:59 +0200 Subject: [PATCH] feat: implement `JsonViewer` widget --- .../public/components/jsonviewer.png | Bin 0 -> 31369 bytes src/ui/src/core/templateMap.ts | 4 +- .../core_components/base/BaseCollapsible.vue | 99 ++++++++++++++ .../base/BaseJsonViewer.utils.ts | 32 +++++ .../core_components/base/BaseJsonViewer.vue | 72 ++++++++++ .../base/BaseJsonViewerChildrenCounter.vue | 40 ++++++ .../base/BaseJsonViewerCollapsible.vue | 58 +++++++++ .../base/BaseJsonViewerObject.vue | 123 ++++++++++++++++++ .../base/BaseJsonViewerValue.vue | 21 +++ .../content/CoreJsonViewer.vue | 93 +++++++++++++ 10 files changed, 541 insertions(+), 1 deletion(-) create mode 100644 docs/framework/public/components/jsonviewer.png create mode 100644 src/ui/src/core_components/base/BaseCollapsible.vue create mode 100644 src/ui/src/core_components/base/BaseJsonViewer.utils.ts create mode 100644 src/ui/src/core_components/base/BaseJsonViewer.vue create mode 100644 src/ui/src/core_components/base/BaseJsonViewerChildrenCounter.vue create mode 100644 src/ui/src/core_components/base/BaseJsonViewerCollapsible.vue create mode 100644 src/ui/src/core_components/base/BaseJsonViewerObject.vue create mode 100644 src/ui/src/core_components/base/BaseJsonViewerValue.vue create mode 100644 src/ui/src/core_components/content/CoreJsonViewer.vue diff --git a/docs/framework/public/components/jsonviewer.png b/docs/framework/public/components/jsonviewer.png new file mode 100644 index 0000000000000000000000000000000000000000..2146de40286add077383dae8929cb778ebfa18db GIT binary patch literal 31369 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 awMR^Xs@Co?w&WOT#nj2RlakEl{`6n?Ao3>w literal 0 HcmV?d00001 diff --git a/src/ui/src/core/templateMap.ts b/src/ui/src/core/templateMap.ts index b9a476552..6922c5a7f 100644 --- a/src/ui/src/core/templateMap.ts +++ b/src/ui/src/core/templateMap.ts @@ -14,6 +14,7 @@ import CoreLink from "../core_components/content/CoreLink.vue"; import CoreChatbot from "../core_components/content/CoreChatbot.vue"; import CoreTags from "../core_components/content/CoreTags.vue"; import CoreAvatar from "../core_components/content/CoreAvatar.vue"; +import CoreJsonViewer from "../core_components/content/CoreJsonViewer.vue"; // input import CoreCheckboxInput from "../core_components/input/CoreCheckboxInput.vue"; import CoreDateInput from "../core_components/input/CoreDateInput.vue"; @@ -115,12 +116,13 @@ const templateMap = { switchinput: CoreSwitchInput, reuse: CoreReuse, avatar: CoreAvatar, + jsonviewer: CoreJsonViewer, }; if (WRITER_LIVE_CCT === "yes") { /* Assigns the components in custom_components to the template map, - allowing for live updates when developing custom component templates. + allowing for live updates when developing custom component templates. */ const liveCCT: Record = (await import("../custom_components")) diff --git a/src/ui/src/core_components/base/BaseCollapsible.vue b/src/ui/src/core_components/base/BaseCollapsible.vue new file mode 100644 index 000000000..2a24dd1a8 --- /dev/null +++ b/src/ui/src/core_components/base/BaseCollapsible.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/src/ui/src/core_components/base/BaseJsonViewer.utils.ts b/src/ui/src/core_components/base/BaseJsonViewer.utils.ts new file mode 100644 index 000000000..c2bf3f615 --- /dev/null +++ b/src/ui/src/core_components/base/BaseJsonViewer.utils.ts @@ -0,0 +1,32 @@ +import type { + JsonData, + JsonValue, + JsonViewerTogglePayload, +} from "./BaseJsonViewer.vue"; + +export function isJSONValue(data: JsonData): data is JsonValue { + if (["string", "number", "boolean"].includes(typeof data)) return true; + if (data === null) return true; + return false; +} + +export function isJSONArray(data: JsonData): data is JsonData[] { + if (isJSONValue(data)) return false; + return Array.isArray(data); +} + +export function isJSONObject( + data: JsonData, +): data is { [x: string]: JsonData } { + return !isJSONArray(data) && typeof data === "object" && data !== null; +} + +export function getJSONLength(data: JsonData): number { + return isJSONValue(data) ? 1 : Object.keys(data).length; +} + +export function jsonViewerToggleEmitDefinition( + payload: JsonViewerTogglePayload, +) { + return typeof payload.open === "boolean" && Array.isArray(payload.path); +} diff --git a/src/ui/src/core_components/base/BaseJsonViewer.vue b/src/ui/src/core_components/base/BaseJsonViewer.vue new file mode 100644 index 000000000..51c499c69 --- /dev/null +++ b/src/ui/src/core_components/base/BaseJsonViewer.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/ui/src/core_components/base/BaseJsonViewerChildrenCounter.vue b/src/ui/src/core_components/base/BaseJsonViewerChildrenCounter.vue new file mode 100644 index 000000000..2b8ac462c --- /dev/null +++ b/src/ui/src/core_components/base/BaseJsonViewerChildrenCounter.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/src/ui/src/core_components/base/BaseJsonViewerCollapsible.vue b/src/ui/src/core_components/base/BaseJsonViewerCollapsible.vue new file mode 100644 index 000000000..caa0154f4 --- /dev/null +++ b/src/ui/src/core_components/base/BaseJsonViewerCollapsible.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/src/ui/src/core_components/base/BaseJsonViewerObject.vue b/src/ui/src/core_components/base/BaseJsonViewerObject.vue new file mode 100644 index 000000000..c49ffac1c --- /dev/null +++ b/src/ui/src/core_components/base/BaseJsonViewerObject.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/src/ui/src/core_components/base/BaseJsonViewerValue.vue b/src/ui/src/core_components/base/BaseJsonViewerValue.vue new file mode 100644 index 000000000..12b0c819f --- /dev/null +++ b/src/ui/src/core_components/base/BaseJsonViewerValue.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/src/ui/src/core_components/content/CoreJsonViewer.vue b/src/ui/src/core_components/content/CoreJsonViewer.vue new file mode 100644 index 000000000..f44c9b3d6 --- /dev/null +++ b/src/ui/src/core_components/content/CoreJsonViewer.vue @@ -0,0 +1,93 @@ + + + + + + +