@backstage/plugin-home 0.4.3 → 0.4.7
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/CHANGELOG.md +83 -0
- package/dist/esm/{index-07e28acc.esm.js → index-05c74847.esm.js} +2 -2
- package/dist/esm/{index-07e28acc.esm.js.map → index-05c74847.esm.js.map} +1 -1
- package/dist/esm/index-20e36a68.esm.js +618 -0
- package/dist/esm/index-20e36a68.esm.js.map +1 -0
- package/dist/esm/{index-1baf251a.esm.js → index-22929ade.esm.js} +4 -4
- package/dist/esm/{index-1baf251a.esm.js.map → index-22929ade.esm.js.map} +1 -1
- package/dist/esm/{index-3d2a96f8.esm.js → index-8ff3197b.esm.js} +4 -3
- package/dist/esm/{index-3d2a96f8.esm.js.map → index-8ff3197b.esm.js.map} +1 -1
- package/dist/index.d.ts +17 -2
- package/dist/index.esm.js +76 -14
- package/dist/index.esm.js.map +1 -1
- package/package.json +14 -13
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,88 @@
|
|
|
1
1
|
# @backstage/plugin-home
|
|
2
2
|
|
|
3
|
+
## 0.4.7
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- cd450844f6: Moved React dependencies to `peerDependencies` and allow both React v16 and v17 to be used.
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @backstage/core-components@0.8.0
|
|
10
|
+
- @backstage/core-plugin-api@0.3.0
|
|
11
|
+
|
|
12
|
+
## 0.4.6
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- a125278b81: Refactor out the deprecated path and icon from RouteRefs
|
|
17
|
+
- Updated dependencies
|
|
18
|
+
- @backstage/core-components@0.7.4
|
|
19
|
+
- @backstage/core-plugin-api@0.2.0
|
|
20
|
+
|
|
21
|
+
## 0.4.5
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- 4a336fd292: Add name option to `createCardExtension` to remove deprecation warnings for extensions without name. Name will be required for extensions in a future release of `core-plugin-api` and therefore also in `createCardExtension`.
|
|
26
|
+
- Updated dependencies
|
|
27
|
+
- @backstage/core-components@0.7.3
|
|
28
|
+
- @backstage/theme@0.2.13
|
|
29
|
+
- @backstage/core-plugin-api@0.1.13
|
|
30
|
+
|
|
31
|
+
## 0.4.4
|
|
32
|
+
|
|
33
|
+
### Patch Changes
|
|
34
|
+
|
|
35
|
+
- ef5bf4235a: Adds a `<WelcomeTitle>` component that shows a playful greeting on the home page.
|
|
36
|
+
To use it, pass it to the home page header:
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
<Page themeId="home">
|
|
40
|
+
<Header title={<WelcomeTitle />} pageTitleOverride="Home">
|
|
41
|
+
<HomepageTimer />
|
|
42
|
+
</Header>
|
|
43
|
+
…
|
|
44
|
+
</Page>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
- 87b2d5ad88: Fix `<ComponentTabs>` to display only the selected tab, not the other way around.
|
|
48
|
+
- 2435d7a49b: Added HeaderWorldClock to the Home plugin which is a copy of the HomepageTimer from core-components that has been updated to use props over static config from app-config.yaml. To use HeaderWorldClock you'll need to create an array of ClockConfig like this:
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
const clockConfigs: ClockConfig[] = [
|
|
52
|
+
{
|
|
53
|
+
label: 'NYC',
|
|
54
|
+
timeZone: 'America/New_York',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
label: 'UTC',
|
|
58
|
+
timeZone: 'UTC',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
label: 'STO',
|
|
62
|
+
timeZone: 'Europe/Stockholm',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
label: 'TYO',
|
|
66
|
+
timeZone: 'Asia/Tokyo',
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Then you can pass `clockConfigs` into the HeaderWorldClock like this:
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
<Page themeId="home">
|
|
75
|
+
<Header title="Home">
|
|
76
|
+
<HeaderWorldClock clockConfigs={clockConfigs} />
|
|
77
|
+
</Header>
|
|
78
|
+
<Content>...</Content>
|
|
79
|
+
</Page>
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
- Updated dependencies
|
|
83
|
+
- @backstage/core-components@0.7.0
|
|
84
|
+
- @backstage/theme@0.2.11
|
|
85
|
+
|
|
3
86
|
## 0.4.3
|
|
4
87
|
|
|
5
88
|
### Patch Changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { useOutlet } from 'react-router';
|
|
3
|
-
export { SettingsModal } from '../index.esm.js';
|
|
3
|
+
export { HeaderWorldClock, SettingsModal } from '../index.esm.js';
|
|
4
4
|
import '@backstage/core-plugin-api';
|
|
5
5
|
import '@material-ui/core';
|
|
6
6
|
import '@material-ui/icons/Settings';
|
|
@@ -14,4 +14,4 @@ const HomepageCompositionRoot = (props) => {
|
|
|
14
14
|
};
|
|
15
15
|
|
|
16
16
|
export { HomepageCompositionRoot };
|
|
17
|
-
//# sourceMappingURL=index-
|
|
17
|
+
//# sourceMappingURL=index-05c74847.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-05c74847.esm.js","sources":["../../src/components/HomepageCompositionRoot.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { ReactNode } from 'react';\nimport { useOutlet } from 'react-router';\n\nexport const HomepageCompositionRoot = (props: {\n title?: string;\n children?: ReactNode;\n}) => {\n const outlet = useOutlet();\n const children = props.children ?? outlet;\n return <>{children}</>;\n};\n"],"names":[],"mappings":";;;;;;;;MAmBa,0BAA0B,CAAC,UAGlC;AAtBN;AAuBE,QAAM,SAAS;AACf,QAAM,WAAW,YAAM,aAAN,YAAkB;AACnC,mEAAU;AAAA;;;;"}
|
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
import { useApi, identityApiRef } from '@backstage/core-plugin-api';
|
|
2
|
+
import { Tooltip } from '@material-ui/core';
|
|
3
|
+
import React, { useMemo } from 'react';
|
|
4
|
+
|
|
5
|
+
var English$2 = "Good morning";
|
|
6
|
+
var Afrikaans$2 = "Goeiemôre, Môre";
|
|
7
|
+
var Albanian$2 = "Mirëmëngjes";
|
|
8
|
+
var Arabic$2 = "صباح الخير";
|
|
9
|
+
var Armenian$2 = "Paree looys";
|
|
10
|
+
var Australian$2 = "G'day";
|
|
11
|
+
var Azerbaijani$2 = "Sabahınız xeyir";
|
|
12
|
+
var Bengali$2 = "shuprobhat";
|
|
13
|
+
var Bulgarian$2 = "Dobro utro";
|
|
14
|
+
var Catalan$1 = "Bon dia";
|
|
15
|
+
var Chinese$2 = "早安";
|
|
16
|
+
var Croatian$2 = "Dobro jutro";
|
|
17
|
+
var Czech$2 = "Dobré ráno";
|
|
18
|
+
var Danish$2 = "God morgen";
|
|
19
|
+
var Dutch$2 = "Goedemorgen";
|
|
20
|
+
var Esperanto$1 = "Bonan matenon";
|
|
21
|
+
var Estonian$2 = "Tere hommikust";
|
|
22
|
+
var Finnish$2 = "Hyvää huomenta";
|
|
23
|
+
var French$2 = "Bonjour";
|
|
24
|
+
var German$2 = "Guten Morgen";
|
|
25
|
+
var Greek$2 = "Kaliméra";
|
|
26
|
+
var Kalaallisut = "Iterluarit";
|
|
27
|
+
var Hawaiian$1 = "Aloha kakahiaka";
|
|
28
|
+
var Hebrew$2 = "boker tov";
|
|
29
|
+
var Hindi$1 = "Namaste";
|
|
30
|
+
var Hungarian$1 = "Jó reggelt";
|
|
31
|
+
var Indonesian$2 = "Selamat pagi";
|
|
32
|
+
var Irish = "Dia dhuit";
|
|
33
|
+
var Italian$2 = "Buongiorno";
|
|
34
|
+
var Japanese$2 = "おはよう";
|
|
35
|
+
var Korean$1 = "안녕하세요";
|
|
36
|
+
var Kazakh$2 = "Kayırlı tan";
|
|
37
|
+
var Kurdish$2 = "Beyanî baş";
|
|
38
|
+
var Lithuanian$2 = "Labas rytas";
|
|
39
|
+
var Macedonian$2 = "Добро утро";
|
|
40
|
+
var Malay$1 = "Selamat pagi";
|
|
41
|
+
var Maltese$2 = "Bonġu";
|
|
42
|
+
var Nepali$1 = "subha prabhat";
|
|
43
|
+
var Norwegian$1 = "God morgen";
|
|
44
|
+
var Odia$2 = "ସୁପ୍ରଭାତ";
|
|
45
|
+
var Polish$2 = "Dzień dobry";
|
|
46
|
+
var Portuguese$2 = "Bom dia";
|
|
47
|
+
var Romanian$2 = "Bună dimineaţa";
|
|
48
|
+
var Russian$2 = "Доброе утро";
|
|
49
|
+
var Serbian$2 = "Добро јутро";
|
|
50
|
+
var Spanish$1 = "Buenos días";
|
|
51
|
+
var Sumerian$2 = "𒄭𒌓";
|
|
52
|
+
var Swahili$1 = "Habari ya asubuhi";
|
|
53
|
+
var Swedish$2 = "God morgon";
|
|
54
|
+
var Tagalog$2 = "Magandang umaga po";
|
|
55
|
+
var Taiwanese = "爻早";
|
|
56
|
+
var Tatar$2 = "Xäyerle irtä";
|
|
57
|
+
var Telugu$2 = "శుభోదయం";
|
|
58
|
+
var Thai$2 = "สวัสดีครับ";
|
|
59
|
+
var Turkish$2 = "Günaydın";
|
|
60
|
+
var Ukrainian$2 = "Доброго ранку";
|
|
61
|
+
var Urdu$1 = "صبح بخير";
|
|
62
|
+
var Uzbek$2 = "Xayrli tong";
|
|
63
|
+
var Vietnamese$1 = "Chào buổi sáng";
|
|
64
|
+
var Welsh$2 = "Bore da";
|
|
65
|
+
var Latvian$2 = "Labrīt";
|
|
66
|
+
var Valyrian$1 = "Sȳz ñāqes";
|
|
67
|
+
var goodMorning = {
|
|
68
|
+
English: English$2,
|
|
69
|
+
Afrikaans: Afrikaans$2,
|
|
70
|
+
Albanian: Albanian$2,
|
|
71
|
+
Arabic: Arabic$2,
|
|
72
|
+
Armenian: Armenian$2,
|
|
73
|
+
Australian: Australian$2,
|
|
74
|
+
Azerbaijani: Azerbaijani$2,
|
|
75
|
+
Bengali: Bengali$2,
|
|
76
|
+
Bulgarian: Bulgarian$2,
|
|
77
|
+
Catalan: Catalan$1,
|
|
78
|
+
Chinese: Chinese$2,
|
|
79
|
+
Croatian: Croatian$2,
|
|
80
|
+
Czech: Czech$2,
|
|
81
|
+
Danish: Danish$2,
|
|
82
|
+
Dutch: Dutch$2,
|
|
83
|
+
Esperanto: Esperanto$1,
|
|
84
|
+
Estonian: Estonian$2,
|
|
85
|
+
Finnish: Finnish$2,
|
|
86
|
+
French: French$2,
|
|
87
|
+
German: German$2,
|
|
88
|
+
Greek: Greek$2,
|
|
89
|
+
Kalaallisut: Kalaallisut,
|
|
90
|
+
Hawaiian: Hawaiian$1,
|
|
91
|
+
Hebrew: Hebrew$2,
|
|
92
|
+
Hindi: Hindi$1,
|
|
93
|
+
Hungarian: Hungarian$1,
|
|
94
|
+
Indonesian: Indonesian$2,
|
|
95
|
+
Irish: Irish,
|
|
96
|
+
Italian: Italian$2,
|
|
97
|
+
Japanese: Japanese$2,
|
|
98
|
+
Korean: Korean$1,
|
|
99
|
+
Kazakh: Kazakh$2,
|
|
100
|
+
Kurdish: Kurdish$2,
|
|
101
|
+
Lithuanian: Lithuanian$2,
|
|
102
|
+
"Low German": "Moin",
|
|
103
|
+
Macedonian: Macedonian$2,
|
|
104
|
+
Malay: Malay$1,
|
|
105
|
+
Maltese: Maltese$2,
|
|
106
|
+
"Middle Egyptian Hieroglyphs": "𓄤 𓃀 𓂓 𓇳𓐅",
|
|
107
|
+
Nepali: Nepali$1,
|
|
108
|
+
Norwegian: Norwegian$1,
|
|
109
|
+
Odia: Odia$2,
|
|
110
|
+
Polish: Polish$2,
|
|
111
|
+
Portuguese: Portuguese$2,
|
|
112
|
+
Romanian: Romanian$2,
|
|
113
|
+
Russian: Russian$2,
|
|
114
|
+
Serbian: Serbian$2,
|
|
115
|
+
Spanish: Spanish$1,
|
|
116
|
+
Sumerian: Sumerian$2,
|
|
117
|
+
Swahili: Swahili$1,
|
|
118
|
+
Swedish: Swedish$2,
|
|
119
|
+
Tagalog: Tagalog$2,
|
|
120
|
+
Taiwanese: Taiwanese,
|
|
121
|
+
Tatar: Tatar$2,
|
|
122
|
+
Telugu: Telugu$2,
|
|
123
|
+
Thai: Thai$2,
|
|
124
|
+
Turkish: Turkish$2,
|
|
125
|
+
Ukrainian: Ukrainian$2,
|
|
126
|
+
Urdu: Urdu$1,
|
|
127
|
+
Uzbek: Uzbek$2,
|
|
128
|
+
Vietnamese: Vietnamese$1,
|
|
129
|
+
Welsh: Welsh$2,
|
|
130
|
+
Latvian: Latvian$2,
|
|
131
|
+
Valyrian: Valyrian$1
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
var English$1 = "Good afternoon";
|
|
135
|
+
var Abkhaz = "Уа, мшы бзиа";
|
|
136
|
+
var Adyghe = "Уимафэ шІу";
|
|
137
|
+
var Afrikaans$1 = "Goeie middag";
|
|
138
|
+
var Albanian$1 = "Mirëdita";
|
|
139
|
+
var Aleut = "Angaliichxizax̂";
|
|
140
|
+
var Aklan = "Mayad nga hapon";
|
|
141
|
+
var Alsatian = "Güete Nàchmittag";
|
|
142
|
+
var Arabic$1 = "مساء الخير";
|
|
143
|
+
var Armenian$1 = "Բարի կէսօր:";
|
|
144
|
+
var Assamese = "শুভ আবেলি";
|
|
145
|
+
var Asturian$1 = "Bones tardes";
|
|
146
|
+
var Australian$1 = "G'day";
|
|
147
|
+
var Azerbaijani$1 = "Günortanız xeyir";
|
|
148
|
+
var Bashkir = "хәйерле көн";
|
|
149
|
+
var Basque$1 = "Arratsalde on";
|
|
150
|
+
var Bavarian = "Guadn åmd";
|
|
151
|
+
var Bengali$1 = "শুভ বিকাল";
|
|
152
|
+
var Bhojpuri = "राम राम";
|
|
153
|
+
var Bosnian = "Dobar dan";
|
|
154
|
+
var Breton$1 = "Demat";
|
|
155
|
+
var Bulgarian$1 = "Добър ден";
|
|
156
|
+
var Cebuano = "Maayong Hapon";
|
|
157
|
+
var Chamorro$1 = "Buenas tåtdes";
|
|
158
|
+
var Chinese$1 = "午安";
|
|
159
|
+
var Cornish$1 = "Dohajydh da";
|
|
160
|
+
var Corsican = "Bonghjornu";
|
|
161
|
+
var Croatian$1 = "Dobar dan";
|
|
162
|
+
var Cuyonon = "Mayad nga apon";
|
|
163
|
+
var Czech$1 = "Dobré odpoledne";
|
|
164
|
+
var Danish$1 = "God eftermiddag";
|
|
165
|
+
var Dutch$1 = "Goedemiddag";
|
|
166
|
+
var Estonian$1 = "Tere päevast";
|
|
167
|
+
var Ewe = "Ŋdɔ";
|
|
168
|
+
var Faroese$1 = "Góðan dagin";
|
|
169
|
+
var Fijian$1 = "Bula";
|
|
170
|
+
var Finnish$1 = "Hyvää päivää";
|
|
171
|
+
var Flemish = "Ghoeie middagh";
|
|
172
|
+
var French$1 = "Bon après-midi";
|
|
173
|
+
var Friulian = "Bundì";
|
|
174
|
+
var Galician$1 = "Boa tarde";
|
|
175
|
+
var Georgian$1 = "დილა მშვიდობისა";
|
|
176
|
+
var German$1 = "Guten Tag";
|
|
177
|
+
var Greek$1 = "Καλό απόγευμα";
|
|
178
|
+
var Greenlandic = "Inuugujaq";
|
|
179
|
+
var Hausa = "Barka da yamma";
|
|
180
|
+
var Hawaiian = "Aloha ʻauinalā";
|
|
181
|
+
var Hebrew$1 = "אחר צהריים טובים";
|
|
182
|
+
var Hindi = "नमस्कार";
|
|
183
|
+
var Icelandic$1 = "Góðan dag";
|
|
184
|
+
var Iloko = "Naimbag a malem";
|
|
185
|
+
var Indonesian$1 = "Selamat sore";
|
|
186
|
+
var Gaelic = "Tráthnóna maith duit";
|
|
187
|
+
var Italian$1 = "Buongiorno";
|
|
188
|
+
var Japanese$1 = "こんにちは";
|
|
189
|
+
var Javanese = "Sugeng siang";
|
|
190
|
+
var Kannada = "ಶುಭ ಮಧ್ಯಾಹ್ನ";
|
|
191
|
+
var Kazakh$1 = "Kayırlı kun";
|
|
192
|
+
var Khmer = "ទិវាសួស្ដី";
|
|
193
|
+
var Korean = "안녕하세요";
|
|
194
|
+
var Kurdish$1 = "Rojbash";
|
|
195
|
+
var Kyrgyz = "Кутмандуу күнүңүз менен";
|
|
196
|
+
var Latvian$1 = "Labdien";
|
|
197
|
+
var Limburgish = "Gojemiddig";
|
|
198
|
+
var Lithuanian$1 = "Laba diena";
|
|
199
|
+
var Lozi = "Ki musihali";
|
|
200
|
+
var Luxembourgish$1 = "Gudde Mëtteg";
|
|
201
|
+
var Macedonian$1 = "Добар ден";
|
|
202
|
+
var Malagasy = "Manao ahoana e";
|
|
203
|
+
var Maltese$1 = "Wara nofsinhar it-tajjeb";
|
|
204
|
+
var Mam = "Qa’lte";
|
|
205
|
+
var Manx = "Fastyr mie";
|
|
206
|
+
var Nepali = "नमस्कार";
|
|
207
|
+
var Newari = "भिं न्हि";
|
|
208
|
+
var Norwegian = "God ettermiddag";
|
|
209
|
+
var Occitan = "Bon vèspre";
|
|
210
|
+
var Odia$1 = "ସୁଭ ଖରା ବେଳ";
|
|
211
|
+
var Papiamento = "Bon tardi";
|
|
212
|
+
var Pashto = "ورځ مو په خير";
|
|
213
|
+
var Polish$1 = "Dzień dobry";
|
|
214
|
+
var Portuguese$1 = "Boa tarde";
|
|
215
|
+
var Romanian$1 = "Bună ziua";
|
|
216
|
+
var Russian$1 = "Добрый день";
|
|
217
|
+
var Sakha = "Үтүө күнүнэн";
|
|
218
|
+
var Sardinian = "Bona sera";
|
|
219
|
+
var Scots$1 = "Guid efternuin";
|
|
220
|
+
var Serbian$1 = "Добар дан";
|
|
221
|
+
var Shona = "Masikati";
|
|
222
|
+
var Sicilian = "Bon jornu";
|
|
223
|
+
var Sinhala = "සුභ දවාලක්";
|
|
224
|
+
var Slovenian$1 = "Dober dan";
|
|
225
|
+
var Somali$1 = "Galab wanaagsan";
|
|
226
|
+
var Sumerian$1 = "𒄭𒌓𒁀";
|
|
227
|
+
var Swahili = "Habari ya mchana";
|
|
228
|
+
var Swedish$1 = "God eftermiddag";
|
|
229
|
+
var Tagalog$1 = "Magandang hapon po";
|
|
230
|
+
var Tamil = "மதிய வணக்கம்";
|
|
231
|
+
var Tatar$1 = "Xäyerle kön";
|
|
232
|
+
var Telugu$1 = "శుభ మద్యాహ్నం";
|
|
233
|
+
var Tetum = "Botarde";
|
|
234
|
+
var Thai$1 = "สวัสดีครับ";
|
|
235
|
+
var Tibetan = "ཉིན་གུང་བདེ་ལེགས།";
|
|
236
|
+
var Tongan = "Mālō tau ma‘u e ho‘ata ni";
|
|
237
|
+
var Tsonga = "Indzengha";
|
|
238
|
+
var Tswana = "Thupama e e monate";
|
|
239
|
+
var Turkish$1 = "Tünaydın";
|
|
240
|
+
var Ukrainian$1 = "Доброго дня";
|
|
241
|
+
var Urdu = "روز بخير";
|
|
242
|
+
var Uzbek$1 = "Xayrli kun";
|
|
243
|
+
var Venetian = "Bondì";
|
|
244
|
+
var Vietnamese = "Xin chào";
|
|
245
|
+
var Welsh$1 = "P'nawn da";
|
|
246
|
+
var Xhosa = "Uben' emva kwemini entle";
|
|
247
|
+
var Yapese = "Fal'e misii";
|
|
248
|
+
var Yiddish$1 = "א גוט אָוונט";
|
|
249
|
+
var Zazaki = "Perocê şıma xeyr bo";
|
|
250
|
+
var Zulu = "Sawubona";
|
|
251
|
+
var goodAfternoon = {
|
|
252
|
+
English: English$1,
|
|
253
|
+
Abkhaz: Abkhaz,
|
|
254
|
+
Adyghe: Adyghe,
|
|
255
|
+
Afrikaans: Afrikaans$1,
|
|
256
|
+
Albanian: Albanian$1,
|
|
257
|
+
Aleut: Aleut,
|
|
258
|
+
Aklan: Aklan,
|
|
259
|
+
Alsatian: Alsatian,
|
|
260
|
+
Arabic: Arabic$1,
|
|
261
|
+
Armenian: Armenian$1,
|
|
262
|
+
Assamese: Assamese,
|
|
263
|
+
Asturian: Asturian$1,
|
|
264
|
+
Australian: Australian$1,
|
|
265
|
+
Azerbaijani: Azerbaijani$1,
|
|
266
|
+
Bashkir: Bashkir,
|
|
267
|
+
Basque: Basque$1,
|
|
268
|
+
Bavarian: Bavarian,
|
|
269
|
+
Bengali: Bengali$1,
|
|
270
|
+
Bhojpuri: Bhojpuri,
|
|
271
|
+
Bosnian: Bosnian,
|
|
272
|
+
Breton: Breton$1,
|
|
273
|
+
Bulgarian: Bulgarian$1,
|
|
274
|
+
Cebuano: Cebuano,
|
|
275
|
+
Chamorro: Chamorro$1,
|
|
276
|
+
Chinese: Chinese$1,
|
|
277
|
+
Cornish: Cornish$1,
|
|
278
|
+
Corsican: Corsican,
|
|
279
|
+
Croatian: Croatian$1,
|
|
280
|
+
Cuyonon: Cuyonon,
|
|
281
|
+
Czech: Czech$1,
|
|
282
|
+
Danish: Danish$1,
|
|
283
|
+
Dutch: Dutch$1,
|
|
284
|
+
Estonian: Estonian$1,
|
|
285
|
+
Ewe: Ewe,
|
|
286
|
+
Faroese: Faroese$1,
|
|
287
|
+
Fijian: Fijian$1,
|
|
288
|
+
Finnish: Finnish$1,
|
|
289
|
+
Flemish: Flemish,
|
|
290
|
+
French: French$1,
|
|
291
|
+
"Frisian (North)": "Moin",
|
|
292
|
+
"Frisian (West)": "Goeie middei",
|
|
293
|
+
Friulian: Friulian,
|
|
294
|
+
Galician: Galician$1,
|
|
295
|
+
Georgian: Georgian$1,
|
|
296
|
+
German: German$1,
|
|
297
|
+
Greek: Greek$1,
|
|
298
|
+
Greenlandic: Greenlandic,
|
|
299
|
+
"Haitian Creole": "Bon apre-midi",
|
|
300
|
+
Hausa: Hausa,
|
|
301
|
+
Hawaiian: Hawaiian,
|
|
302
|
+
Hebrew: Hebrew$1,
|
|
303
|
+
Hindi: Hindi,
|
|
304
|
+
Icelandic: Icelandic$1,
|
|
305
|
+
Iloko: Iloko,
|
|
306
|
+
Indonesian: Indonesian$1,
|
|
307
|
+
"Iñupiaq": "Unnusatkun",
|
|
308
|
+
Gaelic: Gaelic,
|
|
309
|
+
Italian: Italian$1,
|
|
310
|
+
Japanese: Japanese$1,
|
|
311
|
+
Javanese: Javanese,
|
|
312
|
+
"Jèrriais": "Bouônjour",
|
|
313
|
+
Kannada: Kannada,
|
|
314
|
+
Kazakh: Kazakh$1,
|
|
315
|
+
Khmer: Khmer,
|
|
316
|
+
Korean: Korean,
|
|
317
|
+
Kurdish: Kurdish$1,
|
|
318
|
+
Kyrgyz: Kyrgyz,
|
|
319
|
+
Latvian: Latvian$1,
|
|
320
|
+
Limburgish: Limburgish,
|
|
321
|
+
Lithuanian: Lithuanian$1,
|
|
322
|
+
"Low German": "Moin",
|
|
323
|
+
Lozi: Lozi,
|
|
324
|
+
"Lule Sámi": "Buorre biejvve",
|
|
325
|
+
Luxembourgish: Luxembourgish$1,
|
|
326
|
+
Macedonian: Macedonian$1,
|
|
327
|
+
Malagasy: Malagasy,
|
|
328
|
+
Maltese: Maltese$1,
|
|
329
|
+
Mam: Mam,
|
|
330
|
+
Manx: Manx,
|
|
331
|
+
"Māori": "Kia ora",
|
|
332
|
+
"Middle Egyptian Hieroglyphs": "𓄤 𓅓𓈙𓂋𓅱𓇰",
|
|
333
|
+
Nepali: Nepali,
|
|
334
|
+
Newari: Newari,
|
|
335
|
+
"Northern Sámi": "Buorre beaivvi",
|
|
336
|
+
"Northern Sotho": "Dumêlang",
|
|
337
|
+
Norwegian: Norwegian,
|
|
338
|
+
Occitan: Occitan,
|
|
339
|
+
Odia: Odia$1,
|
|
340
|
+
Papiamento: Papiamento,
|
|
341
|
+
Pashto: Pashto,
|
|
342
|
+
Polish: Polish$1,
|
|
343
|
+
Portuguese: Portuguese$1,
|
|
344
|
+
Romanian: Romanian$1,
|
|
345
|
+
Russian: Russian$1,
|
|
346
|
+
Sakha: Sakha,
|
|
347
|
+
Sardinian: Sardinian,
|
|
348
|
+
"Scottish Gaelic": "Feasgar math",
|
|
349
|
+
Scots: Scots$1,
|
|
350
|
+
Serbian: Serbian$1,
|
|
351
|
+
Shona: Shona,
|
|
352
|
+
Sicilian: Sicilian,
|
|
353
|
+
Sinhala: Sinhala,
|
|
354
|
+
Slovenian: Slovenian$1,
|
|
355
|
+
Somali: Somali$1,
|
|
356
|
+
"Southern Sámi": "Buerie biejjie",
|
|
357
|
+
Sumerian: Sumerian$1,
|
|
358
|
+
Swahili: Swahili,
|
|
359
|
+
Swedish: Swedish$1,
|
|
360
|
+
"Swiss German": "Gueten Abig",
|
|
361
|
+
Tagalog: Tagalog$1,
|
|
362
|
+
Tamil: Tamil,
|
|
363
|
+
Tatar: Tatar$1,
|
|
364
|
+
Telugu: Telugu$1,
|
|
365
|
+
Tetum: Tetum,
|
|
366
|
+
Thai: Thai$1,
|
|
367
|
+
Tibetan: Tibetan,
|
|
368
|
+
"Tok Pisin": "Apinum",
|
|
369
|
+
Tongan: Tongan,
|
|
370
|
+
Tsonga: Tsonga,
|
|
371
|
+
Tswana: Tswana,
|
|
372
|
+
Turkish: Turkish$1,
|
|
373
|
+
Ukrainian: Ukrainian$1,
|
|
374
|
+
Urdu: Urdu,
|
|
375
|
+
Uzbek: Uzbek$1,
|
|
376
|
+
Venetian: Venetian,
|
|
377
|
+
Vietnamese: Vietnamese,
|
|
378
|
+
"Võro": "Hüvvä lõunaaigo",
|
|
379
|
+
Welsh: Welsh$1,
|
|
380
|
+
Xhosa: Xhosa,
|
|
381
|
+
Yapese: Yapese,
|
|
382
|
+
Yiddish: Yiddish$1,
|
|
383
|
+
"Yucatec Maya": "Ma'lob chi'inil K'iin",
|
|
384
|
+
Zazaki: Zazaki,
|
|
385
|
+
Zulu: Zulu
|
|
386
|
+
};
|
|
387
|
+
|
|
388
|
+
var Afrikaans = "Goeienaand";
|
|
389
|
+
var Aklanon = "Mayad nga gabi-i";
|
|
390
|
+
var Albanian = "Mirëmbrëma";
|
|
391
|
+
var Arabic = "Masaa al-khair";
|
|
392
|
+
var Aragonese = "Buena nuei";
|
|
393
|
+
var Armenian = "Pari yerego";
|
|
394
|
+
var Aromunian = "Bunã seara";
|
|
395
|
+
var Asante = "Maadwó";
|
|
396
|
+
var Asturian = "Bona nuechi";
|
|
397
|
+
var Ateso = "Akwar najokan";
|
|
398
|
+
var Australian = "G'day";
|
|
399
|
+
var Aymara = "Winas tartis";
|
|
400
|
+
var Azerbaijani = "Axşamınız xeyir";
|
|
401
|
+
var Basque = "Arratsalde on";
|
|
402
|
+
var Belorussian = "Dobry viechar";
|
|
403
|
+
var Bemba = "Cungulopo mukwai";
|
|
404
|
+
var Bengali = "Shuvo shandhya";
|
|
405
|
+
var Bilen = "Aja kunduKw’ma?";
|
|
406
|
+
var Breton = "Noz vat";
|
|
407
|
+
var Bulgarian = "Dobar vecher";
|
|
408
|
+
var Cantonese = "Maan ngon";
|
|
409
|
+
var Cassubian = "Dobri wieczór";
|
|
410
|
+
var Catalan = "Bona tarda";
|
|
411
|
+
var Chamorro = "Pupuengin maolek";
|
|
412
|
+
var Chechen = "Sürea dika yoila";
|
|
413
|
+
var Comoran = "Bariza massihou";
|
|
414
|
+
var Cornish = "Gorthugher da";
|
|
415
|
+
var Croatian = "Dobra večer";
|
|
416
|
+
var Czech = "Dobrý večer";
|
|
417
|
+
var Danish = "God aften";
|
|
418
|
+
var Dutch = "Goedenavond";
|
|
419
|
+
var Edo = "Ób’ótà";
|
|
420
|
+
var English = "Good evening";
|
|
421
|
+
var Esperanto = "Bonan vesperon";
|
|
422
|
+
var Estonian = "Tere õhtust";
|
|
423
|
+
var Faroese = "Gott kvøld";
|
|
424
|
+
var Farsi = "Shab beh'khayr";
|
|
425
|
+
var Fijian = "Ni sa bogi";
|
|
426
|
+
var Finnish = "Hyvää iltaa";
|
|
427
|
+
var French = "Bonsoir";
|
|
428
|
+
var Galician = "Boas noites";
|
|
429
|
+
var Georgian = "Saghamo mshvidobisa";
|
|
430
|
+
var German = "Guten Abend";
|
|
431
|
+
var Greek = "Kalinichta";
|
|
432
|
+
var Guarani = "Mba’éichapa ndepyhare";
|
|
433
|
+
var Hebrew = "Erev tov";
|
|
434
|
+
var Hungarian = "Jó estét";
|
|
435
|
+
var Icelandic = "Gott kvöld";
|
|
436
|
+
var Indonesian = "Selamat malam";
|
|
437
|
+
var Italian = "Buona sera";
|
|
438
|
+
var Japanese = "こんばんは";
|
|
439
|
+
var Kazakh = "Kayırlı keş";
|
|
440
|
+
var Kurdish = "Evarbash";
|
|
441
|
+
var Latvian = "Labvakar";
|
|
442
|
+
var Lithuanian = "Labas vakaras";
|
|
443
|
+
var Luganda = "Osiibye otya nno";
|
|
444
|
+
var Luo = "Oimore";
|
|
445
|
+
var Luxembourgish = "Gudden Owend";
|
|
446
|
+
var Macedonian = "Dobra vecher";
|
|
447
|
+
var Malay = "Selamat malam";
|
|
448
|
+
var Maltese = "Il-lejla t-tajba";
|
|
449
|
+
var Mandarin = "Wan shang hao";
|
|
450
|
+
var Maori = "Kia orana ‘i teia a’ia’i";
|
|
451
|
+
var Marshallese = "Yokwe in jota";
|
|
452
|
+
var Mawe = "Awãe aiko";
|
|
453
|
+
var Mongolian = "Odoin mend";
|
|
454
|
+
var Odia = "ସୁଭସନ୍ଧ୍ୟା";
|
|
455
|
+
var Polish = "Dobry wieczór";
|
|
456
|
+
var Portuguese = "Boa noite";
|
|
457
|
+
var Romanian = "Bunã seara";
|
|
458
|
+
var Russian = "Добрый вечер";
|
|
459
|
+
var Scots = "Guid eenin";
|
|
460
|
+
var Sesotho = "Fonane";
|
|
461
|
+
var Serbian = "Добро вече";
|
|
462
|
+
var Slovak = "Dober vecher";
|
|
463
|
+
var Slovenian = "Dober vecher";
|
|
464
|
+
var Somali = "Habeen wanaagsan";
|
|
465
|
+
var Spanish = "Buenas tardes";
|
|
466
|
+
var Sumerian = "𒄭𒈪";
|
|
467
|
+
var Swedish = "God afton";
|
|
468
|
+
var Tagalog = "Magandang gabi";
|
|
469
|
+
var Tatar = "Xäyerle kiç";
|
|
470
|
+
var Telugu = "శుభ సాయంత్రం";
|
|
471
|
+
var Thai = "Sawat-dii torn khum";
|
|
472
|
+
var Turkish = "İyi akşamlar";
|
|
473
|
+
var Ukrainian = "Добрий вечiр";
|
|
474
|
+
var Uzbek = "Xayrli kech";
|
|
475
|
+
var Welsh = "Noswaith dda";
|
|
476
|
+
var Yiddish = "Ah gutn ovnt";
|
|
477
|
+
var Chinese = "晚安";
|
|
478
|
+
var Valyrian = "sȳz bantis";
|
|
479
|
+
var goodEvening = {
|
|
480
|
+
Afrikaans: Afrikaans,
|
|
481
|
+
Aklanon: Aklanon,
|
|
482
|
+
Albanian: Albanian,
|
|
483
|
+
"Anglo-Saxon": "God æfen",
|
|
484
|
+
Arabic: Arabic,
|
|
485
|
+
Aragonese: Aragonese,
|
|
486
|
+
Armenian: Armenian,
|
|
487
|
+
Aromunian: Aromunian,
|
|
488
|
+
Asante: Asante,
|
|
489
|
+
Asturian: Asturian,
|
|
490
|
+
Ateso: Ateso,
|
|
491
|
+
Australian: Australian,
|
|
492
|
+
Aymara: Aymara,
|
|
493
|
+
Azerbaijani: Azerbaijani,
|
|
494
|
+
Basque: Basque,
|
|
495
|
+
Belorussian: Belorussian,
|
|
496
|
+
Bemba: Bemba,
|
|
497
|
+
Bengali: Bengali,
|
|
498
|
+
Bilen: Bilen,
|
|
499
|
+
Breton: Breton,
|
|
500
|
+
Bulgarian: Bulgarian,
|
|
501
|
+
Cantonese: Cantonese,
|
|
502
|
+
Cassubian: Cassubian,
|
|
503
|
+
Catalan: Catalan,
|
|
504
|
+
Chamorro: Chamorro,
|
|
505
|
+
Chechen: Chechen,
|
|
506
|
+
Comoran: Comoran,
|
|
507
|
+
Cornish: Cornish,
|
|
508
|
+
Croatian: Croatian,
|
|
509
|
+
Czech: Czech,
|
|
510
|
+
Danish: Danish,
|
|
511
|
+
Dutch: Dutch,
|
|
512
|
+
Edo: Edo,
|
|
513
|
+
English: English,
|
|
514
|
+
Esperanto: Esperanto,
|
|
515
|
+
Estonian: Estonian,
|
|
516
|
+
Faroese: Faroese,
|
|
517
|
+
Farsi: Farsi,
|
|
518
|
+
Fijian: Fijian,
|
|
519
|
+
Finnish: Finnish,
|
|
520
|
+
French: French,
|
|
521
|
+
Galician: Galician,
|
|
522
|
+
Georgian: Georgian,
|
|
523
|
+
German: German,
|
|
524
|
+
Greek: Greek,
|
|
525
|
+
Guarani: Guarani,
|
|
526
|
+
Hebrew: Hebrew,
|
|
527
|
+
Hungarian: Hungarian,
|
|
528
|
+
Icelandic: Icelandic,
|
|
529
|
+
Indonesian: Indonesian,
|
|
530
|
+
"Irish Gaelic": "Tráthnóna",
|
|
531
|
+
Italian: Italian,
|
|
532
|
+
Japanese: Japanese,
|
|
533
|
+
"Japanese (Romanji)": "Konban wa",
|
|
534
|
+
Kazakh: Kazakh,
|
|
535
|
+
Kurdish: Kurdish,
|
|
536
|
+
Latvian: Latvian,
|
|
537
|
+
Lithuanian: Lithuanian,
|
|
538
|
+
"Low German": "Moin",
|
|
539
|
+
Luganda: Luganda,
|
|
540
|
+
Luo: Luo,
|
|
541
|
+
Luxembourgish: Luxembourgish,
|
|
542
|
+
Macedonian: Macedonian,
|
|
543
|
+
Malay: Malay,
|
|
544
|
+
Maltese: Maltese,
|
|
545
|
+
Mandarin: Mandarin,
|
|
546
|
+
Maori: Maori,
|
|
547
|
+
Marshallese: Marshallese,
|
|
548
|
+
Mawe: Mawe,
|
|
549
|
+
"Middle Egyptian Hieroglyphs": "𓄤 𓅱𓃉𓇰",
|
|
550
|
+
Mongolian: Mongolian,
|
|
551
|
+
"Norwegian [Bokmaal]": "God kveld",
|
|
552
|
+
Odia: Odia,
|
|
553
|
+
Polish: Polish,
|
|
554
|
+
Portuguese: Portuguese,
|
|
555
|
+
"Quiché": "Xe q’ij",
|
|
556
|
+
"Romani [Sinte]": "Lashi rachi",
|
|
557
|
+
Romanian: Romanian,
|
|
558
|
+
Russian: Russian,
|
|
559
|
+
"Scottish Gaelic": "Feasgar mhath",
|
|
560
|
+
Scots: Scots,
|
|
561
|
+
Sesotho: Sesotho,
|
|
562
|
+
Serbian: Serbian,
|
|
563
|
+
Slovak: Slovak,
|
|
564
|
+
Slovenian: Slovenian,
|
|
565
|
+
Somali: Somali,
|
|
566
|
+
Spanish: Spanish,
|
|
567
|
+
Sumerian: Sumerian,
|
|
568
|
+
Swedish: Swedish,
|
|
569
|
+
Tagalog: Tagalog,
|
|
570
|
+
Tatar: Tatar,
|
|
571
|
+
Telugu: Telugu,
|
|
572
|
+
Thai: Thai,
|
|
573
|
+
Turkish: Turkish,
|
|
574
|
+
Ukrainian: Ukrainian,
|
|
575
|
+
Uzbek: Uzbek,
|
|
576
|
+
Welsh: Welsh,
|
|
577
|
+
Yiddish: Yiddish,
|
|
578
|
+
Chinese: Chinese,
|
|
579
|
+
Valyrian: Valyrian
|
|
580
|
+
};
|
|
581
|
+
|
|
582
|
+
const greetingRandomSeed = Math.floor(Math.random() * 1e6);
|
|
583
|
+
function getTimeBasedGreeting() {
|
|
584
|
+
const random = (array) => array[greetingRandomSeed % array.length];
|
|
585
|
+
const currentHour = new Date(Date.now()).getHours();
|
|
586
|
+
if (currentHour >= 23) {
|
|
587
|
+
return {
|
|
588
|
+
language: "Seriously",
|
|
589
|
+
greeting: "Get some rest"
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
const timeOfDay = (hour) => {
|
|
593
|
+
if (hour < 12)
|
|
594
|
+
return goodMorning;
|
|
595
|
+
if (hour < 17)
|
|
596
|
+
return goodAfternoon;
|
|
597
|
+
return goodEvening;
|
|
598
|
+
};
|
|
599
|
+
const greetings = timeOfDay(currentHour);
|
|
600
|
+
const greetingsKey = random(Object.keys(greetings));
|
|
601
|
+
return {
|
|
602
|
+
language: greetingsKey,
|
|
603
|
+
greeting: greetings[greetingsKey]
|
|
604
|
+
};
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
const WelcomeTitle = () => {
|
|
608
|
+
const identityApi = useApi(identityApiRef);
|
|
609
|
+
const profile = identityApi.getProfile();
|
|
610
|
+
const userId = identityApi.getUserId();
|
|
611
|
+
const greeting = useMemo(() => getTimeBasedGreeting(), []);
|
|
612
|
+
return /* @__PURE__ */ React.createElement(Tooltip, {
|
|
613
|
+
title: greeting.language
|
|
614
|
+
}, /* @__PURE__ */ React.createElement("span", null, `${greeting.greeting}, ${profile.displayName || userId}!`));
|
|
615
|
+
};
|
|
616
|
+
|
|
617
|
+
export { WelcomeTitle };
|
|
618
|
+
//# sourceMappingURL=index-20e36a68.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-20e36a68.esm.js","sources":["../../src/homePageComponents/WelcomeTitle/timeUtil.ts","../../src/homePageComponents/WelcomeTitle/WelcomeTitle.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport goodMorning from './locales/goodMorning.locales.json';\nimport goodAfternoon from './locales/goodAfternoon.locales.json';\nimport goodEvening from './locales/goodEvening.locales.json';\n\n// Select a large random integer at startup, to prevent the greetings to change\n// every time the user navigates.\nconst greetingRandomSeed = Math.floor(Math.random() * 1000000);\n\nexport function getTimeBasedGreeting(): { language: string; greeting: string } {\n const random = (array: string[]) => array[greetingRandomSeed % array.length];\n\n const currentHour = new Date(Date.now()).getHours();\n if (currentHour >= 23) {\n return {\n language: 'Seriously',\n greeting: 'Get some rest',\n };\n }\n const timeOfDay = (hour: number): { [language: string]: string } => {\n if (hour < 12) return goodMorning;\n if (hour < 17) return goodAfternoon;\n return goodEvening;\n };\n const greetings = timeOfDay(currentHour);\n const greetingsKey = random(Object.keys(greetings));\n return {\n language: greetingsKey,\n greeting: greetings[greetingsKey],\n };\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\nimport { Tooltip } from '@material-ui/core';\nimport React, { useMemo } from 'react';\nimport { getTimeBasedGreeting } from './timeUtil';\n\nexport const WelcomeTitle = () => {\n const identityApi = useApi(identityApiRef);\n const profile = identityApi.getProfile();\n const userId = identityApi.getUserId();\n const greeting = useMemo(() => getTimeBasedGreeting(), []);\n\n return (\n <Tooltip title={greeting.language}>\n <span>{`${greeting.greeting}, ${profile.displayName || userId}!`}</span>\n </Tooltip>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBA,MAAM,qBAAqB,KAAK,MAAM,KAAK,WAAW;gCAEyB;AAC7E,QAAM,SAAS,CAAC,UAAoB,MAAM,qBAAqB,MAAM;AAErE,QAAM,cAAc,IAAI,KAAK,KAAK,OAAO;AACzC,MAAI,eAAe,IAAI;AACrB,WAAO;AAAA,MACL,UAAU;AAAA,MACV,UAAU;AAAA;AAAA;AAGd,QAAM,YAAY,CAAC,SAAiD;AAClE,QAAI,OAAO;AAAI,aAAO;AACtB,QAAI,OAAO;AAAI,aAAO;AACtB,WAAO;AAAA;AAET,QAAM,YAAY,UAAU;AAC5B,QAAM,eAAe,OAAO,OAAO,KAAK;AACxC,SAAO;AAAA,IACL,UAAU;AAAA,IACV,UAAU,UAAU;AAAA;AAAA;;MCvBX,eAAe,MAAM;AAChC,QAAM,cAAc,OAAO;AAC3B,QAAM,UAAU,YAAY;AAC5B,QAAM,SAAS,YAAY;AAC3B,QAAM,WAAW,QAAQ,MAAM,wBAAwB;AAEvD,6CACG,SAAD;AAAA,IAAS,OAAO,SAAS;AAAA,yCACtB,QAAD,MAAO,GAAG,SAAS,aAAa,QAAQ,eAAe;AAAA;;;;"}
|
|
@@ -47,7 +47,7 @@ const useRandomJoke = () => {
|
|
|
47
47
|
};
|
|
48
48
|
|
|
49
49
|
const Actions = () => {
|
|
50
|
-
const {rerollJoke} = useRandomJoke();
|
|
50
|
+
const { rerollJoke } = useRandomJoke();
|
|
51
51
|
return /* @__PURE__ */ React.createElement(Button, {
|
|
52
52
|
variant: "contained",
|
|
53
53
|
color: "primary",
|
|
@@ -56,14 +56,14 @@ const Actions = () => {
|
|
|
56
56
|
};
|
|
57
57
|
|
|
58
58
|
const Content = () => {
|
|
59
|
-
const {joke, loading} = useRandomJoke();
|
|
59
|
+
const { joke, loading } = useRandomJoke();
|
|
60
60
|
if (loading)
|
|
61
61
|
return /* @__PURE__ */ React.createElement("p", null, "Loading...");
|
|
62
62
|
return /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("p", null, joke.setup), /* @__PURE__ */ React.createElement("p", null, joke.punchline));
|
|
63
63
|
};
|
|
64
64
|
|
|
65
65
|
const Settings = () => {
|
|
66
|
-
const {type, handleChangeType} = useRandomJoke();
|
|
66
|
+
const { type, handleChangeType } = useRandomJoke();
|
|
67
67
|
const JOKE_TYPES = ["any", "programming"];
|
|
68
68
|
return /* @__PURE__ */ React.createElement(FormControl, {
|
|
69
69
|
component: "fieldset"
|
|
@@ -82,4 +82,4 @@ const Settings = () => {
|
|
|
82
82
|
};
|
|
83
83
|
|
|
84
84
|
export { Actions, Content, ContextProvider, Settings };
|
|
85
|
-
//# sourceMappingURL=index-
|
|
85
|
+
//# sourceMappingURL=index-22929ade.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-22929ade.esm.js","sources":["../../src/homePageComponents/RandomJoke/Context.tsx","../../src/homePageComponents/RandomJoke/Actions.tsx","../../src/homePageComponents/RandomJoke/Content.tsx","../../src/homePageComponents/RandomJoke/Settings.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { createContext } from 'react';\n\nexport type JokeType = 'any' | 'programming';\n\ntype Joke = {\n setup: string;\n punchline: string;\n};\n\ntype RandomJokeContextValue = {\n loading: boolean;\n joke: Joke;\n type: JokeType;\n rerollJoke: Function;\n handleChangeType: Function;\n};\n\nconst Context = createContext<RandomJokeContextValue | undefined>(undefined);\n\nconst getNewJoke = (type: string): Promise<Joke> =>\n fetch(\n `https://official-joke-api.appspot.com/jokes${\n type !== 'any' ? `/${type}` : ''\n }/random`,\n )\n .then(res => res.json())\n .then(data => (Array.isArray(data) ? data[0] : data));\n\nexport const ContextProvider = ({\n children,\n defaultCategory,\n}: {\n children: JSX.Element;\n defaultCategory?: JokeType;\n}) => {\n const [loading, setLoading] = React.useState(true);\n const [joke, setJoke] = React.useState<Joke>({\n setup: '',\n punchline: '',\n });\n const [type, setType] = React.useState<JokeType>(\n defaultCategory || ('programming' as JokeType),\n );\n\n const rerollJoke = React.useCallback(() => {\n setLoading(true);\n getNewJoke(type).then(newJoke => setJoke(newJoke));\n }, [type]);\n\n const handleChangeType = (newType: JokeType) => {\n setType(newType);\n };\n\n React.useEffect(() => {\n setLoading(false);\n }, [joke]);\n\n React.useEffect(() => {\n rerollJoke();\n }, [rerollJoke]);\n\n const value: RandomJokeContextValue = {\n loading,\n joke,\n type,\n rerollJoke,\n handleChangeType,\n };\n\n return <Context.Provider value={value}>{children}</Context.Provider>;\n};\n\nexport const useRandomJoke = () => {\n const value = React.useContext(Context);\n\n if (value === undefined) {\n throw new Error('useRandomJoke must be used within a RandomJokeProvider');\n }\n\n return value;\n};\n\nexport default Context;\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\n\nimport { Button } from '@material-ui/core';\nimport { useRandomJoke } from './Context';\n\nexport const Actions = () => {\n const { rerollJoke } = useRandomJoke();\n return (\n <Button variant=\"contained\" color=\"primary\" onClick={() => rerollJoke()}>\n Reroll\n </Button>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { useRandomJoke } from './Context';\n\nexport const Content = () => {\n const { joke, loading } = useRandomJoke();\n\n if (loading) return <p>Loading...</p>;\n\n return (\n <div>\n <p>{joke.setup}</p>\n <p>{joke.punchline}</p>\n </div>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n FormControl,\n FormLabel,\n RadioGroup,\n FormControlLabel,\n Radio,\n} from '@material-ui/core';\nimport React from 'react';\nimport { useRandomJoke, JokeType } from './Context';\nimport upperFirst from 'lodash/upperFirst';\n\nexport const Settings = () => {\n const { type, handleChangeType } = useRandomJoke();\n const JOKE_TYPES: JokeType[] = ['any' as JokeType, 'programming' as JokeType];\n return (\n <FormControl component=\"fieldset\">\n <FormLabel component=\"legend\">Joke Type</FormLabel>\n <RadioGroup\n aria-label=\"joke type\"\n value={type}\n onChange={e => handleChangeType(e.target.value)}\n >\n {JOKE_TYPES.map(t => (\n <FormControlLabel\n key={t}\n value={t}\n control={<Radio />}\n label={upperFirst(t)}\n />\n ))}\n </RadioGroup>\n </FormControl>\n );\n};\n"],"names":[],"mappings":";;;;AAiCA,MAAM,UAAU,cAAkD;AAElE,MAAM,aAAa,CAAC,SAClB,MACE,8CACE,SAAS,QAAQ,IAAI,SAAS,aAG/B,KAAK,SAAO,IAAI,QAChB,KAAK,UAAS,MAAM,QAAQ,QAAQ,KAAK,KAAK;MAEtC,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,MAII;AACJ,QAAM,CAAC,SAAS,cAAc,MAAM,SAAS;AAC7C,QAAM,CAAC,MAAM,WAAW,MAAM,SAAe;AAAA,IAC3C,OAAO;AAAA,IACP,WAAW;AAAA;AAEb,QAAM,CAAC,MAAM,WAAW,MAAM,SAC5B,mBAAoB;AAGtB,QAAM,aAAa,MAAM,YAAY,MAAM;AACzC,eAAW;AACX,eAAW,MAAM,KAAK,aAAW,QAAQ;AAAA,KACxC,CAAC;AAEJ,QAAM,mBAAmB,CAAC,YAAsB;AAC9C,YAAQ;AAAA;AAGV,QAAM,UAAU,MAAM;AACpB,eAAW;AAAA,KACV,CAAC;AAEJ,QAAM,UAAU,MAAM;AACpB;AAAA,KACC,CAAC;AAEJ,QAAM,QAAgC;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAGF,6CAAQ,QAAQ,UAAT;AAAA,IAAkB;AAAA,KAAe;AAAA;MAG7B,gBAAgB,MAAM;AACjC,QAAM,QAAQ,MAAM,WAAW;AAE/B,MAAI,UAAU,QAAW;AACvB,UAAM,IAAI,MAAM;AAAA;AAGlB,SAAO;AAAA;;MC1EI,UAAU,MAAM;AAC3B,QAAM,EAAE,eAAe;AACvB,6CACG,QAAD;AAAA,IAAQ,SAAQ;AAAA,IAAY,OAAM;AAAA,IAAU,SAAS,MAAM;AAAA,KAAc;AAAA;;MCLhE,UAAU,MAAM;AAC3B,QAAM,EAAE,MAAM,YAAY;AAE1B,MAAI;AAAS,+CAAQ,KAAD,MAAG;AAEvB,6CACG,OAAD,0CACG,KAAD,MAAI,KAAK,4CACR,KAAD,MAAI,KAAK;AAAA;;MCDF,WAAW,MAAM;AAC5B,QAAM,EAAE,MAAM,qBAAqB;AACnC,QAAM,aAAyB,CAAC,OAAmB;AACnD,6CACG,aAAD;AAAA,IAAa,WAAU;AAAA,yCACpB,WAAD;AAAA,IAAW,WAAU;AAAA,KAAS,kDAC7B,YAAD;AAAA,IACE,cAAW;AAAA,IACX,OAAO;AAAA,IACP,UAAU,OAAK,iBAAiB,EAAE,OAAO;AAAA,KAExC,WAAW,IAAI,2CACb,kBAAD;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,6CAAU,OAAD;AAAA,IACT,OAAO,WAAW;AAAA;AAAA;;;;"}
|
|
@@ -62,8 +62,9 @@ const ComponentTabs = ({
|
|
|
62
62
|
}, tabs.map((t) => /* @__PURE__ */ React.createElement(Tab, {
|
|
63
63
|
key: t.label,
|
|
64
64
|
label: t.label
|
|
65
|
-
}))), tabs.map(({Component}, idx) => /* @__PURE__ */ React.createElement("div", {
|
|
66
|
-
|
|
65
|
+
}))), tabs.map(({ Component }, idx) => /* @__PURE__ */ React.createElement("div", {
|
|
66
|
+
key: idx,
|
|
67
|
+
...idx !== value ? { style: { display: "none" } } : {}
|
|
67
68
|
}, /* @__PURE__ */ React.createElement(Component, null))));
|
|
68
69
|
};
|
|
69
70
|
|
|
@@ -79,4 +80,4 @@ const ComponentTab = ({
|
|
|
79
80
|
};
|
|
80
81
|
|
|
81
82
|
export { ComponentAccordion, ComponentTab, ComponentTabs };
|
|
82
|
-
//# sourceMappingURL=index-
|
|
83
|
+
//# sourceMappingURL=index-8ff3197b.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-8ff3197b.esm.js","sources":["../../src/componentRenderers/ComponentAccordion.tsx","../../src/componentRenderers/ComponentTabs/ComponentTabs.tsx","../../src/componentRenderers/ComponentTabs/ComponentTab.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Typography,\n IconButton,\n Theme,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport SettingsIcon from '@material-ui/icons/Settings';\n\nimport { SettingsModal } from '../components';\n\nconst useStyles = makeStyles((theme: Theme) => ({\n settingsIconButton: {\n padding: theme.spacing(0, 1, 0, 0),\n },\n}));\n\nexport const ComponentAccordion = ({\n title,\n Content,\n Actions,\n Settings,\n ContextProvider,\n ...childProps\n}: {\n title: string;\n Content: () => JSX.Element;\n Actions?: () => JSX.Element;\n Settings?: () => JSX.Element;\n ContextProvider?: (props: any) => JSX.Element;\n}) => {\n const classes = useStyles();\n const [settingsIsExpanded, setSettingsIsExpanded] = React.useState(false);\n const [isExpanded, setIsExpanded] = React.useState(false);\n\n const handleOpenSettings = (e: any) => {\n e.stopPropagation();\n setSettingsIsExpanded(prevState => !prevState);\n };\n\n const innerContent = (\n <>\n {Settings && (\n <SettingsModal\n open={settingsIsExpanded}\n close={() => setSettingsIsExpanded(false)}\n componentName={title}\n >\n <Settings />\n </SettingsModal>\n )}\n <Accordion\n expanded={isExpanded}\n onChange={(_e: any, expanded: boolean) => setIsExpanded(expanded)}\n >\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n {Settings && (\n <IconButton\n onClick={handleOpenSettings}\n className={classes.settingsIconButton}\n >\n <SettingsIcon />\n </IconButton>\n )}\n <Typography>{title}</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <div>\n <Content />\n {Actions && <Actions />}\n </div>\n </AccordionDetails>\n </Accordion>\n </>\n );\n\n return ContextProvider ? (\n <ContextProvider {...childProps}>{innerContent}</ContextProvider>\n ) : (\n innerContent\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { Tabs, Tab } from '@material-ui/core';\nimport { InfoCard } from '@backstage/core-components';\n\ntype TabType = {\n label: string;\n Component: () => JSX.Element;\n};\n\nexport const ComponentTabs = ({\n title,\n tabs,\n}: {\n title: string;\n tabs: TabType[];\n}) => {\n const [value, setValue] = React.useState(0);\n\n const handleChange = (_event: any, newValue: number) => {\n setValue(newValue);\n };\n\n return (\n <InfoCard title={title}>\n <Tabs value={value} onChange={handleChange}>\n {tabs.map(t => (\n <Tab key={t.label} label={t.label} />\n ))}\n </Tabs>\n {tabs.map(({ Component }, idx) => (\n <div\n key={idx}\n {...(idx !== value ? { style: { display: 'none' } } : {})}\n >\n <Component />\n </div>\n ))}\n </InfoCard>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\n\nexport const ComponentTab = ({\n title,\n Content,\n ContextProvider,\n ...childProps\n}: {\n title: string;\n Content: () => JSX.Element;\n ContextProvider?: (props: any) => JSX.Element;\n}) => {\n return ContextProvider ? (\n <ContextProvider {...childProps}>\n <Content />\n </ContextProvider>\n ) : (\n <Content />\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AA+BA,MAAM,YAAY,WAAW,CAAC;AAAkB,EAC9C,oBAAoB;AAAA,IAClB,SAAS,MAAM,QAAQ,GAAG,GAAG,GAAG;AAAA;AAAA;MAIvB,qBAAqB,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,KACG;AAAA,MAOC;AACJ,QAAM,UAAU;AAChB,QAAM,CAAC,oBAAoB,yBAAyB,MAAM,SAAS;AACnE,QAAM,CAAC,YAAY,iBAAiB,MAAM,SAAS;AAEnD,QAAM,qBAAqB,CAAC,MAAW;AACrC,MAAE;AACF,0BAAsB,eAAa,CAAC;AAAA;AAGtC,QAAM,yEAED,gDACE,eAAD;AAAA,IACE,MAAM;AAAA,IACN,OAAO,MAAM,sBAAsB;AAAA,IACnC,eAAe;AAAA,yCAEd,UAAD,4CAGH,WAAD;AAAA,IACE,UAAU;AAAA,IACV,UAAU,CAAC,IAAS,aAAsB,cAAc;AAAA,yCAEvD,kBAAD;AAAA,IAAkB,gDAAa,gBAAD;AAAA,KAC3B,gDACE,YAAD;AAAA,IACE,SAAS;AAAA,IACT,WAAW,QAAQ;AAAA,yCAElB,cAAD,4CAGH,YAAD,MAAa,6CAEd,kBAAD,0CACG,OAAD,0CACG,SAAD,OACC,+CAAY,SAAD;AAOtB,SAAO,sDACJ,iBAAD;AAAA,OAAqB;AAAA,KAAa,gBAElC;AAAA;;MC1ES,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,MAII;AACJ,QAAM,CAAC,OAAO,YAAY,MAAM,SAAS;AAEzC,QAAM,eAAe,CAAC,QAAa,aAAqB;AACtD,aAAS;AAAA;AAGX,6CACG,UAAD;AAAA,IAAU;AAAA,yCACP,MAAD;AAAA,IAAM;AAAA,IAAc,UAAU;AAAA,KAC3B,KAAK,IAAI,2CACP,KAAD;AAAA,IAAK,KAAK,EAAE;AAAA,IAAO,OAAO,EAAE;AAAA,QAG/B,KAAK,IAAI,CAAC,EAAE,aAAa,4CACvB,OAAD;AAAA,IACE,KAAK;AAAA,OACA,QAAQ,QAAQ,EAAE,OAAO,EAAE,SAAS,aAAa;AAAA,yCAErD,WAAD;AAAA;;MChCG,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,KACG;AAAA,MAKC;AACJ,SAAO,sDACJ,iBAAD;AAAA,OAAqB;AAAA,yCAClB,SAAD,6CAGD,SAAD;AAAA;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,9 +14,10 @@ declare type ComponentParts = {
|
|
|
14
14
|
declare type RendererProps = {
|
|
15
15
|
title: string;
|
|
16
16
|
} & ComponentParts;
|
|
17
|
-
declare function createCardExtension<T>({ title, components, }: {
|
|
17
|
+
declare function createCardExtension<T>({ title, components, name, }: {
|
|
18
18
|
title: string;
|
|
19
19
|
components: () => Promise<ComponentParts>;
|
|
20
|
+
name?: string;
|
|
20
21
|
}): _backstage_core_plugin_api.Extension<({ Renderer, title: overrideTitle, ...childProps }: ComponentRenderer & {
|
|
21
22
|
title?: string;
|
|
22
23
|
} & T) => JSX.Element>;
|
|
@@ -47,6 +48,12 @@ declare const ComponentTab: ({ title, Content, ContextProvider, ...childProps }:
|
|
|
47
48
|
Content: () => JSX.Element;
|
|
48
49
|
ContextProvider?: ((props: any) => JSX.Element) | undefined;
|
|
49
50
|
}) => JSX.Element;
|
|
51
|
+
/**
|
|
52
|
+
* A component to display a playful greeting for the user.
|
|
53
|
+
*
|
|
54
|
+
* @public
|
|
55
|
+
*/
|
|
56
|
+
declare const WelcomeTitle: () => JSX.Element;
|
|
50
57
|
declare const HomePageRandomJoke: ({ Renderer, title: overrideTitle, ...childProps }: ComponentRenderer & {
|
|
51
58
|
title?: string | undefined;
|
|
52
59
|
} & {
|
|
@@ -60,4 +67,12 @@ declare const SettingsModal: ({ open, close, componentName, children, }: {
|
|
|
60
67
|
children: JSX.Element;
|
|
61
68
|
}) => JSX.Element;
|
|
62
69
|
|
|
63
|
-
|
|
70
|
+
declare type ClockConfig = {
|
|
71
|
+
label: string;
|
|
72
|
+
timeZone: string;
|
|
73
|
+
};
|
|
74
|
+
declare const HeaderWorldClock: ({ clockConfigs, }: {
|
|
75
|
+
clockConfigs: ClockConfig[];
|
|
76
|
+
}) => JSX.Element | null;
|
|
77
|
+
|
|
78
|
+
export { ClockConfig, ComponentAccordion, ComponentTab, ComponentTabs, HeaderWorldClock, HomePageRandomJoke, HomepageCompositionRoot, SettingsModal, WelcomeTitle, createCardExtension, homePlugin };
|
package/dist/index.esm.js
CHANGED
|
@@ -2,7 +2,7 @@ import { createReactExtension, useApp, createRouteRef, createPlugin, createRouta
|
|
|
2
2
|
import React, { Suspense } from 'react';
|
|
3
3
|
import { Dialog, DialogTitle, DialogContent, DialogActions, Button, IconButton } from '@material-ui/core';
|
|
4
4
|
import SettingsIcon from '@material-ui/icons/Settings';
|
|
5
|
-
import { InfoCard } from '@backstage/core-components';
|
|
5
|
+
import { HeaderLabel, InfoCard } from '@backstage/core-components';
|
|
6
6
|
import 'react-router';
|
|
7
7
|
|
|
8
8
|
const SettingsModal = ({
|
|
@@ -21,20 +21,75 @@ const SettingsModal = ({
|
|
|
21
21
|
}, "Close")));
|
|
22
22
|
};
|
|
23
23
|
|
|
24
|
+
const timeFormat = {
|
|
25
|
+
hour: "2-digit",
|
|
26
|
+
minute: "2-digit"
|
|
27
|
+
};
|
|
28
|
+
function getTimes(clockConfigs) {
|
|
29
|
+
const d = new Date();
|
|
30
|
+
const lang = window.navigator.language;
|
|
31
|
+
const clocks = [];
|
|
32
|
+
if (!clockConfigs) {
|
|
33
|
+
return clocks;
|
|
34
|
+
}
|
|
35
|
+
for (const clockConfig of clockConfigs) {
|
|
36
|
+
let label = clockConfig.label;
|
|
37
|
+
const options = {
|
|
38
|
+
timeZone: clockConfig.timeZone,
|
|
39
|
+
...timeFormat
|
|
40
|
+
};
|
|
41
|
+
try {
|
|
42
|
+
new Date().toLocaleString(lang, options);
|
|
43
|
+
} catch (e) {
|
|
44
|
+
console.warn(`The timezone ${options.timeZone} is invalid. Defaulting to GMT`);
|
|
45
|
+
options.timeZone = "GMT";
|
|
46
|
+
label = "GMT";
|
|
47
|
+
}
|
|
48
|
+
const time = d.toLocaleTimeString(lang, options);
|
|
49
|
+
clocks.push({ time, label });
|
|
50
|
+
}
|
|
51
|
+
return clocks;
|
|
52
|
+
}
|
|
53
|
+
const HeaderWorldClock = ({
|
|
54
|
+
clockConfigs
|
|
55
|
+
}) => {
|
|
56
|
+
const defaultTimes = [];
|
|
57
|
+
const [clocks, setTimes] = React.useState(defaultTimes);
|
|
58
|
+
React.useEffect(() => {
|
|
59
|
+
setTimes(getTimes(clockConfigs));
|
|
60
|
+
const intervalId = setInterval(() => {
|
|
61
|
+
setTimes(getTimes(clockConfigs));
|
|
62
|
+
}, 1e3);
|
|
63
|
+
return () => {
|
|
64
|
+
clearInterval(intervalId);
|
|
65
|
+
};
|
|
66
|
+
}, [clockConfigs]);
|
|
67
|
+
if (clocks.length !== 0) {
|
|
68
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, clocks.map((clock) => /* @__PURE__ */ React.createElement(HeaderLabel, {
|
|
69
|
+
label: clock.label,
|
|
70
|
+
value: clock.time,
|
|
71
|
+
key: clock.label
|
|
72
|
+
})));
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
};
|
|
76
|
+
|
|
24
77
|
function createCardExtension({
|
|
25
78
|
title,
|
|
26
|
-
components
|
|
79
|
+
components,
|
|
80
|
+
name
|
|
27
81
|
}) {
|
|
28
82
|
return createReactExtension({
|
|
83
|
+
name,
|
|
29
84
|
component: {
|
|
30
|
-
lazy: () => components().then(({Content, Actions, Settings, ContextProvider}) => {
|
|
85
|
+
lazy: () => components().then(({ Content, Actions, Settings, ContextProvider }) => {
|
|
31
86
|
const CardExtension = ({
|
|
32
87
|
Renderer,
|
|
33
88
|
title: overrideTitle,
|
|
34
89
|
...childProps
|
|
35
90
|
}) => {
|
|
36
91
|
const app = useApp();
|
|
37
|
-
const {Progress} = app.getComponents();
|
|
92
|
+
const { Progress } = app.getComponents();
|
|
38
93
|
const [settingsOpen, setSettingsOpen] = React.useState(false);
|
|
39
94
|
if (Renderer) {
|
|
40
95
|
return /* @__PURE__ */ React.createElement(Suspense, {
|
|
@@ -43,9 +98,9 @@ function createCardExtension({
|
|
|
43
98
|
title: overrideTitle || title,
|
|
44
99
|
...{
|
|
45
100
|
Content,
|
|
46
|
-
...Actions ? {Actions} : {},
|
|
47
|
-
...Settings ? {Settings} : {},
|
|
48
|
-
...ContextProvider ? {ContextProvider} : {},
|
|
101
|
+
...Actions ? { Actions } : {},
|
|
102
|
+
...Settings ? { Settings } : {},
|
|
103
|
+
...ContextProvider ? { ContextProvider } : {},
|
|
49
104
|
...childProps
|
|
50
105
|
}
|
|
51
106
|
}));
|
|
@@ -81,7 +136,7 @@ function createCardExtension({
|
|
|
81
136
|
}
|
|
82
137
|
|
|
83
138
|
const rootRouteRef = createRouteRef({
|
|
84
|
-
|
|
139
|
+
id: "home"
|
|
85
140
|
});
|
|
86
141
|
|
|
87
142
|
const homePlugin = createPlugin({
|
|
@@ -92,31 +147,38 @@ const homePlugin = createPlugin({
|
|
|
92
147
|
});
|
|
93
148
|
const HomepageCompositionRoot = homePlugin.provide(createRoutableExtension({
|
|
94
149
|
name: "HomepageCompositionRoot",
|
|
95
|
-
component: () => import('./esm/index-
|
|
150
|
+
component: () => import('./esm/index-05c74847.esm.js').then((m) => m.HomepageCompositionRoot),
|
|
96
151
|
mountPoint: rootRouteRef
|
|
97
152
|
}));
|
|
98
153
|
const ComponentAccordion = homePlugin.provide(createComponentExtension({
|
|
99
154
|
name: "ComponentAccordion",
|
|
100
155
|
component: {
|
|
101
|
-
lazy: () => import('./esm/index-
|
|
156
|
+
lazy: () => import('./esm/index-8ff3197b.esm.js').then((m) => m.ComponentAccordion)
|
|
102
157
|
}
|
|
103
158
|
}));
|
|
104
159
|
const ComponentTabs = homePlugin.provide(createComponentExtension({
|
|
105
160
|
name: "ComponentTabs",
|
|
106
161
|
component: {
|
|
107
|
-
lazy: () => import('./esm/index-
|
|
162
|
+
lazy: () => import('./esm/index-8ff3197b.esm.js').then((m) => m.ComponentTabs)
|
|
108
163
|
}
|
|
109
164
|
}));
|
|
110
165
|
const ComponentTab = homePlugin.provide(createComponentExtension({
|
|
111
166
|
name: "ComponentTab",
|
|
112
167
|
component: {
|
|
113
|
-
lazy: () => import('./esm/index-
|
|
168
|
+
lazy: () => import('./esm/index-8ff3197b.esm.js').then((m) => m.ComponentTab)
|
|
169
|
+
}
|
|
170
|
+
}));
|
|
171
|
+
const WelcomeTitle = homePlugin.provide(createComponentExtension({
|
|
172
|
+
name: "WelcomeTitle",
|
|
173
|
+
component: {
|
|
174
|
+
lazy: () => import('./esm/index-20e36a68.esm.js').then((m) => m.WelcomeTitle)
|
|
114
175
|
}
|
|
115
176
|
}));
|
|
116
177
|
const HomePageRandomJoke = homePlugin.provide(createCardExtension({
|
|
178
|
+
name: "HomePageRandomJoke",
|
|
117
179
|
title: "Random Joke",
|
|
118
|
-
components: () => import('./esm/index-
|
|
180
|
+
components: () => import('./esm/index-22929ade.esm.js')
|
|
119
181
|
}));
|
|
120
182
|
|
|
121
|
-
export { ComponentAccordion, ComponentTab, ComponentTabs, HomePageRandomJoke, HomepageCompositionRoot, SettingsModal, createCardExtension, homePlugin };
|
|
183
|
+
export { ComponentAccordion, ComponentTab, ComponentTabs, HeaderWorldClock, HomePageRandomJoke, HomepageCompositionRoot, SettingsModal, WelcomeTitle, createCardExtension, homePlugin };
|
|
122
184
|
//# sourceMappingURL=index.esm.js.map
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/components/SettingsModal.tsx","../src/extensions.tsx","../src/routes.ts","../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n} from '@material-ui/core';\n\nexport const SettingsModal = ({\n open,\n close,\n componentName,\n children,\n}: {\n open: boolean;\n close: Function;\n componentName: string;\n children: JSX.Element;\n}) => {\n return (\n <Dialog open={open} onClose={() => close()}>\n <DialogTitle>Settings - {componentName}</DialogTitle>\n <DialogContent>{children}</DialogContent>\n <DialogActions>\n <Button onClick={() => close()} color=\"primary\" variant=\"contained\">\n Close\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { Suspense } from 'react';\nimport { IconButton } from '@material-ui/core';\nimport SettingsIcon from '@material-ui/icons/Settings';\nimport { InfoCard } from '@backstage/core-components';\nimport { SettingsModal } from './components';\nimport { createReactExtension, useApp } from '@backstage/core-plugin-api';\n\nexport type ComponentRenderer = {\n Renderer?: (props: RendererProps) => JSX.Element;\n};\n\ntype ComponentParts = {\n Content: () => JSX.Element;\n Actions?: () => JSX.Element;\n Settings?: () => JSX.Element;\n ContextProvider?: (props: any) => JSX.Element;\n};\n\ntype RendererProps = { title: string } & ComponentParts;\n\nexport function createCardExtension<T>({\n title,\n components,\n}: {\n title: string;\n components: () => Promise<ComponentParts>;\n}) {\n return createReactExtension({\n component: {\n lazy: () =>\n components().then(({ Content, Actions, Settings, ContextProvider }) => {\n const CardExtension = ({\n Renderer,\n title: overrideTitle,\n ...childProps\n }: ComponentRenderer & { title?: string } & T) => {\n const app = useApp();\n const { Progress } = app.getComponents();\n const [settingsOpen, setSettingsOpen] = React.useState(false);\n\n if (Renderer) {\n return (\n <Suspense fallback={<Progress />}>\n <Renderer\n title={overrideTitle || title}\n {...{\n Content,\n ...(Actions ? { Actions } : {}),\n ...(Settings ? { Settings } : {}),\n ...(ContextProvider ? { ContextProvider } : {}),\n ...childProps,\n }}\n />\n </Suspense>\n );\n }\n\n const cardProps = {\n title: overrideTitle ?? title,\n ...(Settings\n ? {\n action: (\n <IconButton onClick={() => setSettingsOpen(true)}>\n <SettingsIcon>Settings</SettingsIcon>\n </IconButton>\n ),\n }\n : {}),\n ...(Actions\n ? {\n actions: <Actions />,\n }\n : {}),\n };\n\n const innerContent = (\n <InfoCard {...cardProps}>\n {Settings && (\n <SettingsModal\n open={settingsOpen}\n componentName={title}\n close={() => setSettingsOpen(false)}\n >\n <Settings />\n </SettingsModal>\n )}\n <Content />\n </InfoCard>\n );\n\n return (\n <Suspense fallback={<Progress />}>\n {ContextProvider ? (\n <ContextProvider {...childProps}>\n {innerContent}\n </ContextProvider>\n ) : (\n innerContent\n )}\n </Suspense>\n );\n };\n return CardExtension;\n }),\n },\n });\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { createRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n title: 'home',\n});\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n createComponentExtension,\n createPlugin,\n createRoutableExtension,\n} from '@backstage/core-plugin-api';\nimport { createCardExtension } from './extensions';\n\nimport { rootRouteRef } from './routes';\n\nexport const homePlugin = createPlugin({\n id: 'home',\n routes: {\n root: rootRouteRef,\n },\n});\n\nexport const HomepageCompositionRoot = homePlugin.provide(\n createRoutableExtension({\n name: 'HomepageCompositionRoot',\n component: () =>\n import('./components').then(m => m.HomepageCompositionRoot),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ComponentAccordion = homePlugin.provide(\n createComponentExtension({\n name: 'ComponentAccordion',\n component: {\n lazy: () =>\n import('./componentRenderers').then(m => m.ComponentAccordion),\n },\n }),\n);\nexport const ComponentTabs = homePlugin.provide(\n createComponentExtension({\n name: 'ComponentTabs',\n component: {\n lazy: () => import('./componentRenderers').then(m => m.ComponentTabs),\n },\n }),\n);\nexport const ComponentTab = homePlugin.provide(\n createComponentExtension({\n name: 'ComponentTab',\n component: {\n lazy: () => import('./componentRenderers').then(m => m.ComponentTab),\n },\n }),\n);\n\nexport const HomePageRandomJoke = homePlugin.provide(\n createCardExtension<{ defaultCategory?: 'any' | 'programming' }>({\n title: 'Random Joke',\n components: () => import('./homePageComponents/RandomJoke'),\n }),\n);\n"],"names":[],"mappings":";;;;;;;MAyBa,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,MAMI;AACJ,6CACG,QAAD;AAAA,IAAQ;AAAA,IAAY,SAAS,MAAM;AAAA,yCAChC,aAAD,MAAa,eAAY,oDACxB,eAAD,MAAgB,+CACf,eAAD,0CACG,QAAD;AAAA,IAAQ,SAAS,MAAM;AAAA,IAAS,OAAM;AAAA,IAAU,SAAQ;AAAA,KAAY;AAAA;;6BCLrC;AAAA,EACrC;AAAA,EACA;AAAA,GAIC;AACD,SAAO,qBAAqB;AAAA,IAC1B,WAAW;AAAA,MACT,MAAM,MACJ,aAAa,KAAK,CAAC,CAAE,SAAS,SAAS,UAAU,qBAAsB;AACrE,cAAM,gBAAgB,CAAC;AAAA,UACrB;AAAA,UACA,OAAO;AAAA,aACJ;AAAA,cAC6C;AAChD,gBAAM,MAAM;AACZ,gBAAM,CAAE,YAAa,IAAI;AACzB,gBAAM,CAAC,cAAc,mBAAmB,MAAM,SAAS;AAEvD,cAAI,UAAU;AACZ,uDACG,UAAD;AAAA,cAAU,8CAAW,UAAD;AAAA,mDACjB,UAAD;AAAA,cACE,OAAO,iBAAiB;AAAA,iBACpB;AAAA,gBACF;AAAA,mBACI,UAAU,CAAE,WAAY;AAAA,mBACxB,WAAW,CAAE,YAAa;AAAA,mBAC1B,kBAAkB,CAAE,mBAAoB;AAAA,mBACzC;AAAA;AAAA;AAAA;AAOb,gBAAM,YAAY;AAAA,YAChB,OAAO,wCAAiB;AAAA,eACpB,WACA;AAAA,cACE,4CACG,YAAD;AAAA,gBAAY,SAAS,MAAM,gBAAgB;AAAA,qDACxC,cAAD,MAAc;AAAA,gBAIpB;AAAA,eACA,UACA;AAAA,cACE,6CAAU,SAAD;AAAA,gBAEX;AAAA;AAGN,gBAAM,mDACH,UAAD;AAAA,eAAc;AAAA,aACX,gDACE,eAAD;AAAA,YACE,MAAM;AAAA,YACN,eAAe;AAAA,YACf,OAAO,MAAM,gBAAgB;AAAA,iDAE5B,UAAD,4CAGH,SAAD;AAIJ,qDACG,UAAD;AAAA,YAAU,8CAAW,UAAD;AAAA,aACjB,sDACE,iBAAD;AAAA,eAAqB;AAAA,aAClB,gBAGH;AAAA;AAKR,eAAO;AAAA;AAAA;AAAA;AAAA;;MCrGJ,eAAe,eAAe;AAAA,EACzC,OAAO;AAAA;;MCMI,aAAa,aAAa;AAAA,EACrC,IAAI;AAAA,EACJ,QAAQ;AAAA,IACN,MAAM;AAAA;AAAA;MAIG,0BAA0B,WAAW,QAChD,wBAAwB;AAAA,EACtB,MAAM;AAAA,EACN,WAAW,MACF,sCAAgB,KAAK,OAAK,EAAE;AAAA,EACrC,YAAY;AAAA;MAIH,qBAAqB,WAAW,QAC3C,yBAAyB;AAAA,EACvB,MAAM;AAAA,EACN,WAAW;AAAA,IACT,MAAM,MACG,sCAAwB,KAAK,OAAK,EAAE;AAAA;AAAA;MAItC,gBAAgB,WAAW,QACtC,yBAAyB;AAAA,EACvB,MAAM;AAAA,EACN,WAAW;AAAA,IACT,MAAM,MAAa,sCAAwB,KAAK,OAAK,EAAE;AAAA;AAAA;MAIhD,eAAe,WAAW,QACrC,yBAAyB;AAAA,EACvB,MAAM;AAAA,EACN,WAAW;AAAA,IACT,MAAM,MAAa,sCAAwB,KAAK,OAAK,EAAE;AAAA;AAAA;MAKhD,qBAAqB,WAAW,QAC3C,oBAAiE;AAAA,EAC/D,OAAO;AAAA,EACP,YAAY,MAAa;AAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/components/SettingsModal.tsx","../src/components/HeaderWorldClock/HeaderWorldClock.tsx","../src/extensions.tsx","../src/routes.ts","../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n} from '@material-ui/core';\n\nexport const SettingsModal = ({\n open,\n close,\n componentName,\n children,\n}: {\n open: boolean;\n close: Function;\n componentName: string;\n children: JSX.Element;\n}) => {\n return (\n <Dialog open={open} onClose={() => close()}>\n <DialogTitle>Settings - {componentName}</DialogTitle>\n <DialogContent>{children}</DialogContent>\n <DialogActions>\n <Button onClick={() => close()} color=\"primary\" variant=\"contained\">\n Close\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { HeaderLabel } from '@backstage/core-components';\n\nconst timeFormat: Intl.DateTimeFormatOptions = {\n hour: '2-digit',\n minute: '2-digit',\n};\n\ntype TimeObj = {\n time: string;\n label: string;\n};\n\nexport type ClockConfig = {\n label: string;\n timeZone: string;\n};\n\nfunction getTimes(clockConfigs: ClockConfig[]) {\n const d = new Date();\n const lang = window.navigator.language;\n\n const clocks: TimeObj[] = [];\n\n if (!clockConfigs) {\n return clocks;\n }\n\n for (const clockConfig of clockConfigs) {\n let label = clockConfig.label;\n\n const options: Intl.DateTimeFormatOptions = {\n timeZone: clockConfig.timeZone,\n ...timeFormat,\n };\n\n try {\n new Date().toLocaleString(lang, options);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\n `The timezone ${options.timeZone} is invalid. Defaulting to GMT`,\n );\n options.timeZone = 'GMT';\n label = 'GMT';\n }\n\n const time = d.toLocaleTimeString(lang, options);\n clocks.push({ time, label });\n }\n\n return clocks;\n}\n\nexport const HeaderWorldClock = ({\n clockConfigs,\n}: {\n clockConfigs: ClockConfig[];\n}) => {\n const defaultTimes: TimeObj[] = [];\n const [clocks, setTimes] = React.useState(defaultTimes);\n\n React.useEffect(() => {\n setTimes(getTimes(clockConfigs));\n\n const intervalId = setInterval(() => {\n setTimes(getTimes(clockConfigs));\n }, 1000);\n\n return () => {\n clearInterval(intervalId);\n };\n }, [clockConfigs]);\n\n if (clocks.length !== 0) {\n return (\n <>\n {clocks.map(clock => (\n <HeaderLabel\n label={clock.label}\n value={clock.time}\n key={clock.label}\n />\n ))}\n </>\n );\n }\n return null;\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { Suspense } from 'react';\nimport { IconButton } from '@material-ui/core';\nimport SettingsIcon from '@material-ui/icons/Settings';\nimport { InfoCard } from '@backstage/core-components';\nimport { SettingsModal } from './components';\nimport { createReactExtension, useApp } from '@backstage/core-plugin-api';\n\nexport type ComponentRenderer = {\n Renderer?: (props: RendererProps) => JSX.Element;\n};\n\ntype ComponentParts = {\n Content: () => JSX.Element;\n Actions?: () => JSX.Element;\n Settings?: () => JSX.Element;\n ContextProvider?: (props: any) => JSX.Element;\n};\n\ntype RendererProps = { title: string } & ComponentParts;\n\nexport function createCardExtension<T>({\n title,\n components,\n name,\n}: {\n title: string;\n components: () => Promise<ComponentParts>;\n name?: string;\n}) {\n return createReactExtension({\n name,\n component: {\n lazy: () =>\n components().then(({ Content, Actions, Settings, ContextProvider }) => {\n const CardExtension = ({\n Renderer,\n title: overrideTitle,\n ...childProps\n }: ComponentRenderer & { title?: string } & T) => {\n const app = useApp();\n const { Progress } = app.getComponents();\n const [settingsOpen, setSettingsOpen] = React.useState(false);\n\n if (Renderer) {\n return (\n <Suspense fallback={<Progress />}>\n <Renderer\n title={overrideTitle || title}\n {...{\n Content,\n ...(Actions ? { Actions } : {}),\n ...(Settings ? { Settings } : {}),\n ...(ContextProvider ? { ContextProvider } : {}),\n ...childProps,\n }}\n />\n </Suspense>\n );\n }\n\n const cardProps = {\n title: overrideTitle ?? title,\n ...(Settings\n ? {\n action: (\n <IconButton onClick={() => setSettingsOpen(true)}>\n <SettingsIcon>Settings</SettingsIcon>\n </IconButton>\n ),\n }\n : {}),\n ...(Actions\n ? {\n actions: <Actions />,\n }\n : {}),\n };\n\n const innerContent = (\n <InfoCard {...cardProps}>\n {Settings && (\n <SettingsModal\n open={settingsOpen}\n componentName={title}\n close={() => setSettingsOpen(false)}\n >\n <Settings />\n </SettingsModal>\n )}\n <Content />\n </InfoCard>\n );\n\n return (\n <Suspense fallback={<Progress />}>\n {ContextProvider ? (\n <ContextProvider {...childProps}>\n {innerContent}\n </ContextProvider>\n ) : (\n innerContent\n )}\n </Suspense>\n );\n };\n return CardExtension;\n }),\n },\n });\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { createRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'home',\n});\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n createComponentExtension,\n createPlugin,\n createRoutableExtension,\n} from '@backstage/core-plugin-api';\nimport { createCardExtension } from './extensions';\n\nimport { rootRouteRef } from './routes';\n\nexport const homePlugin = createPlugin({\n id: 'home',\n routes: {\n root: rootRouteRef,\n },\n});\n\nexport const HomepageCompositionRoot = homePlugin.provide(\n createRoutableExtension({\n name: 'HomepageCompositionRoot',\n component: () =>\n import('./components').then(m => m.HomepageCompositionRoot),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ComponentAccordion = homePlugin.provide(\n createComponentExtension({\n name: 'ComponentAccordion',\n component: {\n lazy: () =>\n import('./componentRenderers').then(m => m.ComponentAccordion),\n },\n }),\n);\nexport const ComponentTabs = homePlugin.provide(\n createComponentExtension({\n name: 'ComponentTabs',\n component: {\n lazy: () => import('./componentRenderers').then(m => m.ComponentTabs),\n },\n }),\n);\nexport const ComponentTab = homePlugin.provide(\n createComponentExtension({\n name: 'ComponentTab',\n component: {\n lazy: () => import('./componentRenderers').then(m => m.ComponentTab),\n },\n }),\n);\n\n/**\n * A component to display a playful greeting for the user.\n *\n * @public\n */\nexport const WelcomeTitle = homePlugin.provide(\n createComponentExtension({\n name: 'WelcomeTitle',\n component: {\n lazy: () =>\n import('./homePageComponents/WelcomeTitle').then(m => m.WelcomeTitle),\n },\n }),\n);\n\nexport const HomePageRandomJoke = homePlugin.provide(\n createCardExtension<{ defaultCategory?: 'any' | 'programming' }>({\n name: 'HomePageRandomJoke',\n title: 'Random Joke',\n components: () => import('./homePageComponents/RandomJoke'),\n }),\n);\n"],"names":[],"mappings":";;;;;;;MAyBa,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,MAMI;AACJ,6CACG,QAAD;AAAA,IAAQ;AAAA,IAAY,SAAS,MAAM;AAAA,yCAChC,aAAD,MAAa,eAAY,oDACxB,eAAD,MAAgB,+CACf,eAAD,0CACG,QAAD;AAAA,IAAQ,SAAS,MAAM;AAAA,IAAS,OAAM;AAAA,IAAU,SAAQ;AAAA,KAAY;AAAA;;ACtB5E,MAAM,aAAyC;AAAA,EAC7C,MAAM;AAAA,EACN,QAAQ;AAAA;AAaV,kBAAkB,cAA6B;AAC7C,QAAM,IAAI,IAAI;AACd,QAAM,OAAO,OAAO,UAAU;AAE9B,QAAM,SAAoB;AAE1B,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA;AAGT,aAAW,eAAe,cAAc;AACtC,QAAI,QAAQ,YAAY;AAExB,UAAM,UAAsC;AAAA,MAC1C,UAAU,YAAY;AAAA,SACnB;AAAA;AAGL,QAAI;AACF,UAAI,OAAO,eAAe,MAAM;AAAA,aACzB,GAAP;AAEA,cAAQ,KACN,gBAAgB,QAAQ;AAE1B,cAAQ,WAAW;AACnB,cAAQ;AAAA;AAGV,UAAM,OAAO,EAAE,mBAAmB,MAAM;AACxC,WAAO,KAAK,EAAE,MAAM;AAAA;AAGtB,SAAO;AAAA;MAGI,mBAAmB,CAAC;AAAA,EAC/B;AAAA,MAGI;AACJ,QAAM,eAA0B;AAChC,QAAM,CAAC,QAAQ,YAAY,MAAM,SAAS;AAE1C,QAAM,UAAU,MAAM;AACpB,aAAS,SAAS;AAElB,UAAM,aAAa,YAAY,MAAM;AACnC,eAAS,SAAS;AAAA,OACjB;AAEH,WAAO,MAAM;AACX,oBAAc;AAAA;AAAA,KAEf,CAAC;AAEJ,MAAI,OAAO,WAAW,GAAG;AACvB,qEAEK,OAAO,IAAI,+CACT,aAAD;AAAA,MACE,OAAO,MAAM;AAAA,MACb,OAAO,MAAM;AAAA,MACb,KAAK,MAAM;AAAA;AAAA;AAMrB,SAAO;AAAA;;6BCnE8B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,GAKC;AACD,SAAO,qBAAqB;AAAA,IAC1B;AAAA,IACA,WAAW;AAAA,MACT,MAAM,MACJ,aAAa,KAAK,CAAC,EAAE,SAAS,SAAS,UAAU,sBAAsB;AACrE,cAAM,gBAAgB,CAAC;AAAA,UACrB;AAAA,UACA,OAAO;AAAA,aACJ;AAAA,cAC6C;AAChD,gBAAM,MAAM;AACZ,gBAAM,EAAE,aAAa,IAAI;AACzB,gBAAM,CAAC,cAAc,mBAAmB,MAAM,SAAS;AAEvD,cAAI,UAAU;AACZ,uDACG,UAAD;AAAA,cAAU,8CAAW,UAAD;AAAA,mDACjB,UAAD;AAAA,cACE,OAAO,iBAAiB;AAAA,iBACpB;AAAA,gBACF;AAAA,mBACI,UAAU,EAAE,YAAY;AAAA,mBACxB,WAAW,EAAE,aAAa;AAAA,mBAC1B,kBAAkB,EAAE,oBAAoB;AAAA,mBACzC;AAAA;AAAA;AAAA;AAOb,gBAAM,YAAY;AAAA,YAChB,OAAO,wCAAiB;AAAA,eACpB,WACA;AAAA,cACE,4CACG,YAAD;AAAA,gBAAY,SAAS,MAAM,gBAAgB;AAAA,qDACxC,cAAD,MAAc;AAAA,gBAIpB;AAAA,eACA,UACA;AAAA,cACE,6CAAU,SAAD;AAAA,gBAEX;AAAA;AAGN,gBAAM,mDACH,UAAD;AAAA,eAAc;AAAA,aACX,gDACE,eAAD;AAAA,YACE,MAAM;AAAA,YACN,eAAe;AAAA,YACf,OAAO,MAAM,gBAAgB;AAAA,iDAE5B,UAAD,4CAGH,SAAD;AAIJ,qDACG,UAAD;AAAA,YAAU,8CAAW,UAAD;AAAA,aACjB,sDACE,iBAAD;AAAA,eAAqB;AAAA,aAClB,gBAGH;AAAA;AAKR,eAAO;AAAA;AAAA;AAAA;AAAA;;MCxGJ,eAAe,eAAe;AAAA,EACzC,IAAI;AAAA;;MCMO,aAAa,aAAa;AAAA,EACrC,IAAI;AAAA,EACJ,QAAQ;AAAA,IACN,MAAM;AAAA;AAAA;MAIG,0BAA0B,WAAW,QAChD,wBAAwB;AAAA,EACtB,MAAM;AAAA,EACN,WAAW,MACT,OAAO,+BAAgB,KAAK,OAAK,EAAE;AAAA,EACrC,YAAY;AAAA;MAIH,qBAAqB,WAAW,QAC3C,yBAAyB;AAAA,EACvB,MAAM;AAAA,EACN,WAAW;AAAA,IACT,MAAM,MACJ,OAAO,+BAAwB,KAAK,OAAK,EAAE;AAAA;AAAA;MAItC,gBAAgB,WAAW,QACtC,yBAAyB;AAAA,EACvB,MAAM;AAAA,EACN,WAAW;AAAA,IACT,MAAM,MAAM,OAAO,+BAAwB,KAAK,OAAK,EAAE;AAAA;AAAA;MAIhD,eAAe,WAAW,QACrC,yBAAyB;AAAA,EACvB,MAAM;AAAA,EACN,WAAW;AAAA,IACT,MAAM,MAAM,OAAO,+BAAwB,KAAK,OAAK,EAAE;AAAA;AAAA;MAUhD,eAAe,WAAW,QACrC,yBAAyB;AAAA,EACvB,MAAM;AAAA,EACN,WAAW;AAAA,IACT,MAAM,MACJ,OAAO,+BAAqC,KAAK,OAAK,EAAE;AAAA;AAAA;MAKnD,qBAAqB,WAAW,QAC3C,oBAAiE;AAAA,EAC/D,MAAM;AAAA,EACN,OAAO;AAAA,EACP,YAAY,MAAM,OAAO;AAAA;;;;"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-home",
|
|
3
3
|
"description": "A Backstage plugin that helps you build a home page",
|
|
4
|
-
"version": "0.4.
|
|
4
|
+
"version": "0.4.7",
|
|
5
5
|
"main": "dist/index.esm.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"license": "Apache-2.0",
|
|
@@ -21,34 +21,35 @@
|
|
|
21
21
|
"clean": "backstage-cli clean"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@backstage/core-components": "^0.
|
|
25
|
-
"@backstage/core-plugin-api": "^0.
|
|
26
|
-
"@backstage/theme": "^0.2.
|
|
24
|
+
"@backstage/core-components": "^0.8.0",
|
|
25
|
+
"@backstage/core-plugin-api": "^0.3.0",
|
|
26
|
+
"@backstage/theme": "^0.2.14",
|
|
27
27
|
"@material-ui/core": "^4.12.2",
|
|
28
28
|
"@material-ui/icons": "^4.9.1",
|
|
29
29
|
"@material-ui/lab": "4.0.0-alpha.57",
|
|
30
|
-
"@types/react": "*",
|
|
31
30
|
"lodash": "^4.17.21",
|
|
32
|
-
"react": "^16.13.1",
|
|
33
|
-
"react-dom": "^16.13.1",
|
|
34
31
|
"react-router": "6.0.0-beta.0",
|
|
35
32
|
"react-use": "^17.2.4"
|
|
36
33
|
},
|
|
34
|
+
"peerDependencies": {
|
|
35
|
+
"@types/react": "^16.13.1 || ^17.0.0",
|
|
36
|
+
"react": "^16.13.1 || ^17.0.0"
|
|
37
|
+
},
|
|
37
38
|
"devDependencies": {
|
|
38
|
-
"@backstage/cli": "^0.
|
|
39
|
-
"@backstage/core-app-api": "^0.
|
|
40
|
-
"@backstage/dev-utils": "^0.2.
|
|
41
|
-
"@backstage/test-utils": "^0.1.
|
|
39
|
+
"@backstage/cli": "^0.10.1",
|
|
40
|
+
"@backstage/core-app-api": "^0.2.0",
|
|
41
|
+
"@backstage/dev-utils": "^0.2.14",
|
|
42
|
+
"@backstage/test-utils": "^0.1.24",
|
|
42
43
|
"@testing-library/jest-dom": "^5.10.1",
|
|
43
44
|
"@testing-library/react": "^11.2.5",
|
|
44
45
|
"@testing-library/user-event": "^13.1.8",
|
|
45
46
|
"@types/jest": "^26.0.7",
|
|
46
47
|
"@types/node": "^14.14.32",
|
|
47
48
|
"cross-fetch": "^3.0.6",
|
|
48
|
-
"msw": "^0.
|
|
49
|
+
"msw": "^0.35.0"
|
|
49
50
|
},
|
|
50
51
|
"files": [
|
|
51
52
|
"dist"
|
|
52
53
|
],
|
|
53
|
-
"gitHead": "
|
|
54
|
+
"gitHead": "562be0b43016294e27af3ad024191bb86b13b1c1"
|
|
54
55
|
}
|