mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-30 20:14:49 +00:00
union bug fix
This commit is contained in:
committed by
Aiden McClelland
parent
3ee06a556e
commit
9d612a51fc
@@ -1,6 +1,6 @@
|
|||||||
import { Injectable } from '@angular/core'
|
import { Injectable } from '@angular/core'
|
||||||
import { AbstractControl, FormArray, FormBuilder, FormControl, FormGroup, ValidationErrors, ValidatorFn, Validators } from '@angular/forms'
|
import { AbstractControl, FormArray, FormBuilder, FormControl, FormGroup, ValidationErrors, ValidatorFn, Validators } from '@angular/forms'
|
||||||
import { ConfigSpec, isValueSpecListOf, ListValueSpecNumber, ListValueSpecObject, ListValueSpecString, ListValueSpecUnion, UniqueBy, ValueSpec, ValueSpecEnum, ValueSpecList, ValueSpecNumber, ValueSpecString, ValueSpecUnion } from '../pkg-config/config-types'
|
import { ConfigSpec, isValueSpecListOf, ListValueSpecNumber, ListValueSpecObject, ListValueSpecString, ListValueSpecUnion, UniqueBy, ValueSpec, ValueSpecEnum, ValueSpecList, ValueSpecNumber, ValueSpecObject, ValueSpecString, ValueSpecUnion } from '../pkg-config/config-types'
|
||||||
import { getDefaultString, Range } from '../pkg-config/config-utilities'
|
import { getDefaultString, Range } from '../pkg-config/config-utilities'
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
@@ -201,8 +201,9 @@ function listItemEquals (spec: ValueSpecList, val1: any, val2: any): boolean {
|
|||||||
case 'enum':
|
case 'enum':
|
||||||
return val1 == val2
|
return val1 == val2
|
||||||
case 'object':
|
case 'object':
|
||||||
case 'union':
|
|
||||||
return listObjEquals(spec.spec['unique-by'], (spec.spec as ListValueSpecObject), val1, val2)
|
return listObjEquals(spec.spec['unique-by'], (spec.spec as ListValueSpecObject), val1, val2)
|
||||||
|
case 'union':
|
||||||
|
return unionEquals(spec.spec['unique-by'], spec.spec as ListValueSpecUnion, val1, val2)
|
||||||
default:
|
default:
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@@ -216,8 +217,9 @@ function itemEquals (spec: ValueSpec, val1: any, val2: any): boolean {
|
|||||||
case 'enum':
|
case 'enum':
|
||||||
return val1 == val2
|
return val1 == val2
|
||||||
case 'object':
|
case 'object':
|
||||||
|
return objEquals(spec['unique-by'], (spec as ValueSpecObject), val1, val2)
|
||||||
case 'union':
|
case 'union':
|
||||||
return objEquals(spec['unique-by'], (spec as ValueSpec), val1, val2)
|
return unionEquals(spec['unique-by'], (spec as ValueSpecUnion), val1, val2)
|
||||||
case 'list':
|
case 'list':
|
||||||
if (val1.length !== val2.length) {
|
if (val1.length !== val2.length) {
|
||||||
return false
|
return false
|
||||||
@@ -237,7 +239,8 @@ function listObjEquals (uniqueBy: UniqueBy, spec: ListValueSpecObject, val1: any
|
|||||||
if (uniqueBy === null) {
|
if (uniqueBy === null) {
|
||||||
return false
|
return false
|
||||||
} else if (typeof uniqueBy === 'string') {
|
} else if (typeof uniqueBy === 'string') {
|
||||||
return itemEquals(spec.spec[uniqueBy], val1[uniqueBy], val2[uniqueBy])
|
const item = itemEquals(spec.spec[uniqueBy], val1[uniqueBy], val2[uniqueBy])
|
||||||
|
return item
|
||||||
} else if ('any' in uniqueBy) {
|
} else if ('any' in uniqueBy) {
|
||||||
for (let subSpec of uniqueBy.any) {
|
for (let subSpec of uniqueBy.any) {
|
||||||
if (listObjEquals(subSpec, spec, val1, val2)) {
|
if (listObjEquals(subSpec, spec, val1, val2)) {
|
||||||
@@ -255,11 +258,11 @@ function listObjEquals (uniqueBy: UniqueBy, spec: ListValueSpecObject, val1: any
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function objEquals (uniqueBy: UniqueBy, spec: ValueSpec, val1: any, val2: any): boolean {
|
function objEquals (uniqueBy: UniqueBy, spec: ValueSpecObject, val1: any, val2: any): boolean {
|
||||||
if (uniqueBy === null) {
|
if (uniqueBy === null) {
|
||||||
return false
|
return false
|
||||||
} else if (typeof uniqueBy === 'string') {
|
} else if (typeof uniqueBy === 'string') {
|
||||||
return itemEquals(spec, val1, val2)
|
return itemEquals(spec[uniqueBy], val1[uniqueBy], val2[uniqueBy])
|
||||||
} else if ('any' in uniqueBy) {
|
} else if ('any' in uniqueBy) {
|
||||||
for (let subSpec of uniqueBy.any) {
|
for (let subSpec of uniqueBy.any) {
|
||||||
if (objEquals(subSpec, spec, val1, val2)) {
|
if (objEquals(subSpec, spec, val1, val2)) {
|
||||||
@@ -275,4 +278,32 @@ function objEquals (uniqueBy: UniqueBy, spec: ValueSpec, val1: any, val2: any):
|
|||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function unionEquals (uniqueBy: UniqueBy, spec: ValueSpecUnion | ListValueSpecUnion, val1: any, val2: any): boolean {
|
||||||
|
const tagId = spec.tag.id
|
||||||
|
const variant = spec.variants[val1[tagId]]
|
||||||
|
if (uniqueBy === null) {
|
||||||
|
return false
|
||||||
|
} else if (typeof uniqueBy === 'string') {
|
||||||
|
if (uniqueBy === tagId) {
|
||||||
|
return val1[tagId] === val2[tagId]
|
||||||
|
} else {
|
||||||
|
return itemEquals(variant[uniqueBy], val1[uniqueBy], val2[uniqueBy])
|
||||||
|
}
|
||||||
|
} else if ('any' in uniqueBy) {
|
||||||
|
for (let subSpec of uniqueBy.any) {
|
||||||
|
if (unionEquals(subSpec, spec, val1, val2)) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
} else if ('all' in uniqueBy) {
|
||||||
|
for (let subSpec of uniqueBy.all) {
|
||||||
|
if (!unionEquals(subSpec, spec, val1, val2)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user