Compare commits
3 Commits
chore/rena
...
feature/st
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
41711c3934 | ||
|
|
5d8b2d5bba | ||
|
|
851dbc98d3 |
64
package-lock.json
generated
@@ -2849,9 +2849,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@electron/remote": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@electron/remote/-/remote-2.1.2.tgz",
|
||||
"integrity": "sha512-EPwNx+nhdrTBxyCqXt/pftoQg/ybtWDW3DUWHafejvnB1ZGGfMpv6e15D8KeempocjXe78T7WreyGGb3mlZxdA==",
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@electron/remote/-/remote-2.1.1.tgz",
|
||||
"integrity": "sha512-Lfxul2yBxL+FBVaKszNAkuUqSIDbUQ1I7BC394iRXyqA2XGz7im2bAxroNIM51jhySSPKUaOLHaFLxfV6pC9VQ==",
|
||||
"peerDependencies": {
|
||||
"electron": ">= 13.0.0"
|
||||
}
|
||||
@@ -25220,13 +25220,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/electron": {
|
||||
"version": "31.1.0",
|
||||
"resolved": "https://registry.npmjs.org/electron/-/electron-31.1.0.tgz",
|
||||
"integrity": "sha512-TBOwqLxSxnx6+pH6GMri7R3JPH2AkuGJHfWZS0p1HsmN+Qr1T9b0IRJnnehSd/3NZAmAre4ft9Ljec7zjyKFJA==",
|
||||
"version": "28.1.4",
|
||||
"resolved": "https://registry.npmjs.org/electron/-/electron-28.1.4.tgz",
|
||||
"integrity": "sha512-WE6go611KOhtH6efRPMnVC7FE7DCKnQ3ZyHFeI1DbaCy8OU4UjZ8/CZGcuZmZgRdxSBEHoHdgaJkWRHZzF0FOg==",
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"@electron/get": "^2.0.0",
|
||||
"@types/node": "^20.9.0",
|
||||
"@types/node": "^18.11.18",
|
||||
"extract-zip": "^2.0.1"
|
||||
},
|
||||
"bin": {
|
||||
@@ -25452,14 +25452,6 @@
|
||||
"tiny-typed-emitter": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/electron/node_modules/@types/node": {
|
||||
"version": "20.14.10",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz",
|
||||
"integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==",
|
||||
"dependencies": {
|
||||
"undici-types": "~5.26.4"
|
||||
}
|
||||
},
|
||||
"node_modules/elliptic": {
|
||||
"version": "6.5.4",
|
||||
"dev": true,
|
||||
@@ -43199,11 +43191,6 @@
|
||||
"version": "1.13.6",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/undici-types": {
|
||||
"version": "5.26.5",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
|
||||
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
|
||||
},
|
||||
"node_modules/unfetch": {
|
||||
"version": "4.2.0",
|
||||
"dev": true,
|
||||
@@ -48982,7 +48969,7 @@
|
||||
"packages/noodl-editor": {
|
||||
"version": "1.0.0",
|
||||
"dependencies": {
|
||||
"@electron/remote": "^2.1.2",
|
||||
"@electron/remote": "^2.1.1",
|
||||
"@jaames/iro": "^5.5.2",
|
||||
"@microsoft/fetch-event-source": "^2.0.1",
|
||||
"@noodl/git": "file:../noodl-git",
|
||||
@@ -49038,7 +49025,7 @@
|
||||
"babel-loader": "^8.2.4",
|
||||
"concurrently": "^7.4.0",
|
||||
"css-loader": "^6.7.1",
|
||||
"electron": "^31.1.0",
|
||||
"electron": "28.1.4",
|
||||
"electron-builder": "^24.9.1",
|
||||
"file-loader": "^6.2.0",
|
||||
"html-loader": "^3.1.0",
|
||||
@@ -53388,9 +53375,9 @@
|
||||
}
|
||||
},
|
||||
"@electron/remote": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@electron/remote/-/remote-2.1.2.tgz",
|
||||
"integrity": "sha512-EPwNx+nhdrTBxyCqXt/pftoQg/ybtWDW3DUWHafejvnB1ZGGfMpv6e15D8KeempocjXe78T7WreyGGb3mlZxdA==",
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@electron/remote/-/remote-2.1.1.tgz",
|
||||
"integrity": "sha512-Lfxul2yBxL+FBVaKszNAkuUqSIDbUQ1I7BC394iRXyqA2XGz7im2bAxroNIM51jhySSPKUaOLHaFLxfV6pC9VQ==",
|
||||
"requires": {}
|
||||
},
|
||||
"@electron/universal": {
|
||||
@@ -74070,23 +74057,13 @@
|
||||
}
|
||||
},
|
||||
"electron": {
|
||||
"version": "31.1.0",
|
||||
"resolved": "https://registry.npmjs.org/electron/-/electron-31.1.0.tgz",
|
||||
"integrity": "sha512-TBOwqLxSxnx6+pH6GMri7R3JPH2AkuGJHfWZS0p1HsmN+Qr1T9b0IRJnnehSd/3NZAmAre4ft9Ljec7zjyKFJA==",
|
||||
"version": "28.1.4",
|
||||
"resolved": "https://registry.npmjs.org/electron/-/electron-28.1.4.tgz",
|
||||
"integrity": "sha512-WE6go611KOhtH6efRPMnVC7FE7DCKnQ3ZyHFeI1DbaCy8OU4UjZ8/CZGcuZmZgRdxSBEHoHdgaJkWRHZzF0FOg==",
|
||||
"requires": {
|
||||
"@electron/get": "^2.0.0",
|
||||
"@types/node": "^20.9.0",
|
||||
"@types/node": "^18.11.18",
|
||||
"extract-zip": "^2.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/node": {
|
||||
"version": "20.14.10",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz",
|
||||
"integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==",
|
||||
"requires": {
|
||||
"undici-types": "~5.26.4"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"electron-builder": {
|
||||
@@ -81011,7 +80988,7 @@
|
||||
"requires": {
|
||||
"@babel/core": "^7.19.1",
|
||||
"@babel/preset-react": "^7.18.6",
|
||||
"@electron/remote": "^2.1.2",
|
||||
"@electron/remote": "^2.1.1",
|
||||
"@jaames/iro": "^5.5.2",
|
||||
"@microsoft/fetch-event-source": "^2.0.1",
|
||||
"@noodl/git": "file:../noodl-git",
|
||||
@@ -81040,7 +81017,7 @@
|
||||
"css-loader": "^6.7.1",
|
||||
"diff3": "0.0.4",
|
||||
"dmg-license": "^1.0.11",
|
||||
"electron": "^31.1.0",
|
||||
"electron": "28.1.4",
|
||||
"electron-builder": "^24.9.1",
|
||||
"electron-store": "^8.1.0",
|
||||
"electron-updater": "^6.1.7",
|
||||
@@ -86426,11 +86403,6 @@
|
||||
"underscore": {
|
||||
"version": "1.13.6"
|
||||
},
|
||||
"undici-types": {
|
||||
"version": "5.26.5",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
|
||||
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
|
||||
},
|
||||
"unfetch": {
|
||||
"version": "4.2.0",
|
||||
"dev": true
|
||||
|
||||
@@ -1,128 +1,123 @@
|
||||
.Root {
|
||||
border: none;
|
||||
padding: 0;
|
||||
background: transparent;
|
||||
box-sizing: border-box;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
|
||||
&.is-hidden {
|
||||
visibility: hidden;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
&.has-backdrop {
|
||||
background-color: var(--theme-color-bg-1-transparent);
|
||||
}
|
||||
|
||||
&.is-locking-scroll {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
&:not(.has-backdrop):not(.is-locking-scroll) {
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
||||
.VisibleDialog {
|
||||
filter: drop-shadow(0 4px 15px var(--theme-color-bg-1-transparent-2));
|
||||
box-shadow: 0 0 10px -5px var(--theme-color-bg-1-transparent-2);
|
||||
position: absolute;
|
||||
width: var(--width);
|
||||
pointer-events: all;
|
||||
|
||||
.Root.is-centered & {
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
animation: enter-centered var(--speed-quick) var(--easing-base) both;
|
||||
}
|
||||
|
||||
.Root:not(.is-centered) &.is-visible {
|
||||
&.is-variant-default {
|
||||
animation: enter var(--speed-quick) var(--easing-base) both;
|
||||
}
|
||||
|
||||
&.is-variant-select {
|
||||
transform: translate(var(--offsetX), var(--offsetY));
|
||||
}
|
||||
}
|
||||
|
||||
&::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-color: var(--background);
|
||||
border-radius: 2px;
|
||||
overflow: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
.Arrow {
|
||||
position: absolute;
|
||||
width: 0;
|
||||
height: 0;
|
||||
top: var(--arrow-top);
|
||||
left: var(--arrow-left);
|
||||
pointer-events: none;
|
||||
|
||||
&::after {
|
||||
content: '';
|
||||
display: block;
|
||||
width: 11px;
|
||||
height: 11px;
|
||||
transform: translate(-50%, -50%) rotate(45deg);
|
||||
background: var(--background);
|
||||
}
|
||||
|
||||
&.is-contrast::after {
|
||||
background: var(--backgroundContrast);
|
||||
}
|
||||
}
|
||||
|
||||
.Title {
|
||||
background-color: var(--backgroundContrast);
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
.MeasuringContainer {
|
||||
pointer-events: none;
|
||||
height: 0;
|
||||
overflow: visible;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.ChildContainer {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
@keyframes enter {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translate(
|
||||
calc(var(--animationStartOffsetX) + var(--offsetX)),
|
||||
calc(var(--animationStartOffsetY) + var(--offsetY))
|
||||
);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translate(var(--offsetX), var(--offsetY));
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes enter-centered {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translate(-50%, calc(-50% + 16px));
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translate(-50%, -50%);
|
||||
}
|
||||
}
|
||||
.Root {
|
||||
border: none;
|
||||
padding: 0;
|
||||
background: transparent;
|
||||
box-sizing: border-box;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
|
||||
&.has-backdrop {
|
||||
background-color: var(--theme-color-bg-1-transparent);
|
||||
}
|
||||
|
||||
&.is-locking-scroll {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
&:not(.has-backdrop):not(.is-locking-scroll) {
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
||||
.VisibleDialog {
|
||||
filter: drop-shadow(0 4px 15px var(--theme-color-bg-1-transparent-2));
|
||||
box-shadow: 0 0 10px -5px var(--theme-color-bg-1-transparent-2);
|
||||
position: absolute;
|
||||
width: var(--width);
|
||||
pointer-events: all;
|
||||
|
||||
.Root.is-centered & {
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
animation: enter-centered var(--speed-quick) var(--easing-base) both;
|
||||
}
|
||||
|
||||
.Root:not(.is-centered) &.is-visible {
|
||||
&.is-variant-default {
|
||||
animation: enter var(--speed-quick) var(--easing-base) both;
|
||||
}
|
||||
|
||||
&.is-variant-select {
|
||||
transform: translate(var(--offsetX), var(--offsetY));
|
||||
}
|
||||
}
|
||||
|
||||
&::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-color: var(--background);
|
||||
border-radius: 2px;
|
||||
overflow: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
.Arrow {
|
||||
position: absolute;
|
||||
width: 0;
|
||||
height: 0;
|
||||
top: var(--arrow-top);
|
||||
left: var(--arrow-left);
|
||||
pointer-events: none;
|
||||
|
||||
&::after {
|
||||
content: '';
|
||||
display: block;
|
||||
width: 11px;
|
||||
height: 11px;
|
||||
transform: translate(-50%, -50%) rotate(45deg);
|
||||
background: var(--background);
|
||||
}
|
||||
|
||||
&.is-contrast::after {
|
||||
background: var(--backgroundContrast);
|
||||
}
|
||||
}
|
||||
|
||||
.Title {
|
||||
background-color: var(--backgroundContrast);
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
.MeasuringContainer {
|
||||
pointer-events: none;
|
||||
height: 0;
|
||||
overflow: visible;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.ChildContainer {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
@keyframes enter {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translate(
|
||||
calc(var(--animationStartOffsetX) + var(--offsetX)),
|
||||
calc(var(--animationStartOffsetY) + var(--offsetY))
|
||||
);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translate(var(--offsetX), var(--offsetY));
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes enter-centered {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translate(-50%, calc(-50% + 16px));
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translate(-50%, -50%);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,7 +42,6 @@ export interface BaseDialogProps extends UnsafeStyleProps {
|
||||
isVisible?: boolean;
|
||||
hasBackdrop?: boolean;
|
||||
hasArrow?: boolean;
|
||||
alwaysMounted?: boolean;
|
||||
|
||||
children?: Slot;
|
||||
|
||||
@@ -70,7 +69,6 @@ export function CoreBaseDialog({
|
||||
isVisible,
|
||||
hasBackdrop,
|
||||
hasArrow,
|
||||
alwaysMounted,
|
||||
|
||||
children,
|
||||
|
||||
@@ -263,7 +261,7 @@ export function CoreBaseDialog({
|
||||
}
|
||||
}, [background]);
|
||||
|
||||
if (!isVisible && !alwaysMounted) return null;
|
||||
if (!isVisible) return null;
|
||||
|
||||
return (
|
||||
<div
|
||||
@@ -272,7 +270,6 @@ export function CoreBaseDialog({
|
||||
hasBackdrop && css['has-backdrop'],
|
||||
isLockingScroll && css['is-locking-scroll'],
|
||||
typeof triggerRef === 'undefined' && css['is-centered'],
|
||||
!isVisible && css['is-hidden'],
|
||||
css[variant]
|
||||
)}
|
||||
onClick={onClose}
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"@electron/remote": "^2.1.2",
|
||||
"@electron/remote": "^2.1.1",
|
||||
"@jaames/iro": "^5.5.2",
|
||||
"@microsoft/fetch-event-source": "^2.0.1",
|
||||
"@noodl/git": "file:../noodl-git",
|
||||
@@ -114,7 +114,7 @@
|
||||
"babel-loader": "^8.2.4",
|
||||
"concurrently": "^7.4.0",
|
||||
"css-loader": "^6.7.1",
|
||||
"electron": "^31.1.0",
|
||||
"electron": "28.1.4",
|
||||
"electron-builder": "^24.9.1",
|
||||
"file-loader": "^6.2.0",
|
||||
"html-loader": "^3.1.0",
|
||||
|
||||
BIN
packages/noodl-editor/src/assets/images/getting-started-docs.png
Normal file
|
After Width: | Height: | Size: 125 KiB |
|
After Width: | Height: | Size: 94 KiB |
BIN
packages/noodl-editor/src/assets/images/ic_back.png
Normal file
|
After Width: | Height: | Size: 884 B |
BIN
packages/noodl-editor/src/assets/images/ic_logo.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
packages/noodl-editor/src/assets/images/import-icon.png
Normal file
|
After Width: | Height: | Size: 6.3 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM19 18H6c-2.21 0-4-1.79-4-4 0-2.05 1.53-3.76 3.56-3.97l1.07-.11.5-.95C8.08 7.14 9.94 6 12 6c2.62 0 4.88 1.86 5.39 4.43l.3 1.5 1.53.11c1.56.1 2.78 1.41 2.78 2.96 0 1.65-1.35 3-3 3zm-9-3.82l-2.09-2.09L6.5 13.5 10 17l6.01-6.01-1.41-1.41z"/></svg>
|
||||
|
After Width: | Height: | Size: 526 B |
BIN
packages/noodl-editor/src/assets/images/personal.png
Normal file
|
After Width: | Height: | Size: 540 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/></svg>
|
||||
|
After Width: | Height: | Size: 175 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="none"><path d="M0 0h24v24H0V0z"/><path opacity=".87" d="M0 0h24v24H0V0z"/></g><path d="M21 3.01H3c-1.1 0-2 .9-2 2V9h2V4.99h18v14.03H3V15H1v4.01c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98v-14c0-1.11-.9-2-2-2zM11 16l4-4-4-4v3H1v2h10v3zM23 3.01H1V9h2V4.99h18v14.03H3V15H1v5.99h22V3.01zM11 16l4-4-4-4v3H1v2h10v3z"/></svg>
|
||||
|
After Width: | Height: | Size: 408 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M4 6H2v16h16v-2H4V6zm18-4H6v16h16V2zm-3 9H9V9h10v2zm-4 4H9v-2h6v2zm4-8H9V5h10v2z"/></svg>
|
||||
|
After Width: | Height: | Size: 220 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="none"><path d="M0 0h24v24H0V0z"/><path opacity=".87" d="M0 0h24v24H0V0z"/></g><path d="M3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7zm-4 6h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7z"/></svg>
|
||||
|
After Width: | Height: | Size: 360 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M19.44 12.99l-.01.02c.04-.33.08-.67.08-1.01 0-.34-.03-.66-.07-.99l.01.02 2.44-1.92-2.43-4.22-2.87 1.16.01.01c-.52-.4-1.09-.74-1.71-1h.01L14.44 2H9.57l-.44 3.07h.01c-.62.26-1.19.6-1.71 1l.01-.01-2.88-1.17-2.44 4.22 2.44 1.92.01-.02c-.04.33-.07.65-.07.99 0 .34.03.68.08 1.01l-.01-.02-2.1 1.65-.33.26 2.43 4.2 2.88-1.15-.02-.04c.53.41 1.1.75 1.73 1.01h-.03L9.58 22h4.85s.03-.18.06-.42l.38-2.65h-.01c.62-.26 1.2-.6 1.73-1.01l-.02.04 2.88 1.15 2.43-4.2s-.14-.12-.33-.26l-2.11-1.66zM12 15.5c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z"/></svg>
|
||||
|
After Width: | Height: | Size: 701 B |
BIN
packages/noodl-editor/src/assets/images/start.png
Normal file
|
After Width: | Height: | Size: 522 KiB |
BIN
packages/noodl-editor/src/assets/images/workspace.png
Normal file
|
After Width: | Height: | Size: 522 KiB |
@@ -48,7 +48,7 @@ export async function execute(command: Command, event: MessageEvent) {
|
||||
|
||||
// Deploy to temp folder
|
||||
await compilation.deployToFolder(tempDir, {
|
||||
environment: command.cloudService ? new Environment(command.cloudService) : undefined
|
||||
environment: command.cloudService ? new Environment("", command.cloudService) : undefined
|
||||
});
|
||||
|
||||
// Upload to S3
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { Environment, ExternalCloudService } from '@noodl-models/CloudServices/ExternalCloudService';
|
||||
import {
|
||||
CloudServiceEvent,
|
||||
CloudServiceEvents,
|
||||
CreateEnvironment,
|
||||
CreateEnvironmentRequest,
|
||||
Environment,
|
||||
ICloudBackendService,
|
||||
ICloudService,
|
||||
UpdateEnvironmentRequest
|
||||
@@ -12,6 +12,9 @@ import { ProjectModel } from '@noodl-models/projectmodel';
|
||||
import { getCloudServices } from '@noodl-models/projectmodel.editor';
|
||||
import { Model } from '@noodl-utils/model';
|
||||
|
||||
import { GlobalCloudService } from './providers/GlobalCloudService';
|
||||
import { ProjectCloudService } from './providers/ProjectCloudService';
|
||||
|
||||
export type CloudQueueItem = {
|
||||
frontendId: string;
|
||||
environmentId: string;
|
||||
@@ -20,7 +23,9 @@ export type CloudQueueItem = {
|
||||
class CloudBackendService implements ICloudBackendService {
|
||||
private _isLoading = false;
|
||||
private _collection?: Environment[];
|
||||
private _localExternal = new ExternalCloudService();
|
||||
|
||||
private _globalProvider = new GlobalCloudService();
|
||||
private _projectProvider = new ProjectCloudService();
|
||||
|
||||
get isLoading(): boolean {
|
||||
return this._isLoading;
|
||||
@@ -32,12 +37,14 @@ class CloudBackendService implements ICloudBackendService {
|
||||
|
||||
constructor(private readonly service: CloudService) {}
|
||||
|
||||
async fetch(): Promise<Environment[]> {
|
||||
async fetch(project: ProjectModel): Promise<Environment[]> {
|
||||
this._isLoading = true;
|
||||
try {
|
||||
// Fetch environments from local machine
|
||||
const localEnvironments = await this._localExternal.list();
|
||||
this._collection = localEnvironments.map((x) => new Environment(x));
|
||||
const projectResults = await this._projectProvider.list(project);
|
||||
this._collection = projectResults.map((x) => new Environment("project", x));
|
||||
|
||||
const globalResults = await this._globalProvider.list(project);
|
||||
this._collection = this._collection.concat(globalResults.map((x) => new Environment("global", x)));
|
||||
} finally {
|
||||
this._isLoading = false;
|
||||
this.service.notifyListeners(CloudServiceEvent.BackendUpdated);
|
||||
@@ -48,7 +55,7 @@ class CloudBackendService implements ICloudBackendService {
|
||||
async fromProject(project: ProjectModel): Promise<Environment> {
|
||||
const activeCloudServices = getCloudServices(project);
|
||||
if (!this._collection) {
|
||||
await this.fetch();
|
||||
await this.fetch(project);
|
||||
}
|
||||
|
||||
return this.items.find((b) => {
|
||||
@@ -56,16 +63,16 @@ class CloudBackendService implements ICloudBackendService {
|
||||
});
|
||||
}
|
||||
|
||||
async create(options: CreateEnvironmentRequest): Promise<CreateEnvironment> {
|
||||
return await this._localExternal.create(options);
|
||||
async create(project: ProjectModel, options: CreateEnvironmentRequest): Promise<CreateEnvironment> {
|
||||
return await this._projectProvider.create(project, options);
|
||||
}
|
||||
|
||||
async update(options: UpdateEnvironmentRequest): Promise<boolean> {
|
||||
return await this._localExternal.update(options);
|
||||
async update(project: ProjectModel, options: UpdateEnvironmentRequest): Promise<boolean> {
|
||||
return await this._projectProvider.update(project, options);
|
||||
}
|
||||
|
||||
async delete(id: string): Promise<boolean> {
|
||||
return await this._localExternal.delete(id);
|
||||
async delete(project: ProjectModel, id: string): Promise<boolean> {
|
||||
return await this._projectProvider.delete(project, id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,15 +102,11 @@ export class CloudService extends Model<CloudServiceEvent, CloudServiceEvents> i
|
||||
*/
|
||||
public async prefetch() {
|
||||
this.reset();
|
||||
await this.fetch();
|
||||
}
|
||||
|
||||
public async fetch() {
|
||||
await this.backend.fetch();
|
||||
await this.backend.fetch(ProjectModel.instance);
|
||||
}
|
||||
|
||||
public async getActiveEnvironment(project: ProjectModel): Promise<Environment> {
|
||||
await this.backend.fetch();
|
||||
await this.backend.fetch(project);
|
||||
return this.backend.fromProject(project);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,2 @@
|
||||
export * from './CloudService';
|
||||
export * from './type';
|
||||
export * from './ExternalCloudService';
|
||||
|
||||
@@ -1,25 +1,21 @@
|
||||
import { JSONStorage } from '@noodl/platform';
|
||||
|
||||
import { CreateEnvironment, CreateEnvironmentRequest, UpdateEnvironmentRequest } from '@noodl-models/CloudServices';
|
||||
import {
|
||||
CreateEnvironment,
|
||||
CreateEnvironmentRequest,
|
||||
EnvironmentDataFormat,
|
||||
ICloudServiceProvider,
|
||||
UpdateEnvironmentRequest
|
||||
} from '@noodl-models/CloudServices';
|
||||
import { ProjectModel } from '@noodl-models/projectmodel';
|
||||
|
||||
/** The data format is separated from our internal model. */
|
||||
export type EnvironmentDataFormat = {
|
||||
enabled: boolean;
|
||||
id: string;
|
||||
name: string;
|
||||
description: string;
|
||||
masterKey: string;
|
||||
appId: string;
|
||||
endpoint: string;
|
||||
};
|
||||
|
||||
export class ExternalCloudService {
|
||||
async list(): Promise<EnvironmentDataFormat[]> {
|
||||
export class GlobalCloudService implements ICloudServiceProvider {
|
||||
async list(_project: ProjectModel): Promise<EnvironmentDataFormat[]> {
|
||||
const local = await JSONStorage.get('externalBrokers');
|
||||
return local.brokers || [];
|
||||
}
|
||||
|
||||
async create(options: CreateEnvironmentRequest): Promise<CreateEnvironment> {
|
||||
async create(_project: ProjectModel, options: CreateEnvironmentRequest): Promise<CreateEnvironment> {
|
||||
const id = `${options.url}-${options.appId}`;
|
||||
|
||||
const newBroker: EnvironmentDataFormat = {
|
||||
@@ -44,7 +40,7 @@ export class ExternalCloudService {
|
||||
};
|
||||
}
|
||||
|
||||
async update(options: UpdateEnvironmentRequest): Promise<boolean> {
|
||||
async update(_project: ProjectModel, options: UpdateEnvironmentRequest): Promise<boolean> {
|
||||
const local = await JSONStorage.get('externalBrokers');
|
||||
const brokers: EnvironmentDataFormat[] = local.brokers || [];
|
||||
|
||||
@@ -63,7 +59,7 @@ export class ExternalCloudService {
|
||||
return true;
|
||||
}
|
||||
|
||||
async delete(id: string): Promise<boolean> {
|
||||
async delete(_project: ProjectModel, id: string): Promise<boolean> {
|
||||
const local = await JSONStorage.get('externalBrokers');
|
||||
const brokers: EnvironmentDataFormat[] = local.brokers || [];
|
||||
|
||||
@@ -79,25 +75,3 @@ export class ExternalCloudService {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
export class Environment {
|
||||
id: string;
|
||||
name: string;
|
||||
description: string;
|
||||
createdAt: string;
|
||||
masterKeyUpdatedAt: string;
|
||||
masterKey: string;
|
||||
appId: string;
|
||||
url: string;
|
||||
|
||||
constructor(item: EnvironmentDataFormat) {
|
||||
this.id = item.id;
|
||||
this.name = item.name;
|
||||
this.description = item.description;
|
||||
this.createdAt = '';
|
||||
this.masterKeyUpdatedAt = '';
|
||||
this.masterKey = item.masterKey;
|
||||
this.appId = item.appId;
|
||||
this.url = item.endpoint;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
import { filesystem } from '@noodl/platform';
|
||||
|
||||
import {
|
||||
CreateEnvironment,
|
||||
CreateEnvironmentRequest,
|
||||
EnvironmentDataFormat,
|
||||
ICloudServiceProvider,
|
||||
UpdateEnvironmentRequest
|
||||
} from '@noodl-models/CloudServices';
|
||||
import { ProjectModel } from '@noodl-models/projectmodel';
|
||||
|
||||
/**
|
||||
* Store the Cloud Service relative to the project folder.
|
||||
*/
|
||||
export class ProjectCloudService implements ICloudServiceProvider {
|
||||
private async load(project: ProjectModel) {
|
||||
const dirpath = filesystem.resolve(project._retainedProjectDirectory, ".noodl");
|
||||
const filepath = filesystem.resolve(dirpath, "cloudservices.json");
|
||||
if (!filesystem.exists(filepath)) {
|
||||
return []
|
||||
}
|
||||
|
||||
// TODO: Validate file content
|
||||
return filesystem.readJson(filepath);
|
||||
}
|
||||
|
||||
private async save(project: ProjectModel, items: EnvironmentDataFormat[]) {
|
||||
const dirpath = filesystem.resolve(project._retainedProjectDirectory, ".noodl");
|
||||
const filepath = filesystem.resolve(dirpath, "cloudservices.json");
|
||||
if (!filesystem.exists(filepath)) {
|
||||
await filesystem.makeDirectory(dirpath);
|
||||
}
|
||||
|
||||
await filesystem.writeJson(filepath, items);
|
||||
}
|
||||
|
||||
async list(project: ProjectModel): Promise<EnvironmentDataFormat[]> {
|
||||
if (!project || !project._retainedProjectDirectory) {
|
||||
return []
|
||||
}
|
||||
|
||||
return await this.load(project);
|
||||
}
|
||||
|
||||
async create(project: ProjectModel, options: CreateEnvironmentRequest): Promise<CreateEnvironment> {
|
||||
const id = `${options.url}-${options.appId}`;
|
||||
|
||||
const newBroker: EnvironmentDataFormat = {
|
||||
enabled: true,
|
||||
id,
|
||||
name: options.name,
|
||||
description: options.description,
|
||||
masterKey: options.masterKey,
|
||||
appId: options.appId,
|
||||
endpoint: options.url
|
||||
};
|
||||
|
||||
const current = await this.load(project);
|
||||
await this.save(project, [...current, newBroker]);
|
||||
|
||||
return {
|
||||
id: newBroker.id,
|
||||
appId: newBroker.appId,
|
||||
url: newBroker.endpoint,
|
||||
masterKey: newBroker.masterKey
|
||||
};
|
||||
}
|
||||
|
||||
async update(project: ProjectModel, options: UpdateEnvironmentRequest): Promise<boolean> {
|
||||
const current = await this.load(project);
|
||||
|
||||
// Find and update
|
||||
const broker = current.find((x) => x.id === options.id);
|
||||
if (!broker) return false;
|
||||
|
||||
if (typeof options.name !== undefined) broker.name = options.name;
|
||||
if (typeof options.description !== undefined) broker.description = options.description;
|
||||
if (typeof options.appId !== undefined) broker.appId = options.appId;
|
||||
if (typeof options.masterKey !== undefined) broker.masterKey = options.masterKey;
|
||||
if (typeof options.url !== undefined) broker.endpoint = options.url;
|
||||
|
||||
await this.save(project, current);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
async delete(project: ProjectModel, id: string): Promise<boolean> {
|
||||
const current = await this.load(project);
|
||||
|
||||
// Find the environment
|
||||
const found = current.find((b) => b.id === id);
|
||||
if (found) {
|
||||
// Delete the environment
|
||||
current.splice(current.indexOf(found), 1);
|
||||
}
|
||||
|
||||
// Save the list
|
||||
await this.save(project, current);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,3 @@
|
||||
import { Environment } from '@noodl-models/CloudServices';
|
||||
import { ProjectModel } from '@noodl-models/projectmodel';
|
||||
import { IModel } from '@noodl-utils/model';
|
||||
|
||||
@@ -30,11 +29,11 @@ export interface ICloudBackendService {
|
||||
get isLoading(): boolean;
|
||||
get items(): Environment[];
|
||||
|
||||
fetch(): Promise<Environment[]>;
|
||||
fetch(project: ProjectModel): Promise<Environment[]>;
|
||||
fromProject(project: ProjectModel): Promise<Environment> | undefined;
|
||||
create(options: CreateEnvironmentRequest): Promise<CreateEnvironment>;
|
||||
update(options: UpdateEnvironmentRequest): Promise<boolean>;
|
||||
delete(id: string): Promise<boolean>;
|
||||
create(project: ProjectModel, options: CreateEnvironmentRequest): Promise<CreateEnvironment>;
|
||||
update(project: ProjectModel, options: UpdateEnvironmentRequest): Promise<boolean>;
|
||||
delete(project: ProjectModel, id: string): Promise<boolean>;
|
||||
}
|
||||
|
||||
export enum CloudServiceEvent {
|
||||
@@ -55,3 +54,54 @@ export interface ICloudService extends IModel<CloudServiceEvent, CloudServiceEve
|
||||
|
||||
get backend(): ICloudBackendService;
|
||||
}
|
||||
|
||||
/** The data format is separated from our internal model. */
|
||||
export type EnvironmentDataFormat = {
|
||||
enabled: boolean;
|
||||
id: string;
|
||||
name: string;
|
||||
description: string;
|
||||
masterKey: string;
|
||||
appId: string;
|
||||
endpoint: string;
|
||||
};
|
||||
|
||||
export class Environment {
|
||||
id: string;
|
||||
name: string;
|
||||
description: string;
|
||||
createdAt: string;
|
||||
masterKeyUpdatedAt: string;
|
||||
masterKey: string;
|
||||
appId: string;
|
||||
url: string;
|
||||
|
||||
provider: string;
|
||||
|
||||
get typeDisplayName() {
|
||||
switch (this.provider) {
|
||||
case "project": return "Self hosted";
|
||||
default: return "Global Self hosted"
|
||||
}
|
||||
}
|
||||
|
||||
constructor(provider: string, item: EnvironmentDataFormat) {
|
||||
this.provider = provider;
|
||||
|
||||
this.id = item.id;
|
||||
this.name = item.name;
|
||||
this.description = item.description;
|
||||
this.createdAt = '';
|
||||
this.masterKeyUpdatedAt = '';
|
||||
this.masterKey = item.masterKey;
|
||||
this.appId = item.appId;
|
||||
this.url = item.endpoint;
|
||||
}
|
||||
}
|
||||
|
||||
export interface ICloudServiceProvider {
|
||||
list(project: ProjectModel | undefined): Promise<EnvironmentDataFormat[]>;
|
||||
create(project: ProjectModel | undefined, options: CreateEnvironmentRequest): Promise<CreateEnvironment>;
|
||||
update(project: ProjectModel | undefined, options: UpdateEnvironmentRequest): Promise<boolean>;
|
||||
delete(project: ProjectModel | undefined, id: string): Promise<boolean>;
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@ import { projectFromDirectory, unzipIntoDirectory } from '../models/projectmodel
|
||||
import FileSystem from './filesystem';
|
||||
import { tracker } from './tracker';
|
||||
import { guid } from './utils';
|
||||
import { getTopLevelWorkingDirectory } from '@noodl/git/src/core/open';
|
||||
|
||||
export interface ProjectItem {
|
||||
id: string;
|
||||
@@ -268,15 +267,12 @@ export class LocalProjectsModel extends Model {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if this project is in a git repository.
|
||||
*
|
||||
* @param project
|
||||
* @returns
|
||||
*/
|
||||
async isGitProject(project: ProjectModel): Promise<boolean> {
|
||||
const gitPath = await getTopLevelWorkingDirectory(project._retainedProjectDirectory);
|
||||
return gitPath !== null;
|
||||
isGitProject(project: ProjectModel): boolean {
|
||||
// TODO: check if there's is git in any parent folder too
|
||||
|
||||
// Check if the git folder exists.
|
||||
const gitPath = filesystem.join(project._retainedProjectDirectory, '.git');
|
||||
return filesystem.exists(gitPath);
|
||||
}
|
||||
|
||||
setCurrentGlobalGitAuth(projectId: string) {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { CloudService } from '@noodl-models/CloudServices';
|
||||
import { ProjectModel } from '@noodl-models/projectmodel';
|
||||
import SchemaModel from '@noodl-models/schemamodel';
|
||||
|
||||
class FormCollection {
|
||||
@@ -193,7 +194,7 @@ export default class CloudFormation {
|
||||
}) {
|
||||
// Create new cloud services if needed
|
||||
if (options.cloudServices.id === undefined) {
|
||||
CloudService.instance.backend.fetch().then((collection) => {
|
||||
CloudService.instance.backend.fetch(ProjectModel.instance).then((collection) => {
|
||||
// TODO(OS): Cloud formation Cloud Service
|
||||
// // Make sure we have a unique name for the cloud services
|
||||
// const orgName = options.cloudServices.name;
|
||||
|
||||
@@ -11,14 +11,6 @@ export interface ArrayDiff<T> {
|
||||
changed: T[];
|
||||
unchanged: T[];
|
||||
}
|
||||
export function createEmptyArrayDiff<T>(): ArrayDiff<T> {
|
||||
return {
|
||||
deleted: [],
|
||||
created: [],
|
||||
changed: [],
|
||||
unchanged: [],
|
||||
}
|
||||
}
|
||||
|
||||
export interface ProjectDiffItem {
|
||||
graph: TSFixme;
|
||||
|
||||
@@ -13,7 +13,6 @@ export default class SchemaHandler {
|
||||
public dbCollections: TSFixme[];
|
||||
public systemCollections: TSFixme[];
|
||||
public configSchema: TSFixme;
|
||||
public parseServerVersion: string;
|
||||
|
||||
constructor() {
|
||||
EventDispatcher.instance.on(
|
||||
@@ -42,7 +41,7 @@ export default class SchemaHandler {
|
||||
return; // No project broker
|
||||
}
|
||||
|
||||
CloudService.instance.backend.fetch().then((collection) => {
|
||||
CloudService.instance.backend.fetch(ProjectModel.instance).then((collection) => {
|
||||
// Find by the Url / Endpoint and app id
|
||||
let environment = collection.find((b) => {
|
||||
return b.url === activeBroker.endpoint && b.appId === activeBroker.appId;
|
||||
@@ -120,20 +119,6 @@ export default class SchemaHandler {
|
||||
console.log(e);
|
||||
}
|
||||
});
|
||||
|
||||
// Get Parse Server Version & Supported features
|
||||
fetch(environment.url + '/serverInfo', {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({
|
||||
"_method": "GET",
|
||||
"_ApplicationId": environment.appId,
|
||||
"_MasterKey": environment.masterKey,
|
||||
})
|
||||
})
|
||||
.then((response) => response.json())
|
||||
.then((json) => {
|
||||
this.parseServerVersion = json.parseServerVersion;
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -144,20 +129,10 @@ export default class SchemaHandler {
|
||||
ProjectModel.instance.setMetaData('dbCollections', this.dbCollections);
|
||||
ProjectModel.instance.setMetaData('systemCollections', this.systemCollections);
|
||||
ProjectModel.instance.setMetaData('dbConfigSchema', this.configSchema);
|
||||
|
||||
const versionNumbers = this.parseServerVersion?.split(".")
|
||||
if (versionNumbers && versionNumbers.length > 0) {
|
||||
// Let's only save the major version number,
|
||||
// since this will be used to determine which verison of the API to use.
|
||||
ProjectModel.instance.setMetaData('dbVersionMajor', versionNumbers[0]);
|
||||
} else {
|
||||
ProjectModel.instance.setMetaData('dbVersionMajor', undefined);
|
||||
}
|
||||
} else {
|
||||
ProjectModel.instance.setMetaData('dbCollections', undefined);
|
||||
ProjectModel.instance.setMetaData('systemCollections', undefined);
|
||||
ProjectModel.instance.setMetaData('dbConfigSchema', undefined);
|
||||
ProjectModel.instance.setMetaData('dbVersionMajor', undefined);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import React, { RefObject } from 'react';
|
||||
|
||||
import { ProjectModel } from '@noodl-models/projectmodel';
|
||||
import { usePluginContext } from '@noodl-contexts/PluginContext';
|
||||
import React, { RefObject, useEffect, useRef } from 'react';
|
||||
|
||||
import { ActivityIndicator } from '@noodl-core-ui/components/common/ActivityIndicator';
|
||||
import { BaseDialog } from '@noodl-core-ui/components/layout/BaseDialog';
|
||||
@@ -55,7 +54,6 @@ export function DeployPopup(props: DeployPopupProps) {
|
||||
onClose={props.onClose}
|
||||
hasArrow
|
||||
isLockingScroll
|
||||
alwaysMounted
|
||||
>
|
||||
<DeployPopupChild />
|
||||
</BaseDialog>
|
||||
@@ -64,19 +62,6 @@ export function DeployPopup(props: DeployPopupProps) {
|
||||
}
|
||||
|
||||
function FluxscapeDeployTab() {
|
||||
const params = {};
|
||||
|
||||
const projectId = ProjectModel.instance.id;
|
||||
if (projectId) {
|
||||
params['projectId'] = projectId;
|
||||
}
|
||||
|
||||
const urlParams = new URLSearchParams(params);
|
||||
|
||||
return (
|
||||
<iframe
|
||||
src={`https://portal.fluxscape.io/?${urlParams.toString()}`}
|
||||
style={{ width: '100%', height: '50vh', borderStyle: 'none' }}
|
||||
/>
|
||||
);
|
||||
// Preview URL: 'http://192.168.0.33:8574/'
|
||||
return <iframe src="https://portal.fluxscape.io" style={{ width: "100%", height: "50vh", borderStyle: "none" }} />;
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@ export function CloudServiceCard({
|
||||
<div className={css['MetaBar']}>
|
||||
<div className={classNames([css['TypeDisplay'], isEditorEnvironment && css['is-editor-environment']])}>
|
||||
<Icon icon={IconName.CloudCheck} size={IconSize.Small} UNSAFE_style={{ marginRight: 4 }} />
|
||||
{'Self hosted '}
|
||||
{environment.typeDisplayName + ' '}
|
||||
{errorMessage && <span className={css['ArchivedDisplay']}>({errorMessage})</span>}
|
||||
{isEditorEnvironment && <span className={css['UsedInEditorDisplay']}>(Used in editor)</span>}
|
||||
</div>
|
||||
|
||||
@@ -5,6 +5,7 @@ import { CloudService, Environment } from '@noodl-models/CloudServices';
|
||||
import { ToastType } from '../../../ToastLayer/components/ToastCard';
|
||||
import { CloudServiceCard } from '../CloudServiceCard';
|
||||
import { useCloudServiceContext } from '../CloudServicePanel.context';
|
||||
import { ProjectModel } from '@noodl-models/projectmodel';
|
||||
|
||||
export interface CloudServiceCardItemProps {
|
||||
environment: Environment;
|
||||
@@ -20,7 +21,7 @@ export function CloudServiceCardItem({ environment, deleteEnvironment }: CloudSe
|
||||
async function onDelete() {
|
||||
await deleteEnvironment();
|
||||
await runActivity('Deleting cloud service...', async () => {
|
||||
const response: boolean = await CloudService.instance.backend.delete(environment.id);
|
||||
const response: boolean = await CloudService.instance.backend.delete(ProjectModel.instance, environment.id);
|
||||
return {
|
||||
type: ToastType.Success,
|
||||
message: 'Cloud service deleted'
|
||||
|
||||
@@ -12,6 +12,7 @@ import { Text, TextType } from '@noodl-core-ui/components/typography/Text';
|
||||
|
||||
import { ToastType } from '../../../ToastLayer/components/ToastCard';
|
||||
import { useCloudServiceContext } from '../CloudServicePanel.context';
|
||||
import { ProjectModel } from '@noodl-models/projectmodel';
|
||||
|
||||
function isValidParseUrl(url: string) {
|
||||
if (!url) return false;
|
||||
@@ -63,7 +64,7 @@ export function CloudServiceCreateModal({ isVisible, onClose }: CloudServiceCrea
|
||||
|
||||
async function onCreate() {
|
||||
await runActivity('Creating Cloud Service...', async () => {
|
||||
await cloudService.backend.create({
|
||||
await cloudService.backend.create(ProjectModel.instance, {
|
||||
name,
|
||||
description,
|
||||
masterKey: masterKey ? masterKey : undefined,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import React, { useState } from 'react';
|
||||
|
||||
import { FeedbackType } from '@noodl-constants/FeedbackType';
|
||||
import { CloudService, Environment } from '@noodl-models/CloudServices';
|
||||
@@ -12,6 +12,7 @@ import { HStack, VStack } from '@noodl-core-ui/components/layout/Stack';
|
||||
import { Text } from '@noodl-core-ui/components/typography/Text';
|
||||
|
||||
import { ToastLayer } from '../../../ToastLayer';
|
||||
import { ProjectModel } from '@noodl-models/projectmodel';
|
||||
|
||||
export interface CloudServiceModalProps {
|
||||
isVisible: boolean;
|
||||
@@ -60,7 +61,7 @@ function AsSelfHosted({
|
||||
}
|
||||
|
||||
CloudService.instance.backend
|
||||
.update({
|
||||
.update(ProjectModel.instance, {
|
||||
id: environment.id,
|
||||
name,
|
||||
description,
|
||||
@@ -70,7 +71,7 @@ function AsSelfHosted({
|
||||
})
|
||||
.then(() => {
|
||||
ToastLayer.showSuccess(`Updated Cloud Service`);
|
||||
CloudService.instance.backend.fetch();
|
||||
CloudService.instance.backend.fetch(ProjectModel.instance);
|
||||
})
|
||||
.catch(() => {
|
||||
ToastLayer.showError(`Failed to update Cloud Service`);
|
||||
|
||||
@@ -35,7 +35,7 @@ export function CloudServiceContextProvider({ children }) {
|
||||
const { hasActivity, runActivity } = useActivityQueue({
|
||||
onSuccess: async () => {
|
||||
// Always fetch all the backends after something have changed
|
||||
await cloudService.backend.fetch();
|
||||
await cloudService.backend.fetch(ProjectModel.instance);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -199,7 +199,6 @@ function BaseVersionControlPanel() {
|
||||
|
||||
export function VersionControlPanel() {
|
||||
const [git, setGit] = useState<Git>(null);
|
||||
const [state, setState] = useState<'loading' | 'loaded' | 'not-git'>('loading');
|
||||
|
||||
async function createGit() {
|
||||
const gitClient = new Git(mergeProject);
|
||||
@@ -207,18 +206,12 @@ export function VersionControlPanel() {
|
||||
setGit(gitClient);
|
||||
}
|
||||
|
||||
const isGitProject = git === null ? LocalProjectsModel.instance.isGitProject(ProjectModel.instance) : true;
|
||||
useEffect(() => {
|
||||
LocalProjectsModel.instance
|
||||
.isGitProject(ProjectModel.instance)
|
||||
.then(async (isGitProject) => {
|
||||
if (isGitProject) {
|
||||
await createGit();
|
||||
setState('loaded');
|
||||
} else {
|
||||
setState('not-git');
|
||||
}
|
||||
});
|
||||
}, []);
|
||||
if (isGitProject) {
|
||||
createGit();
|
||||
}
|
||||
}, [isGitProject]);
|
||||
|
||||
async function setupGit() {
|
||||
const gitClient = new Git(mergeProject);
|
||||
@@ -227,7 +220,7 @@ export function VersionControlPanel() {
|
||||
setGit(gitClient);
|
||||
}
|
||||
|
||||
if (git === null && state === 'not-git') {
|
||||
if (git === null && !isGitProject) {
|
||||
return (
|
||||
<BasePanel isFill title="Version Control">
|
||||
<Box hasXSpacing hasYSpacing>
|
||||
|
||||
@@ -6,13 +6,11 @@ import { Commit } from '@noodl/git/src/core/models/snapshot';
|
||||
import { FileChange } from '@noodl/git/src/core/models/status';
|
||||
import { revRange } from '@noodl/git/src/core/rev-list';
|
||||
|
||||
import { ProjectModel } from '@noodl-models/projectmodel';
|
||||
import { applyPatches } from '@noodl-models/ProjectPatches/applypatches';
|
||||
import { mergeProject } from '@noodl-utils/projectmerger';
|
||||
import { ProjectDiff, diffProject } from '@noodl-utils/projectmerger.diff';
|
||||
|
||||
import { useVersionControlContext } from '../context';
|
||||
import { getProjectFilePath } from '../context/DiffUtils';
|
||||
import { DiffList } from './DiffList';
|
||||
|
||||
//Kind:
|
||||
@@ -126,10 +124,7 @@ async function getMergeDiff(repositoryPath: string, commit: Commit, refToDiffTo:
|
||||
}
|
||||
|
||||
async function getProjectFile(commit: Commit) {
|
||||
const projectFilePath = getProjectFilePath(commit.repositoryDir, ProjectModel.instance._retainedProjectDirectory);
|
||||
|
||||
const projectContentRaw = await commit.getFileAsString(projectFilePath);
|
||||
const projectContent = JSON.parse(projectContentRaw);
|
||||
const projectContent = JSON.parse(await commit.getFileAsString('project.json'));
|
||||
applyPatches(projectContent);
|
||||
return projectContent;
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ export function DiffList({ diff, fileChanges, componentDiffTitle, actions, commi
|
||||
const [imageDiff, setImageDiff] = useState<IImageDiff>(null);
|
||||
|
||||
const components = diff?.components ? getChangedComponents(diff.components) : [];
|
||||
const files = (fileChanges || [])?.filter((f) => !f.path.endsWith('project.json')) || [];
|
||||
const files = (fileChanges || [])?.filter((f) => f.path !== 'project.json') || [];
|
||||
const settings = diff?.settings ? getChangedObjectProperties(diff.settings) : [];
|
||||
const colorStyles = diff?.styles.colors ? getChangedObjectProperties(diff.styles.colors) : [];
|
||||
const textStyles = diff?.styles.text ? getChangedObjectProperties(diff.styles.text) : [];
|
||||
|
||||
@@ -1,24 +1,21 @@
|
||||
import path from 'path';
|
||||
import { getCommit } from '@noodl/git/src/core/logs';
|
||||
import { FileStatusKind } from '@noodl/git/src/core/models/status';
|
||||
|
||||
import { FeedbackType } from '@noodl-constants/FeedbackType';
|
||||
import { applyPatches } from '@noodl-models/ProjectPatches/applypatches';
|
||||
import {
|
||||
ProjectDiff,
|
||||
ProjectDiffItem,
|
||||
ProjectBasicDiffItem,
|
||||
ArrayDiff,
|
||||
diffProject,
|
||||
createEmptyArrayDiff
|
||||
diffProject
|
||||
} from '@noodl-utils/projectmerger.diff';
|
||||
|
||||
import { IconName } from '@noodl-core-ui/components/common/Icon';
|
||||
import { ListItemProps } from '@noodl-core-ui/components/layout/ListItem';
|
||||
|
||||
import { ProjectModel } from '../../../../models/projectmodel';
|
||||
|
||||
export interface ProjectLocalDiff extends ProjectDiff {
|
||||
import { applyPatches } from '@noodl-models/ProjectPatches/applypatches';
|
||||
import { FileStatusKind } from '@noodl/git/src/core/models/status';
|
||||
import { IconName } from '@noodl-core-ui/components/common/Icon';
|
||||
import { ListItemProps } from '@noodl-core-ui/components/layout/ListItem';
|
||||
import { FeedbackType } from '@noodl-constants/FeedbackType';
|
||||
import { getCommit } from '@noodl/git/src/core/logs';
|
||||
|
||||
export interface ProjectLocalDiff extends ProjectDiff{
|
||||
baseProject: TSFixme; //Project model as an object from raw json
|
||||
commitShaDiffedTo: string;
|
||||
}
|
||||
@@ -87,49 +84,17 @@ export function getFileStatusIconProps(status: FileStatusKind): Partial<ListItem
|
||||
}
|
||||
}
|
||||
|
||||
export function getProjectFilePath(repositoryPath: string, projectPath: string) {
|
||||
const relativePath = path.relative(repositoryPath, projectPath);
|
||||
const projectFilePath = path.join(relativePath, 'project.json').replaceAll('\\', '/');
|
||||
return projectFilePath;
|
||||
}
|
||||
|
||||
export async function doLocalDiff(
|
||||
repositoryPath: string,
|
||||
projectPath: string,
|
||||
headCommitId: string
|
||||
): Promise<ProjectLocalDiff> {
|
||||
const projectFilePath = getProjectFilePath(repositoryPath, projectPath);
|
||||
|
||||
try {
|
||||
const baseCommit = await getCommit(projectPath, headCommitId);
|
||||
const baseProjectJson = await baseCommit.getFileAsString(projectFilePath);
|
||||
const baseProject = JSON.parse(baseProjectJson);
|
||||
applyPatches(baseProject);
|
||||
|
||||
const diff = diffProject(baseProject, ProjectModel.instance.toJSON());
|
||||
|
||||
return {
|
||||
...diff,
|
||||
baseProject,
|
||||
commitShaDiffedTo: headCommitId
|
||||
};
|
||||
} catch (error) {
|
||||
if (error.toString().includes('exists on disk, but not in')) {
|
||||
console.warn('project.json does not exist in this commit.');
|
||||
}
|
||||
|
||||
// Return empty state
|
||||
return {
|
||||
baseProject: {},
|
||||
commitShaDiffedTo: headCommitId,
|
||||
components: createEmptyArrayDiff(),
|
||||
variants: createEmptyArrayDiff(),
|
||||
settings: createEmptyArrayDiff(),
|
||||
styles: {
|
||||
colors: createEmptyArrayDiff(),
|
||||
text: createEmptyArrayDiff()
|
||||
},
|
||||
cloudservices: createEmptyArrayDiff()
|
||||
};
|
||||
}
|
||||
export async function doLocalDiff(repositoryPath: string, headCommitId: string): Promise<ProjectLocalDiff> {
|
||||
const baseCommit = await getCommit(repositoryPath, headCommitId);
|
||||
const baseProjectJson = await baseCommit.getFileAsString('project.json');
|
||||
const baseProject = JSON.parse(baseProjectJson);
|
||||
applyPatches(baseProject);
|
||||
|
||||
const diff = diffProject(baseProject, ProjectModel.instance.toJSON());
|
||||
|
||||
return {
|
||||
...diff,
|
||||
baseProject,
|
||||
commitShaDiffedTo: headCommitId
|
||||
};
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@ import { Slot } from '@noodl-core-ui/types/global';
|
||||
import { doLocalDiff, ProjectLocalDiff } from './DiffUtils';
|
||||
import { useVersionControlFetch } from './fetch.context';
|
||||
import { BranchStatus, IVersionControlContext } from './types';
|
||||
import { ProjectModel } from '@noodl-models/projectmodel';
|
||||
|
||||
const VersionControlContext = createContext<IVersionControlContext>({
|
||||
git: null,
|
||||
@@ -58,8 +57,7 @@ export function VersionControlProvider({ git, children }: { git: Git; children:
|
||||
(async () => {
|
||||
const currentCommitSha = await git.getHeadCommitId();
|
||||
if (currentCommitSha) {
|
||||
const projectPath = ProjectModel.instance._retainedProjectDirectory;
|
||||
const diff = await doLocalDiff(git.repositoryPath, projectPath, currentCommitSha);
|
||||
const diff = await doLocalDiff(git.repositoryPath, currentCommitSha);
|
||||
setLocalDiff(diff);
|
||||
}
|
||||
})();
|
||||
|
||||
@@ -22,11 +22,7 @@ export async function open(basePath: string): Promise<string> {
|
||||
// console.log("VCS error when opening project: " + e);
|
||||
// }
|
||||
|
||||
|
||||
// Find the relative git repository path
|
||||
const repositoryPath = await getTopLevelWorkingDirectory(basePath);
|
||||
|
||||
return repositoryPath;
|
||||
return basePath;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -32,15 +32,12 @@ class CloudStore {
|
||||
|
||||
_initCloudServices() {
|
||||
_collections = undefined; // clear collection cache, so it's refetched
|
||||
|
||||
const cloudServices = NoodlRuntime.instance.getMetaData('cloudservices');
|
||||
|
||||
if (cloudServices) {
|
||||
this.appId = cloudServices.appId;
|
||||
this.endpoint = cloudServices.endpoint;
|
||||
}
|
||||
|
||||
const dbVersionMajor = NoodlRuntime.instance.getMetaData('dbVersionMajor');
|
||||
this.dbVersionMajor = dbVersionMajor;
|
||||
}
|
||||
|
||||
on() {
|
||||
@@ -171,10 +168,13 @@ class CloudStore {
|
||||
return;
|
||||
}
|
||||
|
||||
if (options.where) args.push('match=' + encodeURIComponent(JSON.stringify(options.where)));
|
||||
if (options.limit) args.push('limit=' + options.limit);
|
||||
if (options.skip) args.push('skip=' + options.skip);
|
||||
|
||||
const grouping = {};
|
||||
const grouping = {
|
||||
objectId: null
|
||||
};
|
||||
|
||||
Object.keys(options.group).forEach((k) => {
|
||||
const _g = {};
|
||||
@@ -188,20 +188,7 @@ class CloudStore {
|
||||
grouping[k] = _g;
|
||||
});
|
||||
|
||||
// I don't know which version the API was changed, lets just say above 4 for now.
|
||||
if (this.dbVersionMajor && this.dbVersionMajor > 4) {
|
||||
grouping._id = null;
|
||||
|
||||
if (options.where) args.push('$match=' + encodeURIComponent(JSON.stringify(options.where)));
|
||||
|
||||
args.push('$group=' + JSON.stringify(grouping));
|
||||
} else {
|
||||
grouping.objectId = null;
|
||||
|
||||
if (options.where) args.push('match=' + encodeURIComponent(JSON.stringify(options.where)));
|
||||
|
||||
args.push('group=' + JSON.stringify(grouping));
|
||||
}
|
||||
args.push('group=' + JSON.stringify(grouping));
|
||||
|
||||
this._makeRequest('/aggregate/' + options.collection + (args.length > 0 ? '?' + args.join('&') : ''), {
|
||||
success: function (response) {
|
||||
|
||||
@@ -499,7 +499,7 @@ function generateNodeLibrary(nodeRegister) {
|
||||
},
|
||||
{
|
||||
name: 'Read & Write Data',
|
||||
description: 'Arrays, objects',
|
||||
description: 'Arrays, objects, cloud data',
|
||||
type: 'data',
|
||||
subCategories: [
|
||||
{
|
||||
@@ -529,18 +529,7 @@ function generateNodeLibrary(nodeRegister) {
|
||||
]
|
||||
},
|
||||
{
|
||||
name: 'External Data',
|
||||
items: ['REST2']
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: 'Cloud Service',
|
||||
description: '',
|
||||
type: 'data',
|
||||
subCategories: [
|
||||
{
|
||||
name: '',
|
||||
name: 'Cloud Data',
|
||||
items: [
|
||||
'DbModel2',
|
||||
'NewDbModelProperties',
|
||||
@@ -569,6 +558,10 @@ function generateNodeLibrary(nodeRegister) {
|
||||
'net.noodl.user.ResetPassword',
|
||||
'net.noodl.user.RequestPasswordReset'
|
||||
]
|
||||
},
|
||||
{
|
||||
name: 'External Data',
|
||||
items: ['REST2']
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
@@ -2,8 +2,6 @@ const StringFormatDefinition = {
|
||||
name: 'String Format',
|
||||
docs: 'https://docs.noodl.net/nodes/string-manipulation/string-format',
|
||||
category: 'String Manipulation',
|
||||
usePortAsLabel: 'format',
|
||||
portLabelTruncationMode: 'length',
|
||||
initialize() {
|
||||
const internal = this._internal;
|
||||
internal.format = '';
|
||||
|
||||
@@ -7,8 +7,6 @@ import { Noodl, Slot } from '../../../types';
|
||||
export interface ButtonProps extends Noodl.ReactProps {
|
||||
enabled: boolean;
|
||||
buttonType: 'button' | 'submit';
|
||||
|
||||
attrs: React.Attributes;
|
||||
|
||||
textStyle: Noodl.TextStyle;
|
||||
|
||||
@@ -98,7 +96,6 @@ export function Button(props: ButtonProps) {
|
||||
|
||||
return (
|
||||
<button
|
||||
{...props.attrs}
|
||||
className={className}
|
||||
disabled={!props.enabled}
|
||||
{...Utils.controlEvents(props)}
|
||||
|
||||
@@ -9,8 +9,6 @@ export interface CheckboxProps extends Noodl.ReactProps {
|
||||
enabled: boolean;
|
||||
checked: boolean;
|
||||
|
||||
attrs: React.Attributes;
|
||||
|
||||
useLabel: boolean;
|
||||
label: string;
|
||||
labelSpacing: string;
|
||||
@@ -49,7 +47,6 @@ export function Checkbox(props: CheckboxProps) {
|
||||
Layout.align(style, props);
|
||||
|
||||
const inputProps = {
|
||||
...props.attrs,
|
||||
id: props.id,
|
||||
className: [props.className, 'ndl-controls-checkbox-2'].join(' '),
|
||||
disabled: !props.enabled,
|
||||
|
||||
@@ -10,8 +10,6 @@ export interface RadioButtonProps extends Noodl.ReactProps {
|
||||
enabled: boolean;
|
||||
value: string;
|
||||
|
||||
attrs: React.Attributes;
|
||||
|
||||
useLabel: boolean;
|
||||
label: string;
|
||||
labelSpacing: string;
|
||||
@@ -49,7 +47,6 @@ export function RadioButton(props: RadioButtonProps) {
|
||||
props.checkedChanged && props.checkedChanged(radioButtonGroup ? radioButtonGroup.selected === props.value : false);
|
||||
|
||||
const inputProps = {
|
||||
...props.attrs,
|
||||
id: props.id,
|
||||
disabled: !props.enabled,
|
||||
className: [props.className, 'ndl-controls-radio-2'].join(' '),
|
||||
|
||||
@@ -12,8 +12,6 @@ export interface SelectProps extends Noodl.ReactProps {
|
||||
textStyle: Noodl.TextStyle;
|
||||
items: TSFixme;
|
||||
|
||||
attrs: React.Attributes;
|
||||
|
||||
placeholder: string;
|
||||
placeholderOpacity: string;
|
||||
|
||||
@@ -83,7 +81,6 @@ export function Select(props: SelectProps) {
|
||||
}
|
||||
|
||||
const inputProps = {
|
||||
...props.attrs,
|
||||
id: props.id,
|
||||
className: props.className,
|
||||
style: {
|
||||
|
||||
@@ -9,8 +9,6 @@ export interface SliderProps extends Noodl.ReactProps {
|
||||
id: string;
|
||||
enabled: boolean;
|
||||
|
||||
attrs: React.Attributes;
|
||||
|
||||
value: number;
|
||||
min: number;
|
||||
max: number;
|
||||
@@ -105,7 +103,6 @@ export function Slider(props: SliderProps) {
|
||||
const className = `ndl-controls-range2 ${instanceClassId} ${props.className ? props.className : ''} `;
|
||||
|
||||
const inputProps: React.InputHTMLAttributes<HTMLInputElement> = {
|
||||
...props.attrs,
|
||||
id: props.id,
|
||||
style: {
|
||||
width: '100%',
|
||||
|
||||
@@ -17,8 +17,6 @@ export interface TextInputProps extends Noodl.ReactProps {
|
||||
type: 'text' | 'textArea' | 'email' | 'number' | 'password' | 'url';
|
||||
textStyle: Noodl.TextStyle;
|
||||
|
||||
attrs: React.Attributes;
|
||||
|
||||
enabled: boolean;
|
||||
|
||||
placeholder: string;
|
||||
@@ -151,7 +149,6 @@ export class TextInput extends React.Component<TextInputProps, State> {
|
||||
inputStyles.color = props.noodlNode.context.styles.resolveColor(inputStyles.color);
|
||||
|
||||
const inputProps = {
|
||||
...props.attrs,
|
||||
id: props.id,
|
||||
value: this.state.value,
|
||||
...Utils.controlEvents(props),
|
||||
|
||||
@@ -7,8 +7,6 @@ export interface ColumnsProps extends Noodl.ReactProps {
|
||||
marginX: string;
|
||||
marginY: string;
|
||||
|
||||
attrs: React.Attributes;
|
||||
|
||||
justifyContent: 'flex-start' | 'flex-end' | 'center';
|
||||
direction: 'row' | 'column';
|
||||
minWidth: string;
|
||||
@@ -117,10 +115,7 @@ export function Columns(props: ColumnsProps) {
|
||||
|
||||
// ForEachCompoent breaks the layout but is needed to send onMount/onUnmount
|
||||
if (!Array.isArray(props.children)) {
|
||||
// @ts-expect-error props.children.type is any
|
||||
if (props.children.type !== ForEachComponent) {
|
||||
children = [props.children]
|
||||
}
|
||||
children = [props.children];
|
||||
} else {
|
||||
children = props.children.filter((child) => child.type !== ForEachComponent);
|
||||
forEachComponent = props.children.find((child) => child.type === ForEachComponent);
|
||||
@@ -128,7 +123,6 @@ export function Columns(props: ColumnsProps) {
|
||||
|
||||
return (
|
||||
<div
|
||||
{...props.attrs}
|
||||
className={['columns-container', props.className].join(' ')}
|
||||
ref={containerRef}
|
||||
style={{
|
||||
|
||||
@@ -19,8 +19,6 @@ BScroll.use(Slide);
|
||||
export interface GroupProps extends Noodl.ReactProps {
|
||||
as?: keyof JSX.IntrinsicElements | React.ComponentType<unknown>;
|
||||
|
||||
attrs: React.Attributes;
|
||||
|
||||
scrollSnapEnabled: boolean;
|
||||
showScrollbar: boolean;
|
||||
scrollEnabled: boolean;
|
||||
@@ -273,7 +271,6 @@ export class Group extends React.Component<GroupProps> {
|
||||
<Component
|
||||
// @ts-expect-error Lets hope that the type passed here is always static!
|
||||
className={props.className}
|
||||
{...props.attrs}
|
||||
{...props.dom}
|
||||
{...PointerListeners(props)}
|
||||
style={style}
|
||||
|
||||
@@ -10,7 +10,6 @@ export interface ImageProps extends Noodl.ReactProps {
|
||||
src: string;
|
||||
onLoad?: () => void;
|
||||
};
|
||||
attrs: React.Attributes;
|
||||
}
|
||||
|
||||
export function Image(props: ImageProps) {
|
||||
@@ -31,5 +30,5 @@ export function Image(props: ImageProps) {
|
||||
}
|
||||
}
|
||||
|
||||
return <img {...props.attrs} className={props.className} {...props.dom} {...PointerListeners(props)} style={style} />;
|
||||
return <img className={props.className} {...props.dom} {...PointerListeners(props)} style={style} />;
|
||||
}
|
||||
|
||||
@@ -7,8 +7,6 @@ import { Noodl } from '../../../types';
|
||||
export interface TextProps extends Noodl.ReactProps {
|
||||
as?: keyof JSX.IntrinsicElements | React.ComponentType<unknown>;
|
||||
|
||||
attrs: React.Attributes;
|
||||
|
||||
textStyle: Noodl.TextStyle;
|
||||
text: string;
|
||||
|
||||
@@ -50,7 +48,6 @@ export function Text(props: TextProps) {
|
||||
return (
|
||||
<Component
|
||||
className={['ndl-visual-text', props.className].join(' ')}
|
||||
{...props.attrs}
|
||||
{...props.dom}
|
||||
{...PointerListeners(props)}
|
||||
style={style}
|
||||
|
||||
@@ -30,24 +30,11 @@ const ButtonNode = {
|
||||
]
|
||||
},
|
||||
initialize() {
|
||||
this.props.attrs = {};
|
||||
this.props.layout = 'row'; //Used to tell child nodes what layout to expect
|
||||
},
|
||||
getReactComponent() {
|
||||
return Button;
|
||||
},
|
||||
inputs: {
|
||||
testId: {
|
||||
index: 100009,
|
||||
displayName: 'Test ID Attribute',
|
||||
group: 'Advanced HTML',
|
||||
type: 'string',
|
||||
set(value) {
|
||||
this.props.attrs["data-testid"] = value;
|
||||
this.forceUpdate();
|
||||
}
|
||||
}
|
||||
},
|
||||
inputCss: {
|
||||
backgroundColor: {
|
||||
index: 100,
|
||||
|
||||
@@ -31,7 +31,6 @@ const CheckBoxNode = {
|
||||
]
|
||||
},
|
||||
initialize() {
|
||||
this.props.attrs = {};
|
||||
this.props.sizeMode = 'explicit';
|
||||
this.props.id = 'input-' + guid();
|
||||
this.props.checked = this._internal.checked = false;
|
||||
@@ -95,16 +94,6 @@ const CheckBoxNode = {
|
||||
this.flagOutputDirty('checked');
|
||||
this._updateVisualState();
|
||||
}
|
||||
},
|
||||
testId: {
|
||||
index: 100009,
|
||||
displayName: 'Test ID Attribute',
|
||||
group: 'Advanced HTML',
|
||||
type: 'string',
|
||||
set(value) {
|
||||
this.props.attrs["data-testid"] = value;
|
||||
this.forceUpdate();
|
||||
}
|
||||
}
|
||||
},
|
||||
inputCss: {
|
||||
|
||||
@@ -31,7 +31,6 @@ const OptionsNode = {
|
||||
]
|
||||
},
|
||||
initialize: function () {
|
||||
this.props.attrs = {};
|
||||
this._itemsChanged = () => {
|
||||
this.forceUpdate();
|
||||
};
|
||||
@@ -91,16 +90,6 @@ const OptionsNode = {
|
||||
this.flagOutputDirty('value');
|
||||
}
|
||||
}
|
||||
},
|
||||
testId: {
|
||||
index: 100009,
|
||||
displayName: 'Test ID Attribute',
|
||||
group: 'Advanced HTML',
|
||||
type: 'string',
|
||||
set(value) {
|
||||
this.props.attrs["data-testid"] = value;
|
||||
this.forceUpdate();
|
||||
}
|
||||
}
|
||||
},
|
||||
inputProps: {
|
||||
|
||||
@@ -31,7 +31,6 @@ const RadioButtonNode = {
|
||||
]
|
||||
},
|
||||
initialize() {
|
||||
this.props.attrs = {};
|
||||
this.props.sizeMode = 'explicit';
|
||||
this.props.id = 'input-' + guid();
|
||||
|
||||
@@ -62,16 +61,6 @@ const RadioButtonNode = {
|
||||
set(value) {
|
||||
this.setStyle({ backgroundColor: value }, 'fill');
|
||||
}
|
||||
},
|
||||
testId: {
|
||||
index: 100009,
|
||||
displayName: 'Test ID Attribute',
|
||||
group: 'Advanced HTML',
|
||||
type: 'string',
|
||||
set(value) {
|
||||
this.props.attrs["data-testid"] = value;
|
||||
this.forceUpdate();
|
||||
}
|
||||
}
|
||||
},
|
||||
inputProps: {
|
||||
|
||||
@@ -27,7 +27,6 @@ const RangeNode = {
|
||||
]
|
||||
},
|
||||
initialize() {
|
||||
this.props.attrs = {};
|
||||
this.props.sizeMode = 'contentHeight';
|
||||
this.props.id = 'input-' + guid();
|
||||
|
||||
@@ -68,16 +67,6 @@ const RangeNode = {
|
||||
set(value) {
|
||||
this._setInputValue(value);
|
||||
}
|
||||
},
|
||||
testId: {
|
||||
index: 100009,
|
||||
displayName: 'Test ID Attribute',
|
||||
group: 'Advanced HTML',
|
||||
type: 'string',
|
||||
set(value) {
|
||||
this.props.attrs["data-testid"] = value;
|
||||
this.forceUpdate();
|
||||
}
|
||||
}
|
||||
},
|
||||
outputs: {
|
||||
|
||||
@@ -43,7 +43,6 @@ const TextInputNode = {
|
||||
return TextInput;
|
||||
},
|
||||
initialize() {
|
||||
this.props.attrs = {};
|
||||
this.props.startValue = '';
|
||||
this.props.id = this._internal.controlId = 'input-' + guid();
|
||||
},
|
||||
@@ -168,16 +167,6 @@ const TextInputNode = {
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
testId: {
|
||||
index: 100009,
|
||||
displayName: 'Test ID Attribute',
|
||||
group: 'Advanced HTML',
|
||||
type: 'string',
|
||||
set(value) {
|
||||
this.props.attrs["data-testid"] = value;
|
||||
this.forceUpdate();
|
||||
}
|
||||
}
|
||||
},
|
||||
inputCss: {
|
||||
|
||||
@@ -23,7 +23,7 @@ const ColumnsNode = {
|
||||
]
|
||||
},
|
||||
|
||||
initialize() { this.props.attrs = {};
|
||||
initialize() {
|
||||
this.props.layoutString = '1 2 1';
|
||||
this.props.minWidth = 0;
|
||||
this.props.marginX = 16;
|
||||
@@ -62,16 +62,6 @@ const ColumnsNode = {
|
||||
);
|
||||
}
|
||||
|
||||
this.forceUpdate();
|
||||
}
|
||||
},
|
||||
testId: {
|
||||
index: 100009,
|
||||
displayName: 'Test ID Attribute',
|
||||
group: 'Advanced HTML',
|
||||
type: 'string',
|
||||
set(value) {
|
||||
this.props.attrs["data-testid"] = value;
|
||||
this.forceUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,6 @@ const GroupNode = {
|
||||
groupPriority: ['General', 'Style', 'Events', 'Mounted', 'Hover Events', 'Pointer Events', 'Focus', 'Scroll']
|
||||
},
|
||||
initialize() {
|
||||
this.props.attrs = {};
|
||||
this._internal = {
|
||||
scrollElementDuration: 500,
|
||||
scrollIndexDuration: 500,
|
||||
@@ -144,16 +143,6 @@ const GroupNode = {
|
||||
valueChangedToTrue() {
|
||||
this.context.setNodeFocused(this, true);
|
||||
}
|
||||
},
|
||||
testId: {
|
||||
index: 100009,
|
||||
displayName: 'Test ID Attribute',
|
||||
group: 'Advanced HTML',
|
||||
type: 'string',
|
||||
set(value) {
|
||||
this.props.attrs["data-testid"] = value;
|
||||
this.forceUpdate();
|
||||
}
|
||||
}
|
||||
},
|
||||
inputProps: {
|
||||
|
||||
@@ -27,7 +27,6 @@ const ImageNode = {
|
||||
]
|
||||
},
|
||||
initialize() {
|
||||
this.props.attrs = {};
|
||||
this.props.default = '';
|
||||
},
|
||||
getReactComponent() {
|
||||
@@ -87,16 +86,6 @@ const ImageNode = {
|
||||
this.props.dom.src = getAbsoluteUrl(url);
|
||||
this.forceUpdate();
|
||||
}
|
||||
},
|
||||
testId: {
|
||||
index: 100009,
|
||||
displayName: 'Test ID Attribute',
|
||||
group: 'Advanced HTML',
|
||||
type: 'string',
|
||||
set(value) {
|
||||
this.props.attrs["data-testid"] = value;
|
||||
this.forceUpdate();
|
||||
}
|
||||
}
|
||||
},
|
||||
inputProps: {
|
||||
@@ -125,12 +114,6 @@ const ImageNode = {
|
||||
propPath: 'dom',
|
||||
type: 'signal',
|
||||
group: 'Events'
|
||||
},
|
||||
onError: {
|
||||
displayName: 'On Error',
|
||||
propPath: 'dom',
|
||||
type: 'signal',
|
||||
group: 'Events'
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -20,9 +20,6 @@ const TextNode = {
|
||||
nodeDoubleClickAction: {
|
||||
focusPort: 'text'
|
||||
},
|
||||
initialize() {
|
||||
this.props.attrs = {};
|
||||
},
|
||||
getReactComponent() {
|
||||
return Text;
|
||||
},
|
||||
@@ -138,16 +135,6 @@ const TextNode = {
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
testId: {
|
||||
index: 100009,
|
||||
displayName: 'Test ID Attribute',
|
||||
group: 'Advanced HTML',
|
||||
type: 'string',
|
||||
set(value) {
|
||||
this.props.attrs["data-testid"] = value;
|
||||
this.forceUpdate();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||