🌐 Try Live Demo | 📖 Real-World Use Cases
Admiral is a frontend framework for creating back office in React. It provides out-of-the-box components and tools that make developing an admin interface easy and fast.
Made with :purple_heart: by dev.family
Requirements:
There are several options for installing Admiral:
To use npx, make sure you have Node.js
npx create-admiral-app@latest
When you enter this command into the console, you will see 2 installation options:
If you choose "Install the template with the backend setting on Express.js", you will install the fully customized template with backend on Express.js.
Detailed installation and startup instructions
All environment variables will be set automatically. If you want to configure them manually, go to the project folder and open the .env.
You will have 1 CRUDs from the start - Users. To find them pass the way - admiral/src/crud/users/index.tsx
If you choose "Install the template without backend setting", you get just the frontend shell of Admiral in the admiral folder with CRUD - Users. To find it pass the way - admiral/src/crud/users/index.tsx. To use your backend, read the Documentation
Admiral is available at http://localhost:3000. If port 3000 is busy, any other free port will be selected.
In the console you will see something like this
Port 3000 is in use, trying another one...
vite v2.9.15 dev server running at:
> Local: http://localhost:3001/
> Network: http://192.168.100.82:3001/
ready in 459ms.
Detailed installation and startup instructions are in each of the examples.
Open your browser and go to http://localhost:3000.
Yes, that's right. You can just clone this repository and enter the following commands:
yarn
yarn dev
Then go to http://localhost:3000. The Admiral with mock data is now available to you.
The App.tsx file is the entry point into the application. It is where the library is initialized and where the components are rendered Admin.
import React from 'react'
import { Admin, createRoutesFrom, OAuthProvidersEnum } from '../admiral'
import Menu from './config/menu'
import dataProvider from './dataProvider'
import authProvider from './authProvider'
const apiUrl = '/api'
// import all pages from pages folder and create routes
const Routes = createRoutesFrom(import.meta.globEager('../pages/**/*'))
function App() {
return (
<Admin
dataProvider={dataProvider(apiUrl)}
authProvider={authProvider(apiUrl)}
menu={Menu}
oauthProviders={[
OAuthProvidersEnum.Google,
OAuthProvidersEnum.Github,
OAuthProvidersEnum.Jira,
]}
>
<Routes />
</Admin>
)
}
export default App
The main contract for authorization in the system is the interface AuthProvider.
export interface AuthProvider {
login: (params: any) => Promise<any>
logout: (params: any) => Promise<void | false | string>
checkAuth: (params: any) => Promise<void>
getIdentity: () => Promise<UserIdentity>
oauthLogin?: (provider: OAuthProvidersEnum) => Promise<{ redirect: string }>
oauthCallback?: (provider: OAuthProvidersEnum, data: string) => Promise<any>
[key: string]: any
}
Example of implementation The interface itself can be customized to your liking, but it is important to respect the contract it provides. Detailed contract description
Let's look at the basic methods of implementation:
| Method | Name | Description | Parameters | Return value |
|---|---|---|---|---|
| login | User Authentication | Makes a POST request to /api/login and stores the token field in localStorage, which is used in further requests |
params - object with the fields username and password |
An object with a token field and a user object with email and name fields |
| logout | User Logout | Makes a POST request to /api/logout and removes the token field from localStorage |
void |
|
| checkAuth | User authorization check | Makes a GET request to /api/checkAuth and checks token validity, expects a status code - 200. Used every time the API is used |
Bearer token |
Status code 200 |
| getIdentity | Receiving user data | Makes a GET request to /api/getIdentity and returns an object with user data |
Bearer token |
Object user with the fields email and name |
| oauthLogin | Authorization via OAuth | Makes a GET request to /api/auth/social-login/${provider} and returns an object with the redirect field, which is used for the redirect |
provider - OAuth provider |
Object with the field redirect |
| oauthCallback | Callback authorization via OAuth | Makes a POST request to /api/auth/social-login/${provider}/callback and stores the token field in localStorage, which is used in further requests |
provider - OAuth provider, data - data received from OAuth provider where the token field exists |
Object with the field token |
The main contract for working with data represents the interface DataProvider.
export interface DataProvider {
getList: (
resource: string,
params: Partial<GetListParams>,
) => Promise<GetListResult<RecordType>>
reorderList: (resource: string, params: ReorderParams) => Promise<void>
getOne: (resource: string, params: GetOneParams) => Promise<GetOneResult<RecordType>>
getCreateFormData: (resource: string) => Promise<GetFormDataResult<RecordType>>
getFiltersFormData: (
resource: string,
urlState?: Record<string, any>,
) => Promise<GetFiltersFormDataResult>
create: (resource: string, params: CreateParams) => Promise<CreateResult<RecordType>>
getUpdateFormData: (
resource: string,
params: GetOneParams,
) => Promise<GetFormDataResult<RecordType>>
update: (resource: string, params: UpdateParams) => Promise<UpdateResult<RecordType>>
deleteOne: (resource: string, params: DeleteParams) => Promise<DeleteResult<RecordType>>
[key: string]: any
}
Example of implementation Detailed contract description
Let's look at the basic methods of implementation:
| Method | Name | Description | Parameters |
|---|---|---|---|
| getList | Getting a list of entities | Makes a GET request to /api/${resource} and returns an object with data to be used in the List component |
resource - resource name, params - object with query parameters |
| reorderList | Changing the order of entities | Makes a POST request to /api/${resource}/reorder and returns an object with data to be used in the List component |
resource - resource name, params - object with query parameters |
| getOne | Obtaining an entity | Makes a GET request to /api/${resource}/${id} and |
$ claude mcp add admiral \
-- python -m otcore.mcp_server <graph>