From 7655c7dcb6777daaa8687bbe2dfa1569cdbec6b6 Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Wed, 27 Jun 2018 22:19:48 -0700 Subject: [PATCH 01/19] [SHIBUI-520] Added FilesystemMetadataResolver. First pass, need tests. --- .../JPAMetadataResolverServiceImpl.groovy | 29 ++++++++++++++++--- .../resolvers/FilesystemMetadataResolver.java | 29 +++++++++++++++++++ .../ui/domain/resolvers/MetadataResolver.java | 3 +- 3 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FilesystemMetadataResolver.java diff --git a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy index f094ff2f9..85fafd04f 100644 --- a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy +++ b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy @@ -2,10 +2,7 @@ package edu.internet2.tier.shibboleth.admin.ui.service import com.google.common.base.Predicate import edu.internet2.tier.shibboleth.admin.ui.domain.filters.* -import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver -import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FileBackedHttpMetadataResolver -import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver -import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.* import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository import groovy.util.logging.Slf4j @@ -157,6 +154,30 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { ) } + void constructXmlNodeForResolver(FilesystemMetadataResolver resolver, def markupBuilderDelegate, Closure childNodes) { + markupBuilderDelegate.MetadataProvider(id: resolver.name, + 'xsi:type': 'FilesystemMetadataProvider', + metadataFile: resolver.metadataFile, + + requireValidMetadata: !resolver.requireValidMetadata ?: null, + failFastInitialization: !resolver.failFastInitialization ?: null, + sortKey: resolver.sortKey, + criterionPredicateRegistryRef: resolver.criterionPredicateRegistryRef, + useDefaultPredicateRegistry: !resolver.useDefaultPredicateRegistry ?: null, + satisfyAnyPredicates: resolver.satisfyAnyPredicates ?: null, + + parserPoolRef: resolver.reloadableMetadataResolverAttributes?.parserPoolRef, + minRefreshDelay: resolver.reloadableMetadataResolverAttributes?.minRefreshDelay, + maxRefreshDelay: resolver.reloadableMetadataResolverAttributes?.maxRefreshDelay, + refreshDelayFactor: resolver.reloadableMetadataResolverAttributes?.refreshDelayFactor, + indexesRef: resolver.reloadableMetadataResolverAttributes?.indexesRef, + resolveViaPredicatesOnly: resolver.reloadableMetadataResolverAttributes?.resolveViaPredicatesOnly ?: null, + expirationWarningThreshold: resolver.reloadableMetadataResolverAttributes?.expirationWarningThreshold) { + + childNodes() + } + } + void constructXmlNodeForResolver(DynamicHttpMetadataResolver resolver, def markupBuilderDelegate, Closure childNodes) { markupBuilderDelegate.MetadataProvider(id: resolver.name, 'xsi:type': 'DynamicHttpMetadataProvider', diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FilesystemMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FilesystemMetadataResolver.java new file mode 100644 index 000000000..0e16c8353 --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FilesystemMetadataResolver.java @@ -0,0 +1,29 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import javax.persistence.Embedded; +import javax.persistence.Entity; + +/** + * @author Bill Smith (wsmith@unicon.net) + */ +@Entity +@EqualsAndHashCode(callSuper = true) +@Getter +@Setter +@ToString +public class FilesystemMetadataResolver extends MetadataResolver { + + public FilesystemMetadataResolver() { + type = "FilesystemMetadataResolver"; + } + + private String metadataFile; + + @Embedded + private ReloadableMetadataResolverAttributes reloadableMetadataResolverAttributes; +} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java index adbb30f0d..f025b28c1 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java @@ -33,7 +33,8 @@ @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "@type", visible = true) @JsonSubTypes({@JsonSubTypes.Type(value = LocalDynamicMetadataResolver.class, name = "LocalDynamicMetadataResolver"), @JsonSubTypes.Type(value = FileBackedHttpMetadataResolver.class, name = "FileBackedHttpMetadataResolver"), - @JsonSubTypes.Type(value = DynamicHttpMetadataResolver.class, name = "DynamicHttpMetadataResolver")}) + @JsonSubTypes.Type(value = DynamicHttpMetadataResolver.class, name = "DynamicHttpMetadataResolver"), + @JsonSubTypes.Type(value = FilesystemMetadataResolver.class, name = "FilesystemMetadataResolver")}) public class MetadataResolver extends AbstractAuditable { @JsonProperty("@type") From c571dd495293448b8e26a68d76cb13b4bea37ec0 Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Wed, 27 Jun 2018 23:28:56 -0700 Subject: [PATCH 02/19] [SHIBUI-520] Added/updated tests. --- .../ui/domain/resolvers/MetadataResolver.java | 3 +- .../ResourceBackedMetadataResolver.java | 4 ++ ...ResolversControllerIntegrationTests.groovy | 47 +++++++++++++++---- ...JPAMetadataResolverServiceImplTests.groovy | 13 +++++ .../admin/ui/util/TestObjectGenerator.groovy | 39 +++++++++++++++ 5 files changed, 97 insertions(+), 9 deletions(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java index f025b28c1..e5b1221c1 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java @@ -34,7 +34,8 @@ @JsonSubTypes({@JsonSubTypes.Type(value = LocalDynamicMetadataResolver.class, name = "LocalDynamicMetadataResolver"), @JsonSubTypes.Type(value = FileBackedHttpMetadataResolver.class, name = "FileBackedHttpMetadataResolver"), @JsonSubTypes.Type(value = DynamicHttpMetadataResolver.class, name = "DynamicHttpMetadataResolver"), - @JsonSubTypes.Type(value = FilesystemMetadataResolver.class, name = "FilesystemMetadataResolver")}) + @JsonSubTypes.Type(value = FilesystemMetadataResolver.class, name = "FilesystemMetadataResolver"), + @JsonSubTypes.Type(value = ResourceBackedMetadataResolver.class, name = "ResourceBackedMetadataResolver")}) public class MetadataResolver extends AbstractAuditable { @JsonProperty("@type") diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataResolver.java index 2133d88eb..5737d0162 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataResolver.java @@ -18,6 +18,10 @@ @ToString public class ResourceBackedMetadataResolver extends MetadataResolver { + public ResourceBackedMetadataResolver() { + type = "ResourceBackedMetadataResolver"; + } + @Embedded private ReloadableMetadataResolverAttributes reloadableMetadataResolverAttributes; diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy index 03ae982a5..cb6592990 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy @@ -1,8 +1,12 @@ package edu.internet2.tier.shibboleth.admin.ui.controller +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.SerializationFeature import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FileBackedHttpMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository +import edu.internet2.tier.shibboleth.admin.ui.util.TestObjectGenerator +import edu.internet2.tier.shibboleth.admin.util.AttributeUtility import groovy.json.JsonOutput import groovy.json.JsonSlurper import org.opensaml.saml.metadata.resolver.MetadataResolver @@ -18,6 +22,7 @@ import org.springframework.http.HttpHeaders import org.springframework.test.context.ActiveProfiles import spock.lang.Specification +import spock.lang.Unroll import static org.springframework.http.HttpMethod.PUT @@ -34,10 +39,22 @@ class MetadataResolversControllerIntegrationTests extends Specification { @Autowired MetadataResolverRepository metadataResolverRepository + @Autowired + AttributeUtility attributeUtility + + ObjectMapper mapper + TestObjectGenerator generator + JsonSlurper jsonSlurper = new JsonSlurper() static BASE_URI = '/api/MetadataResolvers' + def setup() { + generator = new TestObjectGenerator(attributeUtility) + mapper = new ObjectMapper() + mapper.enable(SerializationFeature.INDENT_OUTPUT) + } + def cleanup() { metadataResolverRepository.deleteAll() } @@ -130,24 +147,31 @@ class MetadataResolversControllerIntegrationTests extends Specification { result.statusCodeValue == 404 } - def "POST new DynamicHttpMetadataResolver -> /api/MetadataResolvers"() { + @Unroll + def "POST new DynamicHttpMetadataResolver of type #resolverType -> /api/MetadataResolvers"(String resolverType) { given: 'New MetadataResolver JSON representation' - def resolver = [name: 'Test DynamicHttpMetadataResolver', '@type': 'DynamicHttpMetadataResolver'] + def resolver = generator.buildRandomMetadataResolverOfType(resolverType) when: 'POST request is made with new DynamicHttpMetadataResolver JSON representation' - def result = this.restTemplate.postForEntity(BASE_URI, createRequestHttpEntityFor { JsonOutput.toJson(resolver) }, String) + def result = this.restTemplate.postForEntity(BASE_URI, createRequestHttpEntityFor { mapper.writeValueAsString(resolver) }, String) then: result.statusCodeValue == 201 result.headers.Location[0].contains(BASE_URI) + + where: + resolverType | _ + 'DynamicHttp' | _ + 'FileBacked' | _ + 'LocalDynamic' | _ + 'ResourceBacked' | _ + 'Filesystem' | _ } - def "PUT concrete MetadataResolver with updated changes -> /api/MetadataResolvers/{resourceId}"() { + @Unroll + def "PUT concrete MetadataResolver of type #resolverType with updated changes -> /api/MetadataResolvers/{resourceId}"(String resolverType) { given: 'One resolver is available in data store' - def resolver = new DynamicHttpMetadataResolver().with { - it.name = 'Test DynamicHttpMetadataResolver' - it - } + def resolver = generator.buildRandomMetadataResolverOfType(resolverType) def resolverResourceId = resolver.resourceId metadataResolverRepository.save(resolver) @@ -171,6 +195,13 @@ class MetadataResolversControllerIntegrationTests extends Specification { then: updatedResolverMap.name == 'Updated DynamicHttpMetadataResolver' + where: + resolverType | _ + 'DynamicHttp' | _ + 'FileBacked' | _ + 'LocalDynamic' | _ + 'ResourceBacked' | _ + 'Filesystem' | _ } def "PUT concrete MetadataResolver with version conflict -> /api/MetadataResolvers/{resourceId}"() { diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImplTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImplTests.groovy index 03b737da9..9c367c1d6 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImplTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImplTests.groovy @@ -215,6 +215,19 @@ class JPAMetadataResolverServiceImplTests extends Specification { generatedXmlIsTheSameAsExpectedXml('/conf/546-classpath.xml', domBuilder.parseText(writer.toString())) } + def 'test generating FilesystemMetadataResolver xml snippet'() { + given: + def resolver = testObjectGenerator.filesystemMetadataResolver() + + when: + genXmlSnippet(markupBuilder) { + JPAMetadataResolverServiceImpl.cast(metadataResolverService).constructXmlNodeForResolver(resolver, it) {} + } + + then: + generatedXmlIsTheSameAsExpectedXml('/conf/520.xml', domBuilder.parseText(writer.toString())) + } + static genXmlSnippet(MarkupBuilder xml, Closure xmlNodeGenerator) { xml.MetadataProvider('id': 'ShibbolethMetadata', 'xmlns': 'urn:mace:shibboleth:2.0:metadata', diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy index 77e96e82d..4652fe361 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy @@ -376,6 +376,45 @@ class TestObjectGenerator { return contactPerson } + MetadataResolver buildRandomMetadataResolverOfType(String metadataResolverType) { + def randomResolver + switch (metadataResolverType) { + case 'DynamicHttp': + randomResolver = dynamicHttpMetadataResolver() + break + case 'FileBacked': + randomResolver = fileBackedHttpMetadataResolver() + break + case 'LocalDynamic': + randomResolver = localDynamicMetadataResolver() + break + case 'ResourceBacked': + randomResolver = resourceBackedMetadataResolverForSVN() + break + case 'Filesystem': + randomResolver = filesystemMetadataResolver() + break; + default: + throw new RuntimeException("Did you forget to create a TestObjectGenerator.MetadataResolver method for resolverType: ${metadataResolverType} ?"); + } + randomResolver + } + + FilesystemMetadataResolver filesystemMetadataResolver() { + new FilesystemMetadataResolver().with { + it.name = 'FilesystemMetadata' + it.metadataFile = 'some metadata filename' + + it.reloadableMetadataResolverAttributes = new ReloadableMetadataResolverAttributes().with { + it.minRefreshDelay = 'PT5M' + it.maxRefreshDelay = 'PT1H' + it.refreshDelayFactor = 0.75 + it + } + it + } + } + FileBackedHttpMetadataResolver fileBackedHttpMetadataResolver() { new FileBackedHttpMetadataResolver().with { it.name = 'HTTPMetadata' From 82d6523ca20f6d3437caedb16bffbcaed5f5ec04 Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Thu, 28 Jun 2018 00:02:48 -0700 Subject: [PATCH 03/19] [SHIBUI-628] Added JaCoCo to the build using mostly the defaults. More to come. --- backend/build.gradle | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/backend/build.gradle b/backend/build.gradle index 47dab440a..7c34ae65a 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -8,6 +8,7 @@ plugins { } apply plugin: 'io.spring.dependency-management' +apply plugin: 'jacoco' sourceCompatibility = 1.8 targetCompatibility = 1.8 @@ -191,3 +192,15 @@ tasks.withType(JavaExec) { compileJava { dependsOn generateSources } + +jacoco { + toolVersion = '0.8.1' +} + +jacocoTestReport { + reports { + xml.enabled = false + csv.enabled = false + html.destination = file("${buildDir}/jacocoHtml") + } +} \ No newline at end of file From 1fa04ffa64a182fec274ba18461150c5dfba871d Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Thu, 28 Jun 2018 00:04:03 -0700 Subject: [PATCH 04/19] [SHIBUI-520] Added a forgotten xml file. --- backend/src/test/resources/conf/520.xml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 backend/src/test/resources/conf/520.xml diff --git a/backend/src/test/resources/conf/520.xml b/backend/src/test/resources/conf/520.xml new file mode 100644 index 000000000..6e813f232 --- /dev/null +++ b/backend/src/test/resources/conf/520.xml @@ -0,0 +1,14 @@ + + + + + From 3890414e54cf4fbdc21ab8adf643be097e3762b0 Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Thu, 28 Jun 2018 00:02:48 -0700 Subject: [PATCH 05/19] [SHIBUI-628] Added JaCoCo to the build using mostly the defaults. More to come. --- backend/build.gradle | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/backend/build.gradle b/backend/build.gradle index 47dab440a..7c34ae65a 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -8,6 +8,7 @@ plugins { } apply plugin: 'io.spring.dependency-management' +apply plugin: 'jacoco' sourceCompatibility = 1.8 targetCompatibility = 1.8 @@ -191,3 +192,15 @@ tasks.withType(JavaExec) { compileJava { dependsOn generateSources } + +jacoco { + toolVersion = '0.8.1' +} + +jacocoTestReport { + reports { + xml.enabled = false + csv.enabled = false + html.destination = file("${buildDir}/jacocoHtml") + } +} \ No newline at end of file From 20db32538d84d7892546e8d17f81c351ec069d00 Mon Sep 17 00:00:00 2001 From: Jodie Muramoto Date: Mon, 9 Jul 2018 10:20:00 -0700 Subject: [PATCH 06/19] feature/SHIBUI-574: Routing dashboard tabs, initial checkin, broken code --- .../component/dashboard-providers-list.component.html | 1 + .../component/dashboard-providers-list.component.ts | 9 +++++++++ .../component/dashboard-resolvers-list.component.html | 1 + .../component/dashboard-resolvers-list.component.ts | 9 +++++++++ .../metadata/manager/container/manager.component.html | 9 +++++++++ ui/src/app/metadata/manager/manager.module.ts | 6 +++++- ui/src/app/metadata/metadata.routing.ts | 7 ++++++- 7 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 ui/src/app/metadata/manager/component/dashboard-providers-list.component.html create mode 100644 ui/src/app/metadata/manager/component/dashboard-providers-list.component.ts create mode 100644 ui/src/app/metadata/manager/component/dashboard-resolvers-list.component.html create mode 100644 ui/src/app/metadata/manager/component/dashboard-resolvers-list.component.ts diff --git a/ui/src/app/metadata/manager/component/dashboard-providers-list.component.html b/ui/src/app/metadata/manager/component/dashboard-providers-list.component.html new file mode 100644 index 000000000..f429f1e6c --- /dev/null +++ b/ui/src/app/metadata/manager/component/dashboard-providers-list.component.html @@ -0,0 +1 @@ +Metadata providers diff --git a/ui/src/app/metadata/manager/component/dashboard-providers-list.component.ts b/ui/src/app/metadata/manager/component/dashboard-providers-list.component.ts new file mode 100644 index 000000000..afa91580b --- /dev/null +++ b/ui/src/app/metadata/manager/component/dashboard-providers-list.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + templateUrl: './dashboard-providers-list.component.html' +}) + +export class DashboardProvidersListComponent { + +} diff --git a/ui/src/app/metadata/manager/component/dashboard-resolvers-list.component.html b/ui/src/app/metadata/manager/component/dashboard-resolvers-list.component.html new file mode 100644 index 000000000..634e521e8 --- /dev/null +++ b/ui/src/app/metadata/manager/component/dashboard-resolvers-list.component.html @@ -0,0 +1 @@ +Metadata resolvers diff --git a/ui/src/app/metadata/manager/component/dashboard-resolvers-list.component.ts b/ui/src/app/metadata/manager/component/dashboard-resolvers-list.component.ts new file mode 100644 index 000000000..7cb4c2f15 --- /dev/null +++ b/ui/src/app/metadata/manager/component/dashboard-resolvers-list.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + templateUrl: './dashboard-resolvers-list.component.html' +}) + +export class DashboardResolversListComponent { + +} diff --git a/ui/src/app/metadata/manager/container/manager.component.html b/ui/src/app/metadata/manager/container/manager.component.html index 10df850b2..6f87f50c6 100644 --- a/ui/src/app/metadata/manager/container/manager.component.html +++ b/ui/src/app/metadata/manager/container/manager.component.html @@ -15,6 +15,15 @@
+ +
  • Date: Mon, 9 Jul 2018 10:57:05 -0700 Subject: [PATCH 07/19] feature/SHIBUI-574: Initial checkin for child routes on the dashboard (resolvers, providers); BROKEN CODE --- .../component/dashboard-providers-list.component.ts | 1 + .../component/dashboard-resolvers-list.component.ts | 1 + .../metadata/manager/container/manager.component.html | 4 ++-- ui/src/app/metadata/metadata.routing.ts | 9 +++++---- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/ui/src/app/metadata/manager/component/dashboard-providers-list.component.ts b/ui/src/app/metadata/manager/component/dashboard-providers-list.component.ts index afa91580b..f14f3488e 100644 --- a/ui/src/app/metadata/manager/component/dashboard-providers-list.component.ts +++ b/ui/src/app/metadata/manager/component/dashboard-providers-list.component.ts @@ -1,6 +1,7 @@ import { Component } from '@angular/core'; @Component({ + // selector: 'dashboard-providers-list', templateUrl: './dashboard-providers-list.component.html' }) diff --git a/ui/src/app/metadata/manager/component/dashboard-resolvers-list.component.ts b/ui/src/app/metadata/manager/component/dashboard-resolvers-list.component.ts index 7cb4c2f15..be2216501 100644 --- a/ui/src/app/metadata/manager/component/dashboard-resolvers-list.component.ts +++ b/ui/src/app/metadata/manager/component/dashboard-resolvers-list.component.ts @@ -1,6 +1,7 @@ import { Component } from '@angular/core'; @Component({ + // selector: 'dashboard-resolvers-list', templateUrl: './dashboard-resolvers-list.component.html' }) diff --git a/ui/src/app/metadata/manager/container/manager.component.html b/ui/src/app/metadata/manager/container/manager.component.html index 6f87f50c6..589aa1553 100644 --- a/ui/src/app/metadata/manager/container/manager.component.html +++ b/ui/src/app/metadata/manager/container/manager.component.html @@ -17,10 +17,10 @@
    diff --git a/ui/src/app/metadata/metadata.routing.ts b/ui/src/app/metadata/metadata.routing.ts index 353681a5f..102b1f56f 100644 --- a/ui/src/app/metadata/metadata.routing.ts +++ b/ui/src/app/metadata/metadata.routing.ts @@ -14,10 +14,11 @@ const routes: Routes = [ path: '', component: MetadataPageComponent, children: [ - { path: '', component: ManagerComponent }, - { path: '', redirectTo: 'resolvers', pathMatch: 'full' }, - { path: 'resolvers', component: DashboardResolversListComponent }, - { path: 'providers', component: DashboardProvidersListComponent }, + { path: '', component: ManagerComponent, children: [ + { path: '', redirectTo: 'resolvers', pathMatch: 'full' }, + { path: 'resolvers', component: DashboardResolversListComponent }, + { path: 'providers', component: DashboardProvidersListComponent }, + ] }, ...ResolverRoutes, ...ProviderRoutes ], From f223af823c9b9ebc401fd1e2b4d2cbb8a0e8ffd6 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Mon, 9 Jul 2018 12:53:58 -0700 Subject: [PATCH 08/19] SHIBUI-574 Fixed routing issues --- .../dashboard-providers-list.component.html | 0 .../dashboard-providers-list.component.ts | 2 +- .../dashboard-resolvers-list.component.html | 0 .../dashboard-resolvers-list.component.ts | 2 +- .../manager/container/manager.component.html | 46 ++++++++++--------- .../manager/container/manager.component.ts | 1 - ui/src/app/metadata/manager/manager.module.ts | 4 +- .../app/metadata/manager/manager.routing.ts | 19 ++++++++ ui/src/app/metadata/metadata.routing.ts | 11 +---- 9 files changed, 49 insertions(+), 36 deletions(-) rename ui/src/app/metadata/manager/{component => container}/dashboard-providers-list.component.html (100%) rename ui/src/app/metadata/manager/{component => container}/dashboard-providers-list.component.ts (79%) rename ui/src/app/metadata/manager/{component => container}/dashboard-resolvers-list.component.html (100%) rename ui/src/app/metadata/manager/{component => container}/dashboard-resolvers-list.component.ts (79%) create mode 100644 ui/src/app/metadata/manager/manager.routing.ts diff --git a/ui/src/app/metadata/manager/component/dashboard-providers-list.component.html b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html similarity index 100% rename from ui/src/app/metadata/manager/component/dashboard-providers-list.component.html rename to ui/src/app/metadata/manager/container/dashboard-providers-list.component.html diff --git a/ui/src/app/metadata/manager/component/dashboard-providers-list.component.ts b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts similarity index 79% rename from ui/src/app/metadata/manager/component/dashboard-providers-list.component.ts rename to ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts index f14f3488e..7e8b4daaf 100644 --- a/ui/src/app/metadata/manager/component/dashboard-providers-list.component.ts +++ b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; @Component({ - // selector: 'dashboard-providers-list', + selector: 'dashboard-providers-list', templateUrl: './dashboard-providers-list.component.html' }) diff --git a/ui/src/app/metadata/manager/component/dashboard-resolvers-list.component.html b/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.html similarity index 100% rename from ui/src/app/metadata/manager/component/dashboard-resolvers-list.component.html rename to ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.html diff --git a/ui/src/app/metadata/manager/component/dashboard-resolvers-list.component.ts b/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.ts similarity index 79% rename from ui/src/app/metadata/manager/component/dashboard-resolvers-list.component.ts rename to ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.ts index be2216501..d1748b372 100644 --- a/ui/src/app/metadata/manager/component/dashboard-resolvers-list.component.ts +++ b/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; @Component({ - // selector: 'dashboard-resolvers-list', + selector: 'dashboard-resolvers-list', templateUrl: './dashboard-resolvers-list.component.html' }) diff --git a/ui/src/app/metadata/manager/container/manager.component.html b/ui/src/app/metadata/manager/container/manager.component.html index 589aa1553..9a88f5ec8 100644 --- a/ui/src/app/metadata/manager/container/manager.component.html +++ b/ui/src/app/metadata/manager/container/manager.component.html @@ -24,28 +24,30 @@
-
    -
  • - - -
  • -
-
- - -
+
diff --git a/ui/src/app/metadata/manager/container/manager.component.ts b/ui/src/app/metadata/manager/container/manager.component.ts index 0fe3a8a42..6a3331584 100644 --- a/ui/src/app/metadata/manager/container/manager.component.ts +++ b/ui/src/app/metadata/manager/container/manager.component.ts @@ -16,7 +16,6 @@ import { RemoveDraftRequest } from '../../resolver/action/draft.action'; @Component({ selector: 'manager-page', - changeDetection: ChangeDetectionStrategy.OnPush, templateUrl: './manager.component.html', styleUrls: ['./manager.component.scss'] }) diff --git a/ui/src/app/metadata/manager/manager.module.ts b/ui/src/app/metadata/manager/manager.module.ts index 1b5253d20..ed29e36c9 100644 --- a/ui/src/app/metadata/manager/manager.module.ts +++ b/ui/src/app/metadata/manager/manager.module.ts @@ -10,8 +10,8 @@ import { EffectsModule } from '@ngrx/effects'; import { ManagerComponent } from './container/manager.component'; import { EntityItemComponent } from './component/entity-item.component'; import { ProviderSearchComponent } from './component/provider-search.component'; -import { DashboardResolversListComponent } from './component/dashboard-resolvers-list.component'; -import { DashboardProvidersListComponent } from './component/dashboard-providers-list.component'; +import { DashboardResolversListComponent } from './container/dashboard-resolvers-list.component'; +import { DashboardProvidersListComponent } from './container/dashboard-providers-list.component'; import { reducers } from './reducer'; import { SearchEffects } from './effect/search.effects'; import { DeleteDialogComponent } from './component/delete-dialog.component'; diff --git a/ui/src/app/metadata/manager/manager.routing.ts b/ui/src/app/metadata/manager/manager.routing.ts new file mode 100644 index 000000000..1a6deb204 --- /dev/null +++ b/ui/src/app/metadata/manager/manager.routing.ts @@ -0,0 +1,19 @@ +import { Routes } from '@angular/router'; +import { DashboardResolversListComponent } from './container/dashboard-resolvers-list.component'; +import { DashboardProvidersListComponent } from './container/dashboard-providers-list.component'; +import { ManagerComponent } from './container/manager.component'; + +export const ManagerRoutes: Routes = [ + { path: '', redirectTo: 'manager', pathMatch: 'prefix' }, + { + path: 'manager', + component: ManagerComponent, + children: [ + { path: '', redirectTo: 'resolvers', pathMatch: 'prefix' }, + { path: 'resolvers', component: DashboardResolversListComponent }, + { path: 'providers', component: DashboardProvidersListComponent }, + ] + } +]; + + diff --git a/ui/src/app/metadata/metadata.routing.ts b/ui/src/app/metadata/metadata.routing.ts index 102b1f56f..c9423fdbf 100644 --- a/ui/src/app/metadata/metadata.routing.ts +++ b/ui/src/app/metadata/metadata.routing.ts @@ -1,24 +1,17 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; - -import { ManagerComponent } from './manager/container/manager.component'; -import { DashboardResolversListComponent } from './manager/component/dashboard-resolvers-list.component'; -import { DashboardProvidersListComponent } from './manager/component/dashboard-providers-list.component'; import { MetadataPageComponent } from './metadata.component'; import { ResolverRoutes } from './resolver/resolver.routing'; import { ProviderRoutes } from './provider/provider.routing'; +import { ManagerRoutes } from './manager/manager.routing'; const routes: Routes = [ { path: '', component: MetadataPageComponent, children: [ - { path: '', component: ManagerComponent, children: [ - { path: '', redirectTo: 'resolvers', pathMatch: 'full' }, - { path: 'resolvers', component: DashboardResolversListComponent }, - { path: 'providers', component: DashboardProvidersListComponent }, - ] }, + ...ManagerRoutes, ...ResolverRoutes, ...ProviderRoutes ], From 85c1018cee9c3afd32e1be3cdc4a820146a53f19 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Mon, 9 Jul 2018 12:58:58 -0700 Subject: [PATCH 09/19] SHIBUI-574 Added providers$ observable to dashboard list page --- .../container/dashboard-providers-list.component.html | 2 ++ .../container/dashboard-providers-list.component.ts | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html index f429f1e6c..455706a97 100644 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html +++ b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html @@ -1 +1,3 @@ Metadata providers + +
{{ providers$ | async | json }}
\ No newline at end of file diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts index 7e8b4daaf..fd43e20c6 100644 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts +++ b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts @@ -1,4 +1,8 @@ import { Component } from '@angular/core'; +import { MetadataProvider } from '../../domain/model'; +import { Observable } from '../../../../../node_modules/rxjs'; +import { Store } from '@ngrx/store'; +import { ProviderState, getAllProviders } from '../../provider/reducer'; @Component({ selector: 'dashboard-providers-list', @@ -7,4 +11,11 @@ import { Component } from '@angular/core'; export class DashboardProvidersListComponent { + providers$: Observable; + + constructor( + private store: Store + ) { + this.providers$ = this.store.select(getAllProviders); + } } From a64faed0a163af06e1f016901f088c862f1c49bd Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Mon, 9 Jul 2018 13:20:10 -0700 Subject: [PATCH 10/19] Added routerLinkActive to active nav links --- ui/src/app/metadata/manager/container/manager.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/src/app/metadata/manager/container/manager.component.html b/ui/src/app/metadata/manager/container/manager.component.html index 9a88f5ec8..26cc154eb 100644 --- a/ui/src/app/metadata/manager/container/manager.component.html +++ b/ui/src/app/metadata/manager/container/manager.component.html @@ -17,10 +17,10 @@
From 6c3060003d5a4b0ad263cb88c90cdd15fecdc2bd Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Mon, 9 Jul 2018 14:27:13 -0700 Subject: [PATCH 11/19] Cleanup --- .../manager/container/dashboard-providers-list.component.html | 2 +- ui/src/app/metadata/manager/manager.routing.ts | 2 -- ui/src/app/metadata/provider/effect/collection.effect.ts | 2 +- ui/src/app/metadata/provider/reducer/collection.reducer.ts | 3 +-- 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html index 455706a97..b30d2702a 100644 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html +++ b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html @@ -1,3 +1,3 @@ Metadata providers -
{{ providers$ | async | json }}
\ No newline at end of file +
{{ providers$ | async | json }}
diff --git a/ui/src/app/metadata/manager/manager.routing.ts b/ui/src/app/metadata/manager/manager.routing.ts index 1a6deb204..9f9c21179 100644 --- a/ui/src/app/metadata/manager/manager.routing.ts +++ b/ui/src/app/metadata/manager/manager.routing.ts @@ -15,5 +15,3 @@ export const ManagerRoutes: Routes = [ ] } ]; - - diff --git a/ui/src/app/metadata/provider/effect/collection.effect.ts b/ui/src/app/metadata/provider/effect/collection.effect.ts index 5a471dfdd..1a737839e 100644 --- a/ui/src/app/metadata/provider/effect/collection.effect.ts +++ b/ui/src/app/metadata/provider/effect/collection.effect.ts @@ -21,7 +21,7 @@ import { MetadataProviderService } from '../../domain/service/provider.service'; export class CollectionEffects { @Effect() - loadFilters$ = this.actions$.pipe( + loadProviders$ = this.actions$.pipe( ofType(ProviderCollectionActionTypes.LOAD_PROVIDER_REQUEST), switchMap(() => this.providerService diff --git a/ui/src/app/metadata/provider/reducer/collection.reducer.ts b/ui/src/app/metadata/provider/reducer/collection.reducer.ts index 9a625fa79..6bc1af8e7 100644 --- a/ui/src/app/metadata/provider/reducer/collection.reducer.ts +++ b/ui/src/app/metadata/provider/reducer/collection.reducer.ts @@ -24,12 +24,11 @@ export const initialState: CollectionState = adapter.getInitialState({ export function reducer(state = initialState, action: ProviderCollectionActionsUnion): CollectionState { switch (action.type) { case ProviderCollectionActionTypes.LOAD_PROVIDER_SUCCESS: { - let s = adapter.addAll(action.payload, { + return adapter.addAll(action.payload, { ...state, selectedProviderId: state.selectedProviderId, loaded: true }); - return s; } case ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS: { From 218738d1ba66ba2855c45ab0e7d3d191cb1c0066 Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Tue, 10 Jul 2018 09:05:43 -0700 Subject: [PATCH 12/19] [SHIBUI-520] Expanded filters and resolvers import. --- .../ui/service/JPAMetadataResolverServiceImpl.groovy | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy index 85fafd04f..c0d11de93 100644 --- a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy +++ b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy @@ -1,8 +1,15 @@ package edu.internet2.tier.shibboleth.admin.ui.service import com.google.common.base.Predicate -import edu.internet2.tier.shibboleth.admin.ui.domain.filters.* -import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.* +import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter +import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityRoleWhiteListFilter +import edu.internet2.tier.shibboleth.admin.ui.domain.filters.RequiredValidUntilFilter +import edu.internet2.tier.shibboleth.admin.ui.domain.filters.SignatureValidationFilter +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FileBackedHttpMetadataResolver +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FilesystemMetadataResolver +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository import groovy.util.logging.Slf4j From 9cb8c1992ce3ae9f4f29a32d4a52712922066db9 Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Tue, 10 Jul 2018 09:50:01 -0700 Subject: [PATCH 13/19] [SHIBUI-520] Added one more import. --- .../admin/ui/service/JPAMetadataResolverServiceImpl.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy index c0d11de93..34029e28a 100644 --- a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy +++ b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy @@ -2,6 +2,7 @@ package edu.internet2.tier.shibboleth.admin.ui.service import com.google.common.base.Predicate import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter +import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilterTarget import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityRoleWhiteListFilter import edu.internet2.tier.shibboleth.admin.ui.domain.filters.RequiredValidUntilFilter import edu.internet2.tier.shibboleth.admin.ui.domain.filters.SignatureValidationFilter From 56531d13b0e5b6d02328b860018838db1bd2aac6 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Tue, 10 Jul 2018 10:01:56 -0700 Subject: [PATCH 14/19] SHIBUI-578 Added required field markers --- ui/src/app/schema-form/registry.ts | 7 +-- ui/src/app/schema-form/schema-form.module.ts | 4 +- .../app/schema-form/service/schema.service.ts | 17 +++++++ .../widget/datalist/datalist.component.html | 6 ++- .../widget/datalist/datalist.component.ts | 14 +++++- .../widget/number/number.component.html | 21 ++++++++ .../widget/number/number.component.ts | 21 ++++++++ .../widget/select/select.component.html | 13 +++-- .../widget/select/select.component.ts | 15 +++++- .../widget/text/string.component.html | 6 +-- .../widget/text/string.component.ts | 14 +++++- .../widget/textarea/textarea.component.html | 5 +- .../widget/textarea/textarea.component.ts | 13 ++++- .../autocomplete/autocomplete.component.html | 1 + .../autocomplete/autocomplete.component.ts | 1 + .../filebacked-http-common.schema.json | 48 ++++++++++++++----- .../filebacked-http-filters.schema.json | 13 ++--- .../filebacked-http-reloading.schema.json | 16 +++++-- .../provider/metadata-provider.schema.json | 4 +- 19 files changed, 197 insertions(+), 42 deletions(-) create mode 100644 ui/src/app/schema-form/widget/number/number.component.html create mode 100644 ui/src/app/schema-form/widget/number/number.component.ts diff --git a/ui/src/app/schema-form/registry.ts b/ui/src/app/schema-form/registry.ts index d197dcf2c..47761b3ac 100644 --- a/ui/src/app/schema-form/registry.ts +++ b/ui/src/app/schema-form/registry.ts @@ -15,6 +15,7 @@ import { DatalistComponent } from './widget/datalist/datalist.component'; import { CustomCheckboxComponent } from './widget/check/checkbox.component'; import { CustomTextAreaComponent } from './widget/textarea/textarea.component'; import { CustomArrayComponent } from './widget/array/array.component'; +import { CustomIntegerComponent } from './widget/number/number.component'; export class CustomWidgetRegistry extends WidgetRegistry { @@ -44,13 +45,13 @@ export class CustomWidgetRegistry extends WidgetRegistry { this.register('textarea', CustomTextAreaComponent); + this.register('integer', CustomIntegerComponent); + this.register('number', CustomIntegerComponent); + this.register('datalist', DatalistComponent); /* NGX-Form */ this.register('object', ObjectWidget); - - this.register('integer', IntegerWidget); - this.register('number', IntegerWidget); this.register('range', RangeWidget); this.register('file', FileWidget); diff --git a/ui/src/app/schema-form/schema-form.module.ts b/ui/src/app/schema-form/schema-form.module.ts index d51ae2269..15edd4b6d 100644 --- a/ui/src/app/schema-form/schema-form.module.ts +++ b/ui/src/app/schema-form/schema-form.module.ts @@ -14,6 +14,7 @@ import { DatalistComponent } from './widget/datalist/datalist.component'; import { CustomCheckboxComponent } from './widget/check/checkbox.component'; import { CustomTextAreaComponent } from './widget/textarea/textarea.component'; import { CustomArrayComponent } from './widget/array/array.component'; +import { CustomIntegerComponent } from './widget/number/number.component'; export const COMPONENTS = [ BooleanRadioComponent, @@ -23,7 +24,8 @@ export const COMPONENTS = [ DatalistComponent, CustomCheckboxComponent, CustomTextAreaComponent, - CustomArrayComponent + CustomArrayComponent, + CustomIntegerComponent ]; @NgModule({ diff --git a/ui/src/app/schema-form/service/schema.service.ts b/ui/src/app/schema-form/service/schema.service.ts index 20177e115..86989b6f1 100644 --- a/ui/src/app/schema-form/service/schema.service.ts +++ b/ui/src/app/schema-form/service/schema.service.ts @@ -12,4 +12,21 @@ export class SchemaService { get(path: string): Observable { return this.http.get(`${path}`); } + + isRequired(formProperty: any): boolean { + let required = false; + let requiredFields = formProperty.parent.schema.required || []; + let fieldPath = formProperty.path; + let controlName = fieldPath.substr(fieldPath.lastIndexOf('/') + 1); + required = requiredFields.indexOf(controlName) > -1; + + if (!required) { + const conditions = formProperty.parent.schema.anyOf || []; + conditions.forEach(el => { + requiredFields = el.required || []; + required = !required ? requiredFields.indexOf(controlName) > -1 : required; + }); + } + return required; + } } diff --git a/ui/src/app/schema-form/widget/datalist/datalist.component.html b/ui/src/app/schema-form/widget/datalist/datalist.component.html index 9df975a27..94242cc8a 100644 --- a/ui/src/app/schema-form/widget/datalist/datalist.component.html +++ b/ui/src/app/schema-form/widget/datalist/datalist.component.html @@ -1,6 +1,9 @@
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/text/string.component.scss b/ui/src/app/schema-form/widget/string/string.component.scss similarity index 100% rename from ui/src/app/schema-form/widget/text/string.component.scss rename to ui/src/app/schema-form/widget/string/string.component.scss diff --git a/ui/src/app/schema-form/widget/text/string.component.ts b/ui/src/app/schema-form/widget/string/string.component.ts similarity index 92% rename from ui/src/app/schema-form/widget/text/string.component.ts rename to ui/src/app/schema-form/widget/string/string.component.ts index 5d49f1d83..2de93e371 100644 --- a/ui/src/app/schema-form/widget/text/string.component.ts +++ b/ui/src/app/schema-form/widget/string/string.component.ts @@ -1,5 +1,6 @@ import { Component } from '@angular/core'; import { StringWidget } from 'ngx-schema-form'; +import { Validators } from '@angular/forms'; import { SchemaService } from '../../service/schema.service'; @Component({ diff --git a/ui/src/assets/schema/provider/filebacked-http-common.schema.json b/ui/src/assets/schema/provider/filebacked-http-common.schema.json index 32ae65e76..65c919add 100644 --- a/ui/src/assets/schema/provider/filebacked-http-common.schema.json +++ b/ui/src/assets/schema/provider/filebacked-http-common.schema.json @@ -12,6 +12,9 @@ "satisfyAnyPredicates" ], "required": ["id", "metadataURL"], + "dependencies": { + "initializeFromBackupFile": {"required": ["backingFile", "backupFileInitNextRefreshDelay"]} + }, "anyOf": [ { "properties": { From fb38bde9315f111b5d3089e6bd9b280367561dbf Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Thu, 12 Jul 2018 09:40:29 -0700 Subject: [PATCH 19/19] SHIBUI-579 --- ui/src/app/schema-form/widget/check/checkbox.component.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/src/app/schema-form/widget/check/checkbox.component.html b/ui/src/app/schema-form/widget/check/checkbox.component.html index f8f94af1a..d47aa2d4c 100644 --- a/ui/src/app/schema-form/widget/check/checkbox.component.html +++ b/ui/src/app/schema-form/widget/check/checkbox.component.html @@ -8,9 +8,9 @@ [indeterminate]="control.value !== false && control.value !== true ? true :null" type="checkbox" [attr.disabled]="schema.readOnly" - id="{{ schema.id }}-control"> - -