release v1.10 (#51)

This commit is contained in:
shyallegro 2023-03-29 18:04:17 +03:00 committed by GitHub
parent 8f6029cf5f
commit 29c68abeb4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1001 changed files with 13503 additions and 9954 deletions

13529
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,10 @@
{
"name": "clearml-webapp",
"version": "1.9.2",
"version": "1.10.0",
"license": "",
"scripts": {
"ng": "ng",
"start": "npx ng serve --proxy-config proxy.config.js --live-reload false --port 4300",
"start": "npx ng serve",
"start-widgets": "npx ng serve --port 4201 --project report-widgets --proxy-config proxy.config.js --live-reload false",
"hmr": "npx ng serve --proxy-config proxy.config.js --hmr --port 4300",
"build": "npx ng build --configuration production --source-map --vendor-chunk",
@ -19,29 +19,30 @@
},
"private": true,
"dependencies": {
"@angular/animations": "^14.2.12",
"@angular/cdk": "^14.2.7",
"@angular/common": "^14.2.12",
"@angular/compiler": "^14.2.12",
"@angular/core": "^14.2.12",
"@angular/forms": "^14.2.12",
"@angular/material": "^14.2.7",
"@angular/platform-browser": "^14.2.12",
"@angular/platform-browser-dynamic": "^14.2.12",
"@angular/platform-server": "^14.2.12",
"@angular/router": "^14.2.12",
"@angular/service-worker": "^14.2.12",
"@angular/youtube-player": "^14.2.7",
"@aws-sdk/client-s3": "^3.216.0",
"@aws-sdk/s3-request-presigner": "^3.216.0",
"@angular/animations": "^15.1.3",
"@angular/cdk": "^15.1.3",
"@angular/common": "^15.1.3",
"@angular/compiler": "^15.1.3",
"@angular/core": "^15.1.3",
"@angular/forms": "^15.1.3",
"@angular/material": "^15.1.3",
"@angular/platform-browser": "^15.1.3",
"@angular/platform-browser-dynamic": "^15.1.3",
"@angular/platform-server": "^15.1.3",
"@angular/router": "^15.1.3",
"@angular/service-worker": "^15.1.3",
"@angular/youtube-player": "^15.1.3",
"@aws-sdk/client-s3": "^3.266.1",
"@aws-sdk/s3-request-presigner": "^3.266.1",
"@ctrl/ngx-github-buttons": "^8.0.0",
"@ngneat/dag": "^2.0.0",
"@ngrx/effects": "^14.3.2",
"@ngrx/entity": "^14.3.2",
"@ngrx/router-store": "^14.3.2",
"@ngrx/store": "^14.3.2",
"ace-builds": "^1.13.1",
"angular-google-tag-manager": "^1.6.1",
"angular-resizable-element": "^6.0.0",
"@ngrx/effects": "^15.2.1",
"@ngrx/entity": "^15.2.1",
"@ngrx/router-store": "^15.2.1",
"@ngrx/store": "^15.2.1",
"ace-builds": "^1.15.0",
"angular-google-tag-manager": "^1.7.0",
"angular-resizable-element": "^7.0.2",
"angular-split": "^14.1.0",
"ansi-to-html": "^0.7.2",
"bootstrap": "^4.6.2",
@ -50,58 +51,59 @@
"d3-selection": "^3.0.0",
"diff": "^5.1.0",
"dom-to-image": "^2.6.0",
"filesize": "^10.0.5",
"filesize": "^10.0.6",
"has-ansi": "^5.0.1",
"hocon-parser": "^1.0.1",
"jwt-decode": "^3.1.2",
"lodash": "^4.17.21",
"localforage": "^1.10.0",
"lodash-es": "^4.17.21",
"lucene": "^2.1.1",
"ngx-clipboard": "^15.1.0",
"ngx-color-picker": "^13.0.0",
"ngx-device-detector": "^4.0.1",
"ngx-markdown-editor": "^4.3.0",
"ngx-print": "^1.2.1",
"ngx-device-detector": "^5.0.1",
"ngx-markdown-editor": "^5.1.0",
"ngx-print": "^1.3.1",
"ngx-window-token": "^6.0.0",
"object-hash": "^3.0.0",
"primeicons": "^6.0.1",
"primeng": "^14.2.2",
"primeng": "^15.2.0",
"process": "^0.11.10",
"rxjs": "^7.5.7",
"rxjs": "^7.8.0",
"string-to-color": "^2.2.2",
"tinycolor2": "^1.5.2",
"tslib": "^2.4.1",
"tinycolor2": "^1.6.0",
"tslib": "^2.5.0",
"url": "^0.11.0",
"uuid": "^9.0.0",
"zone.js": "~0.11.8"
"zone.js": "~0.12.0"
},
"devDependencies": {
"@angular-devkit/build-angular": "^14.2.10",
"@angular-devkit/core": "^14.2.10",
"@angular-devkit/schematics": "^14.2.10",
"@angular-devkit/schematics-cli": "^14.2.7",
"@angular-eslint/builder": "^14.4.0",
"@angular-eslint/eslint-plugin": "^14.4.0",
"@angular-eslint/eslint-plugin-template": "^14.4.0",
"@angular-eslint/schematics": "14.4.0",
"@angular-eslint/template-parser": "^14.4.0",
"@angular/cli": "^14.2.10",
"@angular/compiler-cli": "^14.2.12",
"@angular/language-service": "^14.2.12",
"@fortawesome/fontawesome-free": "^6.2.1",
"@ngrx/schematics": "^14.3.2",
"@ngrx/store-devtools": "^14.3.2",
"@types/d3-selection": "^3.0.3",
"@types/lodash": "^4.14.191",
"@types/node": "^18.11.9",
"@types/plotly.js": "^2.12.9",
"@types/uuid": "^8.3.4",
"@typescript-eslint/eslint-plugin": "^5.44.0",
"@typescript-eslint/parser": "^5.44.0",
"codelyzer": "^0.0.28",
"eslint": "^8.28.0",
"eslint-plugin-import": "2.26.0",
"eslint-plugin-jsdoc": "39.6.2",
"@angular-devkit/build-angular": "^15.1.4",
"@angular-devkit/core": "^15.1.4",
"@angular-devkit/schematics": "^15.1.4",
"@angular-devkit/schematics-cli": "^15.1.4",
"@angular-eslint/builder": "^15.2.0",
"@angular-eslint/eslint-plugin": "^15.2.0",
"@angular-eslint/eslint-plugin-template": "^15.2.0",
"@angular-eslint/schematics": "15.2.0",
"@angular-eslint/template-parser": "^15.2.0",
"@angular/cli": "^15.1.4",
"@angular/compiler-cli": "^15.1.3",
"@angular/language-service": "^15.1.3",
"@fortawesome/fontawesome-free": "^6.3.0",
"@ngrx/schematics": "^15.2.1",
"@ngrx/store-devtools": "^15.2.1",
"@types/d3-selection": "^3.0.4",
"@types/lodash-es": "^4.17.6",
"@types/node": "^18.13.0",
"@types/plotly.js": "^2.12.13",
"@types/uuid": "^9.0.0",
"@typescript-eslint/eslint-plugin": "^5.51.0",
"@typescript-eslint/parser": "^5.51.0",
"codelyzer": "^6.0.2",
"eslint": "^8.33.0",
"eslint-plugin-import": "2.27.5",
"eslint-plugin-jsdoc": "39.8.0",
"eslint-plugin-prefer-arrow": "1.2.3",
"typescript": "~4.8.4"
"typescript": "~4.9.5"
}
}

0
src/app/app.component.html Normal file → Executable file
View File

0
src/app/app.component.scss Normal file → Executable file
View File

14
src/app/app.component.ts Normal file → Executable file
View File

@ -5,19 +5,19 @@ import {ActivatedRoute, NavigationEnd, Router, Params, RouterEvent} from '@angul
import {Title} from '@angular/platform-browser';
import {selectLoggedOut} from '@common/core/reducers/view.reducer';
import {Store} from '@ngrx/store';
import {selectRouterParams, selectRouterUrl} from '@common/core/reducers/router-reducer';
import {selectRouterConfig, selectRouterParams, selectRouterUrl} from '@common/core/reducers/router-reducer';
import {ApiProjectsService} from './business-logic/api-services/projects.service';
import {Project} from './business-logic/model/projects/project';
import {getAllSystemProjects, setSelectedProjectId, updateProject} from '@common/core/actions/projects.actions';
import {selectSelectedProject} from '@common/core/reducers/projects.reducer';
import {MatDialog} from '@angular/material/dialog';
import {MatLegacyDialog as MatDialog} from '@angular/material/legacy-dialog';
import {getTutorialBucketCredentials} from '@common/core/actions/common-auth.actions';
import {termsOfUseAccepted} from '@common/core/actions/users.actions';
import {distinctUntilChanged, filter, map, tap, withLatestFrom} from 'rxjs/operators';
import * as routerActions from './webapp-common/core/actions/router.actions';
import {combineLatest, Observable, Subscription} from 'rxjs';
import {selectBreadcrumbsStrings} from '@common/layout/layout.reducer';
import {prepareNames} from './layout/breadcrumbs/breadcrumbs.utils';
import {NestedProjectTypeUrlEnum, prepareNames} from './layout/breadcrumbs/breadcrumbs.utils';
import {formatStaticCrumb} from '@common/layout/breadcrumbs/breadcrumbs-common.utils';
import {ServerUpdatesService} from '@common/shared/services/server-updates.service';
import {selectAvailableUpdates} from './core/reducers/view.reducer';
@ -33,7 +33,6 @@ import {GoogleTagManagerService} from 'angular-google-tag-manager';
import {selectIsSharedAndNotOwner} from './features/experiments/reducers';
import {TipsService} from '@common/shared/services/tips.service';
import {USER_PREFERENCES_KEY} from '@common/user-preferences';
import {selectIsPipelines} from '@common/experiments-compare/reducers';
import {Environment} from '../environments/base';
import {loadExternalLibrary} from '@common/shared/utils/load-external-library';
@ -184,10 +183,11 @@ export class AppComponent implements OnInit, OnDestroy {
this.breadcrumbsSubscription = this.store.select(selectBreadcrumbsStrings).pipe(
filter(names => !!names),
withLatestFrom(this.store.select(selectIsPipelines))
withLatestFrom(this.store.select(selectRouterConfig))
).subscribe(
([names, isPipeLines]) => {
this.breadcrumbsStrings = prepareNames(names, isPipeLines);
([names, routeConf]) => {
const projectType = `${routeConf?.[0]}${routeConf?.[1] === 'simple' ? '/' + routeConf?.[1] : ''}`;
this.breadcrumbsStrings = prepareNames(names, projectType as NestedProjectTypeUrlEnum);
this.updateTitle();
}
);

0
src/app/app.constants.ts Normal file → Executable file
View File

11
src/app/app.module.ts Normal file → Executable file
View File

@ -20,12 +20,14 @@ import {ColorHashService} from '@common/shared/services/color-hash/color-hash.se
import {SharedModule} from './shared/shared.module';
import {ConfigurationService} from '@common/shared/services/configuration.service';
import {ProjectsSharedModule} from './features/projects/shared/projects-shared.module';
import {MAT_FORM_FIELD_DEFAULT_OPTIONS} from '@angular/material/form-field';
import {MAT_LEGACY_FORM_FIELD_DEFAULT_OPTIONS as MAT_FORM_FIELD_DEFAULT_OPTIONS} from '@angular/material/legacy-form-field';
import {LoginService} from '~/shared/services/login.service';
import {ExperimentSharedModule} from '~/features/experiments/shared/experiment-shared.module';
@NgModule({
declarations : [AppComponent],
imports: [
ExperimentSharedModule,
FormsModule,
ReactiveFormsModule,
BrowserAnimationsModule,
@ -36,10 +38,9 @@ import {LoginService} from '~/shared/services/login.service';
SMSharedModule,
AngularSplitModule,
RouterModule.forRoot(routes, {
preloadingStrategy: PreloadAllModules,
scrollPositionRestoration: 'top',
onSameUrlNavigation: 'reload',
relativeLinkResolution: 'legacy'
preloadingStrategy: PreloadAllModules,
scrollPositionRestoration: 'top',
onSameUrlNavigation: 'reload'
}),
NotifierModule.withConfig({
theme: 'material',

3
src/app/app.routes.ts Normal file → Executable file
View File

@ -63,7 +63,8 @@ export const routes: Routes = [
{
path: ':projectId',
children: [
{path: 'pipelines', loadChildren: () => import('./features/projects/projects.module').then(m => m.ProjectsModule)},
{path: 'pipelines', loadChildren: () => import('@common/pipelines/pipelines.module').then(m => m.PipelinesModule)},
{path: 'projects', loadChildren: () => import('@common/nested-project-view/nested-project-view.module').then(m => m.NestedProjectViewModule)},
{
path: 'experiments', loadChildren: () => import('@common/pipelines-controller/pipelines-controller.module').then(m => m.PipelinesControllerModule)
},

View File

0
src/app/business-logic/business-logic.module.ts Normal file → Executable file
View File

0
src/app/business-logic/configuration.ts Normal file → Executable file
View File

0
src/app/business-logic/constants.ts Normal file → Executable file
View File

0
src/app/business-logic/encoder.ts Normal file → Executable file
View File

0
src/app/business-logic/model/al-task.ts Normal file → Executable file
View File

0
src/app/business-logic/model/api-request.ts Normal file → Executable file
View File

View File

@ -29,4 +29,5 @@ export interface EventsGetTaskPlotsRequest {
* List of metrics and variants
*/
metrics?: Array<object>;
model_events?: boolean;
}

View File

@ -27,4 +27,5 @@ export interface EventsScalarMetricsIterHistogramRequest {
* List of metrics and variants
*/
metrics?: Array<object>;
model_events?: boolean;
}

View File

@ -67,4 +67,5 @@ export interface Project {
own_tasks?: number;
own_models?: number;
hidden?: boolean;
}

View File

@ -117,6 +117,7 @@ export interface ProjectsGetAllExRequest {
* Allow public projects to be returned in the results
*/
allow_public?: boolean;
children_type?: string;
}
export namespace ProjectsGetAllExRequest {
export type StatsForStateEnum = 'active' | 'archived';

View File

@ -11,9 +11,12 @@
*/
import { StatsStatusCount } from '././statsStatusCount';
import { StatsDatasets } from '././statsDatasets';
export interface Stats {
active?: StatsStatusCount;
archived?: StatsStatusCount;
datasets?: StatsDatasets;
}

View File

@ -0,0 +1,24 @@
/**
* projects
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* OpenAPI spec version: 999.0
*
*
* NOTE: This class is auto generated by the swagger code generator program.
* https://github.com/swagger-api/swagger-codegen.git
* Do not edit the class manually.
*/
export interface StatsDatasets {
/**
* Number of datasets
*/
count?: number;
/**
* Dataset tags
*/
tags?: Array<string>;
}

View File

@ -73,4 +73,5 @@ export interface Report {
last_update?: string;
report?: string;
report_assets?: string[];
}

1
src/app/business-logic/services/models.service.ts Normal file → Executable file
View File

@ -1,6 +1,5 @@
import {Injectable} from '@angular/core';
import {Model} from '../model/models/model';
import {get} from 'lodash/fp';
@Injectable()
export class BlModelsService {

3
src/app/business-logic/services/tasks.service.ts Normal file → Executable file
View File

@ -2,7 +2,6 @@ import {Injectable} from '@angular/core';
import {TASK_TYPES} from '../../app.constants';
import {TAGS, TASKS_STATUS} from '../../webapp-common/tasks/tasks.constants';
import {Task} from '../model/tasks/task';
import {get} from 'lodash/fp';
import {DEFAULT_QUEUE_TAG} from '../variables';
@Injectable()
@ -14,7 +13,7 @@ export class BlTasksService {
private previouslyUsedQueue;
getDefaultQueue(queues) {
return queues.find(queue => get('id', this.previouslyUsedQueue) === queue.id) || queues.find(queue => this.isDefaultQueue(queue));
return queues.find(queue => this.previouslyUsedQueue?.id === queue.id) || queues.find(queue => this.isDefaultQueue(queue));
}
setPreviouslyUsedQueue(queue) {

0
src/app/business-logic/variables.ts Normal file → Executable file
View File

22
src/app/core/core.module.ts Normal file → Executable file
View File

@ -16,27 +16,15 @@ import {
EXPERIMENTS_COMPARE_METRICS_CHARTS_
} from '@common/experiments-compare/actions/experiments-compare-charts.actions';
import {compareSyncedKeys} from '@common/experiments-compare/experiments-compare.module';
import {EXPERIMENTS_OUTPUT_PREFIX} from '@common/experiments/actions/common-experiment-output.actions';
import {EXPERIMENTS_INFO_PREFIX} from '@common/experiments/actions/common-experiments-info.actions';
import {EXPERIMENTS_PREFIX} from '@common/experiments/actions/common-experiments-view.actions';
import {EXPERIMENTS_STORE_KEY} from '@common/experiments/shared/common-experiments.const';
import {
MODELS_PREFIX_INFO,
MODELS_PREFIX_MENU,
MODELS_PREFIX_VIEW,
MODELS_STORE_KEY
} from '@common/models/models.consts';
import {modelSyncedKeys} from '@common/models/models.module';
import {PROJECTS_PREFIX} from '@common/projects/common-projects.consts';
import {CHOOSE_COLOR_PREFIX} from '@common/shared/ui-components/directives/choose-color/choose-color.actions';
import {colorSyncedKeys} from '@common/shared/ui-components/directives/choose-color/choose-color.module';
import {UserPreferences} from '@common/user-preferences';
import {EffectsModule} from '@ngrx/effects';
import {ActionReducer, MetaReducer, StoreModule, USER_PROVIDED_META_REDUCERS} from '@ngrx/store';
import {merge, pick} from 'lodash/fp';
import {merge, pick} from 'lodash-es';
import {USERS_PREFIX, VIEW_PREFIX} from '~/app.constants';
import {ProjectsEffects} from '~/core/effects/projects.effects';
import {experimentSyncedKeys} from '~/features/experiments/experiments.module';
import {loginReducer} from '~/features/login/login.reducer';
import {projectSyncedKeys} from '~/features/projects/projects.module';
import {authReducer} from '~/features/settings/containers/admin/auth.reducers';
@ -90,7 +78,7 @@ export const localStorageReducer = (reducer: ActionReducer<any>): ActionReducer<
// TODO: lil hack to fix ngrx bug in preload strategy that dispatch store/init multiple times.
if (action.type === '@ngrx/store/init') {
const savedState = JSON.parse(localStorage.getItem(key));
nextState = merge(nextState, savedState);
nextState = merge({}, nextState, savedState);
}
if (state === nextState) {
return nextState;
@ -98,7 +86,7 @@ export const localStorageReducer = (reducer: ActionReducer<any>): ActionReducer<
if (actionsPrefix && !actionsPrefix.some(ap => action.type.startsWith(ap))) {
return nextState;
}
localStorage.setItem(key, JSON.stringify(pick(syncedKeys, nextState)));
localStorage.setItem(key, JSON.stringify(pick(nextState, syncedKeys )));
return nextState;
};
@ -112,10 +100,6 @@ const userPrefMetaFactory = (userPreferences: UserPreferences): MetaReducer<any>
localStorageReducer,
(reducer: ActionReducer<any>) =>
createUserPrefReducer('projects', projectSyncedKeys, [PROJECTS_PREFIX], userPreferences, reducer),
(reducer: ActionReducer<any>) =>
createUserPrefReducer(EXPERIMENTS_STORE_KEY, experimentSyncedKeys, [EXPERIMENTS_PREFIX, EXPERIMENTS_INFO_PREFIX, EXPERIMENTS_OUTPUT_PREFIX], userPreferences, reducer),
(reducer: ActionReducer<any>) =>
createUserPrefReducer(MODELS_STORE_KEY, modelSyncedKeys, [MODELS_PREFIX_INFO, MODELS_PREFIX_MENU, MODELS_PREFIX_VIEW], userPreferences, reducer),
(reducer: ActionReducer<any>) =>
createUserPrefReducer('compare-experiments', compareSyncedKeys, [EXPERIMENTS_COMPARE_METRICS_CHARTS_], userPreferences, reducer),
(reducer: ActionReducer<any>) =>

View File

@ -1,4 +1,4 @@
import { Injectable } from '@angular/core';
import {Injectable} from '@angular/core';
import {Actions, createEffect, ofType} from '@ngrx/effects';
import * as actions from '../../webapp-common/core/actions/projects.actions';
import {Store} from '@ngrx/store';
@ -10,7 +10,7 @@ import {requestFailed} from '@common/core/actions/http.actions';
import {ApiProjectsService} from '~/business-logic/api-services/projects.service';
import {selectCurrentUser, selectShowOnlyUserWork} from '@common/core/reducers/users-reducer';
import {ProjectsGetAllExRequest} from '~/business-logic/model/projects/projectsGetAllExRequest';
import {selectRouterConfig} from "@common/core/reducers/router-reducer";
@Injectable()
@ -21,7 +21,8 @@ export class ProjectsEffects {
private actions$: Actions,
private store: Store,
private projectsApi: ApiProjectsService
) {}
) {
}
getSelectedProject = createEffect(() => this.actions$.pipe(
ofType(actions.setSelectedProjectId),
@ -30,8 +31,10 @@ export class ProjectsEffects {
this.store.select(selectCurrentUser),
this.store.select(selectShowOnlyUserWork),
this.store.select(selectShowHidden),
this.store.select(selectRouterConfig),
),
switchMap(([action, selectedProjectId, user, showOnlyUserWork, showHidden]) => {
switchMap(([action, selectedProjectId, user, showOnlyUserWork, showHidden, conf]) => {
const customProjectType = conf[0] !== 'projects';
if (!action.projectId) {
return [
deactivateLoader(action.type),
@ -55,19 +58,30 @@ export class ProjectsEffects {
include_stats: true,
...(!showHidden && {include_stats_filter: {system_tags: ['-pipeline', '-dataset']}}),
...(showOnlyUserWork && {active_users: [user.id]}),
...(showHidden && {search_hidden: true}),
...((showHidden || customProjectType) && {search_hidden: true}),
...((action.example !== false || this.fetchingExampleExperiment === action.projectId) && {check_own_contents: true}),
/* eslint-enable @typescript-eslint/naming-convention */
} as ProjectsGetAllExRequest)
.pipe(
finalize(() => this.fetchingExampleExperiment = null),
mergeMap(({projects}) => [
actions.setSelectedProject({project: projects[0]}),
actions.getProjectUsers(action),
actions.getTags(),
actions.getCompanyTags(),
deactivateLoader(action.type),
]
mergeMap(({projects}) => {
if (projects.length > 0) {
return [
actions.setSelectedProject({project: projects[0]}),
actions.getProjectUsers(action),
...(!customProjectType ? [actions.getTags()] : []),
actions.getTags(),
actions.getCompanyTags(),
deactivateLoader(action.type),
];
} else {
return [
actions.setSelectedProject({project: ALL_PROJECTS_OBJECT}),
actions.getProjectUsers(action),
deactivateLoader(action.type)
];
}
}
),
catchError(error => [
requestFailed(error),

10
src/app/core/effects/users.effects.ts Normal file → Executable file
View File

@ -1,10 +1,10 @@
import {Injectable} from '@angular/core';
import {Actions, Effect, ofType, createEffect} from '@ngrx/effects';
import {Actions, ofType, createEffect} from '@ngrx/effects';
import {filter, take, mergeMap, switchMap} from 'rxjs/operators';
import {CookiesService} from '../../shared/cookies.service';
import {ApiAuthService} from '../../business-logic/api-services/auth.service';
import {ApiServerService} from '../../business-logic/api-services/server.service';
import {ServerReportStatsOptionResponse} from '../../business-logic/model/server/serverReportStatsOptionResponse';
import {CookiesService} from '~/shared/cookies.service';
import {ApiAuthService} from '~/business-logic/api-services/auth.service';
import {ApiServerService} from '~/business-logic/api-services/server.service';
import {ServerReportStatsOptionResponse} from '~/business-logic/model/server/serverReportStatsOptionResponse';
import {setUsageStats, updateUsageStats} from '../actions/usage-stats.actions';
import {fetchCurrentUser} from '@common/core/actions/users.actions';

0
src/app/core/models/actions.ts Normal file → Executable file
View File

0
src/app/core/models/model-data.ts Normal file → Executable file
View File

0
src/app/core/reducers/recent-tasks-reducer.ts Normal file → Executable file
View File

0
src/app/core/reducers/sources-reducer.ts Normal file → Executable file
View File

View File

@ -3,9 +3,9 @@ import {Store} from '@ngrx/store';
import {filter} from 'rxjs/operators';
import {updateUsageStats} from '../actions/usage-stats.actions';
import {selectPromptUser} from '../reducers/usage-stats.reducer';
import {MatDialog} from '@angular/material/dialog';
import {ConfirmDialogComponent} from '../../webapp-common/shared/ui-components/overlay/confirm-dialog/confirm-dialog.component';
import {ConfigurationService} from '../../webapp-common/shared/services/configuration.service';
import {MatLegacyDialog as MatDialog} from '@angular/material/legacy-dialog';
import {ConfirmDialogComponent} from '@common/shared/ui-components/overlay/confirm-dialog/confirm-dialog.component';
import {ConfigurationService} from '@common/shared/services/configuration.service';
@Injectable({
providedIn: 'root'

0
src/app/features/dashboard/dashboard-routing.module.ts Normal file → Executable file
View File

0
src/app/features/dashboard/dashboard.component.html Normal file → Executable file
View File

0
src/app/features/dashboard/dashboard.component.scss Normal file → Executable file
View File

2
src/app/features/dashboard/dashboard.component.ts Normal file → Executable file
View File

@ -8,7 +8,7 @@ import {filter, skip, take} from 'rxjs/operators';
import {setDeep} from '@common/core/actions/projects.actions';
import {getRecentProjects, getRecentExperiments} from '@common/dashboard/common-dashboard.actions';
import {selectFirstLogin} from '@common/core/reducers/view.reducer';
import {MatDialog} from '@angular/material/dialog';
import {MatLegacyDialog as MatDialog} from '@angular/material/legacy-dialog';
import {WelcomeMessageComponent} from '@common/layout/welcome-message/welcome-message.component';
import {firstLogin} from '@common/core/actions/layout.actions';
import {IRecentTask, selectRecentTasks} from '@common/dashboard/common-dashboard.reducer';

0
src/app/features/dashboard/dashboard.module.ts Normal file → Executable file
View File

View File

@ -1,11 +1,10 @@
import {NgModule} from '@angular/core';
import {RouterModule, Routes} from '@angular/router';
import {SimpleDatasetVersionsComponent} from '@common/datasets/simple-dataset-versions/simple-dataset-versions.component';
import {
SimpleDatasetVersionInfoComponent
} from '@common/datasets/simple-dataset-version-info/simple-dataset-version-info.component';
import {SimpleDatasetsComponent} from '@common/datasets/simple-datasets/simple-datasets.component';
import {EntityTypeEnum} from '../../shared/constants/non-common-consts';
import {EntityTypeEnum} from '~/shared/constants/non-common-consts';
import {
NestedProjectViewPageComponent
} from "@common/nested-project-view/nested-project-view-page/nested-project-view-page.component";
const routes: Routes = [
{
@ -17,15 +16,20 @@ const routes: Routes = [
path: 'simple/:projectId',
data: {search: true},
children: [
{path: '', redirectTo: 'experiments', pathMatch: 'full'},
{
path: 'datasets',
component: SimpleDatasetsComponent,
data: {search: true}
},
{
path: 'projects',
component: NestedProjectViewPageComponent,
data: {search: true}
},
{
path: 'experiments',
component: SimpleDatasetVersionsComponent,
children: [
{
path: ':versionId', component: SimpleDatasetVersionInfoComponent,
},
]
loadChildren: () => import('@common/dataset-version/dataset-version.module')
.then(m => m.DatasetVersionModule)
},
{
path: 'compare-experiments',

View File

@ -1,65 +1,26 @@
import {CommonModule} from '@angular/common';
import {NgModule, NO_ERRORS_SCHEMA} from '@angular/core';
import {FormsModule, ReactiveFormsModule} from '@angular/forms';
import {SMSharedModule} from '@common/shared/shared.module';
import {ChipsModule} from '@common/shared/ui-components/buttons/chips/chips.module';
import {SimpleDatasetsComponent} from '@common/datasets/simple-datasets/simple-datasets.component';
import {CommonProjectsModule} from '@common/projects/common-projects.module';
import {ProjectsSharedModule} from '~/features/projects/shared/projects-shared.module';
import {ExperimentSharedModule} from '~/features/experiments/shared/experiment-shared.module';
import {ExperimentCompareSharedModule} from '@common/experiments-compare/shared/experiment-compare-shared.module';
import {ExperimentsCommonModule} from '@common/experiments/common-experiments.module';
import {CommonExperimentSharedModule} from '@common/experiments/shared/common-experiment-shared.module';
import {
SimpleDatasetVersionsComponent
} from '@common/datasets/simple-dataset-versions/simple-dataset-versions.component';
import {AngularSplitModule} from 'angular-split';
import {
SimpleDatasetVersionMenuComponent
} from '@common/datasets/simple-dataset-version-menu/simple-dataset-version-menu.component';
import {
SimpleDatasetVersionInfoComponent
} from '@common/datasets/simple-dataset-version-info/simple-dataset-version-info.component';
import {PipelinesControllerModule} from '@common/pipelines-controller/pipelines-controller.module';
import {DatasetsRoutingModule} from '~/features/datasets/datasets-routing.module';
import {DatasetVersionStepComponent} from '@common/datasets/dataset-version-step/dataset-version-step.component';
import {DatasetsSharedModule} from '~/features/datasets/shared/datasets-shared.module';
import {SimpleDatasetVersionDetailsComponent} from '@common/datasets/simple-dataset-version-details/simple-dataset-version-details.component';
import {SimpleDatasetVersionContentComponent} from '@common/datasets/simple-dataset-version-content/simple-dataset-version-content.component';
import {SimpleDatasetVersionPreviewComponent} from '@common/datasets/simple-dataset-version-preview/simple-dataset-version-preview.component';
import {ExperimentOutputLogModule} from '@common/experiments/shared/experiment-output-log/experiment-output-log.module';
import {DebugImagesModule} from '@common/debug-images/debug-images.module';
import {SharedPipesModule} from '@common/shared/pipes/shared-pipes.module';
import {SMSharedModule} from '@common/shared/shared.module';
import {FeatureNestedProjectViewModule} from "~/features/nested-project-view/feature-nested-project-view.module";
@NgModule({
imports: [
CommonModule,
ReactiveFormsModule,
SMSharedModule,
ChipsModule,
FormsModule,
AngularSplitModule,
CommonProjectsModule,
ProjectsSharedModule,
CommonExperimentSharedModule,
ExperimentSharedModule,
DatasetsRoutingModule,
ExperimentsCommonModule,
ExperimentCompareSharedModule,
PipelinesControllerModule,
DatasetsSharedModule,
ExperimentOutputLogModule,
DebugImagesModule,
SharedPipesModule,
FeatureNestedProjectViewModule,
],
declarations: [
SimpleDatasetsComponent,
SimpleDatasetVersionsComponent,
SimpleDatasetVersionMenuComponent,
SimpleDatasetVersionInfoComponent,
SimpleDatasetVersionContentComponent,
SimpleDatasetVersionPreviewComponent,
DatasetVersionStepComponent,
SimpleDatasetVersionDetailsComponent,
],
schemas: [NO_ERRORS_SCHEMA],
exports: []

View File

@ -6,6 +6,7 @@ import {ChipsModule} from '@common/shared/ui-components/buttons/chips/chips.modu
import {SharedModule} from '~/shared/shared.module';
import {SimpleDatasetCardComponent} from '@common/datasets/simple-dataset-card/simple-dataset-card.component';
import {ProjectsSharedModule} from '~/features/projects/shared/projects-shared.module';
import {SharedPipesModule} from '@common/shared/pipes/shared-pipes.module';
const _declerations = [
SimpleDatasetCardComponent
@ -20,6 +21,7 @@ SimpleDatasetCardComponent
ChipsModule,
SharedModule,
ProjectsSharedModule,
SharedPipesModule,
],
declarations: [..._declerations],
exports : [..._declerations]

View File

View File

View File

View File

@ -1 +0,0 @@
<sm-common-experiments></sm-common-experiments>

View File

@ -1,9 +0,0 @@
import {ChangeDetectionStrategy, Component} from '@angular/core';
@Component({
selector : 'sm-experiments',
templateUrl : './experiments.component.html',
styleUrls : ['./experiments.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class ExperimentsComponent {}

0
src/app/features/experiments/experiments.consts.ts Normal file → Executable file
View File

123
src/app/features/experiments/experiments.module.ts Normal file → Executable file
View File

@ -1,70 +1,55 @@
import {InjectionToken, NgModule} from '@angular/core';
import {NgModule} from '@angular/core';
import {CommonModule} from '@angular/common';
import {ExperimentSharedModule} from './shared/experiment-shared.module';
import {SMSharedModule} from '@common/shared/shared.module';
import {ExperimentRouterModule} from './experiments-routing.module';
import {ExperimentsComponent} from './experiments.component';
import {EffectsModule} from '@ngrx/effects';
import {StoreConfig, StoreModule} from '@ngrx/store';
import {experimentsReducers, ExperimentState} from './reducers';
import {AdminService} from '~/shared/services/admin.service';
import {FormsModule, ReactiveFormsModule} from '@angular/forms';
import {SelectModelModule} from '@common/select-model/select-model.module';
import {SmSyncStateSelectorService} from '@common/core/services/sync-state-selector.service';
import {ExperimentOutputEffects} from './effects/experiment-output.effects';
import {ExperimentsMenuEffects} from './effects/experiments-menu.effects';
import {LayoutModule} from '~/layout/layout.module';
import {ExperimentGraphsModule} from '@common/shared/experiment-graphs/experiment-graphs.module';
import {ExperimentCompareSharedModule} from '@common/experiments-compare/shared/experiment-compare-shared.module';
import {AngularSplitModule} from 'angular-split';
import {SMMaterialModule} from '@common/shared/material/material.module';
import {ExperimentsCommonModule} from '@common/experiments/common-experiments.module';
import {CommonLayoutModule} from '@common/layout/layout.module';
import {EXPERIMENTS_STORE_KEY} from '@common/experiments/shared/common-experiments.const';
import {DebugImagesModule} from '@common/debug-images/debug-images.module';
import {ExperimentInfoExecutionComponent} from '@common/experiments/containers/experiment-info-execution/experiment-info-execution.component';
import {MatSidenavModule} from '@angular/material/sidenav';
import {MatListModule} from '@angular/material/list';
import {MatLegacyListModule as MatListModule} from '@angular/material/legacy-list';
import {ExperimentOutputComponent} from './containers/experiment-ouptut/experiment-output.component';
import {merge, pick} from 'lodash/fp';
import {EXPERIMENTS_PREFIX} from '@common/experiments/actions/common-experiments-view.actions';
import {ExperimentInfoNavbarComponent} from './containers/experiment-info-navbar/experiment-info-navbar.component';
export const experimentSyncedKeys = [
'view.projectColumnsSortOrder',
'view.projectColumnFilter',
'view.projectColumnsWidth',
'view.hiddenProjectTableCols',
'view.metricsCols',
'view.colsOrder',
'output.scalarsHoverMode',
'info.userKnowledge',
'output.settingsList',
];
export const EXPERIMENT_CONFIG_TOKEN =
new InjectionToken<StoreConfig<ExperimentState, any>>('ExperimentConfigToken');
const localStorageKey = '_saved_experiment_state_';
const getExperimentsConfig = () => ({
metaReducers: [reducer => {
let onInit = true;
return (state, action) => {
const nextState = reducer(state, action);
if (onInit) {
onInit = false;
const savedState = JSON.parse(localStorage.getItem(localStorageKey));
return merge(nextState, savedState);
}
if (action.type.startsWith(EXPERIMENTS_PREFIX)) {
localStorage.setItem(localStorageKey, JSON.stringify(pick(['view.tableMode'], nextState)));
}
return nextState;
};
}]
});
import {ExperimentInfoHyperParametersComponent} from '@common/experiments/containers/experiment-info-hyper-parameters/experiment-info-hyper-parameters.component';
import {ExperimentInfoArtifactItemComponent} from '@common/experiments/containers/experiment-info-artifact-item/experiment-info-artifact-item.component';
import {ExperimentGeneralInfoComponent} from '@common/experiments/dumb/experiment-general-info/experiment-general-info.component';
import {ExperimentArtifactItemViewComponent} from '@common/experiments/dumb/experiment-artifact-item-view/experiment-artifact-item-view.component';
import {ExperimentHyperParamsNavbarComponent} from '@common/experiments/dumb/experiment-hyper-params-navbar/experiment-hyper-params-navbar.component';
import {ExperimentExecutionSourceCodeComponent} from '@common/experiments/dumb/experiment-execution-source-code/experiment-execution-source-code.component';
import {ExperimentInfoEditDescriptionComponent} from '@common/experiments/dumb/experiment-info-edit-description/experiment-info-edit-description.component';
import {ExperimentOutputModelViewComponent} from '@common/experiments/dumb/experiment-output-model-view/experiment-output-model-view.component';
import {ExperimentInfoGeneralComponent} from '@common/experiments/containers/experiment-info-general/experiment-info-general.component';
import {BaseClickableArtifactComponent} from '@common/experiments/dumb/base-clickable-artifact.component';
import {ExperimentModelsFormViewComponent} from '@common/experiments/dumb/experiment-models-form-view/experiment-models-form-view.component';
import {ExperimentArtifactsNavbarComponent} from '@common/experiments/dumb/experiment-artifacts-navbar/experiment-artifacts-navbar.component';
import {ExperimentInfoArtifactsComponent} from '@common/experiments/containers/experiment-info-aritfacts/experiment-info-artifacts.component';
import {ExperimentInfoHeaderComponent} from '@common/experiments/dumb/experiment-info-header/experiment-info-header.component';
import {ExperimentInfoTaskModelComponent} from '@common/experiments/containers/experiment-info-task-model/experiment-info-task-model.component';
import {ModelAutoPopulateDialogComponent} from '@common/experiments/dumb/model-auto-populate-dialog/model-auto-populate-dialog.component';
import {ExperimentOutputScalarsComponent} from '@common/experiments/containers/experiment-output-scalars/experiment-output-scalars.component';
import {ExperimentInfoModelComponent} from '@common/experiments/containers/experiment-info-model/experiment-info-model.component';
import {ExperimentInfoHyperParametersFormContainerComponent} from '@common/experiments/containers/experiment-info-hyper-parameters-form-container/experiment-info-hyper-parameters-form-container.component';
import {SharedPipesModule} from '@common/shared/pipes/shared-pipes.module';
import {ExperimentOutputLogModule} from '@common/experiments/shared/experiment-output-log/experiment-output-log.module';
import {RouterModule} from '@angular/router';
import {ScrollingModule} from '@angular/cdk/scrolling';
import {CommonDeleteDialogModule} from '@common/shared/entity-page/entity-delete/common-delete-dialog.module';
import {MatProgressSpinnerModule} from '@angular/material/progress-spinner';
import {MatRadioModule} from '@angular/material/radio';
import {SharedModule} from '~/shared/shared.module';
import {MAT_AUTOCOMPLETE_SCROLL_STRATEGY} from '@angular/material/autocomplete';
import {scrollFactory} from '@common/shared/utils/scroll-factory';
import {Overlay} from '@angular/cdk/overlay';
import {ExperimentsComponent} from '@common/experiments/experiments.component';
@NgModule({
@ -74,7 +59,6 @@ const getExperimentsConfig = () => ({
LayoutModule,
ReactiveFormsModule,
CommonModule,
ExperimentsCommonModule,
SMSharedModule,
ExperimentRouterModule,
ExperimentSharedModule,
@ -86,19 +70,52 @@ const getExperimentsConfig = () => ({
MatSidenavModule,
MatListModule,
AngularSplitModule,
StoreModule.forFeature(EXPERIMENTS_STORE_KEY, experimentsReducers, EXPERIMENT_CONFIG_TOKEN),
EffectsModule.forFeature([ExperimentOutputEffects, ExperimentsMenuEffects]),
SharedPipesModule,
ScrollingModule,
CommonDeleteDialogModule,
SMSharedModule,
RouterModule,
SharedModule,
ExperimentOutputLogModule,
MatProgressSpinnerModule,
MatRadioModule,
ExperimentSharedModule,
],
declarations: [
ExperimentsComponent,
ExperimentInfoExecutionComponent,
ExperimentOutputComponent,
ExperimentInfoNavbarComponent
ExperimentInfoNavbarComponent,
ExperimentInfoNavbarComponent,
BaseClickableArtifactComponent,
ExperimentInfoHeaderComponent,
ExperimentInfoModelComponent,
ExperimentInfoTaskModelComponent,
ExperimentInfoGeneralComponent,
ExperimentGeneralInfoComponent,
ExperimentModelsFormViewComponent,
ExperimentOutputModelViewComponent,
ExperimentExecutionSourceCodeComponent,
ExperimentOutputScalarsComponent,
ModelAutoPopulateDialogComponent,
ExperimentInfoHyperParametersComponent,
ExperimentInfoHyperParametersFormContainerComponent,
ExperimentArtifactsNavbarComponent,
ExperimentInfoArtifactsComponent,
ExperimentHyperParamsNavbarComponent,
ExperimentInfoArtifactItemComponent,
ExperimentArtifactItemViewComponent,
ExperimentInfoEditDescriptionComponent,
],
exports: [
ExperimentsComponent,
ExperimentInfoHeaderComponent,
ExperimentExecutionSourceCodeComponent,
],
providers: [
AdminService,
SmSyncStateSelectorService,
{provide: EXPERIMENT_CONFIG_TOKEN, useFactory: getExperimentsConfig},
{provide: MAT_AUTOCOMPLETE_SCROLL_STRATEGY, useFactory: scrollFactory, deps: [Overlay]},
]
})
export class ExperimentsModule {

View File

View File

@ -1,11 +0,0 @@
import {commonExperimentOutputReducer, CommonExperimentOutputState, initialCommonExperimentOutputState} from '../../../webapp-common/experiments/reducers/common-experiment-output.reducer';
export type ExperimentOutputState = CommonExperimentOutputState;
export const initialState: ExperimentOutputState = {
...initialCommonExperimentOutputState
};
export function experimentOutputReducer(state = initialState, action): ExperimentOutputState {
return commonExperimentOutputReducer(state as CommonExperimentOutputState, action) as ExperimentOutputState;
}

View File

@ -1,5 +0,0 @@
export {
commonExperimentsInitialState as initialState,
commonExperimentsViewReducer as experimentsViewReducer,
CommonExperimentsViewState as ExperimentsViewState
} from '../../../webapp-common/experiments/reducers/common-experiments-view.reducer';

8
src/app/features/experiments/reducers/index.ts Normal file → Executable file
View File

@ -1,7 +1,7 @@
import {ActionReducerMap, createSelector} from '@ngrx/store';
import {experimentsViewReducer, ExperimentsViewState, initialState as viewInitialState} from './experiments-view.reducer';
import {experimentInfoReducer, ExperimentInfoState, initialState as infoInitialState} from './experiment-info.reducer';
import {experimentOutputReducer, ExperimentOutputState, initialState as outputInitialState} from './experiment-output.reducer';
import {experimentOutputReducer, ExperimentOutputState, experimentOutputInitState} from '@common/experiments/reducers/experiment-output.reducer';
import {experimentsViewReducer, ExperimentsViewState, experimentsViewInitialState} from '@common/experiments/reducers/experiments-view.reducer';
import {IExperimentInfo} from '../shared/experiment-info.model';
import {TaskStatusEnum} from '~/business-logic/model/tasks/taskStatusEnum';
import {selectSelectedModel} from '@common/models/reducers';
@ -24,7 +24,7 @@ export const experimentsReducers: ActionReducerMap<ExperimentState, any> = {
export const experiments = state => state.experiments ?? {} as ExperimentState;
// view selectors.
export const experimentsView = createSelector(experiments, state => (state?.view ?? viewInitialState) as ExperimentsViewState);
export const experimentsView = createSelector(experiments, state => (state?.view ?? experimentsViewInitialState) as ExperimentsViewState);
export const selectExperimentsMetricsCols = createSelector(experimentsView, state => state.metricsCols);
export const selectMetricVariants = createSelector(experimentsView, state => state.metricVariants);
export const selectMetricsLoading = createSelector(experimentsView, state => state.metricsLoading);
@ -38,7 +38,7 @@ export const selectShowExtraDataSpinner = createSelector(experimentInfo, state =
// output selectors
export const experimentOutput = createSelector(experiments, state => (state.output ?? outputInitialState) as ExperimentOutputState);
export const experimentOutput = createSelector(experiments, state => (state.output ?? experimentOutputInitState) as ExperimentOutputState);
export const selectIsExperimentEditable = createSelector(selectSelectedExperiment, selectCurrentUser,
(experiment, user): boolean => experiment && experiment.status === TaskStatusEnum.Created && !isReadOnly(experiment) && !isSharedAndNotOwner(experiment, user.company));
export const selectIsSharedAndNotOwner = createSelector(selectSelectedExperiment, selectSelectedModel, selectCurrentUser,

View File

View File

View File

@ -1,22 +1,129 @@
import {NgModule} from '@angular/core';
import {InjectionToken, NgModule} from '@angular/core';
import {CommonModule} from '@angular/common';
import {SMSharedModule} from '../../../webapp-common/shared/shared.module';
import {SMSharedModule} from '@common/shared/shared.module';
import {ExperimentConverterService} from './services/experiment-converter.service';
import { ExperimentMenuComponent } from '../../../webapp-common/experiments/shared/components/experiment-menu/experiment-menu.component';
import { ExperimentMenuComponent } from '@common/experiments/shared/components/experiment-menu/experiment-menu.component';
import {ExperimentMenuExtendedComponent} from '../containers/experiment-menu-extended/experiment-menu-extended.component';
import {GetParamMetricValuePipe} from '@common/experiments/dumb/experiments-table/hyper-param-metric-column/get-param-metric-value.pipe';
import {ExperimentHeaderComponent} from '@common/experiments/dumb/experiment-header/experiment-header.component';
import {SelectHyperParamsForCustomColComponent} from '@common/experiments/dumb/select-hyper-params-for-custom-col/select-hyper-params-for-custom-col.component';
import {ExperimentExecutionParametersComponent} from '@common/experiments/dumb/experiment-execution-parameters/experiment-execution-parameters.component';
import {CloneDialogComponent} from '@common/experiments/shared/components/clone-dialog/clone-dialog.component';
import {HyperParamMetricColumnComponent} from '@common/experiments/dumb/experiments-table/hyper-param-metric-column/hyper-param-metric-column.component';
import {ExperimentSystemTagsComponent} from '@common/experiments/shared/components/experiments-system-tags/experiment-system-tags.component';
import {AbortAllChildrenDialogComponent} from '@common/experiments/shared/components/abort-all-children-dialog/abort-all-children-dialog.component';
import {ExperimentsTableComponent} from '@common/experiments/dumb/experiments-table/experiments-table.component';
import {GetVariantWithoutRoundPipe} from '@common/experiments/dumb/experiments-table/hyper-param-metric-column/get-variant-without-round.pipe';
import {ChangeProjectDialogComponent} from '@common/experiments/shared/components/change-project-dialog/change-project-dialog.component';
import {ExperimentOutputPlotsComponent} from '@common/experiments/containers/experiment-output-plots/experiment-output-plots.component';
import {ExperimentCustomColsMenuComponent} from '@common/experiments/dumb/experiment-custom-cols-menu/experiment-custom-cols-menu.component';
import {SharedPipesModule} from '@common/shared/pipes/shared-pipes.module';
import {EffectsModule} from '@ngrx/effects';
import {CommonExperimentsMenuEffects} from '@common/experiments/effects/common-experiments-menu.effects';
import {CommonExperimentOutputEffects} from '@common/experiments/effects/common-experiment-output.effects';
import {ScrollingModule} from '@angular/cdk/scrolling';
import {ExperimentsMenuEffects} from '~/features/experiments/effects/experiments-menu.effects';
import {ActionReducer, StoreConfig, StoreModule} from '@ngrx/store';
import {CommonLayoutModule} from '@common/layout/layout.module';
import {FormsModule} from '@angular/forms';
import {MatProgressSpinnerModule} from '@angular/material/progress-spinner';
import {ExperimentOutputEffects} from '~/features/experiments/effects/experiment-output.effects';
import {EXPERIMENTS_PREFIX, EXPERIMENTS_STORE_KEY} from '@common/experiments/experiment.consts';
import {ExperimentCompareSharedModule} from '@common/experiments-compare/shared/experiment-compare-shared.module';
import {CommonExperimentsViewEffects} from '@common/experiments/effects/common-experiments-view.effects';
import {ExperimentGraphsModule} from '@common/shared/experiment-graphs/experiment-graphs.module';
import {CommonExperimentsInfoEffects} from '@common/experiments/effects/common-experiments-info.effects';
import {UserPreferences} from '@common/user-preferences';
import {createUserPrefFeatureReducer} from '@common/core/meta-reducers/user-pref-reducer';
import {ExperimentState} from '~/features/experiments/reducers';
import {merge, pick} from 'lodash-es';
import {EXPERIMENTS_OUTPUT_PREFIX} from '@common/experiments/actions/common-experiment-output.actions';
import {EXPERIMENTS_INFO_PREFIX} from '@common/experiments/actions/common-experiments-info.actions';
import {experimentsReducers} from '~/features/experiments/reducers';
import {CommonExperimentConverterService} from '@common/experiments/shared/services/common-experiment-converter.service';
export const experimentSyncedKeys = [
'view.projectColumnsSortOrder',
'view.projectColumnFilters',
'view.projectColumnsWidth',
'view.hiddenProjectTableCols',
'view.metricsCols',
'view.colsOrder',
'output.scalarsHoverMode',
'info.userKnowledge',
'output.settingsList',
];
export const EXPERIMENT_CONFIG_TOKEN =
new InjectionToken<StoreConfig<ExperimentState, any>>('ExperimentConfigToken');
const localStorageKey = '_saved_experiment_state_';
export const getExperimentsConfig = (userPreferences: UserPreferences) => ({
metaReducers: [
reducer => {
let onInit = true;
return (state, action) => {
const nextState = reducer(state, action);
if (onInit) {
onInit = false;
const savedState = JSON.parse(localStorage.getItem(localStorageKey));
return merge({}, nextState, savedState);
}
if (action.type.startsWith(EXPERIMENTS_PREFIX)) {
localStorage.setItem(localStorageKey, JSON.stringify(pick(nextState, ['view.tableMode'])));
}
return nextState;
};
},
(reducer: ActionReducer<any>) =>
createUserPrefFeatureReducer(EXPERIMENTS_STORE_KEY, experimentSyncedKeys, [EXPERIMENTS_PREFIX, EXPERIMENTS_INFO_PREFIX, EXPERIMENTS_OUTPUT_PREFIX], userPreferences, reducer),
]
});
const DECLARATIONS = [
ExperimentMenuComponent,
ExperimentMenuExtendedComponent,
ExperimentSystemTagsComponent,
ChangeProjectDialogComponent,
CloneDialogComponent,
AbortAllChildrenDialogComponent,
ExperimentExecutionParametersComponent,
ExperimentsTableComponent,
HyperParamMetricColumnComponent,
GetParamMetricValuePipe,
GetVariantWithoutRoundPipe,
ExperimentHeaderComponent,
ExperimentCustomColsMenuComponent,
SelectHyperParamsForCustomColComponent,
ExperimentOutputPlotsComponent,
];
@NgModule({
imports : [
SMSharedModule,
CommonModule
CommonModule,
FormsModule,
StoreModule.forFeature(EXPERIMENTS_STORE_KEY, experimentsReducers, EXPERIMENT_CONFIG_TOKEN),
EffectsModule.forFeature([
ExperimentOutputEffects, ExperimentsMenuEffects,
CommonExperimentsViewEffects,
CommonExperimentsInfoEffects,
CommonExperimentOutputEffects,
CommonExperimentsMenuEffects
]),
SharedPipesModule,
ExperimentCompareSharedModule,
ExperimentGraphsModule,
MatProgressSpinnerModule,
ScrollingModule,
CommonLayoutModule,
],
declarations : [...DECLARATIONS],
providers : [ExperimentConverterService],
providers : [
ExperimentConverterService,
CommonExperimentConverterService,
{provide: EXPERIMENT_CONFIG_TOKEN, useFactory: getExperimentsConfig, deps: [UserPreferences]},
],
exports : [...DECLARATIONS]
})
export class ExperimentSharedModule {

View File

View File

View File

View File

@ -3,7 +3,7 @@ import {TasksEditRequest} from '../../../../business-logic/model/tasks/tasksEdit
import {IExperimentInfo, ISelectedExperiment} from '../experiment-info.model';
import {IExecutionForm} from '../experiment-execution.model';
import {Execution} from '../../../../business-logic/model/tasks/execution';
import {isEqual} from 'lodash/fp';
import {isEqual} from 'lodash-es';
import {CommonExperimentConverterService} from '../../../../webapp-common/experiments/shared/services/common-experiment-converter.service';
import {IHyperParamsForm} from '../../../../webapp-common/experiments/shared/experiment-hyper-params.model';
import {IExperimentModelInfo} from '../../../../webapp-common/experiments/shared/common-experiment-model.model';

0
src/app/features/login/login.actions.ts Normal file → Executable file
View File

View File

@ -5,16 +5,17 @@ import { CommonModule } from '@angular/common';
import { LoginRoutingModule } from './login-routing.module';
import { MatAutocompleteModule } from '@angular/material/autocomplete';
import {MatProgressSpinnerModule} from '@angular/material/progress-spinner';
import {MatCheckboxModule} from '@angular/material/checkbox';
import { MatLegacyAutocompleteModule as MatAutocompleteModule } from '@angular/material/legacy-autocomplete';
import {MatLegacyProgressSpinnerModule as MatProgressSpinnerModule} from '@angular/material/legacy-progress-spinner';
import {MatLegacyCheckboxModule as MatCheckboxModule} from '@angular/material/legacy-checkbox';
import {SignupComponent} from './signup/signup.component';
import {MatFormFieldModule} from '@angular/material/form-field';
import {MatSelectModule} from '@angular/material/select';
import {MatInputModule} from '@angular/material/input';
import {MatRadioModule} from '@angular/material/radio';
import {MatLegacyFormFieldModule as MatFormFieldModule} from '@angular/material/legacy-form-field';
import {MatLegacySelectModule as MatSelectModule} from '@angular/material/legacy-select';
import {MatLegacyInputModule as MatInputModule} from '@angular/material/legacy-input';
import {MatLegacyRadioModule as MatRadioModule} from '@angular/material/legacy-radio';
import {LoginComponent} from '@common/login/login/login.component';
import {SharedPipesModule} from '@common/shared/pipes/shared-pipes.module';
import {NtkmeButtonModule} from '@ctrl/ngx-github-buttons';
@NgModule({
declarations: [LoginComponent, SignupComponent],
@ -32,6 +33,7 @@ import {SharedPipesModule} from '@common/shared/pipes/shared-pipes.module';
MatInputModule,
MatRadioModule,
SharedPipesModule,
NtkmeButtonModule,
]
})
export class LoginModule { }

View File

@ -1,9 +1,10 @@
import {NgModule} from '@angular/core';
import {CommonModule} from '@angular/common';
import { ModelMenuComponent } from '../../webapp-common/models/containers/model-menu/model-menu.component';
import {SMSharedModule} from '../../webapp-common/shared/shared.module';
import {CommonLayoutModule} from '../../webapp-common/layout/layout.module';
import { ModelMenuComponent } from '@common/models/containers/model-menu/model-menu.component';
import {SMSharedModule} from '@common/shared/shared.module';
import {CommonLayoutModule} from '@common/layout/layout.module';
import { ModelMenuExtendedComponent } from './containers/model-menu-extended/model-menu-extended.component';
import {SharedPipesModule} from '@common/shared/pipes/shared-pipes.module';
@NgModule({
declarations: [ModelMenuComponent, ModelMenuExtendedComponent],
@ -11,7 +12,8 @@ import { ModelMenuExtendedComponent } from './containers/model-menu-extended/mod
imports : [
CommonLayoutModule,
CommonModule,
SMSharedModule
SMSharedModule,
SharedPipesModule
]
})
export class FeatureModelsModule {

View File

@ -0,0 +1,19 @@
import {NgModule} from '@angular/core';
import {
NestedProjectViewPageExtendedComponent
} from './nested-project-view-page-extended/nested-project-view-page-extended.component';
import {NestedProjectViewModule} from "@common/nested-project-view/nested-project-view.module";
import {CommonModule} from "@angular/common";
@NgModule({
declarations: [
NestedProjectViewPageExtendedComponent,
],
exports: [NestedProjectViewPageExtendedComponent],
imports: [
CommonModule,
NestedProjectViewModule,
]
})
export class FeatureNestedProjectViewModule { }

View File

@ -0,0 +1,2 @@
<sm-nested-project-view-page>
</sm-nested-project-view-page>

View File

@ -0,0 +1,33 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { NestedProjectViewPageExtendedComponent } from './nested-project-view-page-extended.component';
import {StoreModule} from '@ngrx/store';
import {RouterTestingModule} from '@angular/router/testing';
import {MatLegacyDialogModule as MatDialogModule} from '@angular/material/legacy-dialog';
describe('PipelinesPageComponent', () => {
let component: NestedProjectViewPageExtendedComponent;
let fixture: ComponentFixture<NestedProjectViewPageExtendedComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ NestedProjectViewPageExtendedComponent ],
imports: [
StoreModule.forRoot({}),
RouterTestingModule,
MatDialogModule
]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(NestedProjectViewPageExtendedComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,14 @@
import {Component, OnDestroy, OnInit} from '@angular/core';
import {
NestedProjectViewPageComponent
} from "@common/nested-project-view/nested-project-view-page/nested-project-view-page.component";
@Component({
selector: 'sm-nested-project-view-page-extended',
templateUrl: './nested-project-view-page-extended.component.html',
styleUrls: ['./nested-project-view-page-extended.component.scss']
})
export class NestedProjectViewPageExtendedComponent extends NestedProjectViewPageComponent implements OnInit, OnDestroy {
}

View File

@ -0,0 +1,31 @@
import {EntityTypeEnum} from "~/shared/constants/non-common-consts";
export enum EntityTypePluralEnum {
pipelines = 'pipelines',
datasets = 'datasets',
reports = 'reports',
}
export const getEntityTypeFromUrlConf = (conf: string[]): string => {
return conf[0];
};
export const getDatasetUrlPrefix = (entityType)=> 'simple';
export const getNestedEntityBaseUrl = (entityType) => entityType;
export const isDatasetType = (entityType) => entityType === EntityTypePluralEnum.datasets ;
export const datasetLabel = (entityType) => 'DATASETS' ;
export const getNestedEntityName = (entityType: string): EntityTypeEnum => {
switch (entityType) {
case EntityTypePluralEnum.datasets:
return EntityTypeEnum.simpleDataset;
case EntityTypePluralEnum.reports:
return EntityTypeEnum.report;
case EntityTypePluralEnum.pipelines:
return EntityTypeEnum.pipeline;
default:
return EntityTypeEnum.project;
}
};

0
src/app/features/not-found/not-found-routing.module.ts Normal file → Executable file
View File

0
src/app/features/not-found/not-found.module.ts Normal file → Executable file
View File

View File

View File

View File

28
src/app/features/projects/projects-page.utils.ts Normal file → Executable file
View File

@ -1,3 +1,13 @@
import {ActivatedRouteSnapshot} from "@angular/router";
import {
getDatasetsRequest,
getPipelineRequest,
getReportRequest,
isPipelines,
isReports
} from "@common/projects/common-projects.utils";
import {ProjectsGetAllExRequest} from "~/business-logic/model/projects/projectsGetAllExRequest";
export const isDeletableProject = readyForDeletion => (readyForDeletion.experiments.unarchived + readyForDeletion.models.unarchived) === 0;
export const popupEntitiesListConst = 'experiments or model';
@ -6,3 +16,21 @@ export const getDeleteProjectPopupStatsBreakdown = (readyForDeletion, statsSubse
${readyForDeletion.models[statsSubset] > 0 ? readyForDeletion.models[statsSubset] + ' models ' : ''}`;
export const readyForDeletionFilter = readyForDeletion => !(readyForDeletion.experiments === null || readyForDeletion.models === null);
export const isDatasets = (snapshot: ActivatedRouteSnapshot) => snapshot.firstChild.routeConfig.path === 'datasets';
export const routeConfToProjectType = (routeConf: string[]) => routeConf[0];
export const getFeatureProjectRequest = (snapshot: ActivatedRouteSnapshot, nested: boolean, searchQuery: any, selectedProjectName: any, selectedProjectId: any): ProjectsGetAllExRequest => {
const pipelines = isPipelines(snapshot);
const reports = isReports(snapshot);
const datasets = isDatasets(snapshot);
return {
...(pipelines && getPipelineRequest(nested, searchQuery, selectedProjectName, selectedProjectId)),
...(reports && getReportRequest(nested, searchQuery, selectedProjectName, selectedProjectId)),
...(datasets && getDatasetsRequest(nested, searchQuery, selectedProjectName, selectedProjectId)),
};
};
export const getSelfFeatureProjectRequest = (snapshot: ActivatedRouteSnapshot) => ({
});

View File

@ -8,6 +8,10 @@ import {ProjectCardMenuComponent} from '@common/shared/ui-components/panel/proje
import {PipelineCardComponent} from '@common/pipelines/pipeline-card/pipeline-card.component';
import {PipelineCardMenuComponent} from '@common/pipelines/pipeline-card-menu/pipeline-card-menu.component';
import {ScrollingModule} from '@angular/cdk/scrolling';
import {DatasetEmptyComponent} from '@common/datasets/dataset-empty/dataset-empty.component';
import {NestedCardComponent} from '@common/nested-project-view/nested-card/nested-card.component';
import {SharedPipesModule} from '@common/shared/pipes/shared-pipes.module';
import {PipelinesEmptyStateComponent} from '@common/pipelines/pipelines-page/pipelines-empty-state/pipelines-empty-state.component';
const _declarations = [
ProjectCardComponent,
@ -15,6 +19,8 @@ const _declarations = [
ProjectCardMenuExtendedComponent,
PipelineCardComponent,
PipelineCardMenuComponent,
NestedCardComponent,
DatasetEmptyComponent,
];
@NgModule({
@ -23,10 +29,11 @@ const _declarations = [
FormsModule,
ReactiveFormsModule,
SMSharedModule,
ScrollingModule
ScrollingModule,
SharedPipesModule
],
declarations: [..._declarations],
exports: [..._declarations]
declarations: [..._declarations, PipelinesEmptyStateComponent],
exports: [..._declarations, PipelinesEmptyStateComponent]
})
export class ProjectsSharedModule {
}

View File

@ -1,5 +1,5 @@
import {Component, Inject} from '@angular/core';
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
import {Store} from '@ngrx/store';
import {updateCredentialLabel} from '@common/core/actions/common-auth.actions';
import {OrganizationGetUserCompaniesResponseCompanies} from '~/business-logic/model/organization/organizationGetUserCompaniesResponseCompanies';

View File

@ -1,5 +1,5 @@
import { Component, OnInit } from '@angular/core';
import { MatSlideToggleChange } from '@angular/material/slide-toggle';
import { MatLegacySlideToggleChange as MatSlideToggleChange } from '@angular/material/legacy-slide-toggle';
import {Store} from '@ngrx/store';
import {selectAllowed} from '~/core/reducers/usage-stats.reducer';
import {Observable} from 'rxjs';

View File

@ -6,7 +6,7 @@ import {filter, take} from 'rxjs/operators';
import {createCredential, credentialRevoked, getAllCredentials, resetCredential, updateCredentialLabel} from '@common/core/actions/common-auth.actions';
import {Store} from '@ngrx/store';
import {GetCurrentUserResponseUserObject} from '~/business-logic/model/users/getCurrentUserResponseUserObject';
import {MatDialog} from '@angular/material/dialog';
import {MatLegacyDialog as MatDialog} from '@angular/material/legacy-dialog';
import {CreateCredentialDialogComponent} from '~/features/settings/containers/admin/create-credential-dialog/create-credential-dialog.component';
@Component({

View File

@ -22,6 +22,8 @@ import {UserDataComponent} from '~/features/settings/containers/admin/user-data/
import {UsageStatsComponent} from '~/features/settings/containers/admin/usage-stats/usage-stats.component';
import {CreateCredentialDialogComponent} from '~/features/settings/containers/admin/create-credential-dialog/create-credential-dialog.component';
import {RedactedArgumentsDialogComponent} from '@common/settings/admin/redacted-arguments-dialog/redacted-arguments-dialog.component';
import {LayoutModule} from '~/layout/layout.module';
import {SharedPipesModule} from '@common/shared/pipes/shared-pipes.module';
@ -53,6 +55,8 @@ import {RedactedArgumentsDialogComponent} from '@common/settings/admin/redacted-
SharedModule,
MatExpansionModule,
FormsModule,
LayoutModule,
SharedPipesModule
],
exports: [
UserCredentialsComponent,

View File

@ -1,35 +1,33 @@
import {NgModule} from '@angular/core';
import {FormsModule} from '@angular/forms';
import {CommonModule} from '@angular/common';
import {WorkersAndQueuesRoutingModule} from '../../webapp-common/workers-and-queues/workers-and-queues-routing.module';
import {WorkersAndQueuesComponent} from '../../webapp-common/workers-and-queues/workers-and-queues.component';
import {WorkersComponent} from '../../webapp-common/workers-and-queues/containers/workers/workers.component';
import {QueuesComponent} from '../../webapp-common/workers-and-queues/containers/queues/queues.component';
import {SMSharedModule} from '../../webapp-common/shared/shared.module';
import {WorkersTableComponent} from '../../webapp-common/workers-and-queues/dumb/workers-table/workers-table.component';
import {QueueTaskTableComponent} from '../../webapp-common/workers-and-queues/dumb/queue-task-table/queue-task-table.component';
import {reducers} from '../../webapp-common/workers-and-queues/reducers/index.reducer';
import {WorkersAndQueuesRoutingModule} from '@common/workers-and-queues/workers-and-queues-routing.module';
import {WorkersAndQueuesComponent} from '@common/workers-and-queues/workers-and-queues.component';
import {WorkersComponent} from '@common/workers-and-queues/containers/workers/workers.component';
import {QueuesComponent} from '@common/workers-and-queues/containers/queues/queues.component';
import {SMSharedModule} from '@common/shared/shared.module';
import {WorkersTableComponent} from '@common/workers-and-queues/dumb/workers-table/workers-table.component';
import {QueueTaskTableComponent} from '@common/workers-and-queues/dumb/queue-task-table/queue-task-table.component';
import {reducers} from '@common/workers-and-queues/reducers/index.reducer';
import {StoreModule} from '@ngrx/store';
import {EffectsModule} from '@ngrx/effects';
import {WorkersEffects} from '../../webapp-common/workers-and-queues/effects/workers.effects';
import {WorkersStatsComponent} from '../../webapp-common/workers-and-queues/containers/workers-stats/workers-stats.component';
import {WorkerInfoComponent} from '../../webapp-common/workers-and-queues/dumb/worker-info/worker-info.component';
import {WorkersEffects} from '@common/workers-and-queues/effects/workers.effects';
import {WorkersStatsComponent} from '@common/workers-and-queues/containers/workers-stats/workers-stats.component';
import {WorkerInfoComponent} from '@common/workers-and-queues/dumb/worker-info/worker-info.component';
import {AngularSplitModule} from 'angular-split';
import {QueuesTableComponent} from '../../webapp-common/workers-and-queues/dumb/queues-table/queues-table.component';
import {QueueInfoComponent} from '../../webapp-common/workers-and-queues/dumb/queue-info/queue-info.component';
import {QueuesEffect} from '../../webapp-common/workers-and-queues/effects/queues.effects';
import {SharedPipesModule} from '../../webapp-common/shared/pipes/shared-pipes.module';
import {QueueStatsComponent} from '../../webapp-common/workers-and-queues/containers/queue-stats/queue-stats.component';
import {SharedModule} from '../../shared/shared.module';
import {ExperimentSharedModule} from '../experiments/shared/experiment-shared.module';
import {QueueCreateDialogModule} from '../../webapp-common/shared/queue-create-dialog/queue-create-dialog.module';
import {SelectQueueModule} from '../../webapp-common/experiments/shared/components/select-queue/select-queue.module';
import {QueuesMenuComponent} from '../../webapp-common/workers-and-queues/dumb/queues-menu/queues-menu.component';
import {QueuesTableComponent} from '@common/workers-and-queues/dumb/queues-table/queues-table.component';
import {QueueInfoComponent} from '@common/workers-and-queues/dumb/queue-info/queue-info.component';
import {QueuesEffect} from '@common/workers-and-queues/effects/queues.effects';
import {SharedPipesModule} from '@common/shared/pipes/shared-pipes.module';
import {QueueStatsComponent} from '@common/workers-and-queues/containers/queue-stats/queue-stats.component';
import {SharedModule} from '~/shared/shared.module';
import {QueueCreateDialogModule} from '@common/shared/queue-create-dialog/queue-create-dialog.module';
import {SelectQueueModule} from '@common/experiments/shared/components/select-queue/select-queue.module';
import {QueuesMenuComponent} from '@common/workers-and-queues/dumb/queues-menu/queues-menu.component';
import {QueuesMenuExtendedComponent} from './queues-menu-extended/queues-menu-extended.component';
@NgModule({
imports: [
ExperimentSharedModule,
SharedPipesModule,
CommonModule,
WorkersAndQueuesRoutingModule,

View File

@ -12,3 +12,10 @@ export const selectBreadcrumbsStringsBase = createSelector(
selectSelectedProject, selectSelectedExperiment, selectSelectedTableModel, selectRootProjects, selectReport,
(project, experiment, model, projects, report) =>
({project, experiment, model, projects, report}) as IBreadcrumbs);
export enum NestedProjectTypeUrlEnum {
pipelines = 'pipelines',
datasets = 'datasets/simple',
reports = 'reports',
projects = 'projects'
}

0
src/app/layout/side-nav/side-nav.component.html Normal file → Executable file
View File

0
src/app/layout/side-nav/side-nav.component.scss Normal file → Executable file
View File

0
src/app/layout/side-nav/side-nav.component.ts Normal file → Executable file
View File

View File

@ -8,7 +8,8 @@ export enum EntityTypeEnum {
pipeline = 'pipeline',
controller = 'pipeline run',
dataset = 'version',
simpleDataset = 'dataset'
simpleDataset = 'dataset',
report = 'report',
}
export enum CircleTypeEnum {
@ -17,6 +18,7 @@ export enum CircleTypeEnum {
pending = 'pending',
failed = 'failed',
empty = 'empty',
published = 'published',
'model-labels' = 'model-labels'
}

View File

@ -1,48 +1 @@
import {Injectable} from '@angular/core';
import {Router} from '@angular/router';
import {HttpClient} from '@angular/common/http';
import {MatDialog} from '@angular/material/dialog';
import {Store} from '@ngrx/store';
import {EMPTY} from 'rxjs';
import {ApiLoginService} from '~/business-logic/api-services/login.service';
import {BaseLoginService} from '@common/shared/services/login.service';
import {ConfigurationService} from '@common/shared/services/configuration.service';
import {UserPreferences} from '@common/user-preferences';
@Injectable({
providedIn: 'root'
})
export class LoginService extends BaseLoginService {
constructor(
protected httpClient: HttpClient,
protected loginApi: ApiLoginService,
protected dialog: MatDialog,
protected configService: ConfigurationService,
protected store: Store,
protected router: Router,
protected userPreferences: UserPreferences
) {
super(httpClient, loginApi, dialog, configService, store, router, userPreferences);
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
signup(signupInfo) {
return EMPTY;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
getInviteInfo(inviteId: string) {
return EMPTY;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
ssoLogin(params) {
return EMPTY;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
ssoFlow(resolve) {
}
}
export {BaseLoginService as LoginService} from '@common/shared/services/login.service';

View File

@ -3,7 +3,7 @@
@font-face {
font-family: '#{$icomoon-font-family}';
src: url('./#{$icomoon-font-family}.ttf?s4ibjb') format('truetype');
src: url('./#{$icomoon-font-family}.ttf?i5mliw') format('truetype');
font-weight: normal;
font-style: normal;
font-display: block;
@ -24,6 +24,21 @@
-moz-osx-font-smoothing: grayscale;
}
.al-ico-ghost {
&:before {
content: $al-ico-ghost;
}
}
.al-ico-flat-view {
&:before {
content: $al-ico-flat-view;
}
}
.al-ico-camera {
&:before {
content: $al-ico-camera;
}
}
.al-ico-markdown {
&:before {
content: $al-ico-markdown;

3
src/app/webapp-common/assets/fonts/variables.scss Normal file → Executable file
View File

@ -1,6 +1,9 @@
$icomoon-font-family: "trains" !default;
$icomoon-font-path: "fonts" !default;
$al-ico-ghost: "\e9ef";
$al-ico-flat-view: "\e9ee";
$al-ico-camera: "\e9ed";
$al-ico-markdown: "\e9ec";
$al-ico-hor-expand: "\e9ea";
$al-ico-hor-minimize: "\e9eb";

0
src/app/webapp-common/assets/icons/alert-all-grey.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

0
src/app/webapp-common/assets/icons/alert-all-neon.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

0
src/app/webapp-common/assets/icons/alert-purple.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 566 B

After

Width:  |  Height:  |  Size: 566 B

Some files were not shown because too many files have changed in this diff Show More