diff --git a/discovery-frontend/src/app/common/component/data-preview/data.preview.component.html b/discovery-frontend/src/app/common/component/data-preview/data.preview.component.html index d103ba6fa6..d45e172f15 100644 --- a/discovery-frontend/src/app/common/component/data-preview/data.preview.component.html +++ b/discovery-frontend/src/app/common/component/data-preview/data.preview.component.html @@ -493,7 +493,7 @@ {{'msg.metadata.th.dictionary' | translate}} - {{selectedField.dictionary?.name}} + {{selectedField.dictionary?.logicalName}} diff --git a/discovery-frontend/src/app/common/component/data-preview/data.preview.component.ts b/discovery-frontend/src/app/common/component/data-preview/data.preview.component.ts index 21339f1b3c..fe1ba60b34 100644 --- a/discovery-frontend/src/app/common/component/data-preview/data.preview.component.ts +++ b/discovery-frontend/src/app/common/component/data-preview/data.preview.component.ts @@ -1015,24 +1015,10 @@ export class DataPreviewComponent extends AbstractPopupComponent implements OnIn // 메타데이터가 존재한다면 if (this.isExistMetaData(source)) { const fieldMetaData: MetadataColumn = _.find(source.uiMetaData.columns, {'physicalName': field.name}); - // logical name - field['logicalName'] = fieldMetaData.name; // code table field['codeTable'] = fieldMetaData.codeTable; // dictionary field['dictionary'] = fieldMetaData.dictionary; - // type - if (fieldMetaData.type) { - field['metaType'] = fieldMetaData.type; - } - // description - if (fieldMetaData.description) { - field['description'] = fieldMetaData.description; - } - // format - if (fieldMetaData.format) { - field['format'] = fieldMetaData.format; - } } } @@ -1237,8 +1223,7 @@ export class DataPreviewComponent extends AbstractPopupComponent implements OnIn */ public createMetaDataHeader(args: any): void { // TODO 추후 그리드 자체에서 생성하도록 변경하기 - $('
' + (_.find(this.columns, {'name': args.column.id}).logicalName || '') + '
') - .appendTo(args.node); + $('
' + (_.find(this.columns, {'name': args.column.id}).logicalName || '') + '
').appendTo(args.node); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/discovery-frontend/src/app/dashboard/component/custom-field/custom-field.component.ts b/discovery-frontend/src/app/dashboard/component/custom-field/custom-field.component.ts index cf61aef620..1e6994d343 100644 --- a/discovery-frontend/src/app/dashboard/component/custom-field/custom-field.component.ts +++ b/discovery-frontend/src/app/dashboard/component/custom-field/custom-field.component.ts @@ -20,7 +20,7 @@ import { } from '@angular/core'; import { DashboardService } from '../../service/dashboard.service'; import { CommonCode } from '../../../domain/code/common-code'; -import { BIType, Field, FieldRole } from '../../../domain/datasource/datasource'; +import { Field, FieldRole } from '../../../domain/datasource/datasource'; import { AbstractComponent } from '../../../common/component/abstract.component'; import { Alert } from '../../../common/util/alert.util'; import { BoardDataSource } from '../../../domain/dashboard/dashboard'; @@ -372,7 +372,7 @@ export class CustomFieldComponent extends AbstractComponent implements OnInit, O } else { let color = '#439fe5'; - if (data.biType === BIType.DIMENSION) { + if (data.role === FieldRole.DIMENSION) { color = '#5fd7a5'; } @@ -506,7 +506,7 @@ export class CustomFieldComponent extends AbstractComponent implements OnInit, O // 컬럼 클릭 public selecteColumn(column: Field) { let color = '#439fe5'; - if (column.biType === BIType.DIMENSION) { + if (column.role === FieldRole.DIMENSION) { color = '#5fd7a5'; } let inserColumn = ''; diff --git a/discovery-frontend/src/app/dashboard/filters/configure-filters-update.component.ts b/discovery-frontend/src/app/dashboard/filters/configure-filters-update.component.ts index 9b0d233014..2ddc3bebc7 100644 --- a/discovery-frontend/src/app/dashboard/filters/configure-filters-update.component.ts +++ b/discovery-frontend/src/app/dashboard/filters/configure-filters-update.component.ts @@ -13,21 +13,21 @@ */ import * as _ from 'lodash'; -import { Component, ElementRef, EventEmitter, Injector, OnDestroy, OnInit, Output, ViewChild } from '@angular/core'; -import { AbstractFilterPopupComponent } from 'app/dashboard/filters/abstract-filter-popup.component'; -import { Filter } from '../../domain/workbook/configurations/filter/filter'; -import { Dashboard } from '../../domain/dashboard/dashboard'; -import { Field, FieldRole, BIType, ConnectionType, Datasource } from '../../domain/datasource/datasource'; -import { CustomField } from '../../domain/workbook/configurations/field/custom-field'; -import { InclusionFilter } from '../../domain/workbook/configurations/filter/inclusion-filter'; -import { ConfigureFiltersInclusionComponent } from './inclusion-filter/configure-filters-inclusion.component'; -import { BoundFilter } from '../../domain/workbook/configurations/filter/bound-filter'; -import { ConfigureFiltersBoundComponent } from './bound-filter/configure-filters-bound.component'; -import { Widget } from '../../domain/dashboard/widget/widget'; -import { StringUtil } from '../../common/util/string.util'; -import { TimeFilter } from '../../domain/workbook/configurations/filter/time-filter'; -import { ConfigureFiltersTimeComponent } from './time-filter/configure-filters-time.component'; -import { FilterUtil } from '../util/filter.util'; +import {Component, ElementRef, EventEmitter, Injector, OnDestroy, OnInit, Output, ViewChild} from '@angular/core'; +import {AbstractFilterPopupComponent} from 'app/dashboard/filters/abstract-filter-popup.component'; +import {Filter} from '../../domain/workbook/configurations/filter/filter'; +import {Dashboard} from '../../domain/dashboard/dashboard'; +import {ConnectionType, Datasource, Field, FieldRole, LogicalType} from '../../domain/datasource/datasource'; +import {CustomField} from '../../domain/workbook/configurations/field/custom-field'; +import {InclusionFilter} from '../../domain/workbook/configurations/filter/inclusion-filter'; +import {ConfigureFiltersInclusionComponent} from './inclusion-filter/configure-filters-inclusion.component'; +import {BoundFilter} from '../../domain/workbook/configurations/filter/bound-filter'; +import {ConfigureFiltersBoundComponent} from './bound-filter/configure-filters-bound.component'; +import {Widget} from '../../domain/dashboard/widget/widget'; +import {StringUtil} from '../../common/util/string.util'; +import {TimeFilter} from '../../domain/workbook/configurations/filter/time-filter'; +import {ConfigureFiltersTimeComponent} from './time-filter/configure-filters-time.component'; +import {FilterUtil} from '../util/filter.util'; import {CommonConstant} from "../../common/constant/common.constant"; @Component({ @@ -200,7 +200,7 @@ export class ConfigureFiltersUpdateComponent extends AbstractFilterPopupComponen public isTimestamp(): boolean { return ( this.targetField - && (this.targetField).biType === BIType.TIMESTAMP + && this.targetField.type === 'TIMESTAMP' && this.targetField.role === FieldRole.TIMESTAMP ) || ( this.targetField == null && this.targetFilter.field === CommonConstant.COL_NAME_CURRENT_DATETIME @@ -278,7 +278,7 @@ export class ConfigureFiltersUpdateComponent extends AbstractFilterPopupComponen this._dashboard = _.cloneDeep(board); this.targetFilter = targetFilter; - ( this.targetFilter.ui ) || ( this.targetFilter.ui = {} ); + (this.targetFilter.ui) || (this.targetFilter.ui = {}); this.targetField = this._getTargetField(targetFilter, board.configuration.fields, board.configuration.customFields); this.dataSource = FilterUtil.getDataSourceForFilter(targetFilter, board); @@ -316,7 +316,7 @@ export class ConfigureFiltersUpdateComponent extends AbstractFilterPopupComponen // 글로벌 필터 if (fieldList && 0 < fieldList.length) { - return fieldList.find((field: Field | CustomField) => field.name === filter.field && field.dataSource === filter.dataSource ); + return fieldList.find((field: Field | CustomField) => field.name === filter.field && field.dataSource === filter.dataSource); } else { return null; } diff --git a/discovery-frontend/src/app/dashboard/filters/time-filter/time-filter-panel.component.ts b/discovery-frontend/src/app/dashboard/filters/time-filter/time-filter-panel.component.ts index 11ca6b3add..9727139888 100644 --- a/discovery-frontend/src/app/dashboard/filters/time-filter/time-filter-panel.component.ts +++ b/discovery-frontend/src/app/dashboard/filters/time-filter/time-filter-panel.component.ts @@ -21,7 +21,7 @@ import { OnInit, ViewChild } from '@angular/core'; -import { BIType, Field, FieldRole } from '../../../domain/datasource/datasource'; +import {Field, FieldRole, LogicalType} from '../../../domain/datasource/datasource'; import { AbstractFilterPanelComponent } from '../abstract-filter-panel.component'; import { ByTimeUnit, TimeUnit } from '../../../domain/workbook/configurations/field/timestamp-field'; import { TimeListFilterComponent } from './time-list-filter.component'; @@ -309,8 +309,7 @@ export class TimeFilterPanelComponent extends AbstractFilterPanelComponent imple if( this.dataSource ) { // 타임스탬프인지 판단 - if (this.field && this.field.biType === BIType.TIMESTAMP - && this.field.role === FieldRole.TIMESTAMP) { + if (this.field && this.field.type === 'TIMESTAMP' && this.field.role === FieldRole.TIMESTAMP) { this.isTimeStamp = true; } else if (this.field == null && filter.field === CommonConstant.COL_NAME_CURRENT_DATETIME) { this.isTimeStamp = true; diff --git a/discovery-frontend/src/app/dashboard/widgets/page-widget/page-widget.component.ts b/discovery-frontend/src/app/dashboard/widgets/page-widget/page-widget.component.ts index 28722a6a0f..3593dc652d 100644 --- a/discovery-frontend/src/app/dashboard/widgets/page-widget/page-widget.component.ts +++ b/discovery-frontend/src/app/dashboard/widgets/page-widget/page-widget.component.ts @@ -1108,7 +1108,7 @@ export class PageWidgetComponent extends AbstractWidgetComponent implements OnIn this.widgetConfiguration.pivot.rows .forEach((abstractField) => { if (isNullOrUndefined(abstractField.field) - && String(field.biType) == abstractField.type.toUpperCase() && field.name == abstractField.name) { + && String(field.type) == abstractField.type.toUpperCase() && field.name == abstractField.name) { abstractField.field = field; } }); @@ -1116,7 +1116,7 @@ export class PageWidgetComponent extends AbstractWidgetComponent implements OnIn this.widgetConfiguration.pivot.columns .forEach((abstractField) => { if (isNullOrUndefined(abstractField.field) - && String(field.biType) == abstractField.type.toUpperCase() && field.name == abstractField.name) { + && String(field.type) == abstractField.type.toUpperCase() && field.name == abstractField.name) { abstractField.field = field; } }); @@ -1124,7 +1124,7 @@ export class PageWidgetComponent extends AbstractWidgetComponent implements OnIn this.widgetConfiguration.pivot.aggregations .forEach((abstractField) => { if (isNullOrUndefined(abstractField.field) - && String(field.biType) == abstractField.type.toUpperCase() && field.name == abstractField.name) { + && String(field.type) == abstractField.type.toUpperCase() && field.name == abstractField.name) { abstractField.field = field; } }); @@ -1135,7 +1135,7 @@ export class PageWidgetComponent extends AbstractWidgetComponent implements OnIn this.widgetConfiguration.shelf.layers[this.widgetConfiguration.chart['layerNum']] .forEach((abstractField) => { if (isNullOrUndefined(abstractField.field) - && String(field.biType) == abstractField.type.toUpperCase() && field.name == abstractField.name) { + && String(field.type) == abstractField.type.toUpperCase() && field.name == abstractField.name) { abstractField.field = field; } }); diff --git a/discovery-frontend/src/app/data-storage/data-source-list/component/storage-filter-select-box.component.html b/discovery-frontend/src/app/data-storage/data-source-list/component/storage-filter-select-box.component.html new file mode 100644 index 0000000000..19f21b3dcf --- /dev/null +++ b/discovery-frontend/src/app/data-storage/data-source-list/component/storage-filter-select-box.component.html @@ -0,0 +1,10 @@ +
+ {{selectedFilter.label}} + +
diff --git a/discovery-frontend/src/app/data-storage/data-source-list/component/storage-filter-select-box.component.ts b/discovery-frontend/src/app/data-storage/data-source-list/component/storage-filter-select-box.component.ts new file mode 100644 index 0000000000..c1c56a3eb3 --- /dev/null +++ b/discovery-frontend/src/app/data-storage/data-source-list/component/storage-filter-select-box.component.ts @@ -0,0 +1,49 @@ +import {Component, ElementRef, EventEmitter, Injector, Input, Output} from "@angular/core"; +import {AbstractComponent} from "../../../common/component/abstract.component"; + +@Component({ + selector: 'storage-filter-select-box', + templateUrl: 'storage-filter-select-box.component.html', + host: { + '(document:click)': 'onClickHost($event)', + }, +}) +export class StorageFilterSelectBoxComponent extends AbstractComponent { + + @Output('changedFilter') + private _changedFilter: EventEmitter = new EventEmitter(); + + @Input() + public filterList: any; + + @Input() + public selectedFilter: any; + + // select list show/hide flag + public isListShow: boolean; + + // constructor + constructor(protected element: ElementRef, + protected injector: Injector) { + super(element, injector); + } + + /** + * 컴포넌트 내부 host 클릭이벤트 처리 + * @param event + */ + public onClickHost(event: MouseEvent) { + // 현재 element 내부에서 생긴 이벤트가 아닌경우 hide 처리 + if (!this.elementRef.nativeElement.contains(event.target)) { + // close + this.isListShow = false; + } + } + + public onChangedFilter(filter: any): void { + // change filter + this.selectedFilter = filter; + // event emit + this._changedFilter.emit(filter); + } +} diff --git a/discovery-frontend/src/app/data-storage/data-source-list/create-data-source/staging-db-component/staging-db-select-data/staging-db-select-data.component.ts b/discovery-frontend/src/app/data-storage/data-source-list/create-data-source/staging-db-component/staging-db-select-data/staging-db-select-data.component.ts index 215ef2114a..4af2b4df0c 100644 --- a/discovery-frontend/src/app/data-storage/data-source-list/create-data-source/staging-db-component/staging-db-select-data/staging-db-select-data.component.ts +++ b/discovery-frontend/src/app/data-storage/data-source-list/create-data-source/staging-db-component/staging-db-select-data/staging-db-select-data.component.ts @@ -450,8 +450,8 @@ export class StagingDbSelectDataComponent extends AbstractPopupComponent impleme return fields.map((item) => { // name item.name = this._sliceTableName(item.name); - // alias - item.alias = this._sliceTableName(item.alias); + // if exist alias, convert alias + item.alias && (item.alias = this._sliceTableName(item.alias)); return item; }); } diff --git a/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/column-detail-data-source/column-detail-data-source.component.html b/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/column-detail-data-source/column-detail-data-source.component.html index 95ec6554cf..64a0b7cd38 100644 --- a/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/column-detail-data-source/column-detail-data-source.component.html +++ b/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/column-detail-data-source/column-detail-data-source.component.html @@ -157,7 +157,7 @@
- {{field['logicalName']}} + {{field.logicalName}}
@@ -323,7 +323,7 @@ {{'msg.metadata.th.dictionary' | translate}} - {{selectedField.dictionary?.name}} + {{selectedField.dictionary?.logicalName}} diff --git a/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/column-detail-data-source/column-detail-data-source.component.ts b/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/column-detail-data-source/column-detail-data-source.component.ts index 039f9821bc..6e49ad13b4 100644 --- a/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/column-detail-data-source/column-detail-data-source.component.ts +++ b/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/column-detail-data-source/column-detail-data-source.component.ts @@ -78,12 +78,28 @@ export class ColumnDetailDataSourceComponent extends AbstractComponent implement public filteredColumnList: any[]; // role type filter list - public roleTypeFilterList: any[]; + public roleTypeFilterList: any[] = [ + { label: this.translateService.instant('msg.comm.ui.list.all'), value: 'ALL' }, + { label: this.translateService.instant('msg.comm.name.dim'), value: 'DIMENSION' }, + { label: this.translateService.instant('msg.comm.name.mea'), value: 'MEASURE' }, + ]; // selected role type filter public selectedRoleTypeFilter: any; // type filter list - public typeFilterList: any[]; + public typeFilterList: any[] = [ + { label: this.translateService.instant('msg.comm.ui.list.all'), value: 'ALL' }, + { label: this.translateService.instant('msg.storage.ui.list.string'), value: 'STRING' }, + { label: this.translateService.instant('msg.storage.ui.list.boolean'), value: 'BOOLEAN' }, + { label: this.translateService.instant('msg.storage.ui.list.integer'), value: 'INTEGER', measure: true }, + { label: this.translateService.instant('msg.storage.ui.list.double'), value: 'DOUBLE', measure: true }, + { label: this.translateService.instant('msg.storage.ui.list.date'), value: 'TIMESTAMP' }, + { label: this.translateService.instant('msg.storage.ui.list.lnt'), value: 'LNT' }, + { label: this.translateService.instant('msg.storage.ui.list.lng'), value: 'LNG' }, + { label: this.translateService.instant('msg.storage.ui.list.geo.point'), value: 'GEO_POINT', derived: true }, + { label: this.translateService.instant('msg.storage.ui.list.geo.polygon'), value: 'GEO_POLYGON', derived: true }, + { label: this.translateService.instant('msg.storage.ui.list.geo.line'), value: 'GEO_LINE', derived: true }, + ]; // selected type filter public selectedTypeFilter: any; // type filter show | hide flag @@ -519,7 +535,7 @@ export class ColumnDetailDataSourceComponent extends AbstractComponent implement * Configure schema click event */ public onClickConfigureSchema(): void { - this._editConfigSchemaComp.init(this.datasource.id, this.datasource.fields); + this._editConfigSchemaComp.init(this.datasource.id, this.datasource.fields, this.roleTypeFilterList, this.typeFilterList); // change markup position $('#edit-config-schema').appendTo($('#layout-contents')); } @@ -529,25 +545,7 @@ export class ColumnDetailDataSourceComponent extends AbstractComponent implement * @private */ private _initView(): void { - this.typeFilterList = [ - { label: this.translateService.instant('msg.comm.ui.list.all'), value: 'ALL' }, - { label: this.translateService.instant('msg.storage.ui.list.string'), value: 'STRING' }, - { label: this.translateService.instant('msg.storage.ui.list.boolean'), value: 'BOOLEAN' }, - { label: this.translateService.instant('msg.storage.ui.list.integer'), value: 'INTEGER', measure: true }, - { label: this.translateService.instant('msg.storage.ui.list.double'), value: 'DOUBLE', measure: true }, - { label: this.translateService.instant('msg.storage.ui.list.date'), value: 'TIMESTAMP' }, - { label: this.translateService.instant('msg.storage.ui.list.lnt'), value: 'LNT' }, - { label: this.translateService.instant('msg.storage.ui.list.lng'), value: 'LNG' }, - { label: this.translateService.instant('msg.storage.ui.list.geo.point'), value: 'GEO_POINT', derived: true }, - { label: this.translateService.instant('msg.storage.ui.list.geo.polygon'), value: 'GEO_POLYGON', derived: true }, - { label: this.translateService.instant('msg.storage.ui.list.geo.line'), value: 'GEO_LINE', derived: true }, - ]; this.selectedTypeFilter = this.typeFilterList[0]; - this.roleTypeFilterList = [ - { label: this.translateService.instant('msg.comm.ui.list.all'), value: 'ALL' }, - { label: this.translateService.instant('msg.comm.name.dim'), value: 'DIMENSION' }, - { label: this.translateService.instant('msg.comm.name.mea'), value: 'MEASURE' }, - ]; this.selectedRoleTypeFilter = this.roleTypeFilterList[0]; // search this.searchTextKeyword = ''; @@ -644,24 +642,10 @@ export class ColumnDetailDataSourceComponent extends AbstractComponent implement */ private _setMetaDataField(field: Field): void { const fieldMetaData: MetadataColumn = _.find(this.metaData.columns, {'physicalName': field.name}); - // logical name - field['logicalName'] = fieldMetaData.name; // code table field['codeTable'] = fieldMetaData.codeTable; // dictionary field['dictionary'] = fieldMetaData.dictionary; - // type - if (fieldMetaData.type) { - field['metaType'] = fieldMetaData.type; - } - // description - if (fieldMetaData.description) { - field['description'] = fieldMetaData.description; - } - // format - if (fieldMetaData.format) { - field['format'] = fieldMetaData.format; - } } /** diff --git a/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/column-detail-data-source/edit-config-schema/edit-config-schema.component.html b/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/column-detail-data-source/edit-config-schema/edit-config-schema.component.html index a035845b0b..d3cdcad541 100644 --- a/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/column-detail-data-source/edit-config-schema/edit-config-schema.component.html +++ b/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/column-detail-data-source/edit-config-schema/edit-config-schema.component.html @@ -27,7 +27,105 @@ -
+
+ +
+
+
+ + {{'msg.storage.ui.guide.meta.modified' | translate}} +
+
+
+ + +
+ + + + +
+ +
+ +
+ + + +
+
+ + +
+ +
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
@@ -69,11 +167,11 @@ - + - - {{(column.role === 'MEASURE' ? 'msg.comm.name.mea' : 'msg.comm.name.dim') | translate}} + + {{(column.role === fieldRole.MEASURE ? 'msg.comm.name.mea' : 'msg.comm.name.dim') | translate}} @@ -85,25 +183,25 @@
+ [(ngModel)]="column.logicalName">
+ (clickOutside)="column['isShowTypeList'] = false" + (click)="onChangeTypeListShowFlag(column)" + [class.ddp-selected]="column['isShowTypeList']"> - {{column.role.toString() === 'TIMESTAMP' ? ('msg.storage.ui.list.timestamp' | translate) : getSelectedLogicalTypeLabel(column)}} - + {{column.role === fieldRole.TIMESTAMP ? ('msg.storage.ui.list.timestamp' | translate) : getSelectedLogicalTypeLabel(column)}} +
- - -
-
- {{datasource.description || 'msg.comm.ui.create.desc' | translate}} - -
-
- - - -
-
-
@@ -136,11 +118,14 @@ diff --git a/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/detail-data-source.component.ts b/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/detail-data-source.component.ts index da312352e5..ad60557428 100644 --- a/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/detail-data-source.component.ts +++ b/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/detail-data-source.component.ts @@ -76,9 +76,6 @@ export class DetailDataSourceComponent extends AbstractComponent implements OnIn @ViewChild('nameElement') public nameElement: ElementRef; - @ViewChild('descElement') - public descElement: ElementRef; - // 데이터소스 public datasource: Datasource; // 메타데이터 정보 @@ -86,11 +83,9 @@ export class DetailDataSourceComponent extends AbstractComponent implements OnIn // edit flag public nameFl: boolean = false; - public descFl: boolean = false; // name & desc public reName: string = ''; - public reDesc: string = ''; // more flag public moreFl: boolean = false; @@ -222,12 +217,6 @@ export class DetailDataSourceComponent extends AbstractComponent implements OnIn this.reName = this.datasource.name; } - // 설명 변경 모드 - public changeDescMode() { - this.descFl = true; - this.reDesc = this.datasource.description; - } - /** * Change datasource data event * @param {string} mode @@ -358,20 +347,6 @@ export class DetailDataSourceComponent extends AbstractComponent implements OnIn this.updateDatasource({name : this.reName.trim()}); } - /** - * 데이터소스 설명 수정 - */ - public redescDatasource() { - // 설명 길이 체크 - if (CommonUtil.getByte(this.reDesc.trim()) > 450) { - Alert.warning(this.translateService.instant('msg.alert.edit.description.len')); - return; - } - this.descFl = false; - // update - this.updateDatasource({description : this.reDesc.trim()}); - } - /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Public Method - event |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -410,18 +385,6 @@ export class DetailDataSourceComponent extends AbstractComponent implements OnIn this.renameDatasource(); } - /** - * Changed datasource description event - * @param {string} text - */ - public onChangedSourceDesc(text: string): void { - // set redesc text - this.reDesc = text; - // reDesc - this.redescDatasource(); - } - - /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Public Method - getter |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ diff --git a/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/information-dats-source/information-data-source.component.html b/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/information-dats-source/information-data-source.component.html index a141f9bb77..804ba6dddc 100644 --- a/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/information-dats-source/information-data-source.component.html +++ b/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/information-dats-source/information-data-source.component.html @@ -20,10 +20,48 @@ {{'msg.storage.ui.dsource.synchronization.btn' | translate}}
- +
+
+ + {{'msg.storage.ui.guide.meta.modified' | translate}} +
+
+ {{'msg.storage.btn.master.data.link' | translate}} + + + + + + + + + + + + +
+ {{'msg.comm.ui.description' | translate}} + +
+ + + +
+ +
+ + +
+
+
+
diff --git a/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/information-dats-source/information-data-source.component.ts b/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/information-dats-source/information-data-source.component.ts index 7b7d20a8be..1e5ff01108 100644 --- a/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/information-dats-source/information-data-source.component.ts +++ b/discovery-frontend/src/app/data-storage/data-source-list/detail-data-source/information-dats-source/information-data-source.component.ts @@ -38,8 +38,9 @@ import {StringUtil} from '../../../../common/util/string.util'; import {ConfirmModalComponent} from "../../../../common/component/modal/confirm/confirm.component"; import {Modal} from "../../../../common/domain/modal"; import {Alert} from "../../../../common/util/alert.util"; -import {IngestionLogComponent} from './component/ingestion-log/ingestion-log.component'; -import {CommonUtil} from '../../../../common/util/common.util'; +import { IngestionLogComponent } from './component/ingestion-log/ingestion-log.component'; +import { CommonUtil } from '../../../../common/util/common.util'; +import {Metadata} from "../../../../domain/meta-data-management/metadata"; declare let echarts: any; @@ -76,9 +77,15 @@ export class InformationDataSourceComponent extends AbstractPopupComponent imple @ViewChild(ConfirmModalComponent) private confirmModal: ConfirmModalComponent; + @Output('updateDatasource') + private _updateDatasource: EventEmitter = new EventEmitter(); + @Output() public changeDatasource: EventEmitter = new EventEmitter(); + @Input() + public isShowModifiedGuideMessage: boolean; + // scope types private ingestionScopeTypeList: any[]; // batch types @@ -126,8 +133,11 @@ export class InformationDataSourceComponent extends AbstractPopupComponent imple @Input() public timestampColumn: Field; - // 리스트 flag - public detailFl: boolean = false; + @Input() + public metaData: Metadata; + + // source description edit flag + public isEditSourceDescription: boolean = false; // advanced setting show flag public isShowAdvancedSetting: boolean = false; @@ -137,6 +147,9 @@ export class InformationDataSourceComponent extends AbstractPopupComponent imple // partitionKeyList public partitionKeyList: string[]; + // description + public descriptionChangeText: string; + /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Constructor |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -189,12 +202,59 @@ export class InformationDataSourceComponent extends AbstractPopupComponent imple } } } + // when hide source name edit, if edit desc mode, set show modified guide message + if (changes.isShowModifiedGuideMessage && !changes.isShowModifiedGuideMessage.currentValue && this.isEditSourceDescription) { + this.isShowModifiedGuideMessage = true; + } } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Public Method |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + /** + * Enable edit datasource description + */ + public enableEditDescription(): void { + this.isEditSourceDescription = true; + // set show modified guide message + this.isShowModifiedGuideMessage = true; + // set desc text + this.descriptionChangeText = this.datasource.description; + } + + /** + * Get converted datasource description + * @return {string} + */ + public getConvertedSourceDescription(): string { + return StringUtil.isEmpty(this.datasource.description) ? this.translateService.instant('msg.storage.ui.none.source.desc') : this.datasource.description.replace(/\r\n|\n/gi, '
'); + } + + /** + * Update datasource description + */ + public updateSourceDescription(): void { + // 설명 길이 체크 + if (CommonUtil.getByte(this.descriptionChangeText.trim()) > 450) { + Alert.warning(this.translateService.instant('msg.alert.edit.description.len')); + return; + } + this.isEditSourceDescription = false; + // set hide modified guide message + this.isShowModifiedGuideMessage = false; + // update + this._updateDatasource.emit({description: this.descriptionChangeText.trim()}); + } + + /** + * Click description outside + * @param {MouseEvent} event + */ + public onClickDescriptionOutside(event: MouseEvent): void { + !$(event.relatedTarget).hasClass('ddp-box-btn') && this.updateSourceDescription(); + } + /** * ingestion details click event */ @@ -202,6 +262,13 @@ export class InformationDataSourceComponent extends AbstractPopupComponent imple this._ingestionLogComp.init(this.datasource.id, this.historyId, this._ingestionProgress.message, this._ingestionProgress.failResults); } + /** + * Link master data click event + */ + public onClickLinkMasterData(): void { + this.router.navigate([`/management/metadata/metadata/${this.metaData.id}`]).then(); + } + /** * 확인모달 오픈 요청 * @param {string} type diff --git a/discovery-frontend/src/app/data-storage/data-storage.module.ts b/discovery-frontend/src/app/data-storage/data-storage.module.ts index af055c8fc6..e0d40a619a 100644 --- a/discovery-frontend/src/app/data-storage/data-storage.module.ts +++ b/discovery-frontend/src/app/data-storage/data-storage.module.ts @@ -42,6 +42,7 @@ import { CriterionCheckboxComponent } from './component/criterion/criterion-chec import { CriterionTimeRadioboxComponent } from './component/criterion/criterion-time-radiobox.component'; import {DataConnectionCreateService} from "./service/data-connection-create.service"; import {DataSourceCreateModule} from "./data-source-list/create-data-source/data-source-create.module"; +import {StorageFilterSelectBoxComponent} from "./data-source-list/component/storage-filter-select-box.component"; const storageRoutes: Routes = [ { path: '', component: DataSourceListComponent, canActivate: [DatasourceManagementGuard], canDeactivate:[CanDeactivateGuard] }, @@ -59,6 +60,8 @@ const storageRoutes: Routes = [ RouterModule.forChild(storageRoutes) ], declarations: [ + // common + StorageFilterSelectBoxComponent, // data source DataSourceListComponent, // data source - detail diff --git a/discovery-frontend/src/app/data-storage/service/data-source-create.service.ts b/discovery-frontend/src/app/data-storage/service/data-source-create.service.ts index b5db2bb51c..bc0b8cc9c7 100644 --- a/discovery-frontend/src/app/data-storage/service/data-source-create.service.ts +++ b/discovery-frontend/src/app/data-storage/service/data-source-create.service.ts @@ -395,7 +395,7 @@ export class DataSourceCreateService { * @private */ private _removeUnnecessaryPropertyInField(field: Field) { - delete field.biType; + delete field['biType']; // delete used UI delete field.isValidTimeFormat; delete field.isValidReplaceValue; diff --git a/discovery-frontend/src/app/datasource/component/datasource-summary/datasource-summary.component.html b/discovery-frontend/src/app/datasource/component/datasource-summary/datasource-summary.component.html index cd4d992fce..6acc3fa72b 100644 --- a/discovery-frontend/src/app/datasource/component/datasource-summary/datasource-summary.component.html +++ b/discovery-frontend/src/app/datasource/component/datasource-summary/datasource-summary.component.html @@ -93,7 +93,7 @@
diff --git a/discovery-frontend/src/app/domain/datasource/datasource.ts b/discovery-frontend/src/app/domain/datasource/datasource.ts index 95e922f0c0..cfc05c3ed4 100644 --- a/discovery-frontend/src/app/domain/datasource/datasource.ts +++ b/discovery-frontend/src/app/domain/datasource/datasource.ts @@ -113,63 +113,53 @@ export class DatasourceHive { // package com.metatron.discovery.domain.datasource.Field export class Field { - - // Field 별칭 - alias: string; - - // BI 타입 - biType: BIType; - // 필드 아이디 id: string; - - // logical type - logicalType: LogicalType; - // Field 명 name: string; + // logical name + logicalName?: string; + // description + description: string; + // Physical data type on engine + type: string; + // logical type + logicalType: LogicalType; // 필드 타입 role: FieldRole; - - seq: number; - - // 데이터 타입 - type: string; - // Partition 대상 필드 인지 여부 partitioned: boolean; // 필수적으로 필터링을 수행해야하는 필드인지 여부 filtering: boolean; - // 필수 필터링 순서 지정 filteringSeq: number; - // 필터링 옵션 filteringOptions: any; - // 기존 물리적인 필드를 매핑하여 신규 필드를 구성할 경우 관련 필드 정보 - mappedField: Field[]; - + // is create field (optional) + derived?: boolean; + // Whether to exclude what to load to engine + unloaded?: boolean; + // derivationRule + derivationRule?: DerivationRule; // IngestionRule ingestionRule: IngestionRule; - // derivationRule - derivationRule?: DerivationRule; + // 기존 물리적인 필드를 매핑하여 신규 필드를 구성할 경우 관련 필드 정보 + mappedField: Field[]; // format // TODO 추후 FieldFormat으로 변환 // format: FieldFormat; format: any; - // is create field (optional) - derived?: boolean; - - // description - description: string; + // Field 별칭 + alias: string; // for UI + seq: number; useFilter: boolean = false; useChartFilter: boolean = false; useChart: boolean = false; @@ -188,7 +178,6 @@ export class Field { isValidReplaceValue?: boolean; replaceValidMessage?: string; timeFormatValidMessage?: string; - unloaded?: boolean; checked?: boolean; // [UI] for Alias @@ -374,12 +363,6 @@ export enum SourceType { NONE = 'NONE' } -export enum BIType { - DIMENSION = 'DIMENSION', - MEASURE = 'MEASURE', - TIMESTAMP = 'TIMESTAMP' -} - export enum Status { ENABLED = 'ENABLED', PREPARING = 'PREPARING', diff --git a/discovery-frontend/src/app/domain/meta-data-management/column-dictionary.ts b/discovery-frontend/src/app/domain/meta-data-management/column-dictionary.ts index 96a0a95325..2ef4c6cd0f 100644 --- a/discovery-frontend/src/app/domain/meta-data-management/column-dictionary.ts +++ b/discovery-frontend/src/app/domain/meta-data-management/column-dictionary.ts @@ -12,11 +12,11 @@ * limitations under the License. */ -import { FieldFormat, LogicalType } from '../datasource/datasource'; -import { DataType } from '../dataconnection/connectionrequest'; -import { CodeTable } from './code-table'; -import { AbstractHistoryEntity } from '../common/abstract-history-entity'; -import { MetadataColumn } from './metadata-column'; +import {LogicalType} from '../datasource/datasource'; +import {DataType} from '../dataconnection/connectionrequest'; +import {CodeTable} from './code-table'; +import {AbstractHistoryEntity} from '../common/abstract-history-entity'; +import {MetadataColumn} from './metadata-column'; export class ColumnDictionary extends AbstractHistoryEntity { // id diff --git a/discovery-frontend/src/app/domain/meta-data-management/metadata-source.ts b/discovery-frontend/src/app/domain/meta-data-management/metadata-source.ts index 040afbf4a0..737290fd9e 100644 --- a/discovery-frontend/src/app/domain/meta-data-management/metadata-source.ts +++ b/discovery-frontend/src/app/domain/meta-data-management/metadata-source.ts @@ -13,6 +13,8 @@ */ import { AbstractHistoryEntity } from '../common/abstract-history-entity'; +import {Datasource} from '../datasource/datasource'; +import {Dataconnection} from '../dataconnection/dataconnection'; export class MetadataSource extends AbstractHistoryEntity { // id @@ -29,6 +31,8 @@ export class MetadataSource extends AbstractHistoryEntity { public table: string; // metadata source detail public sourceInfo: string; + // Datasource + public source: Datasource | Dataconnection; } export enum MetadataSourceType { diff --git a/discovery-frontend/src/app/domain/meta-data-management/metadata.ts b/discovery-frontend/src/app/domain/meta-data-management/metadata.ts index a7ca26e16e..a3190753e1 100644 --- a/discovery-frontend/src/app/domain/meta-data-management/metadata.ts +++ b/discovery-frontend/src/app/domain/meta-data-management/metadata.ts @@ -12,25 +12,49 @@ * limitations under the License. */ -import { AbstractHistoryEntity } from '../common/abstract-history-entity'; -import { MetadataSource } from './metadata-source'; -import { MetadataColumn } from './metadata-column'; +import {AbstractHistoryEntity} from '../common/abstract-history-entity'; +import {MetadataSource} from './metadata-source'; +import {MetadataColumn} from './metadata-column'; export class Metadata extends AbstractHistoryEntity { public id: string; - public description : string; - public name : string; - public sourceType : SourceType; - public source : MetadataSource; - public catalogs : any; - public tags : any; - public popularity : number; + public description: string; + public name: string; + public sourceType: SourceType; + public source: MetadataSource; + public catalogs: any; + public tags: any; + public popularity: number; // 컬럼 목록 public columns: MetadataColumn[]; } export enum SourceType { ENGINE = 'ENGINE', - STAGING = 'STAGING', + STAGING = 'STAGEDB', JDBC = 'JDBC' } + +export class MetadataSourceType { + + constructor(private value: SourceType) { + } + + public toString() { + return this.value; + } + + private static readonly engine = new MetadataSourceType(SourceType.ENGINE); + private static readonly staging = new MetadataSourceType(SourceType.STAGING); + private static readonly jdbc = new MetadataSourceType(SourceType.JDBC); + + public isEngine() { + return this.value === MetadataSourceType.engine.toString(); + } + public isStaging() { + return this.value === MetadataSourceType.staging.toString(); + } + public isJdbc() { + return this.value === MetadataSourceType.jdbc.toString(); + } +} diff --git a/discovery-frontend/src/app/domain/workbook/configurations/field/custom-field.ts b/discovery-frontend/src/app/domain/workbook/configurations/field/custom-field.ts index 69dc2320ee..20cc7b076c 100644 --- a/discovery-frontend/src/app/domain/workbook/configurations/field/custom-field.ts +++ b/discovery-frontend/src/app/domain/workbook/configurations/field/custom-field.ts @@ -12,7 +12,7 @@ * limitations under the License. */ -import { BIType, Field, FieldPivot, FieldRole, IngestionRule, LogicalType } from '../../../datasource/datasource'; +import { Field, FieldRole, IngestionRule, LogicalType } from '../../../datasource/datasource'; import { UserDefinedField } from './user-defined-field'; export class CustomField extends UserDefinedField { @@ -40,7 +40,6 @@ export class CustomField extends UserDefinedField { public useChartFilter: boolean = false; // for ui ( Spec 정리 후에 삭제 예정 ) - S - biType: BIType; // BI 타입 id: string; // 필드 아이디 logicalType: LogicalType; // logical type seq: number; diff --git a/discovery-frontend/src/app/meta-data-management/catalog/catalog.component.html b/discovery-frontend/src/app/meta-data-management/catalog/catalog.component.html index adaa8b9cb5..219eb1a86a 100644 --- a/discovery-frontend/src/app/meta-data-management/catalog/catalog.component.html +++ b/discovery-frontend/src/app/meta-data-management/catalog/catalog.component.html @@ -28,11 +28,9 @@ - -
@@ -55,10 +53,8 @@
-
-
-
-
@@ -123,12 +114,10 @@
- -
{{'msg.metadata.catalog.ui.no.cat' | translate }}
- + diff --git a/discovery-frontend/src/app/meta-data-management/catalog/catalog.component.ts b/discovery-frontend/src/app/meta-data-management/catalog/catalog.component.ts index 8f282b03cd..c336017057 100644 --- a/discovery-frontend/src/app/meta-data-management/catalog/catalog.component.ts +++ b/discovery-frontend/src/app/meta-data-management/catalog/catalog.component.ts @@ -12,19 +12,18 @@ * limitations under the License. */ -import { Component, ElementRef, Injector, OnChanges, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { AbstractComponent } from '../../common/component/abstract.component'; -import { CatalogService } from './service/catalog.service'; -import { PeriodComponent } from '../../common/component/period/period.component'; -import { Alert } from '../../common/util/alert.util'; -import { isUndefined } from "util"; -import { Modal } from '../../common/domain/modal'; -import { DeleteModalComponent } from '../../common/component/modal/delete/delete.component'; +import {Component, ElementRef, Injector, OnDestroy, OnInit, ViewChild} from '@angular/core'; +import {AbstractComponent} from '../../common/component/abstract.component'; +import {CatalogService} from './service/catalog.service'; +import {Alert} from '../../common/util/alert.util'; +import {isUndefined} from 'util'; +import {Modal} from '../../common/domain/modal'; +import {DeleteModalComponent} from '../../common/component/modal/delete/delete.component'; import * as _ from 'lodash'; @Component({ selector: 'app-catalog', - templateUrl: './catalog.component.html' + templateUrl: './catalog.component.html', }) export class CatalogComponent extends AbstractComponent implements OnInit, OnDestroy { @@ -35,7 +34,7 @@ export class CatalogComponent extends AbstractComponent implements OnInit, OnDes private catalogInput: ElementRef; @ViewChild('newCatalogName') - private newCatalogName : ElementRef; + private newCatalogName: ElementRef; /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Protected Variables @@ -52,42 +51,43 @@ export class CatalogComponent extends AbstractComponent implements OnInit, OnDes public searchInput: ElementRef; // 카타로그, 메타데이터 리스트 - public catalogs : Catalog[]; - public metadatas : any; + public catalogs: Catalog[]; + public metadatas: any; // 정렬 public selectedContentSort: Order = new Order(); // 선택된 카타로그 한개 - public selectedCatalog : Catalog; + public selectedCatalog: Catalog; // 검색어 - public searchText : string; + public searchText: string; // 뒤로가기를 하기 위한 path 저장 - public catalogPath : any = [{name : 'Root', id : 'ROOT'}]; + public catalogPath: any = [{name: 'Root', id: 'ROOT'}]; // 현재 보고있는 root - public currentRoot :any = {name : 'Root', id : 'ROOT'}; + public currentRoot: any = {name: 'Root', id: 'ROOT'}; // 새로만드냐 - public isCreateCatalog : boolean = false; + public isCreateCatalog: boolean = false; // 편집중이냐 - public isEditCatalogName : boolean = false; + public isEditCatalogName: boolean = false; // 카타로그 리스트가 페이징이 있는 상태인지 확인 - public isCatalogPaging : boolean = false; + public isCatalogPaging: boolean = false; - public inProcess : boolean = false; + public inProcess: boolean = false; /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Constructor |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ // 생성자 - constructor(protected element: ElementRef, - protected catalogService : CatalogService, - protected injector: Injector) { + constructor( + protected element: ElementRef, + protected catalogService: CatalogService, + protected injector: Injector) { super(element, injector); } @@ -114,7 +114,6 @@ export class CatalogComponent extends AbstractComponent implements OnInit, OnDes | Public Method |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ - /** * 카타로그 검색 및 날짜로 검색 */ @@ -126,7 +125,7 @@ export class CatalogComponent extends AbstractComponent implements OnInit, OnDes }).catch((error) => { this.loadingHide(); Alert.error(error); - }) + }); } /** @@ -143,7 +142,7 @@ export class CatalogComponent extends AbstractComponent implements OnInit, OnDes * 루트 폴더인지 확인 */ public isRoot() { - if(this.isCreateCatalog) { + if (this.isCreateCatalog) { return true; } else { return this.catalogPath.length !== 1; @@ -163,7 +162,7 @@ export class CatalogComponent extends AbstractComponent implements OnInit, OnDes }).catch((error) => { Alert.error(error); this.loadingHide(); - }) + }); } /** @@ -176,8 +175,8 @@ export class CatalogComponent extends AbstractComponent implements OnInit, OnDes } if (!this.deleteModalComponent.isShow) { - if(!this.isEditCatalogName) { - this.currentRoot = {name : catalog.name, id : catalog.id}; + if (!this.isEditCatalogName) { + this.currentRoot = {name: catalog.name, id: catalog.id}; this.catalogPath.push(this.currentRoot); if (this.searchText) { @@ -194,20 +193,20 @@ export class CatalogComponent extends AbstractComponent implements OnInit, OnDes * @param catalog * @param index */ - public updateCatalog(catalog,index) { + public updateCatalog(catalog, index) { if (!isUndefined(this.catalogInput.nativeElement.value) && this.catalogInput.nativeElement.value.trim() !== '') { - let idx = this.catalogs.map((catalog,idx) => { - if(idx !== index) { - return catalog.name + let idx = this.catalogs.map((catalog, idx) => { + if (idx !== index) { + return catalog.name; } }).indexOf(this.catalogInput.nativeElement.value); - if(idx === -1) { + if (idx === -1) { this.catalogService.updateCatalog(catalog.id, this.catalogInput.nativeElement.value).then(() => { this.initView(); }).catch((error) => { Alert.error(error); - }) + }); } else { Alert.warning(this.translateService.instant('msg.catalog.alert.catalog.already.exists')); return; @@ -217,12 +216,11 @@ export class CatalogComponent extends AbstractComponent implements OnInit, OnDes } } // function - updateCatalog - /** * new catalog 버튼 클릭시 새로운 카타로그를 만들수 있는 input box show */ public createCatalog() { - if(this.catalogPath.length === 4 || this.isCreateCatalog) { + if (this.catalogPath.length === 4 || this.isCreateCatalog) { return; } else { this.isCreateCatalog = true; @@ -241,15 +239,15 @@ export class CatalogComponent extends AbstractComponent implements OnInit, OnDes if (this.catalogPath.length > 1) { - let ids = [] + let ids = []; this.catalogPath.forEach((item) => { ids.push(item.id); }); let currentRootId = ids.indexOf(this.currentRoot.id); - this.currentRoot = this.catalogPath[currentRootId-1]; - this.catalogPath.splice(currentRootId,1); + this.currentRoot = this.catalogPath[currentRootId - 1]; + this.catalogPath.splice(currentRootId, 1); if (this.searchText) { this.searchCatalog(); @@ -257,13 +255,10 @@ export class CatalogComponent extends AbstractComponent implements OnInit, OnDes this.getCatalogList(); } - } } - - } /** @@ -274,18 +269,18 @@ export class CatalogComponent extends AbstractComponent implements OnInit, OnDes this.selectedCatalog = _.cloneDeep(catalog); this.getMetadataInCatalog().then((result) => { const modal = new Modal(); - modal.name = `${this.translateService.instant('msg.metadata.catalog.delete.header',{catalogName : catalog.name})}`; + modal.name = `${this.translateService.instant('msg.metadata.catalog.delete.header', {catalogName: catalog.name})}`; if (result.length > 0) { modal.name += ' ' + this.translateService.instant('msg.metadata.catalog.delete.header-plural'); } // 데이터가 1개 ~ 3개일때 if (result.length > 1 && result.length < 4) { - this.metadatas =`${result.join(', ')}`; + this.metadatas = `${result.join(', ')}`; } // 데이터가 3개 이상일 때 else if (result.length > 3) { - this.metadatas =`${result.splice(0,3).join(', ')} ...`; + this.metadatas = `${result.splice(0, 3).join(', ')} ...`; } modal.description = `${this.metadatas}`; @@ -298,22 +293,22 @@ export class CatalogComponent extends AbstractComponent implements OnInit, OnDes this.selectedCatalog = new Catalog(); } - public getMetadataInCatalog() : Promise { - return new Promise((resolve,reject) => { - this.catalogService.getMetadataInCatalog(this.selectedCatalog.id,this._getMetadataParams()).then((result) => { + public getMetadataInCatalog(): Promise { + return new Promise((resolve, reject) => { + this.catalogService.getMetadataInCatalog(this.selectedCatalog.id, this._getMetadataParams()).then((result) => { this.pageResult.number === 0 && (this.metadatas = []); // page 객체 this.pageResult = result.page; // 컬럼 사전 리스트 this.metadatas = result['_embedded'] ? this.metadatas.concat(result['_embedded']['metadatas']) : []; this.metadatas = this.metadatas.map((item) => { - return item.name + return item.name; }); resolve(this.metadatas); - }).catch((error)=> { - reject(error) - }) - }) + }).catch((error) => { + reject(error); + }); + }); } /** @@ -329,7 +324,7 @@ export class CatalogComponent extends AbstractComponent implements OnInit, OnDes }).catch((error) => { this.loadingHide(); Alert.error(error); - }) + }); } /** @@ -347,31 +342,30 @@ export class CatalogComponent extends AbstractComponent implements OnInit, OnDes setTimeout(() => { this.catalogInput.nativeElement.value = catalog.name; - }) + }); } - /** * 새로운 카타로그 생성 API 호출 */ public createCatalogDone() { - if(!isUndefined(this.newCatalogName.nativeElement.value) && this.newCatalogName.nativeElement.value.trim() !== '') { + if (!isUndefined(this.newCatalogName.nativeElement.value) && this.newCatalogName.nativeElement.value.trim() !== '') { - let params = {name : this.newCatalogName.nativeElement.value}; - this.currentRoot.id !== 'ROOT' ? params['parentId'] = this.currentRoot.id : null; + let params = {name: this.newCatalogName.nativeElement.value}; + this.currentRoot.id !== 'ROOT' ? params['parentId'] = this.currentRoot.id : null; if (this.inProcess === false) { this.inProcess = true; this.catalogService.createCatalog(params).then((result) => { this.initView(); this.inProcess = false; - Alert.success(this.translateService.instant('msg.catalog.alert.catalog.create.success',{value : result.name})); + Alert.success(this.translateService.instant('msg.catalog.alert.catalog.create.success', {value: result.name})); }).catch((error) => { - if( error && error.message ) { + if (error && error.message) { Alert.warning(error.message); } this.inProcess = false; - }) + }); } } else { this.inProcess = false; @@ -432,14 +426,13 @@ export class CatalogComponent extends AbstractComponent implements OnInit, OnDes // this.getMetadataInCatalog(); } - public refreshFilter() { // 정렬 this.selectedContentSort = new Order(); // 검색조건 초기화 this.searchText = ''; // 페이지 초기화 - this.pageResult.number = 0; + this.pageResult.number = 0; this.searchCatalog(); } @@ -456,20 +449,20 @@ export class CatalogComponent extends AbstractComponent implements OnInit, OnDes * @returns object * @private */ - private _getMetadataParams() : Object { + private _getMetadataParams(): Object { return { size: this.pageResult.size, page: this.pageResult.number, - sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort - } + sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort, + }; } - private _getCatalogParams() : Object { + private _getCatalogParams(): Object { let params = { size: this.pageResult.size, page: this.pageResult.number, - sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort + sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort, }; // 검색어 @@ -480,14 +473,13 @@ export class CatalogComponent extends AbstractComponent implements OnInit, OnDes params['parentId'] = this.currentRoot.id; return params; } + /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Private Method - getter |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ - } - class Order { key: string = 'createdTime'; sort: string = 'asc'; diff --git a/discovery-frontend/src/app/meta-data-management/catalog/service/catalog.service.ts b/discovery-frontend/src/app/meta-data-management/catalog/service/catalog.service.ts index 5e43b6748b..50e5713eff 100644 --- a/discovery-frontend/src/app/meta-data-management/catalog/service/catalog.service.ts +++ b/discovery-frontend/src/app/meta-data-management/catalog/service/catalog.service.ts @@ -12,9 +12,9 @@ * limitations under the License. */ -import { Injectable, Injector } from '@angular/core'; -import { CommonUtil } from '../../../common/util/common.util'; -import { AbstractService } from '../../../common/service/abstract.service'; +import {Injectable, Injector} from '@angular/core'; +import {CommonUtil} from '../../../common/util/common.util'; +import {AbstractService} from '../../../common/service/abstract.service'; @Injectable() export class CatalogService extends AbstractService { @@ -50,14 +50,13 @@ export class CatalogService extends AbstractService { | Public Method |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ - /** * 카타로그 생성 * @param {string} name * @returns {Promise} */ public createCatalog(params: any): Promise { - return this.post(this.URL_CATALOG,params) + return this.post(this.URL_CATALOG, params); } /** @@ -66,7 +65,7 @@ export class CatalogService extends AbstractService { * @returns {Promise} */ public deleteCatalog(id: string): Promise { - return this.delete(this.URL_CATALOG + `/${id}`) + return this.delete(this.URL_CATALOG + `/${id}`); } /** @@ -75,10 +74,9 @@ export class CatalogService extends AbstractService { * @returns {Promise} */ public updateCatalog(id: string, name: string): Promise { - return this.patch(this.URL_CATALOG + `/${id}`,{name : name}) + return this.patch(this.URL_CATALOG + `/${id}`, {name: name}); } - /** * 카탈로그내 포함되어 있는 메타데이터를 조회합니다. * @@ -86,12 +84,12 @@ export class CatalogService extends AbstractService { * @param pageable * @return */ - public getMetadataInCatalog(id : string, params? : any) : Promise { + public getMetadataInCatalog(id: string, params?: any): Promise { let url = this.URL_CATALOG + `/${id}/metadatas`; if (params) { url += '?' + CommonUtil.objectToUrlString(params); } - return this.get(url + `&projection=default&allSubCatalogs=true`) + return this.get(url + `&projection=default&allSubCatalogs=true`); } /** @@ -99,8 +97,8 @@ export class CatalogService extends AbstractService { * @param id * @return */ - public getTreeCatalogs(id : string) : Promise { - return this.get(this.URL_CATALOG+`/${id}/tree`) + public getTreeCatalogs(id: string): Promise { + return this.get(this.URL_CATALOG + `/${id}/tree`); } /** @@ -108,11 +106,11 @@ export class CatalogService extends AbstractService { * @param param * @return */ - public getCatalogs(params : any) : Promise { + public getCatalogs(params: any): Promise { let url = this.URL_CATALOG; url += '?' + CommonUtil.objectToUrlString(params); - return this.get(url + `&projection=forListView`) + return this.get(url + `&projection=forListView`); } } diff --git a/discovery-frontend/src/app/meta-data-management/code-table/code-table.component.html b/discovery-frontend/src/app/meta-data-management/code-table/code-table.component.html index 6f947e1d8b..5374236687 100644 --- a/discovery-frontend/src/app/meta-data-management/code-table/code-table.component.html +++ b/discovery-frontend/src/app/meta-data-management/code-table/code-table.component.html @@ -46,18 +46,12 @@ - -
- {{item.alias}} + {{item.logicalName}}
diff --git a/discovery-frontend/src/app/meta-data-management/code-table/code-table.component.ts b/discovery-frontend/src/app/meta-data-management/code-table/code-table.component.ts index 757a2313d1..6b5a58a043 100644 --- a/discovery-frontend/src/app/meta-data-management/code-table/code-table.component.ts +++ b/discovery-frontend/src/app/meta-data-management/code-table/code-table.component.ts @@ -12,22 +12,22 @@ * limitations under the License. */ -import { AbstractComponent } from '../../common/component/abstract.component'; +import {AbstractComponent} from '../../common/component/abstract.component'; import {Component, ElementRef, Injector, OnDestroy, OnInit, ViewChild} from '@angular/core'; -import { isUndefined } from 'util'; -import { Modal } from '../../common/domain/modal'; -import { DeleteModalComponent } from '../../common/component/modal/delete/delete.component'; -import { CodeTableService } from './service/code-table.service'; -import { CodeTable } from '../../domain/meta-data-management/code-table'; -import { PeriodComponent } from '../../common/component/period/period.component'; -import { Alert } from '../../common/util/alert.util'; -import { CreateCodeTableComponent } from './create-code-table/create-code-table.component'; +import {isUndefined} from 'util'; +import {Modal} from '../../common/domain/modal'; +import {DeleteModalComponent} from '../../common/component/modal/delete/delete.component'; +import {CodeTableService} from './service/code-table.service'; +import {CodeTable} from '../../domain/meta-data-management/code-table'; +import {PeriodComponent} from '../../common/component/period/period.component'; +import {Alert} from '../../common/util/alert.util'; +import {CreateCodeTableComponent} from './create-code-table/create-code-table.component'; declare let moment: any; @Component({ selector: 'app-code-table', - templateUrl: './code-table.component.html' + templateUrl: './code-table.component.html', }) export class CodeTableComponent extends AbstractComponent implements OnInit, OnDestroy { @@ -70,9 +70,10 @@ export class CodeTableComponent extends AbstractComponent implements OnInit, OnD |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ // 생성자 - constructor(private _codeTableService: CodeTableService, - protected element: ElementRef, - protected injector: Injector) { + constructor( + private _codeTableService: CodeTableService, + protected element: ElementRef, + protected injector: Injector) { super(element, injector); } @@ -106,7 +107,7 @@ export class CodeTableComponent extends AbstractComponent implements OnInit, OnD * @returns {boolean} */ public isMoreContents(): boolean { - return (this.pageResult.number < this.pageResult.totalPages -1); + return (this.pageResult.number < this.pageResult.totalPages - 1); } /** @@ -117,18 +118,17 @@ export class CodeTableComponent extends AbstractComponent implements OnInit, OnD // 로딩 show this.loadingShow(); // 코드 테이블 제거 - this._codeTableService.deleteCodeTable(modal['codeTableId']) - .then((result) => { - // alert - Alert.success(this.translateService.instant('msg.metadata.ui.codetable.delete.success', {value: modal['codeTableName']})); - // 재조회 - this.getCodeTableListPageInit(); - }) - .catch((error) => { - - // 로딩 hide - this.loadingHide(); - }); + this._codeTableService.deleteCodeTable(modal['codeTableId']).then((result) => { + // alert + Alert.success( + this.translateService.instant('msg.metadata.ui.codetable.delete.success', {value: modal['codeTableName']})); + // 재조회 + this.getCodeTableListPageInit(); + }).catch((error) => { + + // 로딩 hide + this.loadingHide(); + }); } /** @@ -149,7 +149,6 @@ export class CodeTableComponent extends AbstractComponent implements OnInit, OnD this._getCodeTableList(); } - /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Public Method - event |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -180,7 +179,7 @@ export class CodeTableComponent extends AbstractComponent implements OnInit, OnD const modal = new Modal(); modal.name = this.translateService.instant('msg.metadata.ui.codetable.delete.title'); - modal.description = codeTable.name; + modal.description = codeTable.name; modal.btnName = this.translateService.instant('msg.comm.ui.del'); modal['codeTableId'] = codeTable.id; modal['codeTableName'] = codeTable.name; @@ -200,7 +199,7 @@ export class CodeTableComponent extends AbstractComponent implements OnInit, OnD // 검색조건 초기화 this.searchText = ''; // 페이지 초기화 - this.pageResult.number = 0; + this.pageResult.number = 0; // date 필터 init this.periodComponent.setAll(); } @@ -306,8 +305,6 @@ export class CodeTableComponent extends AbstractComponent implements OnInit, OnD | Private Method - getter |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ - - /** * 코드 테이블 리스트 조회 * @private @@ -316,22 +313,20 @@ export class CodeTableComponent extends AbstractComponent implements OnInit, OnD // 로딩 show this.loadingShow(); // 코드 테이블 리스트 조회 - this._codeTableService.getCodeTableList(this._getCodeTableListParams()) - .then((result) => { - // 전달 받은 page number가 0 이면 코드 테이블 리스트 초기화 - this.pageResult.number === 0 && (this.codeTableList = []); - // page 객체 - this.pageResult = result.page; - // 코드 테이블 리스트 - this.codeTableList = result['_embedded'] ? this.codeTableList.concat(result['_embedded'].codetables) : []; - // 로딩 hide - this.loadingHide(); - }) - .catch((error) => { - - // 로딩 hide - this.loadingHide(); - }); + this._codeTableService.getCodeTableList(this._getCodeTableListParams()).then((result) => { + // 전달 받은 page number가 0 이면 코드 테이블 리스트 초기화 + this.pageResult.number === 0 && (this.codeTableList = []); + // page 객체 + this.pageResult = result.page; + // 코드 테이블 리스트 + this.codeTableList = result['_embedded'] ? this.codeTableList.concat(result['_embedded'].codetables) : []; + // 로딩 hide + this.loadingHide(); + }).catch((error) => { + + // 로딩 hide + this.loadingHide(); + }); } /** @@ -343,7 +338,7 @@ export class CodeTableComponent extends AbstractComponent implements OnInit, OnD const params = { size: this.pageResult.size, page: this.pageResult.number, - sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort + sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort, }; // 검색어 if (!isUndefined(this.searchText) && this.searchText.trim() !== '') { diff --git a/discovery-frontend/src/app/meta-data-management/code-table/create-code-table/create-code-table.component.html b/discovery-frontend/src/app/meta-data-management/code-table/create-code-table/create-code-table.component.html index b38b7b364d..236cffad66 100644 --- a/discovery-frontend/src/app/meta-data-management/code-table/create-code-table/create-code-table.component.html +++ b/discovery-frontend/src/app/meta-data-management/code-table/create-code-table/create-code-table.component.html @@ -56,22 +56,17 @@ -
- - - - +
-
{{'msg.metadata.ui.codetable.create.code' | translate}}
{{'msg.metadata.ui.codetable.create.value' | translate}}
diff --git a/discovery-frontend/src/app/meta-data-management/code-table/create-code-table/create-code-table.component.ts b/discovery-frontend/src/app/meta-data-management/code-table/create-code-table/create-code-table.component.ts index 85101d0713..540e181049 100644 --- a/discovery-frontend/src/app/meta-data-management/code-table/create-code-table/create-code-table.component.ts +++ b/discovery-frontend/src/app/meta-data-management/code-table/create-code-table/create-code-table.component.ts @@ -12,17 +12,17 @@ * limitations under the License. */ -import { Component, ElementRef, EventEmitter, Injector, OnDestroy, OnInit, Output } from '@angular/core'; -import { CodeTableService } from '../service/code-table.service'; -import { Alert } from '../../../common/util/alert.util'; +import {Component, ElementRef, EventEmitter, Injector, OnDestroy, OnInit, Output} from '@angular/core'; +import {CodeTableService} from '../service/code-table.service'; +import {Alert} from '../../../common/util/alert.util'; import * as _ from 'lodash'; -import { CodeValuePair } from '../../../domain/meta-data-management/code-value-pair'; -import { CommonUtil } from '../../../common/util/common.util'; -import { AbstractComponent } from '../../../common/component/abstract.component'; +import {CodeValuePair} from '../../../domain/meta-data-management/code-value-pair'; +import {CommonUtil} from '../../../common/util/common.util'; +import {AbstractComponent} from '../../../common/component/abstract.component'; @Component({ selector: 'app-create-code-table', - templateUrl: './create-code-table.component.html' + templateUrl: './create-code-table.component.html', }) export class CreateCodeTableComponent extends AbstractComponent implements OnInit, OnDestroy { @@ -57,15 +57,15 @@ export class CreateCodeTableComponent extends AbstractComponent implements OnIni @Output() public createComplete: EventEmitter = new EventEmitter(); - /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Constructor |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ // 생성자 - constructor(private _codeTableService: CodeTableService, - protected element: ElementRef, - protected injector: Injector) { + constructor( + private _codeTableService: CodeTableService, + protected element: ElementRef, + protected injector: Injector) { super(element, injector); } @@ -98,7 +98,6 @@ export class CreateCodeTableComponent extends AbstractComponent implements OnIni this.showFl = true; } - /** * 코드 테이블 쌍이 하나 이상인지 * @returns {boolean} @@ -141,7 +140,6 @@ export class CreateCodeTableComponent extends AbstractComponent implements OnIni this.tableDescValidationMsg = null; } - /** * code table validation init * @param {CodeValuePair} pair @@ -224,21 +222,24 @@ export class CreateCodeTableComponent extends AbstractComponent implements OnIni // 테이블 이름이 비어있는지 확인 if (this.tableName.trim() === '') { // message - this.tableNameValidationMsg = this.translateService.instant('msg.metadata.ui.codetable.create.valid.table.name.required'); + this.tableNameValidationMsg = this.translateService.instant( + 'msg.metadata.ui.codetable.create.valid.table.name.required'); // return return false; } // 테이블 이름 길이 체크 if (CommonUtil.getByte(this.tableName.trim()) > 150) { // message - this.tableNameValidationMsg = this.translateService.instant('msg.metadata.ui.codetable.create.valid.table.name.length'); + this.tableNameValidationMsg = this.translateService.instant( + 'msg.metadata.ui.codetable.create.valid.table.name.length'); // return return false; } // 테이블 설명 길이 체크 if (CommonUtil.getByte(this.tableDescription.trim()) > 900) { // message - this.tableDescValidationMsg = this.translateService.instant('msg.metadata.ui.codetable.create.valid.table.desc.length'); + this.tableDescValidationMsg = this.translateService.instant( + 'msg.metadata.ui.codetable.create.valid.table.desc.length'); // return return false; } @@ -254,23 +255,22 @@ export class CreateCodeTableComponent extends AbstractComponent implements OnIni // 로딩 show this.loadingShow(); // 테이블 이름이 중복인지 확인 - this._codeTableService.getDuplicateTableNameInCodeTable(this.tableName.trim()) - .then((result) => { - // 중복 - if (result['duplicated']) { - // message - this.tableNameValidationMsg = this.translateService.instant('msg.metadata.ui.codetable.create.valid.table.name.duplicated' , {value: this.tableName.trim()}); - // 로딩 hide - this.loadingHide(); - } else { - // 테이블 생성 - this._createCodeTable(); - } - }) - .catch((error) => { + this._codeTableService.getDuplicateTableNameInCodeTable(this.tableName.trim()).then((result) => { + // 중복 + if (result['duplicated']) { + // message + this.tableNameValidationMsg = this.translateService.instant( + 'msg.metadata.ui.codetable.create.valid.table.name.duplicated', {value: this.tableName.trim()}); // 로딩 hide this.loadingHide(); - }); + } else { + // 테이블 생성 + this._createCodeTable(); + } + }).catch((error) => { + // 로딩 hide + this.loadingHide(); + }); } /** @@ -281,18 +281,17 @@ export class CreateCodeTableComponent extends AbstractComponent implements OnIni // 로딩 show this.loadingShow(); // 코드 테이블 생성 - this._codeTableService.createCodeTable(this._getCreateCodeTableParams()) - .then((result) => { - // alert - Alert.success(this.translateService.instant('msg.metadata.ui.codetable.create.success', {value: this.tableName.trim()})); - // close - this.createComplete.emit(); - this.onClickCancel(); - }) - .catch((error) => { - // 로딩 hide - this.loadingHide(); - }); + this._codeTableService.createCodeTable(this._getCreateCodeTableParams()).then((result) => { + // alert + Alert.success( + this.translateService.instant('msg.metadata.ui.codetable.create.success', {value: this.tableName.trim()})); + // close + this.createComplete.emit(); + this.onClickCancel(); + }).catch((error) => { + // 로딩 hide + this.loadingHide(); + }); } /** @@ -303,7 +302,8 @@ export class CreateCodeTableComponent extends AbstractComponent implements OnIni private _codeListValidation(): boolean { for (let i = 0; i < this.codeTableList.length; i++) { // code나 value 둘 중 하나가 비어있으면 validation message 표시 - if (this.codeTableList[i].code && this.codeTableList[i].value && this.codeTableList[i].code.trim() !== '' && this.codeTableList[i].value.trim() !== '') { + if (this.codeTableList[i].code && this.codeTableList[i].value && this.codeTableList[i].code.trim() !== '' && + this.codeTableList[i].value.trim() !== '') { this.codeTableList[i]['invalid'] = false; } else { this.codeTableList[i]['invalid'] = true; @@ -322,7 +322,7 @@ export class CreateCodeTableComponent extends AbstractComponent implements OnIni const params = { name: this.tableName.trim(), description: this.tableDescription.trim(), - codes: this._getCodesParams() + codes: this._getCodesParams(), }; return params; } diff --git a/discovery-frontend/src/app/meta-data-management/code-table/detail-code-table/detail-code-table.component.html b/discovery-frontend/src/app/meta-data-management/code-table/detail-code-table/detail-code-table.component.html index d72a7aa690..ca80b87fc4 100644 --- a/discovery-frontend/src/app/meta-data-management/code-table/detail-code-table/detail-code-table.component.html +++ b/discovery-frontend/src/app/meta-data-management/code-table/detail-code-table/detail-code-table.component.html @@ -11,6 +11,7 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> +
@@ -27,13 +28,11 @@
-
-
@@ -76,7 +75,6 @@
- -
@@ -106,7 +103,6 @@ -
{{codeTable.description}} - +
- - - - - - -
-
@@ -212,10 +200,7 @@ - - - - +
@@ -250,12 +235,15 @@
+ + + diff --git a/discovery-frontend/src/app/meta-data-management/code-table/detail-code-table/detail-code-table.component.ts b/discovery-frontend/src/app/meta-data-management/code-table/detail-code-table/detail-code-table.component.ts index dcedc77628..749e9269b1 100644 --- a/discovery-frontend/src/app/meta-data-management/code-table/detail-code-table/detail-code-table.component.ts +++ b/discovery-frontend/src/app/meta-data-management/code-table/detail-code-table/detail-code-table.component.ts @@ -29,7 +29,7 @@ import {ColumnDictionary} from '../../../domain/meta-data-management/column-dict @Component({ selector: 'app-detail-code-table', - templateUrl: './detail-code-table.component.html' + templateUrl: './detail-code-table.component.html', }) export class DetailCodeTableComponent extends AbstractComponent implements OnInit, OnDestroy { @@ -90,10 +90,11 @@ export class DetailCodeTableComponent extends AbstractComponent implements OnIni |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ // 생성자 - constructor(private _codeTableService: CodeTableService, - private _activatedRoute: ActivatedRoute, - protected element: ElementRef, - protected injector: Injector) { + constructor( + private _codeTableService: CodeTableService, + private _activatedRoute: ActivatedRoute, + protected element: ElementRef, + protected injector: Injector) { super(element, injector); } @@ -135,18 +136,17 @@ export class DetailCodeTableComponent extends AbstractComponent implements OnIni // 로딩 show this.loadingShow(); // 코드 테이블 제거 - this._codeTableService.deleteCodeTable(this._codeTableId) - .then((result) => { - // alert - Alert.success(this.translateService.instant('msg.metadata.ui.codetable.delete.success', {value: this._originCodeTable.name})); - // 코드테이블 목록으로 돌아가기 - this.router.navigate(['/management/metadata/code-table']); - }) - .catch((error) => { - - // 로딩 hide - this.loadingHide(); - }); + this._codeTableService.deleteCodeTable(this._codeTableId).then((result) => { + // alert + Alert.success( + this.translateService.instant('msg.metadata.ui.codetable.delete.success', {value: this._originCodeTable.name})); + // 코드테이블 목록으로 돌아가기 + this.router.navigate(['/management/metadata/code-table']); + }).catch((error) => { + + // 로딩 hide + this.loadingHide(); + }); } /** @@ -362,14 +362,14 @@ export class DetailCodeTableComponent extends AbstractComponent implements OnIni // 로딩 show this.loadingShow(); - this._codeTableService.updateCodeTable(this._codeTableId, params ? params : this._getUpdateCodeTableParams()) - .then((result) => { + this._codeTableService.updateCodeTable(this._codeTableId, params ? params : this._getUpdateCodeTableParams()). + then((result) => { // alert Alert.success(this.translateService.instant('msg.comm.alert.confirm.success')); // 재조회 this._getDetailCodeTable(); - }) - .catch((error) => { + }). + catch((error) => { // 로딩 hide this.loadingHide(); }); @@ -383,17 +383,15 @@ export class DetailCodeTableComponent extends AbstractComponent implements OnIni // 로딩 show this.loadingShow(); // 코드와 값 업데이트 - this._codeTableService.updateCodeValueInCodeTable(this._codeTableId, this._getUpdateCodeParams()) - .then((result) => { - // alert - Alert.success(this.translateService.instant('msg.comm.alert.confirm.success')); - // 재조회 - this._getDetailCodeTable(); - }) - .catch((error) => { - // 로딩 hide - this.loadingHide(); - }); + this._codeTableService.updateCodeValueInCodeTable(this._codeTableId, this._getUpdateCodeParams()).then((result) => { + // alert + Alert.success(this.translateService.instant('msg.comm.alert.confirm.success')); + // 재조회 + this._getDetailCodeTable(); + }).catch((error) => { + // 로딩 hide + this.loadingHide(); + }); } /** @@ -404,32 +402,30 @@ export class DetailCodeTableComponent extends AbstractComponent implements OnIni // 로딩 show this.loadingShow(); // 테이블 이름이 중복인지 확인 - this._codeTableService.getDuplicateTableNameInCodeTable(this.reName.trim()) - .then((result) => { - // 중복 - if (result['duplicated']) { - // alert - Alert.warning( - this.translateService.instant( - 'msg.metadata.ui.codetable.create.valid.table.name.duplicated', - {value: this.reName.trim()} - ) - ); - // 로딩 hide - this.loadingHide(); - } else { - // edit flag - this.nameEditFl = false; - // blur - // this.nameElement.nativeElement.blur(); - // 테이블 업데이트 - this._updateCodeTable({name: this.reName.trim()}); - } - }) - .catch((error) => { + this._codeTableService.getDuplicateTableNameInCodeTable(this.reName.trim()).then((result) => { + // 중복 + if (result['duplicated']) { + // alert + Alert.warning( + this.translateService.instant( + 'msg.metadata.ui.codetable.create.valid.table.name.duplicated', + {value: this.reName.trim()}, + ), + ); // 로딩 hide this.loadingHide(); - }); + } else { + // edit flag + this.nameEditFl = false; + // blur + // this.nameElement.nativeElement.blur(); + // 테이블 업데이트 + this._updateCodeTable({name: this.reName.trim()}); + } + }).catch((error) => { + // 로딩 hide + this.loadingHide(); + }); } /** @@ -440,7 +436,8 @@ export class DetailCodeTableComponent extends AbstractComponent implements OnIni private _codeListValidation(): boolean { for (let i = 0; i < this.codeList.length; i++) { // code나 value 둘 중 하나가 비어있으면 validation message 표시 - if (this.codeList[i].code && this.codeList[i].value && this.codeList[i].code.trim() !== '' && this.codeList[i].value.trim() !== '') { + if (this.codeList[i].code && this.codeList[i].value && this.codeList[i].code.trim() !== '' && + this.codeList[i].value.trim() !== '') { this.codeList[i]['invalid'] = false; } else { this.codeList[i]['invalid'] = true; @@ -462,23 +459,21 @@ export class DetailCodeTableComponent extends AbstractComponent implements OnIni // 로딩 show this.loadingShow(); // 코드 테이블 상세조회 - this._codeTableService.getCodeTableDetail(this._codeTableId) - .then((result) => { - // 코드 테이블 상세조회 데이터 - this.codeTable = result; - // origin 테이블 데이터 - this._originCodeTable = _.cloneDeep(result); - // 연결된 코드 리스트 - this.codeList = result['codes']; - // origin 연결된 코드 리스트 - this._originCodeList = _.cloneDeep(result['codes']); - // 연결된 컬럼 사전 목록 조회 - this._getColumnDictionaryList(); - }) - .catch((error) => { - // 로딩 hide - this.loadingHide(); - }); + this._codeTableService.getCodeTableDetail(this._codeTableId).then((result) => { + // 코드 테이블 상세조회 데이터 + this.codeTable = result; + // origin 테이블 데이터 + this._originCodeTable = _.cloneDeep(result); + // 연결된 코드 리스트 + this.codeList = result['codes']; + // origin 연결된 코드 리스트 + this._originCodeList = _.cloneDeep(result['codes']); + // 연결된 컬럼 사전 목록 조회 + this._getColumnDictionaryList(); + }).catch((error) => { + // 로딩 hide + this.loadingHide(); + }); } /** @@ -492,20 +487,18 @@ export class DetailCodeTableComponent extends AbstractComponent implements OnIni this._codeTableService.getColumnDictionaryInCodeTable(this._codeTableId, { size: 15, page: 0, - sort: 'logicalName,asc' - }) - .then((result) => { - // 수 - this.linkedDictionaryTotalCount = result['page'].totalElements; - // 목록 - this.linkedDictionaryList = result['_embedded'] ? result['_embedded'].dictionaries : []; - // 로딩 hide - this.loadingHide(); - }) - .catch((error) => { - // 로딩 hide - this.loadingHide(); - }); + sort: 'logicalName,asc', + }).then((result) => { + // 수 + this.linkedDictionaryTotalCount = result['page'].totalElements; + // 목록 + this.linkedDictionaryList = result['_embedded'] ? result['_embedded'].dictionaries : []; + // 로딩 hide + this.loadingHide(); + }).catch((error) => { + // 로딩 hide + this.loadingHide(); + }); } /** @@ -516,7 +509,7 @@ export class DetailCodeTableComponent extends AbstractComponent implements OnIni private _getUpdateCodeTableParams(): object { const params = { name: this.codeTable.name.trim(), - description: this.codeTable.description.trim() + description: this.codeTable.description.trim(), }; return params; } @@ -544,7 +537,8 @@ export class DetailCodeTableComponent extends AbstractComponent implements OnIni if (originIndex === -1) { // add params.push({op: 'add', code: code.code, value: code.value}); - } else if (code.code !== this._originCodeList[originIndex].code || code.value !== this._originCodeList[originIndex].value) { + } else if (code.code !== this._originCodeList[originIndex].code || code.value !== + this._originCodeList[originIndex].value) { // replace params.push({op: 'replace', code: code.code, value: code.value, id: code.id}); } diff --git a/discovery-frontend/src/app/meta-data-management/code-table/service/code-table.service.ts b/discovery-frontend/src/app/meta-data-management/code-table/service/code-table.service.ts index e0f33ce6df..c07a37ff8e 100644 --- a/discovery-frontend/src/app/meta-data-management/code-table/service/code-table.service.ts +++ b/discovery-frontend/src/app/meta-data-management/code-table/service/code-table.service.ts @@ -12,9 +12,9 @@ * limitations under the License. */ -import { Injectable, Injector } from '@angular/core'; -import { AbstractService } from '../../../common/service/abstract.service'; -import { CommonUtil } from '../../../common/util/common.util'; +import {Injectable, Injector} from '@angular/core'; +import {AbstractService} from '../../../common/service/abstract.service'; +import {CommonUtil} from '../../../common/util/common.util'; @Injectable() export class CodeTableService extends AbstractService { diff --git a/discovery-frontend/src/app/meta-data-management/column-dictionary/column-dictionary.component.html b/discovery-frontend/src/app/meta-data-management/column-dictionary/column-dictionary.component.html index c6587c66af..6032084e86 100644 --- a/discovery-frontend/src/app/meta-data-management/column-dictionary/column-dictionary.component.html +++ b/discovery-frontend/src/app/meta-data-management/column-dictionary/column-dictionary.component.html @@ -45,18 +45,13 @@
- @@ -93,9 +88,6 @@ - - - - - - - - - - - - -
{{dictionary.logicalType}} {{dictionary.createdTime | mdate:'YYYY-MM-DD HH:mm'}}
@@ -109,9 +101,11 @@ {{'msg.comm.ui.more' | translate}}
+ + diff --git a/discovery-frontend/src/app/meta-data-management/column-dictionary/column-dictionary.component.ts b/discovery-frontend/src/app/meta-data-management/column-dictionary/column-dictionary.component.ts index 8800a559bb..fb54232aa5 100644 --- a/discovery-frontend/src/app/meta-data-management/column-dictionary/column-dictionary.component.ts +++ b/discovery-frontend/src/app/meta-data-management/column-dictionary/column-dictionary.component.ts @@ -12,23 +12,22 @@ * limitations under the License. */ -import { AbstractComponent } from '../../common/component/abstract.component'; -import { Component, ElementRef, Injector, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { isUndefined } from 'util'; -import { DeleteModalComponent } from '../../common/component/modal/delete/delete.component'; -import { Modal } from '../../common/domain/modal'; -import { ColumnDictionary } from '../../domain/meta-data-management/column-dictionary'; -import { ColumnDictionaryService } from './service/column-dictionary.service'; -import { PeriodComponent } from '../../common/component/period/period.component'; -import * as _ from 'lodash'; -import { Alert } from '../../common/util/alert.util'; -import { CreateColumnDictionaryComponent } from './create-column-dictionary/create-column-dictionary.component'; +import {AbstractComponent} from '../../common/component/abstract.component'; +import {Component, ElementRef, Injector, OnDestroy, OnInit, ViewChild} from '@angular/core'; +import {isUndefined} from 'util'; +import {DeleteModalComponent} from '../../common/component/modal/delete/delete.component'; +import {Modal} from '../../common/domain/modal'; +import {ColumnDictionary} from '../../domain/meta-data-management/column-dictionary'; +import {ColumnDictionaryService} from './service/column-dictionary.service'; +import {PeriodComponent} from '../../common/component/period/period.component'; +import {Alert} from '../../common/util/alert.util'; +import {CreateColumnDictionaryComponent} from './create-column-dictionary/create-column-dictionary.component'; declare let moment: any; @Component({ selector: 'app-column-dictionary', - templateUrl: './column-dictionary.component.html' + templateUrl: './column-dictionary.component.html', }) export class ColumnDictionaryComponent extends AbstractComponent implements OnInit, OnDestroy { @@ -71,9 +70,10 @@ export class ColumnDictionaryComponent extends AbstractComponent implements OnIn |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ // 생성자 - constructor(private _columnDictionaryService: ColumnDictionaryService, - protected element: ElementRef, - protected injector: Injector) { + constructor( + private _columnDictionaryService: ColumnDictionaryService, + protected element: ElementRef, + protected injector: Injector) { super(element, injector); } @@ -107,7 +107,7 @@ export class ColumnDictionaryComponent extends AbstractComponent implements OnIn * @returns {boolean} */ public isMoreContents(): boolean { - return (this.pageResult.number < this.pageResult.totalPages -1); + return (this.pageResult.number < this.pageResult.totalPages - 1); } /** @@ -118,17 +118,16 @@ export class ColumnDictionaryComponent extends AbstractComponent implements OnIn // 로딩 show this.loadingShow(); // 컬럼 사전 제거 - this._columnDictionaryService.deleteColumnDictionary(modal['dictionaryId']) - .then((result) => { - // alert - Alert.success(this.translateService.instant('msg.metadata.ui.dictionary.delete.success', modal['dictionaryName'])); - // 재조회 - this.getColumnDictionaryListPageInit(); - }) - .catch((error) => { - // 로딩 hide - this.loadingHide(); - }); + this._columnDictionaryService.deleteColumnDictionary(modal['dictionaryId']).then((result) => { + // alert + Alert.success( + this.translateService.instant('msg.metadata.ui.dictionary.delete.success', modal['dictionaryName'])); + // 재조회 + this.getColumnDictionaryListPageInit(); + }).catch((error) => { + // 로딩 hide + this.loadingHide(); + }); } /** @@ -156,7 +155,7 @@ export class ColumnDictionaryComponent extends AbstractComponent implements OnIn /** * 컬럼 사전 생성 클릭 이벤트 */ - public onClickCreateColumnDictionary (): void { + public onClickCreateColumnDictionary(): void { this._createColumnDictionaryComp.init(); } @@ -179,7 +178,7 @@ export class ColumnDictionaryComponent extends AbstractComponent implements OnIn const modal = new Modal(); modal.name = this.translateService.instant('msg.metadata.ui.dictionary.delete.title'); - modal.description = columnDictionary.logicalName; + modal.description = columnDictionary.logicalName; modal.btnName = this.translateService.instant('msg.comm.ui.del'); modal['dictionaryId'] = columnDictionary.id; modal['dictionaryName'] = columnDictionary.logicalName; @@ -199,7 +198,7 @@ export class ColumnDictionaryComponent extends AbstractComponent implements OnIn // 검색조건 초기화 this.searchText = ''; // 페이지 초기화 - this.pageResult.number = 0; + this.pageResult.number = 0; // date 필터 init this.periodComponent.setAll(); } @@ -313,21 +312,21 @@ export class ColumnDictionaryComponent extends AbstractComponent implements OnIn // 로딩 show this.loadingShow(); // 컬럼 사전 리스트 조회 - this._columnDictionaryService.getColumnDictionaryList(this._getColumnDictionaryListParams()) - .then((result) => { - // 전달 받은 page number가 0 이면 컬럼 사전 리스트 초기화 - this.pageResult.number === 0 && (this.columnDictionaryList = []); - // page 객체 - this.pageResult = result.page; - // 컬럼 사전 리스트 - this.columnDictionaryList = result['_embedded'] ? this.columnDictionaryList.concat(result['_embedded'].dictionaries) : []; - // 로딩 hide - this.loadingHide(); - }) - .catch((error) => { - // 로딩 hide - this.loadingHide(); - }); + this._columnDictionaryService.getColumnDictionaryList(this._getColumnDictionaryListParams()).then((result) => { + // 전달 받은 page number가 0 이면 컬럼 사전 리스트 초기화 + this.pageResult.number === 0 && (this.columnDictionaryList = []); + // page 객체 + this.pageResult = result.page; + // 컬럼 사전 리스트 + this.columnDictionaryList = result['_embedded'] ? + this.columnDictionaryList.concat(result['_embedded'].dictionaries) : + []; + // 로딩 hide + this.loadingHide(); + }).catch((error) => { + // 로딩 hide + this.loadingHide(); + }); } /** @@ -339,7 +338,7 @@ export class ColumnDictionaryComponent extends AbstractComponent implements OnIn const params = { size: this.pageResult.size, page: this.pageResult.number, - sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort + sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort, }; // 검색어 if (!isUndefined(this.searchText) && this.searchText.trim() !== '') { diff --git a/discovery-frontend/src/app/meta-data-management/column-dictionary/create-column-dictionary/create-column-dictionary.component.html b/discovery-frontend/src/app/meta-data-management/column-dictionary/create-column-dictionary/create-column-dictionary.component.html index a8484fb0f4..bbf5499baa 100644 --- a/discovery-frontend/src/app/meta-data-management/column-dictionary/create-column-dictionary/create-column-dictionary.component.html +++ b/discovery-frontend/src/app/meta-data-management/column-dictionary/create-column-dictionary/create-column-dictionary.component.html @@ -154,9 +154,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -323,16 +190,6 @@ - - - - - - - - - - @@ -345,6 +202,7 @@ + diff --git a/discovery-frontend/src/app/meta-data-management/column-dictionary/create-column-dictionary/create-column-dictionary.component.ts b/discovery-frontend/src/app/meta-data-management/column-dictionary/create-column-dictionary/create-column-dictionary.component.ts index 6574da301a..4031c3ad66 100644 --- a/discovery-frontend/src/app/meta-data-management/column-dictionary/create-column-dictionary/create-column-dictionary.component.ts +++ b/discovery-frontend/src/app/meta-data-management/column-dictionary/create-column-dictionary/create-column-dictionary.component.ts @@ -12,18 +12,18 @@ * limitations under the License. */ -import { Component, ElementRef, EventEmitter, Injector, OnDestroy, OnInit, Output, ViewChild } from '@angular/core'; -import { ColumnDictionaryService } from '../service/column-dictionary.service'; -import { Alert } from '../../../common/util/alert.util'; -import { CommonUtil } from '../../../common/util/common.util'; -import { ChooseCodeTableComponent } from '../../component/choose-code-table/choose-code-table.component'; -import { CodeTable } from '../../../domain/meta-data-management/code-table'; -import { FieldFormat, FieldFormatType } from '../../../domain/datasource/datasource'; -import { AbstractComponent } from '../../../common/component/abstract.component'; +import {Component, ElementRef, EventEmitter, Injector, OnDestroy, OnInit, Output, ViewChild} from '@angular/core'; +import {ColumnDictionaryService} from '../service/column-dictionary.service'; +import {Alert} from '../../../common/util/alert.util'; +import {CommonUtil} from '../../../common/util/common.util'; +import {ChooseCodeTableComponent} from '../../component/choose-code-table/choose-code-table.component'; +import {CodeTable} from '../../../domain/meta-data-management/code-table'; +import {FieldFormat, FieldFormatType} from '../../../domain/datasource/datasource'; +import {AbstractComponent} from '../../../common/component/abstract.component'; @Component({ selector: 'app-create-column-dictionary', - templateUrl: './create-column-dictionary.component.html' + templateUrl: './create-column-dictionary.component.html', }) export class CreateColumnDictionaryComponent extends AbstractComponent implements OnInit, OnDestroy { @@ -85,9 +85,10 @@ export class CreateColumnDictionaryComponent extends AbstractComponent implement |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ // 생성자 - constructor(private _columnDictionaryService: ColumnDictionaryService, - protected element: ElementRef, - protected injector: Injector) { + constructor( + private _columnDictionaryService: ColumnDictionaryService, + protected element: ElementRef, + protected injector: Injector) { super(element, injector); } @@ -265,42 +266,48 @@ export class CreateColumnDictionaryComponent extends AbstractComponent implement // 논리명 비어있는지 확인 if (this.logicalName.trim() === '') { // message - this.logicalNameValidationMsg = this.translateService.instant('msg.metadata.ui.dictionary.create.valid.logical.name.required'); + this.logicalNameValidationMsg = this.translateService.instant( + 'msg.metadata.ui.dictionary.create.valid.logical.name.required'); // return return false; } // 논리명 자리수 계산 if (CommonUtil.getByte(this.logicalName.trim()) > 150) { // message - this.logicalNameValidationMsg = this.translateService.instant('msg.metadata.ui.dictionary.create.valid.logical.name.length'); + this.logicalNameValidationMsg = this.translateService.instant( + 'msg.metadata.ui.dictionary.create.valid.logical.name.length'); // return return false; } // 컬럼명 비어있는지 확인 if (this.columnName.trim() === '') { // message - this.columnNameValidationMsg = this.translateService.instant('msg.metadata.ui.dictionary.create.valid.column.name.required'); + this.columnNameValidationMsg = this.translateService.instant( + 'msg.metadata.ui.dictionary.create.valid.column.name.required'); // return return false; } // 컬럼명 자리수 계산 if (CommonUtil.getByte(this.columnName.trim()) > 150) { // message - this.columnNameValidationMsg = this.translateService.instant('msg.metadata.ui.dictionary.create.valid.column.name.length'); + this.columnNameValidationMsg = this.translateService.instant( + 'msg.metadata.ui.dictionary.create.valid.column.name.length'); // return return false; } // 약어가 자리수 계산 if (CommonUtil.getByte(this.shortName.trim()) > 150) { // message - this.shortNameValidationMsg = this.translateService.instant('msg.metadata.ui.dictionary.create.valid.short.name.length'); + this.shortNameValidationMsg = this.translateService.instant( + 'msg.metadata.ui.dictionary.create.valid.short.name.length'); // return return false; } // 설명 자리수 계산 if (CommonUtil.getByte(this.description.trim()) > 150) { // message - this.descriptionValidationMsg = this.translateService.instant('msg.metadata.ui.dictionary.create.valid.desc.length'); + this.descriptionValidationMsg = this.translateService.instant( + 'msg.metadata.ui.dictionary.create.valid.desc.length'); // return return false; } @@ -315,20 +322,19 @@ export class CreateColumnDictionaryComponent extends AbstractComponent implement // 로딩 show this.loadingShow(); // 논리명이 중복인지 확인 - this._columnDictionaryService.getDuplicateLogicalNameInColumnDictionary(this.logicalName.trim()) - .then((result) => { - // 중복 - if (result['duplicated']) { - // message - this.logicalNameValidationMsg = this.translateService.instant('msg.metadata.ui.dictionary.create.valid.logical.name.duplicated', {value: this.logicalName.trim()}); - // 로딩 hide - this.loadingHide(); - } else { - // 컬럼사전 생성 - this._createColumnDictionary(); - } - }) - .catch(error => this.commonExceptionHandler(error)); + this._columnDictionaryService.getDuplicateLogicalNameInColumnDictionary(this.logicalName.trim()).then((result) => { + // 중복 + if (result['duplicated']) { + // message + this.logicalNameValidationMsg = this.translateService.instant( + 'msg.metadata.ui.dictionary.create.valid.logical.name.duplicated', {value: this.logicalName.trim()}); + // 로딩 hide + this.loadingHide(); + } else { + // 컬럼사전 생성 + this._createColumnDictionary(); + } + }).catch(error => this.commonExceptionHandler(error)); } /** @@ -339,17 +345,16 @@ export class CreateColumnDictionaryComponent extends AbstractComponent implement // 로딩 show this.loadingShow(); // 컬럼 사전 생성 - this._columnDictionaryService.createColumnDictionary(this._getCreateColumnDictionaryParams()) - .then((result) => { - // alert - Alert.success(this.translateService.instant('msg.metadata.ui.dictionary.create.success', {value: this.logicalName.trim()})); - // 로딩 hide - this.loadingHide(); - // close - this.createComplete.emit(); - this.onClickCancel(); - }) - .catch(error => this.commonExceptionHandler(error)); + this._columnDictionaryService.createColumnDictionary(this._getCreateColumnDictionaryParams()).then((result) => { + // alert + Alert.success( + this.translateService.instant('msg.metadata.ui.dictionary.create.success', {value: this.logicalName.trim()})); + // 로딩 hide + this.loadingHide(); + // close + this.createComplete.emit(); + this.onClickCancel(); + }).catch(error => this.commonExceptionHandler(error)); } /** @@ -364,7 +369,7 @@ export class CreateColumnDictionaryComponent extends AbstractComponent implement logicalName: this.logicalName.trim(), description: this.description.trim(), logicalType: this.selectedType, - dataType: 'STRING' + dataType: 'STRING', }; // 타입이 시간인경우 format 추가 if (this.selectedType === 'TIMESTAMP') { diff --git a/discovery-frontend/src/app/meta-data-management/column-dictionary/detail-column-dictionary/detail-column-dictionary.component.html b/discovery-frontend/src/app/meta-data-management/column-dictionary/detail-column-dictionary/detail-column-dictionary.component.html index 8b81473fd1..5ed08c5434 100644 --- a/discovery-frontend/src/app/meta-data-management/column-dictionary/detail-column-dictionary/detail-column-dictionary.component.html +++ b/discovery-frontend/src/app/meta-data-management/column-dictionary/detail-column-dictionary/detail-column-dictionary.component.html @@ -11,6 +11,7 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> +
@@ -103,7 +104,7 @@ {{columnDictionary.logicalName}} - + @@ -131,7 +132,7 @@ {{columnDictionary.name}} - + @@ -158,7 +159,7 @@ {{columnDictionary.suggestionShortName}} - + @@ -190,12 +191,6 @@
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -496,7 +360,7 @@ {{(columnDictionary.format && columnDictionary.format.hasOwnProperty('format')) ? columnDictionary.format.format : columnDictionary.format}} - + @@ -513,16 +377,6 @@
diff --git a/discovery-frontend/src/app/meta-data-management/column-dictionary/detail-column-dictionary/detail-column-dictionary.component.ts b/discovery-frontend/src/app/meta-data-management/column-dictionary/detail-column-dictionary/detail-column-dictionary.component.ts index 99a81af185..f6dedb9e7f 100644 --- a/discovery-frontend/src/app/meta-data-management/column-dictionary/detail-column-dictionary/detail-column-dictionary.component.ts +++ b/discovery-frontend/src/app/meta-data-management/column-dictionary/detail-column-dictionary/detail-column-dictionary.component.ts @@ -12,25 +12,25 @@ * limitations under the License. */ -import { AbstractComponent } from '../../../common/component/abstract.component'; -import { Component, ElementRef, Injector, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { DeleteModalComponent } from '../../../common/component/modal/delete/delete.component'; -import { Modal } from '../../../common/domain/modal'; -import { ActivatedRoute } from '@angular/router'; -import { ColumnDictionaryService } from '../service/column-dictionary.service'; -import { Alert } from '../../../common/util/alert.util'; -import { CommonUtil } from '../../../common/util/common.util'; -import { ColumnDictionary } from '../../../domain/meta-data-management/column-dictionary'; -import { ChooseCodeTableComponent } from '../../component/choose-code-table/choose-code-table.component'; -import { CodeTable } from '../../../domain/meta-data-management/code-table'; -import { FieldFormatType, LogicalType } from '../../../domain/datasource/datasource'; +import {AbstractComponent} from '../../../common/component/abstract.component'; +import {Component, ElementRef, Injector, OnDestroy, OnInit, ViewChild} from '@angular/core'; +import {DeleteModalComponent} from '../../../common/component/modal/delete/delete.component'; +import {Modal} from '../../../common/domain/modal'; +import {ActivatedRoute} from '@angular/router'; +import {ColumnDictionaryService} from '../service/column-dictionary.service'; +import {Alert} from '../../../common/util/alert.util'; +import {CommonUtil} from '../../../common/util/common.util'; +import {ColumnDictionary} from '../../../domain/meta-data-management/column-dictionary'; +import {ChooseCodeTableComponent} from '../../component/choose-code-table/choose-code-table.component'; +import {CodeTable} from '../../../domain/meta-data-management/code-table'; +import {FieldFormatType, LogicalType} from '../../../domain/datasource/datasource'; import * as _ from 'lodash'; -import { LinkedMetadataComponent } from '../../component/linked-metadata-columns/linked-metadata.component'; -import { LinkedMetaDataColumn } from '../../../domain/meta-data-management/metadata-column'; +import {LinkedMetadataComponent} from '../../component/linked-metadata-columns/linked-metadata.component'; +import {LinkedMetaDataColumn} from '../../../domain/meta-data-management/metadata-column'; @Component({ selector: 'app-detail-column-dictionary', - templateUrl: './detail-column-dictionary.component.html' + templateUrl: './detail-column-dictionary.component.html', }) export class DetailColumnDictionaryComponent extends AbstractComponent implements OnInit, OnDestroy { @@ -112,10 +112,11 @@ export class DetailColumnDictionaryComponent extends AbstractComponent implement |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ // 생성자 - constructor(private _columnDictionaryService: ColumnDictionaryService, - private _activatedRoute: ActivatedRoute, - protected element: ElementRef, - protected injector: Injector) { + constructor( + private _columnDictionaryService: ColumnDictionaryService, + private _activatedRoute: ActivatedRoute, + protected element: ElementRef, + protected injector: Injector) { super(element, injector); } @@ -157,14 +158,13 @@ export class DetailColumnDictionaryComponent extends AbstractComponent implement // 로딩 show this.loadingShow(); // 컬럼 사전 제거 - this._columnDictionaryService.deleteColumnDictionary(this._columnDictionaryId) - .then((result) => { - // alert - Alert.success(this.translateService.instant('msg.metadata.ui.dictionary.delete.success', {value: this.columnDictionary.logicalName})); - // 컬럼 사전 목록으로 돌아가기 - this.router.navigate(['/management/metadata/column-dictionary']); - }) - .catch(error => this.commonExceptionHandler(error)); + this._columnDictionaryService.deleteColumnDictionary(this._columnDictionaryId).then((result) => { + // alert + Alert.success(this.translateService.instant('msg.metadata.ui.dictionary.delete.success', + {value: this.columnDictionary.logicalName})); + // 컬럼 사전 목록으로 돌아가기 + this.router.navigate(['/management/metadata/column-dictionary']); + }).catch(error => this.commonExceptionHandler(error)); } /** @@ -200,7 +200,7 @@ export class DetailColumnDictionaryComponent extends AbstractComponent implement * @returns {LinkedMetaDataColumn[]} */ public getLinkedMetaDataColumn(): LinkedMetaDataColumn[] { - return this.linkedMetadataList.slice(0,3); + return this.linkedMetadataList.slice(0, 3); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -221,7 +221,7 @@ export class DetailColumnDictionaryComponent extends AbstractComponent implement public onClickDeleteColumnDictionary(): void { const modal = new Modal(); modal.name = this.translateService.instant('msg.metadata.ui.dictionary.delete.title'); - modal.description = this.columnDictionary.logicalName; + modal.description = this.columnDictionary.logicalName; modal.btnName = this.translateService.instant('msg.comm.ui.del'); this._deleteComp.init(modal); } @@ -263,7 +263,9 @@ export class DetailColumnDictionaryComponent extends AbstractComponent implement */ public onChangeTimeFormatMode(): void { this.timeFormatEditFl = true; - this.reTimeFormat = (this.columnDictionary.format && this.columnDictionary.format.hasOwnProperty('format')) ? this.columnDictionary.format.format : this.columnDictionary.format; + this.reTimeFormat = (this.columnDictionary.format && this.columnDictionary.format.hasOwnProperty('format')) ? + this.columnDictionary.format.format : + this.columnDictionary.format; } /** @@ -324,12 +326,13 @@ export class DetailColumnDictionaryComponent extends AbstractComponent implement // 로딩 show this.loadingShow(); // 논리명이 중복인지 확인 - this._columnDictionaryService.getDuplicateLogicalNameInColumnDictionary(this.reLogicalName.trim()) - .then((result) => { + this._columnDictionaryService.getDuplicateLogicalNameInColumnDictionary(this.reLogicalName.trim()). + then((result) => { // 중복 if (result['duplicated']) { // alert - Alert.warning(this.translateService.instant('msg.metadata.ui.dictionary.create.valid.logical.name.duplicated', {value: this.reLogicalName.trim()})); + Alert.warning(this.translateService.instant('msg.metadata.ui.dictionary.create.valid.logical.name.duplicated', + {value: this.reLogicalName.trim()})); // 로딩 hide this.loadingHide(); } else { @@ -340,8 +343,8 @@ export class DetailColumnDictionaryComponent extends AbstractComponent implement // 컬럼 사전 업데이트 this._updateColumnDictionary({logicalName: this.reLogicalName.trim()}); } - }) - .catch(error => this.commonExceptionHandler(error)); + }). + catch(error => this.commonExceptionHandler(error)); } /** @@ -417,10 +420,12 @@ export class DetailColumnDictionaryComponent extends AbstractComponent implement // blur // this.descElement.nativeElement.blur(); // 컬럼 사전 업데이트 - this._updateColumnDictionary({format: { - format: this.reTimeFormat.trim(), - type: FieldFormatType.DATE_TIME - }}); + this._updateColumnDictionary({ + format: { + format: this.reTimeFormat.trim(), + type: FieldFormatType.DATE_TIME, + }, + }); } /** @@ -437,7 +442,7 @@ export class DetailColumnDictionaryComponent extends AbstractComponent implement */ public onClickCodeTableDetails(codeTable: CodeTable): void { // 해당 코드 테이블 상세화면으로 이동 - this.router.navigate(['management/metadata/code-table', codeTable.id]) + this.router.navigate(['management/metadata/code-table', codeTable.id]); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -471,18 +476,17 @@ export class DetailColumnDictionaryComponent extends AbstractComponent implement * @param {Object} params * @private */ - private _updateColumnDictionary(params? : object): void { + private _updateColumnDictionary(params?: object): void { // 로딩 show this.loadingShow(); // 컬럼 사전 업데이트 - this._columnDictionaryService.updateColumnDictionary(this._columnDictionaryId, params || this._getUpdateColumnDictionaryParams()) - .then((result) => { - // alert - Alert.success(this.translateService.instant('msg.comm.alert.confirm.success')); - // 재조회 - this._getDetailColumnDictionary(); - }) - .catch(error => this.commonExceptionHandler(error)); + this._columnDictionaryService.updateColumnDictionary(this._columnDictionaryId, + params || this._getUpdateColumnDictionaryParams()).then((result) => { + // alert + Alert.success(this.translateService.instant('msg.comm.alert.confirm.success')); + // 재조회 + this._getDetailColumnDictionary(); + }).catch(error => this.commonExceptionHandler(error)); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -497,16 +501,15 @@ export class DetailColumnDictionaryComponent extends AbstractComponent implement // 로딩 show this.loadingShow(); // 컬럼 사전 상세조회 - this._columnDictionaryService.getColumnDictionaryDetail(this._columnDictionaryId) - .then((result) => { - // 상세정보 - this.columnDictionary = result; - // 설명이 존재한다면 enter가 있는지 - this.columnDictionary.description && (this.description = this.columnDictionary.description.replace( /\r\n|\n/gi, '
' )); - // 현재 컬럼 사전에 연결된 메타데이터 목록 조회 - this._getMetadataInColumnDictionary(); - }) - .catch(error => this.commonExceptionHandler(error)); + this._columnDictionaryService.getColumnDictionaryDetail(this._columnDictionaryId).then((result) => { + // 상세정보 + this.columnDictionary = result; + // 설명이 존재한다면 enter가 있는지 + this.columnDictionary.description && + (this.description = this.columnDictionary.description.replace(/\r\n|\n/gi, '
')); + // 현재 컬럼 사전에 연결된 메타데이터 목록 조회 + this._getMetadataInColumnDictionary(); + }).catch(error => this.commonExceptionHandler(error)); } /** @@ -517,14 +520,12 @@ export class DetailColumnDictionaryComponent extends AbstractComponent implement // 로딩 show this.loadingShow(); // 코드 테이블 조회 - this._columnDictionaryService.getCodeTableInColumnDictionary(this._columnDictionaryId) - .then((result) => { - // 코드테이블 - this.columnDictionary.codeTable = result; - // 로딩 hide - this.loadingHide(); - }) - .catch(error => this.commonExceptionHandler(error)); + this._columnDictionaryService.getCodeTableInColumnDictionary(this._columnDictionaryId).then((result) => { + // 코드테이블 + this.columnDictionary.codeTable = result; + // 로딩 hide + this.loadingHide(); + }).catch(error => this.commonExceptionHandler(error)); } /** @@ -535,16 +536,15 @@ export class DetailColumnDictionaryComponent extends AbstractComponent implement // 로딩 show this.loadingShow(); // 메타데이터 조회 - this._columnDictionaryService.getMetadataInColumnDictionary(this._columnDictionaryId, {sort:'metadataName,asc', size: 15, page: 0}) - .then((result) => { - // 메타데이터 목록 저장 - this.linkedMetadataList = result['_embedded'] ? result['_embedded'].metacolumns : []; - // 목록 수 - this.linkedMetadataTotalCount = result['page'].totalElements; - // 코드 테이블이 있다면 코드테이블 조회 - this.columnDictionary.linkCodeTable ? this._getCodeTableInColumnDictionary() : this.loadingHide(); - }) - .catch(error => this.commonExceptionHandler(error)); + this._columnDictionaryService.getMetadataInColumnDictionary(this._columnDictionaryId, + {sort: 'metadataName,asc', size: 15, page: 0}).then((result) => { + // 메타데이터 목록 저장 + this.linkedMetadataList = result['_embedded'] ? result['_embedded'].metacolumns : []; + // 목록 수 + this.linkedMetadataTotalCount = result['page'].totalElements; + // 코드 테이블이 있다면 코드테이블 조회 + this.columnDictionary.linkCodeTable ? this._getCodeTableInColumnDictionary() : this.loadingHide(); + }).catch(error => this.commonExceptionHandler(error)); } /** @@ -553,9 +553,7 @@ export class DetailColumnDictionaryComponent extends AbstractComponent implement * @private */ private _getUpdateColumnDictionaryParams(): object { - const params = { - - }; + const params = {}; return params; } diff --git a/discovery-frontend/src/app/meta-data-management/column-dictionary/service/column-dictionary.service.ts b/discovery-frontend/src/app/meta-data-management/column-dictionary/service/column-dictionary.service.ts index ebda566bc9..a390882e05 100644 --- a/discovery-frontend/src/app/meta-data-management/column-dictionary/service/column-dictionary.service.ts +++ b/discovery-frontend/src/app/meta-data-management/column-dictionary/service/column-dictionary.service.ts @@ -12,9 +12,9 @@ * limitations under the License. */ -import { Injectable, Injector } from '@angular/core'; -import { AbstractService } from '../../../common/service/abstract.service'; -import { CommonUtil } from '../../../common/util/common.util'; +import {Injectable, Injector} from '@angular/core'; +import {AbstractService} from '../../../common/service/abstract.service'; +import {CommonUtil} from '../../../common/util/common.util'; @Injectable() export class ColumnDictionaryService extends AbstractService { @@ -118,7 +118,8 @@ export class ColumnDictionaryService extends AbstractService { * @returns {Promise} */ public linkCodeTableWithColumnDictionary(dictionaryId: string, codeTableId: string): Promise { - return this.put(this.URL_DICTIONARY + `/${dictionaryId}/codetable`,`/api/codetables/${codeTableId}` ,'text/uri-list') + return this.put(this.URL_DICTIONARY + `/${dictionaryId}/codetable`, `/api/codetables/${codeTableId}`, + 'text/uri-list'); } /** @@ -148,7 +149,8 @@ export class ColumnDictionaryService extends AbstractService { * @param {string} projection * @returns {Promise} */ - public getMetadataInColumnDictionary(dictionaryId: string, params: object, projection: string = 'forDictionaryListView'): Promise { + public getMetadataInColumnDictionary( + dictionaryId: string, params: object, projection: string = 'forDictionaryListView'): Promise { let url = this.URL_DICTIONARY + `/${dictionaryId}/columns?projection=${projection}`; (params) && (url += '&' + CommonUtil.objectToUrlString(params)); return this.get(url); diff --git a/discovery-frontend/src/app/meta-data-management/component/choose-code-table/choose-code-table.component.html b/discovery-frontend/src/app/meta-data-management/component/choose-code-table/choose-code-table.component.html index 1671733352..90b7216bc7 100644 --- a/discovery-frontend/src/app/meta-data-management/component/choose-code-table/choose-code-table.component.html +++ b/discovery-frontend/src/app/meta-data-management/component/choose-code-table/choose-code-table.component.html @@ -45,7 +45,6 @@ {{'msg.metadata.ui.codetable.create.btn' | translate}} -
@@ -70,11 +69,9 @@ -
-
@@ -83,7 +80,6 @@ - - -
{{'msg.metadata.ui.codetable.choose.code.table.preview' | translate}}
- +
{{'msg.metadata.ui.codetable.choose.code.table.preview.title' | translate}}
@@ -161,6 +156,7 @@
+ diff --git a/discovery-frontend/src/app/meta-data-management/component/choose-code-table/choose-code-table.component.ts b/discovery-frontend/src/app/meta-data-management/component/choose-code-table/choose-code-table.component.ts index e05e705719..1d9df4ba9d 100644 --- a/discovery-frontend/src/app/meta-data-management/component/choose-code-table/choose-code-table.component.ts +++ b/discovery-frontend/src/app/meta-data-management/component/choose-code-table/choose-code-table.component.ts @@ -12,20 +12,20 @@ * limitations under the License. */ -import { AbstractComponent } from '../../../common/component/abstract.component'; -import { Component, ElementRef, EventEmitter, Injector, OnDestroy, OnInit, Output, ViewChild } from '@angular/core'; -import { CodeTable } from '../../../domain/meta-data-management/code-table'; -import { CreateCodeTableComponent } from '../../code-table/create-code-table/create-code-table.component'; -import { CodeTableService } from '../../code-table/service/code-table.service'; -import { isUndefined } from 'util'; -import { ColumnDictionaryService } from '../../column-dictionary/service/column-dictionary.service'; +import {AbstractComponent} from '../../../common/component/abstract.component'; +import {Component, ElementRef, EventEmitter, Injector, OnDestroy, OnInit, Output, ViewChild} from '@angular/core'; +import {CodeTable} from '../../../domain/meta-data-management/code-table'; +import {CreateCodeTableComponent} from '../../code-table/create-code-table/create-code-table.component'; +import {CodeTableService} from '../../code-table/service/code-table.service'; +import {isUndefined} from 'util'; +import {ColumnDictionaryService} from '../../column-dictionary/service/column-dictionary.service'; import * as _ from 'lodash'; -import { Alert } from '../../../common/util/alert.util'; -import { CodeValuePair } from '../../../domain/meta-data-management/code-value-pair'; +import {Alert} from '../../../common/util/alert.util'; +import {CodeValuePair} from '../../../domain/meta-data-management/code-value-pair'; @Component({ selector: 'app-choose-code-table', - templateUrl: './choose-code-table.component.html' + templateUrl: './choose-code-table.component.html', }) export class ChooseCodeTableComponent extends AbstractComponent implements OnInit, OnDestroy { @@ -75,10 +75,11 @@ export class ChooseCodeTableComponent extends AbstractComponent implements OnIni |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ // 생성자 - constructor(private _columnDictionaryService: ColumnDictionaryService, - private _codeTableService: CodeTableService, - protected element: ElementRef, - protected injector: Injector) { + constructor( + private _columnDictionaryService: ColumnDictionaryService, + private _codeTableService: CodeTableService, + protected element: ElementRef, + protected injector: Injector) { super(element, injector); } @@ -133,7 +134,7 @@ export class ChooseCodeTableComponent extends AbstractComponent implements OnIni * @returns {boolean} */ public isMoreContents(): boolean { - return (this.pageResult.number < this.pageResult.totalPages -1); + return (this.pageResult.number < this.pageResult.totalPages - 1); } /** @@ -168,7 +169,7 @@ export class ChooseCodeTableComponent extends AbstractComponent implements OnIni public onClickDone(): void { // 생성모드일 경우 선택한 테이블 전달 // 수정모드일 경우 현재 컬럼 사전에 선택한 코드 테이블 연결 또는 연결해제 - this._mode === 'CREATE' ? this._emitCodeTable(): this._updateCodeTable(); + this._mode === 'CREATE' ? this._emitCodeTable() : this._updateCodeTable(); } /** @@ -277,7 +278,7 @@ export class ChooseCodeTableComponent extends AbstractComponent implements OnIni */ public onClickCodeTableDetails(codeTable: CodeTable): void { // 해당 코드 테이블 상세화면으로 이동 - this.router.navigate(['management/metadata/code-table', codeTable.id]) + this.router.navigate(['management/metadata/code-table', codeTable.id]); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -329,16 +330,16 @@ export class ChooseCodeTableComponent extends AbstractComponent implements OnIni // 로딩 show this.loadingShow(); // 현재 컬럼사전에 선택한 코드 테이블 연결 - this._columnDictionaryService.linkCodeTableWithColumnDictionary(this._dictionaryId, this.selectedCodeTable.id) - .then((result) => { + this._columnDictionaryService.linkCodeTableWithColumnDictionary(this._dictionaryId, this.selectedCodeTable.id). + then((result) => { // 로딩 hide this.loadingHide(); // alert Alert.success(this.translateService.instant('msg.comm.alert.confirm.success')); // close this._emitCodeTable(); - }) - .catch(error => this.commonExceptionHandler(error)); + }). + catch(error => this.commonExceptionHandler(error)); } /** @@ -349,16 +350,15 @@ export class ChooseCodeTableComponent extends AbstractComponent implements OnIni // 로딩 show this.loadingShow(); // 현재 컬럼사전에 선택한 코드 테이블 연결 - this._columnDictionaryService.unlinkCodeTableWithColumnDictionary(this._dictionaryId, this._originSelectedCodeTable.id) - .then((result) => { - // 로딩 hide - this.loadingHide(); - // alert - Alert.success(this.translateService.instant('msg.comm.alert.confirm.success')); - // close - this._emitCodeTable(); - }) - .catch(error => this.commonExceptionHandler(error)); + this._columnDictionaryService.unlinkCodeTableWithColumnDictionary(this._dictionaryId, + this._originSelectedCodeTable.id).then((result) => { + // 로딩 hide + this.loadingHide(); + // alert + Alert.success(this.translateService.instant('msg.comm.alert.confirm.success')); + // close + this._emitCodeTable(); + }).catch(error => this.commonExceptionHandler(error)); } /** @@ -392,18 +392,16 @@ export class ChooseCodeTableComponent extends AbstractComponent implements OnIni // 로딩 show this.loadingShow(); // 코드 테이블 리스트 조회 - this._codeTableService.getCodeTableList(this._getCodeTableListParams()) - .then((result) => { - // 전달 받은 page number가 0 이면 코드 테이블 리스트 초기화 - this.pageResult.number === 0 && (this.codeTableList = []); - // page 객체 - this.pageResult = result.page; - // 코드 테이블 리스트 - this.codeTableList = result['_embedded'] ? this.codeTableList.concat(result['_embedded'].codetables) : []; - // 로딩 hide - this.loadingHide(); - }) - .catch(error => this.commonExceptionHandler(error)); + this._codeTableService.getCodeTableList(this._getCodeTableListParams()).then((result) => { + // 전달 받은 page number가 0 이면 코드 테이블 리스트 초기화 + this.pageResult.number === 0 && (this.codeTableList = []); + // page 객체 + this.pageResult = result.page; + // 코드 테이블 리스트 + this.codeTableList = result['_embedded'] ? this.codeTableList.concat(result['_embedded'].codetables) : []; + // 로딩 hide + this.loadingHide(); + }).catch(error => this.commonExceptionHandler(error)); } /** @@ -415,7 +413,7 @@ export class ChooseCodeTableComponent extends AbstractComponent implements OnIni const params = { size: this.pageResult.size, page: this.pageResult.number, - sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort + sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort, }; // 검색어 if (!isUndefined(this.searchText) && this.searchText.trim() !== '') { @@ -433,14 +431,12 @@ export class ChooseCodeTableComponent extends AbstractComponent implements OnIni // 로딩 show this.loadingShow(); // 코드 테이블 상세조회 - this._codeTableService.getCodeTableDetail(codeTableId) - .then((result) => { - // 코드 테이블 상세조회 데이터 - this._codeTableDetailList.push(result); - // 로딩 hide - this.loadingHide(); - }) - .catch(error => this.commonExceptionHandler(error)); + this._codeTableService.getCodeTableDetail(codeTableId).then((result) => { + // 코드 테이블 상세조회 데이터 + this._codeTableDetailList.push(result); + // 로딩 hide + this.loadingHide(); + }).catch(error => this.commonExceptionHandler(error)); } } diff --git a/discovery-frontend/src/app/meta-data-management/component/choose-column-dictionary/choose-column-dictionary.component.html b/discovery-frontend/src/app/meta-data-management/component/choose-column-dictionary/choose-column-dictionary.component.html index afc6cace98..4b81133ea5 100644 --- a/discovery-frontend/src/app/meta-data-management/component/choose-column-dictionary/choose-column-dictionary.component.html +++ b/discovery-frontend/src/app/meta-data-management/component/choose-column-dictionary/choose-column-dictionary.component.html @@ -42,7 +42,6 @@ -
@@ -73,11 +72,9 @@
-
@@ -86,7 +83,6 @@ - {{dictionary.name}} -
{{dictionary.description}} @@ -109,7 +104,6 @@
-
@@ -122,6 +116,5 @@ - diff --git a/discovery-frontend/src/app/meta-data-management/component/choose-column-dictionary/choose-column-dictionary.component.ts b/discovery-frontend/src/app/meta-data-management/component/choose-column-dictionary/choose-column-dictionary.component.ts index 27b47d8bd5..ac94daf5be 100644 --- a/discovery-frontend/src/app/meta-data-management/component/choose-column-dictionary/choose-column-dictionary.component.ts +++ b/discovery-frontend/src/app/meta-data-management/component/choose-column-dictionary/choose-column-dictionary.component.ts @@ -12,16 +12,16 @@ * limitations under the License. */ -import { Component, ElementRef, EventEmitter, Injector, OnDestroy, OnInit, Output } from '@angular/core'; -import { AbstractComponent } from '../../../common/component/abstract.component'; -import { ColumnDictionary } from '../../../domain/meta-data-management/column-dictionary'; -import { ColumnDictionaryService } from '../../column-dictionary/service/column-dictionary.service'; -import { isUndefined } from 'util'; +import {Component, ElementRef, EventEmitter, Injector, OnDestroy, OnInit, Output} from '@angular/core'; +import {AbstractComponent} from '../../../common/component/abstract.component'; +import {ColumnDictionary} from '../../../domain/meta-data-management/column-dictionary'; +import {ColumnDictionaryService} from '../../column-dictionary/service/column-dictionary.service'; +import {isUndefined} from 'util'; import * as _ from 'lodash'; @Component({ selector: 'app-choose-column-dictionary', - templateUrl: './choose-column-dictionary.component.html' + templateUrl: './choose-column-dictionary.component.html', }) export class ChooseColumnDictionaryComponent extends AbstractComponent implements OnInit, OnDestroy { @@ -65,9 +65,10 @@ export class ChooseColumnDictionaryComponent extends AbstractComponent implement |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ // 생성자 - constructor(private _dictionaryService: ColumnDictionaryService, - protected element: ElementRef, - protected injector: Injector) { + constructor( + private _dictionaryService: ColumnDictionaryService, + protected element: ElementRef, + protected injector: Injector) { super(element, injector); } @@ -124,7 +125,7 @@ export class ChooseColumnDictionaryComponent extends AbstractComponent implement * @returns {boolean} */ public isMoreContents(): boolean { - return (this.pageResult.number < this.pageResult.totalPages -1); + return (this.pageResult.number < this.pageResult.totalPages - 1); } /** @@ -147,7 +148,7 @@ export class ChooseColumnDictionaryComponent extends AbstractComponent implement public onClickDone(): void { // 생성모드일 경우 선택한 컬럼 사전 전달 // 수정모드일 경우 TODO - this._mode === 'CREATE' ? this._emitColumnDictionary() : this._updateColumnDictionary(); + this._mode === 'CREATE' ? this._emitColumnDictionary() : this._updateColumnDictionary(); } /** @@ -202,7 +203,8 @@ export class ChooseColumnDictionaryComponent extends AbstractComponent implement * @param {ColumnDictionary} columnDictionary */ public onSelectColumnDictionary(columnDictionary: ColumnDictionary): void { - this.selectedColumnDictionary = (this.selectedColumnDictionary && this.selectedColumnDictionary.id === columnDictionary.id) ? null : columnDictionary; + this.selectedColumnDictionary = (this.selectedColumnDictionary && this.selectedColumnDictionary.id === + columnDictionary.id) ? null : columnDictionary; } /** @@ -270,7 +272,9 @@ export class ChooseColumnDictionaryComponent extends AbstractComponent implement */ private _updateColumnDictionary(): void { // 기존의 선택한 컬럼 사전이 있다면 - (this._originSelectedColumnDictionary && !this.selectedColumnDictionary) ? this._unLinkColumnDictionary() : this._linkColumnDictionary(); + (this._originSelectedColumnDictionary && !this.selectedColumnDictionary) ? + this._unLinkColumnDictionary() : + this._linkColumnDictionary(); } /** @@ -303,18 +307,18 @@ export class ChooseColumnDictionaryComponent extends AbstractComponent implement // 로딩 show this.loadingShow(); // 컬럼 사전 목록 조회 - this._dictionaryService.getColumnDictionaryList(this._getColumnDictionaryListParams()) - .then((result) => { - // 전달 받은 page number가 0 이면 컬럼 사전 리스트 초기화 - this.pageResult.number === 0 && (this.columnDictionaryList = []); - // page 객체 - this.pageResult = result.page; - // 컬럼 사전 리스트 - this.columnDictionaryList = result['_embedded'] ? this.columnDictionaryList.concat(result['_embedded'].dictionaries) : []; - // 로딩 hide - this.loadingHide(); - }) - .catch(error => this.commonExceptionHandler(error)); + this._dictionaryService.getColumnDictionaryList(this._getColumnDictionaryListParams()).then((result) => { + // 전달 받은 page number가 0 이면 컬럼 사전 리스트 초기화 + this.pageResult.number === 0 && (this.columnDictionaryList = []); + // page 객체 + this.pageResult = result.page; + // 컬럼 사전 리스트 + this.columnDictionaryList = result['_embedded'] ? + this.columnDictionaryList.concat(result['_embedded'].dictionaries) : + []; + // 로딩 hide + this.loadingHide(); + }).catch(error => this.commonExceptionHandler(error)); } /** @@ -326,7 +330,7 @@ export class ChooseColumnDictionaryComponent extends AbstractComponent implement const params = { size: this.pageResult.size, page: this.pageResult.number, - sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort + sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort, }; // 검색어 if (!isUndefined(this.searchText) && this.searchText.trim() !== '') { diff --git a/discovery-frontend/src/app/meta-data-management/component/linked-column-dictionary/linked-column-dictionary.component.html b/discovery-frontend/src/app/meta-data-management/component/linked-column-dictionary/linked-column-dictionary.component.html index 2972e9c798..7aaf59b197 100644 --- a/discovery-frontend/src/app/meta-data-management/component/linked-column-dictionary/linked-column-dictionary.component.html +++ b/discovery-frontend/src/app/meta-data-management/component/linked-column-dictionary/linked-column-dictionary.component.html @@ -23,7 +23,6 @@ -
diff --git a/discovery-frontend/src/app/meta-data-management/component/linked-column-dictionary/linked-column-dictionary.component.ts b/discovery-frontend/src/app/meta-data-management/component/linked-column-dictionary/linked-column-dictionary.component.ts index 482957cb22..c8ad398aa1 100644 --- a/discovery-frontend/src/app/meta-data-management/component/linked-column-dictionary/linked-column-dictionary.component.ts +++ b/discovery-frontend/src/app/meta-data-management/component/linked-column-dictionary/linked-column-dictionary.component.ts @@ -12,14 +12,14 @@ * limitations under the License. */ -import { AbstractComponent } from '../../../common/component/abstract.component'; -import { Component, ElementRef, Injector, OnDestroy, OnInit } from '@angular/core'; -import { CodeTableService } from '../../code-table/service/code-table.service'; -import { ColumnDictionary } from '../../../domain/meta-data-management/column-dictionary'; +import {AbstractComponent} from '../../../common/component/abstract.component'; +import {Component, ElementRef, Injector, OnDestroy, OnInit} from '@angular/core'; +import {CodeTableService} from '../../code-table/service/code-table.service'; +import {ColumnDictionary} from '../../../domain/meta-data-management/column-dictionary'; @Component({ selector: 'app-linked-column-dictionary', - templateUrl: './linked-column-dictionary.component.html' + templateUrl: './linked-column-dictionary.component.html', }) export class LinkedColumnDictionaryComponent extends AbstractComponent implements OnInit, OnDestroy { @@ -50,9 +50,10 @@ export class LinkedColumnDictionaryComponent extends AbstractComponent implement |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ // 생성자 - constructor(private _codeTableService: CodeTableService, - protected element: ElementRef, - protected injector: Injector) { + constructor( + private _codeTableService: CodeTableService, + protected element: ElementRef, + protected injector: Injector) { super(element, injector); } @@ -98,7 +99,7 @@ export class LinkedColumnDictionaryComponent extends AbstractComponent implement * @returns {boolean} */ public isMoreContents(): boolean { - return (this.pageResult.number < this.pageResult.totalPages -1); + return (this.pageResult.number < this.pageResult.totalPages - 1); } /** @@ -165,7 +166,6 @@ export class LinkedColumnDictionaryComponent extends AbstractComponent implement this.router.navigate(['management/metadata/column-dictionary', columnDictionary.id]); } - /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Protected Method |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -196,18 +196,19 @@ export class LinkedColumnDictionaryComponent extends AbstractComponent implement // 로딩 show this.loadingShow(); // 컬럼 사전 목록 조회 - this._codeTableService.getColumnDictionaryInCodeTable(this._codeTableId, this._getColumnDictionaryListParams(), 'forListView') - .then((result) => { - // 전달 받은 page number가 0 이면 연결된 컬럼 사전 목록 초기화 - this.pageResult.number === 0 && (this.columnDictionaryList = []); - // page - this.pageResult = result['page']; - // 연결된 물리 컬럼 목록 - this.columnDictionaryList = result['_embedded'] ? this.columnDictionaryList.concat(result['_embedded'].dictionaries) : []; - // 로딩 hide - this.loadingHide(); - }) - .catch(error => this.commonExceptionHandler(error)); + this._codeTableService.getColumnDictionaryInCodeTable(this._codeTableId, this._getColumnDictionaryListParams(), + 'forListView').then((result) => { + // 전달 받은 page number가 0 이면 연결된 컬럼 사전 목록 초기화 + this.pageResult.number === 0 && (this.columnDictionaryList = []); + // page + this.pageResult = result['page']; + // 연결된 물리 컬럼 목록 + this.columnDictionaryList = result['_embedded'] ? + this.columnDictionaryList.concat(result['_embedded'].dictionaries) : + []; + // 로딩 hide + this.loadingHide(); + }).catch(error => this.commonExceptionHandler(error)); } /** @@ -230,7 +231,7 @@ export class LinkedColumnDictionaryComponent extends AbstractComponent implement const params = { size: this.pageResult.size, page: this.pageResult.number, - sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort + sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort, }; return params; diff --git a/discovery-frontend/src/app/meta-data-management/component/linked-metadata-columns/linked-metadata.component.html b/discovery-frontend/src/app/meta-data-management/component/linked-metadata-columns/linked-metadata.component.html index d6dc94498e..2e4d3aa25f 100644 --- a/discovery-frontend/src/app/meta-data-management/component/linked-metadata-columns/linked-metadata.component.html +++ b/discovery-frontend/src/app/meta-data-management/component/linked-metadata-columns/linked-metadata.component.html @@ -23,7 +23,6 @@
-
diff --git a/discovery-frontend/src/app/meta-data-management/component/linked-metadata-columns/linked-metadata.component.ts b/discovery-frontend/src/app/meta-data-management/component/linked-metadata-columns/linked-metadata.component.ts index f6c9036434..1292906add 100644 --- a/discovery-frontend/src/app/meta-data-management/component/linked-metadata-columns/linked-metadata.component.ts +++ b/discovery-frontend/src/app/meta-data-management/component/linked-metadata-columns/linked-metadata.component.ts @@ -12,16 +12,15 @@ * limitations under the License. */ -import { AbstractComponent } from '../../../common/component/abstract.component'; -import { Component, ElementRef, Injector, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { ColumnDictionaryService } from '../../column-dictionary/service/column-dictionary.service'; -import { ConfirmModalComponent } from '../../../common/component/modal/confirm/confirm.component'; -import { Modal } from '../../../common/domain/modal'; -import { LinkedMetaDataColumn, MetadataColumn } from '../../../domain/meta-data-management/metadata-column'; +import {AbstractComponent} from '../../../common/component/abstract.component'; +import {Component, ElementRef, Injector, OnDestroy, OnInit, ViewChild} from '@angular/core'; +import {ColumnDictionaryService} from '../../column-dictionary/service/column-dictionary.service'; +import {ConfirmModalComponent} from '../../../common/component/modal/confirm/confirm.component'; +import {LinkedMetaDataColumn} from '../../../domain/meta-data-management/metadata-column'; @Component({ selector: 'app-linked-metadata', - templateUrl: './linked-metadata.component.html' + templateUrl: './linked-metadata.component.html', }) export class LinkedMetadataComponent extends AbstractComponent implements OnInit, OnDestroy { @@ -58,9 +57,10 @@ export class LinkedMetadataComponent extends AbstractComponent implements OnInit |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ // 생성자 - constructor(private _columnDictionaryService: ColumnDictionaryService, - protected element: ElementRef, - protected injector: Injector) { + constructor( + private _columnDictionaryService: ColumnDictionaryService, + protected element: ElementRef, + protected injector: Injector) { super(element, injector); } @@ -106,7 +106,7 @@ export class LinkedMetadataComponent extends AbstractComponent implements OnInit * @returns {boolean} */ public isMoreContents(): boolean { - return (this.pageResult.number < this.pageResult.totalPages -1); + return (this.pageResult.number < this.pageResult.totalPages - 1); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -194,18 +194,18 @@ export class LinkedMetadataComponent extends AbstractComponent implements OnInit // 로딩 show this.loadingShow(); // 컬럼 목록 조회 - this._columnDictionaryService.getMetadataInColumnDictionary(this._dictionaryId, this._getMetadataListParams()) - .then((result) => { + this._columnDictionaryService.getMetadataInColumnDictionary(this._dictionaryId, this._getMetadataListParams()). + then((result) => { // 전달 받은 page number가 0 이면 연결된 메타데이터 컬럼 목록 초기화 this.pageResult.number === 0 && (this.metaDataList = []); // page this.pageResult = result['page']; // 연결된 메타데이터 컬럼 목록 - this.metaDataList = result['_embedded']? this.metaDataList.concat(result['_embedded'].metacolumns) : []; + this.metaDataList = result['_embedded'] ? this.metaDataList.concat(result['_embedded'].metacolumns) : []; // 로딩 hide this.loadingHide(); - }) - .catch(error => this.commonExceptionHandler(error)); + }). + catch(error => this.commonExceptionHandler(error)); } /** @@ -228,7 +228,7 @@ export class LinkedMetadataComponent extends AbstractComponent implements OnInit const params = { size: this.pageResult.size, page: this.pageResult.number, - sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort + sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort, }; return params; diff --git a/discovery-frontend/src/app/meta-data-management/meta-data-management.component.html b/discovery-frontend/src/app/meta-data-management/meta-data-management.component.html index b3f9571688..b1382ba5e0 100644 --- a/discovery-frontend/src/app/meta-data-management/meta-data-management.component.html +++ b/discovery-frontend/src/app/meta-data-management/meta-data-management.component.html @@ -46,6 +46,7 @@ - + +
diff --git a/discovery-frontend/src/app/meta-data-management/meta-data-management.component.ts b/discovery-frontend/src/app/meta-data-management/meta-data-management.component.ts index c5874d85c2..03130247a3 100644 --- a/discovery-frontend/src/app/meta-data-management/meta-data-management.component.ts +++ b/discovery-frontend/src/app/meta-data-management/meta-data-management.component.ts @@ -12,14 +12,14 @@ * limitations under the License. */ -import { AbstractComponent } from '../common/component/abstract.component'; -import { Component, ElementRef, Injector } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import {AbstractComponent} from '../common/component/abstract.component'; +import {Component, ElementRef, Injector} from '@angular/core'; +import {ActivatedRoute} from '@angular/router'; import * as _ from 'lodash'; @Component({ selector: 'app-meta-data-management', - templateUrl: './meta-data-management.component.html' + templateUrl: './meta-data-management.component.html', }) export class MetaDataManagementComponent extends AbstractComponent { @@ -32,7 +32,7 @@ export class MetaDataManagementComponent extends AbstractComponent { {id: 'metadata'}, {id: 'column-dictionary'}, {id: 'code-table'}, - {id: 'catalog'} + {id: 'catalog'}, ]; /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -52,16 +52,17 @@ export class MetaDataManagementComponent extends AbstractComponent { |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ // 생성자 - constructor(private activatedRoute: ActivatedRoute, - protected element: ElementRef, - protected injector: Injector) { + constructor( + private activatedRoute: ActivatedRoute, + protected element: ElementRef, + protected injector: Injector) { super(element, injector); // path variable this.activatedRoute.params.subscribe((params) => { // tabId가 tabList에 없다면 - if (-1 === _.findIndex(this._tabList, { id: params['tabId'] })) { + if (-1 === _.findIndex(this._tabList, {id: params['tabId']})) { // metadata 리스트 페이지로 redirect // TODO 추후 metadata-list로 변경 diff --git a/discovery-frontend/src/app/meta-data-management/meta-data-management.module.ts b/discovery-frontend/src/app/meta-data-management/meta-data-management.module.ts index 2f76e67a42..5399c79c01 100644 --- a/discovery-frontend/src/app/meta-data-management/meta-data-management.module.ts +++ b/discovery-frontend/src/app/meta-data-management/meta-data-management.module.ts @@ -12,57 +12,59 @@ * limitations under the License. */ -import { EventBroadcaster } from '../common/event/event.broadcaster'; -import { NgModule } from '@angular/core'; -import { MetaDataManagementComponent } from './meta-data-management.component'; -import { RouterModule } from '@angular/router'; -import { CommonModule } from '../common/common.module'; -import { ColumnDictionaryComponent } from './column-dictionary/column-dictionary.component'; -import { DetailColumnDictionaryComponent } from './column-dictionary/detail-column-dictionary/detail-column-dictionary.component'; -import { CreateColumnDictionaryComponent } from './column-dictionary/create-column-dictionary/create-column-dictionary.component'; -import { CodeTableComponent } from './code-table/code-table.component'; -import { DetailCodeTableComponent } from './code-table/detail-code-table/detail-code-table.component'; -import { CreateCodeTableComponent } from './code-table/create-code-table/create-code-table.component'; -import { CodeTableService } from './code-table/service/code-table.service'; -import { ColumnDictionaryService } from './column-dictionary/service/column-dictionary.service'; -import { LinkedColumnDictionaryComponent } from './component/linked-column-dictionary/linked-column-dictionary.component'; -import { LinkedMetadataComponent } from './component/linked-metadata-columns/linked-metadata.component'; -import { ChooseCodeTableComponent } from './component/choose-code-table/choose-code-table.component'; -import { MetadataComponent } from './metadata/metadata.component'; -import { MetadataService } from './metadata/service/metadata.service'; -import { MetadataDetailComponent } from './metadata/metadata-detail.component'; -import { SelectCatalogComponent } from './metadata/component/select-catalog.component'; -import { SelectDictionaryComponent } from './metadata/component/select-dictionary.component'; -import { SelectDatatypeComponent } from './metadata/create-metadata/select-datatype.component'; -import { - CompleteCreateMetadataComponent -} from './metadata/create-metadata/complete-create-metadata.component'; -import { MetadataDetailInformationComponent } from './metadata/metadata-detail-information.component'; -import { MetadataDetailColumnschemaComponent } from './metadata/metadata-detail-columnschema.component'; -import { DatasourceService } from '../datasource/service/datasource.service'; -import { DatasourceShareModule } from '../datasource/datasource-share.module'; -import { DsSelectDatasourceComponent } from './metadata/create-metadata/ds-select-datasource.component'; -import { MetadataModelService } from './metadata/service/metadata.model.service'; -import { HiveSetConnectionComponent } from './metadata/create-metadata/hive-set-connection.component'; -import { DataconnectionService } from '../dataconnection/service/dataconnection.service'; -import { StagingSelectSchemaComponent } from './metadata/create-metadata/staging-select-schema.component'; -import { CatalogService } from './catalog/service/catalog.service'; -import { HiveSelectSchemaComponent } from './metadata/create-metadata/hive-select-schema.component'; -import { ChooseColumnDictionaryComponent } from './component/choose-column-dictionary/choose-column-dictionary.component'; -import { CatalogComponent } from './catalog/catalog.component'; -import { MetadataManagementGuard } from '../common/gaurd/metadata-management.guard'; +import {EventBroadcaster} from '../common/event/event.broadcaster'; +import {NgModule} from '@angular/core'; +import {MetaDataManagementComponent} from './meta-data-management.component'; +import {RouterModule} from '@angular/router'; +import {CommonModule} from '../common/common.module'; +import {ColumnDictionaryComponent} from './column-dictionary/column-dictionary.component'; +import {DetailColumnDictionaryComponent} from './column-dictionary/detail-column-dictionary/detail-column-dictionary.component'; +import {CreateColumnDictionaryComponent} from './column-dictionary/create-column-dictionary/create-column-dictionary.component'; +import {CodeTableComponent} from './code-table/code-table.component'; +import {DetailCodeTableComponent} from './code-table/detail-code-table/detail-code-table.component'; +import {CreateCodeTableComponent} from './code-table/create-code-table/create-code-table.component'; +import {CodeTableService} from './code-table/service/code-table.service'; +import {ColumnDictionaryService} from './column-dictionary/service/column-dictionary.service'; +import {LinkedColumnDictionaryComponent} from './component/linked-column-dictionary/linked-column-dictionary.component'; +import {LinkedMetadataComponent} from './component/linked-metadata-columns/linked-metadata.component'; +import {ChooseCodeTableComponent} from './component/choose-code-table/choose-code-table.component'; +import {MetadataComponent} from './metadata/metadata.component'; +import {MetadataService} from './metadata/service/metadata.service'; +import {MetadataDetailComponent} from './metadata/metadata-detail.component'; +import {SelectCatalogComponent} from './metadata/component/select-catalog.component'; +import {SelectDatatypeComponent} from './metadata/create-metadata/select-datatype.component'; +import {CompleteCreateMetadataComponent} from './metadata/create-metadata/complete-create-metadata.component'; +import {MetadataDetailInformationComponent} from './metadata/metadata-detail-information.component'; +import {MetadataDetailColumnschemaComponent} from './metadata/metadata-detail-columnschema.component'; +import {DatasourceService} from '../datasource/service/datasource.service'; +import {DatasourceShareModule} from '../datasource/datasource-share.module'; +import {DsSelectDatasourceComponent} from './metadata/create-metadata/ds-select-datasource.component'; +import {MetadataModelService} from './metadata/service/metadata.model.service'; +import {HiveSetConnectionComponent} from './metadata/create-metadata/hive-set-connection.component'; +import {DataconnectionService} from '../dataconnection/service/dataconnection.service'; +import {StagingSelectSchemaComponent} from './metadata/create-metadata/staging-select-schema.component'; +import {CatalogService} from './catalog/service/catalog.service'; +import {HiveSelectSchemaComponent} from './metadata/create-metadata/hive-select-schema.component'; +import {ChooseColumnDictionaryComponent} from './component/choose-column-dictionary/choose-column-dictionary.component'; +import {CatalogComponent} from './catalog/catalog.component'; +import {MetadataManagementGuard} from '../common/gaurd/metadata-management.guard'; +import {TopInfoComponent} from './metadata/component/top-info.component'; @NgModule({ imports: [ CommonModule, DatasourceShareModule, RouterModule.forChild([ - { path: '', component: MetaDataManagementComponent, canActivate: [MetadataManagementGuard] }, - { path: ':tabId', component: MetaDataManagementComponent, canActivate: [MetadataManagementGuard] }, - { path: 'metadata/:metadataId', component: MetadataDetailComponent, canActivate: [MetadataManagementGuard] }, - { path: 'column-dictionary/:dictionaryId', component: DetailColumnDictionaryComponent, canActivate: [MetadataManagementGuard] }, - { path: 'code-table/:codeTableId', component: DetailCodeTableComponent, canActivate: [MetadataManagementGuard] } - ]) + {path: '', component: MetaDataManagementComponent, canActivate: [MetadataManagementGuard]}, + {path: ':tabId', component: MetaDataManagementComponent, canActivate: [MetadataManagementGuard]}, + {path: 'metadata/:metadataId', component: MetadataDetailComponent, canActivate: [MetadataManagementGuard]}, + { + path: 'column-dictionary/:dictionaryId', + component: DetailColumnDictionaryComponent, + canActivate: [MetadataManagementGuard], + }, + {path: 'code-table/:codeTableId', component: DetailCodeTableComponent, canActivate: [MetadataManagementGuard]}, + ]), ], declarations: [ // 메타데이터 매니지먼트 @@ -98,12 +100,11 @@ import { MetadataManagementGuard } from '../common/gaurd/metadata-management.gua // 컬럼 사전 선택 텀포넌트 ChooseColumnDictionaryComponent, - SelectCatalogComponent, - SelectDictionaryComponent, MetadataDetailInformationComponent, MetadataDetailColumnschemaComponent, - CatalogComponent + CatalogComponent, + TopInfoComponent, ], providers: [ // 코드 테이블 서비스 @@ -119,8 +120,8 @@ import { MetadataManagementGuard } from '../common/gaurd/metadata-management.gua // 매니지먼트 가드 MetadataManagementGuard, MetadataModelService, - CatalogService - ] + CatalogService, + ], }) export class MetaDataManagementModule { constructor(private broadCaster: EventBroadcaster) { diff --git a/discovery-frontend/src/app/meta-data-management/metadata/component/embedded-metadata-detail.component.html b/discovery-frontend/src/app/meta-data-management/metadata/component/embedded-metadata-detail.component.html index e800938780..21d304b6b0 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/component/embedded-metadata-detail.component.html +++ b/discovery-frontend/src/app/meta-data-management/metadata/component/embedded-metadata-detail.component.html @@ -42,7 +42,7 @@ {{'msg.comm.ui.description' | translate}} - {{ metaData.description || ('msg.metadata.ui.no.description' | translate )}} + {{ metaData.description || ('msg.metadata.ui.no.description' | translate)}} @@ -53,7 +53,6 @@ - {{'msg.metadata.md.ui.data.type' | translate}} @@ -62,50 +61,14 @@ {{metaData.sourceType}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
- - -
{{'msg.metadata.md.th.catalogs' | translate}} @@ -118,18 +81,14 @@
- -
{{'msg.metadata.md.ui.tags' | translate}} @@ -146,303 +105,10 @@
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
+
@@ -456,33 +122,29 @@ - - - - - - - - - - - - - - - - @@ -574,38 +224,6 @@ {{column.description}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- {{'msg.metadata.th.column.popularity' | translate}} -
- - -
-
- {{'msg.metadata.th.column.popularity.tooltip.title' | translate}} -
-
- {{'msg.metadata.th.column.popularity.tooltip.desc' | translate}} -
    -
  • • {{'msg.metadata.th.column.popularity.tooltip.dashboard.conn' | translate}} -
  • -
-
+ {{'msg.metadata.th.column.popularity' | translate}} +
+ + +
+
+ {{'msg.metadata.th.column.popularity.tooltip.title' | translate}} +
+
+ {{'msg.metadata.th.column.popularity.tooltip.desc' | translate}} +
    +
  • • {{'msg.metadata.th.column.popularity.tooltip.dashboard.conn' | translate}} +
  • +
+
-
- -
+
+ +
{{'msg.metadata.th.physical.type' | translate}} @@ -508,18 +170,6 @@ {{'msg.storage.ui.th.description' | translate}}
diff --git a/discovery-frontend/src/app/meta-data-management/metadata/component/embedded-metadata-detail.component.ts b/discovery-frontend/src/app/meta-data-management/metadata/component/embedded-metadata-detail.component.ts index 483cefd467..c87329a90d 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/component/embedded-metadata-detail.component.ts +++ b/discovery-frontend/src/app/meta-data-management/metadata/component/embedded-metadata-detail.component.ts @@ -12,16 +12,16 @@ * limitations under the License. */ -import { AbstractComponent } from '../../../common/component/abstract.component'; -import { Component, ElementRef, HostListener, Injector } from '@angular/core'; -import { MetadataService } from '../service/metadata.service'; -import { Metadata } from '../../../domain/meta-data-management/metadata'; -import { MetadataColumn } from '../../../domain/meta-data-management/metadata-column'; -import { ActivatedRoute } from '@angular/router'; +import {AbstractComponent} from '../../../common/component/abstract.component'; +import {Component, ElementRef, HostListener, Injector} from '@angular/core'; +import {MetadataService} from '../service/metadata.service'; +import {Metadata} from '../../../domain/meta-data-management/metadata'; +import {MetadataColumn} from '../../../domain/meta-data-management/metadata-column'; +import {ActivatedRoute} from '@angular/router'; @Component({ selector: 'app-embedded-metadata-detail', - templateUrl: './embedded-metadata-detail.component.html' + templateUrl: './embedded-metadata-detail.component.html', }) export class EmbeddedMetadataDetailComponent extends AbstractComponent { @@ -56,10 +56,11 @@ export class EmbeddedMetadataDetailComponent extends AbstractComponent { |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ // 생성자 - constructor(private _metaDataService: MetadataService, - private _activatedRoute: ActivatedRoute, - protected element: ElementRef, - protected injector: Injector) { + constructor( + private _metaDataService: MetadataService, + private _activatedRoute: ActivatedRoute, + protected element: ElementRef, + protected injector: Injector) { super(element, injector); } @@ -118,7 +119,6 @@ export class EmbeddedMetadataDetailComponent extends AbstractComponent { return (column.popularity || 0) + '%'; } - /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Protected Method |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -135,14 +135,12 @@ export class EmbeddedMetadataDetailComponent extends AbstractComponent { // 로딩 show this.loadingShow(); // 메타데이터 상세정보 조회 - this._metaDataService.getDetailMetaData(this._metaDataId) - .then((result) => { - // 메타데이터 정보 - this.metaData = result; - // 컬럼 스키마 목록 조회 - this._getColumnSchemaList(); - }) - .catch(error => this.commonExceptionHandler(error)); + this._metaDataService.getDetailMetaData(this._metaDataId).then((result) => { + // 메타데이터 정보 + this.metaData = result; + // 컬럼 스키마 목록 조회 + this._getColumnSchemaList(); + }).catch(error => this.commonExceptionHandler(error)); } /** @@ -153,13 +151,11 @@ export class EmbeddedMetadataDetailComponent extends AbstractComponent { // 로딩 show this.loadingShow(); // 컬럼 조회 - this._metaDataService.getColumnSchemaListInMetaData(this._metaDataId) - .then((result) => { - // 컬럼 데이터 - this.columnList = result; - // 로딩 hide - this.loadingHide(); - }) - .catch(error => this.commonExceptionHandler(error)); + this._metaDataService.getColumnSchemaListInMetaData(this._metaDataId).then((result) => { + // 컬럼 데이터 + this.columnList = result; + // 로딩 hide + this.loadingHide(); + }).catch(error => this.commonExceptionHandler(error)); } } diff --git a/discovery-frontend/src/app/meta-data-management/metadata/component/select-catalog.component.html b/discovery-frontend/src/app/meta-data-management/metadata/component/select-catalog.component.html index fa165b409e..26ba27da82 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/component/select-catalog.component.html +++ b/discovery-frontend/src/app/meta-data-management/metadata/component/select-catalog.component.html @@ -30,12 +30,9 @@
-
- - {{currentRoot.name}}
@@ -45,10 +42,8 @@
-
-
- -
- - - - - - - - - - - - - - - - - -
+
- -
{{'msg.metadata.catalog.ui.no.cat' | translate }}
-
-
+ diff --git a/discovery-frontend/src/app/meta-data-management/metadata/component/select-catalog.component.ts b/discovery-frontend/src/app/meta-data-management/metadata/component/select-catalog.component.ts index 2307acc66d..6cbbf2865f 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/component/select-catalog.component.ts +++ b/discovery-frontend/src/app/meta-data-management/metadata/component/select-catalog.component.ts @@ -12,20 +12,20 @@ * limitations under the License. */ -import { Component, ElementRef, Injector, OnDestroy, OnInit, ViewChild, } from '@angular/core'; -import { AbstractComponent } from '../../../common/component/abstract.component'; -import { CatalogService } from '../../catalog/service/catalog.service'; -import { Alert } from '../../../common/util/alert.util'; -import { Modal } from '../../../common/domain/modal'; -import { DeleteModalComponent } from '../../../common/component/modal/delete/delete.component'; -import { MetadataService } from '../service/metadata.service'; -import { MetadataModelService } from '../service/metadata.model.service'; -import { isUndefined } from 'util'; +import {Component, ElementRef, Injector, OnDestroy, OnInit, ViewChild} from '@angular/core'; +import {AbstractComponent} from '../../../common/component/abstract.component'; +import {CatalogService} from '../../catalog/service/catalog.service'; +import {Alert} from '../../../common/util/alert.util'; +import {Modal} from '../../../common/domain/modal'; +import {DeleteModalComponent} from '../../../common/component/modal/delete/delete.component'; +import {MetadataService} from '../service/metadata.service'; +import {MetadataModelService} from '../service/metadata.model.service'; +import {isUndefined} from 'util'; import * as _ from 'lodash'; @Component({ selector: 'app-select-catalog', - templateUrl: './select-catalog.component.html' + templateUrl: './select-catalog.component.html', }) export class SelectCatalogComponent extends AbstractComponent implements OnInit, OnDestroy { @@ -44,43 +44,44 @@ export class SelectCatalogComponent extends AbstractComponent implements OnInit, public deleteModalComponent: DeleteModalComponent; // 화면 show/hide - public showFlag : boolean = false; + public showFlag: boolean = false; - public catalogs : any; - public metadatas : any; + public catalogs: any; + public metadatas: any; // 선택된 카타로그 한개 - public selectedCatalog : Catalog; + public selectedCatalog: Catalog; - public isCreateCatalog : boolean = false; + public isCreateCatalog: boolean = false; - public isEditCatalogName : boolean = false; + public isEditCatalogName: boolean = false; // 현재 보고있는 root - public currentRoot :any = {name : 'Root', id : 'ROOT'}; + public currentRoot: any = {name: 'Root', id: 'ROOT'}; // 뒤로가기를 하기 위한 path 저장 - public catalogPath : any = [{name : 'Root', id : 'ROOT'}]; + public catalogPath: any = [{name: 'Root', id: 'ROOT'}]; public selectedContentSort: Order = new Order(); - public inProcess : boolean = false; + public inProcess: boolean = false; @ViewChild('catalogInput') private catalogInput: ElementRef; @ViewChild('newCatalogName') - private newCatalogName : ElementRef; + private newCatalogName: ElementRef; /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Constructor |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ // 생성자 - constructor(protected element: ElementRef, - protected catalogService : CatalogService, - protected metadataService : MetadataService, - protected metadataModelService : MetadataModelService, - protected injector: Injector) { + constructor( + protected element: ElementRef, + protected catalogService: CatalogService, + protected metadataService: MetadataService, + protected metadataModelService: MetadataModelService, + protected injector: Injector) { super(element, injector); } @@ -108,12 +109,12 @@ export class SelectCatalogComponent extends AbstractComponent implements OnInit, * 팝업 초기화 * @param isClose 팝업을 닫을때인지 ? */ - public init(isClose?:boolean) { + public init(isClose?: boolean) { - if(!isClose) { + if (!isClose) { this.showFlag = true; - this.currentRoot = {name : 'Root', id : 'ROOT'}; - this.catalogPath = [{name : 'Root', id : 'ROOT'}]; + this.currentRoot = {name: 'Root', id: 'ROOT'}; + this.catalogPath = [{name: 'Root', id: 'ROOT'}]; // 정렬 초기화 this.selectedContentSort = new Order(); @@ -153,10 +154,11 @@ export class SelectCatalogComponent extends AbstractComponent implements OnInit, * 새로운 카타로그 생성 API 호출 */ public createCatalogDone() { - if(!isUndefined(this.newCatalogName.nativeElement.value) && this.newCatalogName.nativeElement.value.trim() !== '') { + if (!isUndefined(this.newCatalogName.nativeElement.value) && this.newCatalogName.nativeElement.value.trim() !== + '') { - let params = {name : this.newCatalogName.nativeElement.value}; - this.currentRoot.id !== 'ROOT' ? params['parentId'] = this.currentRoot.id : null; + let params = {name: this.newCatalogName.nativeElement.value}; + this.currentRoot.id !== 'ROOT' ? params['parentId'] = this.currentRoot.id : null; if (this.inProcess === false) { this.inProcess = true; this.catalogService.createCatalog(params).then(() => { @@ -165,7 +167,7 @@ export class SelectCatalogComponent extends AbstractComponent implements OnInit, }).catch((error) => { this.inProcess = false; Alert.warning(error); - }) + }); } } else { Alert.warning('Check catalog name'); @@ -182,7 +184,7 @@ export class SelectCatalogComponent extends AbstractComponent implements OnInit, * 루트 폴더인지 확인 */ public isRoot() { - if(this.isCreateCatalog) { + if (this.isCreateCatalog) { return true; } else { return this.catalogPath.length !== 1; @@ -204,8 +206,8 @@ export class SelectCatalogComponent extends AbstractComponent implements OnInit, let currentRootId = ids.indexOf(this.currentRoot.id); - this.currentRoot = this.catalogPath[currentRootId-1]; - this.catalogPath.splice(currentRootId,1); + this.currentRoot = this.catalogPath[currentRootId - 1]; + this.catalogPath.splice(currentRootId, 1); this.getCatalogList(); } @@ -217,21 +219,21 @@ export class SelectCatalogComponent extends AbstractComponent implements OnInit, * @param catalog * @param index */ - public updateCatalog(catalog,index) { + public updateCatalog(catalog, index) { if (!isUndefined(this.catalogInput.nativeElement.value) && this.catalogInput.nativeElement.value.trim() !== '') { - let idx = this.catalogs.map((catalog,idx) => { - if(idx !== index) { - return catalog.name + let idx = this.catalogs.map((catalog, idx) => { + if (idx !== index) { + return catalog.name; } }).indexOf(this.catalogInput.nativeElement.value); - if(idx === -1) { + if (idx === -1) { this.catalogService.updateCatalog(catalog.id, this.catalogInput.nativeElement.value).then(() => { this.init(true); this.getMetadataDetail(); }).catch((error) => { Alert.error(error); - }) + }); } else { Alert.warning('Catalog already exists'); return; @@ -263,25 +265,24 @@ export class SelectCatalogComponent extends AbstractComponent implements OnInit, } else { let metadata = this.metadataModelService.getMetadata(); let idx = metadata.catalogs.map((item) => { - return item.id + return item.id; }).indexOf(this.selectedCatalog.id); if (idx === -1) { - this.catalogPath.push({name : this.selectedCatalog.name, id : this.selectedCatalog.id}); - this.metadataService.linkMetadataWithCatalog(metadata.id,this.selectedCatalog.id).then(()=> { + this.catalogPath.push({name: this.selectedCatalog.name, id: this.selectedCatalog.id}); + this.metadataService.linkMetadataWithCatalog(metadata.id, this.selectedCatalog.id).then(() => { this.showFlag = false; Alert.success(this.translateService.instant('msg.comm.alert.save.success')); this.getMetadataDetail(); this.init(true); }).catch((error) => { Alert.error(error); - }) + }); } else { this.showFlag = false; Alert.success(this.translateService.instant('msg.comm.alert.save.success')); this.init(true); } - } } @@ -298,7 +299,7 @@ export class SelectCatalogComponent extends AbstractComponent implements OnInit, }).catch((error) => { Alert.error(error); this.loadingHide(); - }) + }); } // function - getMetadataDetail /** @@ -316,27 +317,27 @@ export class SelectCatalogComponent extends AbstractComponent implements OnInit, * @param catalog */ public catalogDetail(catalog) { - this.currentRoot = {name : catalog.name, id : catalog.id}; - this.catalogPath.push(this.currentRoot); - this.getCatalogList(); + this.currentRoot = {name: catalog.name, id: catalog.id}; + this.catalogPath.push(this.currentRoot); + this.getCatalogList(); } - public getMetadataInCatalog() : Promise { - return new Promise((resolve,reject) => { - this.catalogService.getMetadataInCatalog(this.selectedCatalog.id,this._getMetadataParams()).then((result) => { + public getMetadataInCatalog(): Promise { + return new Promise((resolve, reject) => { + this.catalogService.getMetadataInCatalog(this.selectedCatalog.id, this._getMetadataParams()).then((result) => { this.pageResult.number === 0 && (this.metadatas = []); // page 객체 this.pageResult = result.page; // 컬럼 사전 리스트 this.metadatas = result['_embedded'] ? this.metadatas.concat(result['_embedded']['metadatas']) : []; this.metadatas = this.metadatas.map((item) => { - return item.name + return item.name; }); resolve(this.metadatas); - }).catch((error)=> { - reject(error) - }) - }) + }).catch((error) => { + reject(error); + }); + }); } /** @@ -349,14 +350,14 @@ export class SelectCatalogComponent extends AbstractComponent implements OnInit, this.selectedCatalog = new Catalog(); this.catalogs = result; - if(this.currentRoot.id === 'ROOT') { + if (this.currentRoot.id === 'ROOT') { this.metadatas = []; } // this.getMetadataInCatalog(); }).catch((error) => { Alert.error(error); this.loadingHide(); - }) + }); } /** @@ -388,18 +389,19 @@ export class SelectCatalogComponent extends AbstractComponent implements OnInit, this.selectedCatalog = _.cloneDeep(catalog); this.getMetadataInCatalog().then((result) => { const modal = new Modal(); - modal.name = `${this.translateService.instant('msg.metadata.catalog.delete.header',{catalogName : catalog.name})}`; + modal.name = `${this.translateService.instant('msg.metadata.catalog.delete.header', + {catalogName: catalog.name})}`; if (result.length > 0) { modal.name += ' ' + this.translateService.instant('msg.metadata.catalog.delete.header-plural'); } // 데이터가 1개 ~ 3개일때 if (result.length > 1 && result.length < 4) { - this.metadatas =`${result.join(', ')}`; + this.metadatas = `${result.join(', ')}`; } // 데이터가 3개 이상일 때 else if (result.length > 3) { - this.metadatas =`${result.splice(0,3).join(', ')} ...`; + this.metadatas = `${result.splice(0, 3).join(', ')} ...`; } modal.btnName = this.translateService.instant('msg.comm.ui.del'); @@ -422,7 +424,7 @@ export class SelectCatalogComponent extends AbstractComponent implements OnInit, }).catch((error) => { this.loadingHide(); Alert.error(error); - }) + }); } public closeDelete() { @@ -430,20 +432,20 @@ export class SelectCatalogComponent extends AbstractComponent implements OnInit, this.selectedCatalog = new Catalog(); } - /** * get params for meta data list * @returns object * @private */ - private _getMetadataParams() : Object { + private _getMetadataParams(): Object { return { size: 15, page: 0, - sort: 'createdTime,desc' + sort: 'createdTime,desc', }; } + /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Protected Method |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ diff --git a/discovery-frontend/src/app/meta-data-management/metadata/component/select-dictionary.component.html b/discovery-frontend/src/app/meta-data-management/metadata/component/top-info.component.html similarity index 73% rename from discovery-frontend/src/app/meta-data-management/metadata/component/select-dictionary.component.html rename to discovery-frontend/src/app/meta-data-management/metadata/component/top-info.component.html index d15461d059..636065445f 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/component/select-dictionary.component.html +++ b/discovery-frontend/src/app/meta-data-management/metadata/component/top-info.component.html @@ -12,13 +12,11 @@ ~ limitations under the License. --> - - - - - Title - - - - - + +
+
+ + {{ 'msg.metadata.ui.description' | translate }} +
+
+ diff --git a/discovery-frontend/src/app/meta-data-management/metadata/component/select-dictionary.component.ts b/discovery-frontend/src/app/meta-data-management/metadata/component/top-info.component.ts similarity index 71% rename from discovery-frontend/src/app/meta-data-management/metadata/component/select-dictionary.component.ts rename to discovery-frontend/src/app/meta-data-management/metadata/component/top-info.component.ts index 617d2acb0b..aadee8c51a 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/component/select-dictionary.component.ts +++ b/discovery-frontend/src/app/meta-data-management/metadata/component/top-info.component.ts @@ -12,14 +12,15 @@ * limitations under the License. */ -import { Component, ElementRef, Injector, OnDestroy, OnInit } from '@angular/core'; -import { AbstractComponent } from '../../../common/component/abstract.component'; +import {AfterViewInit, Component, ElementRef, Injector, OnDestroy, OnInit} from '@angular/core'; +import {AbstractComponent} from '../../../common/component/abstract.component'; @Component({ - selector: 'app-select-dictionary', - templateUrl: './select-dictionary.component.html' + selector: '[top-info]', + templateUrl: './top-info.component.html', + host: {'[class.ddp-box-message]': 'true'}, }) -export class SelectDictionaryComponent extends AbstractComponent implements OnInit, OnDestroy { +export class TopInfoComponent extends AbstractComponent implements OnInit, OnDestroy, AfterViewInit { /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Private Variables @@ -37,26 +38,25 @@ export class SelectDictionaryComponent extends AbstractComponent implements OnIn | Constructor |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ - // 생성자 - constructor(protected element: ElementRef, - protected injector: Injector) { - super(element, injector); + constructor( + protected elementRef: ElementRef, + protected injector: Injector) { + super(elementRef, injector); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Override Method |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ - // Init public ngOnInit() { - // Init super.ngOnInit(); } - // Destory - public ngOnDestroy() { + public ngAfterViewInit() { + super.ngAfterViewInit(); + } - // Destory + public ngOnDestroy() { super.ngOnDestroy(); } @@ -72,10 +72,4 @@ export class SelectDictionaryComponent extends AbstractComponent implements OnIn | Private Method |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ - /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - | Private Method - getter - |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ - - } - diff --git a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/complete-create-metadata.component.html b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/complete-create-metadata.component.html index 34da9735a9..16a591a393 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/complete-create-metadata.component.html +++ b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/complete-create-metadata.component.html @@ -30,8 +30,8 @@
- - + + @@ -86,14 +86,10 @@ - -
-
-
@@ -107,7 +103,6 @@
-
@@ -121,7 +116,6 @@
- diff --git a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/complete-create-metadata.component.ts b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/complete-create-metadata.component.ts index d2e71890f2..02dbf07a4a 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/complete-create-metadata.component.ts +++ b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/complete-create-metadata.component.ts @@ -12,20 +12,20 @@ * limitations under the License. */ -import { Component, ElementRef, EventEmitter, Injector, Input, OnDestroy, OnInit, Output } from '@angular/core'; -import { StringUtil } from '../../../common/util/string.util'; -import { CommonUtil } from '../../../common/util/common.util'; -import { MetadataService } from '../service/metadata.service'; -import { Alert } from '../../../common/util/alert.util'; -import { AbstractPopupComponent } from '../../../common/component/abstract-popup.component'; -import { MetadataModelService } from '../service/metadata.model.service'; +import {Component, ElementRef, EventEmitter, Injector, OnDestroy, OnInit, Output} from '@angular/core'; +import {StringUtil} from '../../../common/util/string.util'; +import {CommonUtil} from '../../../common/util/common.util'; +import {MetadataService} from '../service/metadata.service'; +import {Alert} from '../../../common/util/alert.util'; +import {AbstractPopupComponent} from '../../../common/component/abstract-popup.component'; +import {MetadataModelService} from '../service/metadata.model.service'; /** * Creating metadata - complete step */ @Component({ selector: 'app-complete-create-metadata', - templateUrl: './complete-create-metadata.component.html' + templateUrl: './complete-create-metadata.component.html', }) export class CompleteCreateMetadataComponent extends AbstractPopupComponent implements OnInit, OnDestroy { @@ -41,16 +41,15 @@ export class CompleteCreateMetadataComponent extends AbstractPopupComponent impl public nameValidationMsg: string = ''; public descValidationMsg: string = ''; - // constructor - constructor(public metaDataModelService: MetadataModelService, - private _metaDataService: MetadataService, - protected element: ElementRef, - protected injector: Injector) { + constructor( + public metaDataModelService: MetadataModelService, + private _metaDataService: MetadataService, + protected element: ElementRef, + protected injector: Injector) { super(element, injector); } - /** * ngOnInit */ @@ -67,7 +66,6 @@ export class CompleteCreateMetadataComponent extends AbstractPopupComponent impl super.ngOnDestroy(); } - /** * Get metadata create type * @returns {string} @@ -220,16 +218,15 @@ export class CompleteCreateMetadataComponent extends AbstractPopupComponent impl // 로딩 show this.loadingShow(); // 메타데이터 생성하기 - this._metaDataService.createMetaData(this._getCreateMetaDataParams()) - .then((result) => { - // alert - Alert.success(this.translateService.instant('msg.metadata.alert.create.success', {value: this.createName.trim()})); - // complete - this.createComplete.emit(); - }) - .catch((error) => { - this.commonExceptionHandler(error); - }); + this._metaDataService.createMetaData(this._getCreateMetaDataParams()).then((result) => { + // alert + Alert.success( + this.translateService.instant('msg.metadata.alert.create.success', {value: this.createName.trim()})); + // complete + this.createComplete.emit(); + }).catch((error) => { + this.commonExceptionHandler(error); + }); } /** @@ -240,19 +237,18 @@ export class CompleteCreateMetadataComponent extends AbstractPopupComponent impl // loading show this.loadingShow(); // check duplicate name - this._metaDataService.getDuplicateMetaDataName(this.createName.trim()) - .then((result) => { - // if duplicated - if (result['duplicated']) { - // message - this.nameValidationMsg = this.translateService.instant('msg.metadata.ui.dictionary.create.valid.logical.name.duplicated', {value: this.createName.trim()}); - // loading hide - this.loadingHide(); - } else { - this._createMetaData(); - } - }) - .catch(error => this.commonExceptionHandler(error)); + this._metaDataService.getDuplicateMetaDataName(this.createName.trim()).then((result) => { + // if duplicated + if (result['duplicated']) { + // message + this.nameValidationMsg = this.translateService.instant( + 'msg.metadata.ui.dictionary.create.valid.logical.name.duplicated', {value: this.createName.trim()}); + // loading hide + this.loadingHide(); + } else { + this._createMetaData(); + } + }).catch(error => this.commonExceptionHandler(error)); } /** @@ -288,7 +284,7 @@ export class CompleteCreateMetadataComponent extends AbstractPopupComponent impl private _getCreateMetaDataParams(): object { const params = { name: this.createName.trim(), - description: this.createDescription ? this.createDescription.trim() : '' + description: this.createDescription ? this.createDescription.trim() : '', }; // data source type if (this.isCreateType('datasource')) { @@ -296,7 +292,7 @@ export class CompleteCreateMetadataComponent extends AbstractPopupComponent impl name: this.getSelectedDatasource()['name'], // type: this.getSelectedDatasource()['connType'], type: 'ENGINE', - sourceId: this.getSelectedDatasource()['id'] + sourceId: this.getSelectedDatasource()['id'], }; // params['sourceType'] = this.getSelectedDatasource()['connType']; params['sourceType'] = 'ENGINE'; @@ -308,7 +304,7 @@ export class CompleteCreateMetadataComponent extends AbstractPopupComponent impl type: 'JDBC', sourceId: this.getConnectionStep()['selectedConnectionPreset'].id, schema: this.getSchemaStep()['selectedDatabase'], - table: this.getSchemaStep()['selectedTable'] + table: this.getSchemaStep()['selectedTable'], }; params['sourceType'] = 'JDBC'; params['source'] = source; @@ -316,12 +312,12 @@ export class CompleteCreateMetadataComponent extends AbstractPopupComponent impl // staging DB const source = { name: 'Stage DB', - type: 'STAGE', + type: 'STAGEDB', sourceId: 'STAGE', schema: this.getSchemaStep()['selectedDatabase'], - table: this.getSchemaStep()['selectedTable'] + table: this.getSchemaStep()['selectedTable'], }; - params['sourceType'] = 'STAGING'; + params['sourceType'] = 'STAGEDB'; params['source'] = source; } return params; diff --git a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/ds-select-datasource.component.html b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/ds-select-datasource.component.html index 2e64352b3c..cceeec3efc 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/ds-select-datasource.component.html +++ b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/ds-select-datasource.component.html @@ -31,11 +31,6 @@ - -
- -
@@ -78,101 +69,99 @@
-
- -
- -
- - - - - - - - - - - - - - - - - +
+ +
+ +
+
- {{'msg.comm.th.no' | translate}} - - {{'msg.comm.th.ds' | translate}} - - - - - {{'msg.comm.th.type' | translate}} - - {{'msg.comm.th.used' | translate}} - - - - - {{'msg.comm.th.updated' | translate}} - - - -
+ + + + + + + + + + + + + + + + -
+ {{'msg.comm.th.no' | translate}} + + {{'msg.comm.th.ds' | translate}} + + + + + {{'msg.comm.th.type' | translate}} + + {{'msg.comm.th.used' | translate}} + + + + + {{'msg.comm.th.updated' | translate}} + + + +
+ +
+ + +
+ + + + + + + + + + + + + + + + + +
+ {{getDatasourceIndex(i)}} + +
+ {{source.name}} + - {{source.description}} + {{'msg.comm.ui.list.ds.opendata' | translate}} +
+
+ {{source.connType && source.connType.toString() === 'ENGINE' ? ('msg.comm.ui.list.ds.type.engine' | translate) : ('msg.comm.ui.list.ds.type.link' | translate)}} + + {{source.published ? ('msg.space.ui.allworkspace' | translate) : (source.linkedWorkspaces == undefined ? 'not used' : source.linkedWorkspaces + ' Workspaces')}} + + {{source.modifiedTime | mdate:'YYYY-MM-DD'}} +
+
+
- - - -
- - - - - - - - - - - - - - - - - -
- {{getDatasourceIndex(i)}} - -
- {{source.name}} - - {{source.description}} - {{'msg.comm.ui.list.ds.opendata' | translate}} -
-
- {{source.connType && source.connType.toString() === 'ENGINE' ? ('msg.comm.ui.list.ds.type.engine' | translate) : ('msg.comm.ui.list.ds.type.link' | translate)}} - - {{source.published ? ('msg.space.ui.allworkspace' | translate) : (source.linkedWorkspaces == undefined ? 'not used' : source.linkedWorkspaces + ' Workspaces')}} - - {{source.modifiedTime | mdate:'YYYY-MM-DD'}} -
- + +
+ {{'msg.comm.ui.more' | translate}}
- -
- -
- {{'msg.comm.ui.more' | translate}}
-
{ - // 페이지 객체 - this.pageResult = datasources['page']; - // 페이지가 첫번째면 - this.pageResult.number === 0 && (this.datasourceList = []); - // 데이터 있다면 - this.datasourceList = datasources['_embedded'] ? this.datasourceList.concat(datasources['_embedded'].datasources) : []; - // 로딩 hide - this.loadingHide(); - }) - .catch((error) => { - this.commonExceptionHandler(error); - }); + this._datasourceService.getAllDatasource(this._getDatasourceParams()).then((datasources) => { + // 페이지 객체 + this.pageResult = datasources['page']; + // 페이지가 첫번째면 + this.pageResult.number === 0 && (this.datasourceList = []); + // 데이터 있다면 + this.datasourceList = datasources['_embedded'] ? + this.datasourceList.concat(datasources['_embedded'].datasources) : + []; + // 로딩 hide + this.loadingHide(); + }).catch((error) => { + this.commonExceptionHandler(error); + }); } /** @@ -386,14 +388,15 @@ export class DsSelectDatasourceComponent extends AbstractPopupComponent implemen const params = { size: 15, page: this.pageResult.number, - linkedMetadata: false + linkedMetadata: false, }; // 검색어 (!StringUtil.isEmpty(this.searchText)) && (params['nameContains'] = this.searchText.trim()); // 공개여부 this.searchPublished && (params['published'] = this.searchPublished); // 정렬 - this.selectedContentSort.sort !== 'default' && (params['sort'] = this.selectedContentSort.key + ',' + this.selectedContentSort.sort); + this.selectedContentSort.sort !== 'default' && + (params['sort'] = this.selectedContentSort.key + ',' + this.selectedContentSort.sort); // 타입 this.selectedType.value !== 'all' && (params['connType'] = this.selectedType.value); return params; diff --git a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/hive-select-schema.component.html b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/hive-select-schema.component.html index fa70a21a34..1c3bb12c82 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/hive-select-schema.component.html +++ b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/hive-select-schema.component.html @@ -30,7 +30,21 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/hive-select-schema.component.ts b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/hive-select-schema.component.ts index 78387b1ff4..7e00f02330 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/hive-select-schema.component.ts +++ b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/hive-select-schema.component.ts @@ -12,24 +12,22 @@ * limitations under the License. */ -import { AbstractPopupComponent } from '../../../common/component/abstract-popup.component'; -import { Component, ElementRef, Injector, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { MetadataModelService } from '../service/metadata.model.service'; -import { DataconnectionService } from '../../../dataconnection/service/dataconnection.service'; -import { header, SlickGridHeader } from '../../../common/component/grid/grid.header'; -import { GridOption } from '../../../common/component/grid/grid.option'; -import { GridComponent } from '../../../common/component/grid/grid.component'; +import {AbstractPopupComponent} from '../../../common/component/abstract-popup.component'; +import {Component, ElementRef, Injector, OnDestroy, OnInit, ViewChild} from '@angular/core'; +import {MetadataModelService} from '../service/metadata.model.service'; +import {DataconnectionService} from '../../../dataconnection/service/dataconnection.service'; +import {header, SlickGridHeader} from '../../../common/component/grid/grid.header'; +import {GridOption} from '../../../common/component/grid/grid.option'; +import {GridComponent} from '../../../common/component/grid/grid.component'; import * as pixelWidth from 'string-pixel-width'; -import { Field } from '../../../domain/datasource/datasource'; -import {switchMap} from "rxjs/operators"; -import {logger} from "codelyzer/util/logger"; +import {Field} from '../../../domain/datasource/datasource'; /** * Creating metadata with Hive - schema step */ @Component({ selector: 'app-hive-select-schema', - templateUrl: './hive-select-schema.component.html' + templateUrl: './hive-select-schema.component.html', }) export class HiveSelectSchemaComponent extends AbstractPopupComponent implements OnInit, OnDestroy { @@ -63,23 +61,23 @@ export class HiveSelectSchemaComponent extends AbstractPopupComponent implements // loading part flag public isLoading: boolean = false; - // constructor - constructor(public metaDataModelService: MetadataModelService, - private _connectionService: DataconnectionService, - protected element: ElementRef, - protected injector: Injector) { + constructor( + public metaDataModelService: MetadataModelService, + private _connectionService: DataconnectionService, + protected element: ElementRef, + protected injector: Injector) { super(element, injector); } - /** * ngOnInit */ public ngOnInit() { super.ngOnInit(); // if exist schemaStep, load data - this.metaDataModelService.getCreateData()['schemaStep'] && this._loadData(this.metaDataModelService.getCreateData()['schemaStep']); + this.metaDataModelService.getCreateData()['schemaStep'] && + this._loadData(this.metaDataModelService.getCreateData()['schemaStep']); // if not exist database list, get database list this.databaseList.length === 0 && this._getDatabaseList(); } @@ -225,7 +223,7 @@ export class HiveSelectSchemaComponent extends AbstractPopupComponent implements // detail data detailData: this.detailData, // grid show flag - clearGrid: this.clearGrid + clearGrid: this.clearGrid, }; this.metaDataModelService.patchCreateData('schemaStep', schemaStep); } @@ -263,7 +261,7 @@ export class HiveSelectSchemaComponent extends AbstractPopupComponent implements */ private _sliceTableName(key): string { // return key.replace(this.selectedTable + '.', ''); - return key.substr(key.indexOf('.')+1); + return key.substr(key.indexOf('.') + 1); } /** @@ -275,11 +273,8 @@ export class HiveSelectSchemaComponent extends AbstractPopupComponent implements private _drawGrid(headers: any[], rows: any[]) { this.changeDetect.detectChanges(); // 그리드 옵션은 선택 - this._gridComponent.create(headers, rows, new GridOption() - .SyncColumnCellResize(true) - .MultiColumnSort(true) - .RowHeight(32) - .build() + this._gridComponent.create(headers, rows, + new GridOption().SyncColumnCellResize(true).MultiColumnSort(true).RowHeight(32).build(), ); } @@ -300,32 +295,30 @@ export class HiveSelectSchemaComponent extends AbstractPopupComponent implements /** * Get database list -H * @private + H * @private */ private _getDatabaseList(): void { // loading show this.isLoading = true; // get database list - console.info("getDatabase"); - const sub = this._connectionService.getDatabasesWithoutIdWithCancel(this._getConnectionParams()) - .subscribe( - res => { - console.info('success data'); - this.databaseList = res['databases']; - this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); - this.isLoading = false - }, - err => { - console.info('error'); - this.commonExceptionHandler(err); - this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); - this.isLoading = false - } - ); + console.info('getDatabase'); + const sub = this._connectionService.getDatabasesWithoutIdWithCancel(this._getConnectionParams()).subscribe( + res => { + console.info('success data'); + this.databaseList = res['databases']; + this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); + this.isLoading = false; + }, + err => { + console.info('error'); + this.commonExceptionHandler(err); + this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); + this.isLoading = false; + }, + ); this.subscriptions.push(sub); - } /** @@ -339,24 +332,24 @@ H * @private this.resultTableErrorShowFl = false; // get database list - const sub = this._connectionService.getTableListForHiveInMetadataWithCancel(this._getConnectionParams(databaseName)) - .subscribe( - res => { - console.info('success data'); - // set table list - this.tableList = res['tables'] || []; - // if not exist table list, error message show - res['tables'].length === 0 && (this.resultTableErrorShowFl = true); - this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); - this.isLoading = false - }, - err => { - console.info('error'); - this.commonExceptionHandler(err); - this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); - this.isLoading = false - } - ); + const sub = this._connectionService.getTableListForHiveInMetadataWithCancel( + this._getConnectionParams(databaseName)).subscribe( + res => { + console.info('success data'); + // set table list + this.tableList = res['tables'] || []; + // if not exist table list, error message show + res['tables'].length === 0 && (this.resultTableErrorShowFl = true); + this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); + this.isLoading = false; + }, + err => { + console.info('error'); + this.commonExceptionHandler(err); + this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); + this.isLoading = false; + }, + ); this.subscriptions.push(sub); } @@ -370,30 +363,30 @@ H * @private // loading show this.isLoading = true; // get detail data - const sub = this._connectionService.getTableDetailWitoutIdWithCancel(this._getConnectionParams(databaseName, tableName)) - .subscribe( - res => { - console.info('success data'); - // METATRON-1144: 테이블조회시만 테이블 name을 제거하도록 변경 - res['data'] = this._getReplacedDataList(res['data']); - res['fields'] = this._getReplacedFieldList(res['fields']); - // set detail data - this.detailData = res; - // grid show flag true - this.clearGrid = false; - // update grid - this._updateGrid(res['data'], res['fields']); - this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); - this.isLoading = false; - }, - err => { - console.info('error'); - this.commonExceptionHandler(err); - this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); - this.isLoading = false; - } - ); - this.subscriptions.push(sub); + const sub = this._connectionService.getTableDetailWitoutIdWithCancel( + this._getConnectionParams(databaseName, tableName)).subscribe( + res => { + console.info('success data'); + // METATRON-1144: 테이블조회시만 테이블 name을 제거하도록 변경 + res['data'] = this._getReplacedDataList(res['data']); + res['fields'] = this._getReplacedFieldList(res['fields']); + // set detail data + this.detailData = res; + // grid show flag true + this.clearGrid = false; + // update grid + this._updateGrid(res['data'], res['fields']); + this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); + this.isLoading = false; + }, + err => { + console.info('error'); + this.commonExceptionHandler(err); + this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); + this.isLoading = false; + }, + ); + this.subscriptions.push(sub); } /** @@ -410,9 +403,9 @@ H * @private connection: { id: connectionData['selectedConnectionPreset'].id, implementor: connectionData['selectedDbType'].value, - authenticationType: connectionData.selectedSecurityType.value + authenticationType: connectionData.selectedSecurityType.value, }, - type: 'TABLE' + type: 'TABLE', }; // if security type is not USERINFO, add username and password in connection if (connectionData.selectedSecurityType.value !== 'USERINFO') { @@ -442,8 +435,8 @@ H * @private return fields.map((item) => { // name item.name = this._sliceTableName(item.name); - // alias - item.alias = this._sliceTableName(item.alias); + // if exist alias, convert alias + item.alias && (item.alias = this._sliceTableName(item.alias)); return item; }); } @@ -478,21 +471,22 @@ H * @private private _getHeaders(fields: Field[]) { return fields.map( (field: Field) => { - const headerWidth:number = Math.floor(pixelWidth(field.name, { size: 12 })) + 62; - return new SlickGridHeader() - .Id(field.name) - .Name('' + field.name + '') - .Field(field.name) - .Behavior('select') - .Selectable(false) - .CssClass('cell-selection') - .Width(headerWidth) - .CannotTriggerInsert(true) - .Resizable(true) - .Unselectable(true) - .Sortable(true) - .build(); - } + const headerWidth: number = Math.floor(pixelWidth(field.name, {size: 12})) + 62; + return new SlickGridHeader().Id(field.name). + Name( + '' + field.name + ''). + Field(field.name). + Behavior('select'). + Selectable(false). + CssClass('cell-selection'). + Width(headerWidth). + CannotTriggerInsert(true). + Resizable(true). + Unselectable(true). + Sortable(true). + build(); + }, ); } diff --git a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/hive-set-connection.component.ts b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/hive-set-connection.component.ts index 260bee36ec..d2fc789bf7 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/hive-set-connection.component.ts +++ b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/hive-set-connection.component.ts @@ -12,19 +12,19 @@ * limitations under the License. */ -import { Component, ElementRef, Injector, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { DataconnectionService } from '../../../dataconnection/service/dataconnection.service'; -import { PageResult } from '../../../domain/common/page'; -import { StringUtil } from '../../../common/util/string.util'; -import { AbstractPopupComponent } from '../../../common/component/abstract-popup.component'; -import { MetadataModelService } from '../service/metadata.model.service'; +import {Component, ElementRef, Injector, OnDestroy, OnInit} from '@angular/core'; +import {DataconnectionService} from '../../../dataconnection/service/dataconnection.service'; +import {PageResult} from '../../../domain/common/page'; +import {StringUtil} from '../../../common/util/string.util'; +import {AbstractPopupComponent} from '../../../common/component/abstract-popup.component'; +import {MetadataModelService} from '../service/metadata.model.service'; /** * Creating metadata with Hive - connection step */ @Component({ selector: 'app-hive-set-connection', - templateUrl: './hive-set-connection.component.html' + templateUrl: './hive-set-connection.component.html', }) export class HiveSetConnectionComponent extends AbstractPopupComponent implements OnInit, OnDestroy { @@ -71,14 +71,14 @@ export class HiveSetConnectionComponent extends AbstractPopupComponent implement public isShowPasswordRequired: boolean; // constructor - constructor(public metaDataModelService: MetadataModelService, - private _dataconnectionService: DataconnectionService, - protected element: ElementRef, - protected injector: Injector) { + constructor( + public metaDataModelService: MetadataModelService, + private _dataconnectionService: DataconnectionService, + protected element: ElementRef, + protected injector: Injector) { super(element, injector); } - /** * ngOnInit */ @@ -88,7 +88,8 @@ export class HiveSetConnectionComponent extends AbstractPopupComponent implement // ui init this._initView(); // if exist connectionStep, load data - this.metaDataModelService.getCreateData()['connectionStep'] && this._loadData(this.metaDataModelService.getCreateData()['connectionStep']); + this.metaDataModelService.getCreateData()['connectionStep'] && + this._loadData(this.metaDataModelService.getCreateData()['connectionStep']); // if not exist preset list, get preset list this.connectionPresetList.length === 0 && this._getConnectionPresetList(); } @@ -116,7 +117,7 @@ export class HiveSetConnectionComponent extends AbstractPopupComponent implement * Is enable connection validation * @returns {boolean} */ - public isEnabledConnectionValidation() : boolean { + public isEnabledConnectionValidation(): boolean { let result: boolean = true; // if disable URL if (!this.isEnableUrl) { @@ -212,9 +213,9 @@ export class HiveSetConnectionComponent extends AbstractPopupComponent implement this.dbTypeList = this.getEnabledConnectionTypes(true); this.selectedDbType = this.dbTypeList.find(type => type.value === 'HIVE'); this.securityTypeList = [ - { label: this.translateService.instant('msg.storage.li.connect.always'), value: 'MANUAL' }, - { label: this.translateService.instant('msg.storage.li.connect.account'), value: 'USERINFO' }, - { label: this.translateService.instant('msg.storage.li.connect.id'), value: 'DIALOG' } + {label: this.translateService.instant('msg.storage.li.connect.always'), value: 'MANUAL'}, + {label: this.translateService.instant('msg.storage.li.connect.account'), value: 'USERINFO'}, + {label: this.translateService.instant('msg.storage.li.connect.id'), value: 'DIALOG'}, ]; this.selectedSecurityType = this.securityTypeList[0]; // page result @@ -302,7 +303,8 @@ export class HiveSetConnectionComponent extends AbstractPopupComponent implement // preset list connectionStep['connectionPresetList'] && (this.connectionPresetList = connectionStep['connectionPresetList']); // selected preset - connectionStep['selectedConnectionPreset'] && (this.selectedConnectionPreset = connectionStep['selectedConnectionPreset']); + connectionStep['selectedConnectionPreset'] && + (this.selectedConnectionPreset = connectionStep['selectedConnectionPreset']); // host connectionStep['hostname'] && (this.hostname = connectionStep['hostname']); // port @@ -339,7 +341,8 @@ export class HiveSetConnectionComponent extends AbstractPopupComponent implement // port StringUtil.isNotEmpty(connection.port) && (this.port = connection.port); // security - this.selectedSecurityType = this.securityTypeList.find(type => type.value === connection.authenticationType) || this.securityTypeList[0]; + this.selectedSecurityType = this.securityTypeList.find(type => type.value === connection.authenticationType) || + this.securityTypeList[0]; // if security type is MANUAL, add password and username if (this.selectedSecurityType.value === 'MANUAL') { this.password = connection.password; @@ -352,7 +355,8 @@ export class HiveSetConnectionComponent extends AbstractPopupComponent implement * @private */ private _deleteSchemaStep(): void { - this.metaDataModelService.getCreateData().hasOwnProperty('schemaStep') && (this.metaDataModelService.patchCreateData('schemaStep' , null)); + this.metaDataModelService.getCreateData().hasOwnProperty('schemaStep') && + (this.metaDataModelService.patchCreateData('schemaStep', null)); } /** @@ -363,19 +367,17 @@ export class HiveSetConnectionComponent extends AbstractPopupComponent implement // loading show this.loadingShow(); // connection test - this._dataconnectionService.checkConnection(this._getConnectionTestParams()) - .then((result) => { - // set connection result flag - this.connectionResultFl = result['connected']; - // loading hide - this.loadingHide(); - }) - .catch((error) => { - // set connection result fail - this.connectionResultFl = false; - // loading hide - this.commonExceptionHandler(error); - }); + this._dataconnectionService.checkConnection(this._getConnectionTestParams()).then((result) => { + // set connection result flag + this.connectionResultFl = result['connected']; + // loading hide + this.loadingHide(); + }).catch((error) => { + // set connection result fail + this.connectionResultFl = false; + // loading hide + this.commonExceptionHandler(error); + }); } /** @@ -386,16 +388,16 @@ export class HiveSetConnectionComponent extends AbstractPopupComponent implement // loading show this.loadingShow(); // get preset list - this._dataconnectionService.getAllDataconnections(this._getConnectionPresetListParams(this.pageResult), 'forSimpleListView') - .then((result) => { - // if exist _embedded, update preset list - result['_embedded'] && (this.connectionPresetList = this.connectionPresetList.concat(result['_embedded'].connections)); - // set page object - this.pageResult = result['page']; - // loading hide - this.loadingHide(); - }) - .catch(error => this.commonExceptionHandler(error)); + this._dataconnectionService.getAllDataconnections(this._getConnectionPresetListParams(this.pageResult), + 'forSimpleListView').then((result) => { + // if exist _embedded, update preset list + result['_embedded'] && + (this.connectionPresetList = this.connectionPresetList.concat(result['_embedded'].connections)); + // set page object + this.pageResult = result['page']; + // loading hide + this.loadingHide(); + }).catch(error => this.commonExceptionHandler(error)); } /** @@ -407,16 +409,14 @@ export class HiveSetConnectionComponent extends AbstractPopupComponent implement // loading show this.loadingShow(); // get detail data - this._dataconnectionService.getDataconnectionDetail(preset.id) - .then((result) => { - // init connection data - this._initConnectionData(); - // set connection - this._setConnection(result); - // loading hide - this.loadingHide(); - }) - .catch(error => this.commonExceptionHandler(error)); + this._dataconnectionService.getDataconnectionDetail(preset.id).then((result) => { + // init connection data + this._initConnectionData(); + // set connection + this._setConnection(result); + // loading hide + this.loadingHide(); + }).catch(error => this.commonExceptionHandler(error)); } /** @@ -430,7 +430,7 @@ export class HiveSetConnectionComponent extends AbstractPopupComponent implement size: pageResult.size, page: pageResult.number, implementor: this.selectedDbType.value, - type: 'jdbc' + type: 'jdbc', }; } @@ -456,7 +456,7 @@ export class HiveSetConnectionComponent extends AbstractPopupComponent implement connection['hostname'] = this.hostname; connection['port'] = this.port; } - return { connection: connection }; + return {connection: connection}; } } diff --git a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/select-datatype.component.html b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/select-datatype.component.html index 280525a2cd..f7de13c7a8 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/select-datatype.component.html +++ b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/select-datatype.component.html @@ -21,26 +21,17 @@ -
{{'msg.comm.btn.cancl' | translate}} diff --git a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/select-datatype.component.ts b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/select-datatype.component.ts index 54e2a17f69..b0e93e73d1 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/select-datatype.component.ts +++ b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/select-datatype.component.ts @@ -12,14 +12,14 @@ * limitations under the License. */ -import { Component, ElementRef, EventEmitter, Injector, OnDestroy, OnInit, Output, ViewChild } from '@angular/core'; -import { AbstractComponent } from '../../../common/component/abstract.component'; -import { MetadataModelService } from '../service/metadata.model.service'; -import {StorageService} from "../../../data-storage/service/storage.service"; +import {Component, ElementRef, EventEmitter, Injector, OnDestroy, OnInit, Output} from '@angular/core'; +import {AbstractComponent} from '../../../common/component/abstract.component'; +import {MetadataModelService} from '../service/metadata.model.service'; +import {StorageService} from '../../../data-storage/service/storage.service'; @Component({ selector: 'app-select-datatype', - templateUrl: './select-datatype.component.html' + templateUrl: './select-datatype.component.html', }) export class SelectDatatypeComponent extends AbstractComponent implements OnInit, OnDestroy { @@ -46,9 +46,10 @@ export class SelectDatatypeComponent extends AbstractComponent implements OnInit |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ // 생성자 - constructor(public metaDataModelService: MetadataModelService, - protected element: ElementRef, - protected injector: Injector) { + constructor( + public metaDataModelService: MetadataModelService, + protected element: ElementRef, + protected injector: Injector) { super(element, injector); } diff --git a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/staging-select-schema.component.html b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/staging-select-schema.component.html index 5a96b2067d..f98ec9549b 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/staging-select-schema.component.html +++ b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/staging-select-schema.component.html @@ -30,7 +30,21 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/staging-select-schema.component.ts b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/staging-select-schema.component.ts index 1b94a802c3..4654b550b8 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/staging-select-schema.component.ts +++ b/discovery-frontend/src/app/meta-data-management/metadata/create-metadata/staging-select-schema.component.ts @@ -12,19 +12,19 @@ * limitations under the License. */ -import { Component, ElementRef, Injector, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { AbstractPopupComponent } from '../../../common/component/abstract-popup.component'; -import { MetadataModelService } from '../service/metadata.model.service'; +import {Component, ElementRef, Injector, OnDestroy, OnInit, ViewChild} from '@angular/core'; +import {AbstractPopupComponent} from '../../../common/component/abstract-popup.component'; +import {MetadataModelService} from '../service/metadata.model.service'; import * as pixelWidth from 'string-pixel-width'; -import { Field } from '../../../domain/datasource/datasource'; -import { GridComponent } from '../../../common/component/grid/grid.component'; -import { DataconnectionService } from '../../../dataconnection/service/dataconnection.service'; -import { GridOption } from '../../../common/component/grid/grid.option'; -import { header, SlickGridHeader } from '../../../common/component/grid/grid.header'; +import {Field} from '../../../domain/datasource/datasource'; +import {GridComponent} from '../../../common/component/grid/grid.component'; +import {DataconnectionService} from '../../../dataconnection/service/dataconnection.service'; +import {GridOption} from '../../../common/component/grid/grid.option'; +import {header, SlickGridHeader} from '../../../common/component/grid/grid.header'; @Component({ selector: 'app-staging-select-schema', - templateUrl: './staging-select-schema.component.html' + templateUrl: './staging-select-schema.component.html', }) export class StagingSelectSchemaComponent extends AbstractPopupComponent implements OnInit, OnDestroy { @@ -70,16 +70,16 @@ export class StagingSelectSchemaComponent extends AbstractPopupComponent impleme // loading part flag public isLoading: boolean = false; - /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Constructor |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ // 생성자 - constructor(private _connectionService: DataconnectionService, - public metaDataModelService: MetadataModelService, - protected element: ElementRef, - protected injector: Injector) { + constructor( + private _connectionService: DataconnectionService, + public metaDataModelService: MetadataModelService, + protected element: ElementRef, + protected injector: Injector) { super(element, injector); } @@ -92,7 +92,8 @@ export class StagingSelectSchemaComponent extends AbstractPopupComponent impleme // Init super.ngOnInit(); // 데이터 로드 - this.metaDataModelService.getCreateData()['schemaStep'] && this._loadData(this.metaDataModelService.getCreateData()['schemaStep']); + this.metaDataModelService.getCreateData()['schemaStep'] && + this._loadData(this.metaDataModelService.getCreateData()['schemaStep']); // 데이터베이스 목록이 없다면 데이터베이스 목록 조회 this.databaseList.length === 0 && this._getDatabaseList(); } @@ -105,12 +106,10 @@ export class StagingSelectSchemaComponent extends AbstractPopupComponent impleme console.info('destroy'); } - /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Public Method |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ - /** * 선택된 데이터베이스 index * @returns {number} @@ -250,7 +249,7 @@ export class StagingSelectSchemaComponent extends AbstractPopupComponent impleme // 상세데이터 detailData: this.detailData, // 그리드 flag - clearGrid: this.clearGrid + clearGrid: this.clearGrid, }; this.metaDataModelService.patchCreateData('schemaStep', schemaStep); } @@ -288,7 +287,7 @@ export class StagingSelectSchemaComponent extends AbstractPopupComponent impleme */ private _sliceTableName(key): string { // return key.replace(this.selectedTable + '.', ''); - return key.substr(key.indexOf('.')+1); + return key.substr(key.indexOf('.') + 1); } /** @@ -300,11 +299,8 @@ export class StagingSelectSchemaComponent extends AbstractPopupComponent impleme private _drawGrid(headers: any[], rows: any[]) { this.changeDetect.detectChanges(); // 그리드 옵션은 선택 - this._gridComponent.create(headers, rows, new GridOption() - .SyncColumnCellResize(true) - .MultiColumnSort(true) - .RowHeight(32) - .build() + this._gridComponent.create(headers, rows, + new GridOption().SyncColumnCellResize(true).MultiColumnSort(true).RowHeight(32).build(), ); } @@ -335,21 +331,20 @@ export class StagingSelectSchemaComponent extends AbstractPopupComponent impleme // 로딩 show this.isLoading = true; // 데이터 베이스 목록 조회 - const sub = this._connectionService.getDatabaseForHiveWithCancel() - .subscribe( - res => { - // 데이터베이스 목록 저장 - this.databaseList = res['databases']; - this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); - this.isLoading = false; - }, - err => { - console.info('error'); - this.commonExceptionHandler(err) - this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); - this.isLoading = false; - } - ); + const sub = this._connectionService.getDatabaseForHiveWithCancel().subscribe( + res => { + // 데이터베이스 목록 저장 + this.databaseList = res['databases']; + this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); + this.isLoading = false; + }, + err => { + console.info('error'); + this.commonExceptionHandler(err); + this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); + this.isLoading = false; + }, + ); this.subscriptions.push(sub); } @@ -364,23 +359,22 @@ export class StagingSelectSchemaComponent extends AbstractPopupComponent impleme // resultShowFl this.resultTableErrorShowFl = false; // 데이터 베이스 목록 조회 - const sub = this._connectionService.getTableListForStageInMetadataWithCancel(databaseName) - .subscribe( - res => { - // 테이블 목록 저장 - this.tableList = res['tables'] || []; - // table이 없다면 - res['tables'].length === 0 && (this.resultTableErrorShowFl = true); - this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); - this.isLoading = false; - }, - err => { - console.info('error'); - this.commonExceptionHandler(err); - this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); - this.isLoading = false; - } - ); + const sub = this._connectionService.getTableListForStageInMetadataWithCancel(databaseName).subscribe( + res => { + // 테이블 목록 저장 + this.tableList = res['tables'] || []; + // table이 없다면 + res['tables'].length === 0 && (this.resultTableErrorShowFl = true); + this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); + this.isLoading = false; + }, + err => { + console.info('error'); + this.commonExceptionHandler(err); + this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); + this.isLoading = false; + }, + ); this.subscriptions.push(sub); } @@ -397,28 +391,27 @@ export class StagingSelectSchemaComponent extends AbstractPopupComponent impleme const sub = this._connectionService.getTableDataForHiveWithCancel({ database: databaseName, type: 'TABLE', - query: tableName - }) - .subscribe( - res => { - // METATRON-1144: 테이블조회시만 테이블 name을 제거하도록 변경 - res['data'] = this._getReplacedDataList(res['data']); - res['fields'] = this._getReplacedFieldList(res['fields']); - // 상세 데이터 저장 - this.detailData = res; - // 그리드 show - this.clearGrid = false; - // 그리드 업데이트 - this._updateGrid(res['data'], res['fields']); - this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); - this.isLoading = false; - }, - err => { - this.commonExceptionHandler(err); - this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); - this.isLoading = false; - } - ); + query: tableName, + }).subscribe( + res => { + // METATRON-1144: 테이블조회시만 테이블 name을 제거하도록 변경 + res['data'] = this._getReplacedDataList(res['data']); + res['fields'] = this._getReplacedFieldList(res['fields']); + // 상세 데이터 저장 + this.detailData = res; + // 그리드 show + this.clearGrid = false; + // 그리드 업데이트 + this._updateGrid(res['data'], res['fields']); + this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); + this.isLoading = false; + }, + err => { + this.commonExceptionHandler(err); + this.subscriptions = this.subscriptions.filter(item => !this.subscriptions.includes(sub)); + this.isLoading = false; + }, + ); this.subscriptions.push(sub); } @@ -431,8 +424,8 @@ export class StagingSelectSchemaComponent extends AbstractPopupComponent impleme return fields.map((item) => { // name item.name = this._sliceTableName(item.name); - // alias - item.alias = this._sliceTableName(item.alias); + // if exist alias, convert alias + item.alias && (item.alias = this._sliceTableName(item.alias)); return item; }); } @@ -468,22 +461,23 @@ export class StagingSelectSchemaComponent extends AbstractPopupComponent impleme return fields.map( (field: Field) => { /* 62 는 CSS 상의 padding 수치의 합산임 */ - const headerWidth:number = Math.floor(pixelWidth(field.name, { size: 12 })) + 62; - - return new SlickGridHeader() - .Id(field.name) - .Name('' + field.name + '') - .Field(field.name) - .Behavior('select') - .Selectable(false) - .CssClass('cell-selection') - .Width(headerWidth) - .CannotTriggerInsert(true) - .Resizable(true) - .Unselectable(true) - .Sortable(true) - .build(); - } + const headerWidth: number = Math.floor(pixelWidth(field.name, {size: 12})) + 62; + + return new SlickGridHeader().Id(field.name). + Name( + '' + field.name + ''). + Field(field.name). + Behavior('select'). + Selectable(false). + CssClass('cell-selection'). + Width(headerWidth). + CannotTriggerInsert(true). + Resizable(true). + Unselectable(true). + Sortable(true). + build(); + }, ); } diff --git a/discovery-frontend/src/app/meta-data-management/metadata/metadata-detail-columnschema.component.html b/discovery-frontend/src/app/meta-data-management/metadata/metadata-detail-columnschema.component.html index 6518b219f5..a767cdf1f9 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/metadata-detail-columnschema.component.html +++ b/discovery-frontend/src/app/meta-data-management/metadata/metadata-detail-columnschema.component.html @@ -14,24 +14,25 @@
+
- {{'msg.metadata.ui.codetable.detail.restore.btn' | translate}} - -
+
@@ -201,36 +202,36 @@
@@ -32,7 +37,8 @@
+ [innerHtml]="getDescription(metadataModelService.getMetadata().description)" + (click)="!isDescEdit ? onDescEdit($event) : $event.stopPropagation();">
Edit @@ -53,7 +59,6 @@ -
@@ -61,14 +66,16 @@ - @@ -83,15 +90,13 @@ -
{{'msg.metadata.md.ui.data.type' | translate}} - - {{ 'ENGINE' == metadataModelService.getMetadata().sourceType.toString() ? ( 'msg.comm.th.ds' | translate) : 'STAGING' == metadataModelService.getMetadata().sourceType.toString() ? 'Staging DB' : 'JDBC' == metadataModelService.getMetadata().sourceType.toString() ? 'HIVE' : metadataModelService.getMetadata().sourceType }} + + {{ 'ENGINE' == metadataModelService.getMetadata().sourceType.toString() ? + ('msg.comm.th.ds' | translate) : + 'STAGEDB' == metadataModelService.getMetadata().sourceType.toString() ? 'Staging DB' : 'JDBC' == metadataModelService.getMetadata().sourceType.toString() ? 'HIVE' : metadataModelService.getMetadata().sourceType }}
- +
- - -
{{'msg.metadata.md.th.catalogs' | translate}} @@ -108,18 +113,14 @@
- - - -
{{'msg.metadata.md.ui.tags' | translate}} @@ -130,8 +131,6 @@
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/discovery-frontend/src/app/meta-data-management/metadata/metadata-detail-information.component.ts b/discovery-frontend/src/app/meta-data-management/metadata/metadata-detail-information.component.ts index b06ca2d293..a3fabf476b 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/metadata-detail-information.component.ts +++ b/discovery-frontend/src/app/meta-data-management/metadata/metadata-detail-information.component.ts @@ -12,26 +12,19 @@ * limitations under the License. */ -import { - Component, - ElementRef, - EventEmitter, - Injector, - OnDestroy, - OnInit, - Output, - ViewChild, - ViewChildren -} from '@angular/core'; -import { AbstractComponent } from '../../common/component/abstract.component'; -import { MetadataService } from './service/metadata.service'; -import { Alert } from '../../common/util/alert.util'; -import { MetadataModelService } from './service/metadata.model.service'; -import {InputComponent} from "../../common/component/input/input.component"; +import {Component, ElementRef, EventEmitter, Injector, Input, OnDestroy, OnInit, Output, ViewChild, ViewChildren} from '@angular/core'; +import {AbstractComponent} from '../../common/component/abstract.component'; +import {MetadataService} from './service/metadata.service'; +import {Alert} from '../../common/util/alert.util'; +import {MetadataModelService} from './service/metadata.model.service'; +import {InputComponent} from '../../common/component/input/input.component'; +import * as _ from 'lodash'; +import {MetadataSourceType} from '../../domain/meta-data-management/metadata'; +import {Datasource, SourceType as DatasourceSourceType} from '../../domain/datasource/datasource'; @Component({ selector: 'app-metadata-detail-information', - templateUrl: './metadata-detail-information.component.html' + templateUrl: './metadata-detail-information.component.html', }) export class MetadataDetailInformationComponent extends AbstractComponent implements OnInit, OnDestroy { @@ -43,7 +36,8 @@ export class MetadataDetailInformationComponent extends AbstractComponent implem private metadataDesc: ElementRef; @ViewChildren(InputComponent) - private tagInput : InputComponent; + private tagInput: InputComponent; + /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Protected Variables |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -54,25 +48,30 @@ export class MetadataDetailInformationComponent extends AbstractComponent implem public isDescEdit: boolean = false; public editingDesc: string; - public desc : string; - public isAddTag : boolean = false; + public desc: string; + public isAddTag: boolean = false; - public tagFlag : boolean = false; // only call attach tag API one at a time + public tagFlag: boolean = false; // only call attach tag API one at a time - public tagValue : string = ''; - public tagsList : any = []; + public tagValue: string = ''; + public tagsList: any = []; @Output() public openAddCataglog = new EventEmitter(); + + @Input() + public isNameEdit: boolean; + /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Constructor |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ // 생성자 - constructor(protected element: ElementRef, - protected metadataService : MetadataService, - public metadataModelService : MetadataModelService, - protected injector: Injector) { + constructor( + protected element: ElementRef, + protected metadataService: MetadataService, + public metadataModelService: MetadataModelService, + protected injector: Injector) { super(element, injector); } @@ -105,9 +104,9 @@ export class MetadataDetailInformationComponent extends AbstractComponent implem if (this.tagsList.length > 0 && '' !== this.tagValue) { this.tagsList.forEach((tag) => { if (tag.name.indexOf(this.tagValue) !== -1) { - list.push(tag.name) + list.push(tag.name); } - }) + }); } return list; } @@ -119,7 +118,6 @@ export class MetadataDetailInformationComponent extends AbstractComponent implem this.openAddCataglog.emit(); } // function - addCatalog - /** * Get metadata tags */ @@ -132,7 +130,7 @@ export class MetadataDetailInformationComponent extends AbstractComponent implem } }).catch((error) => { console.error(error); - }) + }); } // function - getMetadataTags /** @@ -140,11 +138,11 @@ export class MetadataDetailInformationComponent extends AbstractComponent implem * @param tag */ public deleteTag(tag) { - this.metadataService.deleteTagFromMetadata(this.metadataModelService.getMetadata().id,[tag.name]).then(() => { + this.metadataService.deleteTagFromMetadata(this.metadataModelService.getMetadata().id, [tag.name]).then(() => { this.getMetadataDetail(); - }).catch((err) => { + }).catch((err) => { console.info('error -> ', err); - }) + }); } /** @@ -153,7 +151,7 @@ export class MetadataDetailInformationComponent extends AbstractComponent implem public addTag() { let idx = this.metadataModelService.getMetadata().tags.map((item) => { - return item.name + return item.name; }).indexOf(this.tagValue); if (this.tagValue === '' || idx !== -1) { @@ -161,15 +159,15 @@ export class MetadataDetailInformationComponent extends AbstractComponent implem } if (!this.tagFlag) { this.tagFlag = true; - this.metadataService.addTagToMetadata(this.metadataModelService.getMetadata().id,[this.tagValue]).then(() => { + this.metadataService.addTagToMetadata(this.metadataModelService.getMetadata().id, [this.tagValue]).then(() => { this.tagValue = ''; this.isAddTag = false; this.getMetadataDetail(); this.tagFlag = false; - }).catch((err) => { + }).catch((err) => { console.info('error -> ', err); this.tagFlag = false; - }) + }); } } // function - addTag @@ -188,7 +186,6 @@ export class MetadataDetailInformationComponent extends AbstractComponent implem this.tagValue = tag; } // function - setTagValue - /** * 페이지명 에디터 모드 해제 */ @@ -220,16 +217,17 @@ export class MetadataDetailInformationComponent extends AbstractComponent implem // Set this.editingDesc ? this.desc = this.editingDesc.trim() : this.desc = ''; - - this.metadataService.updateMetadata(this.metadataModelService.getMetadata().id, {description : this.desc}).then((result) => { - this.loadingHide(); - if(result) { - this.getMetadataDetail(); - } - }).catch((error) => { - this.loadingHide(); - Alert.warning(error); - }) + this.metadataService.updateMetadata(this.metadataModelService.getMetadata().id, {description: this.desc}). + then((result) => { + this.loadingHide(); + if (result) { + this.getMetadataDetail(); + } + }). + catch((error) => { + this.loadingHide(); + Alert.warning(error); + }); } // function - onDescChange /** @@ -250,12 +248,14 @@ export class MetadataDetailInformationComponent extends AbstractComponent implem * Metadata에 연결된 카타로그를 지운다 * @param catalogId */ - public deleteCatalogFromMetadata(catalogId){ - this.metadataService.deleteCatalogLinkFromMetadata(this.metadataModelService.getMetadata().id, catalogId).then(() => { - this.getMetadataDetail(); - }).catch((error) => { - Alert.error(error); - }) + public deleteCatalogFromMetadata(catalogId) { + this.metadataService.deleteCatalogLinkFromMetadata(this.metadataModelService.getMetadata().id, catalogId). + then(() => { + this.getMetadataDetail(); + }). + catch((error) => { + Alert.error(error); + }); } /** @@ -272,22 +272,44 @@ export class MetadataDetailInformationComponent extends AbstractComponent implem }).catch((error) => { Alert.error(error); this.loadingHide(); - }) + }); } - /** * Get description with line break * @param {string} description * @returns {any} */ - public getDescription(description : string) { + public getDescription(description: string) { if (description === '') { return this.translateService.instant('msg.metadata.ui.no.description'); } else { - return description.replace( /\r\n|\n/gi, '
' ); + return description.replace(/\r\n|\n/gi, '
'); + } + } + + public gotoDatasource() { + const metadata = this.metadataModelService.getMetadata(); + const datasourceId = metadata.source.source.id; + if (_.isNil(datasourceId)) { + return; } + this.router.navigate([`/management/storage/datasource/${datasourceId}`]); + } + + public isEngine() { + return new MetadataSourceType(this.metadataModelService.getMetadata().sourceType).isEngine(); } + + public isSourceTypeDatasource() { + + if (_.isNil(this.metadataModelService.getMetadata().source.source)) { + return false; + } + + return (this.metadataModelService.getMetadata().source.source as Datasource).srcType === DatasourceSourceType.JDBC; + } + /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Protected Method |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -300,6 +322,5 @@ export class MetadataDetailInformationComponent extends AbstractComponent implem | Private Method - getter |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ - } diff --git a/discovery-frontend/src/app/meta-data-management/metadata/metadata-detail.component.html b/discovery-frontend/src/app/meta-data-management/metadata/metadata-detail.component.html index 362f3a05b1..e4d00fac8e 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/metadata-detail.component.html +++ b/discovery-frontend/src/app/meta-data-management/metadata/metadata-detail.component.html @@ -11,23 +11,25 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> +
- {{'msg.common.ui.updated' | translate: { modifiedTime : metadataModelService.getMetadata().modifiedTime | mdate:'YYYY-MM-DD HH:mm', fullName : metadataModelService.getMetadata().modifiedBy.username || metadataModelService.getMetadata().modifiedBy } }} - + {{'msg.common.ui.updated' | translate: {modifiedTime: metadataModelService.getMetadata().modifiedTime | mdate:'YYYY-MM-DD HH:mm', fullName: metadataModelService.getMetadata().modifiedBy.username || metadataModelService.getMetadata().modifiedBy} }}
- + -
- - {{'msg.metadata.btn.delete.md' | translate}} - {{ 'msg.common.ui.created' | translate : { createdTime : metadataModelService.getMetadata().createdTime | mdate:'YYYY-MM-DD HH:mm', fullName : metadataModelService.getMetadata().createdBy.username || metadataModelService.getMetadata().createdBy } }} +
+ + + {{'msg.metadata.btn.delete.md' | translate}} + + {{ 'msg.common.ui.created' | translate : {createdTime: metadataModelService.getMetadata().createdTime | mdate:'YYYY-MM-DD HH:mm', fullName: metadataModelService.getMetadata().createdBy.username || metadataModelService.getMetadata().createdBy} }}
@@ -59,20 +61,14 @@
-
-
-
- -
-
-
- - + +
+ @@ -105,7 +100,6 @@ - diff --git a/discovery-frontend/src/app/meta-data-management/metadata/metadata-detail.component.ts b/discovery-frontend/src/app/meta-data-management/metadata/metadata-detail.component.ts index 0da7ed68f6..7ae198c6f0 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/metadata-detail.component.ts +++ b/discovery-frontend/src/app/meta-data-management/metadata/metadata-detail.component.ts @@ -12,26 +12,26 @@ * limitations under the License. */ -import {AfterViewInit, Component, ElementRef, Injector, OnDestroy, OnInit, ViewChild} from '@angular/core'; -import { AbstractComponent } from '../../common/component/abstract.component'; -import { DeleteModalComponent } from '../../common/component/modal/delete/delete.component'; -import { Modal } from '../../common/domain/modal'; -import { Alert } from '../../common/util/alert.util'; -import { StringUtil } from '../../common/util/string.util'; -import { MetadataService } from './service/metadata.service'; -import { ActivatedRoute } from '@angular/router'; -import { MetadataModelService } from './service/metadata.model.service'; -import { SelectCatalogComponent } from "./component/select-catalog.component"; -import {ChooseCodeTableComponent} from "../component/choose-code-table/choose-code-table.component"; -import {MetadataDetailColumnschemaComponent} from "./metadata-detail-columnschema.component"; -import {ChooseColumnDictionaryComponent} from "../component/choose-column-dictionary/choose-column-dictionary.component"; -import {ColumnDictionary} from "../../domain/meta-data-management/column-dictionary"; -import {CodeTable} from "../../domain/meta-data-management/code-table"; -import {Metadata} from "../../domain/meta-data-management/metadata"; +import {Component, ElementRef, Injector, OnDestroy, OnInit, ViewChild} from '@angular/core'; +import {AbstractComponent} from '../../common/component/abstract.component'; +import {DeleteModalComponent} from '../../common/component/modal/delete/delete.component'; +import {Modal} from '../../common/domain/modal'; +import {Alert} from '../../common/util/alert.util'; +import {StringUtil} from '../../common/util/string.util'; +import {MetadataService} from './service/metadata.service'; +import {ActivatedRoute} from '@angular/router'; +import {MetadataModelService} from './service/metadata.model.service'; +import {SelectCatalogComponent} from './component/select-catalog.component'; +import {ChooseCodeTableComponent} from '../component/choose-code-table/choose-code-table.component'; +import {MetadataDetailColumnschemaComponent} from './metadata-detail-columnschema.component'; +import {ChooseColumnDictionaryComponent} from '../component/choose-column-dictionary/choose-column-dictionary.component'; +import {ColumnDictionary} from '../../domain/meta-data-management/column-dictionary'; +import {CodeTable} from '../../domain/meta-data-management/code-table'; +import {Metadata, SourceType} from '../../domain/meta-data-management/metadata'; @Component({ selector: 'app-metadata-detail', - templateUrl: './metadata-detail.component.html' + templateUrl: './metadata-detail.component.html', }) export class MetadataDetailComponent extends AbstractComponent implements OnInit, OnDestroy { @@ -68,11 +68,11 @@ export class MetadataDetailComponent extends AbstractComponent implements OnInit @ViewChild(DeleteModalComponent) public deleteModalComponent: DeleteModalComponent; - public tab : string = 'information'; + public tab: string = 'information'; - public isContextMenuShow : boolean = false; + public isContextMenuShow: boolean = false; - public selectedMetadataId : string; + public selectedMetadataId: string; // 이름 에디팅여부 public isNameEdit: boolean = false; @@ -81,17 +81,23 @@ export class MetadataDetailComponent extends AbstractComponent implements OnInit // 에디팅중인 이름 public editingName: string; - public name : string; - public desc : string; + public name: string; + public desc: string; + + /** + * Metadata SourceType Enum + */ + public readonly METADATA_SOURCE_TYPE = SourceType; /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Constructor |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ - constructor(protected element: ElementRef, - protected metadataService : MetadataService, - public metadataModelService : MetadataModelService, - protected activatedRoute : ActivatedRoute, - protected injector: Injector) { + constructor( + protected element: ElementRef, + protected metadataService: MetadataService, + public metadataModelService: MetadataModelService, + protected activatedRoute: ActivatedRoute, + protected injector: Injector) { super(element, injector); // path variable @@ -136,7 +142,7 @@ export class MetadataDetailComponent extends AbstractComponent implements OnInit } }).catch(() => { this.loadingHide(); - }) + }); } // function - getMetadataDetail /** @@ -170,10 +176,9 @@ export class MetadataDetailComponent extends AbstractComponent implements OnInit }).catch(() => { this.loadingHide(); Alert.fail('Failed to delete metadata'); - }) + }); } // function - deleteMetadata - /** * 이름 에디터 모드로 변경 */ @@ -196,19 +201,19 @@ export class MetadataDetailComponent extends AbstractComponent implements OnInit if (StringUtil.isEmpty(this.editingName.trim())) { Alert.warning(this.translateService.instant('msg.metadata.ui.name.ph')); - return; + return; } // Set this.name = this.editingName.trim(); // TODO : server 호출 - this.metadataService.updateMetadata(this.selectedMetadataId, {name : this.name}).then((result:Metadata) => { + this.metadataService.updateMetadata(this.selectedMetadataId, {name: this.name}).then((result: Metadata) => { this.metadataModelService.updateMetadataName(result.name); }).catch((error) => { console.info(error); Alert.error('Failed to modify metadata name'); - }) + }); } // function - onNameChange /** @@ -228,7 +233,6 @@ export class MetadataDetailComponent extends AbstractComponent implements OnInit this.isNameEdit = !this.isNameEdit; } // function - onNameEditCancel - /** * Open catalog popup */ @@ -236,21 +240,19 @@ export class MetadataDetailComponent extends AbstractComponent implements OnInit this._selectCatalogComponent.init(); } - /** * Open code table popup * @param {{name: string, codeTable: CodeTable}} data */ - public openCodeTable(data : {name : string, codeTable : CodeTable}) { + public openCodeTable(data: { name: string, codeTable: CodeTable }) { this._chooseCodeTableComp.init(data.name, data.codeTable); } - /** * Open dictionary popup * @param {{name: string, dictionary: ColumnDictionary}} data */ - public openDictionary(data : {name : string, dictionary : ColumnDictionary}) { + public openDictionary(data: { name: string, dictionary: ColumnDictionary }) { this._chooseColumnDictionaryComp.init(data.name, data.dictionary); } @@ -261,6 +263,7 @@ export class MetadataDetailComponent extends AbstractComponent implements OnInit public dictionaryCompleteEvent(data) { this._detailColumnSchemaComp.onChangedColumnDictionary(data); } + /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Protected Method |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -273,6 +276,5 @@ export class MetadataDetailComponent extends AbstractComponent implements OnInit | Private Method - getter |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ - } diff --git a/discovery-frontend/src/app/meta-data-management/metadata/metadata.component.html b/discovery-frontend/src/app/meta-data-management/metadata/metadata.component.html index e227cd9cd2..92156d165c 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/metadata.component.html +++ b/discovery-frontend/src/app/meta-data-management/metadata/metadata.component.html @@ -12,63 +12,10 @@ ~ limitations under the License. --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
@@ -103,15 +50,11 @@
-
- -
@@ -128,10 +71,9 @@
@@ -188,15 +130,13 @@ - - - - {{ 'ENGINE' == metadata.sourceType.toString() ? 'Datasource' : 'STAGING' == metadata.sourceType.toString() ? 'Staging DB' : 'JDBC' == metadata.sourceType.toString() ? 'HIVE' : metadata.sourceType }} + + {{ 'ENGINE' == metadata.sourceType.toString() ? 'Datasource' : 'STAGEDB' == metadata.sourceType.toString() ? 'Staging DB' : 'JDBC' == metadata.sourceType.toString() ? 'HIVE' : metadata.sourceType }} @@ -215,20 +155,18 @@
- + {{ metadata.modifiedTime | mdate:'YYYY-MM-DD HH:mm' }} by {{ metadata.modifiedBy.fullName }} {{ metadata.createdTime | mdate:'YYYY-MM-DD HH:mm' }} by {{ metadata.createdBy.fullName }} -
+
- -
{{'msg.metadata.ui.no.metadata' | translate }}
@@ -236,6 +174,7 @@ {{'msg.comm.ui.more' | translate}}
+ diff --git a/discovery-frontend/src/app/meta-data-management/metadata/metadata.component.ts b/discovery-frontend/src/app/meta-data-management/metadata/metadata.component.ts index 20e007db68..bfa3404aa6 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/metadata.component.ts +++ b/discovery-frontend/src/app/meta-data-management/metadata/metadata.component.ts @@ -12,24 +12,25 @@ * limitations under the License. */ -import { AbstractComponent } from '../../common/component/abstract.component'; -import { Component, ElementRef, Injector, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { SelectDatatypeComponent } from './create-metadata/select-datatype.component'; -import { isUndefined } from 'util'; -import { MetadataService } from './service/metadata.service'; -import { Metadata, SourceType } from '../../domain/meta-data-management/metadata'; -import { DeleteModalComponent } from '../../common/component/modal/delete/delete.component'; -import { Modal } from '../../common/domain/modal'; -import { Alert } from '../../common/util/alert.util'; -import { CatalogService } from '../catalog/service/catalog.service'; -declare let $; +import {AbstractComponent} from '../../common/component/abstract.component'; +import {Component, ElementRef, Injector, OnDestroy, OnInit, ViewChild} from '@angular/core'; +import {SelectDatatypeComponent} from './create-metadata/select-datatype.component'; +import {isUndefined} from 'util'; +import {MetadataService} from './service/metadata.service'; +import {Metadata, SourceType} from '../../domain/meta-data-management/metadata'; +import {DeleteModalComponent} from '../../common/component/modal/delete/delete.component'; +import {Modal} from '../../common/domain/modal'; +import {Alert} from '../../common/util/alert.util'; +import {CatalogService} from '../catalog/service/catalog.service'; import * as _ from 'lodash'; -import { DomSanitizer } from '@angular/platform-browser'; -import {StorageService} from "../../data-storage/service/storage.service"; +import {DomSanitizer} from '@angular/platform-browser'; +import {StorageService} from '../../data-storage/service/storage.service'; + +declare let $; @Component({ selector: 'app-metadata', - templateUrl: './metadata.component.html' + templateUrl: './metadata.component.html', }) export class MetadataComponent extends AbstractComponent implements OnInit, OnDestroy { @@ -49,36 +50,42 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe public deleteModalComponent: DeleteModalComponent; // 리스트, 카달로그 검색어 - public listSearchText : string; - public catalogSearchText : string; + public listSearchText: string; + public catalogSearchText: string; - public selectedMetadata : SelectedMetadata; - public metadatas : Metadata[]; + public selectedMetadata: SelectedMetadata; + public metadatas: Metadata[]; - public sourceTypeList : any = []; + public sourceTypeList: any = []; public sourceType: string; - public tagsList : any = []; - public tag : string; + public tagsList: any = []; + public tag: string; - public selectedCatalogId : string; - public catalogs : any; + public selectedCatalogId: string; + public catalogs: any; public selectedContentSort: Order = new Order(); // Unclassified 선택 여부 - public isUnclassifiedSelected : boolean = false; + public isUnclassifiedSelected: boolean = false; + + /** + * Metadata SourceType Enum + */ + public readonly METADATA_SOURCE_TYPE = SourceType; /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Constructor |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ // 생성자 - constructor(protected element: ElementRef, - protected metadataService : MetadataService, - protected catalogService : CatalogService, - public sanitizer: DomSanitizer, - protected injector: Injector) { + constructor( + protected element: ElementRef, + protected metadataService: MetadataService, + protected catalogService: CatalogService, + public sanitizer: DomSanitizer, + protected injector: Injector) { super(element, injector); } @@ -108,6 +115,7 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe public init() { this._initView(); } + /** * When data type list is changed * @param event @@ -151,10 +159,10 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe * @param event * @param catalog */ - public getChildren(event,catalog) { + public getChildren(event, catalog) { event.stopImmediatePropagation(); - if(!this.catalogSearchText) { - if(catalog.hasChild) { + if (!this.catalogSearchText) { + if (catalog.hasChild) { catalog.isOpen = !catalog.isOpen; this.showChildren(catalog); } @@ -217,7 +225,6 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe return this.pageResult.totalElements; } - /** * 메타 데이터 리스트 조회 */ @@ -236,7 +243,7 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe }).catch((error) => { this.loadingHide(); - }) + }); } @@ -246,9 +253,9 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe */ public getCatalogList() { this.loadingShow(); - this.catalogService.getTreeCatalogs('ROOT',).then((result) => { + this.catalogService.getTreeCatalogs('ROOT').then((result) => { this.loadingHide(); - if(result.length > 0) { + if (result.length > 0) { this.catalogs = result; // if catalog exists, the first catalog on the list is selected and gets metadata in that catalog @@ -268,10 +275,9 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe }).catch((error) => { this.loadingHide(); - }) + }); } - /** * 하위 데이터 불러오기 * @param catalog @@ -283,7 +289,7 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe catalog.children = result; }).catch((error) => { this.loadingHide(); - }) + }); } /** @@ -301,7 +307,7 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe * @returns {boolean} */ public isMoreContents(): boolean { - return (this.pageResult.number < this.pageResult.totalPages -1); + return (this.pageResult.number < this.pageResult.totalPages - 1); } /** @@ -322,7 +328,7 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe const modal = new Modal(); modal.name = this.translateService.instant('msg.metadata.md.ui.delete.header'); modal.description = metadata.name; - this.selectedMetadata = {id : metadata.id, name : metadata.name}; + this.selectedMetadata = {id: metadata.id, name: metadata.name}; this.deleteModalComponent.init(modal); } @@ -331,16 +337,16 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe */ public deleteMetadata() { this.metadataService.deleteMetaData(this.selectedMetadata.id).then((result) => { - Alert.success(this.translateService.instant('msg.metadata.alert.md-deleted', { value : this.selectedMetadata.name })); + Alert.success( + this.translateService.instant('msg.metadata.alert.md-deleted', {value: this.selectedMetadata.name})); this.getMetadataListPageInit(); }).catch((error) => { Alert.fail(this.translateService.instant('msg.metadata.alert.md-delete.fail')); - }) + }); // 다시 페이지 로드 } - /** * 카달로그 내 메타데이터 불러오기 * @param catalog @@ -358,21 +364,19 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe * 선택된 카달로그에 포함된 메타데이터 불러오기 */ public getMetadataInCatalog() { - this.catalogService.getMetadataInCatalog(this.selectedCatalogId, this._getMetadataParams()) - .then((result) => { - // 전달 받은 page number가 0 이면 컬럼 사전 리스트 초기화 - this.pageResult.number === 0 && (this.metadatas = []); - // page 객체 - this.pageResult = result.page; - // 컬럼 사전 리스트 - this.metadatas = result['_embedded'] ? this.metadatas.concat(result['_embedded']['metadatas']) : []; - // 로딩 hide - this.loadingHide(); - }) - .catch((error) => { - // 로딩 hide - this.loadingHide(); - }); + this.catalogService.getMetadataInCatalog(this.selectedCatalogId, this._getMetadataParams()).then((result) => { + // 전달 받은 page number가 0 이면 컬럼 사전 리스트 초기화 + this.pageResult.number === 0 && (this.metadatas = []); + // page 객체 + this.pageResult = result.page; + // 컬럼 사전 리스트 + this.metadatas = result['_embedded'] ? this.metadatas.concat(result['_embedded']['metadatas']) : []; + // 로딩 hide + this.loadingHide(); + }).catch((error) => { + // 로딩 hide + this.loadingHide(); + }); } /** @@ -410,7 +414,7 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe this.metadataService.getMetadataTags().then((result) => { this.tagsList = this.tagsList.concat(result); - }) + }); } /** @@ -418,14 +422,15 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe * @param metadata * @returns {string} */ - public getTooltipValue(metadata) : string { + public getTooltipValue(metadata): string { let result = metadata.name; if (metadata.description) { result += ` - ${metadata.description}`; } - return result + return result; } + /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Protected Method |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -441,15 +446,15 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe private _initView() { this.sourceTypeList = StorageService.isEnableStageDB ? [ - {label : 'All', value : ''}, - {label : 'Datasource', value : SourceType.ENGINE}, - {label : 'Hive', value : SourceType.JDBC}, - {label : 'Staging DB', value : SourceType.STAGING}, - ] + {label: 'All', value: ''}, + {label: 'Datasource', value: SourceType.ENGINE}, + {label: 'Hive', value: SourceType.JDBC}, + {label: 'Staging DB', value: SourceType.STAGING}, + ] : [ - {label : 'All', value : ''}, - {label : 'Datasource', value : SourceType.ENGINE}, - {label : 'Hive', value : SourceType.JDBC}, + {label: 'All', value: ''}, + {label: 'Datasource', value: SourceType.ENGINE}, + {label: 'Hive', value: SourceType.JDBC}, ]; this.sourceType = ''; @@ -463,7 +468,7 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe this.pageResult.number = 0; this.selectedContentSort.key = 'createdTime'; this.selectedContentSort.sort = 'desc'; - this.tagsList = [{name : 'All', id : ''}]; + this.tagsList = [{name: 'All', id: ''}]; // 카달로그를 다시 불러오기 // if (getCatalogList !== false) { @@ -480,17 +485,17 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe private _refreshSelectedCatalog() { this.catalogs.forEach((catalog) => { catalog.selected = false; - if(catalog.children) { + if (catalog.children) { catalog.children.forEach((child) => { child.selected = false; - if(child.children) { + if (child.children) { child.children.forEach((last) => { last.selected = false; }); } - }) + }); } - }) + }); } /** @@ -505,7 +510,6 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe this.getMetadataListPageInit(); } - /** * 검색어로 카달로그 이름 검색 * @param {string} keyword @@ -519,23 +523,22 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe } - /** * 검색어로 카달로그 검색 * @private */ private _searchCatalog() { this.catalogService.getCatalogs(this._getCatalogParams()).then((result) => { - if(result) { + if (result) { this._setCatalogHierarchies(result).then((result1) => { this.catalogs = []; - result1.forEach((item,index) => { - item.forEach((item1) =>{ - if(!item1.hasOwnProperty('parentId')) { - this.catalogs.push(item1) + result1.forEach((item, index) => { + item.forEach((item1) => { + if (!item1.hasOwnProperty('parentId')) { + this.catalogs.push(item1); } else { - let list = result1[index-1].map((catalog) => { - return catalog.id + let list = result1[index - 1].map((catalog) => { + return catalog.id; }); if (!this.catalogs[list.indexOf(item1.parentId)].children) { this.catalogs[list.indexOf(item1.parentId)].children = []; @@ -547,19 +550,19 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe }); }); - this.catalogs =_.sortBy(this.catalogs, o => o.name) - this.catalogs.forEach((item,index) => { + this.catalogs = _.sortBy(this.catalogs, o => o.name); + this.catalogs.forEach((item, index) => { if (item.children) { - item.children =_.sortBy(item.children, o => o.name) + item.children = _.sortBy(item.children, o => o.name); } - }) + }); }); this.metadatas = []; this.isUnclassifiedSelected = false; } }).catch((error) => { - }) + }); } /** @@ -568,8 +571,9 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe * @returns string * @private */ - private _surroundSearchTextWithTag(name) : any { - return name.replace( new RegExp(this.catalogSearchText, "gi"),`${this.catalogSearchText}`) + private _surroundSearchTextWithTag(name): any { + return name.replace(new RegExp(this.catalogSearchText, 'gi'), + `${this.catalogSearchText}`); } /** @@ -578,33 +582,45 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe * @returns promise object * @private */ - private _setCatalogHierarchies(results) : Promise { - return new Promise((resolve, reject)=> { + private _setCatalogHierarchies(results): Promise { + return new Promise((resolve, reject) => { this.catalogs = []; results.forEach((result) => { - result['hierarchies'].forEach((hierarchy,index) => { + result['hierarchies'].forEach((hierarchy, index) => { - if(!this.catalogs[index]) { + if (!this.catalogs[index]) { this.catalogs.push([]); } - if (this.catalogs[index !== 0 ? index-1 : 0].length > 0) { - let list = this.catalogs[index].map((c)=> {return c.id}); - if(list.indexOf(hierarchy.id) === -1){ - if(index !== 0 ) { - this.catalogs[index].push({parentId : result['hierarchies'][index-1].id, id : hierarchy.id, name : this._surroundSearchTextWithTag(hierarchy.name), hasChild : hierarchy.hasChild }) + if (this.catalogs[index !== 0 ? index - 1 : 0].length > 0) { + let list = this.catalogs[index].map((c) => { + return c.id; + }); + if (list.indexOf(hierarchy.id) === -1) { + if (index !== 0) { + this.catalogs[index].push({ + parentId: result['hierarchies'][index - 1].id, + id: hierarchy.id, + name: this._surroundSearchTextWithTag(hierarchy.name), + hasChild: hierarchy.hasChild, + }); } else { - this.catalogs[index].push({id : hierarchy.id, name : this._surroundSearchTextWithTag(hierarchy.name), hasChild : hierarchy.hasChild }) + this.catalogs[index].push({ + id: hierarchy.id, + name: this._surroundSearchTextWithTag(hierarchy.name), + hasChild: hierarchy.hasChild, + }); } } } else { - this.catalogs[index].push({id : hierarchy.id, name : this._surroundSearchTextWithTag(hierarchy.name), hasChild : hierarchy.hasChild }) + this.catalogs[index].push( + {id: hierarchy.id, name: this._surroundSearchTextWithTag(hierarchy.name), hasChild: hierarchy.hasChild}); } - }) + }); }); resolve(this.catalogs); - }) + }); } /** @@ -612,12 +628,12 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe * @returns object * @private */ - private _getCatalogParams() : Object { + private _getCatalogParams(): Object { const params = { size: this.pageResult.size, page: this.pageResult.number, - sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort + sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort, }; // 검색어 @@ -633,12 +649,12 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe * @returns object * @private */ - private _getMetadataParams() : Object { + private _getMetadataParams(): Object { const params = { size: this.pageResult.size, page: this.pageResult.number, - sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort + sort: this.selectedContentSort.key + ',' + this.selectedContentSort.sort, }; // 검색어 @@ -668,16 +684,14 @@ export class MetadataComponent extends AbstractComponent implements OnInit, OnDe | Private Method - getter |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ - } - class Order { key: string = 'logicalName'; sort: string = 'asc'; } class SelectedMetadata { - id: string ; - name: string ; + id: string; + name: string; } diff --git a/discovery-frontend/src/app/meta-data-management/metadata/service/metadata.model.service.ts b/discovery-frontend/src/app/meta-data-management/metadata/service/metadata.model.service.ts index b7bc7a593b..5388c23c11 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/service/metadata.model.service.ts +++ b/discovery-frontend/src/app/meta-data-management/metadata/service/metadata.model.service.ts @@ -12,9 +12,9 @@ * limitations under the License. */ -import { Injectable, Injector } from '@angular/core'; -import { AbstractService } from '../../../common/service/abstract.service'; -import { Metadata } from '../../../domain/meta-data-management/metadata'; +import {Injectable, Injector} from '@angular/core'; +import {AbstractService} from '../../../common/service/abstract.service'; +import {Metadata} from '../../../domain/meta-data-management/metadata'; @Injectable() export class MetadataModelService extends AbstractService { @@ -41,7 +41,7 @@ export class MetadataModelService extends AbstractService { /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Public Variables |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ - public selectedMetadata : Metadata; + public selectedMetadata: Metadata; /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Constructor diff --git a/discovery-frontend/src/app/meta-data-management/metadata/service/metadata.service.ts b/discovery-frontend/src/app/meta-data-management/metadata/service/metadata.service.ts index de5ba7d516..6a022e5c4f 100644 --- a/discovery-frontend/src/app/meta-data-management/metadata/service/metadata.service.ts +++ b/discovery-frontend/src/app/meta-data-management/metadata/service/metadata.service.ts @@ -12,9 +12,10 @@ * limitations under the License. */ -import { Injectable, Injector } from '@angular/core'; -import { AbstractService } from '../../../common/service/abstract.service'; -import { CommonUtil } from '../../../common/util/common.util'; +import {Injectable, Injector} from '@angular/core'; +import {AbstractService} from '../../../common/service/abstract.service'; +import {CommonUtil} from '../../../common/util/common.util'; +import * as _ from 'lodash'; @Injectable() export class MetadataService extends AbstractService { @@ -23,8 +24,8 @@ export class MetadataService extends AbstractService { | Private Variables |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ - // Dictionary url - private URL_METADATA = this.API_URL + 'metadatas'; + private readonly URL_METADATA = this.API_URL + 'metadatas'; + /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Protected Variables |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -37,7 +38,6 @@ export class MetadataService extends AbstractService { | Constructor |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ - // 생성자 constructor(protected injector: Injector) { super(injector); } @@ -86,7 +86,6 @@ export class MetadataService extends AbstractService { return this.get(url + `&projection=${projection}`); } - /** * 메타데이터 삭제 * @param {string} id @@ -103,19 +102,18 @@ export class MetadataService extends AbstractService { * @param {any} params * @returns {Promise} */ - public updateMetadata(id: string, params : any): Promise { + public updateMetadata(id: string, params: any): Promise { - return this.patch(this.URL_METADATA + `/${id}`,params); + return this.patch(this.URL_METADATA + `/${id}`, params); } - /** * 메타데이터 이름 중복 체크 * @param {string} name * @returns {Promise} */ public getDuplicateMetaDataName(name: string): Promise { - return this.get(this.URL_METADATA + `/name/${name}/duplicated`) + return this.get(this.URL_METADATA + `/name/${name}/duplicated`); } /** @@ -138,10 +136,9 @@ export class MetadataService extends AbstractService { return this.patch(this.URL_METADATA + `/${metaDataId}/columns`, params); } - public linkMetadataWithCatalog(metadataId, catalogId): Promise { let catId = this.API_URL + 'catalogs/' + catalogId; - return this.patch(this.URL_METADATA + `/${metadataId}/catalogs`, catId,'text/uri-list'); + return this.patch(this.URL_METADATA + `/${metadataId}/catalogs`, catId, 'text/uri-list'); } public deleteCatalogLinkFromMetadata(metadataId, catalogId): Promise { @@ -149,23 +146,28 @@ export class MetadataService extends AbstractService { } public addTagToMetadata(metadataId, params): Promise { - return this.post(this.URL_METADATA + `/${metadataId}/tags/attach`, params ); + return this.post(this.URL_METADATA + `/${metadataId}/tags/attach`, params); } + public deleteTagFromMetadata(metadataId, params): Promise { return this.post(this.URL_METADATA + `/${metadataId}/tags/detach`, params); } - public getMetadataTags() : Promise { + public getMetadataTags(): Promise { return this.get(this.URL_METADATA + `/tags`); } /** * 데이터 소스에 대한 메타데이터 조회 * @param {string} sourceId + * @param projection * @returns {Promise} */ - public getMetadataForDataSource(sourceId:string):Promise { - return this.post(this.URL_METADATA + `/metasources/${sourceId}?projection=forItemView`, {}); + public getMetadataForDataSource( + sourceId: string, projection: 'forItemView' | 'forDetailView' = 'forItemView'): Promise { + return this.post( + this.URL_METADATA + `/metasources/${sourceId}?projection=${_.isNil(projection) ? 'forItemView' : projection}`, + {}); } // function - getMetadataForDataSource /** @@ -176,12 +178,13 @@ export class MetadataService extends AbstractService { * @param {string} projection * @returns {Promise} */ - public getMetadataByConnection(connId: string, schemaName: string, tableName: object, projection: string = 'forItemView'): Promise { + public getMetadataByConnection( + connId: string, schemaName: string, tableName: object, projection: string = 'forItemView'): Promise { // param data 생성 let param = { - "schema" : schemaName, - "table" : tableName + 'schema': schemaName, + 'table': tableName, }; - return this.post(this.URL_METADATA + `/metasources/${connId}?projection=${projection}`, param ); + return this.post(this.URL_METADATA + `/metasources/${connId}?projection=${projection}`, param); } } diff --git a/discovery-frontend/src/app/page/page-pivot/map/map-page-pivot.component.ts b/discovery-frontend/src/app/page/page-pivot/map/map-page-pivot.component.ts index 69adcdac1c..669c4b89a6 100644 --- a/discovery-frontend/src/app/page/page-pivot/map/map-page-pivot.component.ts +++ b/discovery-frontend/src/app/page/page-pivot/map/map-page-pivot.component.ts @@ -14,7 +14,7 @@ import { Component, ElementRef, EventEmitter, Injector, Input, Output } from '@angular/core'; import { Pivot } from '../../../domain/workbook/configurations/pivot'; -import { BIType, Field, FieldPivot, LogicalType } from '../../../domain/datasource/datasource'; +import {Field, FieldPivot, FieldRole, LogicalType} from '../../../domain/datasource/datasource'; import { ChartType, EventType, ShelveFieldType, @@ -203,23 +203,23 @@ export class MapPagePivotComponent extends PagePivotComponent { } const idx = shelf.findIndex((field) => { - return field.name === targetField.name && targetField.biType === field.biType; + return field.name === targetField.name && targetField.role === field.role; }); if (idx > -1) { let field; // timestamp biType이거나, biType이 dimension이면서 logicalType이 timestamp인 경우 - if (targetField.biType === BIType.TIMESTAMP || - (targetField.biType === BIType.DIMENSION && targetField.logicalType === LogicalType.TIMESTAMP)) { + if (targetField.role === FieldRole.TIMESTAMP || + (targetField.role === FieldRole.DIMENSION && targetField.logicalType === LogicalType.TIMESTAMP)) { // 타입필드로 설정 const timeField = new TimestampField(); field = timeField; } - else if (targetField.biType === BIType.DIMENSION) { + else if (targetField.role === FieldRole.DIMENSION) { field = new DimensionField(); - } else if (targetField.biType === BIType.MEASURE) { + } else if (targetField.role === FieldRole.MEASURE) { // default로 aggregationType은 SUM으로 설정 field = new MeasureField(); @@ -342,8 +342,8 @@ export class MapPagePivotComponent extends PagePivotComponent { if (pivotField.currentPivot !== fieldPivot) { // 타임스탬프일때 - if (targetField.biType === BIType.TIMESTAMP || - (targetField.biType === BIType.DIMENSION && targetField.logicalType === LogicalType.TIMESTAMP)) { + if (targetField.role === FieldRole.TIMESTAMP || + (targetField.role === FieldRole.DIMENSION && targetField.logicalType === LogicalType.TIMESTAMP)) { const timestampIndex = shelf.findIndex((field) => { return field.name === targetField.name && targetField.role === field.field.role && targetField.granularity === field.granularity && -1 !== targetField.format['type'].indexOf('time'); diff --git a/discovery-frontend/src/app/page/page-pivot/page-pivot.component.ts b/discovery-frontend/src/app/page/page-pivot/page-pivot.component.ts index ea06c2691e..ab55983164 100644 --- a/discovery-frontend/src/app/page/page-pivot/page-pivot.component.ts +++ b/discovery-frontend/src/app/page/page-pivot/page-pivot.component.ts @@ -23,12 +23,12 @@ import { Output, ViewChild } from '@angular/core'; -import { AbstractComponent } from '../../common/component/abstract.component'; -import { Pivot } from '../../domain/workbook/configurations/pivot'; -import { Field as AbstractField } from '../../domain/workbook/configurations/field/field'; -import { BIType, Field, FieldPivot, FieldRole, LogicalType } from '../../domain/datasource/datasource'; -import { DimensionField } from '../../domain/workbook/configurations/field/dimension-field'; -import { AggregationType, MeasureField } from '../../domain/workbook/configurations/field/measure-field'; +import {AbstractComponent} from '../../common/component/abstract.component'; +import {Pivot} from '../../domain/workbook/configurations/pivot'; +import {Field as AbstractField} from '../../domain/workbook/configurations/field/field'; +import {Field, FieldPivot, FieldRole, LogicalType} from '../../domain/datasource/datasource'; +import {DimensionField} from '../../domain/workbook/configurations/field/dimension-field'; +import {AggregationType, MeasureField} from '../../domain/workbook/configurations/field/measure-field'; import { ByTimeUnit, GranularityType, @@ -38,8 +38,8 @@ import { import * as $ from 'jquery'; import * as _ from 'lodash'; -import { ClickOutsideDirective } from 'ng-click-outside'; -import { PageWidget, PageWidgetConfiguration } from '../../domain/dashboard/widget/page-widget'; +import {ClickOutsideDirective} from 'ng-click-outside'; +import {PageWidget, PageWidgetConfiguration} from '../../domain/dashboard/widget/page-widget'; import { BarMarkType, ChartType, @@ -50,14 +50,14 @@ import { UIFormatNumericAliasType, UIFormatType } from '../../common/component/chart/option/define/common'; -import { Format } from '../../domain/workbook/configurations/format'; -import { Filter } from '../../domain/workbook/configurations/filter/filter'; -import { UIChartAxis, UIChartColorByValue, UIOption } from '../../common/component/chart/option/ui-option'; -import { Modal } from '../../common/domain/modal'; -import { Shelf } from '../../domain/workbook/configurations/shelf/shelf'; -import { Alert } from '../../common/util/alert.util'; -import { StringUtil } from '../../common/util/string.util'; -import { DIRECTION } from '../../domain/workbook/configurations/sort'; +import {Format} from '../../domain/workbook/configurations/format'; +import {Filter} from '../../domain/workbook/configurations/filter/filter'; +import {UIChartAxis, UIChartColorByValue, UIOption} from '../../common/component/chart/option/ui-option'; +import {Modal} from '../../common/domain/modal'; +import {Shelf} from '../../domain/workbook/configurations/shelf/shelf'; +import {Alert} from '../../common/util/alert.util'; +import {StringUtil} from '../../common/util/string.util'; +import {DIRECTION} from '../../domain/workbook/configurations/sort'; import {fromEvent} from "rxjs"; import {debounceTime, map} from "rxjs/operators"; @@ -260,7 +260,7 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD const resizeEvent$ = fromEvent(window, 'resize') .pipe( - map( () => document.documentElement.clientWidth + 'x' + document.documentElement.clientHeight ), + map(() => document.documentElement.clientWidth + 'x' + document.documentElement.clientHeight), debounceTime(500) ); @@ -302,7 +302,7 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD this.pivot.rows = this.pivot.rows.map(this.checkAlias); this.pivot.aggregations = this.pivot.aggregations.map(this.checkAlias); - this.changePivotEvent.emit({ pivot: this.pivot, eventType: eventType }); + this.changePivotEvent.emit({pivot: this.pivot, eventType: eventType}); } /** @@ -504,7 +504,7 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD } const idx = shelf.findIndex((field) => { - return field.name === targetField.name && targetField.biType === field.biType; + return field.name === targetField.name && targetField.role === field.role; }); // GEO data is only usable in map chart @@ -518,17 +518,16 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD let field; // timestamp biType이거나, biType이 dimension이면서 logicalType이 timestamp인 경우 - if (targetField.biType === BIType.TIMESTAMP || - (targetField.biType === BIType.DIMENSION && targetField.logicalType === LogicalType.TIMESTAMP)) { + if (targetField.role === FieldRole.TIMESTAMP || + (targetField.role === FieldRole.DIMENSION && targetField.logicalType === LogicalType.TIMESTAMP)) { // 타입필드로 설정 const timeField = new TimestampField(); //timeField.alias = timeField.granularity.toString().toUpperCase() + `(${targetField.name})`; field = timeField; - } - else if (targetField.biType === BIType.DIMENSION) { + } else if (targetField.role === FieldRole.DIMENSION) { field = new DimensionField(); - } else if (targetField.biType === BIType.MEASURE) { + } else if (targetField.role === FieldRole.MEASURE) { // default로 aggregationType은 SUM으로 설정 field = new MeasureField(); field.aggregated = targetField.aggregated; @@ -541,16 +540,15 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD field.field = targetField; if (targetField.name !== targetField.alias - && ( !targetField.nameAlias || targetField.nameAlias.nameAlias !== targetField.alias )) { + && (!targetField.nameAlias || targetField.nameAlias.nameAlias !== targetField.alias)) { field.alias = targetField.alias; } - ( targetField.nameAlias ) && ( field.fieldAlias = targetField.nameAlias.nameAlias ); + (targetField.nameAlias) && (field.fieldAlias = targetField.nameAlias.nameAlias); field.granularity = targetField.granularity; field.segGranularity = targetField.segGranularity; if (!_.isUndefined(targetField.ref)) { field.ref = targetField.ref; - } - else if (targetField.type == 'user_expr') { + } else if (targetField.type == 'user_expr') { field.ref = 'user_defined'; } @@ -644,8 +642,8 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD if (pivotField.currentPivot !== pivot) { // 타임스탬프일때 - if (targetField.biType === BIType.TIMESTAMP || - (targetField.biType === BIType.DIMENSION && targetField.logicalType === LogicalType.TIMESTAMP)) { + if (targetField.role === FieldRole.TIMESTAMP || + (targetField.role === FieldRole.DIMENSION && targetField.logicalType === LogicalType.TIMESTAMP)) { const timestampIndex = shelf.findIndex((field) => { return field.name === targetField.name && targetField.role === field.field.role && targetField.granularity === field.granularity && -1 !== targetField.format['type'].indexOf('time'); @@ -670,7 +668,7 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD pivotField.currentPivot = pivot; } } - // 타임스탬프가 아닐때 + // 타임스탬프가 아닐때 } else { // 기존의 피봇값 제거 @@ -711,7 +709,7 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD public onChangeFilter($event): void { // 필수필터이면 제거 불가능 - if (this.editingField.field.role === FieldRole.TIMESTAMP && this.editingField.field.biType === BIType.TIMESTAMP) { + if (this.editingField.field.role === FieldRole.TIMESTAMP && this.editingField.field.type === 'TIMESTAMP') { $event.target ? $event.target.checked = true : $event.currentTarget.checked = true; Alert.warning(this.translateService.instant('msg.board.alert.timestamp.del.error')); return; @@ -749,8 +747,7 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD } field.format.type = formatType; this.changeFormatEvent.emit(field); - } - else { + } else { this.fix2DepthContext = false; this.editingField = null; this.changeFormatEvent.emit(null); @@ -973,29 +970,29 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD || _.eq(this.chartType, ChartType.COMBINE) || _.eq(this.chartType, ChartType.GRID)) { - return isText ? this.translateService.instant('msg.page.pivot.layout.condition.dimension.over.desc',{value:'1'}) : 'ddp-box-dimension'; + return isText ? this.translateService.instant('msg.page.pivot.layout.condition.dimension.over.desc', {value: '1'}) : 'ddp-box-dimension'; } // 1 measure else if (_.eq(this.chartType, ChartType.SCATTER)) { - return isText ? this.translateService.instant('msg.page.pivot.layout.condition.measure.desc',{value:'1'}) : 'ddp-box-measure'; + return isText ? this.translateService.instant('msg.page.pivot.layout.condition.measure.desc', {value: '1'}) : 'ddp-box-measure'; } // 1 time dimension else if (_.eq(this.chartType, ChartType.CONTROL) || _.eq(this.chartType, ChartType.WATERFALL)) { - return isText ? this.translateService.instant('msg.page.pivot.layout.condition.dimension.desc',{value:'1'}) : 'ddp-box-dimension'; + return isText ? this.translateService.instant('msg.page.pivot.layout.condition.dimension.desc', {value: '1'}) : 'ddp-box-dimension'; } // 1 dimension // TODO 태호: 차후 네트워크 차트 수치값 적용시 1-2 dimension else if (_.eq(this.chartType, ChartType.NETWORK) || _.eq(this.chartType, ChartType.TREEMAP)) { - return isText ? this.translateService.instant('msg.page.pivot.layout.condition.dimension.desc',{value:'1'}) : 'ddp-box-dimension'; + return isText ? this.translateService.instant('msg.page.pivot.layout.condition.dimension.desc', {value: '1'}) : 'ddp-box-dimension'; } // 3 or more dimension else if (_.eq(this.chartType, ChartType.SANKEY)) { - return isText ? this.translateService.instant('msg.page.pivot.layout.condition.dimension.over.desc',{value:'2'}) : 'ddp-box-dimension'; + return isText ? this.translateService.instant('msg.page.pivot.layout.condition.dimension.over.desc', {value: '2'}) : 'ddp-box-dimension'; } } // 열 @@ -1006,19 +1003,19 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD || _.eq(this.chartType, ChartType.TREEMAP) || _.eq(this.chartType, ChartType.GAUGE)) { - return isText ? this.translateService.instant('msg.page.pivot.layout.condition.dimension.over.desc',{value:'1'}) : 'ddp-box-dimension'; + return isText ? this.translateService.instant('msg.page.pivot.layout.condition.dimension.over.desc', {value: '1'}) : 'ddp-box-dimension'; } // 1 measure else if (_.eq(this.chartType, ChartType.SCATTER)) { - return isText ? this.translateService.instant('msg.page.pivot.layout.condition.measure.desc',{value:'1'}) : 'ddp-box-measure'; + return isText ? this.translateService.instant('msg.page.pivot.layout.condition.measure.desc', {value: '1'}) : 'ddp-box-measure'; } // 1 dimension // TODO 태호: 차후 네트워크 차트 수치값 적용시 1-2 dimension else if (_.eq(this.chartType, ChartType.NETWORK) || _.eq(this.chartType, ChartType.BOXPLOT)) { - return isText ? this.translateService.instant('msg.page.pivot.layout.condition.dimension.desc',{value:'1'}) : 'ddp-box-dimension'; + return isText ? this.translateService.instant('msg.page.pivot.layout.condition.dimension.desc', {value: '1'}) : 'ddp-box-dimension'; } } // 교차 @@ -1030,34 +1027,37 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD || _.eq(this.chartType, ChartType.CONTROL) || _.eq(this.chartType, ChartType.GRID)) { - return isText ? this.translateService.instant('msg.page.pivot.layout.condition.measure.over.desc',{value:'1'}) : 'ddp-box-measure'; + return isText ? this.translateService.instant('msg.page.pivot.layout.condition.measure.over.desc', {value: '1'}) : 'ddp-box-measure'; } // 1 measure & 1 or more dimension else if (_.eq(this.chartType, ChartType.WORDCLOUD)) { return isText - ? this.translateService.instant('msg.page.pivot.layout.condition.measure.desc',{value:'1'}) + this.translateService.instant('msg.page.pivot.layout.condition.dimension.and.over.desc',{value:'1'}) + ? this.translateService.instant('msg.page.pivot.layout.condition.measure.desc', {value: '1'}) + this.translateService.instant('msg.page.pivot.layout.condition.dimension.and.over.desc', {value: '1'}) : 'ddp-box-measure'; } // 1 or more measure & 1 or more dimension else if (_.eq(this.chartType, ChartType.PIE)) { return isText - ? this.translateService.instant('msg.page.pivot.layout.condition.measure.desc',{value:'1'}) + this.translateService.instant('msg.page.pivot.layout.condition.dimension.and.desc',{value:'1'}) + ? this.translateService.instant('msg.page.pivot.layout.condition.measure.desc', {value: '1'}) + this.translateService.instant('msg.page.pivot.layout.condition.dimension.and.desc', {value: '1'}) : 'ddp-box-measure'; } // 1 or more measure & 1 dimension else if (_.eq(this.chartType, ChartType.RADAR)) { return isText - ? this.translateService.instant('msg.page.pivot.layout.condition.measure.over.desc',{value:'1'}) + this.translateService.instant('msg.page.pivot.layout.condition.dimension.and.desc',{value:'1'}) + ? this.translateService.instant('msg.page.pivot.layout.condition.measure.over.desc', {value: '1'}) + this.translateService.instant('msg.page.pivot.layout.condition.dimension.and.desc', {value: '1'}) : 'ddp-box-measure'; } // 2~4 measure else if (_.eq(this.chartType, ChartType.COMBINE)) { return isText - ? this.translateService.instant('msg.page.pivot.layout.condition.measure.range',{valueFirst:'2',valueSecond:'4'}) + ? this.translateService.instant('msg.page.pivot.layout.condition.measure.range', { + valueFirst: '2', + valueSecond: '4' + }) : 'ddp-box-measure'; } // 1 measure @@ -1069,12 +1069,12 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD || _.eq(this.chartType, ChartType.GAUGE) || _.eq(this.chartType, ChartType.TREEMAP)) { - return isText ? this.translateService.instant('msg.page.pivot.layout.condition.measure.desc',{value:'1'}) : 'ddp-box-measure'; + return isText ? this.translateService.instant('msg.page.pivot.layout.condition.measure.desc', {value: '1'}) : 'ddp-box-measure'; } // 1 or more dimension else if (_.eq(this.chartType, ChartType.SCATTER)) { - return isText ? this.translateService.instant('msg.page.pivot.layout.condition.dimension.over.desc',{value:'1'}) : 'ddp-box-dimension'; + return isText ? this.translateService.instant('msg.page.pivot.layout.condition.dimension.over.desc', {value: '1'}) : 'ddp-box-dimension'; } } @@ -1090,7 +1090,7 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD if (field.alias) { return field.alias; } else { - return ( field.fieldAlias ) ? field.fieldAlias : field.name; + return (field.fieldAlias) ? field.fieldAlias : field.name; } } // function - getDisplayPivotName @@ -1137,8 +1137,8 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD * @return {string} */ public getAliasPlaceholder(field: AbstractField): string { - const displayName: string = ( field.fieldAlias ) ? field.fieldAlias : field.name; - return ( field['aggregationType'] ) ? ( field['aggregationType'] + '(' + displayName + ')' ) : displayName; + const displayName: string = (field.fieldAlias) ? field.fieldAlias : field.name; + return (field['aggregationType']) ? (field['aggregationType'] + '(' + displayName + ')') : displayName; } // function - getAliasPlaceholder /** @@ -1162,10 +1162,10 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD }); if (duppIndex == -1) { this.widget.dashBoard.configuration['fields'].forEach((field, index) => { - if( field.nameAlias && field.nameAlias['nameAlias'] == this.editingFieldAlias ) { - duppIndex = index; - return false; - } + if (field.nameAlias && field.nameAlias['nameAlias'] == this.editingFieldAlias) { + duppIndex = index; + return false; + } }); } @@ -1217,8 +1217,8 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD * @param {Field} editingField */ public setEditingFieldAlias(editingField: AbstractField) { - if( this.isSetPivotAlias(editingField) ) { - if( editingField.pivotAlias ) { + if (this.isSetPivotAlias(editingField)) { + if (editingField.pivotAlias) { this.editingFieldAlias = editingField.pivotAlias.trim(); } else { this.editingFieldAlias = editingField.alias.trim(); @@ -1249,8 +1249,8 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD if (editingField.pivotAlias) { return true; } else { - return ( editingField.alias && editingField.alias !== editingField.name - && editingField.fieldAlias !== editingField.alias ); + return (editingField.alias && editingField.alias !== editingField.name + && editingField.fieldAlias !== editingField.alias); } } // function - isSetPivotAlias @@ -1279,7 +1279,7 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD let scope = this; // 선반에 animation 설정 - $(event.currentTarget.parentElement).find('.ddp-wrap-default').animate({ marginLeft: 0 }, { + $(event.currentTarget.parentElement).find('.ddp-wrap-default').animate({marginLeft: 0}, { duration: 1500, step: function () { if (scope.animationPause) { @@ -1307,7 +1307,7 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD let moveWidth = totalWidth - $currentShelve.find('.ddp-ui-drag-slide-in').width(); // 선반에 animation 설정 - $(event.currentTarget.parentElement).find('.ddp-wrap-default').animate({ marginLeft: -moveWidth - 80 }, { + $(event.currentTarget.parentElement).find('.ddp-wrap-default').animate({marginLeft: -moveWidth - 80}, { duration: 1500, step: function () { if (scope.animationPause) { @@ -1434,8 +1434,7 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD // 현재필드의 보조축인지 체크 if (this.uiOption.secondaryAxis && this.uiOption.secondaryAxis.name == this.editingField.alias) { return true; - } - else { + } else { return false; } } @@ -1626,12 +1625,12 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD } else { - if (field.biType === BIType.DIMENSION) { + if (field.role === FieldRole.DIMENSION) { targetField = new DimensionField(); - } else if (field.biType === BIType.MEASURE) { + } else if (field.role === FieldRole.MEASURE) { targetField = new MeasureField(); targetField.aggregationType = !field.aggregated ? AggregationType.SUM : AggregationType.NONE; - } else if (field.biType === BIType.TIMESTAMP) { + } else if (field.role === FieldRole.TIMESTAMP) { targetField = new TimestampField(); } targetField.name = field.name; @@ -1717,7 +1716,7 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD const modal = new Modal(); modal.name = this.translateService.instant('msg.page.chart.color.measure.range.grid.original.description'); modal.data = { - data: { discontinuous: discontinuous, unit: unit, byUnit: byUnit }, + data: {discontinuous: discontinuous, unit: unit, byUnit: byUnit}, eventType: EventType.GRANULARITY } @@ -1758,8 +1757,7 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD if (!discontinuous) { return (!field.format.discontinuous && field.format.unit == TimeUnit[unit]); - } - else { + } else { return (field.format.discontinuous && field.format.unit == TimeUnit[unit]) && (!byUnit || (byUnit && field.format.byUnit == ByTimeUnit[byUnit])); } @@ -1802,6 +1800,7 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD return duplicateList; } + /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Private Method |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -1840,30 +1839,30 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD this.$editFieldLayer = $('#editFieldLayer'); // aggregation 함수 리스트 설정 - this.aggTypeList = [{ label: 'Sum', id: AggregationType.SUM }, - { label: 'Average', id: AggregationType.AVG }, - { label: 'Count', id: AggregationType.COUNT }, - { label: 'Median', id: AggregationType.MEDIAN }, - { label: 'Min', id: AggregationType.MIN }, - { label: 'Max', id: AggregationType.MAX }, + this.aggTypeList = [{label: 'Sum', id: AggregationType.SUM}, + {label: 'Average', id: AggregationType.AVG}, + {label: 'Count', id: AggregationType.COUNT}, + {label: 'Median', id: AggregationType.MEDIAN}, + {label: 'Min', id: AggregationType.MIN}, + {label: 'Max', id: AggregationType.MAX}, { label: 'Percentile', id: AggregationType.PERCENTILE, - options: [{ decimal: 0.25, fraction: '1/4' }, { decimal: 0.75, fraction: '3/4' }] + options: [{decimal: 0.25, fraction: '1/4'}, {decimal: 0.75, fraction: '3/4'}] }]; // timestamp 타입 리스트 설정 this.timestampTypeList = [ // 초단위 제거 요청으로 주석처리 // { label: 'Second', id: GranularityType.SECOND, discontinuous: false }, - { label: 'Minute', id: GranularityType.MINUTE, discontinuous: false }, - { label: 'Hour', id: GranularityType.HOUR, discontinuous: false }, - { label: 'Day', id: GranularityType.DAY, discontinuous: false }, - { label: 'Week', id: GranularityType.WEEK, discontinuous: false }, - { label: 'Month', id: GranularityType.MONTH, discontinuous: false }, - { label: 'Quarter', id: GranularityType.QUARTER, discontinuous: false }, - { label: 'Year', id: GranularityType.YEAR, discontinuous: false }, - { label: 'None', id: GranularityType.NONE, discontinuous: false }]; + {label: 'Minute', id: GranularityType.MINUTE, discontinuous: false}, + {label: 'Hour', id: GranularityType.HOUR, discontinuous: false}, + {label: 'Day', id: GranularityType.DAY, discontinuous: false}, + {label: 'Week', id: GranularityType.WEEK, discontinuous: false}, + {label: 'Month', id: GranularityType.MONTH, discontinuous: false}, + {label: 'Quarter', id: GranularityType.QUARTER, discontinuous: false}, + {label: 'Year', id: GranularityType.YEAR, discontinuous: false}, + {label: 'None', id: GranularityType.NONE, discontinuous: false}]; } /** @@ -1922,7 +1921,7 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD if (aggTypeId && item2.aggregationType && aggTypeId === item2.aggregationType) { - copiedAggregation.splice(_.findIndex(copiedAggregation, { id: aggTypeId }), 1); + copiedAggregation.splice(_.findIndex(copiedAggregation, {id: aggTypeId}), 1); continue loop1; } } @@ -1972,7 +1971,7 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD if (timestampTypeId && item2.format && timestampTypeId === item2.format.unit && timeDiscontinuous === item2.format.discontinuous) { - copiedTimestampList.splice(_.findLastIndex(copiedTimestampList, { id: timestampTypeId }), 1); + copiedTimestampList.splice(_.findLastIndex(copiedTimestampList, {id: timestampTypeId}), 1); continue loop1; } } @@ -1991,7 +1990,9 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD // none값의 순서변경 if (shelf[idx].field.role === FieldRole.DIMENSION) { - const noneIndex = _.findIndex(copiedTimestampList, (obj) => { return obj.id === 'NONE'; }); + const noneIndex = _.findIndex(copiedTimestampList, (obj) => { + return obj.id === 'NONE'; + }); // none이 있는경우 if (-1 !== noneIndex) { @@ -2009,7 +2010,7 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD shelf[idx].format.type = String(UIFormatType.TIME_CONTINUOUS); shelf[idx].format.discontinuous = false; shelf[idx].format.unit = copiedTimestampList[0].id; - if( field.field && field.field.format ) { + if (field.field && field.field.format) { shelf[idx].format.timeZone = field.field.format.timeZone; } } @@ -2024,18 +2025,17 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD shelf[idx].format.type = String(UIFormatType.TIME_CONTINUOUS); shelf[idx].format.discontinuous = false; shelf[idx].format.unit = copiedTimestampList[0].id; - if( field.field && field.field.format ) { + if (field.field && field.field.format) { shelf[idx].format.timeZone = field.field.format.timeZone; } - } - else if (shelf[idx].field.role === FieldRole.DIMENSION) { + } else if (shelf[idx].field.role === FieldRole.DIMENSION) { // NONE shelf[idx].format = new Format(); shelf[idx].format.type = String(UIFormatType.TIME_CONTINUOUS); shelf[idx].format.discontinuous = false; shelf[idx].format.unit = TimeUnit.NONE; - if( field.field && field.field.format ) { + if (field.field && field.field.format) { shelf[idx].format.timeZone = field.field.format.timeZone; } } @@ -2204,7 +2204,7 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD } else { // 아이템이 올라간 선반 표시 아이콘 제거 - this.deletePivotItem.emit({ data: item, addType: fieldPivot, deleteType: deleteType }); + this.deletePivotItem.emit({data: item, addType: fieldPivot, deleteType: deleteType}); } } } @@ -2653,7 +2653,7 @@ export class PagePivotComponent extends AbstractComponent implements OnInit, OnD getFieldList(item); // data 패널에 표시 - this.deletePivotItem.emit({ data: item, list: list, deleteType: item.currentPivot }); + this.deletePivotItem.emit({data: item, list: list, deleteType: item.currentPivot}); } }); } diff --git a/discovery-frontend/src/app/page/page-pivot/pivot-context.component.ts b/discovery-frontend/src/app/page/page-pivot/pivot-context.component.ts index 9e378c19ee..6b86b56848 100644 --- a/discovery-frontend/src/app/page/page-pivot/pivot-context.component.ts +++ b/discovery-frontend/src/app/page/page-pivot/pivot-context.component.ts @@ -15,7 +15,7 @@ import { AbstractComponent } from '../../common/component/abstract.component'; import { Component, ElementRef, EventEmitter, Injector, Input, OnDestroy, OnInit, Output } from '@angular/core'; import { Field, Field as AbstractField } from '../../domain/workbook/configurations/field/field'; -import { BIType, FieldRole } from '../../domain/datasource/datasource'; +import { FieldRole } from '../../domain/datasource/datasource'; import { Alert } from '../../common/util/alert.util'; import * as _ from 'lodash'; import { StringUtil } from '../../common/util/string.util'; @@ -94,7 +94,7 @@ export class PivotContextComponent extends AbstractComponent implements OnInit, public onChangeFilter($event): void { // 필수필터이면 제거 불가능 - if (this.editingField.field.role === FieldRole.TIMESTAMP && this.editingField.field.biType === BIType.TIMESTAMP) { + if (this.editingField.field.role === FieldRole.TIMESTAMP && this.editingField.field.type === 'TIMESTAMP') { $event.target ? $event.target.checked = true : $event.currentTarget.checked = true; Alert.warning(this.translateService.instant('msg.board.alert.timestamp.del.error')); return; diff --git a/discovery-frontend/src/app/page/page.component.ts b/discovery-frontend/src/app/page/page.component.ts index d3423c4a35..dfa1f2c605 100644 --- a/discovery-frontend/src/app/page/page.component.ts +++ b/discovery-frontend/src/app/page/page.component.ts @@ -15,7 +15,6 @@ import * as _ from 'lodash'; import { - AfterViewInit, Component, ElementRef, EventEmitter, @@ -24,7 +23,7 @@ import { OnDestroy, OnInit, Output, - ViewChild, + ViewChild } from '@angular/core'; import { AbstractPopupComponent } from '../common/component/abstract-popup.component'; import { PageWidget, PageWidgetConfiguration } from '../domain/dashboard/widget/page-widget'; @@ -33,7 +32,6 @@ import { PopupService } from '../common/service/popup.service'; import { StringUtil } from '../common/util/string.util'; import { Pivot } from '../domain/workbook/configurations/pivot'; import { - BIType, ConnectionType, Datasource, Field, @@ -76,8 +74,7 @@ import { DragulaService } from '../../lib/ng2-dragula'; import { PageDataContextComponent } from './page-data/page-data-context.component'; import { Format } from '../domain/workbook/configurations/format'; import { FilterUtil } from '../dashboard/util/filter.util'; -import { Observable } from 'rxjs/Observable'; -import {isNullOrUndefined, isUndefined} from 'util'; +import {isUndefined} from 'util'; import { AnalysisComponent } from './component/analysis/analysis.component'; import { AnalysisPredictionService } from './component/analysis/service/analysis.prediction.service'; import { CustomField } from '../domain/workbook/configurations/field/custom-field'; @@ -93,7 +90,7 @@ import { PageFilterPanel } from './filter/filter-panel.component'; import { SecondaryIndicatorComponent } from './chart-style/secondary-indicator.component'; import { DataLabelOptionComponent } from './chart-style/datalabel-option.component'; import {ChartLimitInfo, DashboardUtil} from '../dashboard/util/dashboard.util'; -import {BoardConfiguration, LayoutMode} from '../domain/dashboard/dashboard'; +import {BoardConfiguration} from '../domain/dashboard/dashboard'; import { CommonUtil } from '../common/util/common.util'; import { MapChartComponent } from '../common/component/chart/type/map-chart/map-chart.component'; import {MapFormatOptionComponent} from './chart-style/map/map-format-option.component'; @@ -103,7 +100,6 @@ import { Shelf } from '../domain/workbook/configurations/shelf/shelf'; import { MapPagePivotComponent } from './page-pivot/map/map-page-pivot.component'; import { UIMapOption } from '../common/component/chart/option/ui-option/map/ui-map-chart'; import { MapLayerType } from '../common/component/chart/option/define/map/map-common'; -import { ChartUtil } from '../common/component/chart/option/util/chart-util'; import {fromEvent} from "rxjs"; import {debounceTime, map} from "rxjs/operators"; @@ -1855,7 +1851,7 @@ export class PageComponent extends AbstractPopupComponent implements OnInit, OnD if (selectedField.useFilter) { // 필수필터이면 제거 불가능 - if (selectedField.role === FieldRole.TIMESTAMP && selectedField.biType === BIType.TIMESTAMP) { + if (selectedField.role === FieldRole.TIMESTAMP && selectedField.type === 'TIMESTAMP') { Alert.warning(this.translateService.instant('msg.board.alert.timestamp.del.error')); return; } @@ -2334,7 +2330,8 @@ export class PageComponent extends AbstractPopupComponent implements OnInit, OnD let pivotFiled: any = { name: targetField.name, alias: targetField.alias, - biType: targetField.biType + role : targetField.role, + type: targetField.type }; // 이미 선반에 들어가있는지 여부 @@ -3374,9 +3371,9 @@ export class PageComponent extends AbstractPopupComponent implements OnInit, OnD if (totalFields && totalFields.length > 0) { totalFields = DashboardUtil.getFieldsForMainDataSource(boardConf, this.dataSource.engineName); totalFields.forEach((field) => { - if (field.biType === BIType.MEASURE) { + if (field.role === FieldRole.MEASURE) { this.measures.push(field); - } else if (field.biType === BIType.DIMENSION || field.biType === BIType.TIMESTAMP) { + } else if (field.role === FieldRole.DIMENSION || field.role === FieldRole.TIMESTAMP) { this.dimensions.push(field); } else { // 정의되지 않은 필드 세팅 필요 @@ -3400,7 +3397,6 @@ export class PageComponent extends AbstractPopupComponent implements OnInit, OnD const dimension: Field = new Field(); dimension.type = field.type; - dimension.biType = BIType.DIMENSION; dimension.role = field.role; dimension.name = field.name; dimension.alias = field.name; @@ -3413,7 +3409,6 @@ export class PageComponent extends AbstractPopupComponent implements OnInit, OnD const measure: Field = new Field(); measure.type = field.type; - measure.biType = BIType.MEASURE; measure.role = field.role; measure.name = field.name; measure.alias = field.name; @@ -3463,7 +3458,7 @@ export class PageComponent extends AbstractPopupComponent implements OnInit, OnD this.widgetConfiguration.pivot.rows .forEach((abstractField) => { - if (String(field.biType) == abstractField.type.toUpperCase() && field.name == abstractField.name) { + if (String(field.type) == abstractField.type.toUpperCase() && field.name == abstractField.name) { abstractField.field = field; field.pivot = field.pivot ? field.pivot : []; field.pivot.push(FieldPivot.ROWS); @@ -3472,7 +3467,7 @@ export class PageComponent extends AbstractPopupComponent implements OnInit, OnD this.widgetConfiguration.pivot.columns .forEach((abstractField) => { - if (String(field.biType) == abstractField.type.toUpperCase() && field.name == abstractField.name) { + if (String(field.type) == abstractField.type.toUpperCase() && field.name == abstractField.name) { abstractField.field = field; field.pivot = field.pivot ? field.pivot : []; field.pivot.push(FieldPivot.COLUMNS); @@ -3481,7 +3476,7 @@ export class PageComponent extends AbstractPopupComponent implements OnInit, OnD this.widgetConfiguration.pivot.aggregations .forEach((abstractField) => { - if (String(field.biType) == abstractField.type.toUpperCase() && field.name == abstractField.name) { + if (String(field.type) == abstractField.type.toUpperCase() && field.name == abstractField.name) { abstractField.field = field; field.pivot = field.pivot ? field.pivot : []; field.pivot.push(FieldPivot.AGGREGATIONS); @@ -3502,7 +3497,7 @@ export class PageComponent extends AbstractPopupComponent implements OnInit, OnD this.widgetConfiguration.shelf.layers[this.widgetConfiguration.chart['layerNum']] .forEach((abstractField) => { - if (String(field.biType) == abstractField.type.toUpperCase() && field.name == abstractField.name) { + if (String(field.type) == abstractField.type.toUpperCase() && field.name == abstractField.name) { abstractField.field = field; field.pivot = field.pivot ? field.pivot : []; field.pivot.push(fieldPivot); diff --git a/discovery-frontend/src/app/workbench/workbench.component.ts b/discovery-frontend/src/app/workbench/workbench.component.ts index 04c58a55bd..b0e3f76768 100644 --- a/discovery-frontend/src/app/workbench/workbench.component.ts +++ b/discovery-frontend/src/app/workbench/workbench.component.ts @@ -43,7 +43,7 @@ import {DatasourceService} from '../datasource/service/datasource.service'; import {PageWidget} from '../domain/dashboard/widget/page-widget'; import {Dashboard, BoardDataSource, BoardConfiguration} from '../domain/dashboard/dashboard'; import { - BIType, ConnectionType, Datasource, Field, IngestionRuleType, + ConnectionType, Datasource, Field, FieldRole, IngestionRuleType, LogicalType } from '../domain/datasource/datasource'; import {Workbook} from '../domain/workbook/workbook'; @@ -2864,7 +2864,8 @@ export class WorkbenchComponent extends AbstractComponent implements OnInit, OnD const currentDateTimeField: Field = new Field(); currentDateTimeField.name = CommonConstant.COL_NAME_CURRENT_DATETIME; - currentDateTimeField.biType = BIType.TIMESTAMP; + currentDateTimeField.role = FieldRole.TIMESTAMP; + currentDateTimeField.type = 'TIMESTAMP'; currentDateTimeField.logicalType = LogicalType.TIMESTAMP; currentDateTimeField.dataSource = boardDataSource.engineName; // fields = [currentDateTimeField].concat( fields ); diff --git a/discovery-frontend/src/assets/css/metatron/component/component.button.css b/discovery-frontend/src/assets/css/metatron/component/component.button.css index 72b02beadc..99c8e89588 100644 --- a/discovery-frontend/src/assets/css/metatron/component/component.button.css +++ b/discovery-frontend/src/assets/css/metatron/component/component.button.css @@ -86,8 +86,8 @@ a.ddp-btn-type-popup2.ddp-bg-black.ddp-disabled:hover {background-color:#d0d1d8; .ddp-btn-selection.ddp-gray {background-color:#e7e7ea; color:#4b525b;} .ddp-btn-selection.ddp-gray:hover {background-color:#d0d1d8; color:#4b525b;} .ddp-btn-selection.ddp-gray .ddp-icon-view {background-position:-28px -43px;} -.ddp-btn-selection.ddp-gray em.ddp-icon-add2 {display:inline-block; position:relative; width:13px; height:13px; margin-right:5px; background:url(../../../images/icon_add.png) no-repeat; background-positioN:left -22px; vertical-align: middle;} - +.ddp-btn-selection.ddp-gray em.ddp-icon-add2 {display:inline-block; position:relative; width:13px; height:13px; margin-right:5px; background:url(../../../images/icon_add.png) no-repeat; background-position:left -22px; vertical-align: middle;} +.ddp-btn-selection.ddp-gray em.ddp-icon-plus {display:inline-block; position:relative; width:10px; height:10px; margin-right:5px; background:url(../../../images/icon_add.png) no-repeat; background-position:-22px -66px; vertical-align: middle;} .ddp-btn-selection.ddp-reject {background-color:#e35252;} .ddp-btn-selection.ddp-reject:hover {background-color:#c63b3b; color:#fff;} diff --git a/discovery-frontend/src/assets/css/polaris.v2.page.css b/discovery-frontend/src/assets/css/polaris.v2.page.css index 2c77d2c2f3..829098ef77 100644 --- a/discovery-frontend/src/assets/css/polaris.v2.page.css +++ b/discovery-frontend/src/assets/css/polaris.v2.page.css @@ -4984,8 +4984,9 @@ ul.ddp-list-rule2 li.ddp-disabled2 .ddp-wrap-line-add {display:block;} .ddp-wrap-flow .ddp-wrap-addrule {position:absolute; bottom:0; left:0; right:0; min-height:207px; background-color:#fff; box-sizing:border-box; z-index:10;} /**** 데이터셋 팝업 *****/ -.ddp-ui-popup-contents {height:100%; margin-top:-120px; padding:120px 50px 0 50px; box-sizing: border-box;} -.ddp-ui-popup-contents .ddp-popup-viewtable {position:absolute; top:170px; left:50px; right:50px; bottom:90px;} +.ddp-ui-popup-contents {position:relative; height:100%; margin-top:-120px; padding:120px 50px 0 50px; box-sizing: border-box;} +.ddp-ui-popup-contents.ddp-info {padding-top:134px;} +.ddp-ui-popup-contents .ddp-box-message {position:absolute; top:84px; left:50px; right:50px;}.ddp-ui-popup-contents .ddp-popup-viewtable {position:absolute; top:170px; left:50px; right:50px; bottom:90px;} .ddp-ui-popup-contents .ddp-popup-viewtable .ddp-box-add-link {position:absolute; bottom:0; left:0; right:0; bottom:0;} .ddp-ui-popup-contents .ddp-box-viewtable {height:100%; box-sizing:Border-box;} .ddp-box-viewtable.ddp-viewtable-type .ddp-ui-gridbody {bottom:35px;} @@ -5268,7 +5269,9 @@ table.ddp-table-detail tbody tr td .ddp-ui-summary ul.ddp-list-sub li a {color:# .ddp-edit-description.ddp-line:after {position:absolute; bottom:0; left:0; right:0;border-bottom:1px dotted #ccc; content:'';} .ddp-edit-description .ddp-box-textarea {display:none;} .ddp-edit-description .ddp-txt-description {position:relative; top:-3px; font-size:13px; line-height:18px; cursor:pointer;} -.ddp-edit-description .ddp-data-description {position:relative; padding-bottom:30px;} +.ddp-edit-description .ddp-txt-description.ddp-nodata {color:#b7bac1;} + +.ddp-edit-description .ddp-data-description {position:relative; padding-bottom:20px;} .ddp-edit-description .ddp-data-description:hover .ddp-btn-edit {display:inline-block;} .ddp-edit-description .ddp-data-description .ddp-btn-edit {display:none; padding:4px 7px; position:absolute; bottom:0; left:0; height:21px; color:#91969e; font-size:12px; font-style:italic; background-color:#f3f3f4; box-sizing:border-box;} .ddp-edit-description .ddp-data-description .ddp-btn-edit .ddp-icon-edit {display:inline-block; width:12px; height:13px; margin-right:3px; background:url(../images/icon_control.png) no-repeat; background-position:-39px -96px; vertical-align:top;} @@ -5276,8 +5279,8 @@ table.ddp-table-detail tbody tr td .ddp-ui-summary ul.ddp-list-sub li a {color:# .ddp-edit-description.ddp-edit .ddp-data-description {display:none;} .ddp-edit-description.ddp-edit .ddp-box-textarea {display:block; overflow:hidden;} .ddp-edit-description.ddp-edit .ddp-box-textarea textarea {display:block; width:100%; height:194px; padding:5px 9px; line-height:18px;border:1px solid #d0d1d8; border-radius:2px; box-sizing:border-box;} -.ddp-edit-description.ddp-edit .ddp-box-textarea .ddp-textarea-buttons {float:right; padding:4px 0 0 0;} -.ddp-edit-description.ddp-edit .ddp-box-textarea .ddp-textarea-buttons .ddp-box-btn {float:Left; position:relative; width:24px; height:24px; margin-left:4px;border-radius:2px; background-color:#d0d1d8;} +.ddp-edit-description.ddp-edit .ddp-box-textarea .ddp-textarea-buttons {padding:4px 0 0 0;} +.ddp-edit-description.ddp-edit .ddp-box-textarea .ddp-textarea-buttons .ddp-box-btn {float:Left; position:relative; width:24px; height:24px; margin-right:4px;border-radius:2px; background-color:#d0d1d8;} .ddp-edit-description.ddp-edit .ddp-box-textarea .ddp-textarea-buttons .ddp-box-btn:hover {background-color:#9ca2cc;} .ddp-edit-description.ddp-edit .ddp-box-textarea .ddp-textarea-buttons .ddp-box-btn em.ddp-icon-cancel {display:inline-block; width:9px; height:9px; position:absolute; top:50%; left:50%; margin:-5px 0 0 -5px; background:url(../images/btn_close.png) no-repeat; background-position:-20px -82px;} .ddp-edit-description.ddp-edit .ddp-box-textarea .ddp-textarea-buttons .ddp-box-btn .ddp-icon-check {display:inline-block; position:absolute; top:50%; left:50%; margin:-4px 0 0 -6px; width:11px; height:8px; background:url(../images/icon_select2.png) no-repeat; background-position:-27px top;} @@ -6287,6 +6290,7 @@ table.ddp-table-detail td .ddp-data-permission span.ddp-data-name {color:#b7bac1 .ddp-ui-datadetail:first-of-type {border-top:none;} .ddp-ui-datadetail .ddp-label-detail {display:block; margin-bottom:15px;} .ddp-ui-datadetail .ddp-box-synch {position:absolute; top:0; left:0; right:0;} +.ddp-ui-datadetail .ddp-btn-solid2.type-link {position:absolute; top:40px; right:60px;} table.ddp-table-detail tr td dl.ddp-dl-detail {margin-top:16px;} table.ddp-table-detail tr td dl.ddp-dl-detail:first-of-type {margin-top:0;} table.ddp-table-detail tr td dl.ddp-dl-detail:last-of-type {margin-bottom:30px;} @@ -7191,6 +7195,19 @@ ul.ddp-list-value li.ddp-total {color:#b7b9c2;} .ddp-configure-schema {position:relative;} .ddp-configure-schema .ddp-form-search {width:240px;} .ddp-configure-schema .ddp-data-details.ddp-ui-preview-contents {position:absolute; top:170px; left:50px; right:50px; bottom:48px; height:auto;} +.ddp-configure-schema.ddp-info .ddp-data-details.ddp-ui-preview-contents {top:185px;} +.ddp-type-top-option .ddp-ui-rightoption.ddp-type-schema .ddp-form-label2 {margin-left:10px;} + +.ddp-configure-schema .ddp-ui-rightoption.ddp-type-schema .ddp-wrap-dropdown {width:110px;} +.ddp-configure-schema .ddp-ui-rightoption.ddp-type-schema .ddp-ui-setbtn {position:Relative; float:left;} +.ddp-configure-schema .ddp-ui-rightoption.ddp-type-schema .ddp-ui-setbtn .ddp-btn-setting {display:inline-block; position:relative; width:30px; height:30px; margin:0 8px; border:1px solid #d0d1d8; box-sizing:border-box; border-radius:2px;} +.ddp-configure-schema .ddp-ui-rightoption.ddp-type-schema .ddp-ui-setbtn .ddp-btn-setting:hover, +.ddp-configure-schema .ddp-ui-rightoption.ddp-type-schema .ddp-ui-setbtn.ddp-selected .ddp-btn-setting{border-color:#b7b9c2;} +.ddp-configure-schema .ddp-ui-rightoption.ddp-type-schema .ddp-ui-setbtn .ddp-btn-setting:before {display:inline-block; position:absolute; top:50%; left:50%; width:14px; height:14px; margin:-7px 0 0 -7px; background:url(../images/icon_option.png) no-repeat; background-position:left -16px; content:'';} +.ddp-configure-schema .ddp-ui-rightoption.ddp-type-schema .ddp-ui-setbtn .ddp-btn-setting:hover:before, +.ddp-configure-schema .ddp-ui-rightoption.ddp-type-schema .ddp-ui-setbtn.ddp-selected .ddp-btn-setting:before {background-position-x:-15px;} +.ddp-configure-schema .ddp-ui-rightoption.ddp-type-schema .ddp-ui-setbtn .ddp-wrap-popup2 {display:none; position:absolute; top:100%; left:8px; margin-top:3px; z-index:20} +.ddp-configure-schema .ddp-ui-rightoption.ddp-type-schema .ddp-ui-setbtn.ddp-selected .ddp-wrap-popup2 {display:block;} .ddp-wrap-value-setting .ddp-ui-setting {padding:20px 20px 20px 20px;} .ddp-wrap-value-setting .ddp-ui-setting .ddp-setting-button {padding:10px 0 0 0;} @@ -8183,13 +8200,13 @@ table.ddp-table-detail tr td .ddp-tag-default:before {display:inline-block; posi table.ddp-table-detail tr td .ddp-tag-default input {display:block; width:100%; border:none; background:none;color:#666fad; font-size:13px;} .ddp-tag-default .ddp-ui-drop-search {position:absolute; top:100%; left:0; right:inherit;} .ddp-wrap-drop-search.ddp-tag-default .ddp-ui-drop-search:after {display:none;} -.ddp-option-column {padding-bottom:15px; text-align:right;} -.ddp-option-column a.ddp-reset {margin-right:20px; color:#90969f;} +.ddp-ui-option .ddp-option-column {padding:0;} +.ddp-option-column {padding:20px 0; text-align:right; }.ddp-option-column a.ddp-reset {margin-right:20px; color:#90969f;} .ddp-option-column a.ddp-reset em {vertical-align:middle;} .ddp-option-column a.ddp-reset:hover {color:#4b515b;} .ddp-option-column a.ddp-reset:hover em {background-position:-15px -34px;} -.ddp-wrap-datadetail.ddp-wrap-datacolumn { padding-top:45px;box-sizing:border-box;} +.ddp-wrap-datadetail.ddp-wrap-datacolumn { padding-top:20px;box-sizing:border-box;} table.ddp-table-form.ddp-table-details tr td .ddp-bar {background-color:#e9edf7;} table.ddp-table-form.ddp-table-details tr td .ddp-bar span {background-color:#c1cef1;} table.ddp-table-form.ddp-table-details tr th .ddp-box-layout4 {position:absolute; top:100%; right:-30px;} @@ -8197,8 +8214,8 @@ table.ddp-table-form.ddp-table-details tr th:nth-child(1) .ddp-box-layout4, table.ddp-table-form.ddp-table-details tr th:nth-child(2) .ddp-box-layout4, table.ddp-table-form.ddp-table-details tr th:nth-child(3) .ddp-box-layout4, table.ddp-table-form.ddp-table-details tr th:nth-child(4) .ddp-box-layout4 {right:inherit; left:-30px;} -.ddp-wrap-datadetail.ddp-wrap-datacolumn .ddp-data-details.ddp-ui-preview-contents {position:fixed; left:45px; right:45px; bottom:20px; top:250px; height:inherit;} - +.ddp-wrap-datadetail.ddp-wrap-datacolumn .ddp-data-details.ddp-ui-preview-contents {position:fixed; left:45px; right:45px; bottom:20px; top:246px; height:inherit;} +.ddp-wrap-datadetail.ddp-wrap-datacolumn .ddp-data-details.ddp-ui-preview-contents.ddp-info {top:265px;} .ddp-page-catalog {position:relative; box-sizing:border-box; border-top:1px solid #e7e7ea;} .ddp-page-catalog .ddp-ui-root {padding:8px 0;} .ddp-page-catalog .ddp-ui-root .ddp-btn-bg {float:right;margin-left:14px;} diff --git a/discovery-frontend/src/assets/i18n/en.json b/discovery-frontend/src/assets/i18n/en.json index b393aa9176..5668667d88 100644 --- a/discovery-frontend/src/assets/i18n/en.json +++ b/discovery-frontend/src/assets/i18n/en.json @@ -2166,9 +2166,13 @@ "msg.storage.ui.file.result.FV005": "Empty column name is not allowed.", "msg.storage.ui.timezone": "Time zone", "msg.storage.ui.username": "Username", + "msg.storage.ui.guide.meta.modified": "Metadata is also updated when modified.", + "msg.storage.btn.master.data.link": "Go to Metadata", "msg.storage.ui.cannot.load.data": "Cannot load data", "msg.storage.btn.create.source": "Create datasource", "msg.storage.ph.search.snapshot": "Search snapshot", + "msg.storage.ph.source.desc": "Please insert datasource description", + "msg.storage.ui.none.source.desc": "No description", "msg.storage.ui.timezone.country.zimbabwe": "Zimbabwe", "msg.storage.ui.timezone.country.zambia": "Zambia", @@ -3974,6 +3978,8 @@ "msg.metadata.dictionary.used.metadata" : "Used in Metadata", "msg.metadata.ui.info" : "Metadata information", "msg.metadata.ui.enter.tag" : "Enter tag", + "msg.metadata.ui.description": "Datasource is also updated when modified.", + "msg.metadata.ui.move.datasource": "Go to Datasource", "msg.metadata.th.column.logical.tooltip.title" : "What is logical column name?", "msg.metadata.th.column.logical.tooltip.desc" : "Logical column name is the column name that is commonly used by the user in Metatron. It is specified as a logical name when creating business terms or index for users. Logical column names are used in Metatron when creating a chart or workbench.", "msg.catalog.alert.catalog.already.exists" : "Catalog already exists", diff --git a/discovery-frontend/src/assets/i18n/ko.json b/discovery-frontend/src/assets/i18n/ko.json index b1a70ef4ee..a990f94340 100644 --- a/discovery-frontend/src/assets/i18n/ko.json +++ b/discovery-frontend/src/assets/i18n/ko.json @@ -2165,9 +2165,13 @@ "msg.storage.ui.file.result.FV005": "빈 컬럼명은 허용되지 않습니다.", "msg.storage.ui.timezone": "타임존", "msg.storage.ui.username": "사용자이름", + "msg.storage.ui.guide.meta.modified": "메타데이터도 수정 시 업데이트됩니다.", + "msg.storage.btn.master.data.link": "메타데이터로 이동", "msg.storage.ui.cannot.load.data": "데이터를 불러올 수 없습니다", "msg.storage.btn.create.source": "데이터소스 생성", "msg.storage.ph.search.snapshot": "스냅샷 검색", + "msg.storage.ph.source.desc": "데이터소스 설명을 입력해주세요.", + "msg.storage.ui.none.source.desc": "설명이 없습니다", "msg.storage.ui.timezone.country.zimbabwe": "짐바브웨", "msg.storage.ui.timezone.country.zambia": "잠비아", @@ -3975,6 +3979,8 @@ "msg.metadata.dictionary.used.metadata" : "연결된 메타데이터", "msg.metadata.ui.info" : "메타데이터 정보", "msg.metadata.ui.enter.tag" : "태그 입력", + "msg.metadata.ui.description": "수정 내용이 데이터소스에도 반영됩니다.", + "msg.metadata.ui.move.datasource": "데이터소스로 이동", "msg.metadata.th.column.logical.tooltip.title" : "논리 컬럼 이름이란?", "msg.metadata.th.column.logical.tooltip.desc" : "논리 컬럼 이름은 메타트론에서 사용자가 일반적으로 사용하는 컬럼 이름입니다. 사용자의 비즈니스 용어 또는 인덱스를 생성할 때 논리 이름으로 지정됩니다 논리 컬럼 이름은 차트 또는 워크벤치를 작성할 때 메타트론에서 사용됩니다.", "msg.catalog.alert.catalog.already.exists" : "카달로그가 이미 있습니다", diff --git a/discovery-frontend/src/assets/i18n/zh.json b/discovery-frontend/src/assets/i18n/zh.json index f08a7c29ed..f2adaa4757 100644 --- a/discovery-frontend/src/assets/i18n/zh.json +++ b/discovery-frontend/src/assets/i18n/zh.json @@ -3010,6 +3010,8 @@ "msg.metadata.dictionary.used.metadata": "已连接的元数据", "msg.metadata.ui.info": "元数据信息", "msg.metadata.ui.enter.tag": "标签类型", + "msg.metadata.ui.description": "當修改數據時,數據來源也更新。", + "msg.metadata.ui.move.datasource": "去達塔索斯", "msg.metadata.th.column.logical.tooltip.title": "逻辑列名是什么?", "msg.metadata.th.column.logical.tooltip.desc": "在Metatron中,逻辑列名是用户普遍所使用的列名。生成用户的商务用语或者索引时,指定逻辑名。逻辑列名是在metatron中,制作图表或者工作台时所被使用。" } diff --git a/discovery-frontend/src/assets/images/icon_add.png b/discovery-frontend/src/assets/images/icon_add.png index 22b8beca2e..5472ef4900 100644 Binary files a/discovery-frontend/src/assets/images/icon_add.png and b/discovery-frontend/src/assets/images/icon_add.png differ diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSource.java b/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSource.java index 6e676f5a67..ea5d375717 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSource.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSource.java @@ -42,6 +42,8 @@ import app.metatron.discovery.domain.datasource.ingestion.jdbc.BatchIngestionInfo; import app.metatron.discovery.domain.datasource.ingestion.jdbc.JdbcIngestionInfo; import app.metatron.discovery.domain.datasource.ingestion.jdbc.SingleIngestionInfo; +import app.metatron.discovery.domain.mdm.Metadata; +import app.metatron.discovery.domain.mdm.MetadataColumn; import app.metatron.discovery.domain.workbook.DashBoard; import app.metatron.discovery.domain.workbook.configurations.field.DimensionField; import app.metatron.discovery.domain.workbook.configurations.field.MeasureField; @@ -336,6 +338,32 @@ public void addDashBoard(DashBoard dashBoard) { this.dashBoards.add(dashBoard); } + public void updateFromMetadata(Metadata metadata, boolean includeColumns) { + + this.name = metadata.getName(); + this.description = metadata.getDescription(); + + if (includeColumns) { + updateFieldFromColumn(metadata); + } + + } + + public void updateFieldFromColumn(Metadata metadata) { + Map columnMap = metadata.getFieldRefMap(); + + for (Field field : this.fields) { + Long fieldId = field.getId(); + if (!columnMap.containsKey(field.getId())) { + continue; + } + + MetadataColumn metadataColumn = columnMap.get(fieldId); + field.updateFromMetaColumn(metadataColumn); + } + + } + public void excludeUnloadedField() { if (CollectionUtils.isEmpty(this.fields)) { return; diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSourceController.java b/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSourceController.java index 7b0103c2c6..1d06923783 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSourceController.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSourceController.java @@ -28,39 +28,11 @@ package app.metatron.discovery.domain.datasource; -import app.metatron.discovery.common.CommonLocalVariable; -import app.metatron.discovery.common.criteria.ListCriterion; -import app.metatron.discovery.common.criteria.ListFilter; -import app.metatron.discovery.common.datasource.DataType; -import app.metatron.discovery.common.entity.SearchParamValidator; -import app.metatron.discovery.common.exception.BadRequestException; -import app.metatron.discovery.common.exception.MetatronException; -import app.metatron.discovery.common.exception.ResourceNotFoundException; -import app.metatron.discovery.domain.CollectionPatch; -import app.metatron.discovery.domain.datasource.connection.DataConnectionRepository; -import app.metatron.discovery.domain.datasource.connection.jdbc.JdbcConnectionService; -import app.metatron.discovery.domain.datasource.data.DataSourceValidator; -import app.metatron.discovery.domain.datasource.data.SearchQueryRequest; -import app.metatron.discovery.domain.datasource.data.result.ObjectResultFormat; -import app.metatron.discovery.domain.datasource.format.DateTimeFormatChecker; -import app.metatron.discovery.domain.datasource.ingestion.*; -import app.metatron.discovery.domain.datasource.ingestion.job.IngestionJobRunner; -import app.metatron.discovery.domain.engine.EngineIngestionService; -import app.metatron.discovery.domain.engine.EngineLoadService; -import app.metatron.discovery.domain.engine.EngineQueryService; -import app.metatron.discovery.domain.engine.model.SegmentMetaDataResponse; -import app.metatron.discovery.domain.workbench.WorkbenchProperties; -import app.metatron.discovery.domain.workbook.configurations.Limit; -import app.metatron.discovery.domain.workbook.configurations.datasource.DefaultDataSource; -import app.metatron.discovery.domain.workbook.configurations.filter.Filter; -import app.metatron.discovery.util.CsvProcessor; -import app.metatron.discovery.util.ExcelProcessor; -import app.metatron.discovery.util.PolarisUtils; -import app.metatron.discovery.util.ProjectionUtils; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.util.concurrent.ThreadFactoryBuilder; + import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.BooleanUtils; @@ -82,19 +54,66 @@ import org.springframework.hateoas.Resource; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.net.URI; import java.text.ParseException; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.stream.Collectors; +import app.metatron.discovery.common.CommonLocalVariable; +import app.metatron.discovery.common.criteria.ListCriterion; +import app.metatron.discovery.common.criteria.ListFilter; +import app.metatron.discovery.common.datasource.DataType; +import app.metatron.discovery.common.entity.SearchParamValidator; +import app.metatron.discovery.common.exception.BadRequestException; +import app.metatron.discovery.common.exception.MetatronException; +import app.metatron.discovery.common.exception.ResourceNotFoundException; +import app.metatron.discovery.domain.CollectionPatch; +import app.metatron.discovery.domain.datasource.connection.DataConnectionRepository; +import app.metatron.discovery.domain.datasource.connection.jdbc.JdbcConnectionService; +import app.metatron.discovery.domain.datasource.data.DataSourceValidator; +import app.metatron.discovery.domain.datasource.data.SearchQueryRequest; +import app.metatron.discovery.domain.datasource.data.result.ObjectResultFormat; +import app.metatron.discovery.domain.datasource.format.DateTimeFormatChecker; +import app.metatron.discovery.domain.datasource.ingestion.IngestionDataResultResponse; +import app.metatron.discovery.domain.datasource.ingestion.IngestionHistory; +import app.metatron.discovery.domain.datasource.ingestion.IngestionHistoryRepository; +import app.metatron.discovery.domain.datasource.ingestion.IngestionInfo; +import app.metatron.discovery.domain.datasource.ingestion.IngestionOption; +import app.metatron.discovery.domain.datasource.ingestion.IngestionOptionProjections; +import app.metatron.discovery.domain.datasource.ingestion.IngestionOptionService; +import app.metatron.discovery.domain.datasource.ingestion.LocalFileIngestionInfo; +import app.metatron.discovery.domain.datasource.ingestion.job.IngestionJobRunner; +import app.metatron.discovery.domain.engine.EngineIngestionService; +import app.metatron.discovery.domain.engine.EngineLoadService; +import app.metatron.discovery.domain.engine.EngineQueryService; +import app.metatron.discovery.domain.engine.model.SegmentMetaDataResponse; +import app.metatron.discovery.domain.mdm.MetadataService; +import app.metatron.discovery.domain.workbench.WorkbenchProperties; +import app.metatron.discovery.domain.workbook.configurations.Limit; +import app.metatron.discovery.domain.workbook.configurations.datasource.DefaultDataSource; +import app.metatron.discovery.domain.workbook.configurations.filter.Filter; +import app.metatron.discovery.util.CsvProcessor; +import app.metatron.discovery.util.ExcelProcessor; +import app.metatron.discovery.util.PolarisUtils; +import app.metatron.discovery.util.ProjectionUtils; + import static app.metatron.discovery.domain.datasource.DataSourceErrorCodes.INGESTION_COMMON_ERROR; import static app.metatron.discovery.domain.datasource.DataSourceErrorCodes.INGESTION_ENGINE_GET_TASK_LOG_ERROR; import static app.metatron.discovery.domain.datasource.DataSourceTemporary.ID_PREFIX; @@ -108,40 +127,43 @@ public class DataSourceController { private static Logger LOGGER = LoggerFactory.getLogger(DataSourceController.class); @Autowired - IngestionHistoryRepository ingestionHistoryRepository; + DataSourceService dataSourceService; @Autowired - DataSourceValidator dataSourceValidator; + MetadataService metadataService; @Autowired - EngineQueryService engineQueryService; + JdbcConnectionService jdbcConnectionService; + + @Autowired + EngineLoadService engineLoadService; @Autowired EngineIngestionService engineIngestionService; @Autowired - DataSourceRepository dataSourceRepository; + EngineQueryService engineQueryService; @Autowired - DataSourceTemporaryRepository temporaryRepository; + IngestionOptionService ingestionOptionService; @Autowired - DataConnectionRepository dataConnectionRepository; + DataSourceValidator dataSourceValidator; @Autowired - DataSourceService dataSourceService; + IngestionJobRunner jobRunner; @Autowired - JdbcConnectionService jdbcConnectionService; + IngestionHistoryRepository ingestionHistoryRepository; @Autowired - EngineLoadService engineLoadService; + DataSourceRepository dataSourceRepository; @Autowired - IngestionJobRunner jobRunner; + DataSourceTemporaryRepository temporaryRepository; @Autowired - IngestionOptionService ingestionOptionService; + DataConnectionRepository dataConnectionRepository; @Autowired PagedResourcesAssembler pagedResourcesAssembler; @@ -513,7 +535,8 @@ ResponseEntity patchFieldsInDataSource( } } - dataSourceRepository.save(dataSource); + dataSourceRepository.saveAndFlush(dataSource); + metadataService.updateFromDataSource(dataSource, true); return ResponseEntity.noContent().build(); } @@ -548,7 +571,6 @@ private List getCandidateFieldsFromEngine(String engineName) { Field field = new Field(); field.setName(entry.getKey()); - field.setAlias(entry.getKey()); field.setType(value.getType().startsWith("dimension.") ? DataType.STRING : DataType.INTEGER); field.setRole(value.getType().startsWith("dimension.") ? Field.FieldRole.DIMENSION : Field.FieldRole.MEASURE); diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSourceEventHandler.java b/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSourceEventHandler.java index d850a162af..ebba9a0ffc 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSourceEventHandler.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSourceEventHandler.java @@ -80,6 +80,7 @@ import app.metatron.discovery.domain.engine.DruidEngineMetaRepository; import app.metatron.discovery.domain.engine.EngineIngestionService; import app.metatron.discovery.domain.geo.GeoService; +import app.metatron.discovery.domain.mdm.MetadataService; import app.metatron.discovery.domain.workspace.Workspace; import app.metatron.discovery.util.AuthUtils; import app.metatron.discovery.util.PolarisUtils; @@ -110,6 +111,9 @@ public class DataSourceEventHandler { @Autowired DataSourceService dataSourceService; + @Autowired + MetadataService metadataService; + @Autowired GeoService geoService; @@ -256,6 +260,12 @@ public void handleDataSourceAfterCreate(DataSource dataSource) { ingestionHistoryRepository.save(histroy); } + // save context from domain + contextService.saveContextFromDomain(dataSource); + + // create metadata from datasource + metadataService.saveFromDataSource(dataSource); + // 수집 경로가 아닌 경우 Pass if (dataSource.getIngestion() == null) { return; @@ -290,9 +300,6 @@ public void handleDataSourceAfterCreate(DataSource dataSource) { LOGGER.info("Successfully register batch ingestion : {}", dataSource.getName()); } - // Context 정보 저장, ID 가 지정후 생성 필요 - contextService.saveContextFromDomain(dataSource); - } @HandleBeforeSave @@ -375,20 +382,12 @@ public void handleDataSourceAfterSave(DataSource dataSource) { } } } else if (ingestionInfo instanceof RealtimeIngestionInfo) { - // 기존 동작하고 있는 적재 task 가 존재하는지 확인 (재정의 필요) - // List ingestionHistories = ingestionHistoryRepository - // .findByDataSourceIdAndStatus(dataSource.getId(), IngestionHistory.IngestionStatus.RUNNING); - // - // if (CollectionUtils.isNotEmpty(ingestionHistories)) { - // // TODO: Excetpion 정의 - // throw new RuntimeException("Ingestion task already exist."); - // } - // - // engineIngestionService.realtimeIngestion(dataSource).ifPresent( - // ingestionHistroy -> ingestionHistoryRepository.save(ingestionHistroy) - // ); + // TODO: 기존 동작하고 있는 적재 task 가 존재하는지 확인 (재정의 필요) } } + + // update metadata from datasource + metadataService.updateFromDataSource(dataSource, false); } @HandleBeforeDelete diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSourceRepositoryImpl.java b/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSourceRepositoryImpl.java index 9dfd3ec973..5d7450ca46 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSourceRepositoryImpl.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSourceRepositoryImpl.java @@ -44,7 +44,7 @@ import javax.persistence.EntityManager; -import app.metatron.discovery.domain.mdm.source.MetadataSource; +import app.metatron.discovery.domain.mdm.Metadata; import app.metatron.discovery.domain.mdm.source.QMetadataSource; import app.metatron.discovery.domain.workbook.QDashBoard; @@ -84,7 +84,7 @@ public Page findDataSources(DataSource.DataSourceType type, DataSour SubQueryExpression subQueryExpr = JPAExpressions.selectFrom(metadataSource) .select(metadataSource.sourceId) - .where(metadataSource.type.eq(MetadataSource.MetadataSourceType.ENGINE)); + .where(metadataSource.type.eq(Metadata.SourceType.ENGINE)); if (linkedMetadata) { query.where(dataSource.id.in(subQueryExpr)); diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSourceService.java b/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSourceService.java index 9040d76fea..15b50c8f39 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSourceService.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/DataSourceService.java @@ -14,6 +14,30 @@ package app.metatron.discovery.domain.datasource; +import com.google.common.collect.Lists; + +import com.querydsl.core.types.Predicate; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; +import org.joda.time.DateTime; +import org.joda.time.Interval; +import org.joda.time.Period; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + import app.metatron.discovery.common.criteria.ListCriterion; import app.metatron.discovery.common.criteria.ListCriterionType; import app.metatron.discovery.common.criteria.ListFilter; @@ -21,6 +45,8 @@ import app.metatron.discovery.domain.engine.DruidEngineMetaRepository; import app.metatron.discovery.domain.engine.EngineQueryService; import app.metatron.discovery.domain.engine.model.SegmentMetaDataResponse; +import app.metatron.discovery.domain.mdm.Metadata; +import app.metatron.discovery.domain.mdm.MetadataService; import app.metatron.discovery.domain.storage.StorageProperties; import app.metatron.discovery.domain.user.DirectoryProfile; import app.metatron.discovery.domain.user.User; @@ -40,27 +66,6 @@ import app.metatron.discovery.query.druid.granularities.SimpleGranularity; import app.metatron.discovery.util.AuthUtils; import app.metatron.discovery.util.PolarisUtils; -import com.google.common.collect.Lists; -import com.querydsl.core.types.Predicate; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.BooleanUtils; -import org.apache.commons.lang3.StringUtils; -import org.joda.time.DateTime; -import org.joda.time.Interval; -import org.joda.time.Period; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; import static app.metatron.discovery.domain.datasource.DataSourceTemporary.ID_PREFIX; @@ -76,6 +81,9 @@ public class DataSourceService { @Autowired EngineQueryService queryService; + @Autowired + MetadataService metadataService; + @Autowired DataSourceRepository dataSourceRepository; @@ -133,7 +141,11 @@ public DataSource importEngineDataSource(String engineName, DataSource reqDataSo dataSource.setStatus(DataSource.Status.ENABLED); dataSource.setFields(segmentMetaData.getConvertedField(reqDataSource.getFields())); - return dataSourceRepository.saveAndFlush(dataSource); + // save datasource and metadata at the same time + DataSource importedDataSource = dataSourceRepository.saveAndFlush(dataSource); + metadataService.saveFromDataSource(importedDataSource); + + return importedDataSource; } public DataSource.GranularityType getGranularityType(Granularity granularity) { @@ -612,4 +624,22 @@ public Page findDataSourceListByFilter( } + public void updateFromMetadata(Metadata metadata, boolean includeColumns) { + + if (metadata.getSource() == null) { + return; + } + + DataSource dataSource = dataSourceRepository.findOne(metadata.getSource().getSourceId()); + + // check whether datasource exists + if (dataSource == null) { + return; + } + + dataSource.updateFromMetadata(metadata, includeColumns); + + dataSourceRepository.save(dataSource); + } + } diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/Field.java b/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/Field.java index 3728b33d28..3e7a8c925c 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/Field.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/Field.java @@ -67,6 +67,7 @@ import app.metatron.discovery.domain.MetatronDomain; import app.metatron.discovery.domain.datasource.connection.jdbc.JdbcDataConnection; import app.metatron.discovery.domain.datasource.ingestion.rule.IngestionRule; +import app.metatron.discovery.domain.mdm.MetadataColumn; import app.metatron.discovery.domain.workbook.configurations.field.MeasureField; import app.metatron.discovery.domain.workbook.configurations.filter.InclusionFilter; import app.metatron.discovery.domain.workbook.configurations.filter.TimeFilter; @@ -124,10 +125,10 @@ public int compare(Field f1, Field f2) { private String name; /** - * Field alias + * Field logical name */ - @Column(name = "field_alias") - private String alias; + @Column(name = "field_logical_name") + private String logicalName; /** * Field description @@ -275,7 +276,7 @@ public Field(String name, DataType type, FieldRole role, long seq) { public Field(CollectionPatch patch) { this.name = patch.getValue("name"); - this.alias = patch.getValue("alias"); + this.logicalName = patch.getValue("logicalName"); this.description = patch.getValue("description"); this.type = SearchParamValidator.enumUpperValue(DataType.class, patch.getValue("type"), "type"); this.role = SearchParamValidator.enumUpperValue(FieldRole.class, patch.getValue("role"), "role"); @@ -295,7 +296,7 @@ public Field(CollectionPatch patch) { public void updateField(CollectionPatch patch) { // if(patch.hasProperty("name")) this.name = patch.getValue("name"); - if (patch.hasProperty("alias")) this.alias = patch.getValue("alias"); + if (patch.hasProperty("logicalName")) this.logicalName = patch.getValue("logicalName"); if (patch.hasProperty("description")) this.description = patch.getValue("description"); @@ -319,6 +320,14 @@ public void updateField(CollectionPatch patch) { } + public void updateFromMetaColumn(MetadataColumn column) { + this.logicalName = column.getName(); + this.logicalType = column.getType(); + this.description = column.getDescription(); + this.format = column.getFormat(); + this.seq = column.getSeq(); + } + /** * for backward compatibility of timezone */ @@ -548,15 +557,6 @@ public void setSeq(Long seq) { this.seq = seq; } - // @JsonIgnore - @Deprecated - public BIType getBiType() { - if (role == null) { - return null; - } - return BIType.valueOf(role.name()); - } - public FieldRole getRole() { return role; } @@ -573,15 +573,15 @@ public void setAggrType(MeasureField.AggregationType aggrType) { this.aggrType = aggrType; } - public String getAlias() { - if (StringUtils.isEmpty(alias)) { + public String getLogicalName() { + if (StringUtils.isEmpty(logicalName)) { return name; } - return alias; + return logicalName; } - public void setAlias(String alias) { - this.alias = alias; + public void setLogicalName(String logicalName) { + this.logicalName = logicalName; } @JsonIgnore diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/connection/DataConnectionController.java b/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/connection/DataConnectionController.java index 76009f2180..bffaa28656 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/connection/DataConnectionController.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/connection/DataConnectionController.java @@ -14,27 +14,11 @@ package app.metatron.discovery.domain.datasource.connection; -import app.metatron.discovery.common.criteria.ListCriterion; -import app.metatron.discovery.common.criteria.ListFilter; -import app.metatron.discovery.common.entity.SearchParamValidator; -import app.metatron.discovery.common.exception.ResourceNotFoundException; -import app.metatron.discovery.domain.datasource.DataSourceProperties; -import app.metatron.discovery.domain.datasource.Field; -import app.metatron.discovery.domain.datasource.connection.jdbc.*; -import app.metatron.discovery.domain.datasource.ingestion.file.FileFormat; -import app.metatron.discovery.domain.datasource.ingestion.jdbc.JdbcIngestionInfo; -import app.metatron.discovery.domain.engine.EngineProperties; -import app.metatron.discovery.domain.mdm.source.MetadataSource; -import app.metatron.discovery.domain.mdm.source.MetadataSourceRepository; -import app.metatron.discovery.domain.storage.StorageProperties; -import app.metatron.discovery.domain.workbench.Workbench; -import app.metatron.discovery.domain.workbench.WorkbenchRepository; -import app.metatron.discovery.domain.workbench.hive.HiveNamingRule; -import app.metatron.discovery.domain.workbench.util.WorkbenchDataSourceUtils; -import app.metatron.discovery.util.PolarisUtils; import com.google.common.collect.Lists; import com.google.common.collect.Maps; + import com.querydsl.core.types.Predicate; + import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.joda.time.DateTime; @@ -49,11 +33,47 @@ import org.springframework.data.rest.webmvc.RepositoryRestController; import org.springframework.data.web.PagedResourcesAssembler; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; import javax.sql.DataSource; -import java.util.*; -import java.util.stream.Collectors; + +import app.metatron.discovery.common.criteria.ListCriterion; +import app.metatron.discovery.common.criteria.ListFilter; +import app.metatron.discovery.common.entity.SearchParamValidator; +import app.metatron.discovery.common.exception.ResourceNotFoundException; +import app.metatron.discovery.domain.datasource.DataSourceProperties; +import app.metatron.discovery.domain.datasource.Field; +import app.metatron.discovery.domain.datasource.connection.jdbc.HiveConnection; +import app.metatron.discovery.domain.datasource.connection.jdbc.HiveTableInformation; +import app.metatron.discovery.domain.datasource.connection.jdbc.JdbcConnectionService; +import app.metatron.discovery.domain.datasource.connection.jdbc.JdbcDataConnection; +import app.metatron.discovery.domain.datasource.connection.jdbc.JdbcDataConnectionErrorCodes; +import app.metatron.discovery.domain.datasource.connection.jdbc.JdbcDataConnectionException; +import app.metatron.discovery.domain.datasource.connection.jdbc.JdbcQueryResultResponse; +import app.metatron.discovery.domain.datasource.ingestion.file.FileFormat; +import app.metatron.discovery.domain.datasource.ingestion.jdbc.JdbcIngestionInfo; +import app.metatron.discovery.domain.engine.EngineProperties; +import app.metatron.discovery.domain.mdm.Metadata; +import app.metatron.discovery.domain.mdm.source.MetadataSource; +import app.metatron.discovery.domain.mdm.source.MetadataSourceRepository; +import app.metatron.discovery.domain.storage.StorageProperties; +import app.metatron.discovery.domain.workbench.Workbench; +import app.metatron.discovery.domain.workbench.WorkbenchRepository; +import app.metatron.discovery.domain.workbench.hive.HiveNamingRule; +import app.metatron.discovery.domain.workbench.util.WorkbenchDataSourceUtils; +import app.metatron.discovery.util.PolarisUtils; /** * Created by kyungtaak on 2016. 6. 10.. @@ -537,9 +557,9 @@ private List filterOtherPersonalDatabases(List databases, String //Staging MetaDataSource List Set metadataSourceList = metadataSourceRepository.findMetadataSourcesByTypeAndSchemaAndSourceId( - MetadataSource.MetadataSourceType.JDBC, - checkRequest.getDatabase(), - checkRequest.getConnection().getId() + Metadata.SourceType.JDBC, + checkRequest.getDatabase(), + checkRequest.getConnection().getId() ); //extract table name @@ -580,7 +600,7 @@ private List filterOtherPersonalDatabases(List databases, String Map tables = connectionService.findTablesInDatabase(hiveConnection, checkRequest.getDatabase(), null); List filteredTableNameList = - filterTableForMdm((List) tables.get("tables"), checkRequest, MetadataSource.MetadataSourceType.STAGE); + filterTableForMdm((List) tables.get("tables"), checkRequest, Metadata.SourceType.STAGEDB); Map returnMap = Maps.newHashMap(); returnMap.put("tables", filteredTableNameList); @@ -589,23 +609,23 @@ private List filterOtherPersonalDatabases(List databases, String public List filterTableForMdm(List tableNameList, ConnectionRequest checkRequest, - MetadataSource.MetadataSourceType metadataSourceType){ + Metadata.SourceType metadataSourceType) { //Staging MetaDataSource List Set metadataSourceList = null; switch ( metadataSourceType){ case JDBC: metadataSourceList = metadataSourceRepository.findMetadataSourcesByTypeAndSchemaAndSourceId( - MetadataSource.MetadataSourceType.JDBC, - checkRequest.getDatabase(), - checkRequest.getConnection().getId() + Metadata.SourceType.JDBC, + checkRequest.getDatabase(), + checkRequest.getConnection().getId() ); break; - case STAGE: + case STAGEDB: metadataSourceList = metadataSourceRepository.findMetadataSourcesByTypeAndSchema( - MetadataSource.MetadataSourceType.STAGE, - checkRequest.getDatabase() + Metadata.SourceType.STAGEDB, + checkRequest.getDatabase() ); break; } diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/connection/jdbc/JdbcConnectionService.java b/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/connection/jdbc/JdbcConnectionService.java index 65cc381c72..6d8a777aa8 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/connection/jdbc/JdbcConnectionService.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/datasource/connection/jdbc/JdbcConnectionService.java @@ -1098,7 +1098,7 @@ public List selectQueryToCsv(JdbcDataConnection connection, if (field.isNotPhysicalField()) { continue; } - String fieldAlias = field.getAlias(); + String fieldAlias = field.getLogicalName(); String fieldName; if (StringUtils.contains(fieldAlias, ".")) { String[] splicedFieldAlias = StringUtils.split(fieldAlias, "."); @@ -2074,7 +2074,7 @@ public List getFieldList(ResultSet rs, boolean extractColumnName) throws Field field = new Field(); field.setName(uniqueFieldName); - field.setAlias(fieldName); + field.setLogicalName(fieldName); field.setType(DataType.jdbcToFieldType((metaData.getColumnType(i)))); field.setRole(field.getType().toRole()); fields.add(field); diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/Metadata.java b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/Metadata.java index 325dc97f76..05fe268a75 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/Metadata.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/Metadata.java @@ -18,12 +18,14 @@ import com.fasterxml.jackson.annotation.JsonIgnore; +import org.apache.commons.collections4.CollectionUtils; import org.hibernate.annotations.BatchSize; import org.hibernate.annotations.GenericGenerator; import org.hibernate.validator.constraints.NotBlank; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; import javax.persistence.*; @@ -31,6 +33,8 @@ import app.metatron.discovery.domain.AbstractHistoryEntity; import app.metatron.discovery.domain.MetatronDomain; +import app.metatron.discovery.domain.datasource.DataSource; +import app.metatron.discovery.domain.datasource.Field; import app.metatron.discovery.domain.mdm.catalog.Catalog; import app.metatron.discovery.domain.mdm.source.MetadataSource; @@ -74,6 +78,7 @@ public class Metadata extends AbstractHistoryEntity implements MetatronDomain columns; @@ -93,18 +98,74 @@ public class Metadata extends AbstractHistoryEntity implements MetatronDomain columns = Lists.newArrayList(); + for (Field field : dataSource.getFields()) { + columns.add(new MetadataColumn(field, this)); + } + + this.columns = columns; + } + @JsonIgnore public Map getColumnMap() { return columns.stream() .collect(Collectors.toMap(MetadataColumn::getId, column -> column)); } + @JsonIgnore + public Map getFieldRefMap() { + return columns.stream() + .collect(Collectors.toMap(MetadataColumn::getFieldRef, column -> column)); + } + @JsonIgnore public Map getColumnMapByPhysicalName() { return columns.stream() .collect(Collectors.toMap(MetadataColumn::getPhysicalName, column -> column)); } + public void updateFromDataSource(DataSource dataSource, boolean includeFields) { + this.name = dataSource.getName(); + this.description = dataSource.getDescription(); + + this.source.setName(dataSource.getName()); + + if (includeFields) { + updateColumnFromField(dataSource); + } + } + + public void updateColumnFromField(DataSource dataSource) { + Map fieldMap = dataSource.getFieldMap(); + Set unusedFieldId = fieldMap.keySet(); + + for (MetadataColumn column : this.columns) { + Long fieldId = column.getFieldRef(); + if (fieldId == null || !fieldMap.containsKey(fieldId)) { + continue; + } + + column.updateColumn(fieldMap.get(fieldId)); + unusedFieldId.remove(fieldId); + } + + if (CollectionUtils.isNotEmpty(unusedFieldId)) { + for (Long fieldId : unusedFieldId) { + Field field = fieldMap.get(fieldId); + this.columns.add(new MetadataColumn(field, this)); + } + } + } + public void addColumn(MetadataColumn column) { if(this.columns == null) { this.columns = Lists.newArrayList(); @@ -196,7 +257,7 @@ public String toString() { } public enum SourceType { - ENGINE, JDBC, STAGING + ENGINE, JDBC, STAGEDB } } diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataColumn.java b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataColumn.java index 5a29745781..f5430bbce7 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataColumn.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataColumn.java @@ -83,7 +83,19 @@ public class MetadataColumn implements MetatronDomain { * The description of column */ @Column(name = "column_desc", length = 1000) - String description; + private String description; + + /** + * Reference field of datasource + */ + @Column(name = "column_field_ref") + private Long fieldRef; + + /** + * Sequence for column alignment + */ + @Column(name = "column_seq") + private Long seq; /** * Linked Column Dictionary @@ -109,6 +121,7 @@ public class MetadataColumn implements MetatronDomain { */ @ManyToOne(fetch = FetchType.LAZY, cascade = { CascadeType.MERGE }) @JoinColumn(name = "meta_id") + @JsonBackReference("column_metadata") private Metadata metadata; /** @@ -123,16 +136,23 @@ public class MetadataColumn implements MetatronDomain { public MetadataColumn() { } - public MetadataColumn(Field field) { + public MetadataColumn(Field field, Metadata metadata) { this.physicalName = field.getName(); this.physicalType = field.getType().name(); - this.name = field.getName(); + this.name = field.getLogicalName(); + this.type = field.getLogicalType(); + this.description = field.getDescription(); + this.format = field.getFormat(); + this.fieldRef = field.getId(); + this.seq = field.getSeq(); + this.metadata = metadata; } public MetadataColumn(CollectionPatch patch, DefaultFormattingConversionService defaultConversionService) { if(patch.hasProperty("physicalType")) this.physicalType = patch.getValue("physicalType"); if(patch.hasProperty("physicalName")) this.physicalName = patch.getValue("physicalName"); if(patch.hasProperty("name")) this.name = patch.getValue("name"); + if (patch.hasProperty("seq")) this.seq = patch.getLongValue("seq"); if(patch.hasProperty("type")) { this.type = SearchParamValidator.enumUpperValue(LogicalType.class, patch.getValue("type"), "type"); } @@ -159,6 +179,7 @@ public void updateColumn(CollectionPatch patch, DefaultFormattingConversionServi if(patch.hasProperty("physicalType")) this.physicalType = patch.getValue("physicalType"); if(patch.hasProperty("physicalName")) this.physicalName = patch.getValue("physicalName"); if(patch.hasProperty("name")) this.name = patch.getValue("name"); + if (patch.hasProperty("seq")) this.seq = patch.getLongValue("seq"); if(patch.hasProperty("type")) { this.type = SearchParamValidator.enumUpperValue(LogicalType.class, patch.getValue("type"), "type"); } @@ -196,6 +217,14 @@ public void updateColumn(CollectionPatch patch, DefaultFormattingConversionServi } } + public void updateColumn(Field field) { + this.name = field.getLogicalName(); + this.type = field.getLogicalType(); + this.format = field.getFormat(); + this.description = field.getDescription(); + this.seq = field.getSeq(); + } + @Override public Long getId() { return id; @@ -245,6 +274,22 @@ public void setPhysicalName(String physicalName) { this.physicalName = physicalName; } + public Long getFieldRef() { + return fieldRef; + } + + public void setFieldRef(Long fieldRef) { + this.fieldRef = fieldRef; + } + + public Long getSeq() { + return seq; + } + + public void setSeq(Long seq) { + this.seq = seq; + } + public ColumnDictionary getDictionary() { return dictionary; } diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataController.java b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataController.java index 3959155a9f..d0f445249f 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataController.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataController.java @@ -14,15 +14,8 @@ package app.metatron.discovery.domain.mdm; -import app.metatron.discovery.common.entity.DomainType; -import app.metatron.discovery.common.entity.SearchParamValidator; -import app.metatron.discovery.common.exception.ResourceNotFoundException; -import app.metatron.discovery.domain.CollectionPatch; -import app.metatron.discovery.domain.tag.Tag; -import app.metatron.discovery.domain.tag.TagProjections; -import app.metatron.discovery.domain.tag.TagService; -import app.metatron.discovery.util.ProjectionUtils; import com.google.common.collect.Maps; + import org.apache.commons.lang3.StringUtils; import org.joda.time.DateTime; import org.slf4j.Logger; @@ -38,11 +31,26 @@ import org.springframework.data.web.PagedResourcesAssembler; import org.springframework.format.support.DefaultFormattingConversionService; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; import java.util.List; import java.util.Map; +import app.metatron.discovery.common.entity.DomainType; +import app.metatron.discovery.common.entity.SearchParamValidator; +import app.metatron.discovery.common.exception.ResourceNotFoundException; +import app.metatron.discovery.domain.CollectionPatch; +import app.metatron.discovery.domain.datasource.DataSourceService; +import app.metatron.discovery.domain.tag.Tag; +import app.metatron.discovery.domain.tag.TagProjections; +import app.metatron.discovery.domain.tag.TagService; +import app.metatron.discovery.util.ProjectionUtils; + @RepositoryRestController public class MetadataController { @@ -51,6 +59,9 @@ public class MetadataController { @Autowired MetadataService metadataService; + @Autowired + DataSourceService dataSourceService; + @Autowired TagService tagService; @@ -110,11 +121,15 @@ public ResponseEntity findMetadatas( @RequestMapping(value = "/metadatas/metasources/{sourceId}", method = RequestMethod.POST) public ResponseEntity findMetadataByOriginSource(@PathVariable("sourceId") String sourceId, - @RequestBody Map requestParam, + @RequestBody(required = false) Map requestParam, @RequestParam(value = "projection", required = false, defaultValue = "default") String projection) { - String schema = (String) requestParam.get("schema"); - List tableList = (List) requestParam.get("table"); + String schema = null; + List tableList = null; + if (requestParam != null) { + schema = (String) requestParam.get("schema"); + tableList = (List) requestParam.get("table"); + } List results = metadataRepository.findBySource(sourceId, schema, tableList); @@ -228,7 +243,9 @@ ResponseEntity patchColumnsInMetadata(@PathVariable("metadataId") String meta } } + // save metadata and sync. with datasource metadataRepository.save(metadata); + dataSourceService.updateFromMetadata(metadata, true); return ResponseEntity.noContent().build(); } diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataEventHandler.java b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataEventHandler.java index bdb94d341f..7b70a5ae14 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataEventHandler.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataEventHandler.java @@ -14,14 +14,13 @@ package app.metatron.discovery.domain.mdm; -import app.metatron.discovery.domain.storage.StorageProperties; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.rest.core.annotation.HandleAfterCreate; +import org.springframework.data.rest.core.annotation.HandleAfterSave; import org.springframework.data.rest.core.annotation.HandleBeforeCreate; import org.springframework.data.rest.core.annotation.HandleBeforeDelete; -import org.springframework.data.rest.core.annotation.HandleBeforeSave; import org.springframework.data.rest.core.annotation.RepositoryEventHandler; import java.util.HashMap; @@ -31,6 +30,7 @@ import app.metatron.discovery.common.GlobalObjectMapper; import app.metatron.discovery.common.datasource.DataType; import app.metatron.discovery.domain.datasource.DataSource; +import app.metatron.discovery.domain.datasource.DataSourceService; import app.metatron.discovery.domain.datasource.Field; import app.metatron.discovery.domain.datasource.connection.jdbc.HiveConnection; import app.metatron.discovery.domain.datasource.connection.jdbc.HiveTableInformation; @@ -39,6 +39,7 @@ import app.metatron.discovery.domain.engine.EngineProperties; import app.metatron.discovery.domain.mdm.source.MetaSourceService; import app.metatron.discovery.domain.mdm.source.MetadataSource; +import app.metatron.discovery.domain.storage.StorageProperties; /** * Created by kyungtaak on 2016. 5. 13.. @@ -49,6 +50,9 @@ public class MetadataEventHandler { @Autowired MetaSourceService metaSourceService; + @Autowired + DataSourceService dataSourceService; + @Autowired JdbcConnectionService jdbcConnectionService; @@ -63,7 +67,7 @@ public void handleBeforeCreate(Metadata metadata) { MetadataSource metadataSource = metadata.getSource(); - if (metadataSource.getType() == MetadataSource.MetadataSourceType.ENGINE) { + if (metadataSource.getType() == Metadata.SourceType.ENGINE) { // Check engine datasource info. if (StringUtils.isEmpty(metadataSource.getSourceId())) { @@ -93,13 +97,11 @@ public void handleBeforeCreate(Metadata metadata) { } else { // 자동으로 데이터 소스내 필드 정보를 column 정보로 매핑함 for (Field field : originalDataSource.getFields()) { - MetadataColumn metadataColumn = new MetadataColumn(field); - metadataColumn.setMetadata(metadata); - metadata.addColumn(metadataColumn); + metadata.addColumn(new MetadataColumn(field, metadata)); } } - } else if (metadataSource.getType() == MetadataSource.MetadataSourceType.JDBC) { + } else if (metadataSource.getType() == Metadata.SourceType.JDBC) { // Check jdbc connection info. if (StringUtils.isEmpty(metadataSource.getSourceId())) { @@ -118,9 +120,7 @@ public void handleBeforeCreate(Metadata metadata) { //Column 목록 저장하기 for (Field field : hiveTableInformation.getFields()) { - MetadataColumn metadataColumn = new MetadataColumn(field); - metadataColumn.setMetadata(metadata); - metadata.addColumn(metadataColumn); + metadata.addColumn(new MetadataColumn(field, metadata)); } //Detail 정보 저장하기 @@ -143,7 +143,7 @@ public void handleBeforeCreate(Metadata metadata) { metadata.addColumn(metadataColumn); } } - } else if (metadataSource.getType() == MetadataSource.MetadataSourceType.STAGE) { + } else if (metadataSource.getType() == Metadata.SourceType.STAGEDB) { String schema = metadataSource.getSchema(); String tableName = metadataSource.getTable(); @@ -167,9 +167,7 @@ public void handleBeforeCreate(Metadata metadata) { //Column 목록 저장하기 for (Field field : hiveTableInformation.getFields()) { - MetadataColumn metadataColumn = new MetadataColumn(field); - metadataColumn.setMetadata(metadata); - metadata.addColumn(metadataColumn); + metadata.addColumn(new MetadataColumn(field, metadata)); } //Detail 정보 저장하기 @@ -190,8 +188,13 @@ public void handleBeforeCreate(Metadata metadata) { public void handleAfterCreate(Metadata metadata) { } - @HandleBeforeSave - public void handleBeforeSave(Metadata metadata) { + @HandleAfterSave + public void handleAfterSave(Metadata metadata) { + + // Sync with datasource + if (metadata.getSourceType() == Metadata.SourceType.ENGINE) { + dataSourceService.updateFromMetadata(metadata, false); + } } @HandleBeforeDelete diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataProjections.java b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataProjections.java index 2f8cec59ce..b232083336 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataProjections.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataProjections.java @@ -18,6 +18,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.data.rest.core.config.Projection; +import java.util.List; + import app.metatron.discovery.common.BaseProjections; import app.metatron.discovery.domain.user.UserProfile; @@ -72,6 +74,8 @@ public interface ForDetailViewProjection { Metadata.SourceType getSourceType(); + List getColumns(); + @Value("#{@metadataPopularityService.getPopularityValue(target.id)}") Double getPopularity(); diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataService.java b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataService.java index 264f605be3..aa59d539c2 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataService.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/MetadataService.java @@ -14,13 +14,84 @@ package app.metatron.discovery.domain.mdm; +import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Optional; + +import app.metatron.discovery.domain.datasource.DataSource; @Component +@Transactional public class MetadataService { + private static Logger LOGGER = LoggerFactory.getLogger(MetadataService.class); + @Autowired private MetadataRepository metadataRepository; + /** + * find metadata from datasource identifier + */ + @Transactional(readOnly = true) + public Optional findByDataSource(String dataSourceId) { + List results = metadataRepository.findBySource(dataSourceId, null, null); + if (CollectionUtils.isEmpty(results)) { + return Optional.empty(); + } + + return Optional.of(results.get(0)); + } + + /** + * Save using datasource information + */ + public void saveFromDataSource(DataSource dataSource) { + // make metadata from datasource + Metadata metadata = new Metadata(dataSource); + + metadataRepository.saveAndFlush(metadata); + + LOGGER.info("Successfully saved metadata({}) from datasource({})", metadata.getId(), dataSource.getId()); + } + + /** + * Update from updated datasource + */ + public void updateFromDataSource(DataSource dataSource, boolean includeFields) { + + Optional metadata = findByDataSource(dataSource.getId()); + if (!metadata.isPresent()) { + return; + } + + Metadata updateMetadata = metadata.get(); + updateMetadata.updateFromDataSource(dataSource, includeFields); + + metadataRepository.save(updateMetadata); + } + + /** + * Delete metadata + */ + public void delete(String... metadataIds) { + + int deleteCnt = 0; + for (String metadataId : metadataIds) { + Metadata deletingMetadata = metadataRepository.findOne(metadataId); + if (deletingMetadata == null) { + continue; + } + metadataRepository.delete(metadataId); + deleteCnt++; + } + + LOGGER.info("Successfully delete {} metadata items", deleteCnt); + } + } diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetaSourceController.java b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetaSourceController.java index cb11e38714..6263af8ffa 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetaSourceController.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetaSourceController.java @@ -35,6 +35,7 @@ import org.springframework.web.bind.annotation.RequestParam; import app.metatron.discovery.common.entity.SearchParamValidator; +import app.metatron.discovery.domain.mdm.Metadata; import app.metatron.discovery.domain.mdm.MetadataController; @RepositoryRestController @@ -58,10 +59,10 @@ public ResponseEntity getMetadataSources(@RequestParam(value = "sourceId", re @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) DateTime to, Pageable pageable, PersistentEntityResourceAssembler resourceAssembler) { - MetadataSource.MetadataSourceType metadataSourceType = null; + Metadata.SourceType metadataSourceType = null; if(StringUtils.isNotEmpty(type)) { metadataSourceType = SearchParamValidator - .enumUpperValue(MetadataSource.MetadataSourceType.class, type, "type"); + .enumUpperValue(Metadata.SourceType.class, type, "type"); } // Get Predicate diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetaSourceService.java b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetaSourceService.java index d47d7a7076..a7cad2cfac 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetaSourceService.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetaSourceService.java @@ -24,6 +24,7 @@ import app.metatron.discovery.domain.datasource.DataSourceRepository; import app.metatron.discovery.domain.datasource.connection.DataConnectionRepository; +import app.metatron.discovery.domain.mdm.Metadata; import app.metatron.discovery.domain.mdm.MetadataController; import app.metatron.discovery.domain.workbook.DashboardRepository; @@ -56,15 +57,13 @@ public List findMetadataSourcesBySourceId(String type, String so * @param sourceId * @return */ - public Object getSourcesBySourceId(MetadataSource.MetadataSourceType type, String sourceId) { + public Object getSourcesBySourceId(Metadata.SourceType type, String sourceId) { switch (type) { case ENGINE: return dataSourceRepository.findOne(sourceId); case JDBC: return dataConnectionRepository.findOne(sourceId); - case DASHBOARD: - return dashboardRepository.findOne(sourceId); } return null; diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetadataSource.java b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetadataSource.java index 1d88e36b43..0156ddbc28 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetadataSource.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetadataSource.java @@ -31,6 +31,7 @@ import app.metatron.discovery.common.KeepAsJsonDeserialzier; import app.metatron.discovery.domain.AbstractHistoryEntity; +import app.metatron.discovery.domain.mdm.Metadata; @Entity @Table(name = "mdm_metadata_source") @@ -44,7 +45,7 @@ public class MetadataSource extends AbstractHistoryEntity { @Column(name = "meta_source_type") @Enumerated(EnumType.STRING) - private MetadataSourceType type; + private Metadata.SourceType type; @Column(name = "meta_source_id") private String sourceId; @@ -67,6 +68,12 @@ public class MetadataSource extends AbstractHistoryEntity { public MetadataSource() { } + public MetadataSource(Metadata.SourceType type, String sourceId, String name) { + this.type = type; + this.sourceId = sourceId; + this.name = name; + } + public String getId() { return id; } @@ -75,11 +82,11 @@ public void setId(String id) { this.id = id; } - public MetadataSourceType getType() { + public Metadata.SourceType getType() { return type; } - public void setType(MetadataSourceType type) { + public void setType(Metadata.SourceType type) { this.type = type; } @@ -133,7 +140,4 @@ public String toString() { "} " + super.toString(); } - public enum MetadataSourceType { - ENGINE, JDBC, STAGE, DASHBOARD - } } diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetadataSourcePredicate.java b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetadataSourcePredicate.java index 13aa2d61f1..1329aab491 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetadataSourcePredicate.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetadataSourcePredicate.java @@ -20,6 +20,7 @@ import org.apache.commons.lang3.StringUtils; import org.joda.time.DateTime; +import app.metatron.discovery.domain.mdm.Metadata; import app.metatron.discovery.domain.mdm.QCodeTable; public class MetadataSourcePredicate { @@ -34,7 +35,7 @@ public class MetadataSourcePredicate { * @param to 검색 종료일자, yyyy-MM-ddThh:mm:ss.SSSZ * @return */ - public static Predicate searchList(MetadataSource.MetadataSourceType type, String sourceId, + public static Predicate searchList(Metadata.SourceType type, String sourceId, String searchDateBy, DateTime from, DateTime to) { BooleanBuilder builder = new BooleanBuilder(); diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetadataSourceProjections.java b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetadataSourceProjections.java index 79bfdcb843..9e39d19da0 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetadataSourceProjections.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetadataSourceProjections.java @@ -19,6 +19,7 @@ import org.springframework.data.rest.core.config.Projection; import app.metatron.discovery.common.BaseProjections; +import app.metatron.discovery.domain.mdm.Metadata; import app.metatron.discovery.domain.user.UserProfile; public class MetadataSourceProjections extends BaseProjections { @@ -30,7 +31,7 @@ public interface DefaultProjection { String getName(); - MetadataSource.MetadataSourceType getType(); + Metadata.SourceType getType(); String getSourceId(); } @@ -42,7 +43,7 @@ public interface ForDetailViewProjection { String getName(); - MetadataSource.MetadataSourceType getType(); + Metadata.SourceType getType(); //String getSourceId(); diff --git a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetadataSourceRepository.java b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetadataSourceRepository.java index 9e70699fae..694fe678ad 100644 --- a/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetadataSourceRepository.java +++ b/discovery-server/src/main/java/app/metatron/discovery/domain/mdm/source/MetadataSourceRepository.java @@ -20,6 +20,7 @@ import java.util.Set; +import app.metatron.discovery.domain.mdm.Metadata; import app.metatron.discovery.domain.mdm.MetadataProjections; /** @@ -30,6 +31,7 @@ public interface MetadataSourceRepository extends JpaRepository, QueryDslPredicateExecutor { - Set findMetadataSourcesByTypeAndSchema(MetadataSource.MetadataSourceType type, String schema); - Set findMetadataSourcesByTypeAndSchemaAndSourceId(MetadataSource.MetadataSourceType type, String schema, String sourceId); + Set findMetadataSourcesByTypeAndSchema(Metadata.SourceType type, String schema); + + Set findMetadataSourcesByTypeAndSchemaAndSourceId(Metadata.SourceType type, String schema, String sourceId); } diff --git a/discovery-server/src/test/java/app/metatron/discovery/domain/datasource/DataSourceRestIntegrationTest.java b/discovery-server/src/test/java/app/metatron/discovery/domain/datasource/DataSourceRestIntegrationTest.java index 68b41ab221..8e9ba33abe 100644 --- a/discovery-server/src/test/java/app/metatron/discovery/domain/datasource/DataSourceRestIntegrationTest.java +++ b/discovery-server/src/test/java/app/metatron/discovery/domain/datasource/DataSourceRestIntegrationTest.java @@ -109,6 +109,7 @@ import static app.metatron.discovery.domain.datasource.DataSource.SourceType.FILE; import static app.metatron.discovery.domain.datasource.DataSource.SourceType.HDFS; import static app.metatron.discovery.domain.datasource.DataSource.SourceType.HIVE; +import static app.metatron.discovery.domain.datasource.DataSource.SourceType.IMPORT; import static app.metatron.discovery.domain.datasource.DataSource.SourceType.JDBC; import static app.metatron.discovery.domain.datasource.DataSource.SourceType.NONE; import static app.metatron.discovery.domain.datasource.DataSource.SourceType.REALTIME; @@ -1032,6 +1033,158 @@ public void createDataSourceWithContext() throws JsonProcessingException { // @formatter:on } + @Test + @OAuthRequest(username = "polaris", value = {"SYSTEM_USER", "PERM_SYSTEM_MANAGE_DATASOURCE"}) + @Sql("/sql/test_datasource_field.sql") + public void patchDataSourceWithMetadata() throws JsonProcessingException { + + String dataSourceId = "test_ds_id"; + + TestUtils.printTestTitle("1. update datasource column"); + + Map patchParams = Maps.newHashMap(); + patchParams.put("name", "name->metadata"); + patchParams.put("description", "desc->metadata"); + + // @formatter:off + given() + .auth().oauth2(oauth_token) + .contentType(ContentType.JSON) + .body(patchParams) + .log().all() + .when() + .patch("/api/datasources/{id}", dataSourceId). + then() + .statusCode(HttpStatus.SC_OK) + .log().all(); + // @formatter:on + + TestUtils.printTestTitle("2. Check updated metadata column"); + + // @formatter:off + given() + .auth().oauth2(oauth_token) + .contentType(ContentType.JSON) + .queryParam("projection", "forDetailView") + .when() + .post("/api/metadatas/metasources/{dataSourceId}", dataSourceId) + .then() + .statusCode(HttpStatus.SC_OK) + .log().all(); + // @formatter:on + + } + + @Test + @OAuthRequest(username = "polaris", value = {"SYSTEM_USER", "PERM_SYSTEM_MANAGE_DATASOURCE"}) + public void createDataSourceWithMetadata() throws JsonProcessingException { + + TestUtils.printTestTitle("1. Created datasource(Import Type) with metadata"); + + DataSource dataSource = new DataSource(); + dataSource.setName("datasourceWith"); + dataSource.setDescription("datasourceWithDescription"); + dataSource.setDsType(MASTER); + dataSource.setConnType(ENGINE); + dataSource.setGranularity(DAY); + dataSource.setSegGranularity(MONTH); + dataSource.setSrcType(IMPORT); + + List fields = Lists.newArrayList(); + fields.add(new Field("time", DataType.TIMESTAMP, TIMESTAMP, 0L)); + fields.add(new Field("d", DataType.STRING, DIMENSION, 1L)); + fields.add(new Field("sd", DataType.STRING, DIMENSION, 2L)); + fields.add(new Field("m1", DataType.DOUBLE, MEASURE, 3L)); + fields.add(new Field("m2", DataType.DOUBLE, MEASURE, 4L)); + + dataSource.setFields(fields); + + String reqBody = GlobalObjectMapper.writeValueAsString(dataSource); + + // @formatter:off + Response dsRes = + given() + .auth().oauth2(oauth_token) + .contentType(ContentType.JSON) + .body(reqBody) + .log().all() + .when() + .post("/api/datasources"); + dsRes.then() + .statusCode(HttpStatus.SC_CREATED) + .log().all(); + // @formatter:on + + String dataSourceId = from(dsRes.asString()).get("id"); + + TestUtils.printTestTitle("2. Check created metadata related with datasource"); + + // @formatter:off + given() + .auth().oauth2(oauth_token) + .contentType(ContentType.JSON) + .queryParam("projection", "forDetailView") + .when() + .post("/api/metadatas/metasources/{dataSourceId}", dataSourceId) + .then() + .statusCode(HttpStatus.SC_OK) + .log().all(); + // @formatter:on + + } + + @Test + @OAuthRequest(username = "polaris", value = {"SYSTEM_USER", "PERM_SYSTEM_MANAGE_DATASOURCE"}) + @Sql("/sql/test_datasource_field.sql") + public void patchDataSourceFieldWithMetadataColumn() throws JsonProcessingException { + + String dataSourceId = "test_ds_id"; + + TestUtils.printTestTitle("1. update datasource column"); + + Map addField = Maps.newHashMap(); + addField.put("op", "add"); + addField.put("name", "add field name"); + addField.put("type", "string"); + addField.put("role", "DIMENSION"); + addField.put("seq", 3); + + Map updateField = Maps.newHashMap(); + updateField.put("op", "replace"); + updateField.put("id", 10037066); + updateField.put("logicalName", "sd->logicalName"); + updateField.put("description", "sd description"); + updateField.put("seq", 10); + + // @formatter:off + given() + .auth().oauth2(oauth_token) + .contentType(ContentType.JSON) + .body(Lists.newArrayList(addField, updateField)) + .log().all() + .when() + .patch("/api/datasources/{id}/fields", dataSourceId). + then() + .statusCode(HttpStatus.SC_NO_CONTENT) + .log().all(); + // @formatter:on + + TestUtils.printTestTitle("2. Check updated metadata column"); + + // @formatter:off + given() + .auth().oauth2(oauth_token) + .contentType(ContentType.JSON) + .queryParam("projection", "forDetailView") + .when() + .post("/api/metadatas/metasources/{dataSourceId}", dataSourceId) + .then() + .statusCode(HttpStatus.SC_OK) + .log().all(); + // @formatter:on + + } + @Test @OAuthRequest(username = "polaris", value = {"SYSTEM_USER", "PERM_SYSTEM_MANAGE_DATASOURCE"}) public void createDataSourceWithLinkType() throws JsonProcessingException { diff --git a/discovery-server/src/test/java/app/metatron/discovery/domain/datasource/connection/jdbc/JdbcConnectionServiceTest.java b/discovery-server/src/test/java/app/metatron/discovery/domain/datasource/connection/jdbc/JdbcConnectionServiceTest.java index 775ed461c1..b6b7ab9429 100644 --- a/discovery-server/src/test/java/app/metatron/discovery/domain/datasource/connection/jdbc/JdbcConnectionServiceTest.java +++ b/discovery-server/src/test/java/app/metatron/discovery/domain/datasource/connection/jdbc/JdbcConnectionServiceTest.java @@ -14,6 +14,15 @@ package app.metatron.discovery.domain.datasource.connection.jdbc; +import com.google.common.collect.Lists; + +import org.junit.Test; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + import app.metatron.discovery.common.datasource.LogicalType; import app.metatron.discovery.domain.datasource.Field; import app.metatron.discovery.domain.datasource.connection.ConnectionRequest; @@ -27,13 +36,6 @@ import app.metatron.discovery.domain.workbook.configurations.filter.Filter; import app.metatron.discovery.domain.workbook.configurations.filter.InclusionFilter; import app.metatron.discovery.domain.workbook.configurations.filter.IntervalFilter; -import com.google.common.collect.Lists; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; import static app.metatron.discovery.domain.datasource.ingestion.jdbc.JdbcIngestionInfo.DataType.TABLE; @@ -102,12 +104,12 @@ public void selectQueryToCsv() { Field field = new Field(); field.setName("City"); - field.setAlias("city"); + field.setLogicalName("city"); fieldList.add(field); field = new Field(); field.setName("Category"); - field.setAlias("category"); + field.setLogicalName("category"); fieldList.add(field); System.out.println(new JdbcConnectionService().selectQueryToCsv(connection, ingestionInfo, dataSourceName, fieldList, 120)); @@ -133,17 +135,17 @@ public void selectQueryFilterToCsv() { Field field = new Field(); field.setName("City"); - field.setAlias("city"); + field.setLogicalName("city"); fieldList.add(field); field = new Field(); field.setName("Category"); - field.setAlias("category"); + field.setLogicalName("category"); fieldList.add(field); field = new Field(); field.setName("OrderDate"); - field.setAlias("orderDate"); + field.setLogicalName("orderDate"); fieldList.add(field); List filterList = new ArrayList<>(); @@ -177,12 +179,10 @@ public void selectCandidateQueryMysql() { Field metaDimensionField = new Field(); metaDimensionField.setName("Category"); - metaDimensionField.setAlias("Category"); metaDimensionField.setLogicalType(LogicalType.STRING); Field metaTimestampField = new Field(); metaTimestampField.setName("OrderDate"); - metaTimestampField.setAlias("OrderDate"); metaTimestampField.setLogicalType(LogicalType.TIMESTAMP); app.metatron.discovery.domain.workbook.configurations.field.Field dimensionField = new DimensionField("Category", "Category"); @@ -223,12 +223,10 @@ public void selectCandidateTableTimestampHive() { Field metaDimensionField = new Field(); metaDimensionField.setName("sales.Category"); - metaDimensionField.setAlias("sales.Category"); metaDimensionField.setLogicalType(LogicalType.STRING); Field metaTimestampField = new Field(); metaTimestampField.setName("sales.OrderDate"); - metaTimestampField.setAlias("sales.OrderDate"); metaTimestampField.setLogicalType(LogicalType.TIMESTAMP); app.metatron.discovery.domain.workbook.configurations.field.Field dimensionField = new DimensionField("sales.Category", "sales.Category"); @@ -269,12 +267,10 @@ public void selectCandidateTableDimensionHive() { Field metaDimensionField = new Field(); metaDimensionField.setName("sales.Category"); - metaDimensionField.setAlias("sales.Category"); metaDimensionField.setLogicalType(LogicalType.STRING); Field metaTimestampField = new Field(); metaTimestampField.setName("sales.OrderDate"); - metaTimestampField.setAlias("sales.OrderDate"); metaTimestampField.setLogicalType(LogicalType.TIMESTAMP); app.metatron.discovery.domain.workbook.configurations.field.Field dimensionField = new DimensionField("sales.Category", "sales.Category"); @@ -315,12 +311,10 @@ public void selectCandidateQueryTimestampHive() { Field metaDimensionField = new Field(); metaDimensionField.setName("sales_part2.ymd"); - metaDimensionField.setAlias("sales_part2.ymd"); metaDimensionField.setLogicalType(LogicalType.STRING); Field metaTimestampField = new Field(); metaTimestampField.setName("sales_part2.OrderDate"); - metaTimestampField.setAlias("sales_part2.OrderDate"); metaTimestampField.setLogicalType(LogicalType.TIMESTAMP); app.metatron.discovery.domain.workbook.configurations.field.Field dimensionField = new DimensionField("sales_part2.ymd", "sales_part2.ymd"); @@ -361,12 +355,10 @@ public void selectCandidateQueryDimensionHive() { Field metaDimensionField = new Field(); metaDimensionField.setName("sales_part2.ymd"); - metaDimensionField.setAlias("sales_part2.ymd"); metaDimensionField.setLogicalType(LogicalType.STRING); Field metaTimestampField = new Field(); metaTimestampField.setName("OrderDate"); - metaTimestampField.setAlias("OrderDate"); metaTimestampField.setLogicalType(LogicalType.TIMESTAMP); app.metatron.discovery.domain.workbook.configurations.field.Field dimensionField = new DimensionField("sales_part2.ymd", "sales_part2.ymd"); diff --git a/discovery-server/src/test/java/app/metatron/discovery/domain/mdm/MetadataRestIntegrationTest.java b/discovery-server/src/test/java/app/metatron/discovery/domain/mdm/MetadataRestIntegrationTest.java index 92bc0cba5b..406f86f60f 100644 --- a/discovery-server/src/test/java/app/metatron/discovery/domain/mdm/MetadataRestIntegrationTest.java +++ b/discovery-server/src/test/java/app/metatron/discovery/domain/mdm/MetadataRestIntegrationTest.java @@ -398,6 +398,86 @@ public void patchColumnInMetadata() { // @formatter:on } + @Test + @OAuthRequest(username = "polaris", value = {"ROLE_SYSTEM_USER"}) + @Sql({"/sql/test_datasource_field.sql"}) + public void patchMetadataWithDataSource() { + + String patchMetadataId = "test_meta1"; + String checkDataSourceId = "test_ds_id"; + + // Column 수정 + Map updateMetadata = Maps.newHashMap(); + updateMetadata.put("name", "metadata -> datasource name"); + updateMetadata.put("description", "metadata -> desciption"); + + // @formatter:off + given() + .auth().oauth2(oauth_token) + .contentType(ContentType.JSON) + .body(updateMetadata) + .log().all() + .when() + .patch("/api/metadatas/{metadataId}", patchMetadataId) + .then() + .statusCode(HttpStatus.SC_OK) + .log().all(); + // @formatter:on + + // @formatter:off + given() + .auth().oauth2(oauth_token) + .contentType(ContentType.JSON) + .param("projection", "forDetailView") + .when() + .get("/api/datasources/{datasourceId}", checkDataSourceId) + .then() + .statusCode(HttpStatus.SC_OK) + .log().all(); + // @formatter:on + } + + @Test + @OAuthRequest(username = "polaris", value = {"ROLE_SYSTEM_USER"}) + @Sql({"/sql/test_datasource_field.sql"}) + public void patchColumnInMetadataWithDataSource() { + + String patchMetadataId = "test_meta1"; + String checkDataSourceId = "test_ds_id"; + + // Column 수정 + Map updateColumnValue = Maps.newHashMap(); + updateColumnValue.put("op", "replace"); + updateColumnValue.put("id", 10003); + updateColumnValue.put("name", "sd->updated from metadata"); + updateColumnValue.put("seq", 5); + + // @formatter:off + given() + .auth().oauth2(oauth_token) + .contentType(ContentType.JSON) + .body(Lists.newArrayList(updateColumnValue)) + .log().all() + .when() + .patch("/api/metadatas/{metadataId}/columns", patchMetadataId) + .then() + .statusCode(HttpStatus.SC_NO_CONTENT) + .log().all(); + // @formatter:on + + // @formatter:off + given() + .auth().oauth2(oauth_token) + .contentType(ContentType.JSON) + .param("projection", "forDetailView") + .when() + .get("/api/datasources/{datasourceId}", checkDataSourceId) + .then() + .statusCode(HttpStatus.SC_OK) + .log().all(); + // @formatter:on + } + @Test @OAuthRequest(username = "polaris", value = {"ROLE_SYSTEM_USER"}) @Sql({"/sql/test_mdm.sql"}) diff --git a/discovery-server/src/test/resources/sql/test_datasource_field.sql b/discovery-server/src/test/resources/sql/test_datasource_field.sql index c0bd3c93d6..8c5aaf61ab 100644 --- a/discovery-server/src/test/resources/sql/test_datasource_field.sql +++ b/discovery-server/src/test/resources/sql/test_datasource_field.sql @@ -1,17 +1,22 @@ -INSERT INTO `datasource` (`id`,`created_by`,`created_time`,`modified_by`,`modified_time`,`version`,`ds_conn_type`,`datasource_contexts`,`ds_desc`,`ds_type`,`ds_engine_name`,`ds_granularity`,`ds_linked_workspaces`,`ds_name`,`ds_owner_id`,`ds_seg_granularity`,`ds_src_type`,`ds_status`) -VALUES ('7b8005ae-eca0-4a56-9072-c3811138c7a6','admin','2018-10-01 05:18:23','admin','2018-10-01 05:20:00',2,'ENGINE',NULL,'','MASTER','testsampleds','DAY',0,'test-sample-ds','admin','MONTH','FILE','ENABLED'); +INSERT INTO `datasource` (`id`,`created_by`,`created_time`,`modified_by`,`modified_time`,`version`,`ds_conn_type`,`datasource_contexts`,`ds_desc`,`ds_type`,`ds_engine_name`,`ds_granularity`,`ds_linked_workspaces`,`ds_name`,`ds_owner_id`,`ds_seg_granularity`,`ds_src_type`,`ds_status`) VALUES +('test_ds_id','admin', now(),'admin', now(), 2,'ENGINE',NULL,'','MASTER','test_datasource_engine','DAY',0,'test_datasource','admin','MONTH','FILE','ENABLED'); -INSERT INTO `field` (`id`,`pre_aggr_type`,`field_alias`,`field_desc`,`field_filtering`,`field_filtering_options`,`field_filtering_seq`,`field_format`,`field_ingestion_rule`,`field_logical_type`,`field_name`,`field_partitioned`,`field_role`,`seq`,`field_type`,`ref_id`,`ds_id`) -VALUES (10037064,'NONE','time',NULL,NULL,NULL,NULL,'yyyy-MM-dd',NULL,'TIMESTAMP','time',NULL,'TIMESTAMP',0,'STRING',NULL,'7b8005ae-eca0-4a56-9072-c3811138c7a6'); +INSERT INTO `field` (`id`,`field_name`,`field_logical_name`,`field_desc`,`field_format`,`field_logical_type`,`field_role`,`seq`,`field_type`,`ref_id`,`ds_id`) VALUES +(10037064,'time','TIME','time desc','{"type":"time_format","format":"yyyy-MM-dd"}','TIMESTAMP','TIMESTAMP',0,'STRING',NULL,'test_ds_id'), +(10037065,'d','D','d desc',NULL,'STRING','DIMENSION',1,'STRING',NULL,'test_ds_id'), +(10037066,'sd','SD','sd desc',NULL,'STRING','DIMENSION',2,'STRING',NULL,'test_ds_id'), +(10037067,'m1','ME1','m1 desc',NULL,'INTEGER','MEASURE',3,'INTEGER',NULL,'test_ds_id'), +(10037068,'m2','ME2','m2 desc',NULL,'INTEGER','MEASURE',4,'INTEGER',NULL,'test_ds_id'); -INSERT INTO `field` (`id`,`pre_aggr_type`,`field_alias`,`field_desc`,`field_filtering`,`field_filtering_options`,`field_filtering_seq`,`field_format`,`field_ingestion_rule`,`field_logical_type`,`field_name`,`field_partitioned`,`field_role`,`seq`,`field_type`,`ref_id`,`ds_id`) -VALUES (10037065,'NONE','d',NULL,NULL,NULL,NULL,NULL,NULL,'STRING','d',NULL,'DIMENSION',1,'STRING',NULL,'7b8005ae-eca0-4a56-9072-c3811138c7a6'); +INSERT INTO mdm_metadata_source(id, meta_source_type, meta_source_name, meta_source_id, meta_source_schema, meta_source_table, created_by, created_time, modified_by, modified_time, version) values +('test_engine_source_01', 'ENGINE', 'test_datasource', 'test_ds_id', null, null, 'admin', NOW(),'admin', NOW(), 1.0); -INSERT INTO `field` (`id`,`pre_aggr_type`,`field_alias`,`field_desc`,`field_filtering`,`field_filtering_options`,`field_filtering_seq`,`field_format`,`field_ingestion_rule`,`field_logical_type`,`field_name`,`field_partitioned`,`field_role`,`seq`,`field_type`,`ref_id`,`ds_id`) -VALUES (10037066,'NONE','sd',NULL,NULL,NULL,NULL,NULL,NULL,'STRING','sd',NULL,'DIMENSION',2,'STRING',NULL,'7b8005ae-eca0-4a56-9072-c3811138c7a6'); +INSERT INTO mdm_metadata(id, meta_name, meta_desc, meta_source_type, source_id, created_by, created_time, modified_by, modified_time, version) values +('test_meta1', 'test_datasource', 'meta description1', 'ENGINE', 'test_engine_source_01', 'admin', NOW(),'admin', NOW(), 1.0); -INSERT INTO `field` (`id`,`pre_aggr_type`,`field_alias`,`field_desc`,`field_filtering`,`field_filtering_options`,`field_filtering_seq`,`field_format`,`field_ingestion_rule`,`field_logical_type`,`field_name`,`field_partitioned`,`field_role`,`seq`,`field_type`,`ref_id`,`ds_id`) -VALUES (10037067,'NONE','m1',NULL,NULL,NULL,NULL,NULL,NULL,'INTEGER','m1',NULL,'MEASURE',3,'STRING',NULL,'7b8005ae-eca0-4a56-9072-c3811138c7a6'); - -INSERT INTO `field` (`id`,`pre_aggr_type`,`field_alias`,`field_desc`,`field_filtering`,`field_filtering_options`,`field_filtering_seq`,`field_format`,`field_ingestion_rule`,`field_logical_type`,`field_name`,`field_partitioned`,`field_role`,`seq`,`field_type`,`ref_id`,`ds_id`) -VALUES (10037068,'NONE','m2',NULL,NULL,NULL,NULL,NULL,NULL,'INTEGER','m2',NULL,'MEASURE',4,'STRING',NULL,'7b8005ae-eca0-4a56-9072-c3811138c7a6'); \ No newline at end of file +INSERT INTO mdm_metadata_column(id, meta_id, column_physical_type, column_physical_name, dictionary_id, column_type, column_name, column_format, column_field_ref, column_seq) values +(10001, 'test_meta1', 'TIMESTAMP', 'time', null, 'TIMESTAMP', 'TIME', '{"type":"time_format","format":"yyyy-MM-dd"}', 10037064, 0), +(10002, 'test_meta1', 'STRING', 'd', null, 'STRING', 'D', null, 10037065, 1), +(10003, 'test_meta1', 'STRING', 'sd', null, 'STRING', 'SD', null, 10037066, 2), +(10004, 'test_meta1', 'INTEGER', 'm1', null, 'INTEGER', 'ME1', null, 10037067, 3), +(10005, 'test_meta1', 'INTEGER', 'm2', null, 'INTEGER', 'ME2', null, 10037068, 4);