From 1014638fd76cbd259e77fd7ea97d63049245a700 Mon Sep 17 00:00:00 2001 From: Daniel <you@example.com> Date: Fri, 13 Sep 2024 20:55:28 +0200 Subject: [PATCH] testing --- .gitlab-ci.yml | 4 - Dockerfile | 7 +- docker-compose.yml | 2 +- index.html | 2 +- package-lock.json | 288 +++++++++++++++++++++++++++++++++++++- package.json | 5 +- src/BubbleSort.jsx | 23 --- src/SortingVisualizer.css | 165 ---------------------- src/SortingVisualizer.jsx | 154 -------------------- src/app/page.jsx | 13 ++ src/main.jsx | 10 -- 11 files changed, 305 insertions(+), 368 deletions(-) delete mode 100644 src/BubbleSort.jsx delete mode 100644 src/SortingVisualizer.css delete mode 100644 src/SortingVisualizer.jsx create mode 100644 src/app/page.jsx delete mode 100644 src/main.jsx diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fcb9d41..7051ad0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,7 +10,3 @@ pages: paths: # The folder that contains the files to be exposed at the Page URL - public - rules: - # This ensures that only pushes to the default branch will trigger - # a pages deploy - - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH diff --git a/Dockerfile b/Dockerfile index c97b2e1..f08269e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,11 +13,12 @@ RUN npm install RUN rm -rf src/App.css src/App.jsx src/assets src/index.css COPY src src/ -COPY index.html . -COPY vite.config.js . +#COPY index.html . +#COPY vite.config.js . +COPY next.config.mjs . # port 5173 EXPOSE 5173 #Start -CMD ["npm", "run", "dev", "--", "--host"] +CMD ["npm", "run", "dev"] diff --git a/docker-compose.yml b/docker-compose.yml index ba7c89f..cec3e4d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,7 @@ services: image: sorting-visualizer container_name: Sorting-Visualizer ports: - - 127.0.0.1:5173:5173 + - 127.0.0.1:3000:3000 volumes: - ./src/:/app/sorting-visualizer/src/ - ./package-lock.json:/app/sorting-visualizer/package-lock.json diff --git a/index.html b/index.html index b518fee..be86395 100644 --- a/index.html +++ b/index.html @@ -8,6 +8,6 @@ </head> <body> <div id="root"></div> - <script type="module" src="/src/main.jsx"></script> + <script type="module" src="/src/app/page.jsx"></script> </body> </html> diff --git a/package-lock.json b/package-lock.json index 6354186..0567b01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.0", "dependencies": { "bootstrap": "^5.3.3", + "next": "^14.2.11", "react": "^18.3.1", "react-bootstrap": "^2.10.4", "react-bootstrap-range-slider": "^3.0.8", @@ -899,6 +900,146 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@next/env": { + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.11.tgz", + "integrity": "sha512-HYsQRSIXwiNqvzzYThrBwq6RhXo3E0n8j8nQnAs8i4fCEo2Zf/3eS0IiRA8XnRg9Ha0YnpkyJZIZg1qEwemrHw==" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.11.tgz", + "integrity": "sha512-eiY9u7wEJZWp/Pga07Qy3ZmNEfALmmSS1HtsJF3y1QEyaExu7boENz11fWqDmZ3uvcyAxCMhTrA1jfVxITQW8g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.11.tgz", + "integrity": "sha512-lnB0zYCld4yE0IX3ANrVMmtAbziBb7MYekcmR6iE9bujmgERl6+FK+b0MBq0pl304lYe7zO4yxJus9H/Af8jbg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.11.tgz", + "integrity": "sha512-Ulo9TZVocYmUAtzvZ7FfldtwUoQY0+9z3BiXZCLSUwU2bp7GqHA7/bqrfsArDlUb2xeGwn3ZuBbKtNK8TR0A8w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.11.tgz", + "integrity": "sha512-fH377DnKGyUnkWlmUpFF1T90m0dADBfK11dF8sOQkiELF9M+YwDRCGe8ZyDzvQcUd20Rr5U7vpZRrAxKwd3Rzg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.11.tgz", + "integrity": "sha512-a0TH4ZZp4NS0LgXP/488kgvWelNpwfgGTUCDXVhPGH6pInb7yIYNgM4kmNWOxBFt+TIuOH6Pi9NnGG4XWFUyXQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.11.tgz", + "integrity": "sha512-DYYZcO4Uir2gZxA4D2JcOAKVs8ZxbOFYPpXSVIgeoQbREbeEHxysVsg3nY4FrQy51e5opxt5mOHl/LzIyZBoKA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.11.tgz", + "integrity": "sha512-PwqHeKG3/kKfPpM6of1B9UJ+Er6ySUy59PeFu0Un0LBzJTRKKAg2V6J60Yqzp99m55mLa+YTbU6xj61ImTv9mg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.11.tgz", + "integrity": "sha512-0U7PWMnOYIvM74GY6rbH6w7v+vNPDVH1gUhlwHpfInJnNe5LkmUZqhp7FNWeNa5wbVgRcRi1F1cyxp4dmeLLvA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.11.tgz", + "integrity": "sha512-gQpS7mcgovWoaTG1FbS5/ojF7CGfql1Q0ZLsMrhcsi2Sr9HEqsUZ70MPJyaYBXbk6iEAP7UXMD9HC8KY1qNwvA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1204,6 +1345,11 @@ "win32" ] }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", @@ -1589,6 +1735,17 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -1621,7 +1778,6 @@ "version": "1.0.30001658", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001658.tgz", "integrity": "sha512-N2YVqWbJELVdrnsW5p+apoQyYt51aBMSsBZki1XZEfeBCexcM/sf4xiAHcXQBkuOwJBXtWF7aW1sYX6tKebPHw==", - "dev": true, "funding": [ { "type": "opencollective", @@ -1656,6 +1812,11 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -2570,6 +2731,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -3231,7 +3397,6 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, "funding": [ { "type": "github", @@ -3251,6 +3416,91 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/next": { + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.11.tgz", + "integrity": "sha512-8MDFqHBhdmR2wdfaWc8+lW3A/hppFe1ggQ9vgIu/g2/2QEMYJrPoQP6b+VNk56gIug/bStysAmrpUKtj3XN8Bw==", + "dependencies": { + "@next/env": "14.2.11", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.2.11", + "@next/swc-darwin-x64": "14.2.11", + "@next/swc-linux-arm64-gnu": "14.2.11", + "@next/swc-linux-arm64-musl": "14.2.11", + "@next/swc-linux-x64-gnu": "14.2.11", + "@next/swc-linux-x64-musl": "14.2.11", + "@next/swc-win32-arm64-msvc": "14.2.11", + "@next/swc-win32-ia32-msvc": "14.2.11", + "@next/swc-win32-x64-msvc": "14.2.11" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/@swc/helpers": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "dependencies": { + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", @@ -3439,8 +3689,7 @@ "node_modules/picocolors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" }, "node_modules/possible-typed-array-names": { "version": "1.0.0", @@ -3904,11 +4153,18 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", @@ -4018,6 +4274,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", diff --git a/package.json b/package.json index 0c3679e..ba6aa9a 100644 --- a/package.json +++ b/package.json @@ -5,13 +5,14 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "vite", - "build": "vite build", + "dev": "next dev", + "build": "next build", "lint": "eslint .", "preview": "vite preview" }, "dependencies": { "bootstrap": "^5.3.3", + "next": "^14.2.11", "react": "^18.3.1", "react-bootstrap": "^2.10.4", "react-bootstrap-range-slider": "^3.0.8", diff --git a/src/BubbleSort.jsx b/src/BubbleSort.jsx deleted file mode 100644 index 03b4c9d..0000000 --- a/src/BubbleSort.jsx +++ /dev/null @@ -1,23 +0,0 @@ -async function BubbleSort(EingangsArray, updateBars, setColor, sortSpeed){ - const len = EingangsArray.length; - for(let i = 0; i< len -1; ++i){ - for(let k=0; k< len -1-i; k++){ - let tmp; - - if (k == len -2-i){ - setColor([(len-1-i)]); - } - if(EingangsArray[k] > EingangsArray[k+1]){ - tmp = EingangsArray[k]; - EingangsArray[k] = EingangsArray[k+1]; - EingangsArray[k+1] = tmp; - } - updateBars([...EingangsArray]); - await new Promise(resolve => setTimeout(resolve, sortSpeed)); // Pause für Animation - } - } - setColor([(len-len)]); - console.log(EingangsArray); - return EingangsArray; -} -export default BubbleSort; \ No newline at end of file diff --git a/src/SortingVisualizer.css b/src/SortingVisualizer.css deleted file mode 100644 index 4d120a8..0000000 --- a/src/SortingVisualizer.css +++ /dev/null @@ -1,165 +0,0 @@ -body { - margin: 0; -} - -.Container { - display: flex; - flex-direction: column; - align-items: center; -} - - -.bar { - background-color: blue; - display: inline-block; - height: 100px; - flex: 1 1 20px; - min-width: 2px; -} - -.sorted { - background-color: deeppink; - animation: ScaleAnimation 0.5s ease-in-out; - -} - -.finished { - background-color: lawngreen; - flex: 1 1 20px; - min-width: 2px; - margin: 2px; - display: inline-block; - animation: GreenScaleAnimation 1s ease-in; - -} - -.range-slider { - padding: 0px; -} - -#ToolBar { - height: 50px; - width: 100%; - background: #34495e; - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - -} - -#startButton { - height: 78%; - width: 85px; - font-size: 12px; - margin: 10px; - background: #1abc9c; - text-align: center; - display: grid; - place-items: center; - border-radius: 5px; - border: none; - color: white; - font-size: 14px; - font-family: Arial, sans-serif; - font-weight: bold; - -} - -button:active { - box-shadow: inset 0 2px 5px rgba(0, 0, 0, 0.46); - transform: translateY(2px); -} - -.Label { - margin: 10px; - font-size: 15px; - font-family: Arial, sans-serif; - font-weight: bold; - color: white; -} - -.DivArray { - transform: scaleY(-1); - display: flex; - flex-wrap: nowrap; - justify-content: center; - gap: 2px; - width: 90%; - margin-top: 5px; -} - -#dropdown-menu { - background-color: #34495e; - border: none; - border-radius: 5px; - margin-top: 3px; -} - - -#dropdown-item { - color: white; - font-size: 16px; - font-weight: normal; - border-radius: 5px; -} - -#dropdown-item:hover { - background-color: #1abc9c; - color: white; -} - -#dropdown { - background: none; - border: none; - border-radius: 0px; - color: white; - fontSize: 14px; - fontWeight: normal; - padding: 0; - height: 100%; - display: flex; - alignItems: center; - place-items: center; - margin-inline: 10px; - width: 190px; -} - -#dropdown:hover { - color: #1abc9c; -} - -#dropdown:active { - box-shadow: none; - transform: none; -} - -#dropdown.show { - background-color: #1abc9c; - color: white; -} - - -@keyframes ScaleAnimation { - 0% { - transform: scale(1); - } - 50% { - transform: scale(1.05); - } - 100% { - transform: scale(1); - } -} - -@keyframes GreenScaleAnimation { - 0% { - transform: scale(1); - } - 50% { - transform: scale(1.1); - } - 100% { - transform: scale(1); - } -} diff --git a/src/SortingVisualizer.jsx b/src/SortingVisualizer.jsx deleted file mode 100644 index 9f44b26..0000000 --- a/src/SortingVisualizer.jsx +++ /dev/null @@ -1,154 +0,0 @@ -import {useState, useEffect} from 'react'; -import './SortingVisualizer.css' -import BubbleSort from "./BubbleSort"; -import RangeSlider from 'react-bootstrap-range-slider'; -import 'react-bootstrap-range-slider/dist/react-bootstrap-range-slider.css'; -import {Dropdown} from 'react-bootstrap'; -import 'bootstrap/dist/css/bootstrap.min.css'; - -function SortingVisualizer() { - - const moduloFive = ((window.innerWidth / 45)).toFixed(0) % 5; - const monitorSize = (window.innerWidth / 45).toFixed(0) - moduloFive; - const [BarNumber, setBarNumber] = useState(() => monitorSize > 100 ? 100 : monitorSize); // max of 100 bars - const [bars, setbars] = useState(() => generateArray(BarNumber)); - const [sorting, setSorting] = useState(false); - const [alreadySorted, setAlreadySorted] = useState(); - const [isSorted, setIsSorted] = useState(false); - const [sortSpeed, setSortSpeed] = useState('40'); - - const SliderWithInputFormControl = () => { - const [sliderValue_intern, setSliderValue_intern] = useState(BarNumber); - return ( - <RangeSlider - value={sliderValue_intern} - step={5} - max={100} - min={5} - disabled={sorting} - onChange={changeEvent => setSliderValue_intern(Number(changeEvent.target.value))} - onAfterChange={() => setBarNumber(sliderValue_intern)} - /> - ); - }; - - useEffect(() => { - resetBars(); - }, [BarNumber]); - - function getRandomArbitrary(min, max) { - return Math.floor(Math.random() * (max - min + 1)) + min; - } - - function generateArray(numberBars) { - return Array.from({length: numberBars}, () => getRandomArbitrary(50, 300)); - } - - async function handleSorting() { - if (sorting) return; - setSorting(true); - await BubbleSort(bars, setbars, setAlreadySorted, sortSpeed); - setSorting(false); - } - - function resetBars() { - setAlreadySorted(1000); - setbars(generateArray(BarNumber)); - let ColoredBars = document.getElementsByClassName('sorted'); - document.getElementById('startButton').innerText = 'Sort!'; - while (ColoredBars.length > 0) { - ColoredBars[0].className = 'bar'; - } - setIsSorted(false); - - - } - - function finishAnimation() { - let ColoredBars = document.getElementsByClassName('sorted'); - while (ColoredBars.length > 0) { - ColoredBars[0].className = 'finished'; - } - } - - function handleButton() { - if (!sorting && !isSorted) { - setAlreadySorted(1000); - handleSorting(); - } else if (isSorted) { - resetBars(); - - } - } - - useEffect(() => { - if (alreadySorted == 0) { - setIsSorted(true); - finishAnimation(); - document.getElementById('startButton').innerText = 'Reset!'; - } - }, [alreadySorted]); - - - return ( - <> - <div className='Container'> - <div id='ToolBar'> - <div className="Label">How many bars?</div> - <SliderWithInputFormControl style={{className: 'range-slider'}}/> - <input type='number' max={100} min={0} disabled={sorting} - onChange={changeEvent => { - let value = Number(changeEvent.target.value); - if (value > 100) value = 100; - if (value < 5) value = 5; - setBarNumber(value); - }} defaultValue={BarNumber} - value={BarNumber} style={{ - width: '42px', - margin: '10px', - borderRadius: '5px', - border: 'none', - textAlign: 'center' - }}/> - <div style={{background: 'gray', height: '70%', marginLeft: '10px', width: '2px'}}></div> - <Dropdown id="dropdown"> - <Dropdown.Toggle - id="dropdown" - disabled={sorting} - > - Sorting-Speed: { - { - 100: 'Slow', - 40: 'Medium', - 0: 'Fast' - }[sortSpeed] || '' - } - </Dropdown.Toggle> - <Dropdown.Menu id="dropdown-menu"> - <Dropdown.Item id="dropdown-item" onClick={() => setSortSpeed(100)}> - Slow - </Dropdown.Item> - <Dropdown.Item id="dropdown-item" onClick={() => setSortSpeed(40)}> - Medium - </Dropdown.Item> - <Dropdown.Item id="dropdown-item" onClick={() => setSortSpeed(0)}> - Fast - </Dropdown.Item> - </Dropdown.Menu> - </Dropdown> - <button id='startButton' className="Button" disabled={sorting} - style={{background: `${sorting ? 'red' : ''}`}} onClick={() => { - handleButton() - }}>{sorting ? 'Sorting...' : 'Sort!'}</button> - </div> - <div className='DivArray'> - {bars.map((height, index) => (<div key={index} data-key={index} - className={`bar + ${alreadySorted <= index ? 'sorted' : ''}`} - style={{height: `${height}px`}}></div>))} - </div> - - </div> - </> - ) -}; -export default SortingVisualizer; \ No newline at end of file diff --git a/src/app/page.jsx b/src/app/page.jsx new file mode 100644 index 0000000..5aae9c6 --- /dev/null +++ b/src/app/page.jsx @@ -0,0 +1,13 @@ +import SortingVisualizer from '../components/SortingVisualizer.jsx' +import Head from "next/head"; + +export default function Home() { + return ( + <main> + <Head> + <link rel="icon" href="/src/styles/favicon.ico" /> + </Head> + <SortingVisualizer /> + </main> + ) +} diff --git a/src/main.jsx b/src/main.jsx deleted file mode 100644 index f6f78d4..0000000 --- a/src/main.jsx +++ /dev/null @@ -1,10 +0,0 @@ -import {StrictMode} from 'react' -import {createRoot} from 'react-dom/client' -import SortingVisualizer from './SortingVisualizer.jsx' - - -createRoot(document.getElementById('root')).render( - <StrictMode> - <SortingVisualizer/> - </StrictMode>, -) \ No newline at end of file -- GitLab