Unverified Commit aca573fd authored by Le Roy Loïc's avatar Le Roy Loïc Committed by GitHub
Browse files

Merge pull request #57 from ProgrammeVitam/vas_api_supervision_pr

[VAS] Journal des Opérations
parents 75e244bf 09a6f084
@import "~ui-frontend-common/sass/variables/colors";
.vitamui-header {
background-image: none;
.controls {
margin-top: 57.5px;
h2 {
font-weight: 300;
font-size: 28px;
> img {
vertical-align: middle;
width: 37px;
margin-right: 17px;
}
}
}
}
.filter-banner-container {
display: flex;
height: 70px;
margin-left: 10px;
}
.custom-flex-controls{
text-align: right;
justify-content: space-between;
}
\ No newline at end of file
/*
* Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020)
* and the signatories of the "VITAM - Accord du Contributeur" agreement.
*
* contact@programmevitam.fr
*
* This software is a computer program whose purpose is to implement
* implement a digital archiving front-office system for the secure and
* efficient high volumetry VITAM solution.
*
* This software is governed by the CeCILL-C license under French law and
* abiding by the rules of distribution of free software. You can use,
* modify and/ or redistribute the software under the terms of the CeCILL-C
* license as circulated by CEA, CNRS and INRIA at the following URL
* "http://www.cecill.info".
*
* As a counterpart to the access to the source code and rights to copy,
* modify and redistribute granted by the license, users are provided only
* with a limited warranty and the software's author, the holder of the
* economic rights, and the successive licensors have only limited
* liability.
*
* In this respect, the user's attention is drawn to the risks associated
* with loading, using, modifying and/or developing or reproducing the
* software by the user in light of its specific status of free software,
* that may mean that it is complicated to manipulate, and that also
* therefore means that it is reserved for developers and experienced
* professionals having in-depth computer knowledge. Users are therefore
* encouraged to load and test the software's suitability as regards their
* requirements in conditions enabling the security of their systems and/or
* data to be ensured and, more generally, to use and operate it in the
* same conditions as regards security.
*
* The fact that you are presently reading this means that you have had
* knowledge of the CeCILL-C license and that you accept its terms.
*/
import { ENVIRONMENT, GlobalEventService } from 'ui-frontend-common';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ReactiveFormsModule } from '@angular/forms';
import { MatMenuModule } from '@angular/material';
import { ActivatedRoute, Router } from '@angular/router';
import { EMPTY } from 'rxjs';
import { environment } from '../../environments/environment';
import { LogbookOperationComponent } from './logbook-operation.component';
import { LogbookSearchService } from './logbook-search.service';
describe('LogbookOperationComponent', () => {
let component: LogbookOperationComponent;
let fixture: ComponentFixture<LogbookOperationComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
MatMenuModule,
ReactiveFormsModule
],
declarations: [LogbookOperationComponent],
providers: [
{ provide: ActivatedRoute, useValue: { paramMap: EMPTY, data: EMPTY } },
{ provide: LogbookSearchService, useValue: { search: () => EMPTY } },
{ provide: Router, useValue: { navigate: () => { } } },
{ provide: GlobalEventService, useValue: { pageEvent: EMPTY, customerEvent: EMPTY, tenantEvent: EMPTY } },
{ provide: ENVIRONMENT, useValue: environment }
],
schemas: [NO_ERRORS_SCHEMA]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(LogbookOperationComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
/*
* Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020)
* and the signatories of the "VITAM - Accord du Contributeur" agreement.
*
* contact@programmevitam.fr
*
* This software is a computer program whose purpose is to implement
* implement a digital archiving front-office system for the secure and
* efficient high volumetry VITAM solution.
*
* This software is governed by the CeCILL-C license under French law and
* abiding by the rules of distribution of free software. You can use,
* modify and/ or redistribute the software under the terms of the CeCILL-C
* license as circulated by CEA, CNRS and INRIA at the following URL
* "http://www.cecill.info".
*
* As a counterpart to the access to the source code and rights to copy,
* modify and redistribute granted by the license, users are provided only
* with a limited warranty and the software's author, the holder of the
* economic rights, and the successive licensors have only limited
* liability.
*
* In this respect, the user's attention is drawn to the risks associated
* with loading, using, modifying and/or developing or reproducing the
* software by the user in light of its specific status of free software,
* that may mean that it is complicated to manipulate, and that also
* therefore means that it is reserved for developers and experienced
* professionals having in-depth computer knowledge. Users are therefore
* encouraged to load and test the software's suitability as regards their
* requirements in conditions enabling the security of their systems and/or
* data to be ensured and, more generally, to use and operate it in the
* same conditions as regards security.
*
* The fact that you are presently reading this means that you have had
* knowledge of the CeCILL-C license and that you accept its terms.
*/
import { GlobalEventService, SidenavPage } from 'ui-frontend-common';
import { Component, OnInit, ViewChild } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router';
import { EventFilter } from './event-filter.interface';
import { LogbookOperationListComponent } from './logbook-operation-list/logbook-operation-list.component';
@Component({
selector: 'app-logbook-operation',
templateUrl: './logbook-operation.component.html',
styleUrls: ['./logbook-operation.component.scss']
})
export class LogbookOperationComponent extends SidenavPage<any> implements OnInit {
dateRangeFilterForm: FormGroup;
tenantIdentifier: number;
filters: Readonly<EventFilter> = {};
@ViewChild(LogbookOperationListComponent, { static: true }) list: LogbookOperationListComponent;
constructor(
private route: ActivatedRoute,
private router: Router,
private formBuilder: FormBuilder,
globalEventService: GlobalEventService
) {
super(route, globalEventService);
this.route.paramMap.subscribe((paramMap) => this.tenantIdentifier = + paramMap.get('tenantIdentifier'));
this.dateRangeFilterForm = this.formBuilder.group({
startDate: null,
endDate: null
});
this.dateRangeFilterForm.valueChanges.subscribe((value) => {
this.filters = {
type: this.filters.type,
status: this.filters.status,
dateRange: value
};
});
}
ngOnInit() {
if (!this.list) {
console.error('LogbookOperationComponent Error: no list in the template');
}
}
changeTenant(tenantIdentifier: number) {
this.router.navigate(['..', tenantIdentifier], { relativeTo: this.route });
}
clearDate(date: 'startDate' | 'endDate') {
if (date === 'startDate') {
this.dateRangeFilterForm.get(date).reset(null, { emitEvent: false });
} else if (date === 'endDate') {
this.dateRangeFilterForm.get(date).reset(null, { emitEvent: false });
} else {
console.error('clearDate() error: unknown date ' + date);
}
}
refreshList() {
if (!this.list) {
return;
}
this.list.refreshList();
}
toggleTypeFilter(type: 'INGEST' | 'ELIMINATION' | 'MASTERDATA') {
this.filters = {
type: (!this.filters.type || this.filters.type !== type) ? type : null,
status: this.filters.status,
dateRange: this.filters.dateRange
};
}
toggleStatusFilter(status: 'RUNNING' | 'ERROR' | 'DONE') {
this.filters = {
type: this.filters.type,
status: (!this.filters.status || this.filters.status !== status) ? status : null,
dateRange: this.filters.dateRange
};
}
}
/*
* Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020)
* and the signatories of the "VITAM - Accord du Contributeur" agreement.
*
* contact@programmevitam.fr
*
* This software is a computer program whose purpose is to implement
* implement a digital archiving front-office system for the secure and
* efficient high volumetry VITAM solution.
*
* This software is governed by the CeCILL-C license under French law and
* abiding by the rules of distribution of free software. You can use,
* modify and/ or redistribute the software under the terms of the CeCILL-C
* license as circulated by CEA, CNRS and INRIA at the following URL
* "http://www.cecill.info".
*
* As a counterpart to the access to the source code and rights to copy,
* modify and redistribute granted by the license, users are provided only
* with a limited warranty and the software's author, the holder of the
* economic rights, and the successive licensors have only limited
* liability.
*
* In this respect, the user's attention is drawn to the risks associated
* with loading, using, modifying and/or developing or reproducing the
* software by the user in light of its specific status of free software,
* that may mean that it is complicated to manipulate, and that also
* therefore means that it is reserved for developers and experienced
* professionals having in-depth computer knowledge. Users are therefore
* encouraged to load and test the software's suitability as regards their
* requirements in conditions enabling the security of their systems and/or
* data to be ensured and, more generally, to use and operate it in the
* same conditions as regards security.
*
* The fact that you are presently reading this means that you have had
* knowledge of the CeCILL-C license and that you accept its terms.
*/
import { VitamUICommonModule } from 'ui-frontend-common';
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';
import {
MatDatepickerModule, MatMenuModule, MatNativeDateModule, MatProgressSpinnerModule, MatSidenavModule, MatTabsModule
} from '@angular/material';
import {
LogbookOperationDetailComponent
} from './logbook-operation-detail/logbook-operation-detail.component';
import {
LogbookOperationPopupComponent
} from './logbook-operation-detail/logbook-operation-popup.component';
import { EventTypeBadgeClassPipe } from './logbook-operation-list/event-type-badge-class.pipe';
import { EventTypeColorClassPipe } from './logbook-operation-list/event-type-color-class.pipe';
import { LastEventPipe } from './logbook-operation-list/last-event.pipe';
import { LogbookOperationListComponent } from './logbook-operation-list/logbook-operation-list.component';
import { LogbookOperationRoutingModule } from './logbook-operation-routing.module';
import { LogbookOperationComponent } from './logbook-operation.component';
@NgModule({
declarations: [
LogbookOperationComponent,
LogbookOperationListComponent,
LogbookOperationDetailComponent,
LogbookOperationPopupComponent,
LastEventPipe,
EventTypeColorClassPipe,
EventTypeBadgeClassPipe,
],
imports: [
CommonModule,
MatSidenavModule,
MatMenuModule,
MatDatepickerModule,
MatProgressSpinnerModule,
MatTabsModule,
ReactiveFormsModule,
VitamUICommonModule,
LogbookOperationRoutingModule,
MatNativeDateModule
]
})
export class LogbookOperationModule { }
/*
* Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020)
* and the signatories of the "VITAM - Accord du Contributeur" agreement.
*
* contact@programmevitam.fr
*
* This software is a computer program whose purpose is to implement
* implement a digital archiving front-office system for the secure and
* efficient high volumetry VITAM solution.
*
* This software is governed by the CeCILL-C license under French law and
* abiding by the rules of distribution of free software. You can use,
* modify and/ or redistribute the software under the terms of the CeCILL-C
* license as circulated by CEA, CNRS and INRIA at the following URL
* "http://www.cecill.info".
*
* As a counterpart to the access to the source code and rights to copy,
* modify and redistribute granted by the license, users are provided only
* with a limited warranty and the software's author, the holder of the
* economic rights, and the successive licensors have only limited
* liability.
*
* In this respect, the user's attention is drawn to the risks associated
* with loading, using, modifying and/or developing or reproducing the
* software by the user in light of its specific status of free software,
* that may mean that it is complicated to manipulate, and that also
* therefore means that it is reserved for developers and experienced
* professionals having in-depth computer knowledge. Users are therefore
* encouraged to load and test the software's suitability as regards their
* requirements in conditions enabling the security of their systems and/or
* data to be ensured and, more generally, to use and operate it in the
* same conditions as regards security.
*
* The fact that you are presently reading this means that you have had
* knowledge of the CeCILL-C license and that you accept its terms.
*/
import { LogbookApiService, LogbookService } from 'ui-frontend-common';
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { TestBed } from '@angular/core/testing';
import { LogbookSearchService } from './logbook-search.service';
describe('LogbookSearchService', () => {
beforeEach(() => TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [
{ provide: LogbookService, useValue: {} },
{ provide: LogbookApiService, useValue: {} },
]
}));
it('should be created', () => {
const service: LogbookSearchService = TestBed.get(LogbookSearchService);
expect(service).toBeTruthy();
});
});
/*
* Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020)
* and the signatories of the "VITAM - Accord du Contributeur" agreement.
*
* contact@programmevitam.fr
*
* This software is a computer program whose purpose is to implement
* implement a digital archiving front-office system for the secure and
* efficient high volumetry VITAM solution.
*
* This software is governed by the CeCILL-C license under French law and
* abiding by the rules of distribution of free software. You can use,
* modify and/ or redistribute the software under the terms of the CeCILL-C
* license as circulated by CEA, CNRS and INRIA at the following URL
* "http://www.cecill.info".
*
* As a counterpart to the access to the source code and rights to copy,
* modify and redistribute granted by the license, users are provided only
* with a limited warranty and the software's author, the holder of the
* economic rights, and the successive licensors have only limited
* liability.
*
* In this respect, the user's attention is drawn to the risks associated
* with loading, using, modifying and/or developing or reproducing the
* software by the user in light of its specific status of free software,
* that may mean that it is complicated to manipulate, and that also
* therefore means that it is reserved for developers and experienced
* professionals having in-depth computer knowledge. Users are therefore
* encouraged to load and test the software's suitability as regards their
* requirements in conditions enabling the security of their systems and/or
* data to be ensured and, more generally, to use and operate it in the
* same conditions as regards security.
*
* The fact that you are presently reading this means that you have had
* knowledge of the CeCILL-C license and that you accept its terms.
*/
import * as moment from 'moment';
import {
Event, LogbookApiService, PageRequest, SearchService, VitamSelectOperator, VitamSelectQuery
} from 'ui-frontend-common';
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { EventFilter } from './event-filter.interface';
@Injectable({
providedIn: 'root'
})
export class LogbookSearchService extends SearchService<Event> {
constructor(http: HttpClient, logbookApi: LogbookApiService) {
super(http, logbookApi);
}
static buildVitamQuery(pageRequest: PageRequest, filters: EventFilter): VitamSelectQuery {
const baseParameters: Partial<VitamSelectQuery> = {
$projection: {},
$filter: {
$limit: pageRequest.size,
$offset: Math.max(0, pageRequest.page - 1) * pageRequest.size,
$orderby: { evDateTime: -1 }
}
};
if (!filters) {
return {
$query: {} as VitamSelectOperator,
...baseParameters
};
}
const queryOperators = this.buildQueryOperators(filters);
if (queryOperators.length === 0) {
return {
$query: {} as VitamSelectOperator,
...baseParameters
};
}
return {
$query: {
$and: [
...this.buildQueryOperators(filters),
]
},
...baseParameters
};
}
private static buildQueryOperators(filters: EventFilter): VitamSelectOperator[] {
const operators: VitamSelectOperator[] = [];
if (filters.type) {
operators.push({ $eq: { evTypeProc: filters.type } });
}
if (filters.status === 'ERROR') {
operators.push({ $in: { 'events.outcome': ['KO', 'FATAL'] } });
}
if (filters.dateRange && filters.dateRange.startDate) {
operators.push({ $gte: { evDateTime: filters.dateRange.startDate } });
}
if (filters.dateRange && filters.dateRange.endDate) {
operators.push({ $lte: { evDateTime: moment(filters.dateRange.endDate).endOf('day') } });
}
return operators;
}
}
......@@ -220,7 +220,7 @@
</trans-unit><trans-unit id="historySectionTitleUnit" datatype="html">
<source>Journal des opérations</source><target state="new"/>
<context-group purpose="location"><context context-type="sourcefile">../../node_modules/ui-frontend-common/app/modules/logbook/history/operation-history-tab/operation-history-tab.component.d.ts</context><context context-type="linenumber">5</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/securisation/securisation-preview/securisation-check-tab/securisation-check-tab.component.html</context><context context-type="linenumber">11</context></context-group></trans-unit><trans-unit id="menuCustomer" datatype="html">
<context-group purpose="location"><context context-type="sourcefile">../../node_modules/ui-frontend-common/app/modules/logbook/history/operation-history-tab/operation-history-tab.component.d.ts</context><context context-type="linenumber">5</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/securisation/securisation-preview/securisation-check-tab/securisation-check-tab.component.html</context><context context-type="linenumber">12</context></context-group></trans-unit><trans-unit id="menuCustomer" datatype="html">
<source>Applications</source><target state="new"/>
<context-group purpose="location">
<context context-type="sourcefile">../../node_modules/ui-frontend-common/app/modules/components/navbar/application-menu/application-menu.component.d.ts</context>
......@@ -975,7 +975,7 @@
<note priority="1" from="description">Show more results</note>
<context-group purpose="location"><context context-type="sourcefile">src/app/access-contract/access-contract-list/access-contract-list.component.html</context><context context-type="linenumber">88</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/ingest-contract/ingest-contract-list/ingest-contract-list.component.html</context><context context-type="linenumber">96</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/agency/agency-list/agency-list.component.html</context><context context-type="linenumber">54</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/file-format/file-format-list/file-format-list.component.html</context><context context-type="linenumber">57</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/context/context-list/context-list.component.html</context><context context-type="linenumber">82</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/security-profile/security-profile-list/security-profile-list.component.html</context><context context-type="linenumber">51</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/ontology/ontology-list/ontology-list.component.html</context><context context-type="linenumber">57</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/audit/audit-list/audit-list.component.html</context><context context-type="linenumber">51</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/securisation/securisation-list/securisation-list.component.html</context><context context-type="linenumber">53</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/probative-value/probative-value-list/probative-value-list.component.html</context><context context-type="linenumber">50</context></context-group></trans-unit><trans-unit id="accessContractSearchHeader" datatype="html">
<context-group purpose="location"><context context-type="sourcefile">src/app/access-contract/access-contract-list/access-contract-list.component.html</context><context context-type="linenumber">88</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/ingest-contract/ingest-contract-list/ingest-contract-list.component.html</context><context context-type="linenumber">96</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/agency/agency-list/agency-list.component.html</context><context context-type="linenumber">54</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/file-format/file-format-list/file-format-list.component.html</context><context context-type="linenumber">57</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/context/context-list/context-list.component.html</context><context context-type="linenumber">82</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/security-profile/security-profile-list/security-profile-list.component.html</context><context context-type="linenumber">51</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/ontology/ontology-list/ontology-list.component.html</context><context context-type="linenumber">57</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/audit/audit-list/audit-list.component.html</context><context context-type="linenumber">51</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/securisation/securisation-list/securisation-list.component.html</context><context context-type="linenumber">53</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/probative-value/probative-value-list/probative-value-list.component.html</context><context context-type="linenumber">50</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/logbook-operation/logbook-operation-list/logbook-operation-list.component.html</context><context context-type="linenumber">78</context></context-group></trans-unit><trans-unit id="accessContractSearchHeader" datatype="html">
<source>
Paramétrer mes <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong>"/>Contrats d'accès<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong>"/>
</source><target state="new"/>
......@@ -1970,12 +1970,12 @@
<context-group purpose="location"><context context-type="sourcefile">src/app/audit/audit.component.html</context><context context-type="linenumber">36</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/securisation/securisation.component.html</context><context context-type="linenumber">32</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/probative-value/probative-value.component.html</context><context context-type="linenumber">39</context></context-group></trans-unit><trans-unit id="apiSupervisionEndDate" datatype="html">
<context-group purpose="location"><context context-type="sourcefile">src/app/audit/audit.component.html</context><context context-type="linenumber">36</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/securisation/securisation.component.html</context><context context-type="linenumber">32</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/probative-value/probative-value.component.html</context><context context-type="linenumber">43</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/logbook-operation/logbook-operation.component.html</context><context context-type="linenumber">43</context></context-group></trans-unit><trans-unit id="apiSupervisionEndDate" datatype="html">
<source>Date de fin</source><target state="new"/>
<context-group purpose="location"><context context-type="sourcefile">src/app/audit/audit.component.html</context><context context-type="linenumber">49</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/securisation/securisation.component.html</context><context context-type="linenumber">45</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/probative-value/probative-value.component.html</context><context context-type="linenumber">52</context></context-group></trans-unit><trans-unit id="userPreviewTabVerification" datatype="html">
<context-group purpose="location"><context context-type="sourcefile">src/app/audit/audit.component.html</context><context context-type="linenumber">49</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/securisation/securisation.component.html</context><context context-type="linenumber">45</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/probative-value/probative-value.component.html</context><context context-type="linenumber">56</context></context-group><context-group purpose="location"><context context-type="sourcefile">src/app/logbook-operation/logbook-operation.component.html</context><context context-type="linenumber">54</context></context-group></trans-unit><trans-unit id="userPreviewTabVerification" datatype="html">
<source>Informations</source><target state="new"/>
......@@ -2033,10 +2033,146 @@
<note priority="1" from="description">Version</note>
<context-group purpose="location"><context context-type="sourcefile">src/app/probative-value/probative-value-create/probative-value-create.component.html</context><context context-type="linenumber">67</context></context-group></trans-unit><trans-unit id="probativeValueSearchPlaceholder" datatype="html">
<source>Identifiant de relevé, identifiant d'UA</source><target state="new"/>
<context-group purpose="location"><context context-type="sourcefile">src/app/probative-value/probative-value.component.html</context><context context-type="linenumber">23</context></context-group></trans-unit><trans-unit id="logbookOperationListIdentifiantHeader" datatype="html">
<source>Identifiant</source><target state="new"/>
<context-group purpose="location">
<context context-type="sourcefile">src/app/probative-value/probative-value.component.html</context>
<context context-type="linenumber">21</context>
<context context-type="sourcefile">src/app/logbook-operation/logbook-operation-list/logbook-operation-list.component.html</context>
<context context-type="linenumber">10</context>
</context-group>
</trans-unit><trans-unit id="logbookOperationListOperationHeader" datatype="html">
<source>Opération</source><target state="new"/>
<context-group purpose="location">
<context context-type="sourcefile">src/app/logbook-operation/logbook-operation-list/logbook-operation-list.component.html</context>
<context context-type="linenumber">16</context>
</context-group>
</trans-unit><trans-unit id="logbookOperationListStartDateHeader" datatype="html">
<source>Date de création</source><target state="new"/>
<context-group purpose="location">
<context context-type="sourcefile">src/app/logbook-operation/logbook-operation-list/logbook-operation-list.component.html</context>
<context context-type="linenumber">22</context>
</context-group>
</trans-unit><trans-unit id="logbookOperationListEndDateHeader" datatype="html">
<source>Fin d'exécution</source><target state="new"/>
<context-group purpose="location">
<context context-type="sourcefile">src/app/logbook-operation/logbook-operation-list/logbook-operation-list.component.html</context>