diff --git a/src/playbooks/PlaybookFiles.js b/src/playbooks/PlaybookFiles.js
new file mode 100644
index 0000000..5d3de6d
--- /dev/null
+++ b/src/playbooks/PlaybookFiles.js
@@ -0,0 +1,79 @@
+import React, { Component } from "react";
+import { Button, Icon, Modal } from "patternfly-react";
+
+export default class PlaybookFiles extends Component {
+ state = {
+ showModal: false,
+ filePath: null,
+ fileContent: null
+ };
+
+ close = () => {
+ this.setState({ showModal: false });
+ };
+
+ render() {
+ const { playbook } = this.props;
+ const { showModal, filePath, fileContent } = this.state;
+ return (
+
+
+
+
+ {filePath}
+
+
+
+ {fileContent}
+
+
+
+
+
+
+
+
+
+ Name |
+ Actions |
+
+
+
+ {playbook.files.map(file => (
+
+ {file.path} |
+
+
+ |
+
+ ))}
+
+
+
+ );
+ }
+}
diff --git a/src/playbooks/PlaybookHosts.js b/src/playbooks/PlaybookHosts.js
new file mode 100644
index 0000000..0ebdbc7
--- /dev/null
+++ b/src/playbooks/PlaybookHosts.js
@@ -0,0 +1,80 @@
+import React, { Component } from "react";
+import { OverlayTrigger, Tooltip, Icon } from "patternfly-react";
+
+export class HostsHelpIcon extends Component {
+ render() {
+ return (
+
+
+
+
Tips: Hosts
+
+
+ This panel contains all the hosts involved in the playbook.
+
+
+
+ }
+ placement="bottom"
+ >
+
+
+
+ );
+ }
+}
+
+export default class PlaybookHosts extends Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ search: ""
+ };
+ }
+
+ render() {
+ const { playbook } = this.props;
+ const { search } = this.state;
+ const filteredHosts = playbook.hosts.filter(
+ host => host.name.toLowerCase().indexOf(search.toLowerCase()) !== -1
+ );
+ return (
+
+
+
+ this.setState({ search: e.target.value })}
+ />
+
+
+ Showing {filteredHosts.length} of{" "}
+ {playbook.hosts.length} hosts
+
+
+
+
+
+
+ Name |
+ Alias |
+
+
+
+ {filteredHosts.map(host => (
+
+ {host.name} |
+ {host.alias} |
+
+ ))}
+
+
+
+ );
+ }
+}