.spacing(1), backgroundColor: theme.palette.type === 'dark' ? theme.palette.grey[700] : theme.palette.grey[300], display: 'inline-block', borderRadius: 5, border: `1px solid ${theme.palette.grey[500]}`, position: 'relative', }, codeRequired: { '&::after': { position: 'absolute', content: '"*"', top: 0, right: theme.spacing(0.5), fontWeight: 'bolder', color: theme.palette.error.light, }, }, argRequired: { position: 'relative', '& > *': { display: 'inline', position: 'relative', '&::after': { position: 'absolute', content: '"*"', top: 0, right: theme.spacing(-1), fontWeight: 'bolder', color: theme.palette.error.light, }, }, }, link: { paddingLeft: theme.spacing(1), cursor: 'pointer', }, tabs: { display: 'block', minHeight: 'initial', overflow: 'initial', }, })); export const TemplatingExtensionsPageContent = ({ linkLocal, }: { linkLocal?: boolean; }) => { const api = useApi(scaffolderApiRef); const classes = useStyles(); const { t } = useTranslationRef(scaffolderTranslationRef); const { loading, value, error } = useAsync(async () => { if (api.listTemplatingExtensions) { return api.listTemplatingExtensions(); } // eslint-disable-next-line no-console console.warn( 'listTemplatingExtensions is not implemented in the scaffolderApi; please make sure to implement this method.', ); return Promise.resolve({ filters: {}, globals: { functions: {}, values: {} }, }); }, [api]); const [tab, selectTab] = useState('filter'); const [selectedItem, setSelectedItem] = useState(null); const [input, setInput] = useState(''); const handleTab = (_event: any, kind: ExtensionKind) => { if (selectedItem?.kind !== kind) { setSelectedItem(null); setInput(''); } selectTab(kind); }; const selectItem = (item: Extension | null) => { setSelectedItem(item); if (item) { selectTab(item.kind); } }; useEffect(() => { if (value && window.location.hash) { try { selectTab(parseFragment(window.location.hash.substring(1)).kind); document.querySelector(window.location.hash)?.scrollIntoView(); } catch (e) { // ignore bad link } } }, [value]); const extensionKinds = useMemo( () => ({ filter: { icon: , label: t('templatingExtensions.content.filters.title'), }, function: { icon: , label: t('templatingExtensions.content.functions.title'), }, value: { icon: , label: t('templatingExtensions.content.values.title'), }, }), [t], ); const templatingExtensionsLink = useRouteRef(templatingExtensionsRouteRef); if (loading) { return ; } if (error || !value) { return (
{error && }
); } const { filters, globals } = value; const baseLink = ( ); return ( <> ( ), }} /> )} getOptionLabel={option => option.name} getOptionSelected={(lhs, rhs) => lhs === rhs} options={listTemplatingExtensions(value)} groupBy={option => option.kind} renderGroup={params => ( <> {extensionKinds[params.group as ExtensionKind].icon} {extensionKinds[params.group as ExtensionKind].label}
    {params.children}
)} renderOption={(option: Extension) => ( )} onChange={(_event: any, option: Extension | null) => { selectItem(option); }} inputValue={input} onInputChange={(_event: any, s: string) => setInput(s)} loading={loading} fullWidth clearOnEscape /> {Object.entries(extensionKinds).map(([k, v]) => ( ))} {tab === 'filter' && ( )} {tab === 'function' && ( )} {tab === 'value' && ( )} ); }; export const TemplatingExtensionsPage = () => { const navigate = useNavigate(); const editorLink = useRouteRef(editRouteRef); const tasksLink = useRouteRef(scaffolderListTaskRouteRef); const createLink = useRouteRef(rootRouteRef); const actionsLink = useRouteRef(actionsRouteRef); const scaffolderPageContextMenuProps: ScaffolderPageContextMenuProps = { onEditorClicked: () => navigate(editorLink()), onActionsClicked: () => navigate(actionsLink()), onTasksClicked: () => navigate(tasksLink()), onCreateClicked: () => navigate(createLink()), }; const { t } = useTranslationRef(scaffolderTranslationRef); return (
); }; y