From 3d41cc470bbc1af678ad7a8f35ff52949056ae23 Mon Sep 17 00:00:00 2001 From: roshiiiiz Date: Mon, 22 Jun 2026 14:38:58 +0500 Subject: [PATCH 1/3] feat(dashboard): add sort by execution time with nulls last --- .../web/resource/dashboard/DashboardResource.scala | 13 +++++++------ .../resource/dashboard/UnifiedResourceSchema.scala | 4 ++++ .../dashboard/WorkflowSearchQueryBuilder.scala | 8 ++++++++ .../user/sort-button/sort-button.component.html | 7 +++++++ .../user/sort-button/sort-button.component.ts | 5 +++++ frontend/src/app/dashboard/type/sort-method.ts | 1 + 6 files changed, 32 insertions(+), 6 deletions(-) diff --git a/amber/src/main/scala/org/apache/texera/web/resource/dashboard/DashboardResource.scala b/amber/src/main/scala/org/apache/texera/web/resource/dashboard/DashboardResource.scala index 704219fc2d3..3d78eef3035 100644 --- a/amber/src/main/scala/org/apache/texera/web/resource/dashboard/DashboardResource.scala +++ b/amber/src/main/scala/org/apache/texera/web/resource/dashboard/DashboardResource.scala @@ -145,7 +145,7 @@ object DashboardResource { searchQueryParams: SearchQueryParams ): List[OrderField[_]] = { // Regex pattern to extract column name and order direction - val pattern = "(Name|CreateTime|EditTime)(Asc|Desc)".r + val pattern = "(Name|CreateTime|EditTime|ExecutionTime)(Asc|Desc)".r searchQueryParams.orderBy match { case pattern(column, order) => @@ -154,7 +154,7 @@ object DashboardResource { case Some(value) => List(order match { case "Asc" => value.asc() - case "Desc" => value.desc() + case "Desc" => value.desc().nullsLast() }) case None => List() } @@ -165,10 +165,11 @@ object DashboardResource { // Helper method to map column names to actual database fields based on resource type private def getColumnField(columnName: String): Option[Field[_]] = { Option(columnName match { - case "Name" => UnifiedResourceSchema.resourceNameField - case "CreateTime" => UnifiedResourceSchema.resourceCreationTimeField - case "EditTime" => UnifiedResourceSchema.resourceLastModifiedTimeField - case _ => null // Default case for unmatched resource types or column names + case "Name" => UnifiedResourceSchema.resourceNameField + case "CreateTime" => UnifiedResourceSchema.resourceCreationTimeField + case "EditTime" => UnifiedResourceSchema.resourceLastModifiedTimeField + case "ExecutionTime" => UnifiedResourceSchema.resourceExecutionTimeField + case _ => null // Default case for unmatched resource types or column names }) } diff --git a/amber/src/main/scala/org/apache/texera/web/resource/dashboard/UnifiedResourceSchema.scala b/amber/src/main/scala/org/apache/texera/web/resource/dashboard/UnifiedResourceSchema.scala index 8c4ecda946b..fb6a8c928a4 100644 --- a/amber/src/main/scala/org/apache/texera/web/resource/dashboard/UnifiedResourceSchema.scala +++ b/amber/src/main/scala/org/apache/texera/web/resource/dashboard/UnifiedResourceSchema.scala @@ -37,6 +37,7 @@ object UnifiedResourceSchema { private val resourceCreationTimeAlias = "resourceCreationTime" private val resourceOwnerIdAlias = "resourceOwnerId" private val resourceLastModifiedTimeAlias = "resourceLastModifiedTime" + private val resourceExecutionTimeAlias = "resourceExecutionTime" // Use the alias variables to create fields val resourceTypeField: Field[_] = DSL.field(DSL.name(resourceTypeAlias)) @@ -45,6 +46,7 @@ object UnifiedResourceSchema { val resourceCreationTimeField: Field[_] = DSL.field(DSL.name(resourceCreationTimeAlias)) val resourceOwnerIdField: Field[_] = DSL.field(DSL.name(resourceOwnerIdAlias)) val resourceLastModifiedTimeField: Field[_] = DSL.field(DSL.name(resourceLastModifiedTimeAlias)) + val resourceExecutionTimeField: Field[_] = DSL.field(DSL.name(resourceExecutionTimeAlias)) def context = SqlServer @@ -57,6 +59,7 @@ object UnifiedResourceSchema { description: Field[String] = DSL.inline(""), creationTime: Field[Timestamp] = DSL.cast(null, classOf[Timestamp]), lastModifiedTime: Field[Timestamp] = DSL.cast(null, classOf[Timestamp]), + executionTime: Field[Timestamp] = DSL.cast(null, classOf[Timestamp]), ownerId: Field[Integer] = DSL.cast(null, classOf[Integer]), wid: Field[Integer] = DSL.cast(null, classOf[Integer]), workflowUserAccess: Field[PrivilegeEnum] = DSL.castNull(classOf[PrivilegeEnum]), @@ -82,6 +85,7 @@ object UnifiedResourceSchema { description -> description.as(resourceDescriptionAlias), creationTime -> creationTime.as(resourceCreationTimeAlias), lastModifiedTime -> lastModifiedTime.as(resourceLastModifiedTimeAlias), + executionTime -> executionTime.as(resourceExecutionTimeAlias), ownerId -> ownerId.as(resourceOwnerIdAlias), wid -> wid.as("wid"), workflowUserAccess -> workflowUserAccess.as("workflow_privilege"), diff --git a/amber/src/main/scala/org/apache/texera/web/resource/dashboard/WorkflowSearchQueryBuilder.scala b/amber/src/main/scala/org/apache/texera/web/resource/dashboard/WorkflowSearchQueryBuilder.scala index cfa653316d2..f39453f651b 100644 --- a/amber/src/main/scala/org/apache/texera/web/resource/dashboard/WorkflowSearchQueryBuilder.scala +++ b/amber/src/main/scala/org/apache/texera/web/resource/dashboard/WorkflowSearchQueryBuilder.scala @@ -40,6 +40,14 @@ object WorkflowSearchQueryBuilder extends SearchQueryBuilder { creationTime = WORKFLOW.CREATION_TIME, wid = WORKFLOW.WID, lastModifiedTime = WORKFLOW.LAST_MODIFIED_TIME, + executionTime = DSL.field( + DSL + .select(DSL.max(WORKFLOW_EXECUTIONS.STARTING_TIME)) + .from(WORKFLOW_EXECUTIONS) + .join(WORKFLOW_VERSION) + .on(WORKFLOW_EXECUTIONS.VID.eq(WORKFLOW_VERSION.VID)) + .where(WORKFLOW_VERSION.WID.eq(WORKFLOW.WID)) + ), workflowUserAccess = WORKFLOW_USER_ACCESS.PRIVILEGE, uid = WORKFLOW_OF_USER.UID, ownerId = WORKFLOW_OF_USER.UID, diff --git a/frontend/src/app/dashboard/component/user/sort-button/sort-button.component.html b/frontend/src/app/dashboard/component/user/sort-button/sort-button.component.html index 0d67e85d56d..86dd94d5e28 100644 --- a/frontend/src/app/dashboard/component/user/sort-button/sort-button.component.html +++ b/frontend/src/app/dashboard/component/user/sort-button/sort-button.component.html @@ -62,5 +62,12 @@ Z -> A +
  • + +
  • diff --git a/frontend/src/app/dashboard/component/user/sort-button/sort-button.component.ts b/frontend/src/app/dashboard/component/user/sort-button/sort-button.component.ts index 8402e55b059..3282784d075 100644 --- a/frontend/src/app/dashboard/component/user/sort-button/sort-button.component.ts +++ b/frontend/src/app/dashboard/component/user/sort-button/sort-button.component.ts @@ -68,4 +68,9 @@ export class SortButtonComponent { this.sortMethod = SortMethod.NameDesc; this.sortMethodChange.emit(this.sortMethod); } + + public execSort(): void { + this.sortMethod = SortMethod.ExecutionTimeDesc; + this.sortMethodChange.emit(this.sortMethod); + } } diff --git a/frontend/src/app/dashboard/type/sort-method.ts b/frontend/src/app/dashboard/type/sort-method.ts index 70ecb5565dd..07d506fe6d1 100644 --- a/frontend/src/app/dashboard/type/sort-method.ts +++ b/frontend/src/app/dashboard/type/sort-method.ts @@ -22,4 +22,5 @@ export enum SortMethod { NameDesc, CreateTimeDesc, EditTimeDesc, + ExecutionTimeDesc, } From d5c1c962efd358547e3ae4b169e8f0b6db5baa51 Mon Sep 17 00:00:00 2001 From: roshiiiiz Date: Tue, 23 Jun 2026 23:36:07 +0500 Subject: [PATCH 2/3] test (frontend): add missing coverage for execution time sort --- .../dashboard/file/WorkflowResourceSpec.scala | 26 + frontend/junit.xml | 2631 +++++++++++++++++ .../sort-button/sort-button.component.spec.ts | 7 + 3 files changed, 2664 insertions(+) create mode 100644 frontend/junit.xml diff --git a/amber/src/test/scala/org/apache/texera/web/resource/dashboard/file/WorkflowResourceSpec.scala b/amber/src/test/scala/org/apache/texera/web/resource/dashboard/file/WorkflowResourceSpec.scala index 74a68ee65ea..a4a588e0f04 100644 --- a/amber/src/test/scala/org/apache/texera/web/resource/dashboard/file/WorkflowResourceSpec.scala +++ b/amber/src/test/scala/org/apache/texera/web/resource/dashboard/file/WorkflowResourceSpec.scala @@ -780,4 +780,30 @@ class WorkflowResourceSpec assert(resources.results(2).workflow.get.workflow.getName == "test_workflow1") } + it should "order workflow by execution time correctly" in { + // Create several resources with different names (no execution times are set, but the SQL query should parse correctly) + workflowResource.persistWorkflow(testWorkflow1, sessionUser1) + workflowResource.persistWorkflow(testWorkflow3, sessionUser1) + workflowResource.persistWorkflow(testWorkflow2, sessionUser1) + + // Retrieve resources ordered by execution time ascending + var resources = + dashboardResource.searchAllResourcesCall( + sessionUser1, + SearchQueryParams(resourceType = "workflow", orderBy = "ExecutionTimeAsc") + ) + + // Execution times are null so order is not guaranteed, but we verify it returns 3 results + assert(resources.results.length == 3) + + // Retrieve resources ordered by execution time descending + resources = dashboardResource.searchAllResourcesCall( + sessionUser1, + SearchQueryParams(resourceType = "workflow", orderBy = "ExecutionTimeDesc") + ) + + // Verify it returns 3 results + assert(resources.results.length == 3) + } + } diff --git a/frontend/junit.xml b/frontend/junit.xml new file mode 100644 index 00000000000..6cb5e02cf92 --- /dev/null +++ b/frontend/junit.xml @@ -0,0 +1,2631 @@ + + + + + + + + + + + + + +Failed to load pre-login configuration: HttpErrorResponse { + headers: HttpHeaders { + headers: Map(0) {}, + normalizedNames: Map(0) {}, + lazyInit: [90mundefined[39m, + lazyUpdate: [1mnull[22m + }, + status: [33m0[39m, + statusText: [32m'Unknown Error'[39m, + url: [32m'api/config/pre-login'[39m, + ok: [33mfalse[39m, + type: [90mundefined[39m, + redirected: [90mundefined[39m, + responseType: [90mundefined[39m, + name: [32m'HttpErrorResponse'[39m, + message: [32m'Http failure response for api/config/pre-login: 0 '[39m, + error: ProgressEvent { isTrusted: [36m[Getter][39m } +} + + + + + + + + + + + + + +Failed to load authenticated config; continuing with pre-login only. HttpErrorResponse { + headers: HttpHeaders { + headers: Map(0) {}, + normalizedNames: Map(0) {}, + lazyInit: [90mundefined[39m, + lazyUpdate: [1mnull[22m + }, + status: [33m403[39m, + statusText: [32m'Forbidden'[39m, + url: [32m'api/config/gui'[39m, + ok: [33mfalse[39m, + type: [90mundefined[39m, + redirected: [90mundefined[39m, + responseType: [90mundefined[39m, + name: [32m'HttpErrorResponse'[39m, + message: [32m'Http failure response for api/config/gui: 403 Forbidden'[39m, + error: {} +} + + + + + +Failed to load pre-login configuration: HttpErrorResponse { + headers: HttpHeaders { + headers: Map(0) {}, + normalizedNames: Map(0) {}, + lazyInit: [90mundefined[39m, + lazyUpdate: [1mnull[22m + }, + status: [33m0[39m, + statusText: [32m'Unknown Error'[39m, + url: [32m'api/config/pre-login'[39m, + ok: [33mfalse[39m, + type: [90mundefined[39m, + redirected: [90mundefined[39m, + responseType: [90mundefined[39m, + name: [32m'HttpErrorResponse'[39m, + message: [32m'Http failure response for api/config/pre-login: 0 '[39m, + error: ProgressEvent { isTrusted: [36m[Getter][39m } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Failed to load authenticated config after login; continuing. Error: simulated 500 + at D:/projects/texera/frontend/src/app/common/service/user/user.service.spec.ts:169:72 + at Observable.init [as _subscribe] [90m(D:\projects\texera\frontend\[39mnode_modules\[4mrxjs[24m\dist\cjs\internal\observable\throwError.js:8:64[90m)[39m + at Observable._trySubscribe [90m(D:\projects\texera\frontend\[39mnode_modules\[4mrxjs[24m\dist\cjs\internal\Observable.js:41:25[90m)[39m + at [90mD:\projects\texera\frontend\[39mnode_modules\[4mrxjs[24m\dist\cjs\internal\Observable.js:35:31 + at Object.errorContext [90m(D:\projects\texera\frontend\[39mnode_modules\[4mrxjs[24m\dist\cjs\internal\util\errorContext.js:22:9[90m)[39m + at Observable.subscribe [90m(D:\projects\texera\frontend\[39mnode_modules\[4mrxjs[24m\dist\cjs\internal\Observable.js:26:24[90m)[39m + at [90mD:\projects\texera\frontend\[39mnode_modules\[4mrxjs[24m\dist\cjs\internal\operators\catchError.js:12:27 + at OperatorSubscriber.<anonymous> [90m(D:\projects\texera\frontend\[39mnode_modules\[4mrxjs[24m\dist\cjs\internal\util\lift.js:14:28[90m)[39m + at [90mD:\projects\texera\frontend\[39mnode_modules\[4mrxjs[24m\dist\cjs\internal\Observable.js:30:30 + at Object.errorContext [90m(D:\projects\texera\frontend\[39mnode_modules\[4mrxjs[24m\dist\cjs\internal\util\errorContext.js:22:9[90m)[39m + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +enable [33mtrue[39m + + + + + +enable [33mfalse[39m + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + +DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. +This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TypeError: Cannot read properties of null (reading 'forEach') + at YText._integrate [90m(file:///D:/projects/texera/frontend/[39mnode_modules/[4myjs[24m/dist/yjs.mjs:6584:54[90m)[39m + at ContentType.integrate [90m(file:///D:/projects/texera/frontend/[39mnode_modules/[4myjs[24m/dist/yjs.mjs:8930:15[90m)[39m + at Item.integrate [90m(file:///D:/projects/texera/frontend/[39mnode_modules/[4myjs[24m/dist/yjs.mjs:9488:20[90m)[39m + at typeMapSet [90m(file:///D:/projects/texera/frontend/[39mnode_modules/[4myjs[24m/dist/yjs.mjs:5231:130[90m)[39m + at [90mfile:///D:/projects/texera/frontend/[39mnode_modules/[4myjs[24m/dist/yjs.mjs:5749:9 + at transact [90m(file:///D:/projects/texera/frontend/[39mnode_modules/[4myjs[24m/dist/yjs.mjs:3228:5[90m)[39m + at YMap.set [90m(file:///D:/projects/texera/frontend/[39mnode_modules/[4myjs[24m/dist/yjs.mjs:5748:7[90m)[39m + at [90mfile:///D:/projects/texera/frontend/[39mnode_modules/[4myjs[24m/dist/yjs.mjs:5613:12 + at Map.forEach (<anonymous>) + at YMap._integrate [90m(file:///D:/projects/texera/frontend/[39mnode_modules/[4myjs[24m/dist/yjs.mjs:5612:60[90m)[39m + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +No computing unit selected for workflow execution + + + + + + + + + +No computing unit selected for workflow execution + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[33mfalse[39m vn + + + + + +[33mtrue[39m vn + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ + mockScan2: { + isValid: [33mfalse[39m, + messages: { required: [32m"must have required property 'tableName'"[39m } + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +websocketUrl ws://localhost:3000/wsapi/workflow-websocket?wid=1&uid=1&cuid=1&access-token=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJZaWNvbmcgSHVhbmciLCJ1c2VySWQiOjMsImV4cCI6OTk5OTk5OTk5OX0.aAM9pw_qIBs0EjD5hiCGHR4GEe2YPXPVenceJ3zaU_g +websocketUrl ws://localhost:3000/wsapi/workflow-websocket?wid=1&uid=1&cuid=1&access-token=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJZaWNvbmcgSHVhbmciLCJ1c2VySWQiOjMsImV4cCI6OTk5OTk5OTk5OX0.aAM9pw_qIBs0EjD5hiCGHR4GEe2YPXPVenceJ3zaU_g + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + It looks like you're using ngModel on the same form field as formControlName. + Support for using the ngModel input property and ngModelChange event with + reactive form directives has been deprecated in Angular v6 and will be removed + in a future version of Angular. + + For more information on this, see our API docs here: + https://v21.angular.dev/api/forms/FormControlName + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Master Filter List: [] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +AssertionError: expected null to be truthy + at D:/projects/texera/frontend/src/app/dashboard/component/user/user-workflow/user-workflow-list-item/user-workflow-list-item.component.spec.ts:105:40 + at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:398:28[90m)[39m + at ProxyZoneSpec.onInvoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone-testing.js:2132:39[90m)[39m + at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:397:34[90m)[39m + at ProxyZoneSpec.onInvoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone-testing.js:2132:39[90m)[39m + at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:397:34[90m)[39m + at ProxyZoneSpec.onInvoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone-testing.js:2132:39[90m)[39m + at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:397:34[90m)[39m + at ProxyZoneSpec.onInvoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone-testing.js:2132:39[90m)[39m + at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:397:34[90m)[39m { + actual: [1mnull[22m, + expected: [33mtrue[39m, + showDiff: [33mtrue[39m, + operator: [32m'strictEqual'[39m +} + + + + + +AssertionError: expected null to be truthy + at D:/projects/texera/frontend/src/app/dashboard/component/user/user-workflow/user-workflow-list-item/user-workflow-list-item.component.spec.ts:125:41 + at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:398:28[90m)[39m + at ProxyZoneSpec.onInvoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone-testing.js:2132:39[90m)[39m + at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:397:34[90m)[39m + at ProxyZoneSpec.onInvoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone-testing.js:2132:39[90m)[39m + at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:397:34[90m)[39m + at ProxyZoneSpec.onInvoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone-testing.js:2132:39[90m)[39m + at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:397:34[90m)[39m + at ProxyZoneSpec.onInvoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone-testing.js:2132:39[90m)[39m + at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:397:34[90m)[39m { + actual: [1mnull[22m, + expected: [33mtrue[39m, + showDiff: [33mtrue[39m, + operator: [32m'strictEqual'[39m +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/app/dashboard/component/user/sort-button/sort-button.component.spec.ts b/frontend/src/app/dashboard/component/user/sort-button/sort-button.component.spec.ts index f007982cfd2..516309e2a0f 100644 --- a/frontend/src/app/dashboard/component/user/sort-button/sort-button.component.spec.ts +++ b/frontend/src/app/dashboard/component/user/sort-button/sort-button.component.spec.ts @@ -69,4 +69,11 @@ describe("SortButtonComponent", () => { expect(component.sortMethod).toBe(SortMethod.NameDesc); expect(emitSpy).toHaveBeenCalledWith(SortMethod.NameDesc); }); + + it("should handle execSort() correctly", () => { + const emitSpy = vi.spyOn(component.sortMethodChange, "emit"); + component.execSort(); + expect(component.sortMethod).toBe(SortMethod.ExecutionTimeDesc); + expect(emitSpy).toHaveBeenCalledWith(SortMethod.ExecutionTimeDesc); + }); }); From 768ae27ef39bef48e7eeb2e9e873439823ed12df Mon Sep 17 00:00:00 2001 From: roshiiiiz Date: Wed, 24 Jun 2026 03:55:16 +0500 Subject: [PATCH 3/3] fix(frontend): reorder execution time option and remove junit.xml --- frontend/junit.xml | 2631 ----------------- .../sort-button/sort-button.component.html | 12 +- 2 files changed, 6 insertions(+), 2637 deletions(-) delete mode 100644 frontend/junit.xml diff --git a/frontend/junit.xml b/frontend/junit.xml deleted file mode 100644 index 6cb5e02cf92..00000000000 --- a/frontend/junit.xml +++ /dev/null @@ -1,2631 +0,0 @@ - - - - - - - - - - - - - -Failed to load pre-login configuration: HttpErrorResponse { - headers: HttpHeaders { - headers: Map(0) {}, - normalizedNames: Map(0) {}, - lazyInit: [90mundefined[39m, - lazyUpdate: [1mnull[22m - }, - status: [33m0[39m, - statusText: [32m'Unknown Error'[39m, - url: [32m'api/config/pre-login'[39m, - ok: [33mfalse[39m, - type: [90mundefined[39m, - redirected: [90mundefined[39m, - responseType: [90mundefined[39m, - name: [32m'HttpErrorResponse'[39m, - message: [32m'Http failure response for api/config/pre-login: 0 '[39m, - error: ProgressEvent { isTrusted: [36m[Getter][39m } -} - - - - - - - - - - - - - -Failed to load authenticated config; continuing with pre-login only. HttpErrorResponse { - headers: HttpHeaders { - headers: Map(0) {}, - normalizedNames: Map(0) {}, - lazyInit: [90mundefined[39m, - lazyUpdate: [1mnull[22m - }, - status: [33m403[39m, - statusText: [32m'Forbidden'[39m, - url: [32m'api/config/gui'[39m, - ok: [33mfalse[39m, - type: [90mundefined[39m, - redirected: [90mundefined[39m, - responseType: [90mundefined[39m, - name: [32m'HttpErrorResponse'[39m, - message: [32m'Http failure response for api/config/gui: 403 Forbidden'[39m, - error: {} -} - - - - - -Failed to load pre-login configuration: HttpErrorResponse { - headers: HttpHeaders { - headers: Map(0) {}, - normalizedNames: Map(0) {}, - lazyInit: [90mundefined[39m, - lazyUpdate: [1mnull[22m - }, - status: [33m0[39m, - statusText: [32m'Unknown Error'[39m, - url: [32m'api/config/pre-login'[39m, - ok: [33mfalse[39m, - type: [90mundefined[39m, - redirected: [90mundefined[39m, - responseType: [90mundefined[39m, - name: [32m'HttpErrorResponse'[39m, - message: [32m'Http failure response for api/config/pre-login: 0 '[39m, - error: ProgressEvent { isTrusted: [36m[Getter][39m } -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Failed to load authenticated config after login; continuing. Error: simulated 500 - at D:/projects/texera/frontend/src/app/common/service/user/user.service.spec.ts:169:72 - at Observable.init [as _subscribe] [90m(D:\projects\texera\frontend\[39mnode_modules\[4mrxjs[24m\dist\cjs\internal\observable\throwError.js:8:64[90m)[39m - at Observable._trySubscribe [90m(D:\projects\texera\frontend\[39mnode_modules\[4mrxjs[24m\dist\cjs\internal\Observable.js:41:25[90m)[39m - at [90mD:\projects\texera\frontend\[39mnode_modules\[4mrxjs[24m\dist\cjs\internal\Observable.js:35:31 - at Object.errorContext [90m(D:\projects\texera\frontend\[39mnode_modules\[4mrxjs[24m\dist\cjs\internal\util\errorContext.js:22:9[90m)[39m - at Observable.subscribe [90m(D:\projects\texera\frontend\[39mnode_modules\[4mrxjs[24m\dist\cjs\internal\Observable.js:26:24[90m)[39m - at [90mD:\projects\texera\frontend\[39mnode_modules\[4mrxjs[24m\dist\cjs\internal\operators\catchError.js:12:27 - at OperatorSubscriber.<anonymous> [90m(D:\projects\texera\frontend\[39mnode_modules\[4mrxjs[24m\dist\cjs\internal\util\lift.js:14:28[90m)[39m - at [90mD:\projects\texera\frontend\[39mnode_modules\[4mrxjs[24m\dist\cjs\internal\Observable.js:30:30 - at Object.errorContext [90m(D:\projects\texera\frontend\[39mnode_modules\[4mrxjs[24m\dist\cjs\internal\util\errorContext.js:22:9[90m)[39m - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -enable [33mtrue[39m - - - - - -enable [33mfalse[39m - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - -DEPRECATED: DI is instantiating a token "AugmentedStubMetadataService" that inherits its @Injectable decorator but does not provide one itself. -This will become an error in a future version of Angular. Please add @Injectable() to the "AugmentedStubMetadataService" class. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -TypeError: Cannot read properties of null (reading 'forEach') - at YText._integrate [90m(file:///D:/projects/texera/frontend/[39mnode_modules/[4myjs[24m/dist/yjs.mjs:6584:54[90m)[39m - at ContentType.integrate [90m(file:///D:/projects/texera/frontend/[39mnode_modules/[4myjs[24m/dist/yjs.mjs:8930:15[90m)[39m - at Item.integrate [90m(file:///D:/projects/texera/frontend/[39mnode_modules/[4myjs[24m/dist/yjs.mjs:9488:20[90m)[39m - at typeMapSet [90m(file:///D:/projects/texera/frontend/[39mnode_modules/[4myjs[24m/dist/yjs.mjs:5231:130[90m)[39m - at [90mfile:///D:/projects/texera/frontend/[39mnode_modules/[4myjs[24m/dist/yjs.mjs:5749:9 - at transact [90m(file:///D:/projects/texera/frontend/[39mnode_modules/[4myjs[24m/dist/yjs.mjs:3228:5[90m)[39m - at YMap.set [90m(file:///D:/projects/texera/frontend/[39mnode_modules/[4myjs[24m/dist/yjs.mjs:5748:7[90m)[39m - at [90mfile:///D:/projects/texera/frontend/[39mnode_modules/[4myjs[24m/dist/yjs.mjs:5613:12 - at Map.forEach (<anonymous>) - at YMap._integrate [90m(file:///D:/projects/texera/frontend/[39mnode_modules/[4myjs[24m/dist/yjs.mjs:5612:60[90m)[39m - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -No computing unit selected for workflow execution - - - - - - - - - -No computing unit selected for workflow execution - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[33mfalse[39m vn - - - - - -[33mtrue[39m vn - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -{ - mockScan2: { - isValid: [33mfalse[39m, - messages: { required: [32m"must have required property 'tableName'"[39m } - } -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -websocketUrl ws://localhost:3000/wsapi/workflow-websocket?wid=1&uid=1&cuid=1&access-token=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJZaWNvbmcgSHVhbmciLCJ1c2VySWQiOjMsImV4cCI6OTk5OTk5OTk5OX0.aAM9pw_qIBs0EjD5hiCGHR4GEe2YPXPVenceJ3zaU_g -websocketUrl ws://localhost:3000/wsapi/workflow-websocket?wid=1&uid=1&cuid=1&access-token=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJZaWNvbmcgSHVhbmciLCJ1c2VySWQiOjMsImV4cCI6OTk5OTk5OTk5OX0.aAM9pw_qIBs0EjD5hiCGHR4GEe2YPXPVenceJ3zaU_g - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - It looks like you're using ngModel on the same form field as formControlName. - Support for using the ngModel input property and ngModelChange event with - reactive form directives has been deprecated in Angular v6 and will be removed - in a future version of Angular. - - For more information on this, see our API docs here: - https://v21.angular.dev/api/forms/FormControlName - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Master Filter List: [] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -AssertionError: expected null to be truthy - at D:/projects/texera/frontend/src/app/dashboard/component/user/user-workflow/user-workflow-list-item/user-workflow-list-item.component.spec.ts:105:40 - at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:398:28[90m)[39m - at ProxyZoneSpec.onInvoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone-testing.js:2132:39[90m)[39m - at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:397:34[90m)[39m - at ProxyZoneSpec.onInvoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone-testing.js:2132:39[90m)[39m - at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:397:34[90m)[39m - at ProxyZoneSpec.onInvoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone-testing.js:2132:39[90m)[39m - at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:397:34[90m)[39m - at ProxyZoneSpec.onInvoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone-testing.js:2132:39[90m)[39m - at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:397:34[90m)[39m { - actual: [1mnull[22m, - expected: [33mtrue[39m, - showDiff: [33mtrue[39m, - operator: [32m'strictEqual'[39m -} - - - - - -AssertionError: expected null to be truthy - at D:/projects/texera/frontend/src/app/dashboard/component/user/user-workflow/user-workflow-list-item/user-workflow-list-item.component.spec.ts:125:41 - at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:398:28[90m)[39m - at ProxyZoneSpec.onInvoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone-testing.js:2132:39[90m)[39m - at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:397:34[90m)[39m - at ProxyZoneSpec.onInvoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone-testing.js:2132:39[90m)[39m - at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:397:34[90m)[39m - at ProxyZoneSpec.onInvoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone-testing.js:2132:39[90m)[39m - at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:397:34[90m)[39m - at ProxyZoneSpec.onInvoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone-testing.js:2132:39[90m)[39m - at _ZoneDelegate.invoke [90m(D:\projects\texera\frontend\[39mnode_modules\[4mzone.js[24m\fesm2015\zone.js:397:34[90m)[39m { - actual: [1mnull[22m, - expected: [33mtrue[39m, - showDiff: [33mtrue[39m, - operator: [32m'strictEqual'[39m -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend/src/app/dashboard/component/user/sort-button/sort-button.component.html b/frontend/src/app/dashboard/component/user/sort-button/sort-button.component.html index 86dd94d5e28..d3a2aadd934 100644 --- a/frontend/src/app/dashboard/component/user/sort-button/sort-button.component.html +++ b/frontend/src/app/dashboard/component/user/sort-button/sort-button.component.html @@ -50,23 +50,23 @@