mirror of
https://github.com/clearml/clearml-web
synced 2025-01-30 22:17:22 +00:00
release v1.10 (#51)
This commit is contained in:
parent
8f6029cf5f
commit
29c68abeb4
13529
package-lock.json
generated
13529
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
124
package.json
124
package.json
@ -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
0
src/app/app.component.html
Normal file → Executable file
0
src/app/app.component.scss
Normal file → Executable file
0
src/app/app.component.scss
Normal file → Executable file
14
src/app/app.component.ts
Normal file → Executable file
14
src/app/app.component.ts
Normal file → Executable 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
0
src/app/app.constants.ts
Normal file → Executable file
11
src/app/app.module.ts
Normal file → Executable file
11
src/app/app.module.ts
Normal file → Executable 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
3
src/app/app.routes.ts
Normal file → Executable 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)
|
||||
},
|
||||
|
0
src/app/business-logic/api-services/api-requests.service.ts
Normal file → Executable file
0
src/app/business-logic/api-services/api-requests.service.ts
Normal file → Executable file
0
src/app/business-logic/business-logic.module.ts
Normal file → Executable file
0
src/app/business-logic/business-logic.module.ts
Normal file → Executable file
0
src/app/business-logic/configuration.ts
Normal file → Executable file
0
src/app/business-logic/configuration.ts
Normal file → Executable file
0
src/app/business-logic/constants.ts
Normal file → Executable file
0
src/app/business-logic/constants.ts
Normal file → Executable file
0
src/app/business-logic/encoder.ts
Normal file → Executable file
0
src/app/business-logic/encoder.ts
Normal file → Executable file
0
src/app/business-logic/model/al-task.ts
Normal file → Executable file
0
src/app/business-logic/model/al-task.ts
Normal file → Executable file
0
src/app/business-logic/model/api-request.ts
Normal file → Executable file
0
src/app/business-logic/model/api-request.ts
Normal file → Executable file
@ -29,4 +29,5 @@ export interface EventsGetTaskPlotsRequest {
|
||||
* List of metrics and variants
|
||||
*/
|
||||
metrics?: Array<object>;
|
||||
model_events?: boolean;
|
||||
}
|
||||
|
@ -27,4 +27,5 @@ export interface EventsScalarMetricsIterHistogramRequest {
|
||||
* List of metrics and variants
|
||||
*/
|
||||
metrics?: Array<object>;
|
||||
model_events?: boolean;
|
||||
}
|
||||
|
@ -67,4 +67,5 @@ export interface Project {
|
||||
|
||||
own_tasks?: number;
|
||||
own_models?: number;
|
||||
hidden?: boolean;
|
||||
}
|
||||
|
@ -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';
|
||||
|
@ -11,9 +11,12 @@
|
||||
*/
|
||||
|
||||
import { StatsStatusCount } from '././statsStatusCount';
|
||||
import { StatsDatasets } from '././statsDatasets';
|
||||
|
||||
|
||||
export interface Stats {
|
||||
active?: StatsStatusCount;
|
||||
archived?: StatsStatusCount;
|
||||
datasets?: StatsDatasets;
|
||||
|
||||
}
|
||||
|
24
src/app/business-logic/model/projects/statsDatasets.ts
Normal file
24
src/app/business-logic/model/projects/statsDatasets.ts
Normal 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>;
|
||||
}
|
@ -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
1
src/app/business-logic/services/models.service.ts
Normal file → Executable 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
3
src/app/business-logic/services/tasks.service.ts
Normal file → Executable 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
0
src/app/business-logic/variables.ts
Normal file → Executable file
22
src/app/core/core.module.ts
Normal file → Executable file
22
src/app/core/core.module.ts
Normal file → Executable 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>) =>
|
||||
|
@ -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
10
src/app/core/effects/users.effects.ts
Normal file → Executable 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
0
src/app/core/models/actions.ts
Normal file → Executable file
0
src/app/core/models/model-data.ts
Normal file → Executable file
0
src/app/core/models/model-data.ts
Normal file → Executable file
0
src/app/core/reducers/recent-tasks-reducer.ts
Normal file → Executable file
0
src/app/core/reducers/recent-tasks-reducer.ts
Normal file → Executable file
0
src/app/core/reducers/sources-reducer.ts
Normal file → Executable file
0
src/app/core/reducers/sources-reducer.ts
Normal file → Executable 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
0
src/app/features/dashboard/dashboard-routing.module.ts
Normal file → Executable file
0
src/app/features/dashboard/dashboard.component.html
Normal file → Executable file
0
src/app/features/dashboard/dashboard.component.html
Normal file → Executable file
0
src/app/features/dashboard/dashboard.component.scss
Normal file → Executable file
0
src/app/features/dashboard/dashboard.component.scss
Normal file → Executable file
2
src/app/features/dashboard/dashboard.component.ts
Normal file → Executable file
2
src/app/features/dashboard/dashboard.component.ts
Normal file → Executable 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
0
src/app/features/dashboard/dashboard.module.ts
Normal file → Executable file
0
src/app/features/dashboard/dumb/getting-started-card/getting-started-card.component.html
Normal file → Executable file
0
src/app/features/dashboard/dumb/getting-started-card/getting-started-card.component.html
Normal file → Executable file
0
src/app/features/dashboard/dumb/getting-started-card/getting-started-card.component.scss
Normal file → Executable file
0
src/app/features/dashboard/dumb/getting-started-card/getting-started-card.component.scss
Normal file → Executable file
0
src/app/features/dashboard/dumb/getting-started-card/getting-started-card.component.ts
Normal file → Executable file
0
src/app/features/dashboard/dumb/getting-started-card/getting-started-card.component.ts
Normal file → Executable file
0
src/app/features/dashboard/dumb/search-results-page/search-results-page.component.html
Normal file → Executable file
0
src/app/features/dashboard/dumb/search-results-page/search-results-page.component.html
Normal file → Executable file
0
src/app/features/dashboard/dumb/search-results-page/search-results-page.component.scss
Normal file → Executable file
0
src/app/features/dashboard/dumb/search-results-page/search-results-page.component.scss
Normal file → Executable file
0
src/app/features/dashboard/dumb/search-results-page/search-results-page.component.ts
Normal file → Executable file
0
src/app/features/dashboard/dumb/search-results-page/search-results-page.component.ts
Normal file → Executable 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',
|
||||
|
@ -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: []
|
||||
|
2
src/app/features/datasets/shared/datasets-shared.module.ts
Normal file → Executable file
2
src/app/features/datasets/shared/datasets-shared.module.ts
Normal file → Executable 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]
|
||||
|
0
src/app/features/delete-entity/delete-dialog.effects.ts
Normal file → Executable file
0
src/app/features/delete-entity/delete-dialog.effects.ts
Normal file → Executable file
0
src/app/features/experiments/actions/experiments-info.actions.ts
Normal file → Executable file
0
src/app/features/experiments/actions/experiments-info.actions.ts
Normal file → Executable file
0
src/app/features/experiments/experiments-routing.module.ts
Normal file → Executable file
0
src/app/features/experiments/experiments-routing.module.ts
Normal file → Executable file
@ -1 +0,0 @@
|
||||
<sm-common-experiments></sm-common-experiments>
|
@ -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
0
src/app/features/experiments/experiments.consts.ts
Normal file → Executable file
123
src/app/features/experiments/experiments.module.ts
Normal file → Executable file
123
src/app/features/experiments/experiments.module.ts
Normal file → Executable 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 {
|
||||
|
0
src/app/features/experiments/reducers/experiment-info.reducer.ts
Normal file → Executable file
0
src/app/features/experiments/reducers/experiment-info.reducer.ts
Normal file → Executable 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;
|
||||
}
|
@ -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
8
src/app/features/experiments/reducers/index.ts
Normal file → Executable 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,
|
||||
|
0
src/app/features/experiments/shared/experiment-execution.model.ts
Normal file → Executable file
0
src/app/features/experiments/shared/experiment-execution.model.ts
Normal file → Executable file
0
src/app/features/experiments/shared/experiment-info.model.ts
Normal file → Executable file
0
src/app/features/experiments/shared/experiment-info.model.ts
Normal file → Executable file
117
src/app/features/experiments/shared/experiment-shared.module.ts
Normal file → Executable file
117
src/app/features/experiments/shared/experiment-shared.module.ts
Normal file → Executable 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 {
|
||||
|
0
src/app/features/experiments/shared/experiments.const.ts
Normal file → Executable file
0
src/app/features/experiments/shared/experiments.const.ts
Normal file → Executable file
0
src/app/features/experiments/shared/experiments.model.ts
Normal file → Executable file
0
src/app/features/experiments/shared/experiments.model.ts
Normal file → Executable file
0
src/app/features/experiments/shared/experiments.utils.ts
Normal file → Executable file
0
src/app/features/experiments/shared/experiments.utils.ts
Normal file → Executable file
2
src/app/features/experiments/shared/services/experiment-converter.service.ts
Normal file → Executable file
2
src/app/features/experiments/shared/services/experiment-converter.service.ts
Normal file → Executable 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/experiments/shared/services/experiment-reverter.service.ts
Normal file → Executable file
0
src/app/features/experiments/shared/services/experiment-reverter.service.ts
Normal file → Executable file
0
src/app/features/login/login.actions.ts
Normal file → Executable file
0
src/app/features/login/login.actions.ts
Normal file → Executable 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 { }
|
||||
|
@ -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 {
|
||||
|
@ -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 { }
|
@ -0,0 +1,2 @@
|
||||
<sm-nested-project-view-page>
|
||||
</sm-nested-project-view-page>
|
@ -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();
|
||||
});
|
||||
});
|
@ -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 {
|
||||
|
||||
}
|
@ -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
0
src/app/features/not-found/not-found-routing.module.ts
Normal file → Executable file
0
src/app/features/not-found/not-found.module.ts
Normal file → Executable file
0
src/app/features/not-found/not-found.module.ts
Normal file → Executable file
0
src/app/features/not-found/not-found/not-found.component.html
Normal file → Executable file
0
src/app/features/not-found/not-found/not-found.component.html
Normal file → Executable file
0
src/app/features/not-found/not-found/not-found.component.scss
Normal file → Executable file
0
src/app/features/not-found/not-found/not-found.component.scss
Normal file → Executable file
0
src/app/features/not-found/not-found/not-found.component.ts
Normal file → Executable file
0
src/app/features/not-found/not-found/not-found.component.ts
Normal file → Executable file
28
src/app/features/projects/projects-page.utils.ts
Normal file → Executable file
28
src/app/features/projects/projects-page.utils.ts
Normal file → Executable 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) => ({
|
||||
});
|
||||
|
13
src/app/features/projects/shared/projects-shared.module.ts
Normal file → Executable file
13
src/app/features/projects/shared/projects-shared.module.ts
Normal file → Executable 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 {
|
||||
}
|
||||
|
@ -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';
|
||||
|
@ -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';
|
||||
|
@ -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({
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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
0
src/app/layout/side-nav/side-nav.component.html
Normal file → Executable file
0
src/app/layout/side-nav/side-nav.component.scss
Normal file → Executable file
0
src/app/layout/side-nav/side-nav.component.scss
Normal file → Executable file
0
src/app/layout/side-nav/side-nav.component.ts
Normal file → Executable file
0
src/app/layout/side-nav/side-nav.component.ts
Normal file → Executable 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'
|
||||
}
|
||||
|
||||
|
@ -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';
|
||||
|
@ -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;
|
||||
|
Binary file not shown.
3
src/app/webapp-common/assets/fonts/variables.scss
Normal file → Executable file
3
src/app/webapp-common/assets/fonts/variables.scss
Normal file → Executable 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
0
src/app/webapp-common/assets/icons/alert-all-grey.svg
Normal file → Executable 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
0
src/app/webapp-common/assets/icons/alert-all-neon.svg
Normal file → Executable 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
0
src/app/webapp-common/assets/icons/alert-purple.svg
Normal file → Executable 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
Loading…
Reference in New Issue
Block a user