diff --git a/buildtime/client/logical-editor/src/App.css b/buildtime/client/logical-editor/src/App.css
index c2ac47afc..a5178b641 100644
--- a/buildtime/client/logical-editor/src/App.css
+++ b/buildtime/client/logical-editor/src/App.css
@@ -4,13 +4,14 @@
padding: 16px;
color: gray;
display: flex;
+ flex-flow: row;
background: var(--code-bg);
box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
height: 80px;
}
.navbar h1 {
- font-size: 26px;
+ font-size: 32px;
letter-spacing: -1.68px;
margin: 4px 10px 0 0;
@media (max-width: 1024px) {
@@ -31,7 +32,7 @@
color: gray;
text-decoration: none;
margin-left: 16px;
- font-size: 14px;
+ font-size: 20px;
letter-spacing: -1px;
}
@@ -56,7 +57,7 @@
}
.sidebar h1 {
- font-size: 16px;
+ font-size: 24px;
letter-spacing: -1.68px;
margin: 4px 10px 0 0;
@media (max-width: 1024px) {
@@ -107,4 +108,69 @@ footer {
}
+.editor {
+ display: flex;
+ flex-flow: column;
+ padding: 16px;
+ margin: 16px;
+ color: gray;
+ background: whitesmoke;
+ box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+ width: 100%;
+}
+
+.editor-title {
+ font-size: 24px;
+ letter-spacing: -1.68px;
+ margin: 16px;
+ @media (max-width: 1024px) {
+ font-size: 14px;
+ margin: 20px 0;
+ }
+}
+
+input[type="text"] {
+ width: 100%; /* Full width */
+ padding: 2px; /* Inner spacing */
+ margin: 8px 0; /* Space around */
+ box-sizing: border-box; /* Include padding in width */
+ border: 2px solid #000000; /* Green border */
+ border-radius: 10px; /* Rounded corners */
+ background-color: #ffffff; /* Light background */
+ font-size: 16px; /* Text size */
+}
+
+input[type="text"]:focus {
+ border-color: #45a049; /* Darker green on focus */
+ outline: none; /* Remove default outline */
+}
+
+textarea {
+ width: 100%; /* Full width */
+ height: 150px;
+ padding: 2px; /* Inner spacing */
+ margin: 8px 0; /* Space around */
+ box-sizing: border-box; /* Include padding in width */
+ border: 2px solid #000000; /* Green border */
+ border-radius: 10px; /* Rounded corners */
+ background-color: #ffffff; /* Light background */
+ font-size: 16px; /* Text size */
+}
+
+textarea:focus {
+ border-color: #45a049; /* Darker green on focus */
+ outline: none; /* Remove default outline */
+}
+
+.main {
+ display: flex;
+ flex-flow: column;
+ padding: 16px;
+ margin: 16px;
+ color: gray;
+ background: whitesmoke;
+ box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+ width: 100%;
+}
+
@import "tailwindcss";
diff --git a/buildtime/client/logical-editor/src/components/EditPropertyGroup.jsx b/buildtime/client/logical-editor/src/components/EditPropertyGroup.jsx
new file mode 100644
index 000000000..0a90d4f11
--- /dev/null
+++ b/buildtime/client/logical-editor/src/components/EditPropertyGroup.jsx
@@ -0,0 +1,29 @@
+import React, { useState } from 'react';
+
+const EditPropertyGroup = ({ propertyGroup, onClose }) => {
+ const [labelTranslation, setLabelTranslation] = useState(propertyGroup.labelTranslation);
+ const [description, setDescription] = useState(propertyGroup.description);
+
+ return (
+
+
Edit Property Group
+
+
+
+
+
+
+
+
+ );
+};
+
+export default EditPropertyGroup;
diff --git a/buildtime/client/logical-editor/src/components/PropertyGroupContent.jsx b/buildtime/client/logical-editor/src/components/PropertyGroupContent.jsx
new file mode 100644
index 000000000..044619cb1
--- /dev/null
+++ b/buildtime/client/logical-editor/src/components/PropertyGroupContent.jsx
@@ -0,0 +1,24 @@
+import { useEffect } from "react";
+import ReactDOM from "react-dom";
+
+function PropertyGroupContent({ children, onClose }) {
+
+ useEffect(() => {
+ const handleEsc = (e) => e.key === "Escape" && onClose();
+ window.addEventListener("keydown", handleEsc);
+ return () => window.removeEventListener("keydown", handleEsc);
+ }, [onClose]);
+
+ return ReactDOM.createPortal(
+
+
e.stopPropagation()}>
+ {children}
+
+
,
+
+ document.getElementById("property-content")
+
+ );
+}
+
+export default PropertyGroupContent;
diff --git a/buildtime/client/logical-editor/src/components/PropertySideBar.jsx b/buildtime/client/logical-editor/src/components/PropertySideBar.jsx
index 0aa2f7b3f..5bfd8f631 100644
--- a/buildtime/client/logical-editor/src/components/PropertySideBar.jsx
+++ b/buildtime/client/logical-editor/src/components/PropertySideBar.jsx
@@ -1,5 +1,4 @@
-import React, { Component } from 'react';
-import { useState } from 'react';
+import React from 'react';
import PropertyTreeView from './PropertyTreeView';
const PropertySideBar = ({ properties }) => {
@@ -11,7 +10,7 @@ const PropertySideBar = ({ properties }) => {
{properties.map((node) => (
-
+
))}
...
diff --git a/buildtime/client/logical-editor/src/components/PropertyTreeView.jsx b/buildtime/client/logical-editor/src/components/PropertyTreeView.jsx
index 30accd20b..c6af93eb0 100644
--- a/buildtime/client/logical-editor/src/components/PropertyTreeView.jsx
+++ b/buildtime/client/logical-editor/src/components/PropertyTreeView.jsx
@@ -1,11 +1,11 @@
-import React from 'react';
-import { useState } from 'react';
-
-import { ChevronRightIcon } from '@heroicons/react/16/solid';
-import { DocumentIcon, FolderIcon } from '@heroicons/react/16/solid';
+import React, { useState } from 'react';
+import PropertyGroupContent from './PropertyGroupContent';
+import EditPropertyGroup from './EditPropertyGroup';
+import { ChevronRightIcon, DocumentIcon, FolderIcon, DocumentPlusIcon, FolderPlusIcon, PencilIcon } from '@heroicons/react/24/solid';
const PropertyTreeView = ({ node, key }) => {
const [expanded, setExpanded] = useState(true);
+ const [open, setOpen] = useState(false);
return (
@@ -16,9 +16,24 @@ const PropertyTreeView = ({ node, key }) => {
/>
)}
- {node.labelTranslation}
+ {node.labelTranslation}
+
+
+ {open && (
+ setOpen(false)}>
+ setOpen(false)} />
+
+ )}
+
+
+
-
{expanded && (
{node.subPropertygroups?.map((node) => (
diff --git a/buildtime/client/logical-editor/src/pages/PropertyPage.jsx b/buildtime/client/logical-editor/src/pages/PropertyPage.jsx
index ad5784a41..c802a7a8b 100644
--- a/buildtime/client/logical-editor/src/pages/PropertyPage.jsx
+++ b/buildtime/client/logical-editor/src/pages/PropertyPage.jsx
@@ -11,8 +11,9 @@ const PropertyPage = () => {
return (
-
-
+
+ Simply CPQ Data
+
);
};