13 Commits
v1.0.0 ... main

Author SHA1 Message Date
Michael Cartner
6e514f2521 fix: version control panel - show correct state when a push is rejected (#23) 2024-02-06 16:03:04 +01:00
Michael Cartner
8a88290dab Update README.md 2024-01-31 16:59:06 +01:00
Michael Cartner
418eff7dc7 Update README.md
Clarified licensing information
2024-01-31 16:34:48 +01:00
Michael Cartner
c95725ec08 fix: syntax error 2024-01-31 16:05:07 +01:00
Michael Cartner
eae223a817 Fixes #13. Missing verify button for OpenAI API key. (#15) 2024-01-31 15:34:56 +01:00
Noodl Windows Build User
57932fef3c fix: final fix to windows to allow side-by-side install of open source noodl and legacy noodl 2024-01-30 20:51:20 +00:00
Noodl Windows Build User
42e065b586 fix: updated package name to follow best practices 2024-01-30 18:17:08 +00:00
Michael Cartner
78af7d6c2a fix: update package name, commit #dedd2f4f1487462cc80454d0d8c72bc6b99eb898 didn't address the whole issue (#12) 2024-01-26 17:27:57 +01:00
Michael Cartner
6115782eed chore: update version to 1.0.1 2024-01-26 17:01:05 +01:00
Michael Cartner
dedd2f4f14 fix: changed app id to enable the old closed-source Noodl to be installed at the same time (#11) 2024-01-26 17:00:18 +01:00
Eric Tuvesson
5976008ae3 chore: Update project/deploy settings base url text (#10) 2024-01-26 16:00:18 +01:00
Michael Cartner
48010f2c29 Update README.md (#9) 2024-01-26 15:23:42 +01:00
Eric Tuvesson
9bce91d5b3 fix: consistent behaviour of window title bar buttons on Linux (#7)
Ensures that the functionality of window title bar buttons on Linux matches that of Windows.
2024-01-26 13:53:02 +01:00
12 changed files with 75 additions and 24 deletions

View File

@@ -2,11 +2,22 @@
[Noodl](https://noodl.net) is a low-code platform where designers and developers build custom applications and experiences. Designed as a visual programming environment, it aims to expedite your development process. It promotes the swift and efficient creation of applications, requiring minimal coding knowledge. [Noodl](https://noodl.net) is a low-code platform where designers and developers build custom applications and experiences. Designed as a visual programming environment, it aims to expedite your development process. It promotes the swift and efficient creation of applications, requiring minimal coding knowledge.
## Requirements ## Documentation
Documentation for how to use Noodl can be found here:
[https://noodlapp.github.io/noodl-docs/](https://noodlapp.github.io/noodl-docs/)
[Node.js](https://nodejs.org/) ## Community
Main support channel is Discord: [https://www.noodl.net/community](https://www.noodl.net/community)
## Getting Started ## Download releases
Pre-built binaries can be [downloaded from Github](https://github.com/noodlapp/noodl/releases)
## Note for users who are migrating from the deprecated closed source version
- [Migrating the project files and workspaces to a Git provider](https://noodlapp.github.io/noodl-docs/docs/guides/collaboration/migrating-from-noodl-hosted-git)
- [Migrate backend and database](https://noodlapp.github.io/noodl-docs/docs/guides/deploy/using-an-external-backend#migrating-from-a-noodl-cloud-service)
- [Self-host frontend](https://noodlapp.github.io/noodl-docs/docs/guides/deploy/hosting-frontend)
## Building from source
```bash ```bash
# Install all dependencies # Install all dependencies
@@ -22,3 +33,18 @@ $ npm run dev
# Start Noodl Editor test runner # Start Noodl Editor test runner
$ npm run test:editor $ npm run test:editor
``` ```
## Licenses
This repository contains two different licenses for different parts of the Noodl platform.
- Components related to the editor, used to edit Noodl projects, are under GPLv3
- Components related to the end applications, used by the applications Noodl deploys, are under MIT
All of the source code of applications created with Noodl are under MIT. This means you can do project specific changes to the runtime without having to redistribute your changes.
Packaged licensed under MIT:
- `noodl-runtime`
- `noodl-viewer-cloud`
- `noodl-viewer-react`
You can find a MIT LICENSE file in each of these packages. The rest of the repository is licensed under GPLv3.

7
package-lock.json generated
View File

@@ -35443,7 +35443,7 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/Noodl": { "node_modules/noodl-editor": {
"resolved": "packages/noodl-editor", "resolved": "packages/noodl-editor",
"link": true "link": true
}, },
@@ -48967,8 +48967,7 @@
"dev": true "dev": true
}, },
"packages/noodl-editor": { "packages/noodl-editor": {
"name": "Noodl", "version": "1.0.1",
"version": "1.0.0",
"dependencies": { "dependencies": {
"@electron/remote": "^2.1.1", "@electron/remote": "^2.1.1",
"@jaames/iro": "^5.5.2", "@jaames/iro": "^5.5.2",
@@ -80984,7 +80983,7 @@
"version": "2.0.10", "version": "2.0.10",
"dev": true "dev": true
}, },
"Noodl": { "noodl-editor": {
"version": "file:packages/noodl-editor", "version": "file:packages/noodl-editor",
"requires": { "requires": {
"@babel/core": "^7.19.1", "@babel/core": "^7.19.1",

View File

@@ -12,7 +12,7 @@
"graph": "npx nx graph", "graph": "npx nx graph",
"ci:prepare:editor": "ts-node ./scripts/ci-editor-prepare.ts", "ci:prepare:editor": "ts-node ./scripts/ci-editor-prepare.ts",
"ci:build:viewer": "lerna exec --scope @noodl/noodl-viewer-react -- npm run build", "ci:build:viewer": "lerna exec --scope @noodl/noodl-viewer-react -- npm run build",
"ci:build:editor": "lerna exec --scope Noodl -- npm run ci:build", "ci:build:editor": "lerna exec --scope noodl-editor -- npm run ci:build",
"build:editor": "ts-node ./scripts/build-editor.ts", "build:editor": "ts-node ./scripts/build-editor.ts",
"build:editor:_viewer": "ts-node ./scripts/noodl-editor/build-viewer.ts", "build:editor:_viewer": "ts-node ./scripts/noodl-editor/build-viewer.ts",
"build:editor:_editor": "ts-node ./scripts/noodl-editor/build-editor.ts", "build:editor:_editor": "ts-node ./scripts/noodl-editor/build-editor.ts",
@@ -20,7 +20,7 @@
"build:cloud-runtime": "lerna run build --scope @noodl/cloud-runtime --stream && lerna run build:pack --scope @noodl/cloud-runtime --stream", "build:cloud-runtime": "lerna run build --scope @noodl/cloud-runtime --stream && lerna run build:pack --scope @noodl/cloud-runtime --stream",
"start:storybook": "lerna exec --scope @noodl/noodl-core-ui -- npm run start", "start:storybook": "lerna exec --scope @noodl/noodl-core-ui -- npm run start",
"start:viewer": "lerna run start --scope @noodl/noodl-viewer-react --stream", "start:viewer": "lerna run start --scope @noodl/noodl-viewer-react --stream",
"start:editor": "lerna run start --scope Noodl --stream", "start:editor": "lerna run start --scope noodl-editor --stream",
"dev": "ts-node ./scripts/start.ts", "dev": "ts-node ./scripts/start.ts",
"start": "ts-node ./scripts/start.ts -- --build-viewer", "start": "ts-node ./scripts/start.ts -- --build-viewer",
"test:editor": "ts-node ./scripts/test-editor.ts", "test:editor": "ts-node ./scripts/test-editor.ts",

View File

@@ -1,10 +1,10 @@
{ {
"name": "Noodl", "name": "noodl-editor",
"productName": "Noodl Editor", "productName": "Noodl Editor",
"description": "Low-code for when experience matter", "description": "Low-code for when experience matter",
"author": "Noodl <info@noodl.net>", "author": "Noodl <info@noodl.net>",
"homepage": "https://noodl.net", "homepage": "https://noodl.net",
"version": "1.0.0", "version": "1.0.1",
"main": "src/main/main.js", "main": "src/main/main.js",
"scripts": { "scripts": {
"build": "npx ts-node -P ./tsconfig.build.json ./scripts/build.ts", "build": "npx ts-node -P ./tsconfig.build.json ./scripts/build.ts",
@@ -15,7 +15,13 @@
"test:ci": "webpack-cli --config=webpackconfigs/webpack.test-ci.js && electron test.js" "test:ci": "webpack-cli --config=webpackconfigs/webpack.test-ci.js && electron test.js"
}, },
"build": { "build": {
"appId": "noodl.net.noodl", "appId": "noodl.net.noodl-editor",
"win": {
"target": "nsis"
},
"nsis": {
"guid": "noodl.net.noodl-editor"
},
"protocols": { "protocols": {
"name": "noodl", "name": "noodl",
"schemes": [ "schemes": [

View File

@@ -1,4 +1,4 @@
import { AppRouter } from "Noodl/src/editor/src/pages/AppRouter"; import { AppRouter } from "noodl-editor/src/editor/src/pages/AppRouter";
export class AppRoute { export class AppRoute {
constructor(public readonly router: AppRouter) {} constructor(public readonly router: AppRouter) {}

View File

@@ -7,6 +7,7 @@ import { verifyOpenAiApiKey } from '@noodl-models/AiAssistant/api';
import { PrimaryButton, PrimaryButtonSize, PrimaryButtonVariant } from '@noodl-core-ui/components/inputs/PrimaryButton'; import { PrimaryButton, PrimaryButtonSize, PrimaryButtonVariant } from '@noodl-core-ui/components/inputs/PrimaryButton';
import { Box } from '@noodl-core-ui/components/layout/Box'; import { Box } from '@noodl-core-ui/components/layout/Box';
import { VStack } from '@noodl-core-ui/components/layout/Stack'; import { VStack } from '@noodl-core-ui/components/layout/Stack';
import { PropertyPanelButton } from '@noodl-core-ui/components/property-panel/PropertyPanelButton';
import { PropertyPanelRow } from '@noodl-core-ui/components/property-panel/PropertyPanelInput'; import { PropertyPanelRow } from '@noodl-core-ui/components/property-panel/PropertyPanelInput';
import { PropertyPanelPasswordInput } from '@noodl-core-ui/components/property-panel/PropertyPanelPasswordInput'; import { PropertyPanelPasswordInput } from '@noodl-core-ui/components/property-panel/PropertyPanelPasswordInput';
import { PropertyPanelSelectInput } from '@noodl-core-ui/components/property-panel/PropertyPanelSelectInput'; import { PropertyPanelSelectInput } from '@noodl-core-ui/components/property-panel/PropertyPanelSelectInput';
@@ -31,14 +32,14 @@ export function OpenAiSection() {
const haveGpt4 = !!models['gpt-4']; const haveGpt4 = !!models['gpt-4'];
if (haveGpt4) { if (haveGpt4) {
OpenAiStore.setIsAiApiKeyVerified(true); OpenAiStore.setIsAiApiKeyVerified(true);
ToastLayer.showSuccess('Open AI, API Key is valid with GPT-4!'); ToastLayer.showSuccess('OpenAI API Key is valid with GPT-4!');
} else { } else {
OpenAiStore.setIsAiApiKeyVerified(false); OpenAiStore.setIsAiApiKeyVerified(false);
ToastLayer.showError('Open AI, API Key is missing gpt-4 model Support!'); ToastLayer.showError('OpenAI API Key is missing gpt-4 model Support!');
} }
} else { } else {
OpenAiStore.setIsAiApiKeyVerified(false); OpenAiStore.setIsAiApiKeyVerified(false);
ToastLayer.showError('Open AI, API Key is invalid!'); ToastLayer.showError('OpenAI API Key is invalid!');
} }
} }
@@ -95,6 +96,20 @@ export function OpenAiSection() {
}} }}
/> />
</PropertyPanelRow> </PropertyPanelRow>
<PropertyPanelRow label="API Key" isChanged={false}>
<PropertyPanelButton
properties={{
isPrimary: true,
buttonLabel: 'Verify API Key',
onClick() {
onVerifyApiKey();
}
}}
/>
</PropertyPanelRow>
<Box hasYSpacing>
<Text>Verify your OpenAI API key to start using AI Commands.</Text>
</Box>
</> </>
)} )}

View File

@@ -37,7 +37,7 @@ export function DeploySection() {
text="All these settings are temporary and will be moved to another place in a future version." text="All these settings are temporary and will be moved to another place in a future version."
/> />
<Box hasBottomSpacing> <Box hasBottomSpacing>
<Text>The Base Url will be automatically filled in when deploying to Noodl hosting.</Text> <Text>The Base Url.</Text>
</Box> </Box>
<PropertyPanelRow label="Custom Base Url"> <PropertyPanelRow label="Custom Base Url">
<PropertyPanelTextInput value={baseUrl} onChange={handleBaseUrl} /> <PropertyPanelTextInput value={baseUrl} onChange={handleBaseUrl} />

View File

@@ -324,6 +324,11 @@ export function GitStatusButton({ openGitSettingsPopout }: GitStatusButtonProps)
}); });
} else { } else {
ToastLayer.showError('Failed to push. ' + error); ToastLayer.showError('Failed to push. ' + error);
// If the error is a rejected push, we need to fetch again to get the latest state where we can pull and rebase
if (error?.toString().includes('rejected')) {
await fetchRemote();
}
} }
return; return;

View File

@@ -64,7 +64,7 @@ export function BaseWindow({
variant={variant === BaseWindowVariant.Shallow ? TitleBarVariant.Shallow : TitleBarVariant.Default} variant={variant === BaseWindowVariant.Shallow ? TitleBarVariant.Shallow : TitleBarVariant.Default}
version={platform.getVersionWithTag()} version={platform.getVersionWithTag()}
state={newVersionAvailable ? TitleBarState.UpdateAvailable : TitleBarState.Default} state={newVersionAvailable ? TitleBarState.UpdateAvailable : TitleBarState.Default}
isWindows={process.platform === 'win32'} isWindows={['win32', 'linux'].includes(process.platform)}
onMinimizeClicked={() => App.instance.minimize()} onMinimizeClicked={() => App.instance.minimize()}
onMaximizeClicked={() => App.instance.maximize()} onMaximizeClicked={() => App.instance.maximize()}
onCloseClicked={() => App.instance.close()} onCloseClicked={() => App.instance.close()}

View File

@@ -70,10 +70,10 @@ import { getCurrentPlatform } from '../helper';
// NOTE: Getting error "Cannot set properties of null (setting 'dev')" here, // NOTE: Getting error "Cannot set properties of null (setting 'dev')" here,
// It basically means that some package is not relative to this path. // It basically means that some package is not relative to this path.
console.log("--- Run 'npm install' ..."); console.log("--- Run 'npm install' ...");
execSync(`npm install --arch=${arch} --scope Noodl`, { execSync(`npm install --arch=${arch} --scope noodl-editor`, {
stdio: 'inherit', stdio: 'inherit',
env: process.env env: process.env
}); })
console.log("--- 'npm install' done!"); console.log("--- 'npm install' done!");
// NOTE: npm install --arch= does this too // NOTE: npm install --arch= does this too
@@ -89,7 +89,7 @@ import { getCurrentPlatform } from '../helper';
// Build: Replace "dugite" // Build: Replace "dugite"
// Build: Replace "desktop-trampoline" // Build: Replace "desktop-trampoline"
console.log("--- Run 'npm run build' ..."); console.log("--- Run 'npm run build' ...");
execSync('npx lerna exec --scope Noodl -- npm run build', { execSync('npx lerna exec --scope noodl-editor -- npm run build', {
stdio: 'inherit', stdio: 'inherit',
env: { env: {
...process.env, ...process.env,

View File

@@ -74,7 +74,7 @@ const cloudRuntimeProcess = attachStdio(
} }
); );
const editorProcess = attachStdio(exec('npx lerna exec --scope Noodl -- npm run start', processOptions), { const editorProcess = attachStdio(exec('npx lerna exec --scope noodl-editor -- npm run start', processOptions), {
prefix: 'Editor', prefix: 'Editor',
color: ConsoleColor.FgCyan color: ConsoleColor.FgCyan
}); });

View File

@@ -25,7 +25,7 @@ console.log(
); );
console.log("---"); console.log("---");
execSync("npx lerna exec --scope Noodl -- npm run test", { execSync("npx lerna exec --scope noodl-editor -- npm run test", {
cwd: CWD, cwd: CWD,
stdio: "inherit", stdio: "inherit",
env: { env: {