This commit is contained in:
opi 2016-07-21 10:56:01 +00:00 committed by GitHub
commit 4d31a1d1b8
8 changed files with 99 additions and 71 deletions

View file

@ -5,41 +5,30 @@ JS client for YunoHost API
**Please report issues here** (no registration needed): **Please report issues here** (no registration needed):
https://dev.yunohost.org/projects/yunohost/issues https://dev.yunohost.org/projects/yunohost/issues
## Installation ## Installation
This client is a part of the YunoHost projet, and can not be installed This client is a part of the YunoHost projet, and can not be installed directly. Please visit [YunoHost website](https://yunohost.org) for more information.
directly. Please visit [YunoHost website](https://yunohost.org) for
more information.
## Contributing ## Contributing
Feel free to improve the plugin and send us a pull request. Feel free to improve the plugin and send us a pull request.
We use gulp to compile Less files and minify the JavaScript. We use `gulp` to compile Less files and minify the JavaScript. Assuming [nodejs](http://nodejs.org/) is installed, you can install dependencies and run a build with:
Assuming [nodejs](http://nodejs.org/) is installed, you can run a
build with:
```sh ```sh
cd src cd src
npm install npm install
npm install -g bower npm run build
bower install
npm install -g gulp
gulp build
``` ```
Alternatively you can pas the `--dev` option to gulp which improve building
speed by bypassing compression tasks.
On a YunoHost instance, the web admin files are located at Alternatively you can run `npm run build-dev` which improves building speed by bypassing compression tasks.
`/usr/share/yunohost/admin`.
On a YunoHost instance, the web admin files are located at `/usr/share/yunohost/admin`.
**Note:** The `.ms` - moustache - files are cached by the browser. You have to **Note:** The `.ms` - moustache - files are cached by the browser. You have to
reach them manually some times you modify them. (e.g. go to reach them manually some times you modify them. (e.g. go to
https://example.com/yunohost/admin/views/domain/domain_list.ms) https://example.com/yunohost/admin/views/domain/domain_list.ms)
## Dependencies ## Dependencies
* Bootstrap 3.3.6 * Bootstrap 3.3.6

View file

@ -96,10 +96,6 @@ button {
padding: 5px; padding: 5px;
} }
.move {
transition: margin-left 0.2s ease-in-out;
}
.placehold { .placehold {
font-size: 0.0001em; font-size: 0.0001em;
color: transparent; color: transparent;
@ -196,12 +192,18 @@ button {
width: 200%; width: 200%;
height: 100%; height: 100%;
min-height: 150px; min-height: 150px;
transition: margin-left 0.15s ease-in-out;
} }
#slideBack, #slideTo, #main { #slideBack, #slideTo, #main {
.block; .block;
} }
#slideTo, #slideBack {
// Force left & right pane height to 1px (prevent empty space before footer).
height: 1px;
}
/* /*
* The main part of the app * The main part of the app
* *
@ -215,6 +217,26 @@ button {
} }
/*
* Page footer
*
*/
.page-footer {
.clearfix;
.make-row(12);
margin: 20px 0;
padding-top: 20px;
border-top: 1px solid #eee;
color: #999;
font-size: 0.9em;
text-align: right;
a {
color: #666;
&:hover,
&:focus {text-decoration: underline;}
}
}
/* /*
* The pop up dialog * The pop up dialog
* *

View file

@ -54,6 +54,10 @@
<div id="slideTo" style="display: none; z-index: 100;"></div> <div id="slideTo" style="display: none; z-index: 100;"></div>
</div><!--/#slider-container--> </div><!--/#slider-container-->
<footer class="page-footer">
<p id="yunohost-version"></p>
</footer>
</div> </div>
<div id="modal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> <div id="modal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true">

View file

@ -104,13 +104,21 @@
// Input with choices becomes select list // Input with choices becomes select list
if (typeof data.manifest.arguments.install[k].choices !== 'undefined') { if (typeof data.manifest.arguments.install[k].choices !== 'undefined') {
// Update choices values with key and checked data // Update choices values with key and checked data
var choices = []
$.each(data.manifest.arguments.install[k].choices, function(ck, cv){ $.each(data.manifest.arguments.install[k].choices, function(ck, cv){
data.manifest.arguments.install[k].choices[ck] = { // Non key/value choices have numeric key, that we don't want.
value: cv, if (typeof ck == "number") {
// Key is Value in this case.
ck = cv;
}
choices.push({
value: ck,
label: cv, label: cv,
selected: (cv == data.manifest.arguments.install[k].default) ? true : false, selected: (ck == data.manifest.arguments.install[k].default) ? true : false,
};
}); });
});
data.manifest.arguments.install[k].choices = choices;
} }
// Special case for domain input. // Special case for domain input.

View file

@ -180,18 +180,24 @@
view: function (view, data, callback, enableSlide) { view: function (view, data, callback, enableSlide) {
c = this; c = this;
// Default
callback = typeof callback !== 'undefined' ? callback : function() {}; callback = typeof callback !== 'undefined' ? callback : function() {};
rendered = this.render('views/'+ view +'.ms', data);
enableSlide = (typeof enableSlide !== 'undefined') ? enableSlide : true; // Change to false to disable animation enableSlide = (typeof enableSlide !== 'undefined') ? enableSlide : true; // Change to false to disable animation
loaded = true; loaded = true;
// Hide loader and modal
$('div.loader').remove(); $('div.loader').remove();
$('#modal').modal('hide'); $('#modal').modal('hide');
if (enableSlide) { // Render content
rendered = this.render('views/'+ view +'.ms', data);
// Update content helper
var leSwap = function() { var leSwap = function() {
rendered.swap(function() { rendered.swap(function() {
// Slide direction
if (enableSlide) {
$('.slide, .btn-breadcrumb a:not(:last-child)').on('click', function() { $('.slide, .btn-breadcrumb a:not(:last-child)').on('click', function() {
$(this).addClass('active'); $(this).addClass('active');
if ($(this).hasClass('back') || $(this).parent('.btn-breadcrumb').length) { if ($(this).hasClass('back') || $(this).parent('.btn-breadcrumb').length) {
@ -200,54 +206,40 @@
store.set('slide', 'to'); store.set('slide', 'to');
} }
}); });
}
// Paste <pre> helper // Paste <pre> helper
c.prePaste(); c.prePaste();
// Run callback // Run callback
callback(); callback();
// Force scrollTop on page load // Force scrollTop on page load
$('html, body').scrollTop(0); $('html, body').scrollTop(0);
// Resize body after the animation finishes (0.2s css transition)
// https://github.com/YunoHost/yunohost-admin/blob/231aac076a3aa836409b0d33fe02e48975990b7a/src/css/style.less#L92
setTimeout(function() {
$('body').resize();
}, 210);
}); });
}; };
blockSize = $('#slider').width();
// Slide back effect // Slide back effect
if (store.get('slide') == 'back') { if (enableSlide && store.get('slide') == 'back') {
store.clear('slide'); store.clear('slide');
$('#slideBack').css('display', 'none'); $('#slideBack').css('display', 'none');
$('#slider-container').removeClass('move').css('margin-left', '-100%'); $('#slider-container').css('margin-left', '-100%');
$('#slideTo').show().html($('#main').html()); $('#slideTo').show().html($('#main').html());
leSwap(); leSwap();
$('#slider-container').addClass('move').css('margin-left', '0px'); $('#slider-container').css('margin-left', '0px');
}
// Slide to effect // Slide to effect
} else if (store.get('slide') == 'to') { else if (enableSlide && store.get('slide') == 'to') {
store.clear('slide'); store.clear('slide');
$('#slideTo').css('display', 'none'); $('#slideTo').css('display', 'none');
$('#slider-container').removeClass('move').css('margin-left', '0px'); $('#slider-container').css('margin-left', '0px');
$('#slideBack').show().html($('#main').html()); $('#slideBack').show().html($('#main').html());
leSwap(); leSwap();
$('#slider-container').addClass('move').css('margin-left', '-100%'); $('#slider-container').css('margin-left', '-100%');
} else {
leSwap();
} }
} else { // No slideing effect
rendered.swap(function(){ else {
// Paste <pre> helper leSwap();
c.prePaste();
// Run callback
callback();
// Force scrollTop on page load
$('html, body').scrollTop(0);
$('body').resize();
});
} }
}, },

View file

@ -70,6 +70,11 @@
// Store url // Store url
sam.store.set('url', window.location.hostname + '/yunohost/api'); sam.store.set('url', window.location.hostname + '/yunohost/api');
// Get YunoHost version
this.api('/version', function(versions) {
$('#yunohost-version').html(y18n.t('footer_version', [versions.yunohost]));
});
// Flash messages // Flash messages
var flashMessage = $('#flashMessage'); var flashMessage = $('#flashMessage');
$('#toggle-btn', flashMessage).click(function(e) { $('#toggle-btn', flashMessage).click(function(e) {

View file

@ -120,6 +120,7 @@
"everyone_has_access": "Everyone has access.", "everyone_has_access": "Everyone has access.",
"filesystem": "Filesystem", "filesystem": "Filesystem",
"firewall": "Firewall", "firewall": "Firewall",
"footer_version" : "Powered by <a href='https://yunohost.org'>YunoHost</a> %s.",
"form_input_example" : "Example: %s", "form_input_example" : "Example: %s",
"free": "Free", "free": "Free",
"fs_type": "FS Type", "fs_type": "FS Type",

View file

@ -5,6 +5,13 @@
"type": "git", "type": "git",
"url": "https://github.com/YunoHost/yunohost-admin" "url": "https://github.com/YunoHost/yunohost-admin"
}, },
"scripts": {
"postinstall": "bower install",
"build": "gulp build",
"build-dev": "gulp build --dev",
"watch": "gulp watch",
"watch-dev": "gulp watch --dev"
},
"author": "Yunohost", "author": "Yunohost",
"license": "AGPL-3.0", "license": "AGPL-3.0",
"bugs": { "bugs": {