/* * Copyright (C) 2020 Red Hat, Inc. * SPDX-License-Identifier: LGPL-2.1-or-later */ import cockpit from "cockpit"; import React, { useState } from "react"; import { AboutModal } from "@patternfly/react-core/dist/esm/components/AboutModal/index.js"; import { Button } from "@patternfly/react-core/dist/esm/components/Button/index.js"; import { Divider } from "@patternfly/react-core/dist/esm/components/Divider/index.js"; import { Flex } from "@patternfly/react-core/dist/esm/layouts/Flex/index.js"; import { Menu, MenuContent, MenuSearch, MenuSearchInput, MenuItem, MenuList } from "@patternfly/react-core/dist/esm/components/Menu/index.js"; import { Modal, ModalBody, ModalFooter, ModalHeader } from '@patternfly/react-core/dist/esm/components/Modal/index.js'; import { TextInput } from "@patternfly/react-core/dist/esm/components/TextInput/index.js"; import { Content, ContentVariants } from "@patternfly/react-core/dist/esm/components/Content/index.js"; import { SearchIcon } from '@patternfly/react-icons'; import { useInit } from "hooks"; import { DialogResult } from "dialogs"; import { ShellState } from "./state"; import "menu-select-widget.scss"; const _ = cockpit.gettext; interface Package { name: string; version: string; } export const AboutCockpitModal = ({ dialogResult } : { dialogResult: DialogResult }) => { const [packages, setPackages] = useState([]); useInit(() => { const packages: Package[] = []; const cmd = "(set +e; rpm -qa --qf '%{NAME} %{VERSION}\\n'; dpkg-query -f '${Package} ${Version}\n' --show; pacman -Q) 2> /dev/null | grep cockpit | sort"; cockpit.spawn(["bash", "-c", cmd], { err: "message" }) .then(pkgs => pkgs.trim().split("\n") .forEach(p => { const parts = p.split(" "); packages.push({ name: parts[0], version: parts[1] }); }) ) .catch(error => console.error("Could not read packages versions:", error)) .finally(() => setPackages(packages)); }); return ( dialogResult.resolve()} id="about-cockpit-modal" aria-label="About Cockpit and its versions" trademark={_("Licensed under GNU LGPL version 2.1")} productName={_("Web Console")} brandImageSrc="../shell/images/cockpit-icon-gray.svg" brandImageAlt={_("Web console logo")} > {_("Cockpit is an interactive Linux server admin interface.")} {_("Project website")} {packages === null && {_("Loading packages...")}} {packages !== null && packages.map(p => {p.name} {p.version} )} ); }; export interface LangModalProps { dialogResult: DialogResult; state: ShellState; } export const LangModal = ({ dialogResult, state }: LangModalProps) => { const language = document.cookie.replace(/(?:(?:^|.*;\s*)CockpitLang\s*=\s*([^;]*).*$)|^.*$/, "$1") || "en-us"; const [selected, setSelected] = useState(language); const [searchInput, setSearchInput] = useState(""); function onSelect() { if (!selected) return; const cookie = "CockpitLang=" + encodeURIComponent(selected) + "; path=/; expires=Sun, 16 Jul 3567 06:23:41 GMT"; document.cookie = cookie; window.localStorage.setItem("cockpit.lang", selected); window.location.reload(); } return ( dialogResult.resolve()} >

{_("Choose the language to be used in the application")}

setSelected(selected as string)} activeItemId={selected} selected={selected}> } type="search" onChange={(_event, value) => setSearchInput(value)} /> { (() => { const locales = state.config.manifest.locales || {}; const filteredLocales = Object.keys(locales) .filter(key => !searchInput || locales[key].toLowerCase().includes(searchInput.toString().toLowerCase())); if (filteredLocales.length === 0) { return ( {_("No languages match")} ); } return filteredLocales.map(key => { return ( {locales[key]} ); }); })() }
); }; export interface OopsModalProps { dialogResult: DialogResult; } export function OopsModal({ dialogResult }: OopsModalProps) { return ( dialogResult.resolve()} > {_("Cockpit had an unexpected internal error.")}

{("You can try restarting Cockpit by pressing refresh in your browser. The javascript console contains details about this error") + " ("} {_("Ctrl-Shift-I")} {" " + _("in most browsers") + ")."}
); }