From df72cc8bd177429edfda6142a60e771fa17f49c2 Mon Sep 17 00:00:00 2001 From: shyallegro Date: Thu, 10 Sep 2020 16:45:48 +0300 Subject: [PATCH] version 0.16 --- src/app/app.component.html | 28 +- src/app/app.component.scss | 22 +- src/app/app.component.ts | 79 +- src/app/app.constants.ts | 2 +- src/app/app.module.ts | 38 +- .../api-services/auth.service.ts | 2 +- .../api-services/events.service.ts | 4 +- .../api-services/models.service.ts | 49 +- .../api-services/organization.service.ts | 2 +- .../api-services/projects.service.ts | 98 +- .../api-services/queues.service.ts | 2 +- .../api-services/server.service.ts | 2 +- .../api-services/tasks.service.ts | 331 +++- .../api-services/users.service.ts | 2 +- .../api-services/workers.service.ts | 2 +- .../auth/authCreateCredentialsResponse.ts | 2 +- .../model/auth/authCreateUserRequest.ts | 2 +- .../model/auth/authCreateUserResponse.ts | 2 +- .../model/auth/authEditUserRequest.ts | 2 +- .../model/auth/authEditUserResponse.ts | 2 +- .../model/auth/authFixedUsersModeResponse.ts | 2 +- .../model/auth/authGetCredentialsResponse.ts | 2 +- .../model/auth/authGetTokenForUserRequest.ts | 2 +- .../model/auth/authGetTokenForUserResponse.ts | 2 +- .../model/auth/authLoginRequest.ts | 2 +- .../model/auth/authLoginResponse.ts | 2 +- .../auth/authRevokeCredentialsRequest.ts | 2 +- .../auth/authRevokeCredentialsResponse.ts | 2 +- .../model/auth/authValidateTokenRequest.ts | 2 +- .../model/auth/authValidateTokenResponse.ts | 2 +- .../model/auth/credentialKey.ts | 2 +- .../business-logic/model/auth/credentials.ts | 2 +- src/app/business-logic/model/auth/role.ts | 2 +- .../model/events/eventTypeEnum.ts | 2 +- .../model/events/eventsAddBatchResponse.ts | 3 +- .../model/events/eventsDebugImagesRequest.ts | 4 +- .../model/events/eventsDebugImagesResponse.ts | 2 +- .../events/eventsDeleteForTaskRequest.ts | 2 +- .../events/eventsDeleteForTaskResponse.ts | 2 +- .../events/eventsDownloadTaskLogRequest.ts | 2 +- .../events/eventsGetMultiTaskPlotsRequest.ts | 2 +- .../events/eventsGetMultiTaskPlotsResponse.ts | 2 +- .../eventsGetScalarMetricDataRequest.ts | 2 +- .../eventsGetScalarMetricDataResponse.ts | 2 +- ...ventsGetScalarMetricsAndVariantsRequest.ts | 2 +- ...entsGetScalarMetricsAndVariantsResponse.ts | 2 +- .../events/eventsGetTaskEventsRequest.ts | 2 +- .../events/eventsGetTaskEventsResponse.ts | 2 +- .../eventsGetTaskLatestScalarValuesRequest.ts | 2 +- ...eventsGetTaskLatestScalarValuesResponse.ts | 2 +- ...etTaskLatestScalarValuesResponseMetrics.ts | 2 +- ...tTaskLatestScalarValuesResponseVariants.ts | 2 +- .../model/events/eventsGetTaskLogRequest.ts | 30 +- .../model/events/eventsGetTaskLogResponse.ts | 10 +- .../events/eventsGetTaskMetricsRequest.ts | 2 +- .../events/eventsGetTaskMetricsResponse.ts | 2 +- .../model/events/eventsGetTaskPlotsRequest.ts | 2 +- .../events/eventsGetTaskPlotsResponse.ts | 2 +- ...ventsGetVectorMetricsAndVariantsRequest.ts | 2 +- ...entsGetVectorMetricsAndVariantsResponse.ts | 2 +- ...tiTaskScalarMetricsIterHistogramRequest.ts | 2 +- ...eventsScalarMetricsIterHistogramRequest.ts | 2 +- ...ventsScalarMetricsIterHistogramResponse.ts | 2 +- ...eventsVectorMetricsIterHistogramRequest.ts | 2 +- ...ventsVectorMetricsIterHistogramResponse.ts | 2 +- .../model/events/logLevelEnum.ts | 2 +- .../model/events/metricsImageEvent.ts | 2 +- .../model/events/metricsPlotEvent.ts | 2 +- .../model/events/metricsScalarEvent.ts | 2 +- .../model/events/metricsVectorEvent.ts | 2 +- .../model/events/scalarKeyEnum.ts | 10 +- .../model/events/taskLogEvent.ts | 2 +- .../business-logic/model/events/taskMetric.ts | 2 +- src/app/business-logic/model/models/model.ts | 2 +- src/app/business-logic/model/models/models.ts | 2 + .../model/models/modelsCreateRequest.ts | 2 +- .../model/models/modelsCreateResponse.ts | 2 +- .../model/models/modelsDeleteRequest.ts | 2 +- .../model/models/modelsDeleteResponse.ts | 2 +- .../model/models/modelsEditRequest.ts | 2 +- .../model/models/modelsEditResponse.ts | 2 +- .../model/models/modelsGetAllExRequest.ts | 2 +- .../model/models/modelsGetAllExResponse.ts | 2 +- .../model/models/modelsGetAllRequest.ts | 2 +- .../model/models/modelsGetAllResponse.ts | 2 +- .../model/models/modelsGetByIdRequest.ts | 2 +- .../model/models/modelsGetByIdResponse.ts | 2 +- .../model/models/modelsGetByTaskIdRequest.ts | 2 +- .../model/models/modelsGetByTaskIdResponse.ts | 2 +- .../model/models/modelsSetReadyRequest.ts | 2 +- .../model/models/modelsSetReadyResponse.ts | 2 +- .../modelsSetReadyResponsePublishedTask.ts | 2 +- ...modelsSetReadyResponsePublishedTaskData.ts | 2 +- .../models/modelsUpdateForTaskRequest.ts | 6 +- .../models/modelsUpdateForTaskResponse.ts | 2 +- .../model/models/modelsUpdateRequest.ts | 2 +- .../model/models/modelsUpdateResponse.ts | 2 +- .../model/models/multiFieldPatternData.ts | 2 +- .../model/organization/models.ts | 1 + .../organizationGetTagsRequest.ts | 3 +- .../organizationGetTagsResponse.ts | 2 +- .../model/projects/metricVariantResult.ts | 2 +- .../business-logic/model/projects/models.ts | 5 + .../model/projects/multiFieldPatternData.ts | 2 +- .../business-logic/model/projects/project.ts | 2 +- .../model/projects/projectsCreateRequest.ts | 2 +- .../model/projects/projectsCreateResponse.ts | 2 +- .../model/projects/projectsDeleteRequest.ts | 2 +- .../model/projects/projectsDeleteResponse.ts | 2 +- .../model/projects/projectsGetAllExRequest.ts | 6 +- .../projects/projectsGetAllExResponse.ts | 2 +- .../model/projects/projectsGetAllRequest.ts | 2 +- .../model/projects/projectsGetAllResponse.ts | 2 +- .../projects/projectsGetAllResponseSingle.ts | 2 +- .../model/projects/projectsGetByIdRequest.ts | 2 +- .../model/projects/projectsGetByIdResponse.ts | 2 +- .../projectsGetHyperParametersRequest.ts | 2 +- .../projectsGetHyperParametersResponse.ts | 6 +- .../projectsGetUniqueMetricVariantsRequest.ts | 2 +- ...projectsGetUniqueMetricVariantsResponse.ts | 2 +- .../model/projects/projectsUpdateRequest.ts | 2 +- .../model/projects/projectsUpdateResponse.ts | 2 +- .../business-logic/model/projects/stats.ts | 2 +- .../model/projects/statsStatusCount.ts | 2 +- .../projects/statsStatusCountStatusCount.ts | 2 +- src/app/business-logic/model/queues/entry.ts | 2 +- src/app/business-logic/model/queues/queue.ts | 2 +- .../model/queues/queueMetrics.ts | 2 +- .../model/queues/queuesAddTaskRequest.ts | 2 +- .../model/queues/queuesAddTaskResponse.ts | 2 +- .../model/queues/queuesCreateRequest.ts | 2 +- .../model/queues/queuesCreateResponse.ts | 2 +- .../model/queues/queuesDeleteRequest.ts | 2 +- .../model/queues/queuesDeleteResponse.ts | 2 +- .../model/queues/queuesGetAllExRequest.ts | 2 +- .../model/queues/queuesGetAllExResponse.ts | 2 +- .../model/queues/queuesGetAllRequest.ts | 2 +- .../model/queues/queuesGetAllResponse.ts | 2 +- .../model/queues/queuesGetByIdRequest.ts | 2 +- .../model/queues/queuesGetByIdResponse.ts | 2 +- .../model/queues/queuesGetDefaultResponse.ts | 2 +- .../model/queues/queuesGetNextTaskRequest.ts | 2 +- .../model/queues/queuesGetNextTaskResponse.ts | 2 +- .../queues/queuesGetQueueMetricsRequest.ts | 2 +- .../queues/queuesGetQueueMetricsResponse.ts | 2 +- .../queues/queuesMoveTaskBackwardRequest.ts | 2 +- .../queues/queuesMoveTaskBackwardResponse.ts | 2 +- .../queues/queuesMoveTaskForwardRequest.ts | 2 +- .../queues/queuesMoveTaskForwardResponse.ts | 2 +- .../queues/queuesMoveTaskToBackRequest.ts | 2 +- .../queues/queuesMoveTaskToBackResponse.ts | 2 +- .../queues/queuesMoveTaskToFrontRequest.ts | 2 +- .../queues/queuesMoveTaskToFrontResponse.ts | 2 +- .../model/queues/queuesRemoveTaskRequest.ts | 2 +- .../model/queues/queuesRemoveTaskResponse.ts | 2 +- .../model/queues/queuesUpdateRequest.ts | 2 +- .../model/queues/queuesUpdateResponse.ts | 2 +- .../model/server/serverConfigRequest.ts | 2 +- .../model/server/serverInfoResponse.ts | 6 +- .../server/serverReportStatsOptionRequest.ts | 2 +- .../server/serverReportStatsOptionResponse.ts | 2 +- .../business-logic/model/tasks/artifact.ts | 2 +- .../model/tasks/artifactTypeData.ts | 2 +- .../business-logic/model/tasks/execution.ts | 2 +- .../model/tasks/lastMetricsEvent.ts | 2 +- src/app/business-logic/model/tasks/models.ts | 20 + .../model/tasks/multiFieldPatternData.ts | 2 +- src/app/business-logic/model/tasks/output.ts | 2 +- src/app/business-logic/model/tasks/script.ts | 2 +- src/app/business-logic/model/tasks/task.ts | 12 +- .../model/tasks/taskStatusEnum.ts | 2 +- .../model/tasks/taskTypeEnum.ts | 15 +- .../tasks/tasksAddOrUpdateArtifactsRequest.ts | 2 +- .../tasksAddOrUpdateArtifactsResponse.ts | 2 +- .../model/tasks/tasksCloneRequest.ts | 16 +- .../model/tasks/tasksCloneResponse.ts | 2 +- .../model/tasks/tasksCloseRequest.ts | 2 +- .../model/tasks/tasksCloseResponse.ts | 2 +- .../model/tasks/tasksCompletedRequest.ts | 2 +- .../model/tasks/tasksCompletedResponse.ts | 2 +- .../model/tasks/tasksCreateRequest.ts | 12 +- .../model/tasks/tasksCreateResponse.ts | 2 +- .../model/tasks/tasksDeleteRequest.ts | 2 +- .../model/tasks/tasksDeleteResponse.ts | 2 +- .../model/tasks/tasksDequeueRequest.ts | 2 +- .../model/tasks/tasksDequeueResponse.ts | 2 +- .../model/tasks/tasksEditRequest.ts | 12 +- .../model/tasks/tasksEditResponse.ts | 2 +- .../model/tasks/tasksEnqueueRequest.ts | 2 +- .../model/tasks/tasksEnqueueResponse.ts | 2 +- .../model/tasks/tasksFailedRequest.ts | 2 +- .../model/tasks/tasksFailedResponse.ts | 2 +- .../model/tasks/tasksGetAllExRequest.ts | 4 +- .../model/tasks/tasksGetAllExResponse.ts | 2 +- .../model/tasks/tasksGetAllRequest.ts | 4 +- .../model/tasks/tasksGetAllResponse.ts | 2 +- .../model/tasks/tasksGetByIdRequest.ts | 2 +- .../model/tasks/tasksGetByIdResponse.ts | 2 +- .../model/tasks/tasksGetTypesRequest.ts | 2 +- .../model/tasks/tasksGetTypesResponse.ts | 2 +- .../model/tasks/tasksPingRequest.ts | 2 +- .../model/tasks/tasksPublishRequest.ts | 2 +- .../model/tasks/tasksPublishResponse.ts | 2 +- .../model/tasks/tasksResetRequest.ts | 6 +- .../model/tasks/tasksResetResponse.ts | 2 +- .../tasks/tasksSetRequirementsRequest.ts | 2 +- .../tasks/tasksSetRequirementsResponse.ts | 2 +- .../model/tasks/tasksStartedRequest.ts | 2 +- .../model/tasks/tasksStartedResponse.ts | 2 +- .../model/tasks/tasksStopRequest.ts | 2 +- .../model/tasks/tasksStopResponse.ts | 2 +- .../model/tasks/tasksStoppedRequest.ts | 2 +- .../model/tasks/tasksStoppedResponse.ts | 2 +- .../model/tasks/tasksUpdateBatchResponse.ts | 2 +- .../model/tasks/tasksUpdateRequest.ts | 2 +- .../model/tasks/tasksUpdateResponse.ts | 2 +- .../model/tasks/tasksValidateRequest.ts | 12 +- .../users/getCurrentUserResponseUserObject.ts | 2 +- ...getCurrentUserResponseUserObjectCompany.ts | 2 +- src/app/business-logic/model/users/user.ts | 2 +- .../model/users/usersCreateRequest.ts | 2 +- .../model/users/usersDeleteRequest.ts | 2 +- .../model/users/usersGetAllExRequest.ts | 4 +- .../model/users/usersGetAllExResponse.ts | 2 +- .../model/users/usersGetAllRequest.ts | 2 +- .../model/users/usersGetAllResponse.ts | 2 +- .../model/users/usersGetByIdRequest.ts | 2 +- .../model/users/usersGetByIdResponse.ts | 2 +- .../users/usersGetCurrentUserResponse.ts | 2 +- .../users/usersGetPreferencesResponse.ts | 2 +- .../model/users/usersSetPreferencesRequest.ts | 2 +- .../users/usersSetPreferencesResponse.ts | 2 +- .../model/users/usersUpdateRequest.ts | 2 +- .../model/users/usersUpdateResponse.ts | 2 +- .../model/workers/activitySeries.ts | 2 +- .../model/workers/aggregationStats.ts | 2 +- .../model/workers/aggregationType.ts | 2 +- .../model/workers/currentTaskEntry.ts | 6 +- .../model/workers/idNameEntry.ts | 6 +- .../model/workers/machineStats.ts | 2 +- .../model/workers/metricStats.ts | 2 +- .../model/workers/metricsCategory.ts | 2 +- .../model/workers/queueEntry.ts | 6 +- .../business-logic/model/workers/statItem.ts | 2 +- .../business-logic/model/workers/worker.ts | 3 +- .../model/workers/workerStats.ts | 2 +- .../workersGetActivityReportRequest.ts | 2 +- .../workersGetActivityReportResponse.ts | 2 +- .../model/workers/workersGetAllRequest.ts | 2 +- .../model/workers/workersGetAllResponse.ts | 2 +- .../workers/workersGetMetricKeysRequest.ts | 2 +- .../workers/workersGetMetricKeysResponse.ts | 2 +- .../model/workers/workersGetStatsRequest.ts | 2 +- .../model/workers/workersGetStatsResponse.ts | 2 +- .../model/workers/workersRegisterRequest.ts | 2 +- .../workers/workersStatusReportRequest.ts | 2 +- .../model/workers/workersUnregisterRequest.ts | 2 +- src/app/core/effects/users.effects.ts | 6 - .../usage-stats/usage-stats.component.html | 1 - .../usage-stats/usage-stats.component.scss | 8 - .../dashboard/dashboard.component.html | 30 +- src/app/features/dashboard/dashboard.const.ts | 44 +- .../features/dashboard/dashboard.module.ts | 22 +- ...xperiment-details-reverter-service.base.ts | 29 +- .../experiments-compare-consts.ts | 20 +- .../experiments-compare-details.base.ts | 1 + .../actions/experiments-info.actions.ts | 16 - .../experiment-info-execution.component.html | 1 + .../experiment-info-execution.component.ts | 6 +- .../experiment-info.component.html | 13 +- .../experiment-info.component.ts | 37 +- .../experiments/experiments-routing.module.ts | 14 +- .../experiments/experiments.consts.ts | 14 +- .../reducers/experiment-info.reducer.ts | 26 +- .../reducers/experiments-view.reducer.ts | 2 +- .../features/experiments/reducers/index.ts | 2 + .../experiment-menu.component.html | 14 +- .../experiment-menu.component.scss | 3 + .../shared/experiment-info.model.ts | 11 +- .../experiments/shared/experiments.const.ts | 2 +- .../services/experiment-converter.service.ts | 9 +- .../model-menu/model-menu.component.html | 10 +- .../model-menu/model-menu.component.scss | 4 + .../model-header/model-header.component.scss | 1 - .../not-found/not-found.component.html | 2 +- .../not-found/not-found.component.scss | 1 + .../project-card/project-card.component.html | 5 +- src/app/layout/layout.module.ts | 16 +- .../layout/side-nav/side-nav.component.html | 65 +- .../layout/side-nav/side-nav.component.scss | 47 +- src/app/layout/side-nav/side-nav.component.ts | 7 + src/app/shared/constants/non-common-consts.ts | 29 +- .../directives/check-permission.directive.ts | 50 +- src/app/shared/guards/auth.guard.ts | 24 - .../webapp-common/admin/admin.component.html | 8 +- .../webapp-common/admin/admin.component.scss | 25 + .../webapp-common/admin/admin.component.ts | 24 +- .../webapp-common/admin/base-admin.service.ts | 31 +- .../admin/s3-access/s3-access.component.html | 2 +- .../assets/icons/compare-icon.svg | 2 +- src/app/webapp-common/common-styles.scss | 47 +- .../core/actions/layout.actions.ts | 18 +- .../core/actions/users.actions.ts | 11 +- .../core/effects/layout.effects.ts | 14 +- .../core/effects/projects.effects.ts | 6 +- .../core/effects/users.effects.ts | 10 +- .../core/interceptors/webapp-interceptor.ts | 20 +- .../core/reducers/projects.reducer.ts | 6 +- .../core/reducers/users-reducer.ts | 7 +- .../core/reducers/view-reducer.ts | 6 + .../dashboard/common-dashboard.actions.ts | 2 +- .../dashboard/common-dashboard.effects.ts | 4 +- .../dashboard/common-dashboard.module.ts | 27 +- .../dashboard-projects.component.html | 7 +- .../dashboard-search.component.base.ts | 2 +- .../debug-image-snippet.component.html | 8 +- .../debug-image-snippet.component.scss | 19 +- .../debug-image-snippet.component.ts | 6 +- .../debug-images-view.component.scss | 3 - .../debug-images/debug-images.component.html | 8 +- .../debug-images/debug-images.component.scss | 2 +- .../debug-images/debug-images.component.ts | 15 +- .../experiments-compare-charts.actions.ts | 5 +- .../experiments-compare-details.actions.ts | 53 +- ...periments-compare-scalars-graph.actions.ts | 4 +- .../experiment-compare-details.component.html | 12 +- .../experiment-compare-details.component.scss | 289 +-- .../experiment-compare-details.component.ts | 538 +----- ...-compare-hyper-params-graph.component.html | 4 +- ...-compare-hyper-params-graph.component.scss | 28 +- ...nt-compare-hyper-params-graph.component.ts | 29 +- ...eriment-compare-scalar-charts.component.ts | 4 +- ...iment-compare-metric-values.component.scss | 6 + .../experiment-compare-plots.component.scss | 2 +- ...ect-experiments-for-compare.component.scss | 4 +- ...riment-compare-general-data.component.html | 2 +- ...periment-compare-general-data.component.ts | 2 +- .../experiment-compare-header.component.html | 6 +- .../experiment-compare-header.component.scss | 18 +- .../parallel-coordinates-graph.component.html | 25 +- .../parallel-coordinates-graph.component.ts | 110 +- ...experiments-for-compare-table.component.ts | 92 +- .../experiments-compare-charts.effects.ts | 53 +- .../experiments-compare-details.effects.ts | 84 +- ...periments-compare-scalars-graph.effects.ts | 73 +- ...-experiment-for-compare-effects.service.ts | 2 +- .../experiments-compare-routing.module.ts | 3 +- .../experiments-compare.component.scss | 15 - .../experiments-compare.module.ts | 6 +- .../jsonToDiffConvertor.ts | 101 +- .../prettify-title-key.pipe.ts | 26 - .../experiments-compare-charts.reducer.ts | 16 +- .../experiments-compare-details.reducer.ts | 30 +- ...periments-compare-scalars-graph.reducer.ts | 4 +- .../experiments-compare/reducers/index.ts | 47 +- .../experiment-details-reverter.service.ts | 27 +- .../experiments-compare-details.model.ts | 12 +- .../common-experiment-output.actions.ts | 23 +- .../common-experiments-info.actions.ts | 47 +- .../common-experiments-menu.actions.ts | 14 - .../common-experiments-view.actions.ts | 97 +- .../common-experiments.component.html | 22 +- .../common-experiments.component.scss | 6 +- .../common-experiments.component.ts | 51 +- .../experiments/common-experiments.module.ts | 58 +- .../experiment-info-aritfacts.component.scss | 22 + .../experiment-info-artifacts.component.html | 49 +- .../experiment-info-artifacts.component.ts | 4 +- ...iment-info-hyper-parameters.component.html | 25 +- ...iment-info-hyper-parameters.component.scss | 28 + ...eriment-info-hyper-parameters.component.ts | 81 +- ...experiment-info-input-model.component.html | 5 +- .../experiment-info-input-model.component.ts | 8 +- .../experiment-output.component.html | 4 +- .../experiment-output.component.scss | 9 +- .../experiment-output.component.ts | 22 +- .../experiment-output-log.component.html | 3 + .../experiment-output-log.component.ts | 60 +- .../experiment-output-scalars.component.html | 1 + .../experiment-output-scalars.component.scss | 2 +- .../experiment-output-scalars.component.ts | 2 +- ...periment-artifact-item-view.component.html | 61 +- ...periment-artifact-item-view.component.scss | 20 +- ...experiment-artifact-item-view.component.ts | 9 + ...experiment-artifacts-navbar.component.html | 12 +- ...experiment-artifacts-navbar.component.scss | 2 +- .../experiment-artifacts-navbar.component.ts | 2 + ...experiment-custom-cols-menu.component.html | 6 +- .../experiment-custom-cols-menu.component.ts | 36 +- .../experiment-execution-diff.component.html | 19 +- .../experiment-execution-diff.component.scss | 23 +- .../experiment-execution-diff.component.ts | 24 +- .../experiment-execution-form.component.html | 14 +- .../experiment-execution-form.component.ts | 25 +- ...experiment-execution-output.component.html | 4 +- ...riment-execution-parameters.component.html | 114 +- ...riment-execution-parameters.component.scss | 43 +- ...periment-execution-parameters.component.ts | 87 +- ...ment-execution-requirements.component.html | 21 +- ...ment-execution-requirements.component.scss | 19 + ...riment-execution-requirements.component.ts | 7 +- ...iment-execution-source-code.component.html | 34 +- ...iment-execution-source-code.component.scss | 4 +- .../experiment-footer.component.html | 10 - .../experiment-footer.component.scss | 20 - .../experiment-footer.component.ts | 39 - .../experiment-general-info.component.html | 16 +- .../experiment-general-info.component.ts | 10 + .../experiment-header.component.scss | 1 - ...xperiment-hyper-params-form.component.html | 17 - ...xperiment-hyper-params-form.component.scss | 0 .../experiment-hyper-params-form.component.ts | 32 - .../experiment-info-header.component.html | 30 +- .../experiment-info-header.component.scss | 34 +- .../experiment-info-header.component.ts | 28 +- .../experiment-log-info.component.html | 4 +- .../experiment-log-info.component.scss | 30 +- .../experiment-log-info.component.ts | 146 +- ...experiment-models-form-view.component.html | 6 +- ...experiment-models-form-view.component.scss | 7 +- .../experiment-models-form-view.component.ts | 43 +- .../experiment-models-form.component.html | 37 - .../experiment-models-form.component.scss | 12 - .../experiment-models-form.component.ts | 77 - ...eriment-network-design-form.component.html | 9 + ...eriment-network-design-form.component.scss | 21 +- ...xperiment-network-design-form.component.ts | 19 +- ...periment-orchestration-form.component.scss | 3 + ...xperiment-output-model-form.component.html | 5 +- ...xperiment-output-model-form.component.scss | 2 +- .../experiment-output-model-form.component.ts | 14 +- ...xperiment-output-model-view.component.scss | 7 +- .../experiment-type-icon-label.component.html | 4 +- .../experiment-type-icon-label.component.scss | 17 +- .../experiment-type-icon-label.component.ts | 2 + .../experiments-table.component.html | 22 +- .../experiments-table.component.scss | 3 + .../experiments-table.component.ts | 125 +- .../image-displayer.component.html | 18 +- .../image-displayer.component.scss | 6 + .../image-displayer.component.ts | 10 + .../model-auto-populate-dialog.component.html | 45 +- .../model-auto-populate-dialog.component.ts | 18 +- ...hyper-params-for-custom-col.component.html | 6 +- ...hyper-params-for-custom-col.component.scss | 2 +- ...t-hyper-params-for-custom-col.component.ts | 4 +- ...elect-metric-for-custom-col.component.html | 2 +- ...elect-metric-for-custom-col.component.scss | 5 +- .../common-experiment-output.effects.ts | 93 +- .../common-experiments-info.effects.ts | 289 ++- .../common-experiments-menu.effects.ts | 98 +- .../common-experiments-view.effects.ts | 243 ++- .../common-experiment-info.reducer.ts | 16 +- .../common-experiment-output.reducer.ts | 99 +- .../common-experiments-view.reducer.ts | 28 +- .../experiments/reducers/index.ts | 59 +- .../shared/common-experiment-model.model.ts | 2 +- .../shared/common-experiments.const.ts | 4 +- .../shared/components/base-experiment-menu.ts | 104 +- .../change-project-dialog.component.html | 2 +- .../clone-dialog/clone-dialog.component.html | 8 +- .../clone-dialog/clone-dialog.component.scss | 9 +- .../clone-dialog/clone-dialog.component.ts | 56 +- .../shared/experiment-hyper-params.model.ts | 8 +- .../common-experiment-converter.service.ts | 17 +- .../common-experiment-reverter.service.ts | 117 +- .../breadcrumbs/breadcrumbs.component.html | 4 +- .../breadcrumbs/breadcrumbs.component.scss | 2 +- .../layout/header/header.component.html | 26 +- .../layout/header/header.component.scss | 48 +- .../layout/header/header.component.ts | 8 + src/app/webapp-common/layout/layout.module.ts | 20 +- src/app/webapp-common/layout/layout.scss | 2 +- .../ui-update-dialog.component.ts | 2 +- src/app/webapp-common/login/login.module.ts | 18 +- .../login/login/login.component.html | 19 +- .../login/login/login.component.scss | 79 +- .../login/login/login.component.ts | 53 +- .../models/actions/models-info.actions.ts | 1 - .../models/actions/models-menu.actions.ts | 15 - .../models/actions/models-view.actions.ts | 35 +- .../model-info-general.component.html | 1 + .../model-info-general.component.ts | 8 +- .../model-info/model-info.component.html | 8 +- .../model-info/model-info.component.scss | 5 +- .../model-info/model-info.component.ts | 6 +- .../model-menu/model-menu.component.ts | 37 +- .../model-custom-cols-menu.component.html | 2 +- .../model-footer/model-footer.component.html | 13 - .../model-footer/model-footer.component.scss | 22 - .../model-footer/model-footer.component.ts | 41 - .../model-general-info.component.html | 4 +- .../model-general-info.component.ts | 22 +- .../model-info-header.component.html | 16 +- .../model-info-header.component.scss | 1 + .../model-info-header.component.ts | 18 +- .../model-info-labels-view.component.html | 6 +- .../model-info-labels-view.component.scss | 2 +- .../model-info-labels-view.component.ts | 27 +- .../model-view-network.component.html | 10 +- .../model-view-network.component.scss | 3 - .../model-view-network.component.ts | 60 +- .../models/effects/models-info.effects.ts | 30 +- .../models/effects/models-menu.effects.ts | 100 +- .../models/effects/models-view.effects.ts | 248 ++- src/app/webapp-common/models/model.utils.ts | 2 +- .../models/models.component.html | 120 +- .../models/models.component.scss | 5 +- .../webapp-common/models/models.component.ts | 19 +- src/app/webapp-common/models/models.consts.ts | 47 +- src/app/webapp-common/models/models.module.ts | 35 +- .../webapp-common/models/reducers/index.ts | 2 + .../models/reducers/model-info.reducer.ts | 6 +- .../models/reducers/models-view.reducer.ts | 50 +- .../models/shared/model-shared.module.ts | 20 +- .../models-table/models-table.component.html | 29 +- .../models-table/models-table.component.scss | 8 +- .../models-table/models-table.component.ts | 86 +- .../models/shared/models.const.ts | 3 +- .../models/shared/models.model.ts | 3 +- .../select-model-header.component.html | 19 - .../projects/common-projects.effects.ts | 2 +- .../projects/common-projects.module.ts | 20 +- .../projects/common-projects.reducer.ts | 6 +- .../projects-header.component.html | 7 +- .../search/common-search-results.actions.ts | 4 +- .../search/common-search-results.effects.ts | 4 +- .../search/common-search-results.reducer.ts | 8 +- .../base-context-menu.component.ts | 11 +- .../charts/donut/donut.component.scss | 6 +- .../charts/donut/donut.component.ts | 2 - .../charts/line-chart/line-chart.component.ts | 2 +- .../components/charts/line-chart/line.js | 1550 ----------------- .../experiment-settings.html | 11 +- .../experiment-settings.ts | 11 +- .../refresh-button.component.scss | 1 - .../section-header.component.scss | 3 +- .../experiment-graphs.component.html | 6 +- .../experiment-graphs.component.ts | 47 +- .../single-graph/plotly-graph-base.ts | 30 +- .../single-graph/single-graph.component.scss | 8 +- .../single-graph/single-graph.component.ts | 98 +- ...fo-header-status-icon-label.component.html | 16 +- ...fo-header-status-icon-label.component.scss | 11 +- .../shared/pipes/shared-pipes.module.ts | 9 +- .../project-create-dialog.component.html | 2 +- .../project-create-dialog.effects.ts | 2 +- .../project-create-dialog.reducer.ts | 3 +- .../queue-create-dialog.component.html | 2 +- .../shared/services/login.service.ts | 64 +- .../shared/services/ui-updates.service.ts | 1 - src/app/webapp-common/shared/shared.module.ts | 34 +- .../neon-button/neon-button.component.scss | 2 +- .../toggle-archive.component.scss | 2 +- .../checked-filter-list.component.scss | 2 +- .../checked-filter-list.component.ts | 2 +- .../data/code/code.component.scss | 2 +- .../grouped-selectable-list.component.scss | 4 - .../labeled-row/labeled-row.component.scss | 6 +- .../selectable-filter-list.component.scss | 11 + .../selectable-list.component.html | 2 +- .../selectable-list.component.scss | 1 - .../data/table-card/table-card.component.html | 4 +- .../data/table-card/table-card.component.scss | 25 +- .../data/table-card/table-card.component.ts | 6 +- .../data/table-diff/table-diff.component.scss | 3 + .../data/table/base-table-view.ts | 28 +- .../table-card-filter-template.component.html | 6 +- .../table-card-filter-template.component.scss | 2 +- .../table-card-filter-template.component.ts | 11 +- .../table-filter-sort-template.component.html | 2 +- .../table-filter-sort-template.component.scss | 2 +- .../data/table/table.component.html | 82 +- .../data/table/table.component.scss | 60 +- .../data/table/table.component.ts | 174 +- .../ui-components/data/table/table.consts.ts | 1 + .../choose-color/choose-color.reducer.ts | 2 +- .../checkbox-control.component.scss | 14 +- .../ui-components/forms/immutableFormField.ts | 2 +- .../forms/switch/switch.component.scss | 4 +- .../textarea-control.component.html | 7 +- .../textarea-control.component.scss | 2 + .../textarea-control.component.ts | 14 +- .../circle-status.component.html | 7 +- .../circle-status.component.scss | 7 +- .../circle-status/circle-status.component.ts | 2 + .../snippet-error.component.html | 6 +- .../inline-edit/inline-edit.component.html | 2 +- .../inline-edit/inline-edit.component.ts | 6 +- .../inputs/search/search.component.html | 1 + .../confirm-dialog.component.html | 2 +- .../dialog-template.component.html | 2 +- .../edit-json/edit-json.component.scss | 7 +- .../overlay/edit-json/edit-json.component.ts | 2 +- .../overlay/overlay/overlay.component.html | 2 +- .../overlay/overlay/overlay.component.scss | 3 + .../overlay/overlay/overlay.component.ts | 1 + .../overlay/spinner/spinner.component.scss | 4 +- .../terms-of-use-dialog.component.scss | 2 +- .../update-notifier.component.scss | 9 +- .../update-notifier.component.ts | 21 +- .../panel/card/card.component.scss | 1 + .../ui-components/panel/collapse/README.md | 49 - .../panel/collapse/collapse.component.html | 38 - .../panel/collapse/collapse.component.scss | 24 - .../panel/collapse/collapse.component.ts | 60 - .../panel/collapse/collapse.module.ts | 17 - .../ui-components/panel/collapse/index.ts | 2 - .../compare-footer.component.html | 2 +- .../compare-footer.component.scss | 22 +- .../editable-section.component.html | 18 +- .../editable-section.component.scss | 8 +- .../editable-section.component.ts | 11 +- .../experiment-card.component.html | 4 +- .../panel/menu-item/menu-item.component.html | 2 +- .../panel/menu/menu.component.scss | 1 - .../panel/plus-card/plus-card.component.html | 2 +- .../panel/plus-card/plus-card.component.scss | 5 +- .../styles/bootstrap-settings.scss | 16 +- .../shared/ui-components/styles/icons.scss | 464 ++--- .../shared/ui-components/styles/index.scss | 8 +- .../styles/material-overide.scss | 9 +- .../styles/mixins/scrollbar.scss | 5 + .../ui-components/styles/notifications.scss | 17 +- .../ui-components/styles/themes/dark.scss | 20 +- .../ui-components/styles/themes/light.scss | 4 +- .../ui-components/styles/variables.scss | 22 +- .../tags/tag-list/tag-list.component.html | 19 +- .../tags/tag-list/tag-list.component.scss | 1 - .../tags/tag-list/tag-list.component.ts | 11 +- .../tags/tags-menu/tags-menu.component.html | 2 - .../tags/tags-menu/tags-menu.component.ts | 4 +- .../tags/user-tag/user-tag.component.html | 5 +- .../tags/user-tag/user-tag.component.ts | 4 + .../ui-components/ui-components.module.ts | 54 +- .../shared/utils/build-tree-from-array.ts | 25 - src/app/webapp-common/shared/utils/fp.ts | 17 - .../shared/utils/shared-utils.ts | 47 +- .../shared/utils/tableParamEncode.ts | 2 +- src/app/webapp-common/tasks/tasks.utils.ts | 37 +- src/app/webapp-common/user-preferences.ts | 90 +- .../workers-stats/workers-stats.component.ts | 4 +- .../dumb/queue-info/queue-info.component.html | 8 +- .../queue-task-table.component.ts | 27 +- .../queues-table/queues-table.component.html | 2 +- .../queues-table/queues-table.component.ts | 52 +- .../worker-info/worker-info.component.html | 8 +- .../workers-table/workers-table.component.ts | 12 +- .../workers-and-queues.component.html | 2 +- src/assets/logo-white.svg | 33 +- src/assets/t-logo-w.svg | 4 +- src/environments/base.ts | 32 +- src/environments/environment.ts | 14 +- src/favicon.ico | Bin 1150 -> 6518 bytes src/index.html | 4 +- 655 files changed, 6148 insertions(+), 6665 deletions(-) delete mode 100644 src/app/shared/guards/auth.guard.ts delete mode 100644 src/app/webapp-common/experiments-compare/prettify-title-key.pipe.ts delete mode 100644 src/app/webapp-common/experiments/dumb/experiment-footer/experiment-footer.component.html delete mode 100644 src/app/webapp-common/experiments/dumb/experiment-footer/experiment-footer.component.scss delete mode 100644 src/app/webapp-common/experiments/dumb/experiment-footer/experiment-footer.component.ts delete mode 100644 src/app/webapp-common/experiments/dumb/experiment-hyper-params-form/experiment-hyper-params-form.component.html delete mode 100644 src/app/webapp-common/experiments/dumb/experiment-hyper-params-form/experiment-hyper-params-form.component.scss delete mode 100644 src/app/webapp-common/experiments/dumb/experiment-hyper-params-form/experiment-hyper-params-form.component.ts delete mode 100644 src/app/webapp-common/experiments/dumb/experiment-models-form/experiment-models-form.component.html delete mode 100644 src/app/webapp-common/experiments/dumb/experiment-models-form/experiment-models-form.component.scss delete mode 100644 src/app/webapp-common/experiments/dumb/experiment-models-form/experiment-models-form.component.ts delete mode 100644 src/app/webapp-common/models/dumbs/model-footer/model-footer.component.html delete mode 100644 src/app/webapp-common/models/dumbs/model-footer/model-footer.component.scss delete mode 100644 src/app/webapp-common/models/dumbs/model-footer/model-footer.component.ts delete mode 100644 src/app/webapp-common/shared/components/charts/line-chart/line.js delete mode 100644 src/app/webapp-common/shared/ui-components/panel/collapse/README.md delete mode 100644 src/app/webapp-common/shared/ui-components/panel/collapse/collapse.component.html delete mode 100644 src/app/webapp-common/shared/ui-components/panel/collapse/collapse.component.scss delete mode 100644 src/app/webapp-common/shared/ui-components/panel/collapse/collapse.component.ts delete mode 100644 src/app/webapp-common/shared/ui-components/panel/collapse/collapse.module.ts delete mode 100644 src/app/webapp-common/shared/ui-components/panel/collapse/index.ts delete mode 100644 src/app/webapp-common/shared/utils/build-tree-from-array.ts delete mode 100644 src/app/webapp-common/shared/utils/fp.ts diff --git a/src/app/app.component.html b/src/app/app.component.html index 72c18826..da1e21ba 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,17 +1,17 @@ - - + + -
- - - - -
- - -
+ + + + +
+ +
diff --git a/src/app/app.component.scss b/src/app/app.component.scss index 92b8ae8c..b3d0cdeb 100644 --- a/src/app/app.component.scss +++ b/src/app/app.component.scss @@ -4,22 +4,29 @@ $notifier-height: 30px; .app-container { + height: 100%; margin-left: $side-bar-close-width; + + &.notifier-open { + height: calc(100% - #{$notifier-height}); + .main-router + * { + height: calc(100% - #{$top-bar-height}); + } + } } .main-router + * { display: block; - height: calc(100vh - #{$top-bar-height}); + height: calc(100% - #{$top-bar-height}); } -.notifier-open { - .main-router + * { - height: calc(100vh - #{$top-bar-height + $notifier-height}); - } -} sm-side-nav { + display: block; + position: fixed; + top: 0; z-index: 999; + height: 100%; } #color-picker-outlet { @@ -27,6 +34,3 @@ sm-side-nav { visibility: hidden; } - - - diff --git a/src/app/app.component.ts b/src/app/app.component.ts index dd0a82e1..f8a39675 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,6 +1,6 @@ import {ApiUsersService} from './business-logic/api-services/users.service'; import {selectCurrentUser} from './webapp-common/core/reducers/users-reducer'; -import {Component, OnDestroy, OnInit, ViewEncapsulation, HostListener} from '@angular/core'; +import {Component, OnDestroy, OnInit, ViewEncapsulation, HostListener, Renderer2} from '@angular/core'; import {ActivatedRoute, NavigationEnd, Router, Params} from '@angular/router'; import {Title} from '@angular/platform-browser'; import {selectLoggedOut} from './webapp-common/core/reducers/view-reducer'; @@ -11,12 +11,17 @@ import {ApiProjectsService} from './business-logic/api-services/projects.service import {Project} from './business-logic/model/projects/project'; import {GetAllProjects, SetSelectedProjectId, UpdateProject} from './webapp-common/core/actions/projects.actions'; import {selectSelectedProject} from './webapp-common/core/reducers/projects.reducer'; -import {selectS3BucketCredentialsBucketCredentials, selectS3PopUpDetails, selectShowLocalFilesPopUp, selectShowS3PopUp} from './webapp-common/core/reducers/common-auth-reducer'; +import { + selectS3BucketCredentialsBucketCredentials, + selectS3PopUpDetails, + selectShowLocalFilesPopUp, + selectShowS3PopUp +} from './webapp-common/core/reducers/common-auth-reducer'; import {MatDialog, MatDialogRef} from '@angular/material/dialog'; import {S3AccessResolverComponent} from './webapp-common/layout/s3-access-resolver/s3-access-resolver.component'; import {cancelS3Credentials, getTutorialBucketCredentials} from './webapp-common/core/actions/common-auth.actions'; import {FetchCurrentUser} from './webapp-common/core/actions/users.actions'; -import {filter, map, take, withLatestFrom} from 'rxjs/operators'; +import {distinct, distinctUntilChanged, filter, map, take, withLatestFrom} from 'rxjs/operators'; import * as routerActions from './webapp-common/core/actions/router.actions'; import {combineLatest, Observable, Subscription} from 'rxjs'; import {selectBreadcrumbsStrings} from './webapp-common/layout/layout.reducer'; @@ -25,17 +30,19 @@ import {formatStaticCrumb} from './webapp-common/layout/breadcrumbs/breadcrumbs- import {ServerUpdatesService} from './webapp-common/shared/services/server-updates.service'; import {selectAvailableUpdates, selectShowSurvey} from './core/reducers/view-reducer'; import {UPDATE_SERVER_PATH} from './app.constants'; -import {VisibilityChanged} from './webapp-common/core/actions/layout.actions'; +import {setScaleFactor, VisibilityChanged} from './webapp-common/core/actions/layout.actions'; import {UiUpdatesService} from './webapp-common/shared/services/ui-updates.service'; import {UsageStatsService} from './core/Services/usage-stats.service'; import {UiUpdateDialogComponent} from './webapp-common/layout/ui-update-dialog/ui-update-dialog.component'; import {dismissSurvey} from './core/Actions/layout.actions'; import {environment} from '../environments/environment'; +import {getScaleFactor} from './webapp-common/shared/utils/shared-utils'; +import {User} from './business-logic/model/users/user'; @Component({ - selector : 'sm-root', - templateUrl : 'app.component.html', - styleUrls : ['app.component.scss'], + selector: 'sm-root', + templateUrl: 'app.component.html', + styleUrls: ['app.component.scss'], encapsulation: ViewEncapsulation.None }) export class AppComponent implements OnInit, OnDestroy { @@ -57,12 +64,14 @@ export class AppComponent implements OnInit, OnDestroy { public showNotification: boolean = true; public showSurvey$: Observable; public demo = environment.demo; + public isLoginContext: boolean; + public currentUser: User; @HostListener('document:visibilitychange') onVisibilityChange() { this.store.dispatch(new VisibilityChanged(!document.hidden)); } - constructor ( + constructor( private router: Router, private route: ActivatedRoute, private titleService: Title, @@ -72,15 +81,16 @@ export class AppComponent implements OnInit, OnDestroy { public serverUpdatesService: ServerUpdatesService, private uiUpdatesService: UiUpdatesService, private matDialog: MatDialog, - private userStats: UsageStatsService + private userStats: UsageStatsService, + private renderer: Renderer2 ) { - this.showS3Popup$ = this.store.select(selectShowS3PopUp); - this.showLocalFilePopup$ = this.store.pipe(select(selectShowLocalFilesPopUp)); - this.loggedOut$ = store.select(selectLoggedOut); - this.selectedProject$ = this.store.select(selectSelectedProject); - this.updatesAvailable$ = this.store.select(selectAvailableUpdates); - this.showSurvey$ = this.store.select(selectShowSurvey); - this.selectedCurrentUser$ = this.store.select(selectCurrentUser); + this.showS3Popup$ = this.store.select(selectShowS3PopUp); + this.showLocalFilePopup$ = this.store.pipe(select(selectShowLocalFilesPopUp)); + this.loggedOut$ = store.select(selectLoggedOut); + this.selectedProject$ = this.store.select(selectSelectedProject); + this.updatesAvailable$ = this.store.select(selectAvailableUpdates); + this.showSurvey$ = this.store.select(selectShowSurvey); + this.selectedCurrentUser$ = this.store.select(selectCurrentUser); this.selectedProjectFromUrl$ = this.store.select(selectRouterParams) .pipe( filter((params: Params) => !!params), @@ -100,8 +110,11 @@ export class AppComponent implements OnInit, OnDestroy { this.store.dispatch(new FetchCurrentUser()); this.selectedCurrentUser$.pipe( filter( user => !!user), - take(1)) - .subscribe(() => this.serverUpdatesService.checkForUpdates(UPDATE_SERVER_PATH)); + distinctUntilChanged()) + .subscribe((user) => { + this.currentUser = user; + this.serverUpdatesService.checkForUpdates(UPDATE_SERVER_PATH); + } ); this.selectedProjectFromUrl$.subscribe((projectId: string) => { this.store.dispatch(new SetSelectedProjectId(projectId)); @@ -116,7 +129,7 @@ export class AppComponent implements OnInit, OnDestroy { ) .subscribe(([data, bucketCredentials, popupDetails]) => { if (!(data && data.success)) { - const emptyCredentials = bucketCredentials.find((cred => cred.Bucket === popupDetails.credentials.Bucket)) === undefined; + const emptyCredentials = bucketCredentials.find((cred => cred.Bucket === popupDetails.credentials.Bucket)) === undefined; const dontAskAgainForBucketName = emptyCredentials ? '' : popupDetails.credentials.Bucket + popupDetails.credentials.Endpoint; this.store.dispatch(cancelS3Credentials({dontAskAgainForBucketName})); } @@ -126,9 +139,10 @@ export class AppComponent implements OnInit, OnDestroy { this.urlSubscription = combineLatest([this.store.select(selectRouterUrl), this.store.select(selectRouterParams)]) .subscribe(([url, params]) => { - this.projectId = get('projectId', params); + this.projectId = get('projectId', params); this.isDashboardContext = url && url.includes('dashboard'); - this.isWorkersContext = url && url.includes('workers-and-queues'); + this.isLoginContext = url && url.includes('login'); + this.isWorkersContext = url && url.includes('workers-and-queues'); if (this.projectId) { try { // TODO: refactor to a better solution after all navbar are declared... this.activeFeature = url.split(this.projectId)[1].split('/')[1]; @@ -147,6 +161,9 @@ export class AppComponent implements OnInit, OnDestroy { this.updateTitle(); } ); + if (window.localStorage.getItem('disableHidpi') !== 'true') { + this.setScale(); + } // TODO: move to somewhere else... this.store.dispatch(new GetAllProjects()); @@ -154,6 +171,16 @@ export class AppComponent implements OnInit, OnDestroy { this.uiUpdatesService.checkForUiUpdate(); } + private setScale() { + const dimensionRatio = getScaleFactor(); + this.store.dispatch(setScaleFactor({scale: dimensionRatio})); + const scale = 100 / dimensionRatio; + this.renderer.setStyle(document.body, 'transform', `scale(${scale})`); + this.renderer.setStyle(document.body, 'transform-origin', '0 0'); + this.renderer.setStyle(document.body, 'height', `${dimensionRatio}vh`); + this.renderer.setStyle(document.body, 'width', `${dimensionRatio}vw`); + } + nameChanged(name) { this.store.dispatch(new UpdateProject({id: this.projectId, changes: {name: name}})); } @@ -172,13 +199,13 @@ export class AppComponent implements OnInit, OnDestroy { } updateTitle() { - let route = this.route.snapshot.firstChild; + let route = this.route.snapshot.firstChild; let routeConfig = []; while (route) { - const path = route.routeConfig.path.split('/').filter((item) => !!item); + const path = route.routeConfig.path.split('/').filter((item) => !!item); routeConfig = routeConfig.concat(path); - route = route.firstChild; + route = route.firstChild; } const crumbs = routeConfig .reduce((acc, config) => { @@ -201,5 +228,9 @@ export class AppComponent implements OnInit, OnDestroy { this.store.dispatch(dismissSurvey()); } + + get guestUser(): boolean { + return !this.currentUser || this.currentUser?.role === 'guest'; + } } diff --git a/src/app/app.constants.ts b/src/app/app.constants.ts index 55ee8f0a..796af860 100644 --- a/src/app/app.constants.ts +++ b/src/app/app.constants.ts @@ -256,7 +256,7 @@ export const NAVIGATION_ACTIONS = { -export const ENVIRONMENT = {API_VERSION: '/v2.8'}; +export const ENVIRONMENT = {API_VERSION: '/v2.9'}; const url = window.location.origin; let apiBaseUrl: string; if (environment.apiBaseUrl) { diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 94d1d9d2..337c4630 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -16,39 +16,42 @@ import {ApiUsersService} from './business-logic/api-services/users.service'; import {loadUserAndPreferences} from './webapp-common/user-preferences'; import {AdminModule} from './webapp-common/admin/admin.module'; import {AngularSplitModule} from 'angular-split'; -import {NotifierModule} from 'angular-notifier'; +import {NotifierModule} from './webapp-common/angular-notifier'; import {LayoutModule} from './layout/layout.module'; import {ColorHashService} from './webapp-common/shared/services/color-hash/color-hash.service'; -import {LoginModule} from './webapp-common/login/login.module'; import {LoginService} from './webapp-common/shared/services/login.service'; import {Store} from '@ngrx/store'; -import {TitleCasePipe} from '@angular/common'; +import {SharedModule} from './shared/shared.module'; @NgModule({ declarations : [AppComponent], - imports : [ + imports: [ FormsModule, BrowserAnimationsModule, BrowserModule, SMCoreModule, BusinessLogicModule, SMSharedModule, - LoginModule, AngularSplitModule.forRoot(), - RouterModule.forRoot(routes, {preloadingStrategy: PreloadAllModules, scrollPositionRestoration: 'top', onSameUrlNavigation: 'reload'}), + RouterModule.forRoot(routes, { + preloadingStrategy: PreloadAllModules, + scrollPositionRestoration: 'top', + onSameUrlNavigation: 'reload' + }), AdminModule, NotifierModule.withConfig({ - theme : 'material', + theme: 'material', behaviour: { autoHide: {default: 5000, error: false} }, - position : { - vertical : {position: 'top', distance: 12, gap: 10}, + position: { + vertical: {position: 'top', distance: 12, gap: 10}, horizontal: {position: 'right', distance: 12} } }), CommonLayoutModule, LayoutModule, + SharedModule, ], providers : [ { @@ -65,19 +68,4 @@ import {TitleCasePipe} from '@angular/common'; exports : [] }) -export class AppModule { - - constructor() { - - // store.select(selectRouter) - // // .filter(state => !state.skipNextNavigation) - // .subscribe(state => { - // this.store.dispatch(new ResetDontShowAgainForBucketEndpoint()); - // (!state.params || !state.url) ? - // this.router.navigateByUrl(state.url, { queryParams: { unGuard: state.unGuard } }) : - // this.router.navigate([state.url, state.params], { queryParams: { unGuard: state.unGuard } }); - // }); - - } - -} +export class AppModule {} diff --git a/src/app/business-logic/api-services/auth.service.ts b/src/app/business-logic/api-services/auth.service.ts index 03bb9cdc..908d4bab 100644 --- a/src/app/business-logic/api-services/auth.service.ts +++ b/src/app/business-logic/api-services/auth.service.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/api-services/events.service.ts b/src/app/business-logic/api-services/events.service.ts index c321be4a..49231a43 100644 --- a/src/app/business-logic/api-services/events.service.ts +++ b/src/app/business-logic/api-services/events.service.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -540,7 +540,7 @@ export class ApiEventsService { /** * - * Get all \'log\' events for this task + * Get \'log\' events for this task * @param request request body * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param reportProgress flag to report request and response progress. diff --git a/src/app/business-logic/api-services/models.service.ts b/src/app/business-logic/api-services/models.service.ts index 7f7c5152..7f0a94a8 100644 --- a/src/app/business-logic/api-services/models.service.ts +++ b/src/app/business-logic/api-services/models.service.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -36,6 +36,8 @@ import { ModelsGetByIdRequest } from '../model/models/modelsGetByIdRequest'; import { ModelsGetByIdResponse } from '../model/models/modelsGetByIdResponse'; import { ModelsGetByTaskIdRequest } from '../model/models/modelsGetByTaskIdRequest'; import { ModelsGetByTaskIdResponse } from '../model/models/modelsGetByTaskIdResponse'; +import { ModelsGetFrameworksRequest } from '../model/models/modelsGetFrameworksRequest'; +import { ModelsGetFrameworksResponse } from '../model/models/modelsGetFrameworksResponse'; import { ModelsSetReadyRequest } from '../model/models/modelsSetReadyRequest'; import { ModelsSetReadyResponse } from '../model/models/modelsSetReadyResponse'; import { ModelsUpdateForTaskRequest } from '../model/models/modelsUpdateForTaskRequest'; @@ -394,6 +396,51 @@ export class ApiModelsService { ); } + /** + * + * Get the list of frameworks used in the company models + * @param request request body + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public modelsGetFrameworks(request: ModelsGetFrameworksRequest, options?: any, observe: any = 'body', reportProgress: boolean = false ): Observable { + if (request === null || request === undefined) { + throw new Error('Required parameter request was null or undefined when calling modelsGetFrameworks.'); + } + + let headers = this.defaultHeaders; + if (options && options.async_enable) { + headers = headers.set(this.configuration.asyncHeader, '1'); + } + + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts); + if (httpHeaderAcceptSelected != undefined) { + headers = headers.set("Accept", httpHeaderAcceptSelected); + } + + // to determine the Content-Type header + const consumes: string[] = [ + ]; + const httpContentTypeSelected:string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected != undefined) { + headers = headers.set("Content-Type", httpContentTypeSelected); + } + + return this.apiRequest.post(`${this.basePath}/models.get_frameworks`, + request, + { + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + /** * * Set the model ready flag to True. If the model is an output model of a task then try to publish the task. diff --git a/src/app/business-logic/api-services/organization.service.ts b/src/app/business-logic/api-services/organization.service.ts index e870d52e..6ecae49d 100644 --- a/src/app/business-logic/api-services/organization.service.ts +++ b/src/app/business-logic/api-services/organization.service.ts @@ -2,7 +2,7 @@ * organization * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.8 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/api-services/projects.service.ts b/src/app/business-logic/api-services/projects.service.ts index ce66af40..ba9cda48 100644 --- a/src/app/business-logic/api-services/projects.service.ts +++ b/src/app/business-logic/api-services/projects.service.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -34,6 +34,10 @@ import { ProjectsGetByIdRequest } from '../model/projects/projectsGetByIdRequest import { ProjectsGetByIdResponse } from '../model/projects/projectsGetByIdResponse'; import { ProjectsGetHyperParametersRequest } from '../model/projects/projectsGetHyperParametersRequest'; import { ProjectsGetHyperParametersResponse } from '../model/projects/projectsGetHyperParametersResponse'; +import { ProjectsGetModelTagsRequest } from '../model/projects/projectsGetModelTagsRequest'; +import { ProjectsGetModelTagsResponse } from '../model/projects/projectsGetModelTagsResponse'; +import { ProjectsGetTaskTagsRequest } from '../model/projects/projectsGetTaskTagsRequest'; +import { ProjectsGetTaskTagsResponse } from '../model/projects/projectsGetTaskTagsResponse'; import { ProjectsGetUniqueMetricVariantsRequest } from '../model/projects/projectsGetUniqueMetricVariantsRequest'; import { ProjectsGetUniqueMetricVariantsResponse } from '../model/projects/projectsGetUniqueMetricVariantsResponse'; import { ProjectsUpdateRequest } from '../model/projects/projectsUpdateRequest'; @@ -302,7 +306,7 @@ export class ApiProjectsService { /** * - * Get a list of all hyper parameter names used in tasks within the given project. + * Get a list of all hyper parameter sections and names used in tasks within the given project. * @param request request body * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param reportProgress flag to report request and response progress. @@ -345,6 +349,96 @@ export class ApiProjectsService { ); } + /** + * + * Get user and system tags used for the models under the specified projects + * @param request request body + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public projectsGetModelTags(request: ProjectsGetModelTagsRequest, options?: any, observe: any = 'body', reportProgress: boolean = false ): Observable { + if (request === null || request === undefined) { + throw new Error('Required parameter request was null or undefined when calling projectsGetModelTags.'); + } + + let headers = this.defaultHeaders; + if (options && options.async_enable) { + headers = headers.set(this.configuration.asyncHeader, '1'); + } + + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts); + if (httpHeaderAcceptSelected != undefined) { + headers = headers.set("Accept", httpHeaderAcceptSelected); + } + + // to determine the Content-Type header + const consumes: string[] = [ + ]; + const httpContentTypeSelected:string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected != undefined) { + headers = headers.set("Content-Type", httpContentTypeSelected); + } + + return this.apiRequest.post(`${this.basePath}/projects.get_model_tags`, + request, + { + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * + * Get user and system tags used for the tasks under the specified projects + * @param request request body + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public projectsGetTaskTags(request: ProjectsGetTaskTagsRequest, options?: any, observe: any = 'body', reportProgress: boolean = false ): Observable { + if (request === null || request === undefined) { + throw new Error('Required parameter request was null or undefined when calling projectsGetTaskTags.'); + } + + let headers = this.defaultHeaders; + if (options && options.async_enable) { + headers = headers.set(this.configuration.asyncHeader, '1'); + } + + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts); + if (httpHeaderAcceptSelected != undefined) { + headers = headers.set("Accept", httpHeaderAcceptSelected); + } + + // to determine the Content-Type header + const consumes: string[] = [ + ]; + const httpContentTypeSelected:string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected != undefined) { + headers = headers.set("Content-Type", httpContentTypeSelected); + } + + return this.apiRequest.post(`${this.basePath}/projects.get_task_tags`, + request, + { + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + /** * * Get all metric/variant pairs reported for tasks in a specific project. If no project is specified, metrics/variant paris reported for all tasks will be returned. If the project does not exist, an empty list will be returned. diff --git a/src/app/business-logic/api-services/queues.service.ts b/src/app/business-logic/api-services/queues.service.ts index b18762cb..50773ea7 100644 --- a/src/app/business-logic/api-services/queues.service.ts +++ b/src/app/business-logic/api-services/queues.service.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/api-services/server.service.ts b/src/app/business-logic/api-services/server.service.ts index b8b81a8d..41166fd6 100644 --- a/src/app/business-logic/api-services/server.service.ts +++ b/src/app/business-logic/api-services/server.service.ts @@ -2,7 +2,7 @@ * server * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/api-services/tasks.service.ts b/src/app/business-logic/api-services/tasks.service.ts index 2fde00b8..430674a6 100644 --- a/src/app/business-logic/api-services/tasks.service.ts +++ b/src/app/business-logic/api-services/tasks.service.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.8 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -32,10 +32,18 @@ import { TasksCompletedRequest } from '../model/tasks/tasksCompletedRequest'; import { TasksCompletedResponse } from '../model/tasks/tasksCompletedResponse'; import { TasksCreateRequest } from '../model/tasks/tasksCreateRequest'; import { TasksCreateResponse } from '../model/tasks/tasksCreateResponse'; +import { TasksDeleteConfigurationRequest } from '../model/tasks/tasksDeleteConfigurationRequest'; +import { TasksDeleteConfigurationResponse } from '../model/tasks/tasksDeleteConfigurationResponse'; +import { TasksDeleteHyperParamsRequest } from '../model/tasks/tasksDeleteHyperParamsRequest'; +import { TasksDeleteHyperParamsResponse } from '../model/tasks/tasksDeleteHyperParamsResponse'; import { TasksDeleteRequest } from '../model/tasks/tasksDeleteRequest'; import { TasksDeleteResponse } from '../model/tasks/tasksDeleteResponse'; import { TasksDequeueRequest } from '../model/tasks/tasksDequeueRequest'; import { TasksDequeueResponse } from '../model/tasks/tasksDequeueResponse'; +import { TasksEditConfigurationRequest } from '../model/tasks/tasksEditConfigurationRequest'; +import { TasksEditConfigurationResponse } from '../model/tasks/tasksEditConfigurationResponse'; +import { TasksEditHyperParamsRequest } from '../model/tasks/tasksEditHyperParamsRequest'; +import { TasksEditHyperParamsResponse } from '../model/tasks/tasksEditHyperParamsResponse'; import { TasksEditRequest } from '../model/tasks/tasksEditRequest'; import { TasksEditResponse } from '../model/tasks/tasksEditResponse'; import { TasksEnqueueRequest } from '../model/tasks/tasksEnqueueRequest'; @@ -48,6 +56,12 @@ import { TasksGetAllRequest } from '../model/tasks/tasksGetAllRequest'; import { TasksGetAllResponse } from '../model/tasks/tasksGetAllResponse'; import { TasksGetByIdRequest } from '../model/tasks/tasksGetByIdRequest'; import { TasksGetByIdResponse } from '../model/tasks/tasksGetByIdResponse'; +import { TasksGetConfigurationNamesRequest } from '../model/tasks/tasksGetConfigurationNamesRequest'; +import { TasksGetConfigurationNamesResponse } from '../model/tasks/tasksGetConfigurationNamesResponse'; +import { TasksGetConfigurationsRequest } from '../model/tasks/tasksGetConfigurationsRequest'; +import { TasksGetConfigurationsResponse } from '../model/tasks/tasksGetConfigurationsResponse'; +import { TasksGetHyperParamsRequest } from '../model/tasks/tasksGetHyperParamsRequest'; +import { TasksGetHyperParamsResponse } from '../model/tasks/tasksGetHyperParamsResponse'; import { TasksGetTypesRequest } from '../model/tasks/tasksGetTypesRequest'; import { TasksGetTypesResponse } from '../model/tasks/tasksGetTypesResponse'; import { TasksPingRequest } from '../model/tasks/tasksPingRequest'; @@ -374,6 +388,96 @@ export class ApiTasksService { ); } + /** + * + * Delete task configuration items + * @param request request body + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public tasksDeleteConfiguration(request: TasksDeleteConfigurationRequest, options?: any, observe: any = 'body', reportProgress: boolean = false ): Observable { + if (request === null || request === undefined) { + throw new Error('Required parameter request was null or undefined when calling tasksDeleteConfiguration.'); + } + + let headers = this.defaultHeaders; + if (options && options.async_enable) { + headers = headers.set(this.configuration.asyncHeader, '1'); + } + + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts); + if (httpHeaderAcceptSelected != undefined) { + headers = headers.set("Accept", httpHeaderAcceptSelected); + } + + // to determine the Content-Type header + const consumes: string[] = [ + ]; + const httpContentTypeSelected:string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected != undefined) { + headers = headers.set("Content-Type", httpContentTypeSelected); + } + + return this.apiRequest.post(`${this.basePath}/tasks.delete_configuration`, + request, + { + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * + * Delete task hyper parameters + * @param request request body + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public tasksDeleteHyperParams(request: TasksDeleteHyperParamsRequest, options?: any, observe: any = 'body', reportProgress: boolean = false ): Observable { + if (request === null || request === undefined) { + throw new Error('Required parameter request was null or undefined when calling tasksDeleteHyperParams.'); + } + + let headers = this.defaultHeaders; + if (options && options.async_enable) { + headers = headers.set(this.configuration.asyncHeader, '1'); + } + + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts); + if (httpHeaderAcceptSelected != undefined) { + headers = headers.set("Accept", httpHeaderAcceptSelected); + } + + // to determine the Content-Type header + const consumes: string[] = [ + ]; + const httpContentTypeSelected:string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected != undefined) { + headers = headers.set("Content-Type", httpContentTypeSelected); + } + + return this.apiRequest.post(`${this.basePath}/tasks.delete_hyper_params`, + request, + { + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + /** * * Remove a task from its queue. Fails if task status is not queued. @@ -464,6 +568,96 @@ export class ApiTasksService { ); } + /** + * + * Add or update task configuration + * @param request request body + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public tasksEditConfiguration(request: TasksEditConfigurationRequest, options?: any, observe: any = 'body', reportProgress: boolean = false ): Observable { + if (request === null || request === undefined) { + throw new Error('Required parameter request was null or undefined when calling tasksEditConfiguration.'); + } + + let headers = this.defaultHeaders; + if (options && options.async_enable) { + headers = headers.set(this.configuration.asyncHeader, '1'); + } + + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts); + if (httpHeaderAcceptSelected != undefined) { + headers = headers.set("Accept", httpHeaderAcceptSelected); + } + + // to determine the Content-Type header + const consumes: string[] = [ + ]; + const httpContentTypeSelected:string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected != undefined) { + headers = headers.set("Content-Type", httpContentTypeSelected); + } + + return this.apiRequest.post(`${this.basePath}/tasks.edit_configuration`, + request, + { + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * + * Add or update task hyper parameters + * @param request request body + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public tasksEditHyperParams(request: TasksEditHyperParamsRequest, options?: any, observe: any = 'body', reportProgress: boolean = false ): Observable { + if (request === null || request === undefined) { + throw new Error('Required parameter request was null or undefined when calling tasksEditHyperParams.'); + } + + let headers = this.defaultHeaders; + if (options && options.async_enable) { + headers = headers.set(this.configuration.asyncHeader, '1'); + } + + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts); + if (httpHeaderAcceptSelected != undefined) { + headers = headers.set("Accept", httpHeaderAcceptSelected); + } + + // to determine the Content-Type header + const consumes: string[] = [ + ]; + const httpContentTypeSelected:string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected != undefined) { + headers = headers.set("Content-Type", httpContentTypeSelected); + } + + return this.apiRequest.post(`${this.basePath}/tasks.edit_hyper_params`, + request, + { + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + /** * * Adds a task into a queue. Fails if task state is not \'created\'. Fails if the following parameters in the task were not filled: * execution.script.repository * execution.script.entrypoint @@ -689,6 +883,141 @@ export class ApiTasksService { ); } + /** + * + * Get the list of task configuration items names + * @param request request body + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public tasksGetConfigurationNames(request: TasksGetConfigurationNamesRequest, options?: any, observe: any = 'body', reportProgress: boolean = false ): Observable { + if (request === null || request === undefined) { + throw new Error('Required parameter request was null or undefined when calling tasksGetConfigurationNames.'); + } + + let headers = this.defaultHeaders; + if (options && options.async_enable) { + headers = headers.set(this.configuration.asyncHeader, '1'); + } + + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts); + if (httpHeaderAcceptSelected != undefined) { + headers = headers.set("Accept", httpHeaderAcceptSelected); + } + + // to determine the Content-Type header + const consumes: string[] = [ + ]; + const httpContentTypeSelected:string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected != undefined) { + headers = headers.set("Content-Type", httpContentTypeSelected); + } + + return this.apiRequest.post(`${this.basePath}/tasks.get_configuration_names`, + request, + { + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * + * Get the list of task configurations + * @param request request body + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public tasksGetConfigurations(request: TasksGetConfigurationsRequest, options?: any, observe: any = 'body', reportProgress: boolean = false ): Observable { + if (request === null || request === undefined) { + throw new Error('Required parameter request was null or undefined when calling tasksGetConfigurations.'); + } + + let headers = this.defaultHeaders; + if (options && options.async_enable) { + headers = headers.set(this.configuration.asyncHeader, '1'); + } + + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts); + if (httpHeaderAcceptSelected != undefined) { + headers = headers.set("Accept", httpHeaderAcceptSelected); + } + + // to determine the Content-Type header + const consumes: string[] = [ + ]; + const httpContentTypeSelected:string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected != undefined) { + headers = headers.set("Content-Type", httpContentTypeSelected); + } + + return this.apiRequest.post(`${this.basePath}/tasks.get_configurations`, + request, + { + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * + * Get the list of task hyper parameters + * @param request request body + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public tasksGetHyperParams(request: TasksGetHyperParamsRequest, options?: any, observe: any = 'body', reportProgress: boolean = false ): Observable { + if (request === null || request === undefined) { + throw new Error('Required parameter request was null or undefined when calling tasksGetHyperParams.'); + } + + let headers = this.defaultHeaders; + if (options && options.async_enable) { + headers = headers.set(this.configuration.asyncHeader, '1'); + } + + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts); + if (httpHeaderAcceptSelected != undefined) { + headers = headers.set("Accept", httpHeaderAcceptSelected); + } + + // to determine the Content-Type header + const consumes: string[] = [ + ]; + const httpContentTypeSelected:string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected != undefined) { + headers = headers.set("Content-Type", httpContentTypeSelected); + } + + return this.apiRequest.post(`${this.basePath}/tasks.get_hyper_params`, + request, + { + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + /** * * Get the list of task types used in the specified projects diff --git a/src/app/business-logic/api-services/users.service.ts b/src/app/business-logic/api-services/users.service.ts index 841dbe4a..fc44c562 100644 --- a/src/app/business-logic/api-services/users.service.ts +++ b/src/app/business-logic/api-services/users.service.ts @@ -2,7 +2,7 @@ * users * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.8 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/api-services/workers.service.ts b/src/app/business-logic/api-services/workers.service.ts index 59e51c8e..a631dca9 100644 --- a/src/app/business-logic/api-services/workers.service.ts +++ b/src/app/business-logic/api-services/workers.service.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authCreateCredentialsResponse.ts b/src/app/business-logic/model/auth/authCreateCredentialsResponse.ts index 21b336c2..37b8ec48 100644 --- a/src/app/business-logic/model/auth/authCreateCredentialsResponse.ts +++ b/src/app/business-logic/model/auth/authCreateCredentialsResponse.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authCreateUserRequest.ts b/src/app/business-logic/model/auth/authCreateUserRequest.ts index 7d8808b5..e73a2a0e 100644 --- a/src/app/business-logic/model/auth/authCreateUserRequest.ts +++ b/src/app/business-logic/model/auth/authCreateUserRequest.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authCreateUserResponse.ts b/src/app/business-logic/model/auth/authCreateUserResponse.ts index a464525d..af8a70ee 100644 --- a/src/app/business-logic/model/auth/authCreateUserResponse.ts +++ b/src/app/business-logic/model/auth/authCreateUserResponse.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authEditUserRequest.ts b/src/app/business-logic/model/auth/authEditUserRequest.ts index bb531031..7937d02a 100644 --- a/src/app/business-logic/model/auth/authEditUserRequest.ts +++ b/src/app/business-logic/model/auth/authEditUserRequest.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authEditUserResponse.ts b/src/app/business-logic/model/auth/authEditUserResponse.ts index 59195a1b..f1f0fd40 100644 --- a/src/app/business-logic/model/auth/authEditUserResponse.ts +++ b/src/app/business-logic/model/auth/authEditUserResponse.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authFixedUsersModeResponse.ts b/src/app/business-logic/model/auth/authFixedUsersModeResponse.ts index 12dce9d1..520569aa 100644 --- a/src/app/business-logic/model/auth/authFixedUsersModeResponse.ts +++ b/src/app/business-logic/model/auth/authFixedUsersModeResponse.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authGetCredentialsResponse.ts b/src/app/business-logic/model/auth/authGetCredentialsResponse.ts index 7a8a6fea..b0837af4 100644 --- a/src/app/business-logic/model/auth/authGetCredentialsResponse.ts +++ b/src/app/business-logic/model/auth/authGetCredentialsResponse.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authGetTokenForUserRequest.ts b/src/app/business-logic/model/auth/authGetTokenForUserRequest.ts index 17fc9e55..1f6e20f7 100644 --- a/src/app/business-logic/model/auth/authGetTokenForUserRequest.ts +++ b/src/app/business-logic/model/auth/authGetTokenForUserRequest.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authGetTokenForUserResponse.ts b/src/app/business-logic/model/auth/authGetTokenForUserResponse.ts index c45ee7b1..4d976b62 100644 --- a/src/app/business-logic/model/auth/authGetTokenForUserResponse.ts +++ b/src/app/business-logic/model/auth/authGetTokenForUserResponse.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authLoginRequest.ts b/src/app/business-logic/model/auth/authLoginRequest.ts index a0ec111a..8eadea62 100644 --- a/src/app/business-logic/model/auth/authLoginRequest.ts +++ b/src/app/business-logic/model/auth/authLoginRequest.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authLoginResponse.ts b/src/app/business-logic/model/auth/authLoginResponse.ts index e10def57..26c3ec5b 100644 --- a/src/app/business-logic/model/auth/authLoginResponse.ts +++ b/src/app/business-logic/model/auth/authLoginResponse.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authRevokeCredentialsRequest.ts b/src/app/business-logic/model/auth/authRevokeCredentialsRequest.ts index 7894ebed..50f9173c 100644 --- a/src/app/business-logic/model/auth/authRevokeCredentialsRequest.ts +++ b/src/app/business-logic/model/auth/authRevokeCredentialsRequest.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authRevokeCredentialsResponse.ts b/src/app/business-logic/model/auth/authRevokeCredentialsResponse.ts index 3d6b7b1f..06499a5a 100644 --- a/src/app/business-logic/model/auth/authRevokeCredentialsResponse.ts +++ b/src/app/business-logic/model/auth/authRevokeCredentialsResponse.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authValidateTokenRequest.ts b/src/app/business-logic/model/auth/authValidateTokenRequest.ts index f5d0047a..11eb60b7 100644 --- a/src/app/business-logic/model/auth/authValidateTokenRequest.ts +++ b/src/app/business-logic/model/auth/authValidateTokenRequest.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authValidateTokenResponse.ts b/src/app/business-logic/model/auth/authValidateTokenResponse.ts index fd5c9a62..960f7308 100644 --- a/src/app/business-logic/model/auth/authValidateTokenResponse.ts +++ b/src/app/business-logic/model/auth/authValidateTokenResponse.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/credentialKey.ts b/src/app/business-logic/model/auth/credentialKey.ts index 9e8389fb..a55c915a 100644 --- a/src/app/business-logic/model/auth/credentialKey.ts +++ b/src/app/business-logic/model/auth/credentialKey.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/credentials.ts b/src/app/business-logic/model/auth/credentials.ts index bd9aa4e9..6bcf149c 100644 --- a/src/app/business-logic/model/auth/credentials.ts +++ b/src/app/business-logic/model/auth/credentials.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/role.ts b/src/app/business-logic/model/auth/role.ts index 3d074660..9ec562fb 100644 --- a/src/app/business-logic/model/auth/role.ts +++ b/src/app/business-logic/model/auth/role.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventTypeEnum.ts b/src/app/business-logic/model/events/eventTypeEnum.ts index 7ff99d1e..5634d8ab 100644 --- a/src/app/business-logic/model/events/eventTypeEnum.ts +++ b/src/app/business-logic/model/events/eventTypeEnum.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsAddBatchResponse.ts b/src/app/business-logic/model/events/eventsAddBatchResponse.ts index bd06bef6..cf371e56 100644 --- a/src/app/business-logic/model/events/eventsAddBatchResponse.ts +++ b/src/app/business-logic/model/events/eventsAddBatchResponse.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -15,4 +15,5 @@ export interface EventsAddBatchResponse { added?: number; errors?: number; + errors_info?: object; } diff --git a/src/app/business-logic/model/events/eventsDebugImagesRequest.ts b/src/app/business-logic/model/events/eventsDebugImagesRequest.ts index f344dfb5..16e26dea 100644 --- a/src/app/business-logic/model/events/eventsDebugImagesRequest.ts +++ b/src/app/business-logic/model/events/eventsDebugImagesRequest.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -23,7 +23,7 @@ export interface EventsDebugImagesRequest { */ iters?: number; /** - * If set then events are retreived from later iterations to earlier ones. Otherwise from earlier iterations to the later. The default is True + * If set then events are retreived from latest iterations to earliest ones. Otherwise from earliest iterations to the latest. The default is True */ navigate_earlier?: boolean; /** diff --git a/src/app/business-logic/model/events/eventsDebugImagesResponse.ts b/src/app/business-logic/model/events/eventsDebugImagesResponse.ts index 22eb4760..c3a23d3b 100644 --- a/src/app/business-logic/model/events/eventsDebugImagesResponse.ts +++ b/src/app/business-logic/model/events/eventsDebugImagesResponse.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsDeleteForTaskRequest.ts b/src/app/business-logic/model/events/eventsDeleteForTaskRequest.ts index e39076ef..fb8337a0 100644 --- a/src/app/business-logic/model/events/eventsDeleteForTaskRequest.ts +++ b/src/app/business-logic/model/events/eventsDeleteForTaskRequest.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsDeleteForTaskResponse.ts b/src/app/business-logic/model/events/eventsDeleteForTaskResponse.ts index 836f2628..3a2561c1 100644 --- a/src/app/business-logic/model/events/eventsDeleteForTaskResponse.ts +++ b/src/app/business-logic/model/events/eventsDeleteForTaskResponse.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsDownloadTaskLogRequest.ts b/src/app/business-logic/model/events/eventsDownloadTaskLogRequest.ts index 5326f7f2..9e8785ce 100644 --- a/src/app/business-logic/model/events/eventsDownloadTaskLogRequest.ts +++ b/src/app/business-logic/model/events/eventsDownloadTaskLogRequest.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsGetMultiTaskPlotsRequest.ts b/src/app/business-logic/model/events/eventsGetMultiTaskPlotsRequest.ts index f822a568..93239976 100644 --- a/src/app/business-logic/model/events/eventsGetMultiTaskPlotsRequest.ts +++ b/src/app/business-logic/model/events/eventsGetMultiTaskPlotsRequest.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsGetMultiTaskPlotsResponse.ts b/src/app/business-logic/model/events/eventsGetMultiTaskPlotsResponse.ts index 16d66bc6..50484a8c 100644 --- a/src/app/business-logic/model/events/eventsGetMultiTaskPlotsResponse.ts +++ b/src/app/business-logic/model/events/eventsGetMultiTaskPlotsResponse.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsGetScalarMetricDataRequest.ts b/src/app/business-logic/model/events/eventsGetScalarMetricDataRequest.ts index 0ed63ba3..1fa23cbd 100644 --- a/src/app/business-logic/model/events/eventsGetScalarMetricDataRequest.ts +++ b/src/app/business-logic/model/events/eventsGetScalarMetricDataRequest.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsGetScalarMetricDataResponse.ts b/src/app/business-logic/model/events/eventsGetScalarMetricDataResponse.ts index 31495484..fd1ea88b 100644 --- a/src/app/business-logic/model/events/eventsGetScalarMetricDataResponse.ts +++ b/src/app/business-logic/model/events/eventsGetScalarMetricDataResponse.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsGetScalarMetricsAndVariantsRequest.ts b/src/app/business-logic/model/events/eventsGetScalarMetricsAndVariantsRequest.ts index b777c0fd..9714f785 100644 --- a/src/app/business-logic/model/events/eventsGetScalarMetricsAndVariantsRequest.ts +++ b/src/app/business-logic/model/events/eventsGetScalarMetricsAndVariantsRequest.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsGetScalarMetricsAndVariantsResponse.ts b/src/app/business-logic/model/events/eventsGetScalarMetricsAndVariantsResponse.ts index 113dd368..3a6f994c 100644 --- a/src/app/business-logic/model/events/eventsGetScalarMetricsAndVariantsResponse.ts +++ b/src/app/business-logic/model/events/eventsGetScalarMetricsAndVariantsResponse.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsGetTaskEventsRequest.ts b/src/app/business-logic/model/events/eventsGetTaskEventsRequest.ts index 3b06e650..bee529cc 100644 --- a/src/app/business-logic/model/events/eventsGetTaskEventsRequest.ts +++ b/src/app/business-logic/model/events/eventsGetTaskEventsRequest.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsGetTaskEventsResponse.ts b/src/app/business-logic/model/events/eventsGetTaskEventsResponse.ts index f5307c26..b70bf448 100644 --- a/src/app/business-logic/model/events/eventsGetTaskEventsResponse.ts +++ b/src/app/business-logic/model/events/eventsGetTaskEventsResponse.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsGetTaskLatestScalarValuesRequest.ts b/src/app/business-logic/model/events/eventsGetTaskLatestScalarValuesRequest.ts index 81f067d0..ea3fb4bd 100644 --- a/src/app/business-logic/model/events/eventsGetTaskLatestScalarValuesRequest.ts +++ b/src/app/business-logic/model/events/eventsGetTaskLatestScalarValuesRequest.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsGetTaskLatestScalarValuesResponse.ts b/src/app/business-logic/model/events/eventsGetTaskLatestScalarValuesResponse.ts index 920c1bd1..afc93836 100644 --- a/src/app/business-logic/model/events/eventsGetTaskLatestScalarValuesResponse.ts +++ b/src/app/business-logic/model/events/eventsGetTaskLatestScalarValuesResponse.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsGetTaskLatestScalarValuesResponseMetrics.ts b/src/app/business-logic/model/events/eventsGetTaskLatestScalarValuesResponseMetrics.ts index 9980a3f1..721958a7 100644 --- a/src/app/business-logic/model/events/eventsGetTaskLatestScalarValuesResponseMetrics.ts +++ b/src/app/business-logic/model/events/eventsGetTaskLatestScalarValuesResponseMetrics.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsGetTaskLatestScalarValuesResponseVariants.ts b/src/app/business-logic/model/events/eventsGetTaskLatestScalarValuesResponseVariants.ts index 633aead1..66c9b7ed 100644 --- a/src/app/business-logic/model/events/eventsGetTaskLatestScalarValuesResponseVariants.ts +++ b/src/app/business-logic/model/events/eventsGetTaskLatestScalarValuesResponseVariants.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsGetTaskLogRequest.ts b/src/app/business-logic/model/events/eventsGetTaskLogRequest.ts index a01f71c4..71ee736c 100644 --- a/src/app/business-logic/model/events/eventsGetTaskLogRequest.ts +++ b/src/app/business-logic/model/events/eventsGetTaskLogRequest.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -18,31 +18,15 @@ export interface EventsGetTaskLogRequest { */ task: string; /** - * Timestamp order in which log events will be returned (defaults to ascending) + * The amount of log events to return */ - order?: EventsGetTaskLogRequest.OrderEnum; - /** - * Where will the log entries be taken from (default to the head of the log) - */ - from?: EventsGetTaskLogRequest.FromEnum; + batch_size?: number; /** - * + * If set then log events are retreived from the latest to the earliest ones (in timestamp descending order). Otherwise from the earliest to the latest ones (in timestamp ascending order). The default is True */ - scroll_id?: string; + navigate_earlier?: boolean; /** - * + * Epoch time in UTC ms to use as the navigation start */ - batch_size?: number; -} -export namespace EventsGetTaskLogRequest { - export type OrderEnum = 'asc' | 'desc'; - export const OrderEnum = { - Asc: 'asc' as OrderEnum, - Desc: 'desc' as OrderEnum - } - export type FromEnum = 'head' | 'tail'; - export const FromEnum = { - Head: 'head' as FromEnum, - Tail: 'tail' as FromEnum - } + from_timestamp?: number; } diff --git a/src/app/business-logic/model/events/eventsGetTaskLogResponse.ts b/src/app/business-logic/model/events/eventsGetTaskLogResponse.ts index 04deac4d..e2ea1bc9 100644 --- a/src/app/business-logic/model/events/eventsGetTaskLogResponse.ts +++ b/src/app/business-logic/model/events/eventsGetTaskLogResponse.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -18,15 +18,11 @@ export interface EventsGetTaskLogResponse { */ events?: Array; /** - * Number of results returned + * Number of log events returned */ returned?: number; /** - * Total number of results available for this query + * Total number of log events available for this query */ total?: number; - /** - * Scroll ID for getting more results - */ - scroll_id?: string; } diff --git a/src/app/business-logic/model/events/eventsGetTaskMetricsRequest.ts b/src/app/business-logic/model/events/eventsGetTaskMetricsRequest.ts index a8d97d52..47f7915d 100644 --- a/src/app/business-logic/model/events/eventsGetTaskMetricsRequest.ts +++ b/src/app/business-logic/model/events/eventsGetTaskMetricsRequest.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsGetTaskMetricsResponse.ts b/src/app/business-logic/model/events/eventsGetTaskMetricsResponse.ts index f478e94f..e80d7361 100644 --- a/src/app/business-logic/model/events/eventsGetTaskMetricsResponse.ts +++ b/src/app/business-logic/model/events/eventsGetTaskMetricsResponse.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsGetTaskPlotsRequest.ts b/src/app/business-logic/model/events/eventsGetTaskPlotsRequest.ts index e20a4e3e..ec8c4383 100644 --- a/src/app/business-logic/model/events/eventsGetTaskPlotsRequest.ts +++ b/src/app/business-logic/model/events/eventsGetTaskPlotsRequest.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsGetTaskPlotsResponse.ts b/src/app/business-logic/model/events/eventsGetTaskPlotsResponse.ts index 9a10121d..a3ce4934 100644 --- a/src/app/business-logic/model/events/eventsGetTaskPlotsResponse.ts +++ b/src/app/business-logic/model/events/eventsGetTaskPlotsResponse.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsGetVectorMetricsAndVariantsRequest.ts b/src/app/business-logic/model/events/eventsGetVectorMetricsAndVariantsRequest.ts index b838b036..e2cbbb28 100644 --- a/src/app/business-logic/model/events/eventsGetVectorMetricsAndVariantsRequest.ts +++ b/src/app/business-logic/model/events/eventsGetVectorMetricsAndVariantsRequest.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsGetVectorMetricsAndVariantsResponse.ts b/src/app/business-logic/model/events/eventsGetVectorMetricsAndVariantsResponse.ts index df9be254..2e59433c 100644 --- a/src/app/business-logic/model/events/eventsGetVectorMetricsAndVariantsResponse.ts +++ b/src/app/business-logic/model/events/eventsGetVectorMetricsAndVariantsResponse.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsMultiTaskScalarMetricsIterHistogramRequest.ts b/src/app/business-logic/model/events/eventsMultiTaskScalarMetricsIterHistogramRequest.ts index 1b843a8c..29b8b347 100644 --- a/src/app/business-logic/model/events/eventsMultiTaskScalarMetricsIterHistogramRequest.ts +++ b/src/app/business-logic/model/events/eventsMultiTaskScalarMetricsIterHistogramRequest.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsScalarMetricsIterHistogramRequest.ts b/src/app/business-logic/model/events/eventsScalarMetricsIterHistogramRequest.ts index 65e8046f..8f6d65c7 100644 --- a/src/app/business-logic/model/events/eventsScalarMetricsIterHistogramRequest.ts +++ b/src/app/business-logic/model/events/eventsScalarMetricsIterHistogramRequest.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsScalarMetricsIterHistogramResponse.ts b/src/app/business-logic/model/events/eventsScalarMetricsIterHistogramResponse.ts index 8f43bb2d..3c6f9e2b 100644 --- a/src/app/business-logic/model/events/eventsScalarMetricsIterHistogramResponse.ts +++ b/src/app/business-logic/model/events/eventsScalarMetricsIterHistogramResponse.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsVectorMetricsIterHistogramRequest.ts b/src/app/business-logic/model/events/eventsVectorMetricsIterHistogramRequest.ts index e46922e6..5fd6ed4f 100644 --- a/src/app/business-logic/model/events/eventsVectorMetricsIterHistogramRequest.ts +++ b/src/app/business-logic/model/events/eventsVectorMetricsIterHistogramRequest.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/eventsVectorMetricsIterHistogramResponse.ts b/src/app/business-logic/model/events/eventsVectorMetricsIterHistogramResponse.ts index 18eb9a93..0474206a 100644 --- a/src/app/business-logic/model/events/eventsVectorMetricsIterHistogramResponse.ts +++ b/src/app/business-logic/model/events/eventsVectorMetricsIterHistogramResponse.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/logLevelEnum.ts b/src/app/business-logic/model/events/logLevelEnum.ts index 64a2ddf1..4418330b 100644 --- a/src/app/business-logic/model/events/logLevelEnum.ts +++ b/src/app/business-logic/model/events/logLevelEnum.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/metricsImageEvent.ts b/src/app/business-logic/model/events/metricsImageEvent.ts index 7631cf5f..4d6c4c20 100644 --- a/src/app/business-logic/model/events/metricsImageEvent.ts +++ b/src/app/business-logic/model/events/metricsImageEvent.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/metricsPlotEvent.ts b/src/app/business-logic/model/events/metricsPlotEvent.ts index 0b8fff21..9a19b1e5 100644 --- a/src/app/business-logic/model/events/metricsPlotEvent.ts +++ b/src/app/business-logic/model/events/metricsPlotEvent.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/metricsScalarEvent.ts b/src/app/business-logic/model/events/metricsScalarEvent.ts index 05e7adf8..44038faa 100644 --- a/src/app/business-logic/model/events/metricsScalarEvent.ts +++ b/src/app/business-logic/model/events/metricsScalarEvent.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/metricsVectorEvent.ts b/src/app/business-logic/model/events/metricsVectorEvent.ts index acdbdbfa..39133119 100644 --- a/src/app/business-logic/model/events/metricsVectorEvent.ts +++ b/src/app/business-logic/model/events/metricsVectorEvent.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/scalarKeyEnum.ts b/src/app/business-logic/model/events/scalarKeyEnum.ts index 42b6ee3e..6ce8832c 100644 --- a/src/app/business-logic/model/events/scalarKeyEnum.ts +++ b/src/app/business-logic/model/events/scalarKeyEnum.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -15,7 +15,7 @@ export type ScalarKeyEnum = 'iter' | 'timestamp' | 'iso_time'; export const ScalarKeyEnum = { - Iter: 'iter' as ScalarKeyEnum, - Timestamp: 'timestamp' as ScalarKeyEnum, - IsoTime: 'iso_time' as ScalarKeyEnum -}; + Iter: 'iter' as ScalarKeyEnum, + Timestamp: 'timestamp' as ScalarKeyEnum, + IsoTime: 'iso_time' as ScalarKeyEnum +} diff --git a/src/app/business-logic/model/events/taskLogEvent.ts b/src/app/business-logic/model/events/taskLogEvent.ts index c6a16083..5376ea28 100644 --- a/src/app/business-logic/model/events/taskLogEvent.ts +++ b/src/app/business-logic/model/events/taskLogEvent.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/events/taskMetric.ts b/src/app/business-logic/model/events/taskMetric.ts index d15ce1d3..3a42af29 100644 --- a/src/app/business-logic/model/events/taskMetric.ts +++ b/src/app/business-logic/model/events/taskMetric.ts @@ -2,7 +2,7 @@ * events * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/model.ts b/src/app/business-logic/model/models/model.ts index 401bfcae..791beb86 100644 --- a/src/app/business-logic/model/models/model.ts +++ b/src/app/business-logic/model/models/model.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/models.ts b/src/app/business-logic/model/models/models.ts index a7f4abcf..ac5c48e4 100644 --- a/src/app/business-logic/model/models/models.ts +++ b/src/app/business-logic/model/models/models.ts @@ -13,6 +13,8 @@ export * from './modelsGetByIdRequest'; export * from './modelsGetByIdResponse'; export * from './modelsGetByTaskIdRequest'; export * from './modelsGetByTaskIdResponse'; +export * from './modelsGetFrameworksRequest'; +export * from './modelsGetFrameworksResponse'; export * from './modelsSetReadyRequest'; export * from './modelsSetReadyResponse'; export * from './modelsSetReadyResponsePublishedTask'; diff --git a/src/app/business-logic/model/models/modelsCreateRequest.ts b/src/app/business-logic/model/models/modelsCreateRequest.ts index 4fcd174f..61317b2f 100644 --- a/src/app/business-logic/model/models/modelsCreateRequest.ts +++ b/src/app/business-logic/model/models/modelsCreateRequest.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsCreateResponse.ts b/src/app/business-logic/model/models/modelsCreateResponse.ts index 93542954..5c339a8a 100644 --- a/src/app/business-logic/model/models/modelsCreateResponse.ts +++ b/src/app/business-logic/model/models/modelsCreateResponse.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsDeleteRequest.ts b/src/app/business-logic/model/models/modelsDeleteRequest.ts index d607a22d..1dfdc4a2 100644 --- a/src/app/business-logic/model/models/modelsDeleteRequest.ts +++ b/src/app/business-logic/model/models/modelsDeleteRequest.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsDeleteResponse.ts b/src/app/business-logic/model/models/modelsDeleteResponse.ts index 6c1e14fe..caf6b017 100644 --- a/src/app/business-logic/model/models/modelsDeleteResponse.ts +++ b/src/app/business-logic/model/models/modelsDeleteResponse.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsEditRequest.ts b/src/app/business-logic/model/models/modelsEditRequest.ts index d3b95dd4..eacfac7f 100644 --- a/src/app/business-logic/model/models/modelsEditRequest.ts +++ b/src/app/business-logic/model/models/modelsEditRequest.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsEditResponse.ts b/src/app/business-logic/model/models/modelsEditResponse.ts index 1aba5b97..8fac1327 100644 --- a/src/app/business-logic/model/models/modelsEditResponse.ts +++ b/src/app/business-logic/model/models/modelsEditResponse.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsGetAllExRequest.ts b/src/app/business-logic/model/models/modelsGetAllExRequest.ts index 2892e9c6..21d5448a 100644 --- a/src/app/business-logic/model/models/modelsGetAllExRequest.ts +++ b/src/app/business-logic/model/models/modelsGetAllExRequest.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.8 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsGetAllExResponse.ts b/src/app/business-logic/model/models/modelsGetAllExResponse.ts index ac56b32c..b4fd1c89 100644 --- a/src/app/business-logic/model/models/modelsGetAllExResponse.ts +++ b/src/app/business-logic/model/models/modelsGetAllExResponse.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsGetAllRequest.ts b/src/app/business-logic/model/models/modelsGetAllRequest.ts index a5f6798d..a2817ede 100644 --- a/src/app/business-logic/model/models/modelsGetAllRequest.ts +++ b/src/app/business-logic/model/models/modelsGetAllRequest.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.8 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsGetAllResponse.ts b/src/app/business-logic/model/models/modelsGetAllResponse.ts index fada0595..dc641b73 100644 --- a/src/app/business-logic/model/models/modelsGetAllResponse.ts +++ b/src/app/business-logic/model/models/modelsGetAllResponse.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsGetByIdRequest.ts b/src/app/business-logic/model/models/modelsGetByIdRequest.ts index a4b2f6d4..250ccba5 100644 --- a/src/app/business-logic/model/models/modelsGetByIdRequest.ts +++ b/src/app/business-logic/model/models/modelsGetByIdRequest.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsGetByIdResponse.ts b/src/app/business-logic/model/models/modelsGetByIdResponse.ts index 783fc43a..31467696 100644 --- a/src/app/business-logic/model/models/modelsGetByIdResponse.ts +++ b/src/app/business-logic/model/models/modelsGetByIdResponse.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsGetByTaskIdRequest.ts b/src/app/business-logic/model/models/modelsGetByTaskIdRequest.ts index f8237f39..736138ba 100644 --- a/src/app/business-logic/model/models/modelsGetByTaskIdRequest.ts +++ b/src/app/business-logic/model/models/modelsGetByTaskIdRequest.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsGetByTaskIdResponse.ts b/src/app/business-logic/model/models/modelsGetByTaskIdResponse.ts index dd372b0d..f057f9f0 100644 --- a/src/app/business-logic/model/models/modelsGetByTaskIdResponse.ts +++ b/src/app/business-logic/model/models/modelsGetByTaskIdResponse.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsSetReadyRequest.ts b/src/app/business-logic/model/models/modelsSetReadyRequest.ts index 7e16021b..f12e05bb 100644 --- a/src/app/business-logic/model/models/modelsSetReadyRequest.ts +++ b/src/app/business-logic/model/models/modelsSetReadyRequest.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsSetReadyResponse.ts b/src/app/business-logic/model/models/modelsSetReadyResponse.ts index 4160602b..32e7056c 100644 --- a/src/app/business-logic/model/models/modelsSetReadyResponse.ts +++ b/src/app/business-logic/model/models/modelsSetReadyResponse.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsSetReadyResponsePublishedTask.ts b/src/app/business-logic/model/models/modelsSetReadyResponsePublishedTask.ts index 438acd25..dc394568 100644 --- a/src/app/business-logic/model/models/modelsSetReadyResponsePublishedTask.ts +++ b/src/app/business-logic/model/models/modelsSetReadyResponsePublishedTask.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsSetReadyResponsePublishedTaskData.ts b/src/app/business-logic/model/models/modelsSetReadyResponsePublishedTaskData.ts index b9c73a33..2ebbd401 100644 --- a/src/app/business-logic/model/models/modelsSetReadyResponsePublishedTaskData.ts +++ b/src/app/business-logic/model/models/modelsSetReadyResponsePublishedTaskData.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsUpdateForTaskRequest.ts b/src/app/business-logic/model/models/modelsUpdateForTaskRequest.ts index 5a159f93..eb43f99b 100644 --- a/src/app/business-logic/model/models/modelsUpdateForTaskRequest.ts +++ b/src/app/business-logic/model/models/modelsUpdateForTaskRequest.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -18,7 +18,7 @@ export interface ModelsUpdateForTaskRequest { */ task: string; /** - * URI for the model + * URI for the model. Exactly one of uri or override_model_id is a required. */ uri?: string; /** @@ -38,7 +38,7 @@ export interface ModelsUpdateForTaskRequest { */ system_tags?: Array; /** - * Override model ID. If provided, this model is updated in the task. + * Override model ID. If provided, this model is updated in the task. Exactly one of override_model_id or uri is required. */ override_model_id?: string; /** diff --git a/src/app/business-logic/model/models/modelsUpdateForTaskResponse.ts b/src/app/business-logic/model/models/modelsUpdateForTaskResponse.ts index bdcb5dcd..3c7f8904 100644 --- a/src/app/business-logic/model/models/modelsUpdateForTaskResponse.ts +++ b/src/app/business-logic/model/models/modelsUpdateForTaskResponse.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsUpdateRequest.ts b/src/app/business-logic/model/models/modelsUpdateRequest.ts index a4747791..e7e4dee2 100644 --- a/src/app/business-logic/model/models/modelsUpdateRequest.ts +++ b/src/app/business-logic/model/models/modelsUpdateRequest.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/modelsUpdateResponse.ts b/src/app/business-logic/model/models/modelsUpdateResponse.ts index d5cb590b..27cc2625 100644 --- a/src/app/business-logic/model/models/modelsUpdateResponse.ts +++ b/src/app/business-logic/model/models/modelsUpdateResponse.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/models/multiFieldPatternData.ts b/src/app/business-logic/model/models/multiFieldPatternData.ts index aa476f79..a1354e3a 100644 --- a/src/app/business-logic/model/models/multiFieldPatternData.ts +++ b/src/app/business-logic/model/models/multiFieldPatternData.ts @@ -2,7 +2,7 @@ * models * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/organization/models.ts b/src/app/business-logic/model/organization/models.ts index 2da7de70..6e63d7d8 100644 --- a/src/app/business-logic/model/organization/models.ts +++ b/src/app/business-logic/model/organization/models.ts @@ -1,2 +1,3 @@ export * from './organizationGetTagsRequest'; +export * from './organizationGetTagsRequestFilter'; export * from './organizationGetTagsResponse'; diff --git a/src/app/business-logic/model/organization/organizationGetTagsRequest.ts b/src/app/business-logic/model/organization/organizationGetTagsRequest.ts index 119066e7..60171a9c 100644 --- a/src/app/business-logic/model/organization/organizationGetTagsRequest.ts +++ b/src/app/business-logic/model/organization/organizationGetTagsRequest.ts @@ -2,7 +2,7 @@ * organization * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.8 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -17,4 +17,5 @@ export interface OrganizationGetTagsRequest { * If set to \'true\' then the list of the system tags is also returned. The default value is \'false\' */ include_system?: boolean; + filter?: object; } diff --git a/src/app/business-logic/model/organization/organizationGetTagsResponse.ts b/src/app/business-logic/model/organization/organizationGetTagsResponse.ts index 83a02051..241e9e57 100644 --- a/src/app/business-logic/model/organization/organizationGetTagsResponse.ts +++ b/src/app/business-logic/model/organization/organizationGetTagsResponse.ts @@ -2,7 +2,7 @@ * organization * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.8 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/metricVariantResult.ts b/src/app/business-logic/model/projects/metricVariantResult.ts index 59da407c..6ea99d08 100644 --- a/src/app/business-logic/model/projects/metricVariantResult.ts +++ b/src/app/business-logic/model/projects/metricVariantResult.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/models.ts b/src/app/business-logic/model/projects/models.ts index 2110f9e0..ba0ab2d4 100644 --- a/src/app/business-logic/model/projects/models.ts +++ b/src/app/business-logic/model/projects/models.ts @@ -14,6 +14,11 @@ export * from './projectsGetByIdRequest'; export * from './projectsGetByIdResponse'; export * from './projectsGetHyperParametersRequest'; export * from './projectsGetHyperParametersResponse'; +export * from './projectsGetModelTagsRequest'; +export * from './projectsGetModelTagsResponse'; +export * from './projectsGetTaskTagsRequest'; +export * from './projectsGetTaskTagsRequestFilter'; +export * from './projectsGetTaskTagsResponse'; export * from './projectsGetUniqueMetricVariantsRequest'; export * from './projectsGetUniqueMetricVariantsResponse'; export * from './projectsUpdateRequest'; diff --git a/src/app/business-logic/model/projects/multiFieldPatternData.ts b/src/app/business-logic/model/projects/multiFieldPatternData.ts index e82e51f8..f3f798e2 100644 --- a/src/app/business-logic/model/projects/multiFieldPatternData.ts +++ b/src/app/business-logic/model/projects/multiFieldPatternData.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/project.ts b/src/app/business-logic/model/projects/project.ts index 3f6404e8..5b4a550b 100644 --- a/src/app/business-logic/model/projects/project.ts +++ b/src/app/business-logic/model/projects/project.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/projectsCreateRequest.ts b/src/app/business-logic/model/projects/projectsCreateRequest.ts index d8face30..e5ba8ff0 100644 --- a/src/app/business-logic/model/projects/projectsCreateRequest.ts +++ b/src/app/business-logic/model/projects/projectsCreateRequest.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/projectsCreateResponse.ts b/src/app/business-logic/model/projects/projectsCreateResponse.ts index 0ec6459e..2e7c430c 100644 --- a/src/app/business-logic/model/projects/projectsCreateResponse.ts +++ b/src/app/business-logic/model/projects/projectsCreateResponse.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/projectsDeleteRequest.ts b/src/app/business-logic/model/projects/projectsDeleteRequest.ts index 90f5312c..9acd8cbd 100644 --- a/src/app/business-logic/model/projects/projectsDeleteRequest.ts +++ b/src/app/business-logic/model/projects/projectsDeleteRequest.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/projectsDeleteResponse.ts b/src/app/business-logic/model/projects/projectsDeleteResponse.ts index 44d162f2..cb92082c 100644 --- a/src/app/business-logic/model/projects/projectsDeleteResponse.ts +++ b/src/app/business-logic/model/projects/projectsDeleteResponse.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/projectsGetAllExRequest.ts b/src/app/business-logic/model/projects/projectsGetAllExRequest.ts index 798738cc..1624f36a 100644 --- a/src/app/business-logic/model/projects/projectsGetAllExRequest.ts +++ b/src/app/business-logic/model/projects/projectsGetAllExRequest.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -64,6 +64,10 @@ export interface ProjectsGetAllExRequest { * Report stats include only statistics for tasks in the specified state. If Null is provided, stats for all task states will be returned. */ stats_for_state?: ProjectsGetAllExRequest.StatsForStateEnum; + /** + * Return only non-public projects + */ + non_public?: boolean; } export namespace ProjectsGetAllExRequest { export type StatsForStateEnum = 'active' | 'archived'; diff --git a/src/app/business-logic/model/projects/projectsGetAllExResponse.ts b/src/app/business-logic/model/projects/projectsGetAllExResponse.ts index b2070d75..1e44264c 100644 --- a/src/app/business-logic/model/projects/projectsGetAllExResponse.ts +++ b/src/app/business-logic/model/projects/projectsGetAllExResponse.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/projectsGetAllRequest.ts b/src/app/business-logic/model/projects/projectsGetAllRequest.ts index 20e8f307..3343a40c 100644 --- a/src/app/business-logic/model/projects/projectsGetAllRequest.ts +++ b/src/app/business-logic/model/projects/projectsGetAllRequest.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/projectsGetAllResponse.ts b/src/app/business-logic/model/projects/projectsGetAllResponse.ts index febad89c..6ef25a30 100644 --- a/src/app/business-logic/model/projects/projectsGetAllResponse.ts +++ b/src/app/business-logic/model/projects/projectsGetAllResponse.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/projectsGetAllResponseSingle.ts b/src/app/business-logic/model/projects/projectsGetAllResponseSingle.ts index 82429df6..ee8b2b8b 100644 --- a/src/app/business-logic/model/projects/projectsGetAllResponseSingle.ts +++ b/src/app/business-logic/model/projects/projectsGetAllResponseSingle.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/projectsGetByIdRequest.ts b/src/app/business-logic/model/projects/projectsGetByIdRequest.ts index 7a5ddb06..dbc4fbef 100644 --- a/src/app/business-logic/model/projects/projectsGetByIdRequest.ts +++ b/src/app/business-logic/model/projects/projectsGetByIdRequest.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/projectsGetByIdResponse.ts b/src/app/business-logic/model/projects/projectsGetByIdResponse.ts index 68b4982b..d5904bfb 100644 --- a/src/app/business-logic/model/projects/projectsGetByIdResponse.ts +++ b/src/app/business-logic/model/projects/projectsGetByIdResponse.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/projectsGetHyperParametersRequest.ts b/src/app/business-logic/model/projects/projectsGetHyperParametersRequest.ts index 4e5b1af2..e8c8c9f0 100644 --- a/src/app/business-logic/model/projects/projectsGetHyperParametersRequest.ts +++ b/src/app/business-logic/model/projects/projectsGetHyperParametersRequest.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/projectsGetHyperParametersResponse.ts b/src/app/business-logic/model/projects/projectsGetHyperParametersResponse.ts index bc59001c..7877011e 100644 --- a/src/app/business-logic/model/projects/projectsGetHyperParametersResponse.ts +++ b/src/app/business-logic/model/projects/projectsGetHyperParametersResponse.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -14,9 +14,9 @@ export interface ProjectsGetHyperParametersResponse { /** - * A list of hyper parameter names + * A list of parameter sections and names */ - parameters?: Array; + parameters?: Array; /** * Remaining results */ diff --git a/src/app/business-logic/model/projects/projectsGetUniqueMetricVariantsRequest.ts b/src/app/business-logic/model/projects/projectsGetUniqueMetricVariantsRequest.ts index 6db65f09..bd8c0d9d 100644 --- a/src/app/business-logic/model/projects/projectsGetUniqueMetricVariantsRequest.ts +++ b/src/app/business-logic/model/projects/projectsGetUniqueMetricVariantsRequest.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/projectsGetUniqueMetricVariantsResponse.ts b/src/app/business-logic/model/projects/projectsGetUniqueMetricVariantsResponse.ts index efd42aa3..1a987e4f 100644 --- a/src/app/business-logic/model/projects/projectsGetUniqueMetricVariantsResponse.ts +++ b/src/app/business-logic/model/projects/projectsGetUniqueMetricVariantsResponse.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/projectsUpdateRequest.ts b/src/app/business-logic/model/projects/projectsUpdateRequest.ts index 90b8f5fd..2dc8e935 100644 --- a/src/app/business-logic/model/projects/projectsUpdateRequest.ts +++ b/src/app/business-logic/model/projects/projectsUpdateRequest.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/projectsUpdateResponse.ts b/src/app/business-logic/model/projects/projectsUpdateResponse.ts index 390d241e..0ab16fba 100644 --- a/src/app/business-logic/model/projects/projectsUpdateResponse.ts +++ b/src/app/business-logic/model/projects/projectsUpdateResponse.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/stats.ts b/src/app/business-logic/model/projects/stats.ts index a0344110..a34f389e 100644 --- a/src/app/business-logic/model/projects/stats.ts +++ b/src/app/business-logic/model/projects/stats.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/statsStatusCount.ts b/src/app/business-logic/model/projects/statsStatusCount.ts index e2be9c7f..c30e9002 100644 --- a/src/app/business-logic/model/projects/statsStatusCount.ts +++ b/src/app/business-logic/model/projects/statsStatusCount.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/projects/statsStatusCountStatusCount.ts b/src/app/business-logic/model/projects/statsStatusCountStatusCount.ts index 1f9d820a..a6858890 100644 --- a/src/app/business-logic/model/projects/statsStatusCountStatusCount.ts +++ b/src/app/business-logic/model/projects/statsStatusCountStatusCount.ts @@ -2,7 +2,7 @@ * projects * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/entry.ts b/src/app/business-logic/model/queues/entry.ts index c6ddbd7d..be28e83e 100644 --- a/src/app/business-logic/model/queues/entry.ts +++ b/src/app/business-logic/model/queues/entry.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queue.ts b/src/app/business-logic/model/queues/queue.ts index 40e05bff..28c15d72 100644 --- a/src/app/business-logic/model/queues/queue.ts +++ b/src/app/business-logic/model/queues/queue.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queueMetrics.ts b/src/app/business-logic/model/queues/queueMetrics.ts index fadcfa06..0d02d0d0 100644 --- a/src/app/business-logic/model/queues/queueMetrics.ts +++ b/src/app/business-logic/model/queues/queueMetrics.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesAddTaskRequest.ts b/src/app/business-logic/model/queues/queuesAddTaskRequest.ts index 51ddf891..ed2c056c 100644 --- a/src/app/business-logic/model/queues/queuesAddTaskRequest.ts +++ b/src/app/business-logic/model/queues/queuesAddTaskRequest.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesAddTaskResponse.ts b/src/app/business-logic/model/queues/queuesAddTaskResponse.ts index 0941a8a7..90e9b017 100644 --- a/src/app/business-logic/model/queues/queuesAddTaskResponse.ts +++ b/src/app/business-logic/model/queues/queuesAddTaskResponse.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesCreateRequest.ts b/src/app/business-logic/model/queues/queuesCreateRequest.ts index 88db5942..16fc523c 100644 --- a/src/app/business-logic/model/queues/queuesCreateRequest.ts +++ b/src/app/business-logic/model/queues/queuesCreateRequest.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesCreateResponse.ts b/src/app/business-logic/model/queues/queuesCreateResponse.ts index db42559c..6b23e971 100644 --- a/src/app/business-logic/model/queues/queuesCreateResponse.ts +++ b/src/app/business-logic/model/queues/queuesCreateResponse.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesDeleteRequest.ts b/src/app/business-logic/model/queues/queuesDeleteRequest.ts index 27b83fb5..ed806fd8 100644 --- a/src/app/business-logic/model/queues/queuesDeleteRequest.ts +++ b/src/app/business-logic/model/queues/queuesDeleteRequest.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesDeleteResponse.ts b/src/app/business-logic/model/queues/queuesDeleteResponse.ts index 26fda13c..17eaca13 100644 --- a/src/app/business-logic/model/queues/queuesDeleteResponse.ts +++ b/src/app/business-logic/model/queues/queuesDeleteResponse.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesGetAllExRequest.ts b/src/app/business-logic/model/queues/queuesGetAllExRequest.ts index 297170cd..65ac7af7 100644 --- a/src/app/business-logic/model/queues/queuesGetAllExRequest.ts +++ b/src/app/business-logic/model/queues/queuesGetAllExRequest.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesGetAllExResponse.ts b/src/app/business-logic/model/queues/queuesGetAllExResponse.ts index ebe4e633..72ec384f 100644 --- a/src/app/business-logic/model/queues/queuesGetAllExResponse.ts +++ b/src/app/business-logic/model/queues/queuesGetAllExResponse.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesGetAllRequest.ts b/src/app/business-logic/model/queues/queuesGetAllRequest.ts index a2602158..6e72daf4 100644 --- a/src/app/business-logic/model/queues/queuesGetAllRequest.ts +++ b/src/app/business-logic/model/queues/queuesGetAllRequest.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesGetAllResponse.ts b/src/app/business-logic/model/queues/queuesGetAllResponse.ts index 213a0bf8..92f5e13f 100644 --- a/src/app/business-logic/model/queues/queuesGetAllResponse.ts +++ b/src/app/business-logic/model/queues/queuesGetAllResponse.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesGetByIdRequest.ts b/src/app/business-logic/model/queues/queuesGetByIdRequest.ts index 3907edc0..fb172c49 100644 --- a/src/app/business-logic/model/queues/queuesGetByIdRequest.ts +++ b/src/app/business-logic/model/queues/queuesGetByIdRequest.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesGetByIdResponse.ts b/src/app/business-logic/model/queues/queuesGetByIdResponse.ts index 5956aaae..3ccffc39 100644 --- a/src/app/business-logic/model/queues/queuesGetByIdResponse.ts +++ b/src/app/business-logic/model/queues/queuesGetByIdResponse.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesGetDefaultResponse.ts b/src/app/business-logic/model/queues/queuesGetDefaultResponse.ts index d4b2f5fe..9b7ce82f 100644 --- a/src/app/business-logic/model/queues/queuesGetDefaultResponse.ts +++ b/src/app/business-logic/model/queues/queuesGetDefaultResponse.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesGetNextTaskRequest.ts b/src/app/business-logic/model/queues/queuesGetNextTaskRequest.ts index 60643c96..1531e097 100644 --- a/src/app/business-logic/model/queues/queuesGetNextTaskRequest.ts +++ b/src/app/business-logic/model/queues/queuesGetNextTaskRequest.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesGetNextTaskResponse.ts b/src/app/business-logic/model/queues/queuesGetNextTaskResponse.ts index 0a392989..ea92ce2d 100644 --- a/src/app/business-logic/model/queues/queuesGetNextTaskResponse.ts +++ b/src/app/business-logic/model/queues/queuesGetNextTaskResponse.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesGetQueueMetricsRequest.ts b/src/app/business-logic/model/queues/queuesGetQueueMetricsRequest.ts index 7c8c81d3..b0209345 100644 --- a/src/app/business-logic/model/queues/queuesGetQueueMetricsRequest.ts +++ b/src/app/business-logic/model/queues/queuesGetQueueMetricsRequest.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesGetQueueMetricsResponse.ts b/src/app/business-logic/model/queues/queuesGetQueueMetricsResponse.ts index 7b502184..a6683a0e 100644 --- a/src/app/business-logic/model/queues/queuesGetQueueMetricsResponse.ts +++ b/src/app/business-logic/model/queues/queuesGetQueueMetricsResponse.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesMoveTaskBackwardRequest.ts b/src/app/business-logic/model/queues/queuesMoveTaskBackwardRequest.ts index f6bdf8af..4e7a9400 100644 --- a/src/app/business-logic/model/queues/queuesMoveTaskBackwardRequest.ts +++ b/src/app/business-logic/model/queues/queuesMoveTaskBackwardRequest.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesMoveTaskBackwardResponse.ts b/src/app/business-logic/model/queues/queuesMoveTaskBackwardResponse.ts index e5e6361b..7e0d4ab8 100644 --- a/src/app/business-logic/model/queues/queuesMoveTaskBackwardResponse.ts +++ b/src/app/business-logic/model/queues/queuesMoveTaskBackwardResponse.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesMoveTaskForwardRequest.ts b/src/app/business-logic/model/queues/queuesMoveTaskForwardRequest.ts index 63ab1648..e588c056 100644 --- a/src/app/business-logic/model/queues/queuesMoveTaskForwardRequest.ts +++ b/src/app/business-logic/model/queues/queuesMoveTaskForwardRequest.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesMoveTaskForwardResponse.ts b/src/app/business-logic/model/queues/queuesMoveTaskForwardResponse.ts index ab1ef1ea..99cdc301 100644 --- a/src/app/business-logic/model/queues/queuesMoveTaskForwardResponse.ts +++ b/src/app/business-logic/model/queues/queuesMoveTaskForwardResponse.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesMoveTaskToBackRequest.ts b/src/app/business-logic/model/queues/queuesMoveTaskToBackRequest.ts index 142d7f39..8d945a2f 100644 --- a/src/app/business-logic/model/queues/queuesMoveTaskToBackRequest.ts +++ b/src/app/business-logic/model/queues/queuesMoveTaskToBackRequest.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesMoveTaskToBackResponse.ts b/src/app/business-logic/model/queues/queuesMoveTaskToBackResponse.ts index f711d31d..d76a7485 100644 --- a/src/app/business-logic/model/queues/queuesMoveTaskToBackResponse.ts +++ b/src/app/business-logic/model/queues/queuesMoveTaskToBackResponse.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesMoveTaskToFrontRequest.ts b/src/app/business-logic/model/queues/queuesMoveTaskToFrontRequest.ts index 4873e053..0ae4edd8 100644 --- a/src/app/business-logic/model/queues/queuesMoveTaskToFrontRequest.ts +++ b/src/app/business-logic/model/queues/queuesMoveTaskToFrontRequest.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesMoveTaskToFrontResponse.ts b/src/app/business-logic/model/queues/queuesMoveTaskToFrontResponse.ts index 1ff1c5ca..51453a9f 100644 --- a/src/app/business-logic/model/queues/queuesMoveTaskToFrontResponse.ts +++ b/src/app/business-logic/model/queues/queuesMoveTaskToFrontResponse.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesRemoveTaskRequest.ts b/src/app/business-logic/model/queues/queuesRemoveTaskRequest.ts index 7b11526d..3fe82a16 100644 --- a/src/app/business-logic/model/queues/queuesRemoveTaskRequest.ts +++ b/src/app/business-logic/model/queues/queuesRemoveTaskRequest.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesRemoveTaskResponse.ts b/src/app/business-logic/model/queues/queuesRemoveTaskResponse.ts index d268a0a2..a7977d43 100644 --- a/src/app/business-logic/model/queues/queuesRemoveTaskResponse.ts +++ b/src/app/business-logic/model/queues/queuesRemoveTaskResponse.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesUpdateRequest.ts b/src/app/business-logic/model/queues/queuesUpdateRequest.ts index a1bd5c69..fd373836 100644 --- a/src/app/business-logic/model/queues/queuesUpdateRequest.ts +++ b/src/app/business-logic/model/queues/queuesUpdateRequest.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/queues/queuesUpdateResponse.ts b/src/app/business-logic/model/queues/queuesUpdateResponse.ts index 072b5b40..23f2feaa 100644 --- a/src/app/business-logic/model/queues/queuesUpdateResponse.ts +++ b/src/app/business-logic/model/queues/queuesUpdateResponse.ts @@ -2,7 +2,7 @@ * queues * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/server/serverConfigRequest.ts b/src/app/business-logic/model/server/serverConfigRequest.ts index 338a8fd2..03bfe641 100644 --- a/src/app/business-logic/model/server/serverConfigRequest.ts +++ b/src/app/business-logic/model/server/serverConfigRequest.ts @@ -2,7 +2,7 @@ * server * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/server/serverInfoResponse.ts b/src/app/business-logic/model/server/serverInfoResponse.ts index 94392a05..1a2d8d1d 100644 --- a/src/app/business-logic/model/server/serverInfoResponse.ts +++ b/src/app/business-logic/model/server/serverInfoResponse.ts @@ -2,7 +2,7 @@ * server * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -25,4 +25,8 @@ export interface ServerInfoResponse { * VCS commit number */ commit?: string; + /** + * Server UID + */ + uid?: string; } diff --git a/src/app/business-logic/model/server/serverReportStatsOptionRequest.ts b/src/app/business-logic/model/server/serverReportStatsOptionRequest.ts index 4b17e455..7dcdc9c0 100644 --- a/src/app/business-logic/model/server/serverReportStatsOptionRequest.ts +++ b/src/app/business-logic/model/server/serverReportStatsOptionRequest.ts @@ -2,7 +2,7 @@ * server * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/server/serverReportStatsOptionResponse.ts b/src/app/business-logic/model/server/serverReportStatsOptionResponse.ts index f727de4f..b405dc08 100644 --- a/src/app/business-logic/model/server/serverReportStatsOptionResponse.ts +++ b/src/app/business-logic/model/server/serverReportStatsOptionResponse.ts @@ -2,7 +2,7 @@ * server * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/artifact.ts b/src/app/business-logic/model/tasks/artifact.ts index b14f48e2..68d827b7 100644 --- a/src/app/business-logic/model/tasks/artifact.ts +++ b/src/app/business-logic/model/tasks/artifact.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/artifactTypeData.ts b/src/app/business-logic/model/tasks/artifactTypeData.ts index c2e71135..7bb365b7 100644 --- a/src/app/business-logic/model/tasks/artifactTypeData.ts +++ b/src/app/business-logic/model/tasks/artifactTypeData.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/execution.ts b/src/app/business-logic/model/tasks/execution.ts index b80c1ef5..66d237b7 100644 --- a/src/app/business-logic/model/tasks/execution.ts +++ b/src/app/business-logic/model/tasks/execution.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/lastMetricsEvent.ts b/src/app/business-logic/model/tasks/lastMetricsEvent.ts index 2830966f..f1aaa11c 100644 --- a/src/app/business-logic/model/tasks/lastMetricsEvent.ts +++ b/src/app/business-logic/model/tasks/lastMetricsEvent.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/models.ts b/src/app/business-logic/model/tasks/models.ts index 88358b7e..d81b9b10 100644 --- a/src/app/business-logic/model/tasks/models.ts +++ b/src/app/business-logic/model/tasks/models.ts @@ -1,9 +1,13 @@ export * from './artifact'; export * from './artifactTypeData'; +export * from './configurationItem'; export * from './execution'; export * from './lastMetricsEvent'; export * from './multiFieldPatternData'; export * from './output'; +export * from './paramKey'; +export * from './paramsItem'; +export * from './replaceHyperparamsEnum'; export * from './script'; export * from './task'; export * from './taskStatusEnum'; @@ -18,10 +22,18 @@ export * from './tasksCompletedRequest'; export * from './tasksCompletedResponse'; export * from './tasksCreateRequest'; export * from './tasksCreateResponse'; +export * from './tasksDeleteConfigurationRequest'; +export * from './tasksDeleteConfigurationResponse'; +export * from './tasksDeleteHyperParamsRequest'; +export * from './tasksDeleteHyperParamsResponse'; export * from './tasksDeleteRequest'; export * from './tasksDeleteResponse'; export * from './tasksDequeueRequest'; export * from './tasksDequeueResponse'; +export * from './tasksEditConfigurationRequest'; +export * from './tasksEditConfigurationResponse'; +export * from './tasksEditHyperParamsRequest'; +export * from './tasksEditHyperParamsResponse'; export * from './tasksEditRequest'; export * from './tasksEditResponse'; export * from './tasksEnqueueRequest'; @@ -34,6 +46,14 @@ export * from './tasksGetAllRequest'; export * from './tasksGetAllResponse'; export * from './tasksGetByIdRequest'; export * from './tasksGetByIdResponse'; +export * from './tasksGetConfigurationNamesRequest'; +export * from './tasksGetConfigurationNamesResponse'; +export * from './tasksGetConfigurationsRequest'; +export * from './tasksGetConfigurationsResponse'; +export * from './tasksGetHyperParamsRequest'; +export * from './tasksGetHyperParamsResponse'; +export * from './tasksGetTypesRequest'; +export * from './tasksGetTypesResponse'; export * from './tasksPingRequest'; export * from './tasksPublishRequest'; export * from './tasksPublishResponse'; diff --git a/src/app/business-logic/model/tasks/multiFieldPatternData.ts b/src/app/business-logic/model/tasks/multiFieldPatternData.ts index 4ee4e613..6b2b60c0 100644 --- a/src/app/business-logic/model/tasks/multiFieldPatternData.ts +++ b/src/app/business-logic/model/tasks/multiFieldPatternData.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/output.ts b/src/app/business-logic/model/tasks/output.ts index 6e4028b1..600af7f1 100644 --- a/src/app/business-logic/model/tasks/output.ts +++ b/src/app/business-logic/model/tasks/output.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/script.ts b/src/app/business-logic/model/tasks/script.ts index c8b117f9..92bdc393 100644 --- a/src/app/business-logic/model/tasks/script.ts +++ b/src/app/business-logic/model/tasks/script.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/task.ts b/src/app/business-logic/model/tasks/task.ts index ea968ce1..987d9d97 100644 --- a/src/app/business-logic/model/tasks/task.ts +++ b/src/app/business-logic/model/tasks/task.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -10,9 +10,11 @@ * Do not edit the class manually. */ +import { ConfigurationItem } from './configurationItem'; import { Execution } from './execution'; import { LastMetricsEvent } from './lastMetricsEvent'; import { Output } from './output'; +import { ParamsItem } from './paramsItem'; import { Script } from './script'; import { TaskStatusEnum } from './taskStatusEnum'; import { TaskTypeEnum } from './taskTypeEnum'; @@ -108,4 +110,12 @@ export interface Task { * Last metric variants (hash to events), one for each metric hash */ last_metrics?: { [key: string]: any; }; + /** + * Task hyper params per section + */ + hyperparams?: { [key: string]: any; }; + /** + * Task configuration params + */ + configuration?: { [key: string]: ConfigurationItem; }; } diff --git a/src/app/business-logic/model/tasks/taskStatusEnum.ts b/src/app/business-logic/model/tasks/taskStatusEnum.ts index 0dc8e718..06db753e 100644 --- a/src/app/business-logic/model/tasks/taskStatusEnum.ts +++ b/src/app/business-logic/model/tasks/taskStatusEnum.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/taskTypeEnum.ts b/src/app/business-logic/model/tasks/taskTypeEnum.ts index 774301c3..706bddd9 100644 --- a/src/app/business-logic/model/tasks/taskTypeEnum.ts +++ b/src/app/business-logic/model/tasks/taskTypeEnum.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -12,9 +12,18 @@ -export type TaskTypeEnum = 'training' | 'testing'; +export type TaskTypeEnum = 'training' | 'testing' | 'inference' | 'data_processing' | 'application' | 'monitor' | 'controller' | 'optimizer' | 'service' | 'qc' | 'custom'; export const TaskTypeEnum = { Training: 'training' as TaskTypeEnum, - Testing: 'testing' as TaskTypeEnum + Testing: 'testing' as TaskTypeEnum, + Inference: 'inference' as TaskTypeEnum, + DataProcessing: 'data_processing' as TaskTypeEnum, + Application: 'application' as TaskTypeEnum, + Monitor: 'monitor' as TaskTypeEnum, + Controller: 'controller' as TaskTypeEnum, + Optimizer: 'optimizer' as TaskTypeEnum, + Service: 'service' as TaskTypeEnum, + Qc: 'qc' as TaskTypeEnum, + Custom: 'custom' as TaskTypeEnum } diff --git a/src/app/business-logic/model/tasks/tasksAddOrUpdateArtifactsRequest.ts b/src/app/business-logic/model/tasks/tasksAddOrUpdateArtifactsRequest.ts index 2886716d..319eca6c 100644 --- a/src/app/business-logic/model/tasks/tasksAddOrUpdateArtifactsRequest.ts +++ b/src/app/business-logic/model/tasks/tasksAddOrUpdateArtifactsRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksAddOrUpdateArtifactsResponse.ts b/src/app/business-logic/model/tasks/tasksAddOrUpdateArtifactsResponse.ts index db0f46a9..b20fc3b4 100644 --- a/src/app/business-logic/model/tasks/tasksAddOrUpdateArtifactsResponse.ts +++ b/src/app/business-logic/model/tasks/tasksAddOrUpdateArtifactsResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksCloneRequest.ts b/src/app/business-logic/model/tasks/tasksCloneRequest.ts index f2871862..57231b67 100644 --- a/src/app/business-logic/model/tasks/tasksCloneRequest.ts +++ b/src/app/business-logic/model/tasks/tasksCloneRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -10,7 +10,9 @@ * Do not edit the class manually. */ +import { ConfigurationItem } from './configurationItem'; import { Execution } from './execution'; +import { ParamsItem } from './paramsItem'; export interface TasksCloneRequest { @@ -42,5 +44,17 @@ export interface TasksCloneRequest { * The project of the cloned task. If not provided then taken from the original task */ new_task_project?: string; + /** + * The hyper params for the new task. If not provided then taken from the original task + */ + new_task_hyperparams?: { [key: string]: any; }; + /** + * The configuration for the new task. If not provided then taken from the original task + */ + new_task_configuration?: { [key: string]: ConfigurationItem; }; execution_overrides?: Execution; + /** + * If set to \'false\' then the task fields that are copied from the original task are not validated. The default is false. + */ + validate_references?: boolean; } diff --git a/src/app/business-logic/model/tasks/tasksCloneResponse.ts b/src/app/business-logic/model/tasks/tasksCloneResponse.ts index e86ee55d..f425c3c4 100644 --- a/src/app/business-logic/model/tasks/tasksCloneResponse.ts +++ b/src/app/business-logic/model/tasks/tasksCloneResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksCloseRequest.ts b/src/app/business-logic/model/tasks/tasksCloseRequest.ts index b1080ffa..2fec5c7f 100644 --- a/src/app/business-logic/model/tasks/tasksCloseRequest.ts +++ b/src/app/business-logic/model/tasks/tasksCloseRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksCloseResponse.ts b/src/app/business-logic/model/tasks/tasksCloseResponse.ts index 1262664a..0eafd8a6 100644 --- a/src/app/business-logic/model/tasks/tasksCloseResponse.ts +++ b/src/app/business-logic/model/tasks/tasksCloseResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksCompletedRequest.ts b/src/app/business-logic/model/tasks/tasksCompletedRequest.ts index a971059e..d64e0d03 100644 --- a/src/app/business-logic/model/tasks/tasksCompletedRequest.ts +++ b/src/app/business-logic/model/tasks/tasksCompletedRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksCompletedResponse.ts b/src/app/business-logic/model/tasks/tasksCompletedResponse.ts index b831b4aa..7c73ff6c 100644 --- a/src/app/business-logic/model/tasks/tasksCompletedResponse.ts +++ b/src/app/business-logic/model/tasks/tasksCompletedResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksCreateRequest.ts b/src/app/business-logic/model/tasks/tasksCreateRequest.ts index 953c7d8a..271378e5 100644 --- a/src/app/business-logic/model/tasks/tasksCreateRequest.ts +++ b/src/app/business-logic/model/tasks/tasksCreateRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -10,7 +10,9 @@ * Do not edit the class manually. */ +import { ConfigurationItem } from './configurationItem'; import { Execution } from './execution'; +import { ParamsItem } from './paramsItem'; import { Script } from './script'; import { TaskTypeEnum } from './taskTypeEnum'; @@ -47,4 +49,12 @@ export interface TasksCreateRequest { output_dest?: string; execution?: Execution; script?: Script; + /** + * Task hyper params per section + */ + hyperparams?: { [key: string]: any; }; + /** + * Task configuration params + */ + configuration?: { [key: string]: ConfigurationItem; }; } diff --git a/src/app/business-logic/model/tasks/tasksCreateResponse.ts b/src/app/business-logic/model/tasks/tasksCreateResponse.ts index 1ade117e..f932cb25 100644 --- a/src/app/business-logic/model/tasks/tasksCreateResponse.ts +++ b/src/app/business-logic/model/tasks/tasksCreateResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksDeleteRequest.ts b/src/app/business-logic/model/tasks/tasksDeleteRequest.ts index fe697603..f1d56b57 100644 --- a/src/app/business-logic/model/tasks/tasksDeleteRequest.ts +++ b/src/app/business-logic/model/tasks/tasksDeleteRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksDeleteResponse.ts b/src/app/business-logic/model/tasks/tasksDeleteResponse.ts index bef20d19..25c4b711 100644 --- a/src/app/business-logic/model/tasks/tasksDeleteResponse.ts +++ b/src/app/business-logic/model/tasks/tasksDeleteResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksDequeueRequest.ts b/src/app/business-logic/model/tasks/tasksDequeueRequest.ts index 1d294382..a9114168 100644 --- a/src/app/business-logic/model/tasks/tasksDequeueRequest.ts +++ b/src/app/business-logic/model/tasks/tasksDequeueRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksDequeueResponse.ts b/src/app/business-logic/model/tasks/tasksDequeueResponse.ts index eea2c360..ceab7ba2 100644 --- a/src/app/business-logic/model/tasks/tasksDequeueResponse.ts +++ b/src/app/business-logic/model/tasks/tasksDequeueResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksEditRequest.ts b/src/app/business-logic/model/tasks/tasksEditRequest.ts index 92530196..9a84af73 100644 --- a/src/app/business-logic/model/tasks/tasksEditRequest.ts +++ b/src/app/business-logic/model/tasks/tasksEditRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -10,7 +10,9 @@ * Do not edit the class manually. */ +import { ConfigurationItem } from './configurationItem'; import { Execution } from './execution'; +import { ParamsItem } from './paramsItem'; import { Script } from './script'; import { TaskTypeEnum } from './taskTypeEnum'; @@ -54,5 +56,13 @@ export interface TasksEditRequest { */ output_dest?: string; execution?: Execution; + /** + * Task hyper params per section + */ + hyperparams?: { [key: string]: any; }; + /** + * Task configuration params + */ + configuration?: { [key: string]: ConfigurationItem; }; script?: Script; } diff --git a/src/app/business-logic/model/tasks/tasksEditResponse.ts b/src/app/business-logic/model/tasks/tasksEditResponse.ts index 928467bf..961198f6 100644 --- a/src/app/business-logic/model/tasks/tasksEditResponse.ts +++ b/src/app/business-logic/model/tasks/tasksEditResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksEnqueueRequest.ts b/src/app/business-logic/model/tasks/tasksEnqueueRequest.ts index 9d3e5c0d..1e31ed68 100644 --- a/src/app/business-logic/model/tasks/tasksEnqueueRequest.ts +++ b/src/app/business-logic/model/tasks/tasksEnqueueRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksEnqueueResponse.ts b/src/app/business-logic/model/tasks/tasksEnqueueResponse.ts index 022a4350..8d8f94f8 100644 --- a/src/app/business-logic/model/tasks/tasksEnqueueResponse.ts +++ b/src/app/business-logic/model/tasks/tasksEnqueueResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksFailedRequest.ts b/src/app/business-logic/model/tasks/tasksFailedRequest.ts index 8929aa34..183eb53e 100644 --- a/src/app/business-logic/model/tasks/tasksFailedRequest.ts +++ b/src/app/business-logic/model/tasks/tasksFailedRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksFailedResponse.ts b/src/app/business-logic/model/tasks/tasksFailedResponse.ts index 658bcb26..bb07c2c8 100644 --- a/src/app/business-logic/model/tasks/tasksFailedResponse.ts +++ b/src/app/business-logic/model/tasks/tasksFailedResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksGetAllExRequest.ts b/src/app/business-logic/model/tasks/tasksGetAllExRequest.ts index b326a01d..5a0d9d7e 100644 --- a/src/app/business-logic/model/tasks/tasksGetAllExRequest.ts +++ b/src/app/business-logic/model/tasks/tasksGetAllExRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -40,7 +40,7 @@ export interface TasksGetAllExRequest { */ page_size?: number; /** - * List of field names to order by. When search_text is used, \'@text_score\' can be used as a field representing the text score of returned documents. Use \'-\' prefix to specify descending order. Optional, recommended when using page + * List of field names to order by. When search_text is used, \'@text_score\' can be used as a field representing the text score of returned documents. Use \'-\' prefix to specify descending order. Optional, recommended when using page. If the first order field is a hyper parameter or metric then string values are ordered according to numeric ordering rules where applicable */ order_by?: Array; /** diff --git a/src/app/business-logic/model/tasks/tasksGetAllExResponse.ts b/src/app/business-logic/model/tasks/tasksGetAllExResponse.ts index a77c57a1..85383b87 100644 --- a/src/app/business-logic/model/tasks/tasksGetAllExResponse.ts +++ b/src/app/business-logic/model/tasks/tasksGetAllExResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksGetAllRequest.ts b/src/app/business-logic/model/tasks/tasksGetAllRequest.ts index ccc79bb5..5dfc8416 100644 --- a/src/app/business-logic/model/tasks/tasksGetAllRequest.ts +++ b/src/app/business-logic/model/tasks/tasksGetAllRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -40,7 +40,7 @@ export interface TasksGetAllRequest { */ page_size?: number; /** - * List of field names to order by. When search_text is used, \'@text_score\' can be used as a field representing the text score of returned documents. Use \'-\' prefix to specify descending order. Optional, recommended when using page + * List of field names to order by. When search_text is used, \'@text_score\' can be used as a field representing the text score of returned documents. Use \'-\' prefix to specify descending order. Optional, recommended when using page. If the first order field is a hyper parameter or metric then string values are ordered according to numeric ordering rules where applicable */ order_by?: Array; /** diff --git a/src/app/business-logic/model/tasks/tasksGetAllResponse.ts b/src/app/business-logic/model/tasks/tasksGetAllResponse.ts index 95711abf..661b506a 100644 --- a/src/app/business-logic/model/tasks/tasksGetAllResponse.ts +++ b/src/app/business-logic/model/tasks/tasksGetAllResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksGetByIdRequest.ts b/src/app/business-logic/model/tasks/tasksGetByIdRequest.ts index 70313d77..b013373a 100644 --- a/src/app/business-logic/model/tasks/tasksGetByIdRequest.ts +++ b/src/app/business-logic/model/tasks/tasksGetByIdRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksGetByIdResponse.ts b/src/app/business-logic/model/tasks/tasksGetByIdResponse.ts index 4f65bb68..f41d664c 100644 --- a/src/app/business-logic/model/tasks/tasksGetByIdResponse.ts +++ b/src/app/business-logic/model/tasks/tasksGetByIdResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksGetTypesRequest.ts b/src/app/business-logic/model/tasks/tasksGetTypesRequest.ts index ddb53d42..7f569cc9 100644 --- a/src/app/business-logic/model/tasks/tasksGetTypesRequest.ts +++ b/src/app/business-logic/model/tasks/tasksGetTypesRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.8 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksGetTypesResponse.ts b/src/app/business-logic/model/tasks/tasksGetTypesResponse.ts index 5f69e6a5..2e00d831 100644 --- a/src/app/business-logic/model/tasks/tasksGetTypesResponse.ts +++ b/src/app/business-logic/model/tasks/tasksGetTypesResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.8 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksPingRequest.ts b/src/app/business-logic/model/tasks/tasksPingRequest.ts index da66f340..3ae7d39a 100644 --- a/src/app/business-logic/model/tasks/tasksPingRequest.ts +++ b/src/app/business-logic/model/tasks/tasksPingRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksPublishRequest.ts b/src/app/business-logic/model/tasks/tasksPublishRequest.ts index 3b2a2594..cd94658b 100644 --- a/src/app/business-logic/model/tasks/tasksPublishRequest.ts +++ b/src/app/business-logic/model/tasks/tasksPublishRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksPublishResponse.ts b/src/app/business-logic/model/tasks/tasksPublishResponse.ts index d4ad0524..71f458c1 100644 --- a/src/app/business-logic/model/tasks/tasksPublishResponse.ts +++ b/src/app/business-logic/model/tasks/tasksPublishResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksResetRequest.ts b/src/app/business-logic/model/tasks/tasksResetRequest.ts index 2e05a93e..f90b086d 100644 --- a/src/app/business-logic/model/tasks/tasksResetRequest.ts +++ b/src/app/business-logic/model/tasks/tasksResetRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -17,6 +17,10 @@ export interface TasksResetRequest { * If not true, call fails if the task status is \'completed\' */ force?: boolean; + /** + * Clear script and execution sections completely + */ + clear_all?: boolean; /** * Task ID */ diff --git a/src/app/business-logic/model/tasks/tasksResetResponse.ts b/src/app/business-logic/model/tasks/tasksResetResponse.ts index 31e063b5..4ec1d351 100644 --- a/src/app/business-logic/model/tasks/tasksResetResponse.ts +++ b/src/app/business-logic/model/tasks/tasksResetResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksSetRequirementsRequest.ts b/src/app/business-logic/model/tasks/tasksSetRequirementsRequest.ts index f991445c..f8d04fe9 100644 --- a/src/app/business-logic/model/tasks/tasksSetRequirementsRequest.ts +++ b/src/app/business-logic/model/tasks/tasksSetRequirementsRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksSetRequirementsResponse.ts b/src/app/business-logic/model/tasks/tasksSetRequirementsResponse.ts index 95cc0d64..1c7011d8 100644 --- a/src/app/business-logic/model/tasks/tasksSetRequirementsResponse.ts +++ b/src/app/business-logic/model/tasks/tasksSetRequirementsResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksStartedRequest.ts b/src/app/business-logic/model/tasks/tasksStartedRequest.ts index 1002be3e..badc059d 100644 --- a/src/app/business-logic/model/tasks/tasksStartedRequest.ts +++ b/src/app/business-logic/model/tasks/tasksStartedRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksStartedResponse.ts b/src/app/business-logic/model/tasks/tasksStartedResponse.ts index b8809c35..7de51e6d 100644 --- a/src/app/business-logic/model/tasks/tasksStartedResponse.ts +++ b/src/app/business-logic/model/tasks/tasksStartedResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksStopRequest.ts b/src/app/business-logic/model/tasks/tasksStopRequest.ts index 02112e81..29dd638b 100644 --- a/src/app/business-logic/model/tasks/tasksStopRequest.ts +++ b/src/app/business-logic/model/tasks/tasksStopRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksStopResponse.ts b/src/app/business-logic/model/tasks/tasksStopResponse.ts index 38eb7441..ed70ca7d 100644 --- a/src/app/business-logic/model/tasks/tasksStopResponse.ts +++ b/src/app/business-logic/model/tasks/tasksStopResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksStoppedRequest.ts b/src/app/business-logic/model/tasks/tasksStoppedRequest.ts index 41d199c1..c8a2437a 100644 --- a/src/app/business-logic/model/tasks/tasksStoppedRequest.ts +++ b/src/app/business-logic/model/tasks/tasksStoppedRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksStoppedResponse.ts b/src/app/business-logic/model/tasks/tasksStoppedResponse.ts index cb4da04a..606ea77e 100644 --- a/src/app/business-logic/model/tasks/tasksStoppedResponse.ts +++ b/src/app/business-logic/model/tasks/tasksStoppedResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksUpdateBatchResponse.ts b/src/app/business-logic/model/tasks/tasksUpdateBatchResponse.ts index 7ea6c8fa..95366ad3 100644 --- a/src/app/business-logic/model/tasks/tasksUpdateBatchResponse.ts +++ b/src/app/business-logic/model/tasks/tasksUpdateBatchResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksUpdateRequest.ts b/src/app/business-logic/model/tasks/tasksUpdateRequest.ts index 32a6c55c..17e95e44 100644 --- a/src/app/business-logic/model/tasks/tasksUpdateRequest.ts +++ b/src/app/business-logic/model/tasks/tasksUpdateRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksUpdateResponse.ts b/src/app/business-logic/model/tasks/tasksUpdateResponse.ts index 3f8eb82f..0f253b45 100644 --- a/src/app/business-logic/model/tasks/tasksUpdateResponse.ts +++ b/src/app/business-logic/model/tasks/tasksUpdateResponse.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/tasks/tasksValidateRequest.ts b/src/app/business-logic/model/tasks/tasksValidateRequest.ts index d8ceb638..0cff9b59 100644 --- a/src/app/business-logic/model/tasks/tasksValidateRequest.ts +++ b/src/app/business-logic/model/tasks/tasksValidateRequest.ts @@ -2,7 +2,7 @@ * tasks * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -10,7 +10,9 @@ * Do not edit the class manually. */ +import { ConfigurationItem } from './configurationItem'; import { Execution } from './execution'; +import { ParamsItem } from './paramsItem'; import { Script } from './script'; import { TaskTypeEnum } from './taskTypeEnum'; @@ -46,5 +48,13 @@ export interface TasksValidateRequest { */ output_dest?: string; execution?: Execution; + /** + * Task hyper params per section + */ + hyperparams?: { [key: string]: any; }; + /** + * Task configuration params + */ + configuration?: { [key: string]: ConfigurationItem; }; script?: Script; } diff --git a/src/app/business-logic/model/users/getCurrentUserResponseUserObject.ts b/src/app/business-logic/model/users/getCurrentUserResponseUserObject.ts index 355e0da5..715bcb1c 100644 --- a/src/app/business-logic/model/users/getCurrentUserResponseUserObject.ts +++ b/src/app/business-logic/model/users/getCurrentUserResponseUserObject.ts @@ -2,7 +2,7 @@ * users * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/users/getCurrentUserResponseUserObjectCompany.ts b/src/app/business-logic/model/users/getCurrentUserResponseUserObjectCompany.ts index 440910d6..81fce563 100644 --- a/src/app/business-logic/model/users/getCurrentUserResponseUserObjectCompany.ts +++ b/src/app/business-logic/model/users/getCurrentUserResponseUserObjectCompany.ts @@ -2,7 +2,7 @@ * users * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/users/user.ts b/src/app/business-logic/model/users/user.ts index 062b1435..d833a3d8 100644 --- a/src/app/business-logic/model/users/user.ts +++ b/src/app/business-logic/model/users/user.ts @@ -2,7 +2,7 @@ * users * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/users/usersCreateRequest.ts b/src/app/business-logic/model/users/usersCreateRequest.ts index 06afb448..4670aaf7 100644 --- a/src/app/business-logic/model/users/usersCreateRequest.ts +++ b/src/app/business-logic/model/users/usersCreateRequest.ts @@ -2,7 +2,7 @@ * users * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/users/usersDeleteRequest.ts b/src/app/business-logic/model/users/usersDeleteRequest.ts index 66436533..d5a0c503 100644 --- a/src/app/business-logic/model/users/usersDeleteRequest.ts +++ b/src/app/business-logic/model/users/usersDeleteRequest.ts @@ -2,7 +2,7 @@ * users * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/users/usersGetAllExRequest.ts b/src/app/business-logic/model/users/usersGetAllExRequest.ts index 90f32a9c..b65d0dcd 100644 --- a/src/app/business-logic/model/users/usersGetAllExRequest.ts +++ b/src/app/business-logic/model/users/usersGetAllExRequest.ts @@ -2,7 +2,7 @@ * users * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.8 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -38,7 +38,7 @@ export interface UsersGetAllExRequest { */ order_by?: Array; /** - * List of prejects that user was active in. If empty list is passed then all projects + * List of project IDs. If provided, return only users that were active in these projects. If empty list is provided, return users that were active in all projects */ active_in_projects?: Array; } diff --git a/src/app/business-logic/model/users/usersGetAllExResponse.ts b/src/app/business-logic/model/users/usersGetAllExResponse.ts index 85025caf..f2c9262b 100644 --- a/src/app/business-logic/model/users/usersGetAllExResponse.ts +++ b/src/app/business-logic/model/users/usersGetAllExResponse.ts @@ -2,7 +2,7 @@ * users * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.8 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/users/usersGetAllRequest.ts b/src/app/business-logic/model/users/usersGetAllRequest.ts index c38a2bae..ec8a6f7d 100644 --- a/src/app/business-logic/model/users/usersGetAllRequest.ts +++ b/src/app/business-logic/model/users/usersGetAllRequest.ts @@ -2,7 +2,7 @@ * users * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.8 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/users/usersGetAllResponse.ts b/src/app/business-logic/model/users/usersGetAllResponse.ts index 8ed9b414..4e500f60 100644 --- a/src/app/business-logic/model/users/usersGetAllResponse.ts +++ b/src/app/business-logic/model/users/usersGetAllResponse.ts @@ -2,7 +2,7 @@ * users * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.8 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/users/usersGetByIdRequest.ts b/src/app/business-logic/model/users/usersGetByIdRequest.ts index 5daada77..adc335af 100644 --- a/src/app/business-logic/model/users/usersGetByIdRequest.ts +++ b/src/app/business-logic/model/users/usersGetByIdRequest.ts @@ -2,7 +2,7 @@ * users * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/users/usersGetByIdResponse.ts b/src/app/business-logic/model/users/usersGetByIdResponse.ts index c3387654..4e897c9d 100644 --- a/src/app/business-logic/model/users/usersGetByIdResponse.ts +++ b/src/app/business-logic/model/users/usersGetByIdResponse.ts @@ -2,7 +2,7 @@ * users * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/users/usersGetCurrentUserResponse.ts b/src/app/business-logic/model/users/usersGetCurrentUserResponse.ts index 2761519a..72a3e5aa 100644 --- a/src/app/business-logic/model/users/usersGetCurrentUserResponse.ts +++ b/src/app/business-logic/model/users/usersGetCurrentUserResponse.ts @@ -2,7 +2,7 @@ * users * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/users/usersGetPreferencesResponse.ts b/src/app/business-logic/model/users/usersGetPreferencesResponse.ts index 8481e2f5..4de6e78f 100644 --- a/src/app/business-logic/model/users/usersGetPreferencesResponse.ts +++ b/src/app/business-logic/model/users/usersGetPreferencesResponse.ts @@ -2,7 +2,7 @@ * users * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/users/usersSetPreferencesRequest.ts b/src/app/business-logic/model/users/usersSetPreferencesRequest.ts index 6a6b4b9e..7dd6ae0e 100644 --- a/src/app/business-logic/model/users/usersSetPreferencesRequest.ts +++ b/src/app/business-logic/model/users/usersSetPreferencesRequest.ts @@ -2,7 +2,7 @@ * users * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/users/usersSetPreferencesResponse.ts b/src/app/business-logic/model/users/usersSetPreferencesResponse.ts index d6553ef1..428fb8a9 100644 --- a/src/app/business-logic/model/users/usersSetPreferencesResponse.ts +++ b/src/app/business-logic/model/users/usersSetPreferencesResponse.ts @@ -2,7 +2,7 @@ * users * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/users/usersUpdateRequest.ts b/src/app/business-logic/model/users/usersUpdateRequest.ts index 9fb485e3..1cc09cec 100644 --- a/src/app/business-logic/model/users/usersUpdateRequest.ts +++ b/src/app/business-logic/model/users/usersUpdateRequest.ts @@ -2,7 +2,7 @@ * users * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/users/usersUpdateResponse.ts b/src/app/business-logic/model/users/usersUpdateResponse.ts index e1eaabac..30049adc 100644 --- a/src/app/business-logic/model/users/usersUpdateResponse.ts +++ b/src/app/business-logic/model/users/usersUpdateResponse.ts @@ -2,7 +2,7 @@ * users * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/workers/activitySeries.ts b/src/app/business-logic/model/workers/activitySeries.ts index 48f7e338..35fee279 100644 --- a/src/app/business-logic/model/workers/activitySeries.ts +++ b/src/app/business-logic/model/workers/activitySeries.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/workers/aggregationStats.ts b/src/app/business-logic/model/workers/aggregationStats.ts index 07a3571b..ad13ba25 100644 --- a/src/app/business-logic/model/workers/aggregationStats.ts +++ b/src/app/business-logic/model/workers/aggregationStats.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/workers/aggregationType.ts b/src/app/business-logic/model/workers/aggregationType.ts index 61301af7..a1f41f79 100644 --- a/src/app/business-logic/model/workers/aggregationType.ts +++ b/src/app/business-logic/model/workers/aggregationType.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/workers/currentTaskEntry.ts b/src/app/business-logic/model/workers/currentTaskEntry.ts index a64b067e..a614c60b 100644 --- a/src/app/business-logic/model/workers/currentTaskEntry.ts +++ b/src/app/business-logic/model/workers/currentTaskEntry.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -14,11 +14,11 @@ export interface CurrentTaskEntry { /** - * Worker ID + * ID */ id?: string; /** - * Worker name + * Name */ name?: string; /** diff --git a/src/app/business-logic/model/workers/idNameEntry.ts b/src/app/business-logic/model/workers/idNameEntry.ts index 290f856a..1d5965be 100644 --- a/src/app/business-logic/model/workers/idNameEntry.ts +++ b/src/app/business-logic/model/workers/idNameEntry.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -14,11 +14,11 @@ export interface IdNameEntry { /** - * Worker ID + * ID */ id?: string; /** - * Worker name + * Name */ name?: string; } diff --git a/src/app/business-logic/model/workers/machineStats.ts b/src/app/business-logic/model/workers/machineStats.ts index a1d7dd7e..9e0c4ac6 100644 --- a/src/app/business-logic/model/workers/machineStats.ts +++ b/src/app/business-logic/model/workers/machineStats.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/workers/metricStats.ts b/src/app/business-logic/model/workers/metricStats.ts index baaf8a3e..a89fe967 100644 --- a/src/app/business-logic/model/workers/metricStats.ts +++ b/src/app/business-logic/model/workers/metricStats.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/workers/metricsCategory.ts b/src/app/business-logic/model/workers/metricsCategory.ts index 8e2a3055..11d16c65 100644 --- a/src/app/business-logic/model/workers/metricsCategory.ts +++ b/src/app/business-logic/model/workers/metricsCategory.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/workers/queueEntry.ts b/src/app/business-logic/model/workers/queueEntry.ts index b2472f00..37bff4b5 100644 --- a/src/app/business-logic/model/workers/queueEntry.ts +++ b/src/app/business-logic/model/workers/queueEntry.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -15,11 +15,11 @@ import { IdNameEntry } from './idNameEntry'; export interface QueueEntry { /** - * Worker ID + * ID */ id?: string; /** - * Worker name + * Name */ name?: string; next_task?: IdNameEntry; diff --git a/src/app/business-logic/model/workers/statItem.ts b/src/app/business-logic/model/workers/statItem.ts index d88066a3..8ac6dddf 100644 --- a/src/app/business-logic/model/workers/statItem.ts +++ b/src/app/business-logic/model/workers/statItem.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/workers/worker.ts b/src/app/business-logic/model/workers/worker.ts index 59e061d9..53fc3cbe 100644 --- a/src/app/business-logic/model/workers/worker.ts +++ b/src/app/business-logic/model/workers/worker.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -39,6 +39,7 @@ export interface Worker { */ last_report_time?: Date; task?: CurrentTaskEntry; + project?: IdNameEntry; queue?: QueueEntry; /** * List of queues on which the worker is listening diff --git a/src/app/business-logic/model/workers/workerStats.ts b/src/app/business-logic/model/workers/workerStats.ts index 921b42ef..895715fc 100644 --- a/src/app/business-logic/model/workers/workerStats.ts +++ b/src/app/business-logic/model/workers/workerStats.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/workers/workersGetActivityReportRequest.ts b/src/app/business-logic/model/workers/workersGetActivityReportRequest.ts index 74198987..5b5649b1 100644 --- a/src/app/business-logic/model/workers/workersGetActivityReportRequest.ts +++ b/src/app/business-logic/model/workers/workersGetActivityReportRequest.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/workers/workersGetActivityReportResponse.ts b/src/app/business-logic/model/workers/workersGetActivityReportResponse.ts index 7887f4d9..325a961e 100644 --- a/src/app/business-logic/model/workers/workersGetActivityReportResponse.ts +++ b/src/app/business-logic/model/workers/workersGetActivityReportResponse.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/workers/workersGetAllRequest.ts b/src/app/business-logic/model/workers/workersGetAllRequest.ts index a70d4b02..7d84433a 100644 --- a/src/app/business-logic/model/workers/workersGetAllRequest.ts +++ b/src/app/business-logic/model/workers/workersGetAllRequest.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/workers/workersGetAllResponse.ts b/src/app/business-logic/model/workers/workersGetAllResponse.ts index 9626c997..77c0e814 100644 --- a/src/app/business-logic/model/workers/workersGetAllResponse.ts +++ b/src/app/business-logic/model/workers/workersGetAllResponse.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/workers/workersGetMetricKeysRequest.ts b/src/app/business-logic/model/workers/workersGetMetricKeysRequest.ts index 0ba90ce1..9d20a434 100644 --- a/src/app/business-logic/model/workers/workersGetMetricKeysRequest.ts +++ b/src/app/business-logic/model/workers/workersGetMetricKeysRequest.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/workers/workersGetMetricKeysResponse.ts b/src/app/business-logic/model/workers/workersGetMetricKeysResponse.ts index 9b9844ce..31ac7c46 100644 --- a/src/app/business-logic/model/workers/workersGetMetricKeysResponse.ts +++ b/src/app/business-logic/model/workers/workersGetMetricKeysResponse.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/workers/workersGetStatsRequest.ts b/src/app/business-logic/model/workers/workersGetStatsRequest.ts index d20f7fc0..eebc0463 100644 --- a/src/app/business-logic/model/workers/workersGetStatsRequest.ts +++ b/src/app/business-logic/model/workers/workersGetStatsRequest.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/workers/workersGetStatsResponse.ts b/src/app/business-logic/model/workers/workersGetStatsResponse.ts index 8532de0b..db8b97cc 100644 --- a/src/app/business-logic/model/workers/workersGetStatsResponse.ts +++ b/src/app/business-logic/model/workers/workersGetStatsResponse.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/workers/workersRegisterRequest.ts b/src/app/business-logic/model/workers/workersRegisterRequest.ts index 5aabd383..d168eb3e 100644 --- a/src/app/business-logic/model/workers/workersRegisterRequest.ts +++ b/src/app/business-logic/model/workers/workersRegisterRequest.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/workers/workersStatusReportRequest.ts b/src/app/business-logic/model/workers/workersStatusReportRequest.ts index 65bac691..42e94b81 100644 --- a/src/app/business-logic/model/workers/workersStatusReportRequest.ts +++ b/src/app/business-logic/model/workers/workersStatusReportRequest.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/workers/workersUnregisterRequest.ts b/src/app/business-logic/model/workers/workersUnregisterRequest.ts index 976d0a9c..e7d78c91 100644 --- a/src/app/business-logic/model/workers/workersUnregisterRequest.ts +++ b/src/app/business-logic/model/workers/workersUnregisterRequest.ts @@ -2,7 +2,7 @@ * workers * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.7 + * OpenAPI spec version: 2.9 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/core/effects/users.effects.ts b/src/app/core/effects/users.effects.ts index 9230f3df..f034d440 100644 --- a/src/app/core/effects/users.effects.ts +++ b/src/app/core/effects/users.effects.ts @@ -20,13 +20,7 @@ export class UserEffects { logoutFlow = this.actions.pipe( ofType(USERS_ACTIONS.LOGOUT), map(() => { - let domainParts = window.location.host.split(':')[0].split('.'); - if (domainParts.length > 2) { - domainParts = domainParts.slice(1); - } - const domain = domainParts.join('.'); this.authService.authLogout({}).subscribe(); - this.cookiesService.delete('trains_token_basic', '/', domain); return {type: USERS_ACTIONS.LOGOUT_SUCCESS}; }) ); diff --git a/src/app/features/admin/usage-stats/usage-stats.component.html b/src/app/features/admin/usage-stats/usage-stats.component.html index d79e50d0..3d07e307 100644 --- a/src/app/features/admin/usage-stats/usage-stats.component.html +++ b/src/app/features/admin/usage-stats/usage-stats.component.html @@ -1,5 +1,4 @@ -
Send anonymous usage data (Global setting) diff --git a/src/app/features/admin/usage-stats/usage-stats.component.scss b/src/app/features/admin/usage-stats/usage-stats.component.scss index 1d2ed914..266875b2 100644 --- a/src/app/features/admin/usage-stats/usage-stats.component.scss +++ b/src/app/features/admin/usage-stats/usage-stats.component.scss @@ -1,11 +1,3 @@ -@import "../../../webapp-common/shared/ui-components/styles/variables.scss"; -@import "../../../webapp-common/shared/ui-components/styles/mixins/lines.scss"; - -.separator { - margin: $card-spacer-y / 2 $card-spacer-x; - @include line($line-height-sm + px) -} - .mat-slide-toggle { margin: 10px 0; } diff --git a/src/app/features/dashboard/dashboard.component.html b/src/app/features/dashboard/dashboard.component.html index 1d72eb13..1ceb5db1 100644 --- a/src/app/features/dashboard/dashboard.component.html +++ b/src/app/features/dashboard/dashboard.component.html @@ -1,19 +1,19 @@
-
-
-
- - -
- -
-
+
+
+
+ + +
+ +
+
+
+
- diff --git a/src/app/features/dashboard/dashboard.const.ts b/src/app/features/dashboard/dashboard.const.ts index 2124a7e9..b6e67ee9 100644 --- a/src/app/features/dashboard/dashboard.const.ts +++ b/src/app/features/dashboard/dashboard.const.ts @@ -7,42 +7,38 @@ export const RECENT_EXPERIMENTS_TABLE_COLS: ISmCol[] = [ id : RECENT_TASKS_TABLE_COL_FIELDS.TYPE, headerType : ColHeaderTypeEnum.title, header : 'TYPE', - bodyStyleClass: 'type-col' + bodyStyleClass: 'type-col', + disableDrag : true, }, { - id : RECENT_TASKS_TABLE_COL_FIELDS.NAME, - headerType: ColHeaderTypeEnum.title, - header : 'TITLE', + id : RECENT_TASKS_TABLE_COL_FIELDS.NAME, + headerType : ColHeaderTypeEnum.title, + header : 'TITLE', + disableDrag: true, }, { - id : RECENT_TASKS_TABLE_COL_FIELDS.PROJECT, - headerType: ColHeaderTypeEnum.title, - header : 'PROJECT', + id : RECENT_TASKS_TABLE_COL_FIELDS.PROJECT, + headerType : ColHeaderTypeEnum.title, + header : 'PROJECT', + disableDrag: true, }, { - id : RECENT_TASKS_TABLE_COL_FIELDS.STARTED, - headerType: ColHeaderTypeEnum.title, - header : 'STARTED', + id : RECENT_TASKS_TABLE_COL_FIELDS.STARTED, + headerType : ColHeaderTypeEnum.title, + header : 'STARTED', + disableDrag: true, }, { - id : RECENT_TASKS_TABLE_COL_FIELDS.LAST_UPDATE, - headerType: ColHeaderTypeEnum.title, - header : 'UPDATED' + id : RECENT_TASKS_TABLE_COL_FIELDS.LAST_UPDATE, + headerType : ColHeaderTypeEnum.title, + header : 'UPDATED', + disableDrag: true, }, - // { - // id : RECENT_TASKS_TABLE_COL_FIELDS.QUEUE, - // headerType: ColHeaderTypeEnum.title, - // header : 'QUEUE' - // }, - // { - // id : RECENT_TASKS_TABLE_COL_FIELDS.WORKER, - // headerType: ColHeaderTypeEnum.title, - // header : 'WORKER' - // }, { id : RECENT_TASKS_TABLE_COL_FIELDS.STATUS, headerType : ColHeaderTypeEnum.title, header : 'STATUS', - bodyStyleClass: 'status-col' + bodyStyleClass: 'status-col', + disableDrag : true, } ]; diff --git a/src/app/features/dashboard/dashboard.module.ts b/src/app/features/dashboard/dashboard.module.ts index 458f383e..1c8ffc39 100644 --- a/src/app/features/dashboard/dashboard.module.ts +++ b/src/app/features/dashboard/dashboard.module.ts @@ -12,18 +12,20 @@ import {commonDashboardReducer} from '../../webapp-common/dashboard/common-dashb import {CommonSearchResultsModule} from '../../webapp-common/search/common-search-results.module'; import {DashboardSearchComponent} from './containers/dashboard-search/dashboard-search.component'; import {SearchResultsPageComponent} from './dumb/search-results-page/search-results-page.component'; +import {SharedModule} from '../../shared/shared.module'; @NgModule({ - imports : [ - ProjectCreateDialogModule, - CommonModule, - SMSharedModule, - ExperimentSharedModule, - DashboardRoutingModule, - CommonSearchResultsModule, - StoreModule.forFeature('dashboard', commonDashboardReducer), - CommonDashboardModule, - ], + imports: [ + ProjectCreateDialogModule, + CommonModule, + SMSharedModule, + ExperimentSharedModule, + DashboardRoutingModule, + CommonSearchResultsModule, + StoreModule.forFeature('dashboard', commonDashboardReducer), + CommonDashboardModule, + SharedModule, + ], declarations : [DashboardComponent, GettingStartedCardComponent, DashboardSearchComponent, SearchResultsPageComponent] }) export class DashboardModule { diff --git a/src/app/features/experiments-compare/experiment-details-reverter-service.base.ts b/src/app/features/experiments-compare/experiment-details-reverter-service.base.ts index 7c1ac21d..d77c2536 100644 --- a/src/app/features/experiments-compare/experiment-details-reverter-service.base.ts +++ b/src/app/features/experiments-compare/experiment-details-reverter-service.base.ts @@ -15,19 +15,17 @@ export abstract class ExperimentDetailsReverterServiceBase { return experimentIds.map(id => { const exp = experiments.find(ex => ex.id === id); return { - id : exp.id, - name : exp.name, - status : exp.status, + id: exp.id, + name: exp.name, + status: exp.status, last_iteration: exp.last_iteration, - last_update : exp.last_update, - project : exp.project, - completed : exp.completed, - tags : exp.tags, - execution : this.revertExecution(exp), - artifacts : this.revertArtifacts(exp), - parameters : get('execution.parameters', exp) ? - this.revertExecutionParameters(exp.execution.parameters) : - undefined, + last_update: exp.last_update, + project: exp.project, + completed: exp.completed, + tags: exp.tags, + execution: this.revertExecution(exp), + artifacts: this.revertArtifacts(exp), + configuration: exp.configuration }; }); } @@ -35,18 +33,13 @@ export abstract class ExperimentDetailsReverterServiceBase { protected sortObjectByKey(obj) { const orderedLabels = {}; Object.keys(obj).sort().forEach((key) => { - orderedLabels[key] = obj[key]; + orderedLabels[key] = typeof obj[key] === 'string' ? obj[key] : this.sortObjectByKey(obj[key]); }); return orderedLabels; } - public revertExecutionParameters(parameters: Execution['parameters']) { - return this.sortObjectByKey(parameters); - } - abstract revertArtifacts(exp: ISelectedExperiment); abstract revertExecution(exp: ISelectedExperiment); - } diff --git a/src/app/features/experiments-compare/experiments-compare-consts.ts b/src/app/features/experiments-compare/experiments-compare-consts.ts index ee163464..eaf3f9a6 100644 --- a/src/app/features/experiments-compare/experiments-compare-consts.ts +++ b/src/app/features/experiments-compare/experiments-compare-consts.ts @@ -1,14 +1,17 @@ -export const EXPERIMENT_INFO_ONLY_FIELDS = [ +export const COMPARE_DETAILS_ONLY_FIELDS = [ 'id', 'name', 'type', 'status', 'last_update', 'project.name', - 'execution', + 'execution.artifacts', + 'execution.docker_cmd', + 'execution.model_labels', 'execution.model.name', 'execution.model.uri', 'execution.model.framework', + 'execution.model.design', 'script', 'tags', 'published', @@ -17,5 +20,18 @@ export const EXPERIMENT_INFO_ONLY_FIELDS = [ 'output.model.uri', 'output.model.framework', 'output.model.design', + 'configuration' +]; +export const COMPARE_PARAMS_ONLY_FIELDS = [ + 'id', + 'name', + 'type', + 'status', + 'last_update', + 'project.name', + 'tags', + 'published', + 'last_iteration', + 'hyperparams' ]; diff --git a/src/app/features/experiments-compare/experiments-compare-details.base.ts b/src/app/features/experiments-compare/experiments-compare-details.base.ts index ec077349..bc607bc5 100644 --- a/src/app/features/experiments-compare/experiments-compare-details.base.ts +++ b/src/app/features/experiments-compare/experiments-compare-details.base.ts @@ -3,6 +3,7 @@ export abstract class ExperimentCompareDetailsBase { return { artifacts: this.buildSectionTree(experiment, 'artifacts', mergedExperiment), execution: this.buildSectionTree(experiment, 'execution', mergedExperiment), + configuration: this.buildSectionTree(experiment, 'configuration', mergedExperiment), }; } diff --git a/src/app/features/experiments/actions/experiments-info.actions.ts b/src/app/features/experiments/actions/experiments-info.actions.ts index 3ac39157..2519d7a3 100644 --- a/src/app/features/experiments/actions/experiments-info.actions.ts +++ b/src/app/features/experiments/actions/experiments-info.actions.ts @@ -37,21 +37,6 @@ export class CustomOutputLabelAdded implements Action { -export class ModelSelected implements Action { - readonly type = MODEL_SELECTED; - public payload: { - model: Model; - fieldsToPopulate: { labelEnum: boolean; networkDesign: boolean }; - }; - - constructor(payload: { - model: Model; - fieldsToPopulate: { labelEnum: boolean; networkDesign: boolean }; - }) { - this.payload = payload; - } -} - export class UpdateSectionKnowledge implements Action { readonly type = UPDATE_SECTION_KNOWLEDGE; @@ -61,7 +46,6 @@ export class UpdateSectionKnowledge implements Action { export class ExperimentDataUpdated implements Action { readonly type = EXPERIMENT_DATA_UPDATED; - constructor(public payload: { id: Task['id']; changes: Partial }) { } } diff --git a/src/app/features/experiments/containers/experiment-info-execution/experiment-info-execution.component.html b/src/app/features/experiments/containers/experiment-info-execution/experiment-info-execution.component.html index 3261ce60..62e23e0d 100644 --- a/src/app/features/experiments/containers/experiment-info-execution/experiment-info-execution.component.html +++ b/src/app/features/experiments/containers/experiment-info-execution/experiment-info-execution.component.html @@ -6,6 +6,7 @@ [editable]="editable$ | async" [isInDev]="isInDev$ | async" [formData]="executionInfo$ | async" + [showExtraDataSpinner]="showExtraDataloader$ | async" [saving]="saving$ |async" (formDataChanged)="onFormValuesChanged($event)" (saveFormData)="saveExecutionData()" diff --git a/src/app/features/experiments/containers/experiment-info-execution/experiment-info-execution.component.ts b/src/app/features/experiments/containers/experiment-info-execution/experiment-info-execution.component.ts index 4cae3934..d7394dfe 100644 --- a/src/app/features/experiments/containers/experiment-info-execution/experiment-info-execution.component.ts +++ b/src/app/features/experiments/containers/experiment-info-execution/experiment-info-execution.component.ts @@ -4,19 +4,20 @@ import {Observable, Subscription} from 'rxjs'; import {IExecutionForm} from '../../shared/experiment-execution.model'; import {ISelectedExperiment} from '../../shared/experiment-info.model'; import {IExperimentInfoState} from '../../reducers/experiment-info.reducer'; -import {selectIsExperimentEditable, selectSelectedExperiment} from '../../reducers'; +import {selectIsExperimentEditable, selectSelectedExperiment, selectShowExtraDataSpinner} from '../../reducers'; import * as infoActions from '../../actions/experiments-info.actions'; import {selectExperimentExecutionInfoData, selectIsExperimentSaving, selectIsSelectedExperimentInDev} from '../../../../webapp-common/experiments/reducers'; import {selectBackdropActive} from '../../../../webapp-common/core/reducers/view-reducer'; @Component({ - selector : 'sm-experiment-info-input-model', + selector : 'sm-experiment-info-execution', templateUrl: './experiment-info-execution.component.html', styleUrls : ['./experiment-info-execution.component.scss'] }) export class ExperimentInfoExecutionComponent implements OnInit, OnDestroy { public executionInfo$: Observable; + public showExtraDataloader$: Observable; public selectedExperimentSubscrition: Subscription; private selectedExperiment: ISelectedExperiment; public editable$: Observable; @@ -26,6 +27,7 @@ export class ExperimentInfoExecutionComponent implements OnInit, OnDestroy { constructor(private store: Store) { this.executionInfo$ = this.store.select(selectExperimentExecutionInfoData); + this.showExtraDataloader$ = this.store.select(selectShowExtraDataSpinner); this.editable$ = this.store.select(selectIsExperimentEditable); this.isInDev$ = this.store.select(selectIsSelectedExperimentInDev); this.saving$ = this.store.select(selectIsExperimentSaving); diff --git a/src/app/features/experiments/containers/experiment-info/experiment-info.component.html b/src/app/features/experiments/containers/experiment-info/experiment-info.component.html index 926b729b..181dc1bb 100644 --- a/src/app/features/experiments/containers/experiment-info/experiment-info.component.html +++ b/src/app/features/experiments/containers/experiment-info/experiment-info.component.html @@ -1,16 +1,16 @@
- - + + + diff --git a/src/app/features/experiments/containers/experiment-info/experiment-info.component.ts b/src/app/features/experiments/containers/experiment-info/experiment-info.component.ts index 6cf90cbf..19c424e8 100644 --- a/src/app/features/experiments/containers/experiment-info/experiment-info.component.ts +++ b/src/app/features/experiments/containers/experiment-info/experiment-info.component.ts @@ -14,12 +14,14 @@ import * as commonInfoActions from '../../../../webapp-common/experiments/action import * as infoActions from '../../actions/experiments-info.actions'; import {AddMessage} from '../../../../webapp-common/core/actions/layout.actions'; import {IExperimentInfo, ISelectedExperiment} from '../../shared/experiment-info.model'; +import {selectSelectedTableExperiment} from '../../../../webapp-common/experiments/reducers'; +import {ITableExperiment} from '../../../../webapp-common/experiments/shared/common-experiment-model.model'; @Component({ - selector : 'sm-experiment-info', + selector: 'sm-experiment-info', templateUrl: './experiment-info.component.html', - styleUrls : ['./experiment-info.component.scss'] + styleUrls: ['./experiment-info.component.scss'] }) export class ExperimentInfoComponent implements OnInit, OnDestroy { @@ -32,20 +34,22 @@ export class ExperimentInfoComponent implements OnInit, OnDestroy { public isExample: boolean; private projectId: string; private experimentId: string; - public showMaximize: boolean; + public resultsTab: boolean; public queryParams$: Observable; public routerConfig: string[]; private routerConfigSubscription: Subscription; + public tableSelectedExperiment$: Observable; constructor( private router: Router, private store: Store, private route: ActivatedRoute ) { - this.editable$ = this.store.select(selectIsExperimentEditable); - this.infoData$ = this.store.select(selectExperimentInfoData); + this.editable$ = this.store.select(selectIsExperimentEditable); + this.infoData$ = this.store.select(selectExperimentInfoData); this.backdropActive$ = this.store.select(selectBackdropActive); - this.queryParams$ = this.store.select(selectRouterQueryParams); + this.queryParams$ = this.store.select(selectRouterQueryParams); + this.tableSelectedExperiment$ = this.store.select(selectSelectedTableExperiment) } @@ -53,16 +57,17 @@ export class ExperimentInfoComponent implements OnInit, OnDestroy { this.selectedExperimentSubscription = this.store.select(selectSelectedExperiment) .subscribe(experiment => { this.selectedExperiment = experiment; - this.isExample = isExample(experiment); + this.isExample = isExample(experiment); }); - this.routerConfigSubscription = this.store.select(selectRouterConfig).subscribe(routerConfig => { + this.routerConfigSubscription = this.store.select(selectRouterConfig).subscribe(routerConfig => { this.routerConfig = routerConfig; }); - this.paramsSubscription = this.store.select(selectRouterParams) + + this.paramsSubscription = this.store.select(selectRouterParams) .pipe( tap((params) => { - this.projectId = get('projectId', params); - this.showMaximize = 'info-output' === this.route.firstChild.routeConfig.path; + this.projectId = get('projectId', params); + this.resultsTab = 'info-output' === this.route.firstChild.routeConfig.path; }), debounceTime(150), map(params => get('experimentId', params)), @@ -71,8 +76,12 @@ export class ExperimentInfoComponent implements OnInit, OnDestroy { ) .subscribe(experimentId => { this.experimentId = experimentId; - this.store.dispatch(new commonInfoActions.ResetExperimentInfo()); - this.store.dispatch(new commonInfoActions.GetExperimentInfo(experimentId)); + + // We already have GetExperimentInfo in output (results) component + if (!this.resultsTab) { + this.store.dispatch(new commonInfoActions.ResetExperimentInfo()); + this.store.dispatch(new commonInfoActions.GetExperimentInfo(experimentId)); + } }); } @@ -80,7 +89,7 @@ export class ExperimentInfoComponent implements OnInit, OnDestroy { this.paramsSubscription.unsubscribe(); this.selectedExperimentSubscription.unsubscribe(); this.routerConfigSubscription.unsubscribe(); - this.store.dispatch(new commonInfoActions.SetExperiment(null)); + // this.store.dispatch(new commonInfoActions.SetExperiment(null)); this.store.dispatch(new commonInfoActions.ResetExperimentInfo()); } diff --git a/src/app/features/experiments/experiments-routing.module.ts b/src/app/features/experiments/experiments-routing.module.ts index 40269604..8ac3bc3b 100644 --- a/src/app/features/experiments/experiments-routing.module.ts +++ b/src/app/features/experiments/experiments-routing.module.ts @@ -18,6 +18,8 @@ import {ExperimentInfoInputModelComponent} from '../../webapp-common/experiments import {ExperimentInfoOutputModelComponent} from '../../webapp-common/experiments/containers/experiment-info-output-model/experiment-info-output-model.component'; import {ExperimentInfoArtifactItemComponent} from '../../webapp-common/experiments/containers/experiment-info-artifact-item/experiment-info-artifact-item.component'; import {LeavingBeforeSaveAlertGuard} from '../../webapp-common/shared/guards/leaving-before-save-alert.guard'; +import {ExperimentInfoTaskModelComponent} from '../../webapp-common/experiments/containers/experiment-info-task-model/experiment-info-task-model.component'; +import {ExperimentInfoHyperParametersFormContainerComponent} from '../../webapp-common/experiments/containers/experiment-info-hyper-parameters-form-container/experiment-info-hyper-parameters-form-container.component'; export const routes: Routes = [ { @@ -35,11 +37,17 @@ export const routes: Routes = [ {path: '', redirectTo: 'input-model', pathMatch: 'full'}, {path: 'input-model', component: ExperimentInfoInputModelComponent}, {path: 'output-model', component: ExperimentInfoOutputModelComponent}, - {path: 'artifact/:artifactId', children:[{ path:':mode', component: ExperimentInfoArtifactItemComponent}]}, - {path: 'other/:artifactId', children:[{ path:':mode', component: ExperimentInfoArtifactItemComponent}]} + {path: 'artifact/:artifactId', children: [{path: ':mode', component: ExperimentInfoArtifactItemComponent}]}, + {path: 'other/:artifactId', children: [{path: ':mode', component: ExperimentInfoArtifactItemComponent}]} + ] + }, + { + path : 'hyper-params', component: ExperimentInfoHyperParametersComponent, canDeactivate: [LeavingBeforeSaveAlertGuard], + children: [ + {path: 'configuration/:configObject', component: ExperimentInfoTaskModelComponent}, + {path: 'hyper-param/:hyperParamId', component: ExperimentInfoHyperParametersFormContainerComponent} ] }, - {path: 'hyper-params', component: ExperimentInfoHyperParametersComponent, canDeactivate: [LeavingBeforeSaveAlertGuard]}, {path: 'general', component: ExperimentInfoGeneralComponent}, { path : 'info-output', diff --git a/src/app/features/experiments/experiments.consts.ts b/src/app/features/experiments/experiments.consts.ts index fa94330c..7bfaf446 100644 --- a/src/app/features/experiments/experiments.consts.ts +++ b/src/app/features/experiments/experiments.consts.ts @@ -24,6 +24,7 @@ export const EXPERIMENT_INFO_ONLY_FIELDS = [ 'output.model.project', 'output.model.design', 'output.model.uri', + 'hyperparams', 'execution', 'execution.model.name', 'execution.model.uri', @@ -32,11 +33,19 @@ export const EXPERIMENT_INFO_ONLY_FIELDS = [ 'execution.model.task.project.id', 'execution.model.project.id', 'execution.model.labels', - 'script', + 'execution.model.design', + 'script.binary', + 'script.repository', + 'script.tag', + 'script.branch', + 'script.version_num', + 'script.entry_point', + 'script.working_dir', + 'script.requirements', 'system_tags', 'published', 'last_iteration', - 'tags' + 'tags', ]; export const INITIAL_EXPERIMENT_TABLE_COLS: ISmCol[] = [ @@ -98,6 +107,7 @@ export const INITIAL_EXPERIMENT_TABLE_COLS: ISmCol[] = [ }, { id : EXPERIMENTS_TABLE_COL_FIELDS.USER, + getter : 'user.name', headerType : ColHeaderTypeEnum.sortFilter, searchableFilter: true, filterable : true, diff --git a/src/app/features/experiments/reducers/experiment-info.reducer.ts b/src/app/features/experiments/reducers/experiment-info.reducer.ts index ca7e6d0f..29c6a473 100644 --- a/src/app/features/experiments/reducers/experiment-info.reducer.ts +++ b/src/app/features/experiments/reducers/experiment-info.reducer.ts @@ -4,7 +4,7 @@ import {experimentSections, experimentSectionsEnum} from '../shared/experiments. import {get, set} from 'lodash/fp'; import {commonExperimentInfoReducer, ICommonExperimentInfoState, initialCommonExperimentInfoState} from '../../../webapp-common/experiments/reducers/common-experiment-info.reducer'; import * as actions from '../../../webapp-common/experiments/actions/common-experiments-info.actions'; -import {SET_EXPERIMENT} from '../../../webapp-common/experiments/actions/common-experiments-info.actions'; +import {deleteHyperParamsSection, hyperParamsSectionUpdated, saveExperimentConfigObj, saveHyperParamsSection, SET_EXPERIMENT, setExperimentSaving, updateExperimentAtPath} from '../../../webapp-common/experiments/actions/common-experiments-info.actions'; export interface IExperimentInfoState extends ICommonExperimentInfoState { activeSectionEdit: string; @@ -16,13 +16,13 @@ export interface IExperimentInfoState extends ICommonExperimentInfoState { export const initialState: IExperimentInfoState = { ...initialCommonExperimentInfoState, - activeSectionEdit : null, - saving : false, - infoDataFreeze : null, - userKnowledge : { + activeSectionEdit: null, + saving : false, + infoDataFreeze : null, + userKnowledge : { [experimentSections.MODEL_INPUT]: false } as any, - errors : { + errors : { model : null, execution: null, }, @@ -40,8 +40,17 @@ export function experimentInfoReducer(state: IExperimentInfoState = initialState return {...state, infoData: {...state.infoData, model: {...state.infoData.model, ...action.payload}}}; case EXPERIMENT_DATA_UPDATED: return {...state, infoData: {...state.infoData, ...action.payload.changes}}; + case hyperParamsSectionUpdated.type: + return {...state, infoData: {...state.infoData, hyperparams: {...state.infoData.hyperparams, [action.section]: action.hyperparams}}}; + case EXPERIMENT_SAVE: return {...state, saving: true}; + case saveHyperParamsSection.type: + return {...state, saving: true}; + case saveExperimentConfigObj.type: + return {...state, saving: true}; + case deleteHyperParamsSection.type: + return {...state, saving: true}; case ACTIVATE_EDIT: return {...state, activeSectionEdit: action.payload, infoDataFreeze: state.infoData}; case SET_FREEZE_INFO: @@ -52,6 +61,11 @@ export function experimentInfoReducer(state: IExperimentInfoState = initialState return {...state, infoData: state.infoDataFreeze ? state.infoDataFreeze : state.infoData}; case EXPERIMENT_DETAILS_UPDATED: return {...state, infoData: {...state.infoData, ...action.payload.changes}}; + case setExperimentSaving.type: + return {...state, saving: action.saving}; + case updateExperimentAtPath.type: + const newInfoData = set(action.path, action.value, state.infoData); + return {...state, infoData: newInfoData as any}; case actions.EXPERIMENT_UPDATED_SUCCESSFULLY: return {...state, saving: false}; case ADD_CUSTOM_OUTPUT_LABEL: { diff --git a/src/app/features/experiments/reducers/experiments-view.reducer.ts b/src/app/features/experiments/reducers/experiments-view.reducer.ts index a461f9cd..dc41055c 100644 --- a/src/app/features/experiments/reducers/experiments-view.reducer.ts +++ b/src/app/features/experiments/reducers/experiments-view.reducer.ts @@ -12,7 +12,7 @@ export function experimentsViewReducer(state: IExperimentsViewState = initialSta switch (action.type) { case commonActions.RESET_EXPERIMENTS: - return {...state, experiments: [], selectedExperiment: null, metricVariants: []}; + return {...state, experiments: [], selectedExperiment: null, metricVariants: [], showAllSelectedIsActive: false}; default: return commonExperimentsViewReducer(state, action); } diff --git a/src/app/features/experiments/reducers/index.ts b/src/app/features/experiments/reducers/index.ts index 5b198a3a..4e0b36b4 100644 --- a/src/app/features/experiments/reducers/index.ts +++ b/src/app/features/experiments/reducers/index.ts @@ -34,6 +34,8 @@ export const selectMetricsLoading = createSelector(experimentsView, (sta export const experimentInfo = createSelector(experiments, (state): IExperimentInfoState => state ? state.info : {}); export const selectSelectedExperiment = createSelector(experimentInfo, (state): ISelectedExperiment => state.selectedExperiment); export const selectExperimentInfoData = createSelector(experimentInfo, (state): IExperimentInfo => state.infoData); +export const selectShowExtraDataSpinner = createSelector(experimentInfo, state => state.showExtraDataSpinner); + // output selectors diff --git a/src/app/features/experiments/shared/components/experiment-menu/experiment-menu.component.html b/src/app/features/experiments/shared/components/experiment-menu/experiment-menu.component.html index 55930756..061b62e5 100644 --- a/src/app/features/experiments/shared/components/experiment-menu/experiment-menu.component.html +++ b/src/app/features/experiments/shared/components/experiment-menu/experiment-menu.component.html @@ -1,4 +1,4 @@ - +
Manage Queue
- @@ -36,7 +36,11 @@ Publish
- @@ -45,7 +49,7 @@ Clone diff --git a/src/app/features/experiments/shared/components/experiment-menu/experiment-menu.component.scss b/src/app/features/experiments/shared/components/experiment-menu/experiment-menu.component.scss index 1d4a1648..49773ec6 100644 --- a/src/app/features/experiments/shared/components/experiment-menu/experiment-menu.component.scss +++ b/src/app/features/experiments/shared/components/experiment-menu/experiment-menu.component.scss @@ -20,3 +20,6 @@ button { } } +.al-ico-bars-menu { + line-height: 20px; +} diff --git a/src/app/features/experiments/shared/experiment-info.model.ts b/src/app/features/experiments/shared/experiment-info.model.ts index 85f8b18e..437fcead 100644 --- a/src/app/features/experiments/shared/experiment-info.model.ts +++ b/src/app/features/experiments/shared/experiment-info.model.ts @@ -6,10 +6,11 @@ import {TaskStatusEnum} from '../../../business-logic/model/tasks/taskStatusEnum import {Project} from '../../../business-logic/model/projects/project'; import {Script} from '../../../business-logic/model/tasks/script'; import {IExecutionForm} from './experiment-execution.model'; -import {Execution} from '../../../business-logic/model/tasks/execution'; import {IHyperParamsForm} from '../../../webapp-common/experiments/shared/experiment-hyper-params.model'; import {Artifact} from '../../../business-logic/model/tasks/artifact'; import {IExperimentModelInfo} from '../../../webapp-common/experiments/shared/common-experiment-model.model'; +import {ParamsItem} from '../../../business-logic/model/tasks/paramsItem'; +import {ConfigurationItem} from '../../../business-logic/model/tasks/configurationItem'; /** * an extended object of task that includes projection, will come from the server as an api response. @@ -38,6 +39,8 @@ export interface ISelectedExperiment { status_message?: string; status_reason?: string; last_iteration?: number; + hyperparams?: { [section: string]: { [key: string]: ParamsItem } }; + configuration?: { [key: string]: ConfigurationItem }; } /** @@ -49,7 +52,8 @@ export interface IExperimentInfo { comment?: string; model?: IExperimentModelInfo; execution?: IExecutionForm; - hyperParams?: IHyperParamsForm; + hyperparams?: { [key: string]: { [key: string]: ParamsItem }; }; + configuration?: any; artifacts?: Artifact[]; } @@ -70,6 +74,7 @@ export interface ISelectedExperimentExecution { id: Model['id'], name: Model['name'], uri: Model['uri'], + design?: Model['design']; created: Model['created'], labels: Model['labels'], task: { @@ -85,8 +90,6 @@ export interface ISelectedExperimentExecution { name: User['name']; }, }; - parameters: Execution['parameters']; - model_desc?: any; framework?: any; model_labels?: { [key: string]: number; }; artifacts?: Artifact[]; diff --git a/src/app/features/experiments/shared/experiments.const.ts b/src/app/features/experiments/shared/experiments.const.ts index c9f1b572..f147c18a 100644 --- a/src/app/features/experiments/shared/experiments.const.ts +++ b/src/app/features/experiments/shared/experiments.const.ts @@ -21,7 +21,7 @@ export const EXPERIMENTS_TABLE_COL_FIELDS = { TYPE : 'type' as ExperimentTableColFieldsEnum, NAME : 'name' as ExperimentTableColFieldsEnum, TAGS : 'tags' as ExperimentTableColFieldsEnum, - USER : 'user.name' as ExperimentTableColFieldsEnum, + USER : 'users' as ExperimentTableColFieldsEnum, STARTED : 'started' as ExperimentTableColFieldsEnum, COMPLETED : 'completed' as ExperimentTableColFieldsEnum, STATUS : 'status' as ExperimentTableColFieldsEnum, diff --git a/src/app/features/experiments/shared/services/experiment-converter.service.ts b/src/app/features/experiments/shared/services/experiment-converter.service.ts index f650c87a..7b764935 100644 --- a/src/app/features/experiments/shared/services/experiment-converter.service.ts +++ b/src/app/features/experiments/shared/services/experiment-converter.service.ts @@ -24,19 +24,18 @@ export class ExperimentConverterService { if (!isEqual(executionInfoNoOutputDest, executionInfoNoOutputDestBeforeChange) || !isEqual(experimentInfo.model, experimentInfoBeforeChange.model) || - !isEqual(experimentInfo.hyperParams, experimentInfoBeforeChange.hyperParams) || + !isEqual(experimentInfo.hyperparams, experimentInfoBeforeChange.hyperparams) || !isEqual(experimentInfo.model, experimentInfoBeforeChange.model) ) { convertedExperiment.execution = this.convertExecution(experimentInfo.execution, - experimentInfo.model, experimentInfo.hyperParams); + experimentInfo.model); } return convertedExperiment; } - convertExecution(execution: IExecutionForm, model: IExperimentModelInfo, - hyperParams: IHyperParamsForm): Execution { + convertExecution(execution: IExecutionForm, model: IExperimentModelInfo): Execution { return { - ...this.commonExperimentConverterService.commonConvertExecution(execution, model, hyperParams), + ...this.commonExperimentConverterService.commonConvertExecution(execution, model), }; } diff --git a/src/app/features/models/containers/model-menu/model-menu.component.html b/src/app/features/models/containers/model-menu/model-menu.component.html index a18820c3..bd22e2e7 100644 --- a/src/app/features/models/containers/model-menu/model-menu.component.html +++ b/src/app/features/models/containers/model-menu/model-menu.component.html @@ -1,4 +1,4 @@ - +
Publish -
- diff --git a/src/app/features/models/containers/model-menu/model-menu.component.scss b/src/app/features/models/containers/model-menu/model-menu.component.scss index 3ef56047..49773ec6 100644 --- a/src/app/features/models/containers/model-menu/model-menu.component.scss +++ b/src/app/features/models/containers/model-menu/model-menu.component.scss @@ -19,3 +19,7 @@ button { } } } + +.al-ico-bars-menu { + line-height: 20px; +} diff --git a/src/app/features/models/dumb/model-header/model-header.component.scss b/src/app/features/models/dumb/model-header/model-header.component.scss index 5f704723..20307753 100644 --- a/src/app/features/models/dumb/model-header/model-header.component.scss +++ b/src/app/features/models/dumb/model-header/model-header.component.scss @@ -4,7 +4,6 @@ .header-container { padding-left: 24px; - padding-right: 24px; height: 66px; transition: background-color 0.5s; /deep/ button { diff --git a/src/app/features/not-found/not-found/not-found.component.html b/src/app/features/not-found/not-found/not-found.component.html index 3738275c..e80dd6d0 100644 --- a/src/app/features/not-found/not-found/not-found.component.html +++ b/src/app/features/not-found/not-found/not-found.component.html @@ -1,6 +1,6 @@
-
+

404

diff --git a/src/app/features/not-found/not-found/not-found.component.scss b/src/app/features/not-found/not-found/not-found.component.scss index 5b448712..d2d3cef3 100644 --- a/src/app/features/not-found/not-found/not-found.component.scss +++ b/src/app/features/not-found/not-found/not-found.component.scss @@ -45,6 +45,7 @@ } } .cat{ + font-size: 140px; width:140px; height:140px; margin-top:44px; diff --git a/src/app/features/projects/dumb/project-card/project-card.component.html b/src/app/features/projects/dumb/project-card/project-card.component.html index e24a2461..ce01f388 100644 --- a/src/app/features/projects/dumb/project-card/project-card.component.html +++ b/src/app/features/projects/dumb/project-card/project-card.component.html @@ -1,5 +1,5 @@ + [isExample]=" project.name !== 'All projects' && !project.company?.id">
Sample
diff --git a/src/app/layout/layout.module.ts b/src/app/layout/layout.module.ts index cb27070a..47edd50d 100644 --- a/src/app/layout/layout.module.ts +++ b/src/app/layout/layout.module.ts @@ -5,16 +5,18 @@ import {SMSharedModule} from '../webapp-common/shared/shared.module'; import {FormsModule, ReactiveFormsModule} from '@angular/forms'; import {RouterModule} from '@angular/router'; import {SurveyComponent} from './survey/survey.component'; +import {SharedModule} from '../shared/shared.module'; @NgModule({ declarations: [SideNavComponent, SurveyComponent], exports: [SideNavComponent, SurveyComponent], - imports: [ - CommonModule, - SMSharedModule, - FormsModule, - ReactiveFormsModule, - RouterModule, - ] + imports: [ + CommonModule, + SMSharedModule, + FormsModule, + ReactiveFormsModule, + RouterModule, + SharedModule, + ] }) export class LayoutModule { } diff --git a/src/app/layout/side-nav/side-nav.component.html b/src/app/layout/side-nav/side-nav.component.html index 1fe937c2..80b3621e 100644 --- a/src/app/layout/side-nav/side-nav.component.html +++ b/src/app/layout/side-nav/side-nav.component.html @@ -3,7 +3,7 @@
diff --git a/src/app/layout/side-nav/side-nav.component.scss b/src/app/layout/side-nav/side-nav.component.scss index ac7ff3bb..3f8a7726 100644 --- a/src/app/layout/side-nav/side-nav.component.scss +++ b/src/app/layout/side-nav/side-nav.component.scss @@ -1,11 +1,5 @@ @import "../../webapp-common/shared/ui-components/styles/variables"; -:host { - position: fixed; - height: 100%; - top: 0; -} - $transition-delay: 0.1; $transition-speed: 0.15; @@ -19,19 +13,6 @@ $transition-speed: 0.15; transition-delay: $transition-delay + s; overflow: hidden; - //&:hover { - // width: $side-bar-open-width; - // .item.logo { - // .item-icon { - // transition: opacity $transition-speed + $transition-delay + s; - // opacity: 0; - // } - //.caption { - // opacity: 1; - //} - //} - //} - .item.logo { background: $eggplant-purple; cursor: default; @@ -41,10 +22,6 @@ $transition-speed: 0.15; opacity: 1; height: 100%; - .logo-a { - max-height: $side-bar-close-width * 0.5; - width: auto; - } } &:hover { @@ -55,7 +32,7 @@ $transition-speed: 0.15; } a:hover { - color: $cloudy-blue; + color: $blue-250; } .item { @@ -66,8 +43,12 @@ $transition-speed: 0.15; text-align: center; cursor: pointer; + .fa-24 { + font-size: 24px; + } + &:hover { - background-color: $dark-grey-blue-two; + background-color: $blue-500; box-shadow: inset 0 -1px 0 0 #252b3d; .caption { @@ -81,17 +62,11 @@ $transition-speed: 0.15; position: absolute; left: 0; color: #a7b2d8; - - img { - max-width: 48%; - height: 100%; - padding: 4px; - - &.resized-icon { - max-width: 62%; - } + i{ + line-height: 64px; + height: 64px; + width: 64px; } - .neon { color: $neon-yellow-betterinchrome; } @@ -104,7 +79,7 @@ $transition-speed: 0.15; text-transform: uppercase; font-size: 15px; opacity: 0.4; - color: $cloudy-blue; + color: $blue-250; } } diff --git a/src/app/layout/side-nav/side-nav.component.ts b/src/app/layout/side-nav/side-nav.component.ts index a9a5112a..5bda6739 100644 --- a/src/app/layout/side-nav/side-nav.component.ts +++ b/src/app/layout/side-nav/side-nav.component.ts @@ -5,6 +5,7 @@ import {selectSelectedProjectId} from '../../webapp-common/core/reducers/project import {Observable} from 'rxjs'; import {Router} from '@angular/router'; import {SearchDeactivate} from '../../webapp-common/search/common-search-results.actions'; +import {environment} from '../../../environments/environment'; @Component({ @@ -15,6 +16,8 @@ import {SearchDeactivate} from '../../webapp-common/search/common-search-results export class SideNavComponent { public selectedProjectId$: Observable; currentUser: any; + environment = environment; + constructor(public store: Store, private router: Router) { this.selectedProjectId$ = this.store.select(selectSelectedProjectId); @@ -25,4 +28,8 @@ export class SideNavComponent { public resetSearch() { this.store.dispatch(new SearchDeactivate()); } + + get guestUser(): boolean { + return this.currentUser && this.currentUser?.role === 'guest'; + } } diff --git a/src/app/shared/constants/non-common-consts.ts b/src/app/shared/constants/non-common-consts.ts index cc0a0625..6c69d1f3 100644 --- a/src/app/shared/constants/non-common-consts.ts +++ b/src/app/shared/constants/non-common-consts.ts @@ -5,14 +5,23 @@ export const PROJECT_ROUTES = ['experiments', 'models']; export type PROJECT_ROUTES_TYPE = 'models' | 'experiments'; export const EXPERIMENTS_STATUS_LABELS = { - [TaskStatusEnum.Created] : 'Draft', - [TaskStatusEnum.Queued] : 'Pending', - [TaskStatusEnum.InProgress] : 'Running', - [TaskStatusEnum.Completed] : 'Completed', - [TaskStatusEnum.Published] : 'Published', - [TaskStatusEnum.Failed] : 'Failed', - [TaskStatusEnum.Stopped] : 'Completed', - [TaskStatusEnum.Closed] : 'Closed', - [TaskTypeEnum.Testing] : 'Testing', - [TaskTypeEnum.Training] : 'Training' + [TaskStatusEnum.Created] : 'Draft', + [TaskStatusEnum.Queued] : 'Pending', + [TaskStatusEnum.InProgress] : 'Running', + [TaskStatusEnum.Completed] : 'Completed', + [TaskStatusEnum.Published] : 'Published', + [TaskStatusEnum.Failed] : 'Failed', + [TaskStatusEnum.Stopped] : 'Completed', + [TaskStatusEnum.Closed] : 'Closed', + [TaskTypeEnum.Testing] : 'Testing', + [TaskTypeEnum.Training] : 'Training', + [TaskTypeEnum.Inference] : 'Inference', + [TaskTypeEnum.DataProcessing]: 'Data Processing', + [TaskTypeEnum.Application] : 'Application', + [TaskTypeEnum.Monitor] : 'Monitor', + [TaskTypeEnum.Controller] : 'Controller', + [TaskTypeEnum.Optimizer] : 'Optimizer', + [TaskTypeEnum.Service] : 'Service', + [TaskTypeEnum.Qc] : 'Qc', + [TaskTypeEnum.Custom] : 'Custom' }; diff --git a/src/app/shared/directives/check-permission.directive.ts b/src/app/shared/directives/check-permission.directive.ts index 5e158f86..f177c57d 100644 --- a/src/app/shared/directives/check-permission.directive.ts +++ b/src/app/shared/directives/check-permission.directive.ts @@ -1,15 +1,51 @@ -import {Directive, Input, TemplateRef, ViewContainerRef} from '@angular/core'; +import {Directive, Input, OnDestroy, TemplateRef, ViewContainerRef} from '@angular/core'; +import { Store } from '@ngrx/store'; +import {selectCurrentUser} from '../../webapp-common/core/reducers/users-reducer'; +import {Subscription} from 'rxjs'; +import {User} from '../../business-logic/model/users/user'; @Directive({ selector: '[smCheckPermission]' }) -export class CheckPermissionDirective { +export class CheckPermissionDirective implements OnDestroy{ + private userDataSubscription: Subscription; + private elseTemplateRef: TemplateRef|null = null; + private user: User; + private blocked = true; - @Input() set smCheckPermission(permission: string) { - this.viewContainer.createEmbeddedView(this.templateRef); + @Input() set smCheckPermission(permission: boolean) { + this.blocked = !permission; + this.setUpView(); } - constructor(private templateRef: TemplateRef, - private viewContainer: ViewContainerRef - ) { + + @Input() + set smCheckPermissionElse(templateRef: TemplateRef|null) { + this.elseTemplateRef = templateRef; + this.setUpView(); + } + + constructor( + private templateRef: TemplateRef, + private viewContainer: ViewContainerRef, + private store: Store) { + this.userDataSubscription = this.store.select(selectCurrentUser) + .subscribe((user: User) => { + this.user = user; + this.setUpView(); + }); + } + + setUpView() { + const allowed = !this.blocked && this.user && this.user.role !== 'guest'; + this.viewContainer.clear(); + if (allowed) { + this.viewContainer.createEmbeddedView(this.templateRef); + } else if (this.elseTemplateRef) { + this.viewContainer.createEmbeddedView(this.elseTemplateRef); + } + } + + ngOnDestroy(): void { + this.userDataSubscription?.unsubscribe(); } } diff --git a/src/app/shared/guards/auth.guard.ts b/src/app/shared/guards/auth.guard.ts deleted file mode 100644 index b6dde761..00000000 --- a/src/app/shared/guards/auth.guard.ts +++ /dev/null @@ -1,24 +0,0 @@ -// src/app/auth/auth-guard.service.ts -import {Injectable} from '@angular/core'; -import {Router, CanActivate} from '@angular/router'; -import {Store} from '@ngrx/store'; -import {selectCurrentUser} from '../../webapp-common/core/reducers/users-reducer'; -import {User} from '../../business-logic/model/users/user'; - -@Injectable() -export class AuthGuard implements CanActivate { - private user: User; - - constructor( - public router: Router, - public store: Store) { - this.store.select(selectCurrentUser).subscribe(user => {this.user = user; }); - } - - canActivate(): boolean { - if (!this.user) { - this.router.navigateByUrl('/login'); - } - return !!this.user; - } -} diff --git a/src/app/webapp-common/admin/admin.component.html b/src/app/webapp-common/admin/admin.component.html index 528be3bb..d2d2cdb2 100644 --- a/src/app/webapp-common/admin/admin.component.html +++ b/src/app/webapp-common/admin/admin.component.html @@ -3,7 +3,13 @@
+
+ Disable HiDPI browser scale override. Reload to apply +
@@ -12,7 +18,7 @@ (credentialRevoked)="onCredentialRevoked($event)">
diff --git a/src/app/webapp-common/admin/admin.component.scss b/src/app/webapp-common/admin/admin.component.scss index 40f216fb..616ba81f 100644 --- a/src/app/webapp-common/admin/admin.component.scss +++ b/src/app/webapp-common/admin/admin.component.scss @@ -1,6 +1,11 @@ +@import "../../webapp-common/shared/ui-components/styles/variables.scss"; +@import "../../webapp-common/shared/ui-components/styles/mixins/lines.scss"; + :host { margin: 0 auto; width: 97%; + overflow: auto; + padding-top: 20px; /deep/ .empty-card .line { display: none; @@ -11,4 +16,24 @@ align-items: center; margin-top: 20px; } + + .separator { + margin: $card-spacer-y / 2 $card-spacer-x; + @include line($line-height-sm + px) + } + + mat-slide-toggle { + display: block; + } + + .reload { + color: transparent; + text-decoration: underline; + transition: color 0.5s; + + &.highlight { + color: $neon-yellow; + transition: color 0.5s; + } + } } diff --git a/src/app/webapp-common/admin/admin.component.ts b/src/app/webapp-common/admin/admin.component.ts index 6171de28..3ae313c5 100644 --- a/src/app/webapp-common/admin/admin.component.ts +++ b/src/app/webapp-common/admin/admin.component.ts @@ -11,6 +11,8 @@ import {CreateCredentialDialogComponent} from './create-credential-dialog/create import {filter, map} from 'rxjs/operators'; import {Logout} from '../core/actions/users.actions'; import * as versions from '../../../version.json'; +import {MatSlideToggleChange} from '@angular/material/slide-toggle'; + @Component({ selector : 'sm-admin', @@ -24,13 +26,17 @@ export class AdminComponent implements OnInit, OnDestroy { public credentials: Observable; public newCredential: Observable; public S3BucketCredentials: Observable; - public version = versions['webapp-treeish']; + public version = versions['version']; + public disableHidpi: boolean = false; + public disableHidpiChanged: boolean = false; + public isChrome: boolean; constructor( public adminService: AdminService, private store: Store, private dialog: MatDialog ) { + this.isChrome = window['chrome']; this.currentUser = store.select(selectCurrentUser); this.userTitle = this.currentUser.pipe( map((user) => [ @@ -45,6 +51,9 @@ export class AdminComponent implements OnInit, OnDestroy { ngOnInit() { + + this.disableHidpi = window.localStorage.getItem('disableHidpi') === 'true'; + this.store.dispatch(getAllCredentials()); this.newCredentialSub = this.newCredential.pipe(filter(credential => Object.keys(credential).length > 0)).subscribe(credential => { const dialog = this.dialog.open(CreateCredentialDialogComponent, {data: {credential}}); @@ -74,4 +83,17 @@ export class AdminComponent implements OnInit, OnDestroy { ngOnDestroy(): void { this.newCredentialSub.unsubscribe(); } + + HidpiChange(event: MatSlideToggleChange) { + window.localStorage.setItem('disableHidpi', JSON.stringify(event.checked)); + this.disableHidpiChanged = !this.disableHidpiChanged; + } + + reload(event) { + if (this.disableHidpiChanged) { + event.stopPropagation(); + event.preventDefault(); + window.location.reload(); + } + } } diff --git a/src/app/webapp-common/admin/base-admin.service.ts b/src/app/webapp-common/admin/base-admin.service.ts index f9406bc2..30804afb 100644 --- a/src/app/webapp-common/admin/base-admin.service.ts +++ b/src/app/webapp-common/admin/base-admin.service.ts @@ -49,7 +49,11 @@ export class BaseAdminService { this.store.dispatch(showLocalFilePopUp({url})); } - signUrlIfNeeded(url, skipLocalFile = false) { + signUrlIfNeeded(url, skipLocalFile = true, skipFileServer = true) { + if (isFileserverUrl(url, window.location.hostname) && !skipFileServer) { + return converToReverseProxy(url); + } + if (this.isLocalFile(url) && !skipLocalFile) { this.checkLocalServerRunning(url); return this.redirectToLocalServer(url); @@ -59,9 +63,6 @@ export class BaseAdminService { return this.signGoogleCloudUrl(url); } - if (isFileserverUrl(url, window.location.hostname)) { - return converToReverseProxy(url); - } const now = new Date(); if (this.previouslySignedUrls[url] && (new Date(this.previouslySignedUrls[url].expires).getTime() > now.getTime())) { return this.previouslySignedUrls[url].signedURL; @@ -180,11 +181,11 @@ export class BaseAdminService { } public isS3Url(src) { - return src.startsWith('s3://'); + return src?.startsWith('s3://'); } public isGoogleCloudUrl(src) { - return src.startsWith('gs://'); + return src?.startsWith('gs://'); } public getBucketAndKeyFromSrc = (src) => { @@ -214,6 +215,7 @@ export class BaseAdminService { }; } else { try { + src = this.encodeSpecialCharacters(src); const amazon = AmazonS3URI(src); return { Bucket: amazon.bucket, @@ -229,7 +231,7 @@ export class BaseAdminService { // Uses Allegro Chrome extension injecting patch_local_link function to window - hack to get local files. redirectToLocalServer(url: string): string { - return `http://localhost:${LOCAL_SERVER_PORT}${url.replace('file://','/')}`; + return `http://localhost:${LOCAL_SERVER_PORT}${url.replace('file://', '/')}`; } isLocalFile(url: string): boolean { @@ -263,4 +265,19 @@ export class BaseAdminService { return url.startsWith('azure://'); } + public replaceAll(baseString: string, toReplace: string, replaceWith: string, ignore= false): string{ + return baseString.replace(new RegExp(toReplace.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g,"\\$&"),(ignore?"gi":"g")),(typeof(replaceWith)=="string")?replaceWith.replace(/\$/g,"$$$$"):replaceWith); + + } + + + private encodeSpecialCharacters(src: string) { + src = this.replaceAll(src, '%','%25'); + src = this.replaceAll(src, '#','%23'); + src = this.replaceAll(src, '\\','%5C'); + src = this.replaceAll(src, '^','%5E'); + return src; + } + + } diff --git a/src/app/webapp-common/admin/s3-access/s3-access.component.html b/src/app/webapp-common/admin/s3-access/s3-access.component.html index 77f2f9fc..e63c01ba 100644 --- a/src/app/webapp-common/admin/s3-access/s3-access.component.html +++ b/src/app/webapp-common/admin/s3-access/s3-access.component.html @@ -33,7 +33,7 @@
diff --git a/src/app/webapp-common/assets/icons/compare-icon.svg b/src/app/webapp-common/assets/icons/compare-icon.svg index 2e0e320a..a27cadd1 100644 --- a/src/app/webapp-common/assets/icons/compare-icon.svg +++ b/src/app/webapp-common/assets/icons/compare-icon.svg @@ -2,7 +2,7 @@ diff --git a/src/app/webapp-common/common-styles.scss b/src/app/webapp-common/common-styles.scss index f9529eaf..1ac1e0da 100644 --- a/src/app/webapp-common/common-styles.scss +++ b/src/app/webapp-common/common-styles.scss @@ -1,7 +1,7 @@ @import "~@angular/material/prebuilt-themes/indigo-pink.css"; @import '~@angular/material/theming'; -@import "~angular-notifier/styles.scss"; -@import "~angular-notifier/styles/themes/theme-material.scss"; +@import "angular-notifier/styles.scss"; +@import "angular-notifier/styles/themes/theme-material.scss"; @import "shared/ui-components/styles/notifications"; @import "~britecharts/src/styles/charts/line"; @import "~britecharts/src/styles/charts/donut"; @@ -10,6 +10,7 @@ @import "~britecharts/src/styles/common/axes"; @import "~britecharts/src/styles/common/grid"; @import "shared/ui-components/styles/material-palette"; +@import "assets/fonts/trains-icons.scss"; @include mat-core(); //@import "../webapp-common/shared/ui-components/styles/material-theme.scss"; @@ -35,14 +36,16 @@ $sm-theme: mat-light-theme($sm-theme-primary, $sm-theme-accent, $sm-theme-warn); @include mat-radio-theme($sm-theme); .mat-checkbox-frame, - .mat-radio-outer-circle{ + .mat-radio-outer-circle { border-color: $purple; } + .light-theme .mat-radio-button.mat-radio-disabled .mat-radio-outer-circle, - .light-theme .mat-radio-button.mat-radio-disabled .mat-radio-label-content{ + .light-theme .mat-radio-button.mat-radio-disabled .mat-radio-label-content { border-color: $blue-200 !important; color: $blue-200 !important; } + .light-theme .mat-radio-button.mat-radio-disabled .mat-radio-inner-circle { background-color: transparent !important; } @@ -52,13 +55,13 @@ $sm-theme: mat-light-theme($sm-theme-primary, $sm-theme-accent, $sm-theme-warn); outline: none !important; } -html, -body { +html, body { height: 100%; margin: 0; padding: 0; font-family: 'Heebo', sans-serif; font-size: 13px; + overflow: hidden; } @@ -99,6 +102,22 @@ h5.al-header { } } +mat-expansion-panel { + box-shadow: unset; + + &:hover { + background: transparent !important; + } + + .mat-expansion-panel-header { + margin-bottom: 0; + + &:hover { + background: transparent !important; + } + } +} + .mat-expansion-panel-header { font-family: 'Heebo', sans-serif; } @@ -397,10 +416,10 @@ as-split { } $type-colors: ( - string: #ff8400, - number: $neon-yellow-betterinchrome, - boolean: #b938a4, - date: #05668D, + string: #ff8400, + number: $neon-yellow-betterinchrome, + boolean: #b938a4, + date: #05668D, ); .dark-theme { @@ -418,7 +437,7 @@ $type-colors: ( } .segment-key { - color: $cloudy-blue !important; + color: $blue-250 !important; } } } @@ -529,3 +548,9 @@ body .mat-menu-panel .mat-form-field { } } } + +.hyper-parameters-tooltip { + white-space: pre-line; + text-align: left !important; + font-size: 14px !important; +} diff --git a/src/app/webapp-common/core/actions/layout.actions.ts b/src/app/webapp-common/core/actions/layout.actions.ts index 5fefbde5..a3f9ace8 100644 --- a/src/app/webapp-common/core/actions/layout.actions.ts +++ b/src/app/webapp-common/core/actions/layout.actions.ts @@ -1,7 +1,5 @@ -import { MatSnackBarConfig } from '@angular/material/snack-bar'; import {MessageSeverityEnum, VIEW_ACTIONS} from '../../../app.constants'; -import {Action} from '@ngrx/store'; -import {ISmAction} from '../models/actions'; +import {Action, createAction, props} from '@ngrx/store'; import {omit} from 'lodash/fp'; export class SetAutoRefresh { @@ -87,16 +85,15 @@ export class AddMessage implements Action { public payload: { severity: string; msg: string; - action?: string; - config?: MatSnackBarConfig; + userActions?: {actions: any[]; name: string}[]; }; - constructor(severity: MessageSeverityEnum, msg: string, action?: string, config?: MatSnackBarConfig) { - this.payload = {severity, msg, action, config}; + constructor(severity: MessageSeverityEnum, msg: string, userActions?: {actions: any[]; name: string}[]) { + this.payload = {severity, msg, userActions}; } } -export class SetServerUpdatesAvailable implements ISmAction { +export class SetServerUpdatesAvailable implements Action { public type = VIEW_ACTIONS.SET_SERVER_UPDATES_AVAILABLE; public payload: { availableUpdates: any }; @@ -105,4 +102,9 @@ export class SetServerUpdatesAvailable implements ISmAction { } } +export const setScaleFactor = createAction( + VIEW_ACTIONS + '[set scale]', + props<{scale: number}>() + ); + diff --git a/src/app/webapp-common/core/actions/users.actions.ts b/src/app/webapp-common/core/actions/users.actions.ts index 92da2516..49ae883c 100644 --- a/src/app/webapp-common/core/actions/users.actions.ts +++ b/src/app/webapp-common/core/actions/users.actions.ts @@ -1,4 +1,4 @@ -import {Action} from '@ngrx/store'; +import {Action, createAction, props} from '@ngrx/store'; import {USERS_ACTIONS} from '../../../app.constants'; import {User} from '../../../business-logic/model/users/user'; @@ -8,11 +8,10 @@ export class FetchCurrentUser implements Action { } -export class SetCurrentUser implements Action { - type = USERS_ACTIONS.SET_CURRENT_USER; - - constructor(public payload: User) {} -} +export const setCurrentUser = createAction( + USERS_ACTIONS.SET_CURRENT_USER, + props<{user: User; terms_of_use?: any}>() +); export class Logout implements Action { type = USERS_ACTIONS.LOGOUT; diff --git a/src/app/webapp-common/core/effects/layout.effects.ts b/src/app/webapp-common/core/effects/layout.effects.ts index 20549af2..1899b061 100644 --- a/src/app/webapp-common/core/effects/layout.effects.ts +++ b/src/app/webapp-common/core/effects/layout.effects.ts @@ -1,15 +1,15 @@ import {Injectable} from '@angular/core'; import {Actions, Effect, ofType} from '@ngrx/effects'; -import {VIEW_ACTIONS} from '../../../app.constants'; +import {EmptyAction, VIEW_ACTIONS} from '../../../app.constants'; import * as layoutActions from '../actions/layout.actions'; -import {filter, flatMap, map, switchMap, tap, take} from 'rxjs/operators'; +import {filter, map, switchMap, take, flatMap} from 'rxjs/operators'; import {get} from 'lodash/fp'; import {ApiTasksService} from '../../../business-logic/api-services/tasks.service'; import {Observable, of} from 'rxjs'; import {ApiModelsService} from '../../../business-logic/api-services/models.service'; -import {NotifierService} from 'angular-notifier'; import { MatDialogRef, MatDialog } from '@angular/material/dialog'; import {AlertDialogComponent} from '../../shared/ui-components/overlay/alert-dialog/alert-dialog.component'; +import {NotifierService} from '../../angular-notifier'; const ERROR_AGGREGATION = 600000; @@ -46,6 +46,7 @@ export class LayoutEffects { @Effect({dispatch: false}) popupError = this.actions.pipe( ofType(VIEW_ACTIONS.SET_SERVER_ERROR), + filter(action => action.payload.serverError?.status !== 401), map((action) => { const customMessage: string = action.payload.customMessage; if (action.payload.aggregateSimilar) { @@ -70,13 +71,12 @@ export class LayoutEffects { }) ); - @Effect({dispatch: false}) + @Effect() addMessage: Observable = this.actions.pipe( ofType(VIEW_ACTIONS.ADD_MESSAGE), map((action: layoutActions.AddMessage) => action.payload), - tap(payload => { - this.notifierService.show({type: payload.severity, message: payload.msg}); - }) + flatMap(payload => this.notifierService.show({type: payload.severity, message: payload.msg, actions: payload.userActions})), + flatMap(actions => actions.length > 0? actions : [new EmptyAction()]) ); private parseError(errorMessage) { diff --git a/src/app/webapp-common/core/effects/projects.effects.ts b/src/app/webapp-common/core/effects/projects.effects.ts index bba095ea..ad7ddf13 100644 --- a/src/app/webapp-common/core/effects/projects.effects.ts +++ b/src/app/webapp-common/core/effects/projects.effects.ts @@ -24,6 +24,8 @@ import {MatDialog} from '@angular/material/dialog'; import {ApiOrganizationService} from '../../../business-logic/api-services/organization.service'; import {OrganizationGetTagsResponse} from '../../../business-logic/model/organization/organizationGetTagsResponse'; +const ALL_PROJECTS_OBJECT = {id: '*', name: 'All Projects'}; + @Injectable() export class ProjectsEffects { @@ -36,7 +38,7 @@ export class ProjectsEffects { getProjects$ = this.actions$.pipe( ofType(actions.GET_PROJECTS), switchMap(() => - this.projectsApi.projectsGetAllEx({}) + this.projectsApi.projectsGetAllEx({only_fields:['name', 'company']}) .pipe(map(res => new actions.SetAllProjects(res.projects))) ) ); @@ -77,7 +79,7 @@ export class ProjectsEffects { filter(([action, projects]) => !!action.payload.projectId), switchMap(([action, projects]) => { if (action.payload.projectId === '*') { - return [new actions.SetSelectedProject({id: '*', name: 'All Projects'})]; + return [new actions.SetSelectedProject(ALL_PROJECTS_OBJECT)]; } else { const proj = projects.find(proj => proj.id === action.payload.projectId); if (proj) { diff --git a/src/app/webapp-common/core/effects/users.effects.ts b/src/app/webapp-common/core/effects/users.effects.ts index a08737e4..3ef95229 100644 --- a/src/app/webapp-common/core/effects/users.effects.ts +++ b/src/app/webapp-common/core/effects/users.effects.ts @@ -3,7 +3,7 @@ import {Router} from '@angular/router'; import {Actions, Effect, ofType} from '@ngrx/effects'; import {USERS_ACTIONS} from '../../../app.constants'; import {ApiUsersService} from '../../../business-logic/api-services/users.service'; -import {FetchCurrentUser, SetCurrentUser} from '../actions/users.actions'; +import {FetchCurrentUser, setCurrentUser} from '../actions/users.actions'; import {catchError, flatMap, switchMap} from 'rxjs/operators'; import {RequestFailed} from '../actions/http.actions'; import {logoutFn} from '../../../shared/utils/logout-utils'; @@ -13,15 +13,17 @@ import {ApiAuthService} from '../../../business-logic/api-services/auth.service' @Injectable() export class CommonUserEffects { - constructor(private actions: Actions, private userService: ApiUsersService, - private router: Router, private authService: ApiAuthService) {} + constructor( + private actions: Actions, private userService: ApiUsersService, + private router: Router, private authService: ApiAuthService + ) {} @Effect() fetchUser$ = this.actions.pipe( ofType(USERS_ACTIONS.FETCH_CURRENT_USER), flatMap(() => this.userService.usersGetCurrentUser({}) .pipe( - switchMap((res) => [new SetCurrentUser(res)]), + switchMap((res) => [setCurrentUser(res)]), catchError(error => [new RequestFailed(error)]) ) ) diff --git a/src/app/webapp-common/core/interceptors/webapp-interceptor.ts b/src/app/webapp-common/core/interceptors/webapp-interceptor.ts index dce8966a..b9c70801 100644 --- a/src/app/webapp-common/core/interceptors/webapp-interceptor.ts +++ b/src/app/webapp-common/core/interceptors/webapp-interceptor.ts @@ -2,13 +2,20 @@ import { Injectable } from '@angular/core'; import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpErrorResponse } from '@angular/common/http'; import { Observable, throwError } from 'rxjs'; import { environment } from '../../../../environments/environment'; -import {catchError, take} from 'rxjs/operators'; +import {catchError} from 'rxjs/operators'; import { Router } from '@angular/router'; +import {selectCurrentUser} from '../reducers/users-reducer'; +import {Store} from '@ngrx/store'; +import { setCurrentUser } from '../actions/users.actions'; +import {User} from '../../../business-logic/model/users/user'; @Injectable() export class WebappIntercptor implements HttpInterceptor { + private user: User; - constructor(private router: Router) {} + constructor(private router: Router, private store: Store) { + this.store.select(selectCurrentUser).subscribe(user => this.user = user); + } intercept(request: HttpRequest, next: HttpHandler): Observable> { request = request.clone({ @@ -19,12 +26,17 @@ export class WebappIntercptor implements HttpInterceptor { return next.handle(request).pipe( catchError((err: HttpErrorResponse) => { const redirectUrl: string = window.location.pathname + window.location.search; - if(request.url.endsWith('system.company_info')){ + if (request.url.endsWith('system.company_info')) { return throwError(err); } // For automatic login don't go to login page (login in APP_INITIALIZER) - if (err.status === 401 && (['/dashboard'].includes(redirectUrl) || !environment.autoLogin)) { + if (err.status === 401 && ( + ['/dashboard'].includes(redirectUrl) || + !environment.autoLogin || + (environment.autoLogin && this.user) + )) { if (redirectUrl.indexOf('/login') === -1) { + this.store.dispatch(setCurrentUser({user: null, terms_of_use: null })); this.router.navigate(['login'], {queryParams: {redirect: redirectUrl}}); } return throwError(err); diff --git a/src/app/webapp-common/core/reducers/projects.reducer.ts b/src/app/webapp-common/core/reducers/projects.reducer.ts index a281eab8..8b754d66 100644 --- a/src/app/webapp-common/core/reducers/projects.reducer.ts +++ b/src/app/webapp-common/core/reducers/projects.reducer.ts @@ -1,9 +1,9 @@ import {createSelector} from '@ngrx/store'; import * as projectsActions from '../actions/projects.actions'; -import {Project} from '../../../business-logic/model/projects/project'; -import {sortBy} from 'lodash/fp'; import {setTagColors, setTags, TagColor} from '../actions/projects.actions'; +import {Project} from '../../../business-logic/model/projects/project'; import {getSystemTags} from '../../../features/experiments/shared/experiments.utils'; + export const SYSTEM_TAGS_BLACK_LIST = ['archived']; interface RootProjects { @@ -25,7 +25,7 @@ const initRootProjects: RootProjects = { }; export const projects = state => state.rootProjects as RootProjects; -export const selectProjects = createSelector(projects, (state): Project[] => sortBy('name', state.projects)); +export const selectProjects = createSelector(projects, (state): Project[] => state.projects); export const selectSelectedProject = createSelector(projects, state => state.selectedProject); export const selectSelectedProjectId = createSelector(selectSelectedProject, (selectedProject): string => selectedProject ? selectedProject.id : ''); export const selectIsArchivedMode = createSelector(projects, state => state.archive); diff --git a/src/app/webapp-common/core/reducers/users-reducer.ts b/src/app/webapp-common/core/reducers/users-reducer.ts index c8ea06d5..6d69c960 100644 --- a/src/app/webapp-common/core/reducers/users-reducer.ts +++ b/src/app/webapp-common/core/reducers/users-reducer.ts @@ -1,5 +1,6 @@ import {USERS_ACTIONS} from '../../../app.constants'; import {createSelector} from '@ngrx/store'; +import {setCurrentUser} from '../actions/users.actions'; export interface IUsersState { currentUser: string; @@ -21,11 +22,11 @@ export function usersReducer(state = initUsers, action) { switch (action.type) { case USERS_ACTIONS.FETCH_CURRENT_USER: return {...state}; - case USERS_ACTIONS.SET_CURRENT_USER: + case setCurrentUser.type: return { ...state, - currentUser: action.payload.user, - termsOfUse: action.payload.terms_of_use + currentUser: action.user, + termsOfUse: action.terms_of_use }; case USERS_ACTIONS.LOGOUT: return { diff --git a/src/app/webapp-common/core/reducers/view-reducer.ts b/src/app/webapp-common/core/reducers/view-reducer.ts index 93f22218..1391a845 100644 --- a/src/app/webapp-common/core/reducers/view-reducer.ts +++ b/src/app/webapp-common/core/reducers/view-reducer.ts @@ -1,6 +1,7 @@ import {HTTP, HTTP_ACTIONS, VIEW_ACTIONS} from '../../../app.constants'; import {createSelector} from '@ngrx/store'; import {get} from 'lodash/fp'; +import {setScaleFactor} from '../actions/layout.actions'; export interface ViewState { loading: {[endpoint: string]: boolean}; @@ -12,6 +13,7 @@ export interface ViewState { autoRefresh: boolean; compareAutoRefresh: boolean; applicationVisible: boolean; + scaleFactor: number; } export const initViewState: ViewState = { @@ -25,6 +27,7 @@ export const initViewState: ViewState = { autoRefresh: true, compareAutoRefresh: false, applicationVisible: true, + scaleFactor: 100 }; export const views = state => state.views as ViewState; @@ -38,6 +41,7 @@ export const selectResultMessage = createSelector(views, state => state.resultMe export const selectAutoRefresh = createSelector(views, state => state && state.autoRefresh); export const selectCompareAutoRefresh = createSelector(views, state => state.compareAutoRefresh); export const selectAppVisible = createSelector(views, state => state.applicationVisible); +export const selectScaleFactor = createSelector(views, state => state.scaleFactor); export function viewReducer(viewState: ViewState = initViewState, action) { @@ -58,6 +62,8 @@ export function viewReducer(viewState: ViewState = initViewState, action) { }; case VIEW_ACTIONS.VISIBILITY_CHANGED: return {...viewState, applicationVisible: action.visible}; + case setScaleFactor.type: + return {...viewState, scaleFactor: action.scale}; case VIEW_ACTIONS.RESET_LOADER: return {...viewState, loading: {}}; case HTTP.API_REQUEST_SUCCESS: diff --git a/src/app/webapp-common/dashboard/common-dashboard.actions.ts b/src/app/webapp-common/dashboard/common-dashboard.actions.ts index 7109e102..c5c13024 100644 --- a/src/app/webapp-common/dashboard/common-dashboard.actions.ts +++ b/src/app/webapp-common/dashboard/common-dashboard.actions.ts @@ -11,7 +11,7 @@ export class GetRecentProjects implements ISmAction { public type = DASHBOARD_ACTIONS.GET_RECENT_PROJECTS; public payload: { getAllFilter: ProjectsGetAllRequest }; - constructor(getAllFilter: any = {stats_for_state: ProjectsGetAllExRequest.StatsForStateEnum.Active, include_stats: true, order_by: ['-last_update'], page: 0, page_size: CARDS_IN_ROW}) { + constructor(getAllFilter: any = {stats_for_state: ProjectsGetAllExRequest.StatsForStateEnum.Active, include_stats: true, order_by: ['featured', '-last_update'], page: 0, page_size: CARDS_IN_ROW}) { this.payload = {getAllFilter}; } } diff --git a/src/app/webapp-common/dashboard/common-dashboard.effects.ts b/src/app/webapp-common/dashboard/common-dashboard.effects.ts index 13e99e0d..143b98e9 100644 --- a/src/app/webapp-common/dashboard/common-dashboard.effects.ts +++ b/src/app/webapp-common/dashboard/common-dashboard.effects.ts @@ -28,7 +28,7 @@ export class CommonDashboardEffects { flatMap((action) => this.projectsApi.projectsGetAllEx(action.payload.getAllFilter) .pipe( flatMap(res => [new SetRecentProjects(res.projects), new DeactiveLoader(action.type)]), - catchError(error => [new DeactiveLoader(action.type), new AddMessage(MESSAGES_SEVERITY.ERROR, 'Fetching projects failed'), new RequestFailed(error)]) + catchError(error => [new DeactiveLoader(action.type), new RequestFailed(error)]) ) ) ); @@ -47,7 +47,7 @@ export class CommonDashboardEffects { }) .pipe( flatMap(res => [new SetRecentTasks(res.tasks as Array), new DeactiveLoader(action.type)]), - catchError(err => [new RequestFailed(err), new AddMessage(MESSAGES_SEVERITY.ERROR, 'Fetching recent experiments failed'), new DeactiveLoader(action.type)]) + catchError(err => [new RequestFailed(err), new DeactiveLoader(action.type)]) ) ) ); diff --git a/src/app/webapp-common/dashboard/common-dashboard.module.ts b/src/app/webapp-common/dashboard/common-dashboard.module.ts index 0a5defa1..24460cf7 100644 --- a/src/app/webapp-common/dashboard/common-dashboard.module.ts +++ b/src/app/webapp-common/dashboard/common-dashboard.module.ts @@ -13,22 +13,25 @@ import {EffectsModule} from '@ngrx/effects'; import {ProjectsSharedModule} from '../../features/projects/shared/projects-shared.module'; import {CommonSearchResultsModule} from '../search/common-search-results.module'; import {CommonExperimentSharedModule} from '../experiments/shared/common-experiment-shared.module'; +import {SharedModule} from '../../shared/shared.module'; @NgModule({ declarations: [DashboardProjectsComponent, DashboardExperimentsComponent, RecentExperimentTableComponent], exports : [DashboardProjectsComponent, DashboardExperimentsComponent], - imports : [ - SMSharedModule, - ExperimentsCommonModule, - CommonModule, - ExperimentSharedModule, - CommonSearchModule, - CommonSearchResultsModule, - ProjectsSharedModule, - CommonExperimentSharedModule, - EffectsModule.forFeature([CommonDashboardEffects]), - CommonLayoutModule, - ExperimentSharedModule] + imports: [ + SMSharedModule, + ExperimentsCommonModule, + CommonModule, + ExperimentSharedModule, + CommonSearchModule, + CommonSearchResultsModule, + ProjectsSharedModule, + CommonExperimentSharedModule, + EffectsModule.forFeature([CommonDashboardEffects]), + CommonLayoutModule, + ExperimentSharedModule, + SharedModule + ] }) export class CommonDashboardModule { } diff --git a/src/app/webapp-common/dashboard/containers/dashboard-projects/dashboard-projects.component.html b/src/app/webapp-common/dashboard/containers/dashboard-projects/dashboard-projects.component.html index fd84b951..6154812d 100644 --- a/src/app/webapp-common/dashboard/containers/dashboard-projects/dashboard-projects.component.html +++ b/src/app/webapp-common/dashboard/containers/dashboard-projects/dashboard-projects.component.html @@ -3,12 +3,11 @@
RECENT PROJECTS
-
+
+ NEW PROJECT
@@ -19,6 +18,6 @@
- +
diff --git a/src/app/webapp-common/dashboard/dashboard-search.component.base.ts b/src/app/webapp-common/dashboard/dashboard-search.component.base.ts index dc3d3e58..0291ca22 100644 --- a/src/app/webapp-common/dashboard/dashboard-search.component.base.ts +++ b/src/app/webapp-common/dashboard/dashboard-search.component.base.ts @@ -60,7 +60,7 @@ export abstract class DashboardSearchComponentBase { public searchTermChanged(term: string) { if (term && term.length > 0) { - this.store.dispatch(new SearchStart(term)); + this.store.dispatch(new SearchStart(term, term.length < 3)); } else { this.activeLink = 'projects'; this.store.dispatch(new SearchDeactivate()); diff --git a/src/app/webapp-common/debug-images/debug-image-snippet/debug-image-snippet.component.html b/src/app/webapp-common/debug-images/debug-image-snippet/debug-image-snippet.component.html index 73f581ec..f7925f92 100644 --- a/src/app/webapp-common/debug-images/debug-image-snippet/debug-image-snippet.component.html +++ b/src/app/webapp-common/debug-images/debug-image-snippet/debug-image-snippet.component.html @@ -19,12 +19,12 @@ (loadedmetadata)="loadedMedia()" (click)="imageClicked.emit()" > - +
-
{{frame?.variant}}
diff --git a/src/app/webapp-common/debug-images/debug-image-snippet/debug-image-snippet.component.scss b/src/app/webapp-common/debug-images/debug-image-snippet/debug-image-snippet.component.scss index a7457dcb..8a8466a1 100644 --- a/src/app/webapp-common/debug-images/debug-image-snippet/debug-image-snippet.component.scss +++ b/src/app/webapp-common/debug-images/debug-image-snippet/debug-image-snippet.component.scss @@ -58,11 +58,28 @@ transform: scale(0.44); transform-origin: 0 0; } +.html-snippet { + &:hover { + .toolbar { + opacity: 1; + visibility: visible; + } + } + + .toolbar { + display: flex; + position: absolute; + bottom: 8px; + left: 16px; + opacity: 0; + visibility: hidden; + transition: opacity 0.5s, visibility 0.5s; + } +} .clickable-icon { background-color: #efefef; padding: 4px 24px; - margin: 0 auto; border-radius: 4px; } diff --git a/src/app/webapp-common/debug-images/debug-image-snippet/debug-image-snippet.component.ts b/src/app/webapp-common/debug-images/debug-image-snippet/debug-image-snippet.component.ts index 8202faaa..d6e9531e 100644 --- a/src/app/webapp-common/debug-images/debug-image-snippet/debug-image-snippet.component.ts +++ b/src/app/webapp-common/debug-images/debug-image-snippet/debug-image-snippet.component.ts @@ -1,5 +1,5 @@ import {Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core'; -import {isHtmlPage} from '../../shared/utils/shared-utils'; +import {isHtmlPage, isTextFileURL} from '../../shared/utils/shared-utils'; import {IsAudioPipe} from '../../shared/pipes/is-audio.pipe'; import {IsVideoPipe} from '../../shared/pipes/is-video.pipe'; import {AddMessage} from '../../core/actions/layout.actions'; @@ -21,7 +21,7 @@ export class DebugImageSnippetComponent implements OnInit { if (frame.url) { this.isVideo = (new IsVideoPipe().transform(frame.url)); this.isAudio = (new IsAudioPipe()).transform(frame.url); - this.isHtml = isHtmlPage(frame.url); + this.isHtml = isHtmlPage(frame.url) || isTextFileURL(frame.url); } this._frame = frame; } @@ -35,7 +35,7 @@ export class DebugImageSnippetComponent implements OnInit { isFailed = false; isLoading = true; - constructor(private store: Store) { + constructor(private store: Store) { } ngOnInit() { diff --git a/src/app/webapp-common/debug-images/debug-images-view/debug-images-view.component.scss b/src/app/webapp-common/debug-images/debug-images-view/debug-images-view.component.scss index cd04f676..0ff37a4d 100644 --- a/src/app/webapp-common/debug-images/debug-images-view/debug-images-view.component.scss +++ b/src/app/webapp-common/debug-images/debug-images-view/debug-images-view.component.scss @@ -58,9 +58,6 @@ .mat-expansion-panel-header { margin-bottom: 0; - &:hover{ - background:transparent; - } } .mat-expansion-panel-header-title { diff --git a/src/app/webapp-common/debug-images/debug-images.component.html b/src/app/webapp-common/debug-images/debug-images.component.html index 3df7deed..a4993048 100644 --- a/src/app/webapp-common/debug-images/debug-images.component.html +++ b/src/app/webapp-common/debug-images/debug-images.component.html @@ -15,20 +15,20 @@

Iterations:
{{debugImages && debugImages[experimentId] && debugImages[experimentId][debugImages[experimentId].length - 1].iter}} -
+
{{debugImages && debugImages[experimentId] && debugImages[experimentId][0].iter}} -

diff --git a/src/app/webapp-common/debug-images/debug-images.component.scss b/src/app/webapp-common/debug-images/debug-images.component.scss index cb528d56..f3cc224b 100644 --- a/src/app/webapp-common/debug-images/debug-images.component.scss +++ b/src/app/webapp-common/debug-images/debug-images.component.scss @@ -30,7 +30,7 @@ sm-debug-images-view { align-items: center; margin-bottom: 24px; - .i-next-batch, .i-prev-batch, .i-back-to-top { + .al-ico-next-batch, .al-ico-prev-batch, .al-ico-back-to-top { cursor: pointer; } diff --git a/src/app/webapp-common/debug-images/debug-images.component.ts b/src/app/webapp-common/debug-images/debug-images.component.ts index 722f0d72..ed0738e3 100644 --- a/src/app/webapp-common/debug-images/debug-images.component.ts +++ b/src/app/webapp-common/debug-images/debug-images.component.ts @@ -79,13 +79,14 @@ export class DebugImagesComponent implements OnInit, OnDestroy { map(([bucketCredentials, debugImages]) => { const debugImagesP = Object.entries(debugImages).reduce(((previousValue, currentValue: any) => { previousValue[currentValue[0]] = currentValue[1].metrics[0].iterations.map(iteration => { - const events = iteration.events.map(event => { - const signedUrl = this.adminService.signUrlIfNeeded(event.url); - return {...event, oldSrc: event.url, url: signedUrl}; - }); - return {...iteration, events}; - } - ); + const events = iteration.events.map(event => { + const signedUrl = this.adminService.signUrlIfNeeded(event.url); + const parsed = new URL(signedUrl); + parsed.searchParams.append('X-Amz-Date', event.timestamp); + return {...event, oldSrc: event.url, url: parsed.toString()}; + }); + return {...iteration, events}; + }); previousValue[currentValue[0]].metric = currentValue[1].metrics[0].metric; previousValue[currentValue[0]].scrollId = currentValue[1].scroll_id; return previousValue; diff --git a/src/app/webapp-common/experiments-compare/actions/experiments-compare-charts.actions.ts b/src/app/webapp-common/experiments-compare/actions/experiments-compare-charts.actions.ts index c55cb0e7..bcba569b 100644 --- a/src/app/webapp-common/experiments-compare/actions/experiments-compare-charts.actions.ts +++ b/src/app/webapp-common/experiments-compare/actions/experiments-compare-charts.actions.ts @@ -1,6 +1,7 @@ import {Action} from '@ngrx/store'; import {ISmAction} from '../../core/models/actions'; import {IExperimentSettings} from '../../experiments/reducers/common-experiment-output.reducer'; +import {ScalarKeyEnum} from '../../../business-logic/model/events/scalarKeyEnum'; export const EXPERIMENTS_COMPARE_METRICS_CHARTS_ = 'EXPERIMENTS_COMPARE_METRICS_CHARTS_'; @@ -29,7 +30,7 @@ export const RESET_EXPERIMENT_METRICS = EXPERIMENTS_COMPARE_METRICS_CHA export class GetMultiScalarCharts implements ISmAction { public type = GET_MULTI_SCALAR_CHARTS; - constructor(public payload: { taskIds: string[]; autoRefresh?: boolean }) {} + constructor(public payload: { taskIds: string[]; autoRefresh?: boolean; cached?: boolean }) {} } export class GetMultiPlotCharts implements ISmAction { @@ -47,7 +48,7 @@ export class SetSelectedExperiments implements Action { export class SetExperimentHistogram implements Action { readonly type = SET_EXPERIMENT_HISTOGRAM; - constructor(public payload: any) { + constructor(public payload: any, public axisType: ScalarKeyEnum) { } } diff --git a/src/app/webapp-common/experiments-compare/actions/experiments-compare-details.actions.ts b/src/app/webapp-common/experiments-compare/actions/experiments-compare-details.actions.ts index 5e6c6e46..461a6fe9 100644 --- a/src/app/webapp-common/experiments-compare/actions/experiments-compare-details.actions.ts +++ b/src/app/webapp-common/experiments-compare/actions/experiments-compare-details.actions.ts @@ -1,51 +1,6 @@ -import {Action} from '@ngrx/store'; -import {Task} from '../../../business-logic/model/tasks/task'; +import {createAction, props} from '@ngrx/store'; import {IExperimentDetail} from '../../../features/experiments-compare/experiments-compare-models'; -export const EXPERIMENTS_COMPARE_DETAILS_PREFIX = 'EXPERIMENTS_COMPARE_DETAILS_'; - -// commands. -export const SET_EXPERIMENTS = EXPERIMENTS_COMPARE_DETAILS_PREFIX + 'SET_EXPERIMENTS'; -export const EXPAND_NODE = EXPERIMENTS_COMPARE_DETAILS_PREFIX + 'EXPAND_NODE'; -export const EXPAND_NODES = EXPERIMENTS_COMPARE_DETAILS_PREFIX + 'EXPAND_NODES'; -export const COLLAPSE_NODE = EXPERIMENTS_COMPARE_DETAILS_PREFIX + 'COLLAPSE_NODE'; -export const RESET_STATE = EXPERIMENTS_COMPARE_DETAILS_PREFIX + 'RESET_STATE'; - -// events. -export const EXPERIMENT_LIST_UPDATED = EXPERIMENTS_COMPARE_DETAILS_PREFIX + 'EXPERIMENT_LIST_UPDATED'; -export const REFETCH_EXPERIMENT_REQUESTED = EXPERIMENTS_COMPARE_DETAILS_PREFIX + 'REFETCH_EXPERIMENT_REQUESTED'; - - -export class ExperimentListUpdated implements Action { - readonly type = EXPERIMENT_LIST_UPDATED; - - constructor(public payload: Array) { - } -} - -export class SetExperiments implements Action { - readonly type = SET_EXPERIMENTS; - - constructor(public payload: Array) { - } -} - -export class ExpandNode implements Action { - readonly type = EXPAND_NODE; - - // the node path. - constructor(public payload: string | Array) { - } -} - -export class CollapseNode implements Action { - readonly type = COLLAPSE_NODE; - - // the node path. - constructor(public payload: string) { - } -} - -export class ResetState implements Action { - readonly type = RESET_STATE; -} +export const resetState = createAction('[experiment compare details] RESET_STATE'); +export const setExperiments = createAction('[experiment compare details] SET_EXPERIMENTS', props<{experiments: IExperimentDetail[]}>()); +export const experimentListUpdated = createAction('[experiment compare details] EXPERIMENT_LIST_UPDATED', props<{ids: string[]}>()); diff --git a/src/app/webapp-common/experiments-compare/actions/experiments-compare-scalars-graph.actions.ts b/src/app/webapp-common/experiments-compare/actions/experiments-compare-scalars-graph.actions.ts index eb41dd41..2e78242a 100644 --- a/src/app/webapp-common/experiments-compare/actions/experiments-compare-scalars-graph.actions.ts +++ b/src/app/webapp-common/experiments-compare/actions/experiments-compare-scalars-graph.actions.ts @@ -1,5 +1,5 @@ import {createAction, props} from '@ngrx/store'; -import {HyperParams, MetricOption, MetricValueType} from '../reducers/experiments-compare-charts.reducer'; +import {GroupedHyperParams, HyperParams, MetricOption, MetricValueType} from '../reducers/experiments-compare-charts.reducer'; export const EXPERIMENTS_COMPARE_SCALARS_GRAPH = 'EXPERIMENTS_COMPARE_SCALARS_GRAPH_'; @@ -14,5 +14,5 @@ export const getExperimentsHyperParams = createAction(GET_EXPERIMENTS_PARAMS, pr export const setMetricsList = createAction(SET_METRICS_LIST, props<{ metricsList: MetricOption[] }>()); export const setTasks = createAction(SET_TASKS, props<{ tasks: any }>()); export const setvalueType = createAction(SET_VALUE_TYPE, props<{ valueType: MetricValueType }>()); -export const setHyperParamsList = createAction(SET_PARAMS_LIST, props<{ hyperParams: HyperParams }>()); +export const setHyperParamsList = createAction(SET_PARAMS_LIST, props<{ hyperParams: GroupedHyperParams }>()); export const setShowIdenticalHyperParams = createAction(SET_HIDE_IDENTICAL_HYPER_PARAMS); diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-details/experiment-compare-details.component.html b/src/app/webapp-common/experiments-compare/containers/experiment-compare-details/experiment-compare-details.component.html index 997df8e3..b2ace1b5 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-details/experiment-compare-details.component.html +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-details/experiment-compare-details.component.html @@ -1,5 +1,4 @@ - {{node.data.key | prettifyTitleKeyPipe}} + {{(RENAME_MAP[node.data.key] || node.data.key) | hideHashTitle}} +
@@ -45,8 +45,12 @@ 'hide-identical-mode': hideIdenticalFields }">
- -
{{node.data.key  | hideHash}}{{node.data.value}}
+
{{node.data.key | hideHash}}{{node.data.value}}
+                    
diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-details/experiment-compare-details.component.scss b/src/app/webapp-common/experiments-compare/containers/experiment-compare-details/experiment-compare-details.component.scss index 77e65f0a..88762594 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-details/experiment-compare-details.component.scss +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-details/experiment-compare-details.component.scss @@ -1,290 +1,41 @@ -@import "../../../shared/ui-components/styles/variables"; +@import "../experiment-compare-base.component"; -sm-compare-card-list { - display: block; - height: 100%; - - pre { - line-height: 28px; - vertical-align: middle; - } - - .node { - height: 28px; - line-height: 28px; - vertical-align: middle; - margin-bottom: 1px; - margin-top: 1px; - - &.parent { - .fas { - margin-left: 6px; - font-size: 11px; - width: 16px; - height: 28px; - display: inline-flex; - line-height: 28px; - align-items: center; - justify-content: center; - } - } - } - - &.pending { - opacity: 0.2; - } -} - -.al-header { - margin-bottom: 0px; - - &.main-header { - text-transform: uppercase; - } - - &.sub-header { - color: #5a658e; - text-transform: capitalize; - } -} - -$extra-header-min-height: 50px; :host { - - .tree-card-body { - height: 100%; - padding: 20px 15px 0 0; - } - .section { - display: inline-block; - font-family: monospace; - font-size: 13px; - //margin-right: 20px; - padding-left: 8px; - min-width: 100%; - overflow: hidden; - text-align: left; - color: #1a1e2c; - - .virtual-scroll-container { - height: 100% !important; - - .content { - &.al-empty-collapse { - color: #384161c7; - pointer-events: none; - cursor: default; - - .fas { - width: 3px; - visibility: hidden; - } - - &.hide-field { - background-color: #f8f9fa !important; - - &.al-danger { - border-left: 1px #ff9898 solid; - } - - > * { - visibility: hidden; - } - } - } - } - } - pre { - margin-bottom: 0; - margin-top: 0; + display: inline-block; + position: relative; overflow: visible; - padding-right: 16px; - padding-left: 6px; - } - - .node-item-container { - margin-bottom: 1px; - height: 28px; - .full-width { - width: 100%; - } - - .height { - min-height: 28px; - vertical-align: middle; - line-height: 28px; - white-space: nowrap; - position: relative; - width: 99%; + &.with-ellipsis { + overflow: hidden; + text-overflow: ellipsis; + width: 370px; } - .inline-block { - display: inline-block; - } - - &.not-existing-on-compared { - background-color: #f8f9fa !important; - } - - &.not-existing-on-origin.not-existing-on-compared.equal-row { - background-color: #f8f9fa; - } - - &.selected-diff { - background-color: #f4f7ff; - position: relative; - - &:before { - content: ' '; - background: #4d66ff; - display: block; - width: 8px; - position: absolute; - transform: translate(-100%); - height: 100%; - border-left: 0px solid; - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; - left: 0; + &:hover { + .extend-toggle { + visibility: visible; } } - } - } + &.no-ellipsis { - - .parent { - //height: 36px; - .depth-0 { - .content { - text-transform: uppercase; - } - } - - .content { - font-family: "Heebo", sans-serif; - font-weight: 500; - color: #384161; - white-space: nowrap; - cursor: pointer; - - &.al-empty-collapse { - cursor: default; - } - - &.selected-diff { - background-color: #f4f7ff; - position: relative; - - &:before { - content: ' '; - background: #4d66ff; - display: block; - width: 8px; - position: absolute; - transform: translate(-100%); - height: 100%; - border-left: 0px solid; - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; - left: 0; - } - } - } - } - - .is-not-origin { - .content.selected-diff { - &:before { - background: #ff9898; - } - } - .node-item-container { - &.not-existing-on-origin.diff-row { - background-color: transparent; - } - - &.diff-row { - background-color: #FFDCDC; - - &:hover { - background-color: #ffb4b4; - } - } - - .equal-row { - background-color: transparent; - } - - &.not-existing-on-compared.not-existing-on-origin { - border: none; - - pre { + .extend-toggle { visibility: hidden !important; } } - - &.not-existing-on-compared { - position: relative; - width: 100%; - background-color: #f8f9fa !important; - border-left: 1px #ff9898 solid; - - .tab-forward { - padding-left: 0; - } - - .border-placeholder { - background-color: #f8f9fa; - position: relative; - width: 100%; - height: 100%; - border-left: 1px #ff9898 solid; - padding-left: 0; - } - - &.selected-diff { - border-left: none; - } - } - - &.selected-diff { - &:before { - background: #ff9898; - } - } - } - .hide-identical-mode.equal-row { - pre { - color: #ced1db; + .title-key { + width: 100%; + + &.ellipsis { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 339px; } } } - -} - -.card-extra-header { - display: flex; - min-height: $extra-header-min-height; - align-items: center; - width: 100%; - justify-content: flex-end; -} - -.action-container { - margin-right: 60px; -} - -.action-title { - padding-left: 10px; -} - -.compare-header-container { - display: block; - height: 64px; } diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-details/experiment-compare-details.component.ts b/src/app/webapp-common/experiments-compare/containers/experiment-compare-details/experiment-compare-details.component.ts index 1626570e..97cf4b36 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-details/experiment-compare-details.component.ts +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-details/experiment-compare-details.component.ts @@ -1,36 +1,14 @@ -import {ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, QueryList, ViewChild, ViewChildren} from '@angular/core'; -import {ActivatedRoute, Router} from '@angular/router'; +import {ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit} from '@angular/core'; import {select, Store} from '@ngrx/store'; +import {experimentListUpdated, setExperiments} from '../../actions/experiments-compare-details.actions'; +import {selectExperimentsDetails} from '../../reducers'; +import {filter, tap} from 'rxjs/operators'; +import {ExperimentCompareTree, IExperimentDetail} from '../../../../features/experiments-compare/experiments-compare-models'; +import {convertExperimentsArrays, getAllKeysEmptyObject, isDetailsConverted} from '../../jsonToDiffConvertor'; +import {ExperimentCompareBase} from '../experiment-compare-base'; +import {ActivatedRoute, Router} from '@angular/router'; import {IExperimentInfoState} from '../../../../features/experiments/reducers/experiment-info.reducer'; -import {selectRouterParams} from '../../../core/reducers/router-reducer'; -import {get, has, isEqual, isEmpty} from 'lodash/fp'; -import * as detailsActions from '../../actions/experiments-compare-details.actions'; -import {Subscription} from 'rxjs'; -import {selectExperimentsDetails, selectHideIdenticalFields, selectRefreshing} from '../../reducers'; -import {filter, map, tap} from 'rxjs/operators'; -import {ActiveLoader, AddMessage, DeactiveLoader} from '../../../core/actions/layout.actions'; -import {CompareCardListComponent} from '../../dumbs/compare-card-list/compare-card-list.component'; -import { - ExperimentCompareTree, ExperimentCompareTreeSection, IExperimentDetail -} from '../../../../features/experiments-compare/experiments-compare-models'; -import {ExperimentCompareDetailsBase} from '../../../../features/experiments-compare/experiments-compare-details.base'; -import {FlatTreeControl} from '@angular/cdk/tree'; -import {MatTreeFlatDataSource, MatTreeFlattener} from '@angular/material/tree'; -import {refetchExperimentRequested} from '../../actions/compare-header.actions'; -import {CdkVirtualScrollViewport} from '@angular/cdk/scrolling'; -import {TreeNode, TreeNodeMetadata} from '../../shared/experiments-compare-details.model'; -import {treeBuilderService} from '../../services/tree-builder.service'; -import {convertExperimentsArrays, createDiffObjectDetails, getAllKeysEmptyObject} from '../../jsonToDiffConvertor'; - -export type nextDiffDirectionEnum = 'down' | 'up'; - -export interface FlatNode { - data: any; - metaData: TreeNodeMetadata; - level: number; - parent: TreeNode; - hasChildren: boolean; -} +import {ConfigurationItem} from '../../../../business-logic/model/tasks/configurationItem'; @Component({ selector: 'sm-experiment-compare-details', @@ -38,332 +16,41 @@ export interface FlatNode { styleUrls: ['./experiment-compare-details.component.scss', '../../cdk-drag.scss'], changeDetection: ChangeDetectionStrategy.OnPush }) -export class ExperimentCompareDetailsComponent extends ExperimentCompareDetailsBase implements OnInit, OnDestroy { - +export class ExperimentCompareDetailsComponent extends ExperimentCompareBase implements OnInit { + public showEllipsis: boolean = true; - private paramsSubscription: Subscription; - private experimentsSubscription: Subscription; - private hideIdenticalFieldsSub: Subscription; - private refreshingSubscription: Subscription; - // private searchStringSub: Subscription; - - public tree: ExperimentCompareTree = {}; - public experiments: Array; - private allPathsDiffs: any = {}; - public selectedPath: string = null; - private selectedPathIndex: number = -1; - private onlyDiffsPaths: string[]; - private taskIds: string; - public allPaths: any = {}; - public calculatingTree: boolean; - public hideIdenticalFields = false; - public experimentsDataControl: { [key: string]: [MatTreeFlatDataSource, FlatNode>, FlatTreeControl] } = {}; - public compareTabPage: string; - public foundPaths: string[] = []; - public foundIndex: number = 0; - public searchText = ''; - private experimentsDataSources: { [id: string]: { all: any; onlyDiffs: any } } = {}; - private previousOpenPaths: string[] = []; - private scrollSubscription: Subscription[]; - private timeoutIndex: NodeJS.Timeout; - private originalScrolledElement: EventTarget; - public experimentTags: {[experimentId: string]: string[]} = {}; - - get baseExperiment(): IExperimentDetail { - return get('[0]', this.experiments); + constructor(public router: Router, + public store: Store, + public changeDetection: ChangeDetectorRef, + public activeRoute: ActivatedRoute) { + super(router, store, changeDetection, activeRoute); } - @ViewChild('cardList', {static: true}) cardList: CompareCardListComponent; - @ViewChildren('virtualScrollRef') virtualScrollRef: QueryList; - - constructor(private router: Router, - private store: Store, - private changeDetection: ChangeDetectorRef, - private activeRoute: ActivatedRoute) { - super(); - } + experiments$ = this.store.pipe(select(selectExperimentsDetails)); ngOnInit() { - this.hideIdenticalFieldsSub = this.store.select(selectHideIdenticalFields).subscribe(hide => { - this.hideIdenticalFields = hide; - - Object.keys(this.experimentsDataControl).forEach(id => { - const [dataSource, treeControl] = this.experimentsDataControl[id]; - const expandedPaths = treeControl.expansionModel.selected.map(node => node.data.path); - dataSource.data = this.experimentsDataSources[id][this.hideIdenticalFields ? 'onlyDiffs' : 'all']; - const expandedDataNodes = treeControl.dataNodes.filter(node => node.hasChildren).filter(node => expandedPaths.includes(node.data.path)); - treeControl.expansionModel.select(...expandedDataNodes); - }); - this.find(this.searchText); - }); - - this.compareTabPage = get('snapshot.routeConfig.data.mode', this.activeRoute); - - this.paramsSubscription = this.store.pipe( - select(selectRouterParams), - map(params => get('ids', params)), - tap(taskIds => this.taskIds = taskIds), - filter(taskIds => !!taskIds && taskIds !== this.getExperimentIdsParams(this.experiments)) - ) - .subscribe((experimentIds: string) => { - this.store.dispatch(new detailsActions.ExperimentListUpdated(experimentIds.split(','))); - }); - - this.experimentsSubscription = this.store.pipe(select(selectExperimentsDetails)) - .pipe( - filter(experiments => !!experiments && experiments.length > 0), - tap(experiments => this.syncUrl(experiments, this.taskIds)) - ) - .subscribe(experiments => { - experiments = experiments.map(({tags, ...experiment}) => { - if (tags?.length || !this.experimentTags[experiment.id]?.length) { - this.experimentTags[experiment.id] = tags; - } - return experiment; - }); - experiments = experiments.map(experiment => convertExperimentsArrays(experiment, experiments[0], experiments)); - this.allPathsDiffs = {}; - this.onlyDiffsPaths = []; - this.experiments = experiments; - this.allPaths = []; - this.previousOpenPaths = []; - this.calculateTree(experiments); - // this.refreshDisabled = false; - }); - - this.refreshingSubscription = this.store.pipe(select(selectRefreshing)).pipe(filter(({refreshing}) => refreshing)).subscribe(({autoRefresh}) => - this.store.dispatch(refetchExperimentRequested({autoRefresh}))); - } - - ngOnDestroy(): void { - this.store.dispatch(new detailsActions.ResetState()); - this.paramsSubscription.unsubscribe(); - this.experimentsSubscription.unsubscribe(); - this.hideIdenticalFieldsSub.unsubscribe(); - this.refreshingSubscription.unsubscribe(); - } - - toggleNode(node) { - Object.keys(this.experimentsDataControl).forEach(id => { - const [dataSource, treeControl] = this.experimentsDataControl[id]; - const n = treeControl.dataNodes.filter(n => n.hasChildren).find(n => n.data.path === node.data.path); - treeControl.toggle(n); - }); - } - - calculateTree(experiments) { - this.calculatingTree = true; - this.store.dispatch(new ActiveLoader('CALCULATING_DIFF_TREE')); - this.changeDetection.detectChanges(); - - setTimeout(() => { - const experimentTrees = this.compareTabPage === 'details' ? this.buildDetailsTree(experiments) : this.buildHyperParamsTree(experiments); - this.tree = experimentTrees; - this.ClearRemovedExperiment(experiments); - - const treeFlattener = new MatTreeFlattener, FlatNode>( - this.nodeTransformer, - this.getNodeLevel, - this.getIsNodeExpandable, - this.getNodeChildren - ); - const expandedsPaths = this.getExpandedPath(experimentTrees); - - Object.keys(experimentTrees).forEach(experimentID => { - const sectionTree = experimentTrees[experimentID]; - let root = Object.keys(sectionTree).map((section: string) => sectionTree[section].children[0]); - if (this.compareTabPage === 'hyper-params') { - root = root[0].children; - } - const rootOnlyDiffs = this.filterTreeDiffs(root); - const treeControl: FlatTreeControl = new FlatTreeControl(this.getNodeLevel, this.getIsNodeExpandable); - const dataSource: MatTreeFlatDataSource, FlatNode> = new MatTreeFlatDataSource(treeControl, treeFlattener); - - this.experimentsDataControl[experimentID] = [dataSource, treeControl]; - this.experimentsDataSources[experimentID] = {all: root, onlyDiffs: rootOnlyDiffs}; - dataSource.data = this.experimentsDataSources[experimentID][this.hideIdenticalFields ? 'onlyDiffs' : 'all']; - this.setExpandedPaths(expandedsPaths, treeControl); - this.selectedPath && window.setTimeout(() => this.exapndAndScrollToPath()); - }); - this.calculatingTree = false; - this.store.dispatch(new DeactiveLoader('CALCULATING_DIFF_TREE')); - if (!this.changeDetection['destroyed']) { - this.changeDetection.detectChanges(); - } - this.onlyDiffsPaths = Object.keys(this.allPathsDiffs).filter(key => !!this.allPathsDiffs[key]); - this.syncScrollSubscription(); - if (this.searchText) { - this.findAllOccurrences(this.searchText); - if (this.foundIndex >= this.foundPaths.length) { - this.foundIndex = this.foundPaths.length; - this.findPrev(); - } - if (this.foundPaths.length > 0 && this.foundIndex === -1) { - this.findNext(); - } - this.changeDetection.detectChanges(); - } - }, 0); - } - - private ClearRemovedExperiment(experiments) { - const expIds = experiments.map(exp => exp.id); - Object.keys(this.experimentsDataControl).forEach(expId => { - if (!expIds.includes(expId)) { - delete this.experimentsDataControl[expId]; - delete this.experimentsDataSources[expId]; - } - }); - } - - private getExpandedPath(experimentTrees: ExperimentCompareTree) { - let expandedsPaths = []; - Object.keys(experimentTrees).some(experimentID => { - if (this.experimentsDataControl[experimentID]) { - expandedsPaths = this.experimentsDataControl[experimentID][1].expansionModel.selected.map(node => node.data.path); - return expandedsPaths.length > 0; - } - }); - return expandedsPaths; - } - - private setExpandedPaths(expandedsPaths: any[], treeControl: FlatTreeControl) { - if (expandedsPaths.length > 0) { - const expandedDatanodes = treeControl.dataNodes.filter(node => node.hasChildren).filter(node => expandedsPaths.includes(node.data.path)); - treeControl.expansionModel.select(...expandedDatanodes); - } - if (this.compareTabPage !== 'details') { - treeControl.expand(treeControl.dataNodes[0]); - } - } - - private syncScrollSubscription() { - this.scrollSubscription && this.scrollSubscription.forEach(sub => sub.unsubscribe()); - this.scrollSubscription = this.virtualScrollRef.map(kk => kk.elementScrolled().subscribe((event: Event) => { - const target = event.target as HTMLElement; - if (!this.originalScrolledElement) { - this.originalScrolledElement = target; - } - if (this.originalScrolledElement !== target) { - return; - } - - clearTimeout(this.timeoutIndex); - this.timeoutIndex = setTimeout(() => this.originalScrolledElement = null, 500); - this.virtualScrollRef.forEach(k => { - if (k.elementRef.nativeElement !== kk.elementRef.nativeElement) { - k.elementRef.nativeElement.scrollTo({top: target.scrollTop, left: target.scrollLeft}); - } - }); - }) - ); - } - - goToNextDiff(direction: nextDiffDirectionEnum) { - if (direction === 'down') { - this.selectedPathIndex = this.onlyDiffsPaths.length - 1 > this.selectedPathIndex ? this.selectedPathIndex + 1 : 0; - } else if (this.selectedPathIndex > 0) { - this.selectedPathIndex -= 1; - } else { - this.selectedPathIndex = this.onlyDiffsPaths.length - 1; - } - this.selectedPath = this.onlyDiffsPaths[this.selectedPathIndex]; - this.exapndAndScrollToPath(); - } - - private exapndAndScrollToPath() { - const openPaths = []; - let pathPartial = ''; - const selectedPath = this.selectedPath ? this.selectedPath.split(',') : []; - selectedPath.forEach((pathPart, index) => { - if (index === 0) { - pathPartial = pathPart; - } else { - pathPartial = pathPartial + ',' + pathPart; - } - openPaths.push(pathPartial); + this.onInit(); + + this.routerParamsSubscription = this.taskIds$.subscribe((experimentIds: string) => this.store.dispatch(experimentListUpdated({ids: experimentIds.split(',')}))); + + this.experimentsSubscription = this.experiments$.pipe( + filter(experiments => !!experiments && experiments.length > 0), + tap(experiments => { + this.syncUrl(experiments); + this.extractTags(experiments); + }), + ).subscribe(experiments => { + this.originalExperiments = experiments.reduce((acc, exp) => { + acc[exp.id] = isDetailsConverted(exp) ? this.originalExperiments[exp.id] : exp; + return acc; + }, {} as { [id: string]: ConfigurationItem }); + experiments = Object.values(this.originalExperiments).map(experiment => convertExperimentsArrays(experiment, this.originalExperiments[experiments[0].id], experiments)); + this.resetComponentState(experiments); + this.calculateTree(experiments); }); - let nodeGotExpanded = false; - if (!isEqual(openPaths.slice(0, openPaths.length - 1), this.previousOpenPaths)) { - Object.keys(this.experimentsDataControl).forEach(id => { - const [dataSource, treeControl] = this.experimentsDataControl[id]; - const nodesToOpen = treeControl.dataNodes.filter(node => node.hasChildren).filter(n => { - const currentPath = n.data.path; - return !treeControl.isExpanded(n) && openPaths.includes(currentPath); - }); - if (nodesToOpen.length > 0) { - treeControl.expansionModel.select(...nodesToOpen); - nodeGotExpanded = true; - } - }); - } - this.previousOpenPaths = openPaths.slice(0, openPaths.length - 1); - const [dataSource, treeControl] = Object.values(this.experimentsDataControl)[0]; - const selectedNodeIndex = this.findRealIndex(dataSource); - const scrollToInPixels = (selectedNodeIndex + 1) * 28 - this.virtualScrollRef.first.getViewportSize() / 2; - if (nodeGotExpanded) { - // Hack to make multiple scroll work with cdk. Don't change - window.setTimeout(() => this.virtualScrollRef.forEach(vs => vs.elementRef.nativeElement.scrollTo({top: scrollToInPixels})), 200); - window.setTimeout(() => this.virtualScrollRef.forEach(vs => vs.elementRef.nativeElement.scrollTo({top: scrollToInPixels})), 300); - } else { - this.virtualScrollRef.forEach(vs => vs.elementRef.nativeElement.scrollTo({top: scrollToInPixels})); - window.setTimeout(() => this.virtualScrollRef.forEach(vs => vs.elementRef.nativeElement.scrollTo({top: scrollToInPixels})), 0); - // window.setTimeout(() => this.virtualScrollRef.forEach(vs => vs.elementRef.nativeElement.scrollTo({top: scrollToInPixels})), 100); - } - } - - public find(text: string) { - if (text) { - this.findAllOccurrences(text); - this.foundIndex = -1; - this.findNext(); - } else if (this.searchText !== text) { - this.foundPaths = []; - this.selectedPath = null; - } - this.searchText = text; } - private findAllOccurrences(text) { - text = text.toLowerCase(); - const foundPathsPerExpTemp = Object.values(this.experimentsDataControl).map(exp => exp[1].dataNodes - .map((node, index) => { - if (node.hasChildren) { - if (node.data.key.includes(text)) { - return {path: node.data.path, index}; - } - } else if (node.data.key.replace(/(a_){0,1}hash_/, '').includes(text) || (node.data.value !== undefined && JSON.stringify(node.data.value).toLowerCase().includes(text))) { - return {path: node.data.path, index}; - } - }) - .filter(i => i) - ); - - const foundPathsPerExp = (foundPathsPerExpTemp as any).flat() - .sort((a, b) => (a.index > b.index) ? 1 : -1) - .map(found => found.path); - this.foundPaths = Array.from(new Set((foundPathsPerExp))); - } - - public findNext() { - if (this.foundPaths.length === 0) { - return; - } - this.foundIndex = this.foundIndex === (this.foundPaths.length - 1) ? 0 : this.foundIndex + 1; - this.selectedPath = this.foundPaths[this.foundIndex]; - this.exapndAndScrollToPath(); - } - - public findPrev() { - if (this.foundPaths.length === 0) { - return; - } - this.foundIndex = this.foundIndex === 0 ? this.foundPaths.length - 1 : this.foundIndex - 1; - this.selectedPath = this.foundPaths[this.foundIndex]; - this.exapndAndScrollToPath(); - } - - buildDetailsTree(experiments: Array): ExperimentCompareTree { + buildCompareTree(experiments: Array): ExperimentCompareTree { const mergedExperiment = getAllKeysEmptyObject(experiments); return experiments .reduce((acc, cur) => { @@ -373,158 +60,11 @@ export class ExperimentCompareDetailsComponent extends ExperimentCompareDetailsB }, {} as ExperimentCompareTree); } - buildHyperParamsTree(experiments: Array): ExperimentCompareTree { - const mergedExperiment = getAllKeysEmptyObject(experiments); - return experiments - .reduce((acc, cur) => { - acc[cur.id] = { - 'hyper-params': this.buildSectionTree(cur, 'parameters', mergedExperiment) - }; - - return acc; - }, {} as ExperimentCompareTree); - } - - buildSectionTree(experiment, section, mergedExperiment): ExperimentCompareTreeSection { - return treeBuilderService.buildTreeFromJson( - {[section]: mergedExperiment[section]}, - this.dataTransformer, - this.metaDataTransformer, - {experiment: experiment} - ); - } - - dataTransformer = (data, key, path, extraParams: { experiment; section: string }) => { - // TODO: get the origin experiment from the state (selectedExperiment). - const originExperiment: any = this.baseExperiment; - const fullPath = path.concat([key]); - const diffObject = createDiffObjectDetails(originExperiment, extraParams.experiment, fullPath, key); - return {...diffObject, key, path: fullPath.join(',')}; - }; - - metaDataTransformer = (data, key, path, extraParams): TreeNodeMetadata => { - // TODO: get the origin experiment from the state (selectedExperiment). - const fullPath = path.concat([key]); - const originExperiment: any = this.baseExperiment; - const originObject = get(fullPath, originExperiment); - const comparedObject = get(fullPath, extraParams.experiment); - const keyExists = has(fullPath, extraParams.experiment); - const isEquals = (originObject === comparedObject) || isEqual(originObject, comparedObject); - const isPrimitive = this.isPrimitive(originObject) || originObject === undefined || originObject === null; - const isEmptyObject = isEmpty(comparedObject) || Object.values(comparedObject).every(val => val === undefined); - - this.allPaths[fullPath] = this.allPaths[fullPath] || !isEquals; - if (isPrimitive) { - this.setPathDif(fullPath, isEquals, (originObject === undefined && comparedObject === undefined)); - } - if (originObject === undefined && comparedObject && !this.isPrimitive(comparedObject)) { - delete this.allPathsDiffs[fullPath]; - } - return { - classStyle: (isEquals ? '' : 'al-danger ') + (isEmptyObject ? 'al-empty-collapse ' : '') + (keyExists ? '' : 'hide-field'), - }; - }; - - isPrimitive(obj) { - return (typeof obj === 'string' || typeof obj === 'boolean' || typeof obj === 'number'); - } - - private setPathDif(fullPath, isEquals, undefinedOriginFirstRun) { - if (!this.allPathsDiffs[fullPath]) { - this.allPathsDiffs[fullPath] = !isEquals; - } - if (undefinedOriginFirstRun && this.allPathsDiffs[fullPath] === undefined) { - this.allPathsDiffs[fullPath] = false; - } - } - experimentListChanged(experiments: Array) { - this.store.dispatch(new detailsActions.SetExperiments(experiments)); - } - - private syncUrl(experiments: Array, urlParams: string) { - const newParams = this.getExperimentIdsParams(experiments); - if (newParams !== urlParams) { - this.router.navigateByUrl(this.router.url.replace(urlParams, newParams)); - } - } - - private getExperimentIdsParams(experiments: Array): string { - return experiments ? experiments.map(e => e.id).toString() : ''; - } - - selectedPathClicked(path) { - if (this.onlyDiffsPaths.includes(path)) { - this.selectedPath = path; - this.selectedPathIndex = this.onlyDiffsPaths.indexOf(this.selectedPath); - } - } - - keyClicked(data, event: MouseEvent) { - const path = data.path; - this.selectedPathClicked(path); - } - - checkIfSelectedPath = (data: any) => this.selectedPath === (data.path); - - // checkIfFoundPathPath = (data: any) => this.foundPath === (data.path); - - checkIfIdenticalRow(data: any) { - if (this.hideIdenticalFields && this.allPaths) { - const currentPath = data.path; - return !this.allPaths[currentPath]; - } else { - return false; - } - } - - private filterTreeDiffs(node: any) { - if (node.data && this.allPaths[node.data.path] === false) { - return false; - } - if (Array.isArray(node)) { - return node.map(item => this.filterTreeDiffs(item)).filter(item => !!item); - } - if (node.children) { - return {...node, children: this.filterTreeDiffs(node.children)}; - } - if (node.data) { - return {...node, data: this.filterTreeDiffs(node.data)}; - } - return node; - } - - private findRealIndex(ds: MatTreeFlatDataSource, FlatNode>) { - return ds._expandedData.value.findIndex(node => node.data?.path === this.selectedPath); - } - - copyIdToClipboard() { - this.store.dispatch(new AddMessage('success', 'Copied to clipboard')); - } - - // Function that maps a nested node to a flat node - private nodeTransformer(node: TreeNode, level: number) { - return { - data: node.data, - metaData: node.metaData, - level, - parent: node.parent, - hasChildren: !!node.children, - }; - } - -// Function that gets a flat node's level - private getNodeLevel({level}: FlatNode) { - return level; - } - -// Function that determines whether a flat node is expandable or not - private getIsNodeExpandable({hasChildren}: FlatNode) { - return hasChildren; + this.store.dispatch(setExperiments({experiments})); } -// Function that returns a nested node's list of children - private getNodeChildren(node: TreeNode) { - return node.children; + toggleEllipsis() { + this.showEllipsis = !this.showEllipsis; } } diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-hyper-params-graph/experiment-compare-hyper-params-graph.component.html b/src/app/webapp-common/experiments-compare/containers/experiment-compare-hyper-params-graph/experiment-compare-hyper-params-graph.component.html index 8fb91f53..b58b6041 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-hyper-params-graph/experiment-compare-hyper-params-graph.component.html +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-hyper-params-graph/experiment-compare-hyper-params-graph.component.html @@ -50,7 +50,7 @@
- Hide identical fields - +
diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-hyper-params-graph/experiment-compare-hyper-params-graph.component.scss b/src/app/webapp-common/experiments-compare/containers/experiment-compare-hyper-params-graph/experiment-compare-hyper-params-graph.component.scss index 8c6745db..b9ffba33 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-hyper-params-graph/experiment-compare-hyper-params-graph.component.scss +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-hyper-params-graph/experiment-compare-hyper-params-graph.component.scss @@ -16,19 +16,6 @@ } } - /deep/ sm-checked-filter-list { - - .title { - font-size: 16px; - font-weight: 500; - } - - .purple-v { - width: 20px !important; - height: 20px !important; - } - } - /deep/ .mat-expansion-panel-body { padding: 0; } @@ -91,12 +78,6 @@ } } -sm-checked-filter-list { - flex: 1; - overflow: auto; - margin: 0 12px 0 32px; -} - .separate-margins { margin: 24px 0 20px 0; } @@ -121,9 +102,6 @@ sm-checked-filter-list { &__header { padding: 0 2px 0 0; - &:hover { - background: rgba(0, 0, 0, 0) !important; - } } &__title { @@ -155,7 +133,7 @@ sm-checked-filter-list { } &:hover { - background: $very-light-blue; + background: $blue-50; } } @@ -191,3 +169,7 @@ sm-checked-filter-list { width: 300px; height: 300px; } + +sm-grouped-checked-filter-list { + margin: 0 12px 0 32px; +} diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-hyper-params-graph/experiment-compare-hyper-params-graph.component.ts b/src/app/webapp-common/experiments-compare/containers/experiment-compare-hyper-params-graph/experiment-compare-hyper-params-graph.component.ts index 6fdedcdf..203c2847 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-hyper-params-graph/experiment-compare-hyper-params-graph.component.ts +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-hyper-params-graph/experiment-compare-hyper-params-graph.component.ts @@ -5,11 +5,11 @@ import {select, Store} from '@ngrx/store'; import {IExperimentInfoState} from '../../../../features/experiments/reducers/experiment-info.reducer'; import {distinctUntilChanged, distinctUntilKeyChanged, filter, map} from 'rxjs/operators'; import {selectRouterParams} from '../../../core/reducers/router-reducer'; -import {get} from 'lodash/fp'; +import {get, has} from 'lodash/fp'; import {SetExperimentSettings, SetSelectedExperiments} from '../../actions/experiments-compare-charts.actions'; import {selectRefreshing, selectScalarsGraphHyperParams, selectScalarsGraphMetrics, selectScalarsGraphShowIdenticalHyperParams, selectScalarsGraphTasks, selectMetricValueType, selectSelectedSettigsHyperParams, selectSelectedSettigsMetric} from '../../reducers'; import {getExperimentsHyperParams, setShowIdenticalHyperParams, setvalueType} from '../../actions/experiments-compare-scalars-graph.actions'; -import {HyperParams, MetricOption, MetricValueType, SelectedMetric, VariantOption} from '../../reducers/experiments-compare-charts.reducer'; +import {GroupedHyperParams, HyperParams, MetricOption, MetricValueType, SelectedMetric, VariantOption} from '../../reducers/experiments-compare-charts.reducer'; import {MatRadioChange} from '@angular/material/radio'; @@ -32,7 +32,7 @@ export class ExperimentCompareHyperParamsGraphComponent implements OnInit, OnDes private refreshingSubscription: Subscription; public selectShowIdenticalHyperParams$: Observable; - public hyperParams$: Observable; + public hyperParams$: Observable; public metrics$: Observable; public selectedHyperParams$: Observable; private selectedMetric$: Observable; @@ -42,7 +42,7 @@ export class ExperimentCompareHyperParamsGraphComponent implements OnInit, OnDes public graphs: { [key: string]: ExperimentGraph }; public selectedHyperParams: string[]; public selectedMetric: SelectedMetric; - public hyperParams: string[]; + public hyperParams: { [section: string]: string[] }; public showIdenticalParamsActive: boolean; public metrics: MetricOption[]; @@ -76,7 +76,7 @@ export class ExperimentCompareHyperParamsGraphComponent implements OnInit, OnDes ngOnInit() { this.selectMetricSubscription = this.selectedMetric$.pipe( distinctUntilChanged((x, y) => x?.path === y?.path) - ).subscribe((selectedMetric: SelectedMetric) => this.selectedMetric = {...selectedMetric}); + ).subscribe((selectedMetric: SelectedMetric) => this.selectedMetric = selectedMetric?.name? {...selectedMetric} : null); this.metricSubscription = this.metrics$.pipe(filter(metrics => !!metrics)).subscribe(metrics => { this.metrics = metrics; @@ -93,8 +93,19 @@ export class ExperimentCompareHyperParamsGraphComponent implements OnInit, OnDes ) .subscribe(([selectedParams, allParams, showIdentical]) => { this.showIdenticalParamsActive = showIdentical; - this.hyperParams = Object.entries(allParams).filter(([param, hasDiff]) => showIdentical || hasDiff).map(([param, hasDiff]) => param).sort((a, b) => a.toLowerCase() > b.toLowerCase() ? 1 : -1); - this.selectedHyperParams = selectedParams.filter(selectedParam => this.hyperParams.includes(selectedParam)); + this.hyperParams = Object.entries(allParams).reduce((acc, [sectionKey, params]) => { + const section = Object.keys(params).sort((a, b) => a.toLowerCase() > b.toLowerCase() ? 1 : -1).reduce((acc2, paramKey) => { + if (showIdentical || params[paramKey]) { + acc2[paramKey] = true; + } + return acc2; + }, {}); + if (Object.keys(section).length > 0) { + acc[sectionKey] = section; + } + return acc; + }, {}); + this.selectedHyperParams = selectedParams.filter(selectedParam => has(selectedParam, this.hyperParams)); }); this.routerParamsSubscription = this.store.pipe( @@ -179,11 +190,11 @@ export class ExperimentCompareHyperParamsGraphComponent implements OnInit, OnDes this.listOpen = true; } - trackMetricByFn(item: MetricOption): string { + trackMetricByFn(index: number, item: MetricOption): string { return item.metricName; } - trackVariantByFn(item: VariantOption['value']): string { + trackVariantByFn(index: number, item: VariantOption['value']): string { return item.path; } diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-charts/experiment-compare-scalar-charts.component.ts b/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-charts/experiment-compare-scalar-charts.component.ts index bef2f5f3..f0f9e65e 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-charts/experiment-compare-scalar-charts.component.ts +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-charts/experiment-compare-scalar-charts.component.ts @@ -69,7 +69,9 @@ export class ExperimentCompareScalarChartsComponent implements OnInit, OnDestroy distinctUntilChanged(), tap(() => this.refreshDisabled = true) ); - this.xAxisSub = this.xAxisType$.pipe(filter((axis) => !!axis)).subscribe((axis) => this.store.dispatch(new GetMultiScalarCharts({taskIds: this.taskIds}))); + this.xAxisSub = this.xAxisType$ + .pipe(filter((axis) => !!axis)) + .subscribe((axis) => this.store.dispatch(new GetMultiScalarCharts({taskIds: this.taskIds, cached: true}))); } ngOnInit() { diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-values/experiment-compare-metric-values.component.scss b/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-values/experiment-compare-metric-values.component.scss index 620d911d..a5d0fc49 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-values/experiment-compare-metric-values.component.scss +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-values/experiment-compare-metric-values.component.scss @@ -1,3 +1,5 @@ +@import "../../../shared/ui-components/styles/variables"; + .no-metric { background-color: #f2f3f6; } @@ -14,6 +16,10 @@ .content { cursor: pointer; + font-size: 13px; + font-weight: 500; + color: $blue-500; + .fas { margin-left: 6px; font-size: 11px; diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-plots/experiment-compare-plots.component.scss b/src/app/webapp-common/experiments-compare/containers/experiment-compare-plots/experiment-compare-plots.component.scss index da74936d..94941214 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-plots/experiment-compare-plots.component.scss +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-plots/experiment-compare-plots.component.scss @@ -17,7 +17,7 @@ .graphs-container { padding: 0 !important; - width: calc(100vw - 420px); + width: calc(100% - 420px); } } diff --git a/src/app/webapp-common/experiments-compare/containers/select-experiments-for-compare/select-experiments-for-compare.component.scss b/src/app/webapp-common/experiments-compare/containers/select-experiments-for-compare/select-experiments-for-compare.component.scss index 1bb19dd9..dcbb7452 100644 --- a/src/app/webapp-common/experiments-compare/containers/select-experiments-for-compare/select-experiments-for-compare.component.scss +++ b/src/app/webapp-common/experiments-compare/containers/select-experiments-for-compare/select-experiments-for-compare.component.scss @@ -23,7 +23,7 @@ &.show-table { height: auto; overflow: initial; - max-height: 500px; + max-height: 400px; } } @@ -38,7 +38,7 @@ :host { sm-select-experiments-for-compare-table { overflow: auto; - height: 500px; + max-height: 500px; } /deep/ .form-control.table-container footer.d-flex.justify-content-center { diff --git a/src/app/webapp-common/experiments-compare/dumbs/experiment-compare-general-data/experiment-compare-general-data.component.html b/src/app/webapp-common/experiments-compare/dumbs/experiment-compare-general-data/experiment-compare-general-data.component.html index 31557cbb..3721d9dc 100644 --- a/src/app/webapp-common/experiments-compare/dumbs/experiment-compare-general-data/experiment-compare-general-data.component.html +++ b/src/app/webapp-common/experiments-compare/dumbs/experiment-compare-general-data/experiment-compare-general-data.component.html @@ -1,5 +1,5 @@
-
{{experiment.project.name}}
+
{{experiment.project?.name}}

{{experiment.name}}

-
+
diff --git a/src/app/webapp-common/experiments-compare/dumbs/experiment-compare-header/experiment-compare-header.component.scss b/src/app/webapp-common/experiments-compare/dumbs/experiment-compare-header/experiment-compare-header.component.scss index 03c7a760..2deb53bf 100644 --- a/src/app/webapp-common/experiments-compare/dumbs/experiment-compare-header/experiment-compare-header.component.scss +++ b/src/app/webapp-common/experiments-compare/dumbs/experiment-compare-header/experiment-compare-header.component.scss @@ -23,7 +23,7 @@ } .btn-group sm-search { - width: 243px; + width: 200px; .search-input-container { @@ -60,7 +60,7 @@ .mat-select-trigger { width: 142px; - border: 1px solid $cloudy-blue; + border: 1px solid $blue-250; border-radius: 4px; height: 32px; padding: 7px 14px; @@ -95,6 +95,18 @@ } } + .settings { + display: flex; + align-items: center; + + .btn { + color: $blue-300; + width: 40px; + height: 40px; + font-size: 15px; + } + } + button { font-weight: 500; font-size: 13px; @@ -102,7 +114,7 @@ .btn-add-experiment { width: 146px; - background-color: $very-light-blue; + background-color: $blue-50; } diff --git a/src/app/webapp-common/experiments-compare/dumbs/parallel-coordinates-graph/parallel-coordinates-graph.component.html b/src/app/webapp-common/experiments-compare/dumbs/parallel-coordinates-graph/parallel-coordinates-graph.component.html index f5862a45..b2b8a2ad 100644 --- a/src/app/webapp-common/experiments-compare/dumbs/parallel-coordinates-graph/parallel-coordinates-graph.component.html +++ b/src/app/webapp-common/experiments-compare/dumbs/parallel-coordinates-graph/parallel-coordinates-graph.component.html @@ -4,19 +4,22 @@
- - + + + - -
+ {{experiment.name + (experiment.duplicateName ? ('.' + (experiment.id|slice:0:5)) : '')}} -
+
diff --git a/src/app/webapp-common/experiments-compare/dumbs/parallel-coordinates-graph/parallel-coordinates-graph.component.ts b/src/app/webapp-common/experiments-compare/dumbs/parallel-coordinates-graph/parallel-coordinates-graph.component.ts index 67030496..40f05d18 100644 --- a/src/app/webapp-common/experiments-compare/dumbs/parallel-coordinates-graph/parallel-coordinates-graph.component.ts +++ b/src/app/webapp-common/experiments-compare/dumbs/parallel-coordinates-graph/parallel-coordinates-graph.component.ts @@ -2,10 +2,12 @@ import {ChangeDetectorRef, Component, ElementRef, HostListener, Input, OnInit, R import {PlotlyGraphBase} from '../../../shared/experiment-graphs/single-graph/plotly-graph-base'; import {debounceTime, filter} from 'rxjs/operators'; import {ColorHashService} from '../../../shared/services/color-hash/color-hash.service'; -import {get, isEqual, max, min, uniq, cloneDeep} from 'lodash/fp'; +import {get, getOr, isEqual, max, min, uniq, cloneDeep} from 'lodash/fp'; import {MetricValueType, SelectedMetric} from '../../reducers/experiments-compare-charts.reducer'; import {Task} from '../../../../business-logic/model/tasks/task'; import {select} from 'd3-selection'; +import {sortCol} from '../../../shared/utils/tableParamEncode'; +import {Store} from '@ngrx/store'; declare let Plotly; @@ -14,6 +16,15 @@ interface ExtraTask extends Task { hidden: boolean; } +interface ParaPlotData { + type: string; + dimensions: any[]; + line: { + color: Plotly.Color; + colorscale?: Plotly.ColorScale; + }; +} + @Component({ selector: 'sm-parallel-coordinates-graph', templateUrl: './parallel-coordinates-graph.component.html', @@ -21,7 +32,7 @@ interface ExtraTask extends Task { }) export class ParallelCoordinatesGraphComponent extends PlotlyGraphBase implements OnInit { - private data: { line: { color: Task[]; colorscale: (number | string)[][] }; type: string; dimensions: unknown[] }[]; + private data: ParaPlotData[]; private _experiments: ExtraTask[]; private _metric: SelectedMetric; public experimentsColors = {}; @@ -32,6 +43,8 @@ export class ParallelCoordinatesGraphComponent extends PlotlyGraphBase implement @ViewChild('parallelGraph', {static: true}) parallelGraph: ElementRef; private graphWidth: any; private _metricValueType: MetricValueType; + private highlighted: ExtraTask; + private dimensionsOrder: string[]; @HostListener('window:resize') redrawChart() { @@ -122,10 +135,12 @@ export class ParallelCoordinatesGraphComponent extends PlotlyGraphBase implement } constructor( - public renderer: Renderer2, - public colorHash: ColorHashService, - public changeDetector: ChangeDetectorRef) { - super(); + protected store: Store, + protected renderer: Renderer2, + protected elementRef: ElementRef, + private colorHash: ColorHashService, + private changeDetector: ChangeDetectorRef) { + super(store, renderer, elementRef); } ngOnInit(): void { @@ -142,46 +157,50 @@ export class ParallelCoordinatesGraphComponent extends PlotlyGraphBase implement this.prepareGraph(); } - getStringColor(name): string { - const colorArr = this.colorHash.initColor(name); + getStringColor(experiment: ExtraTask): string { + const colorArr = this.colorHash.initColor(experiment.id); return `rgb(${colorArr[0]},${colorArr[1]},${colorArr[2]})`; } - getColorsArray(experiments): Task[] { - return experiments.map((experiment, index) => (index === (experiments.length - 1)) ? 1.0 : index / 10); + getColorsArray(experiments): number[] { + return experiments.map((experiment, index) => index / (experiments.length - 1)); } private prepareGraph(): void { - this.experiments.forEach(experiment => this.experimentsColors[experiment.id] = this.getStringColor(experiment.id)); - const filteredExperiments = this.experiments.filter(experiment => !this.filteredExperiments.includes(experiment.id)); + this.experiments.forEach(experiment => this.experimentsColors[experiment.id] = this.getStringColor(experiment)); + const filteredExperiments = this.experiments.filter(experiment => !experiment.hidden); if (this.parameters && filteredExperiments.length > 0) { - const trace: any = { + const trace = { type: 'parcoords', dimensions: this.parameters.map((parameter) => { - const dimension: any = {}; - const allValuesIncludingNull = filteredExperiments.map(experiment => experiment.execution.parameters[parameter]); + parameter = `${parameter}.value`; + const allValuesIncludingNull = this.experiments.map(experiment => get(parameter, experiment.hyperparams)); const allValues = allValuesIncludingNull.filter(value => (value !== undefined)).filter(value => (value !== '')); - dimension.label = parameter; const textVal: any = {}; - dimension.ticktext = this.naturalCompare(uniq(allValues).filter(text => text !== '')); - (allValuesIncludingNull.length > allValues.length) && (dimension.ticktext = ['N/A'].concat(dimension.ticktext)); - dimension.tickvals = dimension.ticktext.map((text, index) => { + let ticktext = this.naturalCompare(uniq(allValues).filter(text => text !== '')); + (allValuesIncludingNull.length > allValues.length) && (ticktext = ['N/A'].concat(ticktext)); + const tickvals = ticktext.map((text, index) => { textVal[text] = index; return index; }); - dimension.values = filteredExperiments.map((experiment) => (textVal[['', undefined].includes(experiment.execution.parameters[parameter]) ? 'N/A' : experiment.execution.parameters[parameter]])); - dimension.range = [0, max(dimension.tickvals)]; - return dimension; + return { + label: parameter, + ticktext, + tickvals, + values: filteredExperiments.map((experiment) => (textVal[['', undefined].includes(get(parameter, experiment.hyperparams)) ? 'N/A' : get(parameter, experiment.hyperparams)])), + range: [0, max(tickvals)] + }; }) - }; + } as ParaPlotData ; if (filteredExperiments.length > 1) { trace.line = { color: this.getColorsArray(filteredExperiments), - colorscale: filteredExperiments.map((experiment, index) => [index === filteredExperiments.length - 1 ? 1.0 : index / 10, this.getStringColor(experiment.id)]) + colorscale: filteredExperiments.map((experiment, index) => + [index / (filteredExperiments.length - 1), this.getStringColor(experiment)] as [number, string]), }; } else { trace.line = { - color: this.getStringColor(filteredExperiments[0].id) + color: this.getStringColor(filteredExperiments[0]) }; } @@ -190,18 +209,25 @@ export class ParallelCoordinatesGraphComponent extends PlotlyGraphBase implement // this.drawChart(); if (this.metric) { - const metricDimension: any = {}; - const allValuesIncludingNull = filteredExperiments.map(experiment => get(`${this.metric.path}.${this.metricValueType}`, experiment.last_metrics)); + const allValuesIncludingNull = this.experiments.map(experiment => get(`${this.metric.path}.${this.metricValueType}`, experiment.last_metrics)); const allValues = allValuesIncludingNull.filter(value => value !== undefined); const NAVal = this.getNAValue(allValues); - metricDimension.label = this.metric.name; - metricDimension.ticktext = uniq(allValuesIncludingNull.map(value => value !== undefined ? value : 'N/A')); - metricDimension.tickvals = metricDimension.ticktext.map(text => text === 'N/A' ? NAVal : text); - metricDimension.values = filteredExperiments.map((experiment) => get(`${this.metric.path}.${this.metricValueType}`, experiment.last_metrics) === undefined ? NAVal : - parseFloat(get(`${this.metric.path}.${this.metricValueType}`, experiment.last_metrics))); - trace.dimensions.push(metricDimension); + const ticktext = uniq(allValuesIncludingNull.map(value => value !== undefined ? value : 'N/A')); + const tickvals = ticktext.map(text => text === 'N/A' ? NAVal : text); + trace.dimensions.push({ + label: this.metric.name, + ticktext, + tickvals, + values: filteredExperiments.map((experiment) => + parseFloat(getOr(NAVal, `${this.metric.path}.${this.metricValueType}`, experiment.last_metrics)) + ), + range: [min(tickvals), max(tickvals)] + }); } this.data = [trace]; + if (this.dimensionsOrder) { + this.data[0].dimensions.sort((a, b) => sortCol(a.label, b.label, this.dimensionsOrder)); + } this.drawChart(); } } @@ -212,7 +238,7 @@ export class ParallelCoordinatesGraphComponent extends PlotlyGraphBase implement } const valuesMax = max(values); const valuesMin = min(values); - return valuesMax === valuesMin ? (valuesMin - 1) : valuesMin - ((valuesMax - valuesMin) / 10); + return valuesMax === valuesMin ? (valuesMin - 1) : valuesMin - ((valuesMax - valuesMin) / values.length); } private drawChart() { @@ -261,4 +287,20 @@ export class ParallelCoordinatesGraphComponent extends PlotlyGraphBase implement const collator = new Intl.Collator(undefined, {numeric: true, sensitivity: 'base'}); return (myArray.sort(collator.compare)); } + + highlightExperiment(experiment: ExtraTask) { + if (this.highlighted?.id != experiment?.id) { + this.highlighted = experiment; + this.dimensionsOrder = this.parallelGraph.nativeElement.data?.[0].dimensions.map(d => d.label); + this._experiments = this.experiments.map(exp => ({...exp, hidden: exp.id !== experiment.id})); + this.prepareGraph(); + } + } + + removeHighlightExperiment() { + this.highlighted = null; + this._experiments = this.experiments.map(experiment => ({...experiment, hidden: this.filteredExperiments.includes(experiment.id)})); + this.prepareGraph(); + this.dimensionsOrder = null; + } } diff --git a/src/app/webapp-common/experiments-compare/dumbs/select-experiments-for-compare-table/select-experiments-for-compare-table.component.ts b/src/app/webapp-common/experiments-compare/dumbs/select-experiments-for-compare-table/select-experiments-for-compare-table.component.ts index 03223175..cdae10f4 100644 --- a/src/app/webapp-common/experiments-compare/dumbs/select-experiments-for-compare-table/select-experiments-for-compare-table.component.ts +++ b/src/app/webapp-common/experiments-compare/dumbs/select-experiments-for-compare-table/select-experiments-for-compare-table.component.ts @@ -10,7 +10,7 @@ export const EXPERIMENTS_TABLE_COL_FIELDS = { USER : 'user.name' as ExperimentTableColFieldsEnum, TAGS : 'tags' as ExperimentTableColFieldsEnum, STATUS : 'status' as ExperimentTableColFieldsEnum, - PROJECT : 'project.name' as ExperimentTableColFieldsEnum, + PROJECT : 'project.name' as ExperimentTableColFieldsEnum, }; export const INITIAL_EXPERIMENT_TABLE_COLS = [ @@ -23,64 +23,72 @@ export const INITIAL_EXPERIMENT_TABLE_COLS = [ static : true, headerStyleClass: 'selected-col-header', style : {width: '20px'}, + disableDrag : true, }, { - id : EXPERIMENTS_TABLE_COL_FIELDS.TYPE, - sortable : false, - filterable : false, - static : true, - header : 'TYPE', - style : {width: '40px'}, + id : EXPERIMENTS_TABLE_COL_FIELDS.TYPE, + sortable : false, + filterable : false, + static : true, + header : 'TYPE', + style : {width: '40px'}, + disableDrag: true, }, { - id : EXPERIMENTS_TABLE_COL_FIELDS.ID, - sortable : false, - filterable : false, - header : 'ID', - hidden : true, - static : true, - style : {width: '150px'}, + id : EXPERIMENTS_TABLE_COL_FIELDS.ID, + sortable : false, + filterable : false, + header : 'ID', + hidden : true, + static : true, + style : {width: '150px'}, + disableDrag: true, }, { - id : EXPERIMENTS_TABLE_COL_FIELDS.NAME, - sortable : false, - static : true, - header : 'NAME', - style : {width: '170px'}, + id : EXPERIMENTS_TABLE_COL_FIELDS.NAME, + sortable : false, + static : true, + header : 'NAME', + style : {width: '170px'}, + disableDrag: true, }, { - id : EXPERIMENTS_TABLE_COL_FIELDS.USER, - sortable: false, - static : true, - header : 'USER', - style : {width: '115px'} + id : EXPERIMENTS_TABLE_COL_FIELDS.USER, + sortable : false, + static : true, + header : 'USER', + style : {width: '115px'}, + disableDrag: true, }, { - id : EXPERIMENTS_TABLE_COL_FIELDS.TAGS, - sortable: false, - static : true, - header : 'TAGS', - style : {width: '110px'} + id : EXPERIMENTS_TABLE_COL_FIELDS.TAGS, + sortable : false, + static : true, + header : 'TAGS', + style : {width: '110px'}, + disableDrag: true, }, { - id : EXPERIMENTS_TABLE_COL_FIELDS.STATUS, - filterable : false, - static : true, - header : 'STATUS', - style : {width: '80px'}, + id : EXPERIMENTS_TABLE_COL_FIELDS.STATUS, + filterable : false, + static : true, + header : 'STATUS', + style : {width: '80px'}, + disableDrag: true, }, { - id : EXPERIMENTS_TABLE_COL_FIELDS.PROJECT, - filterable : false, - static : true, - header : 'PROJECT', - style : {width: '80px'}, + id : EXPERIMENTS_TABLE_COL_FIELDS.PROJECT, + filterable : false, + static : true, + header : 'PROJECT', + style : {width: '80px'}, + disableDrag: true, } ]; export enum ExperimentTagsEnum { Development = 'development', - Hidden = 'archived' + Hidden = 'archived' } export interface AddExperimentEvent { @@ -106,11 +114,11 @@ export class SelectExperimentsForCompareTableComponent implements OnInit { public typeFiltersValue: any; public menuPosition: { x: number; y: number }; public menuData; - public menuOpen: boolean = false; + public menuOpen: boolean = false; @Input() searchTerm; @Input() tableCols; @Input() experiments: Array = []; - @Input() selectedExperiments: Array = []; + @Input() selectedExperiments: Array = []; @Output() experimentsSelectionChanged = new EventEmitter(); diff --git a/src/app/webapp-common/experiments-compare/effects/experiments-compare-charts.effects.ts b/src/app/webapp-common/experiments-compare/effects/experiments-compare-charts.effects.ts index 55fb97aa..e3cf6b1a 100644 --- a/src/app/webapp-common/experiments-compare/effects/experiments-compare-charts.effects.ts +++ b/src/app/webapp-common/experiments-compare/effects/experiments-compare-charts.effects.ts @@ -11,7 +11,7 @@ import {ApiAuthService} from '../../../business-logic/api-services/auth.service' import {BlTasksService} from '../../../business-logic/services/tasks.service'; import {ApiEventsService} from '../../../business-logic/api-services/events.service'; import {RequestFailed} from '../../core/actions/http.actions'; -import {selectCompareSelectedSettingsxAxisType} from '../reducers'; +import {selectCompareHistogramCacheAxisType, selectCompareSelectedSettingsxAxisType} from '../reducers'; import {setRefreshing} from '../actions/compare-header.actions'; import {ScalarKeyEnum} from '../../../business-logic/model/events/scalarKeyEnum'; @@ -33,39 +33,28 @@ export class ExperimentsCompareChartsEffects { getMultiScalarCharts = this.actions$.pipe( ofType(chartActions.GET_MULTI_SCALAR_CHARTS), debounceTime(200), - withLatestFrom(this.store.select(selectCompareSelectedSettingsxAxisType)), - flatMap(([action, axisType]) => this.eventsApi.eventsMultiTaskScalarMetricsIterHistogram({ - tasks: action.payload.taskIds, - key: !axisType || axisType === ScalarKeyEnum.IsoTime ? ScalarKeyEnum.Timestamp : axisType - }).pipe( - flatMap(res => { - if (!axisType || axisType === ScalarKeyEnum.IsoTime) { - res = {metrics: Object.keys(res.metrics).reduce((metricAcc, metricName) => { - const metric = res.metrics[metricName]; - metricAcc[metricName] = Object.keys(metric).reduce((groupAcc, groupName) => { - const group = metric[groupName]; - groupAcc[groupName] = Object.keys(group).reduce((graphAcc, graphName) => { - const graph = group[graphName]; - graphAcc[graphName] = {...graph, x: graph.x.map(ts => new Date(ts))}; - return graphAcc; - }, {}); - return groupAcc; - }, {}); - return metricAcc; - }, {})}; - } - return [ + withLatestFrom(this.store.select(selectCompareSelectedSettingsxAxisType), this.store.select(selectCompareHistogramCacheAxisType)), + flatMap(([action, axisType, prevAxisType]) => { + if ([ScalarKeyEnum.IsoTime, ScalarKeyEnum.Timestamp].includes(prevAxisType) && + [ScalarKeyEnum.IsoTime, ScalarKeyEnum.Timestamp].includes(axisType)) { + return [setRefreshing({payload: false}), new DeactiveLoader(action.type)]; + } + return this.eventsApi.eventsMultiTaskScalarMetricsIterHistogram({ + tasks: action.payload.taskIds, + key: !axisType || axisType === ScalarKeyEnum.IsoTime ? ScalarKeyEnum.Timestamp : axisType + }).pipe( + flatMap(res => [ // also here - new chartActions.SetExperimentHistogram(res), + new chartActions.SetExperimentHistogram(res, axisType), setRefreshing({payload: false}), - new DeactiveLoader(action.type)]; - }), - catchError(error => [ - new RequestFailed(error), new DeactiveLoader(action.type), setRefreshing({payload: false}), - new SetServerError(error, null, 'Failed to get Scalar Charts', action.payload.autoRefresh) - ]) - ) - ) + new DeactiveLoader(action.type)] + ), + catchError(error => [ + new RequestFailed(error), new DeactiveLoader(action.type), setRefreshing({payload: false}), + new SetServerError(error, null, 'Failed to get Scalar Charts', action.payload.autoRefresh) + ]) + ); + }) ); @Effect() diff --git a/src/app/webapp-common/experiments-compare/effects/experiments-compare-details.effects.ts b/src/app/webapp-common/experiments-compare/effects/experiments-compare-details.effects.ts index d00982d1..62061db2 100644 --- a/src/app/webapp-common/experiments-compare/effects/experiments-compare-details.effects.ts +++ b/src/app/webapp-common/experiments-compare/effects/experiments-compare-details.effects.ts @@ -1,90 +1,88 @@ import {Injectable} from '@angular/core'; import {Actions, Effect, ofType} from '@ngrx/effects'; import {select, Store} from '@ngrx/store'; -import {IExperimentCompareDetailsState} from '../reducers/experiments-compare-details.reducer'; -import * as detailsActions from '../actions/experiments-compare-details.actions'; import {ActiveLoader, DeactiveLoader, SetServerError} from '../../core/actions/layout.actions'; import {catchError, flatMap, map, switchMap, withLatestFrom} from 'rxjs/operators'; import {ApiTasksService} from '../../../business-logic/api-services/tasks.service'; import {ExperimentDetailsReverterService} from '../services/experiment-details-reverter.service'; import {RequestFailed} from '../../core/actions/http.actions'; -import {selectExperimentIds, selectExperimentsDetails} from '../reducers'; +import {selectExperimentIdsDetails, selectExperimentsDetails} from '../reducers'; import {Observable, of} from 'rxjs'; -import {EXPERIMENT_INFO_ONLY_FIELDS} from '../../../features/experiments-compare/experiments-compare-consts'; +import {COMPARE_DETAILS_ONLY_FIELDS} from '../../../features/experiments-compare/experiments-compare-consts'; import {IExperimentDetail} from '../../../features/experiments-compare/experiments-compare-models'; -import {refetchExperimentRequested, setRefreshing} from '../actions/compare-header.actions'; +import {REFETCH_EXPERIMENT_REQUESTED, refetchExperimentRequested, setRefreshing} from '../actions/compare-header.actions'; +import {ExperimentCompareDetailsState} from '../reducers/experiments-compare-details.reducer'; +import {experimentListUpdated, setExperiments} from '../actions/experiments-compare-details.actions'; @Injectable() export class ExperimentsCompareDetailsEffects { - constructor(private actions$: Actions, private tasksApi: ApiTasksService, private store: Store, + constructor(private actions$: Actions, private tasksApi: ApiTasksService, private store: Store, private experimentDetailsReverter: ExperimentDetailsReverterService ) { } @Effect() activeLoader$ = this.actions$.pipe( - ofType(detailsActions.EXPERIMENT_LIST_UPDATED, detailsActions.REFETCH_EXPERIMENT_REQUESTED), + ofType(experimentListUpdated, REFETCH_EXPERIMENT_REQUESTED), map(action => new ActiveLoader(action.type)) ); @Effect() UpdateExperimentsDetail$ = this.actions$.pipe( - ofType(detailsActions.EXPERIMENT_LIST_UPDATED), - withLatestFrom(this.store.pipe(select(selectExperimentIds))), - map(([action, oldExperimentIds]) => [action, action.payload.filter(id => !oldExperimentIds.includes(id))]), - switchMap(([action, newExperimentIds]: [detailsActions.ExperimentListUpdated, Array]) => - this.fetchExperimentDetails$(newExperimentIds) - .pipe( - withLatestFrom(this.store.pipe(select(selectExperimentsDetails))), - // get only the relevant experiments - map(([experiments, oldExperiments]) => oldExperiments.filter(exp => action.payload.includes(exp.id)).concat(experiments)), - flatMap(experiments => [ - new DeactiveLoader(action.type), - new detailsActions.SetExperiments(experiments) - ]), - catchError(error => { - return [ - new RequestFailed(error), + ofType(experimentListUpdated), + withLatestFrom(this.store.pipe(select(selectExperimentIdsDetails))), + switchMap(([action, oldExperimentIds]) => { + const newExperimentIds = action.ids.filter(id => !oldExperimentIds.includes(id)); + return this.fetchExperimentDetails$(newExperimentIds) + .pipe( + withLatestFrom(this.store.pipe(select(selectExperimentsDetails))), + // get only the relevant experiments + map(([experiments, oldExperiments]) => oldExperiments.filter(exp => action.ids.includes(exp.id)).concat(experiments)), + flatMap(experiments => [ new DeactiveLoader(action.type), - new SetServerError(error, null, 'The attempt to retrieve your experiment data failed. Refresh your browser and try again.') - ]; - }) - ) + setExperiments({experiments}) + ]), + catchError(error => [ + new RequestFailed(error), + new DeactiveLoader(action.type), + new SetServerError(error, null, 'The attempt to retrieve your experiment data failed. Refresh your browser and try again.') + ] + ) + ); + } ) ); @Effect() RefetchExperiment$ = this.actions$.pipe( ofType(refetchExperimentRequested), - withLatestFrom(this.store.select(selectExperimentIds)), + withLatestFrom(this.store.select(selectExperimentIdsDetails)), switchMap(([action, newExperimentIds]) => this.fetchExperimentDetails$(newExperimentIds).pipe( flatMap(experiments => [ new DeactiveLoader(action.type), setRefreshing({payload: false}), - new detailsActions.SetExperiments(experiments) + setExperiments({experiments}) ]), - catchError(error => { - return [ - new RequestFailed(error), - new DeactiveLoader(action.type), - setRefreshing({payload: false}), - new SetServerError( - error, null, - 'The attempt to retrieve your experiment data failed. Refresh your browser and try again.', - action.autoRefresh - ) - ]; - }) + catchError(error => [ + new RequestFailed(error), + new DeactiveLoader(action.type), + setRefreshing({payload: false}), + new SetServerError( + error, null, + 'The attempt to retrieve your experiment data failed. Refresh your browser and try again.', + action.autoRefresh + ) + ]) )), ); fetchExperimentDetails$(ids): Observable> { return ids.length > 0 ? this.tasksApi.tasksGetAllEx({ - id : ids, - only_fields: EXPERIMENT_INFO_ONLY_FIELDS + id: ids, + only_fields: COMPARE_DETAILS_ONLY_FIELDS }).pipe( map(res => this.experimentDetailsReverter.revertExperiments(ids, res.tasks)) ) diff --git a/src/app/webapp-common/experiments-compare/effects/experiments-compare-scalars-graph.effects.ts b/src/app/webapp-common/experiments-compare/effects/experiments-compare-scalars-graph.effects.ts index 01b688d4..c1098bd3 100644 --- a/src/app/webapp-common/experiments-compare/effects/experiments-compare-scalars-graph.effects.ts +++ b/src/app/webapp-common/experiments-compare/effects/experiments-compare-scalars-graph.effects.ts @@ -8,7 +8,7 @@ import {RequestFailed} from '../../core/actions/http.actions'; import {ApiTasksService} from '../../../business-logic/api-services/tasks.service'; import {getExperimentsHyperParams, setHyperParamsList, setMetricsList, setTasks} from '../actions/experiments-compare-scalars-graph.actions'; import {setRefreshing} from '../actions/compare-header.actions'; -import {HyperParams} from '../reducers/experiments-compare-charts.reducer'; +import {GroupedHyperParams, HyperParams} from '../reducers/experiments-compare-charts.reducer'; @Injectable() export class ExperimentsCompareScalarsGraphEffects { @@ -20,32 +20,32 @@ export class ExperimentsCompareScalarsGraphEffects { activeLoader = createEffect(() => this.actions$.pipe( ofType(getExperimentsHyperParams), map(action => new ActiveLoader(action.type)) - ) + ) ); loadMovies$ = createEffect(() => this.actions$.pipe( ofType(getExperimentsHyperParams), flatMap((action) => this.tasksApiService.tasksGetAllEx({ - id: action.experimentsIds, - only_fields: ['last_metrics', 'name', 'last_iteration', 'execution.parameters'] - }) - .pipe( - // map(res => res.tasks)), - flatMap(res => { - const metricsList = this.getMetricOptions(res.tasks); - const paramsHasDiffs = this.getParametersHasDiffs(res.tasks); - return [ - setTasks({tasks: res.tasks}), - setMetricsList({metricsList: metricsList}), - setHyperParamsList({hyperParams: paramsHasDiffs}), - setRefreshing({payload: false}), - new DeactiveLoader(action.type)]; - }), - catchError(error => [ - new RequestFailed(error), new DeactiveLoader(action.type), setRefreshing({payload: false}), - new SetServerError(error, null, 'Failed to get Compared Experiments') - ]) - ) + id: action.experimentsIds, + only_fields: ['last_metrics', 'name', 'last_iteration', 'hyperparams'] + }) + .pipe( + // map(res => res.tasks)), + flatMap(res => { + const metricsList = this.getMetricOptions(res.tasks); + const paramsHasDiffs = this.getParametersHasDiffs(res.tasks); + return [ + setTasks({tasks: res.tasks}), + setMetricsList({metricsList: metricsList}), + setHyperParamsList({hyperParams: paramsHasDiffs}), + setRefreshing({payload: false}), + new DeactiveLoader(action.type)]; + }), + catchError(error => [ + new RequestFailed(error), new DeactiveLoader(action.type), setRefreshing({payload: false}), + new SetServerError(error, null, 'Failed to get Compared Experiments') + ]) + ) )) ); @@ -65,7 +65,7 @@ export class ExperimentsCompareScalarsGraphEffects { } } } - const metricsList = Object.keys(metrics).sort((a, b) => a.toLowerCase() > b.toLowerCase() ? 1 : -1).map(metricName => ({ + const metricsList = Object.keys(metrics).sort((a, b) => a.toLowerCase() > b.toLowerCase() ? 1 : -1).map(metricName => ({ metricName, variants: Object.keys(metrics[metricName]).sort().map(variant => ({ name: variant, @@ -75,18 +75,27 @@ export class ExperimentsCompareScalarsGraphEffects { return metricsList; } - private getParametersHasDiffs(tasks): HyperParams { + private getParametersHasDiffs(tasks): GroupedHyperParams { const numberOfTasks = tasks.length; - const paramsValues: {string?: any[]} = {}; + let paramsValues: { [section: string]: { [param: string]: any[] } } = {}; tasks.forEach(task => { - Object.entries(task.execution.parameters).forEach( ([param, value]) => - paramsValues.hasOwnProperty(param) ? paramsValues[param].push(value) : (paramsValues[param] = [value]) - ); + paramsValues = task.hyperparams ? Object.values(task.hyperparams).reduce((acc, paramsObj) => { + Object.values(paramsObj).forEach((paramObj) => { + acc[paramObj.section] = acc[paramObj.section] || {}; + acc[paramObj.section][paramObj.name] = acc[paramObj.section][paramObj.name] || []; + acc[paramObj.section][paramObj.name].push(paramObj.value); + }); + return acc; + }, paramsValues) as { [section: string]: { [param: string]: any[] } } : paramsValues; }); - return Object.entries(paramsValues).reduce((acc, [paramKey, values]) => { - acc[paramKey] = values.every(value => value !== '') && (numberOfTasks != values.length || values.some(val => val !== values[0])); - return acc; - }, {}); + const paramsValuesHasDiff: { [section: string]: HyperParams } = {}; + Object.entries(paramsValues).forEach(([section, params]) => { + paramsValuesHasDiff[section] = Object.entries(params).reduce((acc, [paramKey, values]) => { + acc[paramKey] = values.every(value => value !== '') && (numberOfTasks != values.length || values.some(val => val !== values[0])); + return acc; + }, {}); + }); + return paramsValuesHasDiff; } } diff --git a/src/app/webapp-common/experiments-compare/effects/select-experiment-for-compare-effects.service.ts b/src/app/webapp-common/experiments-compare/effects/select-experiment-for-compare-effects.service.ts index d506f16a..6f75ce04 100644 --- a/src/app/webapp-common/experiments-compare/effects/select-experiment-for-compare-effects.service.ts +++ b/src/app/webapp-common/experiments-compare/effects/select-experiment-for-compare-effects.service.ts @@ -13,7 +13,7 @@ import {select, Store} from '@ngrx/store'; import {get, isEmpty} from 'lodash/fp'; import {escapeRegex} from '../../shared/utils/shared-utils'; import {NONE_USER_TASK_TYPES} from '../../experiments/shared/common-experiments.const'; -import {selectExperimentIds, selectExperimentsUpdateTime} from '../reducers'; +import {selectExperimentsUpdateTime} from '../reducers'; import {EmptyAction} from '../../../app.constants'; import {selectRouterParams} from '../../core/reducers/router-reducer'; import {selectAppVisible} from '../../core/reducers/view-reducer'; diff --git a/src/app/webapp-common/experiments-compare/experiments-compare-routing.module.ts b/src/app/webapp-common/experiments-compare/experiments-compare-routing.module.ts index 46154aee..db2b7d1c 100644 --- a/src/app/webapp-common/experiments-compare/experiments-compare-routing.module.ts +++ b/src/app/webapp-common/experiments-compare/experiments-compare-routing.module.ts @@ -9,6 +9,7 @@ import {ExperimentComparePlotsComponent} from './containers/experiment-compare-p import {DebugImagesComponent} from '../debug-images/debug-images.component'; import {ExperimentCompareHyperParamsGraphComponent} from './containers/experiment-compare-hyper-params-graph/experiment-compare-hyper-params-graph.component'; import {RouterHelperGuard} from './experiment-compare-router-helper.guard'; +import {ExperimentCompareParamsComponent} from './containers/experiment-compare-params/experiment-compare-params.component'; export const routes: Routes = [ @@ -22,7 +23,7 @@ export const routes: Routes = [ {path: 'metrics-charts', redirectTo: 'scalars/graph', pathMatch: 'full'}, {path: 'details', component: ExperimentCompareDetailsComponent, data: {mode: 'details'}}, - {path: 'hyper-params/values', component: ExperimentCompareDetailsComponent, canActivate: [RouterHelperGuard], data: {mode: 'hyper-params'}}, + {path: 'hyper-params/values', component: ExperimentCompareParamsComponent, canActivate: [RouterHelperGuard], data: {mode: 'hyper-params'}}, {path: 'hyper-params/graph', component: ExperimentCompareHyperParamsGraphComponent}, {path: 'scalars/values', component: ExperimentCompareMetricValuesComponent, canActivate: [RouterHelperGuard]}, {path: 'scalars/graph', component: ExperimentCompareScalarChartsComponent}, diff --git a/src/app/webapp-common/experiments-compare/experiments-compare.component.scss b/src/app/webapp-common/experiments-compare/experiments-compare.component.scss index 1755e34f..2c290696 100644 --- a/src/app/webapp-common/experiments-compare/experiments-compare.component.scss +++ b/src/app/webapp-common/experiments-compare/experiments-compare.component.scss @@ -87,19 +87,4 @@ $header-height: 60px; /deep/ al-drawer button.drawer-toggle { border-radius: 0 6px 6px 0; } - - /deep/ .labeled-row { - .label-container { - - width: 100px !important; - flex: 0 0 100px; - } - - .content { - display: block; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - } } diff --git a/src/app/webapp-common/experiments-compare/experiments-compare.module.ts b/src/app/webapp-common/experiments-compare/experiments-compare.module.ts index 1c78065d..33c445b1 100644 --- a/src/app/webapp-common/experiments-compare/experiments-compare.module.ts +++ b/src/app/webapp-common/experiments-compare/experiments-compare.module.ts @@ -40,8 +40,9 @@ import {ParallelCoordinatesGraphComponent} from './dumbs/parallel-coordinates-gr import {ExperimentCompareHyperParamsGraphComponent} from './containers/experiment-compare-hyper-params-graph/experiment-compare-hyper-params-graph.component'; import {ExperimentsCompareScalarsGraphEffects} from './effects/experiments-compare-scalars-graph.effects'; import {ScrollingModule} from '@angular/cdk/scrolling'; -import {PrettifyTitleKeyPipe} from './prettify-title-key.pipe'; import {MatRadioModule} from '@angular/material/radio'; +import {ExperimentCompareParamsComponent} from './containers/experiment-compare-params/experiment-compare-params.component'; +import {ExperimentsCompareParamsEffects} from './effects/experiments-compare-params.effects'; const syncedKeys = [ 'charts.settingsList', @@ -57,13 +58,13 @@ export function localStorageReducer(reducer: ActionReducer): ActionReducer< declarations: [ ExperimentsCompareComponent, ExperimentCompareDetailsComponent, + ExperimentCompareParamsComponent, ExperimentCompareMetricValuesComponent, ExperimentCompareScalarChartsComponent, ExperimentComparePlotsComponent, ExperimentCompareHeaderComponent, ExperimentCompareGeneralDataComponent, GetKeyValueArrayPipePipe, - PrettifyTitleKeyPipe, SelectExperimentsForCompareComponent, SelectExperimentsForCompareTableComponent, CompareCardListComponent, @@ -93,6 +94,7 @@ export function localStorageReducer(reducer: ActionReducer): ActionReducer< StoreModule.forFeature('experimentsCompare', experimentsCompareReducers, {metaReducers: [localStorageReducer]}), EffectsModule.forFeature([ ExperimentsCompareDetailsEffects, + ExperimentsCompareParamsEffects, ExperimentsCompareDebugImagesEffects, ExperimentsCompareChartsEffects, ExperimentsCompareMetricsValuesEffects, diff --git a/src/app/webapp-common/experiments-compare/jsonToDiffConvertor.ts b/src/app/webapp-common/experiments-compare/jsonToDiffConvertor.ts index 642e60df..45568f3b 100644 --- a/src/app/webapp-common/experiments-compare/jsonToDiffConvertor.ts +++ b/src/app/webapp-common/experiments-compare/jsonToDiffConvertor.ts @@ -1,9 +1,9 @@ import {get, has, isArray, isEqual, mergeWith} from 'lodash/fp'; -import hoconParser from 'hocon-parser'; -import hash from 'object-hash'; import {IExperimentDetail} from '../../features/experiments-compare/experiments-compare-models'; import {treeBuilderService} from './services/tree-builder.service'; import {TreeNode} from './shared/experiments-compare-details.model'; +import {getAlternativeConvertedExperiment, getDisplayTextForTitles} from '../../features/experiments-compare/experiment-compare-utils'; +import {ConfigurationItem} from '../../business-logic/model/tasks/configurationItem'; export interface TreeNodeJsonData { key: string; @@ -35,14 +35,10 @@ function isObject(val) { return val && typeof val === 'object'; } -function isArrayOrderNotImportant2(val, key, allExperiments = []) { - const allIsOne = allExperiments.every(experiment => experiment && experiment[key] && experiment[key].length === 1); - return Array.isArray(val) && !allIsOne && (arrayOrderIsNotImportant(key)); -} -function convertToHashItem(item, originItem) { - const itemHash = hash(item); - const convertedItemHash = (originItem && isArray(originItem) && originItem.map(element => hash(element)).includes(itemHash) ? 'a_hash_' : 'hash_') + itemHash; +function convertToHashItem(item, originItem, path) { + const itemHash = getDisplayTextForTitles(item, path); + const convertedItemHash = (originItem && isArray(originItem) && originItem.map(element => getDisplayTextForTitles(element, path)).includes(itemHash) ? 'a_hash_' : 'hash_') + itemHash; return convertedItemHash; } @@ -62,7 +58,7 @@ function convertnetworkDesign(networkDesign: string): any { if (!networkDesign) { return []; } - if (typeof networkDesign !== 'string'){ + if (typeof networkDesign !== 'string') { return networkDesign; } return networkDesign; @@ -86,7 +82,11 @@ function convertUncommittedChanges(diff: string[]): { [files: string]: string[] acc[curr] = []; } else { if (currKey === null) { - acc[`hash_${curr}`] = curr; + if (curr.startsWith('** Content is too large to display.')) { + acc['a_hash_'] = curr; + } else { + acc[`hash_${curr}`] = curr; + } } else { acc[currKey].push(curr); } @@ -95,9 +95,42 @@ function convertUncommittedChanges(diff: string[]): { [files: string]: string[] }, {}) : diff; } -export function convertExperimentsArrays(experiment, origin, experiments): IExperimentDetail { +function convertHyperParams(hyperParams: { [section: string]: { [name: string]: any } }, originHyperParams): { [section: string]: { [name: string]: any } } { + if (!hyperParams) { + return {}; + } + + if (isParamsConverted(hyperParams)) { + return hyperParams; + } + + return Object.entries(hyperParams).reduce((result, [sectionName, section]) => { + result[sectionName] = Object.entries(section).reduce((acc, [paramName, param]) => { + const hasInOrigin = has(`${sectionName}.${paramName}`, originHyperParams); + acc[(hasInOrigin ? ' ' : '') + paramName] = param.value; + return acc; + }, {}); + return result; + }, {}); +} + +function convertConfiguration(confParams: { [name: string]: ConfigurationItem }, originConfParams): { [name: string]: string | string[] } { + if (!confParams) { + return {}; + } + + return Object.entries(confParams).reduce((acc, [paramName, {value}]) => { + const hasInOrigin = has(paramName, originConfParams.configuration); + acc[(hasInOrigin ? ' ' : '') + paramName] = value? value.split('\n'): undefined; + return acc; + }, {}); +} + +export function convertExperimentsArrays(experiment, origin, experiments, path = ''): IExperimentDetail { const convertedExperiment: IExperimentDetail = {}; + let counter = 1; Object.keys(experiment).forEach(key => { + const newPath = `${path}.${key}`; switch (key) { case 'installed_packages': convertedExperiment[key] = convertInstalledPackages(experiment[key]); @@ -108,16 +141,35 @@ export function convertExperimentsArrays(experiment, origin, experiments): IExpe case 'uncommitted_changes': convertedExperiment[key] = convertUncommittedChanges(experiment[key]); break; + case 'tags': + convertedExperiment[key] = experiment[key]; + break; + case 'configuration': + convertedExperiment[key] = convertConfiguration(experiment[key], origin); + break; default: - if (isObject(experiment[key]) && (!isArrayOrderNotImportant(experiment[key], key, experiments))) { - convertedExperiment[key] = convertExperimentsArrays(experiment[key], origin ? origin[key] : null, experiments.map(exp => exp ? exp[key] : null)); + const alternativeConvertedExperiment = getAlternativeConvertedExperiment(newPath, experiment[key]); + if (alternativeConvertedExperiment) { + convertedExperiment[key] = alternativeConvertedExperiment; + } else if (isObject(experiment[key]) && (!isArrayOrderNotImportant(experiment[key], key, experiments))) { + let newKey = getDisplayTextForTitles(experiment[key], newPath) || key; + + // Makes base/origin rows first + if (origin && Array.isArray(origin) && origin.map(item => getDisplayTextForTitles(item, newPath)).includes(newKey)) { + newKey = `0${newKey}`; + } + convertedExperiment[newKey] = convertExperimentsArrays(experiment[key], origin ? origin[key] : null, experiments.map(exp => exp ? exp[key] : null), newPath); } else if (isArrayOrderNotImportant(experiment[key], key, experiments)) { const hashedObj = {}; experiment[key].forEach(item => { - const convertedItemHash = convertToHashItem(item, origin && origin[key]); + let convertedItemHash = convertToHashItem(item, origin && (Array.isArray(origin) ? (origin.map(item => item[key]) as any).flat() : origin[key]), newPath); + if (hashedObj[convertedItemHash]) { + convertedItemHash = `${counter}${convertedItemHash}`; + counter++; + } if (isObject(item)) { hashedObj[convertedItemHash] = - convertExperimentsArrays(item, origin ? origin[key] : null, experiments.map(exp => exp ? exp[key] : null)); + convertExperimentsArrays(item, origin ? origin[key] : null, experiments.map(exp => exp ? exp[key] : null), newPath); } else { hashedObj[convertedItemHash] = item; } @@ -132,6 +184,13 @@ export function convertExperimentsArrays(experiment, origin, experiments): IExpe return convertedExperiment; } +export function convertExperimentsArraysParams(experiment, origin): IExperimentDetail { + return Object.keys(experiment).reduce((acc, key) => { + acc[key] = key === 'hyperparams' ? convertHyperParams(experiment[key], origin.hyperparams) : experiment[key]; + return acc; + }, {} as IExperimentDetail); +} + function abSort(obj) { return Object.keys(obj).sort(function (a, b) { return a.toLowerCase().localeCompare(b.toLowerCase()); @@ -151,6 +210,16 @@ function sortObject(obj, origin, parentKey: string) { return orderedObj; } +export function isDetailsConverted(exp) { + return exp.execution?.installed_packages && !Array.isArray(exp.execution?.installed_packages) +} + +export function isParamsConverted(hyperparams) { + const firstKey = hyperparams && Object.keys(hyperparams)[0]; + const firstParam = firstKey && Object.values(hyperparams[firstKey])[0]; + return typeof firstParam === 'string'; +} + export function getAllKeysEmptyObject(jsons) { let obj = {}; jsons.forEach(json => obj = mergeWith(customMergeStrategyForArrays, obj, json)); diff --git a/src/app/webapp-common/experiments-compare/prettify-title-key.pipe.ts b/src/app/webapp-common/experiments-compare/prettify-title-key.pipe.ts deleted file mode 100644 index 45204721..00000000 --- a/src/app/webapp-common/experiments-compare/prettify-title-key.pipe.ts +++ /dev/null @@ -1,26 +0,0 @@ -import {Pipe, PipeTransform} from '@angular/core'; - -@Pipe({ - name: 'prettifyTitleKeyPipe', - pure: true -}) -export class PrettifyTitleKeyPipe implements PipeTransform { - - transform(value: string): string { - switch (value) { - case 'network_design': return 'Network Design'; - case 'uncommitted_changes': return 'Uncommitted Changes'; - case 'installed_packages': return 'Installed Packages'; - case 'base_docker_image': return 'Base Docker Image'; - case ' input model': return 'Input Model'; - case ' output model': return 'Output Model'; - case ' output model': return 'Output Model'; - case 'model': return 'Model'; - case 'source': return 'Source'; - default: - return value; - } - - } - -} diff --git a/src/app/webapp-common/experiments-compare/reducers/experiments-compare-charts.reducer.ts b/src/app/webapp-common/experiments-compare/reducers/experiments-compare-charts.reducer.ts index bb21a839..77b4da83 100644 --- a/src/app/webapp-common/experiments-compare/reducers/experiments-compare-charts.reducer.ts +++ b/src/app/webapp-common/experiments-compare/reducers/experiments-compare-charts.reducer.ts @@ -9,6 +9,10 @@ export interface SelectedMetric { path: string; } +export interface GroupedHyperParams { + [section: string]: HyperParams; +} + export interface HyperParams { [name: string]: boolean; } @@ -26,6 +30,7 @@ export interface MetricOption { export interface IExperimentCompareChartsState { metricsMultiScalarsCharts: any; metricsHistogramCharts: any; + cachedAxisType: ScalarKeyEnum; metricsPlotsCharts: any; settingsList: Array; searchTerm: string; @@ -48,6 +53,7 @@ export interface IExperimentCompareSettings { export const initialState: IExperimentCompareChartsState = { metricsMultiScalarsCharts: null, metricsHistogramCharts: null, + cachedAxisType: null, metricsPlotsCharts: null, settingsList: [], // TODO, Make this an object with ID's as key YK searchTerm: '', @@ -62,7 +68,7 @@ export function experimentsCompareChartsReducer(state: IExperimentCompareChartsS case SET_EXPERIMENT_METRICS_SEARCH_TERM: return {...state, searchTerm: action.payload.searchTerm}; case SET_EXPERIMENT_HISTOGRAM: - return {...state, metricsHistogramCharts: action.payload}; + return {...state, metricsHistogramCharts: action.payload, cachedAxisType: action.axisType}; case SET_EXPERIMENT_PLOTS: return {...state, metricsPlotsCharts: action.payload}; case UPDATE_EXPERIMENT_SETTINGS: { @@ -77,7 +83,13 @@ export function experimentsCompareChartsReducer(state: IExperimentCompareChartsS return {...state, settingsList: newSettings}; } case RESET_EXPERIMENT_METRICS: - return {...state, metricsMultiScalarsCharts: null, metricsHistogramCharts: null, metricsPlotsCharts: null}; + return { + ...state, + metricsMultiScalarsCharts: initialState.metricsMultiScalarsCharts, + metricsHistogramCharts: initialState.metricsHistogramCharts, + metricsPlotsCharts: initialState.metricsPlotsCharts, + cachedAxisType: initialState.cachedAxisType + }; default: return state; } diff --git a/src/app/webapp-common/experiments-compare/reducers/experiments-compare-details.reducer.ts b/src/app/webapp-common/experiments-compare/reducers/experiments-compare-details.reducer.ts index c1d5d0d9..6ea16da1 100644 --- a/src/app/webapp-common/experiments-compare/reducers/experiments-compare-details.reducer.ts +++ b/src/app/webapp-common/experiments-compare/reducers/experiments-compare-details.reducer.ts @@ -1,28 +1,22 @@ -import * as actions from '../actions/experiments-compare-details.actions'; +import {resetState, setExperiments} from '../actions/experiments-compare-details.actions'; import {IExperimentDetail} from '../../../features/experiments-compare/experiments-compare-models'; +import {createReducer, on} from '@ngrx/store'; -export interface IExperimentCompareDetailsState { +export interface ExperimentCompareDetailsState { experiments: Array; - expandedPaths: Array; } -export const initialState: IExperimentCompareDetailsState = { - expandedPaths: [], +export const initialState: ExperimentCompareDetailsState = { experiments : [] }; +const _experimentsCompareDetailsReducer = createReducer(initialState, + on(setExperiments, (state: ExperimentCompareDetailsState, {experiments}) => ({...state, experiments: experiments})), + on(resetState, (state: ExperimentCompareDetailsState) => ({...initialState})) +); -export function experimentsCompareDetailsReducer(state: IExperimentCompareDetailsState = initialState, action): IExperimentCompareDetailsState { - switch (action.type) { - case actions.SET_EXPERIMENTS: - return {...state, experiments: action.payload}; - case actions.EXPAND_NODE: - return {...state, expandedPaths: state.expandedPaths.concat(action.payload)}; - case actions.COLLAPSE_NODE: - return {...state, expandedPaths: state.expandedPaths.filter(path => path !== action.payload)}; - case actions.RESET_STATE: - return {...initialState}; - default: - return state; - } +export function experimentsCompareDetailsReducer(state, action) { + return _experimentsCompareDetailsReducer(state, action); } + + diff --git a/src/app/webapp-common/experiments-compare/reducers/experiments-compare-scalars-graph.reducer.ts b/src/app/webapp-common/experiments-compare/reducers/experiments-compare-scalars-graph.reducer.ts index 2a583b23..f7bf8f1e 100644 --- a/src/app/webapp-common/experiments-compare/reducers/experiments-compare-scalars-graph.reducer.ts +++ b/src/app/webapp-common/experiments-compare/reducers/experiments-compare-scalars-graph.reducer.ts @@ -1,11 +1,11 @@ import {createReducer, on} from '@ngrx/store'; import {setHyperParamsList, setMetricsList, setShowIdenticalHyperParams, setTasks, setvalueType} from '../actions/experiments-compare-scalars-graph.actions'; -import {HyperParams, MetricOption, MetricValueType} from './experiments-compare-charts.reducer'; +import {GroupedHyperParams, HyperParams, MetricOption, MetricValueType} from './experiments-compare-charts.reducer'; export interface ScalarsGraphState { showIdenticalHyperParams: boolean; metrics: MetricOption[]; - hyperParams: HyperParams; + hyperParams: GroupedHyperParams; tasks: any; valueType: MetricValueType; } diff --git a/src/app/webapp-common/experiments-compare/reducers/index.ts b/src/app/webapp-common/experiments-compare/reducers/index.ts index 495aa4ce..f041b504 100644 --- a/src/app/webapp-common/experiments-compare/reducers/index.ts +++ b/src/app/webapp-common/experiments-compare/reducers/index.ts @@ -1,6 +1,6 @@ import {ActionReducerMap, createFeatureSelector, createSelector} from '@ngrx/store'; -import {experimentsCompareDetailsReducer, IExperimentCompareDetailsState} from './experiments-compare-details.reducer'; -import {experimentsCompareChartsReducer, HyperParams, IExperimentCompareChartsState, IExperimentCompareSettings, MetricOption, MetricValueType} from './experiments-compare-charts.reducer'; +import {ExperimentCompareDetailsState, experimentsCompareDetailsReducer} from './experiments-compare-details.reducer'; +import {experimentsCompareChartsReducer, GroupedHyperParams, HyperParams, IExperimentCompareChartsState, IExperimentCompareSettings, MetricOption, MetricValueType} from './experiments-compare-charts.reducer'; import {experimentsCompareMetricsValuesReducer, IExperimentCompareMetricsValuesState, MetricSortBy} from './experiments-compare-metrics-values.reducer'; import {experimentsCompareDebugImagesReducer} from './experiments-compare-debug-images.reducer'; import {get} from 'lodash/fp'; @@ -9,9 +9,13 @@ import {compareHeader, CompareHeaderState} from './compare-header.reducer'; import {IExperimentDetail} from '../../../features/experiments-compare/experiments-compare-models'; import {ScalarKeyEnum} from '../../../business-logic/model/events/scalarKeyEnum'; import {scalarsGraphReducer, ScalarsGraphState} from './experiments-compare-scalars-graph.reducer'; +import {experimentOutput} from '../../../features/experiments/reducers'; +import {ExperimentParams} from '../shared/experiments-compare-details.model'; +import {ExperimentCompareParamsState, experimentsCompareParamsReducer} from './experiments-compare-params.reducer'; export const experimentsCompareReducers: ActionReducerMap = { details : experimentsCompareDetailsReducer, + params : experimentsCompareParamsReducer, metricsValues: experimentsCompareMetricsValuesReducer, charts : experimentsCompareChartsReducer, debugImages : experimentsCompareDebugImagesReducer, @@ -22,12 +26,18 @@ export const experimentsCompareReducers: ActionReducerMap = { export const experimentsCompare = createFeatureSelector('experimentsCompare'); // Details -export const experimentsDetails = createSelector(experimentsCompare, (state): IExperimentCompareDetailsState => state ? state.details : {}); +export const experimentsDetails = createSelector(experimentsCompare, (state): ExperimentCompareDetailsState => state ? state.details : {}); export const selectExperimentsDetails = createSelector(experimentsDetails, (state): Array => state.experiments); -export const selectExpandedPaths = createSelector(experimentsDetails, (state): Array => state.expandedPaths); -export const selectExperimentIds = createSelector(selectExperimentsDetails, +export const selectExperimentIdsDetails = createSelector(selectExperimentsDetails, (experiments): Array => experiments.map(exp => exp.id)); +// Params +export const experimentsParams = createSelector(experimentsCompare, (state): ExperimentCompareParamsState => state ? state.params : {}); +export const selectExperimentsParams = createSelector(experimentsParams, (state): Array => state.experiments); +export const selectExperimentIdsParams = createSelector(selectExperimentsParams, + (experiments): Array => experiments.map(exp => exp.id)); + + // select experiments for compare and header export const selectCompareHeader = createSelector(experimentsCompare, (state): CompareHeaderState => state ? state.compareHeader : {}); export const selectExperimentsForCompareSearchResults = createSelector(selectCompareHeader, (state): Array => state ? state.searchResultsExperiments : []); @@ -47,7 +57,7 @@ export const selectCompareMetricsValuesSortConfig = createSelector(compareMetric // Charts export const compareCharts = createSelector(experimentsCompare, (state): IExperimentCompareChartsState => state ? state.charts : {}); export const selectSelectedExperiments = createSelector(compareCharts, (state): Array => state ? state.selectedExperiments : []); -export const selectCompareTasksScalarCharts = createSelector(compareCharts, state => state.metricsHistogramCharts); +export const selectCompareHistogramCacheAxisType = createSelector(compareCharts, (state) => state.cachedAxisType); export const selectCompareTasksPlotCharts = createSelector(compareCharts, state => state.metricsPlotsCharts); export const selectSelectedExperimentSettings = createSelector(compareCharts, selectSelectedExperiments, @@ -75,7 +85,30 @@ export const selectCompareSelectedSettingsxAxisType = createSelector(selectSelec export const selectScalarsGraph = createSelector(experimentsCompare, (state): ScalarsGraphState => state ? state.scalarsGraph : {}); export const selectScalarsGraphShowIdenticalHyperParams = createSelector(selectScalarsGraph, (state): boolean => state ? state.showIdenticalHyperParams : true); export const selectScalarsGraphMetrics = createSelector(selectScalarsGraph, (state): MetricOption[] => state.metrics); -export const selectScalarsGraphHyperParams = createSelector(selectScalarsGraph, (state): HyperParams => state ? state.hyperParams : {}); +export const selectScalarsGraphHyperParams = createSelector(selectScalarsGraph, (state): GroupedHyperParams => state ? state.hyperParams : {}); export const selectScalarsGraphTasks = createSelector(selectScalarsGraph, (state): any[] => state ? state.tasks : []); export const selectMetricValueType = createSelector(selectScalarsGraph, (state): MetricValueType => state ? state.valueType : 'value'); +export const selectCompareTasksScalarCharts = createSelector( + selectCompareSelectedSettingsxAxisType, + compareCharts, + (axisType, state) => { + if (!axisType || axisType === ScalarKeyEnum.IsoTime) { + return { + metrics: Object.keys(state.metricsHistogramCharts.metrics).reduce((metricAcc, metricName) => { + const metric = state.metricsHistogramCharts.metrics[metricName]; + metricAcc[metricName] = Object.keys(metric).reduce((groupAcc, groupName) => { + const group = metric[groupName]; + groupAcc[groupName] = Object.keys(group).reduce((graphAcc, graphName) => { + const graph = group[graphName]; + graphAcc[graphName] = {...graph, x: graph.x.map(ts => new Date(ts))}; + return graphAcc; + }, {}); + return groupAcc; + }, {}); + return metricAcc; + }, {}) + }; + } + return state.metricsHistogramCharts; + }); diff --git a/src/app/webapp-common/experiments-compare/services/experiment-details-reverter.service.ts b/src/app/webapp-common/experiments-compare/services/experiment-details-reverter.service.ts index 57851dcf..22de6dbb 100644 --- a/src/app/webapp-common/experiments-compare/services/experiment-details-reverter.service.ts +++ b/src/app/webapp-common/experiments-compare/services/experiment-details-reverter.service.ts @@ -9,6 +9,7 @@ import {Task} from '../../../business-logic/model/tasks/task'; import {ExperimentDetailsReverterServiceBase} from '../../../features/experiments-compare/experiment-details-reverter-service.base'; import {ARTIFACTS_TYPES} from '../../tasks/tasks.constants'; import {Artifact} from '../../../business-logic/model/tasks/artifact'; +import {crc32} from '../../shared/utils/shared-utils'; @Injectable({ providedIn: 'root' @@ -38,18 +39,17 @@ export class ExperimentDetailsReverterService extends ExperimentDetailsReverterS } revertAuditLog(artifact: Artifact): any { - const {uri, content_size, hash, timestamp, display_data, type_data, ...restArtifact} = artifact; + const {uri, content_size, hash, timestamp, display_data, mode, key, type_data, ...restArtifact} = artifact; const result = { ...restArtifact, - 'file path': uri, 'file size': content_size, 'file hash': hash, - 'timestamp': timestamp }; if (type_data) { + const preview = type_data.preview && type_data.preview.trim().split('\n') || []; result['content type'] = type_data['content_type'] || ''; - result['preview'] = type_data.preview && type_data.preview.trim().split('\n') || []; + result['preview'] = (preview.length < 3000 && preview[0]?.length < 3000) ? preview : [`** Content is too large to display. Hash: ${crc32(type_data.preview)}`]; result['data hash'] = type_data.data_hash || ''; } display_data.forEach(pair => result[pair[0]] = pair[1]); @@ -67,26 +67,27 @@ export class ExperimentDetailsReverterService extends ExperimentDetailsReverterS revertModel(experiment: ISelectedExperiment): ModelDetails { return { model: this.revertModelInput(experiment.execution), - network_design: this.revertNetworkDesign(experiment.execution), + network_design: this.revertNetworkDesign(experiment.execution.model), }; } - revertNetworkDesign(execution) { - let networkDesign = get('design.design', execution) || get('model_desc.design', execution) || get('model_desc.prototxt', execution); + revertNetworkDesign(model): string { + let networkDesign = get('design.design', model) || get('design', model); networkDesign = typeof networkDesign === 'string' ? networkDesign.split('\n') : {}; return networkDesign; } revertExecution(experiment: ISelectedExperiment): ExecutionDetails { let pip = get('script.requirements.pip', experiment); - let diff = get('script.diff', experiment); pip = (pip === undefined || Array.isArray(pip)) ? pip : pip.split('\n'); pip = pip?.filter(row => !row.startsWith('#') && row.length > 0); // Should we remove comments???? - diff = (!diff || Array.isArray(diff)) ? diff : diff.split('\n'); - - let base_docker_image = get('execution.docker_cmd', experiment) || ''; - // base_docker_image = base_docker_image ? {'': base_docker_image} : undefined; + let diff = get('script.diff', experiment); + if (diff) { + diff = (Array.isArray(diff)) ? diff : diff.split('\n'); + diff = (diff.length < 3000 && diff[0]?.length < 3000) ? diff : [`** Content is too large to display. Hash: ${crc32(get('script.diff', experiment))}`]; + } + const base_docker_image = get('execution.docker_cmd', experiment) || ''; return { source: experiment.script ? this.revertExecutionSource(experiment.script) : undefined, @@ -114,7 +115,7 @@ export class ExperimentDetailsReverterService extends ExperimentDetailsReverterS script_path: script.entry_point, branch: script.branch, commit_id: script.version_num, - tag_name: script.tag + tag_name: script.tag || '' // In tag_name we want undefined == null == "" }; } diff --git a/src/app/webapp-common/experiments-compare/shared/experiments-compare-details.model.ts b/src/app/webapp-common/experiments-compare/shared/experiments-compare-details.model.ts index 483c2af5..dc92247c 100644 --- a/src/app/webapp-common/experiments-compare/shared/experiments-compare-details.model.ts +++ b/src/app/webapp-common/experiments-compare/shared/experiments-compare-details.model.ts @@ -20,7 +20,16 @@ export interface ExperimentDetailBase { tags?: string[]; } - +export interface ExperimentParams { + id?: Task['id']; + name?: string; + status?: Task['status']; + last_iteration?: Task['last_iteration']; + last_update?: Task['last_update']; + project?: Project; + hyperparams?: any[]; + tags?: string[]; +} export interface ModelDetails { model?: ModelDetailsInput; @@ -53,7 +62,6 @@ export interface ExecutionDetails { script_path?: string; // Script.entry_point; branch?: string; // Script.branch; }; - parameters?: { [key: string]: any }; uncommitted_changes?: { [key: string]: any }; installed_packages?: { [key: string]: any }; base_docker_image?: { [key: string]: any }; diff --git a/src/app/webapp-common/experiments/actions/common-experiment-output.actions.ts b/src/app/webapp-common/experiments/actions/common-experiment-output.actions.ts index a620f6f4..cc21661b 100644 --- a/src/app/webapp-common/experiments/actions/common-experiment-output.actions.ts +++ b/src/app/webapp-common/experiments/actions/common-experiment-output.actions.ts @@ -1,6 +1,7 @@ import {Action, createAction, props} from '@ngrx/store'; import {ISelectedExperiment} from '../../../features/experiments/shared/experiment-info.model'; import {IExperimentSettings} from '../reducers/common-experiment-output.reducer'; +import {ScalarKeyEnum} from '../../../business-logic/model/events/scalarKeyEnum'; export const EXPERIMENTS_OUTPUT_PREFIX = 'EXPERIMENTS_OUTPUT_'; @@ -56,7 +57,7 @@ export class ExperimentScalarRequested implements Action { export class SetExperimentHistogram implements Action { readonly type = SET_EXPERIMENT_HISTOGRAM; - constructor(public payload: any) { + constructor(public payload: any, public axisType: ScalarKeyEnum) { } } @@ -67,19 +68,15 @@ export class SetExperimentPlots implements Action { } } -export class GetExperimentLog implements Action { - readonly type = GET_EXPERIMENT_LOG; - - constructor(public payload: ISelectedExperiment['id']) { - } -} +export const getExperimentLog = createAction( + GET_EXPERIMENT_LOG, + props<{id: string; direction?: string; refresh?: boolean; from?: number}>() +); -export class SetExperimentLog implements Action { - readonly type = SET_EXPERIMENT_LOG; - - constructor(public events: Array, public scrollID: string) { - } -} +export const setExperimentLog = createAction( + SET_EXPERIMENT_LOG, + props<{events: any[]; direction?: string; total: number; refresh?: boolean}>() +); export class SetExperimentSettings implements Action { readonly type = UPDATE_EXPERIMENT_SETTINGS; diff --git a/src/app/webapp-common/experiments/actions/common-experiments-info.actions.ts b/src/app/webapp-common/experiments/actions/common-experiments-info.actions.ts index 4ef73ce0..b65fb107 100644 --- a/src/app/webapp-common/experiments/actions/common-experiments-info.actions.ts +++ b/src/app/webapp-common/experiments/actions/common-experiments-info.actions.ts @@ -1,8 +1,11 @@ -import {Action} from '@ngrx/store'; +import {Action, createAction, props} from '@ngrx/store'; import {Task} from '../../../business-logic/model/tasks/task'; import {IExperimentInfo, ISelectedExperiment} from '../../../features/experiments/shared/experiment-info.model'; import {Model} from '../../../business-logic/model/models/model'; import {ITableExperiment} from '../shared/common-experiment-model.model'; +import {ParamsItem} from '../../../business-logic/model/tasks/paramsItem'; +import {ConfigurationItem} from '../../../business-logic/model/tasks/configurationItem'; + export const EXPERIMENTS_INFO_PREFIX = 'EXPERIMENTS_INFO_'; export const GET_EXPERIMENT_INFO = EXPERIMENTS_INFO_PREFIX + 'GET_EXPERIMENT_INFO'; export const AUTO_REFRESH_EXPERIMENT_INFO = EXPERIMENTS_INFO_PREFIX + 'AUTO_REFRESH_EXPERIMENT_INFO'; @@ -40,6 +43,8 @@ export class SetExperiment implements Action { export class ExperimentUpdatedSuccessfully implements Action { readonly type = EXPERIMENT_UPDATED_SUCCESSFULLY; + constructor(public payload: string) { + } } export class SetExperimentInfoData implements Action { @@ -49,6 +54,21 @@ export class SetExperimentInfoData implements Action { } } +export const getExperiment= createAction( + EXPERIMENTS_INFO_PREFIX + '[set experiment]', + props<{experimentId: string}>() +); + +export const getExperimentUncommittedChanges = createAction( + EXPERIMENTS_INFO_PREFIX + '[get uncommitted change]', + props<{experimentId: string}>() +); + +export const setExperimentUncommittedChanges = createAction( + EXPERIMENTS_INFO_PREFIX + '[set uncommitted change]', + props<{diff: string}>() +); + export class ModelSelected implements Action { readonly type = MODEL_SELECTED; public payload: { @@ -67,6 +87,29 @@ export class ModelSelected implements Action { export class UpdateExperimentInfoData implements Action { readonly type = UPDATE_EXPERIMENT_INFO_DATA; - constructor(public payload: { id: ITableExperiment['id'], changes: Partial }) { + constructor(public payload: { id: ITableExperiment['id'], changes: Partial }) { } } +export const saveHyperParamsSection = createAction( + EXPERIMENTS_INFO_PREFIX + 'SAVE_HYPERPARAMS', props<{ hyperparams: ParamsItem[] }>()); + +export const saveExperimentConfigObj = createAction( + EXPERIMENTS_INFO_PREFIX + 'SAVE_CONFIG_OBJ', props<{ configuration: Array; }>()); + +export const deleteHyperParamsSection = createAction( + EXPERIMENTS_INFO_PREFIX + 'DELETE_HYPERPARAMS_SECTION', props<{ section: string }>()); + +export const hyperParamsSectionUpdated = createAction( + EXPERIMENTS_INFO_PREFIX + 'UPDATE_HYPERPARAMS', props<{ section: string, hyperparams: ParamsItem[] }>()); + +export const getExperimentConfigurationNames = createAction( + EXPERIMENTS_INFO_PREFIX + 'GET_CONFIGURATION',props<{ experimentId: string }>()); + +export const setExperimentSaving = createAction( + EXPERIMENTS_INFO_PREFIX + 'SET_SAVING',props<{ saving: boolean }>()); + +export const getExperimentConfigurationObj = createAction( + EXPERIMENTS_INFO_PREFIX + 'GET_CONFIGURATION_OBJ'); + +export const updateExperimentAtPath = createAction( + EXPERIMENTS_INFO_PREFIX + 'UPDATE_EXPERIMENT_AT_PATH',props<{ path: string, value:any}>()); diff --git a/src/app/webapp-common/experiments/actions/common-experiments-menu.actions.ts b/src/app/webapp-common/experiments/actions/common-experiments-menu.actions.ts index 3ef46666..874bdf70 100644 --- a/src/app/webapp-common/experiments/actions/common-experiments-menu.actions.ts +++ b/src/app/webapp-common/experiments/actions/common-experiments-menu.actions.ts @@ -39,20 +39,6 @@ export class StopClicked implements Action { } } -export class ArchiveClicked implements Action { - readonly type = ARCHIVE_CLICKED; - - constructor(public payload: { experiment: ISelectedExperiment; selectedExperiment: any; projectId: string }) { - } -} - -export class RestoreClicked implements Action { - readonly type = RESTORE_CLICKED; - - constructor(public payload: { experiment: ISelectedExperiment; selectedExperiment: any; projectId: string }) { - } -} - export class ChangeProjectRequested implements Action { readonly type = CHANGE_PROJECT_REQUESTED; diff --git a/src/app/webapp-common/experiments/actions/common-experiments-view.actions.ts b/src/app/webapp-common/experiments/actions/common-experiments-view.actions.ts index 58df9265..837ac2d2 100644 --- a/src/app/webapp-common/experiments/actions/common-experiments-view.actions.ts +++ b/src/app/webapp-common/experiments/actions/common-experiments-view.actions.ts @@ -6,40 +6,41 @@ import {MetricVariantResult} from '../../../business-logic/model/projects/metric import {TableFilter} from '../../shared/utils/tableParamEncode'; import {PROJECTS_PREFIX} from '../../core/actions/projects.actions'; import {User} from '../../../business-logic/model/users/user'; +import {ParamsItem} from '../../../business-logic/model/tasks/paramsItem'; export const EXPERIMENTS_PREFIX = 'EXPERIMENTS_'; // COMMANDS: export const ARCHIVE_SELECTED_EXPERIMENTS = EXPERIMENTS_PREFIX + 'ARCHIVE_SELECTED_EXPERIMENTS'; export const RESTORE_SELECTED_EXPERIMENTS = EXPERIMENTS_PREFIX + 'RESTORE_SELECTED_EXPERIMENTS'; -export const ADD_MANY_EXPERIMENTS = EXPERIMENTS_PREFIX + 'ADD_MANY_EXPERIMENTS'; -export const GET_EXPERIMENTS = EXPERIMENTS_PREFIX + 'GET_EXPERIMENTS'; -export const REFRESH_EXPERIMENTS = EXPERIMENTS_PREFIX + 'REFRESH_EXPERIMENTS'; -export const GET_NEXT_EXPERIMENTS = EXPERIMENTS_PREFIX + 'GET_NEXT_EXPERIMENTS'; -export const SET_EXPERIMENTS = EXPERIMENTS_PREFIX + 'SET_EXPERIMENTS'; -export const SET_NEXT_PAGE = EXPERIMENTS_PREFIX + 'SET_NEXT_PAGE'; -export const SET_SELECTED_EXPERIMENTS = EXPERIMENTS_PREFIX + 'SET_SELECTED_EXPERIMENTS'; -export const SET_SELECTED_EXPERIMENT = EXPERIMENTS_PREFIX + 'SET_SELECTED_EXPERIMENT'; -export const SET_VIEW_MODE = EXPERIMENTS_PREFIX + 'SET_VIEW_MODE'; -export const SET_NO_MORE_EXPERIMENTS = EXPERIMENTS_PREFIX + 'SET_NO_MORE_EXPERIMENTS'; -export const REMOVE_MANY_EXPERIMENTS = EXPERIMENTS_PREFIX + 'REMOVE_MANY_EXPERIMENTS'; -export const UPDATE_ONE_EXPERIMENTS = EXPERIMENTS_PREFIX + 'UPDATE_ONE_EXPERIMENTS'; -export const RESET_EXPERIMENTS = EXPERIMENTS_PREFIX + 'RESET_EXPERIMENTS'; - -export const SHOW_ALL_SELECTED = EXPERIMENTS_PREFIX + 'SHOW_ALL_SELECTED'; +export const ADD_MANY_EXPERIMENTS = EXPERIMENTS_PREFIX + 'ADD_MANY_EXPERIMENTS'; +export const GET_EXPERIMENTS = EXPERIMENTS_PREFIX + 'GET_EXPERIMENTS'; +export const REFRESH_EXPERIMENTS = EXPERIMENTS_PREFIX + 'REFRESH_EXPERIMENTS'; +export const GET_NEXT_EXPERIMENTS = EXPERIMENTS_PREFIX + 'GET_NEXT_EXPERIMENTS'; +export const SET_EXPERIMENTS = EXPERIMENTS_PREFIX + 'SET_EXPERIMENTS'; +export const SET_NEXT_PAGE = EXPERIMENTS_PREFIX + 'SET_NEXT_PAGE'; +export const SET_SELECTED_EXPERIMENTS = EXPERIMENTS_PREFIX + 'SET_SELECTED_EXPERIMENTS'; +export const SET_SELECTED_EXPERIMENT = EXPERIMENTS_PREFIX + 'SET_SELECTED_EXPERIMENT'; +export const SET_VIEW_MODE = EXPERIMENTS_PREFIX + 'SET_VIEW_MODE'; +export const SET_NO_MORE_EXPERIMENTS = EXPERIMENTS_PREFIX + 'SET_NO_MORE_EXPERIMENTS'; +export const REMOVE_MANY_EXPERIMENTS = EXPERIMENTS_PREFIX + 'REMOVE_MANY_EXPERIMENTS'; +export const UPDATE_ONE_EXPERIMENTS = EXPERIMENTS_PREFIX + 'UPDATE_ONE_EXPERIMENTS'; +export const RESET_EXPERIMENTS = EXPERIMENTS_PREFIX + 'RESET_EXPERIMENTS'; + +export const SHOW_ALL_SELECTED = EXPERIMENTS_PREFIX + 'SHOW_ALL_SELECTED'; export const SET_SHOW_ALL_SELECTED_IS_ACTIVE = EXPERIMENTS_PREFIX + 'SET_SHOW_ALL_SELECTED_IS_ACTIVE'; // EVENTS: -export const ARCHIVE_MODE_CHANGED = EXPERIMENTS_PREFIX + 'ARCHIVE_MODE_CHANGED'; +export const ARCHIVE_MODE_CHANGED = EXPERIMENTS_PREFIX + 'ARCHIVE_MODE_CHANGED'; -export const GLOBAL_FILTER_CHANGED = EXPERIMENTS_PREFIX + 'GLOBAL_FILTER_CHANGED'; -export const TABLE_SORT_CHANGED = EXPERIMENTS_PREFIX + 'TABLE_SORT_CHANGED'; -export const TABLE_FILTER_CHANGED = EXPERIMENTS_PREFIX + 'TABLE_FILTER_CHANGED'; +export const GLOBAL_FILTER_CHANGED = EXPERIMENTS_PREFIX + 'GLOBAL_FILTER_CHANGED'; +export const TABLE_SORT_CHANGED = EXPERIMENTS_PREFIX + 'TABLE_SORT_CHANGED'; +export const TABLE_FILTER_CHANGED = EXPERIMENTS_PREFIX + 'TABLE_FILTER_CHANGED'; export const SET_TABLE_FILTERS = EXPERIMENTS_PREFIX + 'SET_TABLE_FILTERS'; export const GET_PROJECT_TYPES = EXPERIMENTS_PREFIX + 'GET_PROJECT_TYPES'; export const SET_PROJECT_TYPES = EXPERIMENTS_PREFIX + 'SET_PROJECT_TYPES'; export const EXPERIMENT_SELECTION_CHANGED = EXPERIMENTS_PREFIX + 'EXPERIMENT_SELECTION_CHANGED'; // export const EXPERIMENTS_SELECTION_CHANGED = EXPERIMENTS_PREFIX + 'EXPERIMENTS_SELECTION_CHANGED'; -export const TOGGLE_COL_HIDDEN = EXPERIMENTS_PREFIX + 'TOGGLE_COL_HIDDEN'; +export const TOGGLE_COL_HIDDEN = EXPERIMENTS_PREFIX + 'TOGGLE_COL_HIDDEN'; export class GetExperiments implements Action { readonly type = GET_EXPERIMENTS; @@ -73,7 +74,7 @@ export class SetExperiments implements Action { export const setExperimentInPlace = createAction( EXPERIMENTS_PREFIX + '[set experiment in place]', - props<{experiments: ITableExperiment[]}>() + props<{ experiments: ITableExperiment[] }>() ); export class SetNoMoreExperiments implements Action { @@ -136,17 +137,30 @@ export class ToggleColHidden implements Action { export const setHiddenColumns = createAction( EXPERIMENTS_PREFIX + 'SET_HIDDEN_COLS', - props<{visibleColumns: string[]}>() + props<{ visibleColumns: string[] }>() ); export const setUsers = createAction( EXPERIMENTS_PREFIX + 'SET_USERS', - props<{users: User[]}>() + props<{ users: User[] }>() ); + + export const getUsers = createAction( EXPERIMENTS_PREFIX + 'GET_USERS'); +export const getFilteredUsers = createAction( + EXPERIMENTS_PREFIX + 'GET_FILTERED_USERS'); + +export const getTags = createAction( + EXPERIMENTS_PREFIX + 'GET_TAGS'); + +export const setTags = createAction( + EXPERIMENTS_PREFIX + 'SET_TAGS', + props<{ tags: string[] }>() +); + export class TableSortChanged implements Action { public type = TABLE_SORT_CHANGED; public payload: { colId: string; sortOrder: (TableSortOrderEnum) }; @@ -159,17 +173,18 @@ export class TableSortChanged implements Action { export class TableFilterChanged implements Action { public type = TABLE_FILTER_CHANGED; - constructor(public payload: TableFilter) {} + constructor(public payload: TableFilter) { + } } export const setTableFilters = createAction( SET_TABLE_FILTERS, - props<{filters: TableFilter[]}>() + props<{ filters: TableFilter[] }>() ); export const setProjectsTypes = createAction( SET_PROJECT_TYPES, - props<{ types?: Array}>() + props<{ types?: Array }>() ); export const getProjectTypes = createAction( @@ -210,14 +225,14 @@ export class ArchivedModeChanged implements Action { export class ArchivedSelectedExperiments implements Action { public type = ARCHIVE_SELECTED_EXPERIMENTS; - constructor(public payload: { projectId: string }) { + constructor(public payload: { skipUndo?: boolean }) { } } export class RestoreSelectedExperiments implements Action { public type = RESTORE_SELECTED_EXPERIMENTS; - constructor(public payload: { projectId: string }) { + constructor(public payload: { skipUndo?: boolean }) { } } @@ -237,16 +252,16 @@ export class ResetExperiments implements Action { } } -export const GET_CUSTOM_METRICS = EXPERIMENTS_PREFIX + 'GET_CUSTOM_METRICS'; +export const GET_CUSTOM_METRICS = EXPERIMENTS_PREFIX + 'GET_CUSTOM_METRICS'; export const GET_CUSTOM_HYPER_PARAMS = EXPERIMENTS_PREFIX + 'GET_CUSTOM_HYPER_PARAMS'; -export const SET_CUSTOM_METRICS = EXPERIMENTS_PREFIX + 'SET_CUSTOM_METRICS'; +export const SET_CUSTOM_METRICS = EXPERIMENTS_PREFIX + 'SET_CUSTOM_METRICS'; export const SET_CUSTOM_HYPER_PARAMS = EXPERIMENTS_PREFIX + 'SET_CUSTOM_HYPER_PARAMS'; -export const ADD_COL = EXPERIMENTS_PREFIX + 'ADD_COL'; -export const REMOVE_COL = EXPERIMENTS_PREFIX + 'REMOVE_COL'; +export const ADD_COL = EXPERIMENTS_PREFIX + 'ADD_COL'; +export const REMOVE_COL = EXPERIMENTS_PREFIX + 'REMOVE_COL'; export const SET_COLS_ORDER = EXPERIMENTS_PREFIX + 'SET_COLS_ORDER'; export const CHANGE_COLS_ORDER = EXPERIMENTS_PREFIX + 'CHANGE_COLS_ORDER'; export const CLEAR_HYPER_PARAMS_COLS = EXPERIMENTS_PREFIX + 'CLEAR_COLS'; -export const RESET_SORT_ORDER = EXPERIMENTS_PREFIX + 'RESET_SORT_ORDER'; +export const RESET_SORT_ORDER = EXPERIMENTS_PREFIX + 'RESET_SORT_ORDER'; export class GetCustomMetrics implements Action { readonly type = GET_CUSTOM_METRICS; @@ -276,7 +291,7 @@ export class SetCustomHyperParams implements Action { export const setExtraColumns = createAction( EXPERIMENTS_PREFIX + 'SET_EXTRA_COLUMNS', - props<{columns: any[]}>() + props<{ columns: any[] }>() ); export class AddCol implements Action { @@ -290,22 +305,24 @@ export class AddCol implements Action { export class RemoveCol implements Action { public type = REMOVE_COL; - public payload: { col: {id: string; projectId: string} }; + public payload: { col: { id: string; projectId: string } }; - constructor(col: {id: string; projectId: string}) { + constructor(col: { id: string; projectId: string }) { this.payload = {col}; } } + export const changeColsOrder = createAction( EXPERIMENTS_PREFIX + 'CHANGE_COLS_ORDER', - props<{cols: string[]}>() + props<{ cols: string[] }>() ); export const setColsOrderForProject = createAction( EXPERIMENTS_PREFIX + 'SET_COLS_ORDER', - props<{cols: string[]; project: string}>() + props<{ cols: string[]; project: string }>() ); + export class ClearHyperParamsCols implements Action { public type = CLEAR_HYPER_PARAMS_COLS; public payload: { projectId }; @@ -321,10 +338,10 @@ export class ResetSortOrder implements Action { export const setArchive = createAction( EXPERIMENTS_PREFIX + 'SET_ARCHIVE', - props<{archive: boolean}>() + props<{ archive: boolean }>() ); export const afterSetArchive = createAction(EXPERIMENTS_PREFIX + 'AFTER_SET_ARCHIVE'); -export const setSplitSize = createAction( EXPERIMENTS_PREFIX + 'SET_SPLIT_SIZE', props<{splitSize: number}>() +export const setSplitSize = createAction(EXPERIMENTS_PREFIX + 'SET_SPLIT_SIZE', props<{ splitSize: number }>() ); diff --git a/src/app/webapp-common/experiments/common-experiments.component.html b/src/app/webapp-common/experiments/common-experiments.component.html index 6b5ed575..84c0afa1 100644 --- a/src/app/webapp-common/experiments/common-experiments.component.html +++ b/src/app/webapp-common/experiments/common-experiments.component.html @@ -17,8 +17,8 @@ (setAutoRefresh)="setAutoRefresh($event)" (clearSelection)="clearSelection()" > -
- +
+
- + (archiveEntitiesClicked)="archiveExperiments()" + (restoreEntitiesClicked)="restoreExperiments()" +> diff --git a/src/app/webapp-common/experiments/common-experiments.component.scss b/src/app/webapp-common/experiments/common-experiments.component.scss index 38e30cbb..82d9b8d7 100644 --- a/src/app/webapp-common/experiments/common-experiments.component.scss +++ b/src/app/webapp-common/experiments/common-experiments.component.scss @@ -1,11 +1,11 @@ -@import "./../../webapp-common/shared/ui-components/styles/variables"; -@import "./../../webapp-common/layout/layout.scss"; +@import "./../shared/ui-components/styles/variables"; +@import "./../layout/layout.scss"; :host { .experiment-body { width: 100%; height: calc(100% - #{$project-header-height}); - &.compare { + &.footer-visible { height: calc(100% - #{$project-header-height + $project-footer-height}); } } diff --git a/src/app/webapp-common/experiments/common-experiments.component.ts b/src/app/webapp-common/experiments/common-experiments.component.ts index a034ddfb..b4cc75c1 100644 --- a/src/app/webapp-common/experiments/common-experiments.component.ts +++ b/src/app/webapp-common/experiments/common-experiments.component.ts @@ -1,12 +1,12 @@ import {ChangeDetectionStrategy, Component, OnDestroy, OnInit} from '@angular/core'; -import {selectExperimentsHiddenTableCols, selectExperimentsList, selectExperimentsMetricsCols, selectExperimentsTableCols, selectExperimentsTableColsOrder, selectGlobalFilter, selectHyperParamsVariants, selectIsExperimentInEditMode, selectNoMoreExperiments, selectSelectedExperiments, selectSelectedTableExperiment, selectShowAllSelectedIsActive, selectTableFilters, selectTableSortField, selectTableSortOrder, selectExperimentsUsers, selectExperimentsTypes} from './reducers/index'; +import {selectExperimentsHiddenTableCols, selectExperimentsList, selectExperimentsMetricsCols, selectExperimentsTableCols, selectExperimentsTableColsOrder, selectGlobalFilter, selectHyperParamsVariants, selectIsExperimentInEditMode, selectNoMoreExperiments, selectSelectedExperiments, selectSelectedTableExperiment, selectShowAllSelectedIsActive, selectTableFilters, selectTableSortField, selectTableSortOrder, selectExperimentsUsers, selectExperimentsTypes, selectExperimentsTags} from './reducers/index'; import {selectIsArchivedMode, selectProjectSystemTags, selectProjectTags} from '../core/reducers/projects.reducer'; import {select, Store} from '@ngrx/store'; import {ColHeaderTypeEnum, ISmCol, TableSortOrderEnum} from '../shared/ui-components/data/table/table.consts'; import {ActivatedRoute, Params, Router} from '@angular/router'; import {get, isEqual} from 'lodash/fp'; import {selectRouterParams} from '../core/reducers/router-reducer'; -import {filter, map, skip, tap, withLatestFrom} from 'rxjs/operators'; +import {filter, map, skip, tap, withLatestFrom, distinctUntilChanged} from 'rxjs/operators'; import {MatDialog, MatDialogRef} from '@angular/material/dialog'; import {combineLatest, Observable, Subscription} from 'rxjs'; import {ConfirmDialogComponent} from '../shared/ui-components/overlay/confirm-dialog/confirm-dialog.component'; @@ -29,6 +29,7 @@ import {getTags, ResetProjectSelection} from '../core/actions/projects.actions'; import {decodeColumns, decodeFilter, decodeOrder, MetricColumn} from '../shared/utils/tableParamEncode'; import {BaseEntityPage} from '../shared/entity-page/base-entity-page'; import {User} from '../../business-logic/model/users/user'; +import {groupHyperParams} from '../shared/utils/shared-utils'; @Component({ selector : 'sm-common-experiments', @@ -53,7 +54,7 @@ export class CommonExperimentsComponent extends BaseEntityPage implements OnInit public filteredTableCols$: Observable; public tableCols$: Observable; public metricVariants$: Observable; - public hyperParams$: Observable; + public hyperParams$: Observable; private hiddenTableCols$: Observable; private metricTableCols$: Observable; private searchSubs: Subscription; @@ -81,7 +82,7 @@ export class CommonExperimentsComponent extends BaseEntityPage implements OnInit constructor( protected store: Store, private route: ActivatedRoute, - private router: Router, private dialog: MatDialog, private syncSelector: SmSyncStateSelectorService + private router: Router, private dialog: MatDialog ) { super(store); this.tableSortField$ = this.store.select(selectTableSortField).pipe(tap(field => this.sortField = field)); @@ -100,7 +101,7 @@ export class CommonExperimentsComponent extends BaseEntityPage implements OnInit this.isExperimentInEditMode$ = this.store.select(selectIsExperimentInEditMode); this.users$ = this.store.select(selectExperimentsUsers); this.types$ = this.store.select(selectExperimentsTypes); - this.tags$ = this.store.select(selectProjectTags); + this.tags$ = this.store.select(selectExperimentsTags); this.systemTags$ = this.store.select(selectProjectSystemTags); @@ -112,12 +113,14 @@ export class CommonExperimentsComponent extends BaseEntityPage implements OnInit this.columns$ = this.store.select(selectExperimentsTableCols); this.metricVariants$ = this.store.select(selectMetricVariants); this.metricLoading$ = this.store.select(selectMetricsLoading); - this.hyperParams$ = this.store.select(selectHyperParamsVariants); + this.hyperParams$ = this.store.select(selectHyperParamsVariants).pipe( + map(hyperParams => groupHyperParams(hyperParams)) + ); this.experiments$ = this.store.select(selectExperimentsList).pipe( withLatestFrom(this.isArchived$), // lil hack for hiding archived task after they been archived from task info or footer... map(([experiments, showArchived]) => this.filterArchivedExperiments(experiments, showArchived)), - tap(_ => this.refreshing = false) + tap(() => this.refreshing = false) ); this.showInfo$ = this.store.pipe( select(selectRouterParams), @@ -137,14 +140,14 @@ export class CommonExperimentsComponent extends BaseEntityPage implements OnInit .pipe( map(([tableCols, hiddenCols, metricCols]) => tableCols.concat(metricCols.map(col => ({...col, metric: true}))) - .map(col => ({...col, hidden: hiddenCols[col.id] || null}))), - filter(col => col.id !== EXPERIMENTS_TABLE_COL_FIELDS.PROJECT || this.selectedProject == '*') + .map(col => ({...col, hidden: hiddenCols[col.id] || null})) + .filter(col => col.id !== EXPERIMENTS_TABLE_COL_FIELDS.PROJECT || this.selectedProject == '*')) ); // Only show project col on "all projects" this.tableCols$ = this.filteredTableCols$.pipe(map(cols => cols.filter(col => !col.hidden))); let prevQueryParams: Params; - this.selectedProjectSubs = combineLatest( [ + this.selectedProjectSubs = combineLatest([ this.store.select(selectRouterParams), this.route.queryParams ]).pipe( @@ -188,6 +191,7 @@ export class CommonExperimentsComponent extends BaseEntityPage implements OnInit } this.dispatchAndLock(new experimentsActions.GetExperiments()); this.store.dispatch(experimentsActions.getUsers()); + this.store.dispatch(experimentsActions.getTags()); this.store.dispatch(getTags()); this.store.dispatch(getProjectTypes()); }); @@ -220,12 +224,13 @@ export class CommonExperimentsComponent extends BaseEntityPage implements OnInit } selectExperimentFromUrl() { - this.ExperimentFromUrlSub = combineLatest( + this.ExperimentFromUrlSub = combineLatest([ this.store.select(selectRouterParams) .pipe(map(params => get('experimentId', params))), this.experiments$ - ).pipe( - map(([experimentId, experiments]) => experiments.find(experiment => experiment.id === experimentId)) + ]).pipe( + map(([experimentId, experiments]) => experiments.find(experiment => experiment.id === experimentId)), + distinctUntilChanged() ).subscribe((selectedExperiment) => { this.store.dispatch(new experimentsActions.SetSelectedExperiment(selectedExperiment)); }); @@ -237,9 +242,9 @@ export class CommonExperimentsComponent extends BaseEntityPage implements OnInit filterArchivedExperiments(experiments, showArchived) { if (showArchived) { - return experiments.filter(ex => ex.system_tags && ex.system_tags.includes('archived')); + return experiments.filter(ex => ex?.system_tags?.includes('archived')); } else { - return experiments.filter(ex => !ex.system_tags || !(ex.system_tags.includes('archived'))); + return experiments.filter(ex => !(ex?.system_tags?.includes('archived'))); } } @@ -269,11 +274,11 @@ export class CommonExperimentsComponent extends BaseEntityPage implements OnInit } archiveExperiments() { - this.store.dispatch(new experimentsActions.ArchivedSelectedExperiments({projectId: this.projectId})); + this.store.dispatch(new experimentsActions.ArchivedSelectedExperiments({})); } restoreExperiments() { - this.store.dispatch(new experimentsActions.RestoreSelectedExperiments({projectId: this.projectId})); + this.store.dispatch(new experimentsActions.RestoreSelectedExperiments({})); } onSearchValueChanged(value: string) { @@ -363,7 +368,7 @@ export class CommonExperimentsComponent extends BaseEntityPage implements OnInit createParamColumn(param: string) { return { - id : `execution.parameters.${param}`, + id : `hyperparams.${param}`, headerType : ColHeaderTypeEnum.sort, sortable : true, filterable: false, @@ -406,8 +411,12 @@ export class CommonExperimentsComponent extends BaseEntityPage implements OnInit } closeExperimentPanel() { - const params = this.syncSelector.selectSync(selectRouterParams); - this.router.navigate([`projects/${params.projectId}/experiments`], {queryParamsHandling: 'merge'}); + this.router.navigate([`projects/${this.projectId}/experiments`], {queryParamsHandling: 'merge'}); + window.setTimeout(() => this.infoDisabled = false); + } + + clickOnSplit() { + this.infoDisabled = false; } setAutoRefresh($event: boolean) { @@ -423,7 +432,7 @@ export class CommonExperimentsComponent extends BaseEntityPage implements OnInit } refreshTagsList() { - this.store.dispatch(getTags()); + this.store.dispatch(experimentsActions.getTags()); } refreshTypesList() { diff --git a/src/app/webapp-common/experiments/common-experiments.module.ts b/src/app/webapp-common/experiments/common-experiments.module.ts index 8fedea79..b643fa9e 100644 --- a/src/app/webapp-common/experiments/common-experiments.module.ts +++ b/src/app/webapp-common/experiments/common-experiments.module.ts @@ -10,13 +10,12 @@ import {CommonExperimentsMenuEffects} from './effects/common-experiments-menu.ef import {ExperimentHeaderComponent} from './dumb/experiment-header/experiment-header.component'; import {ExperimentInfoHeaderComponent} from './dumb/experiment-info-header/experiment-info-header.component'; import {ExperimentsTableComponent} from './dumb/experiments-table/experiments-table.component'; -import {ExperimentFooterComponent} from './dumb/experiment-footer/experiment-footer.component'; import {ExperimentOutputComponent} from './containers/experiment-ouptut/experiment-output.component'; import {ExperimentOutputLogComponent} from './containers/experiment-output-log/experiment-output-log.component'; import {ExperimentLogInfoComponent} from './dumb/experiment-log-info/experiment-log-info.component'; import {ExperimentInfoGeneralComponent} from './containers/experiment-info-general/experiment-info-general.component'; import {ExperimentGeneralInfoComponent} from './dumb/experiment-general-info/experiment-general-info.component'; -import {ExperimentModelsFormComponent} from './dumb/experiment-models-form/experiment-models-form.component'; +import {ExperimentInputModelFormComponent} from './dumb/experiment-input-model-form/experiment-input-model-form.component'; import {ExperimentNetworkDesignFormComponent} from './dumb/experiment-network-design-form/experiment-network-design-form.component'; import {ExperimentModelsFormViewComponent} from './dumb/experiment-models-form-view/experiment-models-form-view.component'; import {ExperimentExecutionFormComponent} from './dumb/experiment-execution-form/experiment-execution-form.component'; @@ -41,11 +40,10 @@ import {ExperimentCompareSharedModule} from '../experiments-compare/shared/exper import {ExperimentCustomColsMenuComponent} from './dumb/experiment-custom-cols-menu/experiment-custom-cols-menu.component'; import {SelectMetricForCustomColComponent} from './dumb/select-metric-for-custom-col/select-metric-for-custom-col.component'; import {ExperimentInfoHyperParametersComponent} from './containers/experiment-info-hyper-parameters/experiment-info-hyper-parameters.component'; -import {ExperimentHyperParamsFormComponent} from './dumb/experiment-hyper-params-form/experiment-hyper-params-form.component'; import {ExperimentExecutionDiffComponent} from './dumb/experiment-execution-diff/experiment-execution-diff.component'; import {ExperimentExecutionRequirementsComponent} from './dumb/experiment-execution-requirements/experiment-execution-requirements.component'; import {SelectHyperParamsForCustomColComponent} from './dumb/select-hyper-params-for-custom-col/select-hyper-params-for-custom-col.component'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; import {ExperimentArtifactsNavbarComponent} from './dumb/experiment-artifacts-navbar/experiment-artifacts-navbar.component'; import {ExperimentOutputModelViewComponent} from './dumb/experiment-output-model-view/experiment-output-model-view.component'; import {ExperimentInfoArtifactsComponent} from './containers/experiment-info-aritfacts/experiment-info-artifacts.component'; @@ -54,11 +52,16 @@ import {ExperimentInfoOutputModelComponent} from './containers/experiment-info-o import {ExperimentInfoArtifactItemComponent} from './containers/experiment-info-artifact-item/experiment-info-artifact-item.component'; import {ExperimentArtifactItemViewComponent} from './dumb/experiment-artifact-item-view/experiment-artifact-item-view.component'; import {ExperimentInfoInputModelComponent} from './containers/experiment-info-input-model/experiment-info-input-model.component'; -import { ExperimentOrchestrationFormComponent } from './dumb/experiment-orchestration-form/experiment-orchestration-form.component'; +import {ExperimentOrchestrationFormComponent} from './dumb/experiment-orchestration-form/experiment-orchestration-form.component'; import {ScrollingModule} from '@angular/cdk/scrolling'; import {BaseClickableArtifact} from './dumb/base-clickable-artifact'; import {BaseExperimentMenuComponent} from './shared/components/base-experiment-menu'; import {NoUnderscorePipe} from '../shared/pipes/no-underscore.pipe'; +import {ExperimentHyperParamsNavbarComponent} from './dumb/experiment-hyper-params-navbar/experiment-hyper-params-navbar.component'; +import {ExperimentInfoTaskModelComponent} from './containers/experiment-info-task-model/experiment-info-task-model.component'; +import {ExperimentInfoHyperParametersFormContainerComponent} from './containers/experiment-info-hyper-parameters-form-container/experiment-info-hyper-parameters-form-container.component'; +import {ExperimentTaskModelFormComponent} from './dumb/experiment-task-model-form/experiment-task-model-form.component'; +import {SharedModule} from '../../shared/shared.module'; @NgModule({ declarations : [ @@ -71,13 +74,14 @@ import {NoUnderscorePipe} from '../shared/pipes/no-underscore.pipe'; ExperimentInfoHeaderComponent, ExperimentsTableComponent, ExperimentInfoInputModelComponent, - ExperimentFooterComponent, + ExperimentInfoTaskModelComponent, ExperimentOutputComponent, ExperimentOutputLogComponent, ExperimentLogInfoComponent, ExperimentInfoGeneralComponent, ExperimentGeneralInfoComponent, - ExperimentModelsFormComponent, + ExperimentInputModelFormComponent, + ExperimentTaskModelFormComponent, ExperimentNetworkDesignFormComponent, ExperimentModelsFormViewComponent, ExperimentOutputModelViewComponent, @@ -91,11 +95,12 @@ import {NoUnderscorePipe} from '../shared/pipes/no-underscore.pipe'; ExperimentCustomColsMenuComponent, ExperimentTableCardComponent, ExperimentInfoHyperParametersComponent, - ExperimentHyperParamsFormComponent, + ExperimentInfoHyperParametersFormContainerComponent, ExperimentExecutionDiffComponent, ExperimentExecutionRequirementsComponent, ExperimentArtifactsNavbarComponent, ExperimentInfoArtifactsComponent, + ExperimentHyperParamsNavbarComponent, ExperimentOutputModelFormComponent, ExperimentInfoOutputModelComponent, ExperimentInfoArtifactItemComponent, @@ -104,24 +109,25 @@ import {NoUnderscorePipe} from '../shared/pipes/no-underscore.pipe'; BaseExperimentMenuComponent ], exports : [ExperimentTypeIconLabelComponent, CommonExperimentsComponent, ExperimentInfoHeaderComponent, ExperimentExecutionFormComponent], - imports : [ - AngularSplitModule.forRoot(), - ScrollingModule, - ExperimentGraphsModule, - SMMaterialModule, - FormsModule, - ReactiveFormsModule, - ExperimentCompareSharedModule, - CommonExperimentSharedModule, - CommonLayoutModule, - ExperimentSharedModule, - SMSharedModule, - SharedPipesModule, - RouterModule, - CommonModule, - EffectsModule.forFeature([CommonExperimentsViewEffects, CommonExperimentsInfoEffects, CommonExperimentOutputEffects, CommonExperimentsMenuEffects]), - MatProgressSpinnerModule, - ], + imports: [ + AngularSplitModule.forRoot(), + ScrollingModule, + ExperimentGraphsModule, + SMMaterialModule, + FormsModule, + ReactiveFormsModule, + ExperimentCompareSharedModule, + CommonExperimentSharedModule, + CommonLayoutModule, + ExperimentSharedModule, + SMSharedModule, + SharedPipesModule, + RouterModule, + CommonModule, + EffectsModule.forFeature([CommonExperimentsViewEffects, CommonExperimentsInfoEffects, CommonExperimentOutputEffects, CommonExperimentsMenuEffects]), + MatProgressSpinnerModule, + SharedModule, + ], providers : [ExperimentTableCardComponent, NoUnderscorePipe, TitleCasePipe] }) export class ExperimentsCommonModule { diff --git a/src/app/webapp-common/experiments/containers/experiment-info-aritfacts/experiment-info-aritfacts.component.scss b/src/app/webapp-common/experiments/containers/experiment-info-aritfacts/experiment-info-aritfacts.component.scss index 09bb546d..783d3b78 100644 --- a/src/app/webapp-common/experiments/containers/experiment-info-aritfacts/experiment-info-aritfacts.component.scss +++ b/src/app/webapp-common/experiments/containers/experiment-info-aritfacts/experiment-info-aritfacts.component.scss @@ -1,8 +1,30 @@ +@import "../../../shared/ui-components/styles/variables"; +@import "../../../../webapp-common/layout/layout.scss"; + :host { display: block; position: relative; height: 100%; + .no-data{ + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + width: 100%; + .i-no-data-artifacts{ + width: 200px; + height: 160px; + } + span{ + font-size: 20px; + font-weight: bold; + line-height: 1.45; + color: $cloudy-blue-two; + } + } + .col-6 { padding: 0; } diff --git a/src/app/webapp-common/experiments/containers/experiment-info-aritfacts/experiment-info-artifacts.component.html b/src/app/webapp-common/experiments/containers/experiment-info-aritfacts/experiment-info-artifacts.component.html index 45bf0546..72b23ba1 100644 --- a/src/app/webapp-common/experiments/containers/experiment-info-aritfacts/experiment-info-artifacts.component.html +++ b/src/app/webapp-common/experiments/containers/experiment-info-aritfacts/experiment-info-artifacts.component.html @@ -1,14 +1,37 @@ - -
- -
- + + +
+ +
+ +
-
+ +
+
+ + NO ARTIFACTS RECORDED +
+
+
+ diff --git a/src/app/webapp-common/experiments/containers/experiment-info-aritfacts/experiment-info-artifacts.component.ts b/src/app/webapp-common/experiments/containers/experiment-info-aritfacts/experiment-info-artifacts.component.ts index 2f265f60..cbdfccaa 100644 --- a/src/app/webapp-common/experiments/containers/experiment-info-aritfacts/experiment-info-artifacts.component.ts +++ b/src/app/webapp-common/experiments/containers/experiment-info-aritfacts/experiment-info-artifacts.component.ts @@ -4,7 +4,7 @@ import {selectBackdropActive} from '../../../core/reducers/view-reducer'; import {combineLatest, Observable, Subscription} from 'rxjs'; import {IExperimentInfoState} from '../../../../features/experiments/reducers/experiment-info.reducer'; import {selectExperimentModelInfoData} from '../../reducers'; -import {selectExperimentInfoData} from '../../../../features/experiments/reducers'; +import {selectExperimentInfoData, selectIsExperimentEditable} from '../../../../features/experiments/reducers'; import {IExperimentInfo} from '../../../../features/experiments/shared/experiment-info.model'; import {selectRouterConfig, selectRouterParams} from '../../../core/reducers/router-reducer'; import {map} from 'rxjs/operators'; @@ -29,10 +29,12 @@ export class ExperimentInfoArtifactsComponent implements OnDestroy { private onOutputModel$: Observable; private experimentKey$: Observable; public routerConfig$: Observable; + public editable$: Observable; constructor(private store: Store, public router: Router, private route: ActivatedRoute ) { this.backdropActive$ = this.store.select(selectBackdropActive); + this.editable$ = this.store.select(selectIsExperimentEditable); this.modelInfo$ = this.store.select(selectExperimentModelInfoData); this.ExperimentInfo$ = this.store.select(selectExperimentInfoData); this.routerConfig$ = this.store.select(selectRouterConfig); diff --git a/src/app/webapp-common/experiments/containers/experiment-info-hyper-parameters/experiment-info-hyper-parameters.component.html b/src/app/webapp-common/experiments/containers/experiment-info-hyper-parameters/experiment-info-hyper-parameters.component.html index 2180256e..a824bf12 100644 --- a/src/app/webapp-common/experiments/containers/experiment-info-hyper-parameters/experiment-info-hyper-parameters.component.html +++ b/src/app/webapp-common/experiments/containers/experiment-info-hyper-parameters/experiment-info-hyper-parameters.component.html @@ -1,13 +1,14 @@ - +
+ +
+ +
+
diff --git a/src/app/webapp-common/experiments/containers/experiment-info-hyper-parameters/experiment-info-hyper-parameters.component.scss b/src/app/webapp-common/experiments/containers/experiment-info-hyper-parameters/experiment-info-hyper-parameters.component.scss index 62e20bc7..122d870b 100644 --- a/src/app/webapp-common/experiments/containers/experiment-info-hyper-parameters/experiment-info-hyper-parameters.component.scss +++ b/src/app/webapp-common/experiments/containers/experiment-info-hyper-parameters/experiment-info-hyper-parameters.component.scss @@ -1,4 +1,32 @@ :host { display: block; position: relative; + height: 100%; + + .col-6 { + padding: 0; + } + + .hyper-col { + overflow: auto; + height: 100%; + padding: 0; + } + + /deep/ sm-labeled-row { + border-bottom: none !important; + } + + /deep/ hr { + margin: 0 26px; + } + + /deep/ sm-textarea-control textarea{ + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + } + + sm-experiment-hyper-params-navbar { + border-right: 1px solid #dee1e9; + } + } diff --git a/src/app/webapp-common/experiments/containers/experiment-info-hyper-parameters/experiment-info-hyper-parameters.component.ts b/src/app/webapp-common/experiments/containers/experiment-info-hyper-parameters/experiment-info-hyper-parameters.component.ts index 58be1821..99a25a06 100644 --- a/src/app/webapp-common/experiments/containers/experiment-info-hyper-parameters/experiment-info-hyper-parameters.component.ts +++ b/src/app/webapp-common/experiments/containers/experiment-info-hyper-parameters/experiment-info-hyper-parameters.component.ts @@ -1,73 +1,84 @@ import {Component, OnDestroy, OnInit} from '@angular/core'; import {Store} from '@ngrx/store'; -import {selectExperimentHyperParamsInfoData, selectIsExperimentSaving, selectIsSelectedExperimentInDev} from '../../reducers'; +import {selectExperimentConfiguration, selectExperimentHyperParamsInfoData, selectExperimentHyperParamsSelectedSectionFromRoute, selectExperimentSelectedConfigObjectFromRoute, selectIsExperimentSaving, selectIsSelectedExperimentInDev} from '../../reducers'; import {ICommonExperimentInfoState} from '../../reducers/common-experiment-info.reducer'; import * as infoActions from '../../../../features/experiments/actions/experiments-info.actions'; import {ExperimentDataUpdated, SetExperimentFormErrors} from '../../../../features/experiments/actions/experiments-info.actions'; import {ISelectedExperiment} from '../../../../features/experiments/shared/experiment-info.model'; import {selectBackdropActive} from '../../../core/reducers/view-reducer'; -import {Observable, Subscription} from 'rxjs'; +import {combineLatest, merge, Observable, Subscription} from 'rxjs'; import {IHyperParamsForm} from '../../shared/experiment-hyper-params.model'; import {selectIsExperimentEditable, selectSelectedExperiment} from '../../../../features/experiments/reducers'; import {cloneDeep} from 'lodash/fp'; +import {selectRouterConfig, selectRouterParams} from '../../../core/reducers/router-reducer'; +import {Params, Router} from '@angular/router'; +import {ParamsItem} from '../../../../business-logic/model/tasks/paramsItem'; +import {filter, tap, withLatestFrom} from 'rxjs/operators'; +import {getExperimentConfigurationNames, getExperimentConfigurationObj} from '../../actions/common-experiments-info.actions'; @Component({ - selector : 'sm-experiment-info-hyper-parameters', + selector: 'sm-experiment-info-hyper-parameters', templateUrl: './experiment-info-hyper-parameters.component.html', - styleUrls : ['./experiment-info-hyper-parameters.component.scss'] + styleUrls: ['./experiment-info-hyper-parameters.component.scss'] }) export class ExperimentInfoHyperParametersComponent implements OnInit, OnDestroy { - public hyperParamsInfo$: Observable; - // public errors$: Observable; - public selectedExperimentSbscrition: Subscription; - private selectedExperiment: ISelectedExperiment; + public selectedExperiment: ISelectedExperiment; public editable$: Observable; public isInDev$: Observable; public saving$: Observable; public backdropActive$: Observable; - private selectedExperimentSubscrition: Subscription; + private selectedExperimentSubscription: Subscription; + public routerConfig$: Observable; + public routerParams$: Observable; + public hyperParamsInfo$: Observable<{ [p: string]: { [p: string]: ParamsItem } }>; + public configuration$: Observable; + private hyperParamsConfigSubscription: Subscription; - constructor(private store: Store) { + constructor(private store: Store, protected router: Router) { this.hyperParamsInfo$ = this.store.select(selectExperimentHyperParamsInfoData); - this.editable$ = this.store.select(selectIsExperimentEditable); - this.isInDev$ = this.store.select(selectIsSelectedExperimentInDev); - this.saving$ = this.store.select(selectIsExperimentSaving); - this.backdropActive$ = this.store.select(selectBackdropActive); + this.configuration$ = this.store.select(selectExperimentConfiguration); + this.editable$ = this.store.select(selectIsExperimentEditable); + this.isInDev$ = this.store.select(selectIsSelectedExperimentInDev); + this.saving$ = this.store.select(selectIsExperimentSaving); + this.backdropActive$ = this.store.select(selectBackdropActive); + this.routerConfig$ = this.store.select(selectRouterConfig); + this.routerParams$ = this.store.select(selectRouterParams); } ngOnInit() { - this.selectedExperimentSubscrition = this.store.select(selectSelectedExperiment) + this.selectedExperimentSubscription = this.store.select(selectSelectedExperiment) + .pipe( + tap((selectedExperiment) => this.selectedExperiment = selectedExperiment), + filter((selectedExperiment) => selectedExperiment && !selectedExperiment.configuration) + ) .subscribe(selectedExperiment => { - this.selectedExperiment = selectedExperiment; + this.store.dispatch(getExperimentConfigurationNames({experimentId: selectedExperiment.id})); + this.store.dispatch(getExperimentConfigurationObj()); }); + this.hyperParamsConfigSubscription = combineLatest([this.hyperParamsInfo$, this.configuration$]).pipe( + withLatestFrom( + this.store.select(selectExperimentHyperParamsSelectedSectionFromRoute), + this.store.select(selectExperimentSelectedConfigObjectFromRoute) + )).subscribe(([[hyperparams, configuration], selectedHyperParam, selectedConfig]) => { + if ((hyperparams && configuration && !(selectedHyperParam in hyperparams) && !(selectedConfig in configuration))) { + if (selectedHyperParam) { + this.router.navigateByUrl(this.router.url.replace(selectedHyperParam, Object.keys(hyperparams)[0])); + } else if (selectedConfig) { + this.router.navigateByUrl(this.router.url.replace(`configuration/${selectedConfig}`, `hyper-param/${Object.keys(hyperparams)[0]}`)); + } + } + }); this.store.dispatch(new SetExperimentFormErrors(null)); } ngOnDestroy(): void { - this.selectedExperimentSubscrition.unsubscribe(); - } - - onFormValuesChanged(event) { - this.store.dispatch(new ExperimentDataUpdated({id: this.selectedExperiment.id, changes: {[event.field]: cloneDeep(event.value)}})); - } - - saveHyperParametersData() { - this.store.dispatch(new infoActions.SaveExperiment()); - this.store.dispatch(new infoActions.DeactivateEdit()); - } - - cancelHyperParametersChange() { - this.store.dispatch(new infoActions.DeactivateEdit()); - this.store.dispatch(new infoActions.CancelExperimentEdit()); + this.selectedExperimentSubscription.unsubscribe(); + this.hyperParamsConfigSubscription.unsubscribe(); } activateEditChanged(e) { this.store.dispatch(new infoActions.ActivateEdit(e.sectionName)); } - // onFormErrorsChanged($event) { - // - // } - } diff --git a/src/app/webapp-common/experiments/containers/experiment-info-input-model/experiment-info-input-model.component.html b/src/app/webapp-common/experiments/containers/experiment-info-input-model/experiment-info-input-model.component.html index 1fef896d..895daa6b 100644 --- a/src/app/webapp-common/experiments/containers/experiment-info-input-model/experiment-info-input-model.component.html +++ b/src/app/webapp-common/experiments/containers/experiment-info-input-model/experiment-info-input-model.component.html @@ -1,4 +1,4 @@ - - + diff --git a/src/app/webapp-common/experiments/containers/experiment-info-input-model/experiment-info-input-model.component.ts b/src/app/webapp-common/experiments/containers/experiment-info-input-model/experiment-info-input-model.component.ts index 0f6dd0d5..40c90311 100644 --- a/src/app/webapp-common/experiments/containers/experiment-info-input-model/experiment-info-input-model.component.ts +++ b/src/app/webapp-common/experiments/containers/experiment-info-input-model/experiment-info-input-model.component.ts @@ -9,6 +9,8 @@ import {IExperimentInfoState} from '../../../../features/experiments/reducers/ex import {experimentSectionsEnum} from '../../../../features/experiments/shared/experiments.const'; import {selectIsExperimentEditable, selectSelectedExperiment} from '../../../../features/experiments/reducers'; import * as infoActions from '../../../../features/experiments/actions/experiments-info.actions'; +import { ModelSelected } from '../../actions/common-experiments-info.actions'; + @Component({ selector : 'sm-experiment-info-input-model', @@ -18,12 +20,13 @@ import * as infoActions from '../../../../features/experiments/actions/experimen export class ExperimentInfoInputModelComponent implements OnInit, OnDestroy { public modelInfo$: Observable; public selectedExperimentSubscription: Subscription; - private selectedExperiment: ISelectedExperiment; + public selectedExperiment: ISelectedExperiment; public editable$: Observable; public errors$: Observable; public userKnowledge$: Observable>; public modelLabels$: Observable; public saving$: Observable; + public selectedExperiment$: Observable; constructor(private store: Store) { this.modelInfo$ = this.store.select(selectExperimentModelInfoData); @@ -31,6 +34,7 @@ export class ExperimentInfoInputModelComponent implements OnInit, OnDestroy { this.errors$ = this.store.select(selectExperimentInfoErrors); this.userKnowledge$ = this.store.select(selectExperimentUserKnowledge); this.saving$ = this.store.select(selectIsExperimentSaving); + this.selectedExperiment$ = this.store.select(selectSelectedExperiment) } ngOnInit() { @@ -54,7 +58,7 @@ export class ExperimentInfoInputModelComponent implements OnInit, OnDestroy { } onModelSelected(event) { - this.store.dispatch(new infoActions.ModelSelected(event)); + this.store.dispatch(new ModelSelected(event)); } updateSectionKnowledge(section: experimentSectionsEnum) { diff --git a/src/app/webapp-common/experiments/containers/experiment-ouptut/experiment-output.component.html b/src/app/webapp-common/experiments/containers/experiment-ouptut/experiment-output.component.html index 46dcc281..9d27fa65 100644 --- a/src/app/webapp-common/experiments/containers/experiment-ouptut/experiment-output.component.html +++ b/src/app/webapp-common/experiments/containers/experiment-ouptut/experiment-output.component.html @@ -24,15 +24,15 @@ - ; + private selectedExperiments$: Observable>; constructor(private store: Store, private router: Router, private route: ActivatedRoute, private syncSelector: SmSyncStateSelectorService) { - this.infoData$ = this.store.select(selectExperimentInfoData); + this.infoData$ = this.store.select(selectExperimentInfoData); this.autoRefreshState$ = this.store.select(selectAutoRefresh); this.isAppVisible$ = this.store.select(selectAppVisible); } ngOnInit() { - this.minimized = getOr(false, 'data.minimized', this.route.snapshot.routeConfig); - this.routerConfigSubscription = this.store.select(selectRouterConfig).subscribe(routerConfig => { + this.minimized = getOr(false, 'data.minimized', this.route.snapshot.routeConfig); + this.routerConfigSubscription = this.store.select(selectRouterConfig).subscribe(routerConfig => { this.routerConfig = routerConfig; }); - this.paramsSubscription = this.store.pipe( + this.paramsSubscription = this.store.pipe( select(selectRouterParams), tap((params) => this.projectId = params.projectId), map(params => get('experimentId', params)), filter(experimentId => !!experimentId), tap((experimentId) => this.experimentId = experimentId), - distinctUntilChanged() + distinctUntilChanged(), + withLatestFrom(this.store.select(selectSelectedExperiments)) ) - .subscribe((experimentId) => { + .subscribe(([experimentId, selectedExperiments]) => { + this.selectedExperiment = selectedExperiments.find(experiment => experiment.id === experimentId); this.store.dispatch(new ResetExperimentMetrics()); this.store.dispatch(new infoActions.ResetExperimentInfo()); this.store.dispatch(new infoActions.GetExperimentInfo(experimentId)); }); - this.autoRefreshSub = interval(AUTO_REFRESH_INTERVAL).pipe( + this.autoRefreshSub = interval(AUTO_REFRESH_INTERVAL).pipe( withLatestFrom(this.autoRefreshState$, this.isAppVisible$), filter(([iteration, autoRefreshState, isVisible]) => isVisible && autoRefreshState && !this.minimized) ).subscribe(() => { this.refresh(true); }); - this.selectedExperimentSubscription = this.store.select(selectSelectedExperiment) + this.selectedExperimentSubscription = this.store.pipe(select(selectSelectedExperiment), + filter(experiment => experiment?.id === this.experimentId)) .subscribe(experiment => this.selectedExperiment = experiment); - } diff --git a/src/app/webapp-common/experiments/containers/experiment-output-log/experiment-output-log.component.html b/src/app/webapp-common/experiments/containers/experiment-output-log/experiment-output-log.component.html index b0277b93..81eef7ef 100644 --- a/src/app/webapp-common/experiments/containers/experiment-output-log/experiment-output-log.component.html +++ b/src/app/webapp-common/experiments/containers/experiment-output-log/experiment-output-log.component.html @@ -19,6 +19,9 @@

NO LOG DATA

diff --git a/src/app/webapp-common/experiments/containers/experiment-output-log/experiment-output-log.component.ts b/src/app/webapp-common/experiments/containers/experiment-output-log/experiment-output-log.component.ts index ef865e33..7447445a 100644 --- a/src/app/webapp-common/experiments/containers/experiment-output-log/experiment-output-log.component.ts +++ b/src/app/webapp-common/experiments/containers/experiment-output-log/experiment-output-log.component.ts @@ -1,13 +1,16 @@ -import {Component, OnDestroy, OnInit, ChangeDetectorRef} from '@angular/core'; -import {select, Store} from '@ngrx/store'; -import {selectExperimentLog, selectIsExperimentInProgress, selectLogFilter} from '../../reducers'; +import {Component, OnDestroy, OnInit, ChangeDetectorRef, ViewChild} from '@angular/core'; +import {Store} from '@ngrx/store'; +import {selectExperimentBeginningOfLog, selectExperimentLog, selectLogFilter} from '../../reducers'; import {Observable, Subscription} from 'rxjs'; -import {distinctUntilChanged, filter, tap} from 'rxjs/operators'; +import {distinctUntilChanged, filter} from 'rxjs/operators'; +import {last} from 'lodash/fp'; import {HTTP} from '../../../../app.constants'; import {ISelectedExperiment} from '../../../../features/experiments/shared/experiment-info.model'; import {IExperimentInfoState} from '../../../../features/experiments/reducers/experiment-info.reducer'; import {selectSelectedExperiment} from '../../../../features/experiments/reducers'; -import {GetExperimentLog, ResetLogFilter, ResetOutput, SetLogFilter} from '../../actions/common-experiment-output.actions'; +import {ResetLogFilter, ResetOutput, SetLogFilter, getExperimentLog} from '../../actions/common-experiment-output.actions'; +import {ExperimentLogInfoComponent} from '../../dumb/experiment-log-info/experiment-log-info.component'; +import {selectRefreshing} from '../../../experiments-compare/reducers'; @Component({ selector: 'sm-experiment-output-log', @@ -20,19 +23,21 @@ export class ExperimentOutputLogComponent implements OnInit, OnDestroy { private experiment: ISelectedExperiment; public API_BASE_URL = HTTP.API_BASE_URL; - public log$: Observable>; - public experiment$: Observable; + public log$: Observable; + public experiment$: Observable; public filter$: Observable; + public logBeginning$: Observable; public creator: string | Worker; public disabled: boolean; public hasLog: boolean; - public selectIsExperimentPendingRunning: Observable; public logSubscription: Subscription; + private refreshingSubscription: Subscription; + @ViewChild('log', {static: false}) private logRef: ExperimentLogInfoComponent; - constructor(private store: Store, - private cdr: ChangeDetectorRef) { + constructor(private store: Store, private cdr: ChangeDetectorRef) { this.log$ = this.store.select(selectExperimentLog); + this.logBeginning$ = this.store.select(selectExperimentBeginningOfLog); this.filter$ = this.store.select(selectLogFilter); this.experiment$ = this.store.select(selectSelectedExperiment); } @@ -52,15 +57,30 @@ export class ExperimentOutputLogComponent implements OnInit, OnDestroy { distinctUntilChanged() ) .subscribe(experiment => { - if (this.experiment && this.experiment.id !== experiment.id) { + if (this.experiment?.id !== experiment.id || this.experiment?.started !== experiment.started) { this.store.dispatch(new ResetOutput()); + this.logRef?.reset(); + this.experiment = experiment; + this.store.dispatch(getExperimentLog({ + id: this.experiment.id, + direction: null + })); + } else if (!this.logRef?.lines?.length || this.logRef?.canRefresh) { + this.store.dispatch(getExperimentLog({ + id: this.experiment.id, + direction: !this.logRef?.orgLogs ? 'prev' : 'next', + from: last(this.logRef?.orgLogs)?.timestamp + })); } - this.experiment = experiment; - this.store.dispatch(new GetExperimentLog(experiment.id)); }); - this.selectIsExperimentPendingRunning = this.store.pipe( - select(selectIsExperimentInProgress) - ); + + this.refreshingSubscription = this.store.select(selectRefreshing) + .pipe(filter(({refreshing}) => refreshing)) + .subscribe(({autoRefresh}) => this.store.dispatch(getExperimentLog({ + id: this.experiment.id, + direction: autoRefresh ? 'prev' : 'next', + from: last(this.logRef?.orgLogs)?.timestamp + }))); } ngOnDestroy(): void { @@ -70,11 +90,11 @@ export class ExperimentOutputLogComponent implements OnInit, OnDestroy { this.store.dispatch(new ResetOutput()); } - refreshExperimentLog() { - this.store.dispatch(new GetExperimentLog(this.experiment.id)); + public filterLog(event: KeyboardEvent) { + this.store.dispatch(new SetLogFilter((event.target as HTMLInputElement).value)); } - public filterLog(event: KeyboardEvent) { - this.store.dispatch(new SetLogFilter((event.target).value)); + getLogs({direction, from}: {direction: string; from?: number}) { + this.store.dispatch(getExperimentLog({id: this.experiment.id, direction, from, refresh: !from})); } } diff --git a/src/app/webapp-common/experiments/containers/experiment-output-scalars/experiment-output-scalars.component.html b/src/app/webapp-common/experiments/containers/experiment-output-scalars/experiment-output-scalars.component.html index 62c10626..21bed719 100644 --- a/src/app/webapp-common/experiments/containers/experiment-output-scalars/experiment-output-scalars.component.html +++ b/src/app/webapp-common/experiments/containers/experiment-output-scalars/experiment-output-scalars.component.html @@ -24,6 +24,7 @@ [xAxisType]="(xAxisType$ | async)" [showSettings]="showSettingsBar" [splitSize]="splitSize$ | async" + [breakPoint]="900" (changeWeight)="changeSmoothness($event)" (resetGraphs)="resetMetrics()" (toggleSettings)="toggleSettingsBar()" diff --git a/src/app/webapp-common/experiments/containers/experiment-output-scalars/experiment-output-scalars.component.scss b/src/app/webapp-common/experiments/containers/experiment-output-scalars/experiment-output-scalars.component.scss index c4ac807f..5115acca 100644 --- a/src/app/webapp-common/experiments/containers/experiment-output-scalars/experiment-output-scalars.component.scss +++ b/src/app/webapp-common/experiments/containers/experiment-output-scalars/experiment-output-scalars.component.scss @@ -6,7 +6,7 @@ .list-container { display: block; - height: calc(100vh - 209px); + height: 100%; overflow-y: auto; overflow-x: hidden; diff --git a/src/app/webapp-common/experiments/containers/experiment-output-scalars/experiment-output-scalars.component.ts b/src/app/webapp-common/experiments/containers/experiment-output-scalars/experiment-output-scalars.component.ts index 4550c07e..4622b8cf 100644 --- a/src/app/webapp-common/experiments/containers/experiment-output-scalars/experiment-output-scalars.component.ts +++ b/src/app/webapp-common/experiments/containers/experiment-output-scalars/experiment-output-scalars.component.ts @@ -9,7 +9,7 @@ import {scrollToElement} from '../../../shared/utils/shared-utils'; import {ActivatedRoute, Router} from '@angular/router'; import {of} from 'rxjs'; import {IExperimentInfoState} from '../../../../features/experiments/reducers/experiment-info.reducer'; -import {ExperimentScalarRequested, GetExperimentLog, ResetExperimentMetrics, SetExperimentMetricsSearchTerm, SetExperimentSettings} from '../../actions/common-experiment-output.actions'; +import {ExperimentScalarRequested, ResetExperimentMetrics, SetExperimentMetricsSearchTerm, SetExperimentSettings} from '../../actions/common-experiment-output.actions'; import {ExperimentGraph} from '../../../tasks/tasks.model'; import {convertScalars, sortMetricsList} from '../../../tasks/tasks.utils'; import {ScalarKeyEnum} from '../../../../business-logic/model/events/scalarKeyEnum'; diff --git a/src/app/webapp-common/experiments/dumb/experiment-artifact-item-view/experiment-artifact-item-view.component.html b/src/app/webapp-common/experiments/dumb/experiment-artifact-item-view/experiment-artifact-item-view.component.html index 41b19b87..c134198e 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-artifact-item-view/experiment-artifact-item-view.component.html +++ b/src/app/webapp-common/experiments/dumb/experiment-artifact-item-view/experiment-artifact-item-view.component.html @@ -1,29 +1,34 @@ -
- - {{artifact?.uri}} - {{artifact?.uri}} - - - - {{artifact?.content_size ? (artifact?.content_size | filesize) : ''}} - {{artifact?.hash}} - {{data[1]}} - -
- - -
-
+ +
+ + {{artifact?.uri}} + {{artifact?.uri}} + + + + {{artifact?.content_size ? (artifact?.content_size | filesize) : ''}} + {{artifact?.hash}} + {{data[1]}} +
+
+ + + + + + diff --git a/src/app/webapp-common/experiments/dumb/experiment-artifact-item-view/experiment-artifact-item-view.component.scss b/src/app/webapp-common/experiments/dumb/experiment-artifact-item-view/experiment-artifact-item-view.component.scss index 6f02dbc5..78c8b983 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-artifact-item-view/experiment-artifact-item-view.component.scss +++ b/src/app/webapp-common/experiments/dumb/experiment-artifact-item-view/experiment-artifact-item-view.component.scss @@ -1,17 +1,9 @@ :host { - display: block; - padding: 24px; - .model-info-container { - display: flex; - flex-direction: column; - height: calc(100% - 20px); - - sm-section-header { - margin-top: 48px; - } - - .preview { - flex: 1; - } + display: flex; + flex-direction: column; + height: 100%; + .editable-design { + flex: 1; + min-height: 300px; } } diff --git a/src/app/webapp-common/experiments/dumb/experiment-artifact-item-view/experiment-artifact-item-view.component.ts b/src/app/webapp-common/experiments/dumb/experiment-artifact-item-view/experiment-artifact-item-view.component.ts index eed04165..3aad37a5 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-artifact-item-view/experiment-artifact-item-view.component.ts +++ b/src/app/webapp-common/experiments/dumb/experiment-artifact-item-view/experiment-artifact-item-view.component.ts @@ -33,4 +33,13 @@ export class ExperimentArtifactItemViewComponent extends BaseClickableArtifact{ constructor(protected adminService: AdminService, protected store: Store) { super(adminService, store); } + + linkClicked(event: Event) { + const signed = this.adminService.signUrlIfNeeded(this.artifact.uri, true); + const a = document.createElement('a'); + a.href = signed || this.artifact.uri; + a.target = '_blank'; + a.click(); + event.preventDefault(); + } } diff --git a/src/app/webapp-common/experiments/dumb/experiment-artifacts-navbar/experiment-artifacts-navbar.component.html b/src/app/webapp-common/experiments/dumb/experiment-artifacts-navbar/experiment-artifacts-navbar.component.html index f7b8f736..986104ce 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-artifacts-navbar/experiment-artifacts-navbar.component.html +++ b/src/app/webapp-common/experiments/dumb/experiment-artifacts-navbar/experiment-artifacts-navbar.component.html @@ -1,10 +1,10 @@ - + MODELS
@@ -21,7 +21,7 @@ - + DATA AUDIT
- {{artifact.key}} + {{artifact.key}}
- + OTHER
- {{artifact.key}} + {{artifact.key}}
diff --git a/src/app/webapp-common/experiments/dumb/experiment-artifacts-navbar/experiment-artifacts-navbar.component.scss b/src/app/webapp-common/experiments/dumb/experiment-artifacts-navbar/experiment-artifacts-navbar.component.scss index 803f7d96..f6ef0f59 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-artifacts-navbar/experiment-artifacts-navbar.component.scss +++ b/src/app/webapp-common/experiments/dumb/experiment-artifacts-navbar/experiment-artifacts-navbar.component.scss @@ -92,7 +92,7 @@ display: flex; align-items: center; - .icon { + .icon, .al-icon { margin-right: 10px; } } diff --git a/src/app/webapp-common/experiments/dumb/experiment-artifacts-navbar/experiment-artifacts-navbar.component.ts b/src/app/webapp-common/experiments/dumb/experiment-artifacts-navbar/experiment-artifacts-navbar.component.ts index 3cf24ea8..6e22237e 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-artifacts-navbar/experiment-artifacts-navbar.component.ts +++ b/src/app/webapp-common/experiments/dumb/experiment-artifacts-navbar/experiment-artifacts-navbar.component.ts @@ -28,6 +28,8 @@ export class ExperimentArtifactsNavbarComponent { @Input() selectedArtifactKey; @Input() outputModel; + @Input() inputModel; + @Input() editable; @Input() activeSection; @Input() routerConfig: string[]; @Output() artifactSelected = new EventEmitter(); diff --git a/src/app/webapp-common/experiments/dumb/experiment-custom-cols-menu/experiment-custom-cols-menu.component.html b/src/app/webapp-common/experiments/dumb/experiment-custom-cols-menu/experiment-custom-cols-menu.component.html index 620ae104..f4c54627 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-custom-cols-menu/experiment-custom-cols-menu.component.html +++ b/src/app/webapp-common/experiments/dumb/experiment-custom-cols-menu/experiment-custom-cols-menu.component.html @@ -1,5 +1,5 @@
HYPER PARAMETERS
diff --git a/src/app/webapp-common/experiments/dumb/experiment-custom-cols-menu/experiment-custom-cols-menu.component.ts b/src/app/webapp-common/experiments/dumb/experiment-custom-cols-menu/experiment-custom-cols-menu.component.ts index 329cdd7d..ce08dde7 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-custom-cols-menu/experiment-custom-cols-menu.component.ts +++ b/src/app/webapp-common/experiments/dumb/experiment-custom-cols-menu/experiment-custom-cols-menu.component.ts @@ -2,28 +2,38 @@ import {Component, EventEmitter, Input, Output} from '@angular/core'; import {CustomColumnMode} from '../../shared/common-experiments.const'; @Component({ - selector : 'sm-experiment-custom-cols-menu', + selector: 'sm-experiment-custom-cols-menu', templateUrl: './experiment-custom-cols-menu.component.html', - styleUrls : ['./experiment-custom-cols-menu.component.scss'] + styleUrls: ['./experiment-custom-cols-menu.component.scss'] }) export class ExperimentCustomColsMenuComponent { + public hasHyperParams: boolean; + private _hyperParams: { [section: string]: any[] }; + + @Input() metricVariants; @Input() customColumnMode: CustomColumnMode; @Input() tableCols; - @Input() metricVariants; - @Input() hyperParams; + + @Input() set hyperParams(hyperParams: { [section: string]: any[] }) { + this._hyperParams = hyperParams; + this.hasHyperParams = Object.values(hyperParams).some(section => Object.keys(section).length > 0); + } + get hyperParams() { + return this._hyperParams; + } + @Input() isLoading: boolean; @Output() selectMetricActiveChanged = new EventEmitter(); - @Output() getMetricsToDisplay = new EventEmitter(); - @Output() removeColFromList = new EventEmitter(); - @Output() selectedTableColsChanged = new EventEmitter(); - @Output() selectedMetricToShow = new EventEmitter(); - @Output() selectedHyperParamToShow = new EventEmitter(); - @Output() addCustomColClicked = new EventEmitter(); - @Output() clearSelection = new EventEmitter(); - - public menuFooterHover; + @Output() getMetricsToDisplay = new EventEmitter(); + @Output() removeColFromList = new EventEmitter(); + @Output() selectedTableColsChanged = new EventEmitter(); + @Output() selectedMetricToShow = new EventEmitter(); + @Output() selectedHyperParamToShow = new EventEmitter(); + @Output() addCustomColClicked = new EventEmitter(); + @Output() clearSelection = new EventEmitter(); + public CustomColumnMode = CustomColumnMode; } diff --git a/src/app/webapp-common/experiments/dumb/experiment-execution-diff/experiment-execution-diff.component.html b/src/app/webapp-common/experiments/dumb/experiment-execution-diff/experiment-execution-diff.component.html index 48b81746..f4ca33fd 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-execution-diff/experiment-execution-diff.component.html +++ b/src/app/webapp-common/experiments/dumb/experiment-execution-diff/experiment-execution-diff.component.html @@ -1,10 +1,9 @@ - - -No changes logged +
+ +
{{line}}
+
+
+No changes logged + diff --git a/src/app/webapp-common/experiments/dumb/experiment-execution-diff/experiment-execution-diff.component.scss b/src/app/webapp-common/experiments/dumb/experiment-execution-diff/experiment-execution-diff.component.scss index f1dbf577..75c1953d 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-execution-diff/experiment-execution-diff.component.scss +++ b/src/app/webapp-common/experiments/dumb/experiment-execution-diff/experiment-execution-diff.component.scss @@ -1,7 +1,20 @@ -sm-textarea-control { - display: block; - height: 180px; - &.hidden { - display: none; +@import "../../../shared/ui-components/styles/variables"; + +:host { + .diff-container { + background-color: $blue-600; + padding: 12px 0 12px 12px; + border-radius: 4px; + + .viewport { + height: 250px; + color: $white; + overflow-x: scroll; + + .line { + height: 19px; + white-space: pre; + } + } } } diff --git a/src/app/webapp-common/experiments/dumb/experiment-execution-diff/experiment-execution-diff.component.ts b/src/app/webapp-common/experiments/dumb/experiment-execution-diff/experiment-execution-diff.component.ts index 939b1f3b..1f6a1044 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-execution-diff/experiment-execution-diff.component.ts +++ b/src/app/webapp-common/experiments/dumb/experiment-execution-diff/experiment-execution-diff.component.ts @@ -10,34 +10,24 @@ import {TextareaControlComponent} from '../../../shared/ui-components/forms/text templateUrl: './experiment-execution-diff.component.html', styleUrls : ['./experiment-execution-diff.component.scss'], }) -export class ExperimentExecutionDiffComponent implements IExperimentInfoFormComponent, OnInit, OnDestroy { +export class ExperimentExecutionDiffComponent implements IExperimentInfoFormComponent { + + lines: string[]; + @Input() set formData(data: IExecutionForm['diff']) { + this.lines = data ? data.split('\n') : []; + } - @Input() formData: IExecutionForm['diff']; @Input() isInDev: boolean = false; private _editable: boolean; @Input() set editable(editable: boolean) { this._editable = editable; - window.setTimeout(() => this.diff.onResize()); } get editable() { return this._editable; } + @Input() showSpinner: boolean; @Output() freezeForm = new EventEmitter(); @Output() formDataChanged = new EventEmitter<{ field: string; value: any }>(); HELP_TEXTS = HELP_TEXTS; - @ViewChild('diff', {static: true}) diff: TextareaControlComponent; - private formChangesSubscription: Subscription; - - ngOnInit(): void { - this.formChangesSubscription = this.diff.formDataChanged.subscribe(formValue => { - if (this.editable) { - this.formDataChanged.emit({field: 'diff', value: formValue.value}); - } - }); - } - - ngOnDestroy(): void { - this.formChangesSubscription.unsubscribe(); - } } diff --git a/src/app/webapp-common/experiments/dumb/experiment-execution-form/experiment-execution-form.component.html b/src/app/webapp-common/experiments/dumb/experiment-execution-form/experiment-execution-form.component.html index ab6e9eef..fa71bae1 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-execution-form/experiment-execution-form.component.html +++ b/src/app/webapp-common/experiments/dumb/experiment-execution-form/experiment-execution-form.component.html @@ -18,7 +18,8 @@ @@ -29,6 +30,7 @@ [editable]="editable && diffSection.inEditMode" [isInDev]="isInDev" [formData]="formData.diff" + [showSpinner]="showExtraDataSpinner" (formDataChanged)="fieldValueChanged($event)" (freezeForm)="freezeForm.emit($event)"> { if (confirmed) { - this.freezeForm.emit(); + this.activateEdit.emit({editMode: true, sectionName: 'diff'}); this.fieldValueChanged({field: 'diff', value: ''}); this.saveFormData.emit(); } @@ -98,4 +99,24 @@ export class ExperimentExecutionFormComponent extends ImmutableFormContainer imp } }); } + + clearInstalledPackages() { + const confirmDialogRef: MatDialogRef = this.dialog.open(ConfirmDialogComponent, { + data: { + title: 'Clear installed packages', + body: 'Are you sure you want to clear the entire contents of Installed packages?', + yes: 'Clear', + no: 'Keep', + iconClass: 'al-icon al-ico-trash al-color blue-300', + } + }); + + confirmDialogRef.afterClosed().pipe(take(1)).subscribe((confirmed) => { + if (confirmed) { + this.activateEdit.emit({editMode: true, sectionName: 'requirements'}); + this.fieldValueChanged({field: 'requirements', value: ''}); + this.saveFormData.emit(); + } + }); + } } diff --git a/src/app/webapp-common/experiments/dumb/experiment-execution-output/experiment-execution-output.component.html b/src/app/webapp-common/experiments/dumb/experiment-execution-output/experiment-execution-output.component.html index c8f741f7..bd010ba0 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-execution-output/experiment-execution-output.component.html +++ b/src/app/webapp-common/experiments/dumb/experiment-execution-output/experiment-execution-output.component.html @@ -2,7 +2,7 @@ @@ -10,7 +10,7 @@ diff --git a/src/app/webapp-common/experiments/dumb/experiment-execution-parameters/experiment-execution-parameters.component.html b/src/app/webapp-common/experiments/dumb/experiment-execution-parameters/experiment-execution-parameters.component.html index e98090f6..39a0cf59 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-execution-parameters/experiment-execution-parameters.component.html +++ b/src/app/webapp-common/experiments/dumb/experiment-execution-parameters/experiment-execution-parameters.component.html @@ -1,56 +1,70 @@ -
-
- -
-
- - - - Required - - - .(dot) $(dollar) and space are not allowed in parameter key. - - - - -
-
- - - - -
-
- + + + +
+ + + + Required + + + .(dot) $(dollar) and space are not allowed in parameter key. + + + key already exists + + + + + +
+
- -
+ + - -
- - -
-
{{row.key}}
-
{{row.label}}
-
+ +
+ + + + + + + {{row[col.id]}} + - +
diff --git a/src/app/webapp-common/experiments/dumb/experiment-execution-parameters/experiment-execution-parameters.component.scss b/src/app/webapp-common/experiments/dumb/experiment-execution-parameters/experiment-execution-parameters.component.scss index dca422a0..893e6e21 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-execution-parameters/experiment-execution-parameters.component.scss +++ b/src/app/webapp-common/experiments/dumb/experiment-execution-parameters/experiment-execution-parameters.component.scss @@ -1,25 +1,62 @@ +@import "../../../shared/ui-components/styles/variables"; + :host { + form.editable, .table-container { + height: 100%; + padding-bottom: 6px; + } + + form.editable { + padding-bottom: 6px; + } + + .form-container { + height: 100%; + overflow: auto; + } + + mat-form-field{ + width: 42%; + padding-right: 12px; + } /deep/ tr:hover { cursor: auto !important; transition: background-color 0.3s; } + .separator { width: 100%; //border-bottom: solid 1px #dee1e9; } - .i-trash{ - padding-top: 60px; + + .remove-step { + margin: .25em 0; + padding-bottom: 1.34375em; + padding-top: 7px; + display: flex; + align-items: center; } .param-row { font-weight: 500; + & > div { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } } - .allow-multi-space{ + .name{ + font-weight: 500; + } + + .allow-multi-space { white-space: pre; } + .add-parameter{ + border: 1px solid $grey-purple; + background-color: #ffffff; + color: $grey-purple; + transition: all ease-in-out 0.15s, border ease-in-out 0.15s; + } } diff --git a/src/app/webapp-common/experiments/dumb/experiment-execution-parameters/experiment-execution-parameters.component.ts b/src/app/webapp-common/experiments/dumb/experiment-execution-parameters/experiment-execution-parameters.component.ts index 78f59cb1..590d0d1c 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-execution-parameters/experiment-execution-parameters.component.ts +++ b/src/app/webapp-common/experiments/dumb/experiment-execution-parameters/experiment-execution-parameters.component.ts @@ -1,11 +1,12 @@ -import {Component, EventEmitter, Input, OnInit, Output, ViewChild, OnDestroy} from '@angular/core'; -import {IExecutionParameter} from '../../shared/experiment-hyper-params.model'; +import {AfterViewInit, Component, EventEmitter, Input, OnDestroy, Output, QueryList, ViewChild, ViewChildren} from '@angular/core'; import {IExperimentInfoFormComponent} from '../../../../features/experiments/shared/experiment-info.model'; import {HELP_TEXTS} from '../../shared/common-experiments.const'; -import {cloneDeep, isEqual} from 'lodash/fp'; +import {cloneDeep} from 'lodash/fp'; import {v4 as uuidV4} from 'uuid'; import {NgForm} from '@angular/forms'; -import {debounceTime} from 'rxjs/operators'; +import {ParamsItem} from '../../../../business-logic/model/tasks/paramsItem'; +import {ISmCol} from '../../../shared/ui-components/data/table/table.consts'; +import {CdkVirtualScrollViewport} from '@angular/cdk/scrolling'; import {Subscription} from 'rxjs'; @@ -14,56 +15,74 @@ import {Subscription} from 'rxjs'; templateUrl: './experiment-execution-parameters.component.html', styleUrls : ['./experiment-execution-parameters.component.scss'] }) -export class ExperimentExecutionParametersComponent implements IExperimentInfoFormComponent, OnInit, OnDestroy { +export class ExperimentExecutionParametersComponent implements IExperimentInfoFormComponent, OnDestroy, AfterViewInit { + private _formData: { name?: string; description?: string; section?: string; id: string; type?: string; value?: string }[]=[]; + private formContainersSub: Subscription; - public form: IExecutionParameter[]; - @ViewChild('hyperParameters', {static: true}) hyperParameters: NgForm; - @Output() formDataChanged = new EventEmitter<{ field: string, value: Array }>(); - private formChangesSubscription: Subscription; + formNames(id) { + return this.formData.filter(parameter=> parameter.id!== id).map(parameter => parameter.name); + } + + @ViewChild('hyperParameters') hyperParameters: NgForm; + private formContainer: CdkVirtualScrollViewport; + @ViewChildren('formContainer') formContainers: QueryList; + @Output() formDataChanged = new EventEmitter<{ field: string; value: ParamsItem[] }>(); + @Input() section; - @Input() set formData(data: IExecutionParameter[]) { - if (!isEqual(data, this.form)) { - this.form = cloneDeep(data).map((row: IExecutionParameter) => ({...row, id: uuidV4()})); - this.hyperParameters.form.updateValueAndValidity(); - } + @Input() set formData(formData: { name?: string; description?: string; section?: string; id?: string; type?: string; value?: string }[]) { + this._formData = cloneDeep(formData).map((row: ParamsItem) => ({...row, id: uuidV4()})); } - get formData() { - return this.form; + get formData(): { name?: string; description?: string; section?: string; id?: string; type?: string; value?: string }[] { + return this._formData; } + @Input() editable: boolean; - HELP_TEXTS = HELP_TEXTS; + HELP_TEXTS = HELP_TEXTS; public cols = [ - [ - {header: 'KEY', class: 'col-11'}, - {header: 'LABEL', class: 'col-11'}, - {header: '', class: 'col-2'} - ] - ]; + { id: 'name', style: {width: '48%'}}, + { id: 'value', style: {width: '48%'}}, + { id: 'description', style: {width: '4%'}} + ] as ISmCol[]; + private clickedRow: number; + + ngAfterViewInit() { + this.formContainersSub = this.formContainers.changes + .subscribe((list: QueryList) => { + this.formContainer = list.first; + if (this.formContainer && this.clickedRow !== null) { + this.formContainer.scrollToIndex(this.clickedRow, 'smooth'); + this.clickedRow = null; + } + }); + } addRow() { this.formData.push({ - id : uuidV4(), - key : null, - label: null + id : uuidV4(), + section : this.section, + name : '', + value : '', + description: '', + type : '' }); + window.setTimeout(() => { + const height = this.formContainer.elementRef.nativeElement.scrollHeight; + this.formContainer.scrollToIndex(height, 'smooth'); + }, 50); } removeRow(index) { this.formData.splice(index, 1); } - ngOnInit(): void { - this.formChangesSubscription = this.hyperParameters.valueChanges.pipe(debounceTime(10)).subscribe(formValue => { - if (this.editable) { - this.formDataChanged.emit({field: 'parameters', value: this.formData}); - } - }); + rowActivated({data, e}: {data: any; e: MouseEvent}) { + this.clickedRow = this.formData.findIndex(row => row.name === data.name); } - ngOnDestroy() { - this.formChangesSubscription && this.formChangesSubscription.unsubscribe(); + ngOnDestroy(): void { + this.formContainersSub?.unsubscribe(); } } diff --git a/src/app/webapp-common/experiments/dumb/experiment-execution-requirements/experiment-execution-requirements.component.html b/src/app/webapp-common/experiments/dumb/experiment-execution-requirements/experiment-execution-requirements.component.html index 60579070..097306b4 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-execution-requirements/experiment-execution-requirements.component.html +++ b/src/app/webapp-common/experiments/dumb/experiment-execution-requirements/experiment-execution-requirements.component.html @@ -1,13 +1,8 @@ - - > - -No packages identified +
+ +
{{line}}
+
+
+No packages identified diff --git a/src/app/webapp-common/experiments/dumb/experiment-execution-requirements/experiment-execution-requirements.component.scss b/src/app/webapp-common/experiments/dumb/experiment-execution-requirements/experiment-execution-requirements.component.scss index 8b137891..483d2194 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-execution-requirements/experiment-execution-requirements.component.scss +++ b/src/app/webapp-common/experiments/dumb/experiment-execution-requirements/experiment-execution-requirements.component.scss @@ -1 +1,20 @@ +@import "../../../shared/ui-components/styles/variables"; +:host { + .requirements-container { + background-color: $blue-600; + padding: 12px 0 12px 12px; + border-radius: 4px; + + .viewport { + height: 250px; + color: $white; + overflow-x: scroll; + + .line { + height: 19px; + white-space: pre; + } + } + } +} diff --git a/src/app/webapp-common/experiments/dumb/experiment-execution-requirements/experiment-execution-requirements.component.ts b/src/app/webapp-common/experiments/dumb/experiment-execution-requirements/experiment-execution-requirements.component.ts index 08ff4749..2f0d70ce 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-execution-requirements/experiment-execution-requirements.component.ts +++ b/src/app/webapp-common/experiments/dumb/experiment-execution-requirements/experiment-execution-requirements.component.ts @@ -10,12 +10,13 @@ import {ImmutableFormContainer} from '../../../shared/ui-components/forms/immuta styleUrls : ['./experiment-execution-requirements.component.scss'], }) export class ExperimentExecutionRequirementsComponent extends ImmutableFormContainer implements IExperimentInfoFormComponent { + lines: string[]; - @Input() formData: IExecutionForm['requirements']; + @Input() set formData (data: IExecutionForm['requirements']) { + this.lines = data?.pip ? data?.pip?.split('\n') : []; + } @Input() isInDev: boolean = false; @Input() editable: boolean; HELP_TEXTS = HELP_TEXTS; - - } diff --git a/src/app/webapp-common/experiments/dumb/experiment-execution-source-code/experiment-execution-source-code.component.html b/src/app/webapp-common/experiments/dumb/experiment-execution-source-code/experiment-execution-source-code.component.html index 42db10fa..612bf38e 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-execution-source-code/experiment-execution-source-code.component.html +++ b/src/app/webapp-common/experiments/dumb/experiment-execution-source-code/experiment-execution-source-code.component.html @@ -3,13 +3,13 @@
{{formData?.repository}}
- +
-
+
{{formData?.version_num}} {{formData?.branch ? ' (in branch ' + formData?.branch + ')' : ''}}
@@ -17,49 +17,49 @@ {{formData?.branch ? 'Latest in branch ' + formData?.branch : '' }}
- {{formData?.version_num ? 'Tag ' + formData?.tag + ' (commit id ' + formData.version_num + ')' : 'Tag ' + formData?.tag }} + {{formData?.version_num ? 'Tag ' + formData?.tag + ' (commit id ' + formData?.version_num + ')' : 'Tag ' + formData?.tag }}
- + {{type.label}} + [ngClass]="{'d-none': formData?.scriptType !== sourceTypesEnum.VersionNum }" class="col-12"> Required Commit ID - + Branch Required - + Required Tag @@ -67,15 +67,15 @@ -
{{formData.entry_point}}
+
{{formData?.entry_point}}
- +
-
{{formData.working_dir}}
+
{{formData?.working_dir}}
- +
diff --git a/src/app/webapp-common/experiments/dumb/experiment-execution-source-code/experiment-execution-source-code.component.scss b/src/app/webapp-common/experiments/dumb/experiment-execution-source-code/experiment-execution-source-code.component.scss index 8b137891..9e546bdc 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-execution-source-code/experiment-execution-source-code.component.scss +++ b/src/app/webapp-common/experiments/dumb/experiment-execution-source-code/experiment-execution-source-code.component.scss @@ -1 +1,3 @@ - +.source-code-container { + margin-bottom: 16px; +} diff --git a/src/app/webapp-common/experiments/dumb/experiment-footer/experiment-footer.component.html b/src/app/webapp-common/experiments/dumb/experiment-footer/experiment-footer.component.html deleted file mode 100644 index f4d4f790..00000000 --- a/src/app/webapp-common/experiments/dumb/experiment-footer/experiment-footer.component.html +++ /dev/null @@ -1,10 +0,0 @@ - -
- - {{'SHOW ' + (showAllSelectedIsActive ? 'ALL EXPERIMENTS' : (numberOfSelectedExperiments + ' EXPERIMENTS SELECTED'))}} -
-
- -
-
diff --git a/src/app/webapp-common/experiments/dumb/experiment-footer/experiment-footer.component.scss b/src/app/webapp-common/experiments/dumb/experiment-footer/experiment-footer.component.scss deleted file mode 100644 index a09164fb..00000000 --- a/src/app/webapp-common/experiments/dumb/experiment-footer/experiment-footer.component.scss +++ /dev/null @@ -1,20 +0,0 @@ - .experiment-selected-number { - padding-left: 12px; - width: 218px; - height: 100%; - } - span { - line-height: 60px; - } - - .compare { - padding-right: 40px; - cursor: pointer; - } - - .test-models { - cursor: pointer; - } - .show-all{ - text-decoration: underline; - } diff --git a/src/app/webapp-common/experiments/dumb/experiment-footer/experiment-footer.component.ts b/src/app/webapp-common/experiments/dumb/experiment-footer/experiment-footer.component.ts deleted file mode 100644 index 10a8027e..00000000 --- a/src/app/webapp-common/experiments/dumb/experiment-footer/experiment-footer.component.ts +++ /dev/null @@ -1,39 +0,0 @@ -import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; - -@Component({ - selector : 'sm-experiment-footer', - templateUrl: './experiment-footer.component.html', - styleUrls : ['./experiment-footer.component.scss'] -}) -export class ExperimentFooterComponent implements OnInit { - - @Input() visible = false; - @Input() numberOfSelectedExperiments; - @Input() showAllSelectedIsActive; - @Input() isArchivedMode; - @Input() disableArchive: boolean = false; - @Input() archiveToolTipMessage: string; - - @Output() restoreExperimentsClicked = new EventEmitter(); - @Output() compareExperimentsClicked = new EventEmitter(); - @Output() archiveExperimentsClicked = new EventEmitter(); - @Output() showAllSelectedClicked = new EventEmitter(); - - constructor() { - } - - ngOnInit() { - } - - onCompareExperimentsClicked() { - this.compareExperimentsClicked.emit(); - } - - archiveExperiments() { - this.archiveExperimentsClicked.emit(); - } - - restoreExperiments() { - this.restoreExperimentsClicked.emit(); - } -} diff --git a/src/app/webapp-common/experiments/dumb/experiment-general-info/experiment-general-info.component.html b/src/app/webapp-common/experiments/dumb/experiment-general-info/experiment-general-info.component.html index abe4e185..33fcd380 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-general-info/experiment-general-info.component.html +++ b/src/app/webapp-common/experiments/dumb/experiment-general-info/experiment-general-info.component.html @@ -47,21 +47,21 @@
+ + {{experiment?.project?.name | NA}} + + + {{experimentComment}} - - - - {{experiment?.project?.name | NA}} - - - diff --git a/src/app/webapp-common/experiments/dumb/experiment-general-info/experiment-general-info.component.ts b/src/app/webapp-common/experiments/dumb/experiment-general-info/experiment-general-info.component.ts index e25fa785..3003f5cd 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-general-info/experiment-general-info.component.ts +++ b/src/app/webapp-common/experiments/dumb/experiment-general-info/experiment-general-info.component.ts @@ -2,6 +2,8 @@ import {Component, EventEmitter, Input, Output} from '@angular/core'; import {FormControl} from '@angular/forms'; import {ISelectedExperiment} from '../../../../features/experiments/shared/experiment-info.model'; import {TIME_FORMAT_STRING} from '../../../constants'; +import {ActivateEdit, DeactivateEdit} from '../../../../features/experiments/actions/experiments-info.actions'; +import {Store} from '@ngrx/store'; @Component({ selector : 'sm-experiment-general-info', @@ -9,6 +11,7 @@ import {TIME_FORMAT_STRING} from '../../../constants'; styleUrls : ['./experiment-general-info.component.scss'] }) export class ExperimentGeneralInfoComponent { + constructor(private store: Store) {} commentControl = new FormControl(); @@ -38,5 +41,12 @@ export class ExperimentGeneralInfoComponent { commentValueChanged(value) { this.commentChanged.emit(value); } + editExperimentComment(edit) { + if (edit) { + this.store.dispatch(new ActivateEdit('ExperimentComment')); + } else { + this.store.dispatch(new DeactivateEdit()); + } + } } diff --git a/src/app/webapp-common/experiments/dumb/experiment-header/experiment-header.component.scss b/src/app/webapp-common/experiments/dumb/experiment-header/experiment-header.component.scss index c48ce1b3..9afd5644 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-header/experiment-header.component.scss +++ b/src/app/webapp-common/experiments/dumb/experiment-header/experiment-header.component.scss @@ -7,7 +7,6 @@ .header-container { padding-left: 24px; - padding-right: 24px; height: $project-header-height; transition: background-color 0.5s; diff --git a/src/app/webapp-common/experiments/dumb/experiment-hyper-params-form/experiment-hyper-params-form.component.html b/src/app/webapp-common/experiments/dumb/experiment-hyper-params-form/experiment-hyper-params-form.component.html deleted file mode 100644 index 8b873770..00000000 --- a/src/app/webapp-common/experiments/dumb/experiment-hyper-params-form/experiment-hyper-params-form.component.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - diff --git a/src/app/webapp-common/experiments/dumb/experiment-hyper-params-form/experiment-hyper-params-form.component.scss b/src/app/webapp-common/experiments/dumb/experiment-hyper-params-form/experiment-hyper-params-form.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/webapp-common/experiments/dumb/experiment-hyper-params-form/experiment-hyper-params-form.component.ts b/src/app/webapp-common/experiments/dumb/experiment-hyper-params-form/experiment-hyper-params-form.component.ts deleted file mode 100644 index fcf057a3..00000000 --- a/src/app/webapp-common/experiments/dumb/experiment-hyper-params-form/experiment-hyper-params-form.component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import {Component, Input} from '@angular/core'; -import {IExperimentInfoFormComponent} from '../../../../features/experiments/shared/experiment-info.model'; -import {ImmutableFormContainer} from '../../../shared/ui-components/forms/immutableFormContainer'; -import {HELP_TEXTS} from '../../shared/common-experiments.const'; -import {IHyperParamsForm} from '../../shared/experiment-hyper-params.model'; - -@Component({ - selector : 'sm-experiment-hyper-params-form', - templateUrl: './experiment-hyper-params-form.component.html', - styleUrls : ['./experiment-hyper-params-form.component.scss'] -}) -export class ExperimentHyperParamsFormComponent extends ImmutableFormContainer implements IExperimentInfoFormComponent { - - - @Input() formData: IHyperParamsForm; - @Input() editable: boolean; - @Input() isInDev: boolean; - @Input() saving = false; - HELP_TEXTS = HELP_TEXTS; - - sectionSaved() { - this.saveFormData.emit(); - } - - sectionCancelled() { - this.cancelFormDataChange.emit(); - } - - activateEditClicked(editMode, sectionName: string) { - this.activateEdit.emit({editMode: editMode, sectionName: sectionName}); - } -} diff --git a/src/app/webapp-common/experiments/dumb/experiment-info-header/experiment-info-header.component.html b/src/app/webapp-common/experiments/dumb/experiment-info-header/experiment-info-header.component.html index 64cb0c7b..3aeee4d6 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-info-header/experiment-info-header.component.html +++ b/src/app/webapp-common/experiments/dumb/experiment-info-header/experiment-info-header.component.html @@ -1,34 +1,44 @@ - Renaming a DEV experiment without changing the code to reflect the rename, will create a new experiment the next time the code is executed.
- + +
- {{infoData?.name}} + {{experiment?.name}} - + {{experiment.id}}
- {{experiment?.type |noUnderscore| titlecase }} + {{ experiment?.type |noUnderscore| titlecase }} + + +
-
+ - {{source?.experimentName}} diff --git a/src/app/webapp-common/experiments/dumb/experiment-models-form-view/experiment-models-form-view.component.scss b/src/app/webapp-common/experiments/dumb/experiment-models-form-view/experiment-models-form-view.component.scss index 6610d6e9..5d1a720e 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-models-form-view/experiment-models-form-view.component.scss +++ b/src/app/webapp-common/experiments/dumb/experiment-models-form-view/experiment-models-form-view.component.scss @@ -1,4 +1,3 @@ -//.input-model-container { -// display: block; -// padding-top: 10px; -//} +.input-model-container { + margin-bottom: 16px; +} diff --git a/src/app/webapp-common/experiments/dumb/experiment-models-form-view/experiment-models-form-view.component.ts b/src/app/webapp-common/experiments/dumb/experiment-models-form-view/experiment-models-form-view.component.ts index 1b5fba95..19b6b0ee 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-models-form-view/experiment-models-form-view.component.ts +++ b/src/app/webapp-common/experiments/dumb/experiment-models-form-view/experiment-models-form-view.component.ts @@ -1,6 +1,6 @@ import {Component, EventEmitter, Input, Output} from '@angular/core'; import {IModelInfoInput, IModelInfoOutput, IModelInfoSource} from '../../shared/common-experiment-model.model'; -import { MatDialog } from '@angular/material/dialog'; +import {MatDialog} from '@angular/material/dialog'; import {filter} from 'rxjs/operators'; import {ModelAutoPopulateDialogComponent} from '../model-auto-populate-dialog/model-auto-populate-dialog.component'; import {Model} from '../../../../business-logic/model/models/model'; @@ -26,9 +26,10 @@ export class ExperimentModelsFormViewComponent extends BaseClickableArtifact { @Input() modelLabels: Model['labels']; @Input() source: IModelInfoSource; @Input() output: IModelInfoOutput; + @Input() experimentName: string; @Input() set model(model: IModelInfoInput) { - this._model = model; + this._model = model; this.isLocalFile = model && model.url && this.adminService.isLocalFile(model.url); } @@ -38,7 +39,7 @@ export class ExperimentModelsFormViewComponent extends BaseClickableArtifact { @Output() modelSelected = new EventEmitter<{ model: Model; - fieldsToPopulate: { labelEnum: boolean; networkDesign: boolean}; + fieldsToPopulate: { labelEnum: boolean; networkDesign: boolean }; }>(); constructor(private dialog: MatDialog, protected adminService: AdminService, protected store: Store) { @@ -59,27 +60,31 @@ export class ExperimentModelsFormViewComponent extends BaseClickableArtifact { } confirmModelSelection(selectedModel: Model, isDesignEqual: boolean, areLabelsEquals: boolean) { - const autoPopulateModelDialog = this.dialog.open( - ModelAutoPopulateDialogComponent, - {data: - { - populateLabels: !areLabelsEquals, - populateDesign: !isDesignEqual - } - } - ); - autoPopulateModelDialog.afterClosed().pipe(filter(confirmed => !!confirmed)) - .subscribe((populateFields) => { - this.emitModelSelected(selectedModel, populateFields); - }); + this.emitModelSelected(selectedModel, { + labelEnum : false, + networkDesign: false, + }); + // const autoPopulateModelDialog = this.dialog.open( + // ModelAutoPopulateDialogComponent, + // {data: + // { + // populateLabels: !areLabelsEquals, + // populateDesign: !isDesignEqual, + // experimentName: this.experimentName, + // modelName: selectedModel.name, + // } + // } + // ); + // autoPopulateModelDialog.afterClosed().pipe(filter(confirmed => !!confirmed)) + // .subscribe((populateFields) => { + // this.emitModelSelected(selectedModel, populateFields); + // }); } - private emitModelSelected(model: Model, fieldsToPopulate: {labelEnum: boolean; networkDesign: boolean}) { + private emitModelSelected(model: Model, fieldsToPopulate: { labelEnum: boolean; networkDesign: boolean }) { this.modelSelected.emit({model: model, fieldsToPopulate: fieldsToPopulate}); } - - private isDesignEqual(modelDesign: object, design: string) { return JSON.stringify(modelDesign) === design; } diff --git a/src/app/webapp-common/experiments/dumb/experiment-models-form/experiment-models-form.component.html b/src/app/webapp-common/experiments/dumb/experiment-models-form/experiment-models-form.component.html deleted file mode 100644 index 2b31341a..00000000 --- a/src/app/webapp-common/experiments/dumb/experiment-models-form/experiment-models-form.component.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - diff --git a/src/app/webapp-common/experiments/dumb/experiment-models-form/experiment-models-form.component.scss b/src/app/webapp-common/experiments/dumb/experiment-models-form/experiment-models-form.component.scss deleted file mode 100644 index 7ee2359e..00000000 --- a/src/app/webapp-common/experiments/dumb/experiment-models-form/experiment-models-form.component.scss +++ /dev/null @@ -1,12 +0,0 @@ -:host { - display: flex; - flex-direction: column; - height: 100%; - - - .editable-design { - height: calc(100% - 180px); - min-height: 300px; - } - -} diff --git a/src/app/webapp-common/experiments/dumb/experiment-models-form/experiment-models-form.component.ts b/src/app/webapp-common/experiments/dumb/experiment-models-form/experiment-models-form.component.ts deleted file mode 100644 index 70af417d..00000000 --- a/src/app/webapp-common/experiments/dumb/experiment-models-form/experiment-models-form.component.ts +++ /dev/null @@ -1,77 +0,0 @@ -import {Component, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core'; -import {IExperimentModelInfo} from '../../shared/common-experiment-model.model'; -import {Model} from '../../../../business-logic/model/models/model'; -import {ImmutableFormContainer} from '../../../shared/ui-components/forms/immutableFormContainer'; -import {IExperimentInfoFormComponent} from '../../../../features/experiments/shared/experiment-info.model'; -import {experimentSectionsEnum} from '../../../../features/experiments/shared/experiments.const'; -import {HELP_TEXTS} from '../../shared/common-experiments.const'; -import {EditJsonComponent} from '../../../shared/ui-components/overlay/edit-json/edit-json.component'; -import {take} from 'rxjs/operators'; -import {MatDialog} from '@angular/material/dialog'; - -@Component({ - selector : 'sm-experiment-models-form', - templateUrl: './experiment-models-form.component.html', - styleUrls : ['./experiment-models-form.component.scss'] -}) -export class ExperimentModelsFormComponent extends ImmutableFormContainer implements OnInit, IExperimentInfoFormComponent { - - HELP_TEXTS = HELP_TEXTS; - public modelProjectId: string; - - constructor(private dialog: MatDialog) { - super(); - } - - @Input() editable: boolean; - @Input() controlName = 'model'; - @Input() formData: IExperimentModelInfo; - @Input() userKnowledge: Map; - @Input() modelLabels: Model['labels']; - @Input() saving; - @Output() updateSectionKnowledge = new EventEmitter(); - @Output() modelSelected = new EventEmitter<{ - model: Model, - fieldsToPopulate: { labelEnum: boolean; networkDesign: boolean; } - }>(); - @ViewChild('prototext') prototextSection; - - - ngOnInit(): void { - // parent - super.ngOnInit(); - this.modelProjectId = this.formData.input && this.formData.input.project && this.formData.input.project.id ? this.formData.input.project.id : '*'; - } - - onModelSelected(event) { - this.modelSelected.emit(event); - this.sectionSaved(); - } - - sectionSaved() { - this.saveFormData.emit(); - } - - sectionCancelled() { - this.cancelFormDataChange.emit(); - } - - activateEditClicked(editMode, sectionName: string) { - this.activateEdit.emit({editMode: editMode, sectionName: sectionName}); - } - - editPrototext() { - const editPrototextDialog = this.dialog.open(EditJsonComponent, { - data: {textData: this.formData?.prototext, readOnly: false, title: 'EDIT MODEL CONFIGURATION', typeJson: false} - }); - - editPrototextDialog.afterClosed().pipe(take(1)).subscribe((data) => { - if (data === undefined) { - this.prototextSection.cancelClickedEvent(); - } else { - this.fieldValueChanged({field: 'prototext', value: data}); - this.sectionSaved(); - } - }); - } -} diff --git a/src/app/webapp-common/experiments/dumb/experiment-network-design-form/experiment-network-design-form.component.html b/src/app/webapp-common/experiments/dumb/experiment-network-design-form/experiment-network-design-form.component.html index b8b29188..0d2c35bb 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-network-design-form/experiment-network-design-form.component.html +++ b/src/app/webapp-common/experiments/dumb/experiment-network-design-form/experiment-network-design-form.component.html @@ -1,4 +1,5 @@ +
+ +
{{line}}
+
+
+ diff --git a/src/app/webapp-common/experiments/dumb/experiment-network-design-form/experiment-network-design-form.component.scss b/src/app/webapp-common/experiments/dumb/experiment-network-design-form/experiment-network-design-form.component.scss index 018b111b..060b0b33 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-network-design-form/experiment-network-design-form.component.scss +++ b/src/app/webapp-common/experiments/dumb/experiment-network-design-form/experiment-network-design-form.component.scss @@ -1,8 +1,25 @@ +@import "../../../shared/ui-components/styles/variables"; + :host { + .design-container { + background-color: $blue-600; + padding: 12px 0 12px 12px; + border-radius: 4px; + height: 100%; + font-family: monospace; + .viewport { + height: 100%; + color: $white; + overflow-x: scroll; + .line { + height: 19px; + white-space: pre; + } + } + } display: block; - height: calc(100% - 40px); + flex: 1; position: relative; - .cursor-default { cursor: default; } diff --git a/src/app/webapp-common/experiments/dumb/experiment-network-design-form/experiment-network-design-form.component.ts b/src/app/webapp-common/experiments/dumb/experiment-network-design-form/experiment-network-design-form.component.ts index 5b02874f..09d0a6d7 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-network-design-form/experiment-network-design-form.component.ts +++ b/src/app/webapp-common/experiments/dumb/experiment-network-design-form/experiment-network-design-form.component.ts @@ -1,4 +1,4 @@ -import {Component, Input, ViewChild, ElementRef} from '@angular/core'; +import {Component, Input, ViewChild} from '@angular/core'; import {AbstractControl} from '@angular/forms'; import {ImmutableFormField} from '../../../shared/ui-components/forms/immutableFormField'; import {TextareaControlComponent} from '../../../shared/ui-components/forms/textarea-control/textarea-control.component'; @@ -10,13 +10,13 @@ import {TextareaControlComponent} from '../../../shared/ui-components/forms/text }) export class ExperimentNetworkDesignFormComponent extends ImmutableFormField { - @ViewChild('textarearef', { static: true }) textarea: TextareaControlComponent; + @ViewChild('textarearef', {static: true}) textarea: TextareaControlComponent; private _editable: boolean; + public lines: string; - @Input() set editable( isEditable: boolean) { + @Input() set editable(isEditable: boolean) { if (isEditable != this._editable) { this._editable = isEditable; - window.setTimeout(() => this.textarea.onResize(), 50); } } @@ -24,6 +24,15 @@ export class ExperimentNetworkDesignFormComponent extends ImmutableFormField { return this._editable; } + @Input() set formData(formData) { + this._formData = formData + this.lines = this._formData ? this._formData.split('\n') : []; + } + + get formData() { + return this._formData; + } + public Object = Object; constructor() { @@ -40,7 +49,7 @@ export class ExperimentNetworkDesignFormComponent extends ImmutableFormField { return {json: true}; } return null; - } + }; } diff --git a/src/app/webapp-common/experiments/dumb/experiment-orchestration-form/experiment-orchestration-form.component.scss b/src/app/webapp-common/experiments/dumb/experiment-orchestration-form/experiment-orchestration-form.component.scss index 78229b0d..d652a810 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-orchestration-form/experiment-orchestration-form.component.scss +++ b/src/app/webapp-common/experiments/dumb/experiment-orchestration-form/experiment-orchestration-form.component.scss @@ -1,4 +1,7 @@ :host { + .orchestration-form-container { + margin-bottom: 16px; + } /deep/ .labeled-row { align-items: baseline; } diff --git a/src/app/webapp-common/experiments/dumb/experiment-output-model-form/experiment-output-model-form.component.html b/src/app/webapp-common/experiments/dumb/experiment-output-model-form/experiment-output-model-form.component.html index dba9e66a..43daec41 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-output-model-form/experiment-output-model-form.component.html +++ b/src/app/webapp-common/experiments/dumb/experiment-output-model-form/experiment-output-model-form.component.html @@ -3,7 +3,6 @@ [editable]="false" [modelLabels]="modelLabels" [model]="formData?.input" - [networkDesign]="formData.prototext" [output]="formData.output" [projectId]="modelProjectId" [source]="formData?.source"> @@ -11,11 +10,11 @@ - + diff --git a/src/app/webapp-common/experiments/dumb/experiment-output-model-form/experiment-output-model-form.component.scss b/src/app/webapp-common/experiments/dumb/experiment-output-model-form/experiment-output-model-form.component.scss index c2c40352..f6a7a805 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-output-model-form/experiment-output-model-form.component.scss +++ b/src/app/webapp-common/experiments/dumb/experiment-output-model-form/experiment-output-model-form.component.scss @@ -4,7 +4,7 @@ height: 100%; .editable-design { - height: calc(100% - 150px); + flex: 1; min-height: 300px; } diff --git a/src/app/webapp-common/experiments/dumb/experiment-output-model-form/experiment-output-model-form.component.ts b/src/app/webapp-common/experiments/dumb/experiment-output-model-form/experiment-output-model-form.component.ts index f4c11da3..7e501349 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-output-model-form/experiment-output-model-form.component.ts +++ b/src/app/webapp-common/experiments/dumb/experiment-output-model-form/experiment-output-model-form.component.ts @@ -5,6 +5,7 @@ import {ImmutableFormContainer} from '../../../shared/ui-components/forms/immuta import {IExperimentInfoFormComponent} from '../../../../features/experiments/shared/experiment-info.model'; import {experimentSectionsEnum, experimentSections} from '../../../../features/experiments/shared/experiments.const'; import {HELP_TEXTS} from '../../shared/common-experiments.const'; +import {getModelDesign} from '../../../tasks/tasks.utils'; @Component({ selector : 'sm-experiment-output-model-form', @@ -21,7 +22,18 @@ export class ExperimentOutputModelFormComponent extends ImmutableFormContainer i @Input() editable: boolean; @Input() controlName = 'model'; - @Input() formData: IExperimentModelInfo; + _formData: IExperimentModelInfo; + public outputDesign: any; + private designKey: string; + @Input() set formData(formData: IExperimentModelInfo){ + this._formData = formData; + const design = getModelDesign(formData?.output?.design) + this.outputDesign = design.value ; + this.designKey = design.key; + }; + get formData(){ + return this._formData; + } @Input() userKnowledge: Map; @Input() modelLabels: Model['labels']; @Input() saving; diff --git a/src/app/webapp-common/experiments/dumb/experiment-output-model-view/experiment-output-model-view.component.scss b/src/app/webapp-common/experiments/dumb/experiment-output-model-view/experiment-output-model-view.component.scss index 6610d6e9..5d1a720e 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-output-model-view/experiment-output-model-view.component.scss +++ b/src/app/webapp-common/experiments/dumb/experiment-output-model-view/experiment-output-model-view.component.scss @@ -1,4 +1,3 @@ -//.input-model-container { -// display: block; -// padding-top: 10px; -//} +.input-model-container { + margin-bottom: 16px; +} diff --git a/src/app/webapp-common/experiments/dumb/experiment-type-icon-label/experiment-type-icon-label.component.html b/src/app/webapp-common/experiments/dumb/experiment-type-icon-label/experiment-type-icon-label.component.html index 0880edd2..6f5efde0 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-type-icon-label/experiment-type-icon-label.component.html +++ b/src/app/webapp-common/experiments/dumb/experiment-type-icon-label/experiment-type-icon-label.component.html @@ -1,6 +1,6 @@ - + - {{type | noUnderscore | titlecase}} + {{type?.length < 4 ? type.toUpperCase() : (type | noUnderscore | titlecase)}} diff --git a/src/app/webapp-common/experiments/dumb/experiment-type-icon-label/experiment-type-icon-label.component.scss b/src/app/webapp-common/experiments/dumb/experiment-type-icon-label/experiment-type-icon-label.component.scss index b2710a6a..e5cc65dc 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-type-icon-label/experiment-type-icon-label.component.scss +++ b/src/app/webapp-common/experiments/dumb/experiment-type-icon-label/experiment-type-icon-label.component.scss @@ -1,23 +1,8 @@ @import "../../../shared/ui-components/styles/variables"; :host{ - display: flex; + display: inline-flex; align-items: center; justify-content: left; - color: $light-grey-blue -} - - - -.dataset_import { - color: $dataset_import; -} - -.testing { - color: $testing; -} - -.training { - color: $training; } .middle { diff --git a/src/app/webapp-common/experiments/dumb/experiment-type-icon-label/experiment-type-icon-label.component.ts b/src/app/webapp-common/experiments/dumb/experiment-type-icon-label/experiment-type-icon-label.component.ts index e1181a2b..aadc8a5d 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-type-icon-label/experiment-type-icon-label.component.ts +++ b/src/app/webapp-common/experiments/dumb/experiment-type-icon-label/experiment-type-icon-label.component.ts @@ -8,7 +8,9 @@ import {TaskTypeEnum} from '../../../../business-logic/model/tasks/taskTypeEnum' styleUrls: ['./experiment-type-icon-label.component.scss'] }) export class ExperimentTypeIconLabelComponent implements OnInit { + private displayType: string; @Input() type: TaskTypeEnum; + @Input() iconClass = 'md'; @Input() showLabel = true; constructor() { } diff --git a/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.html b/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.html index bd59ed4b..3ccfec35 100644 --- a/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.html +++ b/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.html @@ -1,10 +1,12 @@ -
@@ -23,8 +25,8 @@
{{experiment.name}}
- -
@@ -189,7 +191,7 @@ - {{col.isParam ? getHyperParam(experiment?.execution?.parameters, col) : getVarient(experiment?.last_metrics, col)}} + {{col.isParam ? getHyperParam(experiment?.hyperparams, col) : getVarient(experiment?.last_metrics, col)}}
@@ -200,10 +202,12 @@ [cardName]="experiment.name" [columns]="tableCols" [rowData]="experiment" - (contextmenu)="onContextMenu({e: $event, rowData: experiment})" + [checked]="isRowSelected(experiment)" + [activeContextRow]="contextExperiment" + [contextMenuOpen]="contextMenuActive" > -
Updated {{experiment.last_update | timeAgo}} • Created by {{experiment.user?.name || 'Unknown User'}} +
Updated {{experiment.last_update | timeAgo}} • Created by {{experiment.user?.name || 'Unknown User'}}
{{experiment.last_iteration}} Iterations
diff --git a/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.scss b/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.scss index 170cb9ba..ef03c1a2 100644 --- a/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.scss +++ b/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.scss @@ -71,6 +71,9 @@ $header-height: 45px; } } + .compact-columns-data { + color: $blue-250; + } } /deep/ sm-models footer.d-flex.justify-content-center { diff --git a/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.ts b/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.ts index 04c499e6..d2cbb847 100644 --- a/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.ts +++ b/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.ts @@ -1,11 +1,25 @@ -import {ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, HostListener, Input, OnInit, Output, ViewChild} from '@angular/core'; +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + EventEmitter, + HostListener, + Input, + AfterViewInit, + Output, + ViewChild, + ViewChildren, QueryList +} from '@angular/core'; import {ICONS} from '../../../../app.constants'; import {ColHeaderTypeEnum, ISmCol, TableSortOrderEnum} from '../../../shared/ui-components/data/table/table.consts'; import {FILTERED_EXPERIMENTS_STATUS_OPTIONS} from '../../shared/common-experiments.const'; -import {get} from 'lodash/fp'; +import {get, uniq} from 'lodash/fp'; import {FilterMetadata} from 'primeng/api/filtermetadata'; import {ITableExperiment} from '../../shared/common-experiment-model.model'; -import {DIGITS_AFTER_DECIMAL, EXPERIMENTS_TABLE_COL_FIELDS} from '../../../../features/experiments/shared/experiments.const'; +import { + DIGITS_AFTER_DECIMAL, + EXPERIMENTS_TABLE_COL_FIELDS +} from '../../../../features/experiments/shared/experiments.const'; import {BaseTableView} from '../../../shared/ui-components/data/table/base-table-view'; import {getSystemTags, isDevelopment} from '../../../../features/experiments/shared/experiments.utils'; import {User} from '../../../../business-logic/model/users/user'; @@ -18,21 +32,24 @@ import {ExperimentMenuComponent} from '../../../../features/experiments/shared/c import {TIME_FORMAT_STRING} from '../../../constants'; import {NoUnderscorePipe} from '../../../shared/pipes/no-underscore.pipe'; import {TitleCasePipe} from '@angular/common'; +import {TableComponent} from '../../../shared/ui-components/data/table/table.component'; +import {INITIAL_EXPERIMENT_TABLE_COLS} from '../../../../features/experiments/experiments.consts'; +import {filter, take} from 'rxjs/operators'; @Component({ - selector : 'sm-experiments-table', - templateUrl : './experiments-table.component.html', - styleUrls : ['./experiments-table.component.scss'], + selector: 'sm-experiments-table', + templateUrl: './experiments-table.component.html', + styleUrls: ['./experiments-table.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush }) -export class ExperimentsTableComponent extends BaseTableView implements OnInit { +export class ExperimentsTableComponent extends BaseTableView { readonly EXPERIMENTS_TABLE_COL_FIELDS = EXPERIMENTS_TABLE_COL_FIELDS; readonly FILTERED_EXPERIMENTS_STATUS_OPTIONS = FILTERED_EXPERIMENTS_STATUS_OPTIONS; public EXPERIMENTS_ALL_FILTER_OPTIONS = { status: this.FILTERED_EXPERIMENTS_STATUS_OPTIONS, - type :[], - users : [], - tags : [], + type: [], + users: [], + tags: [], }; readonly ICONS = ICONS; readonly getSystemTags = getSystemTags; @@ -40,16 +57,19 @@ export class ExperimentsTableComponent extends BaseTableView implements OnInit { public sortOrder = 1; public statusFiltersValue: any; public typeFiltersValue: any; - public allFiltersValue: { type: any; status: any; users: any, tags: any }; + public allFiltersValue: { type: any; status: any; users: any; tags: any }; public tagsFiltersValue: any; public systemTagsFiltersValue: any; public isDevelopment = isDevelopment; public menuOpen: boolean = false; private _selectedExperiments: ITableExperiment[] = []; readonly ColHeaderTypeEnum = ColHeaderTypeEnum; + public readonly initialColumns = INITIAL_EXPERIMENT_TABLE_COLS; @Input() tableCols: Array; private _experiments: Array = []; + private _selectedExperiment: ITableExperiment; + @Input() set experiments(value: Array) { this._experiments = value; if (this.contextExperiment) { @@ -67,9 +87,10 @@ export class ExperimentsTableComponent extends BaseTableView implements OnInit { public tags$: Observable; @Input() set users(users: User[]) { - this.EXPERIMENTS_ALL_FILTER_OPTIONS.users = users.map(user => { - return {label: user.name ? user.name : 'Unknown User', value: user.id}; - }); + this.EXPERIMENTS_ALL_FILTER_OPTIONS.users = users.map(user => ({ + label: user.name ? user.name : 'Unknown User', + value: user.id + })); this.sortOptionalUsersList(); } @@ -82,27 +103,59 @@ export class ExperimentsTableComponent extends BaseTableView implements OnInit { return this._selectedExperiments; } - @Input() selectedExperiment: ITableExperiment; + @Input() set selectedExperiment(experiment: ITableExperiment) { + if (this._selectedExperiment !== experiment) { + window.setTimeout(() => this.table?.focusSelected()); + } + this._selectedExperiment = experiment; + } + get selectedExperiment() { + return this._selectedExperiment; + } @Input() noMoreExperiments: boolean; @Input() set tags(tags) { const tagsAndActiveFilter = Array.from(new Set(tags.concat(this.tagsFiltersValue))); - this.EXPERIMENTS_ALL_FILTER_OPTIONS.tags = tagsAndActiveFilter.map(tag => ({label: tag, value: tag})); + this.EXPERIMENTS_ALL_FILTER_OPTIONS.tags = tagsAndActiveFilter.map(tag => ({ + label: tag === null ? '(No tags)' : tag, + value: tag + })); this.sortOptionalTagsList(); } - @Input() systemTags; - @Input() set experimentTypes(types: string[]){ - this.EXPERIMENTS_ALL_FILTER_OPTIONS.type = types.map((type) => ({label: this.titleCasePipe.transform(this.noUnderscorePipe.transform(type)), value: type})) - }; + @Input() set experimentTypes(types: string[]) { + const typesAndActiveFilter = uniq(types.concat(this.typeFiltersValue)); + // under 4 letters assume an acronym and capitalize. + this.EXPERIMENTS_ALL_FILTER_OPTIONS.type = typesAndActiveFilter.map((type: string) => + ({ + label: (type?.length < 4 ? type.toUpperCase() : this.titleCasePipe.transform(this.noUnderscorePipe.transform(type))), + value: type + }) + ); + } + + @Input() systemTags = [] as string[]; + + get validSystemTags() { + return this.systemTags.filter(tag => tag !== 'archived'); + } @Input() set tableFilters(filters: { [s: string]: FilterMetadata }) { this.statusFiltersValue = get([EXPERIMENTS_TABLE_COL_FIELDS.STATUS, 'value'], filters) || []; this.typeFiltersValue = get([EXPERIMENTS_TABLE_COL_FIELDS.TYPE, 'value'], filters) || []; this.userFiltersValue = get([EXPERIMENTS_TABLE_COL_FIELDS.USER, 'value'], filters) || []; this.tagsFiltersValue = get([EXPERIMENTS_TABLE_COL_FIELDS.TAGS, 'value'], filters) || []; - this.systemTagsFiltersValue = get(['system_tags', 'value'], filters) || []; - this.allFiltersValue = {status: this.statusFiltersValue, type: this.typeFiltersValue, users: this.userFiltersValue, tags: this.tagsFiltersValue}; + this.systemTagsFiltersValue = (get(['system_tags', 'value'], filters) || []); + this.allFiltersValue = { + status: this.statusFiltersValue, + type: this.typeFiltersValue, + users: this.userFiltersValue, + tags: this.tagsFiltersValue + }; + } + + @Input() set split(size: number) { + this.table?.resize(); } @Output() experimentSelectionChanged = new EventEmitter(); @@ -112,8 +165,6 @@ export class ExperimentsTableComponent extends BaseTableView implements OnInit { @Output() filterChanged = new EventEmitter(); @Output() tagsMenuOpened = new EventEmitter(); @Output() typesMenuOpened = new EventEmitter(); - - @ViewChild('tableContainer', {static: true}) tableContainer; @ViewChild('contextMenu') contextMenu: ExperimentMenuComponent; TIME_FORMAT_STRING = TIME_FORMAT_STRING; @@ -124,15 +175,17 @@ export class ExperimentsTableComponent extends BaseTableView implements OnInit { } } - constructor(private changeDetector: ChangeDetectorRef, private store: Store, private noUnderscorePipe: NoUnderscorePipe, private titleCasePipe: TitleCasePipe) { + constructor(private changeDetector: ChangeDetectorRef, private store: Store, private noUnderscorePipe: NoUnderscorePipe, private titleCasePipe: TitleCasePipe) { super(); this.tags$ = this.store.select(selectProjectTags); this.entitiesKey = 'experiments'; this.selectedEntitiesKey = 'selectedExperiments'; } - ngOnInit(): void { - + afterTableInit() { + if (this.selectedExperiment) { + this.table.scrollToElement(this.selectedExperiment); + } } onRowSelectionChanged(event) { @@ -144,7 +197,7 @@ export class ExperimentsTableComponent extends BaseTableView implements OnInit { } sortOptionalTagsList() { - this.EXPERIMENTS_ALL_FILTER_OPTIONS.tags.sort((a, b) => sortByArr(a.value, b.value, this.tagsFiltersValue)); + this.EXPERIMENTS_ALL_FILTER_OPTIONS.tags.sort((a, b) => sortByArr(a.value, b.value, [null].concat(this.tagsFiltersValue))); } tagSearchValueChanged(searchTerm) { @@ -158,13 +211,10 @@ export class ExperimentsTableComponent extends BaseTableView implements OnInit { } scrollTableToTop() { - this.tableContainer.nativeElement.scroll({top: 0}); + this.table?.table?.scrollTo({top: 0}); } tableAllFiltersChanged(event) { - if (event.col === 'users') { - event.col = 'user.name'; - } this.filterChanged.emit({col: {id: event.col}, value: event.value}); this.scrollTableToTop(); } @@ -205,8 +255,8 @@ export class ExperimentsTableComponent extends BaseTableView implements OnInit { getHyperParam(params, col) { if (params && col.isParam) { - const param = col.id.replace('execution.parameters.', ''); - return params[param]; + const param = col.id.replace('hyperparams.', ''); + return get(`${param}.value`, params); } return ''; } @@ -245,8 +295,13 @@ export class ExperimentsTableComponent extends BaseTableView implements OnInit { onContextMenu(data) { this.contextExperiment = this._experiments.find(experiment => experiment.id === data.rowData.id); + if (!this.selectedExperiments.map(exp => exp.id).includes(this.contextExperiment.id)) { + this.emitSelection([this.contextExperiment]); + } const event = data.e as MouseEvent; event.preventDefault(); - this.contextMenu.openMenu({x: event.clientX, y: event.clientY}); + this.contextMenu?.openMenu({x: event.clientX, y: event.clientY}); } + + } diff --git a/src/app/webapp-common/experiments/dumb/image-displayer/image-displayer.component.html b/src/app/webapp-common/experiments/dumb/image-displayer/image-displayer.component.html index 1a641d8c..ee075912 100644 --- a/src/app/webapp-common/experiments/dumb/image-displayer/image-displayer.component.html +++ b/src/app/webapp-common/experiments/dumb/image-displayer/image-displayer.component.html @@ -3,12 +3,12 @@
{{title}}
-
- +
+
- +
@@ -26,27 +26,27 @@
- +
- +
- +
-
+
+
diff --git a/src/app/webapp-common/experiments/dumb/image-displayer/image-displayer.component.scss b/src/app/webapp-common/experiments/dumb/image-displayer/image-displayer.component.scss index 8a373b2b..1ac35375 100644 --- a/src/app/webapp-common/experiments/dumb/image-displayer/image-displayer.component.scss +++ b/src/app/webapp-common/experiments/dumb/image-displayer/image-displayer.component.scss @@ -129,6 +129,12 @@ &.zoom { height: 120px; + + // todo: Amir to fix + .al-ico-plus { + font-size: 15px; + padding-top: 8px; + } } &:hover { diff --git a/src/app/webapp-common/experiments/dumb/image-displayer/image-displayer.component.ts b/src/app/webapp-common/experiments/dumb/image-displayer/image-displayer.component.ts index 82d1517b..c8902f1e 100644 --- a/src/app/webapp-common/experiments/dumb/image-displayer/image-displayer.component.ts +++ b/src/app/webapp-common/experiments/dumb/image-displayer/image-displayer.component.ts @@ -1,6 +1,7 @@ import {ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostListener, Inject, ViewChild} from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import {ConfirmDialogComponent} from '../../../shared/ui-components/overlay/confirm-dialog/confirm-dialog.component'; +import {last} from 'lodash/fp'; @Component({ selector: 'sm-image-displayer', @@ -150,4 +151,13 @@ export class ImageDisplayerComponent { this.scale = Math.max(this.scale - (0.005 * $event.deltaY), 0.1); this.changeScale(); } + + downloadImage() { + const src = new URL(this.imageSources[this.currentIndex]); + const a = document.createElement('a') as HTMLAnchorElement; + a.href = this.imageSources[this.currentIndex]; + a.download = last(src.pathname.split('/')); + a.target = '_blank'; + a.click(); + } } diff --git a/src/app/webapp-common/experiments/dumb/model-auto-populate-dialog/model-auto-populate-dialog.component.html b/src/app/webapp-common/experiments/dumb/model-auto-populate-dialog/model-auto-populate-dialog.component.html index ac8b1efd..59d66d74 100644 --- a/src/app/webapp-common/experiments/dumb/model-auto-populate-dialog/model-auto-populate-dialog.component.html +++ b/src/app/webapp-common/experiments/dumb/model-auto-populate-dialog/model-auto-populate-dialog.component.html @@ -1,37 +1,36 @@
- + + + + + + + - - - + + + + + + + + +
- - -
diff --git a/src/app/webapp-common/experiments/dumb/model-auto-populate-dialog/model-auto-populate-dialog.component.ts b/src/app/webapp-common/experiments/dumb/model-auto-populate-dialog/model-auto-populate-dialog.component.ts index b50bbedf..1d7039b0 100644 --- a/src/app/webapp-common/experiments/dumb/model-auto-populate-dialog/model-auto-populate-dialog.component.ts +++ b/src/app/webapp-common/experiments/dumb/model-auto-populate-dialog/model-auto-populate-dialog.component.ts @@ -1,29 +1,35 @@ import {Component, Inject} from '@angular/core'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; @Component({ - selector: 'sm-model-auto-populate-dialog', + selector : 'sm-model-auto-populate-dialog', templateUrl: './model-auto-populate-dialog.component.html', - styleUrls: ['./model-auto-populate-dialog.component.scss'] + styleUrls : ['./model-auto-populate-dialog.component.scss'] }) export class ModelAutoPopulateDialogComponent { public showLabelEnumCheckbox: boolean; public showDesignCheckbox: boolean; public formData; + public subHeader: string; constructor( private dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: {populateLabels: boolean, populateDesign: boolean} + @Inject(MAT_DIALOG_DATA) public data: { populateLabels: boolean, populateDesign: boolean, experimentName: string, modelName: string } ) { this.formData = { - labelEnum: this.data.populateLabels, + labelEnum : this.data.populateLabels, networkDesign: this.data.populateDesign, }; + this.subHeader = `Overwrite the ${this.data.experimentName}’s current model configuration with ${this.data.modelName}'s configuration?`; } closeDialog(isConfirmed) { - this.dialogRef.close(isConfirmed ? this.formData : false); + if (!isConfirmed) { + this.formData.networkDesign = false; + this.formData.labelEnum = false; + } + this.dialogRef.close(this.formData); } updateFormData(event) { diff --git a/src/app/webapp-common/experiments/dumb/select-hyper-params-for-custom-col/select-hyper-params-for-custom-col.component.html b/src/app/webapp-common/experiments/dumb/select-hyper-params-for-custom-col/select-hyper-params-for-custom-col.component.html index b2febf18..6ce83cd8 100644 --- a/src/app/webapp-common/experiments/dumb/select-hyper-params-for-custom-col/select-hyper-params-for-custom-col.component.html +++ b/src/app/webapp-common/experiments/dumb/select-hyper-params-for-custom-col/select-hyper-params-for-custom-col.component.html @@ -1,14 +1,14 @@
- +
SELECT HYPER PARAMETERS TO DISPLAY

- - + diff --git a/src/app/webapp-common/experiments/dumb/select-hyper-params-for-custom-col/select-hyper-params-for-custom-col.component.scss b/src/app/webapp-common/experiments/dumb/select-hyper-params-for-custom-col/select-hyper-params-for-custom-col.component.scss index 6cc01455..60bc3728 100644 --- a/src/app/webapp-common/experiments/dumb/select-hyper-params-for-custom-col/select-hyper-params-for-custom-col.component.scss +++ b/src/app/webapp-common/experiments/dumb/select-hyper-params-for-custom-col/select-hyper-params-for-custom-col.component.scss @@ -3,7 +3,7 @@ min-height: 470px; } -sm-checked-filter-list { +sm-grouped-checked-filter-list { padding: 15px 15px 0 15px; max-height: 419px; /deep/ .actions { diff --git a/src/app/webapp-common/experiments/dumb/select-hyper-params-for-custom-col/select-hyper-params-for-custom-col.component.ts b/src/app/webapp-common/experiments/dumb/select-hyper-params-for-custom-col/select-hyper-params-for-custom-col.component.ts index 98d9f01d..c2000042 100644 --- a/src/app/webapp-common/experiments/dumb/select-hyper-params-for-custom-col/select-hyper-params-for-custom-col.component.ts +++ b/src/app/webapp-common/experiments/dumb/select-hyper-params-for-custom-col/select-hyper-params-for-custom-col.component.ts @@ -10,14 +10,14 @@ export class SelectHyperParamsForCustomColComponent { public metricsCols: string[]; - @Input() hyperParams: string[]; + @Input() hyperParams: {[section: string]: any[]}; @Output() getMetricsToDisplay = new EventEmitter(); @Output() selectedHyperParamToShow = new EventEmitter(); @Output() goBack = new EventEmitter(); @Output() clearSelection = new EventEmitter(); @Input() set tableCols(tableCols) { - this.metricsCols = tableCols.map(tableCol => tableCol.id.replace('execution.parameters.','')); + this.metricsCols = tableCols.map(tableCol => tableCol.id.replace('hyperparams.','')); } diff --git a/src/app/webapp-common/experiments/dumb/select-metric-for-custom-col/select-metric-for-custom-col.component.html b/src/app/webapp-common/experiments/dumb/select-metric-for-custom-col/select-metric-for-custom-col.component.html index 7f26e8d7..4c6d0bd4 100644 --- a/src/app/webapp-common/experiments/dumb/select-metric-for-custom-col/select-metric-for-custom-col.component.html +++ b/src/app/webapp-common/experiments/dumb/select-metric-for-custom-col/select-metric-for-custom-col.component.html @@ -1,6 +1,6 @@
- +
SELECT METRIC TO DISPLAY
diff --git a/src/app/webapp-common/experiments/dumb/select-metric-for-custom-col/select-metric-for-custom-col.component.scss b/src/app/webapp-common/experiments/dumb/select-metric-for-custom-col/select-metric-for-custom-col.component.scss index 7a109156..0500f885 100644 --- a/src/app/webapp-common/experiments/dumb/select-metric-for-custom-col/select-metric-for-custom-col.component.scss +++ b/src/app/webapp-common/experiments/dumb/select-metric-for-custom-col/select-metric-for-custom-col.component.scss @@ -34,9 +34,6 @@ } /deep/ .mat-expansion-panel-header { - &:hover { - background: #f4f7ff !important; - } .mat-expansion-indicator { height: 25px; @@ -48,7 +45,7 @@ color: $light-grey-blue; } - &.mat-expanded, mat-expanded:focus { + &.mat-expanded, .mat-expanded:focus { background: #f4f7ff !important; font-weight: bold; diff --git a/src/app/webapp-common/experiments/effects/common-experiment-output.effects.ts b/src/app/webapp-common/experiments/effects/common-experiment-output.effects.ts index 0729ba2f..988759f9 100644 --- a/src/app/webapp-common/experiments/effects/common-experiment-output.effects.ts +++ b/src/app/webapp-common/experiments/effects/common-experiment-output.effects.ts @@ -11,79 +11,82 @@ import {RequestFailed} from '../../core/actions/http.actions'; import * as outputActions from '../actions/common-experiment-output.actions'; import {ExperimentOutputState} from '../../../features/experiments/reducers/experiment-output.reducer'; import {LOG_BATCH_SIZE} from '../shared/common-experiments.const'; -import {selectSelectedSettingsxAxisType, selectLogScrollID} from '../reducers'; +import {selectSelectedSettingsxAxisType} from '../reducers'; import {REFRESH_EXPERIMENTS} from '../actions/common-experiments-view.actions'; import {EventsGetTaskLogResponse} from '../../../business-logic/model/events/eventsGetTaskLogResponse'; import {HTTP} from '../../../app.constants'; import {ScalarKeyEnum} from '../../../business-logic/model/events/scalarKeyEnum'; +import {selectCompareHistogramCacheAxisType} from '../../experiments-compare/reducers'; +import {EXPERIMENT_PLOTS_REQUESTED} from '../actions/common-experiment-output.actions'; @Injectable() export class CommonExperimentOutputEffects { @Effect() activeLoader = this.actions$.pipe( - ofType(outputActions.CHANGE_PROJECT_REQUESTED, outputActions.GET_EXPERIMENT_LOG), + ofType(outputActions.CHANGE_PROJECT_REQUESTED, outputActions.getExperimentLog, outputActions.EXPERIMENT_SCALAR_REQUESTED, outputActions.EXPERIMENT_PLOTS_REQUESTED), + filter(action => !action?.['from']), map(action => new ActiveLoader(action.type)) ); @Effect() getLog$ = this.actions$.pipe( - ofType(outputActions.GET_EXPERIMENT_LOG), - withLatestFrom(this.store.select(selectLogScrollID)), - flatMap(([action, logScrollID]) => this.eventsApi.eventsGetTaskLog({ - task : action.payload, - order : 'asc', - from : 'tail', - batch_size: LOG_BATCH_SIZE, - // scroll_id: logScrollID - }).pipe( - flatMap((res: EventsGetTaskLogResponse) => [ - new outputActions.SetExperimentLog(res.events, res.scroll_id), - new DeactiveLoader(action.type), - new DeactiveLoader(REFRESH_EXPERIMENTS) - ]), - catchError(error => [ - new RequestFailed(error), - new DeactiveLoader(action.type), - new DeactiveLoader(REFRESH_EXPERIMENTS), - new SetServerError(error, null, 'Failed to fetch log') - ]) - )) + ofType(outputActions.getExperimentLog), + switchMap((action) => + this.eventsApi.eventsGetTaskLog({ + task: action.id, + batch_size: LOG_BATCH_SIZE, + navigate_earlier: action.direction !== 'next', + from_timestamp: action.refresh ? null : action.from, + }).pipe( + flatMap((res: EventsGetTaskLogResponse) => [ + outputActions.setExperimentLog({ + events: res.events, + total: res.total, + direction: action.direction, + refresh: action.refresh + }), + new DeactiveLoader(action.type), + new DeactiveLoader(REFRESH_EXPERIMENTS) + ]), + catchError(error => [ + new RequestFailed(error), + new DeactiveLoader(action.type), + new DeactiveLoader(REFRESH_EXPERIMENTS), + new SetServerError(error, null, 'Failed to fetch log') + ]) + ) + ) ); @Effect() fetchExperimentScalar$ = this.actions$.pipe( ofType(outputActions.EXPERIMENT_SCALAR_REQUESTED), debounceTime(200), - withLatestFrom(this.store.select(selectSelectedSettingsxAxisType)), - switchMap(([action, axisType]) => - this.eventsApi.eventsScalarMetricsIterHistogram({task: action.payload, key: axisType === ScalarKeyEnum.IsoTime ? ScalarKeyEnum.Timestamp : axisType}) + withLatestFrom(this.store.select(selectSelectedSettingsxAxisType), this.store.select(selectCompareHistogramCacheAxisType)), + switchMap(([action, axisType, prevAxisType]) => { + if ([ScalarKeyEnum.IsoTime, ScalarKeyEnum.Timestamp].includes(prevAxisType) && + [ScalarKeyEnum.IsoTime, ScalarKeyEnum.Timestamp].includes(axisType)) { + return [ + new DeactiveLoader(REFRESH_EXPERIMENTS), + new DeactiveLoader(action.type) + ]; + } + + return this.eventsApi.eventsScalarMetricsIterHistogram({task: action.payload, key: axisType === ScalarKeyEnum.IsoTime ? ScalarKeyEnum.Timestamp : axisType}) .pipe( - flatMap(res => { - if (axisType === ScalarKeyEnum.IsoTime) { - res = Object.keys(res).reduce((groupAcc, groupName) => { - const group = res[groupName]; - groupAcc[groupName] = Object.keys(group).reduce((graphAcc, graphName) => { - const graph = group[graphName]; - graphAcc[graphName] = {...graph, x: graph.x.map(ts => new Date(ts))}; - return graphAcc; - }, {}); - return groupAcc; - }, {}); - } - return [ - new outputActions.SetExperimentHistogram(res), - new DeactiveLoader(REFRESH_EXPERIMENTS), - new DeactiveLoader(action.type) - ]; - }), + flatMap(res => [ + new outputActions.SetExperimentHistogram(res, axisType), + new DeactiveLoader(REFRESH_EXPERIMENTS), + new DeactiveLoader(action.type) + ]), catchError(error => [ new RequestFailed(error), new DeactiveLoader(action.type), new DeactiveLoader(REFRESH_EXPERIMENTS), new SetServerError(error, null, 'Failed to get Scalar Charts') ]) - ) + );} ) ); diff --git a/src/app/webapp-common/experiments/effects/common-experiments-info.effects.ts b/src/app/webapp-common/experiments/effects/common-experiments-info.effects.ts index e13976c4..d6d1e619 100644 --- a/src/app/webapp-common/experiments/effects/common-experiments-info.effects.ts +++ b/src/app/webapp-common/experiments/effects/common-experiments-info.effects.ts @@ -1,7 +1,7 @@ import {Injectable} from '@angular/core'; import {Actions, Effect, ofType} from '@ngrx/effects'; import {Store} from '@ngrx/store'; -import {catchError, filter, flatMap, map, shareReplay, switchMap, withLatestFrom} from 'rxjs/operators'; +import {catchError, filter, flatMap, map, shareReplay, switchMap, tap, withLatestFrom} from 'rxjs/operators'; import {ApiTasksService} from '../../../business-logic/api-services/tasks.service'; import {EXPERIMENT_INFO_ONLY_FIELDS} from '../../../features/experiments/experiments.consts'; import {selectExperimentFormValidity, selectExperimentInfoData, selectExperimentInfoDataFreeze, selectSelectedExperiment} from '../../../features/experiments/reducers'; @@ -11,61 +11,182 @@ import {RequestFailed} from '../../core/actions/http.actions'; import {ActiveLoader, DeactiveLoader, SetBackdrop, SetServerError} from '../../core/actions/layout.actions'; import {selectAppVisible} from '../../core/reducers/view-reducer'; import * as commonInfoActions from '../actions/common-experiments-info.actions'; +import {deleteHyperParamsSection, getExperimentConfigurationNames, getExperimentConfigurationObj, saveExperimentConfigObj, saveHyperParamsSection} from '../actions/common-experiments-info.actions'; import * as infoActions from '../../../features/experiments/actions/experiments-info.actions'; import {UpdateExperiment} from '../actions/common-experiments-view.actions'; -import {selectExperimentsList} from '../reducers'; +import {selectExperimentConfiguration, selectExperimentHyperParamsSelectedSectionFromRoute, selectExperimentSelectedConfigObjectFromRoute, selectExperimentsList, selectSelectedExperimentFromRouter, selectSelectedTableExperiment} from '../reducers'; import {convertStopToComplete} from '../shared/common-experiments.utils'; import {ExperimentConverterService} from '../../../features/experiments/shared/services/experiment-converter.service'; +import {of} from 'rxjs'; +import {EmptyAction} from '../../../app.constants'; +import {ReplaceHyperparamsEnum} from '../../../business-logic/model/tasks/replaceHyperparamsEnum'; +import {Router} from '@angular/router'; +import {selectRouterParams} from '../../core/reducers/router-reducer'; +import {cloneDeep, get} from 'lodash/fp'; @Injectable() export class CommonExperimentsInfoEffects { + private previousSelectedLastUpdate: Date = null; + private previousSelectedId: string; constructor( private actions$: Actions, private store: Store, private apiTasks: ApiTasksService, private reverter: ExperimentReverterService, - private converter: ExperimentConverterService - ) {} + private converter: ExperimentConverterService, + private router: Router + ) { + } @Effect() - activeLoader = this.actions$.pipe( + activeLoader = this.actions$.pipe( ofType(commonInfoActions.GET_EXPERIMENT_INFO), map(action => new ActiveLoader(action.type)) ); + @Effect() + getExperimentConfigurationNames$ = this.actions$.pipe( + ofType(getExperimentConfigurationNames), + withLatestFrom( + this.store.select(selectSelectedExperimentFromRouter), + this.store.select(selectExperimentConfiguration), + this.store.select(selectExperimentSelectedConfigObjectFromRoute) + ), + filter(([action, experimentId, configuration, selectedConfiguration]) => !!experimentId), + switchMap(([action, experimentId, configuration, selectedConfiguration]) => this.apiTasks.tasksGetConfigurationNames({tasks: [experimentId]}) + .pipe( + flatMap(res => { + let configurations = cloneDeep(configuration); + if (configurations) { + Object.keys(configurations).forEach(name => { + if (!res.configurations[0]?.names.includes(name)) { + delete configurations.name; + } + }); + } else { + configurations = {}; + } + res.configurations[0]?.names.forEach(name => { + if (!(name in configurations)) { + configurations[name] = {}; + } + }); + return [ + new commonInfoActions.UpdateExperimentInfoData({id: experimentId, changes: {configuration: configurations}}), + selectedConfiguration? getExperimentConfigurationObj(): new EmptyAction(), + new DeactiveLoader(action.type), + ]; + }), + catchError(error => { + console.log(error); + return [ + new RequestFailed(error), + new DeactiveLoader(action.type), + new SetServerError(error, null, 'Fetch configuration names failed', + action.type === commonInfoActions.AUTO_REFRESH_EXPERIMENT_INFO) + ]; + }) + ) + ) + ); + + @Effect() + getExperimentConfigurationObj$ = this.actions$.pipe( + ofType(getExperimentConfigurationObj), + withLatestFrom( + this.store.select(selectSelectedExperimentFromRouter), + this.store.select(selectExperimentConfiguration), + this.store.select(selectExperimentSelectedConfigObjectFromRoute) + ), + filter(([action, experimentId, configuration, configObj]) => configuration && configObj && (configObj in configuration)), + switchMap(([action, experimentId, configuration, configObj]) => this.apiTasks.tasksGetConfigurations({tasks: [experimentId], names: [configObj]}) + .pipe( + flatMap((res: any) => { + const configurationObj = cloneDeep(configuration); + configurationObj[configObj] = res.configurations[0].configuration[0]; + return [ + new commonInfoActions.UpdateExperimentInfoData({id: experimentId, changes: {configuration: configurationObj}}), + new DeactiveLoader(action.type), + ]; + }), + catchError(error => { + console.log(error); + return [ + new RequestFailed(error), + new DeactiveLoader(action.type), + new SetServerError(error, null, 'Fetch configuration failed', + action.type === commonInfoActions.AUTO_REFRESH_EXPERIMENT_INFO) + ]; + }) + ) + ) + ); + @Effect() getExperimentInfo$ = this.actions$.pipe( - ofType(commonInfoActions.GET_EXPERIMENT_INFO, commonInfoActions.AUTO_REFRESH_EXPERIMENT_INFO), + ofType(commonInfoActions.GET_EXPERIMENT_INFO, commonInfoActions.AUTO_REFRESH_EXPERIMENT_INFO, commonInfoActions.EXPERIMENT_UPDATED_SUCCESSFULLY), withLatestFrom( + this.store.select(selectSelectedTableExperiment), this.store.select(selectSelectedExperiment), this.store.select(selectExperimentsList), this.store.select(selectExperimentInfoData), - this.store.select(selectAppVisible) + this.store.select(selectAppVisible), ), - filter(([action, selected, experiments, infoData, visible]) => { - if (!infoData || !selected || !visible ) { - return true; + switchMap(([action, tableSelected, selected, experiments, infoData, visible]) => { + const currentSelected = tableSelected || selected; + if (this.previousSelectedId && currentSelected?.id != this.previousSelectedId) { + this.previousSelectedLastUpdate = null; + } + this.previousSelectedId = currentSelected?.id; + + if (!infoData || !currentSelected || !visible) { + return of([action, null, tableSelected, selected]); } - const listed = experiments.find(e => e.id === selected.id); - return !listed || new Date(selected.last_update) < new Date(listed.last_update); + + const listed = experiments.find(e => e.id === currentSelected?.id); + return (listed ? of(listed) : + this.apiTasks.tasksGetAllEx({id: [selected.id], only_fields: ['last_update']}).pipe(map(res => res.tasks[0]))) + .pipe(map(task => { + return [action, task.last_update, task, selected]} + )); }), - switchMap(([action]) => - this.apiTasks.tasksGetAllEx({id: [action.payload], only_fields: EXPERIMENT_INFO_ONLY_FIELDS}) + filter(([action, updateTime, tableSelected, selected]) => (action.type !== commonInfoActions.AUTO_REFRESH_EXPERIMENT_INFO || tableSelected?.id === selected?.id)), + // Can't have filter here because we need to deactivate loader + // filter(([action, selected, updateTime]) => !selected || new Date(selected.last_update) < new Date(updateTime)), + switchMap(([action, updateTime, tableSelected, selected]) => { + // else will deactivate loader + if (!updateTime || (new Date(this.previousSelectedLastUpdate) < new Date(updateTime)) || action.type === commonInfoActions.EXPERIMENT_UPDATED_SUCCESSFULLY) { + return [ + commonInfoActions.getExperiment({experimentId: action.payload}), + commonInfoActions.getExperimentUncommittedChanges({experimentId: action.payload}) + ]; + } else { + return [new DeactiveLoader(action.type)]; + } + } + ) + ); + + @Effect() + fetchExperiment$ = this.actions$.pipe( + ofType(commonInfoActions.getExperiment), + switchMap((action) => + this.apiTasks.tasksGetAllEx({id: [action.experimentId], only_fields: EXPERIMENT_INFO_ONLY_FIELDS}) .pipe( flatMap(res => { let experiment = res.tasks[0]; + this.previousSelectedLastUpdate = experiment.last_update; if (experiment) { experiment = convertStopToComplete([experiment])[0]; return [ new commonInfoActions.SetExperimentInfoData(this.reverter.revertExperiment(experiment)), new commonInfoActions.SetExperiment(experiment), - new UpdateExperiment({id: action.payload, changes: experiment}), + new UpdateExperiment({id: action.experimentId, changes: experiment}), new DeactiveLoader(action.type), - new DeactiveLoader(commonInfoActions.GET_EXPERIMENT_INFO) + new DeactiveLoader(commonInfoActions.GET_EXPERIMENT_INFO), ]; - } - else { + } else { return [ new SetServerError('Experiment not found'), new DeactiveLoader(action.type), @@ -89,7 +210,22 @@ export class CommonExperimentsInfoEffects { ); @Effect() - // Changes fields which can be applied regardless of experiment draft state i.e name, comments, tags + fetchDiff$ = this.actions$.pipe( + ofType(commonInfoActions.getExperimentUncommittedChanges), + switchMap((action) => + this.apiTasks.tasksGetAllEx({id: [action.experimentId], only_fields: ['script.diff']}) + .pipe( + flatMap(res => { + const experiment = res.tasks[0]; + return [commonInfoActions.setExperimentUncommittedChanges({diff: experiment?.script?.diff})]; + }), + catchError(() => [commonInfoActions.setExperimentUncommittedChanges({diff: ''})]) + ) + ) + ); + + @Effect() + // Changes fields which can be applied regardless of experiment draft state i.e name, comments, tags updateExperimentDetails$ = this.actions$.pipe( ofType(infoActions.EXPERIMENT_DETAILS_UPDATED), withLatestFrom( @@ -104,9 +240,9 @@ export class CommonExperimentsInfoEffects { flatMap((res) => { const changes = res?.fields || action.payload.changes; return [ - new commonInfoActions.ExperimentUpdatedSuccessfully(), - new UpdateExperiment({id: action.payload.id, changes }), - new commonInfoActions.UpdateExperimentInfoData({id: action.payload.id, changes}) + new commonInfoActions.ExperimentUpdatedSuccessfully(action.payload.id), + new UpdateExperiment({id: action.payload.id, changes}), + selectedExperiment?.id === action.payload.id ? new commonInfoActions.UpdateExperimentInfoData({id: action.payload.id, changes}) : new EmptyAction() ]; }), catchError(err => [ @@ -133,14 +269,14 @@ export class CommonExperimentsInfoEffects { this.apiTasks.tasksEdit(this.converter.convertExperiment(infoData, selectedExperiment, infoFreeze)) .pipe( flatMap((res) => [ - new commonInfoActions.ExperimentUpdatedSuccessfully(), + new commonInfoActions.ExperimentUpdatedSuccessfully(selectedExperiment.id), new SetBackdrop(false) // new viewActions.UpdateExperiment({id: action.payload.id, changes: action.payload.changes}), ]), catchError(err => [ new RequestFailed(err), new SetServerError(err), - new commonInfoActions.ExperimentUpdatedSuccessfully(), + new commonInfoActions.ExperimentUpdatedSuccessfully(selectedExperiment.id), new infoActions.CancelExperimentEdit(), new SetBackdrop(false) ]) @@ -148,4 +284,109 @@ export class CommonExperimentsInfoEffects { ), shareReplay(1) ); + + @Effect() + saveExperimentHyperParams$ = this.actions$.pipe( + ofType(saveHyperParamsSection), + withLatestFrom( + this.store.select(selectExperimentInfoData), + this.store.select(selectSelectedExperiment), + this.store.select(selectExperimentInfoDataFreeze), + this.store.select(selectExperimentFormValidity), + this.store.select(selectRouterParams).pipe(map(params => get('projectId', params))), + this.store.select(selectExperimentHyperParamsSelectedSectionFromRoute) + ), + filter(([action, infoData, selectedExperiment, infoFreeze, valid, projectId, section]) => valid), + switchMap(([action, infoData, selectedExperiment, infoFreeze, valid, projectId, section]) => + this.apiTasks.tasksEditHyperParams({task: selectedExperiment.id, hyperparams: action.hyperparams.length > 0 ? action.hyperparams : [{section}], replace_hyperparams: ReplaceHyperparamsEnum.Section}) + .pipe( + flatMap((res) => [ + new commonInfoActions.ExperimentUpdatedSuccessfully(selectedExperiment.id), + new SetBackdrop(false) + ]), + catchError(err => [ + new RequestFailed(err), + new SetServerError(err), + new commonInfoActions.ExperimentUpdatedSuccessfully(selectedExperiment.id), + new infoActions.CancelExperimentEdit(), + new SetBackdrop(false) + ]) + ) + ), + ); + + // @Effect() + // populateDesignFromModel$ = this.actions$.pipe( + // ofType(commonInfoActions.MODEL_SELECTED), + // filter((action) =>{ + // return action.payload.fieldsToPopulate.networkDesign + // }), + // flatMap((action)=> [saveExperimentConfigObj({configuration: [{ + // name:getModelDesign(action.payload.model?.design).key|| 'design', + // value: getModelDesign(action.payload.model?.design).value}]})]) + // ) + + + @Effect() + saveExperimentConfigObj$ = this.actions$.pipe( + ofType(saveExperimentConfigObj), + withLatestFrom( + this.store.select(selectExperimentInfoData), + this.store.select(selectSelectedExperimentFromRouter), + this.store.select(selectExperimentInfoDataFreeze), + this.store.select(selectRouterParams).pipe(map(params => get('projectId', params))), + this.store.select(selectExperimentHyperParamsSelectedSectionFromRoute) + ), + switchMap(([action, infoData, selectedExperiment, infoFreeze, projectId, section]) => + this.apiTasks.tasksEditConfiguration({task: selectedExperiment, configuration: action.configuration}) + .pipe( + flatMap((res) => [ + commonInfoActions.getExperimentConfigurationObj(), + commonInfoActions.setExperimentSaving({saving:false}), + new SetBackdrop(false) + ]), + catchError(err => [ + new RequestFailed(err), + new SetServerError(err), + commonInfoActions.getExperimentConfigurationObj(), + commonInfoActions.setExperimentSaving({saving:false}), + new infoActions.CancelExperimentEdit(), + new SetBackdrop(false) + ]) + ) + ), + ); + + @Effect() + deleteExperimentHyperParamsSection$ = this.actions$.pipe( + ofType(deleteHyperParamsSection), + withLatestFrom( + this.store.select(selectExperimentInfoData), + this.store.select(selectSelectedExperiment), + this.store.select(selectExperimentInfoDataFreeze), + this.store.select(selectExperimentFormValidity), + this.store.select(selectRouterParams).pipe(map(params => get('projectId', params))), + this.store.select(selectExperimentHyperParamsSelectedSectionFromRoute) + ), + filter(([action, infoData, selectedExperiment, infoFreeze, valid, projectId, section]) => valid), + switchMap(([action, infoData, selectedExperiment, infoFreeze, valid, projectId, section]) => + this.apiTasks.tasksDeleteHyperParams({task: selectedExperiment.id, hyperparams: [{section: action.section}]}) + .pipe( + tap(() => this.router.navigateByUrl(this.router.url.replace('/hyper-param/' + section, ''))), + flatMap((res) => [ + new commonInfoActions.ExperimentUpdatedSuccessfully(selectedExperiment.id), + new SetBackdrop(false) + ]), + catchError(err => [ + new RequestFailed(err), + new SetServerError(err), + new commonInfoActions.ExperimentUpdatedSuccessfully(selectedExperiment.id), + new infoActions.CancelExperimentEdit(), + new SetBackdrop(false) + ]) + ) + ), + ); + + } diff --git a/src/app/webapp-common/experiments/effects/common-experiments-menu.effects.ts b/src/app/webapp-common/experiments/effects/common-experiments-menu.effects.ts index f877cbad..4bc15acb 100644 --- a/src/app/webapp-common/experiments/effects/common-experiments-menu.effects.ts +++ b/src/app/webapp-common/experiments/effects/common-experiments-menu.effects.ts @@ -7,7 +7,7 @@ import {BlTasksService} from '../../../business-logic/services/tasks.service'; import {ApiEventsService} from '../../../business-logic/api-services/events.service'; import {Router} from '@angular/router'; import {catchError, flatMap, map, switchMap, tap, withLatestFrom} from 'rxjs/operators'; -import {ActiveLoader, DeactiveLoader, SetServerError} from '../../core/actions/layout.actions'; +import {ActiveLoader, AddMessage, DeactiveLoader, SetServerError} from '../../core/actions/layout.actions'; import * as menuActions from '../actions/common-experiments-menu.actions'; import * as viewActions from '../../../webapp-common/experiments/actions/common-experiments-view.actions'; import {of} from 'rxjs'; @@ -22,11 +22,12 @@ import * as infoActions from '../actions/common-experiments-info.actions'; import {EmptyAction} from '../../../app.constants'; import * as commonViewActions from '../actions/common-experiments-view.actions'; import {SmSyncStateSelectorService} from '../../core/services/sync-state-selector.service'; -import {ResetExperiments, SetSelectedExperiments} from '../actions/common-experiments-view.actions'; +import {RefreshExperiments, ResetExperiments, SetSelectedExperiments} from '../actions/common-experiments-view.actions'; import {AutoRefreshExperimentInfo} from '../actions/common-experiments-info.actions'; -import {setArchive} from '../../core/actions/projects.actions'; import {addTag, removeTag} from '../actions/common-experiments-menu.actions'; import {ExperimentDetailsUpdated} from '../../../features/experiments/actions/experiments-info.actions'; +import {ISelectedExperiment} from '../../../features/experiments/shared/experiment-info.model'; +import {ResetOutput} from '../actions/common-experiment-output.actions'; @Injectable() @@ -92,10 +93,10 @@ export class CommonExperimentsMenuEffects { cloneExperimentRequested$ = this.actions$.pipe( ofType(menuActions.CLONE_EXPERIMENT_CLICKED), switchMap(action => this.apiTasks.tasksClone({ - task : action.payload.originExperiment.id, + task: action.payload.originExperiment.id, new_task_project: action.payload.cloneData.project, new_task_comment: action.payload.cloneData.comment, - new_task_name : action.payload.cloneData.name + new_task_name: action.payload.cloneData.name }) .pipe( flatMap(res => [ @@ -118,7 +119,8 @@ export class CommonExperimentsMenuEffects { switchMap( action => this.apiTasks.tasksReset({task: action.payload.id}) .pipe( - flatMap((res) => this.updateExperimentSuccess(action.payload.id, action.type, res.fields)), + flatMap((res) => [new ResetOutput()] + .concat(this.updateExperimentSuccess(action.payload.id, action.type, res.fields))), catchError(error => this.updateExperimentFailed(action.type, error)) ) ) @@ -149,58 +151,7 @@ export class CommonExperimentsMenuEffects { ); @Effect() - archiveExperiment$ = this.actions$.pipe( - ofType(menuActions.ARCHIVE_CLICKED), - tap((action) => { - if (action.payload.selectedExperiment && action.payload.selectedExperiment.id === action.payload.experiment.id) { - this.router.navigate([`projects/${action.payload.projectId}/experiments/`]); - } - }), - map(action => [action, this.taskBl.addHiddenTag(action.payload.experiment.system_tags)]), - withLatestFrom(this.store.pipe(select(selectSelectedExperiments))), - switchMap(([[action, system_tags], selectedExperiments]: [[menuActions.ArchiveClicked, Array], Array]) => - this.apiTasks.tasksUpdate({task: action.payload.experiment.id, system_tags: system_tags}) - .pipe( - flatMap(res => [...this.updateExperimentSuccess(action.payload.experiment.id, action.type, res.fields), - new commonViewActions.SetSelectedExperiments(selectedExperiments.filter(experiment => experiment.id !== action.payload.experiment.id))]), - catchError(error => this.updateExperimentFailed(action.type, error)), - ) - ) - ); - - @Effect() - restoreExperiment$ = this.actions$.pipe( - ofType(menuActions.RESTORE_CLICKED), - // (nir) not working anyway - // tap((action) => { - // let path = `projects/${action.payload.projectId}/experiments/`; - // if (action.payload.selectedExperiment && action.payload.selectedExperiment.id !== action.payload.experiment.id) { - // path += action.payload.experiment.id; - // } - // this.store.dispatch(setArchive({archive: true})); - // this.router.navigate([path]); - // }), - map(action => [action, this.taskBl.removeHiddenTag(action.payload.experiment.system_tags)]), - withLatestFrom(this.store.pipe(select(selectSelectedExperiments))), - switchMap(([[action, system_tags], selectedExperiments]: [[menuActions.RestoreClicked, Array], Array]) => - this.apiTasks.tasksUpdate({task: action.payload.experiment.id, system_tags: system_tags}) - .pipe( - flatMap(() => [ - this.setExperimentIfSelected(action.payload.experiment.id, {changes: {system_tags: system_tags}}), - new commonViewActions.SetSelectedExperiments(selectedExperiments.filter(experiment => experiment.id !== action.payload.experiment.id)), - new DeactiveLoader(action.type), - new commonViewActions.GetExperiments() - ]), - catchError(error => [ - new RequestFailed(error), - new DeactiveLoader(action.type), - new SetServerError(error, null, 'Update Experiment failed') - ]) - ) - ) - ); - @Effect() - changeProject$ = this.actions$.pipe( + changeProject$ = this.actions$.pipe( ofType(menuActions.CHANGE_PROJECT_REQUESTED), switchMap( action => this.apiTasks.tasksUpdate({task: action.payload.experiment.id, project: action.payload.project.id}) @@ -245,19 +196,24 @@ export class CommonExperimentsMenuEffects { @Effect() addTag$ = this.actions$.pipe( ofType(addTag), - switchMap((action) => - action.experiments.map( experiment => - new ExperimentDetailsUpdated({ + withLatestFrom(this.store.select(selectSelectedExperiments), this.store.select(selectSelectedExperiment)), + switchMap(([action, selectedExperiments, selectedExperimentInfo]) => { + const experimentsFromState = selectedExperimentInfo ? selectedExperiments.concat(selectedExperimentInfo) as ISelectedExperiment[] : selectedExperiments; + return action.experiments.map(experiment => { + const experimentFromState = experimentsFromState.find(exp => exp.id === experiment.id); + return new ExperimentDetailsUpdated({ id: experiment.id, - changes: {tags: (experiment.tags || []).concat([action.tag]) }})) - ) + changes: {tags: Array.from(new Set((experimentFromState?.tags || experiment.tags || []).concat([action.tag]))).sort()} + }); + }); + }) ); @Effect() removeTag$ = this.actions$.pipe( ofType(removeTag), switchMap((action) => - action.experiments.map( experiment => { + action.experiments.map(experiment => { if (experiment.tags.includes(action.tag)) { return new ExperimentDetailsUpdated({ id: experiment.id, @@ -267,6 +223,20 @@ export class CommonExperimentsMenuEffects { return false; } }).filter(update => update !== false) + .concat(new AddMessage('success', `“${action.tag}” tag has been removed from “${action.experiments[0]?.name}” experiment`, [ + { + name: 'Undo', + actions: [ + new AddMessage('success', `“${action.tag}” tag has been restored`), + ...action.experiments.map(experiment => addTag({ + experiments: action.experiments, + tag: action.tag + }) + ) + ] + } + ] + ) as any) ) ); } diff --git a/src/app/webapp-common/experiments/effects/common-experiments-view.effects.ts b/src/app/webapp-common/experiments/effects/common-experiments-view.effects.ts index 22bf76e2..1077b25e 100644 --- a/src/app/webapp-common/experiments/effects/common-experiments-view.effects.ts +++ b/src/app/webapp-common/experiments/effects/common-experiments-view.effects.ts @@ -1,10 +1,9 @@ import {Injectable} from '@angular/core'; import {ActivatedRoute, Router} from '@angular/router'; import {Actions, Effect, ofType} from '@ngrx/effects'; -import {Action} from '@ngrx/store'; -import {Store} from '@ngrx/store'; -import {cloneDeep, get, getOr, isEqual} from 'lodash/fp'; -import {EMPTY, forkJoin, Observable, of} from 'rxjs'; +import {Action, Store} from '@ngrx/store'; +import {cloneDeep, get, getOr, isEqual, uniq} from 'lodash/fp'; +import {forkJoin, Observable, of} from 'rxjs'; import {auditTime, catchError, filter, flatMap, map, switchMap, tap, withLatestFrom} from 'rxjs/operators'; import {ApiProjectsService} from '../../../business-logic/api-services/projects.service'; import {ApiTasksService} from '../../../business-logic/api-services/tasks.service'; @@ -17,28 +16,29 @@ import {selectSelectedExperiment} from '../../../features/experiments/reducers'; import {IExperimentsViewState} from '../../../features/experiments/reducers/experiments-view.reducer'; import {EXPERIMENTS_TABLE_COL_FIELDS} from '../../../features/experiments/shared/experiments.const'; import {RequestFailed} from '../../core/actions/http.actions'; -import {ActiveLoader, DeactiveLoader, SetServerError} from '../../core/actions/layout.actions'; +import {ActiveLoader, AddMessage, DeactiveLoader, SetServerError} from '../../core/actions/layout.actions'; import {setArchive as setProjectArchive} from '../../core/actions/projects.actions'; import {setURLParams} from '../../core/actions/router.actions'; import {selectIsArchivedMode} from '../../core/reducers/projects.reducer'; -import {selectRouterParams} from '../../core/reducers/router-reducer'; +import {selectRouterConfig, selectRouterParams} from '../../core/reducers/router-reducer'; import {selectAppVisible} from '../../core/reducers/view-reducer'; import {FilterMetadata} from 'primeng/api/filtermetadata'; import {ISmCol} from '../../shared/ui-components/data/table/table.consts'; import {escapeRegex, getRouteFullUrl} from '../../shared/utils/shared-utils'; import {encodeColumns} from '../../shared/utils/tableParamEncode'; -import {AutoRefreshExperimentInfo} from '../actions/common-experiments-info.actions'; +import {AutoRefreshExperimentInfo, GetExperimentInfo} from '../actions/common-experiments-info.actions'; import * as exActions from '../actions/common-experiments-view.actions'; import {SetCustomHyperParams, SetCustomMetrics} from '../actions/common-experiments-view.actions'; import * as exSelectors from '../reducers/index'; import {ITableExperiment} from '../shared/common-experiment-model.model'; -import {EXPERIMENTS_PAGE_SIZE, EXPERIMENTS_TYPES_LABELS} from '../shared/common-experiments.const'; +import {EXPERIMENTS_PAGE_SIZE} from '../shared/common-experiments.const'; import {convertStopToComplete} from '../shared/common-experiments.utils'; import {ApiUsersService} from '../../../business-logic/api-services/users.service'; import {sortByField} from '../../tasks/tasks.utils'; import {MODEL_TAGS, MODELS_TABLE_COL_FIELDS} from '../../models/shared/models.const'; import {EmptyAction} from '../../../app.constants'; -import {selectExperimentsList} from '../reducers/index'; +import {selectExperimentsList, selectExperimentsUsers, selectTableFilters} from '../reducers/index'; +import {TasksUpdateResponse} from '../../../business-logic/model/tasks/tasksUpdateResponse'; @Injectable() export class CommonExperimentsViewEffects { @@ -100,15 +100,20 @@ export class CommonExperimentsViewEffects { flatMap(res => { res.tasks = convertStopToComplete(res.tasks); const actions: Action[] = [new DeactiveLoader('EXPERIMENTS_LIST')]; - - if (selectedExperiment) { - actions.push(new AutoRefreshExperimentInfo(selectedExperiment.id)); - } - if ( selectedExperiment && action.payload.autoRefresh && isEqual(experiments.map(exp => exp.id).sort(), res.tasks.map(exp => exp.id).sort())) { + if (selectedExperiment && action.payload.autoRefresh && isEqual(experiments.map(exp => exp.id).sort(), res.tasks.map(exp => exp.id).sort())) { actions.push(exActions.setExperimentInPlace({experiments: res.tasks as ITableExperiment[]})); } else { + // SetExperiments must be before GetExperimentInfo! actions.push(new exActions.SetExperiments(res.tasks as ITableExperiment[])); } + if (selectedExperiment) { + if (action.payload.autoRefresh) { + actions.push(new AutoRefreshExperimentInfo(selectedExperiment.id)); + } else { + // SetExperiments must be before GetExperimentInfo! + actions.push(new GetExperimentInfo(selectedExperiment.id)); + } + } return actions; }), catchError(error => [ @@ -159,28 +164,46 @@ export class CommonExperimentsViewEffects { @Effect() archiveExperiments = this.actions$.pipe( ofType(exActions.ARCHIVE_SELECTED_EXPERIMENTS), - withLatestFrom(this.store.select(exSelectors.selectSelectedExperiments), this.store.select(exSelectors.selectSelectedTableExperiment)), - tap(([action, checkedExperiments, selectedExperiment]) => { + withLatestFrom( + this.store.select(exSelectors.selectSelectedExperiments), + this.store.select(exSelectors.selectSelectedTableExperiment), + this.store.select(selectRouterParams) + ), + tap(([action, checkedExperiments, selectedExperiment, routerParams]) => { if (this.isSelectedExpInCheckedExps(checkedExperiments, selectedExperiment)) { - this.router.navigate([`projects/${action.payload.projectId}/experiments/`]); + this.router.navigate([`projects/${routerParams.projectId}/experiments/`]); } }), - map(([action, experiments]) => experiments.map(experiment => ({ - task : experiment.id, - system_tags: this.taskBl.addHiddenTag(experiment.system_tags) - }))), - switchMap((experimentsUpdateReq: Array) => - forkJoin(experimentsUpdateReq.map(req => this.apiTasks.tasksUpdate(req))) + switchMap(([action, experiments]) => forkJoin(experiments.map(experiment => ({ + task: experiment.id, + system_tags: this.taskBl.addHiddenTag(experiment.system_tags) + }) as TasksUpdateRequest).map(req => this.apiTasks.tasksUpdate(req)) as TasksUpdateResponse[]) .pipe( - flatMap(() => [ - new DeactiveLoader(exActions.ARCHIVE_SELECTED_EXPERIMENTS), - new exActions.RemoveExperiments(experimentsUpdateReq.map(exp => exp.task)), - new exActions.SetSelectedExperiments([]), - new exActions.GetExperiments() - ]), + withLatestFrom(this.store.select(selectRouterConfig)), + flatMap(([res, routerConfig]) => { + let actions: Action[] = [ + new DeactiveLoader('EXPERIMENTS_LIST'), + new exActions.SetSelectedExperiments([]), + new AddMessage('success', `${experiments.length} experiment${experiments.length > 1 ? 's have' : ' has'} been archived`, action.payload.skipUndo ? [] : [ + { + name: 'Undo', actions: [ + new exActions.SetSelectedExperiments(experiments), + new exActions.RestoreSelectedExperiments({skipUndo: true}) + ] + } + ]) + ]; + if (routerConfig.includes('experiments')) { + actions = actions.concat([ + new exActions.RemoveExperiments(experiments.map(exp => exp.task)), + new exActions.GetExperiments() + ]); + } + return actions; + }), catchError(error => [ new RequestFailed(error), - new DeactiveLoader(exActions.ARCHIVE_SELECTED_EXPERIMENTS), + new DeactiveLoader('EXPERIMENTS_LIST'), new SetServerError(error, null, 'Failed To Archive Experiments') ]) ) @@ -190,30 +213,45 @@ export class CommonExperimentsViewEffects { @Effect() restoreExperiments = this.actions$.pipe( ofType(exActions.RESTORE_SELECTED_EXPERIMENTS), - withLatestFrom(this.store.select(exSelectors.selectSelectedExperiments), this.store.select(exSelectors.selectSelectedTableExperiment)), - tap(([action, checkedExperiments, selectedExperiment]) => { - let path = `projects/${action.payload.projectId}/experiments/`; - path += this.isSelectedExpInCheckedExps(checkedExperiments, selectedExperiment) ? '' : selectedExperiment ? selectedExperiment.id : ''; - this.store.dispatch(exActions.setArchive({archive: true})); - this.router.navigate([path]); + withLatestFrom( + this.store.select(exSelectors.selectSelectedExperiments), + this.store.select(exSelectors.selectSelectedTableExperiment), + this.store.select(selectRouterParams)), + tap(([action, checkedExperiments, selectedExperiment, routerParams]) => { + if (this.isSelectedExpInCheckedExps(checkedExperiments, selectedExperiment)) { + this.router.navigate([`projects/${routerParams.projectId}/experiments/`]); + } }), - map(([action, experiments]) => experiments.map(experiment => ({ - task : experiment.id, - system_tags: this.taskBl.removeHiddenTag(experiment.system_tags) - }))), - switchMap((experimentsUpdateReq: Array) => - forkJoin(experimentsUpdateReq.map(req => this.apiTasks.tasksUpdate(req))) + switchMap(([action, experiments]) => forkJoin(experiments.map(experiment => ({ + task: experiment.id, + system_tags: this.taskBl.removeHiddenTag(experiment.system_tags) + })).map(req => this.apiTasks.tasksUpdate(req)) as TasksUpdateResponse[]) .pipe( - withLatestFrom(this.store.select(selectRouterParams).pipe(map(params => get('projectId', params)))), - flatMap(() => [ - new DeactiveLoader(exActions.ARCHIVE_SELECTED_EXPERIMENTS), - new exActions.RemoveExperiments(experimentsUpdateReq.map(exp => exp.task)), - new exActions.SetSelectedExperiments([]), - new exActions.GetExperiments() - ]), + withLatestFrom(this.store.select(selectRouterConfig)), + flatMap(([res, routerConfig]) => { + let actions: Action[] = [ + new DeactiveLoader('EXPERIMENTS_LIST'), + new exActions.SetSelectedExperiments([]), + new AddMessage('success', `${experiments.length} experiment${experiments.length > 1 ? 's have' : ' has'} been restored`, action.payload.skipUndo ? [] : [ + { + name: 'Undo', actions: [ + new exActions.SetSelectedExperiments(experiments), + new exActions.ArchivedSelectedExperiments({skipUndo: true}) + ] + } + ]), + ]; + if (routerConfig.includes('experiments')) { + actions = actions.concat([ + new exActions.RemoveExperiments(experiments.map(exp => exp.task)), + new exActions.GetExperiments(), + ]); + } + return actions; + }), catchError(error => [ new RequestFailed(error), - new DeactiveLoader(exActions.ARCHIVE_SELECTED_EXPERIMENTS), + new DeactiveLoader('EXPERIMENTS_LIST'), new SetServerError(error, null, 'Failed To Restore Experiments') ]) ) @@ -230,13 +268,13 @@ export class CommonExperimentsViewEffects { let filteredTableFilters: any = {}; if (tableFilters?.type?.value) { filteredTableFilters = { - col : 'type', + col: 'type', value: tableFilters.type.value.filter(filterType => res.types.includes(filterType)) }; shouldFilterFilters = filteredTableFilters.value.length !== tableFilters.type.value.length; } return [ - shouldFilterFilters ? new exActions.TableFilterChanged(filteredTableFilters): new EmptyAction(), + shouldFilterFilters ? new exActions.TableFilterChanged(filteredTableFilters) : new EmptyAction(), exActions.setProjectsTypes(res), new DeactiveLoader(action.type) ]; @@ -249,23 +287,70 @@ export class CommonExperimentsViewEffects { ) ))); + @Effect() + getFilteredUsersEffect = this.actions$.pipe( + ofType(exActions.getFilteredUsers), + withLatestFrom(this.store.select(selectExperimentsUsers), this.store.select(selectTableFilters)), + switchMap(([action, users, filters]) => this.usersApi.usersGetAllEx({ + order_by: ['name'], + only_fields: ['name'], + id: getOr([], ['user.name', 'value'], filters) + }).pipe( + flatMap(res => [ + exActions.setUsers({users: uniq(res.users.concat(users))}), + new DeactiveLoader(action.type) + ] + ), + catchError(error => [ + new RequestFailed(error), + new DeactiveLoader(action.type), + new SetServerError(error, null, 'Fetch users failed')] + ) + )) + ); + @Effect() getUsersEffect = this.actions$.pipe( ofType(exActions.getUsers), - withLatestFrom(this.store.select(selectRouterParams).pipe(map(params => get('projectId', params)))), - switchMap(([action, projectId]) => this.usersApi.usersGetAllEx({ - order_by : ['name'], - only_fields : ['name'], + withLatestFrom( + this.store.select(selectRouterParams).pipe(map(params => get('projectId', params))), + this.store.select(selectTableFilters)), + switchMap(([action, projectId, filters]) => this.usersApi.usersGetAllEx({ + order_by: ['name'], + only_fields: ['name'], active_in_projects: projectId !== '*' ? [projectId] : [] + }).pipe( + flatMap(res => { + const userFiltersValue = get([EXPERIMENTS_TABLE_COL_FIELDS.USER, 'value'], filters) || []; + const resIds = res.users.map(user => user.id); + const shouldGetFilteredUsersNames = !(userFiltersValue.every(id => resIds.includes(id))); + return [ + exActions.setUsers(res), + shouldGetFilteredUsersNames ? exActions.getFilteredUsers() : new EmptyAction(), + ]; + }), + catchError(error => [ + new RequestFailed(error), + new SetServerError(error, null, 'Fetch users failed')] + ) + )) + ); + + @Effect() + getTagsEffect = this.actions$.pipe( + ofType(exActions.getTags), + withLatestFrom(this.store.select(selectRouterParams).pipe(map(params => get('projectId', params)))), + switchMap(([action, projectId]) => this.projectsApi.projectsGetTaskTags({ + projects: projectId === '*' ? [] : [projectId] }).pipe( flatMap(res => [ - exActions.setUsers(res), + exActions.setTags({tags: res.tags.concat(null)}), new DeactiveLoader(action.type) ]), catchError(error => [ new RequestFailed(error), new DeactiveLoader(action.type), - new SetServerError(error, null, 'Fetch users failed')] + new SetServerError(error, null, 'Fetch tags failed')] ) )) ); @@ -293,7 +378,7 @@ export class CommonExperimentsViewEffects { GetCustomHyperParams = this.actions$.pipe( ofType(exActions.GET_CUSTOM_HYPER_PARAMS), withLatestFrom(this.store.select(selectRouterParams).pipe(map(params => get('projectId', params)))), - switchMap(([action, projectId]) => this.projectsApi.projectsGetHyperParameters({project: projectId === '*' ? null : projectId}) + switchMap(([action, projectId]) => this.projectsApi.projectsGetHyperParameters({project: projectId === '*' ? null : projectId, page_size: 1000}) .pipe( flatMap(res => [ new SetCustomHyperParams(res.parameters), @@ -341,7 +426,13 @@ export class CommonExperimentsViewEffects { cols, hiddenCols, metricsCols, colsOrder ]) => { const columns = encodeColumns(cols, hiddenCols, this.filterColumns(projectId, metricsCols), colsOrder); - return setURLParams({columns, filters, orderField: sortField, orderDirection: sortOrder > 0 ? 'asc' : 'desc', isArchived}); + return setURLParams({ + columns, + filters, + orderField: sortField, + orderDirection: sortOrder > 0 ? 'asc' : 'desc', + isArchived + }); }) ); @@ -374,22 +465,22 @@ export class CommonExperimentsViewEffects { const pageToGet = getAllPages ? 0 : page; const pageSizeToGet = getAllPages ? (page + 1) * EXPERIMENTS_PAGE_SIZE : EXPERIMENTS_PAGE_SIZE; return { - id : ids, - _any_ : searchQuery ? { + id: ids, + _any_: searchQuery ? { pattern: escapeRegex(searchQuery), - fields : GET_ALL_QUERY_ANY_FIELDS + fields: GET_ALL_QUERY_ANY_FIELDS } : undefined, - project : (!projectId || projectId === '*') ? undefined : [projectId], - page : pageToGet, - page_size : pageSizeToGet, - order_by : [(orderSort === 1 ? '-' : '') + orderField], - status : (statusFilter && statusFilter.length > 0) ? statusFilter : undefined, - type : (typeFilter && typeFilter.length > 0) ? typeFilter : [], - user : (userFilter && userFilter.length > 0) ? userFilter : [], + project: (!projectId || projectId === '*') ? undefined : [projectId], + page: pageToGet, + page_size: pageSizeToGet, + order_by: [(orderSort === 1 ? '-' : '') + orderField], + status: (statusFilter && statusFilter.length > 0) ? statusFilter : undefined, + type: (typeFilter && typeFilter.length > 0) ? typeFilter : ['__$not', 'annotation_manual', '__$not', 'annotation', '__$not', 'dataset_import'], + user: (userFilter && userFilter.length > 0) ? userFilter : [], system_tags: (systemTagsFilter && systemTagsFilter.length > 0) ? systemTagsFilter : [], - tags : (tagsFilter && tagsFilter.length > 0) ? tagsFilter : [], + tags: (tagsFilter && tagsFilter.length > 0) ? tagsFilter : [], only_fields: ['system_tags', 'company'].concat( - cols.filter(col => col.id !== 'selected').map(col => col.id) + cols.filter(col => col.id !== 'selected').map(col => col.getter || col.id) ).concat(metricCols ? metricCols.map(col => col.id) : []) }; } @@ -421,7 +512,13 @@ export class CommonExperimentsViewEffects { } const selectedExperimentsIds = showAllSelectedIsActive ? selectedExperiments.map(exp => exp.id) : []; const columns = encodeColumns(cols, hiddenCols, this.filterColumns(projectId, metricsCols), colsOrder); - this.store.dispatch(setURLParams({columns, filters, orderField: sortField, orderDirection: sortOrder > 0 ? 'asc' : 'desc', isArchived})); + this.store.dispatch(setURLParams({ + columns, + filters, + orderField: sortField, + orderDirection: sortOrder > 0 ? 'asc' : 'desc', + isArchived + })); return this.apiTasks.tasksGetAllEx(this.getGetAllQuery(getAllPages, pageNumber, projectId, gb, isArchived, sortField, sortOrder, myFilters, selectedExperimentsIds, cols, metricsCols)); diff --git a/src/app/webapp-common/experiments/reducers/common-experiment-info.reducer.ts b/src/app/webapp-common/experiments/reducers/common-experiment-info.reducer.ts index 91eb1321..048dde1c 100644 --- a/src/app/webapp-common/experiments/reducers/common-experiment-info.reducer.ts +++ b/src/app/webapp-common/experiments/reducers/common-experiment-info.reducer.ts @@ -3,10 +3,11 @@ import {IExperimentInfo, ISelectedExperiment} from '../../../features/experiment export interface ICommonExperimentInfoState { - selectedExperiment: ISelectedExperiment; // TODO: declare type. + selectedExperiment: ISelectedExperiment; experimentLog: Array; infoData: IExperimentInfo; errors: { [key: string]: any } | null; + showExtraDataSpinner: boolean; } export const initialCommonExperimentInfoState: ICommonExperimentInfoState = { @@ -17,6 +18,7 @@ export const initialCommonExperimentInfoState: ICommonExperimentInfoState = { model : null, execution: null, }, + showExtraDataSpinner: false }; export function commonExperimentInfoReducer(state: ICommonExperimentInfoState = initialCommonExperimentInfoState, action): ICommonExperimentInfoState { @@ -25,9 +27,17 @@ export function commonExperimentInfoReducer(state: ICommonExperimentInfoState = case actions.RESET_EXPERIMENT_INFO: return {...state, infoData: null}; case actions.SET_EXPERIMENT_INFO_DATA: - return {...state, infoData: action.payload}; + return {...state, infoData: { + ...action.payload, + configuration: state.infoData?.configuration, + execution: {...action.payload?.execution, diff: state.infoData?.execution?.diff} + }}; case actions.UPDATE_EXPERIMENT_INFO_DATA: - return {...state, selectedExperiment: {...state.selectedExperiment, ...action.payload.changes}}; + return {...state, selectedExperiment: {...state.selectedExperiment, ...action.payload.changes}, infoData:{...state.infoData, ...action.payload.changes}}; + case actions.getExperimentUncommittedChanges.type: + return {...state, showExtraDataSpinner: true}; + case actions.setExperimentUncommittedChanges.type: + return {...state, showExtraDataSpinner: false, infoData: {...state?.infoData, execution: {...state?.infoData?.execution, diff: action.diff}}}; default: return state; } diff --git a/src/app/webapp-common/experiments/reducers/common-experiment-output.reducer.ts b/src/app/webapp-common/experiments/reducers/common-experiment-output.reducer.ts index 4b5a0631..2cec67bd 100644 --- a/src/app/webapp-common/experiments/reducers/common-experiment-output.reducer.ts +++ b/src/app/webapp-common/experiments/reducers/common-experiment-output.reducer.ts @@ -1,19 +1,34 @@ import {Task} from '../../../business-logic/model/tasks/task'; import * as actions from '../actions/common-experiment-output.actions'; import {ScalarKeyEnum} from '../../../business-logic/model/events/scalarKeyEnum'; -import {last, getOr} from 'lodash/fp'; +import {sortBy, reverse} from 'lodash/fp'; +import {LOG_BATCH_SIZE} from '../shared/common-experiments.const'; + +export interface Log { + timestamp: number; + type: 'log'; + task: Task['id']; + level: 'debug' | 'info' | 'warning' | 'error' | 'critical'; + worker: string; + msg: string; + metric: string; + variant: string; +} export interface CommonExperimentOutputState { metricsMultiScalarsCharts: any; metricsHistogramCharts: any; + cachedAxisType: ScalarKeyEnum; metricsPlotsCharts: any; - experimentLog: Array; - logScrollID: string; + experimentLog: Log[]; + totalLogLines: number; + beginningOfLog: boolean; settingsList: Array; searchTerm: string; logFilter: string; showSettings: boolean; } + export interface IExperimentSettings { id: Task['id']; hiddenMetricsScalar: Array; @@ -28,62 +43,86 @@ export interface IExperimentSettings { export const initialCommonExperimentOutputState: CommonExperimentOutputState = { metricsMultiScalarsCharts: null, - metricsHistogramCharts : null, - metricsPlotsCharts : null, - experimentLog : null, - logScrollID : null, - settingsList : [], - searchTerm : '', - logFilter : null, + metricsHistogramCharts: null, + cachedAxisType: null, + metricsPlotsCharts: null, + experimentLog: [], + totalLogLines: null, + beginningOfLog: false, + settingsList: [], + searchTerm: '', + logFilter: null, showSettings: false }; export function commonExperimentOutputReducer(state = initialCommonExperimentOutputState, action): CommonExperimentOutputState { switch (action.type) { case actions.RESET_OUTPUT: - return {...state, + return { + ...state, experimentLog: initialCommonExperimentOutputState.experimentLog, - logScrollID: initialCommonExperimentOutputState.logScrollID, metricsMultiScalarsCharts: initialCommonExperimentOutputState.metricsMultiScalarsCharts, metricsHistogramCharts: initialCommonExperimentOutputState.metricsHistogramCharts, metricsPlotsCharts: initialCommonExperimentOutputState.metricsPlotsCharts }; - case actions.SET_EXPERIMENT_LOG: - const events = (action).events; + case actions.setExperimentLog.type: { + const events = reverse(action.events); let currLog: any[]; - let lastTimestamp: number; - if (state.experimentLog && state.experimentLog.length > 0 && - last(state.experimentLog).timestamp >= getOr(9999999999999, '[0].timestamp', events)) { - currLog = state.experimentLog; - lastTimestamp = last(currLog).timestamp + let atStart = false; + if (action.direction) { + if (action.refresh) { + currLog = events; + } else if(action.direction === 'prev') { + if (action.events < LOG_BATCH_SIZE) { + atStart = true; + } + currLog = sortBy('timestamp', events.concat(state.experimentLog)); + if (currLog.length > 300) { + currLog = currLog.slice(0, 300); + } + } else { + currLog = sortBy('timestamp', state.experimentLog.concat(events)); + if (currLog.length > 300) { + currLog = currLog.slice(currLog.length - 300, currLog.length); + } + } } else { - currLog = []; - lastTimestamp = 0; + currLog = events; } - return {...state, - experimentLog: currLog.concat(events.filter(event => event.timestamp > lastTimestamp)), - logScrollID: (action).scrollID + return { + ...state, + experimentLog: currLog, + totalLogLines: action.total, + beginningOfLog: atStart }; + } case actions.SET_EXPERIMENT_METRICS_SEARCH_TERM: return {...state, searchTerm: action.payload.searchTerm}; case actions.SET_EXPERIMENT_HISTOGRAM: - return {...state, metricsHistogramCharts: action.payload}; + return {...state, metricsHistogramCharts: action.payload, cachedAxisType: action.axisType}; case actions.SET_EXPERIMENT_PLOTS: return {...state, metricsPlotsCharts: action.payload}; - case actions.UPDATE_EXPERIMENT_SETTINGS: + case actions.UPDATE_EXPERIMENT_SETTINGS: { let newSettings; - const isExperimentExists = state.settingsList.find((setting) => setting.id === action.payload.id); - if (isExperimentExists) { + const experimentExists = state.settingsList.find((setting) => setting.id === action.payload.id); + if (experimentExists) { newSettings = state.settingsList.map(setting => setting.id === action.payload.id ? {...setting, ...action.payload.changes} : setting); } else { newSettings = state.settingsList.slice(); newSettings.push({id: action.payload.id, ...action.payload.changes}); } return {...state, settingsList: newSettings}; + } case actions.RESET_EXPERIMENT_METRICS: - return {...state, metricsMultiScalarsCharts: null, metricsHistogramCharts: null, metricsPlotsCharts: null}; + return { + ...state, + metricsMultiScalarsCharts: initialCommonExperimentOutputState.metricsHistogramCharts, + metricsHistogramCharts: initialCommonExperimentOutputState.metricsHistogramCharts, + metricsPlotsCharts: initialCommonExperimentOutputState.metricsHistogramCharts, + cachedAxisType: initialCommonExperimentOutputState.cachedAxisType + }; case actions.SET_LOG_FILTER: - return {...state, logFilter: (action).filterString}; + return {...state, logFilter: (action as actions.SetLogFilter).filterString}; case actions.RESET_LOG_FILTER: return {...state, logFilter: null}; case actions.toggleSettings.type: diff --git a/src/app/webapp-common/experiments/reducers/common-experiments-view.reducer.ts b/src/app/webapp-common/experiments/reducers/common-experiments-view.reducer.ts index c9ed9a94..4c33e451 100644 --- a/src/app/webapp-common/experiments/reducers/common-experiments-view.reducer.ts +++ b/src/app/webapp-common/experiments/reducers/common-experiments-view.reducer.ts @@ -1,16 +1,13 @@ -import {ISmAction} from '../../core/models/actions'; -import {ExperimentTableColFieldsEnum, ITableExperiment} from '../shared/common-experiment-model.model'; +import {ITableExperiment} from '../shared/common-experiment-model.model'; import {INITIAL_EXPERIMENT_TABLE_COLS} from '../../../features/experiments/experiments.consts'; -import {FilterMetadata} from 'primeng/api/filtermetadata'; import {TABLE_SORT_ORDER, TableSortOrderEnum} from '../../shared/ui-components/data/table/table.consts'; import {EXPERIMENTS_TABLE_COL_FIELDS} from '../../../features/experiments/shared/experiments.const'; import * as actions from '../actions/common-experiments-view.actions'; +import {setExperimentInPlace} from '../actions/common-experiments-view.actions'; import {EXPERIMENTS_VIEW_MODES, ExperimentsViewModesEnum} from '../shared/common-experiments.const'; import {MetricVariantResult} from '../../../business-logic/model/projects/metricVariantResult'; import {TableFilter} from '../../shared/utils/tableParamEncode'; import {User} from '../../../business-logic/model/users/user'; -import {experiments} from '../../../features/experiments/reducers'; -import { setExperimentInPlace } from '../actions/common-experiments-view.actions'; export interface ICommonExperimentsViewState { @@ -35,8 +32,9 @@ export interface ICommonExperimentsViewState { hyperParams: Array; metricsLoading: boolean; users: User[]; - types: Array; + types: string[]; splitSize: number; + projectTags: string[]; } export const commonExperimentsInitialState: ICommonExperimentsViewState = { @@ -61,14 +59,15 @@ export const commonExperimentsInitialState: ICommonExperimentsViewState = { hyperParams : [], metricsLoading : false, users : [], - types : ['training', 'testing', 'inference', 'data_processing', 'application', 'monitor', 'controller', 'optimizer', 'service', 'qc'], + projectTags : [], + types : [], splitSize: 75 }; export function commonExperimentsViewReducer(state: ICommonExperimentsViewState = commonExperimentsInitialState, action: any): ICommonExperimentsViewState { switch (action.type) { case actions.RESET_EXPERIMENTS: - return {...state, experiments: [], selectedExperiment: null}; + return {...state, experiments: [], selectedExperiment: null, showAllSelectedIsActive: false}; case actions.SET_SHOW_ALL_SELECTED_IS_ACTIVE: return {...state, showAllSelectedIsActive: action.payload, globalFilter: commonExperimentsInitialState.globalFilter, tableFilters: commonExperimentsInitialState.tableFilters}; case actions.ADD_MANY_EXPERIMENTS: @@ -81,9 +80,12 @@ export function commonExperimentsViewReducer(state: ICommonExperimentsViewState ...state, experiments: state.experiments.map(ex => ex.id === payload.id ? {...ex, ...payload.changes} : ex) }; - if (state.selectedExperiment && state.selectedExperiment.id === payload.id) { + if (state.selectedExperiment?.id === payload.id) { newState.selectedExperiment = {...state.selectedExperiment, ...payload.changes}; } + if (state.selectedExperiments.find(ex => ex.id === payload.id)) { + newState.selectedExperiments = state.selectedExperiments.map(ex => ex.id === payload.id ? {...ex, ...payload.changes} : ex); + } return newState; } case actions.SET_EXPERIMENTS: @@ -155,13 +157,15 @@ export function commonExperimentsViewReducer(state: ICommonExperimentsViewState case actions.setUsers.type: return {...state, users: action.users}; + case actions.setTags.type: + return {...state, projectTags: action.tags}; case actions.setProjectsTypes.type: return {...state, types: action.types}; case actions.CLEAR_HYPER_PARAMS_COLS: return { ...state, - metricsCols : [...state.metricsCols.filter(tableCol => !(tableCol.id.startsWith('execution.parameters') && tableCol.projectId === action.payload.projectId))], - tableSortField: state.tableSortField.startsWith('execution.parameters') ? null : state.tableSortField + metricsCols : [...state.metricsCols.filter(tableCol => !(tableCol.id.startsWith('hyperparams') && tableCol.projectId === action.payload.projectId))], + tableSortField: state.tableSortField.startsWith('hyperparams') ? null : state.tableSortField }; case actions.SET_CUSTOM_METRICS: return {...state, metricVariants: action.payload.metrics, metricsLoading: false}; @@ -173,7 +177,7 @@ export function commonExperimentsViewReducer(state: ICommonExperimentsViewState return {...state, metricsLoading: true}; case actions.GET_CUSTOM_HYPER_PARAMS: return {...state, metricsLoading: true}; - case actions.setSplitSize.type: + case actions.setSplitSize.type: return {...state, splitSize: action.splitSize}; default: return state; diff --git a/src/app/webapp-common/experiments/reducers/index.ts b/src/app/webapp-common/experiments/reducers/index.ts index 17df3a12..6a286765 100644 --- a/src/app/webapp-common/experiments/reducers/index.ts +++ b/src/app/webapp-common/experiments/reducers/index.ts @@ -1,12 +1,11 @@ import {createSelector} from '@ngrx/store'; -import {ExperimentTableColFieldsEnum, ITableExperiment} from '../shared/common-experiment-model.model'; +import {ITableExperiment} from '../shared/common-experiment-model.model'; import {TableSortOrderEnum} from '../../shared/ui-components/data/table/table.consts'; -import {FilterMetadata} from 'primeng/api/filtermetadata'; import {experimentInfo, experimentOutput, experimentsView, selectExperimentInfoData, selectSelectedExperiment} from '../../../features/experiments/reducers'; import {IExperimentInfo, ISelectedExperiment} from '../../../features/experiments/shared/experiment-info.model'; import {experimentSectionsEnum} from '../../../features/experiments/shared/experiments.const'; import {IExperimentSettings} from './common-experiment-output.reducer'; -import {get} from 'lodash/fp'; +import {get, getOr} from 'lodash/fp'; import {TaskStatusEnum} from '../../../business-logic/model/tasks/taskStatusEnum'; import {IExecutionForm} from '../../../features/experiments/shared/experiment-execution.model'; import {ExperimentsViewModesEnum} from '../shared/common-experiments.const'; @@ -15,12 +14,16 @@ import {IHyperParamsForm} from '../shared/experiment-hyper-params.model'; import {ScalarKeyEnum} from '../../../business-logic/model/events/scalarKeyEnum'; import {IExperimentModelInfo} from '../shared/common-experiment-model.model'; import {selectSelectedProjectId} from '../../core/reducers/projects.reducer'; +import {ParamsItem} from '../../../business-logic/model/tasks/paramsItem'; +import {selectRouterParams} from '../../core/reducers/router-reducer'; +import {map} from 'rxjs/operators'; export const selectExperimentsList = createSelector(experimentsView, (state): ITableExperiment[] => state.experiments); export const selectSelectedTableExperiment = createSelector(experimentsView, (state): ITableExperiment => state.selectedExperiment); export const selectExperimentsTableCols = createSelector(experimentsView, (state): Array => state.tableCols); export const selectExperimentsUsers = createSelector(experimentsView, (state): Array => state.users); +export const selectExperimentsTags = createSelector(experimentsView, (state): Array => state.projectTags); export const selectExperimentsTypes = createSelector(experimentsView, (state): Array => state.types); export const selectExperimentsTableColsOrder = createSelector([experimentsView, selectSelectedProjectId], (state, projectId): string[] => (state.colsOrder && projectId) ? state.colsOrder[projectId] : undefined); @@ -44,9 +47,10 @@ export const selectIsSelectedExperimentInDev = createSelector(experimentInfo, (s export const selectIsExperimentSaving = createSelector(experimentInfo, (state): boolean => state.saving); export const selectIsExperimentInEditMode = createSelector(experimentInfo, (state): boolean => !!state.activeSectionEdit); -export const selectExperimentLog = createSelector(experimentOutput, (state): Array => state.experimentLog); +export const selectExperimentLog = createSelector(experimentOutput, (state) => state.experimentLog); +export const selectExperimentBeginningOfLog = createSelector(experimentOutput, (state) => state.beginningOfLog); export const selectExperimentInfoPlots = createSelector(experimentOutput, (state) => state.metricsPlotsCharts); -export const selectExperimentInfoHistograms = createSelector(experimentOutput, (state) => state.metricsHistogramCharts); +export const selectExperimentHistogramCacheAxisType = createSelector(experimentOutput, (state) => state.cachedAxisType); export const selectExperimentMetricsSearchTerm = createSelector(experimentOutput, (state) => state.searchTerm); export const selectHyperParamsVariants = createSelector(experimentsView, (state): Array => state.hyperParams); @@ -54,7 +58,7 @@ export const selectExperimentUserKnowledge = createSelector(experimentInfo, (state): Map => state.userKnowledge); export const selectLogFilter = createSelector(experimentOutput, (state) => state.logFilter); -export const selectLogScrollID = createSelector(experimentOutput, (state) => state.logScrollID); +export const selectTotalLogLines = createSelector(experimentOutput, (state) => state.totalLogLines); export const selectShowSettings = createSelector(experimentOutput, (state) => state.showSettings); export const selectSelectedExperimentSettings = createSelector(experimentOutput, selectSelectedExperiment, @@ -78,5 +82,46 @@ export const selectExperimentExecutionInfoData = createSelector(selectExperiment (info: IExperimentInfo): IExecutionForm => get('execution', info)); export const selectExperimentHyperParamsInfoData = createSelector(selectExperimentInfoData, - (info: IExperimentInfo): IHyperParamsForm => get('hyperParams', info)); + (info: IExperimentInfo): IExperimentInfo['hyperparams'] => info?.hyperparams); +export const selectExperimentConfiguration = createSelector(selectExperimentInfoData, + (info: IExperimentInfo): IExperimentInfo['configuration'] => info?.configuration); + +export const selectExperimentHyperParamsSelectedSectionFromRoute = createSelector(selectRouterParams, + (params): string => get('hyperParamId', params)); + +export const selectExperimentSelectedConfigObjectFromRoute = createSelector(selectRouterParams, + (params): string => get('configObject', params)); + + +export const selectSelectedExperimentFromRouter = createSelector(selectRouterParams, + (params): string => get('experimentId', params)); + +export const selectExperimentConfigObj = + createSelector(selectExperimentConfiguration, selectExperimentSelectedConfigObjectFromRoute, + (configuration: IExperimentInfo['configuration'], configObj: string): any =>getOr(null,configObj, configuration ) ); + + + +export const selectExperimentHyperParamsSelectedSectionParams = + createSelector(selectExperimentHyperParamsInfoData, selectExperimentHyperParamsSelectedSectionFromRoute, + (hyperparams: IExperimentInfo['hyperparams'], section: string): ParamsItem[] => Object.entries(getOr({},section,hyperparams)).map(([key, value]) => value)); + + +export const selectExperimentInfoHistograms = createSelector( + selectSelectedSettingsxAxisType, + experimentOutput, + (axisType, state) => { + if (axisType === ScalarKeyEnum.IsoTime) { + return Object.keys(state.metricsHistogramCharts).reduce((groupAcc, groupName) => { + const group = state.metricsHistogramCharts[groupName]; + groupAcc[groupName] = Object.keys(group).reduce((graphAcc, graphName) => { + const graph = group[graphName]; + graphAcc[graphName] = {...graph, x: graph.x.map(ts => new Date(ts))}; + return graphAcc; + }, {}); + return groupAcc; + }, {}); + } + return state.metricsHistogramCharts; + }); diff --git a/src/app/webapp-common/experiments/shared/common-experiment-model.model.ts b/src/app/webapp-common/experiments/shared/common-experiment-model.model.ts index ea2c19ef..33087ae3 100644 --- a/src/app/webapp-common/experiments/shared/common-experiment-model.model.ts +++ b/src/app/webapp-common/experiments/shared/common-experiment-model.model.ts @@ -11,6 +11,7 @@ export interface IModelInfoInput { name: Model['name']; labels: Model['labels']; project?: Project; + design?: any; } export interface IModelFormOutput { @@ -44,7 +45,6 @@ export interface IExperimentModelInfo { output: IModelInfoOutput; source: IModelInfoSource; artifacts: Artifact[]; - prototext: string; } export type ExperimentTableColFieldsEnum = 'output.result' | 'comment' | 'id' | 'project.name' | 'name' | 'type' | 'status' | 'created' | 'completed' | 'user.name' | 'queue.name' | 'last_worker' | 'selected' |'last_iteration' | 'last_update' | 'tags'; diff --git a/src/app/webapp-common/experiments/shared/common-experiments.const.ts b/src/app/webapp-common/experiments/shared/common-experiments.const.ts index 0ddb21b7..60b40e13 100644 --- a/src/app/webapp-common/experiments/shared/common-experiments.const.ts +++ b/src/app/webapp-common/experiments/shared/common-experiments.const.ts @@ -32,7 +32,7 @@ export const EXPERIMENTS_METRICS_TYPES = { SCALAR: 'scalar', PLOTS : 'plots' }; -export const EXPERIMENTS_PAGE_SIZE = 10; +export const EXPERIMENTS_PAGE_SIZE = 15; export const EXPERIMENT_TABLE_ONLY_FIELDS = ['id', 'type', 'name', 'started', 'completed', 'status', 'system_tags', 'user.name', 'last_metrics', 'last_update']; export const FILTERED_EXPERIMENTS_STATUS_OPTIONS = Object.entries(EXPERIMENTS_STATUS_LABELS) @@ -52,7 +52,7 @@ export const TASK_TAGS = { HIDDEN: 'archived' as TaskTagsEnum }; -export const LOG_BATCH_SIZE = 150; +export const LOG_BATCH_SIZE = 40; export enum ThemeEnum { Dark = 'dark', diff --git a/src/app/webapp-common/experiments/shared/components/base-experiment-menu.ts b/src/app/webapp-common/experiments/shared/components/base-experiment-menu.ts index 953cae1d..b98dd107 100644 --- a/src/app/webapp-common/experiments/shared/components/base-experiment-menu.ts +++ b/src/app/webapp-common/experiments/shared/components/base-experiment-menu.ts @@ -40,9 +40,9 @@ import * as experimentsActions from '../../actions/common-experiments-view.actio template: '' }) export class BaseExperimentMenuComponent extends BaseContextMenuComponent { - readonly ICONS = ICONS; + readonly ICONS = ICONS; readonly TaskStatusEnum = TaskStatusEnum; - readonly TaskTypeEnum = TaskTypeEnum; + readonly TaskTypeEnum = TaskTypeEnum; public isExample: boolean; protected _experiment: ISelectedExperiment; @@ -63,54 +63,20 @@ export class BaseExperimentMenuComponent extends BaseContextMenuComponent { super(store, eRef); } - public restoreArchivePopup() { - const isArchived = this._experiment.system_tags && this._experiment.system_tags.includes('archived'); - let title: string, bodyName: string; - if (this.numSelected > 1) { - title = isArchived ? `Restore ${this.numSelected} experiments` : `Archive ${this.numSelected} experiments`; - bodyName = `${this.numSelected} Experiments`; - } else { - title = isArchived ? 'Restore experiment' : 'Archive experiment'; - bodyName = htmlTextShorte(this._experiment?.name || ''); - } - const confirmDialogRef: MatDialogRef = this.dialog.open(ConfirmDialogComponent, { - data: { - title, - body : `${bodyName} will be ${ - isArchived ? 'restored. It will be visible using "Exit Archive".' - : 'archived. It will be visible using "Open Archive"' - }.`, - yes : isArchived ? 'Restore from archive' : 'Archive', - no : 'keep', - iconClass: 'i-archive', - } - }); - - confirmDialogRef.afterClosed().subscribe((confirmed) => { - if (confirmed) { - this.restoreArchive(); - } - }); - } - public getProjectId() { const params = this.syncSelector.selectSync(selectRouterParams); return get('projectId', params); } - private restoreArchive() { + public restoreArchive() { + //info header case + if (this.showButton) { + this.store.dispatch(new experimentsActions.SetSelectedExperiments([this._experiment as any])); + } if (this._experiment.system_tags && this._experiment.system_tags.includes('archived')) { - if (this.numSelected > 1) { - this.store.dispatch(new experimentsActions.RestoreSelectedExperiments({projectId: this.getProjectId()})); - } else { - this.store.dispatch(new commonMenuActions.RestoreClicked({experiment: this._experiment, selectedExperiment: this.selectedExperiment, projectId: this.getProjectId()})); - } + this.store.dispatch(new experimentsActions.RestoreSelectedExperiments({})); } else { - if (this.numSelected > 1) { - this.store.dispatch(new experimentsActions.ArchivedSelectedExperiments({projectId: this.getProjectId()})); - } else { - this.store.dispatch(new commonMenuActions.ArchiveClicked({experiment: this._experiment, selectedExperiment: this.selectedExperiment, projectId: this.getProjectId()})); - } + this.store.dispatch(new experimentsActions.ArchivedSelectedExperiments({})); } } @@ -136,9 +102,9 @@ export class BaseExperimentMenuComponent extends BaseContextMenuComponent { enqueuePopup() { const selectQueueDialog: MatDialogRef = - this.dialog.open(SelectQueueComponent, { - data: {taskId: this._experiment.id, reference: this._experiment.name} - }); + this.dialog.open(SelectQueueComponent, { + data: {taskId: this._experiment.id, reference: this._experiment.name} + }); selectQueueDialog.afterClosed().subscribe((res) => { if (res && res.confirmed) { @@ -153,10 +119,10 @@ export class BaseExperimentMenuComponent extends BaseContextMenuComponent { this.store.dispatch(new GetQueuesForEnqueue()); const confirmDialogRef = this.dialog.open(ConfirmDialogComponent, { data: { - title : 'Dequeue Experiment', - body : getBody(null), - yes : 'Dequeue', - no : 'Cancel', + title: 'Dequeue Experiment', + body: getBody(null), + yes: 'Dequeue', + no: 'Cancel', iconClass: 'i-alert', } }); @@ -190,17 +156,17 @@ export class BaseExperimentMenuComponent extends BaseContextMenuComponent { public resetPopup() { const devWarning: boolean = isDevelopment(this._experiment); - const body = `${htmlTextShorte(this._experiment?.name || '')} + const body = `${htmlTextShorte(this._experiment?.name || '')} will be reset.
Resetting an experiment deletes all of its data, including statistics, debug samples, logs, and temporary models.` + (devWarning ? `

Note: this is a DEV experiment Any subsequent runs of the experiment will overwrite any changes made to it in the Web-App.
To avoid this, clone the experiment and work with the cloned experiment.` : ''); - const confirmDialogRef = this.dialog.open(ConfirmDialogComponent, { + const confirmDialogRef = this.dialog.open(ConfirmDialogComponent, { data: { - title : 'RESET', - body : body, - yes : 'Reset', - no : 'Cancel', + title: 'RESET', + body: body, + yes: 'Reset', + no: 'Cancel', iconClass: 'i-alert', } }); @@ -218,13 +184,13 @@ To avoid this, clone the experiment and work with the cloned experiment.` public stopPopup() { const confirmDialogRef = this.dialog.open(ConfirmDialogComponent, { data: { - title : 'ABORT', - body : `${htmlTextShorte(this._experiment?.name || '')} will be stopped and + title: 'ABORT', + body: `${htmlTextShorte(this._experiment?.name || '')} will be stopped and additional model updates will not be allowed.
`, - yes : 'Abort', - no : 'Cancel', - iconClass: 'i-archive', + yes: 'Abort', + no: 'Cancel', + iconClass: 'al-icon al-ico-archive al-color', } }); confirmDialogRef.afterClosed().subscribe((confirmed) => { @@ -244,10 +210,10 @@ To avoid this, clone the experiment and work with the cloned experiment.` public publishPopup() { const confirmDialogRef = this.dialog.open(ConfirmDialogComponent, { data: { - title : 'PUBLISH', - body : this.publishPopupBody, - yes : 'Publish', - no : 'Cancel', + title: 'PUBLISH', + body: this.publishPopupBody, + yes: 'Publish', + no: 'Cancel', iconClass: 'd-block fas fa-cloud-upload-alt fa-7x w-auto', } }); @@ -267,8 +233,8 @@ To avoid this, clone the experiment and work with the cloned experiment.` data: { currentProject: get('project.id', this._experiment) || this.getProjectId(), defaultProject: get('project.id', this._experiment), - reference : this._experiment.name, - type : 'experiment' + reference: this._experiment.name, + type: 'experiment' } }); dialog.afterClosed().pipe(filter(project => !!project)).subscribe(project => { @@ -291,9 +257,9 @@ To avoid this, clone the experiment and work with the cloned experiment.` clonePopup() { const confirmDialogRef = this.dialog.open(CloneDialogComponent, { data: { - type : 'Experiment', + type: 'Experiment', defaultProject: get('project.id', this._experiment), - defaultName : this._experiment.name + defaultName: this._experiment.name } }); diff --git a/src/app/webapp-common/experiments/shared/components/change-project-dialog/change-project-dialog.component.html b/src/app/webapp-common/experiments/shared/components/change-project-dialog/change-project-dialog.component.html index e5a61fea..6c894374 100644 --- a/src/app/webapp-common/experiments/shared/components/change-project-dialog/change-project-dialog.component.html +++ b/src/app/webapp-common/experiments/shared/components/change-project-dialog/change-project-dialog.component.html @@ -1,5 +1,5 @@
diff --git a/src/app/webapp-common/experiments/shared/components/clone-dialog/clone-dialog.component.html b/src/app/webapp-common/experiments/shared/components/clone-dialog/clone-dialog.component.html index 208aff70..03eae981 100644 --- a/src/app/webapp-common/experiments/shared/components/clone-dialog/clone-dialog.component.html +++ b/src/app/webapp-common/experiments/shared/components/clone-dialog/clone-dialog.component.html @@ -1,14 +1,14 @@ - +
A draft copy of {{reference.length > 80 ? (reference | slice:0:77) + '...' : reference }} will be created.
Project
@@ -32,7 +32,7 @@
Description
> diff --git a/src/app/webapp-common/experiments/shared/components/clone-dialog/clone-dialog.component.scss b/src/app/webapp-common/experiments/shared/components/clone-dialog/clone-dialog.component.scss index c577da4f..6ec44c87 100644 --- a/src/app/webapp-common/experiments/shared/components/clone-dialog/clone-dialog.component.scss +++ b/src/app/webapp-common/experiments/shared/components/clone-dialog/clone-dialog.component.scss @@ -7,12 +7,15 @@ padding: 6px; margin-bottom: 12px; overflow-wrap: break-word; + max-width: 500px; } - sm-textarea-control { - display: block; + /deep/ sm-textarea-control { max-height: 100px; - height: 20vh; + + textarea { + min-height: unset !important; + } } .buttons { diff --git a/src/app/webapp-common/experiments/shared/components/clone-dialog/clone-dialog.component.ts b/src/app/webapp-common/experiments/shared/components/clone-dialog/clone-dialog.component.ts index ac0853b1..8dfc8431 100644 --- a/src/app/webapp-common/experiments/shared/components/clone-dialog/clone-dialog.component.ts +++ b/src/app/webapp-common/experiments/shared/components/clone-dialog/clone-dialog.component.ts @@ -1,30 +1,30 @@ -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; import {Project} from '../../../../../business-logic/model/projects/project'; -import {Component, Inject, OnInit} from '@angular/core'; -import {select, Store} from '@ngrx/store'; +import {Component, Inject, OnDestroy, OnInit} from '@angular/core'; +import {Store} from '@ngrx/store'; import {Validators} from '@angular/forms'; -import {Observable} from 'rxjs'; +import {Observable, Subscription} from 'rxjs'; import {selectProjects} from '../../../../core/reducers/projects.reducer'; import {GetAllProjects} from '../../../../core/actions/projects.actions'; -import {map, tap} from 'rxjs/operators'; -import {isExample} from '../../../../../webapp-common/shared/utils/shared-utils'; +import {map} from 'rxjs/operators'; +import {isExample} from '../../../../shared/utils/shared-utils'; import {CloneForm} from '../../common-experiment-model.model'; @Component({ - selector: 'sm-clone-dialog', + selector : 'sm-clone-dialog', templateUrl: './clone-dialog.component.html', - styleUrls: ['./clone-dialog.component.scss'] + styleUrls : ['./clone-dialog.component.scss'] }) -export class CloneDialogComponent implements OnInit { +export class CloneDialogComponent implements OnInit, OnDestroy { CLONE_NAME_PREFIX = 'Clone Of '; public reference: string; public header: string; public type: string; - public projects$: Observable>; + public projects$: Observable; public formData = { project: null, - name: null, + name : null, comment: null }; @@ -41,31 +41,37 @@ export class CloneDialogComponent implements OnInit { validators = { name: [Validators.required] }; + private readonly defaultProjectId: string; + private projectsSub: Subscription; + public projects: { label: string; value: string }[]; constructor(private store: Store, @Inject(MAT_DIALOG_DATA) data: { - type: string; - defaultProject: Project['id']; - defaultName: string; - defaultComment: string; }, public dialogRef: MatDialogRef + type: string; + defaultProject: Project['id']; + defaultName: string; + defaultComment: string; + }, public dialogRef: MatDialogRef ) { - this.projects$ = this.store.pipe( - select(selectProjects), - map(projects => projects.filter((project) => !isExample(project))), - tap(filteredProjects => { - const defaultProject = filteredProjects.find(project => project.id === data.defaultProject); - this.formData.project = defaultProject ? defaultProject.id : filteredProjects[0] ? filteredProjects[0].id : null; - this.formData.comment = data.defaultComment || ''; - }), - map(projects => projects.map(proj => ({value: proj.id, label: proj.name}))) - ); + this.projects$ = this.store.select(selectProjects).pipe(map(projects => projects.filter( project => !isExample(project)))); + this.defaultProjectId = data.defaultProject; this.header = `Clone ${data.type}`; this.type = data.type.toLowerCase(); this.reference = data.defaultName; this.formData.name = this.CLONE_NAME_PREFIX + data.defaultName; + this.formData.comment = data.defaultComment || ''; + } + + ngOnDestroy(): void { + this.projectsSub.unsubscribe(); } ngOnInit(): void { this.store.dispatch(new GetAllProjects()); + this.projectsSub = this.projects$.subscribe(projects => { + this.projects = projects.map(project => ({value: project.id, label: project.name})); + const defaultProject = this.projects.find(project => project.value === this.defaultProjectId); + this.formData.project = defaultProject ? defaultProject.value : projects[0] ? this.projects[0].value : null; + }); } formDataChanged(event: { field: string, value: any }) { diff --git a/src/app/webapp-common/experiments/shared/experiment-hyper-params.model.ts b/src/app/webapp-common/experiments/shared/experiment-hyper-params.model.ts index 9734944b..0feb86c9 100644 --- a/src/app/webapp-common/experiments/shared/experiment-hyper-params.model.ts +++ b/src/app/webapp-common/experiments/shared/experiment-hyper-params.model.ts @@ -1,6 +1,10 @@ +import {ParamsItem} from '../../../business-logic/model/tasks/paramsItem'; + export interface IHyperParamsForm { - parameters: Array; -} + [key: string]: ParamsItem[] +}; + + export interface IExecutionParameter { id?: string; diff --git a/src/app/webapp-common/experiments/shared/services/common-experiment-converter.service.ts b/src/app/webapp-common/experiments/shared/services/common-experiment-converter.service.ts index acbc994d..882de79d 100644 --- a/src/app/webapp-common/experiments/shared/services/common-experiment-converter.service.ts +++ b/src/app/webapp-common/experiments/shared/services/common-experiment-converter.service.ts @@ -16,7 +16,6 @@ export class CommonExperimentConverterService { } convertCommonExperiment(experimentInfo: IExperimentInfo, selectedExperiment: ISelectedExperiment, experimentInfoBeforeChange: IExperimentInfo): TasksEditRequest { - const convertedExperiment: TasksEditRequest = { task: selectedExperiment.id, type: selectedExperiment.type, @@ -40,14 +39,9 @@ export class CommonExperimentConverterService { } - commonConvertExecution(execution: IExecutionForm, model: IExperimentModelInfo, - hyperParams: IHyperParamsForm): Execution { + commonConvertExecution(execution: IExecutionForm, model: IExperimentModelInfo): Execution { return { - parameters: this.convertParams(hyperParams), model : getOr(null, 'input.id', model), - model_desc: { - design: getOr('', 'prototext', model) - }, framework : get('input.framework', model), docker_cmd: get('docker_cmd', execution) }; @@ -77,15 +71,6 @@ export class CommonExperimentConverterService { } } - convertParams(parameters: IHyperParamsForm): Execution['parameters'] { - return parameters.parameters.reduce((acc, cur) => { - if (cur.key) { - acc[cur.key] = cur.label; - } - return acc; - }, {}); - } - private convertRequirments(requirements: any) { return {...requirements, pip: requirements.pip ? requirements.pip.split('\n') : undefined}; } diff --git a/src/app/webapp-common/experiments/shared/services/common-experiment-reverter.service.ts b/src/app/webapp-common/experiments/shared/services/common-experiment-reverter.service.ts index 9be33bdf..4019e61b 100644 --- a/src/app/webapp-common/experiments/shared/services/common-experiment-reverter.service.ts +++ b/src/app/webapp-common/experiments/shared/services/common-experiment-reverter.service.ts @@ -20,25 +20,36 @@ export class CommonExperimentReverterService { commonRevertExperiment(experiment: ISelectedExperiment): IExperimentInfo { return { - id: experiment.id, - name: experiment.name, - comment: experiment.comment, - execution: this.revertExecution(experiment), - model: this.revertModel(experiment), - hyperParams: {parameters: this.revertExecutionParameters(experiment.execution.parameters)}, + id : experiment.id, + name : experiment.name, + comment : experiment.comment, + execution : this.revertExecution(experiment), + model : this.revertModel(experiment), + hyperparams: this.revertHyperParams(experiment.hyperparams), }; } + revertHyperParams(hyperparams) { + if (!hyperparams) { + hyperparams = {}; + } + if (!('properties' in hyperparams)) { + hyperparams['properties'] = {}; + } + return hyperparams; + } + + revertExecution(experiment: ISelectedExperiment): IExecutionForm { return { - source: this.revertExecutionSource(experiment.script), - output: { + source : this.revertExecutionSource(experiment.script), + output : { destination: get('destination', experiment.output) || '', - logLevel: 'basic'// TODO: should be enum from gencode. + logLevel : 'basic'// TODO: should be enum from gencode. }, requirements: experiment.script ? this.revertRequirements(experiment.script) : {pip: ''}, - diff: get('diff', experiment.script) || '', - docker_cmd: get('docker_cmd', experiment.execution) + diff : get('diff', experiment.script) || '', + docker_cmd : get('docker_cmd', experiment.execution) }; } @@ -51,13 +62,13 @@ export class CommonExperimentReverterService { revertExecutionSource(script: Task['script']): IExecutionForm['source'] { return { - repository: get('repository', script) || '', - tag: get('tag', script) || '', + repository : get('repository', script) || '', + tag : get('tag', script) || '', version_num: get('version_num', script) || '', - branch: get('branch', script) || '', + branch : get('branch', script) || '', entry_point: get('entry_point', script) || '', working_dir: get('working_dir', script) || '', - scriptType: this.revertScriptType(script) + scriptType : this.revertScriptType(script) }; } @@ -74,76 +85,56 @@ export class CommonExperimentReverterService { revertModel(experiment: ISelectedExperiment): IExperimentModelInfo { return { - input: { - id: get('model.id', experiment.execution), - name: get('model.name', experiment.execution), - url: get('model.uri', experiment.execution), + input : { + id : get('model.id', experiment.execution), + name : get('model.name', experiment.execution), + url : get('model.uri', experiment.execution), framework: get('framework', experiment.execution), - labels: get('model.labels', experiment.execution), - project: get('model.project', experiment.execution), + labels : get('model.labels', experiment.execution), + project : get('model.project', experiment.execution), + design : get('model.design', experiment.execution) || '', }, - output: { - id: get('model.id', experiment.output) || '', - name: get('model.name', experiment.output) || '', - url: get('model.uri', experiment.output) || '', + output : { + id : get('model.id', experiment.output) || '', + name : get('model.name', experiment.output) || '', + url : get('model.uri', experiment.output) || '', project: get('model.project', experiment.output) || '', - design: get('model.design.design', experiment.output) || '', + design : get('model.design', experiment.output) || '', }, artifacts: get('artifacts', experiment.execution) || [], - source: { + source : { experimentName: get('model.task.name', experiment.execution), - experimentId: get('model.task.id', experiment.execution), - projectName: get('model.task.project.name', experiment.execution), - projectId: get('model.task.project.id', experiment.execution), - userName: get('model.user.name', experiment.execution), - timeCreated: get('model.created', experiment.execution), + experimentId : get('model.task.id', experiment.execution), + projectName : get('model.task.project.name', experiment.execution), + projectId : get('model.task.project.id', experiment.execution), + userName : get('model.user.name', experiment.execution), + timeCreated : get('model.created', experiment.execution), }, - prototext: this.getModelDesign(get('model_desc', experiment.execution)), }; } revertModelFromModel(model: Model, populatePrototext: boolean): Partial { const modelData: Partial = { - input: model.id ? { - id: model.id, - name: model.name, - url: model.uri, + input : model.id ? { + id : model.id, + name : model.name, + url : model.uri, framework: model.framework, - labels: model.labels, + labels : model.labels, } : undefined, - output: { // TODO: no need? - id: null, - name: null, - url: null - }, source: { - experimentId: get('task.id', model), - projectId: get('project.id', model), + experimentId : get('task.id', model), + projectId : get('project.id', model), experimentName: get('task.name', model), - projectName: get('project.name', model), - userName: get('user.name', model), - timeCreated: model.created, + projectName : get('project.name', model), + userName : get('user.name', model), + timeCreated : model.created, }, }; - - if (populatePrototext) { - modelData.prototext = this.getModelDesign(model.design); - } - return modelData; } - public getModelDesign(modelDesc: Task['execution']['model_desc']) { - const modelDesign = get('design', modelDesc) || get('prototxt', modelDesc); - return typeof modelDesign === 'string' ? modelDesign : JSON.stringify(modelDesign); - } - - public getOutputModelDesign(modelDesc: Task['execution']['model_desc']) { - const modelDesign = get('design', modelDesc) || get('prototxt', modelDesc); - return typeof modelDesign === 'string' ? modelDesign : JSON.stringify(modelDesign); - } - private revertRequirements(script: Script) { const pip = getOr([], 'requirements.pip', script); return { diff --git a/src/app/webapp-common/layout/breadcrumbs/breadcrumbs.component.html b/src/app/webapp-common/layout/breadcrumbs/breadcrumbs.component.html index 689e7285..cc99ce3a 100644 --- a/src/app/webapp-common/layout/breadcrumbs/breadcrumbs.component.html +++ b/src/app/webapp-common/layout/breadcrumbs/breadcrumbs.component.html @@ -1,4 +1,4 @@ - + {{crumb.name}} > @@ -14,7 +14,7 @@