diff --git a/cybergis_compute_client/UI.py b/cybergis_compute_client/UI.py
index bd563de..ef784b1 100644
--- a/cybergis_compute_client/UI.py
+++ b/cybergis_compute_client/UI.py
@@ -4,6 +4,7 @@
from ipyfilechooser import FileChooser
from IPython.display import Markdown, display, clear_output
from .MarkdownTable import MarkdownTable # noqa
+import importlib.metadata as importlib_metadata
class UI:
@@ -85,6 +86,7 @@ def render(self):
display(Markdown('A scalable middleware framework for enabling high-performance and data-intensive geospatial research and education on CyberGIS-Jupyter. [Click here for documentation.](https://cybergis.github.io/cybergis-compute-python-sdk/index.html)'))
display(divider)
display(Markdown('**Your CyberGIS-Compute Username:** ' + str(self.compute.username)))
+ display(Markdown('**Version:** ' + importlib_metadata.version("cybergis_compute_client")))
self.renderAnnouncements()
display(self.jobTemplate['output'])
display(self.description['output'])
@@ -178,10 +180,20 @@ def renderAnnouncements(self):
if (len(announcement) > 0):
display(Markdown('## Announcements'))
for i in range(len(announcement)):
- display(Markdown('### Message ' + str(i + 1) + ':'))
- display(Markdown('Message: ' + announcement[i]["message"]))
- display(Markdown('Posted by: ' + announcement[i]["poster"] + " at " + announcement[i]["time_stamp"]))
- display(Markdown("***"))
+ message = f"""
+**Announcement {i}**
+
+> **Message:** {announcement[i]["message"]}
+
+> **Posted by:** {announcement[i]["poster"]}
+> **Time:** {announcement[i]["time_stamp"]}
+
+---
+"""
+ # display(Markdown('### Message ' + str(i + 1) + ':'))
+ # display(Markdown('Message: ' + announcement[i]["message"]))
+ # display(Markdown('Posted by: ' + announcement[i]["poster"] + " at " + announcement[i]["time_stamp"]))
+ display(Markdown(message))
except:
pass
@@ -648,25 +660,39 @@ def renderFolders(self):
with self.folders['output']:
display(Markdown("We will do our best to keep this data for 90 days, but cannot guarantee it won’t be deleted sooner."))
display(Markdown("Please note that the renaming feature only allows for names made up of letters, numbers, and the characters ' . ' and ' _ '. Other characters will be removed from your input."))
+
+ searchInput = widgets.Text(placeholder='Search folders by name...', disabled=False)
+ searchButton = widgets.Button(description="Search")
+ clearButton = widgets.Button(description="Clear")
+ buttons = widgets.HBox([searchButton, clearButton])
+ searchWidgets = widgets.VBox([searchInput, buttons])
+ display(searchWidgets)
+
+ searchTerm = getattr(self, 'folderSearchTerm', '').lower()
+ filteredFolders = folders["folder"]
+ if searchTerm:
+ filteredFolders = [folder for folder in folders["folder"] if folder['name'] and searchTerm in folder['name'].lower()]
+ display(Markdown(f"Found {len(filteredFolders)} results for '{searchTerm}'"))
+
pageNum = self.folderPage
numFolders = self.foldersPerPage
firstFolder = pageNum * numFolders
lastFolder = firstFolder + numFolders
- if (lastFolder >= len(folders["folder"])):
- lastFolder = len(folders["folder"])
- display(Markdown('
**Showing folders ' + str(firstFolder + 1) + ' to ' + str(lastFolder) + ' of ' + str(len(folders["folder"])) + ' for ' + self.compute.username.split('@', 1)[0] + '**'))
+ if (lastFolder >= len(filteredFolders)):
+ lastFolder = len(filteredFolders)
+ display(Markdown('
**Showing folders ' + str(firstFolder + 1) + ' to ' + str(lastFolder) + ' of ' + str(len(filteredFolders)) + ' for ' + self.compute.username.split('@', 1)[0] + '**'))
backButton = widgets.Button(description="Previous Page")
nextButton = widgets.Button(description="Next Page")
pageButtons = widgets.HBox([backButton, nextButton])
backButton.on_click(self.onPrevPageButton())
- nextButton.on_click(self.onNextPageButton(len(folders["folder"])))
+ nextButton.on_click(self.onNextPageButton(len(filteredFolders)))
display(pageButtons)
listNames = []
for i in folders["folder"]:
if i['name'] is not None:
listNames.append(i['name'])
listNames = [*set(listNames)]
- for i in list(reversed(folders["folder"]))[firstFolder:lastFolder]:
+ for i in list(reversed(filteredFolders))[firstFolder:lastFolder]:
headers = ['id', 'name', 'hpc', 'userId', 'isWritable', 'createdAt', 'updatedAt', 'deletedAt']
data = [[]]
for j in headers:
@@ -682,8 +708,25 @@ def renderFolders(self):
renameButton.on_click(self.onRenameJobButton(i, nameSelect))
nameSelect.on_submit(self.onRenameJobButton(i, nameSelect))
display(renameWidgets)
- display(Markdown('
**Showing folders ' + str(firstFolder + 1) + ' to ' + str(lastFolder) + ' of ' + str(len(folders["folder"])) + '**'))
+ display(Markdown('
**Showing folders ' + str(firstFolder + 1) + ' to ' + str(lastFolder) + ' of ' + str(len(filteredFolders)) + '**'))
display(pageButtons)
+
+ def on_search(b):
+ self.folderSearchTerm = searchInput.value
+ self.folderPage = 0
+ self.folders['output'].clear_output()
+ self.renderFolders()
+
+ def on_clear(b):
+ self.folderSearchTerm = ''
+ searchInput.value = ''
+ self.folderPage = 0
+ self.folders['output'].clear_output()
+ self.renderFolders()
+
+ searchButton.on_click(on_search)
+ clearButton.on_click(on_clear)
+ searchInput.on_submit(on_search)
def renderRecentlySubmittedJobs(self):
"""
diff --git a/cybergis_compute_client/__init__.py b/cybergis_compute_client/__init__.py
index 87329ee..80d5aed 100644
--- a/cybergis_compute_client/__init__.py
+++ b/cybergis_compute_client/__init__.py
@@ -16,4 +16,5 @@
limitations under the License.
"""
+
from .CyberGISCompute import CyberGISCompute # noqa F401
\ No newline at end of file