@blocklet/ui-react 3.1.48 → 3.1.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.aigne/doc-smith/config.yaml +76 -0
- package/.aigne/doc-smith/history.yaml +9 -0
- package/.aigne/doc-smith/output/structure-plan.json +249 -0
- package/.aigne/doc-smith/upload-cache.yaml +528 -0
- package/docs/_sidebar.md +19 -0
- package/docs/components-component-management-blocklet-studio.ja.md +194 -0
- package/docs/components-component-management-blocklet-studio.md +194 -0
- package/docs/components-component-management-blocklet-studio.zh-TW.md +194 -0
- package/docs/components-component-management-blocklet-studio.zh.md +194 -0
- package/docs/components-component-management-component-installer.ja.md +256 -0
- package/docs/components-component-management-component-installer.md +256 -0
- package/docs/components-component-management-component-installer.zh-TW.md +256 -0
- package/docs/components-component-management-component-installer.zh.md +256 -0
- package/docs/components-component-management.ja.md +59 -0
- package/docs/components-component-management.md +59 -0
- package/docs/components-component-management.zh-TW.md +59 -0
- package/docs/components-component-management.zh.md +59 -0
- package/docs/components-layout-dashboard.ja.md +231 -0
- package/docs/components-layout-dashboard.md +231 -0
- package/docs/components-layout-dashboard.zh-TW.md +231 -0
- package/docs/components-layout-dashboard.zh.md +231 -0
- package/docs/components-layout-footer.ja.md +165 -0
- package/docs/components-layout-footer.md +165 -0
- package/docs/components-layout-footer.zh-TW.md +165 -0
- package/docs/components-layout-footer.zh.md +165 -0
- package/docs/components-layout-header.ja.md +233 -0
- package/docs/components-layout-header.md +233 -0
- package/docs/components-layout-header.zh-TW.md +233 -0
- package/docs/components-layout-header.zh.md +233 -0
- package/docs/components-layout.ja.md +50 -0
- package/docs/components-layout.md +50 -0
- package/docs/components-layout.zh-TW.md +50 -0
- package/docs/components-layout.zh.md +50 -0
- package/docs/components-notifications.ja.md +173 -0
- package/docs/components-notifications.md +173 -0
- package/docs/components-notifications.zh-TW.md +174 -0
- package/docs/components-notifications.zh.md +173 -0
- package/docs/components-user-management-user-center.ja.md +183 -0
- package/docs/components-user-management-user-center.md +183 -0
- package/docs/components-user-management-user-center.zh-TW.md +183 -0
- package/docs/components-user-management-user-center.zh.md +183 -0
- package/docs/components-user-management-user-sessions.ja.md +164 -0
- package/docs/components-user-management-user-sessions.md +164 -0
- package/docs/components-user-management-user-sessions.zh-TW.md +164 -0
- package/docs/components-user-management-user-sessions.zh.md +164 -0
- package/docs/components-user-management.ja.md +76 -0
- package/docs/components-user-management.md +76 -0
- package/docs/components-user-management.zh-TW.md +76 -0
- package/docs/components-user-management.zh.md +76 -0
- package/docs/components-utilities-icon.ja.md +106 -0
- package/docs/components-utilities-icon.md +106 -0
- package/docs/components-utilities-icon.zh-TW.md +106 -0
- package/docs/components-utilities-icon.zh.md +106 -0
- package/docs/components-utilities.ja.md +136 -0
- package/docs/components-utilities.md +136 -0
- package/docs/components-utilities.zh-TW.md +136 -0
- package/docs/components-utilities.zh.md +136 -0
- package/docs/components.ja.md +27 -0
- package/docs/components.md +27 -0
- package/docs/components.zh-TW.md +27 -0
- package/docs/components.zh.md +27 -0
- package/docs/core-concepts.ja.md +164 -0
- package/docs/core-concepts.md +164 -0
- package/docs/core-concepts.zh-TW.md +164 -0
- package/docs/core-concepts.zh.md +164 -0
- package/docs/getting-started.ja.md +132 -0
- package/docs/getting-started.md +132 -0
- package/docs/getting-started.zh-TW.md +132 -0
- package/docs/getting-started.zh.md +132 -0
- package/docs/hooks-api.ja.md +214 -0
- package/docs/hooks-api.md +214 -0
- package/docs/hooks-api.zh-TW.md +214 -0
- package/docs/hooks-api.zh.md +214 -0
- package/docs/how-to-guides.ja.md +413 -0
- package/docs/how-to-guides.md +413 -0
- package/docs/how-to-guides.zh-TW.md +413 -0
- package/docs/how-to-guides.zh.md +413 -0
- package/docs/overview.ja.md +91 -0
- package/docs/overview.md +91 -0
- package/docs/overview.zh-TW.md +91 -0
- package/docs/overview.zh.md +91 -0
- package/glossary.md +12 -0
- package/lib/Dashboard/index.js +46 -42
- package/lib/Footer/index.js +51 -36
- package/lib/Header/index.js +48 -44
- package/lib/UserCenter/components/settings.js +1 -0
- package/lib/UserCenter/components/user-center.js +133 -133
- package/lib/blocklets.d.ts +13 -2
- package/lib/blocklets.js +40 -40
- package/lib/common/header-addons.js +37 -33
- package/package.json +7 -7
- package/src/Dashboard/index.jsx +8 -3
- package/src/Footer/index.jsx +22 -4
- package/src/Header/index.tsx +7 -2
- package/src/UserCenter/components/settings.tsx +1 -0
- package/src/UserCenter/components/user-center.tsx +6 -6
- package/src/blocklets.js +18 -9
- package/src/common/header-addons.jsx +7 -2
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# Dashboard
|
|
2
|
+
|
|
3
|
+
`Dashboard` 元件為 blocklet 應用程式提供了一個預先建置、響應式的佈局,通常用於管理介面或以使用者為中心的視圖。它透過解析 blocklet 的元資料,自動建構一個包含側邊欄、頁首和主要內容區域的標準儀表板。此元件顯著減少了建構通用應用程式結構所需的樣板程式碼。
|
|
4
|
+
|
|
5
|
+
該佈局由三個主要部分組成:一個用於導覽的常駐側邊欄、一個用於全域操作和使用者資訊的頁首,以及一個呈現特定頁面內容的主要內容區域。
|
|
6
|
+
|
|
7
|
+
```d2
|
|
8
|
+
direction: down
|
|
9
|
+
|
|
10
|
+
Dashboard-Layout: {
|
|
11
|
+
label: "Dashboard 元件"
|
|
12
|
+
shape: rectangle
|
|
13
|
+
grid-columns: 1
|
|
14
|
+
style: {
|
|
15
|
+
stroke: "#888"
|
|
16
|
+
stroke-width: 2
|
|
17
|
+
stroke-dash: 4
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
Header: {
|
|
21
|
+
shape: rectangle
|
|
22
|
+
Logo: {}
|
|
23
|
+
HeaderAddons: {
|
|
24
|
+
label: "頁首附加元件"
|
|
25
|
+
shape: rectangle
|
|
26
|
+
grid-columns: 1
|
|
27
|
+
SessionManager: {}
|
|
28
|
+
LocaleSelector: {}
|
|
29
|
+
ThemeToggle: {}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
Sidebar: {
|
|
34
|
+
label: "側邊欄"
|
|
35
|
+
shape: rectangle
|
|
36
|
+
Navigation-Links: {
|
|
37
|
+
label: "導覽連結"
|
|
38
|
+
shape: rectangle
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
Content-Area: {
|
|
43
|
+
label: "內容區域"
|
|
44
|
+
shape: rectangle
|
|
45
|
+
"頁面特定內容 (children)"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
Blocklet-Metadata: {
|
|
50
|
+
label: "blocklet.yml"
|
|
51
|
+
shape: cylinder
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
Blocklet-Metadata -> Dashboard-Layout.Sidebar.Navigation-Links: "生成"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## 基本用法
|
|
58
|
+
|
|
59
|
+
若要使用 `Dashboard` 元件,只需將您的頁面內容包裹在其中即可。該元件將自動在您的內容周圍呈現頁首和側邊欄。
|
|
60
|
+
|
|
61
|
+
```javascript MyDashboard.jsx icon=logos:react
|
|
62
|
+
import Dashboard from '@arcblock/blocklet-ui-react/lib/Dashboard';
|
|
63
|
+
|
|
64
|
+
export default function MyDashboardPage() {
|
|
65
|
+
return (
|
|
66
|
+
<Dashboard>
|
|
67
|
+
<h1>Welcome to the Dashboard</h1>
|
|
68
|
+
<p>This is your main content area.</p>
|
|
69
|
+
</Dashboard>
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
傳遞給 `Dashboard` 元件的 children 將顯示在主要內容區域中。
|
|
75
|
+
|
|
76
|
+
## 屬性 (Props)
|
|
77
|
+
|
|
78
|
+
`Dashboard` 元件接受以下屬性 (props) 以自訂其行為和外觀。
|
|
79
|
+
|
|
80
|
+
<x-field-group>
|
|
81
|
+
<x-field data-name="children" data-type="React.ReactNode" data-required="true">
|
|
82
|
+
<x-field-desc markdown>要在儀表板佈局的主要內容區域內呈現的內容。</x-field-desc>
|
|
83
|
+
</x-field>
|
|
84
|
+
<x-field data-name="meta" data-type="object" data-required="false">
|
|
85
|
+
<x-field-desc markdown>一個 blocklet 元資料物件。若提供,它將與預設的 `window.blocklet` 元資料合併並覆寫。這對於測試或動態更改 blocklet 資訊很有用。</x-field-desc>
|
|
86
|
+
</x-field>
|
|
87
|
+
<x-field data-name="fallbackUrl" data-type="string" data-required="false" data-default="publicPath">
|
|
88
|
+
<x-field-desc markdown>如果目前已驗證的使用者根據其角色無權存取任何導覽連結,則重新導向到的 URL。設定為 `null` 可停用此自動重新導向。</x-field-desc>
|
|
89
|
+
</x-field>
|
|
90
|
+
<x-field data-name="invalidPathFallback" data-type="function" data-required="false">
|
|
91
|
+
<x-field-desc markdown>當前 URL 路徑不符合任何可用導覽連結時執行的回呼函式。預設行為是重新導向到第一個可用的連結。</x-field-desc>
|
|
92
|
+
</x-field>
|
|
93
|
+
<x-field data-name="headerAddons" data-type="React.ReactNode | function" data-required="false">
|
|
94
|
+
<x-field-desc markdown>允許自訂頁首右側的附加元件。如果提供一個節點,它將取代所有預設的附加元件。如果提供一個函式,它會接收預設的附加元件陣列作為參數,讓您可以新增、移除或重新排序它們。</x-field-desc>
|
|
95
|
+
</x-field>
|
|
96
|
+
<x-field data-name="sessionManagerProps" data-type="object" data-required="false">
|
|
97
|
+
<x-field-desc markdown>直接傳遞給頁首底層 `SessionUser` 元件的 props。這允許自訂使用者會話選單,例如 `showRole` 或定義自訂的 `onLogout` 處理常式。</x-field-desc>
|
|
98
|
+
</x-field>
|
|
99
|
+
<x-field data-name="links" data-type="array | function" data-required="false">
|
|
100
|
+
<x-field-desc markdown>允許以程式化方式修改側邊欄導覽連結。如果提供一個陣列,其項目將附加到從元資料生成的連結中。如果提供一個函式,它會接收元資料生成的連結作為參數,並應返回一個新的連結陣列。</x-field-desc>
|
|
101
|
+
</x-field>
|
|
102
|
+
<x-field data-name="showDomainWarningDialog" data-type="boolean" data-required="false" data-default="true">
|
|
103
|
+
<x-field-desc markdown>若為 `true`,則在從不受信任的網域存取應用程式時顯示警告對話方塊。</x-field-desc>
|
|
104
|
+
</x-field>
|
|
105
|
+
</x-field-group>
|
|
106
|
+
|
|
107
|
+
## 運作方式
|
|
108
|
+
|
|
109
|
+
`Dashboard` 元件被設計為「設定驅動」,其結構和內容主要來自 blocklet 的元資料檔案 (`blocklet.yml`)。
|
|
110
|
+
|
|
111
|
+
### 透過元資料產生導覽
|
|
112
|
+
|
|
113
|
+
側邊欄導覽是根據您 `blocklet.yml` 中的 `navigation` 陣列自動產生的。該元件會特別尋找其 `section` 屬性中包含 `dashboard` 的導覽項目。
|
|
114
|
+
|
|
115
|
+
以下是如何定義儀表板導覽的範例:
|
|
116
|
+
|
|
117
|
+
```yaml blocklet.yml icon=mdi:file-document
|
|
118
|
+
navigation:
|
|
119
|
+
- title: 'Home'
|
|
120
|
+
link: '/'
|
|
121
|
+
section: 'dashboard'
|
|
122
|
+
icon: 'mdi:home'
|
|
123
|
+
role: ['owner', 'admin', 'guest']
|
|
124
|
+
- title: 'Analytics'
|
|
125
|
+
link: '/analytics'
|
|
126
|
+
section: 'dashboard'
|
|
127
|
+
icon: 'mdi:chart-bar'
|
|
128
|
+
role: ['owner', 'admin']
|
|
129
|
+
- title: 'Settings'
|
|
130
|
+
link: '/settings'
|
|
131
|
+
section: 'dashboard'
|
|
132
|
+
icon: 'mdi:cog'
|
|
133
|
+
role: ['owner']
|
|
134
|
+
items:
|
|
135
|
+
- title: 'Profile'
|
|
136
|
+
link: '/settings/profile'
|
|
137
|
+
- title: 'Billing'
|
|
138
|
+
link: '/settings/billing'
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 角色型存取控制
|
|
142
|
+
|
|
143
|
+
`Dashboard` 元件對導覽連結強制執行角色型存取控制 (RBAC)。每個導覽項目都可以有一個 `role` 屬性,這是一個允許查看該連結的角色陣列。
|
|
144
|
+
|
|
145
|
+
- 如果導覽項目沒有 `role` 屬性,則所有人皆可見。
|
|
146
|
+
- 如果目前使用者未經驗證,他們只能看到包含 `guest` 角色的項目。
|
|
147
|
+
- 如果目前使用者已驗證,元件會將其 `user.role` 與每個導覽項目的 `role` 陣列進行比較。只有在匹配的情況下,該項目才會顯示。
|
|
148
|
+
- 只有在父導覽項目至少有一個子項目可見時,該父項目才可見。
|
|
149
|
+
|
|
150
|
+
使用上面的 `blocklet.yml` 範例:
|
|
151
|
+
- 具有 `guest` 角色的使用者只會看到「Home」連結。
|
|
152
|
+
- 具有 `admin` 角色的使用者將看到「Home」和「Analytics」。
|
|
153
|
+
- 具有 `owner` 角色的使用者將看到所有連結,包括「Settings」下的巢狀「Profile」和「Billing」連結。
|
|
154
|
+
|
|
155
|
+
### 圖示
|
|
156
|
+
|
|
157
|
+
導覽項目的 `icon` 屬性應為一個字串,對應於 [Iconify](https://icon-sets.iconify.design/) 圖示庫中的圖示名稱(例如 `mdi:home`)。您也可以提供一個指向圖片檔案的完整 URL。
|
|
158
|
+
|
|
159
|
+
## 自訂
|
|
160
|
+
|
|
161
|
+
雖然 `Dashboard` 設計為可透過元資料開箱即用,但它也提供了幾個屬性以進行更進階的自訂。
|
|
162
|
+
|
|
163
|
+
### 自訂頁首附加元件
|
|
164
|
+
|
|
165
|
+
您可以使用 `headerAddons` 屬性修改預設的頁首附加元件(例如,主題切換、語系選擇器、會話管理器)。透過傳遞一個函式,您可以新增元素或重新排列現有元素。
|
|
166
|
+
|
|
167
|
+
```javascript CustomHeader.jsx icon=logos:react
|
|
168
|
+
import Dashboard from '@arcblock/blocklet-ui-react/lib/Dashboard';
|
|
169
|
+
import Button from '@mui/material/Button';
|
|
170
|
+
|
|
171
|
+
function MyCustomButton() {
|
|
172
|
+
return <Button color="inherit" onClick={() => alert('Help!')}>Help</Button>;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export default function CustomDashboard() {
|
|
176
|
+
return (
|
|
177
|
+
<Dashboard
|
|
178
|
+
headerAddons={(existingAddons) => {
|
|
179
|
+
const customAddon = <MyCustomButton key="custom-help" />;
|
|
180
|
+
// Add the custom button before the other addons
|
|
181
|
+
return [customAddon, ...existingAddons];
|
|
182
|
+
}}
|
|
183
|
+
>
|
|
184
|
+
<p>Dashboard with a custom header button.</p>
|
|
185
|
+
</Dashboard>
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### 以程式化方式新增連結
|
|
191
|
+
|
|
192
|
+
`links` 屬性允許您從程式碼中動態新增或修改側邊欄導覽連結。這對於依賴應用程式狀態的連結很有用。
|
|
193
|
+
|
|
194
|
+
```javascript DynamicLinks.jsx icon=logos:react
|
|
195
|
+
import Dashboard from '@arcblock/blocklet-ui-react/lib/Dashboard';
|
|
196
|
+
import Icon from '@arcblock/ux/lib/Icon';
|
|
197
|
+
|
|
198
|
+
const useFeatureFlag = () => {
|
|
199
|
+
// 在實際應用程式中,這裡會檢查功能旗標服務
|
|
200
|
+
return true;
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
export default function DynamicDashboard() {
|
|
204
|
+
const isBetaFeatureEnabled = useFeatureFlag();
|
|
205
|
+
|
|
206
|
+
return (
|
|
207
|
+
<Dashboard
|
|
208
|
+
links={(existingLinks) => {
|
|
209
|
+
if (isBetaFeatureEnabled) {
|
|
210
|
+
const betaLink = {
|
|
211
|
+
id: 'beta-feature',
|
|
212
|
+
title: 'Beta Feature',
|
|
213
|
+
url: '/beta',
|
|
214
|
+
icon: <Icon name="mdi:test-tube" />,
|
|
215
|
+
external: true, // 客戶端路由所需
|
|
216
|
+
};
|
|
217
|
+
return [...existingLinks, betaLink];
|
|
218
|
+
}
|
|
219
|
+
return existingLinks;
|
|
220
|
+
}}
|
|
221
|
+
>
|
|
222
|
+
<p>This dashboard may have dynamic links.</p>
|
|
223
|
+
</Dashboard>
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## 總結
|
|
230
|
+
|
|
231
|
+
`Dashboard` 元件是快速建構應用程式佈局的強大工具。透過利用 blocklet 元資料,它提供了一個開箱即用的、具備角色感知能力的結構化導覽系統。若需更基礎的佈局元件,請參閱 [Header](./components-layout-header.md) 和 [Footer](./components-layout-footer.md) 的文件。
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# Dashboard
|
|
2
|
+
|
|
3
|
+
`Dashboard` 组件为 blocklet 应用程序提供了一个预构建的响应式布局,通常用于管理界面或以用户为中心的视图。它通过解析 blocklet 的元数据,自动构建一个包含侧边栏、头部和主内容区域的标准仪表盘。该组件显著减少了构建常见应用程序结构的样板代码。
|
|
4
|
+
|
|
5
|
+
该布局由三个主要部分组成:一个用于导航的持久侧边栏,一个用于全局操作和用户信息的头部,以及一个渲染特定页面内容的主内容区域。
|
|
6
|
+
|
|
7
|
+
```d2
|
|
8
|
+
direction: down
|
|
9
|
+
|
|
10
|
+
Dashboard-Layout: {
|
|
11
|
+
label: "Dashboard 组件"
|
|
12
|
+
shape: rectangle
|
|
13
|
+
grid-columns: 1
|
|
14
|
+
style: {
|
|
15
|
+
stroke: "#888"
|
|
16
|
+
stroke-width: 2
|
|
17
|
+
stroke-dash: 4
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
Header: {
|
|
21
|
+
shape: rectangle
|
|
22
|
+
Logo: {}
|
|
23
|
+
HeaderAddons: {
|
|
24
|
+
label: "Header 附加组件"
|
|
25
|
+
shape: rectangle
|
|
26
|
+
grid-columns: 1
|
|
27
|
+
SessionManager: {}
|
|
28
|
+
LocaleSelector: {}
|
|
29
|
+
ThemeToggle: {}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
Sidebar: {
|
|
34
|
+
label: "侧边栏"
|
|
35
|
+
shape: rectangle
|
|
36
|
+
Navigation-Links: {
|
|
37
|
+
label: "导航链接"
|
|
38
|
+
shape: rectangle
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
Content-Area: {
|
|
43
|
+
label: "内容区域"
|
|
44
|
+
shape: rectangle
|
|
45
|
+
"特定页面的内容 (children)"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
Blocklet-Metadata: {
|
|
50
|
+
label: "blocklet.yml"
|
|
51
|
+
shape: cylinder
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
Blocklet-Metadata -> Dashboard-Layout.Sidebar.Navigation-Links: "生成"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## 基本用法
|
|
58
|
+
|
|
59
|
+
要使用 `Dashboard` 组件,只需用它包裹页面内容即可。该组件将自动在您的内容周围渲染头部和侧边栏。
|
|
60
|
+
|
|
61
|
+
```javascript MyDashboard.jsx icon=logos:react
|
|
62
|
+
import Dashboard from '@arcblock/blocklet-ui-react/lib/Dashboard';
|
|
63
|
+
|
|
64
|
+
export default function MyDashboardPage() {
|
|
65
|
+
return (
|
|
66
|
+
<Dashboard>
|
|
67
|
+
<h1>欢迎来到 Dashboard</h1>
|
|
68
|
+
<p>这是您的主内容区域。</p>
|
|
69
|
+
</Dashboard>
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
传递给 `Dashboard` 组件的子元素将显示在主内容区域。
|
|
75
|
+
|
|
76
|
+
## 属性
|
|
77
|
+
|
|
78
|
+
`Dashboard` 组件接受以下属性以自定义其行为和外观。
|
|
79
|
+
|
|
80
|
+
<x-field-group>
|
|
81
|
+
<x-field data-name="children" data-type="React.ReactNode" data-required="true">
|
|
82
|
+
<x-field-desc markdown>要在仪表盘布局的主内容区域内渲染的内容。</x-field-desc>
|
|
83
|
+
</x-field>
|
|
84
|
+
<x-field data-name="meta" data-type="object" data-required="false">
|
|
85
|
+
<x-field-desc markdown>一个 blocklet 元数据对象。如果提供,它将与默认的 `window.blocklet` 元数据合并并覆盖后者。这对于测试或动态更改 blocklet 信息非常有用。</x-field-desc>
|
|
86
|
+
</x-field>
|
|
87
|
+
<x-field data-name="fallbackUrl" data-type="string" data-required="false" data-default="publicPath">
|
|
88
|
+
<x-field-desc markdown>如果当前已认证用户根据其角色无权访问任何导航链接,则重定向到此 URL。设置为 `null` 可禁用此自动重定向。</x-field-desc>
|
|
89
|
+
</x-field>
|
|
90
|
+
<x-field data-name="invalidPathFallback" data-type="function" data-required="false">
|
|
91
|
+
<x-field-desc markdown>当当前 URL 路径与任何可用的导航链接都不匹配时执行的回调函数。默认行为是重定向到第一个可用的链接。</x-field-desc>
|
|
92
|
+
</x-field>
|
|
93
|
+
<x-field data-name="headerAddons" data-type="React.ReactNode | function" data-required="false">
|
|
94
|
+
<x-field-desc markdown>允许自定义头部右侧的附加组件。如果提供一个节点,它将替换所有默认的附加组件。如果提供一个函数,它会接收默认附加组件数组作为参数,允许您添加、删除或重新排序它们。</x-field-desc>
|
|
95
|
+
</x-field>
|
|
96
|
+
<x-field data-name="sessionManagerProps" data-type="object" data-required="false">
|
|
97
|
+
<x-field-desc markdown>要直接传递给头部底层 `SessionUser` 组件的属性。这允许自定义用户会话菜单,例如 `showRole` 或定义自定义的 `onLogout` 处理程序。</x-field-desc>
|
|
98
|
+
</x-field>
|
|
99
|
+
<x-field data-name="links" data-type="array | function" data-required="false">
|
|
100
|
+
<x-field-desc markdown>允许以编程方式修改侧边栏导航链接。如果提供一个数组,其项目将附加到从元数据生成的链接后面。如果提供一个函数,它将接收元数据生成的链接作为参数,并应返回一个新的链接数组。</x-field-desc>
|
|
101
|
+
</x-field>
|
|
102
|
+
<x-field data-name="showDomainWarningDialog" data-type="boolean" data-required="false" data-default="true">
|
|
103
|
+
<x-field-desc markdown>如果为 `true`,当应用程序从不受信任的域访问时,将显示一个警告对话框。</x-field-desc>
|
|
104
|
+
</x-field>
|
|
105
|
+
</x-field-group>
|
|
106
|
+
|
|
107
|
+
## 工作原理
|
|
108
|
+
|
|
109
|
+
`Dashboard` 组件被设计为“配置驱动”,其结构和内容主要来源于 blocklet 的元数据文件(`blocklet.yml`)。
|
|
110
|
+
|
|
111
|
+
### 从元数据生成导航
|
|
112
|
+
|
|
113
|
+
侧边栏导航是根据 `blocklet.yml` 中的 `navigation` 数组自动生成的。该组件专门查找其 `section` 属性中包含 `dashboard` 的导航项。
|
|
114
|
+
|
|
115
|
+
以下是如何定义仪表盘导航的示例:
|
|
116
|
+
|
|
117
|
+
```yaml blocklet.yml icon=mdi:file-document
|
|
118
|
+
navigation:
|
|
119
|
+
- title: 'Home'
|
|
120
|
+
link: '/'
|
|
121
|
+
section: 'dashboard'
|
|
122
|
+
icon: 'mdi:home'
|
|
123
|
+
role: ['owner', 'admin', 'guest']
|
|
124
|
+
- title: 'Analytics'
|
|
125
|
+
link: '/analytics'
|
|
126
|
+
section: 'dashboard'
|
|
127
|
+
icon: 'mdi:chart-bar'
|
|
128
|
+
role: ['owner', 'admin']
|
|
129
|
+
- title: 'Settings'
|
|
130
|
+
link: '/settings'
|
|
131
|
+
section: 'dashboard'
|
|
132
|
+
icon: 'mdi:cog'
|
|
133
|
+
role: ['owner']
|
|
134
|
+
items:
|
|
135
|
+
- title: 'Profile'
|
|
136
|
+
link: '/settings/profile'
|
|
137
|
+
- title: 'Billing'
|
|
138
|
+
link: '/settings/billing'
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 基于角色的访问控制
|
|
142
|
+
|
|
143
|
+
`Dashboard` 组件对导航链接实施基于角色的访问控制(RBAC)。每个导航项可以有一个 `role` 属性,这是一个允许查看该链接的角色数组。
|
|
144
|
+
|
|
145
|
+
- 如果导航项没有 `role` 属性,则对所有人可见。
|
|
146
|
+
- 如果当前用户未认证,他们只能看到包含 `guest` 角色的项目。
|
|
147
|
+
- 如果当前用户已认证,组件会将其 `user.role` 与每个导航项的 `role` 数组进行比较。只有在匹配的情况下,该项目才会显示。
|
|
148
|
+
- 只有当父导航项至少有一个子项可见时,父导航项本身才可见。
|
|
149
|
+
|
|
150
|
+
使用上面的 `blocklet.yml` 示例:
|
|
151
|
+
- 具有 `guest` 角色的用户将只看到“Home”链接。
|
|
152
|
+
- 具有 `admin` 角色的用户将看到“Home”和“Analytics”。
|
|
153
|
+
- 具有 `owner` 角色的用户将看到所有链接,包括“Settings”下的嵌套链接“Profile”和“Billing”。
|
|
154
|
+
|
|
155
|
+
### 图标
|
|
156
|
+
|
|
157
|
+
导航项的 `icon` 属性应该是一个字符串,对应于 [Iconify](https://icon-sets.iconify.design/) 库中的图标名称(例如,`mdi:home`)。您也可以提供一个指向图像文件的完整 URL。
|
|
158
|
+
|
|
159
|
+
## 自定义
|
|
160
|
+
|
|
161
|
+
虽然 `Dashboard` 被设计为可以与元数据开箱即用,但它也提供了几个属性用于更高级的自定义。
|
|
162
|
+
|
|
163
|
+
### 自定义头部附加组件
|
|
164
|
+
|
|
165
|
+
您可以使用 `headerAddons` 属性修改默认的头部附加组件(例如,主题切换器、区域设置选择器、会话管理器)。通过传递一个函数,您可以添加新元素或重新排列现有元素。
|
|
166
|
+
|
|
167
|
+
```javascript CustomHeader.jsx icon=logos:react
|
|
168
|
+
import Dashboard from '@arcblock/blocklet-ui-react/lib/Dashboard';
|
|
169
|
+
import Button from '@mui/material/Button';
|
|
170
|
+
|
|
171
|
+
function MyCustomButton() {
|
|
172
|
+
return <Button color="inherit" onClick={() => alert('Help!')}>Help</Button>;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export default function CustomDashboard() {
|
|
176
|
+
return (
|
|
177
|
+
<Dashboard
|
|
178
|
+
headerAddons={(existingAddons) => {
|
|
179
|
+
const customAddon = <MyCustomButton key="custom-help" />;
|
|
180
|
+
// 将自定义按钮添加到其他附加组件之前
|
|
181
|
+
return [customAddon, ...existingAddons];
|
|
182
|
+
}}
|
|
183
|
+
>
|
|
184
|
+
<p>带有自定义头部按钮的 Dashboard。</p>
|
|
185
|
+
</Dashboard>
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### 以编程方式添加链接
|
|
191
|
+
|
|
192
|
+
`links` 属性允许您通过代码动态添加或修改侧边栏导航链接。这对于依赖于应用程序状态的链接非常有用。
|
|
193
|
+
|
|
194
|
+
```javascript DynamicLinks.jsx icon=logos:react
|
|
195
|
+
import Dashboard from '@arcblock/blocklet-ui-react/lib/Dashboard';
|
|
196
|
+
import Icon from '@arcblock/ux/lib/Icon';
|
|
197
|
+
|
|
198
|
+
const useFeatureFlag = () => {
|
|
199
|
+
// 在实际应用中,这里会检查功能开关服务
|
|
200
|
+
return true;
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
export default function DynamicDashboard() {
|
|
204
|
+
const isBetaFeatureEnabled = useFeatureFlag();
|
|
205
|
+
|
|
206
|
+
return (
|
|
207
|
+
<Dashboard
|
|
208
|
+
links={(existingLinks) => {
|
|
209
|
+
if (isBetaFeatureEnabled) {
|
|
210
|
+
const betaLink = {
|
|
211
|
+
id: 'beta-feature',
|
|
212
|
+
title: 'Beta Feature',
|
|
213
|
+
url: '/beta',
|
|
214
|
+
icon: <Icon name="mdi:test-tube" />,
|
|
215
|
+
external: true, // 客户端路由所需
|
|
216
|
+
};
|
|
217
|
+
return [...existingLinks, betaLink];
|
|
218
|
+
}
|
|
219
|
+
return existingLinks;
|
|
220
|
+
}}
|
|
221
|
+
>
|
|
222
|
+
<p>此仪表盘可能包含动态链接。</p>
|
|
223
|
+
</Dashboard>
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## 总结
|
|
230
|
+
|
|
231
|
+
`Dashboard` 组件是快速搭建应用程序布局的强大工具。通过利用 blocklet 元数据,它提供了一个结构化、具备角色感知能力的开箱即用的导航系统。有关更基础的布局组件,请参阅 [Header](./components-layout-header.md) 和 [Footer](./components-layout-footer.md) 的文档。
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Footer
|
|
2
|
+
|
|
3
|
+
`Footer` コンポーネントは、アプリケーションに標準化されたレスポンシブなフッターを提供します。blocklet のメタデータを読み取ることで、ブランディング、ナビゲーションリンク、ソーシャルメディアアイコン、著作権情報などのコンテンツを自動的に入力します。このデータ駆動型のアプローチにより、一貫性が確保され、設定が簡素化されます。
|
|
4
|
+
|
|
5
|
+
このコンポーネントはレスポンシブに設計されており、さまざまな画面サイズに合わせてレイアウトを調整します。また、アプリケーションが埋め込みモードで実行されている場合に自身を非表示にするロジックが組み込まれており、統合時にクリーンなユーザーインターフェースを保証します。
|
|
6
|
+
|
|
7
|
+
## 基本的な使用方法
|
|
8
|
+
|
|
9
|
+
アプリケーションにフッターを追加するには、`Footer` コンポーネントをインポートしてレンダリングするだけです。グローバルな `window.blocklet` オブジェクトから自動的にデータを取得するため、基本的な使用には props は必要ありません。
|
|
10
|
+
|
|
11
|
+
```jsx 使用例 icon=logos:react
|
|
12
|
+
import React from 'react';
|
|
13
|
+
import { Footer } from '@blocklet/ui-react';
|
|
14
|
+
|
|
15
|
+
export default function App() {
|
|
16
|
+
return (
|
|
17
|
+
<div style={{ minHeight: '100vh', display: 'flex', flexDirection: 'column' }}>
|
|
18
|
+
<main style={{ flex: 1 }}>
|
|
19
|
+
{/* ここにアプリケーションのコンテンツを記述します */}
|
|
20
|
+
</main>
|
|
21
|
+
<Footer />
|
|
22
|
+
</div>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Props
|
|
28
|
+
|
|
29
|
+
`Footer` コンポーネントは、以下の props を通じてカスタマイズできます。
|
|
30
|
+
|
|
31
|
+
<x-field-group>
|
|
32
|
+
<x-field data-name="meta" data-type="object" data-required="false">
|
|
33
|
+
<x-field-desc markdown>
|
|
34
|
+
blocklet のメタデータを含むオブジェクト。この prop を使用して、デフォルトの `window.blocklet` 設定を上書きしたり、グローバルオブジェクトが利用できない環境でデータを提供したりします。構造は blocklet のメタデータ形式と一致する必要があります。
|
|
35
|
+
</x-field-desc>
|
|
36
|
+
</x-field>
|
|
37
|
+
<x-field data-name="theme" data-type="object" data-required="false">
|
|
38
|
+
<x-field-desc markdown>
|
|
39
|
+
フッターの外観をカスタマイズするためのテーマオブジェクト。このオブジェクトはアプリケーションのデフォルトテーマと深くマージされ、色、フォント、スペーシングなどの特定のスタイルを上書きできます。
|
|
40
|
+
</x-field-desc>
|
|
41
|
+
</x-field>
|
|
42
|
+
</x-field-group>
|
|
43
|
+
|
|
44
|
+
## メタデータの設定
|
|
45
|
+
|
|
46
|
+
`Footer` のコンテンツは、主に blocklet のメタデータファイル (`blocklet.yml`) を通じて設定されます。コンポーネントは、このファイルから特定のフィールドを読み取り、さまざまなセクションをレンダリングします。
|
|
47
|
+
|
|
48
|
+
以下は、フッターのすべてのセクションにデータを入力する `blocklet.yml` 設定の例です。
|
|
49
|
+
|
|
50
|
+
```yaml blocklet.yml
|
|
51
|
+
name: my-app
|
|
52
|
+
title: My App
|
|
53
|
+
description: A detailed description of my application that appears in the footer.
|
|
54
|
+
copyright: 'My Company Inc.'
|
|
55
|
+
|
|
56
|
+
# ナビゲーションリンクはグループに構造化されています
|
|
57
|
+
navigation:
|
|
58
|
+
# メインフッターナビゲーション、グルーピングのために2つのレベルをサポート
|
|
59
|
+
footer:
|
|
60
|
+
- title: 'Products'
|
|
61
|
+
items:
|
|
62
|
+
- title: 'Product A'
|
|
63
|
+
link: '/products/a'
|
|
64
|
+
- title: 'Product B'
|
|
65
|
+
link: '/products/b'
|
|
66
|
+
- title: 'Resources'
|
|
67
|
+
items:
|
|
68
|
+
- title: 'Documentation'
|
|
69
|
+
link: '/docs'
|
|
70
|
+
- title: 'Blog'
|
|
71
|
+
link: '/blog'
|
|
72
|
+
|
|
73
|
+
# ソーシャルメディアリンク
|
|
74
|
+
social:
|
|
75
|
+
- title: 'twitter' # アイコンはタイトルから推測されます(例:'twitter'、'github')
|
|
76
|
+
link: 'https://twitter.com/your-handle'
|
|
77
|
+
- title: 'github'
|
|
78
|
+
icon: 'mdi:github' # Iconify のアイコン名を指定することもできます
|
|
79
|
+
link: 'https://github.com/your-org'
|
|
80
|
+
|
|
81
|
+
# ボトムリンク、通常は法的情報やプライバシー情報用
|
|
82
|
+
bottom:
|
|
83
|
+
- title: 'Privacy Policy'
|
|
84
|
+
link: '/privacy'
|
|
85
|
+
- title: 'Terms of Service'
|
|
86
|
+
link: '/terms'
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### データ構造
|
|
90
|
+
|
|
91
|
+
メタデータ内の `navigation` オブジェクトは、フッターに表示されるリンクを定義します。これは `footer`、`social`、`bottom` の3つの異なるセクションに整理されています。
|
|
92
|
+
|
|
93
|
+
<x-field-group>
|
|
94
|
+
<x-field data-name="navigation" data-type="object">
|
|
95
|
+
<x-field-desc markdown>
|
|
96
|
+
アプリケーションのすべてのナビゲーション構造を含みます。
|
|
97
|
+
</x-field-desc>
|
|
98
|
+
<x-field data-name="footer" data-type="array">
|
|
99
|
+
<x-field-desc markdown>
|
|
100
|
+
メインフッターナビゲーションエリアのリンクグループの配列。2階層の階層をサポートします。
|
|
101
|
+
</x-field-desc>
|
|
102
|
+
<x-field data-name="[].title" data-type="string" data-required="true" data-desc="ナビゲーショングループのタイトル(例:'Products')。"></x-field>
|
|
103
|
+
<x-field data-name="[].link" data-type="string" data-required="false" data-desc="グループタイトル自体のためのオプションのリンク。"></x-field>
|
|
104
|
+
<x-field data-name="[].items" data-type="array" data-required="false" data-desc="子ナビゲーションリンクの配列。">
|
|
105
|
+
<x-field data-name="[].title" data-type="string" data-required="true" data-desc="リンクの表示テキスト。"></x-field>
|
|
106
|
+
<x-field data-name="[].link" data-type="string" data-required="true" data-desc="ナビゲーションリンクのURL。"></x-field>
|
|
107
|
+
</x-field>
|
|
108
|
+
</x-field>
|
|
109
|
+
<x-field data-name="social" data-type="array">
|
|
110
|
+
<x-field-desc markdown>
|
|
111
|
+
ソーシャルメディアプロフィールへのリンクの配列。
|
|
112
|
+
</x-field-desc>
|
|
113
|
+
<x-field data-name="[].title" data-type="string" data-required="true" data-desc="ソーシャルメディアプラットフォームの名前。アイコンを推測するために使用されます(例:'twitter')。"></x-field>
|
|
114
|
+
<x-field data-name="[].icon" data-type="string" data-required="false" data-desc="Iconify 文字列(例:`mdi:github`)を使用してアイコンを明示的に指定します。推測されたアイコンを上書きします。"></x-field>
|
|
115
|
+
<x-field data-name="[].link" data-type="string" data-required="true" data-desc="ソーシャルメディアプロフィールへのURL。"></x-field>
|
|
116
|
+
</x-field>
|
|
117
|
+
<x-field data-name="bottom" data-type="array">
|
|
118
|
+
<x-field-desc markdown>
|
|
119
|
+
フッターの最下部に表示されるリンクの配列。通常は法的通知用です。
|
|
120
|
+
</x-field-desc>
|
|
121
|
+
<x-field data-name="[].title" data-type="string" data-required="true" data-desc="リンクの表示テキスト(例:'Privacy Policy')。"></x-field>
|
|
122
|
+
<x-field data-name="[].link" data-type="string" data-required="true" data-desc="リンクのURL。"></x-field>
|
|
123
|
+
</x-field>
|
|
124
|
+
</x-field>
|
|
125
|
+
</x-field-group>
|
|
126
|
+
|
|
127
|
+
## レイアウト
|
|
128
|
+
|
|
129
|
+
`Footer` コンポーネントは、提供されたデータに基づいて最も適切なレイアウトを賢く選択します。これにより、さまざまなユースケースでクリーンで機能的な表示が保証されます。
|
|
130
|
+
|
|
131
|
+
- **標準レイアウト**: このレイアウトは、メタデータに `footer` ナビゲーションリンクまたは `social` メディアリンクが定義されている場合に自動的に有効になります。ブランド情報、ソーシャルアイコン、ナビゲーションカラムをエレガントに整理するマルチセクションデザインが特徴です。モバイルデバイスでは、ナビゲーショングループは折りたたみ可能なアコーディオンになり、より良いユーザーエクスペリエンスを提供します。
|
|
132
|
+
|
|
133
|
+
- **プレーンレイアウト**: `footer` または `social` リンクが提供されていない場合、コンポーネントは簡素化された単一行のレイアウトにフォールバックします。これは、「利用規約」や「プライバシーポリシー」などの著作権表示といくつかの必須リンクのみを必要とするアプリケーションに最適です。
|
|
134
|
+
|
|
135
|
+
## テーマ設定
|
|
136
|
+
|
|
137
|
+
`theme` オブジェクトを渡すことで、フッターの外観をカスタマイズできます。このオブジェクトは既存のテーマと深くマージされ、特定のオーバーライドが可能です。
|
|
138
|
+
|
|
139
|
+
```jsx カスタムテーマの例 icon=logos:react
|
|
140
|
+
import { Footer } from '@blocklet/ui-react';
|
|
141
|
+
|
|
142
|
+
const customTheme = {
|
|
143
|
+
palette: {
|
|
144
|
+
background: {
|
|
145
|
+
default: '#2c3e50', // フッター用のより暗い背景
|
|
146
|
+
},
|
|
147
|
+
text: {
|
|
148
|
+
primary: '#ecf0f1',
|
|
149
|
+
secondary: '#bdc3c7',
|
|
150
|
+
},
|
|
151
|
+
divider: '#34495e',
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
// ... コンポーネントの render メソッド内
|
|
156
|
+
<Footer theme={customTheme} bordered />;
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## 埋め込みモードでの動作
|
|
160
|
+
|
|
161
|
+
`Footer` コンポーネントは、アプリケーションが埋め込みコンテキストでレンダリングされる際に自動的に非表示にする高階コンポーネント (`withHideWhenEmbed`) でラップされています。この動作は、セッションストレージキー `EMBED_MODE_KEY` によって制御されます。このキーが `1` に設定されている場合、フッターはレンダリングされません。これは、blocklet が別のアプリケーション内で表示される際に、冗長なフッターを防ぐのに役立ちます。
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
blocklet メタデータを通じて設定されるヘッダーコンポーネントに関する情報については、[Header ドキュメント](./components-layout-header.md) を参照してください。
|