diff --git a/libs/ui/inputs/src/lib/checkbox/checkbox.component.css b/libs/ui/inputs/src/lib/checkbox/checkbox.component.css
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/libs/ui/inputs/src/lib/checkbox/checkbox.component.html b/libs/ui/inputs/src/lib/checkbox/checkbox.component.html
new file mode 100644
index 0000000000..947220f73f
--- /dev/null
+++ b/libs/ui/inputs/src/lib/checkbox/checkbox.component.html
@@ -0,0 +1,8 @@
+
diff --git a/libs/ui/inputs/src/lib/checkbox/checkbox.component.spec.ts b/libs/ui/inputs/src/lib/checkbox/checkbox.component.spec.ts
new file mode 100644
index 0000000000..384c47f8d7
--- /dev/null
+++ b/libs/ui/inputs/src/lib/checkbox/checkbox.component.spec.ts
@@ -0,0 +1,47 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+import { CheckboxComponent } from './checkbox.component'
+import { MatCheckboxModule } from '@angular/material/checkbox'
+
+describe('CheckboxComponent', () => {
+ let component: CheckboxComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ declarations: [CheckboxComponent],
+ imports: [MatCheckboxModule],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(CheckboxComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+
+ describe('click when unchecked', () => {
+ beforeEach(() => {
+ component.checked = false
+ })
+ it('should invert checked state when being clicked', () => {
+ const event = new Event('click')
+ component.handleClick(event)
+
+ expect(component.checked).toBe(true)
+ })
+ })
+
+ describe('click when checked', () => {
+ beforeEach(() => {
+ component.checked = true
+ })
+ it('should invert checked state when being clicked', () => {
+ const event = new Event('click')
+ component.handleClick(event)
+
+ expect(component.checked).toBe(false)
+ })
+ })
+})
diff --git a/libs/ui/inputs/src/lib/checkbox/checkbox.component.stories.ts b/libs/ui/inputs/src/lib/checkbox/checkbox.component.stories.ts
new file mode 100644
index 0000000000..abd0215d90
--- /dev/null
+++ b/libs/ui/inputs/src/lib/checkbox/checkbox.component.stories.ts
@@ -0,0 +1,46 @@
+import {
+ applicationConfig,
+ Meta,
+ moduleMetadata,
+ StoryObj,
+} from '@storybook/angular'
+
+import { BrowserModule } from '@angular/platform-browser'
+import { BrowserAnimationsModule } from '@angular/platform-browser/animations'
+import { CommonModule } from '@angular/common'
+import { importProvidersFrom } from '@angular/core'
+import { CheckboxComponent } from './checkbox.component'
+import { MatCheckbox, MatCheckboxModule } from '@angular/material/checkbox'
+
+export default {
+ title: 'Inputs/CheckboxComponent',
+ component: CheckboxComponent,
+ decorators: [
+ moduleMetadata({
+ declarations: [MatCheckbox],
+ imports: [],
+ }),
+ applicationConfig({
+ providers: [
+ importProvidersFrom(
+ BrowserModule,
+ BrowserAnimationsModule,
+ CommonModule,
+ MatCheckboxModule
+ ),
+ ],
+ }),
+ ],
+} as Meta
+
+export const Primary: StoryObj = {
+ args: {
+ checked: false,
+ indeterminate: false,
+ },
+ argTypes: {
+ changed: {
+ action: 'changed',
+ },
+ },
+}
diff --git a/libs/ui/inputs/src/lib/checkbox/checkbox.component.ts b/libs/ui/inputs/src/lib/checkbox/checkbox.component.ts
new file mode 100644
index 0000000000..c9903a0495
--- /dev/null
+++ b/libs/ui/inputs/src/lib/checkbox/checkbox.component.ts
@@ -0,0 +1,25 @@
+import {
+ ChangeDetectionStrategy,
+ Component,
+ EventEmitter,
+ Input,
+ Output,
+} from '@angular/core'
+
+@Component({
+ selector: 'gn-ui-checkbox',
+ templateUrl: './checkbox.component.html',
+ styleUrls: ['./checkbox.component.css'],
+ changeDetection: ChangeDetectionStrategy.OnPush,
+})
+export class CheckboxComponent {
+ @Input() checked = false
+ @Input() indeterminate? = false
+ @Output() changed = new EventEmitter()
+
+ handleClick(event: Event) {
+ event.stopPropagation()
+ this.checked = !this.checked
+ this.changed.emit(this.checked)
+ }
+}
diff --git a/libs/ui/inputs/src/lib/ui-inputs.module.ts b/libs/ui/inputs/src/lib/ui-inputs.module.ts
index a5c5e02445..a595dbf425 100644
--- a/libs/ui/inputs/src/lib/ui-inputs.module.ts
+++ b/libs/ui/inputs/src/lib/ui-inputs.module.ts
@@ -34,6 +34,7 @@ import { CheckToggleComponent } from './check-toggle/check-toggle.component'
import { CopyTextButtonComponent } from './copy-text-button/copy-text-button.component'
import { MatTooltipModule } from '@angular/material/tooltip'
import { CommonModule } from '@angular/common'
+import { CheckboxComponent } from './checkbox/checkbox.component'
@NgModule({
declarations: [
@@ -58,6 +59,7 @@ import { CommonModule } from '@angular/common'
FormFieldTemporalExtentComponent,
CheckToggleComponent,
CopyTextButtonComponent,
+ CheckboxComponent,
],
imports: [
CommonModule,
@@ -89,6 +91,7 @@ import { CommonModule } from '@angular/common'
FormFieldComponent,
CheckToggleComponent,
CopyTextButtonComponent,
+ CheckboxComponent,
],
})
export class UiInputsModule {}
diff --git a/libs/ui/search/src/lib/record-table/record-table.component.html b/libs/ui/search/src/lib/record-table/record-table.component.html
index 6343d7a8a1..809973bf98 100644
--- a/libs/ui/search/src/lib/record-table/record-table.component.html
+++ b/libs/ui/search/src/lib/record-table/record-table.component.html
@@ -44,14 +44,22 @@