Просмотр исходного кода

Merge branch 'agile' of https://github.com/visuddhinanda/mint into agile

visuddhinanda 3 лет назад
Родитель
Сommit
aed4c78d32

+ 15 - 11
dashboard/package.json

@@ -4,26 +4,28 @@
   "private": true,
   "dependencies": {
     "@ant-design/charts": "^1.4.2",
-    "@ant-design/pro-components": "^2.3.25",
+    "@ant-design/pro-components": "^2.3.29",
     "@fortawesome/fontawesome-free": "^6.2.0",
-    "@reduxjs/toolkit": "^1.8.6",
+    "@reduxjs/toolkit": "^1.9.0",
     "@testing-library/jest-dom": "^5.14.1",
     "@testing-library/react": "^13.0.0",
     "@testing-library/user-event": "^13.2.1",
     "@types/google-protobuf": "^3.15.6",
     "@types/jest": "^27.0.1",
     "@types/js-cookie": "^3.0.2",
+    "@types/lodash": "^4.14.188",
+    "@types/marked": "^4.0.7",
     "@types/node": "^16.7.13",
     "@types/react": "^18.0.0",
     "@types/react-big-calendar": "^0.38.2",
     "@types/react-color": "^3.0.6",
     "@types/react-copy-to-clipboard": "^5.0.4",
     "@types/react-dom": "^18.0.0",
-    "@types/react-pdf": "^5.7.2",
-    "@uiw/react-md-editor": "^3.19.1",
-    "antd": "^4.23.6",
+    "@types/react-pdf": "^5.7.4",
+    "@uiw/react-md-editor": "^3.19.5",
+    "antd": "^4.24.1",
     "dayjs": "^1.11.6",
-    "dinero.js": "^2.0.0-alpha.8",
+    "dinero.js": "^2.0.0-alpha.9",
     "emoji-mart": "^5.2.2",
     "famfamfam-flags": "^1.0.0",
     "famfamfam-mini": "^1.0.0",
@@ -31,9 +33,11 @@
     "filesize": "^10.0.5",
     "google-map-react": "^2.2.0",
     "google-protobuf": "^3.21.2",
-    "grpc-web": "^1.4.1",
+    "grpc-web": "^1.4.2",
     "js-cookie": "^3.0.1",
     "jwt-decode": "^3.1.2",
+    "lodash": "^4.17.21",
+    "marked": "^4.2.2",
     "qrcode.react": "^3.1.0",
     "react": "^18.2.0",
     "react-big-calendar": "^1.5.0",
@@ -43,17 +47,17 @@
     "react-draggable": "^4.4.5",
     "react-dropzone": "^14.2.3",
     "react-highlight-words": "^0.18.0",
-    "react-hook-form": "^7.38.0",
+    "react-hook-form": "^7.39.1",
     "react-image-crop": "^10.0.8",
     "react-intl": "^6.2.1",
     "react-json-view": "^1.21.3",
     "react-markdown": "^8.0.3",
-    "react-number-format": "^5.1.0",
+    "react-number-format": "^5.1.1",
     "react-pdf": "^5.7.2",
     "react-player": "^2.11.0",
     "react-quill": "^2.0.0",
-    "react-redux": "^8.0.4",
-    "react-router-dom": "^6.4.2",
+    "react-redux": "^8.0.5",
+    "react-router-dom": "^6.4.3",
     "react-scripts": "5.0.1",
     "react-sparklines": "^1.7.0",
     "react-syntax-highlighter": "^15.5.0",

+ 38 - 13
dashboard/src/load.ts

@@ -4,7 +4,7 @@
 import { get as getToken, IUser, signIn } from "./reducers/current-user";
 //import { DURATION } from "./reducers/current-user";
 import { ISite, refresh as refreshLayout } from "./reducers/layout";
-import { get } from "./request";
+import { get, IErrorResponse } from "./request";
 //import { GRPC_HOST,  grpc_metadata } from "./request";
 import store from "./store";
 
@@ -13,22 +13,47 @@ interface IUserResponse {
 	message: string;
 	data: IUser;
 }
+
+export interface ISiteInfoResponse {
+	title: string;
+}
+export interface ITokenRefreshResponse {
+	realName: string;
+	token: string;
+}
+
 const init = () => {
-	console.log("onload");
-	// ajax get site information, SEE reducers/layout/ISite
-	get("/v2/siteinfo/en").then((json) => {
-		store.dispatch(refreshLayout(json as ISite));
-	});
+	get<ISiteInfoResponse | IErrorResponse>("/v2/siteinfo/en").then(
+		(response) => {
+			if ("title" in response) {
+				const it: ISite = {
+					title: response.title,
+					subhead: "",
+					keywords: [],
+					description: "",
+					copyright: "",
+					logo: "",
+					author: { name: "", email: "" },
+				};
+				store.dispatch(refreshLayout(it));
+			}
+		}
+	);
 	const token = getToken();
 	if (token) {
-		// get current user profile & new token, SEE reducers/current-user/IUser
-		get<IUserResponse>("/v2/auth/current").then((user) => {
-			if (user.ok) {
-				store.dispatch(signIn([user.data, token ? token : ""]));
-			} else {
-				console.error(user.message);
+		get<ITokenRefreshResponse | IErrorResponse>("/v2/auth/current").then(
+			(response) => {
+				if ("realName" in response) {
+					const it: IUser = {
+						nickName: "who-am-i",
+						realName: "Change me",
+						avatar: "/my.png",
+						roles: [],
+					};
+					store.dispatch(signIn([it, response.token]));
+				}
 			}
-		});
+		);
 	} else {
 		console.log("no token");
 	}

+ 60 - 20
dashboard/src/pages/nut/index.tsx

@@ -1,29 +1,69 @@
-import { Tag } from "antd";
+import { useState } from "react";
+import { Tag, Space, Button } from "antd";
+import lodash from "lodash";
+import { marked } from "marked";
+
 import FooterBar from "../../components/library/FooterBar";
 
 import HeadBar from "../../components/library/HeadBar";
 import Home from "../../components/nut/Home";
 
+interface IRandomPanel {
+  v1: string;
+  v2: string;
+}
+
 const Widget = () => {
-	return (
-		<div>
-			<HeadBar />
-			<div>Home Page</div>
-			<div>
-				<Tag
-					onClick={() => {
-						console.log("test tag was clicked");
-					}}
-				>
-					Test
-				</Tag>
-			</div>
-			<div>
-				<Home />
-			</div>
-			<FooterBar />
-		</div>
-	);
+  const [rdp, setRdp] = useState<IRandomPanel>({
+    v1: "",
+    v2: "",
+  });
+  return (
+    <div>
+      <HeadBar />
+      <div
+        dangerouslySetInnerHTML={{
+          __html: marked.parse("- [Google](https://www.google.com)"),
+        }}
+      ></div>
+      <div>Home Page</div>
+      <div>
+        <h1>random</h1>
+        <Space style={{ color: "red" }}>{rdp.v1}</Space>
+        &nbsp;
+        <Space style={{ color: "green" }}>{rdp.v2}</Space>
+        &nbsp;
+        <Button
+          onClick={() => {
+            setRdp({
+              v1: Array.from(Array(20), () =>
+                Math.floor(Math.random() * 36).toString(36)
+              ).join(""),
+              v2: lodash
+                .times(20, () => lodash.random(35).toString(36))
+                .join(""),
+            });
+          }}
+        >
+          Generate
+        </Button>
+      </div>
+      <br />
+      <div>
+        <Tag
+          onClick={() => {
+            console.log("test tag was clicked");
+          }}
+        >
+          Test
+        </Tag>
+      </div>
+      <div>
+        <Home />
+      </div>
+      <FooterBar />
+    </div>
+  );
 };
 
 export default Widget;

+ 14 - 0
dashboard/src/request.ts

@@ -3,6 +3,20 @@ import { get as getLocale } from "./locales";
 
 import { get as getToken } from "./reducers/current-user";
 
+export interface IOkResponse {
+  createdAt: Date;
+}
+
+export type IErrorResponse = I422Response | I500Response;
+
+export interface I422Response {
+  errors: string[];
+}
+export interface I500Response {
+  code: number;
+  message: string;
+}
+
 export const backend = (u: string) => `${API_HOST}/api${u}`;
 
 export const GRPC_HOST: string =

+ 1 - 1
docker/jammy/Dockerfile

@@ -23,7 +23,7 @@ RUN apt -y install zsh git locales locales-all rsync openssh-client sshpass \
     vim tzdata pwgen zip unzip tree tmux dialog \
     net-tools dnsutils net-tools iputils-arping iputils-ping telnet \
     imagemagick ffmpeg fonts-dejavu-extra texlive-full \
-    build-essential cmake pkg-config libtool automake autoconf binutils cpio mold \
+    build-essential cmake pkg-config libtool automake autoconf autoconf-archive binutils cpio mold \
     debhelper bison flex ninja-build \
     musl-tools musl-dev \
     crossbuild-essential-armhf crossbuild-essential-arm64 \

+ 1 - 1
docker/jammy/etc/envoy.yaml

@@ -31,7 +31,7 @@ static_resources:
                         allow_origin_string_match:
                           - prefix: "*"
                         allow_methods: GET, PUT, DELETE, POST, OPTIONS
-                        allow_headers: keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,custom-header-1,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout
+                        allow_headers: accept-language,authorization,keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,custom-header-1,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout
                         max_age: "1728000"
                         expose_headers: custom-header-1,grpc-status,grpc-message
                 http_filters: