openadmin-dev 0.7.5__tar.gz → 0.7.8__tar.gz
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.
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/PKG-INFO +1 -1
- openadmin_dev-0.7.8/examples/admin/docs.py +39 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/examples/main.py +9 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/fastapi/action.py +2 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/fastapi/admin_page.py +47 -1
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/fastapi/form.py +2 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/fastapi/markdown.py +2 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/spec/__init__.py +4 -1
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/spec/action.py +4 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/spec/component.py +2 -2
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/spec/form.py +4 -0
- openadmin_dev-0.7.8/openadmin/spec/markdown.py +36 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/pyproject.toml +1 -1
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/uv.lock +1 -1
- openadmin_dev-0.7.5/openadmin/spec/markdown.py +0 -20
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/.github/ISSUE_TEMPLATE/bug.md +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/.github/ISSUE_TEMPLATE/chore.md +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/.github/ISSUE_TEMPLATE/feature.md +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/.github/actions/branch-name/action.yml +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/.github/actions/dependency-cves/action.yml +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/.github/actions/format/action.yml +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/.github/actions/license/action.yml +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/.github/actions/lint/action.yml +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/.github/actions/security/action.yml +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/.github/actions/spell-check/action.yml +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/.github/actions/test/action.yml +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/.github/actions/typecheck/action.yml +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/.github/actions/unused-code/action.yml +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/.github/workflows/ci.yml +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/.github/workflows/publish.yml +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/.gitignore +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/.python-version +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/LICENSE +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/LICENSES/AGPL-3.0-or-later.txt +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/Makefile +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/README.md +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/REUSE.toml +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/docs/assets/logo.png +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/examples/__init__.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/examples/admin/__init__.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/examples/admin/analytics.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/examples/admin/authors.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/examples/admin/books.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/examples/admin/genres.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/examples/admin/health.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/examples/admin/overview.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/examples/admin/publishers.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/examples/admin/reports.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/examples/admin/tags.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/examples/admin/weekdays.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/examples/lib/__init__.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/examples/lib/database.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/examples/lib/lifespan.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/examples/lib/models.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/examples/lib/seed.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/fastapi/__init__.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/fastapi/admin_panel.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/fastapi/area_chart.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/fastapi/bar_chart.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/fastapi/component.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/fastapi/counters.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/fastapi/deps.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/fastapi/line_chart.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/fastapi/page_protocol.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/fastapi/pagination_params.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/fastapi/pie_chart.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/fastapi/section.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/fastapi/stat.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/fastapi/table.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/fastapi/utils.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/spec/area_chart.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/spec/bar_chart.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/spec/colors.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/spec/http_methods.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/spec/icons.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/spec/line_chart.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/spec/page.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/spec/pie_chart.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/spec/property.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/spec/property_type.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/spec/section.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/spec/spec.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/spec/stat.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/openadmin/spec/table.py +0 -0
- {openadmin_dev-0.7.5 → openadmin_dev-0.7.8}/tests/test_hello.py +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: 2026 OpenAdmin
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
4
|
+
|
|
5
|
+
from openadmin import fastapi, spec
|
|
6
|
+
|
|
7
|
+
page = fastapi.AdminPage("Docs", icon="dock")
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@page.markdown("Company policy 1", icon="podcast", color="blue")
|
|
11
|
+
def company_policy_1() -> spec.Markdown:
|
|
12
|
+
return """
|
|
13
|
+
# Hello World
|
|
14
|
+
|
|
15
|
+
This is new text
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
- Cake
|
|
20
|
+
- Limonade
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@page.markdown("Company policy 2")
|
|
25
|
+
def company_policy_2() -> spec.Markdown:
|
|
26
|
+
return {
|
|
27
|
+
"content": """
|
|
28
|
+
# Hello World
|
|
29
|
+
|
|
30
|
+
This is new text
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
- Cake
|
|
35
|
+
- Limonade
|
|
36
|
+
""",
|
|
37
|
+
"color": "yellow",
|
|
38
|
+
"icon": "a-arrow-up",
|
|
39
|
+
}
|
|
@@ -11,6 +11,7 @@ from .admin import (
|
|
|
11
11
|
analytics,
|
|
12
12
|
authors,
|
|
13
13
|
books,
|
|
14
|
+
docs,
|
|
14
15
|
genres,
|
|
15
16
|
health,
|
|
16
17
|
overview,
|
|
@@ -35,6 +36,14 @@ admin_panel = AdminPanel(
|
|
|
35
36
|
"Book Library Admin", description="Manage and explore the book catalog"
|
|
36
37
|
)
|
|
37
38
|
|
|
39
|
+
admin_panel.section(
|
|
40
|
+
"Docs",
|
|
41
|
+
icon="download-cloud",
|
|
42
|
+
pages=[
|
|
43
|
+
docs.page,
|
|
44
|
+
],
|
|
45
|
+
)
|
|
46
|
+
|
|
38
47
|
admin_panel.section(
|
|
39
48
|
"Library", icon="library", pages=[books.page, authors.page, publishers.page]
|
|
40
49
|
)
|
|
@@ -155,6 +155,8 @@ class AdminPage:
|
|
|
155
155
|
method=item.method,
|
|
156
156
|
url=url,
|
|
157
157
|
is_hidden=item.is_hidden,
|
|
158
|
+
icon=item.icon,
|
|
159
|
+
color=item.color,
|
|
158
160
|
query=query,
|
|
159
161
|
body=body,
|
|
160
162
|
form=form,
|
|
@@ -170,6 +172,8 @@ class AdminPage:
|
|
|
170
172
|
method=item.method,
|
|
171
173
|
url=url,
|
|
172
174
|
is_hidden=item.is_hidden,
|
|
175
|
+
icon=item.icon,
|
|
176
|
+
color=item.color,
|
|
173
177
|
query=query,
|
|
174
178
|
body=body,
|
|
175
179
|
form=form,
|
|
@@ -177,10 +181,12 @@ class AdminPage:
|
|
|
177
181
|
)
|
|
178
182
|
elif isinstance(item, Markdown):
|
|
179
183
|
components.append(
|
|
180
|
-
spec.
|
|
184
|
+
spec.MarkdownComponent(
|
|
181
185
|
type="markdown",
|
|
182
186
|
id=item.id,
|
|
183
187
|
name=item.name,
|
|
188
|
+
icon=item.icon,
|
|
189
|
+
color=item.color,
|
|
184
190
|
description=item.description,
|
|
185
191
|
method=item.method,
|
|
186
192
|
url=url,
|
|
@@ -276,6 +282,8 @@ class AdminPage:
|
|
|
276
282
|
name: str,
|
|
277
283
|
*,
|
|
278
284
|
description: str | None = None,
|
|
285
|
+
color: spec.Color | None = None,
|
|
286
|
+
icon: spec.Icon | None = None,
|
|
279
287
|
):
|
|
280
288
|
kebab_name, unique_name = self.__get_kebab_and_unique_name(name)
|
|
281
289
|
|
|
@@ -285,6 +293,8 @@ class AdminPage:
|
|
|
285
293
|
name=name,
|
|
286
294
|
description=description,
|
|
287
295
|
id=kebab_name,
|
|
296
|
+
icon=icon,
|
|
297
|
+
color=color,
|
|
288
298
|
)
|
|
289
299
|
self.state.append(item)
|
|
290
300
|
|
|
@@ -303,6 +313,8 @@ class AdminPage:
|
|
|
303
313
|
*,
|
|
304
314
|
description: str | None = None,
|
|
305
315
|
is_hidden: bool = False,
|
|
316
|
+
icon: spec.Icon | None = None,
|
|
317
|
+
color: spec.Color | None = None,
|
|
306
318
|
):
|
|
307
319
|
kebab_name, unique_name = self.__get_kebab_and_unique_name(name)
|
|
308
320
|
|
|
@@ -312,6 +324,8 @@ class AdminPage:
|
|
|
312
324
|
name=name,
|
|
313
325
|
description=description,
|
|
314
326
|
is_hidden=is_hidden,
|
|
327
|
+
icon=icon,
|
|
328
|
+
color=color,
|
|
315
329
|
id=kebab_name,
|
|
316
330
|
)
|
|
317
331
|
self.state.append(item)
|
|
@@ -328,6 +342,8 @@ class AdminPage:
|
|
|
328
342
|
*,
|
|
329
343
|
description: str | None = None,
|
|
330
344
|
is_hidden: bool = False,
|
|
345
|
+
icon: spec.Icon | None = None,
|
|
346
|
+
color: spec.Color | None = None,
|
|
331
347
|
):
|
|
332
348
|
kebab_name, unique_name = self.__get_kebab_and_unique_name(name)
|
|
333
349
|
|
|
@@ -337,6 +353,8 @@ class AdminPage:
|
|
|
337
353
|
name=name,
|
|
338
354
|
description=description,
|
|
339
355
|
is_hidden=is_hidden,
|
|
356
|
+
icon=icon,
|
|
357
|
+
color=color,
|
|
340
358
|
id=kebab_name,
|
|
341
359
|
)
|
|
342
360
|
self.state.append(item)
|
|
@@ -353,6 +371,8 @@ class AdminPage:
|
|
|
353
371
|
*,
|
|
354
372
|
description: str | None = None,
|
|
355
373
|
is_hidden: bool = False,
|
|
374
|
+
icon: spec.Icon | None = None,
|
|
375
|
+
color: spec.Color | None = None,
|
|
356
376
|
):
|
|
357
377
|
kebab_name, unique_name = self.__get_kebab_and_unique_name(name)
|
|
358
378
|
|
|
@@ -362,6 +382,8 @@ class AdminPage:
|
|
|
362
382
|
name=name,
|
|
363
383
|
description=description,
|
|
364
384
|
is_hidden=is_hidden,
|
|
385
|
+
icon=icon,
|
|
386
|
+
color=color,
|
|
365
387
|
id=kebab_name,
|
|
366
388
|
)
|
|
367
389
|
self.state.append(item)
|
|
@@ -378,6 +400,8 @@ class AdminPage:
|
|
|
378
400
|
*,
|
|
379
401
|
description: str | None = None,
|
|
380
402
|
is_hidden: bool = False,
|
|
403
|
+
icon: spec.Icon | None = None,
|
|
404
|
+
color: spec.Color | None = None,
|
|
381
405
|
):
|
|
382
406
|
kebab_name, unique_name = self.__get_kebab_and_unique_name(name)
|
|
383
407
|
|
|
@@ -387,6 +411,8 @@ class AdminPage:
|
|
|
387
411
|
name=name,
|
|
388
412
|
description=description,
|
|
389
413
|
is_hidden=is_hidden,
|
|
414
|
+
icon=icon,
|
|
415
|
+
color=color,
|
|
390
416
|
id=kebab_name,
|
|
391
417
|
)
|
|
392
418
|
self.state.append(item)
|
|
@@ -403,6 +429,8 @@ class AdminPage:
|
|
|
403
429
|
*,
|
|
404
430
|
description: str | None = None,
|
|
405
431
|
is_hidden: bool = False,
|
|
432
|
+
icon: spec.Icon | None = None,
|
|
433
|
+
color: spec.Color | None = None,
|
|
406
434
|
):
|
|
407
435
|
kebab_name, unique_name = self.__get_kebab_and_unique_name(name)
|
|
408
436
|
|
|
@@ -412,6 +440,8 @@ class AdminPage:
|
|
|
412
440
|
name=name,
|
|
413
441
|
description=description,
|
|
414
442
|
is_hidden=is_hidden,
|
|
443
|
+
icon=icon,
|
|
444
|
+
color=color,
|
|
415
445
|
id=kebab_name,
|
|
416
446
|
)
|
|
417
447
|
self.state.append(item)
|
|
@@ -428,6 +458,8 @@ class AdminPage:
|
|
|
428
458
|
*,
|
|
429
459
|
description: str | None = None,
|
|
430
460
|
is_hidden: bool = False,
|
|
461
|
+
icon: spec.Icon | None = None,
|
|
462
|
+
color: spec.Color | None = None,
|
|
431
463
|
):
|
|
432
464
|
kebab_name, unique_name = self.__get_kebab_and_unique_name(name)
|
|
433
465
|
|
|
@@ -437,6 +469,8 @@ class AdminPage:
|
|
|
437
469
|
name=name,
|
|
438
470
|
description=description,
|
|
439
471
|
is_hidden=is_hidden,
|
|
472
|
+
icon=icon,
|
|
473
|
+
color=color,
|
|
440
474
|
id=kebab_name,
|
|
441
475
|
)
|
|
442
476
|
self.state.append(item)
|
|
@@ -453,6 +487,8 @@ class AdminPage:
|
|
|
453
487
|
*,
|
|
454
488
|
description: str | None = None,
|
|
455
489
|
is_hidden: bool = False,
|
|
490
|
+
icon: spec.Icon | None = None,
|
|
491
|
+
color: spec.Color | None = None,
|
|
456
492
|
):
|
|
457
493
|
kebab_name, unique_name = self.__get_kebab_and_unique_name(name)
|
|
458
494
|
|
|
@@ -462,6 +498,8 @@ class AdminPage:
|
|
|
462
498
|
name=name,
|
|
463
499
|
description=description,
|
|
464
500
|
is_hidden=is_hidden,
|
|
501
|
+
icon=icon,
|
|
502
|
+
color=color,
|
|
465
503
|
id=kebab_name,
|
|
466
504
|
)
|
|
467
505
|
self.state.append(item)
|
|
@@ -478,6 +516,8 @@ class AdminPage:
|
|
|
478
516
|
*,
|
|
479
517
|
description: str | None = None,
|
|
480
518
|
is_hidden: bool = False,
|
|
519
|
+
icon: spec.Icon | None = None,
|
|
520
|
+
color: spec.Color | None = None,
|
|
481
521
|
):
|
|
482
522
|
kebab_name, unique_name = self.__get_kebab_and_unique_name(name)
|
|
483
523
|
|
|
@@ -487,6 +527,8 @@ class AdminPage:
|
|
|
487
527
|
name=name,
|
|
488
528
|
description=description,
|
|
489
529
|
is_hidden=is_hidden,
|
|
530
|
+
icon=icon,
|
|
531
|
+
color=color,
|
|
490
532
|
id=kebab_name,
|
|
491
533
|
)
|
|
492
534
|
self.state.append(item)
|
|
@@ -503,6 +545,8 @@ class AdminPage:
|
|
|
503
545
|
*,
|
|
504
546
|
description: str | None = None,
|
|
505
547
|
is_hidden: bool = False,
|
|
548
|
+
icon: spec.Icon | None = None,
|
|
549
|
+
color: spec.Color | None = None,
|
|
506
550
|
):
|
|
507
551
|
kebab_name, unique_name = self.__get_kebab_and_unique_name(name)
|
|
508
552
|
|
|
@@ -512,6 +556,8 @@ class AdminPage:
|
|
|
512
556
|
name=name,
|
|
513
557
|
description=description,
|
|
514
558
|
is_hidden=is_hidden,
|
|
559
|
+
icon=icon,
|
|
560
|
+
color=color,
|
|
515
561
|
id=kebab_name,
|
|
516
562
|
)
|
|
517
563
|
self.state.append(item)
|
|
@@ -17,7 +17,7 @@ from .form import Form
|
|
|
17
17
|
from .http_methods import HttpMethod
|
|
18
18
|
from .icons import Icon
|
|
19
19
|
from .line_chart import LineChart
|
|
20
|
-
from .markdown import Markdown
|
|
20
|
+
from .markdown import Markdown, MarkdownComponent, MarkdownContent, MarkdownResponse
|
|
21
21
|
from .page import Page
|
|
22
22
|
from .pie_chart import (
|
|
23
23
|
PieChart,
|
|
@@ -49,6 +49,9 @@ __all__ = [
|
|
|
49
49
|
"Icon",
|
|
50
50
|
"LineChart",
|
|
51
51
|
"Markdown",
|
|
52
|
+
"MarkdownComponent",
|
|
53
|
+
"MarkdownContent",
|
|
54
|
+
"MarkdownResponse",
|
|
52
55
|
"Page",
|
|
53
56
|
"PieChart",
|
|
54
57
|
"PieChartComponent",
|
|
@@ -6,7 +6,9 @@ from typing import Literal
|
|
|
6
6
|
|
|
7
7
|
from pydantic import BaseModel, Field
|
|
8
8
|
|
|
9
|
+
from .colors import Color
|
|
9
10
|
from .http_methods import HttpMethod
|
|
11
|
+
from .icons import Icon
|
|
10
12
|
from .property import Property
|
|
11
13
|
|
|
12
14
|
|
|
@@ -16,6 +18,8 @@ class Action(BaseModel):
|
|
|
16
18
|
name: str
|
|
17
19
|
description: str | None
|
|
18
20
|
url: str
|
|
21
|
+
icon: Icon | None
|
|
22
|
+
color: Color | None
|
|
19
23
|
method: HttpMethod
|
|
20
24
|
is_hidden: bool
|
|
21
25
|
form: list[Property] | None = Field(None)
|
|
@@ -8,7 +8,7 @@ from .area_chart import AreaChart
|
|
|
8
8
|
from .bar_chart import BarChartComponent
|
|
9
9
|
from .form import Form
|
|
10
10
|
from .line_chart import LineChart
|
|
11
|
-
from .markdown import
|
|
11
|
+
from .markdown import MarkdownComponent
|
|
12
12
|
from .pie_chart import PieChartComponent
|
|
13
13
|
from .stat import StatComponent
|
|
14
14
|
from .table import TableComponent
|
|
@@ -22,5 +22,5 @@ type Component = (
|
|
|
22
22
|
| PieChartComponent
|
|
23
23
|
| Action
|
|
24
24
|
| Form
|
|
25
|
-
|
|
|
25
|
+
| MarkdownComponent
|
|
26
26
|
)
|
|
@@ -6,7 +6,9 @@ from typing import Literal
|
|
|
6
6
|
|
|
7
7
|
from pydantic import BaseModel, Field
|
|
8
8
|
|
|
9
|
+
from .colors import Color
|
|
9
10
|
from .http_methods import HttpMethod
|
|
11
|
+
from .icons import Icon
|
|
10
12
|
from .property import Property
|
|
11
13
|
|
|
12
14
|
|
|
@@ -16,6 +18,8 @@ class Form(BaseModel):
|
|
|
16
18
|
name: str
|
|
17
19
|
description: str | None
|
|
18
20
|
url: str
|
|
21
|
+
icon: Icon | None
|
|
22
|
+
color: Color | None
|
|
19
23
|
method: HttpMethod
|
|
20
24
|
is_hidden: bool
|
|
21
25
|
form: list[Property] | None = Field(None)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: 2026 OpenAdmin
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
4
|
+
|
|
5
|
+
from typing import Literal, NotRequired, TypedDict
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
from .colors import Color
|
|
10
|
+
from .http_methods import HttpMethod
|
|
11
|
+
from .icons import Icon
|
|
12
|
+
from .property import Property
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class MarkdownComponent(BaseModel):
|
|
16
|
+
type: Literal["markdown"]
|
|
17
|
+
id: str
|
|
18
|
+
name: str
|
|
19
|
+
description: str | None
|
|
20
|
+
color: Color | None
|
|
21
|
+
icon: Icon | None
|
|
22
|
+
url: str
|
|
23
|
+
method: HttpMethod
|
|
24
|
+
query: list[Property] | None = Field(None)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
type MarkdownContent = str
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class MarkdownResponse(TypedDict):
|
|
31
|
+
icon: NotRequired[Icon]
|
|
32
|
+
color: NotRequired[Color]
|
|
33
|
+
content: MarkdownContent
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
type Markdown = MarkdownContent | MarkdownResponse
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# SPDX-FileCopyrightText: 2026 OpenAdmin
|
|
2
|
-
#
|
|
3
|
-
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
4
|
-
|
|
5
|
-
from typing import Literal
|
|
6
|
-
|
|
7
|
-
from pydantic import BaseModel, Field
|
|
8
|
-
|
|
9
|
-
from .http_methods import HttpMethod
|
|
10
|
-
from .property import Property
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class Markdown(BaseModel):
|
|
14
|
-
type: Literal["markdown"]
|
|
15
|
-
id: str
|
|
16
|
-
name: str
|
|
17
|
-
description: str | None
|
|
18
|
-
url: str
|
|
19
|
-
method: HttpMethod
|
|
20
|
-
query: list[Property] | None = Field(None)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|