@drodil/backstage-plugin-qeta 2.5.0 → 2.5.2
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/dist/components/AnswersContainer/AnswersContainer.esm.js +0 -1
- package/dist/components/AnswersContainer/AnswersContainer.esm.js.map +1 -1
- package/dist/components/QuestionsContainer/FilterPanel.esm.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/utils/hooks.esm.js +38 -3
- package/dist/utils/hooks.esm.js.map +1 -1
- package/package.json +4 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnswersContainer.esm.js","sources":["../../../src/components/AnswersContainer/AnswersContainer.tsx"],"sourcesContent":["import { useQetaApi } from '../../utils/hooks';\nimport {\n Box,\n Button,\n Collapse,\n Grid,\n TextField,\n Typography,\n} from '@material-ui/core';\n\nimport React, { useEffect } from 'react';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport FilterList from '@material-ui/icons/FilterList';\nimport { useSearchParams } from 'react-router-dom';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport { useAnalytics } from '@backstage/core-plugin-api';\nimport { filterTags } from '@drodil/backstage-plugin-qeta-common';\nimport { getFiltersWithDateRange } from '../../utils/utils';\nimport {\n FilterKey,\n filterKeys,\n FilterPanel,\n Filters,\n} from '../QuestionsContainer/FilterPanel';\nimport { AnswerList } from './AnswerList';\n\nexport interface AnswersContainerProps {\n tags?: string[];\n author?: string;\n entity?: string;\n showFilters?: boolean;\n showTitle?: boolean;\n title?: string;\n}\n\nexport const AnswersContainer = (props: AnswersContainerProps) => {\n const { tags, author, entity, showFilters, showTitle, title } = props;\n const analytics = useAnalytics();\n const [page, setPage] = React.useState(1);\n const [answersPerPage, setAnswersPerPage] = React.useState(10);\n const [showFilterPanel, setShowFilterPanel] = React.useState(false);\n const [searchParams, setSearchParams] = useSearchParams();\n const [searchQuery, setSearchQuery] = React.useState('');\n const [filters, setFilters] = React.useState<Filters>({\n order: 'desc',\n orderBy: 'created',\n searchQuery: '',\n dateRange: '',\n noCorrectAnswer: 'false',\n entity: entity ?? '',\n noAnswers: 'false',\n tags: tags ?? [],\n noVotes: 'false',\n });\n\n const onPageChange = (value: number) => {\n setPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('page', String(value));\n return newValue;\n });\n };\n\n const onFilterChange = (key: FilterKey, value: string | string[]) => {\n if (filters[key] === value) {\n return;\n }\n\n setPage(1);\n setFilters({ ...filters, ...{ [key]: value } });\n setSearchParams(prev => {\n const newValue = prev;\n if (!value || value === 'false') {\n newValue.delete(key);\n } else if (Array.isArray(value)) {\n if (value.length === 0) {\n newValue.delete(key);\n } else {\n newValue.set(key, value.join(','));\n }\n } else if (value.length > 0) {\n newValue.set(key, value);\n } else {\n newValue.delete(key);\n }\n return newValue;\n });\n };\n\n const onSearchQueryChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n onPageChange(1);\n if (event.target.value) {\n analytics.captureEvent('qeta_search', event.target.value);\n }\n setSearchQuery(event.target.value);\n };\n\n useDebounce(\n () => {\n if (filters.searchQuery !== searchQuery) {\n setFilters({ ...filters, searchQuery: searchQuery });\n }\n },\n 400,\n [searchQuery],\n );\n\n useEffect(() => {\n let filtersApplied = false;\n searchParams.forEach((value, key) => {\n try {\n if (key === 'page') {\n const pv = Number.parseInt(value, 10);\n if (pv > 0) {\n setPage(pv);\n } else {\n setPage(1);\n }\n } else if (key === 'answersPerPage') {\n const qpp = Number.parseInt(value, 10);\n if (qpp > 0) setAnswersPerPage(qpp);\n } else if (filterKeys.includes(key as FilterKey)) {\n filtersApplied = true;\n if (key === 'tags') {\n filters.tags = filterTags(value) ?? [];\n } else {\n (filters as any)[key] = value;\n }\n }\n } catch (_e) {\n // NOOP\n }\n });\n setFilters(filters);\n if (filtersApplied) {\n setShowFilterPanel(true);\n }\n }, [searchParams, filters]);\n\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(\n api => {\n return api.getAnswers({\n limit: answersPerPage,\n offset: (page - 1) * answersPerPage,\n author,\n ...getFiltersWithDateRange(filters),\n });\n },\n [page, filters, answersPerPage],\n );\n\n const onPageSizeChange = (value: number) => {\n if (response) {\n let newPage = page;\n while (newPage * value > response.total) {\n newPage -= 1;\n }\n onPageChange(Math.max(1, newPage));\n }\n setAnswersPerPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('answersPerPage', String(value));\n return newValue;\n });\n };\n\n let shownTitle = title;\n let link = undefined;\n if (author) {\n shownTitle = `Answers by `;\n link = <EntityRefLink entityRef={author} hideIcon defaultKind=\"user\" />;\n } else if (entity) {\n shownTitle = `Answers about `;\n link = <EntityRefLink entityRef={entity} />;\n } else if (tags) {\n shownTitle = `Answers tagged with [${tags.join(', ')}]`;\n }\n\n return (\n <Box className=\"qetaAnswersContainer\">\n {showTitle && (\n <Typography\n variant=\"h5\"\n className=\"qetaAnswersContainerTitle\"\n style={{ marginBottom: '1.5rem' }}\n >\n {shownTitle}\n {link}\n </Typography>\n )}\n <Grid container justifyContent=\"space-between\">\n <Grid item xs={12} md={4}>\n <TextField\n id=\"search-bar\"\n fullWidth\n onChange={onSearchQueryChange}\n label=\"Search for answers\"\n className=\"qetaAnswersContainerSearchInput\"\n variant=\"outlined\"\n placeholder=\"Search...\"\n size=\"small\"\n style={{ marginBottom: '5px' }}\n />\n </Grid>\n </Grid>\n <Grid container justifyContent=\"space-between\">\n <Grid item>\n <Typography\n variant=\"h6\"\n className=\"qetaAnswersContainerAnswerCount\"\n >{`${response?.total ?? 0} ${\n response?.total === 1 ? 'answer' : 'answers'\n }`}</Typography>\n </Grid>\n {(showFilters ?? true) && (\n <Grid item>\n <Button\n onClick={() => setShowFilterPanel(!showFilterPanel)}\n className=\"qetaAnswerContainerFilterPanelBtn\"\n startIcon={<FilterList />}\n >\n Filter\n </Button>\n </Grid>\n )}\n </Grid>\n {(showFilters ?? true) && (\n <Collapse in={showFilterPanel}>\n <FilterPanel\n onChange={onFilterChange}\n filters={filters}\n answerFilters\n />\n </Collapse>\n )}\n\n <AnswerList\n loading={loading}\n error={error}\n response={response}\n onPageChange={onPageChange}\n onPageSizeChange={onPageSizeChange}\n entity={entity}\n page={page}\n pageSize={answersPerPage}\n entityPage={entity !== undefined}\n tags={tags}\n />\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;AAmCa,MAAA,gBAAA,GAAmB,CAAC,KAAiC,KAAA;AAChE,EAAA,MAAM,EAAE,IAAM,EAAA,MAAA,EAAQ,QAAQ,WAAa,EAAA,SAAA,EAAW,OAAU,GAAA,KAAA,CAAA;AAChE,EAAA,MAAM,YAAY,YAAa,EAAA,CAAA;AAC/B,EAAA,MAAM,CAAC,IAAM,EAAA,OAAO,CAAI,GAAA,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AACxC,EAAA,MAAM,CAAC,cAAgB,EAAA,iBAAiB,CAAI,GAAA,KAAA,CAAM,SAAS,EAAE,CAAA,CAAA;AAC7D,EAAA,MAAM,CAAC,eAAiB,EAAA,kBAAkB,CAAI,GAAA,KAAA,CAAM,SAAS,KAAK,CAAA,CAAA;AAClE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,eAAgB,EAAA,CAAA;AACxD,EAAA,MAAM,CAAC,WAAa,EAAA,cAAc,CAAI,GAAA,KAAA,CAAM,SAAS,EAAE,CAAA,CAAA;AACvD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,MAAM,QAAkB,CAAA;AAAA,IACpD,KAAO,EAAA,MAAA;AAAA,IACP,OAAS,EAAA,SAAA;AAAA,IACT,WAAa,EAAA,EAAA;AAAA,IACb,SAAW,EAAA,EAAA;AAAA,IACX,eAAiB,EAAA,OAAA;AAAA,IACjB,QAAQ,MAAU,IAAA,EAAA;AAAA,IAClB,SAAW,EAAA,OAAA;AAAA,IACX,IAAA,EAAM,QAAQ,EAAC;AAAA,IACf,OAAS,EAAA,OAAA;AAAA,GACV,CAAA,CAAA;AAED,EAAM,MAAA,YAAA,GAAe,CAAC,KAAkB,KAAA;AACtC,IAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AACb,IAAA,eAAA,CAAgB,CAAQ,IAAA,KAAA;AACtB,MAAA,MAAM,QAAW,GAAA,IAAA,CAAA;AACjB,MAAA,QAAA,CAAS,GAAI,CAAA,MAAA,EAAQ,MAAO,CAAA,KAAK,CAAC,CAAA,CAAA;AAClC,MAAO,OAAA,QAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACH,CAAA;AAEA,EAAM,MAAA,cAAA,GAAiB,CAAC,GAAA,EAAgB,KAA6B,KAAA;AACnE,IAAI,IAAA,OAAA,CAAQ,GAAG,CAAA,KAAM,KAAO,EAAA;AAC1B,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,OAAA,CAAQ,CAAC,CAAA,CAAA;AACT,IAAW,UAAA,CAAA,EAAE,GAAG,OAAA,EAAS,GAAG,EAAE,CAAC,GAAG,GAAG,KAAM,EAAA,EAAG,CAAA,CAAA;AAC9C,IAAA,eAAA,CAAgB,CAAQ,IAAA,KAAA;AACtB,MAAA,MAAM,QAAW,GAAA,IAAA,CAAA;AACjB,MAAI,IAAA,CAAC,KAAS,IAAA,KAAA,KAAU,OAAS,EAAA;AAC/B,QAAA,QAAA,CAAS,OAAO,GAAG,CAAA,CAAA;AAAA,OACV,MAAA,IAAA,KAAA,CAAM,OAAQ,CAAA,KAAK,CAAG,EAAA;AAC/B,QAAI,IAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AACtB,UAAA,QAAA,CAAS,OAAO,GAAG,CAAA,CAAA;AAAA,SACd,MAAA;AACL,UAAA,QAAA,CAAS,GAAI,CAAA,GAAA,EAAK,KAAM,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,SACnC;AAAA,OACF,MAAA,IAAW,KAAM,CAAA,MAAA,GAAS,CAAG,EAAA;AAC3B,QAAS,QAAA,CAAA,GAAA,CAAI,KAAK,KAAK,CAAA,CAAA;AAAA,OAClB,MAAA;AACL,QAAA,QAAA,CAAS,OAAO,GAAG,CAAA,CAAA;AAAA,OACrB;AACA,MAAO,OAAA,QAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACH,CAAA;AAEA,EAAM,MAAA,mBAAA,GAAsB,CAAC,KAA+C,KAAA;AAC1E,IAAA,YAAA,CAAa,CAAC,CAAA,CAAA;AACd,IAAI,IAAA,KAAA,CAAM,OAAO,KAAO,EAAA;AACtB,MAAA,SAAA,CAAU,YAAa,CAAA,aAAA,EAAe,KAAM,CAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,KAC1D;AACA,IAAe,cAAA,CAAA,KAAA,CAAM,OAAO,KAAK,CAAA,CAAA;AAAA,GACnC,CAAA;AAEA,EAAA,WAAA;AAAA,IACE,MAAM;AACJ,MAAI,IAAA,OAAA,CAAQ,gBAAgB,WAAa,EAAA;AACvC,QAAA,UAAA,CAAW,EAAE,GAAG,OAAS,EAAA,WAAA,EAA0B,CAAA,CAAA;AAAA,OACrD;AAAA,KACF;AAAA,IACA,GAAA;AAAA,IACA,CAAC,WAAW,CAAA;AAAA,GACd,CAAA;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,cAAiB,GAAA,KAAA,CAAA;AACrB,IAAa,YAAA,CAAA,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAQ,KAAA;AACnC,MAAI,IAAA;AACF,QAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,UAAA,MAAM,EAAK,GAAA,MAAA,CAAO,QAAS,CAAA,KAAA,EAAO,EAAE,CAAA,CAAA;AACpC,UAAA,IAAI,KAAK,CAAG,EAAA;AACV,YAAA,OAAA,CAAQ,EAAE,CAAA,CAAA;AAAA,WACL,MAAA;AACL,YAAA,OAAA,CAAQ,CAAC,CAAA,CAAA;AAAA,WACX;AAAA,SACF,MAAA,IAAW,QAAQ,gBAAkB,EAAA;AACnC,UAAA,MAAM,GAAM,GAAA,MAAA,CAAO,QAAS,CAAA,KAAA,EAAO,EAAE,CAAA,CAAA;AACrC,UAAI,IAAA,GAAA,GAAM,CAAG,EAAA,iBAAA,CAAkB,GAAG,CAAA,CAAA;AAAA,SACzB,MAAA,IAAA,UAAA,CAAW,QAAS,CAAA,GAAgB,CAAG,EAAA;AAChD,UAAiB,cAAA,GAAA,IAAA,CAAA;AACjB,UAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,YAAA,OAAA,CAAQ,IAAO,GAAA,UAAA,CAAW,KAAK,CAAA,IAAK,EAAC,CAAA;AAAA,WAChC,MAAA;AACL,YAAC,OAAA,CAAgB,GAAG,CAAI,GAAA,KAAA,CAAA;AAAA,WAC1B;AAAA,SACF;AAAA,eACO,EAAI,EAAA;AAAA,OAEb;AAAA,KACD,CAAA,CAAA;AACD,IAAA,UAAA,CAAW,OAAO,CAAA,CAAA;AAClB,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAA,kBAAA,CAAmB,IAAI,CAAA,CAAA;AAAA,KACzB;AAAA,GACC,EAAA,CAAC,YAAc,EAAA,OAAO,CAAC,CAAA,CAAA;AAE1B,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,QAAA;AAAA,IACP,OAAA;AAAA,IACA,KAAA;AAAA,GACE,GAAA,UAAA;AAAA,IACF,CAAO,GAAA,KAAA;AACL,MAAA,OAAO,IAAI,UAAW,CAAA;AAAA,QACpB,KAAO,EAAA,cAAA;AAAA,QACP,MAAA,EAAA,CAAS,OAAO,CAAK,IAAA,cAAA;AAAA,QACrB,MAAA;AAAA,QACA,GAAG,wBAAwB,OAAO,CAAA;AAAA,OACnC,CAAA,CAAA;AAAA,KACH;AAAA,IACA,CAAC,IAAM,EAAA,OAAA,EAAS,cAAc,CAAA;AAAA,GAChC,CAAA;AAEA,EAAM,MAAA,gBAAA,GAAmB,CAAC,KAAkB,KAAA;AAC1C,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,IAAI,OAAU,GAAA,IAAA,CAAA;AACd,MAAO,OAAA,OAAA,GAAU,KAAQ,GAAA,QAAA,CAAS,KAAO,EAAA;AACvC,QAAW,OAAA,IAAA,CAAA,CAAA;AAAA,OACb;AACA,MAAA,YAAA,CAAa,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,OAAO,CAAC,CAAA,CAAA;AAAA,KACnC;AACA,IAAA,iBAAA,CAAkB,KAAK,CAAA,CAAA;AACvB,IAAA,eAAA,CAAgB,CAAQ,IAAA,KAAA;AACtB,MAAA,MAAM,QAAW,GAAA,IAAA,CAAA;AACjB,MAAA,QAAA,CAAS,GAAI,CAAA,gBAAA,EAAkB,MAAO,CAAA,KAAK,CAAC,CAAA,CAAA;AAC5C,MAAO,OAAA,QAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACH,CAAA;AAEA,EAAA,IAAI,UAAa,GAAA,KAAA,CAAA;AACjB,EAAA,IAAI,IAAO,GAAA,KAAA,CAAA,CAAA;AACX,EAAA,IAAI,MAAQ,EAAA;AACV,IAAa,UAAA,GAAA,CAAA,WAAA,CAAA,CAAA;AACb,IAAA,IAAA,uCAAQ,aAAc,EAAA,EAAA,SAAA,EAAW,QAAQ,QAAQ,EAAA,IAAA,EAAC,aAAY,MAAO,EAAA,CAAA,CAAA;AAAA,aAC5D,MAAQ,EAAA;AACjB,IAAa,UAAA,GAAA,CAAA,cAAA,CAAA,CAAA;AACb,IAAO,IAAA,mBAAA,KAAA,CAAA,aAAA,CAAC,aAAc,EAAA,EAAA,SAAA,EAAW,MAAQ,EAAA,CAAA,CAAA;AAAA,aAChC,IAAM,EAAA;AACf,IAAA,UAAA,GAAa,CAAwB,qBAAA,EAAA,IAAA,CAAK,IAAK,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA;AAAA,GACtD;AAEA,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,SAAU,EAAA,sBAAA,EAAA,EACZ,SACC,oBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,IAAA;AAAA,MACR,SAAU,EAAA,2BAAA;AAAA,MACV,KAAA,EAAO,EAAE,YAAA,EAAc,QAAS,EAAA;AAAA,KAAA;AAAA,IAE/B,UAAA;AAAA,IACA,IAAA;AAAA,GAGL,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,MAAC,cAAe,EAAA,eAAA,EAAA,kBAC5B,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EAAI,IAAI,CACrB,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,EAAG,EAAA,YAAA;AAAA,MACH,SAAS,EAAA,IAAA;AAAA,MACT,QAAU,EAAA,mBAAA;AAAA,MACV,KAAM,EAAA,oBAAA;AAAA,MACN,SAAU,EAAA,iCAAA;AAAA,MACV,OAAQ,EAAA,UAAA;AAAA,MACR,WAAY,EAAA,WAAA;AAAA,MACZ,IAAK,EAAA,OAAA;AAAA,MACL,KAAA,EAAO,EAAE,YAAA,EAAc,KAAM,EAAA;AAAA,KAAA;AAAA,GAEjC,CACF,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,cAAA,EAAe,eAC7B,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,IAAA;AAAA,MACR,SAAU,EAAA,iCAAA;AAAA,KAAA;AAAA,IACV,CAAA,EAAG,UAAU,KAAS,IAAA,CAAC,IACvB,QAAU,EAAA,KAAA,KAAU,CAAI,GAAA,QAAA,GAAW,SACrC,CAAA,CAAA;AAAA,GACF,CACE,EAAA,CAAA,WAAA,IAAe,yBACd,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IACR,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAS,EAAA,MAAM,kBAAmB,CAAA,CAAC,eAAe,CAAA;AAAA,MAClD,SAAU,EAAA,mCAAA;AAAA,MACV,SAAA,sCAAY,UAAW,EAAA,IAAA,CAAA;AAAA,KAAA;AAAA,IACxB,QAAA;AAAA,GAGH,CAEJ,CACE,EAAA,CAAA,WAAA,IAAe,yBACd,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EAAS,IAAI,eACZ,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,QAAU,EAAA,cAAA;AAAA,MACV,OAAA;AAAA,MACA,aAAa,EAAA,IAAA;AAAA,KAAA;AAAA,GAEjB,CAGF,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,gBAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAU,EAAA,cAAA;AAAA,MACV,YAAY,MAAW,KAAA,KAAA,CAAA;AAAA,MACvB,IAAA;AAAA,KAAA;AAAA,GAEJ,CAAA,CAAA;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"AnswersContainer.esm.js","sources":["../../../src/components/AnswersContainer/AnswersContainer.tsx"],"sourcesContent":["import { useQetaApi } from '../../utils/hooks';\nimport {\n Box,\n Button,\n Collapse,\n Grid,\n TextField,\n Typography,\n} from '@material-ui/core';\n\nimport React, { useEffect } from 'react';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport FilterList from '@material-ui/icons/FilterList';\nimport { useSearchParams } from 'react-router-dom';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport { useAnalytics } from '@backstage/core-plugin-api';\nimport { filterTags } from '@drodil/backstage-plugin-qeta-common';\nimport { getFiltersWithDateRange } from '../../utils/utils';\nimport {\n FilterKey,\n filterKeys,\n FilterPanel,\n Filters,\n} from '../QuestionsContainer/FilterPanel';\nimport { AnswerList } from './AnswerList';\n\nexport interface AnswersContainerProps {\n tags?: string[];\n author?: string;\n entity?: string;\n showFilters?: boolean;\n showTitle?: boolean;\n title?: string;\n}\n\nexport const AnswersContainer = (props: AnswersContainerProps) => {\n const { tags, author, entity, showFilters, showTitle, title } = props;\n const analytics = useAnalytics();\n const [page, setPage] = React.useState(1);\n const [answersPerPage, setAnswersPerPage] = React.useState(10);\n const [showFilterPanel, setShowFilterPanel] = React.useState(false);\n const [searchParams, setSearchParams] = useSearchParams();\n const [searchQuery, setSearchQuery] = React.useState('');\n const [filters, setFilters] = React.useState<Filters>({\n order: 'desc',\n orderBy: 'created',\n searchQuery: '',\n dateRange: '',\n noCorrectAnswer: 'false',\n entity: entity ?? '',\n tags: tags ?? [],\n noVotes: 'false',\n });\n\n const onPageChange = (value: number) => {\n setPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('page', String(value));\n return newValue;\n });\n };\n\n const onFilterChange = (key: FilterKey, value: string | string[]) => {\n if (filters[key] === value) {\n return;\n }\n\n setPage(1);\n setFilters({ ...filters, ...{ [key]: value } });\n setSearchParams(prev => {\n const newValue = prev;\n if (!value || value === 'false') {\n newValue.delete(key);\n } else if (Array.isArray(value)) {\n if (value.length === 0) {\n newValue.delete(key);\n } else {\n newValue.set(key, value.join(','));\n }\n } else if (value.length > 0) {\n newValue.set(key, value);\n } else {\n newValue.delete(key);\n }\n return newValue;\n });\n };\n\n const onSearchQueryChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n onPageChange(1);\n if (event.target.value) {\n analytics.captureEvent('qeta_search', event.target.value);\n }\n setSearchQuery(event.target.value);\n };\n\n useDebounce(\n () => {\n if (filters.searchQuery !== searchQuery) {\n setFilters({ ...filters, searchQuery: searchQuery });\n }\n },\n 400,\n [searchQuery],\n );\n\n useEffect(() => {\n let filtersApplied = false;\n searchParams.forEach((value, key) => {\n try {\n if (key === 'page') {\n const pv = Number.parseInt(value, 10);\n if (pv > 0) {\n setPage(pv);\n } else {\n setPage(1);\n }\n } else if (key === 'answersPerPage') {\n const qpp = Number.parseInt(value, 10);\n if (qpp > 0) setAnswersPerPage(qpp);\n } else if (filterKeys.includes(key as FilterKey)) {\n filtersApplied = true;\n if (key === 'tags') {\n filters.tags = filterTags(value) ?? [];\n } else {\n (filters as any)[key] = value;\n }\n }\n } catch (_e) {\n // NOOP\n }\n });\n setFilters(filters);\n if (filtersApplied) {\n setShowFilterPanel(true);\n }\n }, [searchParams, filters]);\n\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(\n api => {\n return api.getAnswers({\n limit: answersPerPage,\n offset: (page - 1) * answersPerPage,\n author,\n ...getFiltersWithDateRange(filters),\n });\n },\n [page, filters, answersPerPage],\n );\n\n const onPageSizeChange = (value: number) => {\n if (response) {\n let newPage = page;\n while (newPage * value > response.total) {\n newPage -= 1;\n }\n onPageChange(Math.max(1, newPage));\n }\n setAnswersPerPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('answersPerPage', String(value));\n return newValue;\n });\n };\n\n let shownTitle = title;\n let link = undefined;\n if (author) {\n shownTitle = `Answers by `;\n link = <EntityRefLink entityRef={author} hideIcon defaultKind=\"user\" />;\n } else if (entity) {\n shownTitle = `Answers about `;\n link = <EntityRefLink entityRef={entity} />;\n } else if (tags) {\n shownTitle = `Answers tagged with [${tags.join(', ')}]`;\n }\n\n return (\n <Box className=\"qetaAnswersContainer\">\n {showTitle && (\n <Typography\n variant=\"h5\"\n className=\"qetaAnswersContainerTitle\"\n style={{ marginBottom: '1.5rem' }}\n >\n {shownTitle}\n {link}\n </Typography>\n )}\n <Grid container justifyContent=\"space-between\">\n <Grid item xs={12} md={4}>\n <TextField\n id=\"search-bar\"\n fullWidth\n onChange={onSearchQueryChange}\n label=\"Search for answers\"\n className=\"qetaAnswersContainerSearchInput\"\n variant=\"outlined\"\n placeholder=\"Search...\"\n size=\"small\"\n style={{ marginBottom: '5px' }}\n />\n </Grid>\n </Grid>\n <Grid container justifyContent=\"space-between\">\n <Grid item>\n <Typography\n variant=\"h6\"\n className=\"qetaAnswersContainerAnswerCount\"\n >{`${response?.total ?? 0} ${\n response?.total === 1 ? 'answer' : 'answers'\n }`}</Typography>\n </Grid>\n {(showFilters ?? true) && (\n <Grid item>\n <Button\n onClick={() => setShowFilterPanel(!showFilterPanel)}\n className=\"qetaAnswerContainerFilterPanelBtn\"\n startIcon={<FilterList />}\n >\n Filter\n </Button>\n </Grid>\n )}\n </Grid>\n {(showFilters ?? true) && (\n <Collapse in={showFilterPanel}>\n <FilterPanel\n onChange={onFilterChange}\n filters={filters}\n answerFilters\n />\n </Collapse>\n )}\n\n <AnswerList\n loading={loading}\n error={error}\n response={response}\n onPageChange={onPageChange}\n onPageSizeChange={onPageSizeChange}\n entity={entity}\n page={page}\n pageSize={answersPerPage}\n entityPage={entity !== undefined}\n tags={tags}\n />\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterPanel.esm.js","sources":["../../../src/components/QuestionsContainer/FilterPanel.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\nimport {\n Box,\n Checkbox,\n Divider,\n FormControl,\n FormControlLabel,\n FormGroup,\n FormLabel,\n Grid,\n Radio,\n RadioGroup,\n TextField,\n} from '@material-ui/core';\nimport { useQetaApi, useStyles } from '../../utils/hooks';\nimport { Autocomplete } from '@material-ui/lab';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { getEntityTitle } from '../../utils/utils';\nimport { DateRangeFilter } from './DateRangeFilter';\n\nconst radioSelect = (value: string, label: string) => {\n return (\n <FormControlLabel\n value={value}\n control={<Radio size=\"small\" />}\n label={label}\n />\n );\n};\n\nexport const filterKeys = [\n 'orderBy',\n 'order',\n 'noAnswers',\n 'noCorrectAnswer',\n 'noVotes',\n 'entity',\n 'tags',\n 'dateRange',\n] as const;\nexport type FilterKey = (typeof filterKeys)[number];\n\nexport type Filters = {\n order: string;\n orderBy: string;\n noAnswers: string;\n noCorrectAnswer: string;\n noVotes: string;\n searchQuery: string;\n entity?: string;\n tags?: string[];\n dateRange?: string;\n};\n\nexport interface FilterPanelProps {\n onChange: (key: FilterKey, value: string | string[]) => void;\n filters: Filters;\n showEntityFilter?: boolean;\n showTagFilter?: boolean;\n answerFilters?: boolean;\n}\n\nexport const FilterPanel = (props: FilterPanelProps) => {\n const {\n onChange,\n filters,\n showEntityFilter = true,\n showTagFilter = true,\n answerFilters = false,\n } = props;\n const styles = useStyles();\n const { value: refs } = useQetaApi(api => api.getEntities(), []);\n const { value: tags } = useQetaApi(api => api.getTags(), []);\n const catalogApi = useApi(catalogApiRef);\n const [availableEntities, setAvailableEntities] = React.useState<\n Entity[] | null\n >(null);\n const [selectedEntity, setSelectedEntity] = React.useState<\n Entity | undefined\n >(undefined);\n const [availableTags, setAvailableTags] = React.useState<string[] | null>(\n null,\n );\n\n useEffect(() => {\n if ((tags && tags.length > 0) || filters.tags) {\n const ts = (tags ?? []).map(t => t.tag);\n if (filters.tags) {\n ts.push(...filters.tags);\n }\n setAvailableTags([...new Set(ts)]);\n }\n }, [tags, filters.tags]);\n\n useEffect(() => {\n const entityRefs: string[] = [];\n if (filters.entity && !Array.isArray(filters.entity)) {\n entityRefs.push(filters.entity);\n }\n if (refs && refs?.length > 0) {\n refs?.forEach(ref => {\n // ignore currently selected entity if exist in refs\n if (ref.entityRef !== filters.entity) {\n entityRefs.push(ref.entityRef);\n }\n });\n }\n if (entityRefs.length > 0) {\n catalogApi\n .getEntitiesByRefs({\n entityRefs,\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n .then(resp => {\n const filtered = resp.items.filter(i => i !== undefined) as Entity[];\n setAvailableEntities(filtered);\n });\n }\n }, [filters.entity, catalogApi, refs]);\n\n useEffect(() => {\n if (filters.entity && availableEntities) {\n const value = availableEntities.find(\n e => stringifyEntityRef(e) === filters.entity,\n );\n setSelectedEntity(value);\n if (!value) {\n onChange('entity', '');\n }\n } else {\n setSelectedEntity(undefined);\n }\n }, [availableEntities, filters.entity, onChange]);\n\n const handleChange = (event: {\n target: {\n value: string | string[];\n type?: string;\n name: string;\n checked?: boolean;\n };\n }) => {\n let value = event.target.value;\n if (event.target.type === 'checkbox') {\n value = event.target.checked ? 'true' : 'false';\n }\n onChange(event.target.name as FilterKey, value);\n };\n\n return (\n <Box className={`qetaFilterPanel ${styles.filterPanel}`}>\n <Grid container spacing={4}>\n <Grid item md={3} xs={4}>\n <FormGroup>\n {!answerFilters && (\n <FormControlLabel\n control={\n <Checkbox\n size=\"small\"\n name=\"noAnswers\"\n onChange={handleChange}\n checked={filters.noAnswers === 'true'}\n />\n }\n label=\"No answers\"\n />\n )}\n <FormControlLabel\n control={\n <Checkbox\n size=\"small\"\n name=\"noCorrectAnswer\"\n checked={filters.noCorrectAnswer === 'true'}\n onChange={handleChange}\n />\n }\n label=\"No correct answers\"\n />\n <FormControlLabel\n control={\n <Checkbox\n size=\"small\"\n name=\"noVotes\"\n checked={filters.noVotes === 'true'}\n onChange={handleChange}\n />\n }\n label=\"No votes\"\n />\n </FormGroup>\n </Grid>\n <Grid item md={2} xs={4}>\n <FormControl>\n <FormLabel id=\"qeta-filter-order-by\">Order by</FormLabel>\n <RadioGroup\n aria-labelledby=\"qeta-filter-order-by\"\n name=\"orderBy\"\n value={filters.orderBy}\n onChange={handleChange}\n >\n {radioSelect('created', 'Created')}\n {!answerFilters && radioSelect('views', 'Views')}\n {radioSelect('score', 'Score')}\n {!answerFilters && radioSelect('answersCount', 'Answers')}\n {radioSelect('updated', 'Updated')}\n </RadioGroup>\n </FormControl>\n </Grid>\n <Grid item md={2} xs={4}>\n <FormControl>\n <FormLabel id=\"qeta-filter-order\">Order</FormLabel>\n <RadioGroup\n aria-labelledby=\"qeta-filter-order\"\n name=\"order\"\n value={filters.order}\n onChange={handleChange}\n >\n {radioSelect('desc', 'Descending')}\n {radioSelect('asc', 'Ascending')}\n </RadioGroup>\n </FormControl>\n </Grid>\n {((availableEntities && availableEntities.length > 0) ||\n (availableTags && availableTags.length > 0)) &&\n (showEntityFilter || showTagFilter) && (\n <Grid item md={4} xs={8}>\n <FormLabel id=\"qeta-filter-entity\">Filters</FormLabel>\n {showEntityFilter &&\n availableEntities &&\n availableEntities.length > 0 && (\n <Autocomplete\n multiple={false}\n className=\"qetaEntityFilter\"\n value={selectedEntity ?? null}\n id=\"entities-select\"\n options={availableEntities}\n getOptionLabel={getEntityTitle}\n getOptionSelected={(o, v) => {\n if (!o || !v) {\n return false;\n }\n return stringifyEntityRef(o) === stringifyEntityRef(v);\n }}\n onChange={(_e, newValue) => {\n handleChange({\n target: {\n name: 'entity',\n value: newValue ? stringifyEntityRef(newValue) : '',\n },\n });\n }}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"outlined\"\n margin=\"normal\"\n label=\"Entity\"\n placeholder=\"Type or select entity\"\n />\n )}\n />\n )}\n {showTagFilter && availableTags && availableTags.length > 0 && (\n <Autocomplete\n multiple\n className=\"qetaTagFilter\"\n value={filters.tags}\n id=\"tags-select\"\n options={availableTags}\n onChange={(_e, newValue) => {\n handleChange({\n target: {\n name: 'tags',\n value: newValue,\n },\n });\n }}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"outlined\"\n margin=\"normal\"\n label=\"Tag\"\n placeholder=\"Type or select tag\"\n />\n )}\n />\n )}\n </Grid>\n )}\n </Grid>\n <Box marginY=\"24px\">\n <Divider />\n </Box>\n <DateRangeFilter value={filters.dateRange} onChange={onChange} />\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FilterPanel.esm.js","sources":["../../../src/components/QuestionsContainer/FilterPanel.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\nimport {\n Box,\n Checkbox,\n Divider,\n FormControl,\n FormControlLabel,\n FormGroup,\n FormLabel,\n Grid,\n Radio,\n RadioGroup,\n TextField,\n} from '@material-ui/core';\nimport { useQetaApi, useStyles } from '../../utils/hooks';\nimport { Autocomplete } from '@material-ui/lab';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { getEntityTitle } from '../../utils/utils';\nimport { DateRangeFilter } from './DateRangeFilter';\n\nconst radioSelect = (value: string, label: string) => {\n return (\n <FormControlLabel\n value={value}\n control={<Radio size=\"small\" />}\n label={label}\n />\n );\n};\n\nexport const filterKeys = [\n 'orderBy',\n 'order',\n 'noAnswers',\n 'noCorrectAnswer',\n 'noVotes',\n 'entity',\n 'tags',\n 'dateRange',\n] as const;\nexport type FilterKey = (typeof filterKeys)[number];\n\nexport type Filters = {\n order: string;\n orderBy: string;\n noAnswers?: string;\n noCorrectAnswer: string;\n noVotes: string;\n searchQuery: string;\n entity?: string;\n tags?: string[];\n dateRange?: string;\n};\n\nexport interface FilterPanelProps {\n onChange: (key: FilterKey, value: string | string[]) => void;\n filters: Filters;\n showEntityFilter?: boolean;\n showTagFilter?: boolean;\n answerFilters?: boolean;\n}\n\nexport const FilterPanel = (props: FilterPanelProps) => {\n const {\n onChange,\n filters,\n showEntityFilter = true,\n showTagFilter = true,\n answerFilters = false,\n } = props;\n const styles = useStyles();\n const { value: refs } = useQetaApi(api => api.getEntities(), []);\n const { value: tags } = useQetaApi(api => api.getTags(), []);\n const catalogApi = useApi(catalogApiRef);\n const [availableEntities, setAvailableEntities] = React.useState<\n Entity[] | null\n >(null);\n const [selectedEntity, setSelectedEntity] = React.useState<\n Entity | undefined\n >(undefined);\n const [availableTags, setAvailableTags] = React.useState<string[] | null>(\n null,\n );\n\n useEffect(() => {\n if ((tags && tags.length > 0) || filters.tags) {\n const ts = (tags ?? []).map(t => t.tag);\n if (filters.tags) {\n ts.push(...filters.tags);\n }\n setAvailableTags([...new Set(ts)]);\n }\n }, [tags, filters.tags]);\n\n useEffect(() => {\n const entityRefs: string[] = [];\n if (filters.entity && !Array.isArray(filters.entity)) {\n entityRefs.push(filters.entity);\n }\n if (refs && refs?.length > 0) {\n refs?.forEach(ref => {\n // ignore currently selected entity if exist in refs\n if (ref.entityRef !== filters.entity) {\n entityRefs.push(ref.entityRef);\n }\n });\n }\n if (entityRefs.length > 0) {\n catalogApi\n .getEntitiesByRefs({\n entityRefs,\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n .then(resp => {\n const filtered = resp.items.filter(i => i !== undefined) as Entity[];\n setAvailableEntities(filtered);\n });\n }\n }, [filters.entity, catalogApi, refs]);\n\n useEffect(() => {\n if (filters.entity && availableEntities) {\n const value = availableEntities.find(\n e => stringifyEntityRef(e) === filters.entity,\n );\n setSelectedEntity(value);\n if (!value) {\n onChange('entity', '');\n }\n } else {\n setSelectedEntity(undefined);\n }\n }, [availableEntities, filters.entity, onChange]);\n\n const handleChange = (event: {\n target: {\n value: string | string[];\n type?: string;\n name: string;\n checked?: boolean;\n };\n }) => {\n let value = event.target.value;\n if (event.target.type === 'checkbox') {\n value = event.target.checked ? 'true' : 'false';\n }\n onChange(event.target.name as FilterKey, value);\n };\n\n return (\n <Box className={`qetaFilterPanel ${styles.filterPanel}`}>\n <Grid container spacing={4}>\n <Grid item md={3} xs={4}>\n <FormGroup>\n {!answerFilters && (\n <FormControlLabel\n control={\n <Checkbox\n size=\"small\"\n name=\"noAnswers\"\n onChange={handleChange}\n checked={filters.noAnswers === 'true'}\n />\n }\n label=\"No answers\"\n />\n )}\n <FormControlLabel\n control={\n <Checkbox\n size=\"small\"\n name=\"noCorrectAnswer\"\n checked={filters.noCorrectAnswer === 'true'}\n onChange={handleChange}\n />\n }\n label=\"No correct answers\"\n />\n <FormControlLabel\n control={\n <Checkbox\n size=\"small\"\n name=\"noVotes\"\n checked={filters.noVotes === 'true'}\n onChange={handleChange}\n />\n }\n label=\"No votes\"\n />\n </FormGroup>\n </Grid>\n <Grid item md={2} xs={4}>\n <FormControl>\n <FormLabel id=\"qeta-filter-order-by\">Order by</FormLabel>\n <RadioGroup\n aria-labelledby=\"qeta-filter-order-by\"\n name=\"orderBy\"\n value={filters.orderBy}\n onChange={handleChange}\n >\n {radioSelect('created', 'Created')}\n {!answerFilters && radioSelect('views', 'Views')}\n {radioSelect('score', 'Score')}\n {!answerFilters && radioSelect('answersCount', 'Answers')}\n {radioSelect('updated', 'Updated')}\n </RadioGroup>\n </FormControl>\n </Grid>\n <Grid item md={2} xs={4}>\n <FormControl>\n <FormLabel id=\"qeta-filter-order\">Order</FormLabel>\n <RadioGroup\n aria-labelledby=\"qeta-filter-order\"\n name=\"order\"\n value={filters.order}\n onChange={handleChange}\n >\n {radioSelect('desc', 'Descending')}\n {radioSelect('asc', 'Ascending')}\n </RadioGroup>\n </FormControl>\n </Grid>\n {((availableEntities && availableEntities.length > 0) ||\n (availableTags && availableTags.length > 0)) &&\n (showEntityFilter || showTagFilter) && (\n <Grid item md={4} xs={8}>\n <FormLabel id=\"qeta-filter-entity\">Filters</FormLabel>\n {showEntityFilter &&\n availableEntities &&\n availableEntities.length > 0 && (\n <Autocomplete\n multiple={false}\n className=\"qetaEntityFilter\"\n value={selectedEntity ?? null}\n id=\"entities-select\"\n options={availableEntities}\n getOptionLabel={getEntityTitle}\n getOptionSelected={(o, v) => {\n if (!o || !v) {\n return false;\n }\n return stringifyEntityRef(o) === stringifyEntityRef(v);\n }}\n onChange={(_e, newValue) => {\n handleChange({\n target: {\n name: 'entity',\n value: newValue ? stringifyEntityRef(newValue) : '',\n },\n });\n }}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"outlined\"\n margin=\"normal\"\n label=\"Entity\"\n placeholder=\"Type or select entity\"\n />\n )}\n />\n )}\n {showTagFilter && availableTags && availableTags.length > 0 && (\n <Autocomplete\n multiple\n className=\"qetaTagFilter\"\n value={filters.tags}\n id=\"tags-select\"\n options={availableTags}\n onChange={(_e, newValue) => {\n handleChange({\n target: {\n name: 'tags',\n value: newValue,\n },\n });\n }}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"outlined\"\n margin=\"normal\"\n label=\"Tag\"\n placeholder=\"Type or select tag\"\n />\n )}\n />\n )}\n </Grid>\n )}\n </Grid>\n <Box marginY=\"24px\">\n <Divider />\n </Box>\n <DateRangeFilter value={filters.dateRange} onChange={onChange} />\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/utils/hooks.esm.js
CHANGED
|
@@ -6,6 +6,7 @@ import { catalogApiRef, useEntityPresentation } from '@backstage/plugin-catalog-
|
|
|
6
6
|
import { trimEnd } from 'lodash';
|
|
7
7
|
import { useSearchParams } from 'react-router-dom';
|
|
8
8
|
import React, { useEffect } from 'react';
|
|
9
|
+
import DataLoader from 'dataloader';
|
|
9
10
|
|
|
10
11
|
function useQetaApi(f, deps = []) {
|
|
11
12
|
const qetaApi = useApi(qetaApiRef);
|
|
@@ -240,6 +241,27 @@ const useBasePath = () => {
|
|
|
240
241
|
const { pathname } = new URL(url, base);
|
|
241
242
|
return trimEnd(pathname, "/");
|
|
242
243
|
};
|
|
244
|
+
const userCache = /* @__PURE__ */ new Map();
|
|
245
|
+
const dataLoader = new DataLoader(
|
|
246
|
+
async (entityRefs) => {
|
|
247
|
+
const catalogApi = useApi(catalogApiRef);
|
|
248
|
+
const { items } = await catalogApi.getEntitiesByRefs({
|
|
249
|
+
entityRefs
|
|
250
|
+
});
|
|
251
|
+
entityRefs.forEach((entityRef, index) => {
|
|
252
|
+
userCache.set(entityRef, items[index]);
|
|
253
|
+
});
|
|
254
|
+
return items;
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
name: "EntityAuthorLoader",
|
|
258
|
+
cacheMap: /* @__PURE__ */ new Map(),
|
|
259
|
+
maxBatchSize: 100,
|
|
260
|
+
batchScheduleFn: (callback) => {
|
|
261
|
+
setTimeout(callback, 50);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
);
|
|
243
265
|
const useEntityAuthor = (entity) => {
|
|
244
266
|
const catalogApi = useApi(catalogApiRef);
|
|
245
267
|
const identityApi = useApi(identityApiRef);
|
|
@@ -254,10 +276,23 @@ const useEntityAuthor = (entity) => {
|
|
|
254
276
|
}
|
|
255
277
|
const { primaryTitle: userName } = useEntityPresentation(author);
|
|
256
278
|
useEffect(() => {
|
|
257
|
-
if (
|
|
258
|
-
|
|
279
|
+
if (anonymous) {
|
|
280
|
+
return;
|
|
259
281
|
}
|
|
260
|
-
|
|
282
|
+
if (userCache.get(author)) {
|
|
283
|
+
setUser(userCache.get(author));
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
dataLoader.load(author).then((data) => {
|
|
287
|
+
if (data) {
|
|
288
|
+
setUser(data);
|
|
289
|
+
} else {
|
|
290
|
+
setUser(null);
|
|
291
|
+
}
|
|
292
|
+
}).catch(() => {
|
|
293
|
+
setUser(null);
|
|
294
|
+
});
|
|
295
|
+
}, [catalogApi, author, anonymous]);
|
|
261
296
|
useEffect(() => {
|
|
262
297
|
identityApi.getBackstageIdentity().then((res) => {
|
|
263
298
|
setCurrentUser(res.userEntityRef ?? "user:default/guest");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.esm.js","sources":["../../src/utils/hooks.ts"],"sourcesContent":["import { QetaApi, qetaApiRef } from '../api';\nimport useAsync from 'react-use/lib/useAsync';\nimport {\n configApiRef,\n IdentityApi,\n identityApiRef,\n useApi,\n} from '@backstage/core-plugin-api';\nimport { makeStyles } from '@material-ui/core';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport {\n catalogApiRef,\n useEntityPresentation,\n} from '@backstage/plugin-catalog-react';\nimport { trimEnd } from 'lodash';\nimport { useSearchParams } from 'react-router-dom';\nimport React, { useEffect } from 'react';\nimport { UserEntity } from '@backstage/catalog-model';\nimport {\n AnswerResponse,\n QuestionResponse,\n} from '@drodil/backstage-plugin-qeta-common';\n\nexport function useQetaApi<T>(\n f: (api: QetaApi) => Promise<T>,\n deps: any[] = [],\n) {\n const qetaApi = useApi(qetaApiRef);\n\n return useAsync(async () => {\n return await f(qetaApi);\n }, deps);\n}\n\nexport function useCatalogApi<T>(\n f: (api: CatalogApi) => Promise<T>,\n deps: any[] = [],\n) {\n const catalogApi = useApi(catalogApiRef);\n\n return useAsync(async () => {\n return await f(catalogApi);\n }, deps);\n}\n\nexport function useIdentityApi<T>(\n f: (api: IdentityApi) => Promise<T>,\n deps: any[] = [],\n) {\n const identityApi = useApi(identityApiRef);\n\n return useAsync(async () => {\n return await f(identityApi);\n }, deps);\n}\n\nexport function useEntityQueryParameter(entity?: string) {\n const [searchParams] = useSearchParams();\n const [entityRef, setEntityRef] = React.useState<string | undefined>(entity);\n\n useEffect(() => {\n setEntityRef(searchParams.get('entity') ?? undefined);\n }, [searchParams, setEntityRef]);\n\n return entityRef;\n}\n\nexport const useStyles = makeStyles(theme => {\n return {\n markdownEditor: {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n border: `1px solid ${theme.palette.action.disabled}`,\n borderRadius: theme.shape.borderRadius,\n '&:hover': {\n borderColor: theme.palette.action.active,\n },\n '&:focus-within': {\n borderColor: theme.palette.primary.main,\n },\n '& .mde-header': {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n borderBottom: `1px solid ${theme.palette.action.selected}`,\n '& .mde-tabs button, .mde-header-item > button': {\n color: `${theme.palette.text.primary} !important`,\n },\n },\n '& .mde-preview-content': {\n padding: '10px',\n },\n '& .mde-text, .mde-preview': {\n fontSize: theme.typography.body1.fontSize,\n fontFamily: theme.typography.body1.fontFamily,\n lineHeight: theme.typography.body1.lineHeight,\n },\n '& .mde-text': {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n outline: 'none',\n },\n '& .image-tip': {\n color: theme.palette.text.primary,\n backgroundColor: 'initial',\n },\n },\n markdownEditorError: {\n border: `1px solid ${theme.palette.error.main} !important`,\n },\n markdownContent: {\n '& *': {\n wordBreak: 'break-word',\n },\n '&.inline': {\n display: 'inline-block',\n },\n '& > :first-child': {\n marginTop: '0px !important',\n },\n '& > :last-child': {\n marginBottom: '0px !important',\n },\n },\n successColor: {\n color: theme.palette.success.main,\n },\n questionDivider: {\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n questionCard: {\n marginBottom: theme.spacing(1),\n position: 'relative',\n },\n questionCardVote: {\n textAlign: 'center',\n width: '32px',\n marginRight: '26px',\n display: 'inline-block',\n verticalAlign: 'top',\n },\n questionCardContent: {\n display: 'inline-block',\n width: 'calc(100% - 70px)',\n minHeight: '160px',\n },\n questionListItemStats: {\n width: '80px',\n textAlign: 'right',\n marginRight: '26px',\n display: 'inline-block',\n verticalAlign: 'top',\n paddingTop: '10px',\n },\n questionListItemContent: {\n display: 'inline-block',\n width: 'calc(100% - 120px)',\n },\n questionListItemAuthor: {\n display: 'inline',\n float: 'right',\n },\n questionListItemAvatar: {\n display: 'inline-flex',\n marginRight: '0.25rem',\n fontSize: '1rem',\n maxWidth: '1rem',\n maxHeight: '1rem',\n },\n answerCardContent: {\n display: 'inline-block',\n width: 'calc(100% - 70px)',\n },\n questionCardAuthor: {\n padding: theme.spacing(1),\n float: 'right',\n maxWidth: '200px',\n border: `1px solid ${theme.palette.action.selected}`,\n '& .avatar': {\n width: theme.spacing(3),\n height: theme.spacing(3),\n fontSize: '1rem',\n },\n },\n questionListPagination: {\n marginTop: theme.spacing(2),\n },\n postButton: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(1),\n },\n questionsPerPageInput: {\n paddingTop: '10px',\n },\n questionsPerPage: {\n marginRight: theme.spacing(3),\n },\n questionHighlightList: {\n width: '100%',\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n '&:not(:first-child)': {\n marginTop: theme.spacing(2),\n },\n },\n filterPanel: {\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n padding: theme.spacing(3),\n },\n questionCardMetadata: {\n marginTop: theme.spacing(3),\n },\n marginRight: {\n marginRight: theme.spacing(1),\n },\n questionCardActions: {\n marginTop: theme.spacing(2),\n '& a': {\n marginRight: theme.spacing(1),\n },\n },\n noPadding: {\n padding: `0 !important`,\n },\n menuIcon: {\n minWidth: '26px',\n },\n deleteModal: {\n position: 'absolute',\n top: '20%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: 400,\n backgroundColor: theme.palette.background.default,\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n padding: theme.spacing(2),\n '& button': {\n marginTop: theme.spacing(2),\n float: 'right',\n },\n },\n authorLink: {\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n highlight: {\n animation: '$highlight 2s',\n },\n '@keyframes highlight': {\n '0%': {\n boxShadow: `0px 0px 0px 3px ${theme.palette.secondary.light}`,\n },\n '100%': {\n boxShadow: 'none',\n },\n },\n dateFilter: {\n minWidth: '200px',\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n };\n});\n\n// Url resolving logic from https://github.com/backstage/backstage/blob/master/packages/core-components/src/components/Link/Link.tsx\n\n/**\n * Returns the app base url that could be empty if the Config API is not properly implemented.\n * The only cases there would be no Config API are in tests and in storybook stories, and in those cases, it's unlikely that callers would rely on this subpath behavior.\n */\nexport const useBaseUrl = () => {\n try {\n const config = useApi(configApiRef);\n return config.getOptionalString('app.baseUrl');\n } catch {\n return undefined;\n }\n};\n\nexport const useBasePath = () => {\n // baseUrl can be specified as just a path\n const base = 'http://sample.dev';\n const url = useBaseUrl() ?? '/';\n const { pathname } = new URL(url, base);\n return trimEnd(pathname, '/');\n};\n\nexport const useEntityAuthor = (entity: QuestionResponse | AnswerResponse) => {\n const catalogApi = useApi(catalogApiRef);\n const identityApi = useApi(identityApiRef);\n const [name, setName] = React.useState<string | undefined>(undefined);\n const [user, setUser] = React.useState<UserEntity | null>(null);\n const [initials, setInitials] = React.useState<string | null>(null);\n const [currentUser, setCurrentUser] = React.useState<string | null>(null);\n const anonymous = entity.anonymous ?? false;\n let author = entity.author;\n if (!author.startsWith('user:')) {\n author = `user:${author}`;\n }\n\n const { primaryTitle: userName } = useEntityPresentation(author);\n\n useEffect(() => {\n if (!anonymous) {\n catalogApi\n .getEntityByRef(entity.author)\n .catch(_ => setUser(null))\n .then(data => (data ? setUser(data as UserEntity) : setUser(null)));\n }\n }, [catalogApi, entity, anonymous]);\n\n useEffect(() => {\n identityApi.getBackstageIdentity().then(res => {\n setCurrentUser(res.userEntityRef ?? 'user:default/guest');\n });\n }, [identityApi]);\n\n useEffect(() => {\n let displayName = userName;\n if (entity.author === currentUser) {\n displayName = 'You';\n if (anonymous) {\n displayName += ' (anonymous)';\n }\n }\n setName(displayName);\n }, [entity.author, anonymous, currentUser, userName]);\n\n useEffect(() => {\n const init = (name ?? '')\n .split(' ')\n .map(p => p[0])\n .join('')\n .substring(0, 2)\n .toUpperCase();\n setInitials(init);\n }, [name]);\n\n return { name, initials, user };\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hooks.esm.js","sources":["../../src/utils/hooks.ts"],"sourcesContent":["import { QetaApi, qetaApiRef } from '../api';\nimport useAsync from 'react-use/lib/useAsync';\nimport {\n configApiRef,\n IdentityApi,\n identityApiRef,\n useApi,\n} from '@backstage/core-plugin-api';\nimport { makeStyles } from '@material-ui/core';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport {\n catalogApiRef,\n useEntityPresentation,\n} from '@backstage/plugin-catalog-react';\nimport { trimEnd } from 'lodash';\nimport { useSearchParams } from 'react-router-dom';\nimport React, { useEffect } from 'react';\nimport { UserEntity } from '@backstage/catalog-model';\nimport {\n AnswerResponse,\n QuestionResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport DataLoader from 'dataloader';\n\nexport function useQetaApi<T>(\n f: (api: QetaApi) => Promise<T>,\n deps: any[] = [],\n) {\n const qetaApi = useApi(qetaApiRef);\n\n return useAsync(async () => {\n return await f(qetaApi);\n }, deps);\n}\n\nexport function useCatalogApi<T>(\n f: (api: CatalogApi) => Promise<T>,\n deps: any[] = [],\n) {\n const catalogApi = useApi(catalogApiRef);\n\n return useAsync(async () => {\n return await f(catalogApi);\n }, deps);\n}\n\nexport function useIdentityApi<T>(\n f: (api: IdentityApi) => Promise<T>,\n deps: any[] = [],\n) {\n const identityApi = useApi(identityApiRef);\n\n return useAsync(async () => {\n return await f(identityApi);\n }, deps);\n}\n\nexport function useEntityQueryParameter(entity?: string) {\n const [searchParams] = useSearchParams();\n const [entityRef, setEntityRef] = React.useState<string | undefined>(entity);\n\n useEffect(() => {\n setEntityRef(searchParams.get('entity') ?? undefined);\n }, [searchParams, setEntityRef]);\n\n return entityRef;\n}\n\nexport const useStyles = makeStyles(theme => {\n return {\n markdownEditor: {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n border: `1px solid ${theme.palette.action.disabled}`,\n borderRadius: theme.shape.borderRadius,\n '&:hover': {\n borderColor: theme.palette.action.active,\n },\n '&:focus-within': {\n borderColor: theme.palette.primary.main,\n },\n '& .mde-header': {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n borderBottom: `1px solid ${theme.palette.action.selected}`,\n '& .mde-tabs button, .mde-header-item > button': {\n color: `${theme.palette.text.primary} !important`,\n },\n },\n '& .mde-preview-content': {\n padding: '10px',\n },\n '& .mde-text, .mde-preview': {\n fontSize: theme.typography.body1.fontSize,\n fontFamily: theme.typography.body1.fontFamily,\n lineHeight: theme.typography.body1.lineHeight,\n },\n '& .mde-text': {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n outline: 'none',\n },\n '& .image-tip': {\n color: theme.palette.text.primary,\n backgroundColor: 'initial',\n },\n },\n markdownEditorError: {\n border: `1px solid ${theme.palette.error.main} !important`,\n },\n markdownContent: {\n '& *': {\n wordBreak: 'break-word',\n },\n '&.inline': {\n display: 'inline-block',\n },\n '& > :first-child': {\n marginTop: '0px !important',\n },\n '& > :last-child': {\n marginBottom: '0px !important',\n },\n },\n successColor: {\n color: theme.palette.success.main,\n },\n questionDivider: {\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n questionCard: {\n marginBottom: theme.spacing(1),\n position: 'relative',\n },\n questionCardVote: {\n textAlign: 'center',\n width: '32px',\n marginRight: '26px',\n display: 'inline-block',\n verticalAlign: 'top',\n },\n questionCardContent: {\n display: 'inline-block',\n width: 'calc(100% - 70px)',\n minHeight: '160px',\n },\n questionListItemStats: {\n width: '80px',\n textAlign: 'right',\n marginRight: '26px',\n display: 'inline-block',\n verticalAlign: 'top',\n paddingTop: '10px',\n },\n questionListItemContent: {\n display: 'inline-block',\n width: 'calc(100% - 120px)',\n },\n questionListItemAuthor: {\n display: 'inline',\n float: 'right',\n },\n questionListItemAvatar: {\n display: 'inline-flex',\n marginRight: '0.25rem',\n fontSize: '1rem',\n maxWidth: '1rem',\n maxHeight: '1rem',\n },\n answerCardContent: {\n display: 'inline-block',\n width: 'calc(100% - 70px)',\n },\n questionCardAuthor: {\n padding: theme.spacing(1),\n float: 'right',\n maxWidth: '200px',\n border: `1px solid ${theme.palette.action.selected}`,\n '& .avatar': {\n width: theme.spacing(3),\n height: theme.spacing(3),\n fontSize: '1rem',\n },\n },\n questionListPagination: {\n marginTop: theme.spacing(2),\n },\n postButton: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(1),\n },\n questionsPerPageInput: {\n paddingTop: '10px',\n },\n questionsPerPage: {\n marginRight: theme.spacing(3),\n },\n questionHighlightList: {\n width: '100%',\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n '&:not(:first-child)': {\n marginTop: theme.spacing(2),\n },\n },\n filterPanel: {\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n padding: theme.spacing(3),\n },\n questionCardMetadata: {\n marginTop: theme.spacing(3),\n },\n marginRight: {\n marginRight: theme.spacing(1),\n },\n questionCardActions: {\n marginTop: theme.spacing(2),\n '& a': {\n marginRight: theme.spacing(1),\n },\n },\n noPadding: {\n padding: `0 !important`,\n },\n menuIcon: {\n minWidth: '26px',\n },\n deleteModal: {\n position: 'absolute',\n top: '20%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: 400,\n backgroundColor: theme.palette.background.default,\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n padding: theme.spacing(2),\n '& button': {\n marginTop: theme.spacing(2),\n float: 'right',\n },\n },\n authorLink: {\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n highlight: {\n animation: '$highlight 2s',\n },\n '@keyframes highlight': {\n '0%': {\n boxShadow: `0px 0px 0px 3px ${theme.palette.secondary.light}`,\n },\n '100%': {\n boxShadow: 'none',\n },\n },\n dateFilter: {\n minWidth: '200px',\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n };\n});\n\n// Url resolving logic from https://github.com/backstage/backstage/blob/master/packages/core-components/src/components/Link/Link.tsx\n\n/**\n * Returns the app base url that could be empty if the Config API is not properly implemented.\n * The only cases there would be no Config API are in tests and in storybook stories, and in those cases, it's unlikely that callers would rely on this subpath behavior.\n */\nexport const useBaseUrl = () => {\n try {\n const config = useApi(configApiRef);\n return config.getOptionalString('app.baseUrl');\n } catch {\n return undefined;\n }\n};\n\nexport const useBasePath = () => {\n // baseUrl can be specified as just a path\n const base = 'http://sample.dev';\n const url = useBaseUrl() ?? '/';\n const { pathname } = new URL(url, base);\n return trimEnd(pathname, '/');\n};\n\nconst userCache: Map<string, UserEntity> = new Map();\nconst dataLoader = new DataLoader(\n async (entityRefs: readonly string[]) => {\n const catalogApi = useApi(catalogApiRef);\n const { items } = await catalogApi.getEntitiesByRefs({\n entityRefs: entityRefs as string[],\n });\n\n entityRefs.forEach((entityRef, index) => {\n userCache.set(entityRef, items[index] as UserEntity);\n });\n return items;\n },\n {\n name: 'EntityAuthorLoader',\n cacheMap: new Map(),\n maxBatchSize: 100,\n batchScheduleFn: callback => {\n setTimeout(callback, 50);\n },\n },\n);\n\nexport const useEntityAuthor = (entity: QuestionResponse | AnswerResponse) => {\n const catalogApi = useApi(catalogApiRef);\n const identityApi = useApi(identityApiRef);\n const [name, setName] = React.useState<string | undefined>(undefined);\n const [user, setUser] = React.useState<UserEntity | null>(null);\n const [initials, setInitials] = React.useState<string | null>(null);\n const [currentUser, setCurrentUser] = React.useState<string | null>(null);\n const anonymous = entity.anonymous ?? false;\n let author = entity.author;\n if (!author.startsWith('user:')) {\n author = `user:${author}`;\n }\n\n const { primaryTitle: userName } = useEntityPresentation(author);\n\n useEffect(() => {\n if (anonymous) {\n return;\n }\n\n if (userCache.get(author)) {\n setUser(userCache.get(author) as UserEntity);\n return;\n }\n\n dataLoader\n .load(author)\n .then(data => {\n if (data) {\n setUser(data as UserEntity);\n } else {\n setUser(null);\n }\n })\n .catch(() => {\n setUser(null);\n });\n }, [catalogApi, author, anonymous]);\n\n useEffect(() => {\n identityApi.getBackstageIdentity().then(res => {\n setCurrentUser(res.userEntityRef ?? 'user:default/guest');\n });\n }, [identityApi]);\n\n useEffect(() => {\n let displayName = userName;\n if (entity.author === currentUser) {\n displayName = 'You';\n if (anonymous) {\n displayName += ' (anonymous)';\n }\n }\n setName(displayName);\n }, [entity.author, anonymous, currentUser, userName]);\n\n useEffect(() => {\n const init = (name ?? '')\n .split(' ')\n .map(p => p[0])\n .join('')\n .substring(0, 2)\n .toUpperCase();\n setInitials(init);\n }, [name]);\n\n return { name, initials, user };\n};\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"frontend",
|
|
8
8
|
"backstage.io"
|
|
9
9
|
],
|
|
10
|
-
"version": "2.5.
|
|
10
|
+
"version": "2.5.2",
|
|
11
11
|
"main": "dist/index.esm.js",
|
|
12
12
|
"types": "dist/index.d.ts",
|
|
13
13
|
"prepublishOnly": "yarn tsc && yarn build",
|
|
@@ -57,12 +57,13 @@
|
|
|
57
57
|
"@backstage/plugin-home-react": "^0.1.15",
|
|
58
58
|
"@backstage/plugin-permission-react": "^0.4.24",
|
|
59
59
|
"@backstage/plugin-signals-react": "^0.0.4",
|
|
60
|
-
"@drodil/backstage-plugin-qeta-common": "^2.5.
|
|
61
|
-
"@drodil/backstage-plugin-qeta-react": "^2.5.
|
|
60
|
+
"@drodil/backstage-plugin-qeta-common": "^2.5.2",
|
|
61
|
+
"@drodil/backstage-plugin-qeta-react": "^2.5.2",
|
|
62
62
|
"@material-ui/core": "^4.12.2",
|
|
63
63
|
"@material-ui/icons": "^4.11.3",
|
|
64
64
|
"@material-ui/lab": "4.0.0-alpha.61",
|
|
65
65
|
"ajv": "^8.12.0",
|
|
66
|
+
"dataloader": "^2.2.2",
|
|
66
67
|
"dompurify": "^3.0.5",
|
|
67
68
|
"file-type": "16.5.4",
|
|
68
69
|
"lodash": "^4.17.21",
|