Outerbase - Better Map Preview Plugins

Search for a command to run...

No comments yet. Be the first to comment.
Linux provides several alternatives to the traditional blocking and non-blocking I/O models. One of them is the epoll API. The epoll API epoll() is a Linux kernel system call that provides an efficient way to monitor multiple file descriptors to ch...
In the previous article , we have discussed several facilities or mechanisms available on Linux to enable inter-process communications. One of them is Sockets. Due to its flexibility and performance, socket has been widely used in most IPC applicatio...
A few weeks ago, I attended a local meetup where someone presented on asynchronous Inter-Process Communication (IPC) using Linux IPC APIs [1]. The speaker showcased different Linux APIs for IPC, such as FIFO, Message Queue, and Ethernet Socket. I fin...
In the previous article , we explored the basics of Bluetooth Low Energy (BLE). In this article, we will take a closer look at BLE GATT (Generic Attribute Profile) — unpacking what it is and how it works. BLE and GATT BLE is a wireless technology de...
Getting to know Bluetooth Low Energy
In the previous article, I discussed creating a Map Preview plugin for Outerbase using the Google Maps API. That particular implementation utilized the Web component version of Google Maps API. It works, but the features are still limited compared to the full features that we can get if we use the standard Google Maps JS API. So, I am interested in exploring the possibility of developing a Map plugin using this approach to take advantage of the full features offered by Google Maps API.
To reiterate what I have mentioned in the previous article, we can use this plugin to visualize addresses or GPS coordinates on a Google Maps view. Instead of merely observing a bunch of coordinates numbers in a spreadsheet, we can display them in a visually appealing representation.
I am going to create Map Preview plugins that work with both tables and cells.
For the demonstration, I am using a dummy database generated using UIBakery (uibakery.io/sql-playground). They can generate a Car dealer database which contains a table that stores the location of all cars they have. The plugin uses the longitude and latitude information to show the location on a map.
I made a few minor modifications to the configuration view. First, a new text field is added so that the user can put in the Google Maps API key. As a result, there is no longer a need to include a hard-coded API key in the codebase. Below is the updated configuration class.
class OuterbasePluginConfig_$PLUGIN_ID {
// Inputs from Outerbase for us to retain
tableValue = undefined
count = 0
page = 1
offset = 50
theme = "light"
// Inputs from the configuration screen
imageKey = undefined
apiKey = undefined
titleKey = undefined
descriptionKey = undefined
subtitleKey = undefined
longitudeKey = undefined
latitudeKey = undefined
// Variables for us to hold state of user actions
deletedRows = []
constructor(object) {
this.imageKey = object?.imageKey
this.apiKey = object?.apiKey
this.titleKey = object?.titleKey
this.descriptionKey = object?.descriptionKey
this.subtitleKey = object?.subtitleKey
this.latitudeKey = object?.latitudeKey
this.longitudeKey = object?.longitudeKey
}
toJSON() {
return {
"imageKey": this.imageKey,
"apiKey": this.apiKey,
"titleKey": this.titleKey,
"descriptionKey": this.descriptionKey,
"subtitleKey": this.subtitleKey,
"latitudeKey": this.latitudeKey,
"longitudeKey": this.longitudeKey
}
}
}
Secondly, I reorganized the fields to make them more logical. Here is the final result.

The challenging aspect of creating this plugin involved figuring out how to correctly import the Google Maps library. I encountered a couple of issues because the library complained about being imported multiple times. Eventually, I figured out how to resolve or work around the issue.
In addition, it is now possible to retrieve additional information about the view, such as the number of rows, current page index, and page count. These attributes are useful to prevent the user from accessing empty pages, which can happen if the user keeps pressing "Next Page" or "Previous Page".

The full source code can be found here.
The plugin works with cells. In this case, the input will be a valid address and the plugin should show the address directly on a map. This plugin uses the Geocoder API provided by Google Maps API.
The Cell View is quite simple as I adopted one of the cell plugin examples created by the Outerbase team. It shows an extra button on the cell to show the address on a map. When clicked, a map pops up with a marker indicating the address's location.
To improve the user experience, I implemented a mechanism where the button will open the map if it is not open yet, and close it if it is already in an open state.


The Cell Editor is where the map is going to be shown. The challenging aspect also involved figuring out how to import the Google Maps library. Fortunately, I was able to apply the same logic that I used for implementing the Table plugin.

The implementation itself is quite straightforward. After the Google Maps API has been loaded, we can start creating a map, use Geocoder API to get the map location of the address and create a marker on that location. Below is the code snippet demonstrating the implementation.
// Code Snippet
class OuterbasePluginEditor_$PLUGIN_ID extends HTMLElement {
// ...
render() {
if (window.gmap) {
window.gmap = new google.maps.Map(this.shadowRoot.getElementById("map"), {
center: { lat: 37.39094933041195, lng: -122.02503913145092 },
zoom: 14,
mapId: "4504f8b37365c3d0",
});
const marker = new google.maps.Marker({
map: window.gmap
});
const geocoder = new google.maps.Geocoder();
geocoder.geocode({ address: this.getAttribute('cellvalue')})
.then((result) => {
const { results } = result;
window.gmap.setCenter(results[0].geometry.location);
marker.setPosition(results[0].geometry.location);
marker.setMap(window.gmap);
return results;
})
.catch((e) => {
alert("Geocode was not successful for the following reason: " + e);
});
}
}
}
The source code of the cell plugin can be found here.
At this moment, it is not possible to have a configuration view for a cell plugin. That's the reason why the Google Maps API Key is still hardcoded in the cell plugin code. Hopefully, the Outerbase team will implement a way to configure cell plugins.
The Map Preview table and cell plugins only support reading data from the Database. It might be interesting to be able to change the address value by simply dragging the marker on the map directly.
In conclusion, creating Map Preview plugins for Outerbase using the Google Maps JS API allows for a more feature-rich and interactive experience compared to the Web component version. By developing both table and cell plugins, users can visualize addresses and GPS coordinates more effectively.
Hopefully, you find this article useful. If you have any comments or suggestions, feel free to leave them in the comment section. Thanks for reading.