You can also open a dialog from a side nav.

Apache NiFi Flow Design System

With the Apache NiFi Flow Design System module, we get an atomic, reusable component platform for Apache NiFi and its sub-projects to consume, while collaborating in an open source model. This module packages the Angular Material module as well as the Teradata Covalent module. These modules have been themed to match the FDS color palette.

Typography link

FDS provides typography CSS classes you can use to create visual consistency across your application. Optionally style tags with the classes shown below:

.mat-display-4 Display 4
.mat-display-3 Display 3
.mat-display-2 Display 2
.mat-display-1 Display 1
.mat-headline Headline
.md-title Title
.md-subhead Subhead
.link Link
.mat-body-1 Body 1
.mat-body-2 Body 2
.mat-caption Caption

Usage

HTML:

    Display 4
        Display 3
        Display 2
        Display 1
        Headline
        Title
        Subhead
        Link
        Body 1
        Body 2
        Caption
    ]]>
    
Raised Buttons link

Tip: Use UPPERCASE text for 1-2 words, and Titlecase text for 3+ words.

Usage

HTML:

    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    ]]>
    
Flat Buttons link

Usage

HTML:

    
        
        
        
        
        
        
        
        
        
    ]]>
    
Fab Buttons link

Usage

HTML:

    
        
        
        
        
        
        
        
    ]]>
    
Button Toggles link format_align_left format_align_center format_align_right format_align_justify
ON OFF
34
Assets
300
Extensions
5000
Flows
0
Certifications
general Users Workflow

Usage

HTML:

      
            
                format_align_left
            
            
                format_align_center
            
            
                format_align_right
            
            
                format_align_justify
            
        
        
ON OFF
34
Assets
300
Extensions
5000
Flows
0
Certifications
general
Users
Workflow
]]>
Input link
{{postalCode.value.length}} / 5

Usage

HTML:

    
        
{{postalCode.value.length}} / 5
]]>
Tabs link One

First tab content

Plaid echo park knausgaard normcore franzen cronut. Pickled humblebrag tofu hoodie, umami salvia farm-to-table schlitz try-hard food truck knausgaard pabst. Yuccie portland jean shorts, authentic mixtape waistcoat gentrify blue bottle. Fixie kickstarter church-key small batch seitan, shabby chic vegan listicle before they sold out. Hammock raw denim flannel tousled seitan you probably haven't heard of them. Trust fund man bun pug, kickstarter artisan selvage letterpress cornhole tote bag butcher locavore. Affogato try-hard kickstarter seitan, DIY pickled hella godard pork belly four loko ugh.

Two

Second tab content

Hashtag distillery skateboard man bun gochujang, salvia man braid art party meggings heirloom kitsch farm-to-table. Franzen beard fingerstache gentrify, heirloom portland ennui XOXO microdosing kitsch plaid. Chicharrones bushwick chia, banh mi irony tattooed hammock butcher shabby chic taxidermy semiotics marfa post-ironic. Blue bottle keffiyeh farm-to-table ennui, chambray pitchfork art party pinterest artisan pop-up. Etsy banjo marfa, blue bottle kombucha crucifix XOXO tousled beard. Tilde disrupt kale chips bicycle rights skateboard master cleanse hella shoreditch, meditation retro shabby chic vice heirloom. Etsy listicle vice actually, iPhone chia hoodie four loko.

Usage

HTML:

      
          
            First tab content
            

First content

...

Second tab content

Second tab content

...

]]>
Stepper link
Comments go here
An hour ago
Comments go here
A day ago

Usage

HTML:

      
            
                
Description goes here
An hour ago
Description goes here
A day ago
]]>
Autocomplete link
{{ state.name }} ({{state.code}})

Usage

HTML:

      
            
                
            
        
{ { state.name } } ({ {state.code} }) ]]>

Javascript:

       s.name.match(new RegExp(val, 'gi'))) : this.states;
        },

        ...
        ]]>
      
Filter link

Autocomplete with chips and no custom inputs

Demo
Type and select a preset option:
Code

HTML:

                            
          ]]>
                        

Javascript:

                            
                        

Autocomplete with custom inputs

Demo
Type and select option or enter custom text and press enter:
Code

HTML:

                            
          ]]>
                        

Javascript:

                            
                        

Demo allowing custom inputs for tags

Demo
Type any test and press enter:
Code

HTML:

                            
          ]]>
                        
Searchable/Filterable Expansion Panels link Demo
{{getDropletTypeCount('asset')}}
Assets
{{getDropletTypeCount('extension')}}
Extensions
{{getDropletTypeCount('flow')}}
Flows
{{getDropletCertificationCount('compliant')}}
Compliant
{{getDropletCertificationCount('fleet')}}
Fleet
{{getDropletCertificationCount('prod')}}
Production Ready
{{getDropletCertificationCount('secure')}}
Secure
Clear Grouping
Sort by:
{{droplet.displayName}} {{droplet.type}}
Versions {{droplet.versions.length}}
Flows {{droplet.flows.length}}
Extensions {{droplet.extensions.length}}
Assests {{droplet.assets.length}}
Description

Blah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah bla

Change Log
Code

HTML:

                        
            
{ {getDropletTypeCount('asset')} }
Assets
{ {getDropletTypeCount('extension')} }
Extensions
{ {getDropletTypeCount('flow')} }
Flows
{ {getDropletCertificationCount('compliant')} }
Compliant
{ {getDropletCertificationCount('fleet')} }
Fleet
{ {getDropletCertificationCount('prod')} }
Production Ready
{ {getDropletCertificationCount('secure')} }
Secure
Sort by:
{ {droplet.displayName} } { {droplet.type} }
Versions { {droplet.versions.length} }
Flows { {droplet.flows.length} }
Extensions { {droplet.extensions.length} }
Assests { {droplet.assets.length} }
Description

Blah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah bla

Change Log
]]>

Javascript:

                         -1);
        },

        getDropletTypeCount: function(type) {
            return this.filteredDroplets.filter(function(droplet) {
                return droplet.type === type;
            }).length;
        },

        getDropletCertificationCount: function(certification) {
            return this.filteredDroplets.filter(droplet => {
                return Object.keys(droplet).find((key) => {
                    if (key === certification && droplet[certification].type === 'certification') {
                        return droplet;
                    }
                });
            }).length;
        },

        getSortBy: function() {
            var sortByColumnLabel;
            var arrayLength = this.dropletColumns.length;
            for (var i = 0; i < arrayLength; i++) {
                if (this.dropletColumns[i].active === true) {
                    sortByColumnLabel = this.dropletColumns[i].label;
                    break;
                }
            }
            return sortByColumnLabel;
        },

        sortDroplets: function(column) {
            if (column.sortable === true) {
                // toggle column sort order
                var sortOrder = column.sortOrder = (column.sortOrder === 'ASC') ? 'DESC' : 'ASC';
                this.filterDroplets(column.name, sortOrder);

                //only one column can be actively sorted so we reset all to inactive
                this.dropletColumns.forEach(function (c) {
                            c.active = false;
                });

                //and set this column as the actively sorted column
                column.active = true;
                this.activeDropletColumn = column;
            }
        },

        toggleDropletsFilter: function(searchTerm) {
            var applySearchTerm = true;
            // check if the search term is already applied and remove it if true
            if (this.dropletsSearchTerms.length > 0) {
                var arrayLength = this.dropletsSearchTerms.length;
                for (var i = 0; i < arrayLength; i++) {
                    var index = this.dropletsSearchTerms.indexOf(searchTerm);
                    if (index > -1) {
                        this.dropletsSearchTerms.splice(index, 1);
                        applySearchTerm = false;
                    }
                }
            }

            // if we just removed the search term do NOT apply it again
            if (applySearchTerm) {
                this.dropletsSearchTerms.push(searchTerm);
            }

            this.filterDroplets(this.activeDropletColumn.name, this.activeDropletColumn.sortOrder);
        },

        filterDroplets: function(sortBy, sortOrder) {
            // if `sortBy` is `undefined` then find the first sortable column in this.dropletColumns
            if (sortBy === undefined) {
                var arrayLength = this.dropletColumns.length;
                for (var i = 0; i < arrayLength; i++) {
                    if (this.dropletColumns[i].sortable === true) {
                        sortBy = this.dropletColumns[i].name;
                        this.activeDropletColumn = this.dropletColumns[i];

                        //only one column can be actively sorted so we reset all to inactive
                        this.dropletColumns.forEach(c => c.active = false);

                        //and set this column as the actively sorted column
                        this.dropletColumns[i].active = true;
                        break;
                    }
                }
            }

            // if `sortOrder` is `undefined` then use 'ASC'
            if (sortOrder === undefined) {
                sortOrder = 'ASC'
            }

            var newData = this.droplets;

            for (var i = 0; i < this.dropletsSearchTerms.length; i++) {
                newData = this.filterData(newData, this.dropletsSearchTerms[i], true, this.activeDropletColumn.name);
            }

            newData = this.dataTableService.sortData(newData, sortBy, sortOrder);
            this.filteredDroplets = newData;
            this.getAutoCompleteDroplets();
        },

        getAutoCompleteDroplets: function() {
            this.autoCompleteDroplets = [];
            this.dropletColumns.forEach(c => this.filteredDroplets.forEach(r => (r[c.name.toLowerCase()]) ? this.autoCompleteDroplets.push(r[c.name.toLowerCase()].toString()) : ''));
        },

        filterData: function(data, searchTerm, ignoreCase) {
            var field = '';
            if (searchTerm.indexOf(":") > -1) {
                field = searchTerm.split(':')[0].trim();
                searchTerm = searchTerm.split(':')[1].trim();
            }
            var filter = searchTerm ? (ignoreCase ? searchTerm.toLowerCase() : searchTerm) : '';

            if (filter) {
                data = data.filter(item => {
                        var res = Object.keys(item).find((key) => {
                        if (field.indexOf(".") > -1) {
                            var objArray = field.split(".");
                            var obj = item;
                            var arrayLength = objArray.length;
                            for (var i = 0; i < arrayLength; i++) {
                                try {
                                    obj = obj[objArray[i]];
                                } catch (e) {
                                    return false;
                                }
                            }
                            var preItemValue = ('' + obj);
                            var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue;
                            return itemValue.indexOf(filter) > -1;
                        } else {
                            if (key !== field && field !== '') {
                                return false;
                            }
                            var preItemValue = ('' + item[key]);
                            var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue;
                            return itemValue.indexOf(filter) > -1;
                        }
                    });
                    return !(typeof res === 'undefined');
                });
            }
            return data;
        },

        ...
          ]]>
                    
Table link

Example table with: Paging Bar / Filter / Sortable Columns / Multi-select with available Actions

Demo
Table title
{{column.label}}
{{column.format ? column.format(row[column.name]) : row[column.name]}}

No results to display.

Row per page: {{pagingBar.range}} of {{pagingBar.total}}
Code

HTML:

                        
            
            Table title
            
            
{ { column.label } }
{ { column.format ? column.format(row[column.name]) : row[column.name] } }

No results to display.

Row per page: { { pagingBar.range } } of { { pagingBar.total } }
]]>

Javascript:

                         c.active = false);

                //and set this column as the actively sorted column
                column.active = true;
            }
        },

        searchRemove: function(searchTerm) {
            //only remove the first occurrence of the search term
            var index = this.searchTerm.indexOf(searchTerm);
            if (index !== -1) {
                this.searchTerm.splice(index, 1);
            }
            this.filter();
        },

        searchAdd: function(searchTerm) {
            this.searchTerm.push(searchTerm);
            this.filter();
        },

        page: function(pagingEvent) {
            this.fromRow = pagingEvent.fromRow;
            this.currentPage = pagingEvent.page;
            this.pageSize = pagingEvent.pageSize;
            this.filter();
        },

        filterData: function(data, searchTerm, ignoreCase) {
            var field = '';
            if (searchTerm.indexOf(":") > -1) {
                field = searchTerm.split(':')[0].trim();
                searchTerm = searchTerm.split(':')[1].trim();
            }
            var filter = searchTerm ? (ignoreCase ? searchTerm.toLowerCase() : searchTerm) : '';

            if (filter) {
                data = data.filter(item => {
                    var res = Object.keys(item).find((key) => {
                        if (field.indexOf(".") > -1) {
                            var objArray = field.split(".");
                            var obj = item;
                            var arrayLength = objArray.length;
                            for (var i = 0; i < arrayLength; i++) {
                                try {
                                    obj = obj[objArray[i]];
                                } catch (e) {
                                    return false;
                                }
                            }
                            var preItemValue = ('' + obj);
                            var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue;
                            return itemValue.indexOf(filter) > -1;
                        } else {
                            if (key !== field && field !== '') {
                                return false;
                            }
                            var preItemValue = ('' + item[key]);
                            var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue;
                            return itemValue.indexOf(filter) > -1;
                        }
                    });
                    return !(typeof res === 'undefined');
                });
            }
            return data;
        },

        filter: function(sortBy, sortOrder) {
            if (this.allRowsSelected) {
                this.toggleSelectAll();
            }
            this.deselectAll();
            var newData = this.data;

            if (this.searchTerm.length > 0) {
                for (var i = 0; i < this.searchTerm.length; i++) {
                    //account for column/field name specific search syntax
                    if (this.searchTerm[i].indexOf(":") > -1) {
                        newData = this.filterData(newData, this.searchTerm[i].split(':')[1].trim(), true, this.searchTerm[i].split(':')[0].trim());
                    } else { //otherwise search all cells
                        newData = this.filterData(newData, this.searchTerm[i], true);
                    }
                }
            } else {
                newData = this.dataTableService.filterData(newData, '', true);
            }
            this.filteredTotal = newData.length;
            newData = this.dataTableService.sortData(newData, sortBy, sortOrder);
            newData = this.dataTableService.pageData(newData, this.fromRow, this.currentPage * this.pageSize);
            this.filteredData = newData;
            this.getAutoCompleteData();
        },

        toggleSelect: function(row) {
            if (!row.checked) {
                this.allRowsSelected = false;
            } else {
                if (this.allFilteredRowsSelected()) {
                    this.allRowsSelected = true;
                } else {
                    this.allRowsSelected = false;
                }
            }
        },

        toggleSelectAll: function() {
            this.allRowsSelected = !this.allRowsSelected;
            if (this.allRowsSelected) {
                this.selectAll();
            } else {
                this.deselectAll();
            }
        },

        selectAll: function() {
            this.filteredData.forEach(c => c.checked = true);
        },

        deselectAll: function() {
            this.filteredData.forEach(c => c.checked = false);
        },

        allFilteredRowsSelected: function() {
            var allFilteredRowsSelected = true;
            this.filteredData.forEach(function(c) {
                if (c.checked === undefined || c.checked === false) {
                    allFilteredRowsSelected = false;
                }
            });

            return allFilteredRowsSelected;
        },

        areTooltipsOn: function() {
            return this.columns[0].hasOwnProperty('tooltip');
        },

        toggleTooltips: function() {
            if (this.columns[0].tooltip) {
                this.columns.forEach(c => delete c.tooltip);
            } else {
                this.columns.forEach(c => c.tooltip = `This is ${c.label}!`);
            }
        },

        openDataTablePrompt: function(row, name) {
            this.dialogService.openPrompt({
                message: 'Enter comment?',
                value: row[name],
            }).afterClosed().subscribe(value => {
                if (value !== undefined) {
                    row[name] = value;
                }
            })
        },

        getAutoCompleteData: function() {
            this.autoCompleteData = [];
            this.columns.forEach(c => this.filteredData.forEach(r => (r[c.name.toLowerCase()]) ? this.autoCompleteData.push(r[c.name.toLowerCase()].toString()):''));
        },

                                ...
                                ]]>
                                
Checkbox link

Basic Usage

{{grocery.name}}

Usage

HTML:

                                
        
            { {grocery.name} }
        
                                ]]>
                                

Javascript:

        
                    

Usage within Forms

I agree to the terms
I come after my label.
I come before my label

Usage

HTML:

        
        
I agree to the terms
I come after my label.
I come before my label
]]>

Javascript:

                        
                    
Radios link

Basic Radios

Option 1 Option 2 Option 3 (disabled)

Usage

HTML:

                
        
            Option 1 
            Option 2 
            Option 3 (disabled) 
        
                ]]>
        

Dynamic Radios

{{season}}

Your favorite season is: {{favoriteSeason}}

Usage

HTML:

      
        
          
            { {season} }
          
        
        

Your favorite season is: { { favoriteSeason } }

]]>

Javascript:

      
      
Tooltips link

Usage

HTML:

      Bottom Tooltip
        
        
        
        ]]>
      
Panels link

Standard Card

Title

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do tempor incididunt ut labore et dolore magna aliqua. Ut enim ad

Usage

HTML:

                
        
            
            
                
                
            
            
                Title
            
            
                

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do tempor incididunt ut labore et dolore magna aliqua. Ut enim ad

]]>

Tabbed Card

One

First tab content

Plaid echo park knausgaard normcore franzen cronut. Pickled humblebrag tofu hoodie, umami salvia farm-to-table schlitz try-hard food truck knausgaard pabst. Yuccie portland jean shorts, authentic mixtape waistcoat gentrify blue bottle. Fixie kickstarter church-key small batch seitan, shabby chic vegan listicle before they sold out. Hammock raw denim flannel tousled seitan you probably haven't heard of them. Trust fund man bun pug, kickstarter artisan selvage letterpress cornhole tote bag butcher locavore. Affogato try-hard kickstarter seitan, DIY pickled hella godard pork belly four loko ugh.

Two

Second tab content

Hashtag distillery skateboard man bun gochujang, salvia man braid art party meggings heirloom kitsch farm-to-table. Franzen beard fingerstache gentrify, heirloom portland ennui XOXO microdosing kitsch plaid. Chicharrones bushwick chia, banh mi irony tattooed hammock butcher shabby chic taxidermy semiotics marfa post-ironic. Blue bottle keffiyeh farm-to-table ennui, chambray pitchfork art party pinterest artisan pop-up. Etsy banjo marfa, blue bottle kombucha crucifix XOXO tousled beard. Tilde disrupt kale chips bicycle rights skateboard master cleanse hella shoreditch, meditation retro shabby chic vice heirloom. Etsy listicle vice actually, iPhone chia hoodie four loko.

Usage

HTML:

                
        
            
            
                
                
            
            
                
                    
                        One
                        

First tab content

Plaid echo park knausgaard normcore franzen cronut. Pickled humblebrag tofu hoodie, umami salvia farm-to-table schlitz try-hard food truck knausgaard pabst. Yuccie portland jean shorts, authentic mixtape waistcoat gentrify blue bottle. Fixie kickstarter church-key small batch seitan, shabby chic vegan listicle before they sold out. Hammock raw denim flannel tousled seitan you probably haven't heard of them. Trust fund man bun pug, kickstarter artisan selvage letterpress cornhole tote bag butcher locavore. Affogato try-hard kickstarter seitan, DIY pickled hella godard pork belly four loko ugh.

Two

Second tab content

Hashtag distillery skateboard man bun gochujang, salvia man braid art party meggings heirloom kitsch farm-to-table. Franzen beard fingerstache gentrify, heirloom portland ennui XOXO microdosing kitsch plaid. Chicharrones bushwick chia, banh mi irony tattooed hammock butcher shabby chic taxidermy semiotics marfa post-ironic. Blue bottle keffiyeh farm-to-table ennui, chambray pitchfork art party pinterest artisan pop-up. Etsy banjo marfa, blue bottle kombucha crucifix XOXO tousled beard. Tilde disrupt kale chips bicycle rights skateboard master cleanse hella shoreditch, meditation retro shabby chic vice heirloom. Etsy listicle vice actually, iPhone chia hoodie four loko.

]]>
Select link
{{food.viewValue}}
Selected food value: {{selectedValue}}

Usage

HTML:

      
            
{ {food.viewValue} }
Selected food value: { {selectedValue} }
]]>

Javascript:

      
      
Menus (dropdowns) link

Usage

HTML:

      
            more_vert
        
        
            
            
            
            
        
        
        
            
            
            
            
        
        
        
            
            
            
        
        
        
            
            
        
        
        
            
            
            
            
        
        ]]>
      
Dialog link

Usage

HTML:

      Show simple dialog
      ]]>
    

Javascript:

      
      
Simple Dialogs link

Usage

HTML:

      Open Confirm
        ]]>
      

Javascript:

      
      
Snack Bars link

Usage

HTML:

      Success Snack Bar
        
        
        
      ]]>
    

Javascript:

      
      
Expansion Panels link

Expand/Collapse Event for Expansion 1: {{expandCollapseExpansion1Msg}}

pin_drop

Google

Headquarters

1600 Amphitheatre Pkwy
Mountain View, CA 94043, USA

Usage

HTML:

      
            
                
                    
                        pin_drop
                        

Google

Headquarters

1600 Amphitheatre Pkwy
Mountain View, CA 94043, USA

]]>

Javascript:

          
          
Progress link

Progress Bars

Determinate

Indeterminate

Buffer

Query

Colors

Usage

HTML:

      
        

        
        

        
        

        
        

        
        

        

        
      ]]>
      

Progress Spinner

Determinate

indeterminate

Spinner

Colors

Usage

HTML:

      
        
        
        
        
        
        
        
        
        
      ]]>
      
Side Nav link

The side nav can be opened at the `start` or `end` of a container and can be displayed in `over`, `side`, or `push` mode. You can also define its width.

Usage

HTML:

        
        
            ...
        
        ]]>
        
Slide Toggle link

Basic Usage

{{system.name}}

Usage

HTML:

        
        
            
              
                { {system.name} }
              
            
        
        ]]>
        

Javascript:

        
          

Usage within Forms

Lock? lock I am disabled.

Usage

HTML:

        
        
Lock? lock I am disabled.
]]>

Javascript:

        
          
Slider link

Horizontal Slider

Usage

HTML:

      
        
        
        ]]>
      

Vertical Slider

Usage

HTML:

      
        ]]>
      

Inverted Slider

Usage

HTML:

      
        ]]>