diff --git a/web-app/src/app/shared/components/toolbar/toolbar.component.less b/web-app/src/app/shared/components/toolbar/toolbar.component.less
new file mode 100755
index 00000000000..4fb53f2295f
--- /dev/null
+++ b/web-app/src/app/shared/components/toolbar/toolbar.component.less
@@ -0,0 +1,15 @@
+.wrapper {
+ display: flex;
+ margin-bottom: 20px;
+ justify-content: space-between;
+
+ .container {
+ display: flex;
+ gap: 8px;
+
+ }
+
+ .container:first-child {
+ gap: 0px;
+ }
+}
diff --git a/web-app/src/app/shared/components/toolbar/toolbar.component.spec.ts b/web-app/src/app/shared/components/toolbar/toolbar.component.spec.ts
new file mode 100755
index 00000000000..7f243894f60
--- /dev/null
+++ b/web-app/src/app/shared/components/toolbar/toolbar.component.spec.ts
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ToolbarComponent } from './toolbar.component';
+
+describe('ToolbarComponent', () => {
+ let component: ToolbarComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ declarations: [ToolbarComponent]
+ }).compileComponents();
+ });
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(ToolbarComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/web-app/src/app/shared/components/toolbar/toolbar.component.ts b/web-app/src/app/shared/components/toolbar/toolbar.component.ts
new file mode 100755
index 00000000000..0b0423f504d
--- /dev/null
+++ b/web-app/src/app/shared/components/toolbar/toolbar.component.ts
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Component, ContentChild, TemplateRef, AfterContentInit, Input } from '@angular/core';
+
+@Component({
+ selector: 'app-toolbar',
+ templateUrl: './toolbar.component.html',
+ styleUrls: ['./toolbar.component.less']
+})
+export class ToolbarComponent {
+ @ContentChild('left', { static: true }) leftTemplateRef: TemplateRef | undefined;
+ @ContentChild('right', { static: true }) rightTemplateRef: TemplateRef | undefined;
+ @ContentChild('center', { static: true }) centerTemplateRef: TemplateRef | undefined;
+ @Input() wrapperClass: string = '';
+ @Input() wrapperStyle: string = '';
+ @Input() containerClass: string = '';
+ @Input() containerStyle: string = '';
+ @Input() leftClass: string = '';
+ @Input() leftStyle: string = '';
+ @Input() rightClass: string = '';
+ @Input() rightStyle: string = '';
+ @Input() centerClass: string = '';
+ @Input() centerStyle: string = '';
+}
diff --git a/web-app/src/app/shared/shared.module.ts b/web-app/src/app/shared/shared.module.ts
index 81ed05447ec..8cb1f7eeb84 100644
--- a/web-app/src/app/shared/shared.module.ts
+++ b/web-app/src/app/shared/shared.module.ts
@@ -12,6 +12,7 @@ import { HelpMassageShowComponent } from './components/help-massage-show/help-ma
import { KeyValueInputComponent } from './components/key-value-input/key-value-input.component';
import { MetricsFieldInputComponent } from './components/metrics-field-input/metrics-field-input.component';
import { MultiFuncInputComponent } from './components/multi-func-input/multi-func-input.component';
+import { ToolbarComponent } from './components/toolbar/toolbar.component';
import { ElapsedTimePipe } from './pipe/elapsed-time.pipe';
import { I18nElsePipe } from './pipe/i18n-else.pipe';
import { TimezonePipe } from './pipe/timezone.pipe';
@@ -23,7 +24,8 @@ const COMPONENTS: Array> = [
KeyValueInputComponent,
MultiFuncInputComponent,
HelpMassageShowComponent,
- MetricsFieldInputComponent
+ MetricsFieldInputComponent,
+ ToolbarComponent
];
const DIRECTIVES: Array> = [TimezonePipe, I18nElsePipe, ElapsedTimePipe];