forked from community/product-iots
parent
948c059c4e
commit
824503c0d7
@ -0,0 +1,42 @@
|
||||
{
|
||||
"store": {
|
||||
"type": "fs"
|
||||
},
|
||||
"authentication": {
|
||||
"activeMethod": "basic",
|
||||
"methods": {
|
||||
"sso": {
|
||||
"attributes": {
|
||||
"issuer": "portal",
|
||||
"identityProviderURL": "https://localhost:9443/samlsso",
|
||||
"responseSigningEnabled": "false",
|
||||
"acs": "https://localhost:9444/portal/acs",
|
||||
"identityAlias": "wso2carbon",
|
||||
"useTenantKey": false
|
||||
}
|
||||
},
|
||||
"basic": {
|
||||
"attributes": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"designers": [
|
||||
"Internal/everyone"
|
||||
],
|
||||
"tenantPrefix": "/t",
|
||||
"shareStore": false,
|
||||
"theme": "analytics",
|
||||
"cacheTimeoutSeconds": "5",
|
||||
"cacheSizeBytes": "1073741824",
|
||||
"defaultDashboardRedirect": false,
|
||||
"isCreateGadgetEnable": false,
|
||||
"oauth": {
|
||||
"username": "admin",
|
||||
"password": "admin"
|
||||
},
|
||||
"host": {
|
||||
"hostname": "localhost",
|
||||
"port": "",
|
||||
"protocol": ""
|
||||
}
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
<module name="carbon" xmlns="http://wso2.org/projects/jaggery/module.xml">
|
||||
<!-- scripts -->
|
||||
<script>
|
||||
<name>osgi</name>
|
||||
<path>scripts/server/osgi.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>tenant</name>
|
||||
<path>scripts/server/tenant.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>server</name>
|
||||
<path>scripts/server/server.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>config</name>
|
||||
<path>scripts/server/config.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>user</name>
|
||||
<path>scripts/user/user.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>registry</name>
|
||||
<path>scripts/registry/registry.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>registry-osgi</name>
|
||||
<path>scripts/registry/registry-osgi.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>artifacts</name>
|
||||
<path>scripts/registry/artifacts.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>space</name>
|
||||
<path>scripts/user/space.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>registry-space</name>
|
||||
<path>scripts/user/registry-space.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>user-manager</name>
|
||||
<path>scripts/user/user-manager.js</path>
|
||||
</script>
|
||||
</module>
|
@ -0,0 +1,47 @@
|
||||
<module name="carbon" xmlns="http://wso2.org/projects/jaggery/module.xml">
|
||||
<!-- scripts -->
|
||||
<script>
|
||||
<name>osgi</name>
|
||||
<path>scripts/server/osgi.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>tenant</name>
|
||||
<path>scripts/server/tenant.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>server</name>
|
||||
<path>scripts/server/server.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>config</name>
|
||||
<path>scripts/server/config.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>user</name>
|
||||
<path>scripts/user/user.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>registry</name>
|
||||
<path>scripts/registry/registry.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>registry-osgi</name>
|
||||
<path>scripts/registry/registry-osgi.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>artifacts</name>
|
||||
<path>scripts/registry/artifacts.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>space</name>
|
||||
<path>scripts/user/space.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>registry-space</name>
|
||||
<path>scripts/user/registry-space.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>user-manager</name>
|
||||
<path>scripts/user/user-manager.js</path>
|
||||
</script>
|
||||
</module>
|
@ -0,0 +1,596 @@
|
||||
(function (server, registry) {
|
||||
|
||||
var log = new Log();
|
||||
|
||||
var GenericArtifactManager = Packages.org.wso2.carbon.governance.api.generic.GenericArtifactManager;
|
||||
var GenericArtifactFilter = Packages.org.wso2.carbon.governance.api.generic.GenericArtifactFilter;
|
||||
var ByteArrayInputStream = Packages.java.io.ByteArrayInputStream;
|
||||
var QName = Packages.javax.xml.namespace.QName;
|
||||
var IOUtils = Packages.org.apache.commons.io.IOUtils;
|
||||
var PrivilegedCarbonContext = Packages.org.wso2.carbon.context.PrivilegedCarbonContext; //Used regard tenant details
|
||||
var CarbonContext = Packages.org.wso2.carbon.context.CarbonContext;
|
||||
var MultitenantConstants = Packages.org.wso2.carbon.utils.multitenancy.MultitenantConstants;
|
||||
var List = java.util.List;
|
||||
var Map = java.util.Map;
|
||||
var ArrayList = java.util.ArrayList;
|
||||
var HashMap = java.util.HashMap;
|
||||
|
||||
var GovernanceUtils = Packages.org.wso2.carbon.governance.api.util.GovernanceUtils;//Used to obtain Asset Types
|
||||
var DEFAULT_MEDIA_TYPE = 'application/vnd.wso2.registry-ext-type+xml';//Used to obtain Asset types
|
||||
var PaginationContext = Packages.org.wso2.carbon.registry.core.pagination.PaginationContext;//Used for pagination on register
|
||||
|
||||
var REGISTRY_ABSOLUTE_PATH = "/_system/governance";
|
||||
|
||||
var HISTORY_PATH_SEPERATOR = '_';
|
||||
var ASSET_PATH_SEPERATOR = '/';
|
||||
var lcHistoryRegExpression = new RegExp(ASSET_PATH_SEPERATOR, 'g');
|
||||
var HISTORY_PATH = '/_system/governance/_system/governance/repository/components/org.wso2.carbon.governance/lifecycles/history/';
|
||||
|
||||
|
||||
var buildArtifact = function (manager, artifact) {
|
||||
return {
|
||||
id: String(artifact.id),
|
||||
type: String(manager.type),
|
||||
path: "/_system/governance" + String(artifact.getPath()),
|
||||
lifecycle: artifact.getLifecycleName(),
|
||||
lifecycleState: artifact.getLifecycleState(),
|
||||
mediaType: String(artifact.getMediaType()),
|
||||
attributes: (function () {
|
||||
var i, name,
|
||||
names = artifact.getAttributeKeys(),
|
||||
length = names.length,
|
||||
attributes = {};
|
||||
for (i = 0; i < length; i++) {
|
||||
name = names[i];
|
||||
|
||||
var data = artifact.getAttributes(name);
|
||||
|
||||
//Check if there is only one element
|
||||
if (data.length == 1) {
|
||||
attributes[name] = String(artifact.getAttribute(name));
|
||||
}
|
||||
else {
|
||||
attributes[name] = data;
|
||||
}
|
||||
}
|
||||
return attributes;
|
||||
}()),
|
||||
content: function () {
|
||||
return new Stream(new ByteArrayInputStream(artifact.getContent()));
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
var createArtifact = function (manager, options) {
|
||||
var name, attribute, i, length, lc,
|
||||
artifact = manager.newGovernanceArtifact(new QName(options.name)),
|
||||
attributes = options.attributes;
|
||||
for (name in attributes) {
|
||||
if (attributes.hasOwnProperty(name)) {
|
||||
attribute = attributes[name];
|
||||
if (attribute instanceof Array) {
|
||||
/*length = attribute.length;
|
||||
for (i = 0; i < length; i++) {
|
||||
artifact.addAttribute(name, attribute[i]);
|
||||
}*/
|
||||
artifact.setAttributes(name, attribute);
|
||||
} else {
|
||||
artifact.setAttribute(name, attribute);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (options.id) {
|
||||
artifact.id = options.id;
|
||||
}
|
||||
if (options.content) {
|
||||
if (options.content instanceof Stream) {
|
||||
artifact.setContent(IOUtils.toByteArray(options.content.getStream()));
|
||||
} else {
|
||||
artifact.setContent(new java.lang.String(options.content).getBytes());
|
||||
}
|
||||
}
|
||||
lc = options.lifecycles;
|
||||
if (lc) {
|
||||
length = lc.length;
|
||||
for (i = 0; i < length; i++) {
|
||||
artifact.attachLifeCycle(lc[i]);
|
||||
}
|
||||
}
|
||||
return artifact;
|
||||
};
|
||||
|
||||
var ArtifactManager = function (registry, type) {
|
||||
this.registry = registry;
|
||||
this.manager = new GenericArtifactManager(registry.registry.getChrootedRegistry("/_system/governance"), type);
|
||||
this.type = type;
|
||||
};
|
||||
registry.ArtifactManager = ArtifactManager;
|
||||
|
||||
ArtifactManager.prototype.find = function (fn, paging) {
|
||||
var i, length, artifacts,
|
||||
artifactz = [];
|
||||
artifacts = this.manager.findGenericArtifacts(new GenericArtifactFilter({
|
||||
matches: function (artifact) {
|
||||
return fn(buildArtifact(this, artifact));
|
||||
}
|
||||
}));
|
||||
length = artifacts.length;
|
||||
for (i = 0; i < length; i++) {
|
||||
artifactz.push(buildArtifact(this, artifacts[i]));
|
||||
}
|
||||
return artifactz;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* this funtion is used ArtifactManager find with map for query for solr basicly
|
||||
* query - for maping attribute of resource
|
||||
* pagin - pagination details
|
||||
* return - list of artifacts under the seach request
|
||||
*
|
||||
*/
|
||||
ArtifactManager.prototype.search = function (query, paging) {
|
||||
|
||||
var list, map, key, artifacts, pagination, value, that,
|
||||
artifactz = [];
|
||||
pagination = generatePaginationForm(paging);
|
||||
try {
|
||||
PaginationContext.init(pagination.start, pagination.count, pagination.sortOrder,
|
||||
pagination.sortBy, pagination.paginationLimit);
|
||||
map = HashMap();
|
||||
//case senstive search as it using greg with solr 1.4.1
|
||||
if (!query) {
|
||||
//listing for sorting
|
||||
map = java.util.Collections.emptyMap();
|
||||
} else if (query instanceof String || typeof query === 'string') {
|
||||
list = new ArrayList();
|
||||
list.add('*' + query + '*');
|
||||
map.put('overview_name', list);
|
||||
} else {
|
||||
//support for only on name of attribut -
|
||||
for (key in query) {
|
||||
// if attribute is string values
|
||||
if (query.hasOwnProperty(key)) {
|
||||
value = query[key];
|
||||
list = new ArrayList();
|
||||
if (value instanceof Array) {
|
||||
value.forEach(function (val) {
|
||||
//solr config update need have '*' as first char in below line
|
||||
//check life_cycle state
|
||||
list.add(key == 'lcState' ? val : '*' + val + '*');
|
||||
});
|
||||
} else {
|
||||
//solr config update need have '*' as first char in below line
|
||||
list.add(key == 'lcState' ? value : '*' + value + '*');
|
||||
}
|
||||
map.put(key, list);
|
||||
}
|
||||
}//end of attribut looping (all attributes)
|
||||
}
|
||||
artifacts = this.manager.findGenericArtifacts(map);
|
||||
that = this;
|
||||
artifacts.forEach(function (artifact) {
|
||||
artifactz.push(buildArtifact(that, artifact));
|
||||
});
|
||||
} finally {
|
||||
PaginationContext.destroy();
|
||||
}
|
||||
return artifactz;
|
||||
};
|
||||
|
||||
ArtifactManager.prototype.get = function (id) {
|
||||
return buildArtifact(this, this.manager.getGenericArtifact(id))
|
||||
};
|
||||
|
||||
ArtifactManager.prototype.count = function () {
|
||||
return this.manager.getAllGenericArtifactIds().length;
|
||||
};
|
||||
|
||||
/**
|
||||
* @deprecated Please use search method instead
|
||||
* @param paging
|
||||
* @return {*}
|
||||
*/
|
||||
ArtifactManager.prototype.list = function (paging) {
|
||||
return this.search(null, paging);
|
||||
};
|
||||
|
||||
/*
|
||||
The function returns an array of asset types
|
||||
@mediaType - The media type of the assets
|
||||
@return An array of strings containing the asset paths
|
||||
*/
|
||||
ArtifactManager.prototype.getAssetTypePaths = function (mediaType) {
|
||||
|
||||
//Use the default media type if one is not provided
|
||||
if (!mediaType) {
|
||||
mediaType = DEFAULT_MEDIA_TYPE;
|
||||
}
|
||||
|
||||
//var assetArray=GovernanceUtils.findGovernanceArtifacts(mediaType,this.registry);
|
||||
var result = Packages.org.wso2.carbon.governance.api.util.GovernanceUtils.findGovernanceArtifacts(mediaType, registry.registry);
|
||||
|
||||
return result;
|
||||
//Create an empty array if no asset types are found
|
||||
//return (!assetArray)?[]:assetArray;
|
||||
};
|
||||
|
||||
/*
|
||||
{
|
||||
name: 'AndroidApp1',
|
||||
attributes: {
|
||||
overview_status: "CREATED",
|
||||
overview_name: 'AndroidApp1',
|
||||
overview_version: '1.0.0',
|
||||
overview_url: 'http://overview.com',
|
||||
overview_provider: 'admin',
|
||||
images_thumbnail: 'http://localhost:9763/portal/gadgets/co2-emission/thumbnail.jpg',
|
||||
images_banner: 'http://localhost:9763/portal/gadgets/electric-power/banner.jpg'
|
||||
},
|
||||
lifecycles : ['lc1', 'lc2'],
|
||||
content : '<?xml ....>'
|
||||
}
|
||||
*/
|
||||
ArtifactManager.prototype.add = function (options) {
|
||||
var asset=createArtifact(this.manager, options);
|
||||
this.manager.addGenericArtifact(asset);
|
||||
return asset.getId();
|
||||
};
|
||||
|
||||
ArtifactManager.prototype.update = function (options) {
|
||||
this.manager.updateGenericArtifact(createArtifact(this.manager, options));
|
||||
};
|
||||
|
||||
ArtifactManager.prototype.remove = function (id) {
|
||||
this.manager.removeGenericArtifact(id);
|
||||
};
|
||||
|
||||
/*
|
||||
Attaches the provided lifecycle name to the artifact
|
||||
@lifecycleName: The name of a valid lifecycle.The lifecycle should be visible to the
|
||||
registry.
|
||||
@options: The artifact to which the life cycle must be attached.
|
||||
*/
|
||||
ArtifactManager.prototype.attachLifecycle = function (lifecycleName, options) {
|
||||
var artifact = getArtifactFromImage(this.manager, options);
|
||||
if (!artifact) {
|
||||
throw new Error('Specified artifact cannot be found : ' + JSON.stringify(options));
|
||||
}
|
||||
artifact.attachLifecycle(lifecycleName);
|
||||
};
|
||||
|
||||
/*
|
||||
Removes the attached lifecycle from the artifact
|
||||
@options: The artifact from which the life cycle must be removed
|
||||
*/
|
||||
ArtifactManager.prototype.detachLifecycle = function (options) {
|
||||
var artifact = getArtifactFromImage(this.manager, options);
|
||||
if (!artifact) {
|
||||
throw new Error('Specified artifact cannot be found : ' + JSON.stringify(options));
|
||||
}
|
||||
var lifecycleName = getLifecycleName(artifact);
|
||||
artifact.detachLifecycle(lifecycleName);
|
||||
};
|
||||
|
||||
/*
|
||||
Promotes the artifact to the next stage in its life cycle
|
||||
@options: An artifact image (Not a real artifact)
|
||||
*/
|
||||
ArtifactManager.prototype.promoteLifecycleState = function (state, options) {
|
||||
var checkListItems,
|
||||
artifact = getArtifactFromImage(this.manager, options);
|
||||
if (!artifact) {
|
||||
throw new Error('Specified artifact cannot be found : ' + JSON.stringify(options));
|
||||
}
|
||||
//checkListItems = artifact.getAllCheckListItemNames();
|
||||
var lifecycleName = getLifecycleName(artifact);
|
||||
artifact.invokeAction(state,lifecycleName);
|
||||
};
|
||||
|
||||
/*
|
||||
Gets the current lifecycle state
|
||||
@options: An artifact object
|
||||
@returns: The life cycle state
|
||||
*/
|
||||
ArtifactManager.prototype.getLifecycleState = function (options) {
|
||||
var artifact = getArtifactFromImage(this.manager, options);
|
||||
if (!artifact) {
|
||||
throw new Error('Specified artifact cannot be found : ' + JSON.stringify(options));
|
||||
}
|
||||
return artifact.getLifecycleState();
|
||||
};
|
||||
|
||||
/*
|
||||
The function returns the list of check list items for a given state
|
||||
@options: The artifact
|
||||
@returns: A String array containing the check list items.(Can be empty if no check list items are present)
|
||||
*/
|
||||
ArtifactManager.prototype.getCheckListItemNames = function (options) {
|
||||
var artifact = getArtifactFromImage(this.manager, options);
|
||||
var lifecycleName = getLifecycleName(artifact);
|
||||
var checkListItems = artifact.getAllCheckListItemNames(lifecycleName) || [];
|
||||
|
||||
var checkListItemArray = [];
|
||||
|
||||
//Go through each check list item
|
||||
for (var index in checkListItems) {
|
||||
//Get whether the check list item is checked
|
||||
var state = artifact.isLCItemChecked(index);
|
||||
checkListItemArray.push({ 'name': checkListItems[index], 'checked': state });
|
||||
}
|
||||
|
||||
return checkListItemArray;
|
||||
};
|
||||
|
||||
/*
|
||||
The function checks whether a given check list item at the provided index is checked for the current state
|
||||
@index: The index of the check list item.This must be a value between 0 and the maximum check list item
|
||||
that appears in the lifecycle definition
|
||||
@options: An artifact object
|
||||
@throws Exception: If the index is not within 0 and the max check list item or if there is an issue ticking the item
|
||||
*/
|
||||
ArtifactManager.prototype.isItemChecked = function (index, options) {
|
||||
|
||||
var artifact = getArtifactFromImage(this.manager, options);
|
||||
var lifecycleName = getLifecycleName(artifact);
|
||||
var checkListItems = artifact.getAllCheckListItemNames();
|
||||
|
||||
var checkListLength = checkListItems.length;
|
||||
|
||||
if ((index < 0) || (index > checkListLength)) {
|
||||
throw "The index value: " + index + " must be between 0 and " + checkListLength + ".Please refer to the lifecycle definition in the registry.xml for the number of check list items.";
|
||||
}
|
||||
var result = artifact.isLCItemChecked(index,lifecycleName);
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
/*
|
||||
The method enables the check list item and the given index
|
||||
@index: The index of the check list item.This must be a value between 0 and the maximum check list item
|
||||
that appears in the lifecycle definition.
|
||||
@options: An artifact object
|
||||
@throws Exception: If the index is not within 0 and max check list item or if there is an issue ticking the item.
|
||||
*/
|
||||
ArtifactManager.prototype.checkItem = function (index, options) {
|
||||
|
||||
var artifact = getArtifactFromImage(this.manager, options);
|
||||
var lifecycleName = getLifecycleName(artifact);
|
||||
var checkListItems = artifact.getAllCheckListItemNames();
|
||||
|
||||
var checkListLength = checkListItems.length;
|
||||
|
||||
if ((index < 0) || (index > checkListLength)) {
|
||||
throw "The index value: " + index + " must be between 0 and " + checkListLength + ".Please refer to the lifecycle definition in the registry.xml for the number of check list items.";
|
||||
}
|
||||
artifact.checkLCItem(index,lifecycleName);
|
||||
};
|
||||
|
||||
/*
|
||||
The method disables the check list item at the given index
|
||||
@index: The index of the check list item.This must be a value between 0 and the maximum check list item
|
||||
that appears in the lifecycle definition
|
||||
@options: An artifact object
|
||||
@throws Exception: If the index is not within 0 and max check list item or if there is an issue ticking the item
|
||||
*/
|
||||
ArtifactManager.prototype.uncheckItem = function (index, options) {
|
||||
|
||||
var artifact = getArtifactFromImage(this.manager, options);
|
||||
var lifecycleName = getLifecycleName(artifact);
|
||||
var checkListItems = artifact.getAllCheckListItemNames();
|
||||
|
||||
var checkListLength = checkListItems.length;
|
||||
|
||||
if ((index < 0) || (index > checkListLength)) {
|
||||
throw "The index value: " + index + " must be between 0 and " + checkListLength + ".Please refer to the lifecycle definition in the registry.xml for the number of check list items.";
|
||||
}
|
||||
artifact.uncheckLCItem(index,lifecycleName);
|
||||
};
|
||||
|
||||
/*
|
||||
The method obtains the list of all available actions for the current state of the asset
|
||||
@options: An artifact object
|
||||
@returns: The list of available actions for the current state,else false
|
||||
*/
|
||||
ArtifactManager.prototype.availableActions = function (options) {
|
||||
var artifact = getArtifactFromImage(this.manager, options);
|
||||
if (!artifact) {
|
||||
throw new Error('Specified artifact cannot be found : ' + JSON.stringify(options));
|
||||
}
|
||||
var lifecycleName = getLifecycleName(artifact);
|
||||
return artifact.getAllLifecycleActions(lifecycleName) || [];
|
||||
};
|
||||
|
||||
/*
|
||||
The function returns the life-cycle history path using
|
||||
the provided asset.
|
||||
@options: An asset.
|
||||
@return: A string path of the life-cycle history.
|
||||
*/
|
||||
ArtifactManager.prototype.getLifecycleHistoryPath = function (options) {
|
||||
|
||||
return getHistoryPath(options.path);
|
||||
};
|
||||
|
||||
/*
|
||||
The function obtains the lifecycle history for the provided asset
|
||||
@options: An asset with a valid path.(A path which exists in the registry
|
||||
@return: A resource object containing the history as an xml
|
||||
*/
|
||||
ArtifactManager.prototype.getLifecycleHistory=function(options){
|
||||
var historyPath=getHistoryPath(options.path);
|
||||
return this.registry.get(historyPath);
|
||||
};
|
||||
|
||||
/*
|
||||
The function returns the life-cycle attached to the provided artifact
|
||||
@options: An asset as returned by the ArtifactManager get method
|
||||
@return: A string indicating the lifecycle name.If the artifact does not
|
||||
have a life-cycle then an empty string is returned.
|
||||
*/
|
||||
ArtifactManager.prototype.getLifeCycleName = function (options) {
|
||||
|
||||
var artifact = getArtifactFromImage(this.manager, options);
|
||||
|
||||
var lifecycleName = '';
|
||||
|
||||
if (artifact != null) {
|
||||
lifecycleName = artifact.getLifecycleName();
|
||||
}
|
||||
|
||||
return lifecycleName;
|
||||
};
|
||||
|
||||
/*
|
||||
The function returns all versions of the provided artifact
|
||||
@options: The artifact to be checked
|
||||
@return: A list of all the different versions of the provided asset
|
||||
*/
|
||||
ArtifactManager.prototype.getAllAssetVersions = function (assetName) {
|
||||
|
||||
var matchingArtifacts = [];
|
||||
|
||||
var pred = {
|
||||
overview_name: assetName || ''
|
||||
};
|
||||
|
||||
this.find(function (artifact) {
|
||||
|
||||
//Add to the matches if the artifact exists
|
||||
if (assert(artifact.attributes, pred)) {
|
||||
|
||||
//We only need the id and version
|
||||
matchingArtifacts.push({id: artifact.id, version: artifact.attributes.overview_version});
|
||||
}
|
||||
});
|
||||
|
||||
return matchingArtifacts;
|
||||
};
|
||||
|
||||
/*
|
||||
The function checks if the two objects a and b are equal.If a property in b is not
|
||||
in a, then both objects are assumed to be different.
|
||||
@a: The object to be compared
|
||||
@b: The object containing properties that must match in a
|
||||
@return: True if the objects are equal,else false.
|
||||
*/
|
||||
var assert = function (a, b) {
|
||||
|
||||
//Assume the objects will be same
|
||||
var equal = true;
|
||||
|
||||
for (var key in b) {
|
||||
|
||||
|
||||
if (a.hasOwnProperty(key)) {
|
||||
|
||||
//If the two keys are not equal
|
||||
if (a[key] != b[key]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return equal;
|
||||
};
|
||||
|
||||
/*
|
||||
The function generates the history path of a given asset
|
||||
using its path
|
||||
@assetPath:The path of the asset to be retrieved.
|
||||
@return: The path of lifecycle history information
|
||||
*/
|
||||
var getHistoryPath = function (assetPath) {
|
||||
|
||||
//Replace the / in the assetPath
|
||||
var partialHistoryPath = assetPath.replace(lcHistoryRegExpression, HISTORY_PATH_SEPERATOR);
|
||||
|
||||
var fullPath = HISTORY_PATH + partialHistoryPath;
|
||||
|
||||
return fullPath;
|
||||
};
|
||||
|
||||
/*
|
||||
generatePaginationForm will genrate json for registry pagination context, (pagination consistent handling)
|
||||
@pagin:The pagination details from UI
|
||||
@
|
||||
*/
|
||||
var generatePaginationForm = function (pagin) {
|
||||
|
||||
//pagination context for default
|
||||
var paginationLimit = 300;
|
||||
var paginationForm = {
|
||||
'start': 0,
|
||||
'count': 12,
|
||||
'sortOrder': 'ASC',
|
||||
'sortBy': 'overview_name',
|
||||
'paginationLimit': 2147483647
|
||||
};
|
||||
|
||||
if (!pagin) {
|
||||
return paginationForm;
|
||||
}
|
||||
|
||||
if (pagin.count != null) {
|
||||
paginationForm.count = pagin.count;
|
||||
}
|
||||
if (pagin.start != null) {
|
||||
paginationForm.start = pagin.start;
|
||||
}
|
||||
if (pagin.paginationLimit != null) {
|
||||
paginationForm.paginationLimit = pagin.paginationLimit;
|
||||
}
|
||||
if (pagin.sortBy != null) {
|
||||
paginationForm.sortBy = pagin.sortBy;
|
||||
}
|
||||
if (paginationForm.sortOrder != null) {
|
||||
paginationForm.sortOrder = pagin.sortOrder;
|
||||
}
|
||||
return paginationForm;
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
Helper function to create an artifact instance from a set of options (an image).
|
||||
*/
|
||||
var getArtifactFromImage = function (manager, options) {
|
||||
|
||||
var path = options.path || '';
|
||||
var lcName = options.lifecycle || '';
|
||||
var artifact = createArtifact(manager, {
|
||||
id: options.id,
|
||||
attributes: options.attributes
|
||||
});
|
||||
|
||||
path = path.replace(REGISTRY_ABSOLUTE_PATH, '');
|
||||
|
||||
artifact.setArtifactPath(path);
|
||||
artifact.setLcName(lcName);
|
||||
|
||||
return artifact;
|
||||
};
|
||||
|
||||
/**
|
||||
* The function was introduced as a fix to accomadate the goveerance API
|
||||
* changes to support multiple lifecycles
|
||||
* @param {Object artifact A governance artifact instance
|
||||
* @return {String} The name of the default lifecycle
|
||||
*/
|
||||
var getLifecycleName = function(artifact){
|
||||
var lifecycleName;
|
||||
if(!artifact){
|
||||
throw "The artifact is null, cannot retrieve the lifecycle name for lifecycle operations";
|
||||
}
|
||||
try {
|
||||
lifecycleName = artifact.getLifecycleName();
|
||||
}
|
||||
catch(e){
|
||||
log.error(e);
|
||||
throw e;
|
||||
}
|
||||
return lifecycleName;
|
||||
};
|
||||
}(server, registry));
|
@ -0,0 +1,452 @@
|
||||
var registry = registry || {};
|
||||
|
||||
(function (server, registry) {
|
||||
var log = new Log();
|
||||
|
||||
var Resource = Packages.org.wso2.carbon.registry.core.Resource;
|
||||
|
||||
var Collection = Packages.org.wso2.carbon.registry.core.Collection;
|
||||
|
||||
var Comment = Packages.org.wso2.carbon.registry.core.Comment;
|
||||
|
||||
var StaticConfiguration = Packages.org.wso2.carbon.registry.core.config.StaticConfiguration;
|
||||
|
||||
var queryPath = '/_system/config/repository/components/org.wso2.carbon.registry/queries/';
|
||||
|
||||
var content = function (registry, resource, paging) {
|
||||
if (resource instanceof Collection) {
|
||||
// #1 : this always sort children by name, so sorting cannot be done for the chunk
|
||||
return children(registry, resource, paging);
|
||||
}
|
||||
if (resource instanceof Comment) {
|
||||
return String(resource.getText());
|
||||
}
|
||||
try {
|
||||
var stream = resource.getContentStream();
|
||||
if (stream) {
|
||||
return new Stream(stream);
|
||||
}
|
||||
} catch (e) {
|
||||
log.error(e);
|
||||
//this is because getContentStream() throws an exception when content is empty
|
||||
}
|
||||
return String(resource.content);
|
||||
};
|
||||
|
||||
var resourceSorter = function (key) {
|
||||
var nameAsc = function (l, r) {
|
||||
var lname, rname;
|
||||
if (l instanceof Collection) {
|
||||
lname = l.getName();
|
||||
lname = lname.substring(lname.lastIndexOf('/') + 1);
|
||||
} else {
|
||||
lname = l.name;
|
||||
}
|
||||
if (r instanceof Collection) {
|
||||
rname = r.getName();
|
||||
rname = rname.substring(rname.lastIndexOf('/') + 1);
|
||||
} else {
|
||||
rname = r.name;
|
||||
}
|
||||
return lname === rname ? 0 : (lname > rname ? 1 : -1);
|
||||
};
|
||||
switch (key) {
|
||||
case 'time-created-asc' :
|
||||
return function (l, r) {
|
||||
return l.getCreatedTime().getTime() - r.getCreatedTime().getTime();
|
||||
};
|
||||
case 'time-created-des' :
|
||||
return function (l, r) {
|
||||
return r.getCreatedTime().getTime() - l.getCreatedTime().getTime();
|
||||
};
|
||||
case 'name-asc' :
|
||||
return nameAsc;
|
||||
case 'name-des' :
|
||||
return function (l, r) {
|
||||
return -nameAsc(l, r);
|
||||
};
|
||||
default:
|
||||
return resourceSorter('time-created-des');
|
||||
}
|
||||
};
|
||||
|
||||
var children = function (registry, resource, paging) {
|
||||
var resources = resource.getChildren();
|
||||
//we have to manually sort this due to the bug in registry.getChildren() (#1 above)
|
||||
//resources.sort(resourceSorter(paging.sort));
|
||||
return resources.slice(paging.start, paging.start + paging.count);
|
||||
};
|
||||
|
||||
var resource = function (registry, resource) {
|
||||
var path = String(resource.path),
|
||||
o = {
|
||||
created: {
|
||||
author: String(resource.authorUserName),
|
||||
time: resource.createdTime.time
|
||||
},
|
||||
content: content(registry, resource, {
|
||||
start: 0,
|
||||
count: 10
|
||||
}),
|
||||
id: String(resource.id),
|
||||
version: resource.versionNumber
|
||||
};
|
||||
if (resource instanceof Comment) {
|
||||
return o;
|
||||
}
|
||||
if (resource instanceof Collection) {
|
||||
o.collection = (resource instanceof Collection);
|
||||
}
|
||||
o.uuid = String(resource.UUID);
|
||||
o.path = String(path);
|
||||
o.name = String(resource.name) || resolveName(path);
|
||||
o.description = String(resource.description);
|
||||
o.updated = {
|
||||
author: String(resource.lastUpdaterUserName),
|
||||
time: resource.lastModified.time
|
||||
};
|
||||
o.mediaType = String(resource.mediaType);
|
||||
o.properties = function () {
|
||||
return properties(resource);
|
||||
};
|
||||
o.aspects = function () {
|
||||
return aspects(resource);
|
||||
};
|
||||
return o;
|
||||
};
|
||||
|
||||
var properties = function (resource) {
|
||||
var prop,
|
||||
properties = resource.properties,
|
||||
props = properties.keySet().toArray(),
|
||||
length = props.length,
|
||||
o = {};
|
||||
for (var i = 0; i < length; i++) {
|
||||
prop = props[i];
|
||||
o[prop] = resource.getPropertyValues(prop).toArray();
|
||||
}
|
||||
return o;
|
||||
};
|
||||
|
||||
var aspects = function (resource) {
|
||||
var aspects = resource.getAspects();
|
||||
return aspects ? aspects.toArray() : [];
|
||||
};
|
||||
|
||||
var resolveName = function (path) {
|
||||
path = path.charAt(path.length - 1) === '/' ? path.substring(0, path.length - 1) : path;
|
||||
return path.substring(path.lastIndexOf('/') + 1);
|
||||
};
|
||||
|
||||
var merge = function (def, options) {
|
||||
if (options) {
|
||||
for (var op in def) {
|
||||
if (def.hasOwnProperty(op)) {
|
||||
def[op] = options[op] || def[op];
|
||||
}
|
||||
}
|
||||
}
|
||||
return def;
|
||||
};
|
||||
|
||||
var Registry = function (serv, options) {
|
||||
var registryService = server.osgiService('org.wso2.carbon.registry.core.service.RegistryService'),
|
||||
carbon = require('carbon');
|
||||
if (options) {
|
||||
this.server = serv;
|
||||
} else {
|
||||
this.server = new server.Server();
|
||||
options = serv || {};
|
||||
}
|
||||
|
||||
if (options.tenantId) {
|
||||
this.tenantId = options.tenantId;
|
||||
} else if (options.username || options.domain) {
|
||||
this.tenantId = server.tenantId({
|
||||
domain: options.domain,
|
||||
username: options.username
|
||||
});
|
||||
} else {
|
||||
this.tenantId = server.tenantId();
|
||||
}
|
||||
|
||||
if (options.username) {
|
||||
this.username = options.username;
|
||||
} else if (options.system) {
|
||||
this.username = carbon.user.systemUser;
|
||||
} else {
|
||||
this.username = carbon.user.anonUser;
|
||||
}
|
||||
|
||||
this.registry = registryService.getRegistry(this.username, this.tenantId);
|
||||
this.versioning = {
|
||||
comments: StaticConfiguration.isVersioningComments()
|
||||
};
|
||||
};
|
||||
|
||||
registry.Registry = Registry;
|
||||
|
||||
Registry.prototype.put = function (path, resource) {
|
||||
var res;
|
||||
if (resource.collection) {
|
||||
res = this.registry.newCollection();
|
||||
} else {
|
||||
res = this.registry.newResource();
|
||||
if (resource.content instanceof Stream) {
|
||||
res.contentStream = resource.content.getStream();
|
||||
} else {
|
||||
res.content = resource.content || '';
|
||||
}
|
||||
res.mediaType = resource.mediaType || null;
|
||||
}
|
||||
res.name = resource.name;
|
||||
res.description = resource.description || null;
|
||||
res.UUID = resource.uuid || null;
|
||||
|
||||
var values, length, i, ArrayList,
|
||||
properties = resource.properties;
|
||||
if (properties) {
|
||||
ArrayList = java.util.ArrayList;
|
||||
for (var name in properties) {
|
||||
var list = new ArrayList();
|
||||
if (properties.hasOwnProperty(name)) {
|
||||
values = properties[name];
|
||||
values = values instanceof Array ? values : [values];
|
||||
length = values.length;
|
||||
for (i = 0; i < length; i++) {
|
||||
list.add(values[i]);
|
||||
}
|
||||
res.setProperty(name, list);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var aspects = resource.aspects;
|
||||
if (aspects) {
|
||||
length = aspects.length;
|
||||
for (i = 0; i < length; i++) {
|
||||
res.addAspect(aspects[i]);
|
||||
}
|
||||
}
|
||||
|
||||
this.registry.put(path, res);
|
||||
};
|
||||
|
||||
Registry.prototype.remove = function (path) {
|
||||
this.registry.delete(path);
|
||||
};
|
||||
|
||||
Registry.prototype.move = function (src, dest) {
|
||||
this.registry.move(src, dest);
|
||||
};
|
||||
|
||||
Registry.prototype.rename = function (current, newer) {
|
||||
this.registry.rename(current, newer);
|
||||
};
|
||||
|
||||
Registry.prototype.copy = function (src, dest) {
|
||||
this.registry.copy(src, dest);
|
||||
};
|
||||
|
||||
Registry.prototype.restore = function (path) {
|
||||
this.registry.restoreVersion(path);
|
||||
};
|
||||
|
||||
Registry.prototype.get = function (path) {
|
||||
if (!this.exists(path)) {
|
||||
return null;
|
||||
}
|
||||
var res = this.registry.get(path);
|
||||
return resource(this, res);
|
||||
};
|
||||
|
||||
Registry.prototype.exists = function (path) {
|
||||
return this.registry.resourceExists(path);
|
||||
};
|
||||
|
||||
Registry.prototype.content = function (path, paging) {
|
||||
if (!this.exists(path)) {
|
||||
return null;
|
||||
}
|
||||
var resource = this.registry.get(path);
|
||||
paging = merge({
|
||||
start: 0,
|
||||
count: 10,
|
||||
sort: 'recent'
|
||||
}, paging);
|
||||
return content(this, resource, paging);
|
||||
};
|
||||
|
||||
Registry.prototype.tags = function (path) {
|
||||
var tags, i, length,
|
||||
tagz = [];
|
||||
tags = this.registry.getTags(path);
|
||||
length = tags.length;
|
||||
for (i = 0; i < length; i++) {
|
||||
tagz.push(String(tags[i].tagName));
|
||||
}
|
||||
return tagz;
|
||||
};
|
||||
|
||||
Registry.prototype.tag = function (path, tags) {
|
||||
var i, length;
|
||||
tags = tags instanceof Array ? tags : [tags];
|
||||
length = tags.length;
|
||||
for (i = 0; i < length; i++) {
|
||||
this.registry.applyTag(path, tags[i]);
|
||||
}
|
||||
};
|
||||
|
||||
Registry.prototype.untag = function (path, tags) {
|
||||
var i, length;
|
||||
tags = tags instanceof Array ? tags : [tags];
|
||||
length = tags.length;
|
||||
for (i = 0; i < length; i++) {
|
||||
this.registry.removeTag(path, tags[i]);
|
||||
}
|
||||
};
|
||||
|
||||
Registry.prototype.associate = function (src, dest, type) {
|
||||
this.registry.addAssociation(src, dest, type);
|
||||
};
|
||||
|
||||
Registry.prototype.dissociate = function (src, dest, type) {
|
||||
this.registry.removeAssociation(src, dest, type);
|
||||
};
|
||||
|
||||
Registry.prototype.associations = function (path, type) {
|
||||
var i, asso,
|
||||
assos = type ? this.registry.getAssociations(path, type) : this.registry.getAllAssociations(path),
|
||||
length = assos.length,
|
||||
associations = [];
|
||||
for (i = 0; i < length; i++) {
|
||||
asso = assos[i];
|
||||
associations.push({
|
||||
type: String(asso.associationType),
|
||||
src: String(asso.sourcePath),
|
||||
dest: String(asso.destinationPath)
|
||||
});
|
||||
}
|
||||
return associations;
|
||||
};
|
||||
|
||||
Registry.prototype.addProperty = function (path, name, value) {
|
||||
var resource = this.registry.get(path);
|
||||
resource.addProperty(name, value);
|
||||
this.registry.put(path, resource);
|
||||
};
|
||||
|
||||
Registry.prototype.removeProperty = function (path, name, value) {
|
||||
var resource = this.registry.get(path);
|
||||
(value ? resource.removePropertyValue(name, value) : resource.removeProperty(name));
|
||||
this.registry.put(path, resource);
|
||||
};
|
||||
|
||||
Registry.prototype.properties = function (path) {
|
||||
var resource = this.registry.get(path);
|
||||
return properties(resource);
|
||||
};
|
||||
|
||||
Registry.prototype.version = function (path) {
|
||||
this.registry.createVersion(path);
|
||||
};
|
||||
|
||||
Registry.prototype.versions = function (path) {
|
||||
return this.registry.getVersions(path);
|
||||
};
|
||||
|
||||
Registry.prototype.unversion = function (path, snapshot) {
|
||||
this.registry.removeVersionHistory(path, snapshot);
|
||||
};
|
||||
|
||||
Registry.prototype.comment = function (path, comment) {
|
||||
this.registry.addComment(path, new Comment(comment));
|
||||
};
|
||||
|
||||
Registry.prototype.comments = function (path, paging) {
|
||||
var i, length, comments, comment, key,
|
||||
commentz = [];
|
||||
paging = merge({
|
||||
start: 0,
|
||||
count: 25,
|
||||
sort: 'recent'
|
||||
}, paging);
|
||||
|
||||
comments = this.registry.getComments(path);
|
||||
//we have to manually sort this due to the bug in registry.getChildren() (#1 above)
|
||||
key = paging.sort;
|
||||
key = (key === 'time-created-des' || key === 'time-created-asc') ? key : 'time-created-des';
|
||||
comments = comments.sort(resourceSorter(key));
|
||||
comments = comments.slice(paging.start, paging.start + paging.count);
|
||||
length = comments.length;
|
||||
for (i = 0; i < length; i++) {
|
||||
comment = comments[i];
|
||||
commentz.push({
|
||||
content: comment.getText(),
|
||||
created: {
|
||||
author: comment.getUser(),
|
||||
time: comment.getCreatedTime().getTime()
|
||||
},
|
||||
path: comment.getCommentPath()
|
||||
});
|
||||
}
|
||||
return commentz;
|
||||
};
|
||||
|
||||
Registry.prototype.commentCount = function (path) {
|
||||
return this.registry.getComments(path).length;
|
||||
};
|
||||
|
||||
Registry.prototype.uncomment = function (path) {
|
||||
this.registry.removeComment(path);
|
||||
};
|
||||
|
||||
Registry.prototype.rate = function (path, rating) {
|
||||
this.registry.rateResource(path, rating);
|
||||
};
|
||||
|
||||
Registry.prototype.unrate = function (path) {
|
||||
this.registry.rateResource(path, 0);
|
||||
};
|
||||
|
||||
Registry.prototype.rating = function (path, username) {
|
||||
var rating = {
|
||||
average: this.registry.getAverageRating(path)
|
||||
};
|
||||
if (username) {
|
||||
rating.user = this.registry.getRating(path, username);
|
||||
}
|
||||
return rating;
|
||||
};
|
||||
|
||||
Registry.prototype.link = function (path, target) {
|
||||
return this.registry.createLink(path, target);
|
||||
};
|
||||
|
||||
Registry.prototype.unlink = function (path) {
|
||||
return this.registry.removeLink(path);
|
||||
};
|
||||
|
||||
Registry.prototype.search = function (query, paging) {
|
||||
var res = this.registry.searchContent(query);
|
||||
paging = merge({
|
||||
start: 0,
|
||||
count: 10,
|
||||
sort: 'recent'
|
||||
}, paging);
|
||||
return res ? content(this, res, paging) : [];
|
||||
};
|
||||
|
||||
Registry.prototype.query = function (path, params) {
|
||||
var res, name,
|
||||
map = new java.util.HashMap();
|
||||
for (name in params) {
|
||||
if (params.hasOwnProperty(name)) {
|
||||
map.put(name, params[name]);
|
||||
}
|
||||
}
|
||||
res = this.registry.executeQuery(path, map);
|
||||
return res.getChildren();
|
||||
};
|
||||
|
||||
}(server, registry));
|
@ -0,0 +1,56 @@
|
||||
var log = new Log();
|
||||
|
||||
var Registry = function (server) {
|
||||
this.server = server;
|
||||
};
|
||||
|
||||
var Resource = function (name) {
|
||||
|
||||
};
|
||||
|
||||
var Collection = function (name) {
|
||||
|
||||
};
|
||||
|
||||
Registry.prototype.invoke = function (action, payload) {
|
||||
var options,
|
||||
ws = require('ws'),
|
||||
client = new ws.WSRequest(),
|
||||
server = this.server;
|
||||
|
||||
options = {
|
||||
useSOAP: 1.2,
|
||||
useWSA: 1.0,
|
||||
action: action,
|
||||
HTTPHeaders: [
|
||||
{ name: 'Cookie', value: server.cookie }
|
||||
]
|
||||
};
|
||||
|
||||
try {
|
||||
client.open(options, server.url + '/services/WSRegistryService', false);
|
||||
client.send(payload);
|
||||
return client.responseXML;
|
||||
} catch (e) {
|
||||
log.error(e.toString());
|
||||
throw new Error('Error while invoking action in WSRegistryService : ' +
|
||||
action + ', user : ' + server.user.username);
|
||||
}
|
||||
};
|
||||
|
||||
Registry.prototype.putResource = function (path, resource) {
|
||||
|
||||
};
|
||||
|
||||
Registry.prototype.getResource = function (path) {
|
||||
var res, payload,
|
||||
base64 = require('/modules/base64.js');
|
||||
|
||||
payload =
|
||||
<api:getContent xmlns:api="http://api.ws.registry.carbon.wso2.org">
|
||||
<api:path>{path}</api:path>
|
||||
</api:getContent>;
|
||||
|
||||
res = this.invoke('urn:getContent', payload);
|
||||
return base64.decode(String(res.*::['return'].text()));
|
||||
};
|
@ -0,0 +1,24 @@
|
||||
var registry = {};
|
||||
|
||||
(function (registry) {
|
||||
var ActionConstants = Packages.org.wso2.carbon.registry.core.ActionConstants,
|
||||
AccessControlConstants = Packages.org.wso2.carbon.registry.core.utils.AccessControlConstants;
|
||||
|
||||
registry.Registry = function (server, auth) {
|
||||
var osgi = require('registry-osgi.js').registry,
|
||||
o = new osgi.Registry(server, auth);
|
||||
o.prototype = this;
|
||||
return o;
|
||||
};
|
||||
|
||||
registry.actions = {};
|
||||
|
||||
registry.actions.GET = ActionConstants.GET;
|
||||
|
||||
registry.actions.PUT = ActionConstants.PUT;
|
||||
|
||||
registry.actions.DELETE = ActionConstants.DELETE;
|
||||
|
||||
registry.actions.AUTHORIZE = AccessControlConstants.AUTHORIZE;
|
||||
|
||||
}(registry));
|
@ -0,0 +1,40 @@
|
||||
(function (server) {
|
||||
var process = require('process'),
|
||||
configDir = 'file:///' + process.getProperty('carbon.config.dir.path').replace(/[\\]/g, '/').replace(/^[\/]/g, '') + '/';
|
||||
server.loadConfig = function (path) {
|
||||
var content,
|
||||
index = path.lastIndexOf('.'),
|
||||
ext = (index !== -1 && index < path.length) ? path.substring(index + 1) : '',
|
||||
file = new File(configDir + path);
|
||||
if (!file.isExists()) {
|
||||
throw new Error('Specified config file does not exists : ' + path);
|
||||
}
|
||||
if (file.isDirectory()) {
|
||||
throw new Error('Specified config file is a directory : ' + path);
|
||||
}
|
||||
file.open('r');
|
||||
content = file.readAll();
|
||||
file.close();
|
||||
switch (ext) {
|
||||
case 'xml' :
|
||||
return new XML(content);
|
||||
case 'json' :
|
||||
return parse(content);
|
||||
case 'properties' :
|
||||
default :
|
||||
return content;
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
server.home = 'file:///' + require('process').getProperty('carbon.home').replace(/[\\]/g, '/').replace(/^[\/]/g, '');
|
||||
|
||||
server.host = process.getProperty('server.host');
|
||||
|
||||
server.ip = process.getProperty('carbon.local.ip');
|
||||
|
||||
server.httpPort = process.getProperty('http.port');
|
||||
|
||||
server.httpsPort = process.getProperty('https.port');
|
||||
|
||||
}(server));
|
@ -0,0 +1,10 @@
|
||||
var server = {};
|
||||
|
||||
(function (server) {
|
||||
var PrivilegedCarbonContext = Packages.org.wso2.carbon.context.PrivilegedCarbonContext,
|
||||
Class = java.lang.Class;
|
||||
|
||||
server.osgiService = function (clazz) {
|
||||
return PrivilegedCarbonContext.getThreadLocalCarbonContext().getOSGiService(Class.forName(clazz));
|
||||
};
|
||||
}(server));
|
@ -0,0 +1,123 @@
|
||||
(function (server) {
|
||||
var log = new Log();
|
||||
var process = require("process")
|
||||
var login = function (url, username, password) {
|
||||
var res, options, payload,
|
||||
ws = require('ws'),
|
||||
client = new ws.WSRequest(),
|
||||
host = url.match(/.*:\/\/([^:\/]*)/)[1];
|
||||
|
||||
options = {
|
||||
useSOAP: 1.2,
|
||||
useWSA: 1.0,
|
||||
action: 'urn:login'
|
||||
};
|
||||
|
||||
payload =
|
||||
<aut:login xmlns:aut="http://authentication.services.core.carbon.wso2.org">
|
||||
<aut:username>{username}</aut:username>
|
||||
<aut:password>{password}</aut:password>
|
||||
<aut:remoteAddress>{host}</aut:remoteAddress>
|
||||
</aut:login>;
|
||||
|
||||
try {
|
||||
client.open(options, url + '/services/AuthenticationAdmin', false);
|
||||
client.send(payload);
|
||||
res = client.responseXML;
|
||||
if (res.*::["return"].text() != 'true') {
|
||||
return false;
|
||||
}
|
||||
return client.getResponseHeader('Set-Cookie');
|
||||
} catch (e) {
|
||||
log.error(e.toString());
|
||||
throw new Error('Error while login to the server : ' + url + ', user : ' + username);
|
||||
}
|
||||
};
|
||||
|
||||
var logout = function (url, cookie) {
|
||||
var options,
|
||||
ws = require('ws'),
|
||||
client = new ws.WSRequest();
|
||||
|
||||
options = {
|
||||
useSOAP: 1.2,
|
||||
useWSA: 1.0,
|
||||
action: 'urn:logout',
|
||||
mep: 'in-only',
|
||||
HTTPHeaders: [
|
||||
{ name: 'Cookie', value: cookie }
|
||||
]
|
||||
};
|
||||
|
||||
try {
|
||||
client.open(options, url + '/services/AuthenticationAdmin', false);
|
||||
client.send(null);
|
||||
return true;
|
||||
} catch (e) {
|
||||
log.error(e.toString());
|
||||
throw new Error('Error while logging out in server : ' + url + ', cookie : ' + cookie);
|
||||
}
|
||||
};
|
||||
|
||||
var Cookie = function (cookie) {
|
||||
this.cookie = cookie;
|
||||
};
|
||||
|
||||
server.Cookie = Cookie;
|
||||
|
||||
var Server = function (options) {
|
||||
this.url = (options && options.url) ? options.url : 'local:/';
|
||||
};
|
||||
server.Server = Server;
|
||||
|
||||
Server.prototype.authenticate = function (username, password) {
|
||||
var realm, user,
|
||||
carbon = require('carbon'),
|
||||
realmService = server.osgiService('org.wso2.carbon.user.core.service.RealmService');
|
||||
user = carbon.server.tenantUser(username);
|
||||
realm = realmService.getTenantUserRealm(user.tenantId);
|
||||
return realm.getUserStoreManager().authenticate(user.username, password);
|
||||
};
|
||||
|
||||
Server.prototype.login = function (username, password) {
|
||||
var cookie = login(this.url, username, password);
|
||||
return new Cookie(cookie);
|
||||
};
|
||||
/*
|
||||
Description:- If the HostName is provided in carbon.xml it will be used to return the
|
||||
address with the valid port. If HostName is not mentioned -local ip will be used
|
||||
to return the address.
|
||||
Usage:- Scenario where the address of the server is required based on host or ip
|
||||
Parameters:- Transport is https or http.
|
||||
*/
|
||||
server.address = function(transport){
|
||||
var host = process.getProperty('server.host'),
|
||||
ip = process.getProperty('carbon.local.ip');
|
||||
var port;
|
||||
if(transport=="http"){
|
||||
port = process.getProperty('mgt.transport.http.proxyPort');
|
||||
if(!port){
|
||||
//can use http.port as well
|
||||
port = process.getProperty('mgt.transport.http.port');
|
||||
}
|
||||
}else if(transport=="https"){
|
||||
port = process.getProperty('mgt.transport.https.proxyPort');
|
||||
if(!port){
|
||||
//can use https.port as well
|
||||
port = process.getProperty('mgt.transport.https.port');
|
||||
}
|
||||
}
|
||||
var postUrl;
|
||||
if(host==null || host=="localhost"){
|
||||
postUrl = transport+"://" + ip + ":" + port;
|
||||
}else{
|
||||
postUrl = transport+"://" + host+ ":" +port;
|
||||
}
|
||||
return postUrl;
|
||||
}
|
||||
|
||||
|
||||
Server.prototype.logout = function (cookie) {
|
||||
return logout(this.url, cookie.cookie);
|
||||
};
|
||||
}(server));
|
@ -0,0 +1,69 @@
|
||||
(function (server) {
|
||||
var log = new Log(),
|
||||
PrivilegedCarbonContext = Packages.org.wso2.carbon.context.PrivilegedCarbonContext,
|
||||
MultitenantConstants = Packages.org.wso2.carbon.utils.multitenancy.MultitenantConstants,
|
||||
MultitenantUtils = Packages.org.wso2.carbon.utils.multitenancy.MultitenantUtils,
|
||||
realmService = server.osgiService('org.wso2.carbon.user.core.service.RealmService'),
|
||||
tenantManager = realmService.getTenantManager();
|
||||
|
||||
server.tenantDomain = function (options) {
|
||||
if (!options) {
|
||||
return PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain();
|
||||
}
|
||||
if (options.tenantId) {
|
||||
return tenantManager.getDomain(options.tenantId);
|
||||
}
|
||||
if (options.username) {
|
||||
return MultitenantUtils.getTenantDomain(options.username);
|
||||
}
|
||||
if (options.url) {
|
||||
return MultitenantUtils.getTenantDomainFromRequestURL(options.url);
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
server.tenantId = function (options) {
|
||||
var domain = options ? (options.domain || server.tenantDomain(options)) : server.tenantDomain();
|
||||
return domain ? tenantManager.getTenantId(domain) : null;
|
||||
};
|
||||
|
||||
server.tenantUser = function (username) {
|
||||
var domain = server.tenantDomain({
|
||||
username: username
|
||||
}),
|
||||
id = server.tenantId({
|
||||
domain: domain
|
||||
});
|
||||
username = MultitenantUtils.getTenantAwareUsername(username);
|
||||
return {
|
||||
domain: domain,
|
||||
username: username,
|
||||
tenantId: id
|
||||
};
|
||||
};
|
||||
|
||||
server.superTenant = {
|
||||
tenantId: MultitenantConstants.SUPER_TENANT_ID,
|
||||
domain: MultitenantConstants.SUPER_TENANT_DOMAIN_NAME
|
||||
};
|
||||
|
||||
server.sandbox = function (options, fn) {
|
||||
var context,
|
||||
PrivilegedCarbonContext = org.wso2.carbon.context.PrivilegedCarbonContext;
|
||||
PrivilegedCarbonContext.startTenantFlow();
|
||||
log.debug('startTenantFlow');
|
||||
try {
|
||||
context = PrivilegedCarbonContext.getThreadLocalCarbonContext();
|
||||
context.setTenantDomain(server.tenantDomain({
|
||||
tenantId: options.tenantId
|
||||
}));
|
||||
context.setTenantId(options.tenantId);
|
||||
context.setUsername(options.username || null);
|
||||
return fn();
|
||||
} finally {
|
||||
PrivilegedCarbonContext.endTenantFlow();
|
||||
log.debug('endTenantFlow');
|
||||
}
|
||||
};
|
||||
|
||||
}(server));
|
@ -0,0 +1,39 @@
|
||||
(function (server, registry, user) {
|
||||
|
||||
var Space = function (user, space, options) {
|
||||
var serv = new server.Server(options.serverUrl);
|
||||
this.registry = new registry.Registry(serv, {
|
||||
username: options.username || user,
|
||||
domain: options.domain || server.tenantDomain()
|
||||
});
|
||||
this.prefix = options.path + '/' + user + '/' + space;
|
||||
if (!this.registry.exists(this.prefix)) {
|
||||
this.registry.put(this.prefix, {
|
||||
collection: true
|
||||
});
|
||||
}
|
||||
};
|
||||
user.Space = Space;
|
||||
|
||||
Space.prototype.put = function (key, value) {
|
||||
value = (!(value instanceof String) && typeof value !== "string") ? stringify(value) : value;
|
||||
this.registry.put(this.prefix + '/' + key, {
|
||||
content: value
|
||||
});
|
||||
};
|
||||
|
||||
Space.prototype.get = function (key) {
|
||||
var o = this.registry.content(this.prefix + '/' + key);
|
||||
return o ? o.toString() : null;
|
||||
};
|
||||
|
||||
Space.prototype.remove = function (key) {
|
||||
this.registry.remove(this.prefix + '/' + key);
|
||||
};
|
||||
|
||||
Space.prototype.find = function (filter) {
|
||||
|
||||
};
|
||||
|
||||
|
||||
}(server, registry, user));
|
@ -0,0 +1,10 @@
|
||||
(function (server, user) {
|
||||
|
||||
user.Space = function (user, space, options) {
|
||||
var reg = require('registry-space.js').user,
|
||||
o = new reg.Space(user, space, options);
|
||||
o.prototype = this;
|
||||
return o;
|
||||
};
|
||||
|
||||
}(server, user));
|
@ -0,0 +1,179 @@
|
||||
(function (server, user) {
|
||||
|
||||
var log = new Log();
|
||||
|
||||
var processPerms = function (perms, fn) {
|
||||
var perm, actions, i, length;
|
||||
for (perm in perms) {
|
||||
if (perms.hasOwnProperty(perm)) {
|
||||
actions = perms[perm];
|
||||
length = actions.length;
|
||||
for (i = 0; i < length; i++) {
|
||||
fn(perm, actions[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var UserManager = function (serv, tenantId) {
|
||||
this.server = serv;
|
||||
this.tenantId = tenantId || server.superTenant.tenantId;
|
||||
var realmService = server.osgiService('org.wso2.carbon.user.core.service.RealmService'),
|
||||
realm = realmService.getTenantUserRealm(this.tenantId);
|
||||
this.manager = realm.getUserStoreManager();
|
||||
this.authorizer = realm.getAuthorizationManager();
|
||||
};
|
||||
user.UserManager = UserManager;
|
||||
|
||||
UserManager.prototype.getUser = function (username) {
|
||||
if (!this.manager.isExistingUser(username)) {
|
||||
return null;
|
||||
}
|
||||
return new user.User(this, username);
|
||||
};
|
||||
UserManager.prototype.getRoleListOfUser = function (username) {
|
||||
return this.manager.getRoleListOfUser(username);
|
||||
};
|
||||
UserManager.prototype.addUser = function (username, password, roles, claims, profile) {
|
||||
this.manager.addUser(username, password, roles || [], claims || null, profile);
|
||||
};
|
||||
UserManager.prototype.changePassword = function (username, newPassword, oldPassword) {
|
||||
this.manager.updateCredential(username, newPassword, oldPassword);
|
||||
};
|
||||
|
||||
UserManager.prototype.removeUser = function (username) {
|
||||
this.manager.deleteUser(username);
|
||||
};
|
||||
|
||||
UserManager.prototype.userExists = function (username) {
|
||||
return this.manager.isExistingUser(username);
|
||||
};
|
||||
|
||||
UserManager.prototype.roleExists = function (role) {
|
||||
return this.manager.isExistingRole(role);
|
||||
};
|
||||
UserManager.prototype.updateRole = function (previousRoleName, newRoleName) {
|
||||
return this.manager.updateRoleName(previousRoleName, newRoleName);
|
||||
};
|
||||
UserManager.prototype.getClaims = function (username, profile) {
|
||||
return this.manager.getUserClaimValues(username, profile);
|
||||
};
|
||||
UserManager.prototype.getClaimsForSet = function (username,claims, profile) {
|
||||
return this.manager.getUserClaimValues(username,claims, profile);
|
||||
};
|
||||
UserManager.prototype.getClaim = function (username, claim, profile) {
|
||||
return this.manager.getUserClaimValue(username, claim, profile);
|
||||
};
|
||||
|
||||
UserManager.prototype.setClaims = function (username, claims, profile) {
|
||||
return this.manager.setUserClaimValues(username, claims, profile);
|
||||
};
|
||||
|
||||
UserManager.prototype.setClaim = function (username, claim, value, profile) {
|
||||
return this.manager.setUserClaimValue(username, claim, value, profile);
|
||||
};
|
||||
|
||||
UserManager.prototype.isAuthorized = function (role, permission, action) {
|
||||
return this.authorizer.isRoleAuthorized(role, permission, action);
|
||||
};
|
||||
UserManager.prototype.updateRoleListOfUser = function(name, deletedRoles, newRoles){
|
||||
return this.manager.updateRoleListOfUser(name, deletedRoles, newRoles);
|
||||
};
|
||||
UserManager.prototype.updateUserListOfRole = function(name, deletedUsers, newUsers){
|
||||
return this.manager.updateUserListOfRole(name, deletedUsers, newUsers);
|
||||
};
|
||||
UserManager.prototype.listUsers = function (filter) {
|
||||
if(filter){
|
||||
return this.manager.listUsers(filter, -1);
|
||||
}else{
|
||||
return this.manager.listUsers("*", -1);
|
||||
}
|
||||
};
|
||||
UserManager.prototype.addRole = function (role, users, permissions) {
|
||||
var perms = [],
|
||||
Permission = Packages.org.wso2.carbon.user.api.Permission;
|
||||
processPerms(permissions, function (id, action) {
|
||||
perms.push(new Permission(id, action));
|
||||
});
|
||||
this.manager['addRole(java.lang.String,java.lang.String[],org.wso2.carbon.user.api.Permission[])']
|
||||
(role, users, perms);
|
||||
};
|
||||
UserManager.prototype.clearResourceAuthorizations = function (resource) {
|
||||
this.authorizer.clearResourceAuthorizations(resource)
|
||||
};
|
||||
|
||||
UserManager.prototype.removeRole = function (role) {
|
||||
this.manager.deleteRole(role);
|
||||
};
|
||||
|
||||
UserManager.prototype.allRoles = function () {
|
||||
return this.manager.getRoleNames();
|
||||
};
|
||||
UserManager.prototype.getUserListOfRole = function (role) {
|
||||
return this.manager.getUserListOfRole(role);
|
||||
};
|
||||
/**
|
||||
* um.authorizeRole('store-admin', '/permissions/mypermission', 'ui-execute');
|
||||
*
|
||||
* um.authorizeRole('store-admin', {
|
||||
* '/permissions/myperm1' : ['read', 'write'],
|
||||
* '/permissions/myperm2' : ['read', 'write']
|
||||
* });
|
||||
*
|
||||
* @param role
|
||||
* @param permission
|
||||
* @param action
|
||||
*/
|
||||
UserManager.prototype.authorizeRole = function (role, permission, action) {
|
||||
var that = this;
|
||||
if (permission instanceof String || typeof permission === 'string') {
|
||||
if (!that.isAuthorized(role, permission, action)) {
|
||||
that.authorizer.authorizeRole(role, permission, action);
|
||||
}
|
||||
} else {
|
||||
processPerms(permission, function (id, action) {
|
||||
if (!that.isAuthorized(role, id, action)) {
|
||||
that.authorizer.authorizeRole(role, id, action);
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug('permission added(role:permission:action) - ' + role + ':' + id + ':' + action);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* um.denyRole('store-admin', '/permissions/mypermission', 'ui-execute');
|
||||
*
|
||||
* um.denyRole('store-admin', {
|
||||
* '/permissions/myperm1' : ['read', 'write'],
|
||||
* '/permissions/myperm2' : ['read', 'write']
|
||||
* });
|
||||
*
|
||||
* @param role
|
||||
* @param permission
|
||||
* @param action
|
||||
*/
|
||||
UserManager.prototype.denyRole = function (role, permission, action) {
|
||||
var that = this;
|
||||
if (permission instanceof String || typeof permission === 'string') {
|
||||
that.authorizer.denyRole(role, permission, action);
|
||||
} else {
|
||||
processPerms(permission, function (id, action) {
|
||||
that.authorizer.denyRole(role, id, action);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* getAllowedUIResources This will return all allowed UI resource for given user
|
||||
* @param userName User name
|
||||
* @param permissionRootPath User permission root path
|
||||
* @return Array with permission resource paths
|
||||
*/
|
||||
UserManager.prototype.getAllowedUIResources = function(userName, permissionRootPath){
|
||||
var allowedResources = this.authorizer.getAllowedUIResourcesForUser(userName, permissionRootPath);
|
||||
return allowedResources;
|
||||
};
|
||||
|
||||
}(server, user));
|
@ -0,0 +1,78 @@
|
||||
var user = {};
|
||||
|
||||
(function (user) {
|
||||
|
||||
var CarbonConstants = Packages.org.wso2.carbon.CarbonConstants;
|
||||
|
||||
user.systemUser = CarbonConstants.REGISTRY_SYSTEM_USERNAME;
|
||||
|
||||
user.anonUser = CarbonConstants.REGISTRY_ANONNYMOUS_USERNAME;
|
||||
|
||||
user.anonRole = CarbonConstants.REGISTRY_ANONNYMOUS_ROLE_NAME;
|
||||
|
||||
var User = function (manager, username) {
|
||||
this.um = manager;
|
||||
this.tenantId = manager.tenantId;
|
||||
this.username = username;
|
||||
};
|
||||
user.User = User;
|
||||
|
||||
User.prototype.getClaims = function (profile) {
|
||||
return this.um.getClaims(this.username, profile);
|
||||
};
|
||||
User.prototype.getClaimsForSet = function (claims,profile) {
|
||||
return this.um.getClaimsForSet(this.username, claims, profile);
|
||||
};
|
||||
|
||||
User.prototype.setClaims = function (claims, profile) {
|
||||
this.um.setClaims(this.username, claims, profile);
|
||||
};
|
||||
|
||||
User.prototype.getRoles = function () {
|
||||
return this.um.manager.getRoleListOfUser(this.username);
|
||||
};
|
||||
|
||||
User.prototype.hasRoles = function (roles) {
|
||||
var i, j, role,
|
||||
rs = this.getRoles(),
|
||||
length1 = roles.length,
|
||||
length2 = rs.length;
|
||||
L1:
|
||||
for (i = 0; i < length1; i++) {
|
||||
//Array.indexOf() fails due to Java String vs JS String difference
|
||||
role = roles[i];
|
||||
for (j = 0; j < length2; j++) {
|
||||
if (role == rs[j]) {
|
||||
continue L1;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
User.prototype.addRoles = function (roles) {
|
||||
return this.um.manager.updateRoleListOfUser(this.username, [], roles);
|
||||
};
|
||||
|
||||
User.prototype.removeRoles = function (roles) {
|
||||
return this.um.manager.updateRoleListOfUser(this.username, roles, []);
|
||||
};
|
||||
|
||||
User.prototype.updateRoles = function (remove, add) {
|
||||
return this.um.manager.updateRoleListOfUser(this.username, remove, add);
|
||||
};
|
||||
|
||||
User.prototype.isAuthorized = function (permission, action) {
|
||||
var i,
|
||||
roles = this.getRoles(),
|
||||
length = roles.length;
|
||||
for (i = 0; i < length; i++) {
|
||||
if (this.um.authorizer.isRoleAuthorized(roles[i], permission, action)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
}(user));
|
@ -0,0 +1,23 @@
|
||||
<module name="process" namespace="$process" expose="false" xmlns="http://wso2.org/projects/jaggery/module.xml">
|
||||
<!-- methods -->
|
||||
<method readOnly="true">
|
||||
<className>org.jaggeryjs.modules.process.ProcessHostObject</className>
|
||||
<name>getEnv</name>
|
||||
</method>
|
||||
<method readOnly="true">
|
||||
<className>org.jaggeryjs.modules.process.ProcessHostObject</className>
|
||||
<name>getEnvs</name>
|
||||
</method>
|
||||
<method readOnly="true">
|
||||
<className>org.jaggeryjs.modules.process.ProcessHostObject</className>
|
||||
<name>getProperty</name>
|
||||
</method>
|
||||
<method readOnly="true">
|
||||
<className>org.jaggeryjs.modules.process.ProcessHostObject</className>
|
||||
<name>getProperties</name>
|
||||
</method>
|
||||
<method readOnly="true">
|
||||
<className>org.jaggeryjs.modules.process.ProcessHostObject</className>
|
||||
<name>setProperty</name>
|
||||
</method>
|
||||
</module>
|
@ -0,0 +1,239 @@
|
||||
body.dashboard {
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.dropdown-menu {
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
|
||||
.dashboard .btn-default.active,
|
||||
.dashboard .btn-default.active:focus {
|
||||
background-color: #29313E;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.dashboard .btn-default.active:hover {
|
||||
background-color: #53627B;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.dashboard .page-header {
|
||||
background: #29313e;
|
||||
min-height: 50px;
|
||||
padding: 0;
|
||||
color: #ebeced;
|
||||
}
|
||||
|
||||
.dashboard .page-header .page-title > h1 {
|
||||
padding: 15px 15px 0 15px;
|
||||
font-weight: 100;
|
||||
text-transform: uppercase;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.dashboard .page-header .page-title > h1 > .icon {
|
||||
font-size: 24px;
|
||||
margin-top: -5px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.dashboard .page-header .navbar-header {
|
||||
margin-right: 15px;
|
||||
margin-left: 15px;
|
||||
float: none;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.dashboard .page-header .navbar-collapse.collapse {
|
||||
display: none !important;
|
||||
}
|
||||
.page-header .container-fluid {
|
||||
padding: 0 15px;
|
||||
}
|
||||
.navbar-nav > li > a {
|
||||
padding: 10px 0;
|
||||
}
|
||||
}
|
||||
|
||||
.nav > li > a > .icon {
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.nav > li > a > .badge {
|
||||
position: absolute;
|
||||
top: 5px;
|
||||
right: 5px;
|
||||
background: #ff124a;
|
||||
}
|
||||
|
||||
.dashboard .page-header .auth {
|
||||
margin-bottom: 0;
|
||||
padding: 6px 0;
|
||||
}
|
||||
|
||||
.dashboard .page-content {
|
||||
overflow: inherit;
|
||||
}
|
||||
|
||||
.dashboard .footer {
|
||||
background: #0d1219;
|
||||
}
|
||||
|
||||
.dashboard .gadget-wrapper {
|
||||
border: 1px dashed #e4e4e4;
|
||||
}
|
||||
|
||||
.dashboard .gadget .gadget-heading {
|
||||
background: transparent;
|
||||
border-bottom: none;
|
||||
color: #29313e;
|
||||
}
|
||||
|
||||
.gadget .gadget-heading > .gadget-title {
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.gadget .gadget-heading > .gadget-actions button {
|
||||
border: none;
|
||||
}
|
||||
|
||||
.sidebar-wrapper hr {
|
||||
border-top-color: #ebeced;
|
||||
}
|
||||
|
||||
.sidebar-toggle-button {
|
||||
float: left;
|
||||
height: 50px;
|
||||
line-height: 50px;
|
||||
font-size: 18px;
|
||||
background: #438cad;
|
||||
color: #ffffff;
|
||||
margin-left: -15px;
|
||||
}
|
||||
|
||||
.sidebar-toggle-button > .icon {
|
||||
line-height: 48px;
|
||||
}
|
||||
|
||||
.sidebar-nav {
|
||||
background: #29313e;
|
||||
color: #e3e5e6;
|
||||
}
|
||||
|
||||
.nav.pages {
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.nav.pages > li {
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
.nav > li {
|
||||
text-indent: 0;
|
||||
line-height: 10px;
|
||||
}
|
||||
|
||||
.nav > li > a {
|
||||
border-radius: 0;
|
||||
color: #e3e5e6;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.collapse-nav-sub > li > a {
|
||||
padding: 4px 10px;
|
||||
font-size: 21px;
|
||||
}
|
||||
|
||||
.collapse-nav-sub > li > a > .icon {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.page-header .fw-inverse {
|
||||
color: #29313e;
|
||||
}
|
||||
|
||||
.nav li:hover > a,
|
||||
.nav li.open > a,
|
||||
.nav li.open > a:focus,
|
||||
.nav li.open > a:hover {
|
||||
background: #1a2332;
|
||||
}
|
||||
|
||||
.nav > li > a:focus {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.nav.pages > li.active a {
|
||||
background: #121822;
|
||||
border-left: 5px solid #438cad;
|
||||
}
|
||||
|
||||
.navbar-collapse {
|
||||
padding: 15px;
|
||||
background: #1A2331;
|
||||
}
|
||||
|
||||
.navbar-collapse li:hover > a {
|
||||
background: #29313E;
|
||||
}
|
||||
|
||||
.sidebar-nav .user {
|
||||
text-align: center;
|
||||
margin: 20px auto;
|
||||
}
|
||||
|
||||
.sidebar-nav .user > .user-image {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.sidebar-nav .user > .user-image > .default .icon {
|
||||
font-size: 25px;
|
||||
}
|
||||
|
||||
.sidebar-nav .user > .user-image > .default .icon .fw-inverse,
|
||||
.sidebar-nav .user > .user-image > .default .icon .fa-inverse {
|
||||
color: #29313e;
|
||||
}
|
||||
|
||||
.widget .gadget-wrapper {
|
||||
border: none;
|
||||
}
|
||||
|
||||
.widget .ues-component-heading {
|
||||
display: none !important;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.widget .ues-component {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.widget.form-control-widget {
|
||||
height: 35px !important;
|
||||
}
|
||||
|
||||
.dropdown-menu.arrow.arrow-top-right:before {
|
||||
right: 20px;
|
||||
}
|
||||
|
||||
.dropdown-menu.arrow:before,
|
||||
.dropdown-menu.arrow.arrow-top-left:before {
|
||||
top: -10px;
|
||||
border-right: 10px solid transparent;
|
||||
border-bottom: 10px solid #e4e4e4;
|
||||
border-left: 10px solid transparent;
|
||||
}
|
||||
|
||||
.dropdown-menu.alerts {
|
||||
min-width: 400px;
|
||||
max-width: 100%;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
ul.sidebar-messages > li:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
ul.sidebar-messages > li:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
var vizgSettings = {
|
||||
colorScale: colorbrewer.RdYlBu[4].reverse(),
|
||||
colors: {
|
||||
green:"#5FCE9B",
|
||||
blue:"#438CAD",
|
||||
red:"#E87352",
|
||||
yellow:"#EECA5A",
|
||||
purple:"#B6688F",
|
||||
grey:"434343",
|
||||
brown:"#C59787"
|
||||
}
|
||||
}
|
@ -0,0 +1,303 @@
|
||||
// This product includes color specifications and designs developed by Cynthia Brewer (http://colorbrewer.org/).
|
||||
// JavaScript specs as packaged in the D3 library (d3js.org). Please see license at http://colorbrewer.org/export/LICENSE.txt
|
||||
var colorbrewer = {YlGn: {
|
||||
3: ["#f7fcb9","#addd8e","#31a354"],
|
||||
4: ["#ffffcc","#c2e699","#78c679","#238443"],
|
||||
5: ["#ffffcc","#c2e699","#78c679","#31a354","#006837"],
|
||||
6: ["#ffffcc","#d9f0a3","#addd8e","#78c679","#31a354","#006837"],
|
||||
7: ["#ffffcc","#d9f0a3","#addd8e","#78c679","#41ab5d","#238443","#005a32"],
|
||||
8: ["#ffffe5","#f7fcb9","#d9f0a3","#addd8e","#78c679","#41ab5d","#238443","#005a32"],
|
||||
9: ["#ffffe5","#f7fcb9","#d9f0a3","#addd8e","#78c679","#41ab5d","#238443","#006837","#004529"]
|
||||
},YlGnBu: {
|
||||
3: ["#edf8b1","#7fcdbb","#2c7fb8"],
|
||||
4: ["#ffffcc","#a1dab4","#41b6c4","#225ea8"],
|
||||
5: ["#ffffcc","#a1dab4","#41b6c4","#2c7fb8","#253494"],
|
||||
6: ["#ffffcc","#c7e9b4","#7fcdbb","#41b6c4","#2c7fb8","#253494"],
|
||||
7: ["#ffffcc","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#0c2c84"],
|
||||
8: ["#ffffd9","#edf8b1","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#0c2c84"],
|
||||
9: ["#ffffd9","#edf8b1","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#253494","#081d58"]
|
||||
},GnBu: {
|
||||
3: ["#e0f3db","#a8ddb5","#43a2ca"],
|
||||
4: ["#f0f9e8","#bae4bc","#7bccc4","#2b8cbe"],
|
||||
5: ["#f0f9e8","#bae4bc","#7bccc4","#43a2ca","#0868ac"],
|
||||
6: ["#f0f9e8","#ccebc5","#a8ddb5","#7bccc4","#43a2ca","#0868ac"],
|
||||
7: ["#f0f9e8","#ccebc5","#a8ddb5","#7bccc4","#4eb3d3","#2b8cbe","#08589e"],
|
||||
8: ["#f7fcf0","#e0f3db","#ccebc5","#a8ddb5","#7bccc4","#4eb3d3","#2b8cbe","#08589e"],
|
||||
9: ["#f7fcf0","#e0f3db","#ccebc5","#a8ddb5","#7bccc4","#4eb3d3","#2b8cbe","#0868ac","#084081"]
|
||||
},BuGn: {
|
||||
3: ["#e5f5f9","#99d8c9","#2ca25f"],
|
||||
4: ["#edf8fb","#b2e2e2","#66c2a4","#238b45"],
|
||||
5: ["#edf8fb","#b2e2e2","#66c2a4","#2ca25f","#006d2c"],
|
||||
6: ["#edf8fb","#ccece6","#99d8c9","#66c2a4","#2ca25f","#006d2c"],
|
||||
7: ["#edf8fb","#ccece6","#99d8c9","#66c2a4","#41ae76","#238b45","#005824"],
|
||||
8: ["#f7fcfd","#e5f5f9","#ccece6","#99d8c9","#66c2a4","#41ae76","#238b45","#005824"],
|
||||
9: ["#f7fcfd","#e5f5f9","#ccece6","#99d8c9","#66c2a4","#41ae76","#238b45","#006d2c","#00441b"]
|
||||
},PuBuGn: {
|
||||
3: ["#ece2f0","#a6bddb","#1c9099"],
|
||||
4: ["#f6eff7","#bdc9e1","#67a9cf","#02818a"],
|
||||
5: ["#f6eff7","#bdc9e1","#67a9cf","#1c9099","#016c59"],
|
||||
6: ["#f6eff7","#d0d1e6","#a6bddb","#67a9cf","#1c9099","#016c59"],
|
||||
7: ["#f6eff7","#d0d1e6","#a6bddb","#67a9cf","#3690c0","#02818a","#016450"],
|
||||
8: ["#fff7fb","#ece2f0","#d0d1e6","#a6bddb","#67a9cf","#3690c0","#02818a","#016450"],
|
||||
9: ["#fff7fb","#ece2f0","#d0d1e6","#a6bddb","#67a9cf","#3690c0","#02818a","#016c59","#014636"]
|
||||
},PuBu: {
|
||||
3: ["#ece7f2","#a6bddb","#2b8cbe"],
|
||||
4: ["#f1eef6","#bdc9e1","#74a9cf","#0570b0"],
|
||||
5: ["#f1eef6","#bdc9e1","#74a9cf","#2b8cbe","#045a8d"],
|
||||
6: ["#f1eef6","#d0d1e6","#a6bddb","#74a9cf","#2b8cbe","#045a8d"],
|
||||
7: ["#f1eef6","#d0d1e6","#a6bddb","#74a9cf","#3690c0","#0570b0","#034e7b"],
|
||||
8: ["#fff7fb","#ece7f2","#d0d1e6","#a6bddb","#74a9cf","#3690c0","#0570b0","#034e7b"],
|
||||
9: ["#fff7fb","#ece7f2","#d0d1e6","#a6bddb","#74a9cf","#3690c0","#0570b0","#045a8d","#023858"]
|
||||
},BuPu: {
|
||||
3: ["#e0ecf4","#9ebcda","#8856a7"],
|
||||
4: ["#edf8fb","#b3cde3","#8c96c6","#88419d"],
|
||||
5: ["#edf8fb","#b3cde3","#8c96c6","#8856a7","#810f7c"],
|
||||
6: ["#edf8fb","#bfd3e6","#9ebcda","#8c96c6","#8856a7","#810f7c"],
|
||||
7: ["#edf8fb","#bfd3e6","#9ebcda","#8c96c6","#8c6bb1","#88419d","#6e016b"],
|
||||
8: ["#f7fcfd","#e0ecf4","#bfd3e6","#9ebcda","#8c96c6","#8c6bb1","#88419d","#6e016b"],
|
||||
9: ["#f7fcfd","#e0ecf4","#bfd3e6","#9ebcda","#8c96c6","#8c6bb1","#88419d","#810f7c","#4d004b"]
|
||||
},RdPu: {
|
||||
3: ["#fde0dd","#fa9fb5","#c51b8a"],
|
||||
4: ["#feebe2","#fbb4b9","#f768a1","#ae017e"],
|
||||
5: ["#feebe2","#fbb4b9","#f768a1","#c51b8a","#7a0177"],
|
||||
6: ["#feebe2","#fcc5c0","#fa9fb5","#f768a1","#c51b8a","#7a0177"],
|
||||
7: ["#feebe2","#fcc5c0","#fa9fb5","#f768a1","#dd3497","#ae017e","#7a0177"],
|
||||
8: ["#fff7f3","#fde0dd","#fcc5c0","#fa9fb5","#f768a1","#dd3497","#ae017e","#7a0177"],
|
||||
9: ["#fff7f3","#fde0dd","#fcc5c0","#fa9fb5","#f768a1","#dd3497","#ae017e","#7a0177","#49006a"]
|
||||
},PuRd: {
|
||||
3: ["#e7e1ef","#c994c7","#dd1c77"],
|
||||
4: ["#f1eef6","#d7b5d8","#df65b0","#ce1256"],
|
||||
5: ["#f1eef6","#d7b5d8","#df65b0","#dd1c77","#980043"],
|
||||
6: ["#f1eef6","#d4b9da","#c994c7","#df65b0","#dd1c77","#980043"],
|
||||
7: ["#f1eef6","#d4b9da","#c994c7","#df65b0","#e7298a","#ce1256","#91003f"],
|
||||
8: ["#f7f4f9","#e7e1ef","#d4b9da","#c994c7","#df65b0","#e7298a","#ce1256","#91003f"],
|
||||
9: ["#f7f4f9","#e7e1ef","#d4b9da","#c994c7","#df65b0","#e7298a","#ce1256","#980043","#67001f"]
|
||||
},OrRd: {
|
||||
3: ["#fee8c8","#fdbb84","#e34a33"],
|
||||
4: ["#fef0d9","#fdcc8a","#fc8d59","#d7301f"],
|
||||
5: ["#fef0d9","#fdcc8a","#fc8d59","#e34a33","#b30000"],
|
||||
6: ["#fef0d9","#fdd49e","#fdbb84","#fc8d59","#e34a33","#b30000"],
|
||||
7: ["#fef0d9","#fdd49e","#fdbb84","#fc8d59","#ef6548","#d7301f","#990000"],
|
||||
8: ["#fff7ec","#fee8c8","#fdd49e","#fdbb84","#fc8d59","#ef6548","#d7301f","#990000"],
|
||||
9: ["#fff7ec","#fee8c8","#fdd49e","#fdbb84","#fc8d59","#ef6548","#d7301f","#b30000","#7f0000"]
|
||||
},YlOrRd: {
|
||||
3: ["#ffeda0","#feb24c","#f03b20"],
|
||||
4: ["#ffffb2","#fecc5c","#fd8d3c","#e31a1c"],
|
||||
5: ["#ffffb2","#fecc5c","#fd8d3c","#f03b20","#bd0026"],
|
||||
6: ["#ffffb2","#fed976","#feb24c","#fd8d3c","#f03b20","#bd0026"],
|
||||
7: ["#ffffb2","#fed976","#feb24c","#fd8d3c","#fc4e2a","#e31a1c","#b10026"],
|
||||
8: ["#ffffcc","#ffeda0","#fed976","#feb24c","#fd8d3c","#fc4e2a","#e31a1c","#b10026"],
|
||||
9: ["#ffffcc","#ffeda0","#fed976","#feb24c","#fd8d3c","#fc4e2a","#e31a1c","#bd0026","#800026"]
|
||||
},YlOrBr: {
|
||||
3: ["#fff7bc","#fec44f","#d95f0e"],
|
||||
4: ["#ffffd4","#fed98e","#fe9929","#cc4c02"],
|
||||
5: ["#ffffd4","#fed98e","#fe9929","#d95f0e","#993404"],
|
||||
6: ["#ffffd4","#fee391","#fec44f","#fe9929","#d95f0e","#993404"],
|
||||
7: ["#ffffd4","#fee391","#fec44f","#fe9929","#ec7014","#cc4c02","#8c2d04"],
|
||||
8: ["#ffffe5","#fff7bc","#fee391","#fec44f","#fe9929","#ec7014","#cc4c02","#8c2d04"],
|
||||
9: ["#ffffe5","#fff7bc","#fee391","#fec44f","#fe9929","#ec7014","#cc4c02","#993404","#662506"]
|
||||
},Purples: {
|
||||
3: ["#efedf5","#bcbddc","#756bb1"],
|
||||
4: ["#f2f0f7","#cbc9e2","#9e9ac8","#6a51a3"],
|
||||
5: ["#f2f0f7","#cbc9e2","#9e9ac8","#756bb1","#54278f"],
|
||||
6: ["#f2f0f7","#dadaeb","#bcbddc","#9e9ac8","#756bb1","#54278f"],
|
||||
7: ["#f2f0f7","#dadaeb","#bcbddc","#9e9ac8","#807dba","#6a51a3","#4a1486"],
|
||||
8: ["#fcfbfd","#efedf5","#dadaeb","#bcbddc","#9e9ac8","#807dba","#6a51a3","#4a1486"],
|
||||
9: ["#fcfbfd","#efedf5","#dadaeb","#bcbddc","#9e9ac8","#807dba","#6a51a3","#54278f","#3f007d"]
|
||||
},Blues: {
|
||||
3: ["#deebf7","#9ecae1","#3182bd"],
|
||||
4: ["#eff3ff","#bdd7e7","#6baed6","#2171b5"],
|
||||
5: ["#eff3ff","#bdd7e7","#6baed6","#3182bd","#08519c"],
|
||||
6: ["#eff3ff","#c6dbef","#9ecae1","#6baed6","#3182bd","#08519c"],
|
||||
7: ["#eff3ff","#c6dbef","#9ecae1","#6baed6","#4292c6","#2171b5","#084594"],
|
||||
8: ["#f7fbff","#deebf7","#c6dbef","#9ecae1","#6baed6","#4292c6","#2171b5","#084594"],
|
||||
9: ["#f7fbff","#deebf7","#c6dbef","#9ecae1","#6baed6","#4292c6","#2171b5","#08519c","#08306b"]
|
||||
},Greens: {
|
||||
3: ["#e5f5e0","#a1d99b","#31a354"],
|
||||
4: ["#edf8e9","#bae4b3","#74c476","#238b45"],
|
||||
5: ["#edf8e9","#bae4b3","#74c476","#31a354","#006d2c"],
|
||||
6: ["#edf8e9","#c7e9c0","#a1d99b","#74c476","#31a354","#006d2c"],
|
||||
7: ["#edf8e9","#c7e9c0","#a1d99b","#74c476","#41ab5d","#238b45","#005a32"],
|
||||
8: ["#f7fcf5","#e5f5e0","#c7e9c0","#a1d99b","#74c476","#41ab5d","#238b45","#005a32"],
|
||||
9: ["#f7fcf5","#e5f5e0","#c7e9c0","#a1d99b","#74c476","#41ab5d","#238b45","#006d2c","#00441b"]
|
||||
},Oranges: {
|
||||
3: ["#fee6ce","#fdae6b","#e6550d"],
|
||||
4: ["#feedde","#fdbe85","#fd8d3c","#d94701"],
|
||||
5: ["#feedde","#fdbe85","#fd8d3c","#e6550d","#a63603"],
|
||||
6: ["#feedde","#fdd0a2","#fdae6b","#fd8d3c","#e6550d","#a63603"],
|
||||
7: ["#feedde","#fdd0a2","#fdae6b","#fd8d3c","#f16913","#d94801","#8c2d04"],
|
||||
8: ["#fff5eb","#fee6ce","#fdd0a2","#fdae6b","#fd8d3c","#f16913","#d94801","#8c2d04"],
|
||||
9: ["#fff5eb","#fee6ce","#fdd0a2","#fdae6b","#fd8d3c","#f16913","#d94801","#a63603","#7f2704"]
|
||||
},Reds: {
|
||||
3: ["#fee0d2","#fc9272","#de2d26"],
|
||||
4: ["#fee5d9","#fcae91","#fb6a4a","#cb181d"],
|
||||
5: ["#fee5d9","#fcae91","#fb6a4a","#de2d26","#a50f15"],
|
||||
6: ["#fee5d9","#fcbba1","#fc9272","#fb6a4a","#de2d26","#a50f15"],
|
||||
7: ["#fee5d9","#fcbba1","#fc9272","#fb6a4a","#ef3b2c","#cb181d","#99000d"],
|
||||
8: ["#fff5f0","#fee0d2","#fcbba1","#fc9272","#fb6a4a","#ef3b2c","#cb181d","#99000d"],
|
||||
9: ["#fff5f0","#fee0d2","#fcbba1","#fc9272","#fb6a4a","#ef3b2c","#cb181d","#a50f15","#67000d"]
|
||||
},Greys: {
|
||||
3: ["#f0f0f0","#bdbdbd","#636363"],
|
||||
4: ["#f7f7f7","#cccccc","#969696","#525252"],
|
||||
5: ["#f7f7f7","#cccccc","#969696","#636363","#252525"],
|
||||
6: ["#f7f7f7","#d9d9d9","#bdbdbd","#969696","#636363","#252525"],
|
||||
7: ["#f7f7f7","#d9d9d9","#bdbdbd","#969696","#737373","#525252","#252525"],
|
||||
8: ["#ffffff","#f0f0f0","#d9d9d9","#bdbdbd","#969696","#737373","#525252","#252525"],
|
||||
9: ["#ffffff","#f0f0f0","#d9d9d9","#bdbdbd","#969696","#737373","#525252","#252525","#000000"]
|
||||
},PuOr: {
|
||||
3: ["#f1a340","#f7f7f7","#998ec3"],
|
||||
4: ["#e66101","#fdb863","#b2abd2","#5e3c99"],
|
||||
5: ["#e66101","#fdb863","#f7f7f7","#b2abd2","#5e3c99"],
|
||||
6: ["#b35806","#f1a340","#fee0b6","#d8daeb","#998ec3","#542788"],
|
||||
7: ["#b35806","#f1a340","#fee0b6","#f7f7f7","#d8daeb","#998ec3","#542788"],
|
||||
8: ["#b35806","#e08214","#fdb863","#fee0b6","#d8daeb","#b2abd2","#8073ac","#542788"],
|
||||
9: ["#b35806","#e08214","#fdb863","#fee0b6","#f7f7f7","#d8daeb","#b2abd2","#8073ac","#542788"],
|
||||
10: ["#7f3b08","#b35806","#e08214","#fdb863","#fee0b6","#d8daeb","#b2abd2","#8073ac","#542788","#2d004b"],
|
||||
11: ["#7f3b08","#b35806","#e08214","#fdb863","#fee0b6","#f7f7f7","#d8daeb","#b2abd2","#8073ac","#542788","#2d004b"]
|
||||
},BrBG: {
|
||||
3: ["#d8b365","#f5f5f5","#5ab4ac"],
|
||||
4: ["#a6611a","#dfc27d","#80cdc1","#018571"],
|
||||
5: ["#a6611a","#dfc27d","#f5f5f5","#80cdc1","#018571"],
|
||||
6: ["#8c510a","#d8b365","#f6e8c3","#c7eae5","#5ab4ac","#01665e"],
|
||||
7: ["#8c510a","#d8b365","#f6e8c3","#f5f5f5","#c7eae5","#5ab4ac","#01665e"],
|
||||
8: ["#8c510a","#bf812d","#dfc27d","#f6e8c3","#c7eae5","#80cdc1","#35978f","#01665e"],
|
||||
9: ["#8c510a","#bf812d","#dfc27d","#f6e8c3","#f5f5f5","#c7eae5","#80cdc1","#35978f","#01665e"],
|
||||
10: ["#543005","#8c510a","#bf812d","#dfc27d","#f6e8c3","#c7eae5","#80cdc1","#35978f","#01665e","#003c30"],
|
||||
11: ["#543005","#8c510a","#bf812d","#dfc27d","#f6e8c3","#f5f5f5","#c7eae5","#80cdc1","#35978f","#01665e","#003c30"]
|
||||
},PRGn: {
|
||||
3: ["#af8dc3","#f7f7f7","#7fbf7b"],
|
||||
4: ["#7b3294","#c2a5cf","#a6dba0","#008837"],
|
||||
5: ["#7b3294","#c2a5cf","#f7f7f7","#a6dba0","#008837"],
|
||||
6: ["#762a83","#af8dc3","#e7d4e8","#d9f0d3","#7fbf7b","#1b7837"],
|
||||
7: ["#762a83","#af8dc3","#e7d4e8","#f7f7f7","#d9f0d3","#7fbf7b","#1b7837"],
|
||||
8: ["#762a83","#9970ab","#c2a5cf","#e7d4e8","#d9f0d3","#a6dba0","#5aae61","#1b7837"],
|
||||
9: ["#762a83","#9970ab","#c2a5cf","#e7d4e8","#f7f7f7","#d9f0d3","#a6dba0","#5aae61","#1b7837"],
|
||||
10: ["#40004b","#762a83","#9970ab","#c2a5cf","#e7d4e8","#d9f0d3","#a6dba0","#5aae61","#1b7837","#00441b"],
|
||||
11: ["#40004b","#762a83","#9970ab","#c2a5cf","#e7d4e8","#f7f7f7","#d9f0d3","#a6dba0","#5aae61","#1b7837","#00441b"]
|
||||
},PiYG: {
|
||||
3: ["#e9a3c9","#f7f7f7","#a1d76a"],
|
||||
4: ["#d01c8b","#f1b6da","#b8e186","#4dac26"],
|
||||
5: ["#d01c8b","#f1b6da","#f7f7f7","#b8e186","#4dac26"],
|
||||
6: ["#c51b7d","#e9a3c9","#fde0ef","#e6f5d0","#a1d76a","#4d9221"],
|
||||
7: ["#c51b7d","#e9a3c9","#fde0ef","#f7f7f7","#e6f5d0","#a1d76a","#4d9221"],
|
||||
8: ["#c51b7d","#de77ae","#f1b6da","#fde0ef","#e6f5d0","#b8e186","#7fbc41","#4d9221"],
|
||||
9: ["#c51b7d","#de77ae","#f1b6da","#fde0ef","#f7f7f7","#e6f5d0","#b8e186","#7fbc41","#4d9221"],
|
||||
10: ["#8e0152","#c51b7d","#de77ae","#f1b6da","#fde0ef","#e6f5d0","#b8e186","#7fbc41","#4d9221","#276419"],
|
||||
11: ["#8e0152","#c51b7d","#de77ae","#f1b6da","#fde0ef","#f7f7f7","#e6f5d0","#b8e186","#7fbc41","#4d9221","#276419"]
|
||||
},RdBu: {
|
||||
3: ["#ef8a62","#f7f7f7","#67a9cf"],
|
||||
4: ["#ca0020","#f4a582","#92c5de","#0571b0"],
|
||||
5: ["#ca0020","#f4a582","#f7f7f7","#92c5de","#0571b0"],
|
||||
6: ["#b2182b","#ef8a62","#fddbc7","#d1e5f0","#67a9cf","#2166ac"],
|
||||
7: ["#b2182b","#ef8a62","#fddbc7","#f7f7f7","#d1e5f0","#67a9cf","#2166ac"],
|
||||
8: ["#b2182b","#d6604d","#f4a582","#fddbc7","#d1e5f0","#92c5de","#4393c3","#2166ac"],
|
||||
9: ["#b2182b","#d6604d","#f4a582","#fddbc7","#f7f7f7","#d1e5f0","#92c5de","#4393c3","#2166ac"],
|
||||
10: ["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#d1e5f0","#92c5de","#4393c3","#2166ac","#053061"],
|
||||
11: ["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#f7f7f7","#d1e5f0","#92c5de","#4393c3","#2166ac","#053061"]
|
||||
},RdGy: {
|
||||
3: ["#ef8a62","#ffffff","#999999"],
|
||||
4: ["#ca0020","#f4a582","#bababa","#404040"],
|
||||
5: ["#ca0020","#f4a582","#ffffff","#bababa","#404040"],
|
||||
6: ["#b2182b","#ef8a62","#fddbc7","#e0e0e0","#999999","#4d4d4d"],
|
||||
7: ["#b2182b","#ef8a62","#fddbc7","#ffffff","#e0e0e0","#999999","#4d4d4d"],
|
||||
8: ["#b2182b","#d6604d","#f4a582","#fddbc7","#e0e0e0","#bababa","#878787","#4d4d4d"],
|
||||
9: ["#b2182b","#d6604d","#f4a582","#fddbc7","#ffffff","#e0e0e0","#bababa","#878787","#4d4d4d"],
|
||||
10: ["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#e0e0e0","#bababa","#878787","#4d4d4d","#1a1a1a"],
|
||||
11: ["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#ffffff","#e0e0e0","#bababa","#878787","#4d4d4d","#1a1a1a"]
|
||||
},RdYlBu: {
|
||||
3: ["#fc8d59","#ffffbf","#91bfdb"],
|
||||
4: ["#d7191c","#fdae61","#abd9e9","#2c7bb6"],
|
||||
5: ["#d7191c","#fdae61","#ffffbf","#abd9e9","#2c7bb6"],
|
||||
6: ["#d73027","#fc8d59","#fee090","#e0f3f8","#91bfdb","#4575b4"],
|
||||
7: ["#d73027","#fc8d59","#fee090","#ffffbf","#e0f3f8","#91bfdb","#4575b4"],
|
||||
8: ["#d73027","#f46d43","#fdae61","#fee090","#e0f3f8","#abd9e9","#74add1","#4575b4"],
|
||||
9: ["#d73027","#f46d43","#fdae61","#fee090","#ffffbf","#e0f3f8","#abd9e9","#74add1","#4575b4"],
|
||||
10: ["#a50026","#d73027","#f46d43","#fdae61","#fee090","#e0f3f8","#abd9e9","#74add1","#4575b4","#313695"],
|
||||
11: ["#a50026","#d73027","#f46d43","#fdae61","#fee090","#ffffbf","#e0f3f8","#abd9e9","#74add1","#4575b4","#313695"]
|
||||
},Spectral: {
|
||||
3: ["#fc8d59","#ffffbf","#99d594"],
|
||||
4: ["#d7191c","#fdae61","#abdda4","#2b83ba"],
|
||||
5: ["#d7191c","#fdae61","#ffffbf","#abdda4","#2b83ba"],
|
||||
6: ["#d53e4f","#fc8d59","#fee08b","#e6f598","#99d594","#3288bd"],
|
||||
7: ["#d53e4f","#fc8d59","#fee08b","#ffffbf","#e6f598","#99d594","#3288bd"],
|
||||
8: ["#d53e4f","#f46d43","#fdae61","#fee08b","#e6f598","#abdda4","#66c2a5","#3288bd"],
|
||||
9: ["#d53e4f","#f46d43","#fdae61","#fee08b","#ffffbf","#e6f598","#abdda4","#66c2a5","#3288bd"],
|
||||
10: ["#9e0142","#d53e4f","#f46d43","#fdae61","#fee08b","#e6f598","#abdda4","#66c2a5","#3288bd","#5e4fa2"],
|
||||
11: ["#9e0142","#d53e4f","#f46d43","#fdae61","#fee08b","#ffffbf","#e6f598","#abdda4","#66c2a5","#3288bd","#5e4fa2"]
|
||||
},RdYlGn: {
|
||||
3: ["#fc8d59","#ffffbf","#91cf60"],
|
||||
4: ["#d7191c","#fdae61","#a6d96a","#1a9641"],
|
||||
5: ["#d7191c","#fdae61","#ffffbf","#a6d96a","#1a9641"],
|
||||
6: ["#d73027","#fc8d59","#fee08b","#d9ef8b","#91cf60","#1a9850"],
|
||||
7: ["#d73027","#fc8d59","#fee08b","#ffffbf","#d9ef8b","#91cf60","#1a9850"],
|
||||
8: ["#d73027","#f46d43","#fdae61","#fee08b","#d9ef8b","#a6d96a","#66bd63","#1a9850"],
|
||||
9: ["#d73027","#f46d43","#fdae61","#fee08b","#ffffbf","#d9ef8b","#a6d96a","#66bd63","#1a9850"],
|
||||
10: ["#a50026","#d73027","#f46d43","#fdae61","#fee08b","#d9ef8b","#a6d96a","#66bd63","#1a9850","#006837"],
|
||||
11: ["#a50026","#d73027","#f46d43","#fdae61","#fee08b","#ffffbf","#d9ef8b","#a6d96a","#66bd63","#1a9850","#006837"]
|
||||
},Accent: {
|
||||
3: ["#7fc97f","#beaed4","#fdc086"],
|
||||
4: ["#7fc97f","#beaed4","#fdc086","#ffff99"],
|
||||
5: ["#7fc97f","#beaed4","#fdc086","#ffff99","#386cb0"],
|
||||
6: ["#7fc97f","#beaed4","#fdc086","#ffff99","#386cb0","#f0027f"],
|
||||
7: ["#7fc97f","#beaed4","#fdc086","#ffff99","#386cb0","#f0027f","#bf5b17"],
|
||||
8: ["#7fc97f","#beaed4","#fdc086","#ffff99","#386cb0","#f0027f","#bf5b17","#666666"]
|
||||
},Dark2: {
|
||||
3: ["#1b9e77","#d95f02","#7570b3"],
|
||||
4: ["#1b9e77","#d95f02","#7570b3","#e7298a"],
|
||||
5: ["#1b9e77","#d95f02","#7570b3","#e7298a","#66a61e"],
|
||||
6: ["#1b9e77","#d95f02","#7570b3","#e7298a","#66a61e","#e6ab02"],
|
||||
7: ["#1b9e77","#d95f02","#7570b3","#e7298a","#66a61e","#e6ab02","#a6761d"],
|
||||
8: ["#1b9e77","#d95f02","#7570b3","#e7298a","#66a61e","#e6ab02","#a6761d","#666666"]
|
||||
},Paired: {
|
||||
3: ["#a6cee3","#1f78b4","#b2df8a"],
|
||||
4: ["#a6cee3","#1f78b4","#b2df8a","#33a02c"],
|
||||
5: ["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99"],
|
||||
6: ["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c"],
|
||||
7: ["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f"],
|
||||
8: ["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f","#ff7f00"],
|
||||
9: ["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f","#ff7f00","#cab2d6"],
|
||||
10: ["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f","#ff7f00","#cab2d6","#6a3d9a"],
|
||||
11: ["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f","#ff7f00","#cab2d6","#6a3d9a","#ffff99"],
|
||||
12: ["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f","#ff7f00","#cab2d6","#6a3d9a","#ffff99","#b15928"]
|
||||
},Pastel1: {
|
||||
3: ["#fbb4ae","#b3cde3","#ccebc5"],
|
||||
4: ["#fbb4ae","#b3cde3","#ccebc5","#decbe4"],
|
||||
5: ["#fbb4ae","#b3cde3","#ccebc5","#decbe4","#fed9a6"],
|
||||
6: ["#fbb4ae","#b3cde3","#ccebc5","#decbe4","#fed9a6","#ffffcc"],
|
||||
7: ["#fbb4ae","#b3cde3","#ccebc5","#decbe4","#fed9a6","#ffffcc","#e5d8bd"],
|
||||
8: ["#fbb4ae","#b3cde3","#ccebc5","#decbe4","#fed9a6","#ffffcc","#e5d8bd","#fddaec"],
|
||||
9: ["#fbb4ae","#b3cde3","#ccebc5","#decbe4","#fed9a6","#ffffcc","#e5d8bd","#fddaec","#f2f2f2"]
|
||||
},Pastel2: {
|
||||
3: ["#b3e2cd","#fdcdac","#cbd5e8"],
|
||||
4: ["#b3e2cd","#fdcdac","#cbd5e8","#f4cae4"],
|
||||
5: ["#b3e2cd","#fdcdac","#cbd5e8","#f4cae4","#e6f5c9"],
|
||||
6: ["#b3e2cd","#fdcdac","#cbd5e8","#f4cae4","#e6f5c9","#fff2ae"],
|
||||
7: ["#b3e2cd","#fdcdac","#cbd5e8","#f4cae4","#e6f5c9","#fff2ae","#f1e2cc"],
|
||||
8: ["#b3e2cd","#fdcdac","#cbd5e8","#f4cae4","#e6f5c9","#fff2ae","#f1e2cc","#cccccc"]
|
||||
},Set1: {
|
||||
3: ["#e41a1c","#377eb8","#4daf4a"],
|
||||
4: ["#e41a1c","#377eb8","#4daf4a","#984ea3"],
|
||||
5: ["#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00"],
|
||||
6: ["#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33"],
|
||||
7: ["#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628"],
|
||||
8: ["#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628","#f781bf"],
|
||||
9: ["#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628","#f781bf","#999999"]
|
||||
},Set2: {
|
||||
3: ["#66c2a5","#fc8d62","#8da0cb"],
|
||||
4: ["#66c2a5","#fc8d62","#8da0cb","#e78ac3"],
|
||||
5: ["#66c2a5","#fc8d62","#8da0cb","#e78ac3","#a6d854"],
|
||||
6: ["#66c2a5","#fc8d62","#8da0cb","#e78ac3","#a6d854","#ffd92f"],
|
||||
7: ["#66c2a5","#fc8d62","#8da0cb","#e78ac3","#a6d854","#ffd92f","#e5c494"],
|
||||
8: ["#66c2a5","#fc8d62","#8da0cb","#e78ac3","#a6d854","#ffd92f","#e5c494","#b3b3b3"]
|
||||
},Set3: {
|
||||
3: ["#8dd3c7","#ffffb3","#bebada"],
|
||||
4: ["#8dd3c7","#ffffb3","#bebada","#fb8072"],
|
||||
5: ["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3"],
|
||||
6: ["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462"],
|
||||
7: ["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69"],
|
||||
8: ["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5"],
|
||||
9: ["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5","#d9d9d9"],
|
||||
10: ["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5","#d9d9d9","#bc80bd"],
|
||||
11: ["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5","#d9d9d9","#bc80bd","#ccebc5"],
|
||||
12: ["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5","#d9d9d9","#bc80bd","#ccebc5","#ffed6f"]
|
||||
}};
|
@ -0,0 +1,447 @@
|
||||
<!--
|
||||
~ Copyright (c) WSO2 Inc. (http://wso2.com) All Rights Reserved.
|
||||
~
|
||||
~ 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.
|
||||
-->
|
||||
<%
|
||||
// i18n
|
||||
var i18n = require("i18n");
|
||||
i18n.init(request, utils.getLocaleResourcePath());
|
||||
|
||||
// If the pageId is null, render the landing page
|
||||
pageId = pageId || dashboard.landing;
|
||||
|
||||
var usr = require('/modules/user.js'),
|
||||
user = usr.current(),
|
||||
isAnonView = request.getParameter('isAnonView');
|
||||
|
||||
// Get the anon view
|
||||
if (!user) {
|
||||
if (isAnonView) {
|
||||
response.sendRedirect(request.getRequestURL());
|
||||
}
|
||||
isAnonView = true;
|
||||
} else {
|
||||
isAnonView = JSON.parse(isAnonView);
|
||||
|
||||
if((user.domain != urlDomain && urlDomain) ||
|
||||
(dashboard.isanon && !utils.allowed(user.roles, dashboard.permissions.editors) && !utils.allowed(user.roles, dashboard.permissions.viewers))) {
|
||||
isAnonView = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Get the current page
|
||||
var pages = dashboard.pages,
|
||||
page;
|
||||
pages.forEach(function(p) {
|
||||
if (p.id == pageId) {
|
||||
page = p;
|
||||
}
|
||||
});
|
||||
%>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
<title><%= i18n.localize("dashboard.server.label")%></title>
|
||||
|
||||
<!-- Favicon -->
|
||||
<link rel="shortcut icon" href="<%=urlPrefix%>libs/theme-wso2_1.0/images/favicon.png" />
|
||||
|
||||
<!-- Bootstrap CSS -->
|
||||
<link href="<%=urlPrefix%>libs/bootstrap_3.3.5/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
|
||||
|
||||
<!-- Font WSO2 CSS -->
|
||||
<link href="<%=urlPrefix%>libs/font-wso2_1.0.0/css/font-wso2.min.css" rel="stylesheet" type="text/css" />
|
||||
|
||||
<!-- Jquery Nanoscroller CSS -->
|
||||
<link href="<%=urlPrefix%>libs/nanoscroller_0.8.7/nanoscroller.css" rel="stylesheet" type="text/css" />
|
||||
|
||||
<!-- Theme WSO2 CSS -->
|
||||
<link href="<%=urlPrefix%>libs/theme-wso2_1.0/css/theme-wso2.css" rel="stylesheet" type="text/css" />
|
||||
|
||||
<!-- Custom CSS -->
|
||||
<link href="<%=urlPrefix%>css/custom.css" rel="stylesheet" type="text/css" />
|
||||
|
||||
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
||||
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="<%=urlPrefix%>libs/html5shiv_3.7.2/html5shiv.min.js"></script>
|
||||
<script src="<%=urlPrefix%>libs/respond_1.4.2/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
<!-- JQuery UI -->
|
||||
<link rel="stylesheet" type="text/css" href="<%=urlPrefix%>libs/jquery-ui-1.11.4/jquery-ui.min.css" />
|
||||
|
||||
<link rel="stylesheet" href="<%=urlPrefix%>css/dashboard.css" />
|
||||
|
||||
<!-- Common CSS -->
|
||||
<link rel="stylesheet" type="text/css" href="<%=urlPrefix%>css/common.css" />
|
||||
|
||||
<!-- Custom theme overrides -->
|
||||
<link rel="stylesheet" href="<%=urlPrefix%><%=utils.dashboardStyles(dashboard.theme)%>">
|
||||
</head>
|
||||
|
||||
<body class="dashboard lang_<%=request.getLocale()%>">
|
||||
|
||||
<!-- .left-sidebar -->
|
||||
<div class="sidebar-wrapper sidebar-nav toggled hidden-xs" id="left-sidebar" data-side="left" data-width="260" style="width:260px">
|
||||
<div class="nano">
|
||||
<div class="nano-content">
|
||||
|
||||
<div class="user">
|
||||
<div class="user-image">
|
||||
<span class="default">
|
||||
<span class="icon fw fw-stack">
|
||||
<i class="fw fw-circle fw-stack-2x"></i>
|
||||
<i class="fw fw-user fw-stack-1x fw-inverse"></i>
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="user-name"><%= user ? user.username : "anon" %></div>
|
||||
</div>
|
||||
|
||||
<ul class="nav nav-pills nav-stacked pages">
|
||||
<% if (pages.length > 1) {
|
||||
// render links
|
||||
pages.forEach(function (p) {
|
||||
if (isAnonView || !user) {
|
||||
if (p.isanon) {
|
||||
// Anonymous viewing. So render only anonymous pages links.
|
||||
renderPageLink(p);
|
||||
}
|
||||
} else {
|
||||
renderPageLink(p);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function renderPageLink(p) {
|
||||
var queryString = isAnonView ? '?isAnonView=true' : '';
|
||||
%>
|
||||
<li class="<%= (p.id === pageId) ? 'active': '' %>"><a href="<%=dbRoot%><%=p.id%><%=queryString%>"><%=encodeHtml(p.title)%></a></li>
|
||||
<% } %>
|
||||
</ul>
|
||||
|
||||
<hr>
|
||||
|
||||
<ul class="nav nav-pills nav-stacked">
|
||||
<% if (user) { %>
|
||||
<% if (!isAnonView && (urlDomain == user.domain || (user.domain == superDomain && (!urlDomain || urlDomain == superDomain)))) { %>
|
||||
<% if (user.isEditor) { %>
|
||||
<li><a href="<%=dbRoot%>?editor=true"><i class="icon fw fw-settings ues-copy" title="<%= i18n.localize("edit.button")%>"></i>Dashboard Settings</a></li>
|
||||
<% } else { %>
|
||||
<li><a href="<%=dbRoot%>?custom=true"><i class="icon fw fw-settings ues-copy" title="<%= i18n.localize("personalize")%>"></i>Customize Dashboard</a></li>
|
||||
<% } %>
|
||||
<% } %>
|
||||
<li><a href="<%=urlPrefix%>logout?destination=<%=dest%>"><i class="icon fw fw-sign-out"></i><%= i18n.localize("logout.label")%></a></li>
|
||||
<% } else { %>
|
||||
<li><a href="<%=urlPrefix%>login-controller?destination=<%=dest%>"><i class="icon fw fw-sign-in"></i><%= i18n.localize("login.label")%></a></li>
|
||||
<% } %>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- #page-content-wrapper -->
|
||||
<div class="page-content-wrapper remove-padding-xs" style="padding-left:260px;">
|
||||
<div class="nano">
|
||||
<div class="nano-content">
|
||||
|
||||
<div class="page-header">
|
||||
<div class="container-fluid">
|
||||
|
||||
<div class="navbar-header">
|
||||
<a class="sidebar-toggle-button hidden-xs" data-toggle="sidebar" data-target="#left-sidebar" data-container=".page-content-wrapper" data-container-divide="true" aria-expanded="true" rel="sub-nav">
|
||||
<span class="icon fw-stack">
|
||||
<i class="fw fw-menu fw-stack-1x toggle-icon-left"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a class="sidebar-toggle-button visible-xs" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
|
||||
<span class="icon fw-stack">
|
||||
<i class="fw fw-menu fw-stack-1x toggle-icon-up"></i>
|
||||
</span>
|
||||
</a>
|
||||
<div class="page-title pull-left text-center-xs">
|
||||
<h1 class="text-center-xs"><i class="icon fw fw-wso2-logo"></i><%=encodeHtml(dashboard.title)%></h1>
|
||||
</div>
|
||||
<div class="pull-right auth visible-xs">
|
||||
<span class="add-padding-left-3x"><%= user ? user.username : "anon" %></span>
|
||||
<span class="icon fw-stack fw-lg">
|
||||
<i class="fw fw-circle fw-stack-2x"></i>
|
||||
<i class="fw fw-user fw-stack-1x fw-inverse"></i>
|
||||
</span>
|
||||
</div>
|
||||
<ul class="nav collapse-nav-sub pull-right hidden">
|
||||
<li class="visible-inline-block">
|
||||
<a data-toggle="dropdown">
|
||||
<span class="icon fw-stack">
|
||||
<i class="fw fw-notification fw-stack-1x"></i>
|
||||
</span>
|
||||
<span class="badge">4</span>
|
||||
</a>
|
||||
<div class="dropdown-menu dropdown-menu-right arrow alerts arrow-top-right dark add-margin-top-2x" role="menu">
|
||||
<ul class="sidebar-messages">
|
||||
<li class="message message-success">
|
||||
<h4><i class="icon fw fw-success"></i>Minor Information Message</h4>
|
||||
<p>Alerts don't have default classes, only base and modifier classes.</p>
|
||||
</li>
|
||||
<li class="message message-info">
|
||||
<h4><i class="icon fw fw-info"></i>Minor Information Message</h4>
|
||||
<p>Alerts don't have default classes, only base and modifier classes.</p>
|
||||
</li>
|
||||
<li class="message message-warning">
|
||||
<h4><i class="icon fw fw-warning"></i>Major Information Message</h4>
|
||||
<p>Alerts don't have default classes, only base and modifier classes.</p>
|
||||
</li>
|
||||
<li class="message message-danger">
|
||||
<h4><i class="icon fw fw-error"></i>Critical Information Message</h4>
|
||||
<p>Alerts don't have default classes, only base and modifier classes.</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="navbar" class="navbar-collapse collapse" aria-expanded="false">
|
||||
<ul class="nav navbar-nav pages">
|
||||
<% if (pages.length > 1) {
|
||||
// render links
|
||||
pages.forEach(function (p) {
|
||||
if (isAnonView || !user) {
|
||||
if (p.isanon) {
|
||||
// Anonymous viewing. So render only anonymous pages links.
|
||||
renderPageLink(p);
|
||||
}
|
||||
} else {
|
||||
renderPageLink(p);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function renderPageLink(p) {
|
||||
var queryString = isAnonView ? '?isAnonView=true' : '';
|
||||
%>
|
||||
<li class="<%= (p.id === pageId) ? 'active': '' %>"><a href="<%=dbRoot%><%=p.id%><%=queryString%>"><%=encodeHtml(p.title)%></a></li>
|
||||
<% } %>
|
||||
</ul>
|
||||
|
||||
<hr>
|
||||
|
||||
<ul class="nav nav-pills nav-stacked">
|
||||
<% if (user) { %>
|
||||
<% if (!isAnonView && (urlDomain == user.domain || (user.domain == superDomain && (!urlDomain || urlDomain == superDomain)))) { %>
|
||||
<% if (user.isEditor) { %>
|
||||
<li><a href="<%=dbRoot%>?editor=true"><i class="icon fw fw-settings ues-copy" title="<%= i18n.localize("edit.button")%>"></i>Dashboard Settings</a></li>
|
||||
<% } else { %>
|
||||
<li><a href="<%=dbRoot%>?custom=true"><i class="icon fw fw-settings ues-copy" title="<%= i18n.localize("personalize")%>"></i>Customize Dashboard</a></li>
|
||||
<% } %>
|
||||
<% } %>
|
||||
<li><a href="<%=urlPrefix%>logout?destination=<%=dest%>"><i class="icon fw fw-sign-out"></i><%= i18n.localize("logout.label")%></a></li>
|
||||
<% } else { %>
|
||||
<li><a href="<%=urlPrefix%>login-controller?destination=<%=dest%>"><i class="icon fw fw-sign-in"></i><%= i18n.localize("login.label")%></a></li>
|
||||
<% } %>
|
||||
</ul>
|
||||
</div><!--/.nav-collapse -->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- page content -->
|
||||
<div class="container-fluid body-wrapper">
|
||||
|
||||
<div class="page-content">
|
||||
<!-- Components grid -->
|
||||
<div class="ues-components-grid gadgets-grid">
|
||||
<%=renderEngine.getDashboardContent(pageId || dashboard.landing, isAnonView)%>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- /#page-content-wrapper -->
|
||||
|
||||
<!--Footer -->
|
||||
<footer class="footer">
|
||||
<div class="container-fluid">
|
||||
<p>WSO2 Dashboard Server 2.0.0 | © <script>document.write(new Date().getFullYear());</script> <a href="http://wso2.com/" target="_blank"><i class="icon fw fw-wso2"></i> Inc</a>.</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<!-- Jquery/Jquery UI JS -->
|
||||
<script src="<%=urlPrefix%>libs/jquery_1.11.0/jquery-1.11.3.min.js"></script>
|
||||
<script src="<%=urlPrefix%>libs/jquery-ui-1.11.4/jquery-ui.min.js"></script>
|
||||
|
||||
<!-- Bootstrap JS -->
|
||||
<script src="<%=urlPrefix%>libs/bootstrap_3.3.5/js/bootstrap.min.js"></script>
|
||||
|
||||
<!-- Jquery Nanoscroller JS -->
|
||||
<script src="<%=urlPrefix%>libs/nanoscroller_0.8.7/jquery.nanoscroller.min.js"></script>
|
||||
|
||||
<!-- Theme WSO2 JS -->
|
||||
<script src="<%=urlPrefix%>libs/theme-wso2_1.0/js/theme-wso2.js"></script>
|
||||
|
||||
<!-- Handlebars JS -->
|
||||
<script src="<%=urlPrefix%>libs/handlebars-v4.0.2/handlebars.min.js"></script>
|
||||
|
||||
<script src="/shindig/gadgets/js/container:open-views:opensearch:rpc:xmlutil:pubsub-2.js?c=1&debug=1&container=default"></script>
|
||||
<script src="<%=urlPrefix%>js/ues.js"></script>
|
||||
<script src="<%=urlPrefix%>js/ues-prefs.js"></script>
|
||||
<% include('/controllers/includes/common-scripts.jag'); %>
|
||||
<% include('/controllers/includes/dashboard-scripts.jag'); %>
|
||||
<script src="<%=urlPrefix%>js/ues-gadgets.js"></script>
|
||||
<script src="<%=urlPrefix%>js/ues-dashboards.js"></script>
|
||||
<script src="<%=urlPrefix%>extensions/components/gadget/index.js"></script>
|
||||
<script src="<%=urlPrefix%>extensions/components/widget/index.js"></script>
|
||||
<script src="<%=urlPrefix%>extensions/uris/local/index.js"></script>
|
||||
<script src="<%=urlPrefix%>extensions/uris/store/index.js"></script>
|
||||
<script src="<%=urlPrefix%>js/gadget-properties.js"></script>
|
||||
<script src="<%=urlPrefix%>js/ds-handlebar-helpers.js"></script>
|
||||
<script src="<%=urlPrefix%>js/ues-saml-at.js"></script>
|
||||
<script src="<%=urlPrefix%>js/dashboard.js"></script>
|
||||
<% include('/controllers/includes/theme-dashboard-scripts.jag'); %>
|
||||
|
||||
<!-- Handlebar templates -->
|
||||
<!-- Component container -->
|
||||
<script id="ues-component-box-content-hbs" type="text/x-handlebars-template">
|
||||
<div class="gadget-wrapper">
|
||||
<div class="ues-component gadget">
|
||||
<div class="ues-component-heading gadget-heading">
|
||||
<h4 class="ues-component-title gadget-title truncate"></h4>
|
||||
|
||||
<div class="ues-component-actions gadget-actions">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ues-component-body gadget-body"></div>
|
||||
</div>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<!-- Component toolbar actions -->
|
||||
<script id="ues-component-actions-hbs" type="text/x-handlebars-template">
|
||||
<div class="btn-group">
|
||||
{{#if userPrefsExists}}
|
||||
<button type="button" class="btn btn-default ues-component-settings-handle" title="<%= i18n.localize("properties.label") %>">
|
||||
<i class="icon fw fw fw-configarations"></i>
|
||||
</button>
|
||||
{{/if}}
|
||||
<button type="button" class="btn btn-default ues-component-full-handle" title="<%= i18n.localize("maximize.label") %>"
|
||||
data-maximize-title="<%= i18n.localize("maximize.label") %>" data-minimize-title="<%= i18n.localize("minimize.label") %>">
|
||||
<i class="icon fw fw-expand"></i>
|
||||
</button>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<!-- Gadget settings -->
|
||||
<script id="ues-gadget-setting-hbs" type="text/x-handlebars-template">
|
||||
<div class="ues-sandbox gadget-setting" data-component="{{id}}">
|
||||
<form>
|
||||
{{#has options}}
|
||||
<div class="ues-options">
|
||||
<h4><%= i18n.localize("options") %></h4>
|
||||
{{#each options}}
|
||||
<div class="form-group">
|
||||
<div class="col-sm-12">
|
||||
{{#equals type "STRING"}}
|
||||
<label>{{title}}
|
||||
<input type="text" class="form-control" name="{{@key}}" placeholder="{{title}}" value="{{value}}">
|
||||
</label>
|
||||
{{/equals}}
|
||||
{{#equals type "BOOL"}}
|
||||
<label>
|
||||
<input type="checkbox" name="{{title}}"{{#equals value true}} checked="checked"{{/equals}}> {{title}}
|
||||
</label>
|
||||
{{/equals}}
|
||||
{{#equals type "ENUM"}}
|
||||
<label>{{title}}
|
||||
<select id={{title}} name={{title}} class="form-control ues-title-position">
|
||||
{{#each options}}
|
||||
<option value={{value}}{{#equals value ../value}} selected="selected"{{/equals}}>{{displayValue}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</label>
|
||||
{{/equals}}
|
||||
{{#equals type "LIST"}}
|
||||
<label>{{title}}
|
||||
<textarea name="{{@key}}" class="form-control" rows="4" placeholder='<%= i18n.localize("placeholder.item.list")%>'>{{value}}</textarea>
|
||||
<label><%= i18n.localize("enter.your.list.entries.label")%></label>
|
||||
</label>
|
||||
{{/equals}}
|
||||
{{#equals type "text"}}
|
||||
<label>{{title}}
|
||||
<textarea name="{{@key}}" class="form-control" rows="4">{{value}}</textarea>
|
||||
</label>
|
||||
{{/equals}}
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="alert alert-info">No properties to configure.</div>
|
||||
{{/has}}
|
||||
</form>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<!-- Scripts -->
|
||||
<script>
|
||||
|
||||
var nanoScrollerSelector = $(".nano");
|
||||
nanoScrollerSelector.nanoScroller();
|
||||
|
||||
function updateSidebarNav(target) {
|
||||
$(target).show();
|
||||
$(target).siblings().hide();
|
||||
nanoScrollerSelector[0].nanoscroller.reset();
|
||||
}
|
||||
|
||||
if (!ues.global.renderFromExtension) {
|
||||
ues.dashboards.render($('.ues-components-grid'), ues.global.dashboard, ues.global.page);
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
// Show banner
|
||||
if (ues.global.dashboard.banner.globalBannerExists || ues.global.dashboard.banner.customBannerExists) {
|
||||
$('.ues-banner-placeholder').css("background-image", "url('<%=tenantedUrlPrefix%>banners/<%=dashboard.id%>')");
|
||||
} else {
|
||||
$('.ues-banner-placeholder').hide();
|
||||
}
|
||||
|
||||
// Toggle component box heading
|
||||
$('.ues-component').hover(function() {
|
||||
toggleHeading($(this), true);
|
||||
}, function() {
|
||||
toggleHeading($(this), false);
|
||||
});
|
||||
});
|
||||
|
||||
function toggleHeading(source, show) {
|
||||
if (source.hasClass('ues-no-heading')) {
|
||||
var heading = source.find('.ues-component-heading');
|
||||
if (show) {
|
||||
heading.slideDown();
|
||||
} else {
|
||||
heading.slideUp();
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in new issue