Vue.js 3 based frontend
This commit is contained in:
		| @@ -1,5 +1,17 @@ | |||||||
| ./node_modules | .kpt-pipeline/ | ||||||
| ./build | k8s/ | ||||||
| .git | skaffold.yaml | ||||||
| *.md | README.md | ||||||
| .gitignore | .git/ | ||||||
|  | node_modules/ | ||||||
|  |  | ||||||
|  | # Editor directories and files | ||||||
|  | .vscode/* | ||||||
|  | !.vscode/extensions.json | ||||||
|  | .idea | ||||||
|  | *.suo | ||||||
|  | *.ntvs* | ||||||
|  | *.njsproj | ||||||
|  | *.sln | ||||||
|  | *.sw? | ||||||
|  | *.kpt-pipeline | ||||||
|   | |||||||
| @@ -1,39 +1,9 @@ | |||||||
| # pull official base image | FROM node:16-alpine | ||||||
| FROM node AS builder |  | ||||||
|  |  | ||||||
| # set working directory |  | ||||||
| WORKDIR /app | WORKDIR /app | ||||||
|  | EXPOSE 8080 | ||||||
|  | CMD ["npm", "run", "dev"] | ||||||
|  |  | ||||||
|  | COPY package* ./ | ||||||
| # install app dependencies |  | ||||||
| #copies package.json and package-lock.json to Docker environment |  | ||||||
| COPY package.json ./ |  | ||||||
|  |  | ||||||
| # Installs all node packages |  | ||||||
| RUN npm install | RUN npm install | ||||||
|  | COPY . . | ||||||
|  |  | ||||||
| # Copies everything over to Docker environment |  | ||||||
| COPY . ./ |  | ||||||
| RUN npm run build |  | ||||||
|  |  | ||||||
| #Stage 2 |  | ||||||
| ####################################### |  | ||||||
| #pull the official nginx:1.19.0 base image |  | ||||||
| FROM nginx |  | ||||||
|  |  | ||||||
| #copies React to the container directory |  | ||||||
| # Set working directory to nginx resources directory |  | ||||||
| WORKDIR /usr/share/nginx/html |  | ||||||
| # Remove default nginx static resources |  | ||||||
| RUN rm -rf ./* |  | ||||||
| RUN apt-get install bash |  | ||||||
|  |  | ||||||
| # Copies configuration files |  | ||||||
| COPY ./default.conf /etc/nginx/conf.d/default.conf |  | ||||||
|  |  | ||||||
| # Copies static resources from builder stage |  | ||||||
| COPY --from=builder /app/build . |  | ||||||
|  |  | ||||||
| # Containers run nginx with global directives and daemon off |  | ||||||
| ENTRYPOINT ["nginx", "-g", "daemon off;"] |  | ||||||
|   | |||||||
| @@ -1,16 +0,0 @@ | |||||||
| server { |  | ||||||
|     listen       3003; |  | ||||||
|     server_name  localhost; |  | ||||||
|  |  | ||||||
|     location / { |  | ||||||
|         root   /usr/share/nginx/html; |  | ||||||
|         index  index.html index.htm; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     location /events { |  | ||||||
|         proxy_buffering off; |  | ||||||
|         proxy_pass http://127.0.0.1:3002/events; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| } |  | ||||||
							
								
								
									
										27233
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										27233
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,40 +1,25 @@ | |||||||
| { | { | ||||||
|   "name": "frontend", |   "name": "@k-space/log-viewer", | ||||||
|   "version": "0.1.0", |   "version": "0.0.0", | ||||||
|   "private": true, |  | ||||||
|   "dependencies": { |  | ||||||
|     "@testing-library/jest-dom": "^5.16.1", |  | ||||||
|     "@testing-library/react": "^12.1.2", |  | ||||||
|     "@testing-library/user-event": "^13.5.0", |  | ||||||
|     "react": "^17.0.2", |  | ||||||
|     "react-dom": "^17.0.2", |  | ||||||
|     "react-hooks-sse": "^2.0.0", |  | ||||||
|     "react-scripts": "5.0.0", |  | ||||||
|     "web-vitals": "^2.1.3" |  | ||||||
|   }, |  | ||||||
|   "scripts": { |   "scripts": { | ||||||
|     "start": "react-scripts start", |     "serve": "vue-cli-service serve", | ||||||
|     "build": "react-scripts build", |     "dev": "vite --port 8080 --host", | ||||||
|     "test": "react-scripts test", |     "build": "vite build", | ||||||
|     "eject": "react-scripts eject" |     "preview": "vite preview --port 3003" | ||||||
|   }, |   }, | ||||||
|   "proxy": "http://localhost:3002", |   "dependencies": { | ||||||
|   "eslintConfig": { |     "@ag-grid-community/core": "^28.2.0", | ||||||
|     "extends": [ |     "@vue/cli-service": "^5.0.8", | ||||||
|       "react-app", |     "ag-grid-vue3": "^28.2.0", | ||||||
|       "react-app/jest" |     "core-js": "^3.25.1", | ||||||
|     ] |     "event-hooks-webpack-plugin": "^2.2.0", | ||||||
|  |     "pinia": "^2.0.21", | ||||||
|  |     "single-spa-vue": "^2.5.1", | ||||||
|  |     "systemjs-webpack-interop": "^2.3.7", | ||||||
|  |     "vue": "^3.2.39" | ||||||
|   }, |   }, | ||||||
|   "browserslist": { |   "devDependencies": { | ||||||
|     "production": [ |     "@vitejs/plugin-vue": "^3.0.3", | ||||||
|       ">0.2%", |     "vite": "^3.0.9" | ||||||
|       "not dead", |  | ||||||
|       "not op_mini all" |  | ||||||
|     ], |  | ||||||
|     "development": [ |  | ||||||
|       "last 1 chrome version", |  | ||||||
|       "last 1 firefox version", |  | ||||||
|       "last 1 safari version" |  | ||||||
|     ] |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 4.2 KiB | 
| @@ -1,41 +0,0 @@ | |||||||
| <!DOCTYPE html> |  | ||||||
| <html lang="en"> |  | ||||||
|   <head> |  | ||||||
|     <meta charset="utf-8" /> |  | ||||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> |  | ||||||
|     <meta name="theme-color" content="#000000" /> |  | ||||||
|     <meta |  | ||||||
|       name="Event logging" |  | ||||||
|       content="Web site created using create-react-app" |  | ||||||
|     /> |  | ||||||
|     <!-- |  | ||||||
|       manifest.json provides metadata used when your web app is installed on a |  | ||||||
|       user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ |  | ||||||
|     --> |  | ||||||
|     <link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> |  | ||||||
|     <!-- |  | ||||||
|       Notice the use of %PUBLIC_URL% in the tags above. |  | ||||||
|       It will be replaced with the URL of the `public` folder during the build. |  | ||||||
|       Only files inside the `public` folder can be referenced from the HTML. |  | ||||||
|  |  | ||||||
|       Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will |  | ||||||
|       work correctly both with client-side routing and a non-root public URL. |  | ||||||
|       Learn how to configure a non-root public URL by running `npm run build`. |  | ||||||
|     --> |  | ||||||
|     <title>Event log</title> |  | ||||||
|   </head> |  | ||||||
|   <body> |  | ||||||
|     <noscript>You need to enable JavaScript to run this app.</noscript> |  | ||||||
|     <div id="root"></div> |  | ||||||
|     <!-- |  | ||||||
|       This HTML file is a template. |  | ||||||
|       If you open it directly in the browser, you will see an empty page. |  | ||||||
|  |  | ||||||
|       You can add webfonts, meta tags, or analytics to this file. |  | ||||||
|       The build step will place the bundled scripts into the <body> tag. |  | ||||||
|  |  | ||||||
|       To begin the development, run `npm start` or `yarn start`. |  | ||||||
|       To create a production bundle, use `npm run build` or `yarn build`. |  | ||||||
|     --> |  | ||||||
|   </body> |  | ||||||
| </html> |  | ||||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 5.2 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 9.4 KiB | 
| @@ -1,25 +0,0 @@ | |||||||
| { |  | ||||||
|   "short_name": "React App", |  | ||||||
|   "name": "Create React App Sample", |  | ||||||
|   "icons": [ |  | ||||||
|     { |  | ||||||
|       "src": "favicon.ico", |  | ||||||
|       "sizes": "64x64 32x32 24x24 16x16", |  | ||||||
|       "type": "image/x-icon" |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|       "src": "logo192.png", |  | ||||||
|       "type": "image/png", |  | ||||||
|       "sizes": "192x192" |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|       "src": "logo512.png", |  | ||||||
|       "type": "image/png", |  | ||||||
|       "sizes": "512x512" |  | ||||||
|     } |  | ||||||
|   ], |  | ||||||
|   "start_url": ".", |  | ||||||
|   "display": "standalone", |  | ||||||
|   "theme_color": "#000000", |  | ||||||
|   "background_color": "#ffffff" |  | ||||||
| } |  | ||||||
| @@ -1,3 +0,0 @@ | |||||||
| # https://www.robotstxt.org/robotstxt.html |  | ||||||
| User-agent: * |  | ||||||
| Disallow: |  | ||||||
| @@ -1,3 +0,0 @@ | |||||||
| body { |  | ||||||
|     background-color: #eafaf9; |  | ||||||
| } |  | ||||||
| @@ -1,47 +0,0 @@ | |||||||
| import React, { useState, useEffect } from 'react'; |  | ||||||
| import { useSSE, SSEProvider } from 'react-hooks-sse'; |  | ||||||
| import './App.css'; |  | ||||||
| import EventList from '../eventList/EventList.js'; |  | ||||||
|  |  | ||||||
|  |  | ||||||
| import './App.css'; |  | ||||||
|  |  | ||||||
|  |  | ||||||
| const Component = () => { |  | ||||||
|   const event = useSSE('log-entry') |  | ||||||
|   const [events, setEvents] = useState([]) |  | ||||||
|  |  | ||||||
|   useEffect(() =>{ |  | ||||||
|     console.info(event); |  | ||||||
|     if (event) { |  | ||||||
|         for (var j = 0; j < events.length; j++) { |  | ||||||
|             if (events[j].timestamp <= event.timestamp) { |  | ||||||
|                 if (events[j]._id == event._id) { |  | ||||||
|                     setEvents([...events.slice(0, j), event, ...events.slice(j+1)]); |  | ||||||
|                     return; |  | ||||||
|                 } else { |  | ||||||
|                     setEvents([...events.slice(0, j), event, ...events.slice(j)]); |  | ||||||
|                     return; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         setEvents([event, ...events]); |  | ||||||
|     } |  | ||||||
|   }, [event]) |  | ||||||
|   return <EventList data={events} /> |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function App() { |  | ||||||
|   return ( |  | ||||||
|  |  | ||||||
|     <SSEProvider endpoint="/events" > |  | ||||||
|         <Component /> |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     </SSEProvider> |  | ||||||
|  |  | ||||||
|   ) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| export default App; |  | ||||||
| @@ -1,18 +0,0 @@ | |||||||
| .eventDiv { |  | ||||||
|     background-color: aliceblue; |  | ||||||
|     border: 2px solid #26A69A; |  | ||||||
|     border-radius: 15px; |  | ||||||
|     text-align: left; |  | ||||||
|     padding: 5px; |  | ||||||
|     max-width: fit-content; |  | ||||||
|     font-family: apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif; |  | ||||||
|     color: #092a26;  |  | ||||||
|     margin: 7px 0px; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .eventPic { |  | ||||||
|     border-radius: 15px; |  | ||||||
|     border: 1px groove #d5f6f2; |  | ||||||
|     max-width:100%; |  | ||||||
|     max-height:100%; |  | ||||||
| } |  | ||||||
| @@ -1,23 +0,0 @@ | |||||||
| import React from "react"; |  | ||||||
| import "./Event.css"; |  | ||||||
|  |  | ||||||
| function Event(props) { |  | ||||||
|  |  | ||||||
|     let imgArray = []; |  | ||||||
|  |  | ||||||
|     if (props.data.hasOwnProperty('screenshots')) { |  | ||||||
|         props.data.screenshots.forEach(element => { |  | ||||||
|             imgArray = [...imgArray, (<a href={element.orig} target="_blank"><img src={element.url} className="eventPic"></img></a>)] |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return ( |  | ||||||
|         <div className="eventDiv"> |  | ||||||
|             {JSON.stringify(props.data.source)} |  | ||||||
|             <br></br> |  | ||||||
|             {[...imgArray]} |  | ||||||
|         </div> |  | ||||||
|     ); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| export default Event; |  | ||||||
| @@ -1,11 +0,0 @@ | |||||||
| .eventListUl { |  | ||||||
|     background-color: #c1f1ec; |  | ||||||
|     max-width: 75%; |  | ||||||
|     padding: 5px; |  | ||||||
|     border: 5px solid #26A69A; |  | ||||||
|     border-radius: 5px;  |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .eventListLi { |  | ||||||
|     list-style: none; |  | ||||||
| } |  | ||||||
| @@ -1,15 +0,0 @@ | |||||||
| import React from 'react'; |  | ||||||
| import Event from '../event/Event.js'; |  | ||||||
| import './EventList.css'; |  | ||||||
|  |  | ||||||
| function EventList(props) { |  | ||||||
|     return ( |  | ||||||
|         <ul className="eventListUl"> |  | ||||||
|             {props.data.map((event) => { |  | ||||||
|                 return <li className="eventListLi"><Event data={event} /></li> |  | ||||||
|             })} |  | ||||||
|         </ul> |  | ||||||
|     ) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| export default EventList; |  | ||||||
| @@ -1,3 +0,0 @@ | |||||||
| body { |  | ||||||
|  |  | ||||||
| } |  | ||||||
| @@ -1,17 +0,0 @@ | |||||||
| import React from 'react'; |  | ||||||
| import ReactDOM from 'react-dom'; |  | ||||||
| import './index.css'; |  | ||||||
| import App from './components/app/App.js'; |  | ||||||
| import reportWebVitals from './reportWebVitals'; |  | ||||||
|  |  | ||||||
| ReactDOM.render( |  | ||||||
|   <React.StrictMode> |  | ||||||
|     <App /> |  | ||||||
|   </React.StrictMode>, |  | ||||||
|   document.getElementById('root') |  | ||||||
| ); |  | ||||||
|  |  | ||||||
| // If you want to start measuring performance in your app, pass a function |  | ||||||
| // to log results (for example: reportWebVitals(console.log)) |  | ||||||
| // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals |  | ||||||
| reportWebVitals(); |  | ||||||
| @@ -1,13 +0,0 @@ | |||||||
| const reportWebVitals = onPerfEntry => { |  | ||||||
|   if (onPerfEntry && onPerfEntry instanceof Function) { |  | ||||||
|     import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { |  | ||||||
|       getCLS(onPerfEntry); |  | ||||||
|       getFID(onPerfEntry); |  | ||||||
|       getFCP(onPerfEntry); |  | ||||||
|       getLCP(onPerfEntry); |  | ||||||
|       getTTFB(onPerfEntry); |  | ||||||
|     }); |  | ||||||
|   } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| export default reportWebVitals; |  | ||||||
| @@ -1,5 +0,0 @@ | |||||||
| // jest-dom adds custom jest matchers for asserting on DOM nodes. |  | ||||||
| // allows you to do things like: |  | ||||||
| // expect(element).toHaveTextContent(/react/i) |  | ||||||
| // learn more: https://github.com/testing-library/jest-dom |  | ||||||
| import '@testing-library/jest-dom'; |  | ||||||
		Reference in New Issue
	
	Block a user