diff --git a/package-lock.json b/package-lock.json index 5b2cab660..90c589652 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2885,6 +2885,11 @@ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", "dev": true }, + "angular-ng-autocomplete": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/angular-ng-autocomplete/-/angular-ng-autocomplete-2.0.1.tgz", + "integrity": "sha512-IlKrUeMM6V0/ipnlXF5WluiWmav7eiIlZWtEoch6eXUGylYCHGNdwRO4Kb2snMQuY/6Kv6tDbRFT51Tihd3JwQ==" + }, "ansi-colors": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", diff --git a/package.json b/package.json index ad53f5cce..f9018da5d 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@ngrx/effects": "^9.0.0", "@ngrx/store": "^9.0.0", "@ngrx/store-devtools": "^9.0.0", + "angular-ng-autocomplete": "^2.0.1", "bootstrap": "^4.4.1", "jquery": "^3.4.1", "minimist": "^1.2.5", diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 89e7d1029..46cc596ea 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -8,6 +8,7 @@ import { EffectsModule } from '@ngrx/effects'; import { StoreDevtoolsModule } from '@ngrx/store-devtools'; import { NgxPaginationModule } from 'ngx-pagination'; +import { AutocompleteLibModule } from 'angular-ng-autocomplete'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; @@ -92,6 +93,7 @@ import { CreateProjectTypeComponent } from './modules/customer-managment/compone ReactiveFormsModule, HttpClientModule, NgxPaginationModule, + AutocompleteLibModule, StoreModule.forRoot(reducers, { metaReducers, }), diff --git a/src/app/modules/shared/components/details-fields/details-fields.component.html b/src/app/modules/shared/components/details-fields/details-fields.component.html index a1d5012ae..4ab6e3de3 100644 --- a/src/app/modules/shared/components/details-fields/details-fields.component.html +++ b/src/app/modules/shared/components/details-fields/details-fields.component.html @@ -1,16 +1,24 @@
-
+
Project
- +
+ + + + + + +
+
+
diff --git a/src/app/modules/shared/components/details-fields/details-fields.component.scss b/src/app/modules/shared/components/details-fields/details-fields.component.scss index 2f1cca316..c26089d15 100644 --- a/src/app/modules/shared/components/details-fields/details-fields.component.scss +++ b/src/app/modules/shared/components/details-fields/details-fields.component.scss @@ -69,3 +69,23 @@ } } } + +.ng-autocomplete { + width: 100%; +} + +.autocomplete::ng-deep .autocomplete-container { + border: 1px solid #ced4da; + border-radius: 0 0.25rem 0.25rem 0; + box-shadow: none; + height: 2rem; + + .input-container { + height: 100%; + + input { + border-radius: 0.25rem; + height: 100%; + } + } +} diff --git a/src/app/modules/shared/components/details-fields/details-fields.component.spec.ts b/src/app/modules/shared/components/details-fields/details-fields.component.spec.ts index 77a8e6093..93794ceb8 100644 --- a/src/app/modules/shared/components/details-fields/details-fields.component.spec.ts +++ b/src/app/modules/shared/components/details-fields/details-fields.component.spec.ts @@ -5,19 +5,28 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { TechnologyState } from '../../store/technology.reducers'; import { allTechnologies } from '../../store/technology.selectors'; import { DetailsFieldsComponent } from './details-fields.component'; -import { FilterProjectPipe } from '../../../shared/pipes'; import * as actions from '../../store/technology.actions'; +import { ProjectState } from '../../../project-management/store/project.reducer'; +import { allProjects } from '../../../project-management/store/project.selectors'; describe('DetailsFieldsComponent', () => { + type Merged = TechnologyState & ProjectState; let component: DetailsFieldsComponent; let fixture: ComponentFixture; - let store: MockStore; + let store: MockStore; let mockTechnologySelector; + let mockProjectsSelector; let length; const state = { - technologyList: { items: [{ name: 'java' }] }, - isLoading: false, + projects: { + projectList: [{ id: 'id', name: 'name', description: 'description' }], + isLoading: false, + }, + technologies: { + technologyList: { items: [{ name: 'java' }] }, + isLoading: false, + }, }; const initialData = { @@ -36,12 +45,13 @@ describe('DetailsFieldsComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [DetailsFieldsComponent, FilterProjectPipe], + declarations: [DetailsFieldsComponent], providers: [provideMockStore({ initialState: state })], imports: [FormsModule, ReactiveFormsModule], }).compileComponents(); store = TestBed.inject(MockStore); - mockTechnologySelector = store.overrideSelector(allTechnologies, state); + mockTechnologySelector = store.overrideSelector(allTechnologies, state.technologies); + mockProjectsSelector = store.overrideSelector(allProjects, state.projects); })); beforeEach(() => { diff --git a/src/app/modules/shared/components/details-fields/details-fields.component.ts b/src/app/modules/shared/components/details-fields/details-fields.component.ts index 0d7592cd5..92cc49d0a 100644 --- a/src/app/modules/shared/components/details-fields/details-fields.component.ts +++ b/src/app/modules/shared/components/details-fields/details-fields.component.ts @@ -4,7 +4,14 @@ import { Store, select } from '@ngrx/store'; import * as actions from '../../store/technology.actions'; import { allTechnologies } from '../../store/technology.selectors'; -import { Technology } from '../../models'; +import { Technology, Project } from '../../models'; + +import { ProjectState } from '../../../project-management/store/project.reducer'; +import { TechnologyState } from '../../store/technology.reducers'; +import { allProjects } from '../../../project-management/store/project.selectors'; +import * as projectActions from '../../../project-management/store/project.actions'; + +type Merged = TechnologyState & ProjectState; @Component({ selector: 'app-details-fields', @@ -20,8 +27,10 @@ export class DetailsFieldsComponent implements OnChanges, OnInit { technology: Technology; selectedTechnology: string[] = []; isLoading = false; + listProjects: Project[] = []; + keyword = 'name'; - constructor(private formBuilder: FormBuilder, private store: Store) { + constructor(private formBuilder: FormBuilder, private store: Store) { this.entryForm = this.formBuilder.group({ project: '', activity: '', @@ -36,6 +45,12 @@ export class DetailsFieldsComponent implements OnChanges, OnInit { this.isLoading = response.isLoading; this.technology = response.technologyList; }); + + this.store.dispatch(new projectActions.LoadProjects()); + const projects$ = this.store.pipe(select(allProjects)); + projects$.subscribe((response) => { + this.listProjects = response.projectList; + }); } ngOnChanges(): void { diff --git a/src/app/modules/time-clock/components/project-list-hover/project-list-hover.component.html b/src/app/modules/time-clock/components/project-list-hover/project-list-hover.component.html index 8cf1fa6e6..f3b0e0da6 100644 --- a/src/app/modules/time-clock/components/project-list-hover/project-list-hover.component.html +++ b/src/app/modules/time-clock/components/project-list-hover/project-list-hover.component.html @@ -1,14 +1,26 @@ - -
    -
  • + - {{ item.name }} - Clock In -
  • -
+ + +
+
+ Clock In +
+
+ +
+
+
diff --git a/src/app/modules/time-clock/components/project-list-hover/project-list-hover.component.scss b/src/app/modules/time-clock/components/project-list-hover/project-list-hover.component.scss index 996e88477..71adcf8f3 100644 --- a/src/app/modules/time-clock/components/project-list-hover/project-list-hover.component.scss +++ b/src/app/modules/time-clock/components/project-list-hover/project-list-hover.component.scss @@ -17,7 +17,21 @@ padding: 0 0.3rem; } -.active { - background-image: $list-item-selected; - border-color: transparent; +.ng-autocomplete { + width: 100%; +} + +.autocomplete::ng-deep .autocomplete-container { + border: 1px solid #ced4da; + border-radius: 0.25rem; + box-shadow: none; + + .input-container { + height: 100%; + + input { + border-radius: 0.25rem; + height: 100%; + } + } } diff --git a/src/app/modules/time-clock/components/project-list-hover/project-list-hover.component.ts b/src/app/modules/time-clock/components/project-list-hover/project-list-hover.component.ts index eb6514326..f097e42b3 100644 --- a/src/app/modules/time-clock/components/project-list-hover/project-list-hover.component.ts +++ b/src/app/modules/time-clock/components/project-list-hover/project-list-hover.component.ts @@ -14,14 +14,13 @@ export class ProjectListHoverComponent implements OnInit { @Output() showFields = new EventEmitter(); selectedId: string; - showButton: number; - filterProjects = ''; listProjects: Project[] = []; isLoading: boolean; + filterProjects = ''; + showButton = ''; + keyword = 'name'; - constructor(private store: Store) { - this.showButton = -1; - } + constructor(private store: Store) {} ngOnInit(): void { this.store.dispatch(new actions.LoadProjects()); diff --git a/src/app/modules/time-clock/pages/time-clock.component.html b/src/app/modules/time-clock/pages/time-clock.component.html index ae04628e4..c15e3777f 100644 --- a/src/app/modules/time-clock/pages/time-clock.component.html +++ b/src/app/modules/time-clock/pages/time-clock.component.html @@ -29,17 +29,18 @@
Week

14:00

-
Projects
- -
+
+ +
+ +
+
diff --git a/src/app/modules/time-entries/pages/time-entries.component.spec.ts b/src/app/modules/time-entries/pages/time-entries.component.spec.ts index 1f722640f..e5e9e8363 100644 --- a/src/app/modules/time-entries/pages/time-entries.component.spec.ts +++ b/src/app/modules/time-entries/pages/time-entries.component.spec.ts @@ -12,13 +12,16 @@ import { GroupByDatePipe } from '../../shared/pipes'; import { TechnologyState } from '../../shared/store/technology.reducers'; import { allTechnologies } from '../../shared/store/technology.selectors'; import { TimeEntriesComponent } from './time-entries.component'; -import { FilterProjectPipe } from '../../shared/pipes'; +import { ProjectState } from '../../project-management/store/project.reducer'; +import { allProjects } from '../../project-management/store/project.selectors'; describe('TimeEntriesComponent', () => { + type Merged = TechnologyState & ProjectState; let component: TimeEntriesComponent; let fixture: ComponentFixture; - let store: MockStore; + let store: MockStore; let mockTechnologySelector; + let mockProjectsSelector; const state = { projects: { @@ -30,8 +33,10 @@ describe('TimeEntriesComponent', () => { isLoading: false, message: 'message', }, - technologyList: { items: [{ name: 'test' }] }, - isLoading: false, + technologies: { + technologyList: { items: [{ name: 'test' }] }, + isLoading: false, + }, }; const entry = { @@ -50,7 +55,6 @@ describe('TimeEntriesComponent', () => { declarations: [ EmptyStateComponent, DetailsFieldsComponent, - FilterProjectPipe, GroupByDatePipe, ModalComponent, MonthPickerComponent, @@ -60,7 +64,8 @@ describe('TimeEntriesComponent', () => { imports: [FormsModule, ReactiveFormsModule], }).compileComponents(); store = TestBed.inject(MockStore); - mockTechnologySelector = store.overrideSelector(allTechnologies, state); + mockTechnologySelector = store.overrideSelector(allTechnologies, state.technologies); + mockProjectsSelector = store.overrideSelector(allProjects, state.projects); })); beforeEach(() => {