IGNITE-843 WIP metadata.
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/24112a74 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/24112a74 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/24112a74 Branch: refs/heads/ignite-1121 Commit: 24112a74f4dc7d6f33b81153c1872d1677d7ed9e Parents: ecf4e20 Author: AKuznetsov <akuznet...@gridgain.com> Authored: Wed Jul 15 17:43:20 2015 +0700 Committer: AKuznetsov <akuznet...@gridgain.com> Committed: Wed Jul 15 17:43:20 2015 +0700 ---------------------------------------------------------------------- .../nodejs/controllers/metadata-controller.js | 97 +++++++++++++++++++- .../nodejs/controllers/models/metadata.json | 66 ++++++++++++- .../nodejs/views/configuration/metadata.jade | 68 +++++++++++++- 3 files changed, 220 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/24112a74/modules/web-control-center/nodejs/controllers/metadata-controller.js ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/controllers/metadata-controller.js b/modules/web-control-center/nodejs/controllers/metadata-controller.js index 194a993..a4b54cc 100644 --- a/modules/web-control-center/nodejs/controllers/metadata-controller.js +++ b/modules/web-control-center/nodejs/controllers/metadata-controller.js @@ -26,13 +26,56 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', 'common {value: {kind: 'both'}, label: 'both'} ]; + $scope.template = $scope.templates[0].value; + $scope.kinds = [ {value: 'query', label: 'query'}, {value: 'store', label: 'store'}, {value: 'both', label: 'both'} ]; - $scope.template = $scope.templates[0].value; + $scope.databases = [ + {value: 'oracle', label: 'Oracle database'}, + {value: 'db2', label: 'IBM DB2'}, + {value: 'mssql', label: 'MS SQL Server'}, + {value: 'postgre', label: 'PostgreSQL'}, + {value: 'mysql', label: 'MySQL'}, + {value: 'h2', label: 'H2 database'} + ]; + + $scope.data = { + curTableIdx: 0, + curFieldIdx: 0, + curKeyClass: '', + curValueClass: '', + curJavaName: '', + curJavaType: '', + tables: [ + {schemaName: 'Schema1', use: true}, + {schemaName: 'Schema1', use: true, tableName: 'Table1', keyClass: 'KeyClass1', valueClass: 'ValueClass1', + fields: [ + {use: true, key: true, ak: true, dbName: 'name1', dbType: 'dbType1', javaName: 'javaName1', javaType: 'javaType1'}, + {use: true, key: false, ak: false, dbName: 'name2', dbType: 'dbType2', javaName: 'javaName2', javaType: 'javaType2'}, + {use: false, key: false, ak: false, dbName: 'name3', dbType: 'dbType3', javaName: 'javaName3', javaType: 'javaType3'} + ] + }, + {schemaName: 'Schema2 with very long name', use: false}, + {schemaName: 'Schema2', use: false, tableName: 'Table2', keyClass: 'KeyClass2', valueClass: 'ValueClass2', + fields: [ + {use: true, key: true, ak: true, dbName: 'name4', dbType: 'dbType4', javaName: 'javaName4', javaType: 'javaType4'}, + {use: true, key: false, ak: false, dbName: 'name5', dbType: 'dbType5', javaName: 'javaName5', javaType: 'javaType5'}, + {use: false, key: false, ak: false, dbName: 'name6', dbType: 'dbType6', javaName: 'javaName6', javaType: 'javaType6'} + ]}, + {schemaName: 'Schema2', use: false, tableName: 'Table3', keyClass: 'KeyClass3', valueClass: 'ValueClass3', + fields: [ + {use: true, key: true, ak: true, dbName: 'name7', dbType: 'dbType7', javaName: 'javaName7', javaType: 'javaType7'}, + {use: true, key: false, ak: false, dbName: 'name8', dbType: 'dbType8', javaName: 'javaName8', javaType: 'javaType8'}, + {use: false, key: false, ak: false, dbName: 'name9', dbType: 'dbType9', javaName: 'javaName9', javaType: 'javaType9'}, + {use: false, key: false, ak: false, dbName: 'name10', dbType: 'dbType10', javaName: 'javaName10', javaType: 'javaType10'}, + {use: false, key: false, ak: false, dbName: 'name11', dbType: 'dbType11', javaName: 'javaName11', javaType: 'javaType11'}, + {use: false, key: false, ak: false, dbName: 'name12', dbType: 'dbType12', javaName: 'javaName12', javaType: 'javaType12'} + ]}] + }; $scope.metadata = []; @@ -40,14 +83,13 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', 'common .success(function (data) { $scope.screenTip = data.screenTip; $scope.templateTip = data.templateTip; - $scope.general = data.general; + $scope.metadataManual = data.metadataManual; + $scope.metadataDb = data.metadataDb; }) .error(function (errMsg) { commonFunctions.showError(errMsg); }); - $scope.metadatas = []; - // When landing on the page, get metadatas and show them. $http.post('metadata/list') .success(function (data) { @@ -83,7 +125,6 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', 'common $scope.selectItem = function (item) { $scope.selectedItem = item; - $scope.backupItem = angular.copy(item); }; @@ -140,5 +181,51 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', 'common commonFunctions.showError(errMsg); }); }; + + $scope.selectSchema = function (idx) { + var data = $scope.data; + var tables = data.tables; + var schemaName = tables[idx].schemaName; + var use = tables[idx].use; + + for (var i = idx + 1; i < tables.length; i++) { + var item = tables[i]; + + if (item.schemaName == schemaName && item.tableName) + item.use = use; + else + break; + } + + data.curTableIdx = -1; + data.curFieldIdx = -1; + }; + + $scope.selectTable = function (idx) { + var data = $scope.data; + + data.curTableIdx = idx; + data.curFieldIdx = -1; + + if (idx >= 0) { + var tbl = data.tables[idx]; + + data.curKeyClass = tbl.keyClass; + data.curValueClass = tbl.valueClass; + } + }; + + $scope.selectField = function (idx) { + var data = $scope.data; + + data.curFieldIdx = idx; + + if (idx >= 0) { + var fld = data.tables[data.curTableIdx].fields[idx]; + + data.curJavaName = fld.javaName; + data.curJavaType = fld.javaType; + } + }; }] ); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/24112a74/modules/web-control-center/nodejs/controllers/models/metadata.json ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/controllers/models/metadata.json b/modules/web-control-center/nodejs/controllers/models/metadata.json index ce206b4..753f643 100644 --- a/modules/web-control-center/nodejs/controllers/models/metadata.json +++ b/modules/web-control-center/nodejs/controllers/models/metadata.json @@ -12,7 +12,7 @@ " <li>both - Create cache type metadata to use with query and store.</li>", "</ul>" ], - "general": [ + "metadataManual": [ { "label": "Name", "type": "text", @@ -110,5 +110,69 @@ "hide": "backupItem.kind != 'query'", "tip": ["TODO."] } + ], + "metadataDb": [ + { + "label": "Name", + "type": "text", + "model": "name", + "required": true + }, + { + "label": "Database type", + "type": "dropdown", + "model": "dbType", + "placeholder": "Choose database", + "items": "databases", + "tip": [ + "Select database type to connect for loading tables metadata." + ] + }, + { + "label": "Database name", + "type": "text", + "model": "dbName", + "tip": [ + "Database name to connect for loading tables metadata." + ] + }, + { + "label": "Host", + "type": "text", + "model": "host", + "placeholder": "IP address or host", + "tip": [ + "IP address or host name where database server deployed." + ] + }, + { + "label": "Port", + "type": "number", + "model": "port", + "max": 65535, + "placeholder": "", + "tip": [ + "Port number for connecting to database." + ] + }, + { + "label": "User", + "type": "text", + "model": "user", + "placeholder": "", + "tip": [ + "User name for connecting to database." + ] + }, + { + "label": "Password", + "type": "password", + "model": "password", + "placeholder": "", + "tip": [ + "Password for connecting to database.", + "Note, password would not be saved." + ] + } ] } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/24112a74/modules/web-control-center/nodejs/views/configuration/metadata.jade ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/views/configuration/metadata.jade b/modules/web-control-center/nodejs/views/configuration/metadata.jade index 526edb4..1e4c986 100644 --- a/modules/web-control-center/nodejs/views/configuration/metadata.jade +++ b/modules/web-control-center/nodejs/views/configuration/metadata.jade @@ -46,16 +46,74 @@ block content button.btn.btn-default(ng-model='template' data-template='/select' data-placeholder='Choose metadata type' bs-options='item.value as item.label for item in templates' bs-select) i.tiplabel.fa.fa-question-circle(bs-tooltip data-title='{{joinTip(templateTip)}}' type='button') hr - form.form-horizontal(name='inputForm' ng-if='backupItem' novalidate) + form.form-horizontal(name='manualForm' ng-if='backupItem' novalidate) .panel-body - .settings-row(ng-repeat='field in general') + .settings-row(ng-repeat='field in metadataManual') +form-row - button#save-btn.btn.btn-primary(ng-disabled='inputForm.$invalid' ng-click='saveItem()') Save + button#save-btn.btn.btn-primary(ng-disabled='manualForm.$invalid' ng-click='saveItem()') Save button.btn.btn-primary.btn-second(ng-show='backupItem._id' ng-click='removeItem()') Remove .panel.panel-default .panel-heading h3 a(bs-collapse-toggle) Load from database - .panel-collapse(role="tabpanel" bs-collapse-target) + .panel-collapse(bs-collapse-target) .panel-body - p TODO 2 + form.form-horizontal(name='dbForm' novalidate) + .settings-row(ng-repeat='field in metadataDb') + +form-row + div(ng-hide='data.tables.length == 0') + table.table-bordered.table-condensed.links-edit-small-padding.col-sm-12(st-table='data.tables') + thead + tr + th.col-sm-3 Schema/Table + th Key class + th Value class + tbody + tr(ng-repeat='row in data.tables') + td(colspan='{{row.tableName ? 1 : 3}}') + div.checkbox(ng-if='!row.tableName') + label(ng-click='selectSchema($index)') + input(type='checkbox' ng-checked='row.use') + | {{row.schemaName}} + div.checkbox(ng-if='row.tableName') + label(style='padding-left: 30px' ng-click='selectTable($index)') + input(type='checkbox' ng-checked = 'row.use') + | {{row.tableName}} + td(ng-if='row.tableName') + a(ng-show='data.curTableIdx != $index' ng-click='selectTable($index)') {{row.keyClass}} + input.form-control(type='text' ng-show='data.curTableIdx == $index' ng-model='data.curKeyClass' placeholder='Key class full name') + td(ng-if='row.tableName') + a(ng-show='data.curTableIdx != $index' ng-click='selectTable($index)') {{row.valueClass}} + input.form-control(type='text' ng-show='data.curTableIdx == $index' ng-model='data.curValueClass' placeholder='Value class full name') + //div(ng-hide='data.curTableIdx < 0') + // table.table-bordered.table-condensed.links-edit-small-padding.col-sm-12(st-table='data.tables[data.curTableIdx].fields') + // thead + // tr + // th(style='width:45px') Use + // th(style='width:45px') Key + // th(style='width:45px') Ak + // th DB Name + // th DB Type + // th Java Name + // th Java Type + // tbody + // tr(ng-repeat='row in data.tables[data.curTableIdx].fields') + // td + // +dbcheck('row.use') + // td + // +dbcheck('row.key') + // td + // +dbcheck('row.ak') + // td + // label {{row.dbName}} + // td + // label {{row.dbType}} + // td + // a(ng-show='data.curFieldIdx != $index' ng-click='selectField($index)') {{row.javaName}} + // input.form-control(type='text' ng-show='data.curFieldIdx == $index' ng-model='data.curJavaName' placeholder='Field Java name') + // td + // a(ng-show='data.curFieldIdx != $index' ng-click='selectField($index)') {{row.javaType}} + // input.form-control(type='text' ng-show='data.curFieldIdx == $index' ng-model='data.curJavaType' placeholder='Field Java type') + button.btn.btn-primary(ng-disabled='dbForm.$invalid' ng-click='saveItem()') Save + button.btn.btn-primary.btn-second(ng-show='backupItem._id' ng-click='removeItem()') Remove + button.btn.btn-primary.btn-second(ng-click='reloadMetadata()') Reload \ No newline at end of file