http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/control-center-web/src/main/js/views/includes/controls.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/includes/controls.jade b/modules/control-center-web/src/main/js/views/includes/controls.jade new file mode 100644 index 0000000..e9fe71b --- /dev/null +++ b/modules/control-center-web/src/main/js/views/includes/controls.jade @@ -0,0 +1,350 @@ +//- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +mixin block-callout(titleWorkflow, contentWorkflow, whatsNextWorkflow, whatsNextContent) + .block-callout-parent.block-callout-border.margin-bottom-dflt + .block-callout + i.fa.fa-check-square + label #{titleWorkflow} + p(ng-bind-html=contentWorkflow) + .block-callout + i.fa.fa-check-square + label #{whatsNextWorkflow} + p(ng-bind-html=whatsNextContent) + + +mixin tipField(lines) + i.tipField.fa.fa-question-circle(ng-if=lines bs-tooltip='joinTip(#{lines})' type='button') + i.tipField.fa.fa-question-circle.blank(ng-if='!#{lines}') + +mixin tipLabel(lines) + i.tipLabel.fa.fa-question-circle(ng-if=lines bs-tooltip='joinTip(#{lines})' type='button') + i.tipLabel.fa.fa-question-circle.blank(ng-if='!#{lines}') + +mixin ico-exclamation(mdl, err, msg) + i.fa.fa-exclamation-triangle.form-control-feedback(ng-show='inputForm["#{mdl}"].$error.#{err}' bs-tooltip data-title='#{msg}' type='button') + +mixin btn-save(show, click) + i.tipField.fa.fa-floppy-o(ng-show=show ng-click=click bs-tooltip data-title='Save item') + +mixin btn-add(click, tip, focusId) + i.tipField.fa.fa-plus(ng-click=click bs-tooltip=tip event-focus='click' event-focus-id=focusId) + +mixin btn-remove(click, tip) + i.tipField.fa.fa-remove(ng-click=click bs-tooltip=tip data-trigger='hover') + +mixin btn-up(show, click) + i.tipField.fa.fa-arrow-up(ng-show=show ng-click=click bs-tooltip data-title='Move item up') + +mixin btn-down(show, click) + i.tipField.fa.fa-arrow-down(ng-show=show ng-click=click bs-tooltip data-title='Move item down') + +mixin table-pair-edit(keyModel, valModel, keyPlaceholder, valPlaceholder, keyJavaBuildInTypes, valueJavaBuildInTypes, focusId) + .col-sm-6(style='float: right') + if valueJavaBuildInTypes + input.form-control(type='text' ng-model=valModel placeholder=valPlaceholder bs-typeahead data-min-length='1' bs-options='javaType for javaType in javaBuildInTypes' ng-escape='tableReset()') + else + input.form-control(type='text' ng-model=valModel placeholder=valPlaceholder ng-escape='tableReset()') + label.fieldSep / + .input-tip + if keyJavaBuildInTypes + input.form-control(id=focusId type='text' ng-model=keyModel placeholder=keyPlaceholder bs-typeahead data-min-length='1' bs-options='javaType for javaType in javaBuildInTypes' ng-escape='tableReset()') + else + input.form-control(id=focusId type='text' ng-model=keyModel placeholder=keyPlaceholder ng-escape='tableReset()') + +mixin table-pair(header, tblMdl, keyFld, valFld, keyPlaceholder, valPlaceholder, keyJavaBuildInTypes, valueJavaBuildInTypes) + .col-sm-6 + label.table-header #{header}: + +tipLabel('field.tip') + +btn-add('tableNewItem(field)', 'field.addTip', '{{::field.focusNewItemId}}') + .table-details(ng-show='(#{tblMdl} && #{tblMdl}.length > 0) || tableNewItemActive(field)') + table.links-edit.col-sm-12(st-table=tblMdl) + tbody + tr(ng-repeat='item in #{tblMdl}') + td.col-sm-12 + div(ng-show='!tableEditing(field, $index)') + a.labelFormField(event-focus='click' event-focus-id='{{::field.focusCurItemId}}' ng-click='curPair = tableStartEdit(backupItem, field, $index); curKey = curPair.#{keyFld}; curValue = curPair.#{valFld}') {{$index + 1}}) {{item.#{keyFld}}} / {{item.#{valFld}}} + +btn-remove('tableRemove(backupItem, field, $index)', 'field.removeTip') + div(ng-if='tableEditing(field, $index)') + label.labelField {{$index + 1}}) + +btn-save('tablePairSaveVisible(curKey, curValue)', 'tablePairSave(tablePairValid, backupItem, field, curKey, curValue, $index)') + +table-pair-edit('curKey', 'curValue', keyPlaceholder, valPlaceholder, keyJavaBuildInTypes, valueJavaBuildInTypes, '{{::field.focusCurItemId}}') + tfoot(ng-show='tableNewItemActive(field)') + tr + td.col-sm-12 + +btn-save('tablePairSaveVisible(newKey, newValue)', 'tablePairSave(tablePairValid, backupItem, field, newKey, newValue, -1)') + +table-pair-edit('newKey', 'newValue', keyPlaceholder, valPlaceholder, keyJavaBuildInTypes, valueJavaBuildInTypes, '{{::field.focusNewItemId}}') + +mixin details-row + - var lblDetailClasses = ['col-sm-4', 'details-label'] + + - var detailMdl = 'getModel(backupItem, detail)[detail.model]'; + - var detailCommon = {'ng-model': detailMdl, 'ng-required': 'detail.required'}; + + - var customValidators = {'ng-attr-ipaddress': '{{detail.ipaddress}}'} + + div(ng-switch='detail.type') + div(ng-switch-when='label') + label {{::detail.label}} + div.checkbox(ng-switch-when='check') + label + input(type='checkbox')&attributes(detailCommon) + |{{::detail.label}} + +tipLabel('detail.tip') + div(ng-switch-when='text') + label(class=lblDetailClasses ng-class='{required: detail.required}') {{::detail.label}}: + .col-sm-8 + +tipField('detail.tip') + .input-tip + input.form-control(type='text' placeholder='{{::detail.placeholder}}')&attributes(detailCommon) + div(ng-switch-when='number' ) + label(class=lblDetailClasses ng-class='{required: detail.required}') {{::detail.label}}: + .col-sm-8 + +tipField('detail.tip') + .input-tip + input.form-control(name='{{detail.model}}' type='number' placeholder='{{::detail.placeholder}}' min='{{detail.min ? detail.min : 0}}' max='{{detail.max ? detail.max : Number.MAX_VALUE}}')&attributes(detailCommon) + +ico-exclamation('{{detail.model}}', 'min', 'Value is less than allowable minimum.') + +ico-exclamation('{{detail.model}}', 'max', 'Value is more than allowable maximum.') + +ico-exclamation('{{detail.model}}', 'number', 'Invalid value. Only numbers allowed.') + div(ng-switch-when='dropdown') + label(class=lblDetailClasses ng-class='{required: detail.required}') {{::detail.label}}: + .col-sm-8 + +tipField('detail.tip') + .input-tip + button.form-control(bs-select data-placeholder='{{::detail.placeholder}}' bs-options='item.value as item.label for item in {{detail.items}}')&attributes(detailCommon) + div(ng-switch-when='dropdown-multiple') + label(class=lblDetailClasses ng-class='{required: detail.required}') {{::detail.label}}: + .col-sm-8 + button.form-control(bs-select data-multiple='1' data-placeholder='{{::detail.placeholder}}' bs-options='item.value as item.label for item in {{detail.items}}')&attributes(detailCommon) + +tipField('detail.tip') + div(ng-switch-when='table-simple')&attributes(detailCommon) + div(ng-if='detail.label') + label.table-header {{::detail.label}}: + +tipLabel('detail.tableTip') + table.col-sm-12.links-edit-details(st-table='#{detailMdl}') + tbody + tr(ng-repeat='item in #{detailMdl} track by $index') + td + div(ng-show='!tableEditing(detail, $index)') + a.labelFormField(event-focus='click' event-focus-id='{{::detail.focusCurItemId}}' ng-click='curValue = tableStartEdit(backupItem, detail, $index)') {{$index + 1}}) {{item}} + +btn-remove('tableRemove(backupItem, detail, $index)', 'detail.removeTip') + +btn-down('detail.reordering && tableSimpleDownVisible(backupItem, detail, $index)', 'tableSimpleDown(backupItem, detail, $index)') + +btn-up('detail.reordering && $index > 0', 'tableSimpleUp(backupItem, detail, $index)') + div(ng-if='tableEditing(detail, $index)') + label.labelField {{$index + 1}}) + +btn-save('tableSimpleSaveVisible(curValue)', 'tableSimpleSave(tableSimpleValid, backupItem, detail, curValue, $index)') + .input-tip.form-group.has-feedback + input.form-control(id='{{::detail.focusCurItemId}}' name='{{detail.model}}.edit' type='text' ng-model='curValue' placeholder='{{::detail.placeholder}}' ng-escape='tableReset()')&attributes(customValidators) + +ico-exclamation('{{detail.model}}.edit', 'ipaddress', 'Invalid address, see help for format description.') + button.btn.btn-primary.fieldButton(ng-disabled='!newValue' ng-click='tableSimpleSave(tableSimpleValid, backupItem, detail, newValue, -1)') Add + +tipField('detail.tip') + .input-tip.form-group.has-feedback + input.form-control(name='{{detail.model}}' type='text' ng-model='newValue' ng-focus='tableNewItem(detail)' placeholder='{{::detail.placeholder}}')&attributes(customValidators) + +ico-exclamation('{{detail.model}}', 'ipaddress', 'Invalid address, see help for format description.') + +mixin table-db-field-edit(databaseName, databaseType, javaName, javaType) + div(style='width: 22%; float: right') + button.form-control(ng-model=javaType bs-select data-placeholder='Java type' bs-options='item.value as item.label for item in {{javaTypes}}') + label.fieldSep / + div(style='width: 20%; float: right') + input.form-control(type='text' ng-model=javaName placeholder='Java name' ng-escape='tableReset()') + label.fieldSep / + div(style='width: 22%; float: right') + button.form-control(ng-model=databaseType bs-select data-placeholder='JDBC type' bs-options='item.value as item.label for item in {{jdbcTypes}}') + label.fieldSep / + .input-tip + input.form-control(type='text' ng-model=databaseName placeholder='DB name' ng-escape='tableReset()') + +mixin table-group-item-edit(fieldName, className, direction, focusId) + div(style='width: 15%; float: right') + button.form-control(ng-model=direction bs-select data-placeholder='Sort' bs-options='item.value as item.label for item in {{sortDirections}}') + label.fieldSep / + div(style='width: 38%; float: right') + input.form-control(type='text' ng-model=className placeholder='Class name' bs-typeahead data-min-length='1' bs-options='javaType for javaType in javaBuildInTypes' ng-escape='tableReset()') + label.fieldSep / + .input-tip + input.form-control(id=focusId type='text' ng-model=fieldName placeholder='Field name' ng-escape='tableReset()') + +mixin form-row + +form-row-custom(['col-sm-2'], ['col-sm-4']) + +mixin form-row-custom(lblClasses, fieldClasses) + - var fieldMdl = 'getModel(backupItem, field)[field.model]'; + - var fieldCommon = {'ng-model': fieldMdl, 'ng-required': 'field.required || required(field)'}; + - var fieldRequiredClass = '{true: "required"}[field.required || required(field)]' + - var fieldHide = '{{field.hide}}' + + div(ng-switch='field.type') + div.col-sm-6(ng-switch-when='label') + label {{::field.label}} + div.checkbox.col-sm-6(ng-switch-when='check' ng-hide=fieldHide) + label + input(type='checkbox')&attributes(fieldCommon) + | {{::field.label}} + +tipLabel('field.tip') + div(ng-switch-when='text' ng-hide=fieldHide) + label(class=lblClasses ng-class=fieldRequiredClass) {{::field.label}}: + div(class=fieldClasses) + +tipField('field.tip') + .input-tip + input.form-control(id='{{::field.id}}' type='text' placeholder='{{::field.placeholder}}')&attributes(fieldCommon) + div(ng-switch-when='withJavaBuildInTypes' ng-hide=fieldHide) + label(class=lblClasses ng-class=fieldRequiredClass) {{::field.label}}: + div(class=fieldClasses) + +tipField('field.tip') + .input-tip + input.form-control(type='text' placeholder='{{::field.placeholder}}' bs-typeahead data-min-length='1' bs-options='javaType for javaType in javaBuildInTypes')&attributes(fieldCommon) + div(ng-switch-when='password' ng-hide=fieldHide) + label(class=lblClasses ng-class=fieldRequiredClass) {{::field.label}}: + div(class=fieldClasses) + +tipField('field.tip') + .input-tip + input.form-control(type='password' placeholder='{{::field.placeholder}}')&attributes(fieldCommon) + div(ng-switch-when='number' ng-hide=fieldHide) + label(class=lblClasses ng-class=fieldRequiredClass) {{::field.label}}: + div(class=fieldClasses) + +tipField('field.tip') + .input-tip + input.form-control(name='{{field.model}}' type='number' placeholder='{{::field.placeholder}}' min='{{field.min ? field.min : 0}}' max='{{field.max ? field.max : Number.MAX_VALUE}}')&attributes(fieldCommon) + +ico-exclamation('{{field.model}}', 'min', 'Value is less than allowable minimum.') + +ico-exclamation('{{field.model}}', 'max', 'Value is more than allowable maximum.') + +ico-exclamation('{{field.model}}', 'number', 'Invalid value. Only numbers allowed.') + div(ng-switch-when='dropdown' ng-hide=fieldHide) + label(class=lblClasses ng-class=fieldRequiredClass) {{::field.label}}: + div(class=fieldClasses) + +tipField('field.tip') + .input-tip + button.form-control(bs-select data-placeholder='{{::field.placeholder}}' bs-options='item.value as item.label for item in {{field.items}}')&attributes(fieldCommon) + div(ng-switch-when='dropdown-multiple' ng-hide=fieldHide) + label(class=lblClasses ng-class=fieldRequiredClass) {{::field.label}}: + div(class=fieldClasses) + +tipField('field.tip') + .input-tip + button.form-control(bs-select ng-disabled='{{field.items}}.length == 0' data-multiple='1' data-placeholder='{{::field.placeholder}}' bs-options='item.value as item.label for item in {{field.items}}')&attributes(fieldCommon) + a.customize(ng-show='field.addLink' ng-href='{{field.addLink.ref}}') {{field.addLink.label}} + div(ng-switch-when='dropdown-details' ng-hide=fieldHide) + - var expanded = 'field.details[' + fieldMdl + '].expanded' + + label(class=lblClasses ng-class=fieldRequiredClass) {{::field.label}}: + div(class=fieldClasses) + +tipField('field.tip') + .input-tip + button.form-control(bs-select data-placeholder='{{::field.placeholder}}' bs-options='item.value as item.label for item in {{field.items}}')&attributes(fieldCommon) + a.customize(ng-show='#{fieldMdl} && field.details[#{fieldMdl}].fields' ng-click='#{expanded} = !#{expanded}') {{#{expanded} ? "Hide settings" : "Show settings"}} + .col-sm-6.panel-details(ng-show='#{expanded} && #{fieldMdl}') + .details-row(ng-repeat='detail in field.details[#{fieldMdl}].fields') + +details-row + div(ng-switch-when='table-simple' ng-hide=fieldHide)&attributes(fieldCommon) + .col-sm-6 + label.table-header {{::field.label}}: + +tipLabel('field.tableTip') + +btn-add('tableNewItem(field)', 'field.addTip', '{{::field.focusNewItemId}}') + .col-sm-12(ng-show='(#{fieldMdl} && #{fieldMdl}.length > 0) || tableNewItemActive(field)') + .col-sm-6 + .table-details + table.links-edit.col-sm-12(st-table='#{fieldMdl}') + tbody + tr(ng-repeat='item in #{fieldMdl} track by $index') + td.col-sm-12 + div(ng-show='!tableEditing(field, $index)') + a.labelFormField(event-focus='click' event-focus-id='{{::field.focusCurItemId}}' ng-click='curValue = tableStartEdit(backupItem, field, $index)') {{$index + 1}}) {{item | compact}} + +btn-remove('tableRemove(backupItem, field, $index)', 'field.removeTip') + +btn-down('field.reordering && tableSimpleDownVisible(backupItem, field, $index)', 'tableSimpleDown(backupItem, field, $index)') + +btn-up('field.reordering && $index > 0', 'tableSimpleUp(backupItem, field, $index)') + div(ng-if='tableEditing(field, $index)') + label.labelField {{$index + 1}}) + +btn-save('tableSimpleSaveVisible(curValue)', 'tableSimpleSave(tableSimpleValid, backupItem, field, curValue, $index)') + .input-tip + input.form-control(id='{{::field.focusCurItemId}}' type='text' ng-model='curValue' placeholder='{{::field.placeholder}}' ng-enter='tableSimpleSaveVisible(curValue) && tableSimpleSave(tableSimpleValid, backupItem, field, curValue, $index)' ng-escape='tableReset()') + tfoot(ng-show='tableNewItemActive(field)') + tr + td.col-sm-12 + +btn-save('tableSimpleSaveVisible(newValue)', 'tableSimpleSave(tableSimpleValid, backupItem, field, newValue, -1)') + .input-tip + input.form-control(id='{{::field.focusNewItemId}}' type='text' ng-model='newValue' placeholder='{{::field.placeholder}}' ng-enter='tableSimpleSaveVisible(newValue) && tableSimpleSave(tableSimpleValid, backupItem, field, newValue, -1)' ng-escape='tableReset()') + div(ng-switch-when='indexedTypes') + +table-pair('Index key-value type pairs', fieldMdl, 'keyClass', 'valueClass', 'Key class full name', 'Value class full name', true, false) + div(ng-switch-when='queryFields' ng-hide=fieldHide) + +table-pair('{{::field.label}}', fieldMdl, 'name', 'className', 'Field name', 'Field class full name', false, true) + div(ng-switch-when='dbFields' ng-hide=fieldHide) + .col-sm-6 + label.table-header {{::field.label}}: + +tipLabel('field.tip') + +btn-add('tableNewItem(field)', 'field.addTip', 'field.focusNewItemId') + .col-sm-12(ng-show='(#{fieldMdl} && #{fieldMdl}.length > 0) || tableNewItemActive(field)') + .col-sm-6 + .table-details + table.links-edit.col-sm-12(st-table=fieldMdl) + tbody + tr(ng-repeat='item in #{fieldMdl}') + td.col-sm-12 + div(ng-show='!tableEditing(field, $index)') + a.labelFormField(ng-click='curField = tableStartEdit(backupItem, field, $index); curDatabaseName = curField.databaseName; curDatabaseType = curField.databaseType; curJavaName = curField.javaName; curJavaType = curField.javaType') {{$index + 1}}) {{item.databaseName}} / {{item.databaseType}} / {{item.javaName}} / {{item.javaType}} + +btn-remove('tableRemove(backupItem, field, $index)', 'field.removeTip') + div(ng-if='tableEditing(field, $index)') + label.labelField {{$index + 1}}) + +btn-save('tableDbFieldSaveVisible(curDatabaseName, curDatabaseType, curJavaName, curJavaType)', 'tableDbFieldSave(field, curDatabaseName, curDatabaseType, curJavaName, curJavaType, $index)') + +table-db-field-edit('curDatabaseName', 'curDatabaseType', 'curJavaName', 'curJavaType') + tfoot(ng-show='tableNewItemActive(field)') + tr + td.col-sm-12 + +btn-save('tableDbFieldSaveVisible(newDatabaseName, newDatabaseType, newJavaName, newJavaType)', 'tableDbFieldSave(field, newDatabaseName, newDatabaseType, newJavaName, newJavaType, -1)') + +table-db-field-edit('newDatabaseName', 'newDatabaseType', 'newJavaName', 'newJavaType') + div(ng-switch-when='queryGroups' ng-hide=fieldHide) + .col-sm-6 + label.table-header {{::field.label}}: + +tipLabel('field.tip') + +btn-add('tableNewItem(field)', 'field.addTip', 'newGroupId') + .col-sm-12(ng-show='(#{fieldMdl} && #{fieldMdl}.length > 0) || tableNewItemActive(field)') + .col-sm-6 + .table-details + table.links-edit.col-sm-12(st-table=fieldMdl ng-init='newDirection = false') + tbody + tr(ng-repeat='group in #{fieldMdl}') + td.col-sm-12 + div + .col-sm-12(ng-show='!tableEditing(field, $index)') + a.labelFormField(event-focus='click' event-focus-id='curGroupId' ng-click='curGroup = tableStartEdit(backupItem, field, $index); curGroupName = curGroup.name; curFields = curGroup.fields') {{$index + 1}}) {{group.name}} + +btn-remove('tableRemove(backupItem, field, $index)', 'field.removeTip') + +btn-add('tableGroupNewItem($index)', 'field.addItemTip', 'newGroupItemId') + div(ng-if='tableEditing(field, $index)') + label.labelField {{$index + 1}}) + +btn-save('tableGroupSaveVisible(curGroupName)', 'tableGroupSave(curGroupName, $index)') + .input-tip + input#curGroupId.form-control(type='text' ng-model='curGroupName' placeholder='Index name' ng-enter='tableGroupSaveVisible(curGroupName) && tableGroupSave(curGroupName, $index)' ng-escape='tableReset()') + div + table.links-edit.col-sm-12(st-table='group.fields' ng-init='groupIndex = $index') + tbody + tr(ng-repeat='groupItem in group.fields') + td + div(ng-show='!tableGroupItemEditing(groupIndex, $index)') + a.labelFormField(event-focus='click' event-focus-id='curGroupItemId' ng-click='curGroupItem = tableGroupItemStartEdit(groupIndex, $index); curFieldName = curGroupItem.name; curClassName = curGroupItem.className; curDirection = curGroupItem.direction') {{$index + 1}}) {{groupItem.name}} / {{groupItem.className}} / {{groupItem.direction ? "DESC" : "ASC"}} + +btn-remove('tableRemoveGroupItem(group, $index)', 'field.removeItemTip') + div(ng-if='tableGroupItemEditing(groupIndex, $index)') + label.labelField {{$index + 1}}) + +btn-save('tableGroupItemSaveVisible(curFieldName, curClassName)', 'tableGroupItemSave(curFieldName, curClassName, curDirection, groupIndex, $index)') + +table-group-item-edit('curFieldName', 'curClassName', 'curDirection', 'curGroupItemId') + tfoot(ng-if='tableGroupNewItemActive(groupIndex)') + tr.col-sm-12(style='padding-left: 18px') + td + +btn-save('tableGroupItemSaveVisible(newFieldName, newClassName)', 'tableGroupItemSave(newFieldName, newClassName, newDirection, groupIndex, -1)') + +table-group-item-edit('newFieldName', 'newClassName', 'newDirection', 'newGroupItemId') + tfoot(ng-show='tableNewItemActive(field)') + tr + td.col-sm-12 + +btn-save('tableGroupSaveVisible(newGroupName)', 'tableGroupSave(newGroupName, -1)') + .input-tip + input#newGroupId.form-control(type='text' ng-model='newGroupName' placeholder='Group name' ng-enter='tableGroupSaveVisible(newGroupName) && tableGroupSave(newGroupName, -1)' ng-escape='tableReset()') \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/control-center-web/src/main/js/views/includes/footer.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/includes/footer.jade b/modules/control-center-web/src/main/js/views/includes/footer.jade new file mode 100644 index 0000000..d8ff5d7 --- /dev/null +++ b/modules/control-center-web/src/main/js/views/includes/footer.jade @@ -0,0 +1,22 @@ +//- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +.container.container-footer + footer + center + p Apache Ignite Control Center, version 1.0.0 + p © 2015 The Apache Software Foundation. + p Apache, Apache Ignite, the Apache feather and the Apache Ignite logo are trademarks of The Apache Software Foundation. \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/control-center-web/src/main/js/views/includes/header.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/includes/header.jade b/modules/control-center-web/src/main/js/views/includes/header.jade new file mode 100644 index 0000000..bfd5275 --- /dev/null +++ b/modules/control-center-web/src/main/js/views/includes/header.jade @@ -0,0 +1,39 @@ +//- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +mixin header-item(active, ref, txt) + li + a(ng-class='{active: isActive("#{active}")}' href='#{ref}') #{txt} + +header.header(id='header') + .viewedUser(ng-show='becomeUsed') Currently assuming " + strong {{user.username}} + | ", + a(href='/admin/become') revert to your identity. + .container + h1.navbar-brand + a(href='/') Apache Ignite Web Configurator + .navbar-collapse.collapse(ng-controller='auth') + ul.nav.navbar-nav(ng-controller='activeLink' ng-show='user') + +header-item('/configuration', '/configuration/clusters', 'Configuration') + //+header-item('/monitoring', '/monitoring', 'Monitoring') + +header-item('/sql', '/sql', 'SQL') + //+header-item('/deploy', '/deploy', 'Deploy') + ul.nav.navbar-nav.pull-right + li(ng-if='user') + a.dropdown-toggle(data-toggle='dropdown' bs-dropdown='userDropdown' data-placement='bottom-right') {{user.username}} + span.caret + li.nav-login(ng-if='!user') + a(ng-click='login()' href='#') Log In \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/control-center-web/src/main/js/views/index.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/index.jade b/modules/control-center-web/src/main/js/views/index.jade new file mode 100644 index 0000000..999c4f8 --- /dev/null +++ b/modules/control-center-web/src/main/js/views/index.jade @@ -0,0 +1,30 @@ +//- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +extends templates/layout + +block container + .row + .docs-content + div + p + | Apache Ignite<sup>tm</sup> In-Memory Data Fabric is a high-performance, + | integrated and distributed in-memory platform for computing and transacting on large-scale data + | sets in real-time, orders of magnitude faster than possible with traditional disk-based or flash technologies. + .block-image.block-display-image + img(ng-src='https://www.filepicker.io/api/file/lydEeGB6Rs9hwbpcQxiw' alt='Apache Ignite stack') + .text-center(ng-controller='auth') + button.btn.btn-primary(ng-click='login()' href='#') Configure Now http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/control-center-web/src/main/js/views/login.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/login.jade b/modules/control-center-web/src/main/js/views/login.jade new file mode 100644 index 0000000..a580c01 --- /dev/null +++ b/modules/control-center-web/src/main/js/views/login.jade @@ -0,0 +1,55 @@ +//- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +mixin lbl(txt) + label.col-sm-3.required #{txt} + +.modal.center(role='dialog') + .modal-dialog + .modal-content + .modal-header.header + div(id='errors-container') + button.close(type='button' ng-click='$hide()' aria-hidden='true') × + h1.navbar-brand + a(href='/') Apache Ignite Web Configurator + h4.modal-title(style='padding-right: 55px') Authentication + p(style='padding-right: 55px') Log in or register in order to collaborate + form.form-horizontal(name='loginForm') + .modal-body.row + .col-sm-9.login.col-sm-offset-1 + .details-row(ng-show='action == "register"') + +lbl('Full Name:') + .col-sm-9 + input.form-control(type='text' ng-model='user_info.username' placeholder='John Smith' focus-me='action=="register"' ng-required='action=="register"') + .details-row + +lbl('Email:') + .col-sm-9 + input.form-control(type='email' ng-model='user_info.email' placeholder='y...@domain.com' focus-me='action=="login"' required) + .details-row + +lbl('Password:') + .col-sm-9 + input.form-control(type='password' ng-model='user_info.password' placeholder='Password' required ng-enter='action == "login" && auth(action, user_info)') + .details-row(ng-show='action == "register"') + +lbl('Confirm:') + .col-sm-9.input-tip.has-feedback + input.form-control(type='password' ng-model='user_info.confirm' match='user_info.password' placeholder='Confirm password' required ng-enter='auth(action, user_info)') + + .modal-footer + a.show-signup.ng-hide(ng-show='action != "login"' ng-click='action = "login";') log in + a.show-signup(ng-show='action != "register"' ng-click='action = "register"') sign up + | or + button.btn.btn-primary(ng-show='action == "login"' ng-click='auth(action, user_info)') Log In + button.btn.btn-primary(ng-show='action == "register"' ng-disabled='loginForm.$invalid || user_info.password != user_info.confirm' ng-click='auth(action, user_info)') Sign Up http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/control-center-web/src/main/js/views/settings/admin.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/settings/admin.jade b/modules/control-center-web/src/main/js/views/settings/admin.jade new file mode 100644 index 0000000..8345bb9 --- /dev/null +++ b/modules/control-center-web/src/main/js/views/settings/admin.jade @@ -0,0 +1,58 @@ +//- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +extends ../templates/layout + +append scripts + script(src='/admin-controller.js') + +block container + .row(ng-controller='adminController') + .docs-content + .docs-header + h1 List of registered users + hr + .docs-body + table.table.table-striped.admin(st-table='displayedUsers' st-safe-src='users') + thead + tr + th.header(colspan='5') + .col-sm-2.pull-right + input.form-control(type='text' st-search='' placeholder='Filter users...') + tr + th(st-sort='username') User name + th(st-sort='email') Email + th.col-sm-2(st-sort='lastLogin') Last login + th(width='1%' st-sort='admin') Admin + th(width='1%') Actions + tbody + tr(ng-repeat='row in displayedUsers') + td {{row.username}} + td + a(ng-href='mailto:{{row.email}}') {{row.email}} + td + span {{row.lastLogin | date:'medium'}} + td(style='text-align: center;') + input(type='checkbox' ng-disabled='row.adminChanging || row._id == user._id' + ng-model='row.admin' ng-change='toggleAdmin(row)') + td(style='text-align: center;') + a(ng-click='removeUser(row)' ng-show='row._id != user._id' bs-tooltip data-title='Remove user') + i.fa.fa-remove + a(style='margin-left: 5px' ng-href='admin/become?viewedUserId={{row._id}}' ng-show='row._id != user._id' bs-tooltip data-title='Become this user') + i.fa.fa-eye + tfoot + tr + td.text-right(colspan='5') + div(st-pagination st-items-by-page='15' st-displayed-pages='5') + http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/control-center-web/src/main/js/views/settings/profile.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/settings/profile.jade b/modules/control-center-web/src/main/js/views/settings/profile.jade new file mode 100644 index 0000000..6ddcafa --- /dev/null +++ b/modules/control-center-web/src/main/js/views/settings/profile.jade @@ -0,0 +1,58 @@ +//- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +extends ../templates/layout + +mixin lbl(txt) + label.col-sm-2.required.labelFormField #{txt} + +append scripts + script(src='/profile-controller.js') + +block container + .row(ng-controller='profileController') + .docs-content + .docs-header + h1 User profile + hr + .docs-body + form.form-horizontal(name='profileForm' novalidate) + .col-sm-10(style='padding: 0') + .details-row + +lbl('User name:') + .col-sm-4 + input.form-control(type='text' ng-model='profileUser.username' placeholder='Input name' required) + .details-row + +lbl('Email:') + .col-sm-4 + input.form-control(type='email' ng-model='profileUser.email' placeholder='y...@domain.com' required) + .details-row + .checkbox + label + input(type='checkbox' ng-model='profileUser.changePassword') + | Change password + div(ng-show='profileUser.changePassword') + .details-row + +lbl('New password:') + .col-sm-4 + input.form-control(type='password' ng-model='profileUser.newPassword' placeholder='New password' ng-required='profileUser.changePassword') + .details-row + +lbl('Confirm:') + .col-sm-4 + input.form-control(type='password' ng-model='profileUser.confirmPassword' match='profileUser.newPassword' placeholder='Confirm new password' ng-required='profileUser.changePassword') + .col-sm-12.details-row + button.btn.btn-primary(ng-disabled='profileForm.$invalid' ng-click='saveUser()') Save + http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/control-center-web/src/main/js/views/sql/sql.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/sql/sql.jade b/modules/control-center-web/src/main/js/views/sql/sql.jade new file mode 100644 index 0000000..97d34de --- /dev/null +++ b/modules/control-center-web/src/main/js/views/sql/sql.jade @@ -0,0 +1,85 @@ +//- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +extends ../templates/layout + +append scripts + script(src='/sql-controller.js') + + script(src='//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/theme-chrome.js') + script(src='//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/mode-sql.js') + script(src='//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/ext-language_tools.js') + +block container + .row + .col-sm-12 + .docs-content + .docs-header + h1 Connect to Ignite and Execute SQL Queries + hr + .docs-body(ng-controller='sqlController') + - var tab = 'tabs[tabs.activeIdx]' + + .block-callout-parent.block-callout-border.margin-bottom-dflt + .block-callout + p(ng-bind-html='joinTip(screenTip)') + .tabs-below(bs-tabs bs-active-pane='tabs.activeIdx' data-template='/tab') + div(ng-repeat='tab in tabs' title='Query' bs-pane) + .row + .col-sm-9(style='border-right: 1px solid #eee') + div(style='height: 200px' ui-ace='{ theme: "chrome", mode: "sql",' + + 'require: ["ace/ext/language_tools"],' + + 'rendererOptions: {showPrintMargin: false, highlightGutterLine: false, fontSize: 14},' + + 'advanced: {enableSnippets: false, enableBasicAutocompletion: true, enableLiveAutocompletion: true}}' ng-model='#{tab}.query') + .col-sm-3 + div(ng-hide='caches.length == 0' style='margin-top: 0.65em') + lable.labelHeader Caches: + table.links(st-table='caches') + tbody + tr(ng-repeat='row in caches track by row._id') + td.col-sm-6(ng-class='{active: row._id == #{tab}.selectedItem._id}') + a(ng-click='#{tab}.selectedItem = row') {{$index + 1}}) {{row.name}}, {{row.mode | displayValue:modes:'Cache mode not set'}} + hr(style='margin: 0') + .settings-row + label Page Size: + button.btn.btn-default.base-control(ng-init='pageSize = pageSizes[0]' ng-model='pageSize' bs-options='item for item in pageSizes' bs-select) + .settings-row + button.btn.btn-primary(ng-click='') Explain + button.btn.btn-primary(ng-click='') Execute + button.btn.btn-primary(ng-click='' disabled) Scan + + div(ng-show='#{tab}.rows.length > 0' style='margin-top: 0.65em') + hr + div + table.table.table-striped.col-sm-12.sql-results(st-table='rows' st-safe-src='#{tab}.rows') + thead + tr(style='border-size: 0') + td(colspan='{{#{tab}.cols.length}}') + .col-sm-8 + lable Page #: + b {{#{tab}.page}} + | Results: + b {{#{tab}.rows.length + #{tab}.total}} + .col-sm-4 + button.btn.btn-primary.fieldButton(ng-click='') Next page + .input-tip + input.form-control(type='text' st-search='' placeholder='Filter...') + + tr + th(ng-repeat='column in #{tab}.cols' st-sort='{{column}}') {{column}} + tbody + //tr + // td(colspan='{{#{tab}.cols.length}}') + // .loading-indicator + tr(ng-repeat='row in rows') + td(ng-repeat='column in #{tab}.cols') {{row[column]}} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/control-center-web/src/main/js/views/templates/confirm.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/templates/confirm.jade b/modules/control-center-web/src/main/js/views/templates/confirm.jade new file mode 100644 index 0000000..949318a --- /dev/null +++ b/modules/control-center-web/src/main/js/views/templates/confirm.jade @@ -0,0 +1,27 @@ +//- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +.modal(tabindex='-1' role='dialog') + .modal-dialog + .modal-content + .modal-header + button.close(type='button' ng-click='$hide()') × + h4.modal-title Confirmation + .modal-body(ng-show='content') + p(ng-bind-html='content' style='text-align: center;') + .modal-footer + button.btn.btn-default(type='button' ng-click='$hide()') Cancel + button.btn.btn-primary(type='button' ng-click='ok()') Confirm \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/control-center-web/src/main/js/views/templates/copy.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/templates/copy.jade b/modules/control-center-web/src/main/js/views/templates/copy.jade new file mode 100644 index 0000000..2ba9096 --- /dev/null +++ b/modules/control-center-web/src/main/js/views/templates/copy.jade @@ -0,0 +1,31 @@ +//- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +.modal(tabindex='-1' role='dialog') + .modal-dialog + .modal-content + .modal-header + button.close(type='button' ng-click='$hide()') × + h4.modal-title Copy + form.form-horizontal(name='inputForm' novalidate) + .modal-body.row + .col-sm-9.login.col-sm-offset-1 + label.required.labelFormField() New name: + .col-sm-9 + input.form-control(type='text' ng-model='newName' required) + .modal-footer + button.btn.btn-default(type='button' ng-click='$hide()') Cancel + button.btn.btn-primary(type='button' ng-disabled='inputForm.$invalid' ng-click='ok(newName)') Confirm \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/control-center-web/src/main/js/views/templates/layout.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/templates/layout.jade b/modules/control-center-web/src/main/js/views/templates/layout.jade new file mode 100644 index 0000000..71d8936 --- /dev/null +++ b/modules/control-center-web/src/main/js/views/templates/layout.jade @@ -0,0 +1,61 @@ +//- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +doctype html +html(ng-app='ignite-web-control-center' ng-init='user = #{JSON.stringify(user)}; becomeUsed = #{becomeUsed}') + head + title= title + + block css + // Bootstrap + link(rel='stylesheet', href='//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.4/css/bootstrap.css') + + // Font Awesome Icons + link(rel='stylesheet', href='//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.css') + + // Font + link(rel='stylesheet', href='//fonts.googleapis.com/css?family=Roboto+Slab:700:serif|Roboto+Slab:400:serif') + + link(rel='stylesheet', href='/stylesheets/style.css') + + block scripts + script(src='//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.js') + + script(src='//cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.0/lodash.min.js') + + script(src='//ajax.googleapis.com/ajax/libs/angularjs/1.4.2/angular.js') + script(src='//cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.2/angular-sanitize.js') + script(src='//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.3.0/angular-strap.js') + script(src='//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.3.0/angular-strap.tpl.min.js') + + script(src='//cdnjs.cloudflare.com/ajax/libs/angular-smart-table/2.0.3/smart-table.js') + + script(src='//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/ace.js') + script(src='//angular-ui.github.io/ui-ace/dist/ui-ace.min.js') + + script(src='/common-module.js') + script(src='/data-structures.js') + + body.theme-line.body-overlap.greedy + .wrapper + include ../includes/header + + block main-container + .container.body-container + .main-content + block container + + include ../includes/footer http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/control-center-web/src/main/js/views/templates/select.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/templates/select.jade b/modules/control-center-web/src/main/js/views/templates/select.jade new file mode 100644 index 0000000..b219f13 --- /dev/null +++ b/modules/control-center-web/src/main/js/views/templates/select.jade @@ -0,0 +1,26 @@ +//- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +ul.select.dropdown-menu(tabindex='-1' ng-show='$isVisible()' role='select') + li(role='presentation' ng-repeat='match in $matches') + hr(ng-if='match.value == undefined' style='margin: 5px 0') + a(style='cursor: default; padding: 3px 6px;' role='menuitem' tabindex='-1' ng-class='{active: $isActive($index)}' ng-click='$select($index, $event)') + i(class='{{$iconCheckmark}}' ng-if='$isActive($index)' ng-class='{active: $isActive($index)}' style='color: #ec1c24; margin-left: 15px; line-height: 20px; float: right;background-color: transparent;') + span(ng-bind='match.label') + li(ng-if='$showAllNoneButtons || ($isMultiple && $matches.length > 5)') + hr(style='margin: 5px 0') + a(ng-click='$selectAll()') {{$allText}} + a(ng-click='$selectNone()') {{$noneText}} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/control-center-web/src/main/js/views/templates/tab.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/templates/tab.jade b/modules/control-center-web/src/main/js/views/templates/tab.jade new file mode 100644 index 0000000..6c7afc5 --- /dev/null +++ b/modules/control-center-web/src/main/js/views/templates/tab.jade @@ -0,0 +1,26 @@ +//- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +ul.nav(ng-class='$navClass', role='tablist') + li(role='presentation' ng-repeat='$pane in $panes track by $index' ng-class='[ $isActive($pane, $index) ? $activeClass : "", $pane.disabled ? "disabled" : "" ]') + a(ng-if='$index == 0' role='tab' data-toggle='tab' ng-click='!$pane.disabled && $setActive($pane.name || $index)' data-index='{{ $index }}' aria-controls='$pane.title') {{$pane.title}} + i.fa.fa-remove(ng-click='removeTab($index)' ng-if='$index > 0' style='margin-left: 5px') + a(ng-if='$index > 0' role='tab' data-toggle='tab' ng-click='!$pane.disabled && $setActive($pane.name || $index)' data-index='{{ $index }}' aria-controls='$pane.title') {{$pane.title}}: {{$index}} + i.fa.fa-remove(ng-click='removeTab($index)' style='margin-left: 5px') + li.pull-right(bs-tooltip data-title='Add new query') + a(role='tab' data-toggle='tab' ng-click='addTab()') + i.fa.fa-plus +.tab-content(ng-transclude) http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/web-control-center/licenses/apache-2.0.txt ---------------------------------------------------------------------- diff --git a/modules/web-control-center/licenses/apache-2.0.txt b/modules/web-control-center/licenses/apache-2.0.txt deleted file mode 100644 index d645695..0000000 --- a/modules/web-control-center/licenses/apache-2.0.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/web-control-center/src/main/js/.gitignore ---------------------------------------------------------------------- diff --git a/modules/web-control-center/src/main/js/.gitignore b/modules/web-control-center/src/main/js/.gitignore deleted file mode 100644 index 65f2596..0000000 --- a/modules/web-control-center/src/main/js/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules -*.idea -*.log -*.css \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/web-control-center/src/main/js/DEVNOTES.txt ---------------------------------------------------------------------- diff --git a/modules/web-control-center/src/main/js/DEVNOTES.txt b/modules/web-control-center/src/main/js/DEVNOTES.txt deleted file mode 100644 index e8c558c..0000000 --- a/modules/web-control-center/src/main/js/DEVNOTES.txt +++ /dev/null @@ -1,21 +0,0 @@ -Ignite Web Control Center Instructions -====================================== - -How to deploy: - -1. Install locally NodeJS using installer from site https://nodejs.org for your OS. -2. Install locally MongoDB folow instructions from site http://docs.mongodb.org/manual/installation -3. Checkout ignite-843 branch. -4. Change directory '$IGNITE_HOME/modules/web-control-center/src/main/js'. -5. Run "npm install" in terminal for download all dependencies. - -Steps 1 - 5 should be executed once. - -How to run: - -1. Run MongoDB. - 1.1 In terminal change dir to $MONGO_ISNTALL_DIR/server/3.0/bin. - 1.2 Run "mongod". -2. In new terminal change directory '$IGNITE_HOME/modules/web-control-center/src/main/js'. -3. Start application by executing "npm start". -4. In browser open: http://localhost:3000 \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/web-control-center/src/main/js/app.js ---------------------------------------------------------------------- diff --git a/modules/web-control-center/src/main/js/app.js b/modules/web-control-center/src/main/js/app.js deleted file mode 100644 index a67afc8..0000000 --- a/modules/web-control-center/src/main/js/app.js +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var flash = require('connect-flash'); -var express = require('express'); -var path = require('path'); -var favicon = require('serve-favicon'); -var logger = require('morgan'); -var cookieParser = require('cookie-parser'); -var bodyParser = require('body-parser'); -var session = require('express-session'); -var mongoStore = require('connect-mongo')(session); - -var publicRoutes = require('./routes/public'); -var clustersRouter = require('./routes/clusters'); -var cachesRouter = require('./routes/caches'); -var metadataRouter = require('./routes/metadata'); -var summary = require('./routes/summary'); -var adminRouter = require('./routes/admin'); -var profileRouter = require('./routes/profile'); -var sqlRouter = require('./routes/sql'); - -var passport = require('passport'); - -var db = require('./db'); - -var app = express(); - -// Views engine setup. -app.set('views', path.join(__dirname, 'views')); -app.set('view engine', 'jade'); - -// Site favicon. -app.use(favicon(__dirname + '/public/favicon.ico')); - -app.use(logger('dev')); - -app.use(bodyParser.json()); -app.use(bodyParser.urlencoded({extended: false})); - -app.use(require('node-sass-middleware')({ - /* Options */ - src: path.join(__dirname, 'public'), - dest: path.join(__dirname, 'public'), - debug: true, - outputStyle: 'nested' -})); - -app.use(express.static(path.join(__dirname, 'public'))); -app.use(express.static(path.join(__dirname, 'controllers'))); -app.use(express.static(path.join(__dirname, 'helpers'))); - -app.use(cookieParser('keyboard cat')); - -app.use(session({ - secret: 'keyboard cat', - resave: false, - saveUninitialized: true, - store: new mongoStore({ - mongooseConnection: db.mongoose.connection - }) -})); - -app.use(flash()); - -app.use(passport.initialize()); -app.use(passport.session()); - -passport.serializeUser(db.Account.serializeUser()); -passport.deserializeUser(db.Account.deserializeUser()); - -passport.use(db.Account.createStrategy()); - -var mustAuthenticated = function (req, res, next) { - req.isAuthenticated() ? next() : res.redirect('/'); -}; - -var adminOnly = function(req, res, next) { - req.isAuthenticated() && req.user.admin ? next() : res.sendStatus(403); -}; - -app.all('/configuration/*', mustAuthenticated); - -app.all('*', function(req, res, next) { - var becomeUsed = req.session.viewedUser && req.user.admin; - - res.locals.user = becomeUsed ? req.session.viewedUser : req.user; - res.locals.becomeUsed = becomeUsed; - - req.currentUserId = function() { - if (!req.user) - return null; - - if (req.session.viewedUser && req.user.admin) - return req.session.viewedUser._id; - - return req.user._id; - }; - - next(); -}); - -app.use('/', publicRoutes); -app.use('/admin', mustAuthenticated, adminOnly, adminRouter); -app.use('/profile', mustAuthenticated, profileRouter); - -app.use('/configuration/clusters', clustersRouter); -app.use('/configuration/caches', cachesRouter); -app.use('/configuration/metadata', metadataRouter); -app.use('/configuration/summary', summary); -app.use('/sql', sqlRouter); - -// Catch 404 and forward to error handler. -app.use(function (req, res, next) { - var err = new Error('Not Found: ' + req.originalUrl); - err.status = 404; - next(err); -}); - -// Error handlers. - -// Development error handler: will print stacktrace. -if (app.get('env') === 'development') { - app.use(function (err, req, res) { - res.status(err.status || 500); - res.render('error', { - message: err.message, - error: err - }); - }); -} - -// Production error handler: no stacktraces leaked to user. -app.use(function (err, req, res) { - res.status(err.status || 500); - res.render('error', { - message: err.message, - error: {} - }); -}); - -module.exports = app; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/web-control-center/src/main/js/bin/www ---------------------------------------------------------------------- diff --git a/modules/web-control-center/src/main/js/bin/www b/modules/web-control-center/src/main/js/bin/www deleted file mode 100644 index 4cf0583..0000000 --- a/modules/web-control-center/src/main/js/bin/www +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ -var app = require('../app'); -var config = require('../helpers/configuration-loader.js'); -var debug = require('debug')('ignite-web-control-center:server'); -var http = require('http'); - -/** - * Get port from environment and store in Express. - */ -var port = normalizePort(process.env.PORT || config.get('express:port')); -app.set('port', port); - -/** - * Create HTTP server. - */ -var server = http.createServer(app); - -/** - * Listen on provided port, on all network interfaces. - */ -server.listen(port); -server.on('error', onError); -server.on('listening', onListening); - -/** - * Normalize a port into a number, string, or false. - */ -function normalizePort(val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; - } - - if (port >= 0) { - // port number - return port; - } - - return false; -} - -/** - * Event listener for HTTP server "error" event. - */ -function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } -} - -/** - * Event listener for HTTP server "listening" event. - */ -function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - - debug('Listening on ' + bind); -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/web-control-center/src/main/js/config/default.json ---------------------------------------------------------------------- diff --git a/modules/web-control-center/src/main/js/config/default.json b/modules/web-control-center/src/main/js/config/default.json deleted file mode 100644 index 72dbd4e..0000000 --- a/modules/web-control-center/src/main/js/config/default.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "express": { - "port": 3000 - }, - "mongoDB": { - "url": "mongodb://localhost/web-control-center" - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/web-control-center/src/main/js/controllers/admin-controller.js ---------------------------------------------------------------------- diff --git a/modules/web-control-center/src/main/js/controllers/admin-controller.js b/modules/web-control-center/src/main/js/controllers/admin-controller.js deleted file mode 100644 index 09490fe..0000000 --- a/modules/web-control-center/src/main/js/controllers/admin-controller.js +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -controlCenterModule.controller('adminController', ['$scope', '$http', '$common', '$confirm', function ($scope, $http, $common, $confirm) { - $scope.users = null; - - function reload() { - $http.post('admin/list') - .success(function (data) { - $scope.users = data; - }) - .error(function (errMsg) { - $common.showError($common.errorMessage(errMsg)); - }); - } - - reload(); - - $scope.removeUser = function (user) { - $confirm.show('Are you sure you want to remove user: "' + user.username + '"?').then(function () { - $http.post('admin/remove', {userId: user._id}).success( - function () { - var i = _.findIndex($scope.users, function (u) { - return u._id == user._id; - }); - - if (i >= 0) - $scope.users.splice(i, 1); - - $common.showInfo('User has been removed: "' + user.username + '"'); - }).error(function (errMsg) { - $common.showError('Failed to remove user: "' + $common.errorMessage(errMsg) + '"'); - }); - }); - }; - - $scope.toggleAdmin = function (user) { - if (user.adminChanging) - return; - - user.adminChanging = true; - - $http.post('admin/save', {userId: user._id, adminFlag: user.admin}).success( - function () { - $common.showInfo('Admin right was successfully toggled for user: "' + user.username + '"'); - - user.adminChanging = false; - }).error(function (errMsg) { - $common.showError('Failed to toggle admin right for user: "' + $common.errorMessage(errMsg) + '"'); - - user.adminChanging = false; - }); - } -}]); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/96522874/modules/web-control-center/src/main/js/controllers/cache-viewer-controller.js ---------------------------------------------------------------------- diff --git a/modules/web-control-center/src/main/js/controllers/cache-viewer-controller.js b/modules/web-control-center/src/main/js/controllers/cache-viewer-controller.js deleted file mode 100644 index 6e0c130..0000000 --- a/modules/web-control-center/src/main/js/controllers/cache-viewer-controller.js +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var demoResults = [ - { - id: 256, - s: 'com.foo.User@3213', - fields: { - id: 256, - firstName: 'Ivan', - lastName: 'Ivanov', - old: 23 - } - }, - - { - id: 384, - s: 'com.foo.User@23214', - fields: { - id: 384, - firstName: 'Sergey', - lastName: 'Petrov', - old: 28 - } - }, - - { - id: 923, - s: 'com.foo.User@93494', - fields: { - id: 923, - firstName: 'Andrey', - lastName: 'Sidorov', - old: 28 - } - } -]; - -var demoCaches = ['Users', 'Organizations', 'Cities']; - -controlCenterModule.controller('cacheViewerController', ['$scope', '$http', '$common', function ($scope, $http, $common) { - $scope.results = demoResults; - - $scope.caches = demoCaches; - - $scope.defCache = $scope.caches.length > 0 ? $scope.caches[0] : null; - - var sqlEditor = ace.edit('querySql'); - - sqlEditor.setOptions({ - highlightActiveLine: false, - showPrintMargin: false, - showGutter: true, - theme: "ace/theme/chrome", - mode: "ace/mode/sql", - fontSize: 14 - }); - - sqlEditor.setValue("select u.id from User u where u.name like 'aaaa';"); - - sqlEditor.selection.clearSelection() - -}]);