mittwald Flow Logo

Foundations

Content strukturieren

Inhalte sollten so strukturiert werden, dass User schnell und einfach alle wichtigen Informationen finden können. Dafür gibt es Components, die auf die Layout- und Strukturierung der Darstellung spezialisiert sind.

Detailseite

Detailseiten zeigen dem User die Inhalte eines bestimmten Elements. Diese können über eine Tab-Navigation in verschiedene Bereiche aufgeteilt werden. Innerhalb des Content-Bereichs wird der Inhalt vertikal durch Sections gegliedert. Horizontal sorgt das ColumnLayout für eine übersichtliche Anordnung. Wichtig ist, dass die wichtigsten Informationen möglichst oben im Content-Bereich stehen. Eine gut strukturierte Heading-Hierarchie hilft zudem, den Inhalt klar und logisch zu ordnen.

not implemented
not implemented
import Heading from "@mittwald/flow-react-components/Heading";
import Text from "@mittwald/flow-react-components/Text";
import Button from "@mittwald/flow-react-components/Button";
import Section from "@mittwald/flow-react-components/Section";
import Label from "@mittwald/flow-react-components/Label";
import Header from "@mittwald/flow-react-components/Header";
import { ColumnLayout } from "@mittwald/flow-react-components/ColumnLayout";
import { LayoutCard } from "@mittwald/flow-react-components/LayoutCard";
import {
  ContextMenu,
  ContextMenuTrigger,
  MenuItem,
} from "@mittwald/flow-react-components/ContextMenu";
import { IconContextMenu } from "@mittwald/flow-react-components/Icons";
import LabeledValue from "@mittwald/flow-react-components/LabeledValue";
import { Alert } from "@mittwald/flow-react-components/Alert";
import { Content } from "@mittwald/flow-react-components/Content";
import { Action } from "@mittwald/flow-react-components/Action";
import {
  Tab,
  Tabs,
  TabTitle,
} from "@mittwald/flow-react-components/Tabs";

export default () => {
  const domain = {
    id: "4",
    hostname: "example.de",
    domain: "example.de",
    type: "Domain",
    ssl: undefined,
    owner: {
      firstName: "Franz",
      lastName: "Müller",
      street: "Jackenweg",
      houseNumber: "44a",
      zip: "12893",
      city: "Lanzhausen",
      email: "f.mueller@mittwald.de",
    },
  };

  const domainDetailsSection = (
    <Section>
      <Header>
        <Heading>Domain-Details</Heading>
        <ContextMenuTrigger>
          <Button color="secondary" variant="soft">
            <IconContextMenu />
          </Button>
          <ContextMenu>
            <MenuItem
              onAction={() => alert("not implemented")}
            >
              Domain umziehen
            </MenuItem>
            <MenuItem
              onAction={() => alert("not implemented")}
            >
              Domain entfernen
            </MenuItem>
          </ContextMenu>
        </ContextMenuTrigger>

        <Button onPress={() => alert("not implemented")}>
          Domain-Ziel ändern
        </Button>
      </Header>
      <Alert status="danger">
        <Heading>
          Es konnte kein SSL-Zertifikat ausgestellt werden
        </Heading>
        <Content>
          <Text>
            Für diese Domain konnte kein SSL-Zertifikat
            ausgestellt werden, da {domain.hostname} nicht
            per DNS auf deine Server-IP zeigt. Ändere den
            A-Record oder CNAME auf die Server-IP zeigen. Es
            kann einige Minuten dauern, bis das Zertifikat
            bei korrekten Einstellungen ausgestellt ist.
          </Text>
          <Action showFeedback>
            <Button>SSL-Zertifikat ausstellen</Button>
          </Action>
        </Content>
      </Alert>
      <ColumnLayout s={[1, 1]}>
        <LabeledValue>
          <Label>Domain-Ziel</Label>
          <Text>{domain.hostname}</Text>
        </LabeledValue>
        <LabeledValue>
          <Label>Zertifikat</Label>
          <Text>{domain.ssl ? domain.ssl : "-"}</Text>
        </LabeledValue>
      </ColumnLayout>
    </Section>
  );

  const domainOwnerSection = (
    <Section>
      <Header>
        <Heading>Domain-Inhaber</Heading>
        <Button
          color="secondary"
          variant="soft"
          onPress={() => alert("not implemented")}
        >
          Bearbeiten
        </Button>
      </Header>
      <ColumnLayout>
        <LabeledValue>
          <Label>Inhaber</Label>
          <Text>
            {domain.owner.firstName} {domain.owner.lastName}
            <br />
            {domain.owner.street} {domain.owner.houseNumber}
            <br />
            {domain.owner.zip} {domain.owner.city}
          </Text>
        </LabeledValue>
        <LabeledValue>
          <Label>E-Mail-Adresse</Label>
          <Text>{domain.owner.email}</Text>
        </LabeledValue>
      </ColumnLayout>
    </Section>
  );

  return (
    <LayoutCard>
      <Tabs>
        <Tab>
          <TabTitle>Allgemein</TabTitle>
          {domainDetailsSection}
          {domainOwnerSection}
        </Tab>
        <Tab>
          <TabTitle>DNS</TabTitle>
          <Text>not implemented</Text>
        </Tab>
        <Tab>
          <TabTitle>Pfade</TabTitle>
          <Text>not implemented</Text>
        </Tab>
      </Tabs>
    </LayoutCard>
  );
}