6.0 KiB
6.0 KiB
uikit
Shared library for BI next.js projects.
Install
yarn add git+https://git.d.aiengines.ir/bi/uikit.git
Update
yarn upgrade uikit
or
rm -rf .next
rm -rf node_modules/.vite
rm -rf node_modules/.cache
rm -rf node_modules/uikit
yarn upgrade uikit
imports
| مسیر | کاربرد | dependency اضافی |
|---|---|---|
uikit |
utility functions | - |
uikit/utils |
utility functions | - |
uikit/pagination |
pagination | Chakra + React + react-icons |
uikit/layout |
Header | Chakra + React |
uikit/core |
API، BiProvider، Keycloak، Permission | Chakra + React Query + Axios + Keycloak |
uikit/table |
DataTable | Chakra + TanStack Table + Pagination |
utils
import { toFaDigits, toEnDigits, toFaNumber } from "uikit/utils";
toFaDigits(123456);
toEnDigits("۱۲۳۴۵۶");
toFaNumber(123456);
or
import { toFaDigits } from "uikit";
pagination
required dependencies
yarn add @chakra-ui/react@2
yarn add @chakra-ui/icons@2
yarn add @emotion/react@11
yarn add @emotion/styled@11
yarn add chakra-react-select@5
yarn add react-select@5
yarn add framer-motion@10
yarn add react-icons
using
import { Pagination, LightPagination, SimplePagination } from "uikit/pagination";
function Page() {
return (
<Pagination
currentPage={1}
totalCount={100}
totalPages={5}
onPageChange={(page) => console.log(page)}
/>
);
}
Header
required dependencies:
yarn add @chakra-ui/react @emotion/react @emotion/styled framer-motion
using:
import { Header } from "uikit/layout";
function AppHeader() {
return (
<Header>
<Header.BrandSection>
<Header.Logo src="/logo.png" />
<Header.Brand>
<Header.Title>عنوان سامانه</Header.Title>
<Header.Description>توضیح کوتاه سامانه</Header.Description>
</Header.Brand>
</Header.BrandSection>
<Header.Bi />
</Header>
);
}
Core
required dependencies:
yarn add @chakra-ui/react @emotion/react @emotion/styled framer-motion @tanstack/react-query axios keycloak-js
BiProvider
import { BiProvider } from "uikit/core";
export default function App() {
return (
<BiProvider
apiBaseUrl="https://api.example.com"
keycloakClientId="front-client"
permissionClientId="permission-client"
>
<YourApp />
</BiProvider>
);
}
BiProvider props
| Prop |
|---|
apiBaseUrl |
keycloakClientId |
permissionClientId |
loading |
updateChecker |
updateCheckerProps |
keycloakUrl |
keycloakRealm |
permissionUrl |
keycloakEnabled |
permissionEnabled |
BiProvider defaults
keycloakUrl = "https://auth.ibagher.ir";
keycloakRealm = "bi";
permissionUrl = "https://api.d.aiengines.ir/user_api/v1/permissions/list";
updateChecker = false;
To enable updateChecker you should have a script write-version.js in the root of the project and in the package.json of the target project, run before the build:
{
"scripts": {
"prebuild": "node write-version.js",
"build": "next build"
}
}
API
import { api, fetcher, configureApi, getApi } from "uikit/core";
import { api } from "uikit/core";
const response = await api.get("/users");
or
import { fetcher } from "uikit/core";
const data = await fetcher("/users");
createApi
import { createApi } from "uikit/core";
export const sampleApi = createApi({
key: "sample",
url: "/...",
actions: {
create: {
method: "post",
url: "/...",
},
update: {
method: "patch",
url: (id) => `/.../${id}`,
},
delete: {
method: "delete",
url: (id) => `/.../${id}`,
},
confirm: {
method: "post",
url: "/...",
},
updateImage: {
method: "post",
url: (id) => `/.../${id}/image`,
body: ({ formData }) => formData,
},
},
});
Keycloak
import {
getKeycloakToken,
loginKeycloak,
logoutKeycloak,
} from "uikit/core";
const token = getKeycloakToken();
loginKeycloak();
logoutKeycloak({
redirectUri: window.location.origin,
});
Permission
import { Can, usePermission } from "uikit/core";
function Page() {
const { can, cannot, permissions } = usePermission();
return (
<>
{can("users:list") && <div>لیست کاربران</div>}
<Can perm="users:create" fallback={null}>
<button>ایجاد کاربر</button>
</Can>
</>
);
}
DataTable
required dependencies:
yarn add @chakra-ui/react @emotion/react @emotion/styled framer-motion @tanstack/react-table react-icons
using:
import { DataTable } from "uikit/table";
function UsersTable({ data, columns }) {
return (
<DataTable
data={data}
columns={columns}
page={1}
size={20}
pagination={{
totalCount: 100,
totalPages: 5,
}}
onPageChange={(page) => console.log(page)}
getRowId={(row) => String(row.id)}
enableSelection
showIndex
>
<DataTable.Topbar>
<DataTable.Title>لیست کاربران</DataTable.Title>
<DataTable.Spacer />
<DataTable.Actions>
<DataTable.SelectAll />
</DataTable.Actions>
</DataTable.Topbar>
<DataTable.Content>
<DataTable.Table />
<DataTable.Pagination />
</DataTable.Content>
</DataTable>
);
}