in dashboards-observability/public/components/notebooks/components/note_table.tsx [67:315]
export function NoteTable(props: NoteTableProps) {
const [isModalVisible, setIsModalVisible] = useState(false); // Modal Toggle
const [modalLayout, setModalLayout] = useState(<EuiOverlayMask></EuiOverlayMask>); // Modal Layout
const [isActionsPopoverOpen, setIsActionsPopoverOpen] = useState(false);
const [selectedNotebooks, setSelectedNotebooks] = useState<Array<NotebookType>>([]);
const [searchQuery, setSearchQuery] = useState('');
const { notebooks, createNotebook, renameNotebook, cloneNotebook, deleteNotebook } = props;
useEffect(() => {
props.setBreadcrumbs([
props.parentBreadcrumb,
{
text: 'Notebooks',
href: '#/notebooks',
},
]);
props.fetchNotebooks();
}, []);
const closeModal = () => {
setIsModalVisible(false);
};
const showModal = () => {
setIsModalVisible(true);
};
const onCreate = async (newNoteName: string) => {
createNotebook(newNoteName);
closeModal();
};
const onRename = async (newNoteName: string) => {
renameNotebook(newNoteName, selectedNotebooks[0].id);
closeModal();
};
const onClone = async (newName: string) => {
cloneNotebook(newName, selectedNotebooks[0].id);
closeModal();
};
const onDelete = async () => {
const toastMessage = `Notebook${
selectedNotebooks.length > 1 ? 's' : ' "' + selectedNotebooks[0].path + '"'
} successfully deleted!`;
await deleteNotebook(
selectedNotebooks.map((note) => note.id),
toastMessage
);
closeModal();
};
const createNote = () => {
setModalLayout(
getCustomModal(
onCreate,
closeModal,
'Name',
'Create notebook',
'Cancel',
'Create',
undefined,
CREATE_NOTE_MESSAGE
)
);
showModal();
};
const renameNote = () => {
setModalLayout(
getCustomModal(
onRename,
closeModal,
'Name',
'Rename notebook',
'Cancel',
'Rename',
selectedNotebooks[0].path,
CREATE_NOTE_MESSAGE
)
);
showModal();
};
const cloneNote = () => {
setModalLayout(
getCustomModal(
onClone,
closeModal,
'Name',
'Duplicate notebook',
'Cancel',
'Duplicate',
selectedNotebooks[0].path + ' (copy)',
CREATE_NOTE_MESSAGE
)
);
showModal();
};
const deleteNote = () => {
const notebookString = `notebook${selectedNotebooks.length > 1 ? 's' : ''}`;
setModalLayout(
<DeleteNotebookModal
onConfirm={onDelete}
onCancel={closeModal}
title={`Delete ${selectedNotebooks.length} ${notebookString}`}
message={`Are you sure you want to delete the selected ${selectedNotebooks.length} ${notebookString}?`}
/>
);
showModal();
};
const addSampleNotebooks = async () => {
setModalLayout(
getSampleNotebooksModal(closeModal, async () => {
closeModal();
await props.addSampleNotebooks();
})
);
showModal();
};
const popoverButton = (
<EuiButton
iconType="arrowDown"
iconSide="right"
onClick={() => setIsActionsPopoverOpen(!isActionsPopoverOpen)}
>
Actions
</EuiButton>
);
const popoverItems: ReactElement[] = [
<EuiContextMenuItem
key="rename"
disabled={notebooks.length === 0 || selectedNotebooks.length !== 1}
onClick={() => {
setIsActionsPopoverOpen(false);
renameNote();
}}
>
Rename
</EuiContextMenuItem>,
<EuiContextMenuItem
key="duplicate"
disabled={notebooks.length === 0 || selectedNotebooks.length !== 1}
onClick={() => {
setIsActionsPopoverOpen(false);
cloneNote();
}}
>
Duplicate
</EuiContextMenuItem>,
<EuiContextMenuItem
key="delete"
disabled={notebooks.length === 0 || selectedNotebooks.length === 0}
onClick={() => {
setIsActionsPopoverOpen(false);
deleteNote();
}}
>
Delete
</EuiContextMenuItem>,
<EuiContextMenuItem
key="addSample"
onClick={() => {
setIsActionsPopoverOpen(false);
addSampleNotebooks();
}}
>
Add samples
</EuiContextMenuItem>,
];
const tableColumns = [
{
field: 'path',
name: 'Name',
sortable: true,
truncateText: true,
render: (value, record) => (
<EuiLink href={`#/notebooks/${record.id}`}>{_.truncate(value, { length: 100 })}</EuiLink>
),
},
{
field: 'dateModified',
name: 'Last updated',
sortable: true,
render: (value) => moment(value).format(UI_DATE_FORMAT),
},
{
field: 'dateCreated',
name: 'Created',
sortable: true,
render: (value) => moment(value).format(UI_DATE_FORMAT),
},
] as Array<
EuiTableFieldDataColumnType<{
path: string;
id: string;
dateCreated: string;
dateModified: string;
}>
>;
return (
<div style={pageStyles}>
<EuiPage>
<EuiPageBody component="div">
<EuiPageHeader>
<EuiPageHeaderSection>
<EuiTitle size="l">
<h1>Notebooks</h1>
</EuiTitle>
</EuiPageHeaderSection>
</EuiPageHeader>
<EuiPageContent id="notebookArea">
<EuiPageContentHeader>
<EuiPageContentHeaderSection>
<EuiTitle size="s">
<h3>
Notebooks<span className="panel-header-count"> ({notebooks.length})</span>
</h3>
</EuiTitle>
<EuiSpacer size="s" />
<EuiText size="s" color="subdued">
Use Notebooks to interactively and collaboratively develop rich reports backed by
live data. Common use cases for notebooks includes creating postmortem reports,
designing run books, building live infrastructure reports, or even documentation.{' '}
<EuiLink external={true} href={NOTEBOOKS_DOCUMENTATION_URL} target="blank">
Learn more
</EuiLink>
</EuiText>
</EuiPageContentHeaderSection>
<EuiPageContentHeaderSection>
<EuiFlexGroup gutterSize="s">
<EuiFlexItem>
<EuiPopover
panelPaddingSize="none"
button={popoverButton}
isOpen={isActionsPopoverOpen}
closePopover={() => setIsActionsPopoverOpen(false)}
>
<EuiContextMenuPanel items={popoverItems} />
</EuiPopover>
</EuiFlexItem>
<EuiFlexItem>
<EuiButton fill onClick={() => createNote()}>