http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8e792605/modules/web-control-center/nodejs/utils/generatorXml.js ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/utils/generatorXml.js b/modules/web-control-center/nodejs/utils/generatorXml.js new file mode 100644 index 0000000..ae7ffbc --- /dev/null +++ b/modules/web-control-center/nodejs/utils/generatorXml.js @@ -0,0 +1,502 @@ +/* + * 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 generatorUtils = require("./generatorUtils"); +var dataStructures = require("../public/javascripts/dataStructures.js"); + +exports.generateClusterConfiguration = function(cluster) { + var res = generatorUtils.builder(); + + res.push('' + + '<?xml version="1.0" encoding="UTF-8"?>\n' + + '\n' + + '<!-- ' + generatorUtils.mainComment() + ' -->\n' + + '<beans xmlns="http://www.springframework.org/schema/beans"\n' + + ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n' + + ' xmlns:util="http://www.springframework.org/schema/util"\n' + + ' xsi:schemaLocation="http://www.springframework.org/schema/beans\n' + + ' http://www.springframework.org/schema/beans/spring-beans.xsd\n' + + ' http://www.springframework.org/schema/util\n' + + ' http://www.springframework.org/schema/util/spring-util.xsd">\n' + + ' <bean class="org.apache.ignite.configuration.IgniteConfiguration">\n'); + + res.deep = 2; + + if (cluster.discovery) { + res.startBlock('<property name="discoverySpi">'); + res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">'); + res.startBlock('<property name="ipFinder">'); + + var d = cluster.discovery; + + switch (d.kind) { + case 'Multicast': + res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">'); + + addProperty(res, d.Multicast, 'multicastGroup'); + addProperty(res, d.Multicast, 'multicastPort'); + addProperty(res, d.Multicast, 'responseWaitTime'); + addProperty(res, d.Multicast, 'addressRequestAttempts'); + addProperty(res, d.Multicast, 'localAddress'); + + res.endBlock('</bean>'); + + break; + + case 'Vm': + if (d.Vm.addresses.length > 0) { + res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">'); + + addListProperty(res, d.Vm, 'addresses'); + + res.endBlock('</bean>'); + } + else { + res.line('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder"/>'); + } + + break; + + case 'S3': + res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.s3.TcpDiscoveryS3IpFinder">'); + + if (d.S3 && d.S3.bucketName) + res.line('<property name="bucketName" value="' + escapeAttr(d.S3.bucketName) + '" />'); + + res.endBlock('</bean>'); + + break; + + case 'Cloud': + res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.cloud.TcpDiscoveryCloudIpFinder">'); + + addProperty(res, d.Cloud, 'credential'); + addProperty(res, d.Cloud, 'credentialPath'); + addProperty(res, d.Cloud, 'identity'); + addProperty(res, d.Cloud, 'provider'); + + res.endBlock('</bean>'); + + break; + + case 'GoogleStorage': + res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.gce.TcpDiscoveryGoogleStorageIpFinder">'); + + addProperty(res, d.GoogleStorage, 'projectName'); + addProperty(res, d.GoogleStorage, 'bucketName'); + addProperty(res, d.GoogleStorage, 'serviceAccountP12FilePath'); + + //if (d.GoogleStorage.addrReqAttempts) todo ???? + // res.line('<property name="serviceAccountP12FilePath" value="' + escapeAttr(d.GoogleStorage.addrReqAttempts) + '"/>'); + + res.endBlock('</bean>'); + + break; + + case 'Jdbc': + res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.jdbc.TcpDiscoveryJdbcIpFinder">'); + res.line('<property name="initSchema" value="' + (d.Jdbc.initSchema != null || d.Jdbc.initSchema) + '"/>'); + res.endBlock('</bean>'); + + break; + + case 'SharedFs': + if (d.SharedFs.path) { + res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.sharedfs.TcpDiscoverySharedFsIpFinder">'); + addProperty(res, d.SharedFs, 'path'); + res.endBlock('</bean>'); + } + else { + res.line('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.sharedfs.TcpDiscoverySharedFsIpFinder"/>'); + } + + break; + + default: + throw "Unknown discovery kind: " + d.kind; + } + + res.endBlock('</property>'); + res.endBlock('</bean>'); + res.endBlock('</property>'); + + res.needEmptyLine = true + } + + if (cluster.caches && cluster.caches.length > 0) { + res.emptyLineIfNeeded(); + + res.startBlock('<property name="cacheConfiguration">'); + res.startBlock('<list>'); + + for (var i = 0; i < cluster.caches.length; i++) { + if (i > 0) + res.line(); + + generateCacheConfiguration(cluster.caches[i], res); + } + + res.endBlock('</list>'); + res.endBlock('</property>'); + + res.needEmptyLine = true; + } + + if (cluster.includeEventTypes && cluster.includeEventTypes.length > 0) { + res.emptyLineIfNeeded(); + + res.startBlock('<property name="includeEventTypes">'); + + if (cluster.includeEventTypes.length == 1) { + res.line('<util:constant static-field="org.apache.ignite.events.EventType.' + cluster.includeEventTypes[0] + '"/>') + } + else { + res.startBlock('<array>'); + + for (i = 0; i < cluster.includeEventTypes.length; i++) { + if (i > 0) + res.line(); + + var eventGroup = cluster.includeEventTypes[i]; + + res.line('<!-- EventType.' + eventGroup + ' -->'); + + var eventList = dataStructures.eventGroups[eventGroup]; + + for (var k = 0; k < eventList.length; k++) { + res.line('<util:constant static-field="org.apache.ignite.events.EventType.' + eventList[k] + '"/>') + } + } + + res.endBlock('</array>'); + } + + res.endBlock('</property>'); + + res.needEmptyLine = true; + } + + addBeanWithProperties(res, cluster.atomicConfiguration, 'atomicConfiguration', + generatorUtils.atomicConfiguration.className, generatorUtils.atomicConfiguration.fields); + + res.needEmptyLine = true; + + addProperty(res, cluster, 'networkTimeout'); + addProperty(res, cluster, 'networkSendRetryDelay'); + addProperty(res, cluster, 'networkSendRetryCount'); + addProperty(res, cluster, 'segmentCheckFrequency'); + addProperty(res, cluster, 'waitForSegmentOnStart'); + addProperty(res, cluster, 'discoveryStartupDelay'); + + res.needEmptyLine = true; + + addProperty(res, cluster, 'deploymentMode'); + + res.needEmptyLine = true; + + addProperty(res, cluster, 'marshalLocalJobs'); + addProperty(res, cluster, 'marshCacheKeepAliveTime'); + addProperty(res, cluster, 'marshCachePoolSize'); + + res.needEmptyLine = true; + + addProperty(res, cluster, 'metricsExpireTime'); + addProperty(res, cluster, 'metricsHistorySize'); + addProperty(res, cluster, 'metricsLogFrequency'); + addProperty(res, cluster, 'metricsUpdateFrequency'); + + res.needEmptyLine = true; + + addProperty(res, cluster, 'peerClassLoadingEnabled'); + addListProperty(res, cluster, 'peerClassLoadingLocalClassPathExclude'); + addProperty(res, cluster, 'peerClassLoadingMissedResourcesCacheSize'); + addProperty(res, cluster, 'peerClassLoadingThreadPoolSize'); + + res.needEmptyLine = true; + + if (cluster.swapSpaceSpi && cluster.swapSpaceSpi.kind == 'FileSwapSpaceSpi') { + addBeanWithProperties(res, cluster.swapSpaceSpi.FileSwapSpaceSpi, 'swapSpaceSpi', + generatorUtils.swapSpaceSpi.className, generatorUtils.swapSpaceSpi.fields, true); + + res.needEmptyLine = true; + } + + addProperty(res, cluster, 'clockSyncSamples'); + addProperty(res, cluster, 'clockSyncFrequency'); + addProperty(res, cluster, 'timeServerPortBase'); + addProperty(res, cluster, 'timeServerPortRange'); + + res.needEmptyLine = true; + + addProperty(res, cluster, 'publicThreadPoolSize'); + addProperty(res, cluster, 'systemThreadPoolSize'); + addProperty(res, cluster, 'managementThreadPoolSize'); + addProperty(res, cluster, 'igfsThreadPoolSize'); + + res.needEmptyLine = true; + + addBeanWithProperties(res, cluster.transactionConfiguration, 'transactionConfiguration', + generatorUtils.transactionConfiguration.className, generatorUtils.transactionConfiguration.fields); + + res.needEmptyLine = true; + + addProperty(res, cluster, 'cacheSanityCheckEnabled'); + + res.needEmptyLine = true; + + addProperty(res, cluster, 'utilityCacheKeepAliveTime'); + addProperty(res, cluster, 'utilityCachePoolSize'); + + res.push(' </bean>\n'); + res.push('</beans>'); + + return res.join(''); +}; + +function createEvictionPolicy(res, evictionPolicy, propertyName) { + if (evictionPolicy && evictionPolicy.kind) { + var e = generatorUtils.evictionPolicies[evictionPolicy.kind]; + + var obj = evictionPolicy[evictionPolicy.kind.toUpperCase()]; + + addBeanWithProperties(res, obj, propertyName, e.className, e.fields, true); + } +} + +function generateCacheConfiguration(cacheCfg, res) { + if (!res) + res = generatorUtils.builder(); + + res.startBlock('<bean class="org.apache.ignite.configuration.CacheConfiguration">'); + + addProperty(res, cacheCfg, 'name'); + + res.needEmptyLine = true; + + addProperty(res, cacheCfg, 'mode', 'cacheMode'); + + addProperty(res, cacheCfg, 'atomicityMode'); + addProperty(res, cacheCfg, 'backups'); + + res.needEmptyLine = true; + + addProperty(res, cacheCfg, 'memoryMode'); + addProperty(res, cacheCfg, 'offHeapMaxMemory'); + addProperty(res, cacheCfg, 'swapEnabled'); + + res.needEmptyLine = true; + + createEvictionPolicy(res, cacheCfg.evictionPolicy, 'evictionPolicy'); + + res.needEmptyLine = true; + + if (cacheCfg.nearConfiguration && (cacheCfg.nearConfiguration.nearStartSize || cacheCfg.nearConfiguration.nearEvictionPolicy.kind)) { + res.emptyLineIfNeeded(); + + res.startBlock('<property name="nearConfiguration">'); + res.startBlock('<bean class="org.apache.ignite.configuration.NearCacheConfiguration">'); + + addProperty(res, cacheCfg.nearConfiguration, 'nearStartSize'); + + createEvictionPolicy(res, cacheCfg.nearConfiguration.nearEvictionPolicy, 'nearEvictionPolicy'); + + res.endBlock('</bean>'); + res.endBlock('</property>'); + } + + res.needEmptyLine = true; + + addProperty(res, cacheCfg, 'sqlEscapeAll'); + addProperty(res, cacheCfg, 'sqlOnheapRowCacheSize'); + addProperty(res, cacheCfg, 'longQueryWarningTimeout'); + + if (cacheCfg.indexedTypes && cacheCfg.indexedTypes.length > 0) { + res.startBlock('<property name="indexedTypes">'); + res.startBlock('<array>'); + + for (var i = 0; i < cacheCfg.indexedTypes.length; i++) { + var pair = cacheCfg.indexedTypes[i]; + + res.line('<value>' + escape(pair.keyClass) + '</value>'); + res.line('<value>' + escape(pair.valueClass) + '</value>'); + } + + res.endBlock('</array>'); + res.endBlock('</property>'); + } + + addListProperty(res, cacheCfg, 'sqlFunctionClasses', 'array'); + + res.needEmptyLine = true; + + addProperty(res, cacheCfg, 'rebalanceMode'); + addProperty(res, cacheCfg, 'rebalanceThreadPoolSize'); + addProperty(res, cacheCfg, 'rebalanceBatchSize'); + addProperty(res, cacheCfg, 'rebalanceOrder'); + addProperty(res, cacheCfg, 'rebalanceDelay'); + addProperty(res, cacheCfg, 'rebalanceTimeout'); + addProperty(res, cacheCfg, 'rebalanceThrottle'); + + res.needEmptyLine = true; + + if (cacheCfg.cacheStoreFactory && cacheCfg.cacheStoreFactory.kind) { + var obj = cacheCfg.cacheStoreFactory[cacheCfg.cacheStoreFactory.kind]; + var data = generatorUtils.storeFactories[cacheCfg.cacheStoreFactory.kind]; + + addBeanWithProperties(res, obj, 'cacheStoreFactory', data.className, data.fields, true); + } + + res.needEmptyLine = true; + + addProperty(res, cacheCfg, 'invalidate'); + addProperty(res, cacheCfg, 'defaultLockTimeout'); + addProperty(res, cacheCfg, 'transactionManagerLookupClassName'); + + res.needEmptyLine = true; + + addProperty(res, cacheCfg, 'writeBehindEnabled'); + addProperty(res, cacheCfg, 'writeBehindBatchSize'); + addProperty(res, cacheCfg, 'writeBehindFlushSize'); + addProperty(res, cacheCfg, 'writeBehindFlushFrequency'); + addProperty(res, cacheCfg, 'writeBehindFlushThreadCount'); + + res.needEmptyLine = true; + + addProperty(res, cacheCfg, 'statisticsEnabled'); + addProperty(res, cacheCfg, 'managementEnabled'); + addProperty(res, cacheCfg, 'readFromBackup'); + addProperty(res, cacheCfg, 'copyOnRead'); + addProperty(res, cacheCfg, 'maxConcurrentAsyncOperations'); + + res.endBlock('</bean>'); + + return res; +} + +exports.generateCacheConfiguration = generateCacheConfiguration; + +function addProperty(res, obj, propName, setterName) { + var val = obj[propName]; + + if (val) { + res.emptyLineIfNeeded(); + + res.line('<property name="' + (setterName ? setterName : propName) + '" value="' + escapeAttr(val) + '"/>'); + } +} + +function addBeanWithProperties(res, bean, beanPropName, beanClass, props, createBeanAlthoughNoProps) { + if (!bean) + return; + + if (generatorUtils.hasProperty(bean, props)) { + res.emptyLineIfNeeded(); + res.startBlock('<property name="' + beanPropName + '">'); + res.startBlock('<bean class="' + beanClass + '">'); + + for (var propName in props) { + if (props.hasOwnProperty(propName)) { + var descr = props[propName]; + + if (descr) { + if (descr.type == 'list') { + addListProperty(res, bean, propName, descr.setterName); + } + else if (descr.type == 'className') { + if (bean[propName]) { + res.startBlock('<property name="' + propName + '">'); + res.line('<bean class="' + generatorUtils.knownClasses[bean[propName]].className + '"/>'); + res.endBlock('</property>'); + } + } + else if (descr.type == 'propertiesAsList') { + var val = bean[propName]; + + if (val && val.length > 0) { + res.startBlock('<property name="' + propName + '">'); + res.startBlock('<props>'); + + for (var i = 0; i < val.length; i++) { + var nameAndValue = val[i]; + + var eqIndex = nameAndValue.indexOf('='); + if (eqIndex >= 0) { + res.line('<prop key="' + escapeAttr(nameAndValue.substring(0, eqIndex)) + '">' + + + escape(nameAndValue.substr(eqIndex + 1)) + '</prop>'); + } + } + + res.endBlock('</props>'); + res.endBlock('</property>'); + } + } + else { + addProperty(res, bean, propName, descr.setterName); + } + } + else { + addProperty(res, bean, propName); + } + } + } + + res.endBlock('</bean>'); + res.endBlock('</property>'); + } + else if (createBeanAlthoughNoProps) { + res.emptyLineIfNeeded(); + res.line('<property name="' + beanPropName + '">'); + res.line(' <bean class="' + beanClass + '"/>'); + res.line('</property>'); + } +} +function addListProperty(res, obj, propName, listType, rowFactory) { + var val = obj[propName]; + + if (val && val.length > 0) { + res.emptyLineIfNeeded(); + + if (!listType) + listType = 'list'; + + if (!rowFactory) + rowFactory = function(val) { return '<value>' + escape(val) + '</value>' }; + + res.startBlock('<property name="' + propName + '">'); + res.startBlock('<' + listType + '>'); + + for (var i = 0; i < val.length; i++) + res.line(rowFactory(val[i])); + + res.endBlock('</' + listType + '>'); + res.endBlock('</property>'); + } +} + +function escapeAttr(s) { + if (typeof(s) != 'string') + return s; + + return s.replace(/&/g, '&').replace(/"/g, '"'); +} + +function escape(s) { + if (typeof(s) != 'string') + return s; + + return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); +}
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8e792605/modules/web-control-center/nodejs/views/caches.jade ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/views/caches.jade b/modules/web-control-center/nodejs/views/caches.jade new file mode 100644 index 0000000..d6bda10 --- /dev/null +++ b/modules/web-control-center/nodejs/views/caches.jade @@ -0,0 +1,68 @@ +//- + 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 layout-sidebar + +append scripts + script(src='/javascripts/controllers/caches.js') + +include includes/controls + +block content + .docs-header + h1 Caches + p Create and configure Ignite caches. + hr + .docs-body(ng-controller='cachesController') + .links(ng-hide='caches.length == 0') + table.col-sm-12(st-table='caches') + tbody + tr(ng-repeat='row in caches track by row._id') + td.col-sm-6(ng-class='{active: row._id == selectedItem._id}') + a(ng-click='selectItem(row)') {{$index + 1}}. {{row.name}}, {{row.mode | displayValue:modes:'Cache mode not set'}}, {{row.atomicityMode | displayValue:atomicities:'Cache atomicity not set'}} + button.btn.btn-primary(ng-click='createItem()') Add cache + hr + form.form-horizontal(name='inputForm' ng-if='backupItem' novalidate) + div(bs-collapse data-start-collapsed='false') + .panel.panel-default + .panel-heading + h3 + a(bs-collapse-toggle) General + .panel-collapse(bs-collapse-target) + .panel-body + .settings-row(ng-repeat='field in general') + +form-row + div(bs-collapse data-start-collapsed='true') + .panel-title(ng-show='expanded') + h3 + a(bs-collapse-toggle='0' ng-click='expanded = !expanded;') {{expanded ? 'Hide advanced settings...' : 'Show advanced settings...'}} + .panel-collapse(bs-collapse-target) + .span(bs-collapse data-start-collapsed='true' data-allow-multiple='true') + .panel.panel-default(ng-repeat='group in advanced') + .panel-heading + h3 + a(bs-collapse-toggle) {{group.label}} + i.tipLabel.fa.fa-question-circle(ng-if='group.tip' bs-tooltip='joinTip(group.tip)' type='button') + i.tipLabel.fa.fa-question-circle.blank(ng-if='!group.tip') + .panel-collapse(bs-collapse-target) + .panel-body + .settings-row(ng-repeat='field in group.fields') + +form-row + .panel-title + h3 + a(bs-collapse-toggle='0' ng-click='expanded = !expanded;') {{expanded ? 'Hide advanced settings...' : 'Show advanced settings...'}} + button#save-btn.btn.btn-primary(ng-disabled='inputForm.$invalid' ng-click='saveItem()') Save + button.btn.btn-primary.btn-second(ng-show='backupItem._id' ng-click='removeItem()') Remove http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8e792605/modules/web-control-center/nodejs/views/clients.jade ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/views/clients.jade b/modules/web-control-center/nodejs/views/clients.jade new file mode 100644 index 0000000..6b55449 --- /dev/null +++ b/modules/web-control-center/nodejs/views/clients.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. + +extends layout-sidebar +block head +block content + .docs-header + h1 Clients + p Create and configure Ignite clients. + hr + .docs-body(ng-controller='clientsRouter') +block body + script(src='/javascripts/controllers/clients.js') \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8e792605/modules/web-control-center/nodejs/views/clusters.jade ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/views/clusters.jade b/modules/web-control-center/nodejs/views/clusters.jade new file mode 100644 index 0000000..8bb8ef9 --- /dev/null +++ b/modules/web-control-center/nodejs/views/clusters.jade @@ -0,0 +1,71 @@ +//- + 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 layout-sidebar + +append scripts + script(src='/javascripts/controllers/clusters.js') + +include includes/controls + +block content + .docs-header + h1 Clusters + p Create and configure Ignite clusters. + hr + .docs-body(ng-controller='clustersController') + .links(ng-hide='clusters.length == 0') + table.col-sm-12(st-table='clusters') + tbody + tr(ng-repeat='row in clusters track by row._id') + td.col-sm-6(ng-class='{active: row._id == selectedItem._id}') + a(ng-click='selectItem(row)') {{$index + 1}}. {{row.name}}, {{row.discovery.kind | displayValue:discoveries:'Discovery not set'}} + button.btn.btn-primary(ng-click='createItem()' ng-disabled='!create.template')  Add cluster + label(style='margin-left: 15px; margin-right: 10px') Use template: + button.btn.btn-default(ng-init='create.template = templates[0].value' ng-model='create.template' data-template='/select' data-placeholder='Choose cluster template' 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) + div(bs-collapse data-start-collapsed='false') + .panel.panel-default + .panel-heading + h3 + a(bs-collapse-toggle) General + .panel-collapse(bs-collapse-target) + .panel-body + .settings-row(ng-repeat='field in general') + +form-row + div(bs-collapse data-start-collapsed='true') + .panel-title(ng-show='expanded') + h3 + a(bs-collapse-toggle='0' ng-click='expanded = !expanded;') {{expanded ? 'Hide advanced settings...' : 'Show advanced settings...'}} + .panel-collapse(bs-collapse-target) + .span(bs-collapse data-start-collapsed='true' data-allow-multiple='true') + .panel.panel-default(ng-repeat='group in advanced') + .panel-heading + h3 + a(bs-collapse-toggle) {{group.label}} + i.tipLabel.fa.fa-question-circle(ng-if='group.tip' bs-tooltip='joinTip(group.tip)' type='button') + i.tipLabel.fa.fa-question-circle.blank(ng-if='!group.tip') + .panel-collapse(bs-collapse-target) + .panel-body + .settings-row(ng-repeat='field in group.fields') + +form-row + .panel-title + h3 + a(bs-collapse-toggle='0' ng-click='expanded = !expanded;') {{expanded ? 'Hide advanced settings...' : 'Show advanced settings...'}} + button#save-btn.btn.btn-primary(ng-disabled='inputForm.$invalid' ng-click='saveItem()') Save + button.btn.btn-primary(ng-show='backupItem._id' ng-click='removeItem()') Remove \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8e792605/modules/web-control-center/nodejs/views/error.jade ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/views/error.jade b/modules/web-control-center/nodejs/views/error.jade new file mode 100644 index 0000000..cfa2ad1 --- /dev/null +++ b/modules/web-control-center/nodejs/views/error.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. + +extends layout + +block container + h1= message + h2= error.status + pre #{error.stack} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8e792605/modules/web-control-center/nodejs/views/includes/controls.jade ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/views/includes/controls.jade b/modules/web-control-center/nodejs/views/includes/controls.jade new file mode 100644 index 0000000..028b187 --- /dev/null +++ b/modules/web-control-center/nodejs/views/includes/controls.jade @@ -0,0 +1,193 @@ +//- + 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 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 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 details-row + - var lblDetailClasses = ['col-sm-4', 'details-label'] + + - var detailMdl = 'getModel(backupItem, detail.path)[detail.model]'; + - var detailCommon = {'ng-model': detailMdl}; + + div(ng-switch='detail.type') + 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) {{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) {{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) + +exclamation('{{detail.model}}', 'min', 'Value is less than allowable minimum.') + +exclamation('{{detail.model}}', 'max', 'Value is more than allowable maximum.') + +exclamation('{{detail.model}}', 'number', 'Invalid value. Only numbers allowed.') + div(ng-switch-when='dropdown') + label(class=lblDetailClasses) {{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) {{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' style='margin-right: 5px; margin-top: -0.65em')&attributes(detailCommon) + table.col-sm-12.links-edit(st-table='#{detailMdl}' ng-show='#{detailMdl}.length > 0') + tbody + tr(ng-repeat='item in #{detailMdl} track by $index') + td.col-sm-11 + div(ng-show='detail.editIdx != {{$index}}') + a(ng-click='detail.editIdx = $index; curValue = #{detailMdl}[$index]') {{$index + 1}}) {{item}} + i.tipField.fa.fa-remove(ng-click='detail.editIdx = -1; #{detailMdl}.splice($index, 1)') + div(ng-show='detail.editIdx == {{$index}}') + label.labelField {{$index + 1}}) + i.tipField.fa.fa-floppy-o(ng-click='detail.editIdx = -1; #{detailMdl}[$index]=curValue') + .input-tip + input.form-control(type='text' ng-model='curValue' placeholder='{{detail.placeholder}}') + td.col-sm-1(ng-if='detail.reordering') + i.fa.fa-arrow-up(ng-show='$index > 0' ng-click='swapSimpleItems(detailMdl, $index, $index - 1); detail.editIdx = -1;') + i.fa.fa-arrow-down(ng-show='$index < #{detailMdl}.length - 1' ng-click='swapSimpleItems(#{detailMdl}, $index, $index + 1); detail.editIdx = -1;') + button.btn.btn-primary.fieldButton(ng-disabled='!newValue || #{detailMdl}.indexOf(newValue) >= 0' ng-click='detail.editIdx = -1; #{detailMdl} ? #{detailMdl}.push(newValue) : #{detailMdl} = [newValue];') Add + +tipField('detail.tip') + .input-tip + input.form-control(type='text' ng-model='newValue' ng-focus='detail.editIdx = -1' placeholder='{{detail.placeholder}}') + +mixin form-row + - var lblClasses = ['col-sm-2'] + + - var fieldMdl = 'getModel(backupItem, field.path)[field.model]'; + - var fieldCommon = {'ng-model': fieldMdl}; + + div(ng-switch='field.type') + div.checkbox.col-sm-6(ng-switch-when='check') + label + input(type='checkbox')&attributes(fieldCommon) + | {{field.label}} + +tipLabel('field.tip') + div(ng-switch-when='text') + label(class=lblClasses ng-class='{required: field.required}') {{field.label}}: + .col-sm-4 + +tipField('field.tip') + .input-tip + input.form-control(type='text' placeholder='{{field.placeholder}}' ng-required='field.required')&attributes(fieldCommon) + div(ng-switch-when='password') + label(class=lblClasses ng-class='{required: field.required}') {{field.label}}: + .col-sm-4 + +tipField('field.tip') + .input-tip + input.form-control(type='password' placeholder='{{field.placeholder}}' ng-required='field.required')&attributes(fieldCommon) + div(ng-switch-when='number') + label(class=lblClasses ng-class='{required: field.required}') {{field.label}}: + .col-sm-4 + +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}}' ng-required='field.required')&attributes(fieldCommon) + +exclamation('{{field.model}}', 'min', 'Value is less than allowable minimum.') + +exclamation('{{field.model}}', 'max', 'Value is more than allowable maximum.') + +exclamation('{{field.model}}', 'number', 'Invalid value. Only numbers allowed.') + div(ng-switch-when='dropdown') + label(class=lblClasses ng-class='{required: field.required}') {{field.label}}: + .col-sm-4 + +tipField('field.tip') + .input-tip + button.form-control(bs-select ng-required='field.required' data-placeholder='{{field.placeholder}}' bs-options='item.value as item.label for item in {{field.items}}')&attributes(fieldCommon) + div(ng-switch-when='dropdown-multiple') + label(class=lblClasses ng-class='{required: field.required}') {{field.label}}: + .col-sm-4 + +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') + - var expanded = 'field.details[' + fieldMdl + '].expanded' + + label(class=lblClasses ng-class='{required: field.required}') {{field.label}}: + .col-sm-4 + +tipField('field.tip') + .input-tip + button.form-control(bs-select ng-required='field.required' 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')&attributes(fieldCommon) + div + label {{field.tableLabel}}: {{#{fieldMdl}.length}} + +tipLabel('field.tip') + table.links-edit.col-sm-12(st-table='#{fieldMdl}' ng-show='#{fieldMdl}.length > 0') + tbody + tr.col-sm-12(ng-repeat='item in #{fieldMdl} track by $index') + td.col-sm-6 + div(ng-show='field.editIdx != {{$index}}') + a(ng-click='field.editIdx = $index; curValue = #{fieldMdl}[$index]') {{$index + 1}}) {{item | compact}} + i.tipField.fa.fa-remove(ng-click='field.editIdx = -1; #{fieldMdl}.splice($index, 1)') + div(ng-show='field.editIdx == {{$index}}') + label.labelField {{$index + 1}}) + i.tipField.fa.fa-floppy-o(ng-click='field.editIdx = -1; #{fieldMdl}[$index]=curValue') + .input-tip + input.form-control(type='text' ng-model='curValue' placeholder='{{field.placeholder}}') + td.col-sm-1(ng-if='field.reordering') + i.fa.fa-arrow-up(ng-show='$index > 0' ng-click='swapSimpleItems(fieldMdl, $index, $index - 1); field.editIdx = -1;') + i.fa.fa-arrow-down(ng-show='$index < #{fieldMdl}.length - 1' ng-click='swapSimpleItems(#{fieldMdl}, $index, $index + 1); field.editIdx = -1;') + .col-sm-6 + button.btn.btn-primary.fieldButton(ng-disabled='!newValue || #{fieldMdl}.indexOf(newValue) >= 0' ng-click='field.editIdx = -1; #{fieldMdl} ? #{fieldMdl}.push(newValue) : #{fieldMdl} = [newValue];') Add + +tipField('field.tip') + .input-tip + input.form-control(type='text' ng-model='newValue' ng-focus='field.editIdx = -1' placeholder='{{field.placeholder}}') + div(ng-switch-when='indexedTypes') + - var tblMdl = 'backupItem.indexedTypes' + div + label Indexed types: {{#{tblMdl}.length}} + +tipLabel('field.tip') + table.links-edit.col-sm-12(st-table=tblMdl ng-show='#{tblMdl}.length > 0') + tbody + tr.col-sm-12(ng-repeat='item in #{tblMdl}') + td.col-sm-6 + div(ng-show='field.editIdx != {{$index}}') + a(ng-click='field.editIdx = $index; curKeyClass = #{tblMdl}[$index].keyClass; curValueClass = #{tblMdl}[$index].valueClass') {{$index + 1}}) {{item.keyClass}} / {{item.valueClass}} + i.tipField.fa.fa-remove(ng-click='field.editIdx = -1; #{tblMdl}.splice($index, 1)') + div(ng-show='field.editIdx == {{$index}}') + label.labelField {{$index + 1}}) + i.tipField.fa.fa-floppy-o(ng-click='field.editIdx = -1; #{tblMdl}[$index]={keyClass: curKeyClass, valueClass: curValueClass}') + .input-tip + .col-sm-12 + input.form-control.table-form-control(type='text' ng-model='curKeyClass' placeholder='Key class full name') + label / + input.form-control.table-form-control(type='text' ng-model='curValueClass' placeholder='Value class full name') + .col-sm-6 + input.form-control(type='text' ng-model='newKeyClass' ng-focus='field.editIdx = -1' placeholder='Key class full name') + .settings-row + input.form-control(type='text' ng-model='newValueClass' ng-focus='field.editIdx = -1' placeholder='Value class full name') + button.btn.btn-primary.fieldButton(ng-click='field.editIdx = -1; addIndexedTypes(newKeyClass, newValueClass)') Add http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8e792605/modules/web-control-center/nodejs/views/includes/footer.jade ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/views/includes/footer.jade b/modules/web-control-center/nodejs/views/includes/footer.jade new file mode 100644 index 0000000..3cc0f86 --- /dev/null +++ b/modules/web-control-center/nodejs/views/includes/footer.jade @@ -0,0 +1,23 @@ +//- + 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 + | Powered by + a(href='http://ignite.incubator.apache.org') Apache Ignite + | , version 1.1.0 \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8e792605/modules/web-control-center/nodejs/views/includes/header.jade ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/views/includes/header.jade b/modules/web-control-center/nodejs/views/includes/header.jade new file mode 100644 index 0000000..9ffb687 --- /dev/null +++ b/modules/web-control-center/nodejs/views/includes/header.jade @@ -0,0 +1,36 @@ +//- + 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. + +header.header(id='header') + .container + h1.navbar-brand + a(href='/') Apache Ignite Web Configurator + .navbar-collapse.collapse(ng-controller='auth') + ul.nav.navbar-nav(ng-controller='activeLink') + li + a(ng-class="{active: isActive('/clusters')}" href='/clusters') Configuration + li + a(ng-class="{active: isActive('/sql')}" href='/sql') SQL + ul.nav.navbar-nav.pull-right(ng-init='user = #{JSON.stringify(user)}') + li(ng-show='user') + a.dropdown-toggle(data-toggle='dropdown' aria-expanded='true' bs-dropdown data-template='user-dropdown' data-placement='bottom-right') {{user.username}} + span.caret + script#user-dropdown(type='text/ng-template') + ul.dropdown-menu + li + a(href='/rest/auth/logout') Log Out + li.nav-login(ng-show='!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/8e792605/modules/web-control-center/nodejs/views/index.jade ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/views/index.jade b/modules/web-control-center/nodejs/views/index.jade new file mode 100644 index 0000000..b913fb0 --- /dev/null +++ b/modules/web-control-center/nodejs/views/index.jade @@ -0,0 +1,29 @@ +//- + 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 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/8e792605/modules/web-control-center/nodejs/views/layout-sidebar.jade ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/views/layout-sidebar.jade b/modules/web-control-center/nodejs/views/layout-sidebar.jade new file mode 100644 index 0000000..f88bb7d --- /dev/null +++ b/modules/web-control-center/nodejs/views/layout-sidebar.jade @@ -0,0 +1,37 @@ +//- + 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 layout + +block container + .row + .col-sm-2.border-right.section-left.greedy + .sidebar-nav + ul.menu(ng-controller='activeLink') + li + a(ng-class="{active: isActive('/clusters')}" href='/clusters') Clusters + li + a(ng-class="{active: isActive('/caches')}" href='/caches') Caches + li + a(ng-class="{active: isActive('/persistence')}" href='/persistence') Persistence + li + a(ng-class="{active: isActive('/clients')}" href='/clients') Clients + li + p + a(ng-class="{active: isActive('/summary')}" href='/summary') Summary + .col-sm-10.border-left.section-right + .docs-content + block content \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8e792605/modules/web-control-center/nodejs/views/layout.jade ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/views/layout.jade b/modules/web-control-center/nodejs/views/layout.jade new file mode 100644 index 0000000..d7a48be --- /dev/null +++ b/modules/web-control-center/nodejs/views/layout.jade @@ -0,0 +1,59 @@ +//- + 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-configurator') + 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.9.3/lodash.min.js') + + script(src='//ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js') + script(src='//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular-sanitize.js') + script(src='//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.2.2/angular-strap.js') + script(src='//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.2.2/angular-strap.tpl.min.js') + + script(src='https://cdnjs.cloudflare.com/ajax/libs/angular-smart-table/2.0.3/smart-table.js') + + script(src='/javascripts/controllers/common.js') + script(src='/javascripts/dataStructures.js') + + script(src='/javascripts/bundle.js') + body.theme-line.body-overlap + .wrapper + include includes/header + + .container.body-container + .main-content + .main-head + block container + + include includes/footer http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8e792605/modules/web-control-center/nodejs/views/login.jade ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/views/login.jade b/modules/web-control-center/nodejs/views/login.jade new file mode 100644 index 0000000..8ad1109 --- /dev/null +++ b/modules/web-control-center/nodejs/views/login.jade @@ -0,0 +1,47 @@ +//- + 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.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.pull-left + a(href='/') Apache Ignite Web Configurator + h4.modal-title Authentication + p Log in or register in order to collaborate + form.form-horizontal(name='loginForm') + .modal-body.row + .col-sm-9.login.col-sm-offset-1 + .form-group(ng-show='action == "register"') + label.col-sm-3.control-label Full Name: + .controls.col-sm-9 + input.form-control(type='text', ng-model='user_info.username', placeholder='John Smith', focus-me='action=="register"', ng-required='action=="register"') + .form-group + label.col-sm-3.control-label Email: + .controls.col-sm-9 + input.form-control(type='email', ng-model='user_info.email', placeholder='y...@domain.com', focus-me='action=="login"', required) + .form-group + label.col-sm-3.control-label Password: + .controls.col-sm-9 + input.form-control(type='password', ng-model='user_info.password', placeholder='Password', required) + .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-click='auth(action, user_info)' ng-show='action == "login"' ng-disabled='loginForm.$invalid') Log In + button.btn.btn-primary(ng-click='auth(action, user_info)' ng-show='action == "register"' ng-disabled='loginForm.$invalid') Sign Up http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8e792605/modules/web-control-center/nodejs/views/persistence.jade ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/views/persistence.jade b/modules/web-control-center/nodejs/views/persistence.jade new file mode 100644 index 0000000..2d1ba6f --- /dev/null +++ b/modules/web-control-center/nodejs/views/persistence.jade @@ -0,0 +1,115 @@ +//- + 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 layout-sidebar + +append scripts + script(src='/javascripts/controllers/persistences.js') + +include includes/controls + +mixin dbcheck(chk) + input(type='checkbox' style='margin-left: 5px' ng-checked=chk) + +block content + .docs-header + h1 Persistence + p Create and configure Ignite persistence. + hr + .docs-body(ng-controller='persistenceController') + .links(ng-hide='persistences.length == 0') + table.col-sm-12(st-table='persistences') + tbody + tr(ng-repeat='row in persistences track by row._id') + td.col-sm-6(ng-class='{active: row._id == selectedItem._id}') + a(ng-click='selectItem(row)') {{$index + 1}}. {{row.name}}, {{row.database | displayValue:databases:'Database not set'}} + button.btn.btn-primary(ng-click='createItem()') Add + hr + form.form-horizontal(name='inputForm' ng-if='backupItem' novalidate) + div(bs-collapse data-start-collapsed='false') + .panel.panel-default + .panel-heading + h3 + a(bs-collapse-toggle) Connection + .panel-collapse(bs-collapse-target) + .panel-body + .settings-row(ng-repeat='field in connection') + +form-row + div(bs-collapse data-start-collapsed='true' ng-hide='data.tables.length == 0') + .panel.panel-default + .panel-heading + h3 + a(bs-collapse-toggle) Metadata + .panel-collapse(bs-collapse-target) + .panel-body + 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='inputForm.$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 + + http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8e792605/modules/web-control-center/nodejs/views/sql.jade ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/views/sql.jade b/modules/web-control-center/nodejs/views/sql.jade new file mode 100644 index 0000000..a816251 --- /dev/null +++ b/modules/web-control-center/nodejs/views/sql.jade @@ -0,0 +1,23 @@ +//- + 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 layout + +block container + .docs-header + h1 SQL + p Connect to Zeppelin and execute SQL queries. + hr http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8e792605/modules/web-control-center/nodejs/views/summary.jade ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/views/summary.jade b/modules/web-control-center/nodejs/views/summary.jade new file mode 100644 index 0000000..afbdf4c --- /dev/null +++ b/modules/web-control-center/nodejs/views/summary.jade @@ -0,0 +1,93 @@ +//- + 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 layout-sidebar + +append scripts + script(src='/javascripts/controllers/summary.js') + script(src='//cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shCore.min.js') + script(src='//cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shBrushXml.js') + script(src='//cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shBrushJava.js') + script(src='//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/js/bootstrap.min.js') + +append css + link(rel='stylesheet', href='http://cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/styles/shCore.css') + link(rel='stylesheet', href='http://cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/styles/shThemeMidnight.css') + +block content + .docs-header + h1 Summary + p Configurations summary. + hr + .docs-body(ng-controller='summaryController') + div(ng-hide='clusters.length > 0') + | No cluster configured. You can + a(href='clusters') configure + | it. + div(ng-hide='clusters.length == 0') + p Following cluster configurations are created, you can download its as xml, java code or as docker file + .links + table.col-sm-12(st-table='clusters') + tbody + tr(ng-repeat='row in clusters track by row._id') + td.col-sm-6(ng-class='{active: row._id == selectedItem._id}') + a(ng-click='selectItem(row)') {{$index + 1}}. {{row.name}} + #cfgResult.configBox(ng-show='selectedItem && !generateError && !loading', style='margin-top: 20px') + ul.nav.nav-tabs + li(ng-class='{active: cfgLang == "xml"}') + a(href, ng-click='cfgLang = "xml"') + img(src='images/xml.png', width='16px' height='16px') + | XML + li(ng-class='{active: cfgLang=="java"}') + a(href, ng-click='cfgLang = "java"') + img(src='images/java.png', width='16px' height='16px') + | Java + li(ng-class="{active: cfgLang=='docker'}") + a(href, ng-click='cfgLang = "docker"') + img(src='images/docker.png', width='16px' height='16px') + | Dockerfile + + div(style='padding-top: 10px') + #xmlResult(ng-show="cfgLang == 'xml'") + #xmlResultDiv + + #javaResult(ng-show="cfgLang == 'java'") + label + input(type='checkbox', ng-model="generateJavaClass") + | generate java class. + + #javaResultDiv + + #dockerResult(ng-show="cfgLang == 'docker'") + p + a(href='https://docs.docker.com/reference/builder') Dockerfile + | is a text file with instructions to create Docker image. To build image you have to + | store following Docker file with your xml ignite configurations to the same directory. + + form.form-horizontal + .form-group + label.control-label.col-sm-3(for='os') Operation System + .col-sm-6 + input#os.form-control(type='text', ng-model='dockerArg.os', placeholder='debian:8') + + .form-group + | Download as + a(href, ng-click='downloadDocker()') file + + textarea.form-control(rows=30, readonly=true) + | {{ dockerFile() }} + + div(ng-show='generateError') {{generateError}} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8e792605/modules/web-control-center/nodejs/views/templates/select.jade ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/views/templates/select.jade b/modules/web-control-center/nodejs/views/templates/select.jade new file mode 100644 index 0000000..4a39795 --- /dev/null +++ b/modules/web-control-center/nodejs/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' style='margin: 5px 0') + a(style='cursor: default;', role='menuitem', tabindex='-1', ng-class='{active: $isActive($index)}' ng-click='$select($index, $event)') + i.pull-right(class='{{$iconCheckmark}}', ng-if='$isMultiple && $isActive($index)' ng-class='{active: $isActive($index)}' style='margin-left: 15px') + 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/8e792605/modules/webconfig/licenses/apache-2.0.txt ---------------------------------------------------------------------- diff --git a/modules/webconfig/licenses/apache-2.0.txt b/modules/webconfig/licenses/apache-2.0.txt deleted file mode 100644 index d645695..0000000 --- a/modules/webconfig/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/8e792605/modules/webconfig/nodejs/.gitignore ---------------------------------------------------------------------- diff --git a/modules/webconfig/nodejs/.gitignore b/modules/webconfig/nodejs/.gitignore deleted file mode 100644 index b512c09..0000000 --- a/modules/webconfig/nodejs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8e792605/modules/webconfig/nodejs/DEVNOTES.txt ---------------------------------------------------------------------- diff --git a/modules/webconfig/nodejs/DEVNOTES.txt b/modules/webconfig/nodejs/DEVNOTES.txt deleted file mode 100644 index eb35c0a..0000000 --- a/modules/webconfig/nodejs/DEVNOTES.txt +++ /dev/null @@ -1,14 +0,0 @@ -Ignite Web Configurator Build Instructions -====================================== - -Before run need install locally: - -1. NodeJS using installer from site https://nodejs.org -2. MongoDB folow instructions from site http://docs.mongodb.org/manual/installation - -To run: - -1. Run following command in terminal for upload all dependence: "npm install" in 'modules/webconfig/nodejs' folder. -2. Run MongoDB. -3. Start application by following command in terminal: "npm start" in 'modules/webconfig/nodejs' folder. -4. Open in browser: localhost:3000 \ No newline at end of file