Initial commit
8
.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
node_modules
|
||||
.idea
|
||||
tmp
|
||||
package-lock.json
|
||||
admin/i18n/*/flat.txt
|
||||
admin/i18n/flat.txt
|
||||
admin/i18n/*/translations.json
|
||||
iob_npm.done
|
10
.npmignore
Normal file
@ -0,0 +1,10 @@
|
||||
gulpfile.js
|
||||
tasks
|
||||
test
|
||||
tmp
|
||||
.idea
|
||||
.travis.yml
|
||||
appveyor.yml
|
||||
package-lock.json
|
||||
admin/i18n
|
||||
iob_npm.done
|
23
.travis.yml
Normal file
@ -0,0 +1,23 @@
|
||||
os:
|
||||
- linux
|
||||
- osx
|
||||
language: node_js
|
||||
node_js:
|
||||
- '4'
|
||||
- '6'
|
||||
- '8'
|
||||
- '10'
|
||||
before_script:
|
||||
- export NPMVERSION=$(echo "$($(which npm) -v)"|cut -c1)
|
||||
- 'if [[ $NPMVERSION == 5 ]]; then npm install -g npm@5; fi'
|
||||
- npm -v
|
||||
- npm install winston@2.3.1
|
||||
- 'npm install https://git.spacen.net/yunkong2/yunkong2.js-controller/tarball/master --production'
|
||||
env:
|
||||
- CXX=g++-4.8
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-4.8
|
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014-2018 bluefox <dogafox@gmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
308
README.md
Normal file
@ -0,0 +1,308 @@
|
||||
![Logo](admin/web.png)
|
||||
# yunkong2.web
|
||||
===========================
|
||||
|
||||
[![NPM version](http://img.shields.io/npm/v/yunkong2.web.svg)](https://www.npmjs.com/package/yunkong2.web)
|
||||
[![Downloads](https://img.shields.io/npm/dm/yunkong2.web.svg)](https://www.npmjs.com/package/yunkong2.web)
|
||||
[![Tests](https://travis-ci.org/yunkong2/yunkong2.web.svg?branch=master)](https://travis-ci.org/yunkong2/yunkong2.web)
|
||||
|
||||
[![NPM](https://nodei.co/npm/yunkong2.web.png?downloads=true)](https://nodei.co/npm/yunkong2.web/)
|
||||
|
||||
|
||||
Web server on the base of Node.js and express to read the files from yunkong2 DB
|
||||
|
||||
## Tuning Web-Sockets
|
||||
On some web-sockets clients there is performance problem with communication. Sometimes this problem is due to fallback of socket.io communication on long polling mechanism.
|
||||
You can set option *Force Web-Sockets* to force using only web-sockets transport.
|
||||
|
||||
## Let's Encrypt Certificates
|
||||
Read [here](https://git.spacen.net/yunkong2/yunkong2.admin#lets-encrypt-certificates)
|
||||
|
||||
## Extensions
|
||||
Web driver supports extensions. The extension is URL handler, that will be called if such URL request appears.
|
||||
The extensions look like normal adapter, but they have no running process and will be called by web server.
|
||||
|
||||
E.g. the user can activate special proxy adapter and reach other devices (like web cams) in the same web server.
|
||||
It is required to let all services be available under one web server.
|
||||
|
||||
## Brute-force protection
|
||||
If authentication is enabled and the user enters 5 times invalid password during one minute, he must wait at least one minute till next attempt.
|
||||
After 15th wrong attempt the user must wait 1 hour.
|
||||
|
||||
## Changelog
|
||||
### 2.4.1 (2018-07-21)
|
||||
* (bluefox) The support of the versioned links to adapter was added
|
||||
* (bluefox) WhiteList was corrected
|
||||
* (bluefox) Custom login background is supported
|
||||
|
||||
### 2.4.0 (2018-07-15)
|
||||
* (bluefox) Pre-settings for instances now supported
|
||||
|
||||
### 2.3.6 (2018-06-27)
|
||||
* (bluefox) URLs were sanitized
|
||||
|
||||
### 2.3.5 (2018-06-09)
|
||||
* (bluefox) Used yunkong2.socket.io version 2.1.1
|
||||
* (bluefox) Authentication problem was fixed
|
||||
|
||||
### 2.3.4 (2018-04-27)
|
||||
* (bluefox) Used socket.io version 2.1.0
|
||||
|
||||
### 2.3.3 (2018-04-27)
|
||||
* (bluefox) Fixing the new version of socket.io
|
||||
|
||||
### 2.3.2 (2018-04-14)
|
||||
* (bluefox) fixed select ID dialog for old style (vis)
|
||||
|
||||
### 2.3.1 (2018-04-14)
|
||||
* (bluefox) Updated socket.io version to 2.1.0
|
||||
|
||||
### 2.3.0 (2018-01-24)
|
||||
* (bluefox) The required for Admin3 libraries are added
|
||||
|
||||
### 2.2.0 (2018-01-14)
|
||||
* (bluefox) Ready for Admin3
|
||||
|
||||
### 2.1.9 (2017-11-19)
|
||||
* (bluefox) Fix link to local admin on welcome screen
|
||||
|
||||
### 2.1.7 (2017-10-06)
|
||||
* (bluefox) Fix link to local admin on welcome screen
|
||||
|
||||
### 2.1.4 (2017-10-02)
|
||||
* (bluefox) Support of yunkong2.pro
|
||||
|
||||
### 2.0.6 (2017-08-05)
|
||||
* (bluefox) Fix welcome screen
|
||||
|
||||
### 2.0.5 (2017-05-24)
|
||||
* (bluefox) Update socketio lib
|
||||
|
||||
### 2.0.4 (2017-04-25)
|
||||
* (bluefox) show logout button if connected over cloud
|
||||
|
||||
### 2.0.3 (2017-04-01)
|
||||
* (bluefox) catch errors for invalid objects
|
||||
|
||||
### 2.0.2 (2017-02-08)
|
||||
* (bluefox) fix selectID dialog
|
||||
|
||||
### 2.0.1 (2017-01-28)
|
||||
* (bluefox) implement new welcome screen
|
||||
|
||||
### 2.0.0 (2017-01-05)
|
||||
* (bluefox) support of web extensions
|
||||
* (bluefox) protect against brute force attacks
|
||||
|
||||
### 1.7.7 (2017-01-04)
|
||||
* (bluefox) fix error with authentication
|
||||
|
||||
### 1.7.6 (2016-12-07)
|
||||
* (bluefox) Downgrade the socket.io to support older devices
|
||||
|
||||
### 1.7.5 (2016-11-14)
|
||||
* (bluefox) Fix selectID Dialog
|
||||
|
||||
### 1.7.4 (2016-11-06)
|
||||
* (bluefox) Fix unsubscribe of states
|
||||
|
||||
### 1.7.3 (2016-10-11)
|
||||
* (bluefox) use new socketio
|
||||
* (bluefox) fix config dialog
|
||||
|
||||
### 1.7.2 (2016-09-25)
|
||||
* (bluefox) Fix redirect for login
|
||||
|
||||
### 1.7.1 (2016-09-15)
|
||||
* (bluefox) update selectID dialog
|
||||
|
||||
### 1.7.0 (2016-08-30)
|
||||
* (bluefox) сompatible only with new admin
|
||||
|
||||
### 1.6.2 (2016-08-30)
|
||||
* (bluefox) updated SelectID Dialog
|
||||
|
||||
### 1.6.1 (2016-08-27)
|
||||
* (bluefox) support of letsencrypt
|
||||
|
||||
### 1.5.4 (2016-08-14)
|
||||
* (bluefox) support of web-sockets force
|
||||
|
||||
### 1.5.3 (2016-07-27)
|
||||
* (bluefox) show links if root directory called
|
||||
|
||||
### 1.5.2 (2016-07-18)
|
||||
* (bluefox) fix error with early logout
|
||||
* (bluefox) update passport.socketio
|
||||
|
||||
### 1.5.1 (2016-07-06)
|
||||
* (bluefox) support of chained certificates
|
||||
|
||||
### 1.5.0 (2016-06-29)
|
||||
* (bluefox) update version of socket.io
|
||||
|
||||
### 1.4.8 (2016-06-19)
|
||||
* (bluefox) bind socket to specifed IP
|
||||
|
||||
### 1.4.7 (2016-05-24)
|
||||
* (bluefox) add version dependency
|
||||
|
||||
### 1.4.6 (2016-05-23)
|
||||
* (bluefox) update selectID dialog
|
||||
|
||||
### 1.4.5 (2016-05-17)
|
||||
* (bluefox) make possible to change language without restart
|
||||
|
||||
### 1.4.4 (2016-05-13)
|
||||
* (bluefox) update socket-io version
|
||||
|
||||
### 1.4.3 (2016-04-24)
|
||||
* (bluefox) use new socket.io version
|
||||
|
||||
### 1.4.1 (2016-04-09)
|
||||
* (bluefox) add grey jquery theme
|
||||
|
||||
### 1.4.0 (2016-03-17)
|
||||
* (bluefox) rename files
|
||||
|
||||
### 1.3.5 (2016-03-11)
|
||||
* (bluefox) update selectId dialog
|
||||
* (bluefox) enable get files from disk and not from cache, just request http://ip:8082/vis/file.png?something
|
||||
* (bluefox) update packages
|
||||
|
||||
### 1.3.4 (2015-12-25)
|
||||
* (bluefox) update socketio
|
||||
|
||||
### 1.3.3 (2015-12-14)
|
||||
* (bluefox) add themes
|
||||
|
||||
### 1.3.3 (2015-12-14)
|
||||
* (bluefox) add themes
|
||||
|
||||
### 1.3.2 (2015-12-14)
|
||||
* (bluefox) fix selectID.js
|
||||
* (bluefox) update socketio
|
||||
|
||||
### 1.3.0 (2015-11-15)
|
||||
* (bluefox) add version compatibility check
|
||||
|
||||
### 1.2.2 (2015-11-14)
|
||||
* (bluefox) support of multi-history
|
||||
|
||||
### 1.2.1 (2015-11-10)
|
||||
* (bluefox) fix default user
|
||||
|
||||
### 1.2.0 (2015-11-06)
|
||||
* (bluefox) support of npm 3.x
|
||||
|
||||
### 1.1.1 (2015-11-01)
|
||||
* (bluefox) some files were missed on npm
|
||||
*
|
||||
### 1.1.0 (2015-11-01)
|
||||
* (bluefox) update jquery UI libs
|
||||
|
||||
### 1.0.2 (2015-10-09)
|
||||
* (bluefox) update selectID dialog
|
||||
|
||||
### 1.0.1 (2015-10-06)
|
||||
* (bluefox) update selectID dialog
|
||||
* (bluefox) enable resizing of columns in select ID dialog
|
||||
|
||||
### 1.0.0 (2015-09-30)
|
||||
* (bluefox) stop adapter before update
|
||||
|
||||
### 0.4.4 (2015-08-14)
|
||||
* (bluefox) update select ID dialog
|
||||
|
||||
### 0.4.3 (2015-08-11)
|
||||
* (bluefox) fix filter in selectId dialog
|
||||
* (bluefox) update packages
|
||||
|
||||
### 0.4.2 (2015-07-01)
|
||||
* (bluefox) fix small package.json errors
|
||||
|
||||
### 0.4.1 (2015-06-28)
|
||||
* (bluefox) change login form
|
||||
* (bluefox) update version of simple-api
|
||||
* (bluefox) add default user
|
||||
* (bluefox) temporary enable install over npm
|
||||
* (bluefox) use xtend 4.0.0
|
||||
|
||||
### 0.4.0 (2015-06-13)
|
||||
* (bluefox) add permissions support
|
||||
|
||||
### 0.3.2 (2015-05-20)
|
||||
* (bluefox) support of subscribeObjects in socketio
|
||||
|
||||
### 0.3.1 (2015-04-24)
|
||||
* (bluefox) make "_socket/info.js" available from every directory
|
||||
|
||||
### 0.3.0 (2015-04-23)
|
||||
* (bluefox) enable https connection and improve login dialog
|
||||
|
||||
### 0.2.6 (2015-03-07)
|
||||
* (bluefox) update socketio
|
||||
|
||||
### 0.2.5 (2015-03-04)
|
||||
* (bluefox) add sysLang variable to info.js (e.g. for Rickshaw)
|
||||
|
||||
### 0.2.4 (2015-02-14)
|
||||
* (bluefox) fix error with update states if used internal socket.io
|
||||
|
||||
### 0.2.3 (2015-02-12)
|
||||
* (bluefox) add simple api
|
||||
* (bluefox) update select ID dialog
|
||||
|
||||
### 0.2.2 (2015-01-20)
|
||||
* (bluefox) update select ID dialog
|
||||
|
||||
### 0.2.1 (2015-01-18)
|
||||
* (bluefox) update select ID dialog
|
||||
|
||||
### 0.2.0 (2015-01-16)
|
||||
* (bluefox) support of integrated socket (from yunkong2.socketio)
|
||||
|
||||
### 0.1.12 (2015-01-08)
|
||||
* (bluefox) update selectId dialog
|
||||
|
||||
### 0.1.11 (2015-01-07)
|
||||
* (bluefox) monitor state of socket.io to give correct connection data
|
||||
|
||||
### 0.1.10 (2015-01-06)
|
||||
* (bluefox) cache web files in memory
|
||||
|
||||
### 0.1.9 (2015-01-03)
|
||||
* (bluefox) update selectId dialog
|
||||
|
||||
### 0.1.8 (2015-01-02)
|
||||
* (bluefox) enable socketio.0 by default
|
||||
|
||||
### 0.1.7 (2015-01-02)
|
||||
* (bluefox) enable npm install
|
||||
|
||||
### 0.1.6 (2014-12-28)
|
||||
* (bluefox) support empty files
|
||||
|
||||
### 0.1.5 (2014-12-26)
|
||||
* (bluefox) extend select ID dialog with jquery Theme-roller
|
||||
|
||||
### 0.1.4 (2014-12-25)
|
||||
* (bluefox) update select ID dialog
|
||||
|
||||
### 0.1.3 (2014-12-14)
|
||||
* (bluefox) include "lib" directory with common files like jquery and jqGrid
|
||||
|
||||
### 0.1.2 (2014-12-05)
|
||||
* (bluefox) read certificates from DB
|
||||
|
||||
### 0.1.1 (2014-12-05)
|
||||
* (bluefox) use readFile instead of request
|
||||
|
||||
### 0.1.0 (2014-11-24)
|
||||
* (bluefox) support of socket.io information
|
||||
|
||||
### 0.0.2 (2014-11-02)
|
||||
* (bluefox) support of read binary states under http://ip:port/state/stateName
|
||||
|
||||
#### 0.0.1
|
||||
* (bluefox) initial commit
|
647
admin/index.html
Normal file
@ -0,0 +1,647 @@
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" type="text/css" href="../../lib/css/themes/jquery-ui/redmond/jquery-ui.min.css"/>
|
||||
<script type="text/javascript" src="../../lib/js/jquery-1.11.1.min.js"></script>
|
||||
<script type="text/javascript" src="../../socket.io/socket.io.js"></script>
|
||||
<script type="text/javascript" src="../../lib/js/jquery-ui-1.10.3.full.min.js"></script>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="../../css/adapter.css"/>
|
||||
<script type="text/javascript" src="../../js/translate.js"></script>
|
||||
<script type="text/javascript" src="../../js/adapter-settings.js"></script>
|
||||
<script type="text/javascript" src="words.js"></script>
|
||||
|
||||
<style>
|
||||
.number {
|
||||
width: 70px
|
||||
}
|
||||
</style>
|
||||
|
||||
<script type="text/javascript">
|
||||
var supportedSockets = ['socketio'];
|
||||
|
||||
function showHideSettings() {
|
||||
if ($('#secure').prop('checked')) {
|
||||
$('#_certPublic').show();
|
||||
$('#_certPrivate').show();
|
||||
$('#_certChained').show();
|
||||
$('.le-settings').show();
|
||||
|
||||
if ($('#leEnabled').prop('checked')) {
|
||||
$('.le-sub-settings').show();
|
||||
if ($('#leUpdate').prop('checked')) {
|
||||
$('.le-sub-settings-update').show();
|
||||
} else {
|
||||
$('.le-sub-settings-update').hide();
|
||||
}
|
||||
} else {
|
||||
$('.le-sub-settings').hide();
|
||||
}
|
||||
} else {
|
||||
$('#_certPublic').hide();
|
||||
$('#_certPrivate').hide();
|
||||
$('#_certChained').hide();
|
||||
$('#auth').prop('checked', false);
|
||||
$('.le-settings').hide();
|
||||
}
|
||||
if ($('#auth').prop('checked')) {
|
||||
$('#secure').prop('checked', true);
|
||||
$('#defaultUser').val('admin');
|
||||
$('.defaultUser').hide();
|
||||
$('#_ttl').show();
|
||||
} else {
|
||||
$('.defaultUser').show();
|
||||
$('#_ttl').hide();
|
||||
}
|
||||
if ($('#whiteListEnabled').prop('checked')) {
|
||||
$('.white-list-settings').show();
|
||||
} else {
|
||||
$('.white-list-settings').hide();
|
||||
}
|
||||
}
|
||||
|
||||
// the function loadSettings has to exist ...
|
||||
function load(settings, onChange) {
|
||||
$('#tabs').tabs();
|
||||
|
||||
if (!settings) return;
|
||||
|
||||
if (!settings.lePort) settings.lePort = 80;
|
||||
if (settings.whiteListEnabled === undefined) settings.whiteListEnabled = false;
|
||||
|
||||
getIPs(function(ips) {
|
||||
for (var i = 0; i < ips.length; i++) {
|
||||
$('#bind').append('<option value="' + ips[i].address + '">' + ips[i].name + '</option>');
|
||||
}
|
||||
$('#bind.value').val(settings.bind);
|
||||
});
|
||||
$('#socketio')
|
||||
.append('<option value="none">' + _('none') + '</option>')
|
||||
.append('<option value="">' + _('integrated') + '</option>');
|
||||
|
||||
var count = 0;
|
||||
for (var i = 0; i < supportedSockets.length; i++) {
|
||||
count++;
|
||||
getAdapterInstances(supportedSockets[i], function (res) {
|
||||
if (!res) return;
|
||||
for (var t = 0; t < res.length; t++) {
|
||||
$('#socketio').append('<option value="' + res[t]._id + '">' + res[t].common.name + ' [' + res[t]._id.replace('system.adapter.', '') + ']</option>');
|
||||
}
|
||||
if (!--count) {
|
||||
var $socketio = $('#socketio');
|
||||
$socketio.val(settings.socketio);
|
||||
if (settings.socketio !== '') {
|
||||
$('.socketio').hide();
|
||||
}
|
||||
$socketio.change(function () {
|
||||
if ($(this).val() === '') {
|
||||
$('.socketio').show();
|
||||
} else {
|
||||
$('.socketio').hide();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
$('.value').each(function () {
|
||||
var key = $(this).attr('id');
|
||||
var $value = $('#' + key + '.value');
|
||||
if ($value.attr('type') === 'checkbox') {
|
||||
$value.prop('checked', settings[key]).change(function() {
|
||||
showHideSettings();
|
||||
onChange();
|
||||
});
|
||||
} else {
|
||||
$value.val(settings[key]).change(function() {
|
||||
onChange();
|
||||
}).keyup(function() {
|
||||
$(this).trigger('change');
|
||||
});
|
||||
}
|
||||
});
|
||||
onChange(false);
|
||||
|
||||
fillSelectCertificates('#certPublic', 'public', settings.certPublic);
|
||||
fillSelectCertificates('#certPrivate', 'private', settings.certPrivate);
|
||||
fillSelectCertificates('#certChained', 'chained', settings.certChained);
|
||||
fillUsers('#defaultUser', settings.defaultUser);
|
||||
|
||||
showHideSettings();
|
||||
|
||||
$('#auth').change(function () {
|
||||
if ($(this).prop('checked')) {
|
||||
$('#secure').prop('checked', true);
|
||||
showHideSettings();
|
||||
}
|
||||
|
||||
updateNameSelects();
|
||||
setDefaultIpUserToDefaultUser();
|
||||
});
|
||||
|
||||
$('#defaultUser').change(function () {
|
||||
setDefaultIpUserToDefaultUser();
|
||||
});
|
||||
|
||||
applyWhiteListSettings(settings, onChange);
|
||||
}
|
||||
|
||||
function save(callback) {
|
||||
var obj = {};
|
||||
$('.value').each(function () {
|
||||
var $this = $(this);
|
||||
if ($this.attr('type') === 'checkbox') {
|
||||
obj[$this.attr('id')] = $this.prop('checked');
|
||||
} else {
|
||||
obj[$this.attr('id')] = $this.val();
|
||||
}
|
||||
});
|
||||
|
||||
if ($('#secure').prop('checked') && (!$('#certPrivate').val() || !$('#certPublic').val())) {
|
||||
showMessage(_('Set certificates or load it first in the system settings (right top).'));
|
||||
return;
|
||||
}
|
||||
|
||||
obj['whiteListSettings'] = getWhiteListSettings();
|
||||
|
||||
callback(obj);
|
||||
}
|
||||
|
||||
var ips = {};
|
||||
var inputIndex = 0;
|
||||
function addWhiteListTableRow(change) {
|
||||
var table = document.getElementById('whiteListTable');
|
||||
|
||||
var row = table.insertRow(2);
|
||||
|
||||
var rowCount = table.rows.length;
|
||||
|
||||
var defaultRowIndex = rowCount - 1;
|
||||
|
||||
var colCount = table.rows[defaultRowIndex].cells.length;
|
||||
|
||||
for (var i = 0; i < colCount; i++) {
|
||||
var newCell = row.insertCell(i);
|
||||
var cellClass = $(table.rows[defaultRowIndex].cells[i]).attr('class');
|
||||
|
||||
if (cellClass.indexOf('defaultUserName') !== -1) {
|
||||
newCell.innerHTML = '<select class="select-username" />';
|
||||
} else {
|
||||
$(newCell).addClass(cellClass);
|
||||
newCell.innerHTML = table.rows[defaultRowIndex].cells[i].innerHTML;
|
||||
}
|
||||
|
||||
if (newCell.innerHTML === 'default') {
|
||||
var id = 'input_' + inputIndex++;
|
||||
var ip = '192.168.0.1';
|
||||
ips[id] = ip;
|
||||
newCell.innerHTML = '<input name="ip" size="15" maxlength="255" id="' + id + '" value="' + ip + '"/>';
|
||||
}
|
||||
|
||||
if (newCell.childNodes[0].type === 'checkbox') {
|
||||
newCell.childNodes[0].checked = false;
|
||||
}
|
||||
}
|
||||
|
||||
$('.select-username:not(:has(option))').each(function () {
|
||||
fillNameSelect($(this));
|
||||
});
|
||||
|
||||
|
||||
if (change && changedCallback) changedCallback();
|
||||
|
||||
defaultHandling();
|
||||
return row;
|
||||
}
|
||||
|
||||
function deleteWhiteListTableRow(index) {
|
||||
try {
|
||||
changedCallback && changedCallback();
|
||||
var table = document.getElementById('whiteListTable');
|
||||
var rowCount = table.rows.length;
|
||||
if (index === rowCount - 1) return;
|
||||
table.deleteRow(index);
|
||||
} catch (e) {
|
||||
alert(e);
|
||||
}
|
||||
}
|
||||
|
||||
function getWhiteListSettings() {
|
||||
|
||||
var settings = {};
|
||||
|
||||
try {
|
||||
var table = document.getElementById('whiteListTable');
|
||||
|
||||
var rowCount = table.rows.length;
|
||||
|
||||
for (var i = 2; i < rowCount; i++) {
|
||||
var row = table.rows[i];
|
||||
|
||||
var ip = (i === (rowCount - 1)) ? 'default' : row.cells[1].childNodes[0].value;
|
||||
var userSelected = (i === (rowCount - 1)) ? $(row.cells[2]).html().toLowerCase() : $(row.cells[2].childNodes[0]).val();
|
||||
|
||||
settings[ip] = {
|
||||
user: userSelected,
|
||||
object: {},
|
||||
state: {},
|
||||
file: {}
|
||||
};
|
||||
|
||||
for (var c = 2; c < row.cells.length; c++) {
|
||||
var $cell = $(row.cells[c].childNodes[0]);
|
||||
var permobject = $cell.attr('permobject');
|
||||
|
||||
var perm = $cell.attr('perm');
|
||||
|
||||
if (permobject && perm && settings[ip].hasOwnProperty(permobject)) {
|
||||
settings[ip][permobject][perm] = $cell.prop('checked');
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
alert(e);
|
||||
}
|
||||
|
||||
return settings;
|
||||
}
|
||||
|
||||
function validateIp(ip) {
|
||||
if (ip.indexOf('*') !== -1 && ip.lastIndexOf('.') > ip.indexOf('*')) {
|
||||
return false;
|
||||
}
|
||||
var expression = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$|^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$|^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/;
|
||||
|
||||
return expression.test(ip.replace('*', '111'));
|
||||
}
|
||||
|
||||
function createWhiteListTable(whiteListSettings) {
|
||||
var table = document.getElementById("whiteListTable");
|
||||
|
||||
var rowCount = table.rows.length;
|
||||
|
||||
for (var i = rowCount - 2; i > 1; i--) {
|
||||
table.deleteRow(i);
|
||||
}
|
||||
|
||||
if (whiteListSettings) {
|
||||
Object.keys(whiteListSettings).forEach(function (key) {
|
||||
rowCount = table.rows.length;
|
||||
if (key !== 'default') {
|
||||
addWhiteListTableRow(false);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
var changedCallback = null;
|
||||
var whiteListSettings = null;
|
||||
function applyWhiteListSettings(settings, onChange) {
|
||||
try {
|
||||
whiteListSettings = settings['whiteListSettings'];
|
||||
createWhiteListTable(whiteListSettings);
|
||||
fillNameSelects(whiteListSettings);
|
||||
changedCallback = onChange;
|
||||
} catch (e) {
|
||||
alert(e);
|
||||
}
|
||||
}
|
||||
|
||||
function handleIpChange() {
|
||||
var ip = $(this).val();
|
||||
var id = $(this).attr('id');
|
||||
if (ip && !validateIp(ip)) {
|
||||
showMessage(_('The provided IP is not valid'));
|
||||
// alert('The provided IP ' + ip + ' is not valid');
|
||||
if (ips.hasOwnProperty(id)) {
|
||||
$(this).val(ips[id]);
|
||||
}
|
||||
} else {
|
||||
ips[id] = ip;
|
||||
}
|
||||
|
||||
changedCallback && changedCallback();
|
||||
}
|
||||
|
||||
function wireClickEvents() {
|
||||
$('.delete-btn-clmn')
|
||||
.off('click')
|
||||
.click(function () {
|
||||
var rowIndex = $(this).parent().parent().children().index($(this).parent());
|
||||
deleteWhiteListTableRow(rowIndex + 2);
|
||||
});
|
||||
}
|
||||
|
||||
function wireChangeEvents() {
|
||||
var table = document.getElementById('whiteListTable');
|
||||
var rowCount = table.rows.length;
|
||||
|
||||
for (var i = 2; i < rowCount; i++) {
|
||||
var row = table.rows[i];
|
||||
|
||||
if (i !== rowCount - 1) {
|
||||
var $input = $(row.cells[1].childNodes[0]);
|
||||
$input.off('change');
|
||||
$input.change(handleIpChange);
|
||||
}
|
||||
|
||||
for (var c = 2; c < row.cells.length; c++) {
|
||||
var $cell = $(row.cells[c].childNodes[0]);
|
||||
$cell.off('change');
|
||||
$cell.change(function () {
|
||||
changedCallback && changedCallback();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
$('.select-username')
|
||||
.off('change')
|
||||
.change(function () {
|
||||
changedCallback && changedCallback();
|
||||
});
|
||||
}
|
||||
|
||||
function hideDefaultDeleteBtn() {
|
||||
$('.delete-btn').css({
|
||||
display: 'block'
|
||||
});
|
||||
|
||||
$('.delete-btn:last').css({
|
||||
display: 'none'
|
||||
});
|
||||
}
|
||||
|
||||
function addOptionIfAbsent($e, value, valueText, defaultUser) {
|
||||
if (!$e.find('option[value="' + value + '"]').length) {
|
||||
$e.append('<option value="' + value + '" ' + ((defaultUser === value) ? 'selected' : '') + '>' + valueText + '</option>');
|
||||
}
|
||||
}
|
||||
|
||||
function fillNameSelect($this, defaultUser) {
|
||||
for (var u in users) {
|
||||
var value = users[u].common.name;
|
||||
var valueText = users[u].common.name[0].toUpperCase() + users[u].common.name.substring(1);
|
||||
addOptionIfAbsent($this, value, valueText, defaultUser);
|
||||
}
|
||||
}
|
||||
|
||||
var users = {};
|
||||
function fillNameSelects(whiteListSettings) {
|
||||
|
||||
if (!whiteListSettings) return;
|
||||
|
||||
getUsers(function (err, response) {
|
||||
users = response;
|
||||
$('.select-username')
|
||||
.off('change')
|
||||
.each(function () {
|
||||
fillNameSelect($(this));
|
||||
});
|
||||
|
||||
applyRowSettings(whiteListSettings);
|
||||
|
||||
defaultHandling();
|
||||
});
|
||||
}
|
||||
|
||||
function applyRowSettings(whiteListSettings) {
|
||||
|
||||
if (!whiteListSettings) return;
|
||||
|
||||
var table = document.getElementById('whiteListTable');
|
||||
var rowCount = table.rows.length;
|
||||
var i = 2;
|
||||
Object.keys(whiteListSettings).forEach(function (key) {
|
||||
var row = key === 'default' ? table.rows[rowCount - 1] : table.rows[i++];
|
||||
setRowSettings(row, key, whiteListSettings[key]);
|
||||
});
|
||||
}
|
||||
|
||||
function setRowSettings(row, ip, ipSettings) {
|
||||
var $ip = $(row.cells[1].childNodes[0]);
|
||||
$ip.val(ip);
|
||||
for (var c = 2; c < row.cells.length; c++) {
|
||||
var $cell = $(row.cells[c].childNodes[c === 2 ? 1 : 0]);
|
||||
|
||||
if (c > 2) {
|
||||
var permobject = $cell.attr('permobject');
|
||||
var perm = $cell.attr('perm');
|
||||
|
||||
if (ipSettings.hasOwnProperty(permobject) && ipSettings[permobject].hasOwnProperty(perm)) {
|
||||
$cell.prop('checked', ipSettings[permobject][perm]);
|
||||
}
|
||||
} else {
|
||||
$(row.cells[2].childNodes[0]).val(ipSettings.user).change();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function setDefaultIpUserToDefaultUser() {
|
||||
var auth = $('#auth').prop('checked');
|
||||
var defaultUser = auth ? 'Auth' : $('#defaultUser').find('option:selected').text();
|
||||
$('.defaultUserName').html(defaultUser);
|
||||
}
|
||||
|
||||
function updateNameSelects() {
|
||||
var auth = $('#auth').prop('checked');
|
||||
if (auth) {
|
||||
$('.select-username').each(function () {
|
||||
addOptionIfAbsent($(this), 'auth', 'Auth');
|
||||
});
|
||||
} else {
|
||||
$('.select-username option[value="auth"]').remove();
|
||||
}
|
||||
}
|
||||
|
||||
function defaultHandling() {
|
||||
hideDefaultDeleteBtn();
|
||||
updateNameSelects();
|
||||
setDefaultIpUserToDefaultUser();
|
||||
wireClickEvents();
|
||||
wireChangeEvents();
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.whiteListTableHeader {
|
||||
background-color: lightgrey;
|
||||
color: darkslateblue;
|
||||
}
|
||||
|
||||
.whiteListTableUnevenBlock {
|
||||
background-color: gainsboro;
|
||||
}
|
||||
|
||||
.whiteListTableEvenBlock {
|
||||
background-color: lavender;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="adapter-container">
|
||||
<table>
|
||||
<tr>
|
||||
<td><img src="web.png"></td>
|
||||
<td><h3 class="translate">Web Server adapter settings</h3></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div id="tabs">
|
||||
<ul>
|
||||
<li><a href="#tabs-1" class="translate">General</a></li>
|
||||
<li><a href="#tabs-2" class="translate">White List</a></li>
|
||||
</ul>
|
||||
<div id="tabs-1">
|
||||
<table>
|
||||
<tr>
|
||||
<td><label class="translate" for="bind">IP:</label></td>
|
||||
<td><select class="value" id="bind"></select></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label class="translate" for="port">Port:</label></td>
|
||||
<td><input class="value" id="port" size="5" maxlength="5" type="number"/></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label class="translate" for="secure">Secure(HTTPS):</label></td>
|
||||
<td><input class="value" id="secure" type="checkbox"/></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr id="_certPublic">
|
||||
<td><label class="translate" for="certPublic">Public certificate:</label></td>
|
||||
<td><select id="certPublic" class="value"></select></td>
|
||||
</tr>
|
||||
<tr id="_certPrivate">
|
||||
<td><label class="translate" for="certPrivate">Private certificate:</label></td>
|
||||
<td><select id="certPrivate" class="value"></select></td>
|
||||
</tr>
|
||||
<tr id="_certChained">
|
||||
<td><label class="translate" for="certChained">Chained certificate:</label></td>
|
||||
<td><select id="certChained" class="value"></select></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label class="translate" for="auth">Authentication:</label></td>
|
||||
<td><input class="value" id="auth" type="checkbox"/></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr id="_ttl">
|
||||
<td><label class="translate" for="ttl">Login timeout(sec):</label></td>
|
||||
<td><input class="value" id="ttl" type="number"/></td>
|
||||
<td></td></tr>
|
||||
<tr>
|
||||
<td><label class="translate" for="cache">Cache:</label></td>
|
||||
<td><input class="value" id="cache" type="checkbox"/></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label class="translate" for="socketio">Socket.IO Instance (Optional):</label></td>
|
||||
<td><select class="value" id="socketio"></select><span class="translate"
|
||||
style="padding-left: 20px">socket_help</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="socketio">
|
||||
<td><label class="translate" for="forceWebSockets">Force Web-Sockets:</label></td>
|
||||
<td><input type="checkbox" class="value" id="forceWebSockets"/></td></tr>
|
||||
<tr>
|
||||
<td><label class="translate" for="simpleapi">Internal 'Simple API':</label></td>
|
||||
<td><input type="checkbox" class="value" id="simpleapi"/></td>
|
||||
</tr>
|
||||
<tr class="defaultUser">
|
||||
<td><label class="translate" for="defaultUser">Run as:</label></td>
|
||||
<td><select class="value" id="defaultUser"></select></td>
|
||||
</tr>
|
||||
<tr><td colspan="2"> </td></tr>
|
||||
<tr class="le-settings"><td colspan="2"><h3 class="translate">Let's Encrypt settings</h3></tr>
|
||||
<tr class="le-settings"><td><label for="leEnabled" class="translate">Use Lets Encrypt certificates:</label></td><td><input class="value" id="leEnabled" type="checkbox" /></td></tr>
|
||||
<tr class="le-settings le-sub-settings"><td><label for="leUpdate" class="translate">Use this instance for automatic update:</label></td><td><input class="value" id="leUpdate" type="checkbox" /></td></tr>
|
||||
<tr class="le-settings le-sub-settings le-sub-settings-update"><td><label for="lePort" class="translate">Port to check the domain:</label></td><td><input class="value number" id="lePort" type="number" size="5" maxlength="5" /></td></tr>
|
||||
|
||||
</table>
|
||||
</div>
|
||||
<div id="tabs-2">
|
||||
<div>
|
||||
<span><label class="translate" for="whiteListEnabled">Enabled:</label></span><input id="whiteListEnabled" class="value" type="checkbox" />
|
||||
</div>
|
||||
<button style="display: inline-block; width: 2em; height: 2em;" onclick="addWhiteListTableRow(true)"
|
||||
class="ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only white-list-settings" role="button">
|
||||
<span class="ui-button-icon-primary ui-icon ui-icon-plus"></span>
|
||||
<span class="ui-button-text"></span>
|
||||
</button>
|
||||
|
||||
<table id="whiteListTable" cellpadding="3" cellspacing="2" border="0" class="white-list-settings">
|
||||
<thead>
|
||||
<tr class="whiteListTableHeader">
|
||||
<th rowspan="2" colspan="2" class="translate">IP</th>
|
||||
<th rowspan="2" class="translate">User</th>
|
||||
<th colspan="4" class="translate">object</th>
|
||||
<th colspan="5" class="translate">state</th>
|
||||
<th colspan="5" class="translate">file</th>
|
||||
</tr>
|
||||
<tr class="whiteListTableHeader">
|
||||
<th class="translate">read</th>
|
||||
<th class="translate">list</th>
|
||||
<th class="translate">write</th>
|
||||
<th class="translate">remove</th>
|
||||
|
||||
<th class="translate">read</th>
|
||||
<th class="translate">list</th>
|
||||
<th class="translate">write</th>
|
||||
<th class="translate">create</th>
|
||||
<th class="translate">remove</th>
|
||||
|
||||
<th class="translate">read</th>
|
||||
<th class="translate">list</th>
|
||||
<th class="translate">write</th>
|
||||
<th class="translate">create</th>
|
||||
<th class="translate">remove</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="whiteListTableBody">
|
||||
<tr>
|
||||
<td class="whiteListTableUnevenBlock delete-btn-clmn"><a class="delete-btn" href="#"><span
|
||||
class="ui-icon ui-icon-trash"></span></a></td>
|
||||
|
||||
<td class="whiteListTableUnevenBlock">default</td>
|
||||
|
||||
<td class="whiteListTableUnevenBlock defaultUserName">defaultName</td>
|
||||
|
||||
<td class="whiteListTableEvenBlock"><input permobject="object" perm="read" type="checkbox"
|
||||
checked="true"/></td>
|
||||
<td class="whiteListTableEvenBlock"><input permobject="object" perm="list" type="checkbox"
|
||||
checked="true"/></td>
|
||||
<td class="whiteListTableEvenBlock"><input permobject="object" perm="write" type="checkbox"
|
||||
checked="true"/></td>
|
||||
<td class="whiteListTableEvenBlock"><input permobject="object" perm="delete" type="checkbox"
|
||||
checked="true"/></td>
|
||||
|
||||
<td class="whiteListTableUnevenBlock"><input permobject="state" perm="read" type="checkbox"
|
||||
checked="true"/></td>
|
||||
<td class="whiteListTableUnevenBlock"><input permobject="state" perm="list" type="checkbox"
|
||||
checked="true"/></td>
|
||||
<td class="whiteListTableUnevenBlock"><input permobject="state" perm="write" type="checkbox"
|
||||
checked="true"/></td>
|
||||
<td class="whiteListTableUnevenBlock"><input permobject="state" perm="create" type="checkbox"
|
||||
checked="true"/></td>
|
||||
<td class="whiteListTableUnevenBlock"><input permobject="state" perm="delete" type="checkbox"
|
||||
checked="true"/></td>
|
||||
|
||||
<td class="whiteListTableEvenBlock"><input permobject="file" perm="read" type="checkbox"
|
||||
checked="true"/></td>
|
||||
<td class="whiteListTableEvenBlock"><input permobject="file" perm="list" type="checkbox"
|
||||
checked="true"/></td>
|
||||
<td class="whiteListTableEvenBlock"><input permobject="file" perm="write" type="checkbox"
|
||||
checked="true"/></td>
|
||||
<td class="whiteListTableEvenBlock"><input permobject="file" perm="create" type="checkbox"
|
||||
checked="true"/></td>
|
||||
<td class="whiteListTableEvenBlock"><input permobject="file" perm="delete" type="checkbox"
|
||||
checked="true"/></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table >
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
1087
admin/index_m.html
Normal file
BIN
admin/web.png
Normal file
After Width: | Height: | Size: 18 KiB |
54
admin/words.js
Normal file
@ -0,0 +1,54 @@
|
||||
// DO NOT EDIT THIS FILE!!! IT WILL BE AUTOMATICALLY GENERATED FROM src/i18n
|
||||
/*global systemDictionary:true */
|
||||
'use strict';
|
||||
|
||||
systemDictionary = {
|
||||
"WWW Web Server adapter settings": { "en": "WWW Web Server adapter settings", "de": "WWW Web Server adapter settings", "ru": "WWW Web Server adapter settings", "pt": "Configurações do adaptador do servidor WWW", "nl": "WWW Web Server-adapterinstellingen", "fr": "Paramètres de l'adaptateur de serveur Web WWW", "it": "Impostazioni dell'adattatore del server Web WWW", "es": "Configuración del adaptador del servidor web WWW", "pl": "Ustawienia WWW serwera WWW"},
|
||||
"Run as:": { "en": "Run as", "de": "Laufen unter Anwender", "ru": "Запустить от пользователя", "pt": "Correr como", "nl": "Rennen als", "fr": "Courir comme", "it": "Correre come", "es": "Correr como", "pl": "Uruchom jako"},
|
||||
"IP:": { "en": "IP", "de": "IP", "ru": "IP", "pt": "IP", "nl": "IK P", "fr": "IP", "it": "IP", "es": "IP", "pl": "IP"},
|
||||
"Port:": { "en": "Port", "de": "Port", "ru": "Порт", "pt": "Porta", "nl": "Haven", "fr": "Port", "it": "Porta", "es": "Puerto", "pl": "Port"},
|
||||
"Secure(HTTPS):": { "en": "Secure(HTTPS)", "de": "Verschlüsselung(HTTPS)", "ru": "Шифрование(HTTPS)", "pt": "Seguro (HTTPS)", "nl": "Secure (HTTPS)", "fr": "Sécurisé (HTTPS)", "it": "Sicuro (HTTPS)", "es": "Seguro (HTTPS)", "pl": "Bezpieczne (HTTPS)"},
|
||||
"Authentication:": { "en": "Authentication", "de": "Authentifikation", "ru": "Аутентификация", "pt": "Autenticação", "nl": "authenticatie", "fr": "Authentification", "it": "Autenticazione", "es": "Autenticación", "pl": "Poświadczenie"},
|
||||
"Cache:": { "en": "Cache", "de": "Puffer", "ru": "Кэш", "pt": "Cache", "nl": "Cache", "fr": "Cache", "it": "nascondiglio", "es": "Cache", "pl": "Pamięć podręczna"},
|
||||
"Warning!": { "en": "Warning!", "de": "Warnung!", "ru": "Предупреждение!", "pt": "Atenção!", "nl": "Waarschuwing!", "fr": "Attention!", "it": "Avvertimento!", "es": "¡Advertencia!", "pl": "Ostrzeżenie!"},
|
||||
"Background": { "en": "Background", "de": "Hintergrund", "ru": "Фон", "pt": "Fundo", "nl": "Achtergrond", "fr": "Contexte", "it": "Sfondo", "es": "Fondo", "pl": "Tło"},
|
||||
"Background color of the login screen": { "en": "Background color of the login screen", "de": "Hintergrundfarbe des Anmeldebildschirms", "ru": "Цвет фона экрана входа в систему", "pt": "Cor de fundo da tela de login", "nl": "Achtergrondkleur van het inlogscherm", "fr": "Couleur d'arrière-plan de l'écran de connexion", "it": "Colore di sfondo della schermata di accesso", "es": "Color de fondo de la pantalla de inicio de sesión", "pl": "Kolor tła ekranu logowania"},
|
||||
"Background image": { "en": "Background image", "de": "Hintergrundbild", "ru": "Фоновое изображение", "pt": "Imagem de fundo", "nl": "Achtergrond afbeelding", "fr": "Image de fond", "it": "Immagine di sfondo", "es": "Imagen de fondo", "pl": "Zdjęcie w tle"},
|
||||
"Upload image": { "en": "Upload image", "de": "Bild hochladen", "ru": "Загрузить изображение", "pt": "Enviar Imagem", "nl": "Afbeelding uploaden", "fr": "Importer une image", "it": "Carica immagine", "es": "Cargar imagen", "pl": "Załaduj obrazek"},
|
||||
"Enabled:": { "en": "Enabled", "de": "Aktiviert", "ru": "Включено", "pt": "Ativado", "nl": "Ingeschakeld", "fr": "Activée", "it": "Abilitato", "es": "Habilitado", "pl": "Włączone"},
|
||||
"Unsecure_Auth": { "en": "The password will be sent via unsecure connection. To protect your passwords enable the secure connection (HTTPS)!", "de": "Das Passwort wird über unsichere Verbindung gesendet. Um Ihre Passwörter zu schützen, aktivieren Sie die sichere Verbindung (HTTPS)!", "ru": "Пароль будет отправлен через незащищенное соединение. Для защиты ваших паролей активируйте безопасное соединение (HTTPS)!", "pt": "A senha será enviada por meio de conexão não segura. Para proteger suas senhas, ative a conexão segura (HTTPS)!", "nl": "Het wachtwoord wordt verzonden via onbeveiligde verbinding. Ter beveiliging van uw wachtwoorden schakelt u de beveiligde verbinding (HTTPS) in!", "fr": "Le mot de passe sera envoyé via une connexion non sécurisée. Pour protéger vos mots de passe, activez la connexion sécurisée (HTTPS)!", "it": "La password verrà inviata tramite connessione non protetta. Per proteggere le tue password abilita la connessione sicura (HTTPS)!", "es": "La contraseña se enviará a través de una conexión no segura. Para proteger sus contraseñas, ¡habilite la conexión segura (HTTPS)!", "pl": "Hasło zostanie wysłane przez połączenie bez zabezpieczeń. Aby chronić swoje hasła, włącz bezpieczne połączenie (HTTPS)!"},
|
||||
"Login timeout(sec):": { "en": "Login timeout(sec)", "de": "Anmelde-Timeout (Sek.)", "ru": "Тайм-аут входа (сек)", "pt": "Tempo limite de login (seg)", "nl": "Aanmeld-time-out (sec)", "fr": "Délai d'attente de connexion (sec)", "it": "Timeout di accesso (sec)", "es": "Tiempo de espera de inicio de sesión (sec)", "pl": "Limit czasu logowania (s)"},
|
||||
"IP": { "en": "IP", "de": "IP", "ru": "IP", "pt": "IP", "nl": "IP", "fr": "IP", "it": "IP", "es": "IP", "pl": "IP"},
|
||||
"none": { "en": "none", "de": "keins", "ru": "none", "pt": "Nenhum", "nl": "geen", "fr": "aucun", "it": "nessuna", "es": "ninguna", "pl": "Żaden"},
|
||||
"Ignore warning": { "en": "Ignore warning", "de": "Warnung ignorieren", "ru": "Игнорировать предупреждение", "pt": "Ignorar aviso", "nl": "Negeer waarschuwing", "fr": "Ignorer l'avertissement", "it": "Ignora l'avviso", "es": "Ignorar advertencia", "pl": "Zignoruj ostrzeżenie"},
|
||||
"place here": { "en": "place the files here", "de": "Platziere die Dateien hier", "ru": "разместите файлы здесь", "pt": "coloque os arquivos aqui", "nl": "plaats de bestanden hier", "fr": "Placez les fichiers ici", "it": "posiziona i file qui", "es": "coloca los archivos aquí", "pl": "umieść pliki tutaj"},
|
||||
"Disable authentication": { "en": "Disable authentication", "de": "Authentifizierung deaktivieren", "ru": "Отключить аутентификацию", "pt": "Desativar autenticação", "nl": "Schakel verificatie uit", "fr": "Désactiver l'authentification", "it": "Disabilitare l'autenticazione", "es": "Deshabilitar autenticación", "pl": "Wyłącz uwierzytelnianie"},
|
||||
"Authentication was deactivated": { "en": "Authentication was deactivated", "de": "Die Authentifizierung wurde deaktiviert", "ru": "Аутентификация была отключена", "pt": "A autenticação foi desativada", "nl": "Verificatie was gedeactiveerd", "fr": "L'authentification a été désactivée", "it": "L'autenticazione è stata disattivata", "es": "La autenticación fue desactivada", "pl": "Uwierzytelnianie zostało dezaktywowane"},
|
||||
"integrated": { "en": "integrated", "de": "integriert", "ru": "встроенный", "pt": "integrado", "nl": "geïntegreerde", "fr": "intégré", "it": "integrato", "es": "integrado", "pl": "zintegrowany"},
|
||||
"Public certificate:": { "en": "Public certificate", "de": "Publikzertifikat", "ru": "'Public' сертификат", "pt": "Certificado público", "nl": "Openbaar certificaat", "fr": "Certificat public", "it": "Certificato pubblico", "es": "Certificado público", "pl": "Certyfikat publiczny"},
|
||||
"Private certificate:": { "en": "Private certificate", "de": "Privatzertifikat", "ru": "'Private' сертификат", "pt": "Certificado privado", "nl": "Privé certificaat", "fr": "Certificat privé", "it": "Certificato privato", "es": "Certificado privado", "pl": "Prywatny certyfikat"},
|
||||
"Chained certificate:": { "en": "Chained certificate", "de": "Kettenzertifikat", "ru": "'Chained' сертификат", "pt": "Certificado acorrentado", "nl": "Geketend certificaat", "fr": "Certificat chaîné", "it": "Certificato incatenato", "es": "Certificado encadenado", "pl": "Przykuty certyfikat"},
|
||||
"Force Web-Sockets:": { "en": "Force Web-Sockets", "de": "Nur Web-Sockets", "ru": "Только Web-Sockets", "pt": "Forçar Web-Sockets", "nl": "Force Web-Sockets", "fr": "Forcer les Web-Sockets", "it": "Force Web-Sockets", "es": "Force Web-Sockets", "pl": "Wymuszaj gniazda internetowe"},
|
||||
"Internal 'Simple API':": { "en": "Build-in 'Simple-API'", "de": "Eingebautes 'Simple-API'", "ru": "Встроенный 'Simple-API'", "pt": "Build-in 'Simple-API'", "nl": "Ingebouwde 'Simple-API'", "fr": "Construire 'Simple-API'", "it": "Build-in 'Simple-API'", "es": "Build-in 'Simple-API'", "pl": "Wbuduj \"Proste API\""},
|
||||
"Listen on all IPs": { "en": "Listen on all IPs", "de": "Alle IPs zulassen", "ru": "Открыть для всех IP адресов", "pt": "Ouça todos os IPs", "nl": "Luister op alle IP's", "fr": "Écoutez sur toutes les adresses IP", "it": "Ascolta su tutti gli IP", "es": "Escuchar en todas las direcciones IP", "pl": "Posłuchaj na wszystkich IP"},
|
||||
"Let's Encrypt settings": { "en": "Let's Encrypt settings", "de": "Einstellungen Let's Encrypt", "ru": "Настройкт Let's Encrypt", "pt": "Vamos criptografar configurações", "nl": "Laten we de instellingen versleutelen", "fr": "Cryptons les paramètres", "it": "Let's Encrypt settings", "es": "Vamos a cifrar la configuración", "pl": "Zakodujmy ustawienia"},
|
||||
"Use Lets Encrypt certificates:": { "en": "Use Let's Encrypt certificates", "de": "Benutzen Let's Encrypt Zertifikate", "ru": "Использовать сертификаты Let's Encrypt", "pt": "Use Vamos criptografar certificados", "nl": "Gebruik Let's Encrypt-certificaten", "fr": "Utiliser les certificats Let's Encrypt", "it": "Utilizza Let's Encrypt certificates", "es": "Utilice los certificados Let's Encrypt", "pl": "Użyj Let's Encrypt certificates"},
|
||||
"Use this instance for automatic update:": { "en": "Use this instance for automatic update", "de": "Benutze diese Instanz für automatische Updates", "ru": "Обновлять сертификаты в этом драйвере", "pt": "Use esta instância para atualização automática", "nl": "Gebruik deze instantie voor automatische update", "fr": "Utilisez cette instance pour la mise à jour automatique", "it": "Utilizza questa istanza per l'aggiornamento automatico", "es": "Use esta instancia para la actualización automática", "pl": "Użyj tej instancji do automatycznej aktualizacji"},
|
||||
"Port to check the domain:": { "en": "Port to check the domain", "de": "Port um die Domain zu prüfen", "ru": "Порт для проверки доменного имени", "pt": "Porta para verificar o domínio", "nl": "Poort om het domein te controleren", "fr": "Port pour vérifier le domaine", "it": "Porta per controllare il dominio", "es": "Puerto para verificar el dominio", "pl": "Port do sprawdzenia domeny"},
|
||||
"Set certificates or load it first in the system settings (right top).": {"en": "Set certificates or load it first in the system settings (right top).", "de": "Setze Zertificate oder lade die erst unter System/Einstellungen (oben rechts).", "ru": "Нужно выбрать сертификаты или сначала загрузить их в системных настройках (вверху справа).", "pt": "Defina certificados ou carregue primeiro nas configurações do sistema (parte superior direita).", "nl": "Stel certificaten in of laad het eerst in de systeeminstellingen (rechtsboven).", "fr": "Définissez des certificats ou chargez-les d'abord dans les paramètres du système (en haut à droite).", "it": "Imposta i certificati o caricali prima nelle impostazioni di sistema (in alto a destra).", "es": "Establezca certificados o cárguelos primero en la configuración del sistema (arriba a la derecha).", "pl": "Ustaw certyfikaty lub załaduj najpierw w ustawieniach systemu (prawy górny)."},
|
||||
"socket_help": { "en": "Used by adapters like rickshaw or vis", "de": "Wird von Rickshaw oder Vis benutzt", "ru": "Используется для Rickshaw или Vis", "pt": "Usado por adaptadores como rickshaw ou vis", "nl": "Gebruikt door adapters zoals riksja of vis", "fr": "Utilisé par des adaptateurs comme le pousse-pousse ou vis", "it": "Utilizzato da adattatori come risciò o vis", "es": "Utilizado por adaptadores como rickshaw o vis", "pl": "Używany przez adaptery takie jak riksza lub vis"},
|
||||
"Web Server adapter settings": { "en": "Web Server adapter settings", "de": "Web Server Adapter Einstellungen", "ru": "Настройки драйвера Web-Сервер", "pt": "Configurações do adaptador do servidor Web", "nl": "Web Server-adapterinstellingen", "fr": "Paramètres de l'adaptateur de serveur Web", "it": "Impostazioni dell'adattatore server Web", "es": "Configuración del adaptador del servidor web", "pl": "Ustawienia adaptera sieci Web"},
|
||||
"Socket.IO Instance (Optional):": { "en": "Socket.IO Instance (Optional)", "de": "Socket.IO Instanz (Optional)", "ru": "Socket.IO (опционально)", "pt": "Instância Socket.IO (Opcional)", "nl": "Socket.IO-instantie (optioneel)", "fr": "Socket.IO Instance (facultatif)", "it": "Istanza Socket.IO (opzionale)", "es": "Instancia Socket.IO (Opcional)", "pl": "Instancja Socket.IO (opcjonalnie)"},
|
||||
"The provided IP is not valid": { "en": "The provided IP is not valid", "de": "Die angegebene IP-Adresse ist ungültig", "ru": "Неверный IP-адрес", "pt": "O IP fornecido não é válido", "nl": "Het opgegeven IP-adres is niet geldig", "fr": "L'adresse IP fournie n'est pas valide", "it": "L'IP fornito non è valido", "es": "El IP proporcionado no es válido", "pl": "Podany adres IP jest nieprawidłowy"},
|
||||
"General": { "en": "General", "de": "Allgemein", "ru": "Общие", "pt": "Geral", "nl": "Algemeen", "fr": "Général", "it": "Generale", "es": "General", "pl": "Generał"},
|
||||
"White List": { "en": "White List", "de": "Weisse Liste", "ru": "Белый список", "pt": "Lista Branca", "nl": "Witte lijst", "fr": "Liste blanche", "it": "Lista bianca", "es": "Lista blanca", "pl": "Biała lista"},
|
||||
"User": { "en": "User", "de": "Benutzer", "ru": "Пользователь", "pt": "Do utilizador", "nl": "Gebruiker", "fr": "Utilisateur", "it": "Utente", "es": "Usuario", "pl": "Użytkownik"},
|
||||
"object": { "en": "object", "de": "Objekt", "ru": "объект", "pt": "objeto", "nl": "voorwerp", "fr": "objet", "it": "oggetto", "es": "objeto", "pl": "obiekt"},
|
||||
"state": { "en": "state", "de": "Status", "ru": "статус", "pt": "Estado", "nl": "staat", "fr": "Etat", "it": "stato", "es": "estado", "pl": "stan"},
|
||||
"file": { "en": "file", "de": "Datei", "ru": "файл", "pt": "Arquivo", "nl": "het dossier", "fr": "fichier", "it": "file", "es": "archivo", "pl": "plik"},
|
||||
"read": { "en": "read", "de": "lesen", "ru": "читать", "pt": "ler", "nl": "lezen", "fr": "lis", "it": "leggere", "es": "leer", "pl": "czytać"},
|
||||
"list": { "en": "list", "de": "auflisten", "ru": "список", "pt": "Lista", "nl": "lijst", "fr": "liste", "it": "elenco", "es": "lista", "pl": "lista"},
|
||||
"write": { "en": "wrire", "de": "schreiben", "ru": "писать", "pt": "wrire", "nl": "wrire", "fr": "écrire", "it": "wrire", "es": "wrire", "pl": "wrire"},
|
||||
"create": { "en": "create", "de": "anlegen", "ru": "создать", "pt": "crio", "nl": "creëren", "fr": "créer", "it": "creare", "es": "crear", "pl": "Stwórz"},
|
||||
"remove": { "en": "delete", "de": "löschen", "ru": "удалить", "pt": "excluir", "nl": "verwijderen", "fr": "effacer", "it": "Elimina", "es": "borrar", "pl": "kasować"}
|
||||
};
|
25
appveyor.yml
Normal file
@ -0,0 +1,25 @@
|
||||
version: 'test-{build}'
|
||||
environment:
|
||||
matrix:
|
||||
- nodejs_version: '4'
|
||||
- nodejs_version: '6'
|
||||
- nodejs_version: '8'
|
||||
- nodejs_version: '10'
|
||||
platform:
|
||||
- x86
|
||||
- x64
|
||||
clone_folder: 'c:\projects\%APPVEYOR_PROJECT_NAME%'
|
||||
install:
|
||||
- ps: 'Install-Product node $env:nodejs_version $env:platform'
|
||||
- ps: '$NpmVersion = (npm -v).Substring(0,1)'
|
||||
- ps: 'if($NpmVersion -eq 5) { npm install -g npm@5 }'
|
||||
- ps: npm --version
|
||||
- npm install
|
||||
- npm install winston@2.3.1
|
||||
- 'npm install https://git.spacen.net/yunkong2/yunkong2.js-controller/tarball/master --production'
|
||||
test_script:
|
||||
- echo %cd%
|
||||
- node --version
|
||||
- npm --version
|
||||
- npm test
|
||||
build: 'off'
|
401
gulpfile.js
Normal file
@ -0,0 +1,401 @@
|
||||
'use strict';
|
||||
|
||||
var gulp = require('gulp');
|
||||
var fs = require('fs');
|
||||
var pkg = require('./package.json');
|
||||
var iopackage = require('./io-package.json');
|
||||
var version = (pkg && pkg.version) ? pkg.version : iopackage.common.version;
|
||||
/*var appName = getAppName();
|
||||
|
||||
function getAppName() {
|
||||
var parts = __dirname.replace(/\\/g, '/').split('/');
|
||||
return parts[parts.length - 1].split('.')[0].toLowerCase();
|
||||
}
|
||||
*/
|
||||
const fileName = 'words.js';
|
||||
var languages = {
|
||||
en: {},
|
||||
de: {},
|
||||
ru: {},
|
||||
pt: {},
|
||||
nl: {},
|
||||
fr: {},
|
||||
it: {},
|
||||
es: {},
|
||||
pl: {}
|
||||
};
|
||||
|
||||
function lang2data(lang, isFlat) {
|
||||
var str = isFlat ? '' : '{\n';
|
||||
var count = 0;
|
||||
for (var w in lang) {
|
||||
if (lang.hasOwnProperty(w)) {
|
||||
count++;
|
||||
if (isFlat) {
|
||||
str += (lang[w] === '' ? (isFlat[w] || w) : lang[w]) + '\n';
|
||||
} else {
|
||||
var key = ' "' + w.replace(/"/g, '\\"') + '": ';
|
||||
str += key + '"' + lang[w].replace(/"/g, '\\"') + '",\n';
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!count) return isFlat ? '' : '{\n}';
|
||||
if (isFlat) {
|
||||
return str;
|
||||
} else {
|
||||
return str.substring(0, str.length - 2) + '\n}';
|
||||
}
|
||||
}
|
||||
|
||||
function readWordJs(src) {
|
||||
try {
|
||||
var words;
|
||||
if (fs.existsSync(src + 'js/' + fileName)) {
|
||||
words = fs.readFileSync(src + 'js/' + fileName).toString();
|
||||
} else {
|
||||
words = fs.readFileSync(src + fileName).toString();
|
||||
}
|
||||
|
||||
var lines = words.split(/\r\n|\r|\n/g);
|
||||
var i = 0;
|
||||
while (!lines[i].match(/^systemDictionary = {/)) {
|
||||
i++;
|
||||
}
|
||||
lines.splice(0, i);
|
||||
|
||||
// remove last empty lines
|
||||
i = lines.length - 1;
|
||||
while (!lines[i]) {
|
||||
i--;
|
||||
}
|
||||
if (i < lines.length - 1) {
|
||||
lines.splice(i + 1);
|
||||
}
|
||||
|
||||
lines[0] = lines[0].replace('systemDictionary = ', '');
|
||||
lines[lines.length - 1] = lines[lines.length - 1].trim().replace(/};$/, '}');
|
||||
words = lines.join('\n');
|
||||
var resultFunc = new Function('return ' + words + ';');
|
||||
|
||||
return resultFunc();
|
||||
} catch (e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
function padRight(text, totalLength) {
|
||||
return text + (text.length < totalLength ? new Array(totalLength - text.length).join(' ') : '');
|
||||
}
|
||||
function writeWordJs(data, src) {
|
||||
var text = '// DO NOT EDIT THIS FILE!!! IT WILL BE AUTOMATICALLY GENERATED FROM src/i18n\n';
|
||||
text += '/*global systemDictionary:true */\n';
|
||||
text += '\'use strict\';\n\n';
|
||||
|
||||
text += 'systemDictionary = {\n';
|
||||
for (var word in data) {
|
||||
if (data.hasOwnProperty(word)) {
|
||||
text += ' ' + padRight('"' + word.replace(/"/g, '\\"') + '": {', 50);
|
||||
var line = '';
|
||||
for (var lang in data[word]) {
|
||||
if (data[word].hasOwnProperty(lang)) {
|
||||
line += '"' + lang + '": "' + padRight(data[word][lang].replace(/"/g, '\\"') + '",', 50) + ' ';
|
||||
}
|
||||
}
|
||||
if (line) {
|
||||
line = line.trim();
|
||||
line = line.substring(0, line.length - 1);
|
||||
}
|
||||
text += line + '},\n';
|
||||
}
|
||||
}
|
||||
text = text.replace(/},\n$/, '}\n');
|
||||
text += '};';
|
||||
|
||||
if (fs.existsSync(src + 'js/' + fileName)) {
|
||||
fs.writeFileSync(src + 'js/' + fileName, text);
|
||||
} else {
|
||||
fs.writeFileSync(src + '' + fileName, text);
|
||||
}
|
||||
}
|
||||
|
||||
const EMPTY = '';
|
||||
|
||||
function words2languages(src) {
|
||||
var langs = Object.assign({}, languages);
|
||||
var data = readWordJs(src);
|
||||
if (data) {
|
||||
for (var word in data) {
|
||||
if (data.hasOwnProperty(word)) {
|
||||
for (var lang in data[word]) {
|
||||
if (data[word].hasOwnProperty(lang)) {
|
||||
langs[lang][word] = data[word][lang];
|
||||
// pre-fill all other languages
|
||||
for (var j in langs) {
|
||||
if (langs.hasOwnProperty(j)) {
|
||||
langs[j][word] = langs[j][word] || EMPTY;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!fs.existsSync(src + 'i18n/')) {
|
||||
fs.mkdirSync(src + 'i18n/');
|
||||
}
|
||||
for (var l in langs) {
|
||||
if (!langs.hasOwnProperty(l)) continue;
|
||||
var keys = Object.keys(langs[l]);
|
||||
//keys.sort();
|
||||
var obj = {};
|
||||
for (var k = 0; k < keys.length; k++) {
|
||||
obj[keys[k]] = langs[l][keys[k]];
|
||||
}
|
||||
if (!fs.existsSync(src + 'i18n/' + l)) {
|
||||
fs.mkdirSync(src + 'i18n/' + l);
|
||||
}
|
||||
|
||||
fs.writeFileSync(src + 'i18n/' + l + '/translations.json', lang2data(obj));
|
||||
}
|
||||
} else {
|
||||
console.error('Cannot read or parse ' + fileName);
|
||||
}
|
||||
}
|
||||
function words2languagesFlat(src) {
|
||||
var langs = Object.assign({}, languages);
|
||||
var data = readWordJs(src);
|
||||
if (data) {
|
||||
for (var word in data) {
|
||||
if (data.hasOwnProperty(word)) {
|
||||
for (var lang in data[word]) {
|
||||
if (data[word].hasOwnProperty(lang)) {
|
||||
langs[lang][word] = data[word][lang];
|
||||
// pre-fill all other languages
|
||||
for (var j in langs) {
|
||||
if (langs.hasOwnProperty(j)) {
|
||||
langs[j][word] = langs[j][word] || EMPTY;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
var keys = Object.keys(langs.en);
|
||||
//keys.sort();
|
||||
for (var l in langs) {
|
||||
if (!langs.hasOwnProperty(l)) continue;
|
||||
var obj = {};
|
||||
for (var k = 0; k < keys.length; k++) {
|
||||
obj[keys[k]] = langs[l][keys[k]];
|
||||
}
|
||||
langs[l] = obj;
|
||||
}
|
||||
if (!fs.existsSync(src + 'i18n/')) {
|
||||
fs.mkdirSync(src + 'i18n/');
|
||||
}
|
||||
for (var ll in langs) {
|
||||
if (!langs.hasOwnProperty(ll)) continue;
|
||||
if (!fs.existsSync(src + 'i18n/' + ll)) {
|
||||
fs.mkdirSync(src + 'i18n/' + ll);
|
||||
}
|
||||
|
||||
fs.writeFileSync(src + 'i18n/' + ll + '/flat.txt', lang2data(langs[ll], langs.en));
|
||||
}
|
||||
fs.writeFileSync(src + 'i18n/flat.txt', keys.join('\n'));
|
||||
} else {
|
||||
console.error('Cannot read or parse ' + fileName);
|
||||
}
|
||||
}
|
||||
function languagesFlat2words(src) {
|
||||
var dirs = fs.readdirSync(src + 'i18n/');
|
||||
var langs = {};
|
||||
var bigOne = {};
|
||||
var order = Object.keys(languages);
|
||||
dirs.sort(function (a, b) {
|
||||
var posA = order.indexOf(a);
|
||||
var posB = order.indexOf(b);
|
||||
if (posA === -1 && posB === -1) {
|
||||
if (a > b) return 1;
|
||||
if (a < b) return -1;
|
||||
return 0;
|
||||
} else if (posA === -1) {
|
||||
return -1;
|
||||
} else if (posB === -1) {
|
||||
return 1;
|
||||
} else {
|
||||
if (posA > posB) return 1;
|
||||
if (posA < posB) return -1;
|
||||
return 0;
|
||||
}
|
||||
});
|
||||
var keys = fs.readFileSync(src + 'i18n/flat.txt').toString().split('\n');
|
||||
|
||||
for (var l = 0; l < dirs.length; l++) {
|
||||
if (dirs[l] === 'flat.txt') continue;
|
||||
var lang = dirs[l];
|
||||
var values = fs.readFileSync(src + 'i18n/' + lang + '/flat.txt').toString().split('\n');
|
||||
langs[lang] = {};
|
||||
keys.forEach(function (word, i) {
|
||||
langs[lang][word] = values[i].replace(/<\/ i>/g, '</i>').replace(/<\/ b>/g, '</b>').replace(/<\/ span>/g, '</span>').replace(/% s/g, ' %s');
|
||||
});
|
||||
|
||||
var words = langs[lang];
|
||||
for (var word in words) {
|
||||
if (words.hasOwnProperty(word)) {
|
||||
bigOne[word] = bigOne[word] || {};
|
||||
if (words[word] !== EMPTY) {
|
||||
bigOne[word][lang] = words[word];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// read actual words.js
|
||||
var aWords = readWordJs();
|
||||
|
||||
var temporaryIgnore = ['pt', 'fr', 'nl', 'flat.txt'];
|
||||
if (aWords) {
|
||||
// Merge words together
|
||||
for (var w in aWords) {
|
||||
if (aWords.hasOwnProperty(w)) {
|
||||
if (!bigOne[w]) {
|
||||
console.warn('Take from actual words.js: ' + w);
|
||||
bigOne[w] = aWords[w]
|
||||
}
|
||||
dirs.forEach(function (lang) {
|
||||
if (temporaryIgnore.indexOf(lang) !== -1) return;
|
||||
if (!bigOne[w][lang]) {
|
||||
console.warn('Missing "' + lang + '": ' + w);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
writeWordJs(bigOne, src);
|
||||
}
|
||||
function languages2words(src) {
|
||||
var dirs = fs.readdirSync(src + 'i18n/');
|
||||
var langs = {};
|
||||
var bigOne = {};
|
||||
var order = Object.keys(languages);
|
||||
dirs.sort(function (a, b) {
|
||||
var posA = order.indexOf(a);
|
||||
var posB = order.indexOf(b);
|
||||
if (posA === -1 && posB === -1) {
|
||||
if (a > b) return 1;
|
||||
if (a < b) return -1;
|
||||
return 0;
|
||||
} else if (posA === -1) {
|
||||
return -1;
|
||||
} else if (posB === -1) {
|
||||
return 1;
|
||||
} else {
|
||||
if (posA > posB) return 1;
|
||||
if (posA < posB) return -1;
|
||||
return 0;
|
||||
}
|
||||
});
|
||||
for (var l = 0; l < dirs.length; l++) {
|
||||
if (dirs[l] === 'flat.txt') continue;
|
||||
var lang = dirs[l];
|
||||
langs[lang] = fs.readFileSync(src + 'i18n/' + lang + '/translations.json').toString();
|
||||
langs[lang] = JSON.parse(langs[lang]);
|
||||
var words = langs[lang];
|
||||
for (var word in words) {
|
||||
if (words.hasOwnProperty(word)) {
|
||||
bigOne[word] = bigOne[word] || {};
|
||||
if (words[word] !== EMPTY) {
|
||||
bigOne[word][lang] = words[word];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// read actual words.js
|
||||
var aWords = readWordJs();
|
||||
|
||||
var temporaryIgnore = ['pt', 'fr', 'nl', 'it'];
|
||||
if (aWords) {
|
||||
// Merge words together
|
||||
for (var w in aWords) {
|
||||
if (aWords.hasOwnProperty(w)) {
|
||||
if (!bigOne[w]) {
|
||||
console.warn('Take from actual words.js: ' + w);
|
||||
bigOne[w] = aWords[w]
|
||||
}
|
||||
dirs.forEach(function (lang) {
|
||||
if (temporaryIgnore.indexOf(lang) !== -1) return;
|
||||
if (!bigOne[w][lang]) {
|
||||
console.warn('Missing "' + lang + '": ' + w);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
writeWordJs(bigOne, src);
|
||||
}
|
||||
|
||||
gulp.task('adminWords2languages', function (done) {
|
||||
words2languages('./admin/');
|
||||
done();
|
||||
});
|
||||
|
||||
gulp.task('adminWords2languagesFlat', function (done) {
|
||||
words2languagesFlat('./admin/');
|
||||
done();
|
||||
});
|
||||
|
||||
gulp.task('adminLanguagesFlat2words', function (done) {
|
||||
languagesFlat2words('./admin/');
|
||||
done();
|
||||
});
|
||||
|
||||
gulp.task('adminLanguages2words', function (done) {
|
||||
languages2words('./admin/');
|
||||
done();
|
||||
});
|
||||
|
||||
|
||||
gulp.task('updatePackages', function (done) {
|
||||
iopackage.common.version = pkg.version;
|
||||
iopackage.common.news = iopackage.common.news || {};
|
||||
if (!iopackage.common.news[pkg.version]) {
|
||||
var news = iopackage.common.news;
|
||||
var newNews = {};
|
||||
|
||||
newNews[pkg.version] = {
|
||||
en: 'news',
|
||||
de: 'neues',
|
||||
ru: 'новое'
|
||||
};
|
||||
iopackage.common.news = Object.assign(newNews, news);
|
||||
}
|
||||
fs.writeFileSync('io-package.json', JSON.stringify(iopackage, null, 4));
|
||||
done();
|
||||
});
|
||||
|
||||
gulp.task('updateReadme', function (done) {
|
||||
var readme = fs.readFileSync('README.md').toString();
|
||||
var pos = readme.indexOf('## Changelog\n');
|
||||
if (pos !== -1) {
|
||||
var readmeStart = readme.substring(0, pos + '## Changelog\n'.length);
|
||||
var readmeEnd = readme.substring(pos + '## Changelog\n'.length);
|
||||
|
||||
if (readme.indexOf(version) === -1) {
|
||||
var timestamp = new Date();
|
||||
var date = timestamp.getFullYear() + '-' +
|
||||
('0' + (timestamp.getMonth() + 1).toString(10)).slice(-2) + '-' +
|
||||
('0' + (timestamp.getDate()).toString(10)).slice(-2);
|
||||
|
||||
var news = '';
|
||||
if (iopackage.common.news && iopackage.common.news[pkg.version]) {
|
||||
news += '* ' + iopackage.common.news[pkg.version].en;
|
||||
}
|
||||
|
||||
fs.writeFileSync('README.md', readmeStart + '### ' + version + ' (' + date + ')\n' + (news ? news + '\n\n' : '\n') + readmeEnd);
|
||||
}
|
||||
}
|
||||
done();
|
||||
});
|
||||
|
||||
gulp.task('default', ['updatePackages', 'updateReadme']);
|
224
io-package.json
Normal file
@ -0,0 +1,224 @@
|
||||
{
|
||||
"common": {
|
||||
"name": "web",
|
||||
"version": "2.4.1",
|
||||
"title": "WEB server",
|
||||
"titleLang": {
|
||||
"en": "WEB server",
|
||||
"de": "WEB-Server",
|
||||
"ru": "Веб сервер",
|
||||
"pt": "Servidor web",
|
||||
"nl": "Web Server",
|
||||
"fr": "Serveur Web",
|
||||
"it": "Server web",
|
||||
"es": "Servidor web",
|
||||
"pl": "Serwer internetowy"
|
||||
},
|
||||
"news": {
|
||||
"2.4.1": {
|
||||
"en": "The support of the versioned links to adapter was added\nWhiteList was corrected\nCustom login background is supported",
|
||||
"de": "Die Unterstützung der versionierten Links zum Adapter wurde hinzugefügt\nWhiteList wurde korrigiert\nBenutzerdefinierter Login-Hintergrund wird unterstützt",
|
||||
"ru": "Добавлена поддержка версий, связанных с адаптером.\nWhiteList был исправлен\nПользовательский фоновый вход поддерживается",
|
||||
"pt": "O suporte dos links com versão para o adaptador foi adicionado\nWhiteList foi corrigido\nFundo de login personalizado é suportado",
|
||||
"nl": "De ondersteuning van de versie-links naar adapter is toegevoegd\nWhiteList is gecorrigeerd\nAangepaste inlogachtergrond wordt ondersteund",
|
||||
"fr": "Le support des liens versionnés vers l'adaptateur a été ajouté\nWhiteList a été corrigé\nLe fond de connexion personnalisé est pris en charge",
|
||||
"it": "È stato aggiunto il supporto dei collegamenti con versione all'adattatore\nWhiteList è stato corretto\nLo sfondo di login personalizzato è supportato",
|
||||
"es": "Se agregó el soporte de los enlaces versionados al adaptador\nWhiteList fue corregido\nSe admite el fondo de inicio de sesión personalizado",
|
||||
"pl": "Dodano wsparcie dla wersjonowanych łączy do adaptera\nWhiteList został poprawiony\nNiestandardowe tło logowania jest obsługiwane"
|
||||
},
|
||||
"2.4.0": {
|
||||
"en": "Pre-settings for instances now supported",
|
||||
"de": "Voreinstellungen für Instanzen werden jetzt unterstützt",
|
||||
"ru": "Предварительные настройки для поддерживаемых экземпляров",
|
||||
"pt": "Pré-configurações para instâncias agora suportadas",
|
||||
"nl": "Pre-instellingen voor exemplaren die nu worden ondersteund",
|
||||
"fr": "Pré-réglages pour les instances maintenant supportées",
|
||||
"it": "Le preimpostazioni per le istanze ora supportate",
|
||||
"es": "Pre-configuraciones para instancias ahora compatibles",
|
||||
"pl": "Wstępne ustawienia instancji są teraz obsługiwane"
|
||||
},
|
||||
"2.3.6": {
|
||||
"en": "URLs were sanitized",
|
||||
"de": "URLs wurden bereinigt",
|
||||
"ru": "URL-адреса были дезинфицированы",
|
||||
"pt": "URLs foram higienizados",
|
||||
"nl": "URL's zijn ontsmet",
|
||||
"fr": "Les URL ont été nettoyées",
|
||||
"it": "Gli URL sono stati disinfettati",
|
||||
"es": "Las URL se desinfectaron",
|
||||
"pl": "Adresy URL zostały odkażone"
|
||||
},
|
||||
"2.3.5": {
|
||||
"en": "Socket.io version 2.1.1 was used\nAuthentication problem was fixed",
|
||||
"de": "Socket.io Version 2.1.1 wurde verwendet\nAuthentifizierungsproblem wurde behoben",
|
||||
"ru": "Использовалась версия 2.1.1 Socket.io\nИсправлена проблема аутентификации",
|
||||
"pt": "Socket.io versão 2.1.1 foi usado\nProblema de autenticação foi corrigido",
|
||||
"nl": "Socket.io versie 2.1.1 werd gebruikt\nVerificatieprobleem is opgelost",
|
||||
"fr": "Socket.io version 2.1.1 a été utilisé\nLe problème d'authentification a été corrigé",
|
||||
"it": "È stato utilizzato Socket.io versione 2.1.1\nIl problema di autenticazione è stato risolto",
|
||||
"es": "Se utilizó la versión 2.1.1 de Socket.io\nSe corrigió el problema de autenticación",
|
||||
"pl": "Użyto wersji Socket.io 2.1.1\nNaprawiono problem z uwierzytelnianiem"
|
||||
},
|
||||
"2.3.4": {
|
||||
"en": "Used socket.io version 1.7.4",
|
||||
"de": "Gebrauchte socket.io Version 1.7.4",
|
||||
"ru": "Используется версия socket.io 1.7.4",
|
||||
"pt": "Usado socket.io versão 1.7.4",
|
||||
"nl": "Gebruikte socket.io-versie 1.7.4",
|
||||
"fr": "Version socket.io utilisée 1.7.4",
|
||||
"it": "Usato socket.io versione 1.7.4",
|
||||
"es": "Utiliza socket.io versión 1.7.4",
|
||||
"pl": "Używana wersja socket.io 1.7.4"
|
||||
},
|
||||
"2.3.3": {
|
||||
"en": "Fixing the new version of socket.io",
|
||||
"de": "Fixieren der neuen Version von socket.io",
|
||||
"ru": "Фиксация новой версии socket.io",
|
||||
"pt": "Corrigindo a nova versão do socket.io",
|
||||
"nl": "De nieuwe versie van socket.io herstellen",
|
||||
"fr": "Correction de la nouvelle version de socket.io",
|
||||
"it": "Correggere la nuova versione di socket.io",
|
||||
"es": "Se corrigió la nueva versión de socket.io",
|
||||
"pl": "Naprawianie nowej wersji pliku socket.io"
|
||||
},
|
||||
"2.3.2": {
|
||||
"en": "fixed select ID dialog for old style",
|
||||
"de": "Auswahldialog für alten Stil korrigiert",
|
||||
"ru": "поправлен диалог выбора ID для старого стиля",
|
||||
"pt": "Diálogo de ID de seleção fixa para estilo antigo",
|
||||
"nl": "vast select-ID-dialoogvenster voor oude stijl",
|
||||
"fr": "boîte de dialogue fixe de sélection d'identifiant pour le style ancien",
|
||||
"it": "corretto selezionare la finestra di dialogo ID per vecchio stile",
|
||||
"es": "dialogo de selección de ID fijo para el viejo estilo",
|
||||
"pl": "poprawiono okno dialogowe wyboru ID dla starego stylu"
|
||||
},
|
||||
"2.3.1": {
|
||||
"en": "Updated socket.io version to 2.1.0",
|
||||
"de": "Die Version von socket.io wurde auf 2.1.0 aktualisiert",
|
||||
"ru": "Обновлена версия socket.io до версии 2.1.0",
|
||||
"pt": "Versão atualizada do socket.io para 2.1.0",
|
||||
"nl": "Nieuwe socket.io-versie bijgewerkt naar 2.1.0",
|
||||
"fr": "Mise à jour de la version socket.io vers la version 2.1.0",
|
||||
"it": "Versione aggiornata di socket.io alla versione 2.1.0",
|
||||
"es": "Versión actualizada de socket.io a 2.1.0",
|
||||
"pl": "Zaktualizowana wersja pliku socket.io do wersji 2.1.0"
|
||||
},
|
||||
"2.3.0": {
|
||||
"en": "The required for Admin3 libraries are added",
|
||||
"de": "Die für Admin3 erforderlichen Bibliotheken werden hinzugefügt",
|
||||
"ru": "Добавлены необходимые для Admin3 библиотеки",
|
||||
"pt": "O necessário para as bibliotecas Admin3 são adicionados",
|
||||
"nl": "De vereiste voor Admin3-bibliotheken worden toegevoegd",
|
||||
"fr": "Les requis pour les bibliothèques Admin3 sont ajoutés",
|
||||
"it": "Il richiesto per le librerie Admin3 è stato aggiunto",
|
||||
"es": "Se requiere lo necesario para las bibliotecas de Admin3",
|
||||
"pl": "Wymagane dla bibliotek Admin3 zostały dodane"
|
||||
},
|
||||
"2.2.0": {
|
||||
"en": "Ready for Admin3",
|
||||
"de": "Bereit für Admin3",
|
||||
"ru": "Готово для Admin3",
|
||||
"pt": "Pronto para Admin3",
|
||||
"nl": "Klaar voor Admin3",
|
||||
"fr": "Prêt pour Admin3",
|
||||
"it": "Pronto per Admin3",
|
||||
"es": "Listo para Admin3",
|
||||
"pl": "Gotowy na Admin3"
|
||||
},
|
||||
"2.1.9": {
|
||||
"en": "Fix tiles on welcome screen",
|
||||
"de": "Korrigiere Kacheln auf dem Welcome Screen",
|
||||
"ru": "Поправлены иконки на welcome странице"
|
||||
}
|
||||
},
|
||||
"desc": {
|
||||
"en": "opens a webserver for other adapters",
|
||||
"de": "Stellt webserver für 'yunkong2 Adapter' zur Verfügung",
|
||||
"ru": "Запускает веб сервер для 'yunkong2 драйверов'",
|
||||
"pt": "abre um servidor web para outros adaptadores",
|
||||
"nl": "opent een webserver voor andere adapters",
|
||||
"fr": "ouvre un serveur web pour d'autres adaptateurs",
|
||||
"it": "apre un server web per altri adattatori",
|
||||
"es": "abre un servidor web para otros adaptadores",
|
||||
"pl": "otwiera serwer internetowy dla innych kart"
|
||||
},
|
||||
"mode": "daemon",
|
||||
"platform": "Javascript/Node.js",
|
||||
"loglevel": "info",
|
||||
"icon": "web.png",
|
||||
"readme": "https://git.spacen.net/yunkong2/yunkong2.web/blob/master/README.md",
|
||||
"enabled": true,
|
||||
"materialize": true,
|
||||
"keywords": [
|
||||
"web",
|
||||
"server",
|
||||
"www",
|
||||
"express"
|
||||
],
|
||||
"extIcon": "https://git.spacen.net/yunkong2/yunkong2.web/master/admin/web.png",
|
||||
"type": "general",
|
||||
"stopBeforeUpdate": true,
|
||||
"webExtendable": true,
|
||||
"localLink": "%web_protocol%://%ip%:%web_port%/",
|
||||
"dependencies": [
|
||||
{
|
||||
"js-controller": ">=0.12.0"
|
||||
}
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "bluefox",
|
||||
"email": "dogafox@gmail.com"
|
||||
}
|
||||
]
|
||||
},
|
||||
"native": {
|
||||
"port": 8082,
|
||||
"auth": false,
|
||||
"secure": false,
|
||||
"bind": "0.0.0.0",
|
||||
"cache": false,
|
||||
"socketio": "",
|
||||
"simpleapi": false,
|
||||
"defaultUser": "admin",
|
||||
"ttl": 3600,
|
||||
|
||||
"certPublic": "",
|
||||
"certPrivate": "",
|
||||
"certChained": "",
|
||||
|
||||
"addUserName": false,
|
||||
"forceWebSockets": false,
|
||||
"whiteListEnabled": false,
|
||||
|
||||
"leEnabled": false,
|
||||
"leUpdate": false,
|
||||
"leCheckPort": 80,
|
||||
|
||||
"loginBackgroundColor": "",
|
||||
"loginBackgroundImage": false
|
||||
},
|
||||
"objects": [
|
||||
{
|
||||
"_id": "connected",
|
||||
"type": "info",
|
||||
"common": {
|
||||
"name": "Info about connected socket clients",
|
||||
"type": "string",
|
||||
"read": true,
|
||||
"write": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"instanceObjects": [
|
||||
{
|
||||
"_id": "",
|
||||
"type": "meta",
|
||||
"common": {
|
||||
"name": "user files and images for background image",
|
||||
"type": "meta.user"
|
||||
},
|
||||
"native": {}
|
||||
}
|
||||
]
|
||||
}
|
110
lib/passport.socketio.js
Normal file
@ -0,0 +1,110 @@
|
||||
'use strict';
|
||||
const xtend = require('xtend');
|
||||
|
||||
function parseCookie(auth, cookieHeader) {
|
||||
const cookieParser = auth.cookieParser(auth.secret);
|
||||
const req = {
|
||||
headers:{
|
||||
cookie: cookieHeader
|
||||
}
|
||||
};
|
||||
let result;
|
||||
cookieParser(req, {}, err => {
|
||||
if (err) throw err;
|
||||
result = req.signedCookies || req.cookies;
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
function authorize(options) {
|
||||
const defaults = {
|
||||
passport: require('passport'),
|
||||
key: 'connect.sid',
|
||||
secret: null,
|
||||
store: null,
|
||||
success: (data, accept) => {
|
||||
if (data.socketio_version_1) {
|
||||
accept();
|
||||
} else {
|
||||
accept(null, true);
|
||||
}
|
||||
},
|
||||
fail: (data, message, critical, accept) => {
|
||||
if (data.socketio_version_1) {
|
||||
accept(new Error(message));
|
||||
} else {
|
||||
accept(null, false);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const auth = xtend(defaults, options);
|
||||
|
||||
auth.userProperty = auth.passport._userProperty || 'user';
|
||||
|
||||
if (!auth.cookieParser) {
|
||||
throw new Error('cookieParser is required use connect.cookieParser or express.cookieParser');
|
||||
}
|
||||
|
||||
return function (data, accept) {
|
||||
|
||||
// socket.io v1.0 now provides socket handshake data via `socket.request`
|
||||
if (data.request) {
|
||||
data = data.request;
|
||||
data.socketio_version_1 = true;
|
||||
}
|
||||
|
||||
data.cookie = parseCookie(auth, data.headers.cookie || '');
|
||||
data.sessionID = (data.query && data.query.session_id) || data.cookie[auth.key] || '';
|
||||
data[auth.userProperty] = {
|
||||
logged_in: false
|
||||
};
|
||||
|
||||
if (data.xdomain && !data.sessionID) {
|
||||
return auth.fail(data, 'Can not read cookies from CORS-Requests. See CORS-Workaround in the readme.', false, accept);
|
||||
}
|
||||
|
||||
auth.store.get(data.sessionID, (err, session) => {
|
||||
if (err) {
|
||||
return auth.fail(data, 'Error in session store:\n' + err.message, true, accept);
|
||||
} else
|
||||
if (!session) {
|
||||
return auth.fail(data, 'No session found', false, accept);
|
||||
} else
|
||||
if (!session[auth.passport._key]) {
|
||||
return auth.fail(data, 'Passport was not initialized', true, accept);
|
||||
}
|
||||
|
||||
const userKey = session[auth.passport._key][auth.userProperty];
|
||||
|
||||
if (!userKey) {
|
||||
return auth.fail(data, 'User not authorized through passport. (User Property not found)', false, accept);
|
||||
}
|
||||
|
||||
// Because of authentication error removed
|
||||
/*auth.passport.deserializeUser(userKey, function(err, user) {
|
||||
if (err)
|
||||
return auth.fail(data, err, true, accept);
|
||||
if (!user)
|
||||
return auth.fail(data, "User not found", false, accept);
|
||||
data[auth.userProperty] = user;
|
||||
data[auth.userProperty].logged_in = true;
|
||||
auth.success(data, accept);
|
||||
});*/
|
||||
data[auth.userProperty] = userKey;
|
||||
data[auth.userProperty].logged_in = true;
|
||||
data.client._user = userKey;
|
||||
auth.success(data, accept);
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
function filterSocketsByUser(socketIo, filter) {
|
||||
const handshaken = socketIo.sockets.manager.handshaken;
|
||||
return Object.keys(handshaken || {})
|
||||
.filter(skey => filter(handshaken[skey].user))
|
||||
.map(skey => socketIo.sockets.manager.sockets.sockets[skey]);
|
||||
}
|
||||
|
||||
exports.authorize = authorize;
|
||||
exports.filterSocketsByUser = filterSocketsByUser;
|
83
lib/utils.js
Normal file
@ -0,0 +1,83 @@
|
||||
'use strict';
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
let controllerDir;
|
||||
let appName;
|
||||
|
||||
/**
|
||||
* returns application name
|
||||
*
|
||||
* The name of the application can be different and this function finds it out.
|
||||
*
|
||||
* @returns {string}
|
||||
*/
|
||||
function getAppName() {
|
||||
const parts = __dirname.replace(/\\/g, '/').split('/');
|
||||
return parts[parts.length - 2].split('.')[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* looks for js-controller home folder
|
||||
*
|
||||
* @param {boolean} isInstall
|
||||
* @returns {string}
|
||||
*/
|
||||
function getControllerDir(isInstall) {
|
||||
// Find the js-controller location
|
||||
const possibilities = [
|
||||
'yunkong2.js-controller',
|
||||
'yunkong2.js-controller',
|
||||
];
|
||||
/** @type {string} */
|
||||
let controllerPath;
|
||||
for (const pkg of possibilities) {
|
||||
try {
|
||||
const possiblePath = require.resolve(pkg);
|
||||
if (fs.existsSync(possiblePath)) {
|
||||
controllerPath = possiblePath;
|
||||
break;
|
||||
}
|
||||
} catch (e) { /* not found */ }
|
||||
}
|
||||
if (!controllerPath) {
|
||||
if (!isInstall) {
|
||||
console.log('Cannot find js-controller');
|
||||
process.exit(10);
|
||||
} else {
|
||||
process.exit();
|
||||
}
|
||||
}
|
||||
// we found the controller
|
||||
return path.dirname(controllerPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* reads controller base settings
|
||||
*
|
||||
* @alias getConfig
|
||||
* @returns {object}
|
||||
*/
|
||||
function getConfig() {
|
||||
let configPath;
|
||||
if (fs.existsSync(
|
||||
configPath = path.join(controllerDir, 'conf', appName + '.json')
|
||||
)) {
|
||||
return JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
||||
} else if (fs.existsSync(
|
||||
configPath = path.join(controllerDir, 'conf', + appName.toLowerCase() + '.json')
|
||||
)) {
|
||||
return JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
||||
} else {
|
||||
throw new Error('Cannot find ' + controllerDir + '/conf/' + appName + '.json');
|
||||
}
|
||||
}
|
||||
appName = getAppName();
|
||||
controllerDir = getControllerDir(typeof process !== 'undefined' && process.argv && process.argv.indexOf('--install') !== -1);
|
||||
const adapter = require(path.join(controllerDir, 'lib/adapter.js'));
|
||||
|
||||
exports.controllerDir = controllerDir;
|
||||
exports.getConfig = getConfig;
|
||||
exports.Adapter = adapter;
|
||||
exports.appName = appName;
|
59
package.json
Normal file
@ -0,0 +1,59 @@
|
||||
{
|
||||
"name": "yunkong2.web",
|
||||
"version": "2.4.1",
|
||||
"description": "yunkong2 simple web Adapter",
|
||||
"author": {
|
||||
"name": "bluefox",
|
||||
"email": "dogafox@gmail.com"
|
||||
},
|
||||
"homepage": "https://git.spacen.net/yunkong2/yunkong2.web",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT",
|
||||
"url": "https://git.spacen.net/yunkong2/yunkong2.web/blob/master/LICENSE"
|
||||
}
|
||||
],
|
||||
"keywords": [
|
||||
"yunkong2",
|
||||
"web"
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://git.spacen.net/yunkong2/yunkong2.web"
|
||||
},
|
||||
"dependencies": {
|
||||
"body-parser": "^1.18.2",
|
||||
"connect-flash": "^0.1.1",
|
||||
"cookie-parser": "^1.4.3",
|
||||
"express": "^4.16.3",
|
||||
"express-session": "^1.15.6",
|
||||
"yunkong2.simple-api": ">=1.3.0",
|
||||
"yunkong2.socketio": ">=2.1.1",
|
||||
"mime-types": "^2.1.18",
|
||||
"passport": "^0.4.0",
|
||||
"passport-local": "^1.0.0",
|
||||
"passport.socketio": "^3.7.0",
|
||||
"request": "^2.85.0",
|
||||
"socket.io-client": "1.7.2",
|
||||
"xtend": "^4.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"gulp": "^3.9.1",
|
||||
"mocha": "^5.1.1",
|
||||
"chai": "^4.1.2"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://git.spacen.net/yunkong2/yunkong2.web/issues"
|
||||
},
|
||||
"main": "main.js",
|
||||
"scripts": {
|
||||
"test": "node node_modules/mocha/bin/mocha --exit"
|
||||
},
|
||||
"license": "MIT",
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "bluefox",
|
||||
"email": "dogafox@gmail.com"
|
||||
}
|
||||
]
|
||||
}
|
17
tasks/jscs.js
Normal file
@ -0,0 +1,17 @@
|
||||
var srcDir = __dirname + "/../";
|
||||
|
||||
module.exports = {
|
||||
all: {
|
||||
src: [
|
||||
srcDir + "*.js",
|
||||
srcDir + "lib/*.js",
|
||||
srcDir + "adapter/example/*.js",
|
||||
srcDir + "tasks/**/*.js",
|
||||
srcDir + "www/**/*.js",
|
||||
'!' + srcDir + "www/lib/**/*.js",
|
||||
'!' + srcDir + 'node_modules/**/*.js',
|
||||
'!' + srcDir + 'adapter/*/node_modules/**/*.js'
|
||||
],
|
||||
options: require('./jscsRules.js')
|
||||
}
|
||||
};
|
36
tasks/jscsRules.js
Normal file
@ -0,0 +1,36 @@
|
||||
module.exports = {
|
||||
force: true,
|
||||
"requireCurlyBraces": ["else", "for", "while", "do", "try", "catch"], /*"if",*/
|
||||
"requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch"],
|
||||
"requireSpaceBeforeBlockStatements": true,
|
||||
"requireParenthesesAroundIIFE": true,
|
||||
"disallowSpacesInFunctionDeclaration": {"beforeOpeningRoundBrace": true},
|
||||
"disallowSpacesInNamedFunctionExpression": {"beforeOpeningRoundBrace": true},
|
||||
"requireSpacesInFunctionExpression": {"beforeOpeningCurlyBrace": true},
|
||||
"requireSpacesInAnonymousFunctionExpression": {"beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true},
|
||||
"requireSpacesInNamedFunctionExpression": {"beforeOpeningCurlyBrace": true},
|
||||
"requireSpacesInFunctionDeclaration": {"beforeOpeningCurlyBrace": true},
|
||||
"disallowMultipleVarDecl": true,
|
||||
"requireBlocksOnNewline": true,
|
||||
"disallowEmptyBlocks": true,
|
||||
"disallowSpacesInsideObjectBrackets": true,
|
||||
"disallowSpacesInsideArrayBrackets": true,
|
||||
"disallowSpaceAfterObjectKeys": true,
|
||||
"disallowSpacesInsideParentheses": true,
|
||||
"requireCommaBeforeLineBreak": true,
|
||||
//"requireAlignedObjectValues": "all",
|
||||
"requireOperatorBeforeLineBreak": ["?", "+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="],
|
||||
// "disallowLeftStickedOperators": ["?", "+", "/", "*", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="],
|
||||
// "requireRightStickedOperators": ["!"],
|
||||
// "requireSpaceAfterBinaryOperators": ["?", "+", "/", "*", ":", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="],
|
||||
//"disallowSpaceAfterBinaryOperators": [","],
|
||||
"disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
|
||||
"disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
|
||||
"requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
|
||||
"requireSpaceAfterBinaryOperators": ["?", ">", ",", ">=", "<=", "<", "+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
|
||||
//"validateIndentation": 4,
|
||||
//"validateQuoteMarks": { "mark": "\"", "escape": true },
|
||||
"disallowMixedSpacesAndTabs": true,
|
||||
"disallowKeywordsOnNewLine": ["else", "catch"]
|
||||
|
||||
};
|
17
tasks/jshint.js
Normal file
@ -0,0 +1,17 @@
|
||||
var srcDir = __dirname + "/../";
|
||||
|
||||
module.exports = {
|
||||
options: {
|
||||
force: true
|
||||
},
|
||||
all: [
|
||||
srcDir + "*.js",
|
||||
srcDir + "lib/*.js",
|
||||
srcDir + "adapter/example/*.js",
|
||||
srcDir + "tasks/**/*.js",
|
||||
srcDir + "www/**/*.js",
|
||||
'!' + srcDir + "www/lib/**/*.js",
|
||||
'!' + srcDir + 'node_modules/**/*.js',
|
||||
'!' + srcDir + 'adapter/*/node_modules/**/*.js'
|
||||
]
|
||||
};
|
728
test/lib/setup.js
Normal file
@ -0,0 +1,728 @@
|
||||
/* jshint -W097 */// jshint strict:false
|
||||
/*jslint node: true */
|
||||
// check if tmp directory exists
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var child_process = require('child_process');
|
||||
var rootDir = path.normalize(__dirname + '/../../');
|
||||
var pkg = require(rootDir + 'package.json');
|
||||
var debug = typeof v8debug === 'object';
|
||||
pkg.main = pkg.main || 'main.js';
|
||||
|
||||
var adapterName = path.normalize(rootDir).replace(/\\/g, '/').split('/');
|
||||
adapterName = adapterName[adapterName.length - 2];
|
||||
var adapterStarted = false;
|
||||
|
||||
function getAppName() {
|
||||
var parts = __dirname.replace(/\\/g, '/').split('/');
|
||||
return parts[parts.length - 3].split('.')[0];
|
||||
}
|
||||
|
||||
var appName = getAppName().toLowerCase();
|
||||
|
||||
var objects;
|
||||
var states;
|
||||
|
||||
var pid = null;
|
||||
|
||||
function copyFileSync(source, target) {
|
||||
|
||||
var targetFile = target;
|
||||
|
||||
//if target is a directory a new file with the same name will be created
|
||||
if (fs.existsSync(target)) {
|
||||
if ( fs.lstatSync( target ).isDirectory() ) {
|
||||
targetFile = path.join(target, path.basename(source));
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
fs.writeFileSync(targetFile, fs.readFileSync(source));
|
||||
}
|
||||
catch (err) {
|
||||
console.log("file copy error: " +source +" -> " + targetFile + " (error ignored)");
|
||||
}
|
||||
}
|
||||
|
||||
function copyFolderRecursiveSync(source, target, ignore) {
|
||||
var files = [];
|
||||
|
||||
var base = path.basename(source);
|
||||
if (base === adapterName) {
|
||||
base = pkg.name;
|
||||
}
|
||||
//check if folder needs to be created or integrated
|
||||
var targetFolder = path.join(target, base);
|
||||
if (!fs.existsSync(targetFolder)) {
|
||||
fs.mkdirSync(targetFolder);
|
||||
}
|
||||
|
||||
//copy
|
||||
if (fs.lstatSync(source).isDirectory()) {
|
||||
files = fs.readdirSync(source);
|
||||
files.forEach(function (file) {
|
||||
if (ignore && ignore.indexOf(file) !== -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
var curSource = path.join(source, file);
|
||||
var curTarget = path.join(targetFolder, file);
|
||||
if (fs.lstatSync(curSource).isDirectory()) {
|
||||
// ignore grunt files
|
||||
if (file.indexOf('grunt') !== -1) return;
|
||||
if (file === 'chai') return;
|
||||
if (file === 'mocha') return;
|
||||
copyFolderRecursiveSync(curSource, targetFolder, ignore);
|
||||
} else {
|
||||
copyFileSync(curSource, curTarget);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (!fs.existsSync(rootDir + 'tmp')) {
|
||||
fs.mkdirSync(rootDir + 'tmp');
|
||||
}
|
||||
|
||||
function storeOriginalFiles() {
|
||||
console.log('Store original files...');
|
||||
var dataDir = rootDir + 'tmp/' + appName + '-data/';
|
||||
|
||||
var f = fs.readFileSync(dataDir + 'objects.json');
|
||||
var objects = JSON.parse(f.toString());
|
||||
if (objects['system.adapter.admin.0'] && objects['system.adapter.admin.0'].common) {
|
||||
objects['system.adapter.admin.0'].common.enabled = false;
|
||||
}
|
||||
if (objects['system.adapter.admin.1'] && objects['system.adapter.admin.1'].common) {
|
||||
objects['system.adapter.admin.1'].common.enabled = false;
|
||||
}
|
||||
|
||||
fs.writeFileSync(dataDir + 'objects.json.original', JSON.stringify(objects));
|
||||
try {
|
||||
f = fs.readFileSync(dataDir + 'states.json');
|
||||
fs.writeFileSync(dataDir + 'states.json.original', f);
|
||||
}
|
||||
catch (err) {
|
||||
console.log('no states.json found - ignore');
|
||||
}
|
||||
}
|
||||
|
||||
function restoreOriginalFiles() {
|
||||
console.log('restoreOriginalFiles...');
|
||||
var dataDir = rootDir + 'tmp/' + appName + '-data/';
|
||||
|
||||
var f = fs.readFileSync(dataDir + 'objects.json.original');
|
||||
fs.writeFileSync(dataDir + 'objects.json', f);
|
||||
try {
|
||||
f = fs.readFileSync(dataDir + 'states.json.original');
|
||||
fs.writeFileSync(dataDir + 'states.json', f);
|
||||
}
|
||||
catch (err) {
|
||||
console.log('no states.json.original found - ignore');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function checkIsAdapterInstalled(cb, counter, customName) {
|
||||
customName = customName || pkg.name.split('.').pop();
|
||||
counter = counter || 0;
|
||||
var dataDir = rootDir + 'tmp/' + appName + '-data/';
|
||||
console.log('checkIsAdapterInstalled...');
|
||||
|
||||
try {
|
||||
var f = fs.readFileSync(dataDir + 'objects.json');
|
||||
var objects = JSON.parse(f.toString());
|
||||
if (objects['system.adapter.' + customName + '.0']) {
|
||||
console.log('checkIsAdapterInstalled: ready!');
|
||||
setTimeout(function () {
|
||||
if (cb) cb();
|
||||
}, 100);
|
||||
return;
|
||||
} else {
|
||||
console.warn('checkIsAdapterInstalled: still not ready');
|
||||
}
|
||||
} catch (err) {
|
||||
|
||||
}
|
||||
|
||||
if (counter > 20) {
|
||||
console.error('checkIsAdapterInstalled: Cannot install!');
|
||||
if (cb) cb('Cannot install');
|
||||
} else {
|
||||
console.log('checkIsAdapterInstalled: wait...');
|
||||
setTimeout(function() {
|
||||
checkIsAdapterInstalled(cb, counter + 1);
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
function checkIsControllerInstalled(cb, counter) {
|
||||
counter = counter || 0;
|
||||
var dataDir = rootDir + 'tmp/' + appName + '-data/';
|
||||
|
||||
console.log('checkIsControllerInstalled...');
|
||||
try {
|
||||
var f = fs.readFileSync(dataDir + 'objects.json');
|
||||
var objects = JSON.parse(f.toString());
|
||||
if (objects['system.adapter.admin.0']) {
|
||||
console.log('checkIsControllerInstalled: installed!');
|
||||
setTimeout(function () {
|
||||
if (cb) cb();
|
||||
}, 100);
|
||||
return;
|
||||
}
|
||||
} catch (err) {
|
||||
|
||||
}
|
||||
|
||||
if (counter > 20) {
|
||||
console.log('checkIsControllerInstalled: Cannot install!');
|
||||
if (cb) cb('Cannot install');
|
||||
} else {
|
||||
console.log('checkIsControllerInstalled: wait...');
|
||||
setTimeout(function() {
|
||||
checkIsControllerInstalled(cb, counter + 1);
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
function installAdapter(customName, cb) {
|
||||
if (typeof customName === 'function') {
|
||||
cb = customName;
|
||||
customName = null;
|
||||
}
|
||||
customName = customName || pkg.name.split('.').pop();
|
||||
console.log('Install adapter...');
|
||||
var startFile = 'node_modules/' + appName + '.js-controller/' + appName + '.js';
|
||||
// make first install
|
||||
if (debug) {
|
||||
child_process.execSync('node ' + startFile + ' add ' + customName + ' --enabled false', {
|
||||
cwd: rootDir + 'tmp',
|
||||
stdio: [0, 1, 2]
|
||||
});
|
||||
checkIsAdapterInstalled(function (error) {
|
||||
if (error) console.error(error);
|
||||
console.log('Adapter installed.');
|
||||
if (cb) cb();
|
||||
});
|
||||
} else {
|
||||
// add controller
|
||||
var _pid = child_process.fork(startFile, ['add', customName, '--enabled', 'false'], {
|
||||
cwd: rootDir + 'tmp',
|
||||
stdio: [0, 1, 2, 'ipc']
|
||||
});
|
||||
|
||||
waitForEnd(_pid, function () {
|
||||
checkIsAdapterInstalled(function (error) {
|
||||
if (error) console.error(error);
|
||||
console.log('Adapter installed.');
|
||||
if (cb) cb();
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function waitForEnd(_pid, cb) {
|
||||
if (!_pid) {
|
||||
cb(-1, -1);
|
||||
return;
|
||||
}
|
||||
_pid.on('exit', function (code, signal) {
|
||||
if (_pid) {
|
||||
_pid = null;
|
||||
cb(code, signal);
|
||||
}
|
||||
});
|
||||
_pid.on('close', function (code, signal) {
|
||||
if (_pid) {
|
||||
_pid = null;
|
||||
cb(code, signal);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function installJsController(cb) {
|
||||
console.log('installJsController...');
|
||||
if (!fs.existsSync(rootDir + 'tmp/node_modules/' + appName + '.js-controller') ||
|
||||
!fs.existsSync(rootDir + 'tmp/' + appName + '-data')) {
|
||||
// try to detect appName.js-controller in node_modules/appName.js-controller
|
||||
// travis CI installs js-controller into node_modules
|
||||
if (fs.existsSync(rootDir + 'node_modules/' + appName + '.js-controller')) {
|
||||
console.log('installJsController: no js-controller => copy it from "' + rootDir + 'node_modules/' + appName + '.js-controller"');
|
||||
// copy all
|
||||
// stop controller
|
||||
console.log('Stop controller if running...');
|
||||
var _pid;
|
||||
if (debug) {
|
||||
// start controller
|
||||
_pid = child_process.exec('node ' + appName + '.js stop', {
|
||||
cwd: rootDir + 'node_modules/' + appName + '.js-controller',
|
||||
stdio: [0, 1, 2]
|
||||
});
|
||||
} else {
|
||||
_pid = child_process.fork(appName + '.js', ['stop'], {
|
||||
cwd: rootDir + 'node_modules/' + appName + '.js-controller',
|
||||
stdio: [0, 1, 2, 'ipc']
|
||||
});
|
||||
}
|
||||
|
||||
waitForEnd(_pid, function () {
|
||||
// copy all files into
|
||||
if (!fs.existsSync(rootDir + 'tmp')) fs.mkdirSync(rootDir + 'tmp');
|
||||
if (!fs.existsSync(rootDir + 'tmp/node_modules')) fs.mkdirSync(rootDir + 'tmp/node_modules');
|
||||
|
||||
if (!fs.existsSync(rootDir + 'tmp/node_modules/' + appName + '.js-controller')){
|
||||
console.log('Copy js-controller...');
|
||||
copyFolderRecursiveSync(rootDir + 'node_modules/' + appName + '.js-controller', rootDir + 'tmp/node_modules/');
|
||||
}
|
||||
|
||||
console.log('Setup js-controller...');
|
||||
var __pid;
|
||||
if (debug) {
|
||||
// start controller
|
||||
_pid = child_process.exec('node ' + appName + '.js setup first --console', {
|
||||
cwd: rootDir + 'tmp/node_modules/' + appName + '.js-controller',
|
||||
stdio: [0, 1, 2]
|
||||
});
|
||||
} else {
|
||||
__pid = child_process.fork(appName + '.js', ['setup', 'first', '--console'], {
|
||||
cwd: rootDir + 'tmp/node_modules/' + appName + '.js-controller',
|
||||
stdio: [0, 1, 2, 'ipc']
|
||||
});
|
||||
}
|
||||
waitForEnd(__pid, function () {
|
||||
checkIsControllerInstalled(function () {
|
||||
// change ports for object and state DBs
|
||||
var config = require(rootDir + 'tmp/' + appName + '-data/' + appName + '.json');
|
||||
config.objects.port = 19001;
|
||||
config.states.port = 19000;
|
||||
fs.writeFileSync(rootDir + 'tmp/' + appName + '-data/' + appName + '.json', JSON.stringify(config, null, 2));
|
||||
console.log('Setup finished.');
|
||||
|
||||
copyAdapterToController();
|
||||
|
||||
installAdapter(function () {
|
||||
storeOriginalFiles();
|
||||
if (cb) cb(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
} else {
|
||||
// check if port 9000 is free, else admin adapter will be added to running instance
|
||||
var client = new require('net').Socket();
|
||||
client.connect(9000, '127.0.0.1', function() {
|
||||
console.error('Cannot initiate fisrt run of test, because one instance of application is running on this PC. Stop it and repeat.');
|
||||
process.exit(0);
|
||||
});
|
||||
|
||||
setTimeout(function () {
|
||||
client.destroy();
|
||||
if (!fs.existsSync(rootDir + 'tmp/node_modules/' + appName + '.js-controller')) {
|
||||
console.log('installJsController: no js-controller => install from git');
|
||||
|
||||
child_process.execSync('npm install https://git.spacen.net/' + appName + '/' + appName + '.js-controller/tarball/master --prefix ./ --production', {
|
||||
cwd: rootDir + 'tmp/',
|
||||
stdio: [0, 1, 2]
|
||||
});
|
||||
} else {
|
||||
console.log('Setup js-controller...');
|
||||
var __pid;
|
||||
if (debug) {
|
||||
// start controller
|
||||
child_process.exec('node ' + appName + '.js setup first', {
|
||||
cwd: rootDir + 'tmp/node_modules/' + appName + '.js-controller',
|
||||
stdio: [0, 1, 2]
|
||||
});
|
||||
} else {
|
||||
child_process.fork(appName + '.js', ['setup', 'first'], {
|
||||
cwd: rootDir + 'tmp/node_modules/' + appName + '.js-controller',
|
||||
stdio: [0, 1, 2, 'ipc']
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// let npm install admin and run setup
|
||||
checkIsControllerInstalled(function () {
|
||||
var _pid;
|
||||
|
||||
if (fs.existsSync(rootDir + 'node_modules/' + appName + '.js-controller/' + appName + '.js')) {
|
||||
_pid = child_process.fork(appName + '.js', ['stop'], {
|
||||
cwd: rootDir + 'node_modules/' + appName + '.js-controller',
|
||||
stdio: [0, 1, 2, 'ipc']
|
||||
});
|
||||
}
|
||||
|
||||
waitForEnd(_pid, function () {
|
||||
// change ports for object and state DBs
|
||||
var config = require(rootDir + 'tmp/' + appName + '-data/' + appName + '.json');
|
||||
config.objects.port = 19001;
|
||||
config.states.port = 19000;
|
||||
fs.writeFileSync(rootDir + 'tmp/' + appName + '-data/' + appName + '.json', JSON.stringify(config, null, 2));
|
||||
|
||||
copyAdapterToController();
|
||||
|
||||
installAdapter(function () {
|
||||
storeOriginalFiles();
|
||||
if (cb) cb(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
}, 1000);
|
||||
}
|
||||
} else {
|
||||
setTimeout(function () {
|
||||
console.log('installJsController: js-controller installed');
|
||||
if (cb) cb(false);
|
||||
}, 0);
|
||||
}
|
||||
}
|
||||
|
||||
function copyAdapterToController() {
|
||||
console.log('Copy adapter...');
|
||||
// Copy adapter to tmp/node_modules/appName.adapter
|
||||
copyFolderRecursiveSync(rootDir, rootDir + 'tmp/node_modules/', ['.idea', 'test', 'tmp', '.git', appName + '.js-controller']);
|
||||
console.log('Adapter copied.');
|
||||
}
|
||||
|
||||
function clearControllerLog() {
|
||||
var dirPath = rootDir + 'tmp/log';
|
||||
var files;
|
||||
try {
|
||||
if (fs.existsSync(dirPath)) {
|
||||
console.log('Clear controller log...');
|
||||
files = fs.readdirSync(dirPath);
|
||||
} else {
|
||||
console.log('Create controller log directory...');
|
||||
files = [];
|
||||
fs.mkdirSync(dirPath);
|
||||
}
|
||||
} catch(e) {
|
||||
console.error('Cannot read "' + dirPath + '"');
|
||||
return;
|
||||
}
|
||||
if (files.length > 0) {
|
||||
try {
|
||||
for (var i = 0; i < files.length; i++) {
|
||||
var filePath = dirPath + '/' + files[i];
|
||||
fs.unlinkSync(filePath);
|
||||
}
|
||||
console.log('Controller log cleared');
|
||||
} catch (err) {
|
||||
console.error('cannot clear log: ' + err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function clearDB() {
|
||||
var dirPath = rootDir + 'tmp/yunkong2-data/sqlite';
|
||||
var files;
|
||||
try {
|
||||
if (fs.existsSync(dirPath)) {
|
||||
console.log('Clear sqlite DB...');
|
||||
files = fs.readdirSync(dirPath);
|
||||
} else {
|
||||
console.log('Create controller log directory...');
|
||||
files = [];
|
||||
fs.mkdirSync(dirPath);
|
||||
}
|
||||
} catch(e) {
|
||||
console.error('Cannot read "' + dirPath + '"');
|
||||
return;
|
||||
}
|
||||
if (files.length > 0) {
|
||||
try {
|
||||
for (var i = 0; i < files.length; i++) {
|
||||
var filePath = dirPath + '/' + files[i];
|
||||
fs.unlinkSync(filePath);
|
||||
}
|
||||
console.log('Clear sqlite DB');
|
||||
} catch (err) {
|
||||
console.error('cannot clear DB: ' + err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function setupController(cb) {
|
||||
installJsController(function (isInited) {
|
||||
clearControllerLog();
|
||||
clearDB();
|
||||
|
||||
if (!isInited) {
|
||||
restoreOriginalFiles();
|
||||
copyAdapterToController();
|
||||
}
|
||||
// read system.config object
|
||||
var dataDir = rootDir + 'tmp/' + appName + '-data/';
|
||||
|
||||
var objs;
|
||||
try {
|
||||
objs = fs.readFileSync(dataDir + 'objects.json');
|
||||
objs = JSON.parse(objs);
|
||||
}
|
||||
catch (e) {
|
||||
console.log('ERROR reading/parsing system configuration. Ignore');
|
||||
objs = {'system.config': {}};
|
||||
}
|
||||
if (!objs || !objs['system.config']) {
|
||||
objs = {'system.config': {}};
|
||||
}
|
||||
|
||||
if (cb) cb(objs['system.config']);
|
||||
});
|
||||
}
|
||||
|
||||
function startAdapter(objects, states, callback) {
|
||||
if (adapterStarted) {
|
||||
console.log('Adapter already started ...');
|
||||
if (callback) callback(objects, states);
|
||||
return;
|
||||
}
|
||||
adapterStarted = true;
|
||||
console.log('startAdapter...');
|
||||
if (fs.existsSync(rootDir + 'tmp/node_modules/' + pkg.name + '/' + pkg.main)) {
|
||||
try {
|
||||
if (debug) {
|
||||
// start controller
|
||||
pid = child_process.exec('node node_modules/' + pkg.name + '/' + pkg.main + ' --console silly', {
|
||||
cwd: rootDir + 'tmp',
|
||||
stdio: [0, 1, 2]
|
||||
});
|
||||
} else {
|
||||
// start controller
|
||||
pid = child_process.fork('node_modules/' + pkg.name + '/' + pkg.main, ['--console', 'silly'], {
|
||||
cwd: rootDir + 'tmp',
|
||||
stdio: [0, 1, 2, 'ipc']
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(JSON.stringify(error));
|
||||
}
|
||||
} else {
|
||||
console.error('Cannot find: ' + rootDir + 'tmp/node_modules/' + pkg.name + '/' + pkg.main);
|
||||
}
|
||||
if (callback) callback(objects, states);
|
||||
}
|
||||
|
||||
function startController(isStartAdapter, onObjectChange, onStateChange, callback) {
|
||||
if (typeof isStartAdapter === 'function') {
|
||||
callback = onStateChange;
|
||||
onStateChange = onObjectChange;
|
||||
onObjectChange = isStartAdapter;
|
||||
isStartAdapter = true;
|
||||
}
|
||||
|
||||
if (onStateChange === undefined) {
|
||||
callback = onObjectChange;
|
||||
onObjectChange = undefined;
|
||||
}
|
||||
|
||||
if (pid) {
|
||||
console.error('Controller is already started!');
|
||||
} else {
|
||||
console.log('startController...');
|
||||
adapterStarted = false;
|
||||
var isObjectConnected;
|
||||
var isStatesConnected;
|
||||
|
||||
var Objects = require(rootDir + 'tmp/node_modules/' + appName + '.js-controller/lib/objects/objectsInMemServer');
|
||||
objects = new Objects({
|
||||
connection: {
|
||||
"type" : "file",
|
||||
"host" : "127.0.0.1",
|
||||
"port" : 19001,
|
||||
"user" : "",
|
||||
"pass" : "",
|
||||
"noFileCache": false,
|
||||
"connectTimeout": 2000
|
||||
},
|
||||
logger: {
|
||||
silly: function (msg) {
|
||||
console.log(msg);
|
||||
},
|
||||
debug: function (msg) {
|
||||
console.log(msg);
|
||||
},
|
||||
info: function (msg) {
|
||||
console.log(msg);
|
||||
},
|
||||
warn: function (msg) {
|
||||
console.warn(msg);
|
||||
},
|
||||
error: function (msg) {
|
||||
console.error(msg);
|
||||
}
|
||||
},
|
||||
connected: function () {
|
||||
isObjectConnected = true;
|
||||
if (isStatesConnected) {
|
||||
console.log('startController: started!');
|
||||
if (isStartAdapter) {
|
||||
startAdapter(objects, states, callback);
|
||||
} else {
|
||||
if (callback) {
|
||||
callback(objects, states);
|
||||
callback = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
change: onObjectChange
|
||||
});
|
||||
|
||||
// Just open in memory DB itself
|
||||
var States = require(rootDir + 'tmp/node_modules/' + appName + '.js-controller/lib/states/statesInMemServer');
|
||||
states = new States({
|
||||
connection: {
|
||||
type: 'file',
|
||||
host: '127.0.0.1',
|
||||
port: 19000,
|
||||
options: {
|
||||
auth_pass: null,
|
||||
retry_max_delay: 15000
|
||||
}
|
||||
},
|
||||
logger: {
|
||||
silly: function (msg) {
|
||||
console.log(msg);
|
||||
},
|
||||
debug: function (msg) {
|
||||
console.log(msg);
|
||||
},
|
||||
info: function (msg) {
|
||||
console.log(msg);
|
||||
},
|
||||
warn: function (msg) {
|
||||
console.log(msg);
|
||||
},
|
||||
error: function (msg) {
|
||||
console.log(msg);
|
||||
}
|
||||
},
|
||||
connected: function () {
|
||||
isStatesConnected = true;
|
||||
if (isObjectConnected) {
|
||||
console.log('startController: started!!');
|
||||
if (isStartAdapter) {
|
||||
startAdapter(objects, states, callback);
|
||||
} else {
|
||||
if (callback) {
|
||||
callback(objects, states);
|
||||
callback = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
change: onStateChange
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function stopAdapter(cb) {
|
||||
if (!pid) {
|
||||
console.error('Controller is not running!');
|
||||
if (cb) {
|
||||
setTimeout(function () {
|
||||
cb(false);
|
||||
}, 0);
|
||||
}
|
||||
} else {
|
||||
adapterStarted = false;
|
||||
pid.on('exit', function (code, signal) {
|
||||
if (pid) {
|
||||
console.log('child process terminated due to receipt of signal ' + signal);
|
||||
if (cb) cb();
|
||||
pid = null;
|
||||
}
|
||||
});
|
||||
|
||||
pid.on('close', function (code, signal) {
|
||||
if (pid) {
|
||||
if (cb) cb();
|
||||
pid = null;
|
||||
}
|
||||
});
|
||||
|
||||
pid.kill('SIGTERM');
|
||||
}
|
||||
}
|
||||
|
||||
function _stopController() {
|
||||
if (objects) {
|
||||
objects.destroy();
|
||||
objects = null;
|
||||
}
|
||||
if (states) {
|
||||
states.destroy();
|
||||
states = null;
|
||||
}
|
||||
}
|
||||
|
||||
function stopController(cb) {
|
||||
var timeout;
|
||||
if (objects) {
|
||||
console.log('Set system.adapter.' + pkg.name + '.0');
|
||||
objects.setObject('system.adapter.' + pkg.name + '.0', {
|
||||
common:{
|
||||
enabled: false
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
stopAdapter(function () {
|
||||
if (timeout) {
|
||||
clearTimeout(timeout);
|
||||
timeout = null;
|
||||
}
|
||||
|
||||
_stopController();
|
||||
|
||||
if (cb) {
|
||||
cb(true);
|
||||
cb = null;
|
||||
}
|
||||
});
|
||||
|
||||
timeout = setTimeout(function () {
|
||||
timeout = null;
|
||||
console.log('child process NOT terminated');
|
||||
|
||||
_stopController();
|
||||
|
||||
if (cb) {
|
||||
cb(false);
|
||||
cb = null;
|
||||
}
|
||||
pid = null;
|
||||
}, 5000);
|
||||
}
|
||||
|
||||
// Setup the adapter
|
||||
function setAdapterConfig(common, native, instance) {
|
||||
var objects = JSON.parse(fs.readFileSync(rootDir + 'tmp/' + appName + '-data/objects.json').toString());
|
||||
var id = 'system.adapter.' + adapterName.split('.').pop() + '.' + (instance || 0);
|
||||
if (common) objects[id].common = common;
|
||||
if (native) objects[id].native = native;
|
||||
fs.writeFileSync(rootDir + 'tmp/' + appName + '-data/objects.json', JSON.stringify(objects));
|
||||
}
|
||||
|
||||
// Read config of the adapter
|
||||
function getAdapterConfig(instance) {
|
||||
var objects = JSON.parse(fs.readFileSync(rootDir + 'tmp/' + appName + '-data/objects.json').toString());
|
||||
var id = 'system.adapter.' + adapterName.split('.').pop() + '.' + (instance || 0);
|
||||
return objects[id];
|
||||
}
|
||||
|
||||
if (typeof module !== undefined && module.parent) {
|
||||
module.exports.getAdapterConfig = getAdapterConfig;
|
||||
module.exports.setAdapterConfig = setAdapterConfig;
|
||||
module.exports.startController = startController;
|
||||
module.exports.stopController = stopController;
|
||||
module.exports.setupController = setupController;
|
||||
module.exports.stopAdapter = stopAdapter;
|
||||
module.exports.startAdapter = startAdapter;
|
||||
module.exports.installAdapter = installAdapter;
|
||||
module.exports.appName = appName;
|
||||
module.exports.adapterName = adapterName;
|
||||
module.exports.adapterStarted = adapterStarted;
|
||||
}
|
148
test/lib/tests.js
Normal file
@ -0,0 +1,148 @@
|
||||
var request = require('request');
|
||||
var expect = require('chai').expect;
|
||||
|
||||
var tests = {
|
||||
'read lib/js file': function (done) {
|
||||
this.timeout(2000);
|
||||
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/lib/js/selectID.js', function (error, response, body) {
|
||||
expect(error).to.be.not.ok;
|
||||
expect(response.statusCode).to.be.equal(200);
|
||||
expect(response.headers['content-type'].split(';')[0]).to.be.equal('application/javascript');
|
||||
done();
|
||||
});
|
||||
},
|
||||
|
||||
'read css file': function (done) {
|
||||
this.timeout(2000);
|
||||
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/lib/css/fancytree/ui.fancytree.min.css', function (error, response, body) {
|
||||
expect(error).to.be.not.ok;
|
||||
expect(response.statusCode).to.be.equal(200);
|
||||
expect(response.headers['content-type'].split(';')[0]).to.be.equal('text/css');
|
||||
done();
|
||||
});
|
||||
},
|
||||
|
||||
'read png file': function (done) {
|
||||
this.timeout(2000);
|
||||
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/lib/css/fancytree/device.png', function (error, response, body) {
|
||||
expect(error).to.be.not.ok;
|
||||
expect(response.statusCode).to.be.equal(200);
|
||||
expect(response.headers['content-type'].split(';')[0]).to.be.equal('image/png');
|
||||
done();
|
||||
});
|
||||
},
|
||||
|
||||
'read admin file': function (done) {
|
||||
this.timeout(2000);
|
||||
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/adapter/web/index.html', function (error, response, body) {
|
||||
expect(error).to.be.not.ok;
|
||||
expect(response.headers['content-type'].split(';')[0]).to.be.equal('text/html');
|
||||
expect(response.statusCode).to.be.equal(200);
|
||||
done();
|
||||
});
|
||||
},
|
||||
|
||||
'read state that exists': function (done) {
|
||||
this.timeout(2000);
|
||||
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/state/system.adapter.web.0.alive', function (error, response, body) {
|
||||
expect(error).to.be.not.ok;
|
||||
expect(response.statusCode).to.be.equal(200);
|
||||
done();
|
||||
});
|
||||
},
|
||||
|
||||
'read state that not exists': function (done) {
|
||||
this.timeout(2000);
|
||||
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/state/system.adapter.web.1.alive', function (error, response, body) {
|
||||
expect(error).to.be.not.ok;
|
||||
expect(response.statusCode).to.be.equal(404);
|
||||
done();
|
||||
});
|
||||
},
|
||||
|
||||
'read file that does not exist': function (done) {
|
||||
this.timeout(2000);
|
||||
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/adapter/web/index1.html', function (error, response, body) {
|
||||
expect(error).to.be.not.ok;
|
||||
expect(response.statusCode).to.be.equal(404);
|
||||
done();
|
||||
});
|
||||
},
|
||||
'read index.html': function (done) {
|
||||
this.timeout(2000);
|
||||
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/index.html', function (error, response, body) {
|
||||
expect(error).to.be.not.ok;
|
||||
expect(response.statusCode).to.be.equal(200);
|
||||
expect(response.headers['content-type'].split(';')[0]).to.be.equal('text/html');
|
||||
done();
|
||||
});
|
||||
},
|
||||
'read /': function (done) {
|
||||
this.timeout(2000);
|
||||
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/', function (error, response, body) {
|
||||
expect(error).to.be.not.ok;
|
||||
expect(response.statusCode).to.be.equal(200);
|
||||
expect(response.headers['content-type'].split(';')[0]).to.be.equal('text/html');
|
||||
done();
|
||||
});
|
||||
},
|
||||
'read /..%5c..%5c..%5c..%5c..%5c..%5cetc/passwd': function (done) {
|
||||
this.timeout(2000);
|
||||
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/..%5c..%5c..%5c..%5c..%5c..%5cetc/passwd', function (error, response, body) {
|
||||
expect(error).to.be.not.ok;
|
||||
expect(response.statusCode).to.be.equal(404);
|
||||
done();
|
||||
});
|
||||
},
|
||||
|
||||
'read //..%5c..%5c..%5c..%5c..%5c..%5cetc/passwd': function (done) {
|
||||
this.timeout(2000);
|
||||
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/..%5c..%5c..%5c..%5c..%5c..%5cetc/passwd', function (error, response, body) {
|
||||
expect(error).to.be.not.ok;
|
||||
expect(response.statusCode).to.be.equal(404);
|
||||
done();
|
||||
});
|
||||
},
|
||||
|
||||
'read /..%5cREADME.md': function (done) {
|
||||
this.timeout(2000);
|
||||
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/..%5cREADME.md', function (error, response, body) {
|
||||
expect(error).to.be.not.ok;
|
||||
expect(response.statusCode).to.be.equal(404);
|
||||
done();
|
||||
});
|
||||
},
|
||||
'read /..%5c..%5cREADME.md': function (done) {
|
||||
this.timeout(2000);
|
||||
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/..%5c..%5cREADME.md', function (error, response, body) {
|
||||
expect(error).to.be.not.ok;
|
||||
expect(response.statusCode).to.be.equal(404);
|
||||
done();
|
||||
});
|
||||
},
|
||||
'read ////..%5c..%5cREADME.md': function (done) {
|
||||
this.timeout(2000);
|
||||
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '////..%5c..%5cREADME.md', function (error, response, body) {
|
||||
expect(error).to.be.not.ok;
|
||||
expect(response.statusCode).to.be.equal(404);
|
||||
done();
|
||||
});
|
||||
},
|
||||
'read \\..%5c..%5cREADME.md': function (done) {
|
||||
this.timeout(2000);
|
||||
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '\\..%5c..%5cREADME.md', function (error, response, body) {
|
||||
expect(error).to.be.not.ok;
|
||||
expect(response.statusCode).to.be.equal(404);
|
||||
done();
|
||||
});
|
||||
},
|
||||
'read /web/..%5c..%5cREADME.md': function (done) {
|
||||
this.timeout(2000);
|
||||
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/web/..%5c..%5cREADME.md', function (error, response, body) {
|
||||
expect(error).to.be.not.ok;
|
||||
expect(response.statusCode).to.be.equal(404);
|
||||
done();
|
||||
});
|
||||
}
|
||||
};
|
||||
module.exports.tests = tests;
|
81
test/testNoAuthNoSSL.js
Normal file
@ -0,0 +1,81 @@
|
||||
'use strict';
|
||||
const expect = require('chai').expect;
|
||||
const setup = require(__dirname + '/lib/setup');
|
||||
const request = require('request');
|
||||
const tests = require(__dirname + '/lib/tests');
|
||||
|
||||
let objects = null;
|
||||
let states = null;
|
||||
|
||||
process.env.HTTPS_PROXY = '';
|
||||
process.env.HTTP_PROXY = '';
|
||||
process.env.TEST_PORT = 18802;
|
||||
process.env.TEST_PROTOCOL = 'http';
|
||||
|
||||
function initTests() {
|
||||
for (const test in tests.tests) {
|
||||
if (tests.tests.hasOwnProperty(test)) {
|
||||
it('Test WEB: ' + test, tests.tests[test]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function checkConnectionOfAdapter(cb, counter) {
|
||||
counter = counter || 0;
|
||||
if (counter > 20) {
|
||||
cb && cb('Cannot check connection');
|
||||
return;
|
||||
}
|
||||
|
||||
states.getState('system.adapter.web.0.alive', (err, state) => {
|
||||
if (err) console.error(err);
|
||||
if (state && state.val) {
|
||||
cb && cb();
|
||||
} else {
|
||||
setTimeout(() => checkConnectionOfAdapter(cb, counter + 1), 1000);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
describe('Test WEB', function() {
|
||||
before('Test WEB: Start js-controller', function (_done) {
|
||||
this.timeout(600000); // because of first install from npm
|
||||
setup.adapterStarted = false;
|
||||
|
||||
setup.setupController(() => {
|
||||
const config = setup.getAdapterConfig();
|
||||
// enable adapter
|
||||
config.common.enabled = true;
|
||||
config.common.loglevel = 'debug';
|
||||
|
||||
config.native.port = process.env.TEST_PORT;
|
||||
config.native.secure = process.env.TEST_PROTOCOL === 'https';
|
||||
config.native.cache = false;
|
||||
config.native.certPublic = 'defaultPublic';
|
||||
config.native.certPrivate = 'defaultPrivate';
|
||||
|
||||
setup.setAdapterConfig(config.common, config.native);
|
||||
|
||||
setup.startController(true, null, null, (_objects, _states) => {
|
||||
objects = _objects;
|
||||
states = _states;
|
||||
_done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('Test WEB: Check if adapter started', done => {
|
||||
checkConnectionOfAdapter(() => setTimeout(() => done(), 2000));
|
||||
}).timeout(5000);
|
||||
|
||||
initTests();
|
||||
|
||||
after('Test WEB: Stop js-controller', function (done) {
|
||||
this.timeout(6000);
|
||||
|
||||
setup.stopController((normalTerminated) => {
|
||||
console.log('Adapter normal terminated: ' + normalTerminated);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
82
test/testNoAuthSSL.js
Normal file
@ -0,0 +1,82 @@
|
||||
'use strict';
|
||||
//const expect = require('chai').expect;
|
||||
const setup = require(__dirname + '/lib/setup');
|
||||
const request = require('request');
|
||||
const tests = require(__dirname + '/lib/tests');
|
||||
|
||||
let objects = null;
|
||||
let states = null;
|
||||
|
||||
process.env.HTTPS_PROXY = '';
|
||||
process.env.HTTP_PROXY = '';
|
||||
process.env.TEST_PORT = 18803;
|
||||
process.env.TEST_PROTOCOL = 'https';
|
||||
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
|
||||
|
||||
function initTests() {
|
||||
for (const test in tests.tests) {
|
||||
if (tests.tests.hasOwnProperty(test)) {
|
||||
it('Test WEB(' + ((process.env.TEST_PROTOCOL === 'https') ? 'SSL' : 'NO SSL') + '): ' + test, tests.tests[test]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function checkConnectionOfAdapter(cb, counter) {
|
||||
counter = counter || 0;
|
||||
if (counter > 20) {
|
||||
cb && cb('Cannot check connection');
|
||||
return;
|
||||
}
|
||||
|
||||
states.getState('system.adapter.web.0.alive', (err, state) => {
|
||||
if (err) console.error(err);
|
||||
if (state && state.val) {
|
||||
cb && cb();
|
||||
} else {
|
||||
setTimeout(() => checkConnectionOfAdapter(cb, counter + 1), 1000);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
describe('Test WEB(' + ((process.env.TEST_PROTOCOL === 'https') ? 'SSL' : 'NO SSL') + ')', () => {
|
||||
before('Test WEB(' + ((process.env.TEST_PROTOCOL === 'https') ? 'SSL' : 'NO SSL') + '): Start js-controller', function (_done) {
|
||||
this.timeout(600000); // because of first install from npm
|
||||
setup.adapterStarted = false;
|
||||
|
||||
setup.setupController(function () {
|
||||
const config = setup.getAdapterConfig();
|
||||
// enable adapter
|
||||
config.common.enabled = true;
|
||||
config.common.loglevel = 'debug';
|
||||
|
||||
config.native.port = process.env.TEST_PORT;
|
||||
config.native.secure = process.env.TEST_PROTOCOL === 'https';
|
||||
config.native.cache = false;
|
||||
config.native.certPublic = config.native.secure ? 'defaultPublic' : '';
|
||||
config.native.certPrivate = config.native.secure ? 'defaultPrivate' : '';
|
||||
|
||||
setup.setAdapterConfig(config.common, config.native);
|
||||
|
||||
setup.startController(true, null, null, (_objects, _states) => {
|
||||
objects = _objects;
|
||||
states = _states;
|
||||
_done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('Test WEB(' + ((process.env.TEST_PROTOCOL === 'https') ? 'SSL' : 'NO SSL') + '): Check if adapter started', done => {
|
||||
checkConnectionOfAdapter(() => setTimeout(() => done(), 2000));
|
||||
}).timeout(5000);
|
||||
|
||||
initTests();
|
||||
|
||||
after('Test WEB(' + ((process.env.TEST_PROTOCOL === 'https') ? 'SSL' : 'NO SSL') + '): Stop js-controller', function (done) {
|
||||
this.timeout(6000);
|
||||
|
||||
setup.stopController(function (normalTerminated) {
|
||||
console.log('Adapter normal terminated: ' + normalTerminated);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
91
test/testPackageFiles.js
Normal file
@ -0,0 +1,91 @@
|
||||
/* jshint -W097 */
|
||||
/* jshint strict:false */
|
||||
/* jslint node: true */
|
||||
/* jshint expr: true */
|
||||
var expect = require('chai').expect;
|
||||
var fs = require('fs');
|
||||
|
||||
describe('Test package.json and io-package.json', function() {
|
||||
it('Test package files', function (done) {
|
||||
console.log();
|
||||
|
||||
var fileContentIOPackage = fs.readFileSync(__dirname + '/../io-package.json', 'utf8');
|
||||
var ioPackage = JSON.parse(fileContentIOPackage);
|
||||
|
||||
var fileContentNPMPackage = fs.readFileSync(__dirname + '/../package.json', 'utf8');
|
||||
var npmPackage = JSON.parse(fileContentNPMPackage);
|
||||
|
||||
expect(ioPackage).to.be.an('object');
|
||||
expect(npmPackage).to.be.an('object');
|
||||
|
||||
expect(ioPackage.common.version, 'ERROR: Version number in io-package.json needs to exist').to.exist;
|
||||
expect(npmPackage.version, 'ERROR: Version number in package.json needs to exist').to.exist;
|
||||
|
||||
expect(ioPackage.common.version, 'ERROR: Version numbers in package.json and io-package.json needs to match').to.be.equal(npmPackage.version);
|
||||
|
||||
if (!ioPackage.common.news || !ioPackage.common.news[ioPackage.common.version]) {
|
||||
console.log('WARNING: No news entry for current version exists in io-package.json, no rollback in Admin possible!');
|
||||
console.log();
|
||||
}
|
||||
|
||||
expect(npmPackage.author, 'ERROR: Author in package.json needs to exist').to.exist;
|
||||
expect(ioPackage.common.authors, 'ERROR: Authors in io-package.json needs to exist').to.exist;
|
||||
|
||||
if (ioPackage.common.name.indexOf('template') !== 0) {
|
||||
if (Array.isArray(ioPackage.common.authors)) {
|
||||
expect(ioPackage.common.authors.length, 'ERROR: Author in io-package.json needs to be set').to.not.be.equal(0);
|
||||
if (ioPackage.common.authors.length === 1) {
|
||||
expect(ioPackage.common.authors[0], 'ERROR: Author in io-package.json needs to be a real name').to.not.be.equal('my Name <my@email.com>');
|
||||
}
|
||||
}
|
||||
else {
|
||||
expect(ioPackage.common.authors, 'ERROR: Author in io-package.json needs to be a real name').to.not.be.equal('my Name <my@email.com>');
|
||||
}
|
||||
}
|
||||
else {
|
||||
console.log('WARNING: Testing for set authors field in io-package skipped because template adapter');
|
||||
console.log();
|
||||
}
|
||||
expect(fs.existsSync(__dirname + '/../README.md'), 'ERROR: README.md needs to exist! Please create one with description, detail information and changelog. English is mandatory.').to.be.true;
|
||||
if (!ioPackage.common.titleLang || typeof ioPackage.common.titleLang !== 'object') {
|
||||
console.log('WARNING: titleLang is not existing in io-package.json. Please add');
|
||||
console.log();
|
||||
}
|
||||
if (
|
||||
ioPackage.common.title.indexOf('yunkong2') !== -1 ||
|
||||
ioPackage.common.title.indexOf('yunkong2') !== -1 ||
|
||||
ioPackage.common.title.indexOf('adapter') !== -1 ||
|
||||
ioPackage.common.title.indexOf('Adapter') !== -1
|
||||
) {
|
||||
console.log('WARNING: title contains Adapter or yunkong2. It is clear anyway, that it is adapter for yunkong2.');
|
||||
console.log();
|
||||
}
|
||||
|
||||
if (ioPackage.common.name.indexOf('vis-') !== 0) {
|
||||
if (!ioPackage.common.materialize || !fs.existsSync(__dirname + '/../admin/index_m.html') || !fs.existsSync(__dirname + '/../gulpfile.js')) {
|
||||
console.log('WARNING: Admin3 support is missing! Please add it');
|
||||
console.log();
|
||||
}
|
||||
if (ioPackage.common.materialize) {
|
||||
expect(fs.existsSync(__dirname + '/../admin/index_m.html'), 'Admin3 support is enabled in io-package.json, but index_m.html is missing!').to.be.true;
|
||||
}
|
||||
}
|
||||
|
||||
var licenseFileExists = fs.existsSync(__dirname + '/../LICENSE');
|
||||
var fileContentReadme = fs.readFileSync(__dirname + '/../README.md', 'utf8');
|
||||
if (fileContentReadme.indexOf('## Changelog') === -1) {
|
||||
console.log('Warning: The README.md should have a section ## Changelog');
|
||||
console.log();
|
||||
}
|
||||
expect((licenseFileExists || fileContentReadme.indexOf('## License') !== -1), 'A LICENSE must exist as LICENSE file or as part of the README.md').to.be.true;
|
||||
if (!licenseFileExists) {
|
||||
console.log('Warning: The License should also exist as LICENSE file');
|
||||
console.log();
|
||||
}
|
||||
if (fileContentReadme.indexOf('## License') === -1) {
|
||||
console.log('Warning: The README.md should also have a section ## License to be shown in Admin3');
|
||||
console.log();
|
||||
}
|
||||
done();
|
||||
});
|
||||
});
|
BIN
www/admin/img/admin.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
141
www/index.html
Normal file
@ -0,0 +1,141 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head><title>yunkong2.web</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="icon" href="lib/img/favicon.ico" type="image/x-icon" />
|
||||
<link rel="stylesheet" href="lib/css/bootstrap.min.css" media="screen">
|
||||
<link rel="stylesheet" href="lib/css/style.css">
|
||||
|
||||
<script src="lib/js/jquery-1.11.2.min.js"></script>
|
||||
<script src="lib/js/translate.js"></script>
|
||||
<style>
|
||||
.adapter-link{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.adapter-overlay {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: linear-gradient(to bottom, rgba(255, 255, 255, 0.65) 0%,rgba(0, 0, 0, 0.34) 100%);
|
||||
color: white;
|
||||
line-height: 150px;
|
||||
}
|
||||
.adapter-footer {
|
||||
height: 50px;
|
||||
background-color: #ffffff;
|
||||
color: #2e6ebd;
|
||||
line-height: 50px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.adapter-main {
|
||||
position: relative;
|
||||
height: 150px;
|
||||
width: 100%;
|
||||
background: white;
|
||||
background-size: 85%;
|
||||
background-repeat: no-repeat;
|
||||
background-position-x: 10px;
|
||||
background-position-y: 10px;
|
||||
}
|
||||
.vertical-center-row-web {
|
||||
background: #3399CC;
|
||||
vertical-align: middle;
|
||||
min-height: calc(100% - 8rem);
|
||||
text-align: center;
|
||||
border-radius: 0 0 1rem 1rem;
|
||||
display: flex;
|
||||
padding: 2em;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.adapter-tile {
|
||||
display: inline-flex;
|
||||
margin: 10px;
|
||||
width: 150px;
|
||||
min-width: 150px;
|
||||
max-width: 150px;
|
||||
height: 200px;
|
||||
border-radius: 10px;
|
||||
overflow: hidden;
|
||||
cursor: pointer;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
var list = [];
|
||||
systemDictionary = {
|
||||
'welcome': {
|
||||
'en': 'welcome to yunkong2.web',
|
||||
'de': 'Wilkommen zu yunkong2.web',
|
||||
'ru': 'Добро пожаловать в yunkong2.web'
|
||||
},
|
||||
'Directories': {'en': 'Directories', 'de': 'Verzeichnise', 'ru': 'Пути'},
|
||||
'your are lost': {
|
||||
'en': 'It seems to be you are lost. Here are some files, that you can open:',
|
||||
'de': 'Sieht so aus, als ob du verlaufen bist. Hier sind die Pfade, wohin man gehen kann:',
|
||||
'ru': 'Похоже, что кто-то потерялся. Вот пути по которым можно пойти:'
|
||||
},
|
||||
"Sign out": {"en": "Sign out", "de": "Ausloggen", "ru": "Выйти"}
|
||||
};
|
||||
|
||||
// Do not delete it. It will used for dynamic generation:
|
||||
// -- PLACE THE LIST HERE --
|
||||
|
||||
$(document).ready(function () {
|
||||
translateAll();
|
||||
if (document.location.href.indexOf('yunkong2.net') === -1 &&
|
||||
document.location.href.indexOf('yunkong2.pro') === -1) {
|
||||
$('.account-button').hide();
|
||||
if (typeof authEnabled !== 'undefined' && authEnabled === false) {
|
||||
$('.logout-button').hide();
|
||||
}
|
||||
}
|
||||
|
||||
$('.logo').click(function () {
|
||||
window.location = '/';
|
||||
});
|
||||
var text = '';
|
||||
for (var i = 0; i < list.length; i++) {
|
||||
if (typeof list[i] === 'object') {
|
||||
// pro tiles are not available on yunkong2.net
|
||||
if (list[i].pro && document.location.href.match(/yunkong2\.net/)) {
|
||||
continue;
|
||||
}
|
||||
if (!document.location.href.match(/yunkong2\.(pro|net)/) && list[i].localLink) {
|
||||
list[i].link = list[i].localLink.replace('$host$', location.hostname);
|
||||
}
|
||||
text +=
|
||||
'<div class="adapter-tile" onclick="location.href = \'' + list[i].link + '\'">' +
|
||||
'<div class="adapter-link" >' +
|
||||
'<div class="adapter-main" style="background-image: url(\'' + list[i].img + '\')">' +
|
||||
'<div class="adapter-overlay"></div>' +
|
||||
'</div>' +
|
||||
'<div class="adapter-footer">' +
|
||||
'<p>' + (list[i].name || list[i].link) + '</p>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
}
|
||||
}
|
||||
$('.vertical-center-row-web').html(text);
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="layoutMain">
|
||||
<div class="layoutHeader">
|
||||
<div class="logo"></div>
|
||||
<a class="logout-button translate" href="/logout" id="logout">Sign out</a>
|
||||
<!--a class="login-button" href="/login">Login</a--><a class="account-button" href="/account" id="account" title="Edit profile"></a>
|
||||
</div>
|
||||
<div class="vertical-center-row-web">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer container">
|
||||
<!--a(class="footer-link") Impressum>
|
||||
<a class="footer-link" href="/policy">Privacy Notice</a-->
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
5
www/lib/css/bootstrap.min.css
vendored
Normal file
BIN
www/lib/css/fancytree/channel.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
www/lib/css/fancytree/device.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
www/lib/css/fancytree/icons.gif
Normal file
After Width: | Height: | Size: 5.4 KiB |
BIN
www/lib/css/fancytree/loading.gif
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
www/lib/css/fancytree/state.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
1
www/lib/css/fancytree/ui.fancytree.jquery.min.css
vendored
Normal file
6
www/lib/css/fancytree/ui.fancytree.min-win7.css
Normal file
6
www/lib/css/fancytree/ui.fancytree.min.css
vendored
Normal file
415
www/lib/css/iob/selectID.css
Normal file
@ -0,0 +1,415 @@
|
||||
.dialog-select-object-ids {
|
||||
/** inline edit **/
|
||||
/**/
|
||||
/*select ~ .select-id-quick-edit-ok, // only if type = combobx
|
||||
select ~ .select-id-quick-edit-cancel { // only if type = combobx
|
||||
top:1px;
|
||||
}*/
|
||||
}
|
||||
.dialog-select-object-ids .true {
|
||||
color: #06960E;
|
||||
font-weight: bold;
|
||||
}
|
||||
.dialog-select-object-ids .false {
|
||||
color: #D92626;
|
||||
font-weight: normal;
|
||||
}
|
||||
.dialog-select-object-ids .error {
|
||||
color: #D92626;
|
||||
font-weight: normal;
|
||||
}
|
||||
.dialog-select-object-ids .highlight {
|
||||
animation: highlight 2s;
|
||||
}
|
||||
.dialog-select-object-ids .grid-main-div {
|
||||
height: calc(100% - 50px);
|
||||
}
|
||||
.dialog-select-object-ids .grid-main-wh-div {
|
||||
height: calc(100% - (5px + 7px + 24px + 1px * 2 + 0px * 2) + 24px - 40px);
|
||||
}
|
||||
.dialog-select-object-ids .grid-main-wob-div {
|
||||
height: calc(100% - 5px + 7px + 24px + 1px * 2 + 0px * 2 - 24px + 1px * 2 + 0px * 2);
|
||||
}
|
||||
.dialog-select-object-ids .grid-main-wh-div,
|
||||
.dialog-select-object-ids .grid-main-wob-div {
|
||||
overflow-x: hidden;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
.dialog-select-object-ids .grid-main-wh-div > table,
|
||||
.dialog-select-object-ids .grid-main-wob-div > table {
|
||||
width: calc(100% - 5px);
|
||||
}
|
||||
@-moz-keyframes spin {
|
||||
100% {
|
||||
-moz-transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes spin {
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
@keyframes spin {
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
.dialog-select-object-ids .objects-folder {
|
||||
height: 0.8em;
|
||||
width: 0.8em;
|
||||
margin: 0.3em;
|
||||
}
|
||||
.dialog-select-object-ids .objects-name-coll-table-td {
|
||||
border-spacing: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
}
|
||||
.dialog-select-object-ids .objects-name-coll-icon {
|
||||
/*position: relative;*/
|
||||
/*top: 3px;*/
|
||||
vertical-align: sub;
|
||||
}
|
||||
.dialog-select-object-ids .objects-name-coll-title {
|
||||
border-spacing: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
display: inline-block;
|
||||
padding-left: 5px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.dialog-select-object-ids .objects-inline-edit {
|
||||
width: 100%;
|
||||
height: 24px;
|
||||
border: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
padding-left: 4px;
|
||||
}
|
||||
.dialog-select-object-ids table.objects-list-table td {
|
||||
border: 1px solid #e0e0e0;
|
||||
}
|
||||
.dialog-select-object-ids .objects-list-table {
|
||||
background: #efefef;
|
||||
white-space: nowrap;
|
||||
table-layout: fixed;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
padding: 0;
|
||||
overflow: auto;
|
||||
font-family: "Segoe UI", Tahoma, Arial, "Courier New" !important;
|
||||
font-weight: normal;
|
||||
font-size: 0.82rem !important;
|
||||
border-top: 0;
|
||||
width: calc(100% - 10px);
|
||||
margin: 0 5px 0 1px;
|
||||
/* for mouse over rahmen */
|
||||
outline: 5px;
|
||||
outline-offset: -1px;
|
||||
}
|
||||
.dialog-select-object-ids .objects-list-table > tbody > tr > td {
|
||||
padding-left: 5px;
|
||||
}
|
||||
.dialog-select-object-ids .objects-list-table .fancytree-title {
|
||||
font-weight: normal !important;
|
||||
}
|
||||
.dialog-select-object-ids .select-id-quick-edit-buttons {
|
||||
position: absolute;
|
||||
z-index: 3;
|
||||
top: 2px;
|
||||
right: 5px;
|
||||
}
|
||||
.dialog-select-object-ids .select-id-quick-edit-buttons.text {
|
||||
top: 23px;
|
||||
}
|
||||
.dialog-select-object-ids .select-id-quick-edit-buttons.text .select-id-quick-edit-ok,
|
||||
.dialog-select-object-ids .select-id-quick-edit-buttons.text .select-id-quick-edit-cancel {
|
||||
border: 1px solid gray;
|
||||
background-color: white;
|
||||
}
|
||||
.dialog-select-object-ids .select-id-quick-edit-buttons .select-id-quick-edit-ok,
|
||||
.dialog-select-object-ids .select-id-quick-edit-buttons .select-id-quick-edit-cancel {
|
||||
cursor: pointer;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
border-radius: 0;
|
||||
display: inline-block;
|
||||
}
|
||||
.dialog-select-object-ids .objects-inline-edit {
|
||||
position: relative;
|
||||
left: -4px;
|
||||
padding-left: 4px;
|
||||
padding-right: 4px;
|
||||
width: calc(100% - 0px);
|
||||
z-index: 2;
|
||||
font-family: "Segoe UI", Tahoma, Arial, "Courier New" !important;
|
||||
font-size: 0.82rem;
|
||||
vertical-align: middle;
|
||||
text-overflow-mode: clip;
|
||||
}
|
||||
.dialog-select-object-ids .objects-name-coll-title .objects-inline-edit {
|
||||
width: calc(100% + 4px - 1);
|
||||
}
|
||||
.dialog-select-object-ids input.objects-inline-edit {
|
||||
width: calc(100% - 2px);
|
||||
z-index: 2;
|
||||
}
|
||||
.dialog-select-object-ids .objects-list-table > colgroup > col:nth-child(8) {
|
||||
width: 80px !important;
|
||||
min-width: 80px !important;
|
||||
}
|
||||
.dialog-select-object-ids .filter-btn {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
border: 0;
|
||||
background: #fff;
|
||||
}
|
||||
.dialog-select-object-ids .main-header-table tr {
|
||||
background: #ffffff;
|
||||
}
|
||||
.dialog-select-object-ids .main-header-table td.input {
|
||||
width: 100%;
|
||||
}
|
||||
.dialog-select-object-ids .main-header-table select.filter option {
|
||||
line-height: 0.5em;
|
||||
background: #fff;
|
||||
}
|
||||
.dialog-select-object-ids .objects-list-running {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: 5rem;
|
||||
padding: 12px;
|
||||
background: rgba(185, 185, 185, 0.5);
|
||||
text-align: center;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
border-radius: 5px;
|
||||
font-size: 10px;
|
||||
}
|
||||
.dialog-select-object-ids .ui-state-active.fancytree-active {
|
||||
color: black !important;
|
||||
}
|
||||
.dialog-select-object-ids .ui-state-active.fancytree-active .ui-icon {
|
||||
background-image: url(../lib/css/themes/jquery-ui/redmond/images/ui-icons_777777_256x240.png) !important;
|
||||
}
|
||||
.dialog-select-object-ids *::-webkit-scrollbar-track {
|
||||
background-color: #ccc;
|
||||
}
|
||||
.dialog-select-object-ids *::-webkit-scrollbar {
|
||||
width: 10px;
|
||||
background-color: #ccc;
|
||||
}
|
||||
.dialog-select-object-ids *::-webkit-scrollbar-thumb {
|
||||
background-color: #575757;
|
||||
}
|
||||
.dialog-select-object-ids .select-button-push,
|
||||
.dialog-select-object-ids .select-button-edit,
|
||||
.dialog-select-object-ids .select-button-ok,
|
||||
.dialog-select-object-ids .select-button-cancel {
|
||||
width: 26px;
|
||||
height: 20px;
|
||||
}
|
||||
.dialog-select-object-ids .main-toolbar-table {
|
||||
position: relative;
|
||||
}
|
||||
.dialog-select-object-ids .main-toolbar-table .select-id-custom-buttons {
|
||||
display: inline-block;
|
||||
}
|
||||
.dialog-select-object-ids .main-toolbar-table .iob-toolbar-sep {
|
||||
display: inline-block;
|
||||
margin-left: 0.5rem;
|
||||
}
|
||||
.dialog-select-object-ids .main-toolbar-table .panel-button {
|
||||
display: inline-block;
|
||||
line-height: 24px;
|
||||
height: 24px;
|
||||
width: 24px;
|
||||
color: #fff;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
z-index: 1;
|
||||
padding: 0;
|
||||
border-radius: 50%;
|
||||
transition: background-color 0.3s;
|
||||
cursor: pointer;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.dialog-select-object-ids .main-toolbar-table .panel-button:hover {
|
||||
border: 0;
|
||||
}
|
||||
.dialog-select-object-ids .main-toolbar-table .panel-button i {
|
||||
margin-left: -0.5px;
|
||||
font-size: 1.1rem;
|
||||
line-height: 28px;
|
||||
margin-top: -1px;
|
||||
}
|
||||
.dialog-select-object-ids .main-toolbar-table .btn-expert {
|
||||
margin-right: 3px;
|
||||
}
|
||||
.dialog-select-object-ids .main-toolbar-table .btn-history {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 20px;
|
||||
}
|
||||
.dialog-select-object-ids .main-toolbar-table .objects-info {
|
||||
display: inline-block;
|
||||
float: right;
|
||||
padding-right: 1rem;
|
||||
margin-top: 5px;
|
||||
}
|
||||
.dialog-select-object-ids .old-style .main-header-table {
|
||||
width: 100%;
|
||||
}
|
||||
.dialog-select-object-ids .old-style .main-header-table th span {
|
||||
font-size: 11px;
|
||||
font-weight: normal;
|
||||
}
|
||||
.dialog-select-object-ids .old-style .grid-main-wob-div {
|
||||
height: calc(100% - 50px);
|
||||
}
|
||||
.dialog-select-object-ids .old-style .iob-list-icon {
|
||||
height: 16px;
|
||||
}
|
||||
.dialog-select-object-ids .old-style .clippy-button {
|
||||
height: 16px;
|
||||
}
|
||||
.dialog-select-object-ids .old-style .ui-state-active,
|
||||
.dialog-select-object-ids .old-style .ui-widget-content .ui-state-active {
|
||||
background: inherit !important;
|
||||
}
|
||||
.dialog-select-object-ids .material .objects-list-running {
|
||||
height: 5rem;
|
||||
}
|
||||
.dialog-select-object-ids .material .filter-btn i {
|
||||
font-size: 12px;
|
||||
}
|
||||
.dialog-select-object-ids .material .td-button-placeholder {
|
||||
width: 21px;
|
||||
}
|
||||
.dialog-select-object-ids .material .custom-obj-btn {
|
||||
cursor: pointer;
|
||||
color: #4c4c4c;
|
||||
background: white;
|
||||
border: 0;
|
||||
padding-left: 4px;
|
||||
margin-right: 1px;
|
||||
margin-top: 3px;
|
||||
}
|
||||
.dialog-select-object-ids .material .custom-obj-btn:hover {
|
||||
background: #64b5f6;
|
||||
}
|
||||
.dialog-select-object-ids .material .custom-obj-btn i {
|
||||
font-size: 12px;
|
||||
}
|
||||
.dialog-select-object-ids .material .iob-list-icon,
|
||||
.dialog-select-object-ids .material .instance-image {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
}
|
||||
.dialog-select-object-ids .material .main-toolbar-table .panel-button {
|
||||
background-color: #2196f3;
|
||||
}
|
||||
.dialog-select-object-ids .main-header-table th {
|
||||
border-right: 1px solid #b9b9b9;
|
||||
color: gray;
|
||||
}
|
||||
.dialog-select-object-ids .main-header-table .filter {
|
||||
display: inline-block;
|
||||
border: 0;
|
||||
height: 24px;
|
||||
width: calc(100% - 5px);
|
||||
padding: 0 0 0 5px;
|
||||
background: transparent;
|
||||
color: gray;
|
||||
font-family: "Segoe UI", Tahoma, Arial, "Courier New" !important;
|
||||
font-size: 0.82rem !important;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.dialog-select-object-ids .main-header-table .filter-btn {
|
||||
display: none;
|
||||
}
|
||||
.dialog-select-object-ids .main-header-table .filter-active .filter {
|
||||
color: black;
|
||||
width: calc(100% - 24px);
|
||||
}
|
||||
.dialog-select-object-ids .main-header-table .filter-active .filter-btn {
|
||||
padding: 0;
|
||||
display: inline-block;
|
||||
width: 19px;
|
||||
height: 16px;
|
||||
background: transparent;
|
||||
border: 0;
|
||||
margin-top: 3px;
|
||||
}
|
||||
.dialog-select-object-ids .main-header-table .filter-active .filter-btn i {
|
||||
font-size: 12px;
|
||||
}
|
||||
.dialog-select-object-ids .clippy-button,
|
||||
.dialog-select-object-ids .edit-dialog-button {
|
||||
position: absolute;
|
||||
top: 1px;
|
||||
z-index: 1;
|
||||
margin-top: 1px;
|
||||
}
|
||||
.dialog-select-object-ids .clippy-button .tiny,
|
||||
.dialog-select-object-ids .edit-dialog-button .tiny {
|
||||
font-size: 10px;
|
||||
}
|
||||
.dialog-select-object-ids .clippy-button {
|
||||
right: 0;
|
||||
}
|
||||
.dialog-select-object-ids .edit-dialog-button {
|
||||
right: 22px;
|
||||
}
|
||||
.dialog-select-object-ids .select-value {
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
padding-left: 5px;
|
||||
position: relative;
|
||||
}
|
||||
@keyframes highlight {
|
||||
0% {
|
||||
color: #00f900;
|
||||
}
|
||||
80% {
|
||||
color: green;
|
||||
}
|
||||
100% {
|
||||
color: black;
|
||||
}
|
||||
}
|
||||
.dialog-select-object-ids .highlight {
|
||||
animation: highlight 2s;
|
||||
}
|
||||
#select-id-dialog > span {
|
||||
float: left;
|
||||
margin: 0 7px 50px 0;
|
||||
}
|
||||
.m #dialog-select-member {
|
||||
width: calc(100% - 2rem);
|
||||
height: calc(100% - 2rem) !important;
|
||||
border: 3px solid #2196f3;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.m #dialog-select-member td,
|
||||
.m #dialog-select-member th {
|
||||
padding: 1px 4px;
|
||||
}
|
||||
.m #dialog-select-member .modal-content {
|
||||
padding: 0.5rem 0.2rem !important;
|
||||
width: 100% !important;
|
||||
overflow: hidden;
|
||||
}
|
||||
.m #dialog-select-member .modal-content .title {
|
||||
padding: 3px 10px;
|
||||
}
|
||||
.m #dialog-select-member .modal-content .grid-main-wob-div {
|
||||
height: calc(100% - 103px);
|
||||
}
|
||||
|
||||
/*# sourceMappingURL=selectID.css.map */
|
1
www/lib/css/iob/selectID.css.map
Normal file
13
www/lib/css/jqGrid/ellipsis-xbl.xml
Normal file
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0"?>
|
||||
<bindings
|
||||
xmlns="http://www.mozilla.org/xbl"
|
||||
xmlns:xbl="http://www.mozilla.org/xbl"
|
||||
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||
<binding id="ellipsis">
|
||||
<content>
|
||||
<xul:window><!-- xul:window tag required for FF2 -->
|
||||
<xul:description crop="end" xbl:inherits="value=xbl:text"><children/></xul:description>
|
||||
</xul:window>
|
||||
</content>
|
||||
</binding>
|
||||
</bindings>
|
162
www/lib/css/jqGrid/ui.jqgrid-4.5.4.css
Normal file
@ -0,0 +1,162 @@
|
||||
/*Grid*/
|
||||
.ui-jqgrid {position: relative;}
|
||||
.ui-jqgrid .ui-jqgrid-view {position: relative;left:0; top: 0; padding: 0; font-size:11px;}
|
||||
/* caption*/
|
||||
.ui-jqgrid .ui-jqgrid-titlebar {padding: .3em .2em .2em .3em; position: relative; border-left: 0 none;border-right: 0 none; border-top: 0 none;}
|
||||
.ui-jqgrid .ui-jqgrid-title { float: left; margin: .1em 0 .2em; }
|
||||
.ui-jqgrid .ui-jqgrid-titlebar-close { position: absolute;top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height:18px; cursor:pointer;}
|
||||
.ui-jqgrid .ui-jqgrid-titlebar-close span { display: block; margin: 1px; }
|
||||
.ui-jqgrid .ui-jqgrid-titlebar-close:hover { padding: 0; }
|
||||
/* header*/
|
||||
.ui-jqgrid .ui-jqgrid-hdiv {position: relative; margin: 0;padding: 0; overflow-x: hidden; border-left: 0 none !important; border-top : 0 none !important; border-right : 0 none !important;}
|
||||
.ui-jqgrid .ui-jqgrid-hbox {float: left; padding-right: 20px;}
|
||||
.ui-jqgrid .ui-jqgrid-htable {table-layout:fixed;margin:0;}
|
||||
.ui-jqgrid .ui-jqgrid-htable th {height:22px;padding: 0 2px 0 2px;}
|
||||
.ui-jqgrid .ui-jqgrid-htable th div {overflow: hidden; position:relative; height:17px;}
|
||||
.ui-th-column, .ui-jqgrid .ui-jqgrid-htable th.ui-th-column {overflow: hidden;white-space: nowrap;text-align:center;border-top : 0 none;border-bottom : 0 none;}
|
||||
.ui-th-ltr, .ui-jqgrid .ui-jqgrid-htable th.ui-th-ltr {border-left : 0 none;}
|
||||
.ui-th-rtl, .ui-jqgrid .ui-jqgrid-htable th.ui-th-rtl {border-right : 0 none;}
|
||||
.ui-first-th-ltr {border-right: 1px solid; }
|
||||
.ui-first-th-rtl {border-left: 1px solid; }
|
||||
.ui-jqgrid .ui-th-div-ie {white-space: nowrap; zoom :1; height:17px;}
|
||||
.ui-jqgrid .ui-jqgrid-resize {height:20px !important;position: relative; cursor :e-resize;display: inline;overflow: hidden;}
|
||||
.ui-jqgrid .ui-grid-ico-sort {overflow:hidden;position:absolute;display:inline; cursor: pointer !important;}
|
||||
.ui-jqgrid .ui-icon-asc {margin-top:-3px; height:12px;}
|
||||
.ui-jqgrid .ui-icon-desc {margin-top:3px;height:12px;}
|
||||
.ui-jqgrid .ui-i-asc {margin-top:0;height:16px;}
|
||||
.ui-jqgrid .ui-i-desc {margin-top:0;margin-left:13px;height:16px;}
|
||||
.ui-jqgrid .ui-jqgrid-sortable {cursor:pointer;}
|
||||
.ui-jqgrid tr.ui-search-toolbar th { border-top-width: 1px !important; border-top-color: inherit !important; border-top-style: ridge !important }
|
||||
tr.ui-search-toolbar input {margin: 1px 0 0 0}
|
||||
tr.ui-search-toolbar select {margin: 1px 0 0 0}
|
||||
/* body */
|
||||
.ui-jqgrid .ui-jqgrid-bdiv {position: relative; margin: 0; padding:0; overflow: auto; text-align:left;}
|
||||
.ui-jqgrid .ui-jqgrid-btable {table-layout:fixed; margin:0; outline-style: none; }
|
||||
.ui-jqgrid tr.jqgrow { outline-style: none; }
|
||||
.ui-jqgrid tr.jqgroup { outline-style: none; }
|
||||
.ui-jqgrid tr.jqgrow td {font-weight: normal; overflow: hidden; white-space: pre; height: 22px;padding: 0 2px 0 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}
|
||||
.ui-jqgrid tr.jqgfirstrow td {padding: 0 2px 0 2px;border-right-width: 1px; border-right-style: solid;}
|
||||
.ui-jqgrid tr.jqgroup td {font-weight: normal; overflow: hidden; white-space: pre; height: 22px;padding: 0 2px 0 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}
|
||||
.ui-jqgrid tr.jqfoot td {font-weight: bold; overflow: hidden; white-space: pre; height: 22px;padding: 0 2px 0 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}
|
||||
.ui-jqgrid tr.ui-row-ltr td {text-align:left;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;}
|
||||
.ui-jqgrid tr.ui-row-rtl td {text-align:right;border-left-width: 1px; border-left-color: inherit; border-left-style: solid;}
|
||||
.ui-jqgrid td.jqgrid-rownum { padding: 0 2px 0 2px; margin: 0; border: 0 none;}
|
||||
.ui-jqgrid .ui-jqgrid-resize-mark { width:2px; left:0; background-color:#777; cursor: e-resize; cursor: col-resize; position:absolute; top:0; height:100px; overflow:hidden; display:none; border:0 none; z-index: 99999;}
|
||||
/* footer */
|
||||
.ui-jqgrid .ui-jqgrid-sdiv {position: relative; margin: 0;padding: 0; overflow: hidden; border-left: 0 none !important; border-top : 0 none !important; border-right : 0 none !important;}
|
||||
.ui-jqgrid .ui-jqgrid-ftable {table-layout:fixed; margin-bottom:0;}
|
||||
.ui-jqgrid tr.footrow td {font-weight: bold; overflow: hidden; white-space:nowrap; height: 21px;padding: 0 2px 0 2px;border-top-width: 1px; border-top-color: inherit; border-top-style: solid;}
|
||||
.ui-jqgrid tr.footrow-ltr td {text-align:left;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;}
|
||||
.ui-jqgrid tr.footrow-rtl td {text-align:right;border-left-width: 1px; border-left-color: inherit; border-left-style: solid;}
|
||||
/* Pager*/
|
||||
.ui-jqgrid .ui-jqgrid-pager { border-left: 0 none !important;border-right: 0 none !important; border-bottom: 0 none !important; margin: 0 !important; padding: 0 !important; position: relative; height: 25px;white-space: nowrap;overflow: hidden;font-size:11px;}
|
||||
.ui-jqgrid .ui-pager-control {position: relative;}
|
||||
.ui-jqgrid .ui-pg-table {position: relative; padding-bottom:2px; width:auto; margin: 0;}
|
||||
.ui-jqgrid .ui-pg-table td {font-weight:normal; vertical-align:middle; padding:1px;}
|
||||
.ui-jqgrid .ui-pg-button { height:19px !important;}
|
||||
.ui-jqgrid .ui-pg-button span { display: block; margin: 1px; float:left;}
|
||||
.ui-jqgrid .ui-pg-button:hover { padding: 0; }
|
||||
.ui-jqgrid .ui-state-disabled:hover {padding:1px;}
|
||||
.ui-jqgrid .ui-pg-input { height:13px;font-size:.8em; margin: 0;}
|
||||
.ui-jqgrid .ui-pg-selbox {font-size:.8em; line-height:18px; display:block; height:18px; margin: 0;}
|
||||
.ui-jqgrid .ui-separator {height: 18px; border-left: 1px solid #ccc ; border-right: 1px solid #ccc ; margin: 1px; float: right;}
|
||||
.ui-jqgrid .ui-paging-info {font-weight: normal;height:19px; margin-top:3px;margin-right:4px;}
|
||||
.ui-jqgrid .ui-jqgrid-pager .ui-pg-div {padding:1px 0;float:left;position:relative;}
|
||||
.ui-jqgrid .ui-jqgrid-pager .ui-pg-button { cursor:pointer; }
|
||||
.ui-jqgrid .ui-jqgrid-pager .ui-pg-div span.ui-icon {float:left;margin:0 2px;}
|
||||
.ui-jqgrid td input, .ui-jqgrid td select .ui-jqgrid td textarea { margin: 0;}
|
||||
.ui-jqgrid td textarea {width:auto;height:auto;}
|
||||
.ui-jqgrid .ui-jqgrid-toppager {border-left: 0 none !important;border-right: 0 none !important; border-top: 0 none !important; margin: 0 !important; padding: 0 !important; position: relative; height: 25px !important;white-space: nowrap;overflow: hidden;}
|
||||
.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div {padding:1px 0;float:left;position:relative;}
|
||||
.ui-jqgrid .ui-jqgrid-toppager .ui-pg-button { cursor:pointer; }
|
||||
.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div span.ui-icon {float:left;margin:0 2px;}
|
||||
/*subgrid*/
|
||||
.ui-jqgrid .ui-jqgrid-btable .ui-sgcollapsed span {display: block;}
|
||||
.ui-jqgrid .ui-subgrid {margin:0;padding:0; width:100%;}
|
||||
.ui-jqgrid .ui-subgrid table {table-layout: fixed;}
|
||||
.ui-jqgrid .ui-subgrid tr.ui-subtblcell td {height:18px;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}
|
||||
.ui-jqgrid .ui-subgrid td.subgrid-data {border-top: 0 none !important;}
|
||||
.ui-jqgrid .ui-subgrid td.subgrid-cell {border-width: 0 0 1px 0;}
|
||||
.ui-jqgrid .ui-th-subgrid {height:20px;}
|
||||
/* loading */
|
||||
.ui-jqgrid .loading {position: absolute; top: 45%;left: 45%;width: auto;z-index:101;padding: 6px; margin: 5px;text-align: center;font-weight: bold;display: none;border-width: 2px !important; font-size:11px;}
|
||||
.ui-jqgrid .jqgrid-overlay {display:none;z-index:100;}
|
||||
* html .jqgrid-overlay {width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}
|
||||
* .jqgrid-overlay iframe {position:absolute;top:0;left:0;z-index:-1;width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}
|
||||
/* end loading div */
|
||||
/* toolbar */
|
||||
.ui-jqgrid .ui-userdata {border-left: 0 none; border-right: 0 none; height : 21px;overflow: hidden; }
|
||||
/*Modal Window */
|
||||
.ui-jqdialog { display: none; width: 300px; position: absolute; padding: .2em; font-size:11px; overflow:visible;}
|
||||
.ui-jqdialog .ui-jqdialog-titlebar { padding: .3em .2em; position: relative; }
|
||||
.ui-jqdialog .ui-jqdialog-title { margin: .1em 0 .2em; }
|
||||
.ui-jqdialog .ui-jqdialog-titlebar-close { position: absolute; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; cursor:pointer;}
|
||||
|
||||
.ui-jqdialog .ui-jqdialog-titlebar-close span { display: block; margin: 1px; }
|
||||
.ui-jqdialog .ui-jqdialog-titlebar-close:hover, .ui-jqdialog .ui-jqdialog-titlebar-close:focus { padding: 0; }
|
||||
.ui-jqdialog-content, .ui-jqdialog .ui-jqdialog-content { border: 0; padding: .3em .2em; background: none; height:auto;}
|
||||
.ui-jqdialog .ui-jqconfirm {padding: .4em 1em; border-width:3px;position:absolute;bottom:10px;right:10px;overflow:visible;display:none;height:80px;width:220px;text-align:center;}
|
||||
.ui-jqdialog>.ui-resizable-se { bottom: -3px; right: -3px}
|
||||
.ui-jqgrid>.ui-resizable-se { bottom: -3px; right: -3px }
|
||||
/* end Modal window*/
|
||||
/* Form edit */
|
||||
.ui-jqdialog-content .FormGrid {margin: 0;}
|
||||
.ui-jqdialog-content .EditTable { width: 100%; margin-bottom:0;}
|
||||
.ui-jqdialog-content .DelTable { width: 100%; margin-bottom:0;}
|
||||
.EditTable td input, .EditTable td select, .EditTable td textarea {margin: 0;}
|
||||
.EditTable td textarea { width:auto; height:auto;}
|
||||
.ui-jqdialog-content td.EditButton {text-align: right;border-top: 0 none;border-left: 0 none;border-right: 0 none; padding-bottom:5px; padding-top:5px;}
|
||||
.ui-jqdialog-content td.navButton {text-align: center; border-left: 0 none;border-top: 0 none;border-right: 0 none; padding-bottom:5px; padding-top:5px;}
|
||||
.ui-jqdialog-content input.FormElement {padding:.3em}
|
||||
.ui-jqdialog-content select.FormElement {padding:.3em}
|
||||
.ui-jqdialog-content .data-line {padding-top:.1em;border: 0 none;}
|
||||
|
||||
.ui-jqdialog-content .CaptionTD {vertical-align: middle;border: 0 none; padding: 2px;white-space: nowrap;}
|
||||
.ui-jqdialog-content .DataTD {padding: 2px; border: 0 none; vertical-align: top;}
|
||||
.ui-jqdialog-content .form-view-data {white-space:pre}
|
||||
.fm-button { display: inline-block; margin:0 4px 0 0; padding: .4em .5em; text-decoration:none !important; cursor:pointer; position: relative; text-align: center; zoom: 1; }
|
||||
.fm-button-icon-left { padding-left: 1.9em; }
|
||||
.fm-button-icon-right { padding-right: 1.9em; }
|
||||
.fm-button-icon-left .ui-icon { right: auto; left: .2em; margin-left: 0; position: absolute; top: 50%; margin-top: -8px; }
|
||||
.fm-button-icon-right .ui-icon { left: auto; right: .2em; margin-left: 0; position: absolute; top: 50%; margin-top: -8px;}
|
||||
#nData, #pData { float: left; margin:3px;padding: 0; width: 15px; }
|
||||
/* End Eorm edit */
|
||||
/*.ui-jqgrid .edit-cell {}*/
|
||||
.ui-jqgrid .selected-row, div.ui-jqgrid .selected-row td {font-style : normal;border-left: 0 none;}
|
||||
/* inline edit actions button*/
|
||||
.ui-inline-del.ui-state-hover span, .ui-inline-edit.ui-state-hover span,
|
||||
.ui-inline-save.ui-state-hover span, .ui-inline-cancel.ui-state-hover span {
|
||||
margin: -1px;
|
||||
}
|
||||
/* Tree Grid */
|
||||
.ui-jqgrid .tree-wrap {float: left; position: relative;height: 18px;white-space: nowrap;overflow: hidden;}
|
||||
.ui-jqgrid .tree-minus {position: absolute; height: 18px; width: 18px; overflow: hidden;}
|
||||
.ui-jqgrid .tree-plus {position: absolute; height: 18px; width: 18px; overflow: hidden;}
|
||||
.ui-jqgrid .tree-leaf {position: absolute; height: 18px; width: 18px;overflow: hidden;}
|
||||
.ui-jqgrid .treeclick {cursor: pointer;}
|
||||
/* moda dialog */
|
||||
* iframe.jqm {position:absolute;top:0;left:0;z-index:-1;width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}
|
||||
.ui-jqgrid-dnd tr td {border-right-width: 1px; border-right-color: inherit; border-right-style: solid; height:20px}
|
||||
/* RTL Support */
|
||||
.ui-jqgrid .ui-jqgrid-title-rtl {float:right;margin: .1em 0 .2em; }
|
||||
.ui-jqgrid .ui-jqgrid-hbox-rtl {float: right; padding-left: 20px;}
|
||||
.ui-jqgrid .ui-jqgrid-resize-ltr {float: right;margin: -2px -2px -2px 0;}
|
||||
.ui-jqgrid .ui-jqgrid-resize-rtl {float: left;margin: -2px 0 -1px -3px;}
|
||||
.ui-jqgrid .ui-sort-rtl {left:0;}
|
||||
.ui-jqgrid .tree-wrap-ltr {float: left;}
|
||||
.ui-jqgrid .tree-wrap-rtl {float: right;}
|
||||
.ui-jqgrid .ui-ellipsis {text-overflow:ellipsis;}
|
||||
|
||||
/* Toolbar Search Menu */
|
||||
.ui-search-menu { position: absolute; padding: 2px 5px;}
|
||||
.ui-jqgrid .ui-search-table { padding: 0px 0px; border: 0px none; height:20px; width:100%;}
|
||||
.ui-jqgrid .ui-search-table .ui-search-oper { width:20px; }
|
||||
a.g-menu-item, a.soptclass, a.clearsearchclass { cursor: pointer; }
|
||||
.ui-jqgrid .ui-search-table .ui-search-input>input,
|
||||
.ui-jqgrid .ui-search-table .ui-search-input>select
|
||||
{
|
||||
display: block;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
8
www/lib/css/materialize.css
vendored
Normal file
711
www/lib/css/style.css
Normal file
@ -0,0 +1,711 @@
|
||||
* {
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font: "Helvetica Neue",Helvetica,Arial,sans-serif;
|
||||
background: white;
|
||||
}
|
||||
.iob-form {
|
||||
border: 1px solid white;
|
||||
padding: 5px;
|
||||
border-radius: 5px;
|
||||
|
||||
}
|
||||
/* compact */
|
||||
@media (max-width: 30em) {
|
||||
.layoutMain {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.layoutHeader {
|
||||
padding-top: 15px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.reconnect-button {
|
||||
width: 200px;
|
||||
}
|
||||
#form {
|
||||
max-width: 280px;
|
||||
}
|
||||
.iob-form {
|
||||
max-width: 280px;
|
||||
}
|
||||
}
|
||||
/* desktop */
|
||||
@media (min-width: 30em) {
|
||||
.layoutMain {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: auto;
|
||||
}
|
||||
.layoutHeader {
|
||||
padding-top: 15px;
|
||||
width: 100% ;
|
||||
}
|
||||
.reconnect-button {
|
||||
width: 350px;
|
||||
}
|
||||
#form {
|
||||
max-width: 350px;
|
||||
}
|
||||
.iob-form {
|
||||
max-width: 350px;
|
||||
}
|
||||
}
|
||||
|
||||
.warning {
|
||||
font-size: 12px;
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
@-webkit-keyframes fadeOut {
|
||||
0% {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@-moz-keyframes fadeOut {
|
||||
0% {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@-o-keyframes fadeOut {
|
||||
0% {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fadeOut {
|
||||
0% {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.error-msg {
|
||||
position: absolute;
|
||||
left: calc(50% - 100px);
|
||||
top: 50%;
|
||||
padding: 1em;
|
||||
border: 1px solid red;
|
||||
background: #c40000;
|
||||
border-radius: 1em;
|
||||
color: #FFFFFF;
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
-webkit-animation: fadeOut 3s ease-out 1;
|
||||
-moz-animation: fadeOut 3s ease-out 1;
|
||||
-o-animation: fadeOut 3s ease-out 1;
|
||||
animation: fadeOut 3s ease-out 1;
|
||||
}
|
||||
|
||||
.message-msg {
|
||||
position: absolute;
|
||||
left: calc(50% - 100px);
|
||||
top: 50%;
|
||||
padding: 1em;
|
||||
border: 1px solid #3399cc;
|
||||
background: #337ab7;
|
||||
border-radius: 1em;
|
||||
color: #FFFFFF;
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
-webkit-animation: fadeOut 3s ease-out 1;
|
||||
-moz-animation: fadeOut 3s ease-out 1;
|
||||
-o-animation: fadeOut 3s ease-out 1;
|
||||
animation: fadeOut 3s ease-out 1;
|
||||
}
|
||||
|
||||
.layoutHeader {
|
||||
width: 100%;
|
||||
height: 70px;
|
||||
background: #FFFFFF;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.logo {
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
background-image: url(../img/logo.png);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 15rem;
|
||||
height: 4.1rem;
|
||||
width: 15rem;
|
||||
padding: 1rem;
|
||||
background-position-y: 1rem;
|
||||
}
|
||||
|
||||
.login-button, .logout-button {
|
||||
float: right;
|
||||
border: 2px solid #3399CC;
|
||||
padding: 12px;
|
||||
text-align: center;
|
||||
border-radius: 4px;
|
||||
color: #3399CC;
|
||||
text-transform: uppercase;
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
background-color: transparent;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.login-button:hover, .logout-button:hover {
|
||||
color: #FFFFFF;
|
||||
background: #3399CC;
|
||||
text-transform: uppercase;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.account-button {
|
||||
float: right;
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
text-align: center;
|
||||
border-radius: 25px;
|
||||
background: #3399CC;
|
||||
background-image: url(../img/person.png);
|
||||
background-size: 30px 30px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 10px 8px;
|
||||
margin-left: 1rem;
|
||||
margin-right: 1rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.leave-button, .deleteid-button, .createid-button, .reconnect-button {
|
||||
border: 2px solid #FFFFFF;
|
||||
padding: 12px;
|
||||
text-align: center;
|
||||
border-radius: 4px;
|
||||
color: #FFFFFF;
|
||||
text-transform: uppercase;
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
background-color: transparent;
|
||||
cursor: pointer;
|
||||
font-size: 14px;
|
||||
}
|
||||
.leave-button:hover, .deleteid-button:hover, .createid-button:hover, .reconnect-button:hover {
|
||||
color: #3399CC;
|
||||
background: #FFFFFF;
|
||||
}
|
||||
|
||||
html, body, .container {
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
.deleteid-button {
|
||||
width: 170px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.disabled-button {
|
||||
color: #b7b7b7;
|
||||
border: 2px solid #b7b7b7;
|
||||
cursor: inherit;
|
||||
}
|
||||
.disabled-button:hover {
|
||||
color: #b7b7b7;
|
||||
border: 2px solid #b7b7b7;
|
||||
background-color: transparent;
|
||||
}
|
||||
.vertical-center-row {
|
||||
background: #3399CC;
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
border-radius: 0 0 1rem 1rem;
|
||||
min-height: calc(100% - 10rem);
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.username {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
font-size: large;
|
||||
padding-top: 1.2rem;
|
||||
}
|
||||
|
||||
.targets {
|
||||
width: 80%;
|
||||
}
|
||||
.target, .target a {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
color: #3399CC;
|
||||
text-transform: uppercase;
|
||||
text-decoration: none;
|
||||
font-size: large;
|
||||
}
|
||||
|
||||
@keyframes blink-animation {
|
||||
to {
|
||||
visibility: hidden;
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes blink-animation {
|
||||
to {
|
||||
visibility: hidden;
|
||||
}
|
||||
}
|
||||
.warning {
|
||||
text-align: center;
|
||||
animation: blink-animation 5s steps(5, start) infinite;
|
||||
-webkit-animation: blink-animation 5s steps(5, start) infinite;
|
||||
position: absolute;
|
||||
bottom: 2rem;
|
||||
color: #FFB7B7;
|
||||
}
|
||||
.panel-text {
|
||||
color: white;
|
||||
}
|
||||
.policy-text {
|
||||
color: black;
|
||||
}
|
||||
.footer {
|
||||
padding-left: 3rem;
|
||||
margin-top: -2.3rem;
|
||||
}
|
||||
|
||||
.footer-link:hover {
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Start Bootstrap - Simple Sidebar (http://startbootstrap.com/)
|
||||
* Copyright 2013-2016 Start Bootstrap
|
||||
* Licensed under MIT (https://git.spacen.net/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE)
|
||||
* https://git.spacen.net/BlackrockDigital/startbootstrap-simple-sidebar/blob/master/css/simple-sidebar.css
|
||||
*/
|
||||
|
||||
/* Toggle Styles */
|
||||
|
||||
#wrapper {
|
||||
padding-left: 0;
|
||||
-webkit-transition: all 0.5s ease;
|
||||
-moz-transition: all 0.5s ease;
|
||||
-o-transition: all 0.5s ease;
|
||||
transition: all 0.5s ease;
|
||||
}
|
||||
|
||||
#wrapper.toggled {
|
||||
padding-left: 250px;
|
||||
}
|
||||
|
||||
#sidebar-wrapper {
|
||||
z-index: 1000;
|
||||
position: fixed;
|
||||
left: 250px;
|
||||
width: 0;
|
||||
height: 100%;
|
||||
margin-left: -250px;
|
||||
overflow-y: auto;
|
||||
background: #000;
|
||||
-webkit-transition: all 0.5s ease;
|
||||
-moz-transition: all 0.5s ease;
|
||||
-o-transition: all 0.5s ease;
|
||||
transition: all 0.5s ease;
|
||||
}
|
||||
|
||||
#wrapper.toggled #sidebar-wrapper {
|
||||
width: 250px;
|
||||
}
|
||||
|
||||
#page-content-wrapper {
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
#wrapper.toggled #page-content-wrapper {
|
||||
position: absolute;
|
||||
margin-right: -250px;
|
||||
}
|
||||
|
||||
.button-white {
|
||||
color: #fbfbfb;
|
||||
}
|
||||
|
||||
.stripe-button-el {
|
||||
width: 240px !important;
|
||||
}
|
||||
|
||||
.button-license-el {
|
||||
width: 340px !important;
|
||||
overflow: hidden;
|
||||
display: inline-block;
|
||||
visibility: visible !important;
|
||||
background-image: -webkit-linear-gradient(#28a0e5,#015e94);
|
||||
background-image: -moz-linear-gradient(#28a0e5,#015e94);
|
||||
background-image: -ms-linear-gradient(#28a0e5,#015e94);
|
||||
background-image: -o-linear-gradient(#28a0e5,#015e94);
|
||||
background-image: -webkit-linear-gradient(#28a0e5,#015e94);
|
||||
background-image: -moz-linear-gradient(#28a0e5,#015e94);
|
||||
background-image: -ms-linear-gradient(#28a0e5,#015e94);
|
||||
background-image: -o-linear-gradient(#28a0e5,#015e94);
|
||||
background-image: linear-gradient(#28a0e5,#015e94);
|
||||
-webkit-font-smoothing: antialiased;
|
||||
border: 0;
|
||||
padding: 1px;
|
||||
text-decoration: none;
|
||||
-webkit-border-radius: 5px;
|
||||
-moz-border-radius: 5px;
|
||||
-ms-border-radius: 5px;
|
||||
-o-border-radius: 5px;
|
||||
border-radius: 5px;
|
||||
-webkit-box-shadow: 0 1px 0 rgba(0,0,0,0.2);
|
||||
-moz-box-shadow: 0 1px 0 rgba(0,0,0,0.2);
|
||||
-ms-box-shadow: 0 1px 0 rgba(0,0,0,0.2);
|
||||
-o-box-shadow: 0 1px 0 rgba(0,0,0,0.2);
|
||||
box-shadow: 0 1px 0 rgba(0,0,0,0.2);
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
-o-user-select: none;
|
||||
user-select: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
.button-license-el span {
|
||||
display: block;
|
||||
position: relative;
|
||||
padding: 0 12px;
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
background: #1275ff;
|
||||
background-image: -webkit-linear-gradient(#7dc5ee,#008cdd 85%,#30a2e4);
|
||||
background-image: -moz-linear-gradient(#7dc5ee,#008cdd 85%,#30a2e4);
|
||||
background-image: -ms-linear-gradient(#7dc5ee,#008cdd 85%,#30a2e4);
|
||||
background-image: -o-linear-gradient(#7dc5ee,#008cdd 85%,#30a2e4);
|
||||
background-image: -webkit-linear-gradient(#7dc5ee,#008cdd 85%,#30a2e4);
|
||||
background-image: -moz-linear-gradient(#7dc5ee,#008cdd 85%,#30a2e4);
|
||||
background-image: -ms-linear-gradient(#7dc5ee,#008cdd 85%,#30a2e4);
|
||||
background-image: -o-linear-gradient(#7dc5ee,#008cdd 85%,#30a2e4);
|
||||
background-image: linear-gradient(#7dc5ee,#008cdd 85%,#30a2e4);
|
||||
font-size: 14px;
|
||||
color: #fff;
|
||||
font-weight: bold;
|
||||
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
|
||||
text-shadow: 0 -1px 0 rgba(0,0,0,0.25);
|
||||
-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,0.25);
|
||||
-moz-box-shadow: inset 0 1px 0 rgba(255,255,255,0.25);
|
||||
-ms-box-shadow: inset 0 1px 0 rgba(255,255,255,0.25);
|
||||
-o-box-shadow: inset 0 1px 0 rgba(255,255,255,0.25);
|
||||
box-shadow: inset 0 1px 0 rgba(255,255,255,0.25);
|
||||
-webkit-border-radius: 4px;
|
||||
-moz-border-radius: 4px;
|
||||
-ms-border-radius: 4px;
|
||||
-o-border-radius: 4px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
/* Sidebar Styles */
|
||||
|
||||
.sidebar-nav {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
width: 250px;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.sidebar-nav li {
|
||||
text-indent: 20px;
|
||||
line-height: 40px;
|
||||
}
|
||||
|
||||
.sidebar-nav li a {
|
||||
display: block;
|
||||
text-decoration: none;
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.sidebar-nav li a:hover {
|
||||
text-decoration: none;
|
||||
color: #fff;
|
||||
background: rgba(255,255,255,0.2);
|
||||
}
|
||||
|
||||
.sidebar-nav li a:active,
|
||||
.sidebar-nav li a:focus {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.sidebar-nav > .sidebar-brand {
|
||||
height: 65px;
|
||||
font-size: 18px;
|
||||
line-height: 60px;
|
||||
}
|
||||
|
||||
.sidebar-nav > .sidebar-brand a {
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.sidebar-nav > .sidebar-brand a:hover {
|
||||
color: #fff;
|
||||
background: none;
|
||||
}
|
||||
|
||||
.lic-data {
|
||||
text-align: left;
|
||||
padding-left: 20px;
|
||||
}
|
||||
.lic-data-value {
|
||||
padding-right: 10px;
|
||||
}
|
||||
.lic-data-title {
|
||||
font-weight: bold;
|
||||
padding-right: 15px;
|
||||
padding-left: 10px;
|
||||
}
|
||||
.licenses-list>tbody>tr:nth-child(odd) {
|
||||
background: #90c8e4
|
||||
}
|
||||
|
||||
@media(min-width:768px) {
|
||||
#wrapper {
|
||||
padding-left: 250px;
|
||||
}
|
||||
|
||||
#wrapper.toggled {
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
#sidebar-wrapper {
|
||||
width: 250px;
|
||||
}
|
||||
|
||||
#wrapper.toggled #sidebar-wrapper {
|
||||
width: 0;
|
||||
}
|
||||
|
||||
#page-content-wrapper {
|
||||
padding: 20px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#wrapper.toggled #page-content-wrapper {
|
||||
position: relative;
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.menu a, .menu a:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
.menu {
|
||||
float: left;
|
||||
width: 180px;
|
||||
}
|
||||
.menu-item {
|
||||
border: 2px solid #337ab7;
|
||||
padding: 12px;
|
||||
text-align: left;
|
||||
/* border-radius: 4px; */
|
||||
color: #3399cc;
|
||||
text-transform: uppercase;
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
background-color: #d9edf7;
|
||||
cursor: pointer;
|
||||
white-space: nowrap;
|
||||
width: 100%;
|
||||
}
|
||||
.menu-item-selected {
|
||||
background-color: #3399cc;
|
||||
color: #d9edf7;
|
||||
}
|
||||
|
||||
|
||||
/* stripe */
|
||||
.stripe {
|
||||
display: none;
|
||||
background: rgba(128, 128, 128, 0.5);
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
top: 0;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
z-index: 2;
|
||||
}
|
||||
.stripe-dialog {
|
||||
position: absolute;
|
||||
width: 640px;
|
||||
height: 700px;
|
||||
border: 2px solid gray;
|
||||
border-radius: 5px;
|
||||
background: #E6EBF1;
|
||||
align-items: center;
|
||||
min-height: 480px;
|
||||
top: calc(50% - 350px);
|
||||
left: calc(50% - 320px);
|
||||
display: flex;
|
||||
}
|
||||
.stripe form {
|
||||
width: 480px;
|
||||
margin: 20px auto;
|
||||
}
|
||||
|
||||
.stripe .group {
|
||||
background: white;
|
||||
box-shadow: 0 7px 14px 0 rgba(49,49,93,0.10),
|
||||
0 3px 6px 0 rgba(0,0,0,0.08);
|
||||
border-radius: 4px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.stripe label {
|
||||
position: relative;
|
||||
color: #8898AA;
|
||||
font-weight: 300;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
margin-left: 20px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.stripe .group label:not(:last-child) {
|
||||
border-bottom: 1px solid #F0F5FA;
|
||||
}
|
||||
|
||||
.stripe label > span {
|
||||
width: 20%;
|
||||
text-align: right;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.stripe .field {
|
||||
background: transparent;
|
||||
font-weight: 300;
|
||||
border: 0;
|
||||
color: #31325F;
|
||||
outline: none;
|
||||
padding-right: 10px;
|
||||
padding-left: 10px;
|
||||
cursor: text;
|
||||
width: 70%;
|
||||
height: 40px;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.stripe .field::-webkit-input-placeholder { color: #CFD7E0; }
|
||||
.stripe .field::-moz-placeholder { color: #CFD7E0; }
|
||||
.stripe .field:-ms-input-placeholder { color: #CFD7E0; }
|
||||
|
||||
.stripe button, .stripe .button-cancel {
|
||||
float: left;
|
||||
display: block;
|
||||
background: #666EE8;
|
||||
color: white;
|
||||
box-shadow: 0 7px 14px 0 rgba(49,49,93,0.10),
|
||||
0 3px 6px 0 rgba(0,0,0,0.08);
|
||||
border-radius: 4px;
|
||||
border: 0;
|
||||
margin-top: 20px;
|
||||
font-size: 15px;
|
||||
font-weight: 400;
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
line-height: 38px;
|
||||
outline: none;
|
||||
}
|
||||
.stripe .button-cancel {
|
||||
background: #5f5f5f;
|
||||
cursor: pointer;
|
||||
}
|
||||
.stripe button:focus, .stripe .button-cancel:focus {
|
||||
background: #555ABF;
|
||||
}
|
||||
|
||||
.stripe button:active, .stripe .button-cancel:active {
|
||||
background: #43458B;
|
||||
}
|
||||
.stripe-price-netto, .stripe-price-vat, .stripe-price-total {
|
||||
padding-right: 10px;
|
||||
}
|
||||
.stripe-price-total, .stripe-price-total-number {
|
||||
font-weight: bold !important;
|
||||
border-top: 1px solid gray;
|
||||
}
|
||||
.stripe-price-netto {
|
||||
width: 200px;
|
||||
}
|
||||
.stripe-price {
|
||||
width: 100%;
|
||||
text-align: left;
|
||||
}
|
||||
.stripe-product {
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
.stripe-info {
|
||||
font-size: 10px;
|
||||
}
|
||||
.stripe-price table {
|
||||
margin-left: calc(50% - 100px);
|
||||
}
|
||||
.stripe .outcome {
|
||||
float: left;
|
||||
width: 100%;
|
||||
padding-top: 8px;
|
||||
min-height: 24px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.stripe .success, .error {
|
||||
display: none;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.stripe .success.visible, .error.visible {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.stripe .error {
|
||||
color: #E4584C;
|
||||
}
|
||||
|
||||
.stripe .success {
|
||||
color: #666EE8;
|
||||
}
|
||||
|
||||
.stripe .success .token {
|
||||
font-weight: 500;
|
||||
font-size: 13px;
|
||||
}
|
||||
.stripe .form-disabled {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
opacity: 0.5;
|
||||
background: black;
|
||||
z-index: 10;
|
||||
display: none;
|
||||
}
|
After Width: | Height: | Size: 351 B |
After Width: | Height: | Size: 247 B |
After Width: | Height: | Size: 299 B |
After Width: | Height: | Size: 299 B |
After Width: | Height: | Size: 291 B |
After Width: | Height: | Size: 291 B |
After Width: | Height: | Size: 319 B |
After Width: | Height: | Size: 363 B |
After Width: | Height: | Size: 348 B |
After Width: | Height: | Size: 6.8 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 6.8 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 6.3 KiB |
1225
www/lib/css/themes/jquery-ui/black-tie/jquery-ui.css
vendored
Normal file
7
www/lib/css/themes/jquery-ui/black-tie/jquery-ui.min.css
vendored
Normal file
410
www/lib/css/themes/jquery-ui/black-tie/theme.css
Normal file
@ -0,0 +1,410 @@
|
||||
/*!
|
||||
* jQuery UI CSS Framework 1.11.2
|
||||
* http://jqueryui.com
|
||||
*
|
||||
* Copyright 2014 jQuery Foundation and other contributors
|
||||
* Released under the MIT license.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://api.jqueryui.com/category/theming/
|
||||
*
|
||||
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=333333&bgTextureHeader=diagonals_thick&bgImgOpacityHeader=8&borderColorHeader=a3a3a3&fcHeader=eeeeee&iconColorHeader=bbbbbb&bgColorContent=f9f9f9&bgTextureContent=highlight_hard&bgImgOpacityContent=100&borderColorContent=cccccc&fcContent=222222&iconColorContent=222222&bgColorDefault=111111&bgTextureDefault=glass&bgImgOpacityDefault=40&borderColorDefault=777777&fcDefault=e3e3e3&iconColorDefault=ededed&bgColorHover=1c1c1c&bgTextureHover=glass&bgImgOpacityHover=55&borderColorHover=000000&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=ffffff&bgTextureActive=flat&bgImgOpacityActive=65&borderColorActive=cccccc&fcActive=222222&iconColorActive=222222&bgColorHighlight=ffeb80&bgTextureHighlight=inset_hard&bgImgOpacityHighlight=55&borderColorHighlight=ffde2e&fcHighlight=363636&iconColorHighlight=4ca300&bgColorError=cd0a0a&bgTextureError=inset_hard&bgImgOpacityError=45&borderColorError=9e0505&fcError=ffffff&iconColorError=ffcf29&bgColorOverlay=aaaaaa&bgTextureOverlay=highlight_hard&bgImgOpacityOverlay=40&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=highlight_soft&bgImgOpacityShadow=50&opacityShadow=20&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
|
||||
*/
|
||||
|
||||
|
||||
/* Component containers
|
||||
----------------------------------*/
|
||||
.ui-widget {
|
||||
font-family: Verdana,Arial,sans-serif;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
.ui-widget .ui-widget {
|
||||
font-size: 1em;
|
||||
}
|
||||
.ui-widget input,
|
||||
.ui-widget select,
|
||||
.ui-widget textarea,
|
||||
.ui-widget button {
|
||||
font-family: Verdana,Arial,sans-serif;
|
||||
font-size: 1em;
|
||||
}
|
||||
.ui-widget-content {
|
||||
border: 1px solid #cccccc;
|
||||
background: #f9f9f9 url("images/ui-bg_highlight-hard_100_f9f9f9_1x100.png") 50% top repeat-x;
|
||||
color: #222222;
|
||||
}
|
||||
.ui-widget-content a {
|
||||
color: #222222;
|
||||
}
|
||||
.ui-widget-header {
|
||||
border: 1px solid #a3a3a3;
|
||||
background: #333333 url("images/ui-bg_diagonals-thick_8_333333_40x40.png") 50% 50% repeat;
|
||||
color: #eeeeee;
|
||||
font-weight: bold;
|
||||
}
|
||||
.ui-widget-header a {
|
||||
color: #eeeeee;
|
||||
}
|
||||
|
||||
/* Interaction states
|
||||
----------------------------------*/
|
||||
.ui-state-default,
|
||||
.ui-widget-content .ui-state-default,
|
||||
.ui-widget-header .ui-state-default {
|
||||
border: 1px solid #777777;
|
||||
background: #111111 url("images/ui-bg_glass_40_111111_1x400.png") 50% 50% repeat-x;
|
||||
font-weight: normal;
|
||||
color: #e3e3e3;
|
||||
}
|
||||
.ui-state-default a,
|
||||
.ui-state-default a:link,
|
||||
.ui-state-default a:visited {
|
||||
color: #e3e3e3;
|
||||
text-decoration: none;
|
||||
}
|
||||
.ui-state-hover,
|
||||
.ui-widget-content .ui-state-hover,
|
||||
.ui-widget-header .ui-state-hover,
|
||||
.ui-state-focus,
|
||||
.ui-widget-content .ui-state-focus,
|
||||
.ui-widget-header .ui-state-focus {
|
||||
border: 1px solid #000000;
|
||||
background: #1c1c1c url("images/ui-bg_glass_55_1c1c1c_1x400.png") 50% 50% repeat-x;
|
||||
font-weight: normal;
|
||||
color: #ffffff;
|
||||
}
|
||||
.ui-state-hover a,
|
||||
.ui-state-hover a:hover,
|
||||
.ui-state-hover a:link,
|
||||
.ui-state-hover a:visited,
|
||||
.ui-state-focus a,
|
||||
.ui-state-focus a:hover,
|
||||
.ui-state-focus a:link,
|
||||
.ui-state-focus a:visited {
|
||||
color: #ffffff;
|
||||
text-decoration: none;
|
||||
}
|
||||
.ui-state-active,
|
||||
.ui-widget-content .ui-state-active,
|
||||
.ui-widget-header .ui-state-active {
|
||||
border: 1px solid #cccccc;
|
||||
background: #ffffff url("images/ui-bg_flat_65_ffffff_40x100.png") 50% 50% repeat-x;
|
||||
font-weight: normal;
|
||||
color: #222222;
|
||||
}
|
||||
.ui-state-active a,
|
||||
.ui-state-active a:link,
|
||||
.ui-state-active a:visited {
|
||||
color: #222222;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* Interaction Cues
|
||||
----------------------------------*/
|
||||
.ui-state-highlight,
|
||||
.ui-widget-content .ui-state-highlight,
|
||||
.ui-widget-header .ui-state-highlight {
|
||||
border: 1px solid #ffde2e;
|
||||
background: #ffeb80 url("images/ui-bg_inset-hard_55_ffeb80_1x100.png") 50% bottom repeat-x;
|
||||
color: #363636;
|
||||
}
|
||||
.ui-state-highlight a,
|
||||
.ui-widget-content .ui-state-highlight a,
|
||||
.ui-widget-header .ui-state-highlight a {
|
||||
color: #363636;
|
||||
}
|
||||
.ui-state-error,
|
||||
.ui-widget-content .ui-state-error,
|
||||
.ui-widget-header .ui-state-error {
|
||||
border: 1px solid #9e0505;
|
||||
background: #cd0a0a url("images/ui-bg_inset-hard_45_cd0a0a_1x100.png") 50% bottom repeat-x;
|
||||
color: #ffffff;
|
||||
}
|
||||
.ui-state-error a,
|
||||
.ui-widget-content .ui-state-error a,
|
||||
.ui-widget-header .ui-state-error a {
|
||||
color: #ffffff;
|
||||
}
|
||||
.ui-state-error-text,
|
||||
.ui-widget-content .ui-state-error-text,
|
||||
.ui-widget-header .ui-state-error-text {
|
||||
color: #ffffff;
|
||||
}
|
||||
.ui-priority-primary,
|
||||
.ui-widget-content .ui-priority-primary,
|
||||
.ui-widget-header .ui-priority-primary {
|
||||
font-weight: bold;
|
||||
}
|
||||
.ui-priority-secondary,
|
||||
.ui-widget-content .ui-priority-secondary,
|
||||
.ui-widget-header .ui-priority-secondary {
|
||||
opacity: .7;
|
||||
filter:Alpha(Opacity=70); /* support: IE8 */
|
||||
font-weight: normal;
|
||||
}
|
||||
.ui-state-disabled,
|
||||
.ui-widget-content .ui-state-disabled,
|
||||
.ui-widget-header .ui-state-disabled {
|
||||
opacity: .35;
|
||||
filter:Alpha(Opacity=35); /* support: IE8 */
|
||||
background-image: none;
|
||||
}
|
||||
.ui-state-disabled .ui-icon {
|
||||
filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
|
||||
}
|
||||
|
||||
/* Icons
|
||||
----------------------------------*/
|
||||
|
||||
/* states and images */
|
||||
.ui-icon {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
.ui-icon,
|
||||
.ui-widget-content .ui-icon {
|
||||
background-image: url("images/ui-icons_222222_256x240.png");
|
||||
}
|
||||
.ui-widget-header .ui-icon {
|
||||
background-image: url("images/ui-icons_bbbbbb_256x240.png");
|
||||
}
|
||||
.ui-state-default .ui-icon {
|
||||
background-image: url("images/ui-icons_ededed_256x240.png");
|
||||
}
|
||||
.ui-state-hover .ui-icon,
|
||||
.ui-state-focus .ui-icon {
|
||||
background-image: url("images/ui-icons_ffffff_256x240.png");
|
||||
}
|
||||
.ui-state-active .ui-icon {
|
||||
background-image: url("images/ui-icons_222222_256x240.png");
|
||||
}
|
||||
.ui-state-highlight .ui-icon {
|
||||
background-image: url("images/ui-icons_4ca300_256x240.png");
|
||||
}
|
||||
.ui-state-error .ui-icon,
|
||||
.ui-state-error-text .ui-icon {
|
||||
background-image: url("images/ui-icons_ffcf29_256x240.png");
|
||||
}
|
||||
|
||||
/* positioning */
|
||||
.ui-icon-blank { background-position: 16px 16px; }
|
||||
.ui-icon-carat-1-n { background-position: 0 0; }
|
||||
.ui-icon-carat-1-ne { background-position: -16px 0; }
|
||||
.ui-icon-carat-1-e { background-position: -32px 0; }
|
||||
.ui-icon-carat-1-se { background-position: -48px 0; }
|
||||
.ui-icon-carat-1-s { background-position: -64px 0; }
|
||||
.ui-icon-carat-1-sw { background-position: -80px 0; }
|
||||
.ui-icon-carat-1-w { background-position: -96px 0; }
|
||||
.ui-icon-carat-1-nw { background-position: -112px 0; }
|
||||
.ui-icon-carat-2-n-s { background-position: -128px 0; }
|
||||
.ui-icon-carat-2-e-w { background-position: -144px 0; }
|
||||
.ui-icon-triangle-1-n { background-position: 0 -16px; }
|
||||
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
|
||||
.ui-icon-triangle-1-e { background-position: -32px -16px; }
|
||||
.ui-icon-triangle-1-se { background-position: -48px -16px; }
|
||||
.ui-icon-triangle-1-s { background-position: -64px -16px; }
|
||||
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
|
||||
.ui-icon-triangle-1-w { background-position: -96px -16px; }
|
||||
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
|
||||
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
|
||||
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
|
||||
.ui-icon-arrow-1-n { background-position: 0 -32px; }
|
||||
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
|
||||
.ui-icon-arrow-1-e { background-position: -32px -32px; }
|
||||
.ui-icon-arrow-1-se { background-position: -48px -32px; }
|
||||
.ui-icon-arrow-1-s { background-position: -64px -32px; }
|
||||
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
|
||||
.ui-icon-arrow-1-w { background-position: -96px -32px; }
|
||||
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
|
||||
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
|
||||
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
|
||||
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
|
||||
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
|
||||
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
|
||||
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
|
||||
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
|
||||
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
|
||||
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
|
||||
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
|
||||
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
|
||||
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
|
||||
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
|
||||
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
|
||||
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
|
||||
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
|
||||
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
|
||||
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
|
||||
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
|
||||
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
|
||||
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
|
||||
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
|
||||
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
|
||||
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
|
||||
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
|
||||
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
|
||||
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
|
||||
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
|
||||
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
|
||||
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
|
||||
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
|
||||
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
|
||||
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
|
||||
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
|
||||
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
|
||||
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
|
||||
.ui-icon-arrow-4 { background-position: 0 -80px; }
|
||||
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
|
||||
.ui-icon-extlink { background-position: -32px -80px; }
|
||||
.ui-icon-newwin { background-position: -48px -80px; }
|
||||
.ui-icon-refresh { background-position: -64px -80px; }
|
||||
.ui-icon-shuffle { background-position: -80px -80px; }
|
||||
.ui-icon-transfer-e-w { background-position: -96px -80px; }
|
||||
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
|
||||
.ui-icon-folder-collapsed { background-position: 0 -96px; }
|
||||
.ui-icon-folder-open { background-position: -16px -96px; }
|
||||
.ui-icon-document { background-position: -32px -96px; }
|
||||
.ui-icon-document-b { background-position: -48px -96px; }
|
||||
.ui-icon-note { background-position: -64px -96px; }
|
||||
.ui-icon-mail-closed { background-position: -80px -96px; }
|
||||
.ui-icon-mail-open { background-position: -96px -96px; }
|
||||
.ui-icon-suitcase { background-position: -112px -96px; }
|
||||
.ui-icon-comment { background-position: -128px -96px; }
|
||||
.ui-icon-person { background-position: -144px -96px; }
|
||||
.ui-icon-print { background-position: -160px -96px; }
|
||||
.ui-icon-trash { background-position: -176px -96px; }
|
||||
.ui-icon-locked { background-position: -192px -96px; }
|
||||
.ui-icon-unlocked { background-position: -208px -96px; }
|
||||
.ui-icon-bookmark { background-position: -224px -96px; }
|
||||
.ui-icon-tag { background-position: -240px -96px; }
|
||||
.ui-icon-home { background-position: 0 -112px; }
|
||||
.ui-icon-flag { background-position: -16px -112px; }
|
||||
.ui-icon-calendar { background-position: -32px -112px; }
|
||||
.ui-icon-cart { background-position: -48px -112px; }
|
||||
.ui-icon-pencil { background-position: -64px -112px; }
|
||||
.ui-icon-clock { background-position: -80px -112px; }
|
||||
.ui-icon-disk { background-position: -96px -112px; }
|
||||
.ui-icon-calculator { background-position: -112px -112px; }
|
||||
.ui-icon-zoomin { background-position: -128px -112px; }
|
||||
.ui-icon-zoomout { background-position: -144px -112px; }
|
||||
.ui-icon-search { background-position: -160px -112px; }
|
||||
.ui-icon-wrench { background-position: -176px -112px; }
|
||||
.ui-icon-gear { background-position: -192px -112px; }
|
||||
.ui-icon-heart { background-position: -208px -112px; }
|
||||
.ui-icon-star { background-position: -224px -112px; }
|
||||
.ui-icon-link { background-position: -240px -112px; }
|
||||
.ui-icon-cancel { background-position: 0 -128px; }
|
||||
.ui-icon-plus { background-position: -16px -128px; }
|
||||
.ui-icon-plusthick { background-position: -32px -128px; }
|
||||
.ui-icon-minus { background-position: -48px -128px; }
|
||||
.ui-icon-minusthick { background-position: -64px -128px; }
|
||||
.ui-icon-close { background-position: -80px -128px; }
|
||||
.ui-icon-closethick { background-position: -96px -128px; }
|
||||
.ui-icon-key { background-position: -112px -128px; }
|
||||
.ui-icon-lightbulb { background-position: -128px -128px; }
|
||||
.ui-icon-scissors { background-position: -144px -128px; }
|
||||
.ui-icon-clipboard { background-position: -160px -128px; }
|
||||
.ui-icon-copy { background-position: -176px -128px; }
|
||||
.ui-icon-contact { background-position: -192px -128px; }
|
||||
.ui-icon-image { background-position: -208px -128px; }
|
||||
.ui-icon-video { background-position: -224px -128px; }
|
||||
.ui-icon-script { background-position: -240px -128px; }
|
||||
.ui-icon-alert { background-position: 0 -144px; }
|
||||
.ui-icon-info { background-position: -16px -144px; }
|
||||
.ui-icon-notice { background-position: -32px -144px; }
|
||||
.ui-icon-help { background-position: -48px -144px; }
|
||||
.ui-icon-check { background-position: -64px -144px; }
|
||||
.ui-icon-bullet { background-position: -80px -144px; }
|
||||
.ui-icon-radio-on { background-position: -96px -144px; }
|
||||
.ui-icon-radio-off { background-position: -112px -144px; }
|
||||
.ui-icon-pin-w { background-position: -128px -144px; }
|
||||
.ui-icon-pin-s { background-position: -144px -144px; }
|
||||
.ui-icon-play { background-position: 0 -160px; }
|
||||
.ui-icon-pause { background-position: -16px -160px; }
|
||||
.ui-icon-seek-next { background-position: -32px -160px; }
|
||||
.ui-icon-seek-prev { background-position: -48px -160px; }
|
||||
.ui-icon-seek-end { background-position: -64px -160px; }
|
||||
.ui-icon-seek-start { background-position: -80px -160px; }
|
||||
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
|
||||
.ui-icon-seek-first { background-position: -80px -160px; }
|
||||
.ui-icon-stop { background-position: -96px -160px; }
|
||||
.ui-icon-eject { background-position: -112px -160px; }
|
||||
.ui-icon-volume-off { background-position: -128px -160px; }
|
||||
.ui-icon-volume-on { background-position: -144px -160px; }
|
||||
.ui-icon-power { background-position: 0 -176px; }
|
||||
.ui-icon-signal-diag { background-position: -16px -176px; }
|
||||
.ui-icon-signal { background-position: -32px -176px; }
|
||||
.ui-icon-battery-0 { background-position: -48px -176px; }
|
||||
.ui-icon-battery-1 { background-position: -64px -176px; }
|
||||
.ui-icon-battery-2 { background-position: -80px -176px; }
|
||||
.ui-icon-battery-3 { background-position: -96px -176px; }
|
||||
.ui-icon-circle-plus { background-position: 0 -192px; }
|
||||
.ui-icon-circle-minus { background-position: -16px -192px; }
|
||||
.ui-icon-circle-close { background-position: -32px -192px; }
|
||||
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
|
||||
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
|
||||
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
|
||||
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
|
||||
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
|
||||
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
|
||||
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
|
||||
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
|
||||
.ui-icon-circle-zoomin { background-position: -176px -192px; }
|
||||
.ui-icon-circle-zoomout { background-position: -192px -192px; }
|
||||
.ui-icon-circle-check { background-position: -208px -192px; }
|
||||
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
|
||||
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
|
||||
.ui-icon-circlesmall-close { background-position: -32px -208px; }
|
||||
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
|
||||
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
|
||||
.ui-icon-squaresmall-close { background-position: -80px -208px; }
|
||||
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
|
||||
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
|
||||
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
|
||||
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
|
||||
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
|
||||
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
|
||||
|
||||
|
||||
/* Misc visuals
|
||||
----------------------------------*/
|
||||
|
||||
/* Corner radius */
|
||||
.ui-corner-all,
|
||||
.ui-corner-top,
|
||||
.ui-corner-left,
|
||||
.ui-corner-tl {
|
||||
border-top-left-radius: 4px;
|
||||
}
|
||||
.ui-corner-all,
|
||||
.ui-corner-top,
|
||||
.ui-corner-right,
|
||||
.ui-corner-tr {
|
||||
border-top-right-radius: 4px;
|
||||
}
|
||||
.ui-corner-all,
|
||||
.ui-corner-bottom,
|
||||
.ui-corner-left,
|
||||
.ui-corner-bl {
|
||||
border-bottom-left-radius: 4px;
|
||||
}
|
||||
.ui-corner-all,
|
||||
.ui-corner-bottom,
|
||||
.ui-corner-right,
|
||||
.ui-corner-br {
|
||||
border-bottom-right-radius: 4px;
|
||||
}
|
||||
|
||||
/* Overlays */
|
||||
.ui-widget-overlay {
|
||||
background: #aaaaaa url("images/ui-bg_highlight-hard_40_aaaaaa_1x100.png") 50% top repeat-x;
|
||||
opacity: .3;
|
||||
filter: Alpha(Opacity=30); /* support: IE8 */
|
||||
}
|
||||
.ui-widget-shadow {
|
||||
margin: -8px 0 0 -8px;
|
||||
padding: 8px;
|
||||
background: #aaaaaa url("images/ui-bg_highlight-soft_50_aaaaaa_1x100.png") 50% top repeat-x;
|
||||
opacity: .2;
|
||||
filter: Alpha(Opacity=20); /* support: IE8 */
|
||||
border-radius: 8px;
|
||||
}
|
After Width: | Height: | Size: 452 B |
After Width: | Height: | Size: 246 B |
After Width: | Height: | Size: 259 B |
After Width: | Height: | Size: 247 B |
After Width: | Height: | Size: 247 B |
After Width: | Height: | Size: 379 B |
After Width: | Height: | Size: 291 B |
After Width: | Height: | Size: 290 B |
After Width: | Height: | Size: 366 B |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 6.3 KiB |
1225
www/lib/css/themes/jquery-ui/blitzer/jquery-ui.css
vendored
Normal file
7
www/lib/css/themes/jquery-ui/blitzer/jquery-ui.min.css
vendored
Normal file
410
www/lib/css/themes/jquery-ui/blitzer/theme.css
Normal file
@ -0,0 +1,410 @@
|
||||
/*!
|
||||
* jQuery UI CSS Framework 1.11.2
|
||||
* http://jqueryui.com
|
||||
*
|
||||
* Copyright 2014 jQuery Foundation and other contributors
|
||||
* Released under the MIT license.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://api.jqueryui.com/category/theming/
|
||||
*
|
||||
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=cc0000&bgTextureHeader=highlight_soft&bgImgOpacityHeader=15&borderColorHeader=e3a1a1&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=eeeeee&fcContent=333333&iconColorContent=cc0000&bgColorDefault=eeeeee&bgTextureDefault=highlight_hard&bgImgOpacityDefault=100&borderColorDefault=d8dcdf&fcDefault=004276&iconColorDefault=cc0000&bgColorHover=f6f6f6&bgTextureHover=highlight_hard&bgImgOpacityHover=100&borderColorHover=cdd5da&fcHover=111111&iconColorHover=cc0000&bgColorActive=ffffff&bgTextureActive=flat&bgImgOpacityActive=65&borderColorActive=eeeeee&fcActive=cc0000&iconColorActive=cc0000&bgColorHighlight=fbf8ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcd3a1&fcHighlight=444444&iconColorHighlight=004276&bgColorError=f3d8d8&bgTextureError=diagonals_thick&bgImgOpacityError=75&borderColorError=cc0000&fcError=2e2e2e&iconColorError=cc0000&bgColorOverlay=a6a6a6&bgTextureOverlay=dots_small&bgImgOpacityOverlay=65&opacityOverlay=40&bgColorShadow=333333&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=10&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
|
||||
*/
|
||||
|
||||
|
||||
/* Component containers
|
||||
----------------------------------*/
|
||||
.ui-widget {
|
||||
font-family: Arial,sans-serif;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
.ui-widget .ui-widget {
|
||||
font-size: 1em;
|
||||
}
|
||||
.ui-widget input,
|
||||
.ui-widget select,
|
||||
.ui-widget textarea,
|
||||
.ui-widget button {
|
||||
font-family: Arial,sans-serif;
|
||||
font-size: 1em;
|
||||
}
|
||||
.ui-widget-content {
|
||||
border: 1px solid #eeeeee;
|
||||
background: #ffffff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x;
|
||||
color: #333333;
|
||||
}
|
||||
.ui-widget-content a {
|
||||
color: #333333;
|
||||
}
|
||||
.ui-widget-header {
|
||||
border: 1px solid #e3a1a1;
|
||||
background: #cc0000 url("images/ui-bg_highlight-soft_15_cc0000_1x100.png") 50% 50% repeat-x;
|
||||
color: #ffffff;
|
||||
font-weight: bold;
|
||||
}
|
||||
.ui-widget-header a {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
/* Interaction states
|
||||
----------------------------------*/
|
||||
.ui-state-default,
|
||||
.ui-widget-content .ui-state-default,
|
||||
.ui-widget-header .ui-state-default {
|
||||
border: 1px solid #d8dcdf;
|
||||
background: #eeeeee url("images/ui-bg_highlight-hard_100_eeeeee_1x100.png") 50% 50% repeat-x;
|
||||
font-weight: bold;
|
||||
color: #004276;
|
||||
}
|
||||
.ui-state-default a,
|
||||
.ui-state-default a:link,
|
||||
.ui-state-default a:visited {
|
||||
color: #004276;
|
||||
text-decoration: none;
|
||||
}
|
||||
.ui-state-hover,
|
||||
.ui-widget-content .ui-state-hover,
|
||||
.ui-widget-header .ui-state-hover,
|
||||
.ui-state-focus,
|
||||
.ui-widget-content .ui-state-focus,
|
||||
.ui-widget-header .ui-state-focus {
|
||||
border: 1px solid #cdd5da;
|
||||
background: #f6f6f6 url("images/ui-bg_highlight-hard_100_f6f6f6_1x100.png") 50% 50% repeat-x;
|
||||
font-weight: bold;
|
||||
color: #111111;
|
||||
}
|
||||
.ui-state-hover a,
|
||||
.ui-state-hover a:hover,
|
||||
.ui-state-hover a:link,
|
||||
.ui-state-hover a:visited,
|
||||
.ui-state-focus a,
|
||||
.ui-state-focus a:hover,
|
||||
.ui-state-focus a:link,
|
||||
.ui-state-focus a:visited {
|
||||
color: #111111;
|
||||
text-decoration: none;
|
||||
}
|
||||
.ui-state-active,
|
||||
.ui-widget-content .ui-state-active,
|
||||
.ui-widget-header .ui-state-active {
|
||||
border: 1px solid #eeeeee;
|
||||
background: #ffffff url("images/ui-bg_flat_65_ffffff_40x100.png") 50% 50% repeat-x;
|
||||
font-weight: bold;
|
||||
color: #cc0000;
|
||||
}
|
||||
.ui-state-active a,
|
||||
.ui-state-active a:link,
|
||||
.ui-state-active a:visited {
|
||||
color: #cc0000;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* Interaction Cues
|
||||
----------------------------------*/
|
||||
.ui-state-highlight,
|
||||
.ui-widget-content .ui-state-highlight,
|
||||
.ui-widget-header .ui-state-highlight {
|
||||
border: 1px solid #fcd3a1;
|
||||
background: #fbf8ee url("images/ui-bg_glass_55_fbf8ee_1x400.png") 50% 50% repeat-x;
|
||||
color: #444444;
|
||||
}
|
||||
.ui-state-highlight a,
|
||||
.ui-widget-content .ui-state-highlight a,
|
||||
.ui-widget-header .ui-state-highlight a {
|
||||
color: #444444;
|
||||
}
|
||||
.ui-state-error,
|
||||
.ui-widget-content .ui-state-error,
|
||||
.ui-widget-header .ui-state-error {
|
||||
border: 1px solid #cc0000;
|
||||
background: #f3d8d8 url("images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png") 50% 50% repeat;
|
||||
color: #2e2e2e;
|
||||
}
|
||||
.ui-state-error a,
|
||||
.ui-widget-content .ui-state-error a,
|
||||
.ui-widget-header .ui-state-error a {
|
||||
color: #2e2e2e;
|
||||
}
|
||||
.ui-state-error-text,
|
||||
.ui-widget-content .ui-state-error-text,
|
||||
.ui-widget-header .ui-state-error-text {
|
||||
color: #2e2e2e;
|
||||
}
|
||||
.ui-priority-primary,
|
||||
.ui-widget-content .ui-priority-primary,
|
||||
.ui-widget-header .ui-priority-primary {
|
||||
font-weight: bold;
|
||||
}
|
||||
.ui-priority-secondary,
|
||||
.ui-widget-content .ui-priority-secondary,
|
||||
.ui-widget-header .ui-priority-secondary {
|
||||
opacity: .7;
|
||||
filter:Alpha(Opacity=70); /* support: IE8 */
|
||||
font-weight: normal;
|
||||
}
|
||||
.ui-state-disabled,
|
||||
.ui-widget-content .ui-state-disabled,
|
||||
.ui-widget-header .ui-state-disabled {
|
||||
opacity: .35;
|
||||
filter:Alpha(Opacity=35); /* support: IE8 */
|
||||
background-image: none;
|
||||
}
|
||||
.ui-state-disabled .ui-icon {
|
||||
filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
|
||||
}
|
||||
|
||||
/* Icons
|
||||
----------------------------------*/
|
||||
|
||||
/* states and images */
|
||||
.ui-icon {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
.ui-icon,
|
||||
.ui-widget-content .ui-icon {
|
||||
background-image: url("images/ui-icons_cc0000_256x240.png");
|
||||
}
|
||||
.ui-widget-header .ui-icon {
|
||||
background-image: url("images/ui-icons_ffffff_256x240.png");
|
||||
}
|
||||
.ui-state-default .ui-icon {
|
||||
background-image: url("images/ui-icons_cc0000_256x240.png");
|
||||
}
|
||||
.ui-state-hover .ui-icon,
|
||||
.ui-state-focus .ui-icon {
|
||||
background-image: url("images/ui-icons_cc0000_256x240.png");
|
||||
}
|
||||
.ui-state-active .ui-icon {
|
||||
background-image: url("images/ui-icons_cc0000_256x240.png");
|
||||
}
|
||||
.ui-state-highlight .ui-icon {
|
||||
background-image: url("images/ui-icons_004276_256x240.png");
|
||||
}
|
||||
.ui-state-error .ui-icon,
|
||||
.ui-state-error-text .ui-icon {
|
||||
background-image: url("images/ui-icons_cc0000_256x240.png");
|
||||
}
|
||||
|
||||
/* positioning */
|
||||
.ui-icon-blank { background-position: 16px 16px; }
|
||||
.ui-icon-carat-1-n { background-position: 0 0; }
|
||||
.ui-icon-carat-1-ne { background-position: -16px 0; }
|
||||
.ui-icon-carat-1-e { background-position: -32px 0; }
|
||||
.ui-icon-carat-1-se { background-position: -48px 0; }
|
||||
.ui-icon-carat-1-s { background-position: -64px 0; }
|
||||
.ui-icon-carat-1-sw { background-position: -80px 0; }
|
||||
.ui-icon-carat-1-w { background-position: -96px 0; }
|
||||
.ui-icon-carat-1-nw { background-position: -112px 0; }
|
||||
.ui-icon-carat-2-n-s { background-position: -128px 0; }
|
||||
.ui-icon-carat-2-e-w { background-position: -144px 0; }
|
||||
.ui-icon-triangle-1-n { background-position: 0 -16px; }
|
||||
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
|
||||
.ui-icon-triangle-1-e { background-position: -32px -16px; }
|
||||
.ui-icon-triangle-1-se { background-position: -48px -16px; }
|
||||
.ui-icon-triangle-1-s { background-position: -64px -16px; }
|
||||
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
|
||||
.ui-icon-triangle-1-w { background-position: -96px -16px; }
|
||||
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
|
||||
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
|
||||
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
|
||||
.ui-icon-arrow-1-n { background-position: 0 -32px; }
|
||||
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
|
||||
.ui-icon-arrow-1-e { background-position: -32px -32px; }
|
||||
.ui-icon-arrow-1-se { background-position: -48px -32px; }
|
||||
.ui-icon-arrow-1-s { background-position: -64px -32px; }
|
||||
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
|
||||
.ui-icon-arrow-1-w { background-position: -96px -32px; }
|
||||
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
|
||||
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
|
||||
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
|
||||
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
|
||||
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
|
||||
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
|
||||
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
|
||||
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
|
||||
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
|
||||
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
|
||||
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
|
||||
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
|
||||
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
|
||||
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
|
||||
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
|
||||
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
|
||||
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
|
||||
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
|
||||
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
|
||||
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
|
||||
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
|
||||
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
|
||||
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
|
||||
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
|
||||
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
|
||||
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
|
||||
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
|
||||
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
|
||||
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
|
||||
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
|
||||
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
|
||||
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
|
||||
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
|
||||
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
|
||||
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
|
||||
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
|
||||
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
|
||||
.ui-icon-arrow-4 { background-position: 0 -80px; }
|
||||
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
|
||||
.ui-icon-extlink { background-position: -32px -80px; }
|
||||
.ui-icon-newwin { background-position: -48px -80px; }
|
||||
.ui-icon-refresh { background-position: -64px -80px; }
|
||||
.ui-icon-shuffle { background-position: -80px -80px; }
|
||||
.ui-icon-transfer-e-w { background-position: -96px -80px; }
|
||||
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
|
||||
.ui-icon-folder-collapsed { background-position: 0 -96px; }
|
||||
.ui-icon-folder-open { background-position: -16px -96px; }
|
||||
.ui-icon-document { background-position: -32px -96px; }
|
||||
.ui-icon-document-b { background-position: -48px -96px; }
|
||||
.ui-icon-note { background-position: -64px -96px; }
|
||||
.ui-icon-mail-closed { background-position: -80px -96px; }
|
||||
.ui-icon-mail-open { background-position: -96px -96px; }
|
||||
.ui-icon-suitcase { background-position: -112px -96px; }
|
||||
.ui-icon-comment { background-position: -128px -96px; }
|
||||
.ui-icon-person { background-position: -144px -96px; }
|
||||
.ui-icon-print { background-position: -160px -96px; }
|
||||
.ui-icon-trash { background-position: -176px -96px; }
|
||||
.ui-icon-locked { background-position: -192px -96px; }
|
||||
.ui-icon-unlocked { background-position: -208px -96px; }
|
||||
.ui-icon-bookmark { background-position: -224px -96px; }
|
||||
.ui-icon-tag { background-position: -240px -96px; }
|
||||
.ui-icon-home { background-position: 0 -112px; }
|
||||
.ui-icon-flag { background-position: -16px -112px; }
|
||||
.ui-icon-calendar { background-position: -32px -112px; }
|
||||
.ui-icon-cart { background-position: -48px -112px; }
|
||||
.ui-icon-pencil { background-position: -64px -112px; }
|
||||
.ui-icon-clock { background-position: -80px -112px; }
|
||||
.ui-icon-disk { background-position: -96px -112px; }
|
||||
.ui-icon-calculator { background-position: -112px -112px; }
|
||||
.ui-icon-zoomin { background-position: -128px -112px; }
|
||||
.ui-icon-zoomout { background-position: -144px -112px; }
|
||||
.ui-icon-search { background-position: -160px -112px; }
|
||||
.ui-icon-wrench { background-position: -176px -112px; }
|
||||
.ui-icon-gear { background-position: -192px -112px; }
|
||||
.ui-icon-heart { background-position: -208px -112px; }
|
||||
.ui-icon-star { background-position: -224px -112px; }
|
||||
.ui-icon-link { background-position: -240px -112px; }
|
||||
.ui-icon-cancel { background-position: 0 -128px; }
|
||||
.ui-icon-plus { background-position: -16px -128px; }
|
||||
.ui-icon-plusthick { background-position: -32px -128px; }
|
||||
.ui-icon-minus { background-position: -48px -128px; }
|
||||
.ui-icon-minusthick { background-position: -64px -128px; }
|
||||
.ui-icon-close { background-position: -80px -128px; }
|
||||
.ui-icon-closethick { background-position: -96px -128px; }
|
||||
.ui-icon-key { background-position: -112px -128px; }
|
||||
.ui-icon-lightbulb { background-position: -128px -128px; }
|
||||
.ui-icon-scissors { background-position: -144px -128px; }
|
||||
.ui-icon-clipboard { background-position: -160px -128px; }
|
||||
.ui-icon-copy { background-position: -176px -128px; }
|
||||
.ui-icon-contact { background-position: -192px -128px; }
|
||||
.ui-icon-image { background-position: -208px -128px; }
|
||||
.ui-icon-video { background-position: -224px -128px; }
|
||||
.ui-icon-script { background-position: -240px -128px; }
|
||||
.ui-icon-alert { background-position: 0 -144px; }
|
||||
.ui-icon-info { background-position: -16px -144px; }
|
||||
.ui-icon-notice { background-position: -32px -144px; }
|
||||
.ui-icon-help { background-position: -48px -144px; }
|
||||
.ui-icon-check { background-position: -64px -144px; }
|
||||
.ui-icon-bullet { background-position: -80px -144px; }
|
||||
.ui-icon-radio-on { background-position: -96px -144px; }
|
||||
.ui-icon-radio-off { background-position: -112px -144px; }
|
||||
.ui-icon-pin-w { background-position: -128px -144px; }
|
||||
.ui-icon-pin-s { background-position: -144px -144px; }
|
||||
.ui-icon-play { background-position: 0 -160px; }
|
||||
.ui-icon-pause { background-position: -16px -160px; }
|
||||
.ui-icon-seek-next { background-position: -32px -160px; }
|
||||
.ui-icon-seek-prev { background-position: -48px -160px; }
|
||||
.ui-icon-seek-end { background-position: -64px -160px; }
|
||||
.ui-icon-seek-start { background-position: -80px -160px; }
|
||||
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
|
||||
.ui-icon-seek-first { background-position: -80px -160px; }
|
||||
.ui-icon-stop { background-position: -96px -160px; }
|
||||
.ui-icon-eject { background-position: -112px -160px; }
|
||||
.ui-icon-volume-off { background-position: -128px -160px; }
|
||||
.ui-icon-volume-on { background-position: -144px -160px; }
|
||||
.ui-icon-power { background-position: 0 -176px; }
|
||||
.ui-icon-signal-diag { background-position: -16px -176px; }
|
||||
.ui-icon-signal { background-position: -32px -176px; }
|
||||
.ui-icon-battery-0 { background-position: -48px -176px; }
|
||||
.ui-icon-battery-1 { background-position: -64px -176px; }
|
||||
.ui-icon-battery-2 { background-position: -80px -176px; }
|
||||
.ui-icon-battery-3 { background-position: -96px -176px; }
|
||||
.ui-icon-circle-plus { background-position: 0 -192px; }
|
||||
.ui-icon-circle-minus { background-position: -16px -192px; }
|
||||
.ui-icon-circle-close { background-position: -32px -192px; }
|
||||
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
|
||||
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
|
||||
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
|
||||
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
|
||||
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
|
||||
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
|
||||
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
|
||||
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
|
||||
.ui-icon-circle-zoomin { background-position: -176px -192px; }
|
||||
.ui-icon-circle-zoomout { background-position: -192px -192px; }
|
||||
.ui-icon-circle-check { background-position: -208px -192px; }
|
||||
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
|
||||
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
|
||||
.ui-icon-circlesmall-close { background-position: -32px -208px; }
|
||||
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
|
||||
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
|
||||
.ui-icon-squaresmall-close { background-position: -80px -208px; }
|
||||
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
|
||||
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
|
||||
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
|
||||
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
|
||||
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
|
||||
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
|
||||
|
||||
|
||||
/* Misc visuals
|
||||
----------------------------------*/
|
||||
|
||||
/* Corner radius */
|
||||
.ui-corner-all,
|
||||
.ui-corner-top,
|
||||
.ui-corner-left,
|
||||
.ui-corner-tl {
|
||||
border-top-left-radius: 6px;
|
||||
}
|
||||
.ui-corner-all,
|
||||
.ui-corner-top,
|
||||
.ui-corner-right,
|
||||
.ui-corner-tr {
|
||||
border-top-right-radius: 6px;
|
||||
}
|
||||
.ui-corner-all,
|
||||
.ui-corner-bottom,
|
||||
.ui-corner-left,
|
||||
.ui-corner-bl {
|
||||
border-bottom-left-radius: 6px;
|
||||
}
|
||||
.ui-corner-all,
|
||||
.ui-corner-bottom,
|
||||
.ui-corner-right,
|
||||
.ui-corner-br {
|
||||
border-bottom-right-radius: 6px;
|
||||
}
|
||||
|
||||
/* Overlays */
|
||||
.ui-widget-overlay {
|
||||
background: #a6a6a6 url("images/ui-bg_dots-small_65_a6a6a6_2x2.png") 50% 50% repeat;
|
||||
opacity: .4;
|
||||
filter: Alpha(Opacity=40); /* support: IE8 */
|
||||
}
|
||||
.ui-widget-shadow {
|
||||
margin: -8px 0 0 -8px;
|
||||
padding: 8px;
|
||||
background: #333333 url("images/ui-bg_flat_0_333333_40x100.png") 50% 50% repeat-x;
|
||||
opacity: .1;
|
||||
filter: Alpha(Opacity=10); /* support: IE8 */
|
||||
border-radius: 8px;
|
||||
}
|
After Width: | Height: | Size: 351 B |
After Width: | Height: | Size: 261 B |
After Width: | Height: | Size: 389 B |
After Width: | Height: | Size: 375 B |
After Width: | Height: | Size: 385 B |
After Width: | Height: | Size: 371 B |
After Width: | Height: | Size: 288 B |
After Width: | Height: | Size: 426 B |
After Width: | Height: | Size: 348 B |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 6.3 KiB |
1225
www/lib/css/themes/jquery-ui/cupertino/jquery-ui.css
vendored
Normal file
7
www/lib/css/themes/jquery-ui/cupertino/jquery-ui.min.css
vendored
Normal file
410
www/lib/css/themes/jquery-ui/cupertino/theme.css
Normal file
@ -0,0 +1,410 @@
|
||||
/*!
|
||||
* jQuery UI CSS Framework 1.11.2
|
||||
* http://jqueryui.com
|
||||
*
|
||||
* Copyright 2014 jQuery Foundation and other contributors
|
||||
* Released under the MIT license.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://api.jqueryui.com/category/theming/
|
||||
*
|
||||
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=deedf7&bgTextureHeader=highlight_soft&bgImgOpacityHeader=100&borderColorHeader=aed0ea&fcHeader=222222&iconColorHeader=72a7cf&bgColorContent=f2f5f7&bgTextureContent=highlight_hard&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=362b36&iconColorContent=72a7cf&bgColorDefault=d7ebf9&bgTextureDefault=glass&bgImgOpacityDefault=80&borderColorDefault=aed0ea&fcDefault=2779aa&iconColorDefault=3d80b3&bgColorHover=e4f1fb&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=74b2e2&fcHover=0070a3&iconColorHover=2694e8&bgColorActive=3baae3&bgTextureActive=glass&bgImgOpacityActive=50&borderColorActive=2694e8&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=ffef8f&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=25&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=cd0a0a&bgTextureError=flat&bgImgOpacityError=15&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=eeeeee&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=90&opacityOverlay=80&bgColorShadow=000000&bgTextureShadow=highlight_hard&bgImgOpacityShadow=70&opacityShadow=30&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
|
||||
*/
|
||||
|
||||
|
||||
/* Component containers
|
||||
----------------------------------*/
|
||||
.ui-widget {
|
||||
font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
.ui-widget .ui-widget {
|
||||
font-size: 1em;
|
||||
}
|
||||
.ui-widget input,
|
||||
.ui-widget select,
|
||||
.ui-widget textarea,
|
||||
.ui-widget button {
|
||||
font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
|
||||
font-size: 1em;
|
||||
}
|
||||
.ui-widget-content {
|
||||
border: 1px solid #dddddd;
|
||||
background: #f2f5f7 url("images/ui-bg_highlight-hard_100_f2f5f7_1x100.png") 50% top repeat-x;
|
||||
color: #362b36;
|
||||
}
|
||||
.ui-widget-content a {
|
||||
color: #362b36;
|
||||
}
|
||||
.ui-widget-header {
|
||||
border: 1px solid #aed0ea;
|
||||
background: #deedf7 url("images/ui-bg_highlight-soft_100_deedf7_1x100.png") 50% 50% repeat-x;
|
||||
color: #222222;
|
||||
font-weight: bold;
|
||||
}
|
||||
.ui-widget-header a {
|
||||
color: #222222;
|
||||
}
|
||||
|
||||
/* Interaction states
|
||||
----------------------------------*/
|
||||
.ui-state-default,
|
||||
.ui-widget-content .ui-state-default,
|
||||
.ui-widget-header .ui-state-default {
|
||||
border: 1px solid #aed0ea;
|
||||
background: #d7ebf9 url("images/ui-bg_glass_80_d7ebf9_1x400.png") 50% 50% repeat-x;
|
||||
font-weight: bold;
|
||||
color: #2779aa;
|
||||
}
|
||||
.ui-state-default a,
|
||||
.ui-state-default a:link,
|
||||
.ui-state-default a:visited {
|
||||
color: #2779aa;
|
||||
text-decoration: none;
|
||||
}
|
||||
.ui-state-hover,
|
||||
.ui-widget-content .ui-state-hover,
|
||||
.ui-widget-header .ui-state-hover,
|
||||
.ui-state-focus,
|
||||
.ui-widget-content .ui-state-focus,
|
||||
.ui-widget-header .ui-state-focus {
|
||||
border: 1px solid #74b2e2;
|
||||
background: #e4f1fb url("images/ui-bg_glass_100_e4f1fb_1x400.png") 50% 50% repeat-x;
|
||||
font-weight: bold;
|
||||
color: #0070a3;
|
||||
}
|
||||
.ui-state-hover a,
|
||||
.ui-state-hover a:hover,
|
||||
.ui-state-hover a:link,
|
||||
.ui-state-hover a:visited,
|
||||
.ui-state-focus a,
|
||||
.ui-state-focus a:hover,
|
||||
.ui-state-focus a:link,
|
||||
.ui-state-focus a:visited {
|
||||
color: #0070a3;
|
||||
text-decoration: none;
|
||||
}
|
||||
.ui-state-active,
|
||||
.ui-widget-content .ui-state-active,
|
||||
.ui-widget-header .ui-state-active {
|
||||
border: 1px solid #2694e8;
|
||||
background: #3baae3 url("images/ui-bg_glass_50_3baae3_1x400.png") 50% 50% repeat-x;
|
||||
font-weight: bold;
|
||||
color: #ffffff;
|
||||
}
|
||||
.ui-state-active a,
|
||||
.ui-state-active a:link,
|
||||
.ui-state-active a:visited {
|
||||
color: #ffffff;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* Interaction Cues
|
||||
----------------------------------*/
|
||||
.ui-state-highlight,
|
||||
.ui-widget-content .ui-state-highlight,
|
||||
.ui-widget-header .ui-state-highlight {
|
||||
border: 1px solid #f9dd34;
|
||||
background: #ffef8f url("images/ui-bg_highlight-soft_25_ffef8f_1x100.png") 50% top repeat-x;
|
||||
color: #363636;
|
||||
}
|
||||
.ui-state-highlight a,
|
||||
.ui-widget-content .ui-state-highlight a,
|
||||
.ui-widget-header .ui-state-highlight a {
|
||||
color: #363636;
|
||||
}
|
||||
.ui-state-error,
|
||||
.ui-widget-content .ui-state-error,
|
||||
.ui-widget-header .ui-state-error {
|
||||
border: 1px solid #cd0a0a;
|
||||
background: #cd0a0a url("images/ui-bg_flat_15_cd0a0a_40x100.png") 50% 50% repeat-x;
|
||||
color: #ffffff;
|
||||
}
|
||||
.ui-state-error a,
|
||||
.ui-widget-content .ui-state-error a,
|
||||
.ui-widget-header .ui-state-error a {
|
||||
color: #ffffff;
|
||||
}
|
||||
.ui-state-error-text,
|
||||
.ui-widget-content .ui-state-error-text,
|
||||
.ui-widget-header .ui-state-error-text {
|
||||
color: #ffffff;
|
||||
}
|
||||
.ui-priority-primary,
|
||||
.ui-widget-content .ui-priority-primary,
|
||||
.ui-widget-header .ui-priority-primary {
|
||||
font-weight: bold;
|
||||
}
|
||||
.ui-priority-secondary,
|
||||
.ui-widget-content .ui-priority-secondary,
|
||||
.ui-widget-header .ui-priority-secondary {
|
||||
opacity: .7;
|
||||
filter:Alpha(Opacity=70); /* support: IE8 */
|
||||
font-weight: normal;
|
||||
}
|
||||
.ui-state-disabled,
|
||||
.ui-widget-content .ui-state-disabled,
|
||||
.ui-widget-header .ui-state-disabled {
|
||||
opacity: .35;
|
||||
filter:Alpha(Opacity=35); /* support: IE8 */
|
||||
background-image: none;
|
||||
}
|
||||
.ui-state-disabled .ui-icon {
|
||||
filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
|
||||
}
|
||||
|
||||
/* Icons
|
||||
----------------------------------*/
|
||||
|
||||
/* states and images */
|
||||
.ui-icon {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
.ui-icon,
|
||||
.ui-widget-content .ui-icon {
|
||||
background-image: url("images/ui-icons_72a7cf_256x240.png");
|
||||
}
|
||||
.ui-widget-header .ui-icon {
|
||||
background-image: url("images/ui-icons_72a7cf_256x240.png");
|
||||
}
|
||||
.ui-state-default .ui-icon {
|
||||
background-image: url("images/ui-icons_3d80b3_256x240.png");
|
||||
}
|
||||
.ui-state-hover .ui-icon,
|
||||
.ui-state-focus .ui-icon {
|
||||
background-image: url("images/ui-icons_2694e8_256x240.png");
|
||||
}
|
||||
.ui-state-active .ui-icon {
|
||||
background-image: url("images/ui-icons_ffffff_256x240.png");
|
||||
}
|
||||
.ui-state-highlight .ui-icon {
|
||||
background-image: url("images/ui-icons_2e83ff_256x240.png");
|
||||
}
|
||||
.ui-state-error .ui-icon,
|
||||
.ui-state-error-text .ui-icon {
|
||||
background-image: url("images/ui-icons_ffffff_256x240.png");
|
||||
}
|
||||
|
||||
/* positioning */
|
||||
.ui-icon-blank { background-position: 16px 16px; }
|
||||
.ui-icon-carat-1-n { background-position: 0 0; }
|
||||
.ui-icon-carat-1-ne { background-position: -16px 0; }
|
||||
.ui-icon-carat-1-e { background-position: -32px 0; }
|
||||
.ui-icon-carat-1-se { background-position: -48px 0; }
|
||||
.ui-icon-carat-1-s { background-position: -64px 0; }
|
||||
.ui-icon-carat-1-sw { background-position: -80px 0; }
|
||||
.ui-icon-carat-1-w { background-position: -96px 0; }
|
||||
.ui-icon-carat-1-nw { background-position: -112px 0; }
|
||||
.ui-icon-carat-2-n-s { background-position: -128px 0; }
|
||||
.ui-icon-carat-2-e-w { background-position: -144px 0; }
|
||||
.ui-icon-triangle-1-n { background-position: 0 -16px; }
|
||||
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
|
||||
.ui-icon-triangle-1-e { background-position: -32px -16px; }
|
||||
.ui-icon-triangle-1-se { background-position: -48px -16px; }
|
||||
.ui-icon-triangle-1-s { background-position: -64px -16px; }
|
||||
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
|
||||
.ui-icon-triangle-1-w { background-position: -96px -16px; }
|
||||
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
|
||||
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
|
||||
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
|
||||
.ui-icon-arrow-1-n { background-position: 0 -32px; }
|
||||
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
|
||||
.ui-icon-arrow-1-e { background-position: -32px -32px; }
|
||||
.ui-icon-arrow-1-se { background-position: -48px -32px; }
|
||||
.ui-icon-arrow-1-s { background-position: -64px -32px; }
|
||||
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
|
||||
.ui-icon-arrow-1-w { background-position: -96px -32px; }
|
||||
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
|
||||
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
|
||||
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
|
||||
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
|
||||
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
|
||||
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
|
||||
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
|
||||
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
|
||||
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
|
||||
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
|
||||
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
|
||||
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
|
||||
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
|
||||
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
|
||||
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
|
||||
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
|
||||
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
|
||||
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
|
||||
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
|
||||
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
|
||||
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
|
||||
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
|
||||
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
|
||||
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
|
||||
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
|
||||
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
|
||||
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
|
||||
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
|
||||
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
|
||||
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
|
||||
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
|
||||
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
|
||||
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
|
||||
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
|
||||
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
|
||||
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
|
||||
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
|
||||
.ui-icon-arrow-4 { background-position: 0 -80px; }
|
||||
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
|
||||
.ui-icon-extlink { background-position: -32px -80px; }
|
||||
.ui-icon-newwin { background-position: -48px -80px; }
|
||||
.ui-icon-refresh { background-position: -64px -80px; }
|
||||
.ui-icon-shuffle { background-position: -80px -80px; }
|
||||
.ui-icon-transfer-e-w { background-position: -96px -80px; }
|
||||
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
|
||||
.ui-icon-folder-collapsed { background-position: 0 -96px; }
|
||||
.ui-icon-folder-open { background-position: -16px -96px; }
|
||||
.ui-icon-document { background-position: -32px -96px; }
|
||||
.ui-icon-document-b { background-position: -48px -96px; }
|
||||
.ui-icon-note { background-position: -64px -96px; }
|
||||
.ui-icon-mail-closed { background-position: -80px -96px; }
|
||||
.ui-icon-mail-open { background-position: -96px -96px; }
|
||||
.ui-icon-suitcase { background-position: -112px -96px; }
|
||||
.ui-icon-comment { background-position: -128px -96px; }
|
||||
.ui-icon-person { background-position: -144px -96px; }
|
||||
.ui-icon-print { background-position: -160px -96px; }
|
||||
.ui-icon-trash { background-position: -176px -96px; }
|
||||
.ui-icon-locked { background-position: -192px -96px; }
|
||||
.ui-icon-unlocked { background-position: -208px -96px; }
|
||||
.ui-icon-bookmark { background-position: -224px -96px; }
|
||||
.ui-icon-tag { background-position: -240px -96px; }
|
||||
.ui-icon-home { background-position: 0 -112px; }
|
||||
.ui-icon-flag { background-position: -16px -112px; }
|
||||
.ui-icon-calendar { background-position: -32px -112px; }
|
||||
.ui-icon-cart { background-position: -48px -112px; }
|
||||
.ui-icon-pencil { background-position: -64px -112px; }
|
||||
.ui-icon-clock { background-position: -80px -112px; }
|
||||
.ui-icon-disk { background-position: -96px -112px; }
|
||||
.ui-icon-calculator { background-position: -112px -112px; }
|
||||
.ui-icon-zoomin { background-position: -128px -112px; }
|
||||
.ui-icon-zoomout { background-position: -144px -112px; }
|
||||
.ui-icon-search { background-position: -160px -112px; }
|
||||
.ui-icon-wrench { background-position: -176px -112px; }
|
||||
.ui-icon-gear { background-position: -192px -112px; }
|
||||
.ui-icon-heart { background-position: -208px -112px; }
|
||||
.ui-icon-star { background-position: -224px -112px; }
|
||||
.ui-icon-link { background-position: -240px -112px; }
|
||||
.ui-icon-cancel { background-position: 0 -128px; }
|
||||
.ui-icon-plus { background-position: -16px -128px; }
|
||||
.ui-icon-plusthick { background-position: -32px -128px; }
|
||||
.ui-icon-minus { background-position: -48px -128px; }
|
||||
.ui-icon-minusthick { background-position: -64px -128px; }
|
||||
.ui-icon-close { background-position: -80px -128px; }
|
||||
.ui-icon-closethick { background-position: -96px -128px; }
|
||||
.ui-icon-key { background-position: -112px -128px; }
|
||||
.ui-icon-lightbulb { background-position: -128px -128px; }
|
||||
.ui-icon-scissors { background-position: -144px -128px; }
|
||||
.ui-icon-clipboard { background-position: -160px -128px; }
|
||||
.ui-icon-copy { background-position: -176px -128px; }
|
||||
.ui-icon-contact { background-position: -192px -128px; }
|
||||
.ui-icon-image { background-position: -208px -128px; }
|
||||
.ui-icon-video { background-position: -224px -128px; }
|
||||
.ui-icon-script { background-position: -240px -128px; }
|
||||
.ui-icon-alert { background-position: 0 -144px; }
|
||||
.ui-icon-info { background-position: -16px -144px; }
|
||||
.ui-icon-notice { background-position: -32px -144px; }
|
||||
.ui-icon-help { background-position: -48px -144px; }
|
||||
.ui-icon-check { background-position: -64px -144px; }
|
||||
.ui-icon-bullet { background-position: -80px -144px; }
|
||||
.ui-icon-radio-on { background-position: -96px -144px; }
|
||||
.ui-icon-radio-off { background-position: -112px -144px; }
|
||||
.ui-icon-pin-w { background-position: -128px -144px; }
|
||||
.ui-icon-pin-s { background-position: -144px -144px; }
|
||||
.ui-icon-play { background-position: 0 -160px; }
|
||||
.ui-icon-pause { background-position: -16px -160px; }
|
||||
.ui-icon-seek-next { background-position: -32px -160px; }
|
||||
.ui-icon-seek-prev { background-position: -48px -160px; }
|
||||
.ui-icon-seek-end { background-position: -64px -160px; }
|
||||
.ui-icon-seek-start { background-position: -80px -160px; }
|
||||
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
|
||||
.ui-icon-seek-first { background-position: -80px -160px; }
|
||||
.ui-icon-stop { background-position: -96px -160px; }
|
||||
.ui-icon-eject { background-position: -112px -160px; }
|
||||
.ui-icon-volume-off { background-position: -128px -160px; }
|
||||
.ui-icon-volume-on { background-position: -144px -160px; }
|
||||
.ui-icon-power { background-position: 0 -176px; }
|
||||
.ui-icon-signal-diag { background-position: -16px -176px; }
|
||||
.ui-icon-signal { background-position: -32px -176px; }
|
||||
.ui-icon-battery-0 { background-position: -48px -176px; }
|
||||
.ui-icon-battery-1 { background-position: -64px -176px; }
|
||||
.ui-icon-battery-2 { background-position: -80px -176px; }
|
||||
.ui-icon-battery-3 { background-position: -96px -176px; }
|
||||
.ui-icon-circle-plus { background-position: 0 -192px; }
|
||||
.ui-icon-circle-minus { background-position: -16px -192px; }
|
||||
.ui-icon-circle-close { background-position: -32px -192px; }
|
||||
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
|
||||
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
|
||||
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
|
||||
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
|
||||
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
|
||||
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
|
||||
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
|
||||
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
|
||||
.ui-icon-circle-zoomin { background-position: -176px -192px; }
|
||||
.ui-icon-circle-zoomout { background-position: -192px -192px; }
|
||||
.ui-icon-circle-check { background-position: -208px -192px; }
|
||||
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
|
||||
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
|
||||
.ui-icon-circlesmall-close { background-position: -32px -208px; }
|
||||
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
|
||||
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
|
||||
.ui-icon-squaresmall-close { background-position: -80px -208px; }
|
||||
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
|
||||
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
|
||||
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
|
||||
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
|
||||
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
|
||||
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
|
||||
|
||||
|
||||
/* Misc visuals
|
||||
----------------------------------*/
|
||||
|
||||
/* Corner radius */
|
||||
.ui-corner-all,
|
||||
.ui-corner-top,
|
||||
.ui-corner-left,
|
||||
.ui-corner-tl {
|
||||
border-top-left-radius: 6px;
|
||||
}
|
||||
.ui-corner-all,
|
||||
.ui-corner-top,
|
||||
.ui-corner-right,
|
||||
.ui-corner-tr {
|
||||
border-top-right-radius: 6px;
|
||||
}
|
||||
.ui-corner-all,
|
||||
.ui-corner-bottom,
|
||||
.ui-corner-left,
|
||||
.ui-corner-bl {
|
||||
border-bottom-left-radius: 6px;
|
||||
}
|
||||
.ui-corner-all,
|
||||
.ui-corner-bottom,
|
||||
.ui-corner-right,
|
||||
.ui-corner-br {
|
||||
border-bottom-right-radius: 6px;
|
||||
}
|
||||
|
||||
/* Overlays */
|
||||
.ui-widget-overlay {
|
||||
background: #eeeeee url("images/ui-bg_diagonals-thick_90_eeeeee_40x40.png") 50% 50% repeat;
|
||||
opacity: .8;
|
||||
filter: Alpha(Opacity=80); /* support: IE8 */
|
||||
}
|
||||
.ui-widget-shadow {
|
||||
margin: -7px 0 0 -7px;
|
||||
padding: 7px;
|
||||
background: #000000 url("images/ui-bg_highlight-hard_70_000000_1x100.png") 50% top repeat-x;
|
||||
opacity: .3;
|
||||
filter: Alpha(Opacity=30); /* support: IE8 */
|
||||
border-radius: 8px;
|
||||
}
|
After Width: | Height: | Size: 260 B |
After Width: | Height: | Size: 316 B |
After Width: | Height: | Size: 278 B |
After Width: | Height: | Size: 355 B |
After Width: | Height: | Size: 276 B |
After Width: | Height: | Size: 6.8 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 6.8 KiB |