2024.12 from develop to master
All checks were successful
FarmMaps/FarmMapsLib/pipeline/head This commit looks good

Merge branch 'develop'

# Conflicts:
#	package-lock.json
#	package.json
This commit is contained in:
Francisco Salas 2024-12-09 13:40:33 +01:00
commit 2bad3274fd
13 changed files with 137 additions and 70 deletions

38
package-lock.json generated
View File

@ -1,22 +1,22 @@
{ {
"name": "farmmaps-lib-app", "name": "farmmaps-lib-app",
"version": "4.11.1", "version": "4.12.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "farmmaps-lib-app", "name": "farmmaps-lib-app",
"version": "4.11.1", "version": "4.12.0",
"dependencies": { "dependencies": {
"@angular-eslint/eslint-plugin": "^18.2.0", "@angular-eslint/eslint-plugin": "^18.2.0",
"@angular/animations": "^18.2.3", "@angular/animations": "18.2.3",
"@angular/common": "^18.2.3", "@angular/common": "18.2.3",
"@angular/compiler": "^18.2.3", "@angular/compiler": "18.2.3",
"@angular/core": "^18.2.3", "@angular/core": "18.2.3",
"@angular/forms": "^18.2.3", "@angular/forms": "18.2.3",
"@angular/platform-browser": "^18.2.3", "@angular/platform-browser": "18.2.3",
"@angular/platform-browser-dynamic": "^18.2.3", "@angular/platform-browser-dynamic": "18.2.3",
"@angular/router": "^18.2.3", "@angular/router": "18.2.3",
"@farmmaps/common": "file:dist/common", "@farmmaps/common": "file:dist/common",
"@farmmaps/common-map": "file:dist/common-map", "@farmmaps/common-map": "file:dist/common-map",
"@farmmaps/common-map3d": "file:dist/common-map3d", "@farmmaps/common-map3d": "file:dist/common-map3d",
@ -55,11 +55,11 @@
}, },
"devDependencies": { "devDependencies": {
"@angular-builders/custom-webpack": "^18.0.0", "@angular-builders/custom-webpack": "^18.0.0",
"@angular-devkit/build-angular": "^18.2.3", "@angular-devkit/build-angular": "18.2.3",
"@angular/cli": "^18.2.3", "@angular/cli": "18.2.3",
"@angular/compiler-cli": "^18.2.3", "@angular/compiler-cli": "18.2.3",
"@angular/language-service": "^18.2.3", "@angular/language-service": "18.2.3",
"@angular/localize": "^18.2.3", "@angular/localize": "18.2.3",
"@types/arcgis-rest-api": "^10.4.5", "@types/arcgis-rest-api": "^10.4.5",
"@types/jasmine": "~2.8.8", "@types/jasmine": "~2.8.8",
"@types/jasminewd2": "^2.0.9", "@types/jasminewd2": "^2.0.9",
@ -90,7 +90,7 @@
}, },
"dist/common": { "dist/common": {
"name": "@farmmaps/common", "name": "@farmmaps/common",
"version": "4.11.0-prerelease.2517", "version": "4.12.0-prerelease.2532",
"dependencies": { "dependencies": {
"tslib": "^2.3.0" "tslib": "^2.3.0"
}, },
@ -115,7 +115,7 @@
}, },
"dist/common-map": { "dist/common-map": {
"name": "@farmmaps/common-map", "name": "@farmmaps/common-map",
"version": "4.11.0-prerelease.2517", "version": "4.12.0-prerelease.2532",
"dependencies": { "dependencies": {
"tslib": "^2.0.0" "tslib": "^2.0.0"
}, },
@ -130,7 +130,7 @@
}, },
"dist/common-map3d": { "dist/common-map3d": {
"name": "@farmmaps/common-map3d", "name": "@farmmaps/common-map3d",
"version": "4.11.0-prerelease.2517", "version": "4.12.0-prerelease.2532",
"dependencies": { "dependencies": {
"tslib": "^2.0.0" "tslib": "^2.0.0"
}, },
@ -143,7 +143,7 @@
}, },
"dist/ng-openlayers": { "dist/ng-openlayers": {
"name": "@farmmaps/ng-openlayers", "name": "@farmmaps/ng-openlayers",
"version": "4.11.0-prerelease.2517", "version": "4.12.0-prerelease.2532",
"license": "MPL-2.0", "license": "MPL-2.0",
"dependencies": { "dependencies": {
"tslib": "^2.3.0" "tslib": "^2.3.0"

View File

@ -1,6 +1,6 @@
{ {
"name": "farmmaps-lib-app", "name": "farmmaps-lib-app",
"version": "4.11.1", "version": "4.12.0",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
"start": "ng serve", "start": "ng serve",
@ -12,14 +12,14 @@
"private": true, "private": true,
"dependencies": { "dependencies": {
"@angular-eslint/eslint-plugin": "^18.2.0", "@angular-eslint/eslint-plugin": "^18.2.0",
"@angular/animations": "^18.2.3", "@angular/animations": "18.2.3",
"@angular/common": "^18.2.3", "@angular/common": "18.2.3",
"@angular/compiler": "^18.2.3", "@angular/compiler": "18.2.3",
"@angular/core": "^18.2.3", "@angular/core": "18.2.3",
"@angular/forms": "^18.2.3", "@angular/forms": "18.2.3",
"@angular/platform-browser": "^18.2.3", "@angular/platform-browser": "18.2.3",
"@angular/platform-browser-dynamic": "^18.2.3", "@angular/platform-browser-dynamic": "18.2.3",
"@angular/router": "^18.2.3", "@angular/router": "18.2.3",
"@farmmaps/common": "file:dist/common", "@farmmaps/common": "file:dist/common",
"@farmmaps/common-map": "file:dist/common-map", "@farmmaps/common-map": "file:dist/common-map",
"@farmmaps/common-map3d": "file:dist/common-map3d", "@farmmaps/common-map3d": "file:dist/common-map3d",
@ -62,11 +62,11 @@
}, },
"devDependencies": { "devDependencies": {
"@angular-builders/custom-webpack": "^18.0.0", "@angular-builders/custom-webpack": "^18.0.0",
"@angular-devkit/build-angular": "^18.2.3", "@angular-devkit/build-angular": "18.2.3",
"@angular/cli": "^18.2.3", "@angular/cli": "18.2.3",
"@angular/compiler-cli": "^18.2.3", "@angular/compiler-cli": "18.2.3",
"@angular/language-service": "^18.2.3", "@angular/language-service": "18.2.3",
"@angular/localize": "^18.2.3", "@angular/localize": "18.2.3",
"@types/arcgis-rest-api": "^10.4.5", "@types/arcgis-rest-api": "^10.4.5",
"@types/jasmine": "~2.8.8", "@types/jasmine": "~2.8.8",
"@types/jasminewd2": "^2.0.9", "@types/jasminewd2": "^2.0.9",

View File

@ -8,7 +8,7 @@
"tslib": "^2.0.0" "tslib": "^2.0.0"
}, },
"peerDependencies": { "peerDependencies": {
"@angular/core": "^18.2.3", "@angular/core": "18.2.3",
"ngrx-store-localstorage": "^18.0.0", "ngrx-store-localstorage": "^18.0.0",
"@ngrx/effects": "^18.0.2", "@ngrx/effects": "^18.0.2",
"@ngrx/router-store": "^18.0.2", "@ngrx/router-store": "^18.0.2",

View File

@ -8,8 +8,8 @@
"tslib": "^2.0.0" "tslib": "^2.0.0"
}, },
"peerDependencies": { "peerDependencies": {
"@angular/common": "^18.2.3", "@angular/common": "18.2.3",
"@angular/core": "^18.2.3", "@angular/core": "18.2.3",
"cesium": "^1.97.0", "cesium": "^1.97.0",
"ol-cesium": ">=2.13.0" "ol-cesium": ">=2.13.0"
} }

View File

@ -6,9 +6,9 @@
}, },
"peerDependencies": { "peerDependencies": {
"@ng-bootstrap/ng-bootstrap": "^17.0.1", "@ng-bootstrap/ng-bootstrap": "^17.0.1",
"@angular/common": "^18.2.3", "@angular/common": "18.2.3",
"@angular/core": "^18.2.3", "@angular/core": "18.2.3",
"@angular/forms": "^18.2.3", "@angular/forms": "18.2.3",
"@ngrx/effects": "^18.0.2", "@ngrx/effects": "^18.0.2",
"@ngrx/router-store": "^18.0.2", "@ngrx/router-store": "^18.0.2",
"@ngrx/store": "^18.0.2", "@ngrx/store": "^18.0.2",

View File

@ -13,6 +13,7 @@ import { SchemaService } from './services/schema.service';
import { FolderService } from './services/folder.service'; import { FolderService } from './services/folder.service';
import { TimespanService } from './services/timespan.service'; import { TimespanService } from './services/timespan.service';
import { ItemService } from './services/item.service'; import { ItemService } from './services/item.service';
import { TaskService } from './services/task.service';
import { AdminService } from './services/admin.service'; import { AdminService } from './services/admin.service';
import { EventService } from './services/event.service'; import { EventService } from './services/event.service';
import { TypeaheadService } from './services/typeahead.service'; import { TypeaheadService } from './services/typeahead.service';
@ -44,6 +45,7 @@ export {
ItemTypeService, ItemTypeService,
TimespanService, TimespanService,
ItemService, ItemService,
TaskService,
AdminService, AdminService,
EventService, EventService,
TypeaheadService, TypeaheadService,

View File

@ -4,6 +4,7 @@ div.resumable-file-upload {
bottom: 0px; bottom: 0px;
width: 300px; width: 300px;
max-height: 250px; max-height: 250px;
z-index: 1;
/*z-index:2000 !important;*/ /*z-index:2000 !important;*/
} }

View File

@ -134,15 +134,22 @@ export class AppCommonEffects {
withLatestFrom(this.store$.select(appCommonReducers.selectGetItemTypes)), withLatestFrom(this.store$.select(appCommonReducers.selectGetItemTypes)),
switchMap(([action, itemtypes]) => { switchMap(([action, itemtypes]) => {
const a = action as appCommonActions.EditItem; const a = action as appCommonActions.EditItem;
var editor = "property"; var editor = "property";
if(a.item.itemType) { if(a.item.itemType) {
const itemType = itemtypes[a.item.itemType]; const itemType = itemtypes[a.item.itemType];
var editor = itemType && itemType.editor ? itemType.editor : editor; var editor = itemType && itemType.editor ? itemType.editor : editor;
} }
this.router$.navigate(['/editor',editor,'item', a.item.code]) if (editor == 'croppingscheme') {
return []; // Exeception: no 'item' in route
} this.router$.navigate(['/editor', editor, a.item.code])
))); }
else {
this.router$.navigate(['/editor', editor, 'item', a.item.code])
}
return [];
}
)
));
viewItem$ = createEffect(() => this.actions$.pipe( viewItem$ = createEffect(() => this.actions$.pipe(
ofType(appCommonActions.VIEWITEM), ofType(appCommonActions.VIEWITEM),

View File

@ -1,6 +1,7 @@
export interface IItemTask { export interface IItemTask {
code?: string; code?: string;
workflowCode?: string;
taskType?: string; taskType?: string;
attributes?: any; attributes?: any;
message?: string, message?: string,
@ -11,6 +12,7 @@ export interface IItemTask {
export class ItemTask implements IItemTask { export class ItemTask implements IItemTask {
public code?:string; public code?:string;
public workflowCode?: string;
public taskType?: string; public taskType?: string;
public attributes?: any; public attributes?: any;
public message?: string; public message?: string;
@ -18,6 +20,6 @@ export class ItemTask implements IItemTask {
public started?: Date; public started?: Date;
public finished?: Date; public finished?: Date;
constructor() { constructor() {
} }
} }

View File

@ -1,14 +1,12 @@
import { Injectable } from '@angular/core'; import {Injectable} from '@angular/core';
import { Observable } from 'rxjs'; import {Observable} from 'rxjs';
import { map } from 'rxjs/operators'; import {IItemType} from '../models/item.type';
import { IItemType } from '../models/item.type'; import {IItemLinkType} from '../models/itemlink.type';
import { IItemLinkType } from '../models/itemlink.type'; import {IItem} from '../models/item';
import { IUrlType } from '../models/url.type'; import {IJsonline} from '../models/json-line';
import { IItem } from '../models/item'; import {IItemTask} from '../models/itemTask';
import { IJsonline } from '../models/json-line'; import {HttpClient, HttpHeaders, HttpParams} from '@angular/common/http';
import { IItemTask } from '../models/itemTask'; import {AppConfig} from '../shared/app.config';
import { HttpClient, HttpParams, HttpHeaders } from "@angular/common/http";
import { AppConfig } from "../shared/app.config";
import {ItemTypeService} from './itemtype.service'; import {ItemTypeService} from './itemtype.service';
import {IListItem} from '../models/list.item'; import {IListItem} from '../models/list.item';
@ -81,7 +79,7 @@ export class ItemService {
getItemList(itemType?: string, dataFilter?: any, level?: number, atItemLocationItemCode?: string, getItemList(itemType?: string, dataFilter?: any, level?: number, atItemLocationItemCode?: string,
indexed?: boolean, validToday?: boolean,tags?:string,crs?:string, startDate?: Date, endDate?: Date, indexed?: boolean, validToday?: boolean,tags?:string,crs?:string, startDate?: Date, endDate?: Date,
skip?: number, take?: number, sourceTask?: string): Observable<IItem[]> { skip?: number, take?: number, sourceTask?: string, exactMatchStartOrEndDate?: boolean, owner?:string): Observable<IItem[]> {
let params = new HttpParams(); let params = new HttpParams();
if(itemType) params = params.append("it", itemType); if(itemType) params = params.append("it", itemType);
if(dataFilter) params = params.append("df", JSON.stringify(dataFilter)); if(dataFilter) params = params.append("df", JSON.stringify(dataFilter));
@ -96,20 +94,27 @@ export class ItemService {
if (sourceTask) params = params.append("sourceTask", sourceTask); if (sourceTask) params = params.append("sourceTask", sourceTask);
if(skip) params = params.append("skip", skip); if(skip) params = params.append("skip", skip);
if(take) params = params.append("take", take); if(take) params = params.append("take", take);
if(exactMatchStartOrEndDate !== undefined) params = params.append("exactMatchStartOrEndDate", exactMatchStartOrEndDate);
if(owner) params = params.append("owner", owner);
return this.httpClient.get<IItem[]>(`${this.ApiEndpoint()}/api/v1/items/`, { params: params }); return this.httpClient.get<IItem[]>(`${this.ApiEndpoint()}/api/v1/items/`, { params: params });
} }
getItemListCount(itemType: string, startDate?: Date, endDate?: Date, sourceTask?: string): Observable<number> { getItemListCount(itemType: string, startDate?: Date, endDate?: Date, sourceTask?: string,
indexed?: boolean, exactMatchStartOrEndDate?: boolean, owner?:string): Observable<number> {
let params = new HttpParams(); let params = new HttpParams();
params = params.append("it", itemType); params = params.append("it", itemType);
if (sourceTask) params = params.append("sourceTask", sourceTask); if (sourceTask) params = params.append("sourceTask", sourceTask);
if (startDate) params = params.append("sDate", startDate.toISOString()); if (startDate) params = params.append("sDate", startDate.toISOString());
if (endDate) params = params.append("eDate", endDate.toISOString()); if (endDate) params = params.append("eDate", endDate.toISOString());
if(indexed) params = params.append("ind",indexed?"true":"false");
if(exactMatchStartOrEndDate !== undefined) params = params.append("exactMatchStartOrEndDate", exactMatchStartOrEndDate);
if(owner) params = params.append("owner", owner);
return this.httpClient.get<number>(`${this.ApiEndpoint()}/api/v1/items/count`, { params: params }); return this.httpClient.get<number>(`${this.ApiEndpoint()}/api/v1/items/count`, { params: params });
} }
getChildItemList(parentcode: string, itemType?: string, dataFilter?: any, level = 1, deep = true, getChildItemList(parentcode: string, itemType?: string, dataFilter?: any, level = 1, deep = true,
startDate?: Date, endDate?: Date, skip?: number, take?: number): Observable<IItem[]> { startDate?: Date, endDate?: Date, skip?: number, take?: number,
exactMatchStartOrEndDate?: boolean, owner?:string, indexed?: boolean): Observable<IItem[]> {
let params = new HttpParams(); let params = new HttpParams();
if(itemType != null) { if(itemType != null) {
params = params.append("it", itemType); params = params.append("it", itemType);
@ -121,13 +126,18 @@ export class ItemService {
params = params.append("deep", deep.toString()); params = params.append("deep", deep.toString());
if (startDate) params = params.append("sDate", startDate.toISOString()); if (startDate) params = params.append("sDate", startDate.toISOString());
if (endDate) params = params.append("eDate", endDate.toISOString()); if (endDate) params = params.append("eDate", endDate.toISOString());
if(exactMatchStartOrEndDate !== undefined) params = params.append("exactMatchStartOrEndDate", exactMatchStartOrEndDate);
if(owner) params = params.append("owner", owner);
if(skip) params = params.append("skip", skip); if(skip) params = params.append("skip", skip);
if(take) params = params.append("take", take); if(take) params = params.append("take", take);
if(indexed) params = params.append("ind",indexed?"true":"false");
return this.httpClient.get<IItem[]>(`${this.ApiEndpoint()}/api/v1/items/${parentcode}/children`, { params: params }); return this.httpClient.get<IItem[]>(`${this.ApiEndpoint()}/api/v1/items/${parentcode}/children`, { params: params });
} }
getChildItemListCount(parentcode: string, itemType?: string,dataFilter?: any): Observable<number> { getChildItemListCount(parentcode: string, itemType?: string,dataFilter?: any,
startDate?: Date, endDate?: Date, exactMatchStartOrEndDate?: boolean, owner?:string,
indexed?: boolean): Observable<number> {
let params = new HttpParams(); let params = new HttpParams();
if(itemType != null) { if(itemType != null) {
params = params.append("it", itemType); params = params.append("it", itemType);
@ -135,6 +145,11 @@ export class ItemService {
if (dataFilter != null) { if (dataFilter != null) {
params = params.append("df", JSON.stringify(dataFilter)); params = params.append("df", JSON.stringify(dataFilter));
} }
if (startDate) params = params.append("sDate", startDate.toISOString());
if (endDate) params = params.append("eDate", endDate.toISOString());
if(exactMatchStartOrEndDate !== undefined) params = params.append("exactMatchStartOrEndDate", exactMatchStartOrEndDate);
if(owner) params = params.append("owner", owner);
if(indexed) params = params.append("ind",indexed?"true":"false");
return this.httpClient.get<number>(`${this.ApiEndpoint()}/api/v1/items/${parentcode}/children/count`, { params: params }); return this.httpClient.get<number>(`${this.ApiEndpoint()}/api/v1/items/${parentcode}/children/count`, { params: params });
} }

View File

@ -15,37 +15,37 @@ export class ItemTypeService {
getIcon(itemType: string) { getIcon(itemType: string) {
let icon = "fal fa-file"; let icon = "fal fa-file";
if (this.itemTypes[itemType]) icon = this.itemTypes[itemType].icon; if (this.itemTypes && this.itemTypes[itemType]) icon = this.itemTypes[itemType].icon;
return icon; return icon;
} }
getColor(itemType: string) { getColor(itemType: string) {
let color = "#000000"; let color = "#000000";
if (this.itemTypes[itemType]) color = this.itemTypes[itemType].iconColor; if (this.itemTypes && this.itemTypes[itemType]) color = this.itemTypes[itemType].iconColor;
return color; return color;
} }
getExtraAttributes(itemType: string) { getExtraAttributes(itemType: string) {
let extraAttributes = null; let extraAttributes = null;
if (this.itemTypes[itemType] && this.itemTypes[itemType].extraAttributes) extraAttributes = this.itemTypes[itemType].extraAttributes; if (this.itemTypes && this.itemTypes[itemType] && this.itemTypes[itemType]?.extraAttributes) extraAttributes = this.itemTypes[itemType]?.extraAttributes;
return extraAttributes; return extraAttributes;
} }
getSchema(itemType: string): string { getSchema(itemType: string): string {
let schema = null; let schema = null;
if (this.itemTypes[itemType]) schema = this.itemTypes[itemType].schema; if (this.itemTypes && this.itemTypes[itemType]) schema = this.itemTypes[itemType].schema;
return schema; return schema;
} }
hasViewer(item: IItem) { hasViewer(item: IItem) {
const itemType: string = item.itemType; const itemType: string = item.itemType;
if (this.itemTypes[itemType]) return this.itemTypes[itemType].viewer !== undefined; if (this.itemTypes && this.itemTypes[itemType]) return this.itemTypes[itemType].viewer !== undefined;
return false; return false;
} }
hasEditor(item: IItem) { hasEditor(item: IItem) {
const itemType: string = item.itemType; const itemType: string = item.itemType;
if (this.itemTypes[itemType]) return this.itemTypes[itemType].editor !== undefined; if (this.itemTypes && this.itemTypes[itemType]) return this.itemTypes[itemType].editor !== undefined;
return false; return false;
} }

View File

@ -0,0 +1,40 @@
import {Injectable} from '@angular/core';
import {HttpClient, HttpParams} from '@angular/common/http';
import {AppConfig} from '../shared/app.config';
@Injectable({
providedIn: 'root',
})
export class TaskService {
constructor(public httpClient: HttpClient, public appConfig: AppConfig) {
}
ApiEndpoint() {
return this.appConfig.getConfig("apiEndPoint");
}
getTask(taskCode: string) {
return this.httpClient.get<any>(`${this.appConfig.getConfig('apiEndPoint')}/api/v1/tasks/${taskCode}`)
}
getTasks(workflowCode: string, itemCode: string = null, taskType: string = null, skip = 0, take = 25) {
let params = new HttpParams();
if (workflowCode) {
params = params.append('workflowCode', workflowCode);
}
if (itemCode) {
params = params.append('itemCode', itemCode);
}
if (taskType) {
params = params.append('taskType', taskType);
}
params = params.append('skip', skip.toString());
params = params.append('take', take.toString());
return this.httpClient.get<any>(`${this.appConfig.getConfig('apiEndPoint')}/api/v1/tasks`,
{params: params})
}
}

View File

@ -31,8 +31,8 @@
"tslib": "^2.3.0" "tslib": "^2.3.0"
}, },
"peerDependencies": { "peerDependencies": {
"@angular/common": "^18.2.3", "@angular/common": "18.2.3",
"@angular/core": "^18.2.3", "@angular/core": "18.2.3",
"ol": "^8.2.0" "ol": "^8.2.0"
} }
} }