Skip to content

Commit 76a7790

Browse files
committed
init: timezone plugin example
Signed-off-by: Mayur Deshmukh <[email protected]>
0 parents  commit 76a7790

20 files changed

+19543
-0
lines changed

.editorconfig

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
root = true
2+
3+
[*]
4+
end_of_line = lf
5+
insert_final_newline = true
6+
7+
[*.{js,json,yml}]
8+
charset = utf-8
9+
indent_style = space
10+
indent_size = 2

.gitattributes

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
/.yarn/** linguist-vendored
2+
/.yarn/releases/* binary
3+
/.yarn/plugins/**/* binary
4+
/.pnp.* binary linguist-generated

.gitignore

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
.yarn/*
2+
!.yarn/patches
3+
!.yarn/plugins
4+
!.yarn/releases
5+
!.yarn/sdks
6+
!.yarn/versions
7+
8+
node_modules/
9+
dist/
10+
dist-scalprum/
11+
dist-types/
12+
dynamic-plugins-root/*
13+
!dynamic-plugins-root/.gitkeep
14+
15+
.env

.yarnrc.yml

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
nodeLinker: node-modules

README.md

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# devconf-2024-workshop
2+
3+
The workshop contents for the DevConf.cz 2024.
4+
5+
## How to use
6+
7+
Please switch to the `start-here` branch for the starting point.
8+
9+
You can refer the `main` branch for the final stage.
10+
11+
## Getting Started
12+
13+
You can refer the dynamic-plugins readme for reference:\
14+
https://github.com/janus-idp/backstage-showcase/blob/main/showcase-docs/dynamic-plugins.md
15+
16+
## Running on local environments
17+
18+
1. Install dependencies
19+
20+
```
21+
yarn install
22+
```
23+
24+
2. Generate types
25+
26+
```
27+
yarn tsc
28+
```
29+
30+
3. Build the plugin
31+
32+
```
33+
yarn workspace demo-timezone-plugin build
34+
```
35+
36+
4. Export the plugin as a dynamic plugin
37+
38+
```
39+
yarn workspace demo-timezone-plugin export-dynamic
40+
```
41+
42+
Now that the plugin has been exported, you can start the backstage instance with podman
43+
44+
```
45+
podman compose up -d rhdh
46+
```
47+
48+
## Contributors
49+
50+
- Mayur Deshmukh ([@deshmukhmayur](https://github.com/deshmukhmayur))
51+
- Rigin Oommen ([@riginoommen](https://github.com/riginoommen))
52+
- Yash Oswal ([@yashoswalyo](https://github.com/yashoswalyo))

app-config.yaml

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
app:
2+
title: Backstage Demo
3+
baseUrl: "http://localhost:7007/"
4+
5+
branding:
6+
fullLogo: "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI3LjMuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxvZ29zIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgOTMxLjggMjQ0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA5MzEuOCAyNDQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KCiAgICAgIDxwYXRoCiAgICAgICAgZmlsbD0iI2ZmZiIKICAgICAgICBkPSJNMjI4LjcgMjE5LjV2LTcyLjhoMjUuN2M1LjUgMCAxMC43LjkgMTUuNCAyLjggNC43IDEuOSA4LjggNC40IDEyLjIgNy43IDMuNCAzLjMgNiA3LjEgOCAxMS42IDEuOSA0LjUgMi45IDkuMyAyLjkgMTQuNHMtMSA5LjktMi45IDE0LjRjLTEuOSA0LjQtNC42IDguMy04IDExLjUtMy40IDMuMi03LjUgNS44LTEyLjIgNy42LTQuNyAxLjktOS44IDIuOC0xNS40IDIuOGgtMjUuN3ptMjUuOC02M2gtMTV2NTMuMmgxNWMzLjggMCA3LjQtLjcgMTAuNy0yIDMuMy0xLjQgNi4xLTMuMiA4LjUtNS42IDIuNC0yLjQgNC4zLTUuMiA1LjctOC40IDEuNC0zLjIgMi4xLTYuNyAyLjEtMTAuNXMtLjctNy4yLTIuMS0xMC41Yy0xLjQtMy4zLTMuMy02LjEtNS43LTguNS0yLjQtMi40LTUuMi00LjMtOC41LTUuNy0zLjMtMS4zLTYuOC0yLTEwLjctMnpNMzAwLjcgMTkzYzAtMy43LjctNy4zIDItMTAuNiAxLjQtMy4zIDMuMi02LjIgNS42LTguNyAyLjQtMi41IDUuMi00LjQgOC40LTUuOCAzLjItMS40IDYuNy0yLjEgMTAuNS0yLjEgMy42IDAgNyAuNyAxMC4xIDIuMSAzLjIgMS40IDUuOSAzLjQgOC4xIDUuOCAyLjMgMi41IDQgNS40IDUuNCA4LjggMS4zIDMuNCAyIDcgMiAxMC45djNIMzExYy43IDQuNCAyLjcgOCA2IDEwLjkgMy4zIDIuOSA3LjMgNC4zIDExLjkgNC4zIDIuNiAwIDUtLjQgNy40LTEuMiAyLjQtLjggNC40LTIgNi0zLjRsNi43IDYuNmMtMy4xIDIuNC02LjMgNC4yLTkuNiA1LjMtMy4zIDEuMS02LjkgMS43LTEwLjkgMS43LTMuOSAwLTcuNS0uNy0xMC45LTIuMS0zLjQtMS40LTYuMy0zLjMtOC44LTUuOC0yLjUtMi40LTQuNS01LjMtNS45LTguNy0xLjUtMy41LTIuMi03LjEtMi4yLTExem0yNi4zLTE4LjVjLTQgMC03LjUgMS4zLTEwLjQgNC0yLjkgMi42LTQuOCA2LTUuNSAxMC4yaDMxLjRjLS43LTQtMi41LTcuNC01LjQtMTAuMS0yLjktMi43LTYuMy00LjEtMTAuMS00LjF6TTM3Ny43IDIxOS41bC0yMi45LTUyLjloMTEuNGwxNi41IDM5LjYgMTYuNS0zOS42aDExLjFsLTIyLjkgNTIuOWgtOS43ek00MTIuNCAxOTNjMC0zLjcuNy03LjMgMi0xMC42IDEuNC0zLjMgMy4yLTYuMiA1LjYtOC43IDIuNC0yLjUgNS4yLTQuNCA4LjQtNS44IDMuMi0xLjQgNi43LTIuMSAxMC41LTIuMSAzLjYgMCA3IC43IDEwLjEgMi4xIDMuMiAxLjQgNS45IDMuNCA4LjEgNS44IDIuMyAyLjUgNCA1LjQgNS40IDguOCAxLjMgMy40IDIgNyAyIDEwLjl2M2gtNDEuOGMuNyA0LjQgMi43IDggNiAxMC45IDMuMyAyLjkgNy4zIDQuMyAxMS45IDQuMyAyLjYgMCA1LS40IDcuNC0xLjIgMi40LS44IDQuNC0yIDYtMy40bDYuNyA2LjZjLTMuMSAyLjQtNi4zIDQuMi05LjYgNS4zLTMuMyAxLjEtNi45IDEuNy0xMC45IDEuNy0zLjkgMC03LjUtLjctMTAuOS0yLjEtMy40LTEuNC02LjMtMy4zLTguOC01LjgtMi41LTIuNC00LjUtNS4zLTUuOS04LjctMS41LTMuNS0yLjItNy4xLTIuMi0xMXptMjYuMy0xOC41Yy00IDAtNy41IDEuMy0xMC40IDQtMi45IDIuNi00LjggNi01LjUgMTAuMmgzMS40Yy0uNy00LTIuNS03LjQtNS40LTEwLjEtMi45LTIuNy02LjMtNC4xLTEwLjEtNC4xek00ODQuNyAxNDQuNXY3NS4xaC0xMC40di03Mi44bDEwLjQtMi4zek00OTQuNSAxOTNjMC0zLjguNy03LjQgMi4xLTEwLjggMS40LTMuNCAzLjQtNi4zIDUuOS04LjcgMi41LTIuNSA1LjQtNC40IDguOC01LjggMy40LTEuNCA3LTIuMSAxMC44LTIuMSAzLjggMCA3LjQuNyAxMC44IDIuMSAzLjQgMS40IDYuMyAzLjQgOC43IDUuOCAyLjUgMi41IDQuNCA1LjQgNS44IDguNyAxLjQgMy40IDIuMSA3IDIuMSAxMC44IDAgMy45LS43IDcuNS0yLjEgMTAuOS0xLjQgMy40LTMuNCA2LjMtNS44IDguNy0yLjUgMi41LTUuNCA0LjQtOC43IDUuOC0zLjQgMS40LTcgMi4xLTEwLjggMi4xLTMuOCAwLTcuNC0uNy0xMC44LTIuMS0zLjQtMS40LTYuMy0zLjQtOC44LTUuOC0yLjUtMi41LTQuNS01LjQtNS45LTguNy0xLjQtMy40LTIuMS03LTIuMS0xMC45em00NC45IDBjMC01LjEtMS43LTkuNS01LjEtMTMtMy40LTMuNS03LjUtNS4zLTEyLjMtNS4zcy04LjkgMS44LTEyLjMgNS4zYy0zLjQgMy41LTUuMSA3LjktNS4xIDEzczEuNyA5LjUgNSAxMy4xYzMuNCAzLjYgNy41IDUuNCAxMi4zIDUuNCA0LjggMCA4LjktMS44IDEyLjMtNS40IDMuNS0zLjYgNS4yLTcuOSA1LjItMTMuMXpNNTU5LjMgMjQxLjF2LTc0LjVoMTAuM3Y1YzIuMi0xLjkgNC43LTMuMyA3LjUtNC4zczUuNy0xLjUgOC43LTEuNWMzLjcgMCA3LjIuNyAxMC41IDIuMSAzLjMgMS40IDYuMSAzLjQgOC41IDUuOCAyLjQgMi41IDQuMyA1LjQgNS43IDguNyAxLjQgMy4zIDIuMSA2LjkgMi4xIDEwLjYgMCAzLjgtLjcgNy40LTIuMSAxMC43LTEuNCAzLjMtMy4zIDYuMi01LjcgOC43LTIuNCAyLjUtNS4zIDQuNC04LjYgNS44LTMuMyAxLjQtNi45IDIuMS0xMC43IDIuMS0zIDAtNS44LS41LTguNS0xLjQtMi43LS45LTUuMS0yLjItNy4zLTMuOFYyNDFoLTEwLjR6bTI1LTY2LjNjLTMuMSAwLTUuOC42LTguMyAxLjctMi41IDEuMS00LjYgMi42LTYuMyA0LjZ2MjQuMWMxLjcgMS45IDMuOCAzLjQgNi4zIDQuNSAyLjYgMS4xIDUuMyAxLjcgOC4zIDEuNyA1LjEgMCA5LjQtMS44IDEyLjgtNS4zIDMuNC0zLjUgNS4xLTcuOCA1LjEtMTIuOSAwLTUuMi0xLjgtOS42LTUuMy0xMy4xLTMuMy0zLjUtNy42LTUuMy0xMi42LTUuM3pNNjIwIDE5M2MwLTMuNy43LTcuMyAyLTEwLjYgMS40LTMuMyAzLjItNi4yIDUuNi04LjcgMi40LTIuNSA1LjItNC40IDguNC01LjggMy4yLTEuNCA2LjctMi4xIDEwLjUtMi4xIDMuNiAwIDcgLjcgMTAuMSAyLjEgMy4yIDEuNCA1LjkgMy40IDguMSA1LjggMi4zIDIuNSA0IDUuNCA1LjQgOC44IDEuMyAzLjQgMiA3IDIgMTAuOXYzaC00MS44Yy43IDQuNCAyLjcgOCA2IDEwLjkgMy4zIDIuOSA3LjMgNC4zIDExLjkgNC4zIDIuNiAwIDUtLjQgNy40LTEuMiAyLjQtLjggNC40LTIgNi0zLjRsNi43IDYuNmMtMy4xIDIuNC02LjMgNC4yLTkuNiA1LjMtMy4zIDEuMS02LjkgMS43LTEwLjkgMS43LTMuOSAwLTcuNS0uNy0xMC45LTIuMS0zLjQtMS40LTYuMy0zLjMtOC44LTUuOC0yLjUtMi40LTQuNS01LjMtNS45LTguNy0xLjUtMy41LTIuMi03LjEtMi4yLTExem0yNi4zLTE4LjVjLTQgMC03LjUgMS4zLTEwLjQgNC0yLjkgMi42LTQuOCA2LTUuNSAxMC4yaDMxLjRjLS43LTQtMi41LTcuNC01LjQtMTAuMS0yLjktMi43LTYuMy00LjEtMTAuMS00LjF6TTY4MS45IDIxOS41di01Mi45aDEwLjR2Ni42YzEuNy0yLjYgMy45LTQuNiA2LjQtNS44IDIuNi0xLjIgNS4yLTEuOSA4LTEuOSAxLjIgMCAyLjIuMSAzLjEuMi45LjEgMS42LjMgMi4zLjZ2OS40Yy0uOC0uMy0xLjgtLjUtMi45LS44LTEuMS0uMi0yLjItLjQtMy4zLS40LTIuOCAwLTUuNC43LTcuOCAyLjItMi40IDEuNS00LjQgMy45LTUuOCA3LjN2MzUuNWgtMTAuNHpNNzQzLjcgMjE5LjV2LTcyLjhoMTAuOXYzMS4yaDM4Ljd2LTMxLjJoMTAuOXY3Mi44aC0xMC45di0zMS43aC0zOC43djMxLjdoLTEwLjl6TTgyOCAxNjYuNnYzMS41YzAgNC4xIDEuMiA3LjMgMy41IDkuOCAyLjQgMi40IDUuNiAzLjYgOS43IDMuNiAyLjggMCA1LjMtLjYgNy41LTEuOCAyLjItMS4yIDQuMS0yLjkgNS41LTUuMXYtMzguMWgxMC40djUyLjloLTEwLjR2LTUuM2MtMi4xIDIuMS00LjUgMy43LTcuMSA0LjctMi43IDEuMS01LjYgMS42LTguOCAxLjYtNiAwLTExLTEuOS0xNC44LTUuOC0zLjgtMy45LTUuOC04LjgtNS44LTE0Ljl2LTMzLjNIODI4ek05MjkuOSAxOTNjMCAzLjgtLjcgNy40LTIuMSAxMC43LTEuNCAzLjMtMy4zIDYuMi01LjcgOC43LTIuNCAyLjUtNS4zIDQuNC04LjYgNS44LTMuMyAxLjQtNi45IDIuMS0xMC43IDIuMS0zIDAtNS44LS41LTguNS0xLjRzLTUuMi0yLjItNy40LTR2NC41aC0xMC4zdi03Mi44bDEwLjQtMi4zdjI3YzIuMi0xLjkgNC43LTMuMyA3LjQtNC4zczUuNi0xLjUgOC43LTEuNWMzLjcgMCA3LjIuNyAxMC41IDIuMSAzLjMgMS40IDYuMSAzLjQgOC41IDUuOCAyLjQgMi41IDQuMyA1LjQgNS43IDguNyAxLjQgMy42IDIuMSA3LjIgMi4xIDEwLjl6bS0yOC4yLTE4LjJjLTMuMSAwLTUuOC42LTguMyAxLjctMi41IDEuMS00LjYgMi42LTYuMyA0LjZ2MjQuMWMxLjcgMS45IDMuOCAzLjQgNi4zIDQuNSAyLjYgMS4xIDUuMyAxLjcgOC4zIDEuNyA1LjEgMCA5LjQtMS44IDEyLjgtNS4zIDMuNC0zLjUgNS4xLTcuOCA1LjEtMTIuOSAwLTUuMi0xLjgtOS42LTUuMy0xMy4xLTMuMy0zLjUtNy42LTUuMy0xMi42LTUuM3oiCiAgICAgIC8+CiAgPGc+CiAgICAgICAgPHBhdGgKICAgICAgICAgIGQ9Ik0xMjkgODVjMTIuNSAwIDMwLjYtMi42IDMwLjYtMTcuNSAwLTEuMiAwLTIuMy0uMy0zLjRsLTcuNC0zMi40Yy0xLjctNy4xLTMuMi0xMC4zLTE1LjctMTYuNkMxMjYuNCAxMC4yIDEwNS4zIDIgOTkgMmMtNS44IDAtNy41IDcuNS0xNC40IDcuNS02LjcgMC0xMS42LTUuNi0xNy45LTUuNi02IDAtOS45IDQuMS0xMi45IDEyLjUgMCAwLTguNCAyMy43LTkuNSAyNy4yLS4zLjctLjMgMS40LS4zIDEuOUM0NCA1NC44IDgwLjMgODUgMTI5IDg1bTMyLjUtMTEuNGMxLjcgOC4yIDEuNyA5LjEgMS43IDEwLjEgMCAxNC0xNS43IDIxLjgtMzYuNCAyMS44LTQ2LjggMC04Ny43LTI3LjQtODcuNy00NS41IDAtMi44LjYtNS40IDEuNS03LjMtMTYuOC44LTM4LjYgMy44LTM4LjYgMjNDMiAxMDcuMiA3Ni42IDE0NiAxMzUuNyAxNDZjNDUuMyAwIDU2LjctMjAuNSA1Ni43LTM2LjYtLjEtMTIuOC0xMS0yNy4yLTMwLjktMzUuOCIKICAgICAgICAgIGZpbGw9IiNlMDAiCiAgICAgICAgLz4KICAgIDxwYXRoIGQ9Ik0xNjEuNSA3My42YzEuNyA4LjIgMS43IDkuMSAxLjcgMTAuMSAwIDE0LTE1LjcgMjEuOC0zNi40IDIxLjgtNDYuOCAwLTg3LjctMjcuNC04Ny43LTQ1LjUgMC0yLjguNi01LjQgMS41LTcuM2wzLjctOS4xYy0uMy43LS4zIDEuNC0uMyAxLjlDNDQgNTQuOCA4MC4zIDg1IDEyOSA4NWMxMi41IDAgMzAuNi0yLjYgMzAuNi0xNy41IDAtMS4yIDAtMi4zLS4zLTMuNGwyLjIgOS41eiIgLz4KICAgIDxwYXRoCiAgICAgIGZpbGw9IiNmZmYiCiAgICAgIGQ9Ik01ODEuMiA5NC4zYzAgMTEuOSA3LjIgMTcuNyAyMC4yIDE3LjcgMy4yIDAgOC42LS43IDExLjktMS43Vjk2LjVjLTIuOC44LTQuOSAxLjItNy43IDEuMi01LjQgMC03LjQtMS43LTcuNC02LjdWNjkuOGgxNS42VjU1LjZoLTE1LjZ2LTE4bC0xNyAzLjd2MTQuM0g1NzB2MTQuMmgxMS4zdjI0LjV6bS01Mi45LjNjMC0zLjcgMy43LTUuNSA5LjMtNS41IDMuNyAwIDcgLjUgMTAuMSAxLjN2Ny4yYy0zLjIgMS44LTYuOCAyLjYtMTAuNiAyLjYtNS41IDAtOC44LTIuMS04LjgtNS42bTUuMiAxNy42YzYgMCAxMC44LTEuMyAxNS40LTQuM3YzLjRoMTYuOFY3NS42YzAtMTMuNi05LjEtMjEtMjQuNC0yMS04LjUgMC0xNi45IDItMjYgNi4xbDYuMSAxMi41YzYuNS0yLjcgMTItNC40IDE2LjgtNC40IDcgMCAxMC42IDIuNyAxMC42IDguM3YyLjdjLTQtMS4xLTguMi0xLjYtMTIuNi0xLjYtMTQuMyAwLTIyLjkgNi0yMi45IDE2LjcgMCA5LjggNy44IDE3LjMgMjAuMiAxNy4zbS05Mi40LTFoMTguMVY4Mi40aDMwLjN2MjguOGgxOC4xVjM3LjZoLTE4LjF2MjguM2gtMzAuM1YzNy42aC0xOC4xdjczLjZ6bS02OS0yNy44YzAtOCA2LjMtMTQuMSAxNC42LTE0LjEgNC42IDAgOC44IDEuNiAxMS44IDQuM1Y5M2MtMyAyLjktNyA0LjQtMTEuOCA0LjQtOC4yLjEtMTQuNi02LTE0LjYtMTRtMjYuNiAyNy44aDE2LjhWMzMuOWwtMTcgMy43djIwLjljLTQuMi0yLjQtOS0zLjctMTQuMi0zLjctMTYuMiAwLTI4LjkgMTIuNS0yOC45IDI4LjVzMTIuNSAyOC42IDI4LjQgMjguNmM1LjUgMCAxMC42LTEuNyAxNC45LTQuOHY0LjF6bS03Ny4yLTQyLjdjNS40IDAgOS45IDMuNSAxMS43IDguOEgzMTBjMS43LTUuNSA1LjktOC44IDExLjUtOC44bS0yOC43IDE1YzAgMTYuMiAxMy4zIDI4LjggMzAuMyAyOC44IDkuNCAwIDE2LjItMi41IDIzLjItOC40bC0xMS4zLTEwYy0yLjYgMi43LTYuNSA0LjItMTEuMSA0LjItNi4zIDAtMTEuNS0zLjUtMTMuNy04LjhoMzkuNlY4NWMwLTE3LjctMTEuOS0zMC40LTI4LjEtMzAuNC0xNi4xLjEtMjguOSAxMi43LTI4LjkgMjguOW0tMjkuMy0zMC40YzYgMCA5LjQgMy44IDkuNCA4LjNzLTMuNCA4LjMtOS40IDguM2gtMTcuOVY1My4xaDE3Ljl6bS0zNiA1OC4xaDE4LjFWODQuNGgxMy44bDEzLjkgMjYuOGgyMC4ybC0xNi4yLTI5LjRjOC43LTMuOCAxMy45LTExLjcgMTMuOS0yMC43IDAtMTMuMy0xMC40LTIzLjUtMjYtMjMuNWgtMzcuN3Y3My42eiIKICAgIC8+CiAgICAgIDwvZz4KPC9zdmc+Cg=="
7+
iconLogo: "data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxOTIgMTQ1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6I2UwMDt9PC9zdHlsZT48L2RlZnM+PHRpdGxlPlJlZEhhdC1Mb2dvLUhhdC1Db2xvcjwvdGl0bGU+PHBhdGggZD0iTTE1Ny43Nyw2Mi42MWExNCwxNCwwLDAsMSwuMzEsMy40MmMwLDE0Ljg4LTE4LjEsMTcuNDYtMzAuNjEsMTcuNDZDNzguODMsODMuNDksNDIuNTMsNTMuMjYsNDIuNTMsNDRhNi40Myw2LjQzLDAsMCwxLC4yMi0xLjk0bC0zLjY2LDkuMDZhMTguNDUsMTguNDUsMCwwLDAtMS41MSw3LjMzYzAsMTguMTEsNDEsNDUuNDgsODcuNzQsNDUuNDgsMjAuNjksMCwzNi40My03Ljc2LDM2LjQzLTIxLjc3LDAtMS4wOCwwLTEuOTQtMS43My0xMC4xM1oiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMjcuNDcsODMuNDljMTIuNTEsMCwzMC42MS0yLjU4LDMwLjYxLTE3LjQ2YTE0LDE0LDAsMCwwLS4zMS0zLjQybC03LjQ1LTMyLjM2Yy0xLjcyLTcuMTItMy4yMy0xMC4zNS0xNS43My0xNi42QzEyNC44OSw4LjY5LDEwMy43Ni41LDk3LjUxLjUsOTEuNjkuNSw5MCw4LDgzLjA2LDhjLTYuNjgsMC0xMS42NC01LjYtMTcuODktNS42LTYsMC05LjkxLDQuMDktMTIuOTMsMTIuNSwwLDAtOC40MSwyMy43Mi05LjQ5LDI3LjE2QTYuNDMsNi40MywwLDAsMCw0Mi41Myw0NGMwLDkuMjIsMzYuMywzOS40NSw4NC45NCwzOS40NU0xNjAsNzIuMDdjMS43Myw4LjE5LDEuNzMsOS4wNSwxLjczLDEwLjEzLDAsMTQtMTUuNzQsMjEuNzctMzYuNDMsMjEuNzdDNzguNTQsMTA0LDM3LjU4LDc2LjYsMzcuNTgsNTguNDlhMTguNDUsMTguNDUsMCwwLDEsMS41MS03LjMzQzIyLjI3LDUyLC41LDU1LC41LDc0LjIyYzAsMzEuNDgsNzQuNTksNzAuMjgsMTMzLjY1LDcwLjI4LDQ1LjI4LDAsNTYuNy0yMC40OCw1Ni43LTM2LjY1LDAtMTIuNzItMTEtMjcuMTYtMzAuODMtMzUuNzgiLz48L3N2Zz4="
8+
theme:
9+
light:
10+
primaryColor: ${PRIMARY_LIGHT_COLOR}
11+
headerColor1: '#be0000'
12+
headerColor2: '#f56d6d'
13+
navigationIndicatorColor: '#be0000'
14+
dark:
15+
primaryColor: ${PRIMARY_DARK_COLOR}
16+
headerColor1: '#be0000'
17+
headerColor2: '#f56d6d'
18+
navigationIndicatorColor: '#be0000'
19+
20+
backend:
21+
baseUrl: http://localhost:7007/
22+
listen:
23+
port: 7007
24+
25+
auth:
26+
keys:
27+
- secret: 'demobackstagesecret'
28+
29+
catalog:
30+
locations:
31+
# Local example data, file locations are relative to the backend process, typically `packages/backend`
32+
- type: file
33+
target: ./catalog-info.example.yaml

catalog-info.example.yaml

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
apiVersion: backstage.io/v1alpha1
2+
kind: Component
3+
metadata:
4+
name: rhdh
5+
title: Red Hat Developer Hub
6+
description: |
7+
An enterprise-grade, open developer platform for building developer portals, containing a supported and opinionated framework.
8+
links:
9+
- title: Website
10+
url: http://developer.redhat.com/rhdh
11+
- title: Documentation
12+
url: https://backstage.io/docs
13+
- title: Learning Path
14+
url: https://developers.redhat.com/learn/openshift/install-and-configure-red-hat-developer-hub-and-explore-templating-basics
15+
annotations:
16+
demo/timezone: Asia/Kolkata
17+
spec:
18+
type: website
19+
owner: user:default/guest
20+
lifecycle: production

docker-compose.yaml

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
services:
2+
rhdh:
3+
image: quay.io/janus-idp/backstage-showcase:latest
4+
volumes:
5+
- ./dynamic-plugins-root:/opt/app-root/src/dynamic-plugins-root:z
6+
- ./app-config.yaml:/opt/app-root/src/app-config.example.production.yaml:z
7+
- ./catalog-info.example.yaml:/opt/app-root/src/catalog-info.example.yaml:z
8+
ports:
9+
- 7007:7007
10+
environment:
11+
- POSTGRES_HOST=postgres
12+
- POSTGRES_PORT=5432

dynamic-plugins-root/.gitkeep

Whitespace-only changes.

dynamic-plugins.default.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
dynamicPlugins:
2+
frontend:

package.json

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"name": "devconf-2024-workshop",
3+
"private": true,
4+
"engines": {
5+
"node": ">=20.12.2"
6+
},
7+
"scripts": {
8+
"tsc": "tsc"
9+
},
10+
"workspaces": {
11+
"packages": [
12+
"plugins/*"
13+
]
14+
},
15+
"dependencies": {
16+
"@backstage/cli": "^0.26.6"
17+
},
18+
"devDependencies": {
19+
"@testing-library/react": "^16.0.0",
20+
"react": "^18.3.1",
21+
"react-dom": "^18.3.1",
22+
"react-router-dom": "^6.23.1",
23+
"typescript": "^5.4.5"
24+
},
25+
"packageManager": "[email protected]"
26+
}

plugins/demo-timezone/dev/index.tsx

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import React from "react";
2+
import { createDevApp } from "@backstage/dev-utils";
3+
import { demoTimezonePlugin, Clock } from "../src/plugin";
4+
import { EntityProvider } from "@backstage/plugin-catalog-react";
5+
import Grid from "@mui/material/Grid";
6+
7+
const mockEntity = {
8+
apiVersion: 'backstage.io/v1alpha1',
9+
kind: 'Component',
10+
metadata: {
11+
name: 'Example Application',
12+
annotations: {
13+
'demo/timezone': 'Asia/Kolkata'
14+
}
15+
},
16+
spec: {
17+
type: 'service',
18+
owner: 'user:default/guest'
19+
}
20+
}
21+
22+
createDevApp()
23+
.registerPlugin(demoTimezonePlugin)
24+
.addPage({
25+
title: "Demo Timezone Test",
26+
path: "/demo",
27+
element: (
28+
<EntityProvider entity={mockEntity}>
29+
<Grid item md={6}>
30+
<Clock />
31+
</Grid>
32+
</EntityProvider>
33+
),
34+
})
35+
.render();

plugins/demo-timezone/package.json

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{
2+
"name": "demo-timezone-plugin",
3+
"version": "1.0.0",
4+
"description": "",
5+
"main": "index.js",
6+
"backstage": {
7+
"role": "frontend-plugin"
8+
},
9+
"scripts": {
10+
"start": "backstage-cli package start",
11+
"build": "backstage-cli package build"
12+
},
13+
"keywords": [],
14+
"author": "",
15+
"license": "ISC",
16+
"dependencies": {
17+
"@backstage/catalog-model": "^1.5.0",
18+
"@backstage/cli": "^0.26.6",
19+
"@backstage/core-components": "^0.14.7",
20+
"@backstage/core-plugin-api": "^1.9.2",
21+
"@backstage/plugin-catalog-react": "^1.12.0",
22+
"@backstage/theme": "^0.5.5",
23+
"@mui/material": "^5.15.20",
24+
"dayjs": "^1.11.11"
25+
},
26+
"peerDependencies": {
27+
"react": "^16.13.1 || ^17.0.0 || ^18.0.0"
28+
},
29+
"devDependencies": {
30+
"@backstage/dev-utils": "^1.0.32"
31+
},
32+
"files": [
33+
"dist"
34+
]
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import React from 'react';
2+
import { useEntity } from '@backstage/plugin-catalog-react';
3+
import dayjs from 'dayjs';
4+
import utc from 'dayjs/plugin/utc';
5+
import timezone from 'dayjs/plugin/timezone';
6+
import { getTimezone } from '../utils';
7+
import { Card, CardContent, Typography } from '@mui/material';
8+
dayjs.extend(utc);
9+
dayjs.extend(timezone);
10+
11+
export function Clock() {
12+
const { entity } = useEntity();
13+
const timezone = getTimezone(entity);
14+
15+
const time = dayjs();
16+
const formattedTime = time.tz(timezone ?? undefined).format('hh:mm:ss a Z');
17+
18+
return (
19+
<Card>
20+
<CardContent>
21+
<Typography>
22+
Time in {timezone}:
23+
</Typography>
24+
<Typography variant='h6'>
25+
{formattedTime}
26+
</Typography>
27+
</CardContent>
28+
</Card>
29+
);
30+
}

plugins/demo-timezone/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { demoTimezonePlugin, Clock } from './plugin';

plugins/demo-timezone/src/plugin.ts

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import {
2+
createPlugin,
3+
createRoutableExtension,
4+
} from "@backstage/core-plugin-api";
5+
import { rootRouteRef } from "./routes";
6+
7+
export const demoTimezonePlugin = createPlugin({
8+
id: "demo-timezone",
9+
routes: {
10+
root: rootRouteRef,
11+
},
12+
});
13+
14+
export const Clock = demoTimezonePlugin.provide(
15+
createRoutableExtension({
16+
name: "Clock",
17+
component: () => import("./components/Clock").then((m) => m.Clock),
18+
mountPoint: rootRouteRef,
19+
})
20+
);

plugins/demo-timezone/src/routes.ts

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { createRouteRef } from "@backstage/core-plugin-api";
2+
3+
export const rootRouteRef = createRouteRef({
4+
id: 'demo-timezone',
5+
});

plugins/demo-timezone/src/utils.ts

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { Entity } from "@backstage/catalog-model";
2+
3+
export function getTimezone(entity: Entity) {
4+
return entity.metadata.annotations?.['demo/timezone'];
5+
}

tsconfig.json

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"extends": "@backstage/cli/config/tsconfig.json",
3+
"include": [
4+
"plugins/*/src"
5+
],
6+
"exclude": ["node_modules"],
7+
"compilerOptions": {
8+
"outDir": "dist-types",
9+
"rootDir": ".",
10+
"jsx": "react",
11+
"skipLibCheck": true
12+
}
13+
}

0 commit comments

Comments
 (0)