<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: How to store and retrieve documents from DocumentStore? in Developer Q&amp;A Forum</title>
    <link>https://community.dynatrace.com/t5/Developer-Q-A-Forum/How-to-store-and-retrieve-documents-from-DocumentStore/m-p/200272#M74</link>
    <description>&lt;P&gt;Hope you'll like it! It helped my team a lot to start!&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;DocumentStoreSandbox.tsx&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;import React, { FunctionComponent, useState, useEffect } from "react";
import { Flex, Modal, Button, TextInput, TextArea, FormField } from "@dynatrace/strato-components-preview";
import { documentsClient, CreateDocumentBody } from "@dynatrace-sdk/client-document";
import { DocumentsStoreSandboxView } from "./DocumentsStoreSandboxView";

export const DocumentStoreSandbox: FunctionComponent = () =&amp;gt; {
  const [docData, setDocData] = useState("doc");
  const [savedDocuments, setSavedDocuments] = useState&amp;lt;{ id: string; name: string; version: string }[]&amp;gt;([]);
  const [savedDocName, setSavedDocName] = useState("default doc name");
  const [saveModalState, setSaveModalState] = useState(false);
  const [loadedOnce, setLoadedOnce] = useState(false);

  function loadDocuments() {
    const getDocumentsFromDocStore = async () =&amp;gt; {
      const myDocs = await documentsClient.listDocuments({
        filter: "type = 'schema_documents'",
      });
      setSavedDocuments(myDocs.documents.map((o) =&amp;gt; ({ id: o.id, name: o.name, version: o.version })));
    };
    getDocumentsFromDocStore();
  }

  function setDocFromDocStore(doc_name) {
    const obj = savedDocuments.find((o) =&amp;gt; o.name === doc_name);

    const getDocData = async (id: string) =&amp;gt; {
      const obj = await documentsClient.downloadDocumentContent({
        id,
      });
      const result = JSON.parse(await obj.get("text"));
      setDocData(result.docData);
    };
    if (obj !== undefined) {
      console.log("docid:" + obj.id);

      getDocData(obj.id);
    }
  }

  function addNewDocument() {
    const doc = { docData: docData };
    const document: CreateDocumentBody = {
      name: savedDocName,
      type: "schema_documents",
      content: new Blob([JSON.stringify(doc, null, 2)], {
        type: "application/json",
      }),
    };
    documentsClient.createDocument({ body: document }).then(() =&amp;gt; {
      loadDocuments();
      setSaveModalState(false);
    });
  }

  function saveDocData() {
    setSavedDocName("");
    setSaveModalState(true);
  }

  function shareDocument(evt) {
    const target = evt.target.localName == "svg" ? evt.target : evt.target.parentNode;
    const docTitle = target?.parentNode?.parentNode?.children[0].textContent;
    const obj = savedDocuments.find((o) =&amp;gt; o.name === docTitle);

    const shareDocument = async (obj: object) =&amp;gt; {
      (window as any).dtSdk.shareDocument(obj["id"]);
    };
    if (obj !== undefined) {
      shareDocument(obj);
    }
  }
  function removeDocument(evt) {
    const target = evt.target.localName == "svg" ? evt.target : evt.target.parentNode;
    const docTitle = target?.parentNode?.parentNode?.children[0].textContent;
    const obj = savedDocuments.find((o) =&amp;gt; o.name === docTitle);

    const deleteDocument = async (obj: object) =&amp;gt; {
      const response = await documentsClient.deleteDocument({
        id: obj["id"],
        optimisticLockingVersion: obj["version"],
      });
      console.log(JSON.stringify(response));
      loadDocuments();
    };
    if (obj !== undefined) {
      deleteDocument(obj);
    }
  }

  useEffect(() =&amp;gt; {
    if (!loadedOnce) {
      loadDocuments();
      setLoadedOnce(true);
    }
  }, [loadedOnce]);

  return (
    &amp;lt;Flex flexDirection="column" width={"100%"}&amp;gt;
      &amp;lt;Flex flexDirection="row"&amp;gt;
        &amp;lt;Button onClick={saveDocData}&amp;gt;Save document&amp;lt;/Button&amp;gt;
      &amp;lt;/Flex&amp;gt;
      &amp;lt;Flex flexDirection="row"&amp;gt;
        &amp;lt;Flex flexDirection="column" width={"20%"} padding={2}&amp;gt;
          &amp;lt;DocumentsStoreSandboxView
            title={"My documents"}
            documents={savedDocuments}
            onRemove={(evt) =&amp;gt; {
              removeDocument(evt);
            }}
            onShare={(evt) =&amp;gt; {
              shareDocument(evt);
            }}
            onClick={(evt) =&amp;gt; {
              setDocFromDocStore((evt.target as HTMLElement).innerText);
            }}
          /&amp;gt;
        &amp;lt;/Flex&amp;gt;
        &amp;lt;Flex flexDirection="column" width={"80%"} padding={2}&amp;gt;
          &amp;lt;TextArea value={docData} onChange={setDocData} /&amp;gt;
        &amp;lt;/Flex&amp;gt;
        &amp;lt;Modal
          title="Save new document"
          show={saveModalState}
          onDismiss={() =&amp;gt; setSaveModalState(false)}
          dismissible={true}
        &amp;gt;
          &amp;lt;FormField label="Document Name"&amp;gt;
            &amp;lt;TextInput placeholder={"Enter document name"} value={savedDocName} onChange={setSavedDocName} /&amp;gt;
          &amp;lt;/FormField&amp;gt;
          &amp;lt;Button onClick={() =&amp;gt; setSaveModalState(false)}&amp;gt;Cancel&amp;lt;/Button&amp;gt;
          &amp;lt;Button onClick={addNewDocument}&amp;gt;Save document&amp;lt;/Button&amp;gt;
        &amp;lt;/Modal&amp;gt;
      &amp;lt;/Flex&amp;gt;
    &amp;lt;/Flex&amp;gt;
  );
};&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;DocumentsStoreSandboxView.tsx:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;import React from "react";
import { Flex, Button, Paragraph } from "@dynatrace/strato-components-preview";
import { DeleteIcon, ShareIcon } from "@dynatrace/strato-icons";

export interface DocumentsStoreSandboxViewProps {
  title: string;
  documents: object[];
  onRemove(event): void;
  onClick(event): void;
  onShare(event): void;
}

export const DocumentsStoreSandboxView = (props: DocumentsStoreSandboxViewProps) =&amp;gt; {
  const { title, documents } = props;

  return (
    &amp;lt;Flex width={"100%"} flexDirection="column"&amp;gt;
      &amp;lt;Paragraph&amp;gt;{title}&amp;lt;/Paragraph&amp;gt;
      &amp;lt;div className={"documents"}&amp;gt;
        {documents.map((k) =&amp;gt; (
          &amp;lt;div key={"doc_" + k["id"]}&amp;gt;
            &amp;lt;Button className={"item"} onClick={props.onClick} key={k["id"]}&amp;gt;
              {k["name"]}
            &amp;lt;/Button&amp;gt;
            &amp;lt;div className={"remove"} key={"rem_" + k["id"]} onClick={props.onRemove}&amp;gt;
              &amp;lt;DeleteIcon /&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div className={"share"} key={"share_" + k["id"]} onClick={props.onShare}&amp;gt;
              &amp;lt;ShareIcon /&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div className={"clr"}&amp;gt;&amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;
        ))}
      &amp;lt;/div&amp;gt;
    &amp;lt;/Flex&amp;gt;
  );
};&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;and:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Document.tsx&amp;nbsp;&lt;/STRONG&gt;(page)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;import React from "react";
import { Flex } from "@dynatrace/strato-components-preview";
import { IntlProvider } from 'react-intl';
import {DocumentStoreSandbox} from "../components/DocumentStoreSandbox";

export const Document = () =&amp;gt; {

    return (
        &amp;lt;Flex flexDirection="row" padding={2}&amp;gt;
            &amp;lt;IntlProvider locale="en"&amp;gt;
                &amp;lt;DocumentStoreSandbox /&amp;gt;
            &amp;lt;/IntlProvider&amp;gt;
        &amp;lt;/Flex&amp;gt;
    );
};
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Fri, 21 Apr 2023 08:37:57 GMT</pubDate>
    <dc:creator>Radoslaw_Szulgo</dc:creator>
    <dc:date>2023-04-21T08:37:57Z</dc:date>
    <item>
      <title>How to store and retrieve documents from DocumentStore?</title>
      <link>https://community.dynatrace.com/t5/Developer-Q-A-Forum/How-to-store-and-retrieve-documents-from-DocumentStore/m-p/200271#M73</link>
      <description>&lt;P&gt;I'm a total newbie in the Document Store service. As a first step, I'd like to have something to manage documents in my app - add new ones, delete, and retrieve data.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 20 Apr 2023 08:03:01 GMT</pubDate>
      <guid>https://community.dynatrace.com/t5/Developer-Q-A-Forum/How-to-store-and-retrieve-documents-from-DocumentStore/m-p/200271#M73</guid>
      <dc:creator>Radoslaw_Szulgo</dc:creator>
      <dc:date>2023-04-20T08:03:01Z</dc:date>
    </item>
    <item>
      <title>Re: How to store and retrieve documents from DocumentStore?</title>
      <link>https://community.dynatrace.com/t5/Developer-Q-A-Forum/How-to-store-and-retrieve-documents-from-DocumentStore/m-p/200272#M74</link>
      <description>&lt;P&gt;Hope you'll like it! It helped my team a lot to start!&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;DocumentStoreSandbox.tsx&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;import React, { FunctionComponent, useState, useEffect } from "react";
import { Flex, Modal, Button, TextInput, TextArea, FormField } from "@dynatrace/strato-components-preview";
import { documentsClient, CreateDocumentBody } from "@dynatrace-sdk/client-document";
import { DocumentsStoreSandboxView } from "./DocumentsStoreSandboxView";

export const DocumentStoreSandbox: FunctionComponent = () =&amp;gt; {
  const [docData, setDocData] = useState("doc");
  const [savedDocuments, setSavedDocuments] = useState&amp;lt;{ id: string; name: string; version: string }[]&amp;gt;([]);
  const [savedDocName, setSavedDocName] = useState("default doc name");
  const [saveModalState, setSaveModalState] = useState(false);
  const [loadedOnce, setLoadedOnce] = useState(false);

  function loadDocuments() {
    const getDocumentsFromDocStore = async () =&amp;gt; {
      const myDocs = await documentsClient.listDocuments({
        filter: "type = 'schema_documents'",
      });
      setSavedDocuments(myDocs.documents.map((o) =&amp;gt; ({ id: o.id, name: o.name, version: o.version })));
    };
    getDocumentsFromDocStore();
  }

  function setDocFromDocStore(doc_name) {
    const obj = savedDocuments.find((o) =&amp;gt; o.name === doc_name);

    const getDocData = async (id: string) =&amp;gt; {
      const obj = await documentsClient.downloadDocumentContent({
        id,
      });
      const result = JSON.parse(await obj.get("text"));
      setDocData(result.docData);
    };
    if (obj !== undefined) {
      console.log("docid:" + obj.id);

      getDocData(obj.id);
    }
  }

  function addNewDocument() {
    const doc = { docData: docData };
    const document: CreateDocumentBody = {
      name: savedDocName,
      type: "schema_documents",
      content: new Blob([JSON.stringify(doc, null, 2)], {
        type: "application/json",
      }),
    };
    documentsClient.createDocument({ body: document }).then(() =&amp;gt; {
      loadDocuments();
      setSaveModalState(false);
    });
  }

  function saveDocData() {
    setSavedDocName("");
    setSaveModalState(true);
  }

  function shareDocument(evt) {
    const target = evt.target.localName == "svg" ? evt.target : evt.target.parentNode;
    const docTitle = target?.parentNode?.parentNode?.children[0].textContent;
    const obj = savedDocuments.find((o) =&amp;gt; o.name === docTitle);

    const shareDocument = async (obj: object) =&amp;gt; {
      (window as any).dtSdk.shareDocument(obj["id"]);
    };
    if (obj !== undefined) {
      shareDocument(obj);
    }
  }
  function removeDocument(evt) {
    const target = evt.target.localName == "svg" ? evt.target : evt.target.parentNode;
    const docTitle = target?.parentNode?.parentNode?.children[0].textContent;
    const obj = savedDocuments.find((o) =&amp;gt; o.name === docTitle);

    const deleteDocument = async (obj: object) =&amp;gt; {
      const response = await documentsClient.deleteDocument({
        id: obj["id"],
        optimisticLockingVersion: obj["version"],
      });
      console.log(JSON.stringify(response));
      loadDocuments();
    };
    if (obj !== undefined) {
      deleteDocument(obj);
    }
  }

  useEffect(() =&amp;gt; {
    if (!loadedOnce) {
      loadDocuments();
      setLoadedOnce(true);
    }
  }, [loadedOnce]);

  return (
    &amp;lt;Flex flexDirection="column" width={"100%"}&amp;gt;
      &amp;lt;Flex flexDirection="row"&amp;gt;
        &amp;lt;Button onClick={saveDocData}&amp;gt;Save document&amp;lt;/Button&amp;gt;
      &amp;lt;/Flex&amp;gt;
      &amp;lt;Flex flexDirection="row"&amp;gt;
        &amp;lt;Flex flexDirection="column" width={"20%"} padding={2}&amp;gt;
          &amp;lt;DocumentsStoreSandboxView
            title={"My documents"}
            documents={savedDocuments}
            onRemove={(evt) =&amp;gt; {
              removeDocument(evt);
            }}
            onShare={(evt) =&amp;gt; {
              shareDocument(evt);
            }}
            onClick={(evt) =&amp;gt; {
              setDocFromDocStore((evt.target as HTMLElement).innerText);
            }}
          /&amp;gt;
        &amp;lt;/Flex&amp;gt;
        &amp;lt;Flex flexDirection="column" width={"80%"} padding={2}&amp;gt;
          &amp;lt;TextArea value={docData} onChange={setDocData} /&amp;gt;
        &amp;lt;/Flex&amp;gt;
        &amp;lt;Modal
          title="Save new document"
          show={saveModalState}
          onDismiss={() =&amp;gt; setSaveModalState(false)}
          dismissible={true}
        &amp;gt;
          &amp;lt;FormField label="Document Name"&amp;gt;
            &amp;lt;TextInput placeholder={"Enter document name"} value={savedDocName} onChange={setSavedDocName} /&amp;gt;
          &amp;lt;/FormField&amp;gt;
          &amp;lt;Button onClick={() =&amp;gt; setSaveModalState(false)}&amp;gt;Cancel&amp;lt;/Button&amp;gt;
          &amp;lt;Button onClick={addNewDocument}&amp;gt;Save document&amp;lt;/Button&amp;gt;
        &amp;lt;/Modal&amp;gt;
      &amp;lt;/Flex&amp;gt;
    &amp;lt;/Flex&amp;gt;
  );
};&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;DocumentsStoreSandboxView.tsx:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;import React from "react";
import { Flex, Button, Paragraph } from "@dynatrace/strato-components-preview";
import { DeleteIcon, ShareIcon } from "@dynatrace/strato-icons";

export interface DocumentsStoreSandboxViewProps {
  title: string;
  documents: object[];
  onRemove(event): void;
  onClick(event): void;
  onShare(event): void;
}

export const DocumentsStoreSandboxView = (props: DocumentsStoreSandboxViewProps) =&amp;gt; {
  const { title, documents } = props;

  return (
    &amp;lt;Flex width={"100%"} flexDirection="column"&amp;gt;
      &amp;lt;Paragraph&amp;gt;{title}&amp;lt;/Paragraph&amp;gt;
      &amp;lt;div className={"documents"}&amp;gt;
        {documents.map((k) =&amp;gt; (
          &amp;lt;div key={"doc_" + k["id"]}&amp;gt;
            &amp;lt;Button className={"item"} onClick={props.onClick} key={k["id"]}&amp;gt;
              {k["name"]}
            &amp;lt;/Button&amp;gt;
            &amp;lt;div className={"remove"} key={"rem_" + k["id"]} onClick={props.onRemove}&amp;gt;
              &amp;lt;DeleteIcon /&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div className={"share"} key={"share_" + k["id"]} onClick={props.onShare}&amp;gt;
              &amp;lt;ShareIcon /&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div className={"clr"}&amp;gt;&amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;
        ))}
      &amp;lt;/div&amp;gt;
    &amp;lt;/Flex&amp;gt;
  );
};&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;and:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Document.tsx&amp;nbsp;&lt;/STRONG&gt;(page)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;import React from "react";
import { Flex } from "@dynatrace/strato-components-preview";
import { IntlProvider } from 'react-intl';
import {DocumentStoreSandbox} from "../components/DocumentStoreSandbox";

export const Document = () =&amp;gt; {

    return (
        &amp;lt;Flex flexDirection="row" padding={2}&amp;gt;
            &amp;lt;IntlProvider locale="en"&amp;gt;
                &amp;lt;DocumentStoreSandbox /&amp;gt;
            &amp;lt;/IntlProvider&amp;gt;
        &amp;lt;/Flex&amp;gt;
    );
};
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 21 Apr 2023 08:37:57 GMT</pubDate>
      <guid>https://community.dynatrace.com/t5/Developer-Q-A-Forum/How-to-store-and-retrieve-documents-from-DocumentStore/m-p/200272#M74</guid>
      <dc:creator>Radoslaw_Szulgo</dc:creator>
      <dc:date>2023-04-21T08:37:57Z</dc:date>
    </item>
  </channel>
</rss>

