@drodil/backstage-plugin-qeta 1.4.1 → 1.5.1

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.
@@ -1,22 +1,22 @@
1
1
  import React, { useEffect } from 'react';
2
- import { Button, Grid, useTheme, Tooltip, IconButton, Typography, Box, Modal, Backdrop, Card, CardContent, Chip, Link, Divider, TextField, Avatar, List, ListSubheader, ListItem, ListItemText, Menu, MenuItem, ListItemIcon } from '@material-ui/core';
3
- import { Content, ContentHeader, InfoCard, MarkdownContent, WarningPanel, Page, Header } from '@backstage/core-components';
2
+ import { Grid, useTheme, Tooltip, IconButton, Typography, Box, Modal, Backdrop, Button, Avatar, Card, CardContent, Divider, TextField, Chip, List, ListSubheader, ListItem, ListItemText, Menu, MenuItem, ListItemIcon } from '@material-ui/core';
3
+ import { Content, ContentHeader, LinkButton, InfoCard, Link, MarkdownContent, WarningPanel, Page, Header } from '@backstage/core-components';
4
4
  import { useParams, useNavigate, Routes, Route } from 'react-router-dom';
5
- import { A as AskForm, q as qetaApiRef, u as useStyles, g as getEntityTitle, a as getEntityUrl, f as formatEntityName, M as MarkdownEditor, b as useQetaApi, Q as QuestionsContainer, c as useIdentityApi } from './index-877b567b.esm.js';
5
+ import { A as AskForm, q as qetaApiRef, u as useBasePath, a as useStyles, f as formatEntityName, T as TagsAndEntities, M as MarkdownEditor, b as useQetaApi, Q as QuestionsContainer, c as useIdentityApi } from './index-fc9b52b6.esm.js';
6
6
  import HomeOutlined from '@material-ui/icons/HomeOutlined';
7
7
  import ArrowDownward from '@material-ui/icons/ArrowDownward';
8
8
  import ArrowUpward from '@material-ui/icons/ArrowUpward';
9
9
  import Check from '@material-ui/icons/Check';
10
10
  import { useApi } from '@backstage/core-plugin-api';
11
- import { catalogApiRef } from '@backstage/plugin-catalog-react';
12
- import { stringifyEntityRef } from '@backstage/catalog-model';
13
- import { compact } from 'lodash';
14
- import RelativeTime from 'react-relative-time';
15
11
  import { Alert, Skeleton } from '@material-ui/lab';
16
12
  import Delete from '@material-ui/icons/Delete';
17
13
  import StarIcon from '@material-ui/icons/Star';
18
14
  import StarOutlineIcon from '@material-ui/icons/StarOutline';
15
+ import RelativeTime from 'react-relative-time';
16
+ import { catalogApiRef } from '@backstage/plugin-catalog-react';
19
17
  import { useForm, Controller } from 'react-hook-form';
18
+ import { RequirePermission } from '@backstage/plugin-permission-react';
19
+ import { qetaCreateAnswerPermission, qetaCreateQuestionPermission } from '@drodil/backstage-plugin-qeta-common';
20
20
  import HelpOutline from '@material-ui/icons/HelpOutline';
21
21
  import LoyaltyOutlined from '@material-ui/icons/LoyaltyOutlined';
22
22
  import Whatshot from '@material-ui/icons/Whatshot';
@@ -26,6 +26,8 @@ import '@backstage/errors';
26
26
  import 'lodash/omitBy';
27
27
  import 'lodash/isEmpty';
28
28
  import 'react-use';
29
+ import 'lodash';
30
+ import '@backstage/catalog-model';
29
31
  import '@material-ui/icons/FilterList';
30
32
  import 'react-mde';
31
33
  import 'react-mde/lib/styles/css/react-mde.css';
@@ -34,7 +36,7 @@ import 'react-mde/lib/styles/css/react-mde-toolbar.css';
34
36
 
35
37
  const AskPage = () => {
36
38
  const { id } = useParams();
37
- return /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(ContentHeader, { title: id ? "Edit question" : "Ask question" }, /* @__PURE__ */ React.createElement(Button, { href: "/qeta", startIcon: /* @__PURE__ */ React.createElement(HomeOutlined, null) }, "Back to questions")), /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 3, direction: "column" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(InfoCard, null, /* @__PURE__ */ React.createElement(AskForm, { id })))));
39
+ return /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(ContentHeader, { title: id ? "Edit question" : "Ask question" }, /* @__PURE__ */ React.createElement(LinkButton, { to: "/qeta", startIcon: /* @__PURE__ */ React.createElement(HomeOutlined, null) }, "Back to questions")), /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 3, direction: "column" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(InfoCard, null, /* @__PURE__ */ React.createElement(AskForm, { id })))));
38
40
  };
39
41
 
40
42
  const VoteButtons = (props) => {
@@ -139,6 +141,7 @@ const VoteButtons = (props) => {
139
141
 
140
142
  const DeleteModal = (props) => {
141
143
  const qetaApi = useApi(qetaApiRef);
144
+ const base_path = useBasePath();
142
145
  const navigate = useNavigate();
143
146
  const { entity, open, question, onClose } = props;
144
147
  const styles = useStyles();
@@ -150,7 +153,7 @@ const DeleteModal = (props) => {
150
153
  qetaApi.deleteQuestion(entity.id).catch((_) => setError(true)).then((ret) => {
151
154
  if (ret) {
152
155
  onClose();
153
- navigate(`/qeta`);
156
+ navigate(`${base_path}/qeta`);
154
157
  } else {
155
158
  setError(true);
156
159
  }
@@ -215,29 +218,35 @@ const FavoriteButton = (props) => {
215
218
  )));
216
219
  };
217
220
 
221
+ const AuthorBox = (props) => {
222
+ var _a;
223
+ const { entity } = props;
224
+ const catalogApi = useApi(catalogApiRef);
225
+ const [user, setUser] = React.useState(null);
226
+ const styles = useStyles();
227
+ useEffect(() => {
228
+ catalogApi.getEntityByRef(entity.author).catch((_) => setUser(null)).then((data) => data ? setUser(data) : setUser(null));
229
+ }, [catalogApi, entity]);
230
+ const name = formatEntityName(entity.author);
231
+ const initials = (name != null ? name : "").split(" ").map((p) => p[0]).join("").substring(0, 2).toUpperCase();
232
+ return /* @__PURE__ */ React.createElement(Box, { className: styles.questionCardAuthor }, /* @__PURE__ */ React.createElement(Grid, { container: true, alignItems: "center" }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12, style: { paddingBottom: 0 } }, /* @__PURE__ */ React.createElement(Typography, { variant: "caption" }, "Posted ", /* @__PURE__ */ React.createElement(RelativeTime, { value: entity.created }))), entity.updated && /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12, style: { paddingBottom: 0, paddingTop: 0 } }, /* @__PURE__ */ React.createElement(Typography, { variant: "caption" }, "Updated ", /* @__PURE__ */ React.createElement(RelativeTime, { value: entity.updated }))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 2 }, /* @__PURE__ */ React.createElement(
233
+ Avatar,
234
+ {
235
+ src: (_a = user == null ? void 0 : user.spec.profile) == null ? void 0 : _a.picture,
236
+ className: "avatar",
237
+ alt: name,
238
+ variant: "rounded"
239
+ },
240
+ initials
241
+ )), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 10, style: { paddingTop: 0 } }, /* @__PURE__ */ React.createElement(Link, { to: `/qeta/users/${entity.author}` }, name))));
242
+ };
243
+
218
244
  const QuestionCard = (props) => {
219
245
  const { question } = props;
220
246
  const styles = useStyles();
221
- const catalogApi = useApi(catalogApiRef);
222
- const [entities, setEntities] = React.useState([]);
223
247
  const [deleteModalOpen, setDeleteModalOpen] = React.useState(false);
224
248
  const handleDeleteModalOpen = () => setDeleteModalOpen(true);
225
249
  const handleDeleteModalClose = () => setDeleteModalOpen(false);
226
- useEffect(() => {
227
- if (question.entities && question.entities.length > 0) {
228
- catalogApi.getEntitiesByRefs({
229
- entityRefs: question.entities,
230
- fields: [
231
- "kind",
232
- "metadata.name",
233
- "metadata.namespace",
234
- "metadata.title"
235
- ]
236
- }).catch((_) => setEntities([])).then(
237
- (data) => data ? setEntities(compact(data.items)) : setEntities([])
238
- );
239
- }
240
- }, [catalogApi, question]);
241
250
  return /* @__PURE__ */ React.createElement(Card, { variant: "outlined" }, /* @__PURE__ */ React.createElement(CardContent, { className: styles.questionCard }, /* @__PURE__ */ React.createElement("div", { className: styles.questionCardVote }, /* @__PURE__ */ React.createElement(VoteButtons, { entity: question }), /* @__PURE__ */ React.createElement(FavoriteButton, { entity: question })), /* @__PURE__ */ React.createElement("div", { className: styles.questionCardContent }, /* @__PURE__ */ React.createElement(Typography, { variant: "body1", gutterBottom: true }, /* @__PURE__ */ React.createElement(
242
251
  MarkdownContent,
243
252
  {
@@ -245,40 +254,19 @@ const QuestionCard = (props) => {
245
254
  dialect: "gfm",
246
255
  className: styles.markdownContent
247
256
  }
248
- )), /* @__PURE__ */ React.createElement(Box, { className: styles.questionCardMetadata }, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 0, justifyContent: "space-around" }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 8 }, question.tags && question.tags.map((tag) => /* @__PURE__ */ React.createElement(
249
- Chip,
257
+ )), /* @__PURE__ */ React.createElement(Box, { className: styles.questionCardMetadata }, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 0 }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(TagsAndEntities, { question }))), /* @__PURE__ */ React.createElement(Grid, { container: true, justifyContent: "space-around" }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 9 }, question.own && /* @__PURE__ */ React.createElement(Box, { className: styles.questionCardActions }, /* @__PURE__ */ React.createElement(
258
+ Link,
250
259
  {
251
- label: tag,
252
- size: "small",
253
- component: "a",
254
- href: `/qeta/tags/${tag}`,
255
- clickable: true
256
- }
257
- )), entities && entities.map((component) => {
258
- var _a, _b;
259
- return /* @__PURE__ */ React.createElement(
260
- Tooltip,
261
- {
262
- title: (_b = (_a = component.metadata.description) == null ? void 0 : _a.slice(0, 50)) != null ? _b : stringifyEntityRef(component),
263
- arrow: true
264
- },
265
- /* @__PURE__ */ React.createElement(
266
- Chip,
267
- {
268
- label: getEntityTitle(component),
269
- size: "small",
270
- variant: "outlined",
271
- component: "a",
272
- href: getEntityUrl(component),
273
- clickable: true
274
- }
275
- )
276
- );
277
- })), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 4, className: styles.questionCardAuthor }, "Asked ", /* @__PURE__ */ React.createElement(RelativeTime, { value: question.created }), " by", " ", /* @__PURE__ */ React.createElement(Link, { href: `/qeta/users/${question.author}` }, formatEntityName(question.author)))), question.own && /* @__PURE__ */ React.createElement(Box, { className: styles.questionCardActions }, /* @__PURE__ */ React.createElement(Link, { underline: "none", href: "#", onClick: handleDeleteModalOpen }, "Delete"), /* @__PURE__ */ React.createElement(
260
+ underline: "none",
261
+ to: "#",
262
+ onClick: handleDeleteModalOpen
263
+ },
264
+ "Delete"
265
+ ), /* @__PURE__ */ React.createElement(
278
266
  Link,
279
267
  {
280
268
  underline: "none",
281
- href: `/qeta/questions/${question.id}/edit`
269
+ to: `/qeta/questions/${question.id}/edit`
282
270
  },
283
271
  "Edit"
284
272
  ), /* @__PURE__ */ React.createElement(
@@ -288,7 +276,7 @@ const QuestionCard = (props) => {
288
276
  onClose: handleDeleteModalClose,
289
277
  entity: question
290
278
  }
291
- ))))));
279
+ ))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 3 }, /* @__PURE__ */ React.createElement(AuthorBox, { entity: question })))))));
292
280
  };
293
281
 
294
282
  const getDefaultValues = (questionId) => {
@@ -344,35 +332,42 @@ const AnswerForm = (props) => {
344
332
  useEffect(() => {
345
333
  reset(values);
346
334
  }, [values, reset]);
347
- return /* @__PURE__ */ React.createElement("form", { onSubmit: handleSubmit(postAnswer) }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6" }, "Your answer"), error && /* @__PURE__ */ React.createElement(WarningPanel, { severity: "error", title: "Could not post answer" }), /* @__PURE__ */ React.createElement(
348
- Controller,
349
- {
350
- control,
351
- defaultValue: "",
352
- rules: {
353
- required: true
354
- },
355
- render: ({ field: { onChange, value } }) => /* @__PURE__ */ React.createElement(
356
- MarkdownEditor,
357
- {
358
- value,
359
- onChange,
360
- height: 200,
361
- error: "answer" in errors
362
- }
363
- ),
364
- name: "answer"
365
- }
366
- ), /* @__PURE__ */ React.createElement(
367
- Button,
335
+ return /* @__PURE__ */ React.createElement(
336
+ RequirePermission,
368
337
  {
369
- variant: "outlined",
370
- type: "submit",
371
- color: "primary",
372
- className: styles.postButton
338
+ permission: qetaCreateAnswerPermission,
339
+ errorPage: /* @__PURE__ */ React.createElement(React.Fragment, null)
373
340
  },
374
- id ? "Save" : "Post"
375
- ));
341
+ /* @__PURE__ */ React.createElement("form", { onSubmit: handleSubmit(postAnswer) }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6" }, "Your answer"), error && /* @__PURE__ */ React.createElement(WarningPanel, { severity: "error", title: "Could not post answer" }), /* @__PURE__ */ React.createElement(
342
+ Controller,
343
+ {
344
+ control,
345
+ defaultValue: "",
346
+ rules: {
347
+ required: true
348
+ },
349
+ render: ({ field: { onChange, value } }) => /* @__PURE__ */ React.createElement(
350
+ MarkdownEditor,
351
+ {
352
+ value,
353
+ onChange,
354
+ height: 200,
355
+ error: "answer" in errors
356
+ }
357
+ ),
358
+ name: "answer"
359
+ }
360
+ ), /* @__PURE__ */ React.createElement(
361
+ Button,
362
+ {
363
+ variant: "outlined",
364
+ type: "submit",
365
+ color: "primary",
366
+ className: styles.postButton
367
+ },
368
+ id ? "Save" : "Post"
369
+ ))
370
+ );
376
371
  };
377
372
 
378
373
  const AnswerCard = (props) => {
@@ -401,11 +396,11 @@ const AnswerCard = (props) => {
401
396
  content: answerEntity.content,
402
397
  dialect: "gfm"
403
398
  }
404
- )), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Typography, { variant: "caption", gutterBottom: true }, "By", " ", /* @__PURE__ */ React.createElement(Link, { href: `/qeta/users/${answerEntity.author}` }, formatEntityName(answerEntity.author)), " ", /* @__PURE__ */ React.createElement(RelativeTime, { value: answerEntity.created }), answerEntity.updated && /* @__PURE__ */ React.createElement(React.Fragment, null, " ", "(updated ", /* @__PURE__ */ React.createElement(RelativeTime, { value: answerEntity.updated }), ")"))), answerEntity.own && /* @__PURE__ */ React.createElement(Box, { className: styles.questionCardActions }, /* @__PURE__ */ React.createElement(
399
+ )), /* @__PURE__ */ React.createElement(Grid, { container: true, justifyContent: "space-around" }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 9 }, answerEntity.own && /* @__PURE__ */ React.createElement(Box, { className: styles.questionCardActions }, /* @__PURE__ */ React.createElement(
405
400
  Link,
406
401
  {
407
402
  underline: "none",
408
- href: "#",
403
+ to: "#",
409
404
  onClick: handleDeleteModalOpen
410
405
  },
411
406
  "Delete"
@@ -413,7 +408,7 @@ const AnswerCard = (props) => {
413
408
  Link,
414
409
  {
415
410
  underline: "none",
416
- href: "#",
411
+ to: "#",
417
412
  onClick: () => setEditMode(true)
418
413
  },
419
414
  "Edit"
@@ -425,7 +420,27 @@ const AnswerCard = (props) => {
425
420
  entity: answerEntity,
426
421
  question
427
422
  }
428
- ))))));
423
+ ))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 3 }, /* @__PURE__ */ React.createElement(AuthorBox, { entity: answerEntity })))))));
424
+ };
425
+
426
+ const AskQuestionButton = () => {
427
+ return /* @__PURE__ */ React.createElement(
428
+ RequirePermission,
429
+ {
430
+ permission: qetaCreateQuestionPermission,
431
+ errorPage: /* @__PURE__ */ React.createElement(React.Fragment, null)
432
+ },
433
+ /* @__PURE__ */ React.createElement(
434
+ LinkButton,
435
+ {
436
+ variant: "contained",
437
+ to: "/qeta/ask",
438
+ color: "primary",
439
+ startIcon: /* @__PURE__ */ React.createElement(HelpOutline, null)
440
+ },
441
+ "Ask question"
442
+ )
443
+ );
429
444
  };
430
445
 
431
446
  const QuestionPage = () => {
@@ -457,24 +472,15 @@ const QuestionPage = () => {
457
472
  description: getDescription(question)
458
473
  },
459
474
  /* @__PURE__ */ React.createElement(
460
- Button,
475
+ LinkButton,
461
476
  {
462
477
  className: styles.marginRight,
463
- href: "/qeta",
478
+ to: "/qeta",
464
479
  startIcon: /* @__PURE__ */ React.createElement(HomeOutlined, null)
465
480
  },
466
481
  "Back to questions"
467
482
  ),
468
- /* @__PURE__ */ React.createElement(
469
- Button,
470
- {
471
- variant: "contained",
472
- href: "/qeta/ask",
473
- color: "primary",
474
- startIcon: /* @__PURE__ */ React.createElement(HelpOutline, null)
475
- },
476
- "Ask question"
477
- )
483
+ /* @__PURE__ */ React.createElement(AskQuestionButton, null)
478
484
  ), /* @__PURE__ */ React.createElement(QuestionCard, { question }), /* @__PURE__ */ React.createElement(Box, { sx: { mt: 3, mb: 2 } }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6" }, question.answersCount + newAnswers.length, " answers")), ((_a = question.answers) != null ? _a : []).concat(newAnswers).map((a) => {
479
485
  return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Divider, { className: styles.questionDivider }), /* @__PURE__ */ React.createElement(Box, { key: a.id, sx: { mb: 1 } }, /* @__PURE__ */ React.createElement(AnswerCard, { answer: a, question })));
480
486
  }), /* @__PURE__ */ React.createElement(Divider, { className: styles.questionDivider }), /* @__PURE__ */ React.createElement(AnswerForm, { question, onPost: onAnswerPost }));
@@ -529,29 +535,21 @@ const TagPage = () => {
529
535
  const { tag } = useParams();
530
536
  const styles = useStyles();
531
537
  return /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(ContentHeader, { title: tag ? `Questions tagged [${tag}]` : "Tags" }, /* @__PURE__ */ React.createElement(
532
- Button,
538
+ LinkButton,
533
539
  {
534
- href: "/qeta",
540
+ to: "/qeta",
535
541
  className: styles.marginRight,
536
542
  startIcon: /* @__PURE__ */ React.createElement(HomeOutlined, null)
537
543
  },
538
544
  "Back to questions"
539
- ), /* @__PURE__ */ React.createElement(
540
- Button,
541
- {
542
- variant: "contained",
543
- href: "/qeta/ask",
544
- startIcon: /* @__PURE__ */ React.createElement(HelpOutline, null)
545
- },
546
- "Ask question"
547
- )), tag ? /* @__PURE__ */ React.createElement(QuestionsContainer, { tags: [tag != null ? tag : ""] }) : /* @__PURE__ */ React.createElement(TagsContainer, null));
545
+ ), /* @__PURE__ */ React.createElement(AskQuestionButton, null)), tag ? /* @__PURE__ */ React.createElement(QuestionsContainer, { tags: [tag != null ? tag : ""] }) : /* @__PURE__ */ React.createElement(TagsContainer, null));
548
546
  };
549
547
 
550
548
  const UserPage = () => {
551
549
  var _a;
552
550
  const identity = (_a = useParams()["*"]) != null ? _a : "unknown";
553
551
  const styles = useStyles();
554
- return /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(ContentHeader, { title: `Questions by ${formatEntityName(identity)}` }, /* @__PURE__ */ React.createElement(Button, { href: "/qeta", className: styles.marginRight }, "Back to questions"), /* @__PURE__ */ React.createElement(Button, { variant: "contained", href: "/qeta/ask" }, "Ask question")), /* @__PURE__ */ React.createElement(QuestionsContainer, { author: identity != null ? identity : "" }));
552
+ return /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(ContentHeader, { title: `Questions by ${formatEntityName(identity)}` }, /* @__PURE__ */ React.createElement(LinkButton, { to: "/qeta", className: styles.marginRight }, "Back to questions"), /* @__PURE__ */ React.createElement(AskQuestionButton, null)), /* @__PURE__ */ React.createElement(QuestionsContainer, { author: identity != null ? identity : "" }));
555
553
  };
556
554
 
557
555
  const QuestionHighlightList = (props) => {
@@ -605,22 +603,14 @@ const QuestionHighlightList = (props) => {
605
603
  const FavoritePage = () => {
606
604
  const styles = useStyles();
607
605
  return /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(ContentHeader, { title: "Your favorite questions" }, /* @__PURE__ */ React.createElement(
608
- Button,
606
+ LinkButton,
609
607
  {
610
- href: "/qeta",
608
+ to: "/qeta",
611
609
  className: styles.marginRight,
612
610
  startIcon: /* @__PURE__ */ React.createElement(HomeOutlined, null)
613
611
  },
614
612
  "Back to questions"
615
- ), /* @__PURE__ */ React.createElement(
616
- Button,
617
- {
618
- variant: "contained",
619
- href: "/qeta/ask",
620
- startIcon: /* @__PURE__ */ React.createElement(HelpOutline, null)
621
- },
622
- "Ask question"
623
- )), /* @__PURE__ */ React.createElement(QuestionsContainer, { favorite: true }));
613
+ ), /* @__PURE__ */ React.createElement(AskQuestionButton, null)), /* @__PURE__ */ React.createElement(QuestionsContainer, { favorite: true }));
624
614
  };
625
615
 
626
616
  const MoreMenu = () => {
@@ -671,16 +661,7 @@ const MoreMenu = () => {
671
661
  ));
672
662
  };
673
663
  const HomePageContent = () => {
674
- return /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 3 }, /* @__PURE__ */ React.createElement(Grid, { item: true, md: 12, lg: 9, xl: 10 }, /* @__PURE__ */ React.createElement(ContentHeader, { title: "All questions" }, /* @__PURE__ */ React.createElement(MoreMenu, null), /* @__PURE__ */ React.createElement(
675
- Button,
676
- {
677
- variant: "contained",
678
- href: "/qeta/ask",
679
- color: "primary",
680
- startIcon: /* @__PURE__ */ React.createElement(HelpOutline, null)
681
- },
682
- "Ask question"
683
- )), /* @__PURE__ */ React.createElement(QuestionsContainer, null)), /* @__PURE__ */ React.createElement(Grid, { item: true, lg: 3, xl: 2 }, /* @__PURE__ */ React.createElement(
664
+ return /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 3 }, /* @__PURE__ */ React.createElement(Grid, { item: true, md: 12, lg: 9, xl: 10 }, /* @__PURE__ */ React.createElement(ContentHeader, { title: "All questions" }, /* @__PURE__ */ React.createElement(MoreMenu, null), /* @__PURE__ */ React.createElement(AskQuestionButton, null)), /* @__PURE__ */ React.createElement(QuestionsContainer, null)), /* @__PURE__ */ React.createElement(Grid, { item: true, lg: 3, xl: 2 }, /* @__PURE__ */ React.createElement(
684
665
  QuestionHighlightList,
685
666
  {
686
667
  type: "hot",
@@ -710,4 +691,4 @@ const HomePage = (props) => {
710
691
  };
711
692
 
712
693
  export { HomePage };
713
- //# sourceMappingURL=index-e6ecdb2f.esm.js.map
694
+ //# sourceMappingURL=index-96a9f259.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-96a9f259.esm.js","sources":["../../src/components/AskPage/AskPage.tsx","../../src/components/QuestionPage/VoteButtons.tsx","../../src/components/DeleteModal/DeleteModal.tsx","../../src/components/QuestionPage/FavoriteButton.tsx","../../src/components/QuestionPage/AuthorBox.tsx","../../src/components/QuestionPage/QuestionCard.tsx","../../src/components/QuestionPage/AnswerForm.tsx","../../src/components/QuestionPage/AnswerCard.tsx","../../src/components/Buttons/AskQuestionButton.tsx","../../src/components/QuestionPage/QuestionPage.tsx","../../src/components/TagPage/TagsContainer.tsx","../../src/components/TagPage/TagPage.tsx","../../src/components/UserPage/UserPage.tsx","../../src/components/QuestionHighlightList/QuestionHighlightList.tsx","../../src/components/FavoritePage/FavoritePage.tsx","../../src/components/HomePage/HomePage.tsx"],"sourcesContent":["import { Content, ContentHeader, InfoCard } from '@backstage/core-components';\nimport { LinkButton } from '@backstage/core-components';\nimport { Grid } from '@material-ui/core';\nimport React from 'react';\n\nimport { AskForm } from '../AskForm/AskForm';\nimport HomeOutlined from '@material-ui/icons/HomeOutlined';\nimport { useParams } from 'react-router-dom';\n\nexport const AskPage = () => {\n const { id } = useParams();\n return (\n <Content>\n <ContentHeader title={id ? 'Edit question' : 'Ask question'}>\n <LinkButton to=\"/qeta\" startIcon={<HomeOutlined />}>\n Back to questions\n </LinkButton>\n </ContentHeader>\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <InfoCard>\n <AskForm id={id} />\n </InfoCard>\n </Grid>\n </Grid>\n </Content>\n );\n};\n","import { AnswerResponse, qetaApiRef, QuestionResponse } from '../../api';\nimport {\n Box,\n IconButton,\n Tooltip,\n Typography,\n useTheme,\n} from '@material-ui/core';\nimport ArrowDownward from '@material-ui/icons/ArrowDownward';\nimport ArrowUpward from '@material-ui/icons/ArrowUpward';\nimport Check from '@material-ui/icons/Check';\nimport React from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\n\nexport const VoteButtons = (props: {\n entity: QuestionResponse | AnswerResponse;\n question?: QuestionResponse;\n}) => {\n const [ownVote, setOwnVote] = React.useState(props.entity.ownVote ?? 0);\n const isCorrectAnswer =\n 'questionId' in props.entity ? props.entity.correct : false;\n const [correct, setCorrect] = React.useState(isCorrectAnswer);\n const [entity, setEntity] = React.useState<QuestionResponse | AnswerResponse>(\n props.entity,\n );\n const qetaApi = useApi(qetaApiRef);\n const theme = useTheme();\n const isQuestion = 'title' in entity;\n const own = props.entity.own ?? false;\n\n const voteUp = () => {\n if (isQuestion) {\n qetaApi.voteQuestionUp(entity.id).then(response => {\n setOwnVote(1);\n setEntity(response);\n });\n } else if ('questionId' in entity) {\n qetaApi.voteAnswerUp(entity.questionId, entity.id).then(response => {\n setOwnVote(1);\n setEntity(response);\n });\n }\n };\n\n const voteDown = () => {\n if (isQuestion) {\n qetaApi.voteQuestionDown(entity.id).then(response => {\n setOwnVote(-1);\n setEntity(response);\n });\n } else if ('questionId' in entity) {\n qetaApi.voteAnswerDown(entity.questionId, entity.id).then(response => {\n setOwnVote(-1);\n setEntity(response);\n });\n }\n };\n\n let correctTooltip = correct\n ? 'Mark answer as incorrect'\n : 'Mark answer as correct';\n if (!props.question?.own) {\n correctTooltip = correct ? 'This answer has been marked as correct' : '';\n }\n\n let voteUpTooltip = isQuestion\n ? 'This question is good'\n : 'This answer is good';\n if (own) {\n voteUpTooltip = isQuestion\n ? 'You cannot vote your own question'\n : 'You cannot vote your own answer';\n }\n\n let voteDownTooltip = isQuestion\n ? 'This question is not good'\n : 'This answer is not good';\n if (own) {\n voteDownTooltip = voteUpTooltip;\n }\n\n const toggleCorrectAnswer = () => {\n if (!('questionId' in entity)) {\n return;\n }\n if (correct) {\n qetaApi\n .markAnswerIncorrect(entity.questionId, entity.id)\n .then(response => {\n if (response) {\n setCorrect(false);\n }\n });\n } else {\n qetaApi.markAnswerCorrect(entity.questionId, entity.id).then(response => {\n setCorrect(response);\n });\n }\n };\n\n return (\n <React.Fragment>\n <Tooltip title={voteUpTooltip}>\n <span>\n <IconButton\n aria-label=\"vote up\"\n color={ownVote > 0 ? 'primary' : 'default'}\n disabled={own}\n size=\"small\"\n onClick={voteUp}\n >\n <ArrowUpward />\n </IconButton>\n </span>\n </Tooltip>\n <Typography variant=\"h6\">{entity.score}</Typography>\n <Tooltip title={voteDownTooltip}>\n <span>\n <IconButton\n aria-label=\"vote down\"\n color={ownVote < 0 ? 'primary' : 'default'}\n disabled={own}\n size=\"small\"\n onClick={voteDown}\n >\n <ArrowDownward />\n </IconButton>\n </span>\n </Tooltip>\n {'correct' in props.entity && (props.question?.own || correct) && (\n <Box>\n <Tooltip title={correctTooltip}>\n <span>\n <IconButton\n aria-label=\"mark correct\"\n style={{\n color: correct ? theme.palette.success.main : undefined,\n }}\n size=\"small\"\n onClick={props.question?.own ? toggleCorrectAnswer : undefined}\n >\n <Check />\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n )}\n </React.Fragment>\n );\n};\n","import { AnswerResponse, qetaApiRef, QuestionResponse } from '../../api';\nimport { Backdrop, Box, Modal, Typography } from '@material-ui/core';\nimport { Button } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport Delete from '@material-ui/icons/Delete';\nimport React from 'react';\nimport { useStyles, useBasePath } from '../../utils/hooks';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useNavigate } from 'react-router-dom';\n\nexport const DeleteModal = (props: {\n entity: QuestionResponse | AnswerResponse;\n open: boolean;\n onClose: () => void;\n question?: QuestionResponse;\n}) => {\n const qetaApi = useApi(qetaApiRef);\n const base_path = useBasePath();\n const navigate = useNavigate();\n const { entity, open, question, onClose } = props;\n const styles = useStyles();\n const [error, setError] = React.useState(false);\n const isQuestion = 'title' in entity;\n\n const title = isQuestion\n ? 'Are you sure you want to delete this question?'\n : 'Are you sure you want to delete this answer?';\n\n const handleDelete = () => {\n if (isQuestion) {\n qetaApi\n .deleteQuestion(entity.id)\n .catch(_ => setError(true))\n .then(ret => {\n if (ret) {\n onClose();\n navigate(`${base_path}/qeta`);\n } else {\n setError(true);\n }\n });\n } else if (question) {\n qetaApi\n .deleteAnswer(question.id, entity.id)\n .catch(_ => setError(true))\n .then(ret => {\n if (ret) {\n onClose();\n window.location.reload();\n } else {\n setError(true);\n }\n });\n }\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n aria-labelledby=\"modal-modal-title\"\n aria-describedby=\"modal-modal-description\"\n closeAfterTransition\n BackdropComponent={Backdrop}\n BackdropProps={{\n timeout: 500,\n }}\n >\n <Box className={styles.deleteModal}>\n {error && <Alert severity=\"error\">Failed to delete</Alert>}\n <Typography id=\"modal-modal-title\" variant=\"h6\" component=\"h2\">\n {title}\n </Typography>\n <Button onClick={handleDelete} startIcon={<Delete />} color=\"secondary\">\n Delete\n </Button>\n <Button onClick={onClose}>Cancel</Button>\n </Box>\n </Modal>\n );\n};\n","import { qetaApiRef, QuestionResponse } from '../../api';\nimport { IconButton, Tooltip } from '@material-ui/core';\nimport React from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport StarIcon from '@material-ui/icons/Star';\nimport StarOutlineIcon from '@material-ui/icons/StarOutline';\n\nexport const FavoriteButton = (props: { entity: QuestionResponse }) => {\n const [entity, setEntity] = React.useState<QuestionResponse>(props.entity);\n const qetaApi = useApi(qetaApiRef);\n\n const favoriteQuestion = () => {\n qetaApi.favoriteQuestion(entity.id).then(response => {\n setEntity(response);\n });\n };\n\n const unfavoriteQuestion = () => {\n qetaApi.unfavoriteQuestion(entity.id).then(response => {\n setEntity(response);\n });\n };\n\n return (\n <React.Fragment>\n {entity.favorite ? (\n <Tooltip title=\"Remove this question from favorites\">\n <IconButton\n aria-label=\"unfavorite\"\n size=\"small\"\n onClick={unfavoriteQuestion}\n >\n <StarIcon />\n </IconButton>\n </Tooltip>\n ) : (\n <Tooltip title=\"Mark this question as favorite\">\n <IconButton\n aria-label=\"favorite\"\n size=\"small\"\n onClick={favoriteQuestion}\n >\n <StarOutlineIcon />\n </IconButton>\n </Tooltip>\n )}\n </React.Fragment>\n );\n};\n","import { Avatar, Box, Grid, Typography } from '@material-ui/core';\nimport { Link } from '@backstage/core-components';\nimport { formatEntityName } from '../../utils/utils';\nimport React, { useEffect } from 'react';\nimport { useStyles } from '../../utils/hooks';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\nimport { AnswerResponse, QuestionResponse } from '../../api';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { UserEntity } from '@backstage/catalog-model';\n\nexport const AuthorBox = (props: {\n entity: QuestionResponse | AnswerResponse;\n}) => {\n const { entity } = props;\n const catalogApi = useApi(catalogApiRef);\n const [user, setUser] = React.useState<UserEntity | null>(null);\n const styles = useStyles();\n useEffect(() => {\n catalogApi\n .getEntityByRef(entity.author)\n .catch(_ => setUser(null))\n .then(data => (data ? setUser(data as UserEntity) : setUser(null)));\n }, [catalogApi, entity]);\n\n const name = formatEntityName(entity.author);\n const initials = (name ?? '')\n .split(' ')\n .map(p => p[0])\n .join('')\n .substring(0, 2)\n .toUpperCase();\n\n return (\n <Box className={styles.questionCardAuthor}>\n <Grid container alignItems=\"center\">\n <Grid item xs={12} style={{ paddingBottom: 0 }}>\n <Typography variant=\"caption\">\n Posted <RelativeTime value={entity.created} />\n </Typography>\n </Grid>\n {entity.updated && (\n <Grid item xs={12} style={{ paddingBottom: 0, paddingTop: 0 }}>\n <Typography variant=\"caption\">\n Updated <RelativeTime value={entity.updated} />\n </Typography>\n </Grid>\n )}\n <Grid item xs={2}>\n <Avatar\n src={user?.spec.profile?.picture}\n className=\"avatar\"\n alt={name}\n variant=\"rounded\"\n >\n {initials}\n </Avatar>\n </Grid>\n <Grid item xs={10} style={{ paddingTop: 0 }}>\n <Link to={`/qeta/users/${entity.author}`}>{name}</Link>\n </Grid>\n </Grid>\n </Box>\n );\n};\n","import { QuestionResponse } from '../../api';\nimport { Box, Card, CardContent, Grid, Typography } from '@material-ui/core';\nimport { Link } from '@backstage/core-components';\nimport React from 'react';\nimport { MarkdownContent } from '@backstage/core-components';\nimport { VoteButtons } from './VoteButtons';\nimport { useStyles } from '../../utils/hooks';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\nimport { DeleteModal } from '../DeleteModal/DeleteModal';\nimport { FavoriteButton } from './FavoriteButton';\nimport { AuthorBox } from './AuthorBox';\nimport { TagsAndEntities } from './TagsAndEntities';\n\nexport const QuestionCard = (props: { question: QuestionResponse }) => {\n const { question } = props;\n const styles = useStyles();\n const [deleteModalOpen, setDeleteModalOpen] = React.useState(false);\n const handleDeleteModalOpen = () => setDeleteModalOpen(true);\n const handleDeleteModalClose = () => setDeleteModalOpen(false);\n\n return (\n <Card variant=\"outlined\">\n <CardContent className={styles.questionCard}>\n <div className={styles.questionCardVote}>\n <VoteButtons entity={question} />\n <FavoriteButton entity={question} />\n </div>\n <div className={styles.questionCardContent}>\n <Typography variant=\"body1\" gutterBottom>\n <MarkdownContent\n content={question.content}\n dialect=\"gfm\"\n className={styles.markdownContent}\n />\n </Typography>\n <Box className={styles.questionCardMetadata}>\n <Grid container spacing={0}>\n <Grid item>\n <TagsAndEntities question={question} />\n </Grid>\n </Grid>\n <Grid container justifyContent=\"space-around\">\n <Grid item xs={9}>\n {question.own && (\n <Box className={styles.questionCardActions}>\n <Link\n underline=\"none\"\n to=\"#\"\n onClick={handleDeleteModalOpen}\n >\n Delete\n </Link>\n <Link\n underline=\"none\"\n to={`/qeta/questions/${question.id}/edit`}\n >\n Edit\n </Link>\n <DeleteModal\n open={deleteModalOpen}\n onClose={handleDeleteModalClose}\n entity={question}\n />\n </Box>\n )}\n </Grid>\n <Grid item xs={3}>\n <AuthorBox entity={question} />\n </Grid>\n </Grid>\n </Box>\n </div>\n </CardContent>\n </Card>\n );\n};\n","import { WarningPanel } from '@backstage/core-components';\nimport { Typography, Button } from '@material-ui/core';\nimport React, { useEffect } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n AnswerRequest,\n AnswerResponse,\n qetaApiRef,\n QuestionResponse,\n} from '../../api';\nimport { useStyles } from '../../utils/hooks';\nimport { Controller, useForm } from 'react-hook-form';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { qetaCreateAnswerPermission } from '@drodil/backstage-plugin-qeta-common';\n\nconst getDefaultValues = (questionId: number) => {\n return { questionId, answer: '' };\n};\n\nexport const AnswerForm = (props: {\n question: QuestionResponse;\n onPost: (answer: AnswerResponse) => void;\n id?: number;\n}) => {\n const { question, onPost, id } = props;\n const [values, setValues] = React.useState(getDefaultValues(question.id));\n const [error, setError] = React.useState(false);\n const qetaApi = useApi(qetaApiRef);\n const styles = useStyles();\n\n const {\n handleSubmit,\n control,\n formState: { errors },\n reset,\n } = useForm<AnswerRequest>({\n values,\n defaultValues: getDefaultValues(question.id),\n });\n\n const postAnswer = (data: AnswerRequest) => {\n if (id) {\n qetaApi\n .updateAnswer(id, { questionId: question.id, answer: data.answer })\n .then(a => {\n if (!a || !('id' in a)) {\n setError(true);\n return;\n }\n reset();\n onPost(a);\n })\n .catch(_e => setError(true));\n return;\n }\n\n qetaApi\n .postAnswer({ questionId: question.id, answer: data.answer })\n .then(a => {\n if (!a || !('id' in a)) {\n setError(true);\n return;\n }\n reset();\n onPost(a);\n })\n .catch(_e => setError(true));\n };\n\n useEffect(() => {\n if (id) {\n qetaApi.getAnswer(question.id, id).then(a => {\n if ('content' in a) {\n setValues({ questionId: question.id, answer: a.content });\n } else {\n setError(true);\n }\n });\n }\n }, [id, question, qetaApi]);\n\n useEffect(() => {\n reset(values);\n }, [values, reset]);\n\n return (\n <RequirePermission\n permission={qetaCreateAnswerPermission}\n errorPage={<></>}\n >\n <form onSubmit={handleSubmit(postAnswer)}>\n <Typography variant=\"h6\">Your answer</Typography>\n {error && (\n <WarningPanel severity=\"error\" title=\"Could not post answer\" />\n )}\n <Controller\n control={control}\n defaultValue=\"\"\n rules={{\n required: true,\n }}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value}\n onChange={onChange}\n height={200}\n error={'answer' in errors}\n />\n )}\n name=\"answer\"\n />\n <Button\n variant=\"outlined\"\n type=\"submit\"\n color=\"primary\"\n className={styles.postButton}\n >\n {id ? 'Save' : 'Post'}\n </Button>\n </form>\n </RequirePermission>\n );\n};\n","import { AnswerResponse, QuestionResponse } from '../../api';\nimport { Box, Card, CardContent, Grid, Typography } from '@material-ui/core';\nimport { Link } from '@backstage/core-components';\nimport React from 'react';\nimport { MarkdownContent } from '@backstage/core-components';\nimport { VoteButtons } from './VoteButtons';\nimport { useStyles } from '../../utils/hooks';\nimport { DeleteModal } from '../DeleteModal/DeleteModal';\nimport { AnswerForm } from './AnswerForm';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\nimport { AuthorBox } from './AuthorBox';\n\nexport const AnswerCard = (props: {\n answer: AnswerResponse;\n question: QuestionResponse;\n}) => {\n const { answer, question } = props;\n const styles = useStyles();\n\n const [editMode, setEditMode] = React.useState(false);\n const [answerEntity, setAnswerEntity] = React.useState(answer);\n\n const [deleteModalOpen, setDeleteModalOpen] = React.useState(false);\n const handleDeleteModalOpen = () => setDeleteModalOpen(true);\n const handleDeleteModalClose = () => setDeleteModalOpen(false);\n\n const onAnswerEdit = (a: AnswerResponse) => {\n setEditMode(false);\n setAnswerEntity(a);\n };\n\n return (\n <Card id={`a${answer.id}`}>\n <CardContent className={styles.questionCard}>\n <div className={styles.questionCardVote}>\n <VoteButtons entity={answerEntity} question={question} />\n </div>\n <div className={styles.questionCardContent}>\n {editMode ? (\n <AnswerForm\n question={question}\n onPost={onAnswerEdit}\n id={answerEntity.id}\n />\n ) : (\n <>\n <Typography variant=\"body1\" gutterBottom>\n <MarkdownContent\n className={styles.markdownContent}\n content={answerEntity.content}\n dialect=\"gfm\"\n />\n </Typography>\n <Grid container justifyContent=\"space-around\">\n <Grid item xs={9}>\n {answerEntity.own && (\n <Box className={styles.questionCardActions}>\n <Link\n underline=\"none\"\n to=\"#\"\n onClick={handleDeleteModalOpen}\n >\n Delete\n </Link>\n <Link\n underline=\"none\"\n to=\"#\"\n onClick={() => setEditMode(true)}\n >\n Edit\n </Link>\n <DeleteModal\n open={deleteModalOpen}\n onClose={handleDeleteModalClose}\n entity={answerEntity}\n question={question}\n />\n </Box>\n )}\n </Grid>\n <Grid item xs={3}>\n <AuthorBox entity={answerEntity} />\n </Grid>\n </Grid>\n </>\n )}\n </div>\n </CardContent>\n </Card>\n );\n};\n","import HelpOutline from '@material-ui/icons/HelpOutline';\nimport React from 'react';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { qetaCreateQuestionPermission } from '@drodil/backstage-plugin-qeta-common';\nimport { LinkButton } from '@backstage/core-components';\n\nexport const AskQuestionButton = () => {\n return (\n <RequirePermission\n permission={qetaCreateQuestionPermission}\n errorPage={<></>}\n >\n <LinkButton\n variant=\"contained\"\n to=\"/qeta/ask\"\n color=\"primary\"\n startIcon={<HelpOutline />}\n >\n Ask question\n </LinkButton>\n </RequirePermission>\n );\n};\n","import React from 'react';\nimport { Box, Divider, Typography } from '@material-ui/core';\nimport { LinkButton } from '@backstage/core-components';\nimport { useParams } from 'react-router-dom';\nimport {\n Content,\n ContentHeader,\n WarningPanel,\n} from '@backstage/core-components';\nimport { useQetaApi, useStyles } from '../../utils/hooks';\nimport { QuestionCard } from './QuestionCard';\nimport { AnswerResponse, QuestionResponse } from '../../api';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\nimport { AnswerForm } from './AnswerForm';\nimport { AnswerCard } from './AnswerCard';\nimport { Skeleton } from '@material-ui/lab';\nimport HomeOutlined from '@material-ui/icons/HomeOutlined';\nimport { AskQuestionButton } from '../Buttons/AskQuestionButton';\n\nexport const QuestionPage = () => {\n const { id } = useParams();\n const styles = useStyles();\n const [newAnswers, setNewAnswers] = React.useState<AnswerResponse[]>([]);\n\n const {\n value: question,\n loading,\n error,\n } = useQetaApi(api => api.getQuestion(id), [id]);\n\n const onAnswerPost = (answer: AnswerResponse) => {\n setNewAnswers(newAnswers.concat([answer]));\n };\n\n const getDescription = (q: QuestionResponse) => {\n return (\n <span>\n Asked{' '}\n <Box fontWeight=\"fontWeightMedium\" display=\"inline\" sx={{ mr: 2 }}>\n <RelativeTime value={q.created} />\n </Box>\n {q.updated && (\n <React.Fragment>\n Updated{' '}\n <Box fontWeight=\"fontWeightMedium\" display=\"inline\" sx={{ mr: 2 }}>\n <RelativeTime value={q.updated} />\n </Box>\n </React.Fragment>\n )}\n Viewed{' '}\n <Box fontWeight=\"fontWeightMedium\" display=\"inline\">\n {q.views} times\n </Box>\n </span>\n );\n };\n\n if (loading) {\n return <Skeleton variant=\"rect\" height={200} />;\n }\n\n if (error || question === undefined) {\n return (\n <WarningPanel severity=\"error\" title=\"Could not load question.\">\n {error?.message}\n </WarningPanel>\n );\n }\n\n return (\n <Content>\n <ContentHeader\n title={question.title}\n // @ts-ignore\n description={getDescription(question)}\n >\n <LinkButton\n className={styles.marginRight}\n to=\"/qeta\"\n startIcon={<HomeOutlined />}\n >\n Back to questions\n </LinkButton>\n <AskQuestionButton />\n </ContentHeader>\n <QuestionCard question={question} />\n <Box sx={{ mt: 3, mb: 2 }}>\n <Typography variant=\"h6\">\n {question.answersCount + newAnswers.length} answers\n </Typography>\n </Box>\n {(question.answers ?? []).concat(newAnswers).map(a => {\n return (\n <>\n <Divider className={styles.questionDivider} />\n <Box key={a.id} sx={{ mb: 1 }}>\n <AnswerCard answer={a} question={question} />\n </Box>\n </>\n );\n })}\n <Divider className={styles.questionDivider} />\n <AnswerForm question={question} onPost={onAnswerPost} />\n </Content>\n );\n};\n","import {\n Avatar,\n Chip,\n Grid,\n IconButton,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport React from 'react';\nimport { useQetaApi } from '../../utils/hooks';\nimport { Skeleton } from '@material-ui/lab';\nimport { WarningPanel } from '@backstage/core-components';\nimport { TagResponse } from '../../api';\n\nexport const TagsContainer = () => {\n const [searchQuery, setSearchQuery] = React.useState('');\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(api => api.getTags(), []);\n\n if (loading) {\n return <Skeleton variant=\"rect\" height={200} />;\n }\n\n if (error || response === undefined) {\n return (\n <WarningPanel severity=\"error\" title=\"Could not load tags.\">\n {error?.message}\n </WarningPanel>\n );\n }\n\n const filterData = (query: string, data: TagResponse[]) => {\n if (!query) {\n return data;\n }\n return data.filter(t => t.tag.toLowerCase().includes(query));\n };\n\n const tags = filterData(searchQuery, response);\n\n return (\n <Grid container>\n <Grid item xs={12}>\n <TextField\n id=\"search-bar\"\n className=\"text\"\n onChange={(\n event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>,\n ) => setSearchQuery(event.target.value)}\n label=\"Search tag\"\n variant=\"outlined\"\n placeholder=\"Search...\"\n size=\"small\"\n />\n <IconButton type=\"submit\" aria-label=\"search\" />\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\">{`Showing ${tags.length} tags`}</Typography>\n </Grid>\n <Grid item>\n {tags.map(tag => (\n <Chip\n key={tag.tag}\n variant=\"outlined\"\n avatar={<Avatar>{tag.questionsCount}</Avatar>}\n label={tag.tag}\n component=\"a\"\n clickable\n href={`/qeta/tags/${tag.tag}`}\n />\n ))}\n </Grid>\n </Grid>\n );\n};\n","import React from 'react';\nimport { LinkButton } from '@backstage/core-components';\nimport { useParams } from 'react-router-dom';\nimport { Content, ContentHeader } from '@backstage/core-components';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\nimport { QuestionsContainer } from '../QuestionsContainer/QuestionsContainer';\nimport { TagsContainer } from './TagsContainer';\nimport HomeOutlined from '@material-ui/icons/HomeOutlined';\nimport { useStyles } from '../../utils/hooks';\nimport { AskQuestionButton } from '../Buttons/AskQuestionButton';\n\nexport const TagPage = () => {\n const { tag } = useParams();\n const styles = useStyles();\n return (\n <Content>\n <ContentHeader title={tag ? `Questions tagged [${tag}]` : 'Tags'}>\n <LinkButton\n to=\"/qeta\"\n className={styles.marginRight}\n startIcon={<HomeOutlined />}\n >\n Back to questions\n </LinkButton>\n <AskQuestionButton />\n </ContentHeader>\n {tag ? <QuestionsContainer tags={[tag ?? '']} /> : <TagsContainer />}\n </Content>\n );\n};\n","import React from 'react';\nimport { LinkButton } from '@backstage/core-components';\nimport { useParams } from 'react-router-dom';\nimport { Content, ContentHeader } from '@backstage/core-components';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\nimport { QuestionsContainer } from '../QuestionsContainer/QuestionsContainer';\nimport { formatEntityName } from '../../utils/utils';\nimport { useStyles } from '../../utils/hooks';\nimport { AskQuestionButton } from '../Buttons/AskQuestionButton';\n\nexport const UserPage = () => {\n const identity = useParams()['*'] ?? 'unknown';\n const styles = useStyles();\n return (\n <Content>\n <ContentHeader title={`Questions by ${formatEntityName(identity)}`}>\n <LinkButton to=\"/qeta\" className={styles.marginRight}>\n Back to questions\n </LinkButton>\n <AskQuestionButton />\n </ContentHeader>\n <QuestionsContainer author={identity ?? ''} />\n </Content>\n );\n};\n","import {\n Box,\n Divider,\n List,\n ListItem,\n ListItemText,\n ListSubheader,\n} from '@material-ui/core';\nimport React from 'react';\nimport { useQetaApi, useStyles } from '../../utils/hooks';\nimport { Skeleton } from '@material-ui/lab';\n\nexport const QuestionHighlightList = (props: {\n type: string;\n title: string;\n noQuestionsLabel: string;\n icon?: JSX.Element;\n}) => {\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(api => api.getQuestionsList(props.type), []);\n const classes = useStyles();\n\n const questions = response?.questions ?? [];\n\n return (\n <Box\n className={classes.questionHighlightList}\n display={{ md: 'none', lg: 'block' }}\n >\n <List\n component=\"nav\"\n aria-labelledby=\"nested-list-subheader\"\n subheader={\n <ListSubheader\n component=\"div\"\n id=\"nested-list-subheader\"\n color=\"primary\"\n >\n {props.title}\n {props.icon}\n </ListSubheader>\n }\n >\n {loading && (\n <ListItem>\n <Skeleton variant=\"rect\" />\n </ListItem>\n )}\n {error && (\n <ListItem>\n <ListItemText>Failed to load questions</ListItemText>\n </ListItem>\n )}\n {!error && questions.length === 0 && (\n <ListItem>\n <ListItemText>{props.noQuestionsLabel}</ListItemText>\n </ListItem>\n )}\n {!error &&\n questions.map(q => (\n <React.Fragment key={q.id}>\n <Divider />\n <ListItem\n button\n dense\n component=\"a\"\n href={`/qeta/questions/${q.id}`}\n >\n <ListItemText>{q.title}</ListItemText>\n </ListItem>\n </React.Fragment>\n ))}\n </List>\n </Box>\n );\n};\n","import React from 'react';\nimport { LinkButton } from '@backstage/core-components';\nimport { Content, ContentHeader } from '@backstage/core-components';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\nimport { QuestionsContainer } from '../QuestionsContainer/QuestionsContainer';\nimport HomeOutlined from '@material-ui/icons/HomeOutlined';\nimport { useStyles } from '../../utils/hooks';\nimport { AskQuestionButton } from '../Buttons/AskQuestionButton';\n\nexport const FavoritePage = () => {\n const styles = useStyles();\n return (\n <Content>\n <ContentHeader title=\"Your favorite questions\">\n <LinkButton\n to=\"/qeta\"\n className={styles.marginRight}\n startIcon={<HomeOutlined />}\n >\n Back to questions\n </LinkButton>\n <AskQuestionButton />\n </ContentHeader>\n <QuestionsContainer favorite />\n </Content>\n );\n};\n","import React from 'react';\nimport {\n Grid,\n IconButton,\n ListItemIcon,\n Menu,\n MenuItem,\n Tooltip,\n} from '@material-ui/core';\nimport {\n Content,\n ContentHeader,\n Header,\n Page,\n} from '@backstage/core-components';\nimport { Route, Routes } from 'react-router-dom';\nimport { AskPage } from '../AskPage';\nimport { QuestionPage } from '../QuestionPage/QuestionPage';\nimport { QuestionsContainer } from '../QuestionsContainer/QuestionsContainer';\nimport { TagPage } from '../TagPage/TagPage';\nimport { UserPage } from '../UserPage/UserPage';\nimport LoyaltyOutlined from '@material-ui/icons/LoyaltyOutlined';\nimport { QuestionHighlightList } from '../QuestionHighlightList/QuestionHighlightList';\nimport { useIdentityApi, useStyles } from '../../utils/hooks';\nimport Whatshot from '@material-ui/icons/Whatshot';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport StarIcon from '@material-ui/icons/Star';\nimport AccountBox from '@material-ui/icons/AccountBox';\nimport { FavoritePage } from '../FavoritePage/FavoritePage';\nimport { AskQuestionButton } from '../Buttons/AskQuestionButton';\n\nconst MoreMenu = () => {\n const [anchorEl, setAnchorEl] = React.useState(null);\n const open = Boolean(anchorEl);\n const styles = useStyles();\n const {\n value: user,\n loading: loadingUser,\n error: userError,\n } = useIdentityApi(api => api.getBackstageIdentity(), []);\n\n const handleMenuOpen = (event: any) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleMenuClose = () => {\n setAnchorEl(null);\n };\n\n return (\n <>\n <Tooltip arrow title=\"More\">\n <IconButton\n aria-label=\"more\"\n aria-controls=\"long-menu\"\n aria-haspopup=\"true\"\n onClick={handleMenuOpen}\n >\n <MoreVertIcon />\n </IconButton>\n </Tooltip>\n <Menu\n id=\"long-menu\"\n anchorEl={anchorEl}\n keepMounted\n open={open}\n getContentAnchorEl={null}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'center',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'center',\n }}\n onClose={handleMenuClose}\n >\n <MenuItem component=\"a\" href=\"/qeta/tags\">\n <ListItemIcon className={styles.menuIcon}>\n <LoyaltyOutlined fontSize=\"small\" />\n </ListItemIcon>\n Tags\n </MenuItem>\n {user && !loadingUser && !userError && (\n <MenuItem component=\"a\" href={`/qeta/users/${user?.userEntityRef}`}>\n <ListItemIcon className={styles.menuIcon}>\n <AccountBox fontSize=\"small\" />\n </ListItemIcon>\n My questions\n </MenuItem>\n )}\n <MenuItem component=\"a\" href=\"/qeta/questions/favorite\">\n <ListItemIcon className={styles.menuIcon}>\n <StarIcon fontSize=\"small\" />\n </ListItemIcon>\n Favorite questions\n </MenuItem>\n </Menu>\n </>\n );\n};\n\nexport const HomePageContent = () => {\n return (\n <Content>\n <Grid container spacing={3}>\n <Grid item md={12} lg={9} xl={10}>\n <ContentHeader title=\"All questions\">\n <MoreMenu />\n <AskQuestionButton />\n </ContentHeader>\n <QuestionsContainer />\n </Grid>\n <Grid item lg={3} xl={2}>\n <QuestionHighlightList\n type=\"hot\"\n title=\"Hot questions\"\n noQuestionsLabel=\"No questions\"\n icon={<Whatshot fontSize=\"small\" />}\n />\n <QuestionHighlightList\n type=\"unanswered\"\n title=\"Unanswered questions\"\n noQuestionsLabel=\"No unanswered questions\"\n />\n <QuestionHighlightList\n type=\"incorrect\"\n title=\"Questions without correct answer\"\n noQuestionsLabel=\"No questions without correct answers\"\n />\n </Grid>\n </Grid>\n </Content>\n );\n};\n\ntype Props = {\n title?: string;\n subtitle?: string;\n headerElements?: JSX.Element[];\n};\n\nexport const HomePage = (props: Props) => (\n <Page themeId=\"tool\">\n <Header title={props.title ?? 'Q&A'} subtitle={props.subtitle}>\n {props.headerElements}\n </Header>\n <Routes>\n <Route path=\"/\" element={<HomePageContent />} />\n <Route path=\"/ask\" element={<AskPage />} />\n <Route path=\"/questions/favorite\" element={<FavoritePage />} />\n <Route path=\"/questions/:id/edit\" element={<AskPage />} />\n <Route path=\"/questions/:id\" element={<QuestionPage />} />\n <Route path=\"/tags\" element={<TagPage />} />\n <Route path=\"/tags/:tag\" element={<TagPage />} />\n <Route path=\"/users/*\" element={<UserPage />} />\n </Routes>\n </Page>\n);\n"],"names":[],"mappings":"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"}