Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion packages/tdb-dashboard/src/components/AboutDataProduct.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ export const AboutDataProduct = ({dataProductDetails, setShowDeleteModal, setSho
const {documentClasses,getDocumentClasses} = useTDBDocuments(woqlClient)
const [radioValue, setRadioValue] = useState(useChangeRequest===false ? "Inactive" : "Active");


const isAdmin = accessControlDashboard ? accessControlDashboard.isAdmin() : false
const {cloneDatabase, loading:loadingClone, error:errorClone , setError:setCloneError} = ManageDatabase()

const cloneInTeam = useRef(null);
Expand All @@ -38,6 +40,10 @@ export const AboutDataProduct = ({dataProductDetails, setShowDeleteModal, setSho
return `${localSettings.server}${organization}/${organization}/${dataProduct}`
}

useEffect(() =>{
setRadioValue(useChangeRequest===false ? "Inactive" : "Active")
},[useChangeRequest])

useEffect(() => {
if(!healthColor) setColor("text-muted")
if(healthColor == DATA_PRODUCT_HEALTHY) setColor("text-success")
Expand Down Expand Up @@ -104,7 +110,7 @@ export const AboutDataProduct = ({dataProductDetails, setShowDeleteModal, setSho

return <React.Fragment>
<HealthModal dataProduct={dataProduct} showHealth={showHealth} setShowHealth={setShowHealth}/>
{clientUser.serverType !== "TerminusDB" &&
{clientUser.serverType !== "TerminusDB" && isAdmin &&
<Card className="bg-transparent p-1 mb-5 tdb__align__container" border="muted">
<Card.Body>
<ButtonGroup>
Expand Down
26 changes: 13 additions & 13 deletions packages/tdb-dashboard/src/components/IconBar.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ import {useParams} from 'react-router-dom'

export const IconBar = ({setShowFeedbackForm}) => {

const {currentChangeRequest,useChangeRequest} = WOQLClientObj()
const {currentChangeRequest,useChangeRequest, accessControlDashboard} = WOQLClientObj()

const instanceRead = accessControlDashboard && accessControlDashboard.instanceRead() ? accessControlDashboard.instanceRead() : false

const { organization, dataProduct } = useParams();

Expand Down Expand Up @@ -66,7 +68,7 @@ export const IconBar = ({setShowFeedbackForm}) => {
{IconBarConfig.dataProductModal.icon}
</Nav.Link>
</Nav.Item>
<Nav.Item>
{instanceRead && <Nav.Item>
<Nav.Link
as={RouterNavLink}
title={IconBarConfig.documentExplorer.title}
Expand All @@ -77,7 +79,7 @@ export const IconBar = ({setShowFeedbackForm}) => {
id={IconBarConfig.documentExplorer.key}>
{IconBarConfig.documentExplorer.icon}
</Nav.Link>
</Nav.Item>
</Nav.Item>}
<Nav.Item>
<Nav.Link as={RouterNavLink}
title={IconBarConfig.dataProductExplorer.title}
Expand All @@ -90,18 +92,18 @@ export const IconBar = ({setShowFeedbackForm}) => {
</Nav.Link>
</Nav.Item>

<Nav.Item>
{instanceRead && <Nav.Item>
<Nav.Link as={RouterNavLink}
title={IconBarConfig.graphiql.title}
className="nav-icon nav-product-expolorer"
className="nav-icon nav-product-expolorer"
{...disabled}
to={getUrl(IconBarConfig.graphiql.path)}

id={IconBarConfig.graphiql.key}>
{IconBarConfig.graphiql.icon}
</Nav.Link>
</Nav.Item>
{useChangeRequest && <Nav.Item>
</Nav.Item>}
{instanceRead && useChangeRequest && <Nav.Item>
<Nav.Link as={RouterNavLink}
title={IconBarConfig.changes.title}
className="nav-icon nav-product-explorer"
Expand All @@ -112,7 +114,8 @@ export const IconBar = ({setShowFeedbackForm}) => {
{IconBarConfig.changes.icon}
</Nav.Link>
</Nav.Item>}
{useChangeRequest && !currentChangeRequest &&
{instanceRead && useChangeRequest && !currentChangeRequest &&
<>
<Nav.Item>
<Nav.Link as={RouterNavLink}
title={IconBarConfig.openAI.title}
Expand All @@ -124,8 +127,6 @@ export const IconBar = ({setShowFeedbackForm}) => {
{IconBarConfig.openAI.icon}
</Nav.Link>
</Nav.Item>
}
{useChangeRequest && !currentChangeRequest &&
<Nav.Item>
<Nav.Link as={RouterNavLink}
title={IconBarConfig.search.title}
Expand All @@ -137,9 +138,7 @@ export const IconBar = ({setShowFeedbackForm}) => {
{IconBarConfig.search.icon}
</Nav.Link>
</Nav.Item>
}
{useChangeRequest && !currentChangeRequest &&
<Nav.Item>
<Nav.Item>
<Nav.Link as={RouterNavLink}
title={IconBarConfig.actions.title}
className="nav-icon nav-product-expolorer"
Expand All @@ -150,6 +149,7 @@ export const IconBar = ({setShowFeedbackForm}) => {
{IconBarConfig.actions.icon}
</Nav.Link>
</Nav.Item>
</>
}
<hr className="my-3" role="separator"></hr>
<div className="nav-icons-bottom">
Expand Down
101 changes: 53 additions & 48 deletions packages/tdb-dashboard/src/components/OpenAICard.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {useOpenAI} from "../hooks/useOpenAI"
import {Alerts} from "./Alerts"
import {SwitchOpenAi} from "./SwitchOpenAi"

export const OpenAICard=({organization})=>{
export const OpenAICard=({organization,isAdmin})=>{

const {loading,changeOpenAIStatus,
error,saveOpenAIKey,hasOpenAIKEY,hasKey,deleteOpenAIKEY} = useOpenAI()
Expand All @@ -25,8 +25,11 @@ export const OpenAICard=({organization})=>{
}
}

function deleteKey () {
deleteOpenAIKEY(organization)
async function deleteKey () {
const done = await deleteOpenAIKEY(organization)
if(done && openAIKEY.current){
openAIKEY.current.value = ""
}
}

function changeStatus (isActive){
Expand All @@ -36,7 +39,7 @@ export const OpenAICard=({organization})=>{

const title = hasKey === false ? "Add your secret OpenAI API key" : "Your OpenAI API key has been set"
const subTitle= getLabel()

function getLabel(){
if(hasKey === false){
return <label className="description text-muted fw-bold">
Expand All @@ -45,62 +48,64 @@ export const OpenAICard=({organization})=>{
}
const label = hasKey === "active" ? "After every change request merge we'll index your documents" : "You have set an OpenAI API key. Please activate this option inorder to index your data"
return label
return <Stack direction="horizontal" gap={4}>
<label className="description text-muted fw-bold mr-auto ">
{label}
</label>
</Stack>

}
const KeyInputComponentInstance = KeyInputComponent()
function KeyInputComponent (){
if(!isAdmin) return <div className="form-group">
<div className="input-group mt-2 mb-2">
<input className="form-control"
value= {"xxxxxxxx"}
type="password"
/>
</div>
</div>
if(hasKey) return <div className="form-group">
<div className="input-group mt-2 mb-2">
<input className="form-control"
value= {"xxxxxxxx"}
type="password"
/>
<div className="input-group-append">
{!loading && <Button variant="danger" id="delete_openai_key" onClick={deleteKey}>Delete OpenAIKey</Button>}
{loading && <button className="btn-lg disabled"><i className="fas fa-spinner fa-spin"></i>
<span style={{marginLeft:"10px"}}>Loading</span></button>}
</div>
</div>
</div>
if(hasKey === false) return <div className="form-group">
<div className="input-group mt-2 mb-2">
<input className="form-control"
id="openAIKEY"
ref={openAIKEY}
type="password"
placeholder="Add your openAI key"
/>
<div className="input-group-append">
{!loading && <Button variant="info" id="generate_new_token" onClick={saveOpenAIKeyHandler}> Save OpenAIKey</Button>}
{loading && <button className="btn-lg disabled"><i className="fas fa-spinner fa-spin"></i>
<span style={{marginLeft:"10px"}}>Loading</span></button>}
</div>

</div>
</div>
}

return( <React.Fragment>
<Card className="p-5 mb-5">
<h4 className="mt-4 text-success"><strong>{title}</strong></h4>
<h4 className="mt-4 text-success"><strong>{title}</strong></h4>
<Stack direction="horizontal" gap={2}>

<div>
{hasKey !== false && <SwitchOpenAi status={hasKey}
changeOpenAIStatus={changeStatus}
title={subTitle}/>}
title={subTitle} isAdmin={isAdmin}/>}
</div>
</Stack>
<Row>
<Col>
{hasKey &&
<div className="form-group">
<div className="input-group mt-2 mb-2">
<input className="form-control"
value= {"xxxxxxxx"}
type="password"
/>
<div className="input-group-append">
{!loading && <Button variant="danger" id="delete_openai_key" onClick={deleteKey}>Delete OpenAIKey</Button>}
{loading && <button className="btn-lg disabled"><i className="fas fa-spinner fa-spin"></i>
<span style={{marginLeft:"10px"}}>Loading</span></button>}
</div>
</div>
</div>
}
{hasKey === false &&
<div className="form-group">
<div className="input-group mt-2 mb-2">
<input className="form-control"
id="openAIKEY"
ref={openAIKEY}
type="password"
placeholder="Add your openAI key"
/>
<div className="input-group-append">
{!loading && <Button variant="info" id="generate_new_token" onClick={saveOpenAIKeyHandler}> Save OpenAIKey</Button>}
{loading && <button className="btn-lg disabled"><i className="fas fa-spinner fa-spin"></i>
<span style={{marginLeft:"10px"}}>Loading</span></button>}
</div>

</div>
</div>}
</Col>
<Col>{KeyInputComponentInstance}</Col>
</Row>
</Card>
</Card>
</React.Fragment>
)
}
}

10 changes: 7 additions & 3 deletions packages/tdb-dashboard/src/components/SwitchOpenAi.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import React, { useState } from "react"
import Form from "react-bootstrap/Form";

export function SwitchOpenAi({ status, changeOpenAIStatus, title }) {
export function SwitchOpenAi({ status, changeOpenAIStatus, title, isAdmin }) {

const [currentStatus,setStatus] = useState(status === "active" ? true : false)

Expand All @@ -14,14 +14,18 @@ export function SwitchOpenAi({ status, changeOpenAIStatus, title }) {

return <Form>
<div key={`default-checkbox`} className="mb-3">
<Form.Check // prettier-ignore
{isAdmin && <Form.Check // prettier-ignore
type={`checkbox`}
id={`default-checkbox`}
className="openai_checkbox"
label={title}
checked={currentStatus}
onChange={onChange}
/>
/>}
{!isAdmin && <div class="mb-3"><div class="openai_checkbox form-check">
<label title="" for="default-checkbox" class="form-check-label">{title}</label>
</div>
</div>}
</div>
</Form>

Expand Down
24 changes: 15 additions & 9 deletions packages/tdb-dashboard/src/hooks/useOpenAI.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,13 @@ export function useOpenAI(){
}

///changes/:orgid/:dbid/indexedcommit
const getSearchableCommit = async (limit=1, status=null)=>{
const getSearchableCommit = async (limit=1, status=null, branch=null)=>{
try{
setSearchableCommit(false)
setLoading(true)
const url = `${getUrl('indexes')}?limit=${limit}&status=${status}`
setSearchableCommit(false)
const statusQuery = status ? `&status=${status}` : ''
const branchQuery = branch ? `&branch=${branch}` : ''
const url = `${getUrl('indexes')}?limit=${limit}${statusQuery}${branchQuery}`
const result = await woqlClient.sendCustomRequest("GET", url)
if(result && result.bindings){
setSearchableCommit(result.bindings)
Expand All @@ -88,13 +90,13 @@ export function useOpenAI(){
}
}

const getResearchResult = async (commit, freeText, domain, branch = "main" ) =>{
const getResearchResult = async (commit, freeText) =>{
if(woqlClient){
try{
setSearchResult(false)
setLoading(true)
setSearchResult(false)
localStorage.setItem(`${location.pathname}___SEARCH__TEXT`,freeText)
const url = `${getUrl('indexes')}/search?domain=${domain}&commit=${commit}`
const url = `${getUrl('indexes')}/search?commit=${commit}`
const result = await woqlClient.sendCustomRequest("POST", url , {search:freeText})
localStorage.setItem(`${location.pathname}___SEARCH__RESULT`,JSON.stringify(result))
setSearchResult(result)
Expand Down Expand Up @@ -184,6 +186,7 @@ export function useOpenAI(){
const url = `${client.server()}api/private/organizations/${UTILS.encodeURISegment(orgName)}/openaikey`
const keyStatusObj = await client.sendCustomRequest("DELETE", url)
setHasKey(keyStatusObj.key)
return keyStatusObj
}catch(err){
setError()
}finally{
Expand Down Expand Up @@ -297,11 +300,14 @@ export function useOpenAI(){
const getPrewiew = async (type,queryStr,handlebarsTemplate)=>{
try{
setError(false)
let queryWithLimit = queryStr//.replace("(","($offset: Int, $limit: Int , ")
// queryWithLimit = queryWithLimit.replace(`${type}(`,`${type}(offset: $offset, limit: $limit, `)
let queryWithLimit = queryStr
if(queryStr.indexOf("$limit") === -1){
queryWithLimit = queryStr.replace("(","($offset: Int, $limit: Int, ")
queryWithLimit = queryWithLimit.replace(`${type}(`,`${type}(offset: $offset, limit: $limit, `)
}
setLoading(true)
const query = gql(`${queryWithLimit}`)
const result = await apolloClient.query({query:query,variables:{limit:5,offset:0}})
const result = await apolloClient.query({query:query,variables:{limit:10,offset:0}})

if(result.errors){
setError(result.errors)
Expand Down
4 changes: 2 additions & 2 deletions packages/tdb-dashboard/src/pages/DocumentEdit.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export const DocumentEdit = () => {
}
// implement the chage method
useEffect(() => {
if(!currentChangeRequest){
if(useChangeRequest && !currentChangeRequest){
setShowModal(true)
}
getDocumentFrames()
Expand All @@ -53,7 +53,7 @@ export const DocumentEdit = () => {
return <React.Fragment>
{error && <ErrorMessageReport error={error} setError={setError}/>}
{showModal && <CreateChangeRequestModal showModal={showModal} type={type} setShowModal={setShowModal} updateViewMode={setChangeRequestBranch}/>}
{!useChangeRequest || currentChangeRequest &&
{(!useChangeRequest || currentChangeRequest) &&
<EditDocumentComponent
SearchComponent={DocumentSearchComponent}
documentID={documentID}
Expand Down
2 changes: 1 addition & 1 deletion packages/tdb-dashboard/src/pages/DocumentView.js
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ export const DocumentView = () => {
deleteDocument={callDeleteDocument}
documentID={documentID}
showDeleteModal={showDeleteModal}
handleClose={()=>showDeleteModal(false)}
handleClose={()=>setShowDeleteModal(false)}
/> }
<ViewDocumentComponent
type={type}
Expand Down
4 changes: 2 additions & 2 deletions packages/tdb-dashboard/src/pages/DocumentsGraphqlList.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import {ErrorMessageReport} from "../components/ErrorMessageReport"
// I pass this so I'm sure it exists before loading the component
export const DocumentsGraphqlList = ({documentTablesConfig}) => {
const {type} = useParams()
const {apolloClient,branch,setChangeRequestBranch,woqlClient,ref} = WOQLClientObj()
const {apolloClient,branch,setChangeRequestBranch,woqlClient,ref,currentChangeRequest,useChangeRequest} = WOQLClientObj()
const {deleteDocument,loading,error,setError} = useTDBDocuments(woqlClient)
const [showCRModal, setShowCRModal] = useState(false)
const [showDeleteModal, setShowDeleteModal]=useState(false)
Expand All @@ -29,7 +29,7 @@ export const DocumentsGraphqlList = ({documentTablesConfig}) => {
setTobeDeleted(fullId)
// I can not change main directly
// I can change other branches creates with create branch interface
if(woqlClient.checkout() === "main"){
if(useChangeRequest && !currentChangeRequest){
setShowCRModal(true)
}else setShowDeleteModal(true)
}
Expand Down
Loading