How to Build a Self-Service IT Portal

Delivering IT services is a costly, laborious process. In particular, huge swathes of technical colleagues鈥 time is used up on relatively menial admin tasks.
Today, we鈥檙e looking at one solution to this problem - building a custom IT portal to help users self-serve for common support tasks.
Specifically, we鈥檙e going to demonstrate how we can use 黑料正能量 to build bespoke self-service portals with minimal custom coding.
By the end, we鈥檒l have a fully functioning, highly extensible solution for supercharging efficiency around IT service delivery.
But first鈥
What is an IT portal?
An IT portal is a secure, centralized tool where users can access key internal services and information about processes.
In practice, this can comprise quite a wide range of different functions. Some of the most common services include providing documentation and support information, knowledge base tools, asset management, request workflows, support ticketing, and more.
Some more advanced IT portals might also include more sophisticated functionality like software launching, identity management, usage analytics, or other company-specific features.
In any case, the goal is twofold.
First, we want to regularize how IT services are accessed and delivered. Second, we want to boost efficiency within delivery workflows by reducing the need for technical colleagues to intervene in more basic tasks.
With that in mind鈥
What are we building?
We鈥檙e building a simple IT portal with two key pieces of functionality. First, we鈥檒l provide a knowledge base to empower users to self-serve on common support issues. Second, we鈥檒l build a ticketing system for users to submit support requests that fall outside of this.
However, this is by no means the limit of what鈥檚 possible.
Instead, we want to show off the speed and ease with which we can build out functional portals - but we also have the option of scaling horizontally by adding new functions with the same basic processes.
So, here鈥檚 a quick demo of our portal鈥檚 knowledge base:
And our ticketing tools:
So, let鈥檚 see how this works in 黑料正能量.
You might also like our guide to open-source low-code platforms .
How to build an IT portal in 9 steps
If you haven鈥檛 already, the first thing you鈥檒l want to do is sign up for a free 黑料正能量 account to start building as many custom applications as you need.
Join 200,000 teams building workflow apps with 黑料正能量
Then, we need to create a new 黑料正能量 application. We have the option of starting with a template or importing an existing app dump, but today, we鈥檙e going to start from scratch.
When we choose this option, we鈥檙e prompted to give our app a name and URL extension. We鈥檒l simply call ours IT Portal.
Then, we鈥檙e prompted to choose which kind of data source we鈥檇 like to connect to our app. 黑料正能量 offers dedicated connectors for relational databases, NoSQL tools, APIs, Google Sheets, and more - alongside our internal, low-code database.
That brings us to鈥
1. Creating our knowledge base data model
黑料正能量 gives us the flexibility to build portals on top of just about any existing data. However, today, we want to build our data model from scratch using 黑料正能量DB.
We鈥檒l start by hitting Create New Table.
Then, we need to give our new table a name. We鈥檒l call ours Knowledge Base.
Once we hit Create, we鈥檒l have an empty database table.
We can use the plus icon to start adding columns.
So, it鈥檚 time to think about which specific attributes we鈥檒l need to store for each of our knowledge base articles.
We鈥檙e going to add columns with the following names and types:
- Title - text,
- Category - options,
- Date Added - date,
- Date Update - date,
- Body - long-form text.
Here鈥檚 what this will look like.
There are a few final tweaks we want to make before we move on to building our interfaces.
First, the Category column is an options attribute. So, we鈥檒l need to define what these options are.
We鈥檒l open the settings for this column and hit Add Option:
We鈥檙e going to add the following options:
- Processes,
- Hardware,
- Software,
- Services.
We鈥檒l also update our two dates to enable the Date Only setting.
While we鈥檙e here, we鈥檒l also update our long-form text column and select the Enable Markdown Editing setting.
Finally, we鈥檒l add a few rows of dummy data, and that鈥檚 our database table ready to go.
2. Building an index screen
Now, we can start building user interfaces for our IT portal. We鈥檒l start by creating an index screen where users can view and search all of the articles in our knowledge base.
So, head over to the Design tab.
Here, we鈥檒l be offered a few choices for how we want to create our first app screen - including using one of 黑料正能量鈥檚 autogenerated layouts.
Today, though, we鈥檙e going to opt for a blank screen. When we choose that option, we鈥檙e asked to input a URL extension.
We鈥檙e going with /knowledge-base.
Next, we need to choose a minimum access role to view this screen. 黑料正能量 offers four hierarchical roles - Public, Basic, Power, and Admin.
For our portal, we鈥檙e only going to leverage two. Basic users will be able to search and view knowledge base articles, but Power users will also have the ability to edit, delete, or create content via additional screens.
So, we鈥檙e leaving this first screen set to the default option of Basic.
Here鈥檚 our blank screen.
We can use the plus icon on the right-hand side to start adding components.
We鈥檙e going to start by adding a Cards Block. This is a preconfigured set of components that will iterate over a connected data table and display a configurable card for each entry.
Since our app only has one data table, this is already pointed at our Knowledge Base data.
Of course, we鈥檒l need to make a few changes to this.
First, we want to configure the information that鈥檚 displayed on each individual card. Notice they have three pieces of display text - a title, subtitle, and description.
We bind each of these to relevant attributes from our database table. We鈥檒l use the lightning bolt icon beside the Title setting to open its bindings drawer.
Here, we can access all of the data that our Cards Block is exposed to. We鈥檒l click into the New Cards Block option to access the table we鈥檝e pointed this at.
And we鈥檒l choose the Title:
Here鈥檚 what our Cards Block looks like now.
We鈥檒l repeat this process to bind the Subtitle to the Category column and the Description to the Body of each article. This will be automatically truncated to only show the initial snippet.
Now we have this.
Eventually, we鈥檒l make each card title clickable, allowing users to open up individual articles.
First, though, we need to make a couple more changes. These are adding searchability and then displaying a button that will enable Power users to access a form to create new articles.
Our Cards Block has a drop-down called Search Columns. We鈥檒l open this and select Title and Category to add these as searchable fields.
While we鈥檙e here, we鈥檒l also populate the Title setting.
Adding a button to access a form for creating new rows is a little more involved - especially because we only want to display this to Power users.
We鈥檒l start by enabling the Show Button setting under Title Button.
And we鈥檒l set its text to Create New.
We鈥檒l worry about what this button does a little later once we鈥檝e built a form for creating new articles.
Next, we want to add a conditionality rule so that this button only appears for users with the Power role or higher.
Conditionality rules in 黑料正能量 allow us to easily display and hide components or update any of their native settings based on custom expressions.
We鈥檒l start by opening the Conditions drawer for our Cards Block.
Then, we鈥檒l add a rule to update our Show Button setting to disabled.
We鈥檒l also need to populate a reference value and a comparison value to complete our rule.
So, we can open the bindings drawer for our first value and select Current User:
Followed by RoleID.
For the second value, we鈥檒l choose Role.
And then Basic.
So, we鈥檙e hiding our button if the current user鈥檚 role equals Basic.
If we preview our app as a basic user, we can see that the button is hidden.
3. Viewing articles
Next, we want to start building UIs to interact with individual knowledge base articles. We鈥檒l start by adding another blank screen, this time setting the URL to /knowledge-base/:id.
We can use :id as a URL extension to enable us to pass a variable between screens via their URLs.
Again, we鈥檙e going to set the minimum role for this screen to Basic.
This time, though, we鈥檒l start by adding a Container and setting its horizontal alignment to the center.
Inside of this, we鈥檒l add a Repeater Block. This connects to and iterates over a data source, exposing any components we nest within it to the stored values.
In other words, we can use the stored data as bindings for any components we place inside the Repeater Block.
However, we only want to display one row at a time, so we鈥檒l need to add a filter to this based on the ID attribute we鈥檙e going to store in our URL.
We鈥檒l add a filtering expression based on the _id column in our database.
Then, we鈥檒l bind this to {{ URL.id }}.
We鈥檒l return to our index screen to assign a value to our URL ID in a few minutes.
Before we get to that, though, we want to design our UI to display individual articles.
At the top of the screen, we want to show the title, along with either the date it was created or last updated.
Beneath this, we鈥檒l show the body of the article itself.
So, we鈥檒l start by adding a second container within our Repeater Block, this time setting its direction to horizontal.
We鈥檒l also give this a Width of 600px.
Within this, we鈥檒l add a Headline component and bind its Text to our article鈥檚 Title column.
Beside this, we鈥檒l add a Paragraph.
We want this to display either 鈥淐reated:鈥 or 鈥淯pdated:鈥 plus the relevant field.
To achieve this, we鈥檙e going to need a bit of custom JavaScript, so we鈥檒l open the bindings drawer and select the JavaScript editor.
The specific code we鈥檙e going to use is:
1var date = $("Repeater Block.Knowledge Base.Date Added");
2
3var text = "Created: "
4
5if ($("Repeater Block.Knowledge Base.Date Updated") != null){
6
7 var date = $("Repeater Block.Knowledge Base.Date Updated")
8
9 var text = "Updated: "
10
11}
12
13var formattedDate = new Date(date).toDateString();
14
15return text + formattedDate;
This uses an if statement to check if the Date Updated attribute is null and then displays the appropriate text and formatted date based on this.
We can use 黑料正能量鈥檚 Live Evaluation feature to check that this works correctly.
When we鈥檙e happy, we鈥檒l hit save.
Lastly, beneath our container, we鈥檒l place a Markdown Viewer component, setting its text to our Body attribute and giving it a width of 600px.
Next, we鈥檙e going to head back to our index screen.
Under the Cards settings, we鈥檙e enabling Link Card Title and Open in Modal.
Lastly, we鈥檒l bind our Link Screen field to /knowledge-base/{{ New Cards Block.Knowledge Base._id }}, populating our URL ID variable with the relevant row ID from our repeaters block. This will then be used in our filtering expression from earlier.
Now, if we open a card, it will look like this:
4. Adding admin functions
The last thing we need to do for the knowledge base side of our IT portal is add two forms for Power users to create or update articles.
We鈥檒l start with the create form since this is a little easier.
Once again, we鈥檒l add a new screen - only this time, we鈥檙e selecting the prebuilt Form layout. We鈥檙e then asked which data table we want to point this at.
And what type of form we want to create. We鈥檙e choosing Create a new row.
This time, we鈥檒l set the minimum role to Power.
Here鈥檚 what this will look like by default.
The Form layout generates a multistep form, but we鈥檙e only going to use a single step today.
All we need to do is configure how we want our fields to appear and make a couple of other design tweaks.
First, we鈥檒l deselect the Date Updated field, since we have no need for this when we first create an article.
Then, we鈥檒l use the layout setting on the Category and Date Added fields to arrange them into columns.
Since this is a single-step form, we can update the display title to something more appropriate.
Then, under Styles, we鈥檒l set the Size to Large and the Button Position to Top.
Back on our original screen, we鈥檒l set the link for our button to our new URL, as well as selecting the option to open this in a modal.
Here鈥檚 what this will look like in our app preview.
Next, we want to create a similar form for updating entries.
We can start by duplicating the form screen we鈥檝e just built. We鈥檒l be asked to input a URL for this. We鈥檙e going with /knowledge-base/:id.
We can reuse this URL because the new screen will have a different role to the one that shares this. When a Power user navigates to this address, they鈥檒l be brought to our new screen, but Basic users will still be directed to the old one.
We鈥檒l start by changing the type of our new form to Update.
Then, we鈥檒l set the Row ID to {{ URL.id }} so that the appropriate row is retrieved and updated.
Then, we鈥檒l deselect the Date Added attribute and update our display title.
Now, when a Power user clicks on one of our cards, they鈥檒l see this update form.
And that鈥檚 the knowledge base portion of our IT portal ready to go.
5. Creating a data table for support tickets
So, we can start building our IT portal鈥檚 other functionality - a basic ticketing system for issues that fall outside of what鈥檚 covered in our knowledge base.
Just like before, we need to start by creating our data model.
So, we鈥檒l add a second table, which we鈥檒l call Tickets.
The attributes we鈥檙e going to add are:
- Title - text,
- Category - options,
- Description - long-form text,
- Attachments - attachment,
- Submitted Date - date,
- Submitted By - user,
- Status - options,
- Priority - number,
- Comments - long-form text,
- Updated Date - date.
The first six will be used when a ticket is submitted, and the remainder will be used as part of the response process.
Just like before, we鈥檒l need to populate the options for our options fields. So, for Category, these will be:
- Hardware,
- Software,
- Support,
- Process.
For Status, we鈥檒l use:
- Submitted,
- Resolved,
- In-Progress,
- Closed.
We鈥檒l also add a maximum and minimum value to our Priority attribute, so users can only add a value between 1-5.
Now, we can move on to building our UIs.
6. Building our ticketing form
This time, we鈥檒l start with our form for submitting a ticket.
Once again, we鈥檒l add a new screen with the Form layout, this time choosing our Tickets table. We鈥檒l set the form type to Create and the minimum role to Basic.
Here鈥檚 what we have.
This form is going to be a little different from our previous examples. There will be some fields that will be populated with user inputs, but some will have values assigned automatically, and others will be left out until later when our ticket has a response.
So, we鈥檙e going to deselect everything except Title, Category, Description, and Attachments.
We鈥檒l then set the Attachments field to compact to make better use of the space.
Then, just like before, we鈥檒l update our title, Size, and Button Position settings.
There are three fields that we want to assign value to without user inputs - Submitted Date, Submitted By, and Status.
We can do this by opening the drawer to activate our Save button. Under the Save Row action, we can manually add columns.
For Status, we鈥檒l simply enter Submitted as a string.
We鈥檒l set Submitted By to {{ Current User._id }}.
Lastly, we鈥檒l set the Submitted Date to the following JavaScript expression.
1var date = new Date();
2
3return date;
Then, we can preview our app and submit a row of test data to confirm that this works correctly.
And we can see in the data section that the appropriate values have been saved.
7. Viewing previous tickets
Next, we want to add a screen where Basic user can view their previous tickets and access our form for creating new ones.
We鈥檒l add a new screen, this time choosing the Table layout and selecting our Tickets table as a data source.
We鈥檙e also setting the role to Basic again.
The Table layout generates a working CRUD screen based on whichever data table we connect it to.
However, we鈥檙e going to make a few adjustments so that this suits our purposes a little better.
First of all, we need to add a filter so that our users can only view their own submissions. So, we鈥檒l filter our rows so that the Submitted By attribute matches {{ Current User.id }}.
Then, we鈥檒l open the drawer to configure our table鈥檚 columns, reducing the number of these that we display.
We鈥檒l also update our Create Row button to open our new Ticket form in a modal.
Here鈥檚 how this will look.
And lastly, for our update row side panel, we鈥檒l toggle the Disable setting for all of our fields - making this form read-only.
8. Adding an admin screen
Finally, we want to add a UI where Power users can view and respond to tickets, regardless of who submitted them.
To do this, we can repeat much of the same process we just used to create our previous screen. However, there will be three differences this time:
- We鈥檒l set the minimum role to Power.
- We won鈥檛 filter our table.
- We鈥檒l only disable the fields submitted by the previous user.
Here鈥檚 how this should look.
We鈥檒l also add Title, Category, and Status as searchable fields.
And that鈥檚 our final screen done.
9. Design tweaks and publishing
Before we push our IT portal live, we can make some final UX improvements. First of all, we want to tidy up our navigation bar. So, under Navigation, we鈥檒l hit configure links.
And we鈥檒l set this to only display our main /knowledge-base and /tickets screens.
Then, under Screen, we鈥檒l set our app鈥檚 theme to Darkest.
When we鈥檙e ready, we can hit Publish to push our app live.
Here鈥檚 a reminder of what the finished thing looks like.
黑料正能量 is the fast, easy way to build custom solutions on top of just about any data source.
To learn more about what our platform can do, check out our portal development page.