From 3da6534725ad999646ffb14777faeb1879b43f49 Mon Sep 17 00:00:00 2001 From: Andrew Hopkinson <64254061+toxophilist@users.noreply.github.com> Date: Mon, 27 Jan 2025 12:21:41 +0000 Subject: [PATCH 1/8] fix: add aria-hidden to list elements with click event --- .../src/components/dialogs/OcdExportToResourceManagerDialog.tsx | 2 +- ocd/packages/react/src/components/dialogs/OcdQueryDialog.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ocd/packages/react/src/components/dialogs/OcdExportToResourceManagerDialog.tsx b/ocd/packages/react/src/components/dialogs/OcdExportToResourceManagerDialog.tsx index addcec2c..d5920c45 100644 --- a/ocd/packages/react/src/components/dialogs/OcdExportToResourceManagerDialog.tsx +++ b/ocd/packages/react/src/components/dialogs/OcdExportToResourceManagerDialog.tsx @@ -233,7 +233,7 @@ const CompartmentPicker = ({compartments, selectedCompartmentIds, setSelectedCom const subCompartmentsCount = compartments.filter((cc) => cc.compartmentId === c.id).length const isClosed = collapsedCompartmentIds.includes(c.id) const labelClasses = subCompartmentsCount > 0 ? isClosed ? 'ocd-collapable-list-element ocd-list-collapsed' : 'ocd-collapable-list-element ocd-list-open' : 'ocd-collapable-list-element' - return
  • onClick(e, c.id)}> + return
  • onClick(e, c.id)} aria-hidden> {subCompartmentsCount > 0 && cc.compartmentId === c.id).length const isClosed = collapsedCompartmentIds.includes(c.id) const labelClasses = subCompartmentsCount > 0 ? isClosed ? 'ocd-collapable-list-element ocd-list-collapsed' : 'ocd-collapable-list-element ocd-list-open' : 'ocd-collapable-list-element' - return
  • onClick(e, c.id)}> + return
  • onClick(e, c.id)} aria-hidden> {subCompartmentsCount > 0 && Date: Mon, 27 Jan 2025 14:07:42 +0000 Subject: [PATCH 2/8] chore: implement SonarCloud recommendations --- ocd/packages/desktop/src/css/ocd.css | 4 ---- .../query/src/OciResourceManagerQuery.ts | 8 +++----- .../OcdExportToResourceManagerDialog.tsx | 19 ++++++------------- .../src/components/dialogs/OcdQueryDialog.tsx | 4 +++- 4 files changed, 12 insertions(+), 23 deletions(-) diff --git a/ocd/packages/desktop/src/css/ocd.css b/ocd/packages/desktop/src/css/ocd.css index d492ad32..9df256d4 100644 --- a/ocd/packages/desktop/src/css/ocd.css +++ b/ocd/packages/desktop/src/css/ocd.css @@ -2324,10 +2324,6 @@ table { text-decoration: none; } -/* .ocd-compartment-picker li > ul { - padding-left: 1em; -} */ - .ocd-compartment-picker li > label, .ocd-compartment-picker li > span { font-family: var(--dialog-input-font-family); diff --git a/ocd/packages/query/src/OciResourceManagerQuery.ts b/ocd/packages/query/src/OciResourceManagerQuery.ts index 891d088e..862fd037 100644 --- a/ocd/packages/query/src/OciResourceManagerQuery.ts +++ b/ocd/packages/query/src/OciResourceManagerQuery.ts @@ -3,9 +3,7 @@ ** Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. */ -import { common, resourcemanager } from "oci-sdk" -import { OciResource } from "@ocd/model" -import { OcdUtils } from "@ocd/core" +import { resourcemanager } from "oci-sdk" import { OciCommonQuery } from './OciQueryCommon.js' export class OciResourceManagerQuery extends OciCommonQuery { @@ -33,7 +31,7 @@ export class OciResourceManagerQuery extends OciCommonQuery { resolve(resourceManagerData) }).catch((reason) => { console.error(reason) - reject(reason) + reject(new Error(reason)) }) }) } @@ -49,7 +47,7 @@ export class OciResourceManagerQuery extends OciCommonQuery { resolve(resources) }).catch((reason) => { console.error('OciResourceManagerQuery: listStacks:', reason) - reject(reason) + reject(new Error(reason)) }) }) } diff --git a/ocd/packages/react/src/components/dialogs/OcdExportToResourceManagerDialog.tsx b/ocd/packages/react/src/components/dialogs/OcdExportToResourceManagerDialog.tsx index d5920c45..6d4d22f7 100644 --- a/ocd/packages/react/src/components/dialogs/OcdExportToResourceManagerDialog.tsx +++ b/ocd/packages/react/src/components/dialogs/OcdExportToResourceManagerDialog.tsx @@ -5,16 +5,12 @@ import { CompartmentPickerProps, QueryDialogProps, StackPickerProps } from "../../types/Dialogs" import { OciApiFacade } from "../../facade/OciApiFacade" -import React, { useContext, useEffect, useState } from "react" -import { OcdDesign, OciModelResources } from '@ocd/model' +import React, { useEffect, useState } from "react" +import { OciModelResources } from '@ocd/model' import { OcdResourceManagerExporter } from '@ocd/export' import { OcdDocument } from "../OcdDocument" -import { OcdUtils } from '@ocd/core' -import { ActiveFileContext, ConsoleConfigContext } from "../../pages/OcdConsole" export const OcdExportToResourceManagerDialog = ({ocdDocument, setOcdDocument}: QueryDialogProps): JSX.Element => { - const {activeFile, setActiveFile} = useContext(ActiveFileContext) - const {ocdConsoleConfig, setOcdConsoleConfig} = useContext(ConsoleConfigContext) const loadingState = '......Reading OCI Config' const regionsLoading = {id: 'Select Valid Profile', displayName: 'Select Valid Profile'} const className = `ocd-query-dialog` @@ -174,7 +170,6 @@ export const OcdExportToResourceManagerDialog = ({ocdDocument, setOcdDocument}: - {/* {createStack && <>
    Stack Name
    {hierarchy}
    } */} {(() => { if (createStack) return <>
    Stack Name
    else return <>
    Stack
    @@ -232,7 +227,9 @@ const CompartmentPicker = ({compartments, selectedCompartmentIds, setSelectedCom {filteredCompartments.length > 0 && filteredCompartments.map((c) => { const subCompartmentsCount = compartments.filter((cc) => cc.compartmentId === c.id).length const isClosed = collapsedCompartmentIds.includes(c.id) - const labelClasses = subCompartmentsCount > 0 ? isClosed ? 'ocd-collapable-list-element ocd-list-collapsed' : 'ocd-collapable-list-element ocd-list-open' : 'ocd-collapable-list-element' + const isClosedClasses = isClosed ? 'ocd-collapable-list-element ocd-list-collapsed' : 'ocd-collapable-list-element ocd-list-open' + const labelClasses = subCompartmentsCount > 0 ? isClosedClasses : 'ocd-collapable-list-element' + // const labelClasses = subCompartmentsCount > 0 ? isClosed ? 'ocd-collapable-list-element ocd-list-collapsed' : 'ocd-collapable-list-element ocd-list-open' : 'ocd-collapable-list-element' return
  • onClick(e, c.id)} aria-hidden> {subCompartmentsCount > 0 && - - + return } diff --git a/ocd/packages/react/src/components/dialogs/OcdQueryDialog.tsx b/ocd/packages/react/src/components/dialogs/OcdQueryDialog.tsx index 955d84f5..1fbf5e62 100644 --- a/ocd/packages/react/src/components/dialogs/OcdQueryDialog.tsx +++ b/ocd/packages/react/src/components/dialogs/OcdQueryDialog.tsx @@ -212,7 +212,9 @@ const CompartmentPicker = ({compartments, selectedCompartmentIds, setSelectedCom {filteredCompartments.length > 0 && filteredCompartments.map((c) => { const subCompartmentsCount = compartments.filter((cc) => cc.compartmentId === c.id).length const isClosed = collapsedCompartmentIds.includes(c.id) - const labelClasses = subCompartmentsCount > 0 ? isClosed ? 'ocd-collapable-list-element ocd-list-collapsed' : 'ocd-collapable-list-element ocd-list-open' : 'ocd-collapable-list-element' + const isClosedClasses = isClosed ? 'ocd-collapable-list-element ocd-list-collapsed' : 'ocd-collapable-list-element ocd-list-open' + const labelClasses = subCompartmentsCount > 0 ? isClosedClasses : 'ocd-collapable-list-element' + // const labelClasses = subCompartmentsCount > 0 ? isClosed ? 'ocd-collapable-list-element ocd-list-collapsed' : 'ocd-collapable-list-element ocd-list-open' : 'ocd-collapable-list-element' return
  • onClick(e, c.id)} aria-hidden> {subCompartmentsCount > 0 && Date: Mon, 27 Jan 2025 15:07:39 +0000 Subject: [PATCH 3/8] chore: update package version number --- README.md | 12 +-- ocd/package-lock.json | 91 ++++++++++--------- ocd/package.json | 2 +- ocd/packages/cli/package.json | 14 +-- ocd/packages/codegen-cli/package.json | 4 +- ocd/packages/codegen/package.json | 4 +- ocd/packages/core/package.json | 2 +- ocd/packages/desktop/package.json | 14 +-- ocd/packages/export/package.json | 6 +- .../export/src/data/OcdBuildDetails.ts | 10 +- ocd/packages/import/package.json | 6 +- ocd/packages/model/package.json | 4 +- ocd/packages/query/package.json | 6 +- ocd/packages/react/package.json | 22 ++--- .../OcdExportToResourceManagerDialog.tsx | 8 -- .../src/components/dialogs/OcdQueryDialog.tsx | 14 +-- .../react/src/data/OcdBuildDetails.ts | 10 +- ocd/packages/web/package.json | 2 +- 18 files changed, 107 insertions(+), 124 deletions(-) diff --git a/README.md b/README.md index 9c805c07..bb984392 100644 --- a/README.md +++ b/README.md @@ -61,15 +61,15 @@ Detailed OKIT Installation steps can be found in the [OCI Designer Toolkit Insta 3. [Oracle Linux](documentation/Installation.md#oracle-linux-ol8) ### OKIT-Ocd OKIT-Ocd is the next iteration of OKIT and is currently available as a Beta release. The native installables can be found in the Assets section -on the [0.66.1 Release](https://github.com/oracle/oci-designer-toolkit/releases/tag/v0.66.1). +on the [0.67.0 Release](https://github.com/oracle/oci-designer-toolkit/releases/tag/v0.67.0). 1. MacOS - 1. [Arm dmg](https://github.com/oracle/oci-designer-toolkit/releases/download/v0.66.1/ocd-0.2.6-arm64.dmg) - 2. [x64 dmg](https://github.com/oracle/oci-designer-toolkit/releases/download/v0.66.1/ocd-0.2.6-x64.dmg) + 1. [Arm dmg](https://github.com/oracle/oci-designer-toolkit/releases/download/v0.67.0/ocd-0.2.7-arm64.dmg) + 2. [x64 dmg](https://github.com/oracle/oci-designer-toolkit/releases/download/v0.67.0/ocd-0.2.7-x64.dmg) 2. Windows - 1. [Setup](https://github.com/oracle/oci-designer-toolkit/releases/download/v0.66.1/ocd-0.2.6-Setup.exe) + 1. [Setup](https://github.com/oracle/oci-designer-toolkit/releases/download/v0.67.0/ocd-0.2.7-Setup.exe) 3. Linux - 1. [rpm](https://github.com/oracle/oci-designer-toolkit/releases/download/v0.66.1/ocd-0.2.6-1.x86_64.rpm) - 2. [deb](https://github.com/oracle/oci-designer-toolkit/releases/download/v0.66.1/ocd_0.2.6_amd64.deb) + 1. [rpm](https://github.com/oracle/oci-designer-toolkit/releases/download/v0.67.0/ocd-0.2.7-1.x86_64.rpm) + 2. [deb](https://github.com/oracle/oci-designer-toolkit/releases/download/v0.67.0/ocd_0.2.7_amd64.deb) diff --git a/ocd/package-lock.json b/ocd/package-lock.json index 0983c81b..f39b8048 100644 --- a/ocd/package-lock.json +++ b/ocd/package-lock.json @@ -1,12 +1,12 @@ { "name": "ocd", - "version": "0.2.6", + "version": "0.2.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ocd", - "version": "0.2.6", + "version": "0.2.7", "license": "UPL-1.0", "workspaces": [ "packages/core", @@ -6845,6 +6845,7 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -9270,7 +9271,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -18847,52 +18848,52 @@ }, "packages/cli": { "name": "@ocd/cli", - "version": "0.2.6", + "version": "0.2.7", "license": "UPL-1.0", "dependencies": { - "@ocd/codegen": ">=0.2.6", - "@ocd/core": ">=0.2.6", - "@ocd/export": ">=0.2.6", - "@ocd/import": ">=0.2.6", - "@ocd/model": ">=0.2.6", - "@ocd/query": ">=0.2.6", + "@ocd/codegen": ">=0.2.7", + "@ocd/core": ">=0.2.7", + "@ocd/export": ">=0.2.7", + "@ocd/import": ">=0.2.7", + "@ocd/model": ">=0.2.7", + "@ocd/query": ">=0.2.7", "oci-sdk": "^2.69.0" } }, "packages/codegen": { "name": "@ocd/codegen", - "version": "0.2.6", + "version": "0.2.7", "license": "UPL-1.0", "dependencies": { - "@ocd/core": ">=0.2.6", + "@ocd/core": ">=0.2.7", "fs": "^0.0.1-security", "path": "^0.12.7" } }, "packages/codegen-cli": { "name": "@ocd/codegen-cli", - "version": "0.2.6", + "version": "0.2.7", "license": "UPL-1.0", "dependencies": { - "@ocd/codegen": ">=0.2.6" + "@ocd/codegen": ">=0.2.7" } }, "packages/core": { "name": "@ocd/core", - "version": "0.2.6", + "version": "0.2.7", "license": "UPL-1.0" }, "packages/desktop": { "name": "ocd", - "version": "0.2.6", + "version": "0.2.7", "license": "UPL-1.0", "dependencies": { - "@ocd/core": ">=0.2.6", - "@ocd/export": ">=0.2.6", - "@ocd/import": ">=0.2.6", - "@ocd/model": ">=0.2.6", - "@ocd/query": ">=0.2.6", - "@ocd/react": ">=0.2.6", + "@ocd/core": ">=0.2.7", + "@ocd/export": ">=0.2.7", + "@ocd/import": ">=0.2.7", + "@ocd/model": ">=0.2.7", + "@ocd/query": ">=0.2.7", + "@ocd/react": ">=0.2.7", "electron-squirrel-startup": "^1.0.1", "exceljs": "^4.4.0", "oci-sdk": "^2.69.0" @@ -18922,50 +18923,50 @@ }, "packages/export": { "name": "@ocd/export", - "version": "0.2.6", + "version": "0.2.7", "license": "UPL-1.0", "peerDependencies": { - "@ocd/core": ">=0.2.6", - "@ocd/model": ">=0.2.6" + "@ocd/core": ">=0.2.7", + "@ocd/model": ">=0.2.7" } }, "packages/import": { "name": "@ocd/import", - "version": "0.2.6", + "version": "0.2.7", "license": "UPL-1.0", "peerDependencies": { - "@ocd/core": ">=0.2.6", - "@ocd/model": ">=0.2.6" + "@ocd/core": ">=0.2.7", + "@ocd/model": ">=0.2.7" } }, "packages/model": { "name": "@ocd/model", - "version": "0.2.6", + "version": "0.2.7", "license": "UPL-1.0", "peerDependencies": { - "@ocd/core": ">=0.2.6" + "@ocd/core": ">=0.2.7" } }, "packages/query": { "name": "@ocd/query", - "version": "0.2.6", + "version": "0.2.7", "license": "UPL-1.0", "peerDependencies": { - "@ocd/core": ">=0.2.6", - "@ocd/model": ">=0.2.6", + "@ocd/core": ">=0.2.7", + "@ocd/model": ">=0.2.7", "oci-sdk": ">=2.69.0" } }, "packages/react": { "name": "@ocd/react", - "version": "0.2.6", + "version": "0.2.7", "devDependencies": { "@eslint/js": "^9.11.1", - "@ocd/core": ">=0.2.6", - "@ocd/export": ">=0.2.6", - "@ocd/import": ">=0.2.6", - "@ocd/model": ">=0.2.6", - "@ocd/query": ">=0.2.6", + "@ocd/core": ">=0.2.7", + "@ocd/export": ">=0.2.7", + "@ocd/import": ">=0.2.7", + "@ocd/model": ">=0.2.7", + "@ocd/query": ">=0.2.7", "@types/react": "^18.3.10", "@types/react-dom": "^18.3.0", "@vitejs/plugin-react": "^4.3.2", @@ -18986,11 +18987,11 @@ "vite-plugin-dts": "^4.3.0" }, "peerDependencies": { - "@ocd/core": ">=0.2.6", - "@ocd/export": ">=0.2.6", - "@ocd/import": ">=0.2.6", - "@ocd/model": ">=0.2.6", - "@ocd/query": ">=0.2.6", + "@ocd/core": ">=0.2.7", + "@ocd/export": ">=0.2.7", + "@ocd/import": ">=0.2.7", + "@ocd/model": ">=0.2.7", + "@ocd/query": ">=0.2.7", "react": "^18.3.1", "react-colorful": "^5.6.1", "react-dom": "^18.3.1", @@ -19183,7 +19184,7 @@ }, "packages/web": { "name": "@ocd/web", - "version": "0.2.6", + "version": "0.2.7", "license": "UPL-1.0", "devDependencies": {} } diff --git a/ocd/package.json b/ocd/package.json index e2a8d048..cfb1e281 100644 --- a/ocd/package.json +++ b/ocd/package.json @@ -1,6 +1,6 @@ { "name": "ocd", - "version": "0.2.6", + "version": "0.2.7", "description": "OKIT Open Cloud Designer Desktop", "title": "OKIT Open Cloud Designer (Beta)", "author": { diff --git a/ocd/packages/cli/package.json b/ocd/packages/cli/package.json index 8aec6dcf..79959151 100644 --- a/ocd/packages/cli/package.json +++ b/ocd/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@ocd/cli", - "version": "0.2.6", + "version": "0.2.7", "description": "OKIT Open Cloud Designer Command-line", "title": "OKIT Open Cloud Designer Command-linetop", "author": { @@ -34,12 +34,12 @@ "test-query": "node lib/esm/ocd.js query oci -d ../../test/query.okit -p DEFAULT -c OKIT -c infrastructure -c network" }, "dependencies": { - "@ocd/codegen": ">=0.2.6", - "@ocd/core": ">=0.2.6", - "@ocd/export": ">=0.2.6", - "@ocd/import": ">=0.2.6", - "@ocd/model": ">=0.2.6", - "@ocd/query": ">=0.2.6", + "@ocd/codegen": ">=0.2.7", + "@ocd/core": ">=0.2.7", + "@ocd/export": ">=0.2.7", + "@ocd/import": ">=0.2.7", + "@ocd/model": ">=0.2.7", + "@ocd/query": ">=0.2.7", "oci-sdk": "^2.69.0" } } diff --git a/ocd/packages/codegen-cli/package.json b/ocd/packages/codegen-cli/package.json index 1fedf486..fc124bf6 100644 --- a/ocd/packages/codegen-cli/package.json +++ b/ocd/packages/codegen-cli/package.json @@ -1,6 +1,6 @@ { "name": "@ocd/codegen-cli", - "version": "0.2.6", + "version": "0.2.7", "description": "OKIT Open Cloud DesignerCodegen Command-line", "title": "OKIT Open Cloud Designer Codegen Command-linetop", "author": { @@ -83,6 +83,6 @@ "import-and-generate": "npm run import-and-generate-oci && npm run import-and-generate-azurerm && npm run import-and-generate-google" }, "dependencies": { - "@ocd/codegen": ">=0.2.6" + "@ocd/codegen": ">=0.2.7" } } diff --git a/ocd/packages/codegen/package.json b/ocd/packages/codegen/package.json index 5b387e4c..fccbdc54 100644 --- a/ocd/packages/codegen/package.json +++ b/ocd/packages/codegen/package.json @@ -1,6 +1,6 @@ { "name": "@ocd/codegen", - "version": "0.2.6", + "version": "0.2.7", "description": "OKIT Open Cloud Designer Code Generation Module", "title": "OKIT Open Cloud Designer Code Generation Module", "author": { @@ -42,7 +42,7 @@ "build": "npm run compile && npm run pack" }, "dependencies": { - "@ocd/core": ">=0.2.6", + "@ocd/core": ">=0.2.7", "fs": "^0.0.1-security", "path": "^0.12.7" } diff --git a/ocd/packages/core/package.json b/ocd/packages/core/package.json index 2536b121..d62fd8b9 100644 --- a/ocd/packages/core/package.json +++ b/ocd/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@ocd/core", - "version": "0.2.6", + "version": "0.2.7", "description": "OKIT Open Cloud Designer Core Utility Module", "title": "OKIT Open Cloud Designer Core Utility Module", "author": { diff --git a/ocd/packages/desktop/package.json b/ocd/packages/desktop/package.json index 00ae6222..88f3a581 100644 --- a/ocd/packages/desktop/package.json +++ b/ocd/packages/desktop/package.json @@ -1,7 +1,7 @@ { "name": "ocd", "productName": "ocd", - "version": "0.2.6", + "version": "0.2.7", "description": "OKIT Open Cloud Designer Desktop", "title": "OKIT Open Cloud Designer Desktop", "author": { @@ -59,12 +59,12 @@ "vite": "^6.0.3" }, "dependencies": { - "@ocd/core": ">=0.2.6", - "@ocd/export": ">=0.2.6", - "@ocd/import": ">=0.2.6", - "@ocd/model": ">=0.2.6", - "@ocd/query": ">=0.2.6", - "@ocd/react": ">=0.2.6", + "@ocd/core": ">=0.2.7", + "@ocd/export": ">=0.2.7", + "@ocd/import": ">=0.2.7", + "@ocd/model": ">=0.2.7", + "@ocd/query": ">=0.2.7", + "@ocd/react": ">=0.2.7", "electron-squirrel-startup": "^1.0.1", "exceljs": "^4.4.0", "oci-sdk": "^2.69.0" diff --git a/ocd/packages/export/package.json b/ocd/packages/export/package.json index 13cf3981..73e3f98f 100644 --- a/ocd/packages/export/package.json +++ b/ocd/packages/export/package.json @@ -1,6 +1,6 @@ { "name": "@ocd/export", - "version": "0.2.6", + "version": "0.2.7", "description": "OKIT Open Cloud Designer Export Module", "title": "OKIT Open Cloud Designer Export Module", "author": { @@ -42,7 +42,7 @@ "build": "npm run compile && npm run pack" }, "peerDependencies": { - "@ocd/core": ">=0.2.6", - "@ocd/model": ">=0.2.6" + "@ocd/core": ">=0.2.7", + "@ocd/model": ">=0.2.7" } } diff --git a/ocd/packages/export/src/data/OcdBuildDetails.ts b/ocd/packages/export/src/data/OcdBuildDetails.ts index 221c45b5..0ab527b7 100644 --- a/ocd/packages/export/src/data/OcdBuildDetails.ts +++ b/ocd/packages/export/src/data/OcdBuildDetails.ts @@ -11,11 +11,11 @@ */ export const buildDetails: Record = { - version: '0.2.6', - date: '11/27/2024', - time: '3:59:49 PM', - datetime: '11/27/2024, 3:59:49 PM', - utc: 'Wed, 27 Nov 2024 15:59:49 GMT' + version: '0.2.7', + date: '1/27/2025', + time: '2:54:58 PM', + datetime: '1/27/2025, 2:54:58 PM', + utc: 'Mon, 27 Jan 2025 14:54:58 GMT' } export default buildDetails diff --git a/ocd/packages/import/package.json b/ocd/packages/import/package.json index 3b022687..10272ca2 100644 --- a/ocd/packages/import/package.json +++ b/ocd/packages/import/package.json @@ -1,6 +1,6 @@ { "name": "@ocd/import", - "version": "0.2.6", + "version": "0.2.7", "description": "OKIT Open Cloud Designer Import Module", "title": "OKIT Open Cloud Designer Import Module", "author": { @@ -42,7 +42,7 @@ "build": "npm run compile && npm run pack" }, "peerDependencies": { - "@ocd/core": ">=0.2.6", - "@ocd/model": ">=0.2.6" + "@ocd/core": ">=0.2.7", + "@ocd/model": ">=0.2.7" } } diff --git a/ocd/packages/model/package.json b/ocd/packages/model/package.json index 3d33e190..ba2cee9b 100644 --- a/ocd/packages/model/package.json +++ b/ocd/packages/model/package.json @@ -1,6 +1,6 @@ { "name": "@ocd/model", - "version": "0.2.6", + "version": "0.2.7", "description": "OKIT Open Cloud Designer Model Definition Module", "title": "OKIT Open Cloud Designer Model Definition Module", "author": { @@ -42,6 +42,6 @@ "build": "npm run compile && npm run pack" }, "peerDependencies": { - "@ocd/core": ">=0.2.6" + "@ocd/core": ">=0.2.7" } } diff --git a/ocd/packages/query/package.json b/ocd/packages/query/package.json index dfc5452f..c5cb389d 100644 --- a/ocd/packages/query/package.json +++ b/ocd/packages/query/package.json @@ -1,6 +1,6 @@ { "name": "@ocd/query", - "version": "0.2.6", + "version": "0.2.7", "description": "OKIT Open Cloud Designer Query Module", "title": "OKIT Open Cloud Designer Query Module", "author": { @@ -42,8 +42,8 @@ "build": "npm run compile && npm run pack" }, "peerDependencies": { - "@ocd/core": ">=0.2.6", - "@ocd/model": ">=0.2.6", + "@ocd/core": ">=0.2.7", + "@ocd/model": ">=0.2.7", "oci-sdk": ">=2.69.0" } } diff --git a/ocd/packages/react/package.json b/ocd/packages/react/package.json index 36cab993..073b3d70 100644 --- a/ocd/packages/react/package.json +++ b/ocd/packages/react/package.json @@ -1,7 +1,7 @@ { "name": "@ocd/react", "private": true, - "version": "0.2.6", + "version": "0.2.7", "description": "OKIT Open Cloud Designer React Components", "title": "OKIT Open Cloud Designer React Components", "author": { @@ -49,11 +49,11 @@ "dependencies": { }, "peerDependencies": { - "@ocd/core": ">=0.2.6", - "@ocd/export": ">=0.2.6", - "@ocd/import": ">=0.2.6", - "@ocd/model": ">=0.2.6", - "@ocd/query": ">=0.2.6", + "@ocd/core": ">=0.2.7", + "@ocd/export": ">=0.2.7", + "@ocd/import": ">=0.2.7", + "@ocd/model": ">=0.2.7", + "@ocd/query": ">=0.2.7", "react": "^18.3.1", "react-colorful": "^5.6.1", "react-dom": "^18.3.1", @@ -71,11 +71,11 @@ "eslint-plugin-react-refresh": "^0.4.12", "glob": "^11.0.0", "globals": "^15.9.0", - "@ocd/core": ">=0.2.6", - "@ocd/export": ">=0.2.6", - "@ocd/import": ">=0.2.6", - "@ocd/model": ">=0.2.6", - "@ocd/query": ">=0.2.6", + "@ocd/core": ">=0.2.7", + "@ocd/export": ">=0.2.7", + "@ocd/import": ">=0.2.7", + "@ocd/model": ">=0.2.7", + "@ocd/query": ">=0.2.7", "react": "^18.3.1", "react-dom": "^18.3.1", "react-markdown": "^9.0.0", diff --git a/ocd/packages/react/src/components/dialogs/OcdExportToResourceManagerDialog.tsx b/ocd/packages/react/src/components/dialogs/OcdExportToResourceManagerDialog.tsx index 6d4d22f7..7c08f2d6 100644 --- a/ocd/packages/react/src/components/dialogs/OcdExportToResourceManagerDialog.tsx +++ b/ocd/packages/react/src/components/dialogs/OcdExportToResourceManagerDialog.tsx @@ -193,22 +193,16 @@ export const OcdExportToResourceManagerDialog = ({ocdDocument, setOcdDocument}: } const CompartmentPicker = ({compartments, selectedCompartmentIds, setSelectedCompartmentIds, root, parentId, setHierarchy, refs, collapsedCompartmentIds, setCollapsedCompartmentIds}: CompartmentPickerProps): JSX.Element => { - // const [isOpen, setIsOpen] = useState(true) - // const isOpen = collapsedCompartmentIds.includes(parentId) const filter = root ? (c: OciModelResources.OciCompartment) => c.root : (c: OciModelResources.OciCompartment) => c.compartmentId === parentId const filteredCompartments = compartments.filter(filter) console.debug('OcdExportToResourceManagerDialog:', root, parentId, filteredCompartments) const onChange = (e: React.ChangeEvent, id: string) => { e.stopPropagation() const selected = e.target.checked - // console.debug('OcdExportToResourceManagerDialog: Selected', selected) - // const compartmentIds = selected ? [...selectedCompartmentIds, id] : selectedCompartmentIds.filter((i) => i !== id) const compartmentIds = selected ? [id] : [] setSelectedCompartmentIds(compartmentIds) } const onMouseOver = (id: string) => { - // console.debug('OcdExportToResourceManagerDialog: onMouseOver', id) - // setHierarchy(id === '' ? '' : getHierarchy(id).join('/')) const compartment: OciModelResources.OciCompartment | undefined = compartments.find((c: OciModelResources.OciCompartment) => c.id === id) setHierarchy(compartment !== undefined ? compartment.hierarchy : '') } @@ -218,7 +212,6 @@ const CompartmentPicker = ({compartments, selectedCompartmentIds, setSelectedCom // Toggle State const compartmentIds = isClosed ? collapsedCompartmentIds.filter((i) => i !== id) : [...collapsedCompartmentIds, id] setCollapsedCompartmentIds(compartmentIds) - // setIsOpen(!isOpen) } const onInputClick = (e: React.MouseEvent) => e.stopPropagation() const subCompartmentsClasses = collapsedCompartmentIds.includes(parentId) ? 'hidden' : '' @@ -229,7 +222,6 @@ const CompartmentPicker = ({compartments, selectedCompartmentIds, setSelectedCom const isClosed = collapsedCompartmentIds.includes(c.id) const isClosedClasses = isClosed ? 'ocd-collapable-list-element ocd-list-collapsed' : 'ocd-collapable-list-element ocd-list-open' const labelClasses = subCompartmentsCount > 0 ? isClosedClasses : 'ocd-collapable-list-element' - // const labelClasses = subCompartmentsCount > 0 ? isClosed ? 'ocd-collapable-list-element ocd-list-collapsed' : 'ocd-collapable-list-element ocd-list-open' : 'ocd-collapable-list-element' return
  • onClick(e, c.id)} aria-hidden> {subCompartmentsCount > 0 && { - const {activeFile, setActiveFile} = useContext(ActiveFileContext) - const {ocdConsoleConfig, setOcdConsoleConfig} = useContext(ConsoleConfigContext) + const {setActiveFile} = useContext(ActiveFileContext) + const {ocdConsoleConfig} = useContext(ConsoleConfigContext) const loadingState = '......Reading OCI Config' const regionsLoading = {id: 'Select Valid Profile', displayName: 'Select Valid Profile'} const className = `ocd-query-dialog` @@ -172,8 +172,6 @@ export const OcdQueryDialog = ({ocdDocument, setOcdDocument}: QueryDialogProps): } const CompartmentPicker = ({compartments, selectedCompartmentIds, setSelectedCompartmentIds, root, parentId, setHierarchy, refs, collapsedCompartmentIds, setCollapsedCompartmentIds}: CompartmentPickerProps): JSX.Element => { - // const [isOpen, setIsOpen] = useState(true) - // const isOpen = collapsedCompartmentIds.includes(parentId) const filter = root ? (c: OciModelResources.OciCompartment) => c.root : (c: OciModelResources.OciCompartment) => c.compartmentId === parentId const filteredCompartments = compartments.filter(filter) console.debug('OcdQueryDialog:', root, parentId, filteredCompartments) @@ -184,14 +182,7 @@ const CompartmentPicker = ({compartments, selectedCompartmentIds, setSelectedCom const compartmentIds = selected ? [...selectedCompartmentIds, id] : selectedCompartmentIds.filter((i) => i !== id) setSelectedCompartmentIds(compartmentIds) } - // const getHierarchy = (id: string): string[] => { - // const compartment: OciModelResources.OciCompartment | undefined = compartments.find((c: OciModelResources.OciCompartment) => c.id === id) - // const hierarchy: string[] = compartment === undefined ? [''] : [...getHierarchy(compartment.compartmentId), compartment.name] - // return hierarchy - // } const onMouseOver = (id: string) => { - // console.debug('OcdQueryDialog: onMouseOver', id) - // setHierarchy(id === '' ? '' : getHierarchy(id).join('/')) const compartment: OciModelResources.OciCompartment | undefined = compartments.find((c: OciModelResources.OciCompartment) => c.id === id) setHierarchy(compartment !== undefined ? compartment.hierarchy : '') } @@ -201,7 +192,6 @@ const CompartmentPicker = ({compartments, selectedCompartmentIds, setSelectedCom // Toggle State const compartmentIds = isClosed ? collapsedCompartmentIds.filter((i) => i !== id) : [...collapsedCompartmentIds, id] setCollapsedCompartmentIds(compartmentIds) - // setIsOpen(!isOpen) console.debug('OcdQueryDialog: Click/Collapse Event:', e) } const onInputClick = (e: React.MouseEvent) => e.stopPropagation() diff --git a/ocd/packages/react/src/data/OcdBuildDetails.ts b/ocd/packages/react/src/data/OcdBuildDetails.ts index 221c45b5..6b85f57c 100644 --- a/ocd/packages/react/src/data/OcdBuildDetails.ts +++ b/ocd/packages/react/src/data/OcdBuildDetails.ts @@ -11,11 +11,11 @@ */ export const buildDetails: Record = { - version: '0.2.6', - date: '11/27/2024', - time: '3:59:49 PM', - datetime: '11/27/2024, 3:59:49 PM', - utc: 'Wed, 27 Nov 2024 15:59:49 GMT' + version: '0.2.7', + date: '1/27/2025', + time: '2:54:57 PM', + datetime: '1/27/2025, 2:54:57 PM', + utc: 'Mon, 27 Jan 2025 14:54:57 GMT' } export default buildDetails diff --git a/ocd/packages/web/package.json b/ocd/packages/web/package.json index 25c65b06..a8da1787 100644 --- a/ocd/packages/web/package.json +++ b/ocd/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@ocd/web", - "version": "0.2.6", + "version": "0.2.7", "description": "OKIT Open Cloud Designer Web Interface", "title": "OKIT Open Cloud Designer Web Interface", "author": { From 480eafd27ba3b02c2a23577d6d015ed375b739c1 Mon Sep 17 00:00:00 2001 From: Andrew Hopkinson <64254061+toxophilist@users.noreply.github.com> Date: Thu, 30 Jan 2025 10:12:24 +0000 Subject: [PATCH 4/8] docs: move OCI installation documentation to unsupported --- documentation/{ => unsupported}/OCIVmInstallation.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename documentation/{ => unsupported}/OCIVmInstallation.md (100%) diff --git a/documentation/OCIVmInstallation.md b/documentation/unsupported/OCIVmInstallation.md similarity index 100% rename from documentation/OCIVmInstallation.md rename to documentation/unsupported/OCIVmInstallation.md From 5e01d482a3ab72323906042a83b54a519e7c3284 Mon Sep 17 00:00:00 2001 From: Andrew Hopkinson <64254061+toxophilist@users.noreply.github.com> Date: Thu, 30 Jan 2025 16:32:26 +0000 Subject: [PATCH 5/8] feat(export): Add export buttons to view toolbar --- ocd/package.json | 2 +- ocd/packages/desktop/src/css/theme.css | 15 ++ ocd/packages/desktop/src/main.ts | 137 +++++++++++++++++- ocd/packages/desktop/src/preload.ts | 5 +- ocd/packages/react/src/components/Menu.ts | 17 ++- .../provider/oci/OciTabularContents.tsx | 9 +- .../react/src/facade/OcdDesignFacade.ts | 15 +- .../react/src/facade/OcdElectronAPI.ts | 5 +- ocd/packages/react/src/pages/OcdConsole.tsx | 59 +++++--- ocd/packages/react/src/pages/OcdMarkdown.tsx | 30 ++++ ocd/packages/react/src/pages/OcdTabular.tsx | 36 ++++- ocd/packages/react/src/pages/OcdTerraform.tsx | 26 ++++ 12 files changed, 318 insertions(+), 38 deletions(-) diff --git a/ocd/package.json b/ocd/package.json index cfb1e281..b71b7d98 100644 --- a/ocd/package.json +++ b/ocd/package.json @@ -35,7 +35,7 @@ "fresh-install": "npm run install-and-codegen", "reinstall": "npm run purge && npm run install-and-codegen", "clean": "npm run clean --workspaces --if-present && rm -rf lib dist build", - "purge": "npm run purge --workspaces --if-present && rm -rf node_modules", + "purge": "npm run purge --workspaces --if-present && rm -rf node_modules lib dist build", "build": "npm run build --workspaces --if-present", "rebuild": "npm run clean && npm run build", "compile": "npm run compile --workspaces --if-present", diff --git a/ocd/packages/desktop/src/css/theme.css b/ocd/packages/desktop/src/css/theme.css index ca14482d..a01cf398 100644 --- a/ocd/packages/desktop/src/css/theme.css +++ b/ocd/packages/desktop/src/css/theme.css @@ -217,3 +217,18 @@ details > summary.summary-background { details[open] > summary.summary-background { background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwIiBjeD0iNi4xMSIgY3k9IjMuNTUiIHJ4PSIyLjExIiByeT0iMi4xNSIvPjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMCIgY3g9IjYuMTEiIGN5PSIxNS41NSIgcng9IjIuMTEiIHJ5PSIyLjE1Ii8+PGNpcmNsZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAiIGN4PSIxMy4xNSIgY3k9IjkuNTUiIHI9IjIuMTUiLz48cGF0aCBkPSJNMSAzaDN2MUgxek0xMCAzaDh2MWgtOHpNMSA5aDh2MUgxek0xNSA5aDN2MWgtM3pNMSAxNWgzdjFIMXpNMTAgMTVoOHYxaC04eiIvPjwvc3ZnPg=="); } + +/* +** Third Party +*/ +.excel { + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMjg5Ljc1IDIxMzAiPjxwYXRoIGZpbGw9IiMxODVDMzciIGQ9Ik0xNDM3Ljc1IDEwMTEuNzVMNTMyLjUgODUydjExODAuMzkzYzAgNTMuOTA3IDQzLjcgOTcuNjA3IDk3LjYwNyA5Ny42MDdoMTU2Mi4wMzZjNTMuOTA3IDAgOTcuNjA3LTQzLjcgOTcuNjA3LTk3LjYwN1YxNTk3LjVsLTg1Mi01ODUuNzV6Ii8+PHBhdGggZmlsbD0iIzIxQTM2NiIgZD0iTTE0MzcuNzUgMEg2MzAuMTA3QzU3Ni4yIDAgNTMyLjUgNDMuNyA1MzIuNSA5Ny42MDdWNTMyLjVsOTA1LjI1IDUzMi41TDE5MTcgMTIyNC43NSAyMjg5Ljc1IDEwNjVWNTMyLjVMMTQzNy43NSAweiIvPjxwYXRoIGZpbGw9IiMxMDdDNDEiIGQ9Ik01MzIuNSA1MzIuNWg5MDUuMjVWMTA2NUg1MzIuNVY1MzIuNXoiLz48cGF0aCBvcGFjaXR5PSIuMSIgZD0iTTExODAuMzkzIDQyNkg1MzIuNXYxMzMxLjI1aDY0Ny44OTNjNTMuODM0LS4xNzUgOTcuNDMyLTQzLjc3MyA5Ny42MDctOTcuNjA3VjUyMy42MDdjLS4xNzUtNTMuODM0LTQzLjc3My05Ny40MzItOTcuNjA3LTk3LjYwN3oiLz48cGF0aCBvcGFjaXR5PSIuMiIgZD0iTTExMjcuMTQzIDQ3OS4yNUg1MzIuNVYxODEwLjVoNTk0LjY0M2M1My44MzQtLjE3NSA5Ny40MzItNDMuNzczIDk3LjYwNy05Ny42MDdWNTc2Ljg1N2MtLjE3NS01My44MzQtNDMuNzczLTk3LjQzMi05Ny42MDctOTcuNjA3eiIvPjxwYXRoIG9wYWNpdHk9Ii4yIiBkPSJNMTEyNy4xNDMgNDc5LjI1SDUzMi41VjE3MDRoNTk0LjY0M2M1My44MzQtLjE3NSA5Ny40MzItNDMuNzczIDk3LjYwNy05Ny42MDdWNTc2Ljg1N2MtLjE3NS01My44MzQtNDMuNzczLTk3LjQzMi05Ny42MDctOTcuNjA3eiIvPjxwYXRoIG9wYWNpdHk9Ii4yIiBkPSJNMTA3My44OTMgNDc5LjI1SDUzMi41VjE3MDRoNTQxLjM5M2M1My44MzQtLjE3NSA5Ny40MzItNDMuNzczIDk3LjYwNy05Ny42MDdWNTc2Ljg1N2MtLjE3NS01My44MzQtNDMuNzczLTk3LjQzMi05Ny42MDctOTcuNjA3eiIvPjxsaW5lYXJHcmFkaWVudCBpZD0icHJlZml4X19hIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjIwMy41MTMiIHkxPSIxNzI5LjAxOCIgeDI9Ijk2Ny45ODciIHkyPSI0MDQuOTgyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMjEzMikiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzE4ODg0ZiIvPjxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9IiMxMTdlNDMiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwYjY2MzEiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGZpbGw9InVybCgjcHJlZml4X19hKSIgZD0iTTk3LjYwNyA0NzkuMjVoOTc2LjI4NWM1My45MDcgMCA5Ny42MDcgNDMuNyA5Ny42MDcgOTcuNjA3djk3Ni4yODVjMCA1My45MDctNDMuNyA5Ny42MDctOTcuNjA3IDk3LjYwN0g5Ny42MDdDNDMuNyAxNjUwLjc1IDAgMTYwNy4wNSAwIDE1NTMuMTQzVjU3Ni44NTdjMC01My45MDcgNDMuNy05Ny42MDcgOTcuNjA3LTk3LjYwN3oiLz48cGF0aCBmaWxsPSIjRkZGIiBkPSJNMzAyLjMgMTM4Mi4yNjRsMjA1LjMzMi0zMTguMTY5TDMxOS41IDc0Ny42ODNoMTUxLjMzNmwxMDIuNjY2IDIwMi4zNWM5LjQ3OSAxOS4yMjMgMTUuOTc1IDMzLjQ5NCAxOS40OSA0Mi45MTloMS4zMzFhNzk4LjY2NyA3OTguNjY3IDAgMDEyMS4zLTQ0LjY3N0w3MjUuMzcxIDc0Ny43OUg4NjQuM2wtMTkyLjkyNSAzMTQuNTQ4TDg2OS4yIDEzODIuMjYzSDcyMS4zNzhMNjAyLjc5IDExNjAuMTU4YTE4Ni4yOTggMTg2LjI5OCAwIDAxLTE0LjE2NC0yOS42NmgtMS43NTdhMTQwLjQ1OCAxNDAuNDU4IDAgMDEtMTMuNzM5IDI4Ljc1NWwtMTIyLjEwMiAyMjMuMDExSDMwMi4zeiIvPjxwYXRoIGZpbGw9IiMzM0M0ODEiIGQ9Ik0yMTkyLjE0MyAwSDE0MzcuNzV2NTMyLjVoODUyVjk3LjYwN0MyMjg5Ljc1IDQzLjcgMjI0Ni4wNSAwIDIxOTIuMTQzIDB6Ii8+PHBhdGggZmlsbD0iIzEwN0M0MSIgZD0iTTE0MzcuNzUgMTA2NWg4NTJ2NTMyLjVoLTg1MlYxMDY1eiIvPjwvc3ZnPg=="); +} + +.opentofu { + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiI+PHBhdGggZmlsbD0iIzBkMWEyYSIgZD0iTTE3LjA2LjYxYTIuMjEgMi4yMSAwIDAwLTIuMTIgMEw0LjEgNi41N2wtLjAzLjAxLTEuNDIuNzlBMi4xOCAyLjE4IDAgMDAxLjUgOS4yOXYxMy40YzAgLjgxLjQ0IDEuNTUgMS4xNCAxLjk0bDEwLjk1IDYuMDIuMDUuMDIgMS4zLjcyYy42Ni4zNiAxLjQ2LjM2IDIuMTIgMGwxLjMxLS43Mi4wNC0uMDIgMTAuOTUtNi4wMmEyLjIgMi4yIDAgMDAxLjE0LTEuOTJWOS4yOWMwLS44LS40NC0xLjU0LTEuMTQtMS45MmwtMS40Mi0uNzgtLjAzLS4wMXptLjcgMTUuMzlsMTAuMTQtNS41OC4wMy0uMDEuMTMtLjA3YS41LjUgMCAwMS43NC40NHYxMC40NGEuNS41IDAgMDEtLjc0LjQ0bC0uMS0uMDUtLjA2LS4wM3ptLTEzLjctNS42bC4wMy4wMiAxMC4xNSA1LjU3TDQuMSAyMS41OGwtLjA2LjAzLS4xLjA1YS41LjUgMCAwMS0uNzQtLjQ0VjEwLjc4YS41LjUgMCAwMS43NC0uNDVsLjEzLjA3ek0yNy4xIDguMDZsLTkuNS01LjIzYS41LjUgMCAwMC0uNzYuNDN2MTEuMzFMMjcuMSA4Ljk0YS41LjUgMCAwMDAtLjg4em0tMjIuMi44N2wxMC4yNSA1LjYzVjMuMjZhLjUuNSAwIDAwLS43NS0uNDNMNC45IDguMDZhLjUuNSAwIDAwMCAuODd6bTAgMTUuMDFhLjUuNSAwIDAxLS4wMi0uODdsMTAuMjgtNS42NHYxMS4zYy0uMDEuMzgtLjQuNjEtLjc0LjQ1bC05LjUxLTUuMjN6bTExLjk0IDQuNzh2LTExLjNsMTAuMjggNS42NGEuNS41IDAgMDEtLjAzLjg4bC05LjUxIDUuMjNhLjUuNSAwIDAxLS43NC0uNDR6Ii8+PHBhdGggZmlsbD0iI2U2YzIyMCIgZD0iTTE1Ljc1IDIuMDhhLjUuNSAwIDAxLjUgMGwxMC44NCA1Ljk3Yy4zNS4xOS4zNS43IDAgLjg5TDE2LjI0IDE0LjlhLjUuNSAwIDAxLS40OSAwTDQuOTEgOC45NGEuNS41IDAgMDEwLS45eiIvPjxwYXRoIGZpbGw9IiNmZWRhMTUiIGQ9Ik0zLjE5IDEwLjc4YS41LjUgMCAwMS43NS0uNDVsMTAuOTUgNi4wMmMuMTYuMS4yNi4yNi4yNi40NHYxMS45M2EuNS41IDAgMDEtLjc1LjQ0TDMuNDYgMjMuMTVhLjUxLjUxIDAgMDEtLjI2LS40NFYxMC43OHoiLz48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMjguMDYgMTAuMzNhLjUuNSAwIDAxLjc0LjQ1VjIyLjdhLjUuNSAwIDAxLS4yNi40NEwxNy42IDI5LjE2YS41LjUgMCAwMS0uNzUtLjQ0VjE2Ljc5YzAtLjE4LjEtLjM1LjI2LS40NHoiLz48cGF0aCBmaWxsPSIjMGQxYTJhIiBkPSJNNy43OSAyMC4xM3YuMDJMNS4yMiAxOC44di0uMDJjLjA2LS44LjY4LTEuMTUgMS4zOS0uNzdzMS4yNCAxLjMyIDEuMTggMi4xMnptNC4wNCAyLjMzdi4wMmwtMi41Ny0xLjM2di0uMDFjLjA2LS44LjY4LTEuMTUgMS4zOS0uNzdzMS4yNCAxLjMyIDEuMTggMi4xMnoiLz48L3N2Zz4="); +} + +.markdown { + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMDgiIGhlaWdodD0iMTI4Ij48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMTAiIGQ9Ik0xNSA1aDE3OGM1LjUyMyAwIDEwIDQuNDc3IDEwIDEwdjk4YzAgNS41MjMtNC40NzcgMTAtMTAgMTBIMTVjLTUuNTIzIDAtMTAtNC40NzctMTAtMTBWMTVDNSA5LjQ3NyA5LjQ3NyA1IDE1IDV6Ii8+PHBhdGggZD0iTTMwIDk4VjMwaDIwbDIwIDI1IDIwLTI1aDIwdjY4SDkwVjU5TDcwIDg0IDUwIDU5djM5SDMwem0xMjUgMGwtMzAtMzNoMjBWMzBoMjB2MzVoMjBsLTMwIDMzeiIvPjwvc3ZnPg=="); +} diff --git a/ocd/packages/desktop/src/main.ts b/ocd/packages/desktop/src/main.ts index 7a006dd3..0c699b3d 100644 --- a/ocd/packages/desktop/src/main.ts +++ b/ocd/packages/desktop/src/main.ts @@ -8,11 +8,13 @@ import Squirrel from 'electron-squirrel-startup' import path from 'path' import url from 'url' import fs from 'fs' +import ExcelJS, { TableColumnProperties, TableProperties } from 'exceljs' import common from 'oci-common' import { OciQuery, OciReferenceDataQuery, OciResourceManagerQuery } from '@ocd/query' -import { OcdDesign } from '@ocd/model' +import { OcdDesign, OcdResource } from '@ocd/model' import { OcdCache, OcdConsoleConfiguration } from '@ocd/react' -// import { unescape } from 'querystring' +import { OcdUtils } from '@ocd/core' +import { OcdMarkdownExporter, OcdTerraformExporter } from '@ocd/export' app.commandLine.appendSwitch('ignore-certificate-errors') // Temporary work around for not being able to add additional certificates process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0' // Temporary work around for not being able to add additional certificates @@ -254,10 +256,13 @@ app.whenReady().then(() => { ipcMain.handle('ocdDesign:loadDesign', handleLoadDesign) ipcMain.handle('ocdDesign:saveDesign', handleSaveDesign) ipcMain.handle('ocdDesign:discardConfirmation', handleDiscardConfirmation) - ipcMain.handle('ocdDesign:exportTerraform', handleExportTerraform) ipcMain.handle('ocdDesign:loadLibraryIndex', handleLoadLibraryIndex) ipcMain.handle('ocdDesign:loadLibraryDesign', handleLoadLibraryDesign) ipcMain.handle('ocdDesign:loadSvgCssFiles', handleLoadSvgCssFiles) + ipcMain.handle('ocdDesign:exportTerraform', handleExportTerraform) + ipcMain.handle('ocdDesign:exportToExcel', handleExportToExcel) + ipcMain.handle('ocdDesign:exportToMarkdown', handleExportToMarkdown) + ipcMain.handle('ocdDesign:exportToTerraform', handleExportToTerraform) // OCD Configuration ipcMain.handle('ocdConfig:loadConsoleConfig', handleLoadConsoleConfig) ipcMain.handle('ocdConfig:saveConsoleConfig', handleSaveConsoleConfig) @@ -431,9 +436,9 @@ async function handleSaveDesign(event: any, design: OcdDesign, filename: string, if (!filename || !fs.existsSync(filename) || !fs.statSync(filename).isFile()) { dialog.showSaveDialog(mainWindow, { defaultPath: suggestedFilename, - properties: ['openFile', 'createDirectory'], + properties: ['createDirectory'], filters: [{name: 'Filetype', extensions: ['okit']}] - }).then(result => { + }).then(result => { if (!result.canceled) fs.writeFileSync(result.filePath, JSON.stringify(design, null, 4)) resolve({canceled: false, filename: result.canceled ? '' : result.filePath, design: design}) }).catch(err => { @@ -468,9 +473,129 @@ async function handleDiscardConfirmation(event: any) { } async function handleExportTerraform(event: any, design: OcdDesign, directory: string) { - // design = typeof design === 'string' ? JSON.parse(design) : design + design = typeof design === 'string' ? JSON.parse(design) : design console.debug('Electron Main: handleExportTerraform') + return Promise.reject(new Error('Currently Not Implemented')) +} + +async function handleExportToExcel(event: any, design: OcdDesign, suggestedFilename='') { + // design = typeof design === 'string' ? JSON.parse(design) : design + console.debug('Electron Main: handleExportToExcel') // return new Promise((resolve, reject) => {reject('Currently Not Implemented')}) + return new Promise((resolve, reject) => { + // try { + dialog.showSaveDialog(mainWindow, { + defaultPath: suggestedFilename, + properties: ['createDirectory'], + filters: [{name: 'Filetype', extensions: ['xlsx']}], + buttonLabel: 'Export' + }).then(result => { + if (!result.canceled) { + const ociResources = design.model.oci.resources + const compartments = ociResources.compartment + const compartmentName = (id: string): string => compartments.find((c) => c.id === id)?.displayName + const workbook = new ExcelJS.Workbook() + let styleNumber = 1 + Object.entries(ociResources).forEach(([k, v]) => { + const worksheet = workbook.addWorksheet(OcdUtils.toTitle(k)) + const resources = v.map((r: OcdResource) => {return {...r, compartmentName: compartmentName(r.compartmentId)}}) + console.debug('handleExportToExcel:', JSON.stringify(resources, null, 2)) + const columns = [ + {header: 'Name', key: 'displayName', width: 20}, + {header: 'Compartment', key: 'compartmentName', width: 35} + ] + worksheet.columns = columns + // worksheet.addRows(resources) + const tableColumns: TableColumnProperties[] = [ + {name: 'Name', filterButton: true}, + {name: 'Compartment', filterButton: true} + ] + // @ts-ignore + const tableRows: any[][] = resources.reduce((a, c) => {return [...a, [c.displayName, c.compartmentName]]}, []) + console.debug('handleExportToExcel: Table:', JSON.stringify(tableRows, null, 2)) + const table: TableProperties = { + name: `${k}Table`, + ref: 'A1', + headerRow: true, + totalsRow: false, + style: { + // @ts-ignore + theme: `TableStyleLight${styleNumber}`, + showRowStripes: true, + }, + columns: tableColumns, + rows: tableRows, + } + worksheet.addTable(table) + styleNumber += 1 + }) + workbook.xlsx.writeFile(result.filePath).then(() => { + console.log('Workbook saved successfully!') + resolve({canceled: false, filename: result.filePath, design: design}) + }).catch((error) => { + console.error('Error saving workbook:', error) + reject(new Error(error)) + }) + // fs.writeFileSync(result.filePath, JSON.stringify(design, null, 4)) + } else { + resolve({canceled: false, filename: '', design: design}) + } + }).catch(err => { + console.error(err) + reject(err) + }) + // } catch (err) { + // reject(err) + // } + }) + // return Promise.reject(new Error('Currently Not Implemented')) +} + +async function handleExportToMarkdown(event: any, design: OcdDesign, css: string[]=[], suggestedFilename='') { + design = typeof design === 'string' ? JSON.parse(design) : design + console.debug('Electron Main: handleExportToMarkdown') + return new Promise((resolve, reject) => { + dialog.showSaveDialog(mainWindow, { + defaultPath: suggestedFilename, + properties: ['createDirectory'], + filters: [{name: 'Filetype', extensions: ['md']}], + buttonLabel: 'Export' + }).then(result => { + if (!result.canceled) { + const exporter = new OcdMarkdownExporter(css) + const output = exporter.export(design) + fs.writeFileSync(result.filePath, output) + } + resolve({canceled: false, filename: result.canceled ? '' : result.filePath, design: design}) + }).catch(err => { + console.error(err) + reject(new Error(err)) + }) + }) +} + +async function handleExportToTerraform(event: any, design: OcdDesign, directory: string) { + design = typeof design === 'string' ? JSON.parse(design) : design + console.debug('Electron Main: handleExportTerraform') + return new Promise((resolve, reject) => { + dialog.showOpenDialog(mainWindow, { + properties: ['openDirectory', 'createDirectory'], + defaultPath: directory, + buttonLabel: 'Export' + }).then(result => { + if (!result.canceled) { + const exporter = new OcdTerraformExporter() + const terraform = exporter.export(design) + console.debug('handleExportToTerraform: ', result.filePaths) + const directory = result.filePaths[0] + Object.entries(terraform).forEach(([k, v]) => fs.writeFileSync(path.join(directory, k), v.join('\n'))) + } + resolve({canceled: result.canceled, filename: result.filePaths[0], design: design}) + }).catch(err => { + console.error(err) + reject(new Error(err)) + }) + }) return Promise.reject(new Error('Currently Not Implemented')) } diff --git a/ocd/packages/desktop/src/preload.ts b/ocd/packages/desktop/src/preload.ts index 8d7702d3..2267c9c6 100644 --- a/ocd/packages/desktop/src/preload.ts +++ b/ocd/packages/desktop/src/preload.ts @@ -28,10 +28,13 @@ contextBridge.exposeInMainWorld('ocdAPI', { loadDesign: (filename: string) => ipcRenderer.invoke('ocdDesign:loadDesign', filename), saveDesign: (design: OcdDesign, filename: string, suggestedFilename = '') => ipcRenderer.invoke('ocdDesign:saveDesign', design, filename, suggestedFilename), discardConfirmation: () => ipcRenderer.invoke('ocdDesign:discardConfirmation'), - exportTerraform: (design: OcdDesign, directory: string) => ipcRenderer.invoke('ocdDesign:exportTerraform', design, directory), loadLibraryIndex: () => ipcRenderer.invoke('ocdDesign:loadLibraryIndex'), loadLibraryDesign: (section: string, filename: string) => ipcRenderer.invoke('ocdDesign:loadLibraryDesign', section, filename), loadSvgCssFiles: () => ipcRenderer.invoke('ocdDesign:loadSvgCssFiles'), + exportTerraform: (design: OcdDesign, directory: string) => ipcRenderer.invoke('ocdDesign:exportTerraform', design, directory), + exportToExcel: (design: OcdDesign, suggestedFilename = '') => ipcRenderer.invoke('ocdDesign:exportToExcel', design, suggestedFilename), + exportToMarkdown: (design: OcdDesign, css: string[], suggestedFilename = '') => ipcRenderer.invoke('ocdDesign:exportToMarkdown', design, css, suggestedFilename), + exportToTerraform: (design: OcdDesign, directory: string) => ipcRenderer.invoke('ocdDesign:exportToTerraform', design, directory), // OCD Configuration loadConsoleConfig: () => ipcRenderer.invoke('ocdConfig:loadConsoleConfig'), saveConsoleConfig: (config: OcdConsoleConfiguration) => ipcRenderer.invoke('ocdConfig:saveConsoleConfig', config), diff --git a/ocd/packages/react/src/components/Menu.ts b/ocd/packages/react/src/components/Menu.ts index 5d38d4d3..cedbfd0f 100644 --- a/ocd/packages/react/src/components/Menu.ts +++ b/ocd/packages/react/src/components/Menu.ts @@ -192,7 +192,7 @@ export const menuItems: MenuItem[] = [ submenu: [ { label: 'Markdown', - click: (ocdDocument: OcdDocument, setOcdDocument: Function) => { + click: (ocdDocument: OcdDocument, setOcdDocument: Function) => { // TODO: Convert to call to Electron API const saveFile = async (ocdDocument: OcdDocument) => { try { const options = { @@ -222,7 +222,7 @@ export const menuItems: MenuItem[] = [ }, { label: 'OpenTofu (Terraform)', - click: (ocdDocument: OcdDocument, setOcdDocument: Function) => { + click: (ocdDocument: OcdDocument, setOcdDocument: Function) => { // TODO: Convert to call to Electron API const writeTerraformFile = async (dirHandle: FileSystemDirectoryHandle, filename: string, contents: string[]) => { const fileHandle: FileSystemFileHandle = await dirHandle.getFileHandle(filename, {create: true}) // @ts-ignore @@ -256,6 +256,19 @@ export const menuItems: MenuItem[] = [ // setOcdDocument(clone) // } // }, + { + label: 'Excel', + click: (ocdDocument: OcdDocument, setOcdDocument: Function, ocdConsoleConfig: OcdConsoleConfig, setOcdConsoleConfig: Function, activeFile: Record, setActiveFile: Function) => { + const suggestedFilename = activeFile.name.replaceAll('.okit', '.xlsx') + OcdDesignFacade.exportToExcel(ocdDocument.design, suggestedFilename).then((results) => { + if (!results.canceled) { + console.debug('Design Exported to Excel') + } else { + console.debug('Design Exported to Excel Cancelled') + } + }).catch((resp) => {console.warn('Save Design Failed with', resp)}) + } + }, { label: 'Image', click: undefined, diff --git a/ocd/packages/react/src/components/tabular/provider/oci/OciTabularContents.tsx b/ocd/packages/react/src/components/tabular/provider/oci/OciTabularContents.tsx index e6b52a38..af30bdfa 100644 --- a/ocd/packages/react/src/components/tabular/provider/oci/OciTabularContents.tsx +++ b/ocd/packages/react/src/components/tabular/provider/oci/OciTabularContents.tsx @@ -8,6 +8,7 @@ import { OciTabularContentsProps, OciTabularHeaderProps, OciTabularResourceProps import { useContext, useState } from "react" import { OcdUtils } from "@ocd/core" import { ConsoleConfigContext } from "../../../../pages/OcdConsole" +import { OcdConsoleConfig } from "../../../OcdConsoleConfiguration" export const OciDefault = ({ ocdDocument, ociResources, selected }: OciTabularResourceProps): JSX.Element => { console.debug('OciTabularContents: OciDefault') @@ -24,8 +25,10 @@ export const OciDefault = ({ ocdDocument, ociResources, selected }: OciTabularRe } export const OcdTabularContents = ({ ocdDocument, ociResources, selected, columnTitles, resourceElements }: OciTabularContentsProps): JSX.Element => { - const {ocdConsoleConfig, setOcdConsoleConfig} = useContext(ConsoleConfigContext) - const [displayColumns, setDisplayColumns] = useState(ocdConsoleConfig.config.displayColumns ? ocdConsoleConfig.config.displayColumns[selected] ? ocdConsoleConfig.config.displayColumns[selected] : columnTitles : columnTitles) + const {ocdConsoleConfig} = useContext(ConsoleConfigContext) + const configDisplayColumns = ocdConsoleConfig.config.displayColumns || {} + const [displayColumns, setDisplayColumns] = useState(configDisplayColumns[selected] ? configDisplayColumns[selected] : columnTitles) + // const [displayColumns, setDisplayColumns] = useState(ocdConsoleConfig.config.displayColumns ? ocdConsoleConfig.config.displayColumns[selected] ? ocdConsoleConfig.config.displayColumns[selected] : columnTitles : columnTitles) const [sortColumn, setSortColumn] = useState('') const [sortAscending, setSortAscending] = useState(true) const onSortClick = (element: string) => { @@ -104,7 +107,7 @@ export const OcdTabularHeader = ({columnTitles, ociResources, resourceElements, if (!ocdConsoleConfig.config.displayColumns) ocdConsoleConfig.config.displayColumns = {} ocdConsoleConfig.config.displayColumns[selected] = newDisplayColumns setDisplayColumns(newDisplayColumns) - // setOcdConsoleConfig(OcdConsoleConfig.clone(ocdConsoleConfig)) + setOcdConsoleConfig(OcdConsoleConfig.clone(ocdConsoleConfig)) } console.debug('OcdTabularHeader: Selected', selected, displayColumns) const sortHeaderClass = (name: string): string => { diff --git a/ocd/packages/react/src/facade/OcdDesignFacade.ts b/ocd/packages/react/src/facade/OcdDesignFacade.ts index d911484d..0e4b92db 100644 --- a/ocd/packages/react/src/facade/OcdDesignFacade.ts +++ b/ocd/packages/react/src/facade/OcdDesignFacade.ts @@ -21,9 +21,6 @@ export namespace OcdDesignFacade { export const discardConfirmation = (): Promise => { return window.ocdAPI ? window.ocdAPI.discardConfirmation() : OcdDesignerBrowserActions.discardConfirmation() } - export const exportTerraform = (design: OcdDesign, directory: string): Promise => { - return window.ocdAPI ? window.ocdAPI.exportTerraform(design, directory) : Promise.reject(new Error('Currently Not Implemented')) - } export const loadLibraryIndex = (): Promise => { return window.ocdAPI ? window.ocdAPI.loadLibraryIndex() : Promise.reject(new Error('Currently Not Implemented')) } @@ -33,4 +30,16 @@ export namespace OcdDesignFacade { export const loadSvgCssFiles = (): Promise => { return window.ocdAPI ? window.ocdAPI.loadSvgCssFiles() : Promise.reject(new Error('Currently Not Implemented')) } + export const exportTerraform = (design: OcdDesign, directory: string): Promise => { + return window.ocdAPI ? window.ocdAPI.exportTerraform(design, directory) : Promise.reject(new Error('Currently Not Implemented')) + } + export const exportToExcel = (design: OcdDesign, suggestedFilename: string = ''): Promise => { + return window.ocdAPI ? window.ocdAPI.exportToExcel(design, suggestedFilename) : Promise.reject(new Error('Currently Not Implemented')) + } + export const exportToMarkdown = (design: OcdDesign, css: string[], suggestedFilename: string = ''): Promise => { + return window.ocdAPI ? window.ocdAPI.exportToMarkdown(design, css, suggestedFilename) : Promise.reject(new Error('Currently Not Implemented')) + } + export const exportToTerraform = (design: OcdDesign, directory: string): Promise => { + return window.ocdAPI ? window.ocdAPI.exportToTerraform(design, directory) : Promise.reject(new Error('Currently Not Implemented')) + } } diff --git a/ocd/packages/react/src/facade/OcdElectronAPI.ts b/ocd/packages/react/src/facade/OcdElectronAPI.ts index cc53ea7f..0d5e9b49 100644 --- a/ocd/packages/react/src/facade/OcdElectronAPI.ts +++ b/ocd/packages/react/src/facade/OcdElectronAPI.ts @@ -26,10 +26,13 @@ export interface OcdElectronAPI { loadDesign: (filename: string) => Promise saveDesign: (design: OcdDesign | string, filename: string, suggestedFilename: string | undefined) => Promise discardConfirmation: () => Promise - exportTerraform: (design: OcdDesign | string, directory: string) => Promise loadLibraryIndex: () => Promise loadLibraryDesign: (section: string, filename: string) => Promise loadSvgCssFiles: () => Promise + exportTerraform: (design: OcdDesign | string, directory: string) => Promise + exportToExcel: (design: OcdDesign | string, suggestedFilename: string) => Promise + exportToMarkdown: (design: OcdDesign | string, css: string[], suggestedFilename: string) => Promise + exportToTerraform: (design: OcdDesign | string, directory: string) => Promise // OCD Configuration loadConsoleConfig: () => Promise saveConsoleConfig: (config: OcdConsoleConfiguration) => Promise diff --git a/ocd/packages/react/src/pages/OcdConsole.tsx b/ocd/packages/react/src/pages/OcdConsole.tsx index fe59b5bd..5df49261 100644 --- a/ocd/packages/react/src/pages/OcdConsole.tsx +++ b/ocd/packages/react/src/pages/OcdConsole.tsx @@ -10,9 +10,9 @@ import OcdConsoleMenuBar from '../components/OcdConsoleMenuBar' import { OcdConsoleConfig } from '../components/OcdConsoleConfiguration' import { ConsoleHeaderProps, ConsolePageProps, ConsoleToolbarProps, OcdSelectedResource } from '../types/Console' import OcdBom from './OcdBom' -import OcdMarkdown from './OcdMarkdown' -import OcdTabular from './OcdTabular' -import OcdTerraform from './OcdTerraform' +import OcdMarkdown, { OcdMarkdownLeftToolbar } from './OcdMarkdown' +import OcdTabular, { OcdTabularLeftToolbar } from './OcdTabular' +import OcdTerraform, { OcdTerraformLeftToolbar } from './OcdTerraform' import OcdVariables from './OcdVariables' import OcdLibrary from './OcdLibrary' import { OcdQueryDialog } from '../components/dialogs/OcdQueryDialog' @@ -203,7 +203,24 @@ const OcdConsoleToolbar = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument, const onEstimateClick = () => { console.info('Estimate Clicked') } - const hideZoomClassName = ocdConsoleConfig.config.displayPage === 'designer' ? '' : 'hidden' + let PageLeftToolbar = OcdEmptyLeftRightToolbar + let PageRightToolbar = OcdEmptyLeftRightToolbar + switch (ocdConsoleConfig.config.displayPage) { + case 'designer': + PageLeftToolbar = OcdDesignerLeftToolbar + PageRightToolbar = OcdDesignerRightToolbar + break; + case 'markdown': + PageLeftToolbar = OcdMarkdownLeftToolbar + break; + case 'tabular': + PageLeftToolbar = OcdTabularLeftToolbar + break; + case 'terraform': + PageLeftToolbar = OcdTerraformLeftToolbar + break; + } + // const hideZoomClassName = ocdConsoleConfig.config.displayPage === 'designer' ? '' : 'hidden' const validationResults = OcdValidator.validate(ocdDocument.design) const hasErrors = validationResults.filter((v: OcdValidationResult) => v.type === 'error').length > 0 const hasWarnings = validationResults.filter((v: OcdValidationResult) => v.type === 'warning').length > 0 @@ -218,12 +235,18 @@ const OcdConsoleToolbar = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument, ocdConsoleConfig={ocdConsoleConfig} setOcdConsoleConfig={(ocdConsoleConfig: OcdConsoleConfig) => setOcdConsoleConfig(ocdConsoleConfig)} /> - {!hideZoomClassName && setOcdConsoleConfig(ocdConsoleConfig)} ocdDocument={ocdDocument} setOcdDocument={(ocdDocument:OcdDocument) => setOcdDocument(ocdDocument)} - />} + /> + {/* {!hideZoomClassName && setOcdConsoleConfig(ocdConsoleConfig)} + ocdDocument={ocdDocument} + setOcdDocument={(ocdDocument:OcdDocument) => setOcdDocument(ocdDocument)} + />} */}
    @@ -232,12 +255,18 @@ const OcdConsoleToolbar = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument,
    - {!hideZoomClassName && setOcdConsoleConfig(ocdConsoleConfig)} + ocdDocument={ocdDocument} + setOcdDocument={(ocdDocument:OcdDocument) => setOcdDocument(ocdDocument)} + />} */} + setOcdConsoleConfig(ocdConsoleConfig)} ocdDocument={ocdDocument} setOcdDocument={(ocdDocument:OcdDocument) => setOcdDocument(ocdDocument)} - />} + />
    {/*
    */}
    @@ -246,23 +275,13 @@ const OcdConsoleToolbar = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument, ) } +const OcdEmptyLeftRightToolbar = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument, setOcdDocument}: ConsolePageProps): JSX.Element => {return (<>)} + const OcdConsoleBody = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument, setOcdDocument }: ConsolePageProps): JSX.Element => { const showQueryDialog = ocdDocument.query const showReferenceDataQueryDialog = ocdConsoleConfig.queryReferenceData const showExportToResourceManagerDialog = ocdDocument.dialog.resourceManager console.debug('OcdConsoleBody: Dialogs: Query', showQueryDialog, 'ReferenceData', showReferenceDataQueryDialog, 'Resource Manager', showExportToResourceManagerDialog) - // const DisplayPage = ocdConsoleConfig.config.displayPage === 'bom' ? OcdBom : - // ocdConsoleConfig.config.displayPage === 'designer' ? OcdDesigner : - // ocdConsoleConfig.config.displayPage === 'documentation' ? OcdDocumentation : - // ocdConsoleConfig.config.displayPage === 'markdown' ? OcdMarkdown : - // ocdConsoleConfig.config.displayPage === 'tabular' ? OcdTabular : - // ocdConsoleConfig.config.displayPage === 'tags' ? OcdCommonTags : - // ocdConsoleConfig.config.displayPage === 'terraform' ? OcdTerraform : - // ocdConsoleConfig.config.displayPage === 'variables' ? OcdVariables : - // ocdConsoleConfig.config.displayPage === 'validation' ? OcdValidation : - // ocdConsoleConfig.config.displayPage === 'help' ? OcdHelp : - // ocdConsoleConfig.config.displayPage === 'library' ? OcdLibrary : - // OcdDesigner let DisplayPage = OcdDesigner switch (ocdConsoleConfig.config.displayPage) { case 'bom': diff --git a/ocd/packages/react/src/pages/OcdMarkdown.tsx b/ocd/packages/react/src/pages/OcdMarkdown.tsx index 13b4e464..16e0ed19 100644 --- a/ocd/packages/react/src/pages/OcdMarkdown.tsx +++ b/ocd/packages/react/src/pages/OcdMarkdown.tsx @@ -8,6 +8,11 @@ import { ConsolePageProps } from "../types/Console" import Markdown from 'react-markdown' import rehypeRaw from 'rehype-raw' import remarkGfm from 'remark-gfm' +import { OcdDesignFacade } from "../facade/OcdDesignFacade" +import { svgCssData } from '../data/OcdSvgCssData' + +const svgThemeCss = svgCssData['oci-theme.css'] +const svgSvgCss = svgCssData['ocd-svg.css'] const OcdMarkdown = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument, setOcdDocument}: ConsolePageProps): JSX.Element => { const markdownExporter = new OcdMarkdownExporter([]) @@ -19,4 +24,29 @@ const OcdMarkdown = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument, setOc ) } +export const OcdMarkdownLeftToolbar = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument, setOcdDocument}: ConsolePageProps): JSX.Element => { + // const {ocdConsoleConfig, setOcdConsoleConfig} = useContext(ConsoleConfigContext) + const onClickMarkdown = () => { + console.debug('OcdMarkdown: Export to Markdown') + const design = ocdDocument.design + OcdDesignFacade.exportToMarkdown(design, [svgThemeCss, svgSvgCss], `design.md`).then((results) => { + console.debug('Exported to Markdown') + }).catch((error) => { + console.warn('Export To Markdown Failed with', error) + alert(error) + }) + } + return ( +
    +
    +
    + ) +} + +export const OcdTerraformRightToolbar = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument, setOcdDocument}: ConsolePageProps): JSX.Element => { + return ( +
    + ) +} + export default OcdMarkdown \ No newline at end of file diff --git a/ocd/packages/react/src/pages/OcdTabular.tsx b/ocd/packages/react/src/pages/OcdTabular.tsx index 805b37b6..6aceffad 100644 --- a/ocd/packages/react/src/pages/OcdTabular.tsx +++ b/ocd/packages/react/src/pages/OcdTabular.tsx @@ -6,9 +6,9 @@ import { useState } from "react" import { ConsolePageProps } from "../types/Console" import { OcdUtils } from "@ocd/core" -import { OciResource } from "@ocd/model" import { OciDefault } from "../components/tabular/provider/oci/OciTabularContents" import * as ociTabularResources from '../components/tabular/provider/oci/resources' +import { OcdDesignFacade } from "../facade/OcdDesignFacade" const OcdTabular = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument, setOcdDocument}: ConsolePageProps): JSX.Element => { const [selected, setSelected] = useState('compartment') @@ -46,4 +46,38 @@ const OcdTabular = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument, setOcd ) } +export interface ExcelResource { + sheetName: string + resourceName: string + displayColumns: string[] +} + +export const OcdTabularLeftToolbar = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument, setOcdDocument}: ConsolePageProps): JSX.Element => { + // const {ocdConsoleConfig, setOcdConsoleConfig} = useContext(ConsoleConfigContext) + const onClickExcel = () => { + console.debug('OcdTabular: Export to Excel') + const design = ocdDocument.design + const displayColumns = ocdConsoleConfig.config.displayColumns || {} + console.debug('OcdTabular: Export to Excel - design', design) + console.debug('OcdTabular: Export to Excel - displayColumns', displayColumns) + OcdDesignFacade.exportToExcel(design, `design.xlsx`).then((results) => { + console.debug('Exported to Excel') + }).catch((error) => { + console.warn('Export To Excel Failed with', error) + alert(error) + }) + } + return ( +
    +
    +
    + ) +} + +export const OcdTabularRightToolbar = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument, setOcdDocument}: ConsolePageProps): JSX.Element => { + return ( +
    + ) +} + export default OcdTabular \ No newline at end of file diff --git a/ocd/packages/react/src/pages/OcdTerraform.tsx b/ocd/packages/react/src/pages/OcdTerraform.tsx index a52c429c..dfae1f76 100644 --- a/ocd/packages/react/src/pages/OcdTerraform.tsx +++ b/ocd/packages/react/src/pages/OcdTerraform.tsx @@ -6,6 +6,7 @@ import { useState } from "react" import { ConsolePageProps } from "../types/Console" import { OcdTerraformExporter } from "@ocd/export" +import { OcdDesignFacade } from "../facade/OcdDesignFacade" const OcdTerraform = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument, setOcdDocument}: ConsolePageProps): JSX.Element => { const [selected, setSelected] = useState('oci_provider.tf') @@ -32,4 +33,29 @@ const OcdTerraform = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument, setO ) } +export const OcdTerraformLeftToolbar = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument, setOcdDocument}: ConsolePageProps): JSX.Element => { + // const {ocdConsoleConfig, setOcdConsoleConfig} = useContext(ConsoleConfigContext) + const onClickTerraform = () => { + console.debug('OcdTerraform: Export to OpenTofu (Terraform)') + const design = ocdDocument.design + OcdDesignFacade.exportToTerraform(design, `design.xlsx`).then((results) => { + console.debug('Exported to Terraform') + }).catch((error) => { + console.warn('Export To Terraform Failed with', error) + alert(error) + }) + } + return ( +
    +
    +
    + ) +} + +export const OcdTerraformRightToolbar = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument, setOcdDocument}: ConsolePageProps): JSX.Element => { + return ( +
    + ) +} + export default OcdTerraform \ No newline at end of file From 011976147ae96b205d0c7421b7c45c0d5bd20339 Mon Sep 17 00:00:00 2001 From: Andrew Hopkinson <64254061+toxophilist@users.noreply.github.com> Date: Thu, 30 Jan 2025 17:39:03 +0000 Subject: [PATCH 6/8] chore(SonarCloud): Implement recommendations --- ocd/packages/desktop/src/main.ts | 8 ++++---- ocd/packages/react/src/components/Menu.ts | 4 ++-- ocd/packages/react/src/pages/OcdConsole.tsx | 12 ------------ 3 files changed, 6 insertions(+), 18 deletions(-) diff --git a/ocd/packages/desktop/src/main.ts b/ocd/packages/desktop/src/main.ts index 0c699b3d..3e494095 100644 --- a/ocd/packages/desktop/src/main.ts +++ b/ocd/packages/desktop/src/main.ts @@ -429,7 +429,7 @@ async function handleLoadDesign(event: any, filename: string) { } async function handleSaveDesign(event: any, design: OcdDesign, filename: string, suggestedFilename='') { - design = typeof design === 'string' ? JSON.parse(design) : design + // design = typeof design === 'string' ? JSON.parse(design) : design console.debug('Electron Main: handleSaveDesign', filename, JSON.stringify(design, null, 2)) return new Promise((resolve, reject) => { try { @@ -542,7 +542,7 @@ async function handleExportToExcel(event: any, design: OcdDesign, suggestedFilen } }).catch(err => { console.error(err) - reject(err) + reject(new Error(err)) }) // } catch (err) { // reject(err) @@ -552,7 +552,7 @@ async function handleExportToExcel(event: any, design: OcdDesign, suggestedFilen } async function handleExportToMarkdown(event: any, design: OcdDesign, css: string[]=[], suggestedFilename='') { - design = typeof design === 'string' ? JSON.parse(design) : design + // design = typeof design === 'string' ? JSON.parse(design) : design console.debug('Electron Main: handleExportToMarkdown') return new Promise((resolve, reject) => { dialog.showSaveDialog(mainWindow, { @@ -575,7 +575,7 @@ async function handleExportToMarkdown(event: any, design: OcdDesign, css: string } async function handleExportToTerraform(event: any, design: OcdDesign, directory: string) { - design = typeof design === 'string' ? JSON.parse(design) : design + // design = typeof design === 'string' ? JSON.parse(design) : design console.debug('Electron Main: handleExportTerraform') return new Promise((resolve, reject) => { dialog.showOpenDialog(mainWindow, { diff --git a/ocd/packages/react/src/components/Menu.ts b/ocd/packages/react/src/components/Menu.ts index cedbfd0f..9f1c1b57 100644 --- a/ocd/packages/react/src/components/Menu.ts +++ b/ocd/packages/react/src/components/Menu.ts @@ -192,7 +192,7 @@ export const menuItems: MenuItem[] = [ submenu: [ { label: 'Markdown', - click: (ocdDocument: OcdDocument, setOcdDocument: Function) => { // TODO: Convert to call to Electron API + click: (ocdDocument: OcdDocument, setOcdDocument: Function) => { // Convert to call to Electron API const saveFile = async (ocdDocument: OcdDocument) => { try { const options = { @@ -222,7 +222,7 @@ export const menuItems: MenuItem[] = [ }, { label: 'OpenTofu (Terraform)', - click: (ocdDocument: OcdDocument, setOcdDocument: Function) => { // TODO: Convert to call to Electron API + click: (ocdDocument: OcdDocument, setOcdDocument: Function) => { // Convert to call to Electron API const writeTerraformFile = async (dirHandle: FileSystemDirectoryHandle, filename: string, contents: string[]) => { const fileHandle: FileSystemFileHandle = await dirHandle.getFileHandle(filename, {create: true}) // @ts-ignore diff --git a/ocd/packages/react/src/pages/OcdConsole.tsx b/ocd/packages/react/src/pages/OcdConsole.tsx index 5df49261..8ae21472 100644 --- a/ocd/packages/react/src/pages/OcdConsole.tsx +++ b/ocd/packages/react/src/pages/OcdConsole.tsx @@ -241,12 +241,6 @@ const OcdConsoleToolbar = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument, ocdDocument={ocdDocument} setOcdDocument={(ocdDocument:OcdDocument) => setOcdDocument(ocdDocument)} /> - {/* {!hideZoomClassName && setOcdConsoleConfig(ocdConsoleConfig)} - ocdDocument={ocdDocument} - setOcdDocument={(ocdDocument:OcdDocument) => setOcdDocument(ocdDocument)} - />} */}
    @@ -255,12 +249,6 @@ const OcdConsoleToolbar = ({ ocdConsoleConfig, setOcdConsoleConfig, ocdDocument,
    - {/* {!hideZoomClassName && setOcdConsoleConfig(ocdConsoleConfig)} - ocdDocument={ocdDocument} - setOcdDocument={(ocdDocument:OcdDocument) => setOcdDocument(ocdDocument)} - />} */} setOcdConsoleConfig(ocdConsoleConfig)} From 2860031b986d7f26e8564800baa674f28298bbab Mon Sep 17 00:00:00 2001 From: Andrew Hopkinson <64254061+toxophilist@users.noreply.github.com> Date: Thu, 30 Jan 2025 17:52:25 +0000 Subject: [PATCH 7/8] chore(SonarCloud): Implement recommendations --- ocd/packages/desktop/src/main.ts | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/ocd/packages/desktop/src/main.ts b/ocd/packages/desktop/src/main.ts index 3e494095..f1c925be 100644 --- a/ocd/packages/desktop/src/main.ts +++ b/ocd/packages/desktop/src/main.ts @@ -473,17 +473,13 @@ async function handleDiscardConfirmation(event: any) { } async function handleExportTerraform(event: any, design: OcdDesign, directory: string) { - design = typeof design === 'string' ? JSON.parse(design) : design console.debug('Electron Main: handleExportTerraform') return Promise.reject(new Error('Currently Not Implemented')) } async function handleExportToExcel(event: any, design: OcdDesign, suggestedFilename='') { - // design = typeof design === 'string' ? JSON.parse(design) : design console.debug('Electron Main: handleExportToExcel') - // return new Promise((resolve, reject) => {reject('Currently Not Implemented')}) return new Promise((resolve, reject) => { - // try { dialog.showSaveDialog(mainWindow, { defaultPath: suggestedFilename, properties: ['createDirectory'], @@ -544,15 +540,10 @@ async function handleExportToExcel(event: any, design: OcdDesign, suggestedFilen console.error(err) reject(new Error(err)) }) - // } catch (err) { - // reject(err) - // } }) - // return Promise.reject(new Error('Currently Not Implemented')) } async function handleExportToMarkdown(event: any, design: OcdDesign, css: string[]=[], suggestedFilename='') { - // design = typeof design === 'string' ? JSON.parse(design) : design console.debug('Electron Main: handleExportToMarkdown') return new Promise((resolve, reject) => { dialog.showSaveDialog(mainWindow, { @@ -575,7 +566,6 @@ async function handleExportToMarkdown(event: any, design: OcdDesign, css: string } async function handleExportToTerraform(event: any, design: OcdDesign, directory: string) { - // design = typeof design === 'string' ? JSON.parse(design) : design console.debug('Electron Main: handleExportTerraform') return new Promise((resolve, reject) => { dialog.showOpenDialog(mainWindow, { @@ -596,7 +586,6 @@ async function handleExportToTerraform(event: any, design: OcdDesign, directory: reject(new Error(err)) }) }) - return Promise.reject(new Error('Currently Not Implemented')) } // Library / Reference Architecture Functions From 1225872c7694845b608547c4a23191ea88772d28 Mon Sep 17 00:00:00 2001 From: Andrew Hopkinson <64254061+toxophilist@users.noreply.github.com> Date: Thu, 30 Jan 2025 18:27:46 +0000 Subject: [PATCH 8/8] chore(SonarCloud): reduce funtion nesting --- ocd/packages/desktop/src/main.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/ocd/packages/desktop/src/main.ts b/ocd/packages/desktop/src/main.ts index f1c925be..57d6f7d0 100644 --- a/ocd/packages/desktop/src/main.ts +++ b/ocd/packages/desktop/src/main.ts @@ -15,6 +15,7 @@ import { OcdDesign, OcdResource } from '@ocd/model' import { OcdCache, OcdConsoleConfiguration } from '@ocd/react' import { OcdUtils } from '@ocd/core' import { OcdMarkdownExporter, OcdTerraformExporter } from '@ocd/export' +import { OciModelResources } from '@ocd/model' app.commandLine.appendSwitch('ignore-certificate-errors') // Temporary work around for not being able to add additional certificates process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0' // Temporary work around for not being able to add additional certificates @@ -477,6 +478,10 @@ async function handleExportTerraform(event: any, design: OcdDesign, directory: s return Promise.reject(new Error('Currently Not Implemented')) } +const compartmentName = (id: string, compartments: OciModelResources.OciCompartment[]): string | undefined => compartments.find((c) => c.id === id)?.displayName +const updateResources = (resources: OcdResource[], compartments: OciModelResources.OciCompartment[]): OcdResource[] => resources.map((r: OcdResource) => {return {...r, compartmentName: compartmentName(r.compartmentId, compartments)}}) +// @ts-ignore +const toTableRows = (resources: OcdResource[]): any[][] => resources.reduce((a, c) => {return [...a, [c.displayName, c.compartmentName]]}, []) async function handleExportToExcel(event: any, design: OcdDesign, suggestedFilename='') { console.debug('Electron Main: handleExportToExcel') return new Promise((resolve, reject) => { @@ -489,12 +494,13 @@ async function handleExportToExcel(event: any, design: OcdDesign, suggestedFilen if (!result.canceled) { const ociResources = design.model.oci.resources const compartments = ociResources.compartment - const compartmentName = (id: string): string => compartments.find((c) => c.id === id)?.displayName + // const compartmentName = (id: string): string => compartments.find((c) => c.id === id)?.displayName const workbook = new ExcelJS.Workbook() let styleNumber = 1 Object.entries(ociResources).forEach(([k, v]) => { const worksheet = workbook.addWorksheet(OcdUtils.toTitle(k)) - const resources = v.map((r: OcdResource) => {return {...r, compartmentName: compartmentName(r.compartmentId)}}) + // const resources = v.map((r: OcdResource) => {return {...r, compartmentName: compartmentName(r.compartmentId, compartments)}}) + const resources = updateResources(v, compartments) console.debug('handleExportToExcel:', JSON.stringify(resources, null, 2)) const columns = [ {header: 'Name', key: 'displayName', width: 20}, @@ -507,7 +513,8 @@ async function handleExportToExcel(event: any, design: OcdDesign, suggestedFilen {name: 'Compartment', filterButton: true} ] // @ts-ignore - const tableRows: any[][] = resources.reduce((a, c) => {return [...a, [c.displayName, c.compartmentName]]}, []) + // const tableRows: any[][] = resources.reduce((a, c) => {return [...a, [c.displayName, c.compartmentName]]}, []) + const tableRows = toTableRows(resources) console.debug('handleExportToExcel: Table:', JSON.stringify(tableRows, null, 2)) const table: TableProperties = { name: `${k}Table`,