Browse Source

feat: 添加一个react版本的前端

pull/1117/head
ksdaylight 10 months ago
parent
commit
47618b3d92
  1. 4
      apps/react-admin/.dockerignore
  2. 1
      apps/react-admin/.env
  3. 12
      apps/react-admin/.env.development
  4. 3
      apps/react-admin/.env.production
  5. 28
      apps/react-admin/.gitignore
  6. 7
      apps/react-admin/.vscode/extensions.json
  7. 35
      apps/react-admin/.vscode/settings.json
  8. 24
      apps/react-admin/Dockerfile
  9. 21
      apps/react-admin/LICENSE
  10. 132
      apps/react-admin/README.md
  11. 131
      apps/react-admin/README.zh-CN.md
  12. 44
      apps/react-admin/biome.json
  13. 7
      apps/react-admin/docker-compose.yaml
  14. 13
      apps/react-admin/index.html
  15. 26
      apps/react-admin/lefthook.yml
  16. 18
      apps/react-admin/openapi-ts.config.ts
  17. 117
      apps/react-admin/package.json
  18. 8
      apps/react-admin/postcss.config.js
  19. 295
      apps/react-admin/public/mockServiceWorker.js
  20. 44
      apps/react-admin/src/App.tsx
  21. 610
      apps/react-admin/src/_mock/assets.js
  22. 9
      apps/react-admin/src/_mock/handlers/_demo.js
  23. 14
      apps/react-admin/src/_mock/handlers/_org.js
  24. 46
      apps/react-admin/src/_mock/handlers/_user.js
  25. 10
      apps/react-admin/src/_mock/index.js
  26. 9
      apps/react-admin/src/_mock/utils.js
  27. 26
      apps/react-admin/src/api/abp-core/abp.ts
  28. 2
      apps/react-admin/src/api/abp-core/index.ts
  29. 9
      apps/react-admin/src/api/abp-core/menu.ts
  30. 28
      apps/react-admin/src/api/account/account.ts
  31. 4
      apps/react-admin/src/api/account/index.ts
  32. 23
      apps/react-admin/src/api/account/my-session.ts
  33. 68
      apps/react-admin/src/api/account/profile.ts
  34. 63
      apps/react-admin/src/api/account/token.ts
  35. 17
      apps/react-admin/src/api/account/user.ts
  36. 98
      apps/react-admin/src/api/apiClient.ts
  37. 3
      apps/react-admin/src/api/gen/index.ts
  38. 6212
      apps/react-admin/src/api/gen/sdk.gen.ts
  39. 13569
      apps/react-admin/src/api/gen/types.gen.ts
  40. 30
      apps/react-admin/src/api/management/auditing/audit-logs.ts
  41. 16
      apps/react-admin/src/api/management/auditing/entity-changes.ts
  42. 2
      apps/react-admin/src/api/management/auditing/index.ts
  43. 64
      apps/react-admin/src/api/management/identity/claim-types.ts
  44. 173
      apps/react-admin/src/api/management/identity/organization-units.ts
  45. 109
      apps/react-admin/src/api/management/identity/role.ts
  46. 31
      apps/react-admin/src/api/management/identity/security-logs.ts
  47. 44
      apps/react-admin/src/api/management/identity/user-lookup.ts
  48. 22
      apps/react-admin/src/api/management/identity/user-sessions.ts
  49. 155
      apps/react-admin/src/api/management/identity/users.ts
  50. 35
      apps/react-admin/src/api/management/notifications/my-notifications.ts
  51. 39
      apps/react-admin/src/api/management/notifications/notifications.ts
  52. 57
      apps/react-admin/src/api/management/permissions/definitions.ts
  53. 68
      apps/react-admin/src/api/management/permissions/groups.ts
  54. 25
      apps/react-admin/src/api/management/permissions/permissions.ts
  55. 56
      apps/react-admin/src/api/management/settings/definitions.ts
  56. 62
      apps/react-admin/src/api/management/settings/settings.ts
  57. 58
      apps/react-admin/src/api/openiddict/applications.ts
  58. 34
      apps/react-admin/src/api/openiddict/authorizations.ts
  59. 11
      apps/react-admin/src/api/openiddict/open-id.ts
  60. 56
      apps/react-admin/src/api/openiddict/scopes.ts
  61. 31
      apps/react-admin/src/api/openiddict/tokens.ts
  62. 127
      apps/react-admin/src/api/request.ts
  63. 11
      apps/react-admin/src/api/services/demoService.ts
  64. 13
      apps/react-admin/src/api/services/orgService.ts
  65. 33
      apps/react-admin/src/api/services/userService.ts
  66. 8
      apps/react-admin/src/assets/icons/ic-analysis.svg
  67. 7
      apps/react-admin/src/assets/icons/ic-blog.svg
  68. 10
      apps/react-admin/src/assets/icons/ic-clear.svg
  69. 1
      apps/react-admin/src/assets/icons/ic-dashboard.svg
  70. 1
      apps/react-admin/src/assets/icons/ic-left-arrow.svg
  71. 1
      apps/react-admin/src/assets/icons/ic-locale_en_US.svg
  72. 1
      apps/react-admin/src/assets/icons/ic-locale_zh_CN.svg
  73. 21
      apps/react-admin/src/assets/icons/ic-logo.svg
  74. 4
      apps/react-admin/src/assets/icons/ic-management.svg
  75. 40
      apps/react-admin/src/assets/icons/ic-markdown.svg
  76. 5
      apps/react-admin/src/assets/icons/ic-menu.svg
  77. 5
      apps/react-admin/src/assets/icons/ic-menulevel.svg
  78. 1
      apps/react-admin/src/assets/icons/ic-reset-password.svg
  79. 1
      apps/react-admin/src/assets/icons/ic-right-arrow.svg
  80. 1
      apps/react-admin/src/assets/icons/ic-search.svg
  81. 1
      apps/react-admin/src/assets/icons/ic-setting.svg
  82. 6
      apps/react-admin/src/assets/icons/ic-settings-exit-fullscreen.svg
  83. 6
      apps/react-admin/src/assets/icons/ic-settings-fullscreen.svg
  84. 4
      apps/react-admin/src/assets/icons/ic-settings-mode-moon.svg
  85. 13
      apps/react-admin/src/assets/icons/ic-settings-mode-sun.svg
  86. 4
      apps/react-admin/src/assets/icons/ic-user.svg
  87. 4
      apps/react-admin/src/assets/icons/ic-workbench.svg
  88. 4
      apps/react-admin/src/assets/icons/ic_blank.svg
  89. 28
      apps/react-admin/src/assets/icons/ic_chat.svg
  90. 1
      apps/react-admin/src/assets/icons/ic_decline.svg
  91. 20
      apps/react-admin/src/assets/icons/ic_delivery.svg
  92. 4
      apps/react-admin/src/assets/icons/ic_disabled.svg
  93. 4
      apps/react-admin/src/assets/icons/ic_external.svg
  94. 18
      apps/react-admin/src/assets/icons/ic_file.svg
  95. 25
      apps/react-admin/src/assets/icons/ic_file_ai.svg
  96. 24
      apps/react-admin/src/assets/icons/ic_file_audio.svg
  97. 19
      apps/react-admin/src/assets/icons/ic_file_excel.svg
  98. 26
      apps/react-admin/src/assets/icons/ic_file_img.svg
  99. 19
      apps/react-admin/src/assets/icons/ic_file_pdf.svg
  100. 20
      apps/react-admin/src/assets/icons/ic_file_ppt.svg

4
apps/react-admin/.dockerignore

@ -0,0 +1,4 @@
.github
.vscode/
dist/
node_modules/

1
apps/react-admin/.env

@ -0,0 +1 @@
VITE_GLOB_APP_TITLE = Vite React TS Template

12
apps/react-admin/.env.development

@ -0,0 +1,12 @@
VITE_APP_BASE_API=
VITE_APP_HOMEPAGE=/dashboard/workbench
VITE_APP_BASE_PATH=/
# VITE_GLOB_CLIENT_ID=react-admin-client
# VITE_GLOB_CLIENT_SECRET=''
# VITE_GLOB_SCOPE="openid email address phone profile offline_access miwen-abp-application"
# VITE_PROXY_API=http://192.168.31.246:30001
VITE_GLOB_CLIENT_ID=vue-admin-client
VITE_GLOB_CLIENT_SECRET=1q2w3e*
VITE_GLOB_SCOPE="openid email address phone profile offline_access lingyun-abp-application"
VITE_PROXY_API=http://124.223.5.95:30001

3
apps/react-admin/.env.production

@ -0,0 +1,3 @@
VITE_APP_BASE_API=/api
VITE_APP_HOMEPAGE=/dashboard/workbench
VITE_APP_BASE_PATH=/

28
apps/react-admin/.gitignore

@ -0,0 +1,28 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# vite 打包分析产物
stats.html
# 取消上层忽略
!.vscode/

7
apps/react-admin/.vscode/extensions.json

@ -0,0 +1,7 @@
{
"recommendations": [
"biomejs.biome",
"bradlc.vscode-tailwindcss",
"lokalise.i18n-ally"
]
}

35
apps/react-admin/.vscode/settings.json

@ -0,0 +1,35 @@
{
"typescript.tsdk": "./node_modules/typescript/lib",
"editor.tabSize": 2,
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"quickfix.biome": "explicit",
"source.organizeImports.biome": "explicit"
},
"editor.quickSuggestions": {
"strings": "on"
},
"tailwindCSS.experimental.classRegex": [
["cn\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"]
],
"npm.packageManager": "pnpm",
"i18n-ally.localesPaths": ["src/locales/lang"],
"i18n-ally.enabledParsers": ["json"],
"i18n-ally.pathMatcher": "{locale}/{namespaces}.{ext}",
"i18n-ally.keystyle": "flat",
"i18n-ally.sortKeys": true,
"i18n-ally.sourceLanguage": "en_US",
"i18n-ally.displayLanguage": "zh_CN",
"[javascript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescriptreact]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[json]": {
"editor.defaultFormatter": "biomejs.biome"
}
}

24
apps/react-admin/Dockerfile

@ -0,0 +1,24 @@
# Stage 1: build stage
FROM node:22-alpine as build-stage
# make the 'app' folder the current working directory
WORKDIR /app
# config node options
ENV NODE_OPTIONS=--max_old_space_size=8192
# config pnpm, install dependencies
COPY package.json pnpm-lock.yaml* ./
RUN npm install pnpm@9.x -g && \
pnpm install --frozen-lockfile
# copy project files and folders to the current working directory (i.e. 'app' folder)
COPY . ./
# build the project
RUN pnpm build
RUN echo "build successful 🎉 🎉 🎉"
# Stage 2: production stage
FROM nginx:latest as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
RUN echo "deploy to nginx successful 🎉 🎉 🎉"

21
apps/react-admin/LICENSE

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2023 d3george
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

132
apps/react-admin/README.md

@ -0,0 +1,132 @@
<div align="center">
<br>
<br>
<img src="./src/assets/images/logo.png" height="140" />
<h3> Slash Admin </h3>
<p>
<p style="font-size: 14px">
Slash Admin is a modern admin dashboard template built with React 18, Vite, Ant Design, and TypeScript. It is designed to help developers quickly create powerful admin management systems.
</p>
<br />
<br />
<a href="https://admin.slashspaces.com/">Preview</a>
·
<a href="https://discord.gg/fXemAXVNDa">Discord</a>
·
<a href="https://docs-admin.slashspaces.com/">Document</a>
<br />
<br />
<a href="https://trendshift.io/repositories/6387" target="_blank"><img src="https://trendshift.io/api/badge/repositories/6387" alt="d3george%2Fslash-admin | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
</div>
**English** | [中文](./README.zh-CN.md)
## Sponsor
<div style="display: flex; gap: 50px">
<img style="width:300px" src="https://d3george.github.io/github-static/pay/weixin.jpg" >
<img style="width:280px" src="https://d3george.github.io/github-static/pay/buymeacoffee.png" />
</div>
## Preview
+ https://admin.slashspaces.com/
|![login.png](https://d3george.github.io/github-static/slash-admin/login.jpeg)|![login_dark.png](https://d3george.github.io/github-static/slash-admin/login_dark.jpeg)
| ----------------------------------------------------------------- | ------------------------------------------------------------------- |
|![analysis.png](https://d3george.github.io/github-static/slash-admin/analysis.png)|![workbench.png](https://d3george.github.io/github-static/slash-admin/workbench.png)
## Features
- Built using React 18 hooks.
- Powered by Vite for rapid development and hot module replacement.
- Integrates Ant Design, providing a rich set of UI components and design patterns.
- Written in TypeScript, offering type safety and an improved development experience.
- Responsive design, adapting to various screen sizes and devices.
- Flexible routing configuration, supporting nested routes.
- Integrated access control based on user roles.
- Supports internationalization for easy language switching.
- Includes common admin features like user management, role management, and permission management.
- Customizable themes and styles to meet your branding needs.
- Mocking solution based on MSW and Faker.js.
- State management using Zustand.
- Data fetching using React-Query.
## Quick Start
### Get the Project Code
```bash
git clone https://github.com/d3george/slash-admin.git
```
### Install Dependencies
In the project's root directory, run the following command to install project dependencies:
```bash
pnpm install
```
### Start the Development Server
Run the following command to start the development server:
```bash
pnpm dev
```
Visit [http://localhost:3001](http://localhost:3001) to view your application.
### Build for Production
Run the following command to build the production version:
```bash
pnpm build
```
## Docker deployment
### Build image and Run container
#### build image
Enter the project root directory in the terminal and execute the following command to build the Docker image:
```
docker build -t your-image-name .
```
Make sure to replace `your-image-name` with your own image name
#### run container
Run your application in the Docker container using the following command:
```
docker run -p 3001:80 your-image-name
```
This will run your application on port `80`(exposed in `Dockerfile`) of the container and map it to port `3001` on your host.
Now you can access http://localhost:3001 to view the deployed applications.
### use docker-compose.yaml
Enter the project root directory in the terminal and execute the following command to start Docker Compose:
```
docker-compose up -d
```
Docker Compose will build an image based on the configuration defined by 'docker-compose. yaml' and run the container in the background.
After the container runs successfully, it can also be accessed through http://localhost:3001 To view the deployed applications.
## Git Contribution submission specification
reference[.commitlint.config.js](./commitlint.config.js)
- `feat` new features
- `fix` fix the
- `docs` documentation or comments
- `style` code format (changes that do not affect code execution)
- `refactor` refactor
- `perf` performance optimization
- `revert` revert commit
- `test` test related
- `chore` changes in the construction process or auxiliary tools
- `ci` modify CI configuration and scripts
- `types` type definition file changes
- `wip` in development

131
apps/react-admin/README.zh-CN.md

@ -0,0 +1,131 @@
<div align="center">
<br>
<br>
<img src="./src/assets/images/logo.png" height="140" />
<h3> Slash Admin </h3>
<p>
<p style="font-size: 14px">
Slash Admin 是一款现代化的后台管理模板,基于 React 18、Vite、Ant Design 和 TypeScript 构建。它旨在帮助开发人员快速搭建功能强大的后台管理系统。
</p>
<br />
<br />
<a href="https://admin.slashspaces.com/">Preview</a>
·
<a href="https://discord.gg/fXemAXVNDa">Discord</a>
·
<a href="https://docs-admin.slashspaces.com/">Document</a>
<br />
<br />
<a href="https://trendshift.io/repositories/6387" target="_blank"><img src="https://trendshift.io/api/badge/repositories/6387" alt="d3george%2Fslash-admin | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
</div>
**中文** | [English](./README.md)
## 赞助
<div style="display: flex; gap: 50px">
<img style="width:300px" src="https://d3george.github.io/github-static/pay/weixin.jpg" >
<img style="width:280px" src="https://d3george.github.io/github-static/pay/buymeacoffee.png" />
</div>
## 预览
+ https://admin.slashspaces.com/
|![login.png](https://d3george.github.io/github-static/slash-admin/login.jpeg)|![login_dark.png](https://d3george.github.io/github-static/slash-admin/login_dark.jpeg)
| ----------------------------------------------------------------- | ------------------------------------------------------------------- |
|![analysis.png](https://d3george.github.io/github-static/slash-admin/analysis.png)|![workbench.png](https://d3george.github.io/github-static/slash-admin/workbench.png)
## 特性
- 使用 React 18 hooks 进行构建。
- 基于 Vite 进行快速开发和热模块替换。
- 集成 Ant Design,提供丰富的 UI 组件和设计模式。
- 使用 TypeScript 编写,提供类型安全性和更好的开发体验。
- 响应式设计,适应各种屏幕尺寸和设备。
- 灵活的路由配置,支持多级嵌套路由。
- 集成权限管理,根据用户角色控制页面访问权限。
- 集成国际化支持,轻松切换多语言。
- 集成常见的后台管理功能,如用户管理、角色管理、权限管理等。
- 可定制的主题和样式,以满足您的品牌需求。
- 基于 MSW 和 Faker.js 的Mock方案
- 使用 Zustand 进行状态管理
- 使用 React-Query 进行数据获取
## 快速开始
### 获取项目代码
```bash
git clone https://github.com/d3george/slash-admin.git
```
### 安装依赖
在项目根目录下运行以下命令安装项目依赖:
```bash
pnpm install
```
### 启动开发服务器
运行以下命令以启动开发服务器:
```bash
pnpm dev
```
访问 [http://localhost:3001](http://localhost:3001) 查看您的应用程序。
### 构建生产版本
运行以下命令以构建生产版本:
```bash
pnpm build
```
构建后的文件将位于 `dist` 目录中。
## 容器化部署
### 构建镜像并运行容器
#### 构建镜像
在终端中进入项目根目录,并执行以下命令来构建 Docker 镜像:
```
docker build -t your-image-name .
```
确保将 `your-image-name` 替换为你自己的镜像名称
#### 运行容器
使用以下命令在 Docker 容器中运行你的应用:
```
docker run -p 3001:80 your-image-name
```
这将在容器的端口 `80` (暴露在`Dockerfile`中) 上运行你的应用,并将其映射到你主机的端口 `3001` 上。
现在,你可以通过访问 http://localhost:3001 来查看部署的应用。
### 使用docker-compose.yaml
在终端中进入项目根目录,并执行以下命令来启动 Docker Compose:
```
docker-compose up -d
```
Docker Compose 根据`docker-compose.yaml`定义的配置构建镜像并在后台运行容器.
容器运行成功后,同样可以通过访问 http://localhost:3001来查看部署的应用。
参考[.commitlint.config.js](./commitlint.config.js)
- `feat` 新功能
- `fix` 修复bug
- `docs` 文档注释
- `style` 代码格式(不影响代码运行的变动)
- `refactor` 重构
- `perf` 性能优化
- `revert` 回滚commit
- `test` 测试相关
- `chore` 构建过程或辅助工具的变动
- `ci` 修改CI配置、脚本
- `types` 类型定义文件修改
- `wip` 开发中

44
apps/react-admin/biome.json

@ -0,0 +1,44 @@
{
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
"vcs": {
"enabled": true,
"clientKind": "git",
"useIgnoreFile": true,
"defaultBranch": "main"
},
"files": {
"ignoreUnknown": false,
"ignore": ["public", ".vscode", "src/api/gen"]
},
"formatter": {
"enabled": true,
"lineWidth": 120,
"indentStyle": "tab"
},
"organizeImports": {
"enabled": true
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"suspicious": {
"noExplicitAny": "off"
},
"a11y": {
"useKeyWithClickEvents": "off"
},
"complexity": {
"noForEach": "off"
},
"correctness": {
"useExhaustiveDependencies": "off"
}
}
},
"javascript": {
"formatter": {
"quoteStyle": "double"
}
}
}

7
apps/react-admin/docker-compose.yaml

@ -0,0 +1,7 @@
services:
slash:
build:
context: .
ports:
- "3001:80"
restart: always

13
apps/react-admin/index.html

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Slash Admin</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>

26
apps/react-admin/lefthook.yml

@ -0,0 +1,26 @@
# SKIP CI in commit message to skip hooks
skip_output:
- meta
- success
- summary
pre-commit:
parallel: true
commands:
format:
glob: "*.{js,jsx,ts,tsx,json,md}"
run: npx @biomejs/biome format --write --no-errors-on-unmatched {staged_files}
stage_fixed: true
lint:
glob: "*.{js,jsx,ts,tsx}"
run: npx @biomejs/biome lint --no-errors-on-unmatched {staged_files}
check-types:
glob: "*.{ts,tsx}"
run: npx tsc --noEmit
commit-msg:
commands:
commitlint:
run: npx commitlint --edit {1}
# 允许空提交信息
skip: merge|rebase

18
apps/react-admin/openapi-ts.config.ts

@ -0,0 +1,18 @@
import { defineConfig } from "@hey-api/openapi-ts";
import { defaultPlugins } from "@hey-api/openapi-ts";
export default defineConfig({
client: "@hey-api/client-axios",
input: "http://192.168.31.246:30001/swagger/v1/swagger.json",
output: {
format: "biome",
lint: "biome",
path: "src/api/gen",
},
plugins: [
...defaultPlugins,
{
enums: "typescript",
name: "@hey-api/typescript",
},
],
});

117
apps/react-admin/package.json

@ -0,0 +1,117 @@
{
"name": "slash-admin",
"private": true,
"version": "0.0.0",
"type": "module",
"homepage": "https://github.com/d3george/slash-admin",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"preview": "vite preview",
"preinstall": "lefthook install",
"gen-api": "openapi-ts"
},
"dependencies": {
"@ant-design/cssinjs": "^1.17.2",
"@ant-design/icons": "^5.2.6",
"@ant-design/pro-table": "^3.18.3",
"@fullcalendar/common": "^5.11.5",
"@fullcalendar/core": "^6.1.9",
"@fullcalendar/daygrid": "^6.1.9",
"@fullcalendar/interaction": "^6.1.9",
"@fullcalendar/list": "^6.1.9",
"@fullcalendar/react": "^6.1.9",
"@fullcalendar/timegrid": "^6.1.9",
"@fullcalendar/timeline": "^6.1.9",
"@hey-api/client-axios": "^0.2.12",
"@iconify/react": "^4.1.1",
"@microsoft/signalr": "^8.0.7",
"@tanstack/react-query": "^5.50.1",
"@tanstack/react-query-devtools": "^5.50.1",
"@vanilla-extract/css": "^1.17.0",
"@vanilla-extract/vite-plugin": "^4.0.19",
"@vercel/analytics": "^1.2.2",
"@vitejs/plugin-react": "^4.1.0",
"antd": "^5.9.3",
"apexcharts": "^3.43.0",
"autosuggest-highlight": "^3.3.4",
"axios": "^1.5.1",
"classnames": "^2.3.2",
"clsx": "^2.1.1",
"color": "^4.2.3",
"dayjs": "^1.11.10",
"defu": "^6.1.4",
"framer-motion": "^10.16.4",
"highlight.js": "^11.9.0",
"i18next": "^23.5.1",
"i18next-browser-languagedetector": "^7.1.0",
"json-edit-react": "^1.19.2",
"nprogress": "^0.2.0",
"numeral": "^2.0.6",
"ramda": "^0.29.1",
"react": "18.2.0",
"react-apexcharts": "^1.4.1",
"react-beautiful-dnd": "^13.1.1",
"react-dom": "18.2.0",
"react-error-boundary": "^4.0.13",
"react-helmet-async": "^2.0.5",
"react-i18next": "^13.2.2",
"react-icons": "^4.11.0",
"react-markdown": "^8.0.7",
"react-organizational-chart": "^2.2.1",
"react-quill": "^2.0.0",
"react-router": "^7.0.2",
"react-use": "^17.4.0",
"rehype-highlight": "^6.0.0",
"rehype-raw": "^6.1.1",
"remark-gfm": "^3.0.1",
"reset-css": "^5.0.2",
"screenfull": "^6.0.2",
"simplebar-react": "^3.2.4",
"sonner": "^1.7.0",
"styled-components": "^6.0.9",
"tailwind-merge": "^2.5.4",
"zustand": "^4.4.3"
},
"devDependencies": {
"@biomejs/biome": "1.9.4",
"@commitlint/cli": "^17.7.2",
"@commitlint/config-conventional": "^17.7.0",
"@faker-js/faker": "^8.1.0",
"@hey-api/openapi-ts": "^0.59.1",
"@types/autosuggest-highlight": "^3.2.0",
"@types/color": "^3.0.4",
"@types/nprogress": "^0.2.1",
"@types/numeral": "^2.0.3",
"@types/ramda": "^0.29.6",
"@types/react": "^18.2.28",
"@types/react-beautiful-dnd": "^13.1.6",
"@types/react-dom": "^18.2.13",
"@types/styled-components": "^5.1.28",
"autoprefixer": "^10.4.16",
"axios-mock-adapter": "^2.1.0",
"lefthook": "^1.8.2",
"msw": "^2.4.9",
"postcss": "^8.4.31",
"postcss-import": "^15.1.0",
"postcss-nesting": "^11.3.0",
"rollup-plugin-visualizer": "^5.9.2",
"tailwindcss": "^3.3.3",
"ts-node": "^10.9.1",
"typescript": "^5.2.2",
"vite": "^5.4.9",
"vite-plugin-svg-icons": "^2.0.1",
"vite-tsconfig-paths": "^5.0.1",
"vitest": "^2.1.8"
},
"engines": {
"node": "20.*"
},
"packageManager": "pnpm@9.1.0",
"msw": {
"workerDirectory": "public"
},
"commitlint": {
"extends": ["@commitlint/config-conventional"]
}
}

8
apps/react-admin/postcss.config.js

@ -0,0 +1,8 @@
export default {
plugins: {
"postcss-import": {},
"tailwindcss/nesting": "postcss-nesting",
tailwindcss: {},
autoprefixer: {},
},
};

295
apps/react-admin/public/mockServiceWorker.js

@ -0,0 +1,295 @@
/* eslint-disable */
/* tslint:disable */
/**
* Mock Service Worker.
* @see https://github.com/mswjs/msw
* - Please do NOT modify this file.
* - Please do NOT serve this file on production.
*/
const PACKAGE_VERSION = '2.6.4'
const INTEGRITY_CHECKSUM = 'ca7800994cc8bfb5eb961e037c877074'
const IS_MOCKED_RESPONSE = Symbol('isMockedResponse')
const activeClientIds = new Set()
self.addEventListener('install', function () {
self.skipWaiting()
})
self.addEventListener('activate', function (event) {
event.waitUntil(self.clients.claim())
})
self.addEventListener('message', async function (event) {
const clientId = event.source.id
if (!clientId || !self.clients) {
return
}
const client = await self.clients.get(clientId)
if (!client) {
return
}
const allClients = await self.clients.matchAll({
type: 'window',
})
switch (event.data) {
case 'KEEPALIVE_REQUEST': {
sendToClient(client, {
type: 'KEEPALIVE_RESPONSE',
})
break
}
case 'INTEGRITY_CHECK_REQUEST': {
sendToClient(client, {
type: 'INTEGRITY_CHECK_RESPONSE',
payload: {
packageVersion: PACKAGE_VERSION,
checksum: INTEGRITY_CHECKSUM,
},
})
break
}
case 'MOCK_ACTIVATE': {
activeClientIds.add(clientId)
sendToClient(client, {
type: 'MOCKING_ENABLED',
payload: {
client: {
id: client.id,
frameType: client.frameType,
},
},
})
break
}
case 'MOCK_DEACTIVATE': {
activeClientIds.delete(clientId)
break
}
case 'CLIENT_CLOSED': {
activeClientIds.delete(clientId)
const remainingClients = allClients.filter((client) => {
return client.id !== clientId
})
// Unregister itself when there are no more clients
if (remainingClients.length === 0) {
self.registration.unregister()
}
break
}
}
})
self.addEventListener('fetch', function (event) {
const { request } = event
// Bypass navigation requests.
if (request.mode === 'navigate') {
return
}
// Opening the DevTools triggers the "only-if-cached" request
// that cannot be handled by the worker. Bypass such requests.
if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') {
return
}
// Bypass all requests when there are no active clients.
// Prevents the self-unregistered worked from handling requests
// after it's been deleted (still remains active until the next reload).
if (activeClientIds.size === 0) {
return
}
// Generate unique request ID.
const requestId = crypto.randomUUID()
event.respondWith(handleRequest(event, requestId))
})
async function handleRequest(event, requestId) {
const client = await resolveMainClient(event)
const response = await getResponse(event, client, requestId)
// Send back the response clone for the "response:*" life-cycle events.
// Ensure MSW is active and ready to handle the message, otherwise
// this message will pend indefinitely.
if (client && activeClientIds.has(client.id)) {
;(async function () {
const responseClone = response.clone()
sendToClient(
client,
{
type: 'RESPONSE',
payload: {
requestId,
isMockedResponse: IS_MOCKED_RESPONSE in response,
type: responseClone.type,
status: responseClone.status,
statusText: responseClone.statusText,
body: responseClone.body,
headers: Object.fromEntries(responseClone.headers.entries()),
},
},
[responseClone.body],
)
})()
}
return response
}
// Resolve the main client for the given event.
// Client that issues a request doesn't necessarily equal the client
// that registered the worker. It's with the latter the worker should
// communicate with during the response resolving phase.
async function resolveMainClient(event) {
const client = await self.clients.get(event.clientId)
if (activeClientIds.has(event.clientId)) {
return client
}
if (client?.frameType === 'top-level') {
return client
}
const allClients = await self.clients.matchAll({
type: 'window',
})
return allClients
.filter((client) => {
// Get only those clients that are currently visible.
return client.visibilityState === 'visible'
})
.find((client) => {
// Find the client ID that's recorded in the
// set of clients that have registered the worker.
return activeClientIds.has(client.id)
})
}
async function getResponse(event, client, requestId) {
const { request } = event
// Clone the request because it might've been already used
// (i.e. its body has been read and sent to the client).
const requestClone = request.clone()
function passthrough() {
// Cast the request headers to a new Headers instance
// so the headers can be manipulated with.
const headers = new Headers(requestClone.headers)
// Remove the "accept" header value that marked this request as passthrough.
// This prevents request alteration and also keeps it compliant with the
// user-defined CORS policies.
headers.delete('accept', 'msw/passthrough')
return fetch(requestClone, { headers })
}
// Bypass mocking when the client is not active.
if (!client) {
return passthrough()
}
// Bypass initial page load requests (i.e. static assets).
// The absence of the immediate/parent client in the map of the active clients
// means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet
// and is not ready to handle requests.
if (!activeClientIds.has(client.id)) {
return passthrough()
}
// Notify the client that a request has been intercepted.
const requestBuffer = await request.arrayBuffer()
const clientMessage = await sendToClient(
client,
{
type: 'REQUEST',
payload: {
id: requestId,
url: request.url,
mode: request.mode,
method: request.method,
headers: Object.fromEntries(request.headers.entries()),
cache: request.cache,
credentials: request.credentials,
destination: request.destination,
integrity: request.integrity,
redirect: request.redirect,
referrer: request.referrer,
referrerPolicy: request.referrerPolicy,
body: requestBuffer,
keepalive: request.keepalive,
},
},
[requestBuffer],
)
switch (clientMessage.type) {
case 'MOCK_RESPONSE': {
return respondWithMock(clientMessage.data)
}
case 'PASSTHROUGH': {
return passthrough()
}
}
return passthrough()
}
function sendToClient(client, message, transferrables = []) {
return new Promise((resolve, reject) => {
const channel = new MessageChannel()
channel.port1.onmessage = (event) => {
if (event.data && event.data.error) {
return reject(event.data.error)
}
resolve(event.data)
}
client.postMessage(
message,
[channel.port2].concat(transferrables.filter(Boolean)),
)
})
}
async function respondWithMock(response) {
// Setting response status code to 0 is a no-op.
// However, when responding with a "Response.error()", the produced Response
// instance will have status code set to 0. Since it's not possible to create
// a Response instance with status code 0, handle that use-case separately.
if (response.status === 0) {
return Response.error()
}
const mockedResponse = new Response(response.body, response)
Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, {
value: true,
enumerable: true,
})
return mockedResponse
}

44
apps/react-admin/src/App.tsx

@ -0,0 +1,44 @@
import { Helmet } from "react-helmet-async";
import Logo from "@/assets/images/logo.png";
import Router from "@/router/index";
import { MotionLazy } from "./components/animate/motion-lazy";
import Toast from "./components/toast";
import { AntdAdapter } from "./theme/adapter/antd.adapter";
import { ThemeProvider } from "./theme/theme-provider";
import { useEffect } from "react";
import { useSetLocale } from "./store/localeI18nStore";
import { useTranslation } from "react-i18next";
import { getStringItem } from "./utils/storage";
import { LocalEnum, StorageEnum } from "#/enum";
import { useSessions } from "./hooks/abp/use-sessions";
function App() {
const { i18n } = useTranslation();
const setLocale = useSetLocale();
const defaultLng = getStringItem(StorageEnum.I18N) || LocalEnum.en_US;
useSessions();
useEffect(() => {
async function initializeI18n() {
await setLocale(defaultLng as LocalEnum, i18n);
}
initializeI18n(); //触发abp语言包加载
}, [defaultLng, i18n, setLocale]);
return (
<ThemeProvider adapters={[AntdAdapter]}>
<MotionLazy>
<Helmet>
<title>Slash Admin</title>
<link rel="icon" href={Logo} />
</Helmet>
<Toast />
<Router />
</MotionLazy>
</ThemeProvider>
);
}
export default App;

610
apps/react-admin/src/_mock/assets.js

@ -0,0 +1,610 @@
import useUserStore from "@/store/userStore";
import { faker } from "@faker-js/faker";
import { BasicStatus, PermissionType } from "#/enum";
/**
* Organization data mock
*/
export const ORG_LIST = [
{
id: "1",
name: "East China Branch",
status: "enable",
desc: faker.lorem.words(),
order: 1,
children: [
{
id: "1-1",
name: "R&D Department",
status: "disable",
desc: "",
order: 1,
},
{
id: "1-2",
name: "Marketing Department",
status: "enable",
desc: "",
order: 2,
},
{
id: "1-3",
name: "Finance Department",
status: "enable",
desc: "",
order: 3,
},
],
},
{
id: "2",
name: "South China Branch",
status: "enable",
desc: faker.lorem.words(),
order: 2,
children: [
{
id: "2-1",
name: "R&D Department",
status: "disable",
desc: "",
order: 1,
},
{
id: "2-2",
name: "Marketing Department",
status: "enable",
desc: "",
order: 2,
},
{
id: "2-3",
name: "Finance Department",
status: "enable",
desc: "",
order: 3,
},
],
},
];
/**
* User permission mock
*/
const DASHBOARD_PERMISSION = {
id: "9100714781927703",
parentId: "",
label: "sys.menu.dashboard",
name: "Dashboard",
icon: "ic-analysis",
type: PermissionType.CATALOGUE,
route: "dashboard",
order: 1,
children: [
{
id: "8426999229400979",
parentId: "9100714781927703",
label: "sys.menu.workbench",
name: "Workbench",
type: PermissionType.MENU,
route: "workbench",
component: "/dashboard/workbench/index.tsx",
},
{
id: "9710971640510357",
parentId: "9100714781927703",
label: "sys.menu.analysis",
name: "Analysis",
type: PermissionType.MENU,
route: "analysis",
component: "/dashboard/analysis/index.tsx",
},
],
};
const MANAGEMENT_PERMISSION = {
id: "0901673425580518",
parentId: "",
label: "sys.menu.management",
name: "Management",
icon: "ic-management",
type: PermissionType.CATALOGUE,
route: "management",
order: 2,
children: [
{
id: "2781684678535711",
parentId: "0901673425580518",
label: "sys.menu.user.index",
name: "User",
type: PermissionType.CATALOGUE,
route: "user",
children: [
{
id: "4754063958766648",
parentId: "2781684678535711",
label: "sys.menu.user.profile",
name: "Profile",
type: PermissionType.MENU,
route: "profile",
component: "/management/user/profile/index.tsx",
},
{
id: "2516598794787938",
parentId: "2781684678535711",
label: "sys.menu.user.account",
name: "Account",
type: PermissionType.MENU,
route: "account",
component: "/management/user/account/index.tsx",
},
],
},
{
id: "0249937641030250",
parentId: "0901673425580518",
label: "sys.menu.system.index",
name: "System",
type: PermissionType.CATALOGUE,
route: "system",
children: [
{
id: "1985890042972842",
parentId: "0249937641030250",
label: "sys.menu.system.organization",
name: "Organization",
type: PermissionType.MENU,
route: "organization",
component: "/management/system/organization/index.tsx",
},
{
id: "4359580910369984",
parentId: "0249937641030250",
label: "sys.menu.system.permission",
name: "Permission",
type: PermissionType.MENU,
route: "permission",
component: "/management/system/permission/index.tsx",
},
{
id: "1689241785490759",
parentId: "0249937641030250",
label: "sys.menu.system.role",
name: "Role",
type: PermissionType.MENU,
route: "role",
component: "/management/system/role/index.tsx",
},
{
id: "0157880245365433",
parentId: "0249937641030250",
label: "sys.menu.system.user",
name: "User",
type: PermissionType.MENU,
route: "user",
component: "/management/system/user/index.tsx",
},
{
id: "0157880245365434",
parentId: "0249937641030250",
label: "sys.menu.system.user_detail",
name: "User Detail",
type: PermissionType.MENU,
route: "user/:id",
component: "/management/system/user/detail.tsx",
hide: true,
},
],
},
],
};
const COMPONENTS_PERMISSION = {
id: "2271615060673773",
parentId: "",
label: "sys.menu.components",
name: "Components",
icon: "solar:widget-5-bold-duotone",
type: PermissionType.CATALOGUE,
route: "components",
order: 3,
children: [
{
id: "2478488238255411",
parentId: "2271615060673773",
label: "sys.menu.icon",
name: "Icon",
type: PermissionType.MENU,
route: "icon",
component: "/components/icon/index.tsx",
},
{
id: "6755238352318767",
parentId: "2271615060673773",
label: "sys.menu.animate",
name: "Animate",
type: PermissionType.MENU,
route: "animate",
component: "/components/animate/index.tsx",
},
{
id: "9992476513546805",
parentId: "2271615060673773",
label: "sys.menu.scroll",
name: "Scroll",
type: PermissionType.MENU,
route: "scroll",
component: "/components/scroll/index.tsx",
},
{
id: "1755562695856395",
parentId: "2271615060673773",
label: "sys.menu.markdown",
name: "Markdown",
type: PermissionType.MENU,
route: "markdown",
component: "/components/markdown/index.tsx",
},
{
id: "2122547769468069",
parentId: "2271615060673773",
label: "sys.menu.editor",
name: "Editor",
type: PermissionType.MENU,
route: "editor",
component: "/components/editor/index.tsx",
},
{
id: "2501920741714350",
parentId: "2271615060673773",
label: "sys.menu.i18n",
name: "Multi Language",
type: PermissionType.MENU,
route: "i18n",
component: "/components/multi-language/index.tsx",
},
{
id: "2013577074467956",
parentId: "2271615060673773",
label: "sys.menu.upload",
name: "upload",
type: PermissionType.MENU,
route: "Upload",
component: "/components/upload/index.tsx",
},
{
id: "7749726274771764",
parentId: "2271615060673773",
label: "sys.menu.chart",
name: "Chart",
type: PermissionType.MENU,
route: "chart",
component: "/components/chart/index.tsx",
},
{
id: "2013577074467957",
parentId: "2271615060673773",
label: "sys.menu.toast",
name: "Toast",
type: PermissionType.MENU,
route: "toast",
component: "/components/toast/index.tsx",
},
],
};
const FUNCTIONS_PERMISSION = {
id: "8132044808088488",
parentId: "",
label: "sys.menu.functions",
name: "functions",
icon: "solar:plain-2-bold-duotone",
type: PermissionType.CATALOGUE,
route: "functions",
order: 4,
children: [
{
id: "3667930780705750",
parentId: "8132044808088488",
label: "sys.menu.clipboard",
name: "Clipboard",
type: PermissionType.MENU,
route: "clipboard",
component: "/functions/clipboard/index.tsx",
},
{
id: "3667930780705751",
parentId: "8132044808088488",
label: "sys.menu.token_expired",
name: "Token Expired",
type: PermissionType.MENU,
route: "token-expired",
component: "/functions/token-expired/index.tsx",
},
],
};
const MENU_LEVEL_PERMISSION = {
id: "0194818428516575",
parentId: "",
label: "sys.menu.menulevel.index",
name: "Menu Level",
icon: "ic-menulevel",
type: PermissionType.CATALOGUE,
route: "menu-level",
order: 5,
children: [
{
id: "0144431332471389",
parentId: "0194818428516575",
label: "sys.menu.menulevel.1a",
name: "Menu Level 1a",
type: PermissionType.MENU,
route: "menu-level-1a",
component: "/menu-level/menu-level-1a/index.tsx",
},
{
id: "7572529636800586",
parentId: "0194818428516575",
label: "sys.menu.menulevel.1b.index",
name: "Menu Level 1b",
type: PermissionType.CATALOGUE,
route: "menu-level-1b",
children: [
{
id: "3653745576583237",
parentId: "7572529636800586",
label: "sys.menu.menulevel.1b.2a",
name: "Menu Level 2a",
type: PermissionType.MENU,
route: "menu-level-2a",
component: "/menu-level/menu-level-1b/menu-level-2a/index.tsx",
},
{
id: "4873136353891364",
parentId: "7572529636800586",
label: "sys.menu.menulevel.1b.2b.index",
name: "Menu Level 2b",
type: PermissionType.CATALOGUE,
route: "menu-level-2b",
children: [
{
id: "4233029726998055",
parentId: "4873136353891364",
label: "sys.menu.menulevel.1b.2b.3a",
name: "Menu Level 3a",
type: PermissionType.MENU,
route: "menu-level-3a",
component: "/menu-level/menu-level-1b/menu-level-2b/menu-level-3a/index.tsx",
},
{
id: "3298034742548454",
parentId: "4873136353891364",
label: "sys.menu.menulevel.1b.2b.3b",
name: "Menu Level 3b",
type: PermissionType.MENU,
route: "menu-level-3b",
component: "/menu-level/menu-level-1b/menu-level-2b/menu-level-3b/index.tsx",
},
],
},
],
},
],
};
const ERRORS_PERMISSION = {
id: "9406067785553476",
parentId: "",
label: "sys.menu.error.index",
name: "Error",
icon: "bxs:error-alt",
type: PermissionType.CATALOGUE,
route: "error",
order: 6,
children: [
{
id: "8557056851997154",
parentId: "9406067785553476",
label: "sys.menu.error.403",
name: "403",
type: PermissionType.MENU,
route: "403",
component: "/sys/error/Page403.tsx",
},
{
id: "5095669208159005",
parentId: "9406067785553476",
label: "sys.menu.error.404",
name: "404",
type: PermissionType.MENU,
route: "404",
component: "/sys/error/Page404.tsx",
},
{
id: "0225992135973772",
parentId: "9406067785553476",
label: "sys.menu.error.500",
name: "500",
type: PermissionType.MENU,
route: "500",
component: "/sys/error/Page500.tsx",
},
],
};
const OTHERS_PERMISSION = [
{
id: "3981225257359246",
parentId: "",
label: "sys.menu.calendar",
name: "Calendar",
icon: "solar:calendar-bold-duotone",
type: PermissionType.MENU,
route: "calendar",
component: "/sys/others/calendar/index.tsx",
},
{
id: "3513985683886393",
parentId: "",
label: "sys.menu.kanban",
name: "kanban",
icon: "solar:clipboard-bold-duotone",
type: PermissionType.MENU,
route: "kanban",
component: "/sys/others/kanban/index.tsx",
},
{
id: "5455837930804461",
parentId: "",
label: "sys.menu.disabled",
name: "Disabled",
icon: "ic_disabled",
type: PermissionType.MENU,
route: "disabled",
status: BasicStatus.DISABLE,
component: "/sys/others/calendar/index.tsx",
},
{
id: "7728048658221587",
parentId: "",
label: "sys.menu.label",
name: "Label",
icon: "ic_label",
type: PermissionType.MENU,
route: "label",
newFeature: true,
component: "/sys/others/blank.tsx",
},
{
id: "5733704222120995",
parentId: "",
label: "sys.menu.frame",
name: "Frame",
icon: "ic_external",
type: PermissionType.CATALOGUE,
route: "frame",
children: [
{
id: "9884486809510480",
parentId: "5733704222120995",
label: "sys.menu.external_link",
name: "External Link",
type: PermissionType.MENU,
route: "external_link",
hideTab: true,
component: "/sys/others/iframe/external-link.tsx",
frameSrc: "https://ant.design/",
},
{
id: "9299640886731819",
parentId: "5733704222120995",
label: "sys.menu.iframe",
name: "Iframe",
type: PermissionType.MENU,
route: "frame",
component: "/sys/others/iframe/index.tsx",
frameSrc: "https://ant.design/",
},
],
},
{
id: "0941594969900756",
parentId: "",
label: "sys.menu.blank",
name: "Disabled",
icon: "ic_blank",
type: PermissionType.MENU,
route: "blank",
component: "/sys/others/blank.tsx",
},
];
export const PERMISSION_LIST = [
DASHBOARD_PERMISSION,
MANAGEMENT_PERMISSION,
COMPONENTS_PERMISSION,
FUNCTIONS_PERMISSION,
MENU_LEVEL_PERMISSION,
ERRORS_PERMISSION,
...OTHERS_PERMISSION,
];
/**
* User role mock
*/
const ADMIN_ROLE = {
id: "4281707933534332",
name: "Admin",
label: "admin",
status: BasicStatus.ENABLE,
order: 1,
desc: "Super Admin",
permission: PERMISSION_LIST,
};
const TEST_ROLE = {
id: "9931665660771476",
name: "Test",
label: "test",
status: BasicStatus.ENABLE,
order: 2,
desc: "test",
permission: [DASHBOARD_PERMISSION, COMPONENTS_PERMISSION, FUNCTIONS_PERMISSION],
};
export const ROLE_LIST = [ADMIN_ROLE, TEST_ROLE];
/**
* User data mock
*/
export const DEFAULT_USER = {
id: "b34719e1-ce46-457e-9575-99505ecee828",
username: "admin",
email: faker.internet.email(),
avatar: faker.image.avatarGitHub(),
createdAt: faker.date.anytime(),
updatedAt: faker.date.recent(),
password: "1q2w3E*",
role: ADMIN_ROLE,
permissions: ADMIN_ROLE.permission,
desc: "",
homePath: "/",
token: "/",
realName: "",
userId: "",
};
export const TEST_USER = {
id: "efaa20ea-4dc5-47ee-a200-8a899be29494",
username: "test",
password: "1q2w3E*",
email: faker.internet.email(),
avatar: faker.image.avatarGitHub(),
createdAt: faker.date.anytime(),
updatedAt: faker.date.recent(),
role: TEST_ROLE,
permissions: TEST_ROLE.permission,
desc: "",
homePath: "/",
token: "/",
realName: "",
userId: "",
};
export const USER_LIST = [DEFAULT_USER, TEST_USER];
// * Hot update, updating user permissions, only effective in the development environment
if (import.meta.hot) {
import.meta.hot.accept((newModule) => {
if (!newModule) return;
const { DEFAULT_USER, TEST_USER, PERMISSION_LIST } = newModule;
const {
userInfo,
actions: { setUserInfo },
} = useUserStore.getState();
if (!userInfo?.username) return;
const newUserInfo = userInfo.username === DEFAULT_USER.username ? DEFAULT_USER : TEST_USER;
setUserInfo(newUserInfo);
console.log("[HMR] User permissions updated:", {
username: newUserInfo.username,
permissions: newUserInfo.permissions,
});
});
}

9
apps/react-admin/src/_mock/handlers/_demo.js

@ -0,0 +1,9 @@
import { http, HttpResponse } from "msw";
import { DemoApi } from "@/api/services/demoService";
const mockTokenExpired = http.post(`/api${DemoApi.TOKEN_EXPIRED}`, () => {
return new HttpResponse(null, { status: 401 });
});
export default [mockTokenExpired];

14
apps/react-admin/src/_mock/handlers/_org.js

@ -0,0 +1,14 @@
import { http, HttpResponse } from "msw";
import { ORG_LIST } from "@/_mock/assets";
import { OrgApi } from "@/api/services/orgService";
const orgList = http.get(`/api${OrgApi.Org}`, () => {
return HttpResponse.json({
status: 0,
message: "",
data: ORG_LIST,
});
});
export default [orgList];

46
apps/react-admin/src/_mock/handlers/_user.js

@ -0,0 +1,46 @@
import { faker } from "@faker-js/faker";
import { http, HttpResponse, delay } from "msw";
import { UserApi } from "@/api/services/userService";
import { USER_LIST } from "../assets";
const signIn = http.post(`/api${UserApi.SignIn}`, async ({ request }) => {
const { username, password } = await request.json();
const user = USER_LIST.find((item) => item.username === username);
if (!user || user.password !== password) {
return HttpResponse.json({
status: 10001,
message: "Incorrect username or password.",
});
}
return HttpResponse.json({
status: 0,
message: "",
data: {
user,
accessToken: faker.string.uuid(),
refreshToken: faker.string.uuid(),
},
});
});
const userList = http.get("/api/user", async () => {
await delay(1000);
return HttpResponse.json(
Array.from({ length: 10 }).map(() => ({
fullname: faker.person.fullName(),
email: faker.internet.email(),
avatar: faker.image.avatarGitHub(),
address: faker.location.streetAddress(),
})),
{
status: 200,
},
);
});
export default [signIn, userList];

10
apps/react-admin/src/_mock/index.js

@ -0,0 +1,10 @@
import { setupWorker } from "msw/browser";
import demoMockApi from "./handlers/_demo";
import orgMockApi from "./handlers/_org";
import userMockApi from "./handlers/_user";
const handlers = [...userMockApi, ...orgMockApi, ...demoMockApi];
const worker = setupWorker(...handlers);
export default worker;

9
apps/react-admin/src/_mock/utils.js

@ -0,0 +1,9 @@
import { faker } from "@faker-js/faker";
export const fakeAvatars = (count) => {
const result = [];
for (let index = 0; index < count; index += 1) {
result.push(faker.image.avatarGitHub());
}
return result;
};

26
apps/react-admin/src/api/abp-core/abp.ts

@ -0,0 +1,26 @@
import type { ApplicationConfigurationDto, ApplicationLocalizationDto } from "#/abp-core";
import requestClient from "../request";
/**
*
*/
export function getConfigApi(options?: {
includeLocalizationResources?: boolean;
}): Promise<ApplicationConfigurationDto> {
return requestClient.get<ApplicationConfigurationDto>("/api/abp/application-configuration", {
params: options,
});
}
/**
*
* @returns
*/
export function getLocalizationApi(options: {
cultureName: string;
onlyDynamics?: boolean;
}): Promise<ApplicationLocalizationDto> {
return requestClient.get<ApplicationLocalizationDto>("/api/abp/application-localization", {
params: options,
});
}

2
apps/react-admin/src/api/abp-core/index.ts

@ -0,0 +1,2 @@
export * from "./abp";
// export * from './menu';

9
apps/react-admin/src/api/abp-core/menu.ts

@ -0,0 +1,9 @@
// import type { RouteRecordStringComponent } from '@vben/types';
// import requestClient from '../request';
/**
*
*/
// export async function getAllMenusApi() {
// return requestClient.get<RouteRecordStringComponent[]>('/menu/all');
// }

28
apps/react-admin/src/api/account/account.ts

@ -0,0 +1,28 @@
import type { ListResultDto } from "#/abp-core";
import type {
GetTwoFactorProvidersInput,
TwoFactorProvider,
SendEmailSigninCodeDto,
SendPhoneSigninCodeDto,
} from "#/account/account";
import requestClient from "@/api/request";
/**
* Get available two-factor authentication providers
*/
export const getTwoFactorProvidersApi = (input: GetTwoFactorProvidersInput) =>
requestClient.get<ListResultDto<TwoFactorProvider>>("/api/account/two-factor-providers", {
params: input,
});
/**
* Send sign-in verification email
*/
export const sendEmailSigninCodeApi = (input: SendEmailSigninCodeDto) =>
requestClient.post("/api/account/email/send-signin-code", input);
/**
* Send sign-in verification SMS
*/
export const sendPhoneSigninCodeApi = (input: SendPhoneSigninCodeDto) =>
requestClient.post("/api/account/phone/send-signin-code", input);

4
apps/react-admin/src/api/account/index.ts

@ -0,0 +1,4 @@
export * from "./token";
export * from "./user";
export * from "./my-session";
export * from "./account";

23
apps/react-admin/src/api/account/my-session.ts

@ -0,0 +1,23 @@
import type { IdentitySessionDto } from "#/management/identity/sessions";
import type { PagedResultDto } from "#/abp-core";
import requestClient from "@/api/request";
export interface GetMySessionsInput {
filter?: string;
maxResultCount?: number;
skipCount?: number;
}
/**
* Get current user's sessions
*/
export const getSessionsApi = (input?: GetMySessionsInput) =>
requestClient.get<PagedResultDto<IdentitySessionDto>>("/api/account/my-profile/sessions", {
params: input,
});
/**
* Revoke a session
*/
export const revokeSessionApi = (sessionId: string) =>
requestClient.delete(`/api/account/my-profile/sessions/${sessionId}/revoke`);

68
apps/react-admin/src/api/account/profile.ts

@ -0,0 +1,68 @@
import type {
ProfileDto,
UpdateProfileDto,
ChangePasswordInput,
TwoFactorEnabledDto,
AuthenticatorDto,
VerifyAuthenticatorCodeInput,
AuthenticatorRecoveryCodeDto,
SendEmailConfirmCodeDto,
ConfirmEmailInput,
} from "#/account/profile";
import requestClient from "@/api/request";
/**
* Get profile information
*/
export const getApi = () => requestClient.get<ProfileDto>("/api/account/my-profile");
/**
* Update profile information
*/
export const updateApi = (input: UpdateProfileDto) => requestClient.put<ProfileDto>("/api/account/my-profile", input);
/**
* Change password
*/
export const changePasswordApi = (input: ChangePasswordInput) =>
requestClient.post("/api/account/my-profile/change-password", input);
/**
* Get two-factor authentication status
*/
export const getTwoFactorEnabledApi = () =>
requestClient.get<TwoFactorEnabledDto>("/api/account/my-profile/two-factor");
/**
* Set two-factor authentication status
*/
export const changeTwoFactorEnabledApi = (input: TwoFactorEnabledDto) =>
requestClient.put("/api/account/my-profile/change-two-factor", input);
/**
* Get authenticator configuration
*/
export const getAuthenticatorApi = () => requestClient.get<AuthenticatorDto>("/api/account/my-profile/authenticator");
/**
* Verify authenticator code
*/
export const verifyAuthenticatorCodeApi = (input: VerifyAuthenticatorCodeInput) =>
requestClient.post<AuthenticatorRecoveryCodeDto>("/api/account/my-profile/verify-authenticator-code", input);
/**
* Reset authenticator
*/
export const resetAuthenticatorApi = () => requestClient.post("/api/account/my-profile/reset-authenticator");
/**
* Send email confirmation link
*/
export const sendEmailConfirmLinkApi = (input: SendEmailConfirmCodeDto) =>
requestClient.post("/api/account/my-profile/send-email-confirm-link", input);
/**
* Confirm email
*/
export const confirmEmailApi = (input: ConfirmEmailInput) =>
requestClient.put("/api/account/my-profile/confirm-email", input);

63
apps/react-admin/src/api/account/token.ts

@ -0,0 +1,63 @@
import type { OAuthTokenResult, PasswordTokenRequestModel, RefreshTokenRequestModel, TokenResult } from "#/account";
import requestClient from "../request";
/**
*
* @param request
* @returns token
*/
export async function loginApi(request: PasswordTokenRequestModel): Promise<TokenResult> {
const clientId = import.meta.env.VITE_GLOB_CLIENT_ID;
const clientSecret = import.meta.env.VITE_GLOB_CLIENT_SECRET;
const scope = import.meta.env.VITE_GLOB_SCOPE;
const result = await requestClient.post<OAuthTokenResult>(
"/connect/token",
{
client_id: clientId,
client_secret: clientSecret,
grant_type: "password",
password: request.password,
scope: scope,
username: request.username,
},
{
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
timeout: 30_000,
},
);
return {
accessToken: result.access_token,
expiresIn: result.expires_in,
refreshToken: result.refresh_token,
tokenType: result.token_type,
};
}
export async function refreshToken(request: RefreshTokenRequestModel): Promise<TokenResult> {
const clientId = import.meta.env.VITE_GLOB_CLIENT_ID;
const clientSecret = import.meta.env.VITE_GLOB_CLIENT_SECRET;
const scope = import.meta.env.VITE_GLOB_SCOPE;
const result = await requestClient.post<OAuthTokenResult>(
"/connect/token",
{
client_id: clientId,
client_secret: clientSecret,
grant_type: "refresh_token",
refresh_token: request.refreshToken,
scope: scope,
},
{
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
},
);
return {
accessToken: result.access_token,
expiresIn: result.expires_in,
refreshToken: result.refresh_token,
tokenType: result.token_type,
};
}

17
apps/react-admin/src/api/account/user.ts

@ -0,0 +1,17 @@
import type { OAuthUserInfo, UserInfo } from "#/account";
import requestClient from "../request";
/**
*
*/
export async function getUserInfoApi(): Promise<UserInfo> {
const result = await requestClient.get<OAuthUserInfo>("/connect/userinfo");
return {
...result,
emailVerified: result.email_verified,
givenName: result.given_name,
phoneNumberVerified: result.phone_number_verified,
preferredUsername: result.preferred_username,
uniqueName: result.unique_name,
};
}

98
apps/react-admin/src/api/apiClient.ts

@ -0,0 +1,98 @@
import axios, { type AxiosRequestConfig, type AxiosError, type AxiosResponse } from "axios";
import { t } from "@/locales/i18n";
import userStore, { useUserToken } from "@/store/userStore";
import { toast } from "sonner";
//TODO rm
// 创建 axios 实例
const axiosInstance = axios.create({
baseURL: import.meta.env.VITE_APP_BASE_API,
timeout: 50000,
headers: { "Content-Type": "application/json;charset=utf-8" },
});
// 请求拦截
axiosInstance.interceptors.request.use(
(config) => {
// 在请求被发送之前做些什么
const { accessToken } = useUserToken();
config.headers.Authorization = `${accessToken}`;
return config;
},
(error) => {
// 请求错误时做些什么
return Promise.reject(error);
},
);
// 响应拦截
axiosInstance.interceptors.response.use(
(res: AxiosResponse<any>) => {
const { data, status, headers } = res;
if (headers._abpwrapresult === "true") {
const { code, result, message, details } = data;
const hasSuccess = data && Reflect.has(data, "code") && code === "0";
if (hasSuccess) {
return result;
}
const content = details || message;
throw new Error(content);
}
if (status >= 200 && status < 400) {
return data;
}
// 业务请求错误
throw new Error(t("sys.api.apiRequestFailed"));
},
(error: AxiosError<any>) => {
const { response, message } = error || {};
const errMsg = response?.data?.message || message || t("sys.api.errorMessage");
toast.error(errMsg, {
position: "top-center",
});
const status = response?.status;
if (status === 401) {
userStore.getState().actions.clearUserInfoAndToken();
}
return Promise.reject(error);
},
);
class APIClient {
get<T = any>(config: AxiosRequestConfig): Promise<T> {
return this.request({ ...config, method: "GET" });
}
post<T = any>(config: AxiosRequestConfig): Promise<T> {
return this.request({ ...config, method: "POST" });
}
put<T = any>(config: AxiosRequestConfig): Promise<T> {
return this.request({ ...config, method: "PUT" });
}
delete<T = any>(config: AxiosRequestConfig): Promise<T> {
return this.request({ ...config, method: "DELETE" });
}
request<T = any>(config: AxiosRequestConfig): Promise<T> {
return new Promise((resolve, reject) => {
axiosInstance
.request<any, AxiosResponse<any>>(config)
.then((res: AxiosResponse<any>) => {
resolve(res as unknown as Promise<T>);
})
.catch((e: Error | AxiosError) => {
reject(e);
});
});
}
}
export default new APIClient();

3
apps/react-admin/src/api/gen/index.ts

@ -0,0 +1,3 @@
// This file is auto-generated by @hey-api/openapi-ts
export * from "./sdk.gen";
export * from "./types.gen";

6212
apps/react-admin/src/api/gen/sdk.gen.ts

File diff suppressed because it is too large

13569
apps/react-admin/src/api/gen/types.gen.ts

File diff suppressed because it is too large

30
apps/react-admin/src/api/management/auditing/audit-logs.ts

@ -0,0 +1,30 @@
import type { PagedResultDto } from "#/abp-core";
import type { AuditLogDto, AuditLogGetListInput } from "#/management/auditing";
import requestClient from "../../request";
/**
*
* @param id id
*/
export function getApi(id: string): Promise<AuditLogDto> {
return requestClient.get<AuditLogDto>(`/api/auditing/audit-log/${id}`);
}
/**
*
* @param input
*/
export function getPagedListApi(input: AuditLogGetListInput): Promise<PagedResultDto<AuditLogDto>> {
return requestClient.get<PagedResultDto<AuditLogDto>>("/api/auditing/audit-log", {
params: input,
});
}
/**
*
* @param id id
*/
export function deleteApi(id: string): Promise<void> {
return requestClient.delete(`/api/auditing/audit-log/${id}`);
}

16
apps/react-admin/src/api/management/auditing/entity-changes.ts

@ -0,0 +1,16 @@
import type { ListResultDto } from "#/abp-core";
import type { EntityChangeGetWithUsernameInput, EntityChangeWithUsernameDto } from "#/management/auditing";
import requestClient from "../../request";
/**
*
* @param input
*/
export function getListWithUsernameApi(
input: EntityChangeGetWithUsernameInput,
): Promise<ListResultDto<EntityChangeWithUsernameDto>> {
return requestClient.get<ListResultDto<EntityChangeWithUsernameDto>>("/api/auditing/entity-changes/with-username", {
params: input,
});
}

2
apps/react-admin/src/api/management/auditing/index.ts

@ -0,0 +1,2 @@
export * as auditLogsApi from "./audit-logs";
export * as entityChangesApi from "./entity-changes";

64
apps/react-admin/src/api/management/identity/claim-types.ts

@ -0,0 +1,64 @@
import type { ListResultDto, PagedResultDto } from "#/abp-core";
import type {
GetIdentityClaimTypePagedListInput,
IdentityClaimTypeCreateDto,
IdentityClaimTypeDto,
IdentityClaimTypeUpdateDto,
} from "#/management/identity";
import requestClient from "../../request";
/**
*
* @param input
* @returns
*/
export function createApi(input: IdentityClaimTypeCreateDto): Promise<IdentityClaimTypeDto> {
return requestClient.post<IdentityClaimTypeDto>("/api/identity/claim-types", input);
}
/**
*
* @param id id
*/
export function deleteApi(id: string): Promise<void> {
return requestClient.delete(`/api/identity/claim-types/${id}`);
}
/**
*
* @param id id
* @returns
*/
export function getApi(id: string): Promise<IdentityClaimTypeDto> {
return requestClient.get<IdentityClaimTypeDto>(`/api/identity/claim-types/${id}`);
}
/**
*
* @param id id
* @returns
*/
export function updateApi(id: string, input: IdentityClaimTypeUpdateDto): Promise<IdentityClaimTypeDto> {
return requestClient.put<IdentityClaimTypeDto>(`/api/identity/claim-types/${id}`, input);
}
/**
*
* @param input
* @returns
*/
export function getPagedListApi(
input?: GetIdentityClaimTypePagedListInput,
): Promise<PagedResultDto<IdentityClaimTypeDto>> {
return requestClient.get<PagedResultDto<IdentityClaimTypeDto>>("/api/identity/claim-types", {
params: input,
});
}
/**
*
*/
export function getAssignableClaimsApi(): Promise<ListResultDto<IdentityClaimTypeDto>> {
return requestClient.get<ListResultDto<IdentityClaimTypeDto>>("/api/identity/claim-types/actived-list");
}

173
apps/react-admin/src/api/management/identity/organization-units.ts

@ -0,0 +1,173 @@
import type { ListResultDto, PagedResultDto } from "#/abp-core";
import type { IdentityRoleDto, IdentityUserDto } from "#/management/identity";
import type {
GetIdentityRolesInput,
GetIdentityUsersInput,
GetOrganizationUnitPagedListInput,
GetUnaddedRoleListInput,
GetUnaddedUserListInput,
OrganizationUnitAddRoleDto,
OrganizationUnitAddUserDto,
OrganizationUnitCreateDto,
OrganizationUnitDto,
OrganizationUnitGetChildrenDto,
OrganizationUnitUpdateDto,
} from "#/management/identity/organization-units";
import requestClient from "../../request";
/**
*
* @param input
* @returns
*/
export function createApi(input: OrganizationUnitCreateDto): Promise<OrganizationUnitDto> {
return requestClient.post<OrganizationUnitDto>("/api/identity/organization-units", input);
}
/**
*
* @param id id
*/
export function deleteApi(id: string): Promise<void> {
return requestClient.delete(`/api/identity/organization-units/${id}`);
}
/**
*
* @param id id
* @returns
*/
export function getApi(id: string): Promise<OrganizationUnitDto> {
return requestClient.get<OrganizationUnitDto>(`/api/identity/organization-units/${id}`);
}
/**
*
* @param id id
* @returns
*/
export function updateApi(id: string, input: OrganizationUnitUpdateDto): Promise<OrganizationUnitDto> {
return requestClient.put<OrganizationUnitDto>(`/api/identity/organization-units/${id}`, input);
}
/**
*
* @param input
* @returns
*/
export function getPagedListApi(
input?: GetOrganizationUnitPagedListInput,
): Promise<PagedResultDto<OrganizationUnitDto>> {
return requestClient.get<PagedResultDto<OrganizationUnitDto>>("/api/identity/organization-units", {
params: input,
});
}
/**
*
* @returns
*/
export function getRootListApi(): Promise<ListResultDto<OrganizationUnitDto>> {
return requestClient.get<ListResultDto<OrganizationUnitDto>>("/api/identity/organization-units/root-node");
}
/**
*
* @returns
*/
export function getAllListApi(): Promise<ListResultDto<OrganizationUnitDto>> {
return requestClient.get<ListResultDto<OrganizationUnitDto>>("/api/identity/organization-units/all");
}
/**
*
* @param input
* @returns
*/
export function getChildrenApi(input: OrganizationUnitGetChildrenDto): Promise<ListResultDto<OrganizationUnitDto>> {
return requestClient.get<ListResultDto<OrganizationUnitDto>>("/api/identity/organization-units/find-children", {
params: input,
});
}
/**
*
* @param id id
* @param input
* @returns
*/
export function getUserListApi(id: string, input?: GetIdentityUsersInput): Promise<PagedResultDto<IdentityUserDto>> {
return requestClient.get<PagedResultDto<IdentityUserDto>>(`/api/identity/organization-units/${id}/users`, {
params: input,
});
}
/**
*
* @param input
* @returns
*/
export function getUnaddedUserListApi(input: GetUnaddedUserListInput): Promise<PagedResultDto<IdentityUserDto>> {
return requestClient.get<PagedResultDto<IdentityUserDto>>(
`/api/identity/organization-units/${input.id}/unadded-users`,
{
params: input,
},
);
}
/**
*
* @param id id
* @param input id列表
*/
export function addMembers(id: string, input: OrganizationUnitAddUserDto): Promise<void> {
return requestClient.post(`/api/identity/organization-units/${id}/users`, input);
}
/**
*
* @param id id
* @param input
* @returns
*/
export function getRoleListApi(id: string, input?: GetIdentityRolesInput): Promise<PagedResultDto<IdentityRoleDto>> {
return requestClient.get<PagedResultDto<IdentityRoleDto>>(`/api/identity/organization-units/${id}/roles`, {
params: input,
});
}
/**
*
* @param input
* @returns
*/
export function getUnaddedRoleListApi(input: GetUnaddedRoleListInput): Promise<PagedResultDto<IdentityRoleDto>> {
return requestClient.get<PagedResultDto<IdentityRoleDto>>(
`/api/identity/organization-units/${input.id}/unadded-roles`,
{
params: input,
},
);
}
/**
*
* @param id id
* @param input id列表
*/
export function addRoles(id: string, input: OrganizationUnitAddRoleDto): Promise<void> {
return requestClient.post(`/api/identity/organization-units/${id}/roles`, input);
}
/**
*
* @param id id
* @param parentId id
*/
export function moveTo(id: string, parentId?: string): Promise<void> {
return requestClient.put(`api/identity/organization-units/${id}/move`, { parentId });
}

109
apps/react-admin/src/api/management/identity/role.ts

@ -0,0 +1,109 @@
import type { PagedResultDto, ListResultDto } from "#/abp-core";
import type {
IdentityClaimCreateDto,
IdentityClaimDeleteDto,
IdentityClaimDto,
IdentityClaimUpdateDto,
} from "#/management/identity/claims";
import type {
GetRolePagedListInput,
IdentityRoleCreateDto,
IdentityRoleDto,
IdentityRoleUpdateDto,
} from "#/management/identity";
import requestClient from "../../request";
/**
*
* @param input
* @returns
*/
export function createApi(input: IdentityRoleCreateDto): Promise<IdentityRoleDto> {
return requestClient.post<IdentityRoleDto>("/api/identity/roles", input);
}
/**
*
* @param id id
*/
export function deleteApi(id: string): Promise<void> {
return requestClient.delete(`/api/identity/roles/${id}`);
}
/**
*
* @param id id
* @returns
*/
export function getApi(id: string): Promise<IdentityRoleDto> {
return requestClient.get<IdentityRoleDto>(`/api/identity/roles/${id}`);
}
/**
*
* @param id id
* @returns
*/
export function updateApi(id: string, input: IdentityRoleUpdateDto): Promise<IdentityRoleDto> {
return requestClient.put<IdentityRoleDto>(`/api/identity/roles/${id}`, input);
}
/**
*
* @param input
* @returns
*/
export function getPagedListApi(input?: GetRolePagedListInput): Promise<PagedResultDto<IdentityRoleDto>> {
return requestClient.get<PagedResultDto<IdentityRoleDto>>("/api/identity/roles", {
params: input,
});
}
/**
*
* @param id id
* @param ouId id
*/
export function removeOrganizationUnitApi(id: string, ouId: string): Promise<void> {
return requestClient.delete(`/api/identity/roles/${id}/organization-units/${ouId}`);
}
/**
*
* @param id id
*/
export function getClaimsApi(id: string): Promise<ListResultDto<IdentityClaimDto>> {
return requestClient.get<ListResultDto<IdentityClaimDto>>(`/api/identity/roles/${id}/claims`);
}
/**
*
* @param id id
* @param input dto
*/
export function deleteClaimApi(id: string, input: IdentityClaimDeleteDto): Promise<void> {
return requestClient.delete(`/api/identity/roles/${id}/claims`, {
params: input,
});
}
/**
*
* @param id id
* @param input dto
*/
export function createClaimApi(id: string, input: IdentityClaimCreateDto): Promise<void> {
return requestClient.post(`/api/identity/roles/${id}/claims`, input);
}
/**
*
* @param id id
* @param input dto
*/
export function updateClaimApi(id: string, input: IdentityClaimUpdateDto): Promise<void> {
return requestClient.put(`/api/identity/roles/${id}/claims`, input);
}

31
apps/react-admin/src/api/management/identity/security-logs.ts

@ -0,0 +1,31 @@
import type { GetSecurityLogPagedRequest, SecurityLogDto } from "#/management/identity";
import type { PagedResultDto } from "#/abp-core";
import requestClient from "../../request";
/**
*
* @param id id
*/
export function deleteApi(id: string): Promise<void> {
return requestClient.delete(`/api/auditing/security-log/${id}`);
}
/**
*
* @param id id
* @returns
*/
export function getApi(id: string): Promise<SecurityLogDto> {
return requestClient.get<SecurityLogDto>(`/api/auditing/security-log/${id}`);
}
/**
*
* @param input
* @returns
*/
export function getPagedListApi(input?: GetSecurityLogPagedRequest): Promise<PagedResultDto<SecurityLogDto>> {
return requestClient.get<PagedResultDto<SecurityLogDto>>("/api/auditing/security-log", {
params: input,
});
}

44
apps/react-admin/src/api/management/identity/user-lookup.ts

@ -0,0 +1,44 @@
import type { ListResultDto } from "#/abp-core";
import type { IdentityUserDto, UserLookupCountInput, UserLookupSearchInput } from "#/management/identity/user";
import requestClient from "../../request";
/**
* id查询用户
* @param id id
* @returns
*/
export function findByIdApi(id: string): Promise<IdentityUserDto> {
return requestClient.get<IdentityUserDto>(`/api/identity/users/lookup/${id}`);
}
/**
*
* @param userName
* @returns
*/
export function findByUserNameApi(userName: string): Promise<IdentityUserDto> {
return requestClient.get<IdentityUserDto>(`/api/identity/users/lookup/by-username/${userName}`);
}
/**
*
* @param input
* @returns
*/
export function searchApi(input?: UserLookupSearchInput): Promise<ListResultDto<IdentityUserDto>> {
return requestClient.get<ListResultDto<IdentityUserDto>>("/api/identity/users/lookup/search", {
params: input,
});
}
/**
*
* @param input
*/
export function countApi(input?: UserLookupCountInput): Promise<number> {
return requestClient.get<number>("/api/identity/users/lookup/count", {
params: input,
});
}

22
apps/react-admin/src/api/management/identity/user-sessions.ts

@ -0,0 +1,22 @@
import type { PagedResultDto } from "#/abp-core";
import type { GetUserSessionsInput, IdentitySessionDto } from "#/management/identity/sessions";
import requestClient from "@/api/request";
/**
*
* @param { GetUserSessionsInput } input
* @returns { Promise<PagedResultDto<IdentitySessionDto>> }
*/
export function getSessionsApi(input?: GetUserSessionsInput): Promise<PagedResultDto<IdentitySessionDto>> {
return requestClient.get<PagedResultDto<IdentitySessionDto>>("/api/identity/sessions", {
params: input,
});
}
/**
*
* @param { string } sessionId id
* @returns { Promise<void> }
*/
export function revokeSessionApi(sessionId: string): Promise<void> {
return requestClient.delete(`/api/identity/sessions/${sessionId}/revoke`);
}

155
apps/react-admin/src/api/management/identity/users.ts

@ -0,0 +1,155 @@
import type { ListResultDto, PagedResultDto } from "#/abp-core";
import type { IdentityRoleDto, OrganizationUnitDto } from "#/management/identity";
import type {
IdentityClaimCreateDto,
IdentityClaimDeleteDto,
IdentityClaimDto,
IdentityClaimUpdateDto,
} from "#/management/identity/claims";
import type {
ChangeUserPasswordInput,
GetUserPagedListInput,
IdentityUserCreateDto,
IdentityUserDto,
IdentityUserUpdateDto,
} from "#/management/identity";
import requestClient from "../../request";
/**
*
* @param input
* @returns
*/
export function createApi(input: IdentityUserCreateDto): Promise<IdentityUserDto> {
return requestClient.post<IdentityUserDto>("/api/identity/users", input);
}
/**
*
* @param id id
*/
export function deleteApi(id: string): Promise<void> {
return requestClient.delete(`/api/identity/users/${id}`);
}
/**
*
* @param id id
* @returns
*/
export function getApi(id: string): Promise<IdentityUserDto> {
return requestClient.get<IdentityUserDto>(`/api/identity/users/${id}`);
}
/**
*
* @param id id
* @returns
*/
export function updateApi(id: string, input: IdentityUserUpdateDto): Promise<IdentityUserDto> {
return requestClient.put<IdentityUserDto>(`/api/identity/users/${id}`, input);
}
/**
*
* @param input
* @returns
*/
export function getPagedListApi(input?: GetUserPagedListInput): Promise<PagedResultDto<IdentityUserDto>> {
return requestClient.get<PagedResultDto<IdentityUserDto>>("/api/identity/users", {
params: input,
});
}
/**
*
* @param id id
* @param ouId id
*/
export function removeOrganizationUnitApi(id: string, ouId: string): Promise<void> {
return requestClient.delete(`/api/identity/users/${id}/organization-units/${ouId}`);
}
/**
*
* @param id id
*/
export function getOrganizationUnitsApi(id: string): Promise<ListResultDto<OrganizationUnitDto>> {
return requestClient.get<ListResultDto<OrganizationUnitDto>>(`/api/identity/users/${id}/organization-units`);
}
/**
*
* @param id id
* @param seconds ()
*/
export function lockApi(id: string, seconds: number): Promise<void> {
return requestClient.put(`/api/identity/users/${id}/lock/${seconds}`);
}
/**
*
* @param id id
*/
export function unLockApi(id: string): Promise<void> {
return requestClient.put(`/api/identity/users/${id}/unlock`);
}
/**
*
* @param id id
* @param input dto
*/
export function changePasswordApi(id: string, input: ChangeUserPasswordInput): Promise<void> {
return requestClient.put(`/api/identity/users/change-password?id=${id}`, input);
}
/**
*
*/
export function getAssignableRolesApi(): Promise<ListResultDto<IdentityRoleDto>> {
return requestClient.get<ListResultDto<IdentityRoleDto>>("/api/identity/users/assignable-roles");
}
/**
*
* @param id id
*/
export function getRolesApi(id: string): Promise<ListResultDto<IdentityRoleDto>> {
return requestClient.get<ListResultDto<IdentityRoleDto>>(`/api/identity/users/${id}/roles`);
}
/**
*
* @param id id
*/
export function getClaimsApi(id: string): Promise<ListResultDto<IdentityClaimDto>> {
return requestClient.get<ListResultDto<IdentityClaimDto>>(`/api/identity/users/${id}/claims`);
}
/**
*
* @param id id
* @param input dto
*/
export function deleteClaimApi(id: string, input: IdentityClaimDeleteDto): Promise<void> {
return requestClient.delete(`/api/identity/users/${id}/claims`, { params: input });
}
/**
*
* @param id id
* @param input dto
*/
export function createClaimApi(id: string, input: IdentityClaimCreateDto): Promise<void> {
return requestClient.post(`/api/identity/users/${id}/claims`, input);
}
/**
*
* @param id id
* @param input dto
*/
export function updateClaimApi(id: string, input: IdentityClaimUpdateDto): Promise<void> {
return requestClient.put(`/api/identity/users/${id}/claims`, input);
}

35
apps/react-admin/src/api/management/notifications/my-notifications.ts

@ -0,0 +1,35 @@
import type { PagedResultDto } from "#/abp-core";
import type {
GetMyNotifilerPagedListInput,
MarkReadStateInput,
UserNotificationDto,
} from "#/notifications/my-notifilers";
import requestClient from "@/api/request";
/**
*
* @param {GetMyNotifilerPagedListInput} input
* @returns {Promise<PagedResultDto<UserNotificationDto>>}
*/
export function getMyNotifilersApi(input?: GetMyNotifilerPagedListInput): Promise<PagedResultDto<UserNotificationDto>> {
return requestClient.get<PagedResultDto<UserNotificationDto>>("/api/notifications/my-notifilers", {
params: input,
});
}
/**
*
* @param {string} id id
* @returns {void}
*/
export function deleteMyNotifilerApi(id: string): Promise<void> {
return requestClient.delete(`/api/notifications/my-notifilers/${id}`);
}
/**
*
* @param {MarkReadStateInput} input
* @returns {void}
*/
export function markReadStateApi(input: MarkReadStateInput): Promise<void> {
return requestClient.put("/api/notifications/my-notifilers/mark-read-state", input);
}

39
apps/react-admin/src/api/management/notifications/notifications.ts

@ -0,0 +1,39 @@
import type { ListResultDto } from "#/abp-core";
import type { NotificationGroupDto, NotificationTemplateDto } from "#/notifications/definitions";
import type { NotificationSendInput, NotificationTemplateSendInput } from "#/notifications/notifications";
import requestClient from "@/api/request";
/**
*
* @returns {Promise<ListResultDto<NotificationGroupDto>>}
*/
export function getAssignableNotifiersApi(): Promise<ListResultDto<NotificationGroupDto>> {
return requestClient.get<ListResultDto<NotificationGroupDto>>("/api/notifications/assignables");
}
/**
*
* @returns {Promise<ListResultDto<NotificationTemplateDto>>}
*/
export function getAssignableTemplatesApi(): Promise<ListResultDto<NotificationTemplateDto>> {
return requestClient.get<ListResultDto<NotificationTemplateDto>>("/api/notifications/assignable-templates", {
method: "GET",
});
}
/**
*
* @param input
* @returns {Promise<void>}
*/
export function sendNotiferApi(input: NotificationSendInput): Promise<void> {
return requestClient.post("/api/notifications/send", input);
}
/**
*
* @param input
* @returns {Promise<void>}
*/
export function sendTemplateNotiferApi(input: NotificationTemplateSendInput): Promise<void> {
return requestClient.post("/api/notifications/send/template", input);
}

57
apps/react-admin/src/api/management/permissions/definitions.ts

@ -0,0 +1,57 @@
import type { ListResultDto } from "#/abp-core";
import type {
PermissionDefinitionCreateDto,
PermissionDefinitionDto,
PermissionDefinitionGetListInput,
PermissionDefinitionUpdateDto,
} from "#/management/permissions/definitions";
import requestClient from "../../request";
/**
*
* @param name
*/
export function deleteApi(name: string): Promise<void> {
return requestClient.delete(`/api/permission-management/definitions/${name}`);
}
/**
*
* @param name
* @returns
*/
export function getApi(name: string): Promise<PermissionDefinitionDto> {
return requestClient.get<PermissionDefinitionDto>(`/api/permission-management/definitions/${name}`);
}
/**
*
* @param input
* @returns
*/
export function getListApi(input?: PermissionDefinitionGetListInput): Promise<ListResultDto<PermissionDefinitionDto>> {
return requestClient.get<ListResultDto<PermissionDefinitionDto>>("/api/permission-management/definitions", {
params: input,
});
}
/**
*
* @param input
* @returns
*/
export function createApi(input: PermissionDefinitionCreateDto): Promise<PermissionDefinitionDto> {
return requestClient.post<PermissionDefinitionDto>("/api/permission-management/definitions", input);
}
/**
*
* @param name
* @param input
* @returns
*/
export function updateApi(name: string, input: PermissionDefinitionUpdateDto): Promise<PermissionDefinitionDto> {
return requestClient.put<PermissionDefinitionDto>(`/api/permission-management/definitions/${name}`, input);
}

68
apps/react-admin/src/api/management/permissions/groups.ts

@ -0,0 +1,68 @@
import type { ListResultDto } from "#/abp-core";
import type {
PermissionGroupDefinitionCreateDto,
PermissionGroupDefinitionDto,
PermissionGroupDefinitionGetListInput,
PermissionGroupDefinitionUpdateDto,
} from "#/management/permissions/groups";
import requestClient from "../../request";
/**
*
* @param name
*/
export function deleteApi(name: string): Promise<void> {
return requestClient.delete(`/api/permission-management/definitions/groups/${name}`);
}
/**
*
* @param name
* @returns
*/
export function getApi(name: string): Promise<PermissionGroupDefinitionDto> {
return requestClient.get<PermissionGroupDefinitionDto>(`/api/permission-management/definitions/groups/${name}`);
}
/**
*
* @param input
* @returns
*/
export function getListApi(
input?: PermissionGroupDefinitionGetListInput,
): Promise<ListResultDto<PermissionGroupDefinitionDto>> {
return requestClient.get<ListResultDto<PermissionGroupDefinitionDto>>(
"/api/permission-management/definitions/groups",
{
params: input,
},
);
}
/**
*
* @param input
* @returns
*/
export function createApi(input: PermissionGroupDefinitionCreateDto): Promise<PermissionGroupDefinitionDto> {
return requestClient.post<PermissionGroupDefinitionDto>("/api/permission-management/definitions/groups", input);
}
/**
*
* @param name
* @param input
* @returns
*/
export function updateApi(
name: string,
input: PermissionGroupDefinitionUpdateDto,
): Promise<PermissionGroupDefinitionDto> {
return requestClient.put<PermissionGroupDefinitionDto>(
`/api/permission-management/definitions/groups/${name}`,
input,
);
}

25
apps/react-admin/src/api/management/permissions/permissions.ts

@ -0,0 +1,25 @@
import type { PermissionProvider, PermissionResultDto, PermissionsUpdateDto } from "#/management/permissions";
import requestClient from "../../request";
/**
*
* @param provider
* @returns
*/
export function getApi(provider: PermissionProvider): Promise<PermissionResultDto> {
return requestClient.get<PermissionResultDto>("/api/permission-management/permissions", {
params: provider,
});
}
/**
*
* @param provider
* @param input
*/
export function updateApi(provider: PermissionProvider, input: PermissionsUpdateDto): Promise<void> {
return requestClient.put("/api/permission-management/permissions", input, {
params: provider,
});
}

56
apps/react-admin/src/api/management/settings/definitions.ts

@ -0,0 +1,56 @@
import type { ListResultDto } from "#/abp-core";
import type {
SettingDefinitionCreateDto,
SettingDefinitionDto,
SettingDefinitionGetListInput,
SettingDefinitionUpdateDto,
} from "#/management/settings/definitions";
import requestClient from "@/api/request";
/**
*
* @param name
*/
export function deleteApi(name: string): Promise<void> {
return requestClient.delete(`/api/setting-management/settings/definitions/${name}`);
}
/**
*
* @param name
* @returns
*/
export function getApi(name: string): Promise<SettingDefinitionDto> {
return requestClient.get<SettingDefinitionDto>(`/api/setting-management/settings/definitions/${name}`);
}
/**
*
* @param input
* @returns
*/
export function getListApi(input?: SettingDefinitionGetListInput): Promise<ListResultDto<SettingDefinitionDto>> {
return requestClient.get<ListResultDto<SettingDefinitionDto>>("/api/setting-management/settings/definitions", {
params: input,
});
}
/**
*
* @param input
* @returns
*/
export function createApi(input: SettingDefinitionCreateDto): Promise<SettingDefinitionDto> {
return requestClient.post<SettingDefinitionDto>("/api/setting-management/settings/definitions", input);
}
/**
*
* @param name
* @param input
* @returns
*/
export function updateApi(name: string, input: SettingDefinitionUpdateDto): Promise<SettingDefinitionDto> {
return requestClient.put<SettingDefinitionDto>(`/api/setting-management/settings/definitions/${name}`, input);
}

62
apps/react-admin/src/api/management/settings/settings.ts

@ -0,0 +1,62 @@
import type { ListResultDto } from "#/abp-core";
import type { SettingGroup, SettingsUpdateInput } from "#/management/settings";
import requestClient from "@/api/request";
/**
*
* @returns
*/
export function getGlobalSettingsApi(): Promise<ListResultDto<SettingGroup>> {
return requestClient.get<ListResultDto<SettingGroup>>("/api/setting-management/settings/by-global");
}
/**
*
* @returns
*/
export function setGlobalSettingsApi(input: SettingsUpdateInput): Promise<void> {
return requestClient.put("/api/setting-management/settings/change-global", input);
}
/**
*
* @returns
*/
export function getTenantSettingsApi(): Promise<ListResultDto<SettingGroup>> {
return requestClient.get<ListResultDto<SettingGroup>>("api/setting-management/settings/by-current-tenant");
}
/**
*
* @returns
*/
export function setTenantSettingsApi(input: SettingsUpdateInput): Promise<void> {
return requestClient.put("/api/setting-management/settings/change-current-tenant", input);
}
/**
*
* @returns
*/
export function getUserSettingsApi(): Promise<ListResultDto<SettingGroup>> {
return requestClient.get<ListResultDto<SettingGroup>>("/api/setting-management/settings/by-current-user");
}
/**
*
* @returns
*/
export function setUserSettingsApi(input: SettingsUpdateInput): Promise<void> {
return requestClient.put("/api/setting-management/settings/change-current-user", input);
}
/**
*
* @param emailAddress
*/
export const sendTestEmailApi = (emailAddress: string) => {
return requestClient.post("/api/setting-management/settings/send-test-email", {
emailAddress,
});
};

58
apps/react-admin/src/api/openiddict/applications.ts

@ -0,0 +1,58 @@
import type { PagedResultDto } from "#/abp-core";
import type {
OpenIddictApplicationCreateDto,
OpenIddictApplicationDto,
OpenIddictApplicationGetListInput,
OpenIddictApplicationUpdateDto,
} from "#/openiddict/applications";
import requestClient from "../request";
/**
*
* @param input
* @returns
*/
export function createApi(input: OpenIddictApplicationCreateDto): Promise<OpenIddictApplicationDto> {
return requestClient.post<OpenIddictApplicationDto>("/api/openiddict/applications", input);
}
/**
*
* @param id id
*/
export function deleteApi(id: string): Promise<void> {
return requestClient.delete(`/api/openiddict/applications/${id}`);
}
/**
*
* @param id id
* @returns
*/
export function getApi(id: string): Promise<OpenIddictApplicationDto> {
return requestClient.get<OpenIddictApplicationDto>(`/api/openiddict/applications/${id}`);
}
/**
*
* @param id id
* @param input
* @returns
*/
export function updateApi(id: string, input: OpenIddictApplicationUpdateDto): Promise<OpenIddictApplicationDto> {
return requestClient.put<OpenIddictApplicationDto>(`/api/openiddict/applications/${id}`, input);
}
/**
*
* @param input
* @returns
*/
export function getPagedListApi(
input?: OpenIddictApplicationGetListInput,
): Promise<PagedResultDto<OpenIddictApplicationDto>> {
return requestClient.get<PagedResultDto<OpenIddictApplicationDto>>("/api/openiddict/applications", {
params: input,
});
}

34
apps/react-admin/src/api/openiddict/authorizations.ts

@ -0,0 +1,34 @@
import type { PagedResultDto } from "#/abp-core";
import type { OpenIddictAuthorizationDto, OpenIddictAuthorizationGetListInput } from "#/openiddict/authorizations";
import requestClient from "../request";
/**
*
* @param id id
*/
export function deleteApi(id: string): Promise<void> {
return requestClient.delete(`/api/openiddict/authorizations/${id}`);
}
/**
*
* @param id id
* @returns
*/
export function getApi(id: string): Promise<OpenIddictAuthorizationDto> {
return requestClient.get<OpenIddictAuthorizationDto>(`/api/openiddict/authorizations/${id}`);
}
/**
*
* @param input
* @returns
*/
export function getPagedListApi(
input?: OpenIddictAuthorizationGetListInput,
): Promise<PagedResultDto<OpenIddictAuthorizationDto>> {
return requestClient.get<PagedResultDto<OpenIddictAuthorizationDto>>("/api/openiddict/authorizations", {
params: input,
});
}

11
apps/react-admin/src/api/openiddict/open-id.ts

@ -0,0 +1,11 @@
import type { OpenIdConfiguration } from "#/abp-core/openid";
import requestClient from "../request";
/**
* openid发现端点
* @returns OpenId配置数据
*/
export function discoveryApi(): Promise<OpenIdConfiguration> {
return requestClient.get<OpenIdConfiguration>("/.well-known/openid-configuration");
}

56
apps/react-admin/src/api/openiddict/scopes.ts

@ -0,0 +1,56 @@
import type { PagedResultDto } from "#/abp-core";
import type {
OpenIddictScopeCreateDto,
OpenIddictScopeDto,
OpenIddictScopeGetListInput,
OpenIddictScopeUpdateDto,
} from "#/openiddict/scopes";
import requestClient from "../request";
/**
*
* @param input
* @returns
*/
export function createApi(input: OpenIddictScopeCreateDto): Promise<OpenIddictScopeDto> {
return requestClient.post<OpenIddictScopeDto>("/api/openiddict/scopes", input);
}
/**
*
* @param id id
*/
export function deleteApi(id: string): Promise<void> {
return requestClient.delete(`/api/openiddict/scopes/${id}`);
}
/**
*
* @param id id
* @returns
*/
export function getApi(id: string): Promise<OpenIddictScopeDto> {
return requestClient.get<OpenIddictScopeDto>(`/api/openiddict/scopes/${id}`);
}
/**
*
* @param id id
* @param input
* @returns
*/
export function updateApi(id: string, input: OpenIddictScopeUpdateDto): Promise<OpenIddictScopeDto> {
return requestClient.put<OpenIddictScopeDto>(`/api/openiddict/scopes/${id}`, input);
}
/**
*
* @param input
* @returns
*/
export function getPagedListApi(input?: OpenIddictScopeGetListInput): Promise<PagedResultDto<OpenIddictScopeDto>> {
return requestClient.get<PagedResultDto<OpenIddictScopeDto>>("/api/openiddict/scopes", {
params: input,
});
}

31
apps/react-admin/src/api/openiddict/tokens.ts

@ -0,0 +1,31 @@
import type { PagedResultDto } from "#/abp-core";
import type { OpenIddictTokenDto, OpenIddictTokenGetListInput } from "#/openiddict/tokens";
import requestClient from "../request";
/**
*
* @param id id
*/
export function deleteApi(id: string): Promise<void> {
return requestClient.delete(`/api/openiddict/tokens/${id}`);
}
/**
*
* @param id id
* @returns
*/
export function getApi(id: string): Promise<OpenIddictTokenDto> {
return requestClient.get<OpenIddictTokenDto>(`/api/openiddict/tokens/${id}`);
}
/**
*
* @param input
* @returns
*/
export function getPagedListApi(input?: OpenIddictTokenGetListInput): Promise<PagedResultDto<OpenIddictTokenDto>> {
return requestClient.get<PagedResultDto<OpenIddictTokenDto>>("/api/openiddict/tokens", {
params: input,
});
}

127
apps/react-admin/src/api/request.ts

@ -0,0 +1,127 @@
import { authenticateResponseInterceptor, errorMessageResponseInterceptor, RequestClient } from "@/request-client";
import useLocaleStore from "@/store/localeI18nStore";
import useUserStore from "@/store/userStore";
import userStore from "@/store/userStore";
import { mapLocaleToAbpLanguageFormat } from "@/utils";
import { toast } from "sonner";
import { refreshToken } from "./account/token";
import { wrapperResult } from "@/utils/abp/request";
import { handleOAuthError } from "@/utils/abp/handleOAuthError";
const requestClient = new RequestClient({
baseURL: import.meta.env.VITE_APP_BASE_API,
});
/**
*
*/
async function doReAuthenticate() {
console.warn("Access token or refresh token is invalid or expired. ");
//直接登出
userStore.getState().actions.clearUserInfoAndToken();
}
/**
* token逻辑
*/
async function doRefreshToken() {
console.debug("try -> Refresh token");
const { userToken } = useUserStore.getState();
if (!userToken.refreshToken) {
console.warn("No refresh token available.");
return "";
}
try {
const res = await refreshToken({ refreshToken: userToken.refreshToken });
const { tokenType, accessToken, refreshToken: newRefreshToken } = res;
if (accessToken) {
// 更新 userStore,保存新 token
useUserStore.getState().actions.setUserToken({
accessToken: `${tokenType} ${accessToken}`,
refreshToken: newRefreshToken,
});
console.debug("Token refreshed successfully.");
return `${tokenType} ${accessToken}`; // 返回新 token 供拦截器使用
}
console.error("Failed to refresh token: No access token returned.");
return "";
} catch (error) {
console.error("Error refreshing token:", error);
return ""; // 返回空字符串,触发重登录逻辑
}
}
function formatToken(token: null | string) {
return token ? token : null; //有个tokenType的获取值
}
// 请求头处理
requestClient.addRequestInterceptor({
fulfilled: async (config) => {
const { userToken } = useUserStore.getState();
if (userToken.accessToken) {
config.headers.Authorization = `${userToken.accessToken}`;
}
const { locale } = useLocaleStore.getState();
config.headers["Accept-Language"] = mapLocaleToAbpLanguageFormat(locale);
config.headers["X-Request-From"] = "slash-admin";
return config;
},
});
// response数据解构
requestClient.addResponseInterceptor<any>({
fulfilled: (response) => {
const { data, status } = response;
const { hasWrapResult, getData } = wrapperResult(response);
if (hasWrapResult()) {
return getData();
}
if (status >= 200 && status < 400) {
return data;
}
throw Object.assign({}, response, { response });
},
});
// token过期的处理
requestClient.addResponseInterceptor(
authenticateResponseInterceptor({
client: requestClient,
doReAuthenticate,
doRefreshToken,
enableRefreshToken: true,
formatToken,
}),
);
// 通用的错误处理,如果没有进入上面的错误处理逻辑,就会进入这里
requestClient.addResponseInterceptor(
errorMessageResponseInterceptor((msg: string, error) => {
// 这里可以根据业务进行定制,你可以拿到 error 内的信息进行定制化处理,根据不同的 code 做不同的提示,而不是直接使用 message.error 提示 msg
// 当前mock接口返回的错误字段是 error 或者 message
const responseData = error?.response?.data ?? {};
if (responseData?.error_description) {
const { formatError } = handleOAuthError();
toast.error(formatError(responseData) || msg, {
position: "top-center",
});
return;
}
const errorMessage = responseData?.error ?? responseData?.message ?? "";
// 如果没有错误信息,则会根据状态码进行提示
toast.error(errorMessage || msg, {
position: "top-center",
});
}),
);
export default requestClient;

11
apps/react-admin/src/api/services/demoService.ts

@ -0,0 +1,11 @@
import apiClient from "../apiClient";
export enum DemoApi {
TOKEN_EXPIRED = "/user/tokenExpired",
}
const mockTokenExpired = () => apiClient.post({ url: DemoApi.TOKEN_EXPIRED });
export default {
mockTokenExpired,
};

13
apps/react-admin/src/api/services/orgService.ts

@ -0,0 +1,13 @@
import apiClient from "../apiClient";
import type { Organization } from "#/entity";
export enum OrgApi {
Org = "/org",
}
const getOrgList = () => apiClient.get<Organization[]>({ url: OrgApi.Org });
export default {
getOrgList,
};

33
apps/react-admin/src/api/services/userService.ts

@ -0,0 +1,33 @@
import apiClient from "../apiClient";
import type { UserInfo, UserToken } from "#/entity";
export interface SignInReq {
username: string;
password: string;
}
export interface SignUpReq extends SignInReq {
email: string;
}
export type SignInRes = UserToken & { user: UserInfo };
export enum UserApi {
SignIn = "/auth/signin",
SignUp = "/auth/signup",
Logout = "/auth/logout",
Refresh = "/auth/refresh",
User = "/user",
}
const signin = (data: SignInReq) => apiClient.post<SignInRes>({ url: UserApi.SignIn, data });
const signup = (data: SignUpReq) => apiClient.post<SignInRes>({ url: UserApi.SignUp, data });
const logout = () => apiClient.get({ url: UserApi.Logout });
const findById = (id: string) => apiClient.get<UserInfo[]>({ url: `${UserApi.User}/${id}` });
export default {
signin,
signup,
findById,
logout,
};

8
apps/react-admin/src/assets/icons/ic-analysis.svg

@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" class="weava-extension-context" data-weava-installed="1">
<g opacity="0.32">
<path d="M2.60946 22.9843C1.77292 22.9631 1.13928 22.4599 1.07089 21.6259C1.02993 21.1264 1 20.4398 1 19.5C1 18.5602 1.02993 17.8736 1.07089 17.3741C1.13928 16.5401 1.77292 16.0369 2.60946 16.0157C2.97545 16.0064 3.43306 16 4 16C4.56694 16 5.02455 16.0064 5.39055 16.0157C6.2271 16.0369 6.8607 16.5401 6.9291 17.3741C6.97005 17.8736 7 18.5602 7 19.5C7 20.4398 6.97005 21.1264 6.9291 21.6259C6.8607 22.4599 6.2271 22.9631 5.39055 22.9843C5.02455 22.9936 4.56694 23 4 23C3.43306 23 2.97545 22.9936 2.60946 22.9843Z" fill="currentColor"/>
<path d="M18.8455 22.9792C17.8709 22.9408 17.1875 22.2557 17.1243 21.2823C17.0588 20.2731 17 18.6337 17 16C17 13.3663 17.0588 11.727 17.1243 10.7177C17.1875 9.74435 17.8709 9.0592 18.8455 9.02075C19.1671 9.00805 19.5489 9 20 9C20.4511 9 20.8329 9.00805 21.1545 9.02075C22.1291 9.0592 22.8125 9.74435 22.8757 10.7177C22.9412 11.727 23 13.3663 23 16C23 18.6337 22.9412 20.2731 22.8757 21.2823C22.8125 22.2557 22.1291 22.9408 21.1545 22.9792C20.8329 22.9919 20.4511 23 20 23C19.5489 23 19.1671 22.9919 18.8455 22.9792Z" fill="currentColor"/>
<path d="M10.7766 22.9832C9.8427 22.9548 9.162 22.3419 9.0949 21.41C9.0422 20.6775 9 19.5936 9 18C9 16.4064 9.0422 15.3225 9.0949 14.59C9.162 13.6581 9.8427 13.0453 10.7766 13.0169C11.1121 13.0067 11.5163 13 12 13C12.4837 13 12.8879 13.0067 13.2234 13.0169C14.1573 13.0453 14.838 13.6581 14.9051 14.59C14.9578 15.3225 15 16.4064 15 18C15 19.5936 14.9578 20.6775 14.9051 21.41C14.838 22.3419 14.1573 22.9548 13.2234 22.9832C12.8879 22.9934 12.4837 23 12 23C11.5163 23 11.1121 22.9934 10.7766 22.9832Z" fill="currentColor"/>
</g>
<path d="M20.9603 6.0506C20.9106 7.03855 19.9709 7.40975 19.242 6.741C18.9106 6.4369 18.5138 6.06255 18.0418 5.60285C16.9756 6.5731 15.322 8.08585 13.3506 9.91645C12.8329 10.3972 11.992 10.3435 11.5397 9.8007L11.5394 9.8003C10.6518 8.73835 9.75755 7.6807 8.8322 6.6514C7.7509 7.4453 5.81 8.95825 3.88389 10.8844C3.39573 11.3725 2.60427 11.3725 2.11612 10.8844C1.62796 10.3962 1.62796 9.60475 2.11612 9.1166C4.00573 7.227 6.079 5.4545 8.30255 3.96314L8.306 3.96082C8.30685 3.96027 8.3066 3.96042 8.3066 3.96042C8.8024 3.6299 9.46255 3.69527 9.8839 4.1166C10.8519 5.08455 11.7265 6.14925 12.6118 7.19265C14.1169 5.80065 15.3848 4.64087 16.274 3.8314C15.8705 3.41506 15.5362 3.06006 15.26 2.75898C14.591 2.02997 14.9624 1.08998 15.9506 1.04025C17.2115 0.976795 18.5055 0.939456 19.7511 1.17232C20.3119 1.27718 20.7233 1.68863 20.8281 2.24948C21.061 3.49521 21.0238 4.78949 20.9603 6.0506Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

7
apps/react-admin/src/assets/icons/ic-blog.svg

@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" class="weava-extension-context" data-weava-installed="1">
<g opacity="0.32">
<path d="M21 8H13C12.7348 8 12.4804 7.89464 12.2929 7.70711C12.1054 7.51957 12 7.26522 12 7C12 6.73478 12.1054 6.48043 12.2929 6.29289C12.4804 6.10536 12.7348 6 13 6H21C21.2652 6 21.5196 6.10536 21.7071 6.29289C21.8946 6.48043 22 6.73478 22 7C22 7.26522 21.8946 7.51957 21.7071 7.70711C21.5196 7.89464 21.2652 8 21 8ZM21 12H13C12.7348 12 12.4804 11.8946 12.2929 11.7071C12.1054 11.5196 12 11.2652 12 11C12 10.7348 12.1054 10.4804 12.2929 10.2929C12.4804 10.1054 12.7348 10 13 10H21C21.2652 10 21.5196 10.1054 21.7071 10.2929C21.8946 10.4804 22 10.7348 22 11C22 11.2652 21.8946 11.5196 21.7071 11.7071C21.5196 11.8946 21.2652 12 21 12Z" fill="currentColor"/>
<path d="M21 16H3C2.73478 16 2.48043 15.8946 2.29289 15.7071C2.10536 15.5196 2 15.2652 2 15C2 14.7348 2.10536 14.4804 2.29289 14.2929C2.48043 14.1054 2.73478 14 3 14H21C21.2652 14 21.5196 14.1054 21.7071 14.2929C21.8946 14.4804 22 14.7348 22 15C22 15.2652 21.8946 15.5196 21.7071 15.7071C21.5196 15.8946 21.2652 16 21 16ZM13 20H3C2.73478 20 2.48043 19.8946 2.29289 19.7071C2.10536 19.5196 2 19.2652 2 19C2 18.7348 2.10536 18.4804 2.29289 18.2929C2.48043 18.1054 2.73478 18 3 18H13C13.2652 18 13.5196 18.1054 13.7071 18.2929C13.8946 18.4804 14 18.7348 14 19C14 19.2652 13.8946 19.5196 13.7071 19.7071C13.5196 19.8946 13.2652 20 13 20Z" fill="currentColor"/>
</g>
<rect x="2" y="4" width="8" height="8" rx="2" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

10
apps/react-admin/src/assets/icons/ic-clear.svg

@ -0,0 +1,10 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.1168 1L8.76172 7.34165" stroke="#8A8D91" stroke-linecap="square" stroke-linejoin="round"/>
<path d="M8.43913 10.1911C9.19153 9.43869 9.19153 8.21604 8.43913 7.45021C7.68673 6.68437 6.46408 6.69781 5.69824 7.45021L8.43913 10.1911Z" stroke="#8A8D91" stroke-linecap="square" stroke-linejoin="round"/>
<path d="M1.02277 15.0001C0.780926 11.6815 2.47382 8.53751 5.71183 7.44922L8.45271 10.1901C7.96902 10.8753 7.8078 13.4012 9.44695 15.0001H1.02277Z" stroke="#8A8D91" stroke-miterlimit="10" stroke-linecap="square"/>
<path d="M4.07237 11.4941C4.07237 11.4941 3.105 12.784 3.07812 14.7053" stroke="#8A8D91" stroke-linecap="square" stroke-linejoin="round"/>
<path d="M5.84602 12.9844C5.65792 13.3337 5.42951 13.9786 5.44295 14.6907" stroke="#8A8D91" stroke-linecap="square" stroke-linejoin="round"/>
<path d="M12.8193 13.8711H15.493" stroke="#8A8D91" stroke-linecap="square" stroke-linejoin="round"/>
<path d="M11.0186 10.9297H15.4926" stroke="#8A8D91" stroke-linecap="square" stroke-linejoin="round"/>
<path d="M12.04 8H15.493" stroke="#8A8D91" stroke-linecap="square" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

1
apps/react-admin/src/assets/icons/ic-dashboard.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="" viewBox="0 0 24 24"><g><g><g fill="currentColor"><path d="M10 14h4v7h-4z"></path><path d="M20.42 10.18L12.71 2.3a1 1 0 0 0-1.42 0l-7.71 7.89A2 2 0 0 0 3 11.62V20a2 2 0 0 0 1.89 2H8v-9a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v9h3.11A2 2 0 0 0 21 20v-8.38a2.07 2.07 0 0 0-.58-1.44Z"></path></g></g></g></svg>

After

Width:  |  Height:  |  Size: 418 B

1
apps/react-admin/src/assets/icons/ic-left-arrow.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" viewBox="0 0 24 24"><g id="iconifyReact6083"><g><path id="iconifyReact6085" fill="currentColor" d="M13.83 19a1 1 0 0 1-.78-.37l-4.83-6a1 1 0 0 1 0-1.27l5-6a1 1 0 0 1 1.54 1.28L10.29 12l4.32 5.36a1 1 0 0 1-.78 1.64Z"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 351 B

1
apps/react-admin/src/assets/icons/ic-locale_en_US.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="component-iconify MuiBox-root css-1virv8 iconify iconify--flagpack" width="1.34em" height="1em" viewBox="0 0 32 24"><defs><path id="iconifyReact3157" fill="#fff" d="M0 0h32v24H0z"></path></defs><mask id="iconifyReact3158" width="32" height="24" x="0" y="0" maskUnits="userSpaceOnUse"><use href="#iconifyReact3157"></use></mask><g fill="none" mask="url(#iconifyReact3158)"><path fill="#2E42A5" fill-rule="evenodd" d="M0 0v24h32V0H0z" clip-rule="evenodd"></path><mask id="iconifyReact3159" width="32" height="24" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" fill-rule="evenodd" d="M0 0v24h32V0H0z" clip-rule="evenodd"></path></mask><g mask="url(#iconifyReact3159)"><mask id="iconifyReact3160" width="32" height="24" x="0" y="0" maskUnits="userSpaceOnUse"><use href="#iconifyReact3157"></use></mask><g mask="url(#iconifyReact3160)"><path fill="#fff" d="m-3.563 22.285l7.041 2.979L32.16 3.238l3.714-4.426l-7.53-.995l-11.698 9.491l-9.416 6.396l-10.793 8.581z"></path><path fill="#F50100" d="M-2.6 24.372L.989 26.1L34.54-1.599h-5.037l-32.102 25.97z"></path><path fill="#fff" d="m35.563 22.285l-7.042 2.979L-.159 3.238l-3.715-4.426l7.53-.995l11.698 9.491l9.416 6.396l10.793 8.581z"></path><path fill="#F50100" d="m35.323 23.783l-3.588 1.728l-14.286-11.86l-4.236-1.324l-17.445-13.5H.806l17.434 13.18l4.631 1.588l12.452 10.188z"></path><mask id="iconifyReact3161" fill="#fff"><path fill-rule="evenodd" d="M19.778-2h-7.556V8H-1.973v8h14.195v10h7.556V16h14.25V8h-14.25V-2z" clip-rule="evenodd"></path></mask><path fill="#F50100" fill-rule="evenodd" d="M19.778-2h-7.556V8H-1.973v8h14.195v10h7.556V16h14.25V8h-14.25V-2z" clip-rule="evenodd"></path><path fill="#fff" d="M12.222-2v-2h-2v2h2zm7.556 0h2v-2h-2v2zM12.222 8v2h2V8h-2zM-1.973 8V6h-2v2h2zm0 8h-2v2h2v-2zm14.195 0h2v-2h-2v2zm0 10h-2v2h2v-2zm7.556 0v2h2v-2h-2zm0-10v-2h-2v2h2zm14.25 0v2h2v-2h-2zm0-8h2V6h-2v2zm-14.25 0h-2v2h2V8zm-7.556-8h7.556v-4h-7.556v4zm2 8V-2h-4V8h4zm-16.195 2h14.195V6H-1.973v4zm2 6V8h-4v8h4zm12.195-2H-1.973v4h14.195v-4zm2 12V16h-4v10h4zm5.556-2h-7.556v4h7.556v-4zm-2-8v10h4V16h-4zm16.25-2h-14.25v4h14.25v-4zm-2-6v8h4V8h-4zm-12.25 2h14.25V6h-14.25v4zm-2-12V8h4V-2h-4z" mask="url(#iconifyReact3161)"></path></g></g></g></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

1
apps/react-admin/src/assets/icons/ic-locale_zh_CN.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="component-iconify MuiBox-root css-1virv8 iconify iconify--flagpack" width="1.34em" height="1em" viewBox="0 0 32 24"><mask id="iconifyReact2752" width="32" height="24" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h32v24H0z"></path></mask><g fill="none" fill-rule="evenodd" clip-rule="evenodd" mask="url(#iconifyReact2752)"><path fill="#E31D1C" d="M0 0h32v24H0V0z"></path><path fill="#FECA00" d="m15.016 4.548l-1.01.61l.23-1.19l-.841-.89l1.139-.049l.482-1.11l.482 1.11h1.137l-.84.94l.253 1.19l-1.032-.61zM7.018 9.607l-2.881 1.551l.657-3.026l-2.4-2.265l3.25-.123l1.374-2.826l1.374 2.826h3.243L9.24 8.132l.72 3.026l-2.943-1.55zm9.998-1.059l-1.01.61l.23-1.19l-.841-.89l1.139-.049l.482-1.11l.482 1.11h1.137l-.84.94l.253 1.19l-1.032-.61zm-1 4l-1.01.61l.23-1.19l-.841-.89l1.139-.049l.482-1.11l.482 1.11h1.137l-.84.94l.253 1.19l-1.032-.61zm-3 3l-1.01.61l.23-1.19l-.841-.89l1.139-.049l.482-1.11l.482 1.11h1.137l-.84.94l.253 1.19l-1.032-.61z"></path></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

21
apps/react-admin/src/assets/icons/ic-logo.svg

@ -0,0 +1,21 @@
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 512 512">
<defs>
<linearGradient id="BG1" x1="100%" x2="50%" y1="9.946%" y2="50%">
<stop offset="0%" stop-color="#5BE49B"></stop>
<stop offset="100%" stop-color="#00A76F"></stop>
</linearGradient>
<linearGradient id="BG2" x1="50%" x2="50%" y1="0%" y2="100%">
<stop offset="0%" stop-color="#5BE49B"></stop>
<stop offset="100%" stop-color="#00A76F"></stop>
</linearGradient>
<linearGradient id="BG3" x1="50%" x2="50%" y1="0%" y2="100%">
<stop offset="0%" stop-color="#5BE49B"></stop>
<stop offset="100%" stop-color="#00A76F"></stop>
</linearGradient>
</defs>
<g fill="#00A76F" fill-rule="evenodd" stroke="none" stroke-width="1">
<path fill="url(#BG1)" d="M183.168 285.573l-2.918 5.298-2.973 5.363-2.846 5.095-2.274 4.043-2.186 3.857-2.506 4.383-1.6 2.774-2.294 3.939-1.099 1.869-1.416 2.388-1.025 1.713-1.317 2.18-.95 1.558-1.514 2.447-.866 1.38-.833 1.312-.802 1.246-.77 1.18-.739 1.111-.935 1.38-.664.956-.425.6-.41.572-.59.8-.376.497-.537.69-.171.214c-10.76 13.37-22.496 23.493-36.93 29.334-30.346 14.262-68.07 14.929-97.202-2.704l72.347-124.682 2.8-1.72c49.257-29.326 73.08 1.117 94.02 40.927z"></path>
<path fill="url(#BG2)" d="M444.31 229.726c-46.27-80.956-94.1-157.228-149.043-45.344-7.516 14.384-12.995 42.337-25.267 42.337v-.142c-12.272 0-17.75-27.953-25.265-42.337C189.79 72.356 141.96 148.628 95.69 229.584c-3.483 6.106-6.828 11.932-9.69 16.996 106.038-67.127 97.11 135.667 184 137.278V384c86.891-1.611 77.962-204.405 184-137.28-2.86-5.062-6.206-10.888-9.69-16.994"></path>
<path fill="url(#BG3)" d="M450 384c26.509 0 48-21.491 48-48s-21.491-48-48-48-48 21.491-48 48 21.491 48 48 48"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

4
apps/react-admin/src/assets/icons/ic-management.svg

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
<path opacity="0.32" d="M2.162 8.5C2 9.603 2 11.05 2 13C2 16.771 2 18.657 3.172 19.828C4.343 21 6.229 21 10 21H14C17.771 21 19.657 21 20.828 19.828C22 18.657 22 16.771 22 13C22 11.05 22 9.603 21.838 8.5C19.561 9.98 18.102 10.923 16.75 11.505V12C16.7511 12.0985 16.7327 12.1962 16.696 12.2876C16.6593 12.379 16.6049 12.4623 16.536 12.5327C16.3968 12.6748 16.2069 12.7559 16.008 12.758C15.8091 12.7601 15.6175 12.6831 15.4753 12.544C15.3332 12.4048 15.2521 12.2149 15.25 12.016C13.1197 12.5776 10.8803 12.5776 8.75 12.016C8.74788 12.2149 8.66683 12.4048 8.52467 12.544C8.38252 12.6831 8.19091 12.7601 7.992 12.758C7.79309 12.7559 7.60317 12.6748 7.46401 12.5327C7.32486 12.3905 7.24788 12.1989 7.25 12V11.504C5.898 10.924 4.44 9.98 2.162 8.5Z" fill="currentColor"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.581 2.24999H10.561C10.447 2.24999 10.359 2.24999 10.275 2.25499C9.75542 2.28658 9.25549 2.46498 8.8333 2.76945C8.4111 3.07392 8.084 3.49197 7.88999 3.97499C7.84737 4.08839 7.80736 4.20276 7.76999 4.31799L7.76599 4.32999C7.66284 4.60265 7.48845 4.84265 7.26099 5.02499C7.03399 5.03299 6.81699 5.04199 6.60899 5.05499C4.96499 5.15099 3.92199 5.42099 3.17099 6.17199C2.92699 6.41599 2.73299 6.69199 2.58099 7.00999C2.63945 7.03005 2.69521 7.05726 2.74699 7.09099C4.84699 8.45599 6.16699 9.31099 7.26299 9.85799C7.29767 9.67415 7.3998 9.5099 7.54935 9.39749C7.69889 9.28507 7.88506 9.23261 8.0713 9.25039C8.25753 9.26818 8.4304 9.35493 8.55597 9.49361C8.68154 9.6323 8.75074 9.81291 8.74999 9.99999V10.458C10.87 11.098 13.13 11.098 15.25 10.458V9.99999C15.2505 9.81382 15.3203 9.6345 15.4458 9.49692C15.5712 9.35933 15.7433 9.27332 15.9286 9.25561C16.114 9.2379 16.2993 9.28976 16.4485 9.4011C16.5977 9.51243 16.7002 9.67529 16.736 9.85799C17.833 9.30999 19.153 8.45599 21.253 7.09099C21.3051 7.05722 21.3612 7.03001 21.42 7.00999C21.2719 6.69896 21.0716 6.41554 20.828 6.17199C20.078 5.42199 19.035 5.15199 17.391 5.05399C17.194 5.04299 16.988 5.03399 16.773 5.02599C16.5214 4.82098 16.3271 4.55433 16.209 4.25199L16.205 4.24299C16.169 4.13599 16.141 4.05199 16.11 3.97399C15.9158 3.49116 15.5887 3.07332 15.1665 2.76903C14.7443 2.46474 14.2445 2.28649 13.725 2.25499C13.6297 2.2505 13.5344 2.24883 13.439 2.24999H10.581ZM14.818 4.81599L14.813 4.80499L14.808 4.79299L14.803 4.78099L14.8 4.77099L14.798 4.76599L14.794 4.75399L14.79 4.74199L14.788 4.73599L14.785 4.72799L14.783 4.72099L14.781 4.71499C14.7615 4.65414 14.7405 4.59378 14.718 4.53399C14.6298 4.31442 14.4812 4.12437 14.2893 3.98594C14.0974 3.84751 13.8702 3.76638 13.634 3.75199C13.5624 3.74949 13.4907 3.74882 13.419 3.74999H10.581C10.438 3.74999 10.398 3.74999 10.366 3.75199C10.1298 3.76638 9.90258 3.84751 9.71069 3.98594C9.5188 4.12437 9.37014 4.31442 9.28199 4.53399L9.27899 4.54099L9.27099 4.56199C9.24331 4.63808 9.2173 4.71476 9.19299 4.79199L9.19199 4.79799L9.18899 4.80499L9.18699 4.81299L9.18499 4.81899L9.18099 4.83099L9.17599 4.84299L9.17499 4.84799L9.17099 4.85799L9.16599 4.86999L9.16199 4.88199L9.15699 4.89199C9.14306 4.92829 9.12839 4.9653 9.11299 5.00099L9.99999 4.99999H14.896C14.8676 4.93955 14.8423 4.87818 14.818 4.81599Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

40
apps/react-admin/src/assets/icons/ic-markdown.svg

@ -0,0 +1,40 @@
<svg xmlns="http://www.w3.org/2000/svg" width="201" height="200" viewBox="0 0 201 200" fill="none">
<g filter="url(#filter0_di_2208_147554)">
<rect x="24.0137" y="44" width="152" height="112" rx="12" fill="white"/>
</g>
<g filter="url(#filter1_di_2208_147554)">
<path d="M144.524 132H55.5168C51.3802 132 48.0137 128.639 48.0137 124.502V75.4979C48.0137 71.3613 51.3802 68 55.5168 68H144.518C148.655 68 152.021 71.3613 152.021 75.4979V124.502C152.027 128.639 148.66 132 144.524 132ZM73.0205 117.004V103.203C73.0205 101.313 75.401 100.477 76.5821 101.954L81.4595 108.049C82.2602 109.05 83.7821 109.05 84.5828 108.049L89.4602 101.954C90.6413 100.477 93.0218 101.313 93.0218 103.203V115.004C93.0218 116.109 93.9172 117.004 95.0218 117.004H101.022C102.127 117.004 103.022 116.109 103.022 115.004V84.9958C103.022 83.8912 102.127 82.9958 101.022 82.9958H93.9832C93.3755 82.9958 92.8009 83.272 92.4213 83.7465L84.583 93.5465C83.7824 94.5475 82.2599 94.5475 81.4593 93.5465L73.621 83.7465C73.2415 83.272 72.6668 82.9958 72.0591 82.9958H65.0199C63.9153 82.9958 63.0199 83.8912 63.0199 84.9958V114.999C63.0199 116.104 63.9153 116.999 65.0199 116.999H73.0153C73.0182 116.999 73.0205 117.001 73.0205 117.004V117.004ZM137.193 103.301C138.305 102.004 137.383 100 135.675 100H132.022C130.918 100 130.022 99.1046 130.022 98V84.9958C130.022 83.8912 129.127 82.9958 128.022 82.9958H122.016C120.912 82.9958 120.016 83.8912 120.016 84.9958V98C120.016 99.1046 119.121 100 118.016 100H114.365C112.656 100 111.734 102.004 112.846 103.302L123.503 115.732C124.301 116.663 125.742 116.663 126.54 115.732L137.193 103.301Z" fill="#00A76F"/>
</g>
<defs>
<filter id="filter0_di_2208_147554" x="16.0137" y="36" width="184" height="144" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dx="8" dy="8"/>
<feGaussianBlur stdDeviation="8"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.770709 0 0 0 0 0.792653 0 0 0 0 0.818587 0 0 0 0.16 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_2208_147554"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_2208_147554" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dx="-2" dy="-2"/>
<feGaussianBlur stdDeviation="2"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.717499 0 0 0 0 0.740813 0 0 0 0 0.768367 0 0 0 0.48 0"/>
<feBlend mode="normal" in2="shape" result="effect2_innerShadow_2208_147554"/>
</filter>
<filter id="filter1_di_2208_147554" x="44.0137" y="64" width="120.008" height="80" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dx="4" dy="4"/>
<feGaussianBlur stdDeviation="4"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0.470588 0 0 0 0 0.403922 0 0 0 0.16 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_2208_147554"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_2208_147554" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dx="-1" dy="-1"/>
<feGaussianBlur stdDeviation="1"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0.470588 0 0 0 0 0.403922 0 0 0 0.48 0"/>
<feBlend mode="normal" in2="shape" result="effect2_innerShadow_2208_147554"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

5
apps/react-admin/src/assets/icons/ic-menu.svg

@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" class="weava-extension-context" data-weava-installed="1">
<path opacity="0.32" d="M15.2798 4.5H4.7202C3.77169 4.5 3 5.06057 3 5.75042C3 6.43943 3.77169 7 4.7202 7H15.2798C16.2283 7 17 6.43943 17 5.75042C17 5.06054 16.2283 4.5 15.2798 4.5Z" fill="currentColor"/>
<path d="M19.2798 10.75H8.7202C7.77169 10.75 7 11.3106 7 12.0004C7 12.6894 7.77169 13.25 8.7202 13.25H19.2798C20.2283 13.25 21 12.6894 21 12.0004C21 11.3105 20.2283 10.75 19.2798 10.75Z" fill="currentColor"/>
<path d="M15.2798 17H4.7202C3.77169 17 3 17.5606 3 18.2504C3 18.9394 3.77169 19.5 4.7202 19.5H15.2798C16.2283 19.5 17 18.9394 17 18.2504C17 17.5606 16.2283 17 15.2798 17Z" fill="currentcolor"/>
</svg>

After

Width:  |  Height:  |  Size: 767 B

5
apps/react-admin/src/assets/icons/ic-menulevel.svg

@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path opacity="0.32" d="M15.2798 4.5H4.7202C3.77169 4.5 3 5.06057 3 5.75042C3 6.43943 3.77169 7 4.7202 7H15.2798C16.2283 7 17 6.43943 17 5.75042C17 5.06054 16.2283 4.5 15.2798 4.5Z" fill="currentColor"/>
<path d="M19.2798 10.75H8.7202C7.77169 10.75 7 11.3106 7 12.0004C7 12.6894 7.77169 13.25 8.7202 13.25H19.2798C20.2283 13.25 21 12.6894 21 12.0004C21 11.3105 20.2283 10.75 19.2798 10.75Z" fill="currentColor"/>
<path d="M15.2798 17H4.7202C3.77169 17 3 17.5606 3 18.2504C3 18.9394 3.77169 19.5 4.7202 19.5H15.2798C16.2283 19.5 17 18.9394 17 18.2504C17 17.5606 16.2283 17 15.2798 17Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 710 B

1
apps/react-admin/src/assets/icons/ic-reset-password.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.2 KiB

1
apps/react-admin/src/assets/icons/ic-right-arrow.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="" viewBox="0 0 24 24"><g><g><path fill="currentColor" d="M10 19a1 1 0 0 1-.64-.23a1 1 0 0 1-.13-1.41L13.71 12L9.39 6.63a1 1 0 0 1 .15-1.41a1 1 0 0 1 1.46.15l4.83 6a1 1 0 0 1 0 1.27l-5 6A1 1 0 0 1 10 19Z"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 346 B

1
apps/react-admin/src/assets/icons/ic-search.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" viewBox="0 0 24 24"><g><g ><path fill="currentColor" d="m20.71 19.29l-3.4-3.39A7.92 7.92 0 0 0 19 11a8 8 0 1 0-8 8a7.92 7.92 0 0 0 4.9-1.69l3.39 3.4a1 1 0 0 0 1.42 0a1 1 0 0 0 0-1.42ZM5 11a6 6 0 1 1 6 6a6 6 0 0 1-6-6Z"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 356 B

1
apps/react-admin/src/assets/icons/ic-setting.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" viewBox="0 0 24 24"><g fill="currentColor"><path fill-rule="evenodd" d="M14.279 2.152C13.909 2 13.439 2 12.5 2s-1.409 0-1.779.152a2.008 2.008 0 0 0-1.09 1.083c-.094.223-.13.484-.145.863a1.615 1.615 0 0 1-.796 1.353a1.64 1.64 0 0 1-1.579.008c-.338-.178-.583-.276-.825-.308a2.026 2.026 0 0 0-1.49.396c-.318.242-.553.646-1.022 1.453c-.47.807-.704 1.21-.757 1.605c-.07.526.074 1.058.4 1.479c.148.192.357.353.68.555c.477.297.783.803.783 1.361c0 .558-.306 1.064-.782 1.36c-.324.203-.533.364-.682.556a1.99 1.99 0 0 0-.399 1.479c.053.394.287.798.757 1.605c.47.807.704 1.21 1.022 1.453c.424.323.96.465 1.49.396c.242-.032.487-.13.825-.308a1.64 1.64 0 0 1 1.58.008c.486.28.774.795.795 1.353c.015.38.051.64.145.863c.204.49.596.88 1.09 1.083c.37.152.84.152 1.779.152s1.409 0 1.779-.152a2.008 2.008 0 0 0 1.09-1.083c.094-.223.13-.483.145-.863c.02-.558.309-1.074.796-1.353a1.64 1.64 0 0 1 1.579-.008c.338.178.583.276.825.308c.53.07 1.066-.073 1.49-.396c.318-.242.553-.646 1.022-1.453c.47-.807.704-1.21.757-1.605a1.99 1.99 0 0 0-.4-1.479c-.148-.192-.357-.353-.68-.555c-.477-.297-.783-.803-.783-1.361c0-.558.306-1.064.782-1.36c.324-.203.533-.364.682-.556a1.99 1.99 0 0 0 .399-1.479c-.053-.394-.287-.798-.757-1.605c-.47-.807-.704-1.21-1.022-1.453a2.026 2.026 0 0 0-1.49-.396c-.242.032-.487.13-.825.308a1.64 1.64 0 0 1-1.58-.008a1.615 1.615 0 0 1-.795-1.353c-.015-.38-.051-.64-.145-.863a2.007 2.007 0 0 0-1.09-1.083Z" clip-rule="evenodd" opacity=".5"></path><path d="M15.523 12c0 1.657-1.354 3-3.023 3c-1.67 0-3.023-1.343-3.023-3S10.83 9 12.5 9c1.67 0 3.023 1.343 3.023 3Z"></path></g></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

6
apps/react-admin/src/assets/icons/ic-settings-exit-fullscreen.svg

@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor">
<path d="M7.72269 1.10502C8.04079 0.966359 8.3992 0.997545 8.73649 1.01866C9.05411 1.03689 9.38757 1.1458 9.5886 1.40537C9.7762 1.63039 9.83857 1.92834 9.84913 2.21478C9.9734 4.25822 10.0598 6.31029 9.93021 8.35565C9.89615 9.14826 9.23883 9.84684 8.45053 9.93177C7.41178 10.0176 6.36823 9.99558 5.32708 9.9975C4.4625 9.96151 3.59647 9.96199 2.73428 9.88523C2.40418 9.85548 2.06449 9.87755 1.74447 9.77775C1.38606 9.67412 1.09723 9.35074 1.04733 8.97938C0.995992 8.64736 0.983518 8.30719 1.0243 7.97373C1.05933 7.70313 1.24069 7.46707 1.47866 7.33993C1.75646 7.17152 2.08992 7.16144 2.40466 7.13841C3.93328 7.04006 5.46526 7.01703 6.99628 7.01079C7.01067 5.34639 7.03418 3.68007 7.16517 2.01998C7.18436 1.6491 7.37964 1.27151 7.72269 1.10502Z" fill="currentColor"/>
<path d="M14.6572 1.18467C14.9378 1.0177 15.2756 1.01242 15.5923 1.0009C15.8859 0.998026 16.2122 1.01578 16.4434 1.22113C16.7087 1.43512 16.8172 1.78249 16.8335 2.1121C16.9496 3.74244 16.9678 5.37757 16.9755 7.01079C18.5622 7.01991 20.1503 7.03814 21.7331 7.14993C22.046 7.16624 22.3722 7.21902 22.6275 7.41477C22.8323 7.56495 22.9609 7.8106 22.9782 8.06345C23.0017 8.38444 22.9936 8.71021 22.9341 9.02688C22.863 9.40783 22.5416 9.71874 22.1659 9.8003C21.7826 9.8881 21.3843 9.85884 20.9957 9.90586C19.694 9.98742 18.3895 10.0105 17.0854 9.99606C16.5408 9.98262 15.9948 9.98262 15.4536 9.92073C14.7186 9.80462 14.1135 9.14922 14.0651 8.40554C13.9235 6.29542 14.0037 4.17713 14.1529 2.06988C14.1663 1.71676 14.3486 1.36555 14.6572 1.18467Z" fill="currentColor"/>
<path d="M2.1144 14.1544C4.07675 14.0426 6.04486 13.9409 8.00961 14.0479C8.31908 14.0589 8.63718 14.0748 8.92314 14.2062C9.5152 14.4505 9.90527 15.0636 9.93358 15.6965C10.0531 17.5993 9.98588 19.5084 9.86833 21.4094C9.83427 21.7721 9.87409 22.165 9.66874 22.486C9.48929 22.7979 9.13041 22.9553 8.78352 22.9802C8.47837 23.009 8.16651 23.0119 7.8652 22.9514C7.52694 22.8607 7.27841 22.5518 7.20452 22.2173C7.13495 21.9045 7.1244 21.5831 7.10472 21.2645C7.03084 19.8376 7.00877 18.4087 7.00493 16.9799C6.63837 16.9569 6.27132 16.978 5.90476 16.9698C4.58725 16.9473 3.26926 16.9257 1.95511 16.8211C1.62645 16.7966 1.30259 16.6278 1.13227 16.3394C0.979691 16.0731 1.0008 15.7536 1.00464 15.4575C1.02287 15.1783 1.03199 14.877 1.1932 14.6361C1.39231 14.331 1.756 14.1626 2.1144 14.1544Z" fill="currentColor"/>
<path d="M15.9795 14.0479C17.9461 13.9409 19.9157 14.0426 21.88 14.1544C22.2369 14.1635 22.5972 14.3319 22.7949 14.6366C22.972 14.9058 22.9739 15.2412 22.9883 15.5521C22.9916 15.8279 22.9979 16.1278 22.8395 16.3677C22.6615 16.6445 22.3396 16.7995 22.0172 16.823C20.3432 16.9478 18.6634 16.9833 16.9851 16.9814C16.9674 18.6007 16.9386 20.2209 16.8297 21.8373C16.8359 22.1981 16.7145 22.5834 16.4142 22.8051C16.1858 22.9941 15.8753 22.9927 15.5951 22.9999C15.3476 22.9975 15.0957 22.9855 14.8577 22.9111C14.6025 22.8291 14.3808 22.6391 14.2728 22.3925C14.1582 22.1588 14.1447 21.894 14.126 21.6392C14.008 19.6452 13.9322 17.643 14.0598 15.6475C14.0848 15.0156 14.5103 14.4236 15.0976 14.1923C15.3744 14.0695 15.682 14.0618 15.9795 14.0479Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

6
apps/react-admin/src/assets/icons/ic-settings-fullscreen.svg

@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path d="M2.73284 1.06863C4.67417 0.927089 6.62125 1.03265 8.56163 1.13293C8.87159 1.15836 9.20218 1.16316 9.47519 1.33157C9.76692 1.50383 9.94829 1.8277 9.9718 2.16261C9.99915 2.48745 10.0246 2.82092 9.95261 3.14191C9.85089 3.53584 9.4608 3.79206 9.06975 3.82853C7.38032 3.96 5.68466 3.99358 3.99091 3.99071C3.97508 5.70124 3.94533 7.4137 3.81626 9.11992C3.76396 9.52873 3.45496 9.92601 3.03032 9.98215C2.69493 10.0196 2.3533 10.0042 2.01983 9.95384C1.70603 9.91306 1.42054 9.70626 1.28764 9.41933C1.16576 9.17942 1.15041 8.90641 1.1341 8.64347C1.0151 6.66279 0.942169 4.67492 1.06404 2.69281C1.07892 2.22595 1.29963 1.7706 1.66093 1.4736C1.95506 1.21354 2.34563 1.08927 2.73284 1.06863Z" fill="#637381"/>
<path d="M15.4666 1.13101C17.3965 1.03121 19.3335 0.928048 21.2638 1.06863C21.6745 1.08975 22.0895 1.23081 22.386 1.52398C22.7473 1.83922 22.9186 2.32047 22.9378 2.79069C23.0467 4.66245 22.982 6.539 22.8668 8.40884C22.8337 8.74615 22.8702 9.10457 22.7094 9.41549C22.5751 9.70242 22.2915 9.90874 21.9782 9.9524C21.6313 10.0057 21.2748 10.0225 20.9264 9.97687C20.5723 9.9121 20.2974 9.60502 20.2106 9.26483C20.1285 8.93567 20.1237 8.59405 20.1016 8.25722C20.0273 6.83649 20.0076 5.41288 20.0023 3.99023C18.4655 3.97103 16.9258 3.96767 15.3913 3.86164C15.136 3.84292 14.8731 3.84868 14.6298 3.75943C14.3199 3.64908 14.0641 3.36791 14.0219 3.03635C13.9802 2.69952 13.9931 2.35646 14.0454 2.02107C14.0996 1.66121 14.3751 1.35604 14.7162 1.23945C14.9571 1.1574 15.2147 1.14972 15.4666 1.13101Z" fill="#637381"/>
<path d="M1.69452 14.1724C1.99728 14.0083 2.35282 14.0112 2.68773 14.004C2.95403 14.0001 3.2472 14.0251 3.45304 14.2146C3.72221 14.4324 3.82729 14.7856 3.84169 15.12C3.95876 16.7447 3.97508 18.3746 3.98275 20.0026C5.59781 20.0141 7.21479 20.0309 8.82648 20.1489C9.1993 20.1672 9.60714 20.2871 9.82978 20.6091C10.0294 20.896 10.0016 21.264 9.99147 21.5961C9.97804 21.9291 9.9315 22.2961 9.66952 22.5331C9.36963 22.8565 8.89702 22.8412 8.49253 22.8647C6.7057 22.9894 4.91216 23.0307 3.12197 22.9635C2.77842 22.9367 2.42192 22.9491 2.09852 22.8119C1.58368 22.5912 1.18112 22.1047 1.09331 21.5476C1.05828 21.3418 1.0554 21.1326 1.04293 20.9253C0.946967 18.9734 1.02326 17.0182 1.15952 15.0706C1.17824 14.7098 1.3668 14.3432 1.69452 14.1724Z" fill="#637381"/>
<path d="M20.5661 14.1944C20.7983 14.0006 21.1174 13.9996 21.4043 14.0049C21.7417 14.014 22.1073 14.0279 22.3937 14.229C22.6941 14.4396 22.8352 14.812 22.8443 15.1694C22.969 17.2297 23.0578 19.2992 22.9273 21.3619C22.8855 22.1325 22.2517 22.8282 21.4821 22.9184C20.7878 22.9904 20.0887 22.976 19.392 23C17.9003 22.9765 16.4066 22.9544 14.9196 22.8206C14.5679 22.7831 14.2469 22.5461 14.1102 22.2198C14.0118 21.9607 14.0085 21.6781 13.9984 21.4046C13.9998 21.1316 13.996 20.8332 14.1668 20.6033C14.4048 20.2713 14.8314 20.16 15.22 20.1437C16.8087 20.0333 18.4017 20.0112 19.9937 20.0031C20.0086 18.3583 20.0316 16.7115 20.1578 15.0711C20.1717 14.7405 20.296 14.4003 20.5661 14.1944Z" fill="#637381"/>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

4
apps/react-admin/src/assets/icons/ic-settings-mode-moon.svg

@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.4" d="M16.9462 11.0863C16.9759 11.0874 17.0055 11.0886 17.035 11.0898C20.1966 11.2176 22.5 13.3358 22.5 16.5C22.5 19.6642 20.1966 21.7824 17.035 21.9102C15.7057 21.9639 14.0498 22 12 22C9.9502 22 8.2943 21.9639 6.965 21.9102C3.80337 21.7824 1.5 19.6642 1.5 16.5C1.5 14.0317 2.90165 12.1999 5.019 11.4529C5.2406 8.2951 7.3872 6.02435 10.6413 6.00125C10.7585 6.00045 10.878 6 11 6C11.122 6 11.2415 6.00045 11.3587 6.00125C14.4855 6.02345 16.5897 8.1208 16.9462 11.0863Z" fill="currentColor"/>
<path d="M19.2407 2.28853C19.5263 2.12002 19.5419 1.62921 19.2169 1.57222C18.1306 1.38179 16.9755 1.56344 15.9464 2.17059C14.4123 3.07575 13.5394 4.70186 13.501 6.38837C15.4283 7.12677 16.6785 8.86242 16.9459 11.0863L17.0347 11.0898C17.7391 11.1183 18.401 11.2456 19.0042 11.4612C19.6324 11.3806 20.2555 11.1732 20.8383 10.8294C21.8673 10.2222 22.5988 9.2907 22.9806 8.23415C23.0948 7.918 22.6711 7.6864 22.3855 7.8549C20.8813 8.74235 18.958 8.2157 18.0896 6.6786C17.2212 5.1415 17.7366 3.17599 19.2407 2.28853Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

13
apps/react-admin/src/assets/icons/ic-settings-mode-sun.svg

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor">
<path d="M11.9998 18.1111C15.3749 18.1111 18.1109 15.3751 18.1109 12C18.1109 8.62495 15.3749 5.88892 11.9998 5.88892C8.62471 5.88892 5.88867 8.62495 5.88867 12C5.88867 15.3751 8.62471 18.1111 11.9998 18.1111Z" fill="currentColor"/>
<g opacity="0.4">
<path d="M10.1667 2.83333C10.1667 1.78189 10.8396 1.00805 11.891 1.00039C11.9266 1.00013 11.9629 1 12 1C12.0371 1 12.0734 1.00013 12.109 1.00039C13.1604 1.00805 13.8333 1.78189 13.8333 2.83333C13.8333 3.88481 13.1604 4.6586 12.109 4.6663C12.0734 4.66654 12.0371 4.66667 12 4.66667C11.9629 4.66667 11.9266 4.66654 11.891 4.6663C10.8396 4.6586 10.1667 3.88475 10.1667 2.83333Z" fill="currentColor"/>
<path d="M10.1667 21.1667C10.1667 22.2181 10.8396 22.9919 11.891 22.9996C11.9266 22.9999 11.9629 23 12 23C12.0371 23 12.0734 22.9999 12.109 22.9996C13.1604 22.9919 13.8333 22.2181 13.8333 21.1667C13.8333 20.1152 13.1604 19.3414 12.109 19.3337C12.0734 19.3335 12.0371 19.3333 12 19.3333C11.9629 19.3333 11.9266 19.3335 11.891 19.3337C10.8396 19.3414 10.1667 20.1152 10.1667 21.1667Z" fill="currentColor"/>
<path d="M17.1855 4.22184C17.9289 3.47836 18.9519 3.40695 19.7008 4.14502C19.7262 4.17002 19.7519 4.19562 19.7782 4.22184C19.8044 4.24806 19.83 4.27384 19.855 4.29921C20.593 5.04806 20.5216 6.07106 19.7782 6.81454C19.0347 7.55802 18.0117 7.62939 17.2628 6.89136C17.2375 6.86636 17.2117 6.84076 17.1855 6.81454C17.1592 6.78832 17.1336 6.76253 17.1086 6.73717C16.3706 5.98832 16.442 4.96532 17.1855 4.22184Z" fill="currentColor"/>
<path d="M4.22184 17.1855C3.47836 17.9289 3.40696 18.9519 4.14502 19.7008C4.17002 19.7262 4.19562 19.7519 4.22184 19.7782C4.24806 19.8044 4.27384 19.83 4.29921 19.855C5.04806 20.593 6.07106 20.5216 6.81454 19.7782C7.55802 19.0347 7.62939 18.0117 6.89136 17.2628C6.86636 17.2375 6.84076 17.2117 6.81454 17.1855C6.78832 17.1592 6.76253 17.1336 6.73717 17.1086C5.98832 16.3706 4.96532 16.442 4.22184 17.1855Z" fill="currentColor"/>
<path d="M2.83333 13.8333C1.78189 13.8333 1.00805 13.1604 1.00039 12.109C1.00013 12.0734 1 12.0371 1 12C1 11.9629 1.00013 11.9266 1.00039 11.891C1.00805 10.8396 1.78189 10.1667 2.83333 10.1667C3.88475 10.1667 4.6586 10.8396 4.6663 11.891C4.66654 11.9266 4.66667 11.9629 4.66667 12C4.66667 12.0371 4.66654 12.0734 4.6663 12.109C4.6586 13.1604 3.88475 13.8333 2.83333 13.8333Z" fill="currentColor"/>
<path d="M21.1667 13.8333C22.2181 13.8333 22.9919 13.1604 22.9996 12.109C22.9999 12.0734 23 12.0371 23 12C23 11.9629 22.9999 11.9266 22.9996 11.891C22.9919 10.8396 22.2181 10.1667 21.1667 10.1667C20.1152 10.1667 19.3414 10.8396 19.3337 11.891C19.3335 11.9266 19.3333 11.9629 19.3333 12C19.3333 12.0371 19.3335 12.0734 19.3337 12.109C19.3414 13.1604 20.1152 13.8333 21.1667 13.8333Z" fill="currentColor"/>
<path d="M4.22184 6.81454C3.47836 6.07106 3.40695 5.04806 4.14502 4.29921C4.17002 4.27384 4.19562 4.24806 4.22184 4.22184C4.24806 4.19562 4.27384 4.17002 4.29921 4.14502C5.04806 3.40695 6.07106 3.47836 6.81454 4.22184C7.55802 4.96532 7.62939 5.98832 6.89136 6.73717C6.86636 6.76253 6.84076 6.78832 6.81454 6.81454C6.78832 6.84076 6.76253 6.86636 6.73717 6.89136C5.98832 7.62939 4.96532 7.55802 4.22184 6.81454Z" fill="currentColor"/>
<path d="M17.1855 19.7782C17.9289 20.5216 18.9519 20.593 19.7008 19.855C19.7262 19.83 19.7519 19.8044 19.7782 19.7782C19.8044 19.7519 19.83 19.7262 19.855 19.7008C20.593 18.9519 20.5216 17.9289 19.7782 17.1855C19.0347 16.442 18.0117 16.3706 17.2628 17.1086C17.2375 17.1336 17.2117 17.1592 17.1855 17.1855C17.1592 17.2117 17.1336 17.2375 17.1086 17.2628C16.3706 18.0117 16.442 19.0347 17.1855 19.7782Z" fill="currentColor"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

4
apps/react-admin/src/assets/icons/ic-user.svg

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" class="weava-extension-context" data-weava-installed="1">
<path opacity="0.32" d="M2.28099 19.6575C2.36966 20.5161 2.93261 21.1957 3.77688 21.3755C5.1095 21.6592 7.6216 22 12 22C16.3784 22 18.8905 21.6592 20.2232 21.3755C21.0674 21.1957 21.6303 20.5161 21.719 19.6575C21.8505 18.3844 22 16.0469 22 12C22 7.95305 21.8505 5.6156 21.719 4.34251C21.6303 3.48389 21.0674 2.80424 20.2231 2.62451C18.8905 2.34081 16.3784 2 12 2C7.6216 2 5.1095 2.34081 3.77688 2.62451C2.93261 2.80424 2.36966 3.48389 2.28099 4.34251C2.14952 5.6156 2 7.95305 2 12C2 16.0469 2.14952 18.3844 2.28099 19.6575Z" fill="currentColor"/>
<path d="M13.9382 13.8559C15.263 13.1583 16.1663 11.7679 16.1663 10.1666C16.1663 7.8655 14.3008 6 11.9996 6C9.69841 6 7.83291 7.8655 7.83291 10.1666C7.83291 11.768 8.73626 13.1584 10.0612 13.856C8.28691 14.532 6.93216 16.1092 6.51251 18.0529C6.45446 18.3219 6.60246 18.5981 6.87341 18.6471C7.84581 18.8231 9.45616 19 12.0006 19C14.545 19 16.1554 18.8231 17.1278 18.6471C17.3977 18.5983 17.5454 18.3231 17.4876 18.0551C17.0685 16.1103 15.7133 14.5321 13.9382 13.8559Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

4
apps/react-admin/src/assets/icons/ic-workbench.svg

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" class="weava-extension-context" data-weava-installed="1">
<path opacity="0.32" d="M21.1808 16.9703C20.8971 17.6255 20.2225 18 19.5086 18H14.8154C14.8462 17.9145 14.8735 17.8269 14.8971 17.7373C15.1709 16.6974 14.8825 15.639 14.2214 14.8963C14.4654 12.9091 14.6177 10.8733 14.7108 9.26516C14.7569 8.46731 13.7795 8.20081 13.4274 8.91526C12.7178 10.3553 11.8493 12.1958 11.0842 14.041C10.1467 14.3479 9.3768 15.1177 9.10295 16.1576C8.93642 16.7899 8.97782 17.4291 9.18451 18H4.49141C3.77747 18 3.10288 17.6255 2.81918 16.9703C2.29212 15.7533 2 14.4108 2 13C2 7.47715 6.47715 3 12 3C17.5229 3 22 7.47715 22 13C22 14.4108 21.7079 15.7533 21.1808 16.9703Z" fill="currentColor"/>
<path d="M14.7108 9.26516C14.7569 8.46731 13.7795 8.20081 13.4274 8.91526C12.7178 10.3553 11.8493 12.1958 11.0842 14.041C10.1467 14.3479 9.3768 15.1177 9.10295 16.1576C8.6742 17.7856 9.62375 19.459 11.2238 19.8953C12.8238 20.3315 14.4684 19.3654 14.8971 17.7373C15.1709 16.6974 14.8825 15.639 14.2214 14.8963C14.4654 12.9091 14.6177 10.8733 14.7108 9.26516Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

4
apps/react-admin/src/assets/icons/ic_blank.svg

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path opacity="0.32" fill-rule="evenodd" clip-rule="evenodd" d="M20.9114 8.22695C19.4717 8.5891 17.7718 8.61315 16.3035 8.1646C15.6828 7.97495 15.1988 7.4914 14.9893 6.8771C14.4674 5.34677 14.3385 3.47362 14.722 2.0318C13.9279 2.01186 13.0248 2 12 2C8.51575 2 6.43945 2.13682 5.26285 2.26379C4.39116 2.35785 3.71902 2.94826 3.5558 3.80967C3.30175 5.15055 3 7.65725 3 12C3 16.3428 3.30175 18.8494 3.5558 20.1903C3.71902 21.0518 4.39116 21.6422 5.26285 21.7362C6.43945 21.8631 8.51575 22 12 22C15.4843 22 17.5606 21.8631 18.7372 21.7362C19.6089 21.6422 20.281 21.0518 20.4442 20.1903C20.6982 18.8494 21 16.3428 21 12C21 10.5445 20.9661 9.2952 20.9114 8.22695Z" fill="currentColor"/>
<path d="M20.9114 8.22695C19.4717 8.5891 17.7718 8.61315 16.3035 8.1646C15.6828 7.97495 15.1988 7.4914 14.9893 6.8771C14.4674 5.34675 14.3384 3.47357 14.722 2.03174C14.722 2.03174 15.9461 2.49994 18.1961 4.74994C20.4461 6.99995 20.9114 8.22695 20.9114 8.22695Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

28
apps/react-admin/src/assets/icons/ic_chat.svg

@ -0,0 +1,28 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<g id="icons/notification/ic_chat">
<g id="stack">
<path id="Path" fill-rule="evenodd" clip-rule="evenodd" d="M15.9546 7.27183C20.3369 7.20489 23.9136 10.654 23.9985 15.0359C24.0109 15.6793 23.9466 16.3055 23.8141 16.9061C23.5898 17.9232 23.4564 18.9581 23.4564 19.9997V22.0128C23.4564 22.3213 23.2064 22.5713 22.898 22.5713H20.8848C19.8433 22.5713 18.8083 22.7047 17.7913 22.929C17.1907 23.0615 16.5645 23.1258 15.9211 23.1133C11.5392 23.0285 8.09012 19.4519 8.15696 15.0697C8.22216 10.7924 11.6773 7.33718 15.9546 7.27183Z" fill="url(#paint0_linear_0_8824)"/>
<path id="Path_2" fill-rule="evenodd" clip-rule="evenodd" d="M9.80149 0.0425493C4.4627 -0.0390131 0.105251 4.16291 0.00184497 9.50132C-0.0132957 10.285 0.0650325 11.048 0.22647 11.7797C0.499751 13.0187 0.66222 14.2796 0.66222 15.5485V18.0011C0.66222 18.3768 0.966814 18.6815 1.34261 18.6815H3.7952C5.06402 18.6815 6.32491 18.8439 7.56395 19.1172C8.29567 19.2786 9.05861 19.357 9.84231 19.3418C15.1806 19.2384 19.3825 14.8811 19.3012 9.54242C19.2217 4.33147 15.0124 0.122096 9.80149 0.0425493Z" fill="url(#paint1_linear_0_8824)"/>
<g id="Vector" opacity="0.48">
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.19693 9.17512C5.9243 8.88543 5.53843 8.70351 5.10915 8.70351C4.28354 8.70351 3.61426 9.37279 3.61426 10.1984C3.61426 10.6276 3.79613 11.0135 4.08587 11.2862L7.31059 14.5109C7.58326 14.8006 7.96913 14.9825 8.39837 14.9825C9.22398 14.9825 9.89326 14.3132 9.89326 13.4876C9.89326 13.0584 9.71134 12.6725 9.42165 12.3998L6.19693 9.17512Z" fill="#006C9C"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.4245 9.17512C10.1518 8.88543 9.76597 8.70351 9.33669 8.70351C8.51108 8.70351 7.8418 9.37279 7.8418 10.1984C7.8418 10.6276 8.02367 11.0135 8.31341 11.2862L11.5381 14.5109C11.8108 14.8006 12.1967 14.9825 12.6259 14.9825C13.4515 14.9825 14.1208 14.3132 14.1208 13.4876C14.1208 13.0584 13.9389 12.6725 13.6492 12.3998L10.4245 9.17512Z" fill="#006C9C"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.6518 9.1751C14.3792 8.88541 13.9933 8.70349 13.564 8.70349C12.7384 8.70349 12.0692 9.37277 12.0692 10.1984C12.0692 10.6276 12.2511 11.0135 12.5408 11.2862L15.7655 14.5109C16.0382 14.8006 16.424 14.9825 16.8533 14.9825C17.6789 14.9825 18.3482 14.3132 18.3482 13.4876C18.3482 13.0584 18.1662 12.6725 17.8765 12.3998L14.6518 9.1751Z" fill="#006C9C"/>
</g>
<g id="Vector_2">
<path d="M6.60404 10.1981C6.60404 11.0237 5.93475 11.693 5.10915 11.693C4.28354 11.693 3.61426 11.0237 3.61426 10.1981C3.61426 9.37253 4.28354 8.70325 5.10915 8.70325C5.93475 8.70325 6.60404 9.37253 6.60404 10.1981Z" fill="white"/>
<path d="M10.8314 10.1982C10.8314 11.0238 10.1621 11.6931 9.33649 11.6931C8.51088 11.6931 7.84159 11.0238 7.84159 10.1982C7.84159 9.37257 8.51088 8.70329 9.33649 8.70329C10.1621 8.70329 10.8314 9.37257 10.8314 10.1982Z" fill="white"/>
<path d="M15.0592 10.1982C15.0592 11.0238 14.3899 11.6931 13.5643 11.6931C12.7387 11.6931 12.0694 11.0238 12.0694 10.1982C12.0694 9.37257 12.7387 8.70329 13.5643 8.70329C14.3899 8.70329 15.0592 9.37257 15.0592 10.1982Z" fill="white"/>
</g>
</g>
</g>
<defs>
<linearGradient id="paint0_linear_0_8824" x1="8.15601" y1="7.27087" x2="24" y2="23.1149" gradientUnits="userSpaceOnUse">
<stop stop-color="#77ED8B"/>
<stop offset="1" stop-color="#22C55E"/>
</linearGradient>
<linearGradient id="paint1_linear_0_8824" x1="0" y1="0.0413818" x2="19.3023" y2="19.3437" gradientUnits="userSpaceOnUse">
<stop stop-color="#00B8D9"/>
<stop offset="1" stop-color="#006C9C"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

1
apps/react-admin/src/assets/icons/ic_decline.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><path d="M5 6.25a.75.75 0 0 0-.488 1.32l7 6c.28.24.695.24.976 0l7-6A.75.75 0 0 0 19 6.25H5Z" opacity=".5"></path><path fill-rule="evenodd" d="M4.43 10.512a.75.75 0 0 1 1.058-.081L12 16.012l6.512-5.581a.75.75 0 1 1 .976 1.139l-7 6a.75.75 0 0 1-.976 0l-7-6a.75.75 0 0 1-.081-1.058Z" clip-rule="evenodd"></path></g></svg>

After

Width:  |  Height:  |  Size: 509 B

20
apps/react-admin/src/assets/icons/ic_delivery.svg

@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<g id="icons/notification/ic_shipping">
<g id="stack">
<path id="Combined Shape" d="M23.9846 13.5663L20.4739 9.74142C20.2159 9.46006 19.8516 9.29989 19.4698 9.29993H15.1113V19.7723H16.7785C16.7785 18.4551 17.8463 17.3874 19.1634 17.3874C20.4806 17.3874 21.5484 18.4551 21.5484 19.7723H22.6217C22.9832 19.7724 23.3299 19.6288 23.5855 19.3732C23.8411 19.1175 23.9847 18.7708 23.9846 18.4093V13.5663Z" fill="url(#paint0_linear_0_8865)"/>
<path id="Path" fill-rule="evenodd" clip-rule="evenodd" d="M15.1111 13.5665V19.7724H7.85246C7.85246 18.4551 6.78457 17.3872 5.46725 17.3872C4.14994 17.3872 3.08204 18.4551 3.08204 19.7724H1.3786C1.0171 19.7725 0.670387 19.6289 0.414766 19.3733C0.159146 19.1177 0.0155658 18.7709 0.015625 18.4094V7.03009C0.0155658 6.66859 0.159146 6.32188 0.414766 6.06626C0.670387 5.81063 1.0171 5.66706 1.3786 5.66711H2.85711C2.94212 8.0702 4.91485 9.97439 7.31944 9.97439C9.72402 9.97439 11.6968 8.0702 11.7818 5.66711H13.7481C14.5008 5.66718 15.111 6.27737 15.1111 7.03009V13.5665Z" fill="#FFAB00"/>
<path id="Path_2" fill-rule="evenodd" clip-rule="evenodd" d="M11.7846 5.517C11.7846 5.56723 11.784 5.61746 11.7818 5.66714C11.6968 8.07022 9.72407 9.97441 7.31949 9.97441C4.9149 9.97441 2.94216 8.07022 2.85716 5.66714C2.85493 5.61746 2.85437 5.56723 2.85437 5.517C2.85437 3.05098 4.85347 1.05188 7.31949 1.05188C9.7855 1.05188 11.7846 3.05098 11.7846 5.517V5.517Z" fill="#61F3F3"/>
<g id="Vector">
<path d="M21.5481 19.7724C21.5481 21.0895 20.4803 22.1573 19.1631 22.1573C17.846 22.1573 16.7782 21.0895 16.7782 19.7724C16.7782 18.4552 17.846 17.3875 19.1631 17.3875C20.4803 17.3875 21.5481 18.4552 21.5481 19.7724Z" fill="#B76E00"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.46696 17.3875C6.78412 17.3875 7.85189 18.4552 7.85189 19.7724C7.85189 21.0895 6.78412 22.1573 5.46696 22.1573C4.1498 22.1573 3.08203 21.0895 3.08203 19.7724C3.08206 18.4552 4.14981 17.3875 5.46696 17.3875Z" fill="#B76E00"/>
</g>
<path id="Path_3" fill-rule="evenodd" clip-rule="evenodd" d="M8.80965 7.30308C8.71048 7.30321 8.61499 7.26548 8.54269 7.1976L7.05246 5.80225C6.97358 5.72837 6.92882 5.62512 6.92883 5.51704V2.62141C6.92883 2.40563 7.10375 2.23071 7.31953 2.23071C7.53531 2.23071 7.71023 2.40563 7.71023 2.62141V5.34792L9.07678 6.62746C9.19385 6.73707 9.23205 6.90709 9.17312 7.05624C9.11418 7.20539 8.97008 7.30338 8.80971 7.30336L8.80965 7.30308Z" fill="#006C9C"/>
</g>
</g>
<defs>
<linearGradient id="paint0_linear_0_8865" x1="15.1113" y1="9.29993" x2="25.4416" y2="18.0528" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFD666"/>
<stop offset="1" stop-color="#FFAB00"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

4
apps/react-admin/src/assets/icons/ic_disabled.svg

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path opacity="0.32" fill-rule="evenodd" clip-rule="evenodd" d="M12 22.5C17.799 22.5 22.5 17.799 22.5 12C22.5 6.20101 17.799 1.5 12 1.5C6.20101 1.5 1.5 6.20101 1.5 12C1.5 17.799 6.20101 22.5 12 22.5ZM12 18.3C15.4794 18.3 18.3 15.4794 18.3 12C18.3 8.52061 15.4794 5.7 12 5.7C8.52061 5.7 5.7 8.52061 5.7 12C5.7 15.4794 8.52061 18.3 12 18.3Z" fill="currentColor"/>
<path d="M18.603 3.01129C19.2181 2.39622 20.2153 2.39622 20.8304 3.01129C21.4455 3.62637 21.4455 4.62361 20.8304 5.23868L5.2387 20.8304C4.62362 21.4455 3.62639 21.4455 3.01131 20.8304C2.39623 20.2153 2.39623 19.2181 3.01131 18.603L18.603 3.01129Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 735 B

4
apps/react-admin/src/assets/icons/ic_external.svg

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path opacity="0.32" fill-rule="evenodd" clip-rule="evenodd" d="M3.77688 21.3755C2.93261 21.1957 2.36966 20.5161 2.28099 19.6575C2.14952 18.3844 2 16.0469 2 12C2 7.95305 2.14952 5.6156 2.28099 4.34251C2.36966 3.48389 2.93261 2.80424 3.77688 2.62451C5.1095 2.34081 7.6216 2 12 2C16.3784 2 18.8905 2.34081 20.2231 2.62451C21.0674 2.80424 21.6304 3.48389 21.719 4.34251C21.8505 5.6156 22 7.95305 22 12C22 16.0469 21.8505 18.3844 21.719 19.6575C21.6304 20.5161 21.0674 21.1957 20.2232 21.3755C18.8905 21.6592 16.3784 22 12 22C7.6216 22 5.1095 21.6592 3.77688 21.3755ZM17 8.37267V15.236C16.9936 15.5958 16.8463 15.9387 16.59 16.1909C16.3336 16.4431 15.9886 16.5844 15.6293 16.5844C15.27 16.5844 14.925 16.4431 14.6686 16.1909C14.4123 15.9387 14.265 15.5958 14.2586 15.236V11.6671L9.3496 16.5953C8.81262 17.1344 7.94025 17.135 7.40262 16.5965C6.86689 16.06 6.86528 15.1919 7.40088 14.6553C9.12404 12.9289 11.6962 10.3625 12.3396 9.74535H8.77583C8.41654 9.73891 8.07415 9.59146 7.82234 9.33474C7.57053 9.07801 7.42944 8.73254 7.42944 8.37267C7.42944 8.01281 7.57053 7.66734 7.82234 7.41061C8.07415 7.15389 8.41654 7.00644 8.77583 7H15.6293C15.9925 7.00109 16.3405 7.14606 16.5973 7.40325C16.8542 7.66044 16.9989 8.00895 17 8.37267Z" fill="currentColor"/>
<path d="M16.9999 15.236V8.37267C16.9988 8.00895 16.854 7.66044 16.5972 7.40325C16.3404 7.14606 15.9924 7.00109 15.6292 7H8.77571C8.41642 7.00644 8.07403 7.15389 7.82222 7.41061C7.57041 7.66734 7.42931 8.01281 7.42931 8.37267C7.42931 8.73254 7.57041 9.07801 7.82222 9.33474C8.07403 9.59146 8.41642 9.73891 8.77571 9.74535H12.3395C11.6961 10.3625 9.12392 12.9289 7.40076 14.6553C6.86515 15.1919 6.86677 16.06 7.40249 16.5965C7.94013 17.135 8.8125 17.1344 9.34947 16.5953L14.2585 11.6671V15.236C14.2649 15.5958 14.4122 15.9387 14.6685 16.1909C14.9249 16.4431 15.2698 16.5844 15.6292 16.5844C15.9885 16.5844 16.3335 16.4431 16.5899 16.1909C16.8462 15.9387 16.9935 15.5958 16.9999 15.236Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

18
apps/react-admin/src/assets/icons/ic_file.svg

@ -0,0 +1,18 @@
<svg width="40" height="41" viewBox="0 0 40 41" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M23.172 0.990234C23.7022 0.990234 24.2107 1.20074 24.5857 1.57549L36.4137 13.3946C36.7891 13.7697 37 14.2786 37 14.8093V36.3236C37 38.9009 34.8689 40.9902 32.24 40.9902H7.76C5.13112 40.9902 3 38.9009 3 36.3236V5.6569C3 3.07957 5.13112 0.990234 7.76 0.990234H23.172Z" fill="#C4CDD5"/>
<g filter="url(#filter0_d_1995_147665)">
<path d="M35.1548 13.1284C35.4678 13.4439 35.2443 13.9805 34.7998 13.9805H29C26.4227 13.9805 24.0976 11.7135 24.0976 9.20054V3.19458C24.0976 2.74814 24.6382 2.52551 24.9526 2.84248L35.1548 13.1284Z" fill="white" fill-opacity="0.24" shape-rendering="crispEdges"/>
</g>
<defs>
<filter id="filter0_d_1995_147665" x="22.0977" y="2.6936" width="15.2031" height="15.2869" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="2"/>
<feGaussianBlur stdDeviation="1"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.04 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1995_147665"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1995_147665" result="shape"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

25
apps/react-admin/src/assets/icons/ic_file_ai.svg

@ -0,0 +1,25 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1255_158111)">
<path d="M23.172 0C23.7022 0 24.2107 0.210507 24.5857 0.585255L36.4137 12.4044C36.7891 12.7795 37 13.2884 37 13.8191V35.3333C37 37.9107 34.8689 40 32.24 40H7.76C5.13112 40 3 37.9107 3 35.3333V4.66667C3 2.08934 5.13112 0 7.76 0H23.172Z" fill="#3B1F03"/>
<g filter="url(#filter0_d_1255_158111)">
<path d="M35.1548 12.1381C35.4678 12.4537 35.2443 12.9902 34.7998 12.9902H29C26.4227 12.9902 24.0976 10.7233 24.0976 8.21031V2.20435C24.0976 1.75791 24.6382 1.53528 24.9526 1.85224L35.1548 12.1381Z" fill="white" fill-opacity="0.24" shape-rendering="crispEdges"/>
</g>
<path d="M13.9998 31L17.0718 22.324H19.4598L22.5318 31H20.2278L19.6518 29.32H16.9158L16.3278 31H13.9998ZM17.4078 27.328H19.1238L18.2718 24.556L17.4078 27.328Z" fill="#FF860D"/>
<path d="M23.5243 22.324H25.8583V31H23.5243V22.324Z" fill="#FF860D"/>
</g>
<defs>
<filter id="filter0_d_1255_158111" x="22.0977" y="1.70337" width="15.2031" height="15.2869" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="2"/>
<feGaussianBlur stdDeviation="1"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.04 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1255_158111"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1255_158111" result="shape"/>
</filter>
<clipPath id="clip0_1255_158111">
<rect width="40" height="40" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

24
apps/react-admin/src/assets/icons/ic_file_audio.svg

@ -0,0 +1,24 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1255_158073)">
<path d="M23.172 0C23.7022 0 24.2107 0.210507 24.5857 0.585255L36.4137 12.4044C36.7891 12.7795 37 13.2884 37 13.8191V35.3333C37 37.9107 34.8689 40 32.24 40H7.76C5.13112 40 3 37.9107 3 35.3333V4.66667C3 2.08934 5.13112 0 7.76 0H23.172Z" fill="#8E33FF"/>
<g filter="url(#filter0_d_1255_158073)">
<path d="M35.1548 12.1381C35.4678 12.4537 35.2443 12.9902 34.7998 12.9902H29C26.4227 12.9902 24.0976 10.7233 24.0976 8.21031V2.20435C24.0976 1.75791 24.6382 1.53528 24.9526 1.85224L35.1548 12.1381Z" fill="white" fill-opacity="0.24" shape-rendering="crispEdges"/>
</g>
<path d="M22.9233 16.7978V26.221C22.9233 26.5014 22.8279 26.751 22.6372 26.9697C22.4465 27.1885 22.2053 27.3582 21.9137 27.4787C21.622 27.5993 21.3317 27.6891 21.0429 27.748C20.754 27.8069 20.4833 27.8363 20.2309 27.8363C19.9786 27.8363 19.7079 27.8069 19.419 27.748C19.1301 27.6891 18.8399 27.5994 18.5482 27.4787C18.2566 27.3581 18.0154 27.1885 17.8247 26.9697C17.6339 26.751 17.5386 26.5014 17.5386 26.221C17.5386 25.9405 17.6339 25.6909 17.8247 25.4722C18.0154 25.2535 18.2566 25.0838 18.5482 24.9632C18.8399 24.8425 19.1301 24.7528 19.419 24.6939C19.7079 24.6351 19.9786 24.6056 20.2309 24.6056C20.8199 24.6056 21.3583 24.715 21.8463 24.9337V20.4157L15.3848 22.4097V28.3749C15.3848 28.6553 15.2894 28.9049 15.0987 29.1237C14.908 29.3424 14.6668 29.5121 14.3751 29.6327C14.0834 29.7532 13.7932 29.843 13.5043 29.9019C13.2154 29.9608 12.9448 29.9902 12.6924 29.9902C12.44 29.9902 12.1693 29.9608 11.8805 29.9019C11.5916 29.843 11.3013 29.7533 11.0097 29.6327C10.718 29.512 10.4768 29.3424 10.2861 29.1237C10.0954 28.905 10 28.6554 10 28.3749C10 28.0944 10.0954 27.8448 10.2861 27.6261C10.4768 27.4074 10.718 27.2377 11.0097 27.1171C11.3013 26.9965 11.5916 26.9067 11.8805 26.8478C12.1693 26.789 12.44 26.7595 12.6924 26.7595C13.2813 26.7595 13.8198 26.8689 14.3078 27.0876V18.9518C14.3078 18.7779 14.361 18.6195 14.4676 18.4764C14.5742 18.3334 14.7116 18.2338 14.8799 18.1778L21.8799 16.0239C21.9472 16.0015 22.0257 15.9902 22.1155 15.9902C22.3399 15.9902 22.5306 16.0688 22.6876 16.2258C22.8446 16.3829 22.9233 16.5735 22.9233 16.7978Z" fill="white"/>
</g>
<defs>
<filter id="filter0_d_1255_158073" x="22.0977" y="1.70337" width="15.2031" height="15.2869" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="2"/>
<feGaussianBlur stdDeviation="1"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.04 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1255_158073"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1255_158073" result="shape"/>
</filter>
<clipPath id="clip0_1255_158073">
<rect width="40" height="40" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

19
apps/react-admin/src/assets/icons/ic_file_excel.svg

@ -0,0 +1,19 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M23.172 0C23.7022 0 24.2107 0.210507 24.5857 0.585255L36.4137 12.4044C36.7891 12.7795 37 13.2884 37 13.8191V35.3333C37 37.9107 34.8689 40 32.24 40H7.76C5.13112 40 3 37.9107 3 35.3333V4.66667C3 2.08934 5.13112 0 7.76 0H23.172Z" fill="#00A76F"/>
<g filter="url(#filter0_d_1255_158054)">
<path d="M35.1548 12.1381C35.4678 12.4537 35.2443 12.9902 34.7998 12.9902H29C26.4227 12.9902 24.0976 10.7233 24.0976 8.21031V2.20435C24.0976 1.75791 24.6382 1.53528 24.9526 1.85224L35.1548 12.1381Z" fill="white" fill-opacity="0.24" shape-rendering="crispEdges"/>
</g>
<path d="M23.9959 16L23.9956 16.0112L24 16.0113V30H22.8337L22.8336 29.9983H19.3263L18.1603 30L18.1601 29.9983H15.8517L14.6855 30L14.6854 29.9983H11.1701L10.0041 30L10.0039 29.9983L10.0017 28.8328L10.0039 28.8326V25.3104L10.0009 24.1449L10.0039 24.1447V20.6224L10 20.6227V19.457L10.0039 19.4568V17.1657L10 17.1657V16H23.9959ZM14.6854 25.3104H11.1701V28.8326H14.6854V25.3104ZM18.1601 25.3104H15.8517V28.8326H18.1601V25.3104ZM22.8336 25.3104H19.3263V28.8326H22.8336V25.3104ZM14.6854 20.6224H11.1701V24.1447H14.6854V20.6224ZM18.1601 20.6224H15.8517V24.1447H18.1601V20.6224ZM22.8336 20.6224H19.3263V24.1447H22.8336V20.6224ZM22.8336 17.1657H11.1701V19.4568H22.8336V17.1657Z" fill="white"/>
<defs>
<filter id="filter0_d_1255_158054" x="22.0977" y="1.70337" width="15.2031" height="15.2869" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="2"/>
<feGaussianBlur stdDeviation="1"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.04 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1255_158054"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1255_158054" result="shape"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

26
apps/react-admin/src/assets/icons/ic_file_img.svg

@ -0,0 +1,26 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1255_158091)">
<path d="M23.172 0C23.7022 0 24.2107 0.210507 24.5857 0.585255L36.4137 12.4044C36.7891 12.7795 37 13.2884 37 13.8191V35.3333C37 37.9107 34.8689 40 32.24 40H7.76C5.13112 40 3 37.9107 3 35.3333V4.66667C3 2.08934 5.13112 0 7.76 0H23.172Z" fill="#22C55E"/>
<g filter="url(#filter0_d_1255_158091)">
<path d="M35.1548 12.1381C35.4678 12.4537 35.2443 12.9902 34.7998 12.9902H29C26.4227 12.9902 24.0976 10.7233 24.0976 8.21031V2.20435C24.0976 1.75791 24.6382 1.53528 24.9526 1.85224L35.1548 12.1381Z" fill="white" fill-opacity="0.24" shape-rendering="crispEdges"/>
</g>
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.9629 16H17.0371C18.5407 16 19.7186 16 20.638 16.1237C21.5783 16.25 22.3207 16.5144 22.9034 17.0966C23.4862 17.6793 23.75 18.4217 23.8763 19.3626C24 20.2814 24 21.4593 24 22.9629V23.0202C24 24.2633 24 25.2804 23.9323 26.1087C23.8646 26.9421 23.7259 27.6369 23.4146 28.2152C23.2779 28.4698 23.1086 28.6983 22.9034 28.9034C22.3207 29.4862 21.5783 29.75 20.6374 29.8763C19.7186 30 18.5407 30 17.0371 30H16.9629C15.4593 30 14.2814 30 13.362 29.8763C12.4217 29.75 11.6793 29.4856 11.0966 28.9034C10.5802 28.3871 10.3132 27.7444 10.1719 26.946C10.0319 26.1627 10.0065 25.1879 10.0013 23.978C10 23.67 10 23.3445 10 23.0007V22.9629C10 21.4593 10 20.2814 10.1237 19.362C10.25 18.4217 10.5144 17.6793 11.0966 17.0966C11.6793 16.5138 12.4217 16.25 13.3626 16.1237C14.2814 16 15.4593 16 16.9629 16ZM13.4922 17.0913C12.66 17.2033 12.158 17.4169 11.7874 17.7874C11.4163 18.1586 11.2033 18.66 11.0913 19.4928C10.978 20.3393 10.9767 21.4515 10.9767 23C10.9767 23.3445 10.9767 23.6681 10.978 23.9735C10.9833 25.1938 11.0106 26.0872 11.133 26.7754C11.2528 27.4494 11.4573 27.8824 11.7874 28.2126C12.1586 28.5837 12.66 28.7967 13.4928 28.9087C14.3393 29.022 15.4515 29.0233 17 29.0233C18.5485 29.0233 19.6607 29.022 20.5072 28.9087C21.34 28.7967 21.842 28.5831 22.2132 28.2126C22.35 28.0758 22.4613 27.9247 22.5544 27.7522C22.7706 27.3511 22.895 26.8145 22.9588 26.0299C23.0226 25.2452 23.0233 24.2672 23.0233 23C23.0233 21.4515 23.022 20.3393 22.9087 19.4928C22.7967 18.66 22.5831 18.158 22.2126 17.7868C21.8414 17.4163 21.34 17.2033 20.5072 17.0913C19.6607 16.978 18.5485 16.9767 17 16.9767C15.4515 16.9767 14.3387 16.978 13.4922 17.0913Z" fill="white"/>
<path d="M23.0226 23.8334L22.878 23.8139C21.0261 23.5573 19.3312 24.5198 18.4684 25.9712C17.3549 23.1549 14.4136 21.234 11.1272 21.7061L10.98 21.7269C10.9767 22.1157 10.9767 22.5383 10.9767 23C10.9767 23.3445 10.9767 23.6681 10.978 23.9735C10.9833 25.1938 11.0106 26.0872 11.133 26.7754C11.2528 27.4494 11.4573 27.8824 11.7874 28.2126C12.1586 28.5837 12.66 28.7967 13.4928 28.9087C14.3393 29.022 15.4515 29.0233 17 29.0233C18.5485 29.0233 19.6607 29.022 20.5072 28.9087C21.34 28.7967 21.842 28.5831 22.2132 28.2126C22.35 28.0758 22.4613 27.9247 22.5544 27.7522C22.7706 27.3511 22.895 26.8145 22.9588 26.0299C23.0083 25.4269 23.0193 24.7092 23.0226 23.8334Z" fill="white"/>
<path d="M20.907 20.3953C20.907 20.7407 20.7698 21.072 20.5255 21.3162C20.2813 21.5605 19.95 21.6977 19.6047 21.6977C19.2593 21.6977 18.928 21.5605 18.6838 21.3162C18.4395 21.072 18.3023 20.7407 18.3023 20.3953C18.3023 20.05 18.4395 19.7187 18.6838 19.4745C18.928 19.2302 19.2593 19.093 19.6047 19.093C19.95 19.093 20.2813 19.2302 20.5255 19.4745C20.7698 19.7187 20.907 20.05 20.907 20.3953Z" fill="white"/>
</g>
<defs>
<filter id="filter0_d_1255_158091" x="22.0977" y="1.70337" width="15.2031" height="15.2869" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="2"/>
<feGaussianBlur stdDeviation="1"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.04 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1255_158091"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1255_158091" result="shape"/>
</filter>
<clipPath id="clip0_1255_158091">
<rect width="40" height="40" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

19
apps/react-admin/src/assets/icons/ic_file_pdf.svg

@ -0,0 +1,19 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M23.172 0C23.7022 0 24.2107 0.210507 24.5857 0.585255L36.4137 12.4044C36.7891 12.7795 37 13.2884 37 13.8191V35.3333C37 37.9107 34.8689 40 32.24 40H7.76C5.13112 40 3 37.9107 3 35.3333V4.66667C3 2.08934 5.13112 0 7.76 0H23.172Z" fill="#E94848"/>
<g filter="url(#filter0_d_1255_158068)">
<path d="M35.1548 12.1381C35.4678 12.4537 35.2443 12.9902 34.7998 12.9902H29C26.4227 12.9902 24.0976 10.7233 24.0976 8.21031V2.20435C24.0976 1.75791 24.6382 1.53528 24.9526 1.85224L35.1548 12.1381Z" fill="white" fill-opacity="0.24" shape-rendering="crispEdges"/>
</g>
<path d="M16.0667 15.9902C15.2131 15.9902 14.5111 16.6922 14.5111 17.5458C14.5111 18.6069 15.1007 19.9243 15.7215 21.1625C15.2362 22.6816 14.6856 24.3096 13.9813 25.6833C12.5397 26.2489 11.2542 26.6693 10.4812 27.2923C10.4692 27.3046 10.4578 27.3176 10.4472 27.3312C10.1648 27.62 10 28.0133 10 28.4347C10 29.2883 10.702 29.9902 11.5556 29.9902C11.9718 29.9902 12.3736 29.8349 12.6639 29.5382C12.6739 29.5304 12.6837 29.5223 12.6931 29.5138C13.262 28.8345 13.9328 27.6021 14.5306 26.4757C15.9081 25.9338 17.3519 25.3824 18.7451 25.0513C19.7622 25.871 21.2336 26.4125 22.4444 26.4125C23.298 26.4125 24 25.7105 24 24.8569C24 24.0033 23.298 23.3013 22.4444 23.3013C21.4734 23.3013 20.0623 23.648 18.9833 24.0111C18.1088 23.1901 17.3053 22.1647 16.7278 21.075C17.1404 19.8038 17.6222 18.532 17.6222 17.5458C17.6222 16.6922 16.9203 15.9902 16.0667 15.9902ZM16.0667 16.9236C16.4158 16.9236 16.6889 17.1966 16.6889 17.5458C16.6889 18.0127 16.4389 18.8723 16.1493 19.7965C15.7624 18.8974 15.4444 18.0348 15.4444 17.5458C15.4444 17.1966 15.7175 16.9236 16.0667 16.9236ZM16.334 22.2465C16.8019 22.9907 17.3498 23.6832 17.9479 24.2979C17.0254 24.5501 16.1245 24.8733 15.2354 25.2118C15.6648 24.2426 16.0086 23.2368 16.334 22.2465ZM22.4444 24.2347C22.7936 24.2347 23.0667 24.5077 23.0667 24.8569C23.0667 25.2061 22.7936 25.4791 22.4444 25.4791C21.7435 25.4791 20.7472 25.1627 19.9507 24.7208C20.8649 24.4623 21.8625 24.2347 22.4444 24.2347ZM13.1597 27.0201C12.7223 27.8009 12.2875 28.5297 11.9833 28.8965C11.8794 28.9958 11.7412 29.0569 11.5556 29.0569C11.2064 29.0569 10.9333 28.7838 10.9333 28.4347C10.9333 28.2704 11.0032 28.1072 11.0986 28.002C11.4635 27.7196 12.2574 27.3812 13.1597 27.0201Z" fill="white"/>
<defs>
<filter id="filter0_d_1255_158068" x="22.0977" y="1.70337" width="15.2031" height="15.2869" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="2"/>
<feGaussianBlur stdDeviation="1"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.04 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1255_158068"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1255_158068" result="shape"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

20
apps/react-admin/src/assets/icons/ic_file_ppt.svg

@ -0,0 +1,20 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M23.172 0C23.7022 0 24.2107 0.210507 24.5857 0.585255L36.4137 12.4044C36.7891 12.7795 37 13.2884 37 13.8191V35.3333C37 37.9107 34.8689 40 32.24 40H7.76C5.13112 40 3 37.9107 3 35.3333V4.66667C3 2.08934 5.13112 0 7.76 0H23.172Z" fill="#F56B36"/>
<g filter="url(#filter0_d_1255_158059)">
<path d="M35.1548 12.1381C35.4678 12.4537 35.2443 12.9902 34.7998 12.9902H29C26.4227 12.9902 24.0976 10.7233 24.0976 8.21031V2.20435C24.0976 1.75791 24.6382 1.53528 24.9526 1.85224L35.1548 12.1381Z" fill="white" fill-opacity="0.24" shape-rendering="crispEdges"/>
</g>
<path opacity="0.48" d="M16.4936 17.0127C12.9063 17.0127 10 19.9206 10 23.5063C10 27.0921 12.9079 29.9999 16.4936 29.9999C20.0794 29.9999 22.9888 27.0921 22.9888 23.5048H16.4936V17.0127Z" fill="white"/>
<path d="M17.5049 16V22.4952H23.9985C24.0001 18.9079 21.0922 16 17.5049 16Z" fill="white"/>
<defs>
<filter id="filter0_d_1255_158059" x="22.0977" y="1.70337" width="15.2031" height="15.2869" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="2"/>
<feGaussianBlur stdDeviation="1"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.04 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1255_158059"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1255_158059" result="shape"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save