refactoring of the import UI is done
This commit is contained in:
parent
bbf0b0e083
commit
8271782284
@ -0,0 +1,47 @@
|
|||||||
|
Locomotive.Views.Import ||= {}
|
||||||
|
|
||||||
|
class Locomotive.Views.Import.ShowView extends Backbone.View
|
||||||
|
|
||||||
|
el: '#content'
|
||||||
|
|
||||||
|
render: ->
|
||||||
|
super
|
||||||
|
|
||||||
|
@enable_updating()
|
||||||
|
|
||||||
|
enable_updating: ->
|
||||||
|
@updater = @$('#import-steps').smartupdater
|
||||||
|
url : @$('#import-steps').attr('data-url')
|
||||||
|
dataType: 'json'
|
||||||
|
minTimeout: 300,
|
||||||
|
@refresh_steps
|
||||||
|
|
||||||
|
refresh_steps: (data) =>
|
||||||
|
console.log 'refresh_steps: ....'
|
||||||
|
window.foo = data
|
||||||
|
window.bar = @
|
||||||
|
|
||||||
|
if data.step == 'done'
|
||||||
|
$('#import-steps li').addClass('done')
|
||||||
|
$.growl 'notice', @$('#import-steps').attr('data-success-message')
|
||||||
|
else
|
||||||
|
steps = ['site', 'content_types', 'assets', 'snippets', 'pages']
|
||||||
|
current_index = steps.indexOf(data.step) || 0
|
||||||
|
|
||||||
|
_.each steps, (step, index) =>
|
||||||
|
state = null
|
||||||
|
|
||||||
|
if index == current_index + 1 && data.failed then state = 'failed'
|
||||||
|
if (index <= current_index) then state = 'done'
|
||||||
|
|
||||||
|
@$("#import-steps li:eq(#{index})").addClass(state) if state?
|
||||||
|
|
||||||
|
if data.failed
|
||||||
|
$.growl 'alert', @$('#import-steps').attr('data-failure-message')
|
||||||
|
|
||||||
|
if data.step == 'done' || data.failed
|
||||||
|
@updater.smartupdater('stop')
|
||||||
|
|
||||||
|
remove: ->
|
||||||
|
super
|
||||||
|
@updater.smartupdater('stop') if @updater?
|
@ -325,18 +325,21 @@ ul.list {
|
|||||||
margin: 0px 200px;
|
margin: 0px 200px;
|
||||||
|
|
||||||
li {
|
li {
|
||||||
strong a { color: #b7baca; }
|
strong {
|
||||||
|
margin-left: 18px;
|
||||||
|
color: #b7baca;
|
||||||
|
}
|
||||||
|
|
||||||
.more .states {
|
.more .states {
|
||||||
position: relative;
|
position: relative;
|
||||||
top: 4px;
|
top: 7px;
|
||||||
height: 16px;
|
height: 16px;
|
||||||
width: 16px;
|
width: 16px;
|
||||||
background: transparent image-url("locomotive/list/icons/states.png") no-repeat 0 0;
|
background: transparent image-url("locomotive/list/icons/states.png") no-repeat 0 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.done {
|
&.done {
|
||||||
strong a { color: #1F82BC; }
|
strong { color: #1F82BC; }
|
||||||
|
|
||||||
.more .states {
|
.more .states {
|
||||||
background-position: 0 -16px;
|
background-position: 0 -16px;
|
||||||
|
@ -7,6 +7,8 @@ module Locomotive
|
|||||||
|
|
||||||
before_filter :authorize_import
|
before_filter :authorize_import
|
||||||
|
|
||||||
|
respond_to :json, :only => :show
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@import = Locomotive::Import::Model.current(current_site)
|
@import = Locomotive::Import::Model.current(current_site)
|
||||||
respond_with @import
|
respond_with @import
|
||||||
@ -30,36 +32,3 @@ module Locomotive
|
|||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# begin
|
|
||||||
# Locomotive::Import::Job.run!(params[:zipfile], current_site, {
|
|
||||||
# :samples => Boolean.set(params[:samples]),
|
|
||||||
# :reset => Boolean.set(params[:reset])
|
|
||||||
# })
|
|
||||||
#
|
|
||||||
# flash[:notice] = t("fash.locomotive.import.create.#{Locomotive.config.delayed_job ? 'notice' : 'done'}")
|
|
||||||
#
|
|
||||||
# redirect_to Locomotive.config.delayed_job ? import_url : new_import_url
|
|
||||||
# rescue Exception => e
|
|
||||||
# logger.error "[Locomotive import] #{e.message} / #{e.backtrace}"
|
|
||||||
#
|
|
||||||
# @error = e.message
|
|
||||||
# flash[:alert] = t('fash.locomotive.import.create.alert')
|
|
||||||
#
|
|
||||||
# render 'new'
|
|
||||||
# end
|
|
||||||
|
|
||||||
# def show
|
|
||||||
# @job = Delayed::Job.where({ :job_type => 'import', :site_id => current_site.id }).last
|
|
||||||
#
|
|
||||||
# respond_to do |format|
|
|
||||||
# format.html do
|
|
||||||
# redirect_to new_import_url if @job.nil?
|
|
||||||
# end
|
|
||||||
# format.json { render :json => {
|
|
||||||
# :step => @job.nil? ? 'done' : @job.step,
|
|
||||||
# :failed => @job && @job.last_error.present?
|
|
||||||
# } }
|
|
||||||
# end
|
|
||||||
# end
|
|
@ -3,7 +3,7 @@ module Locomotive
|
|||||||
|
|
||||||
sections 'settings'
|
sections 'settings'
|
||||||
|
|
||||||
respond_to :json, :only => [:create]
|
respond_to :json, :only => [:create, :destroy]
|
||||||
|
|
||||||
def new
|
def new
|
||||||
@site = Site.new
|
@site = Site.new
|
||||||
|
@ -1,6 +1,3 @@
|
|||||||
- content_for :head do
|
|
||||||
= include_javascripts :import
|
|
||||||
|
|
||||||
- title t('.title')
|
- title t('.title')
|
||||||
|
|
||||||
- content_for :submenu do
|
- content_for :submenu do
|
||||||
@ -10,7 +7,7 @@
|
|||||||
|
|
||||||
%ul{ :id => 'import-steps', :class => 'list', :'data-url' => import_url(:json), :'data-success-message' => t('.messages.success'), :'data-failure-message' => t('.messages.failure') }
|
%ul{ :id => 'import-steps', :class => 'list', :'data-url' => import_url(:json), :'data-success-message' => t('.messages.success'), :'data-failure-message' => t('.messages.failure') }
|
||||||
- %w(site content_types assets snippets pages).each do |step|
|
- %w(site content_types assets snippets pages).each do |step|
|
||||||
%li{ :id => "#{step}-step" }
|
%li.item{ :id => "#{step}-step" }
|
||||||
%strong= t(".steps.#{step}")
|
%strong= t(".steps.#{step}")
|
||||||
.more
|
.more
|
||||||
.states
|
.states
|
||||||
|
5
doc/TODO
5
doc/TODO
@ -29,9 +29,8 @@ x edit my site
|
|||||||
x snippets
|
x snippets
|
||||||
x delete in ajax
|
x delete in ajax
|
||||||
x upload many files at once
|
x upload many files at once
|
||||||
- import/export
|
x import/export
|
||||||
- export
|
x export
|
||||||
- replace DJ by QU
|
|
||||||
- site picker
|
- site picker
|
||||||
- content types
|
- content types
|
||||||
- change in main menu
|
- change in main menu
|
||||||
|
@ -47,15 +47,14 @@ module Locomotive
|
|||||||
|
|
||||||
self.reset! if @options[:reset]
|
self.reset! if @options[:reset]
|
||||||
|
|
||||||
# %w(site content_types content_assets snippets pages).each do |step|
|
# %w(site content_types assets snippets pages).each do |step|
|
||||||
%w(site assets snippets pages).each do |step|
|
%w(site assets snippets pages).each do |step| # TODO (Did): unable content_types for now, waiting for its refactoring
|
||||||
if @options[:enabled][step] != false
|
if @options[:enabled][step] != false
|
||||||
"Locomotive::Import::#{step.camelize}".constantize.process(context, @options)
|
"Locomotive::Import::#{step.camelize}".constantize.process(context, @options)
|
||||||
@worker.update_attributes :step => step if @worker
|
@worker.update_attributes :step => step if @worker
|
||||||
else
|
else
|
||||||
self.log "skipping #{step}"
|
self.log "skipping #{step}"
|
||||||
end
|
end
|
||||||
sleep 10 # FIXME DEBUG PURPOSE
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -41,7 +41,6 @@ module Locomotive
|
|||||||
## class methods ##
|
## class methods ##
|
||||||
|
|
||||||
def self.create(attributes = {})
|
def self.create(attributes = {})
|
||||||
puts attributes.inspect
|
|
||||||
new(attributes).tap do |job|
|
new(attributes).tap do |job|
|
||||||
if job.valid?
|
if job.valid?
|
||||||
begin
|
begin
|
||||||
@ -61,6 +60,15 @@ module Locomotive
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.current(site)
|
||||||
|
job = Delayed::Job.where({ :job_type => 'import', :site_id => site.id }).last
|
||||||
|
|
||||||
|
{
|
||||||
|
:step => job.nil? ? 'done' : job.step,
|
||||||
|
:failed => job && job.last_error.present?
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
def self.name
|
def self.name
|
||||||
'Import'
|
'Import'
|
||||||
end
|
end
|
||||||
|
296
vendor/assets/javascripts/smartupdater.js
vendored
Normal file
296
vendor/assets/javascripts/smartupdater.js
vendored
Normal file
@ -0,0 +1,296 @@
|
|||||||
|
/**
|
||||||
|
* smartupdater - jQuery Plugin
|
||||||
|
*
|
||||||
|
* Version - 4.0.beta
|
||||||
|
* Copyright (c) 2010 - 2011 Vadim Kiryukhin
|
||||||
|
* vkiryukhin @ gmail.com
|
||||||
|
*
|
||||||
|
* http://www.eslinstructor.net/smartupdater/
|
||||||
|
*
|
||||||
|
* Dual licensed under the MIT and GPL licenses:
|
||||||
|
* http://www.opensource.org/licenses/mit-license.php
|
||||||
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
|
*
|
||||||
|
* USAGE:
|
||||||
|
*
|
||||||
|
* $("#myObject").smartupdater({
|
||||||
|
* url : "foo.php"
|
||||||
|
* }, function (data) {
|
||||||
|
* //process data here;
|
||||||
|
* }
|
||||||
|
* );
|
||||||
|
*
|
||||||
|
* Public functions:
|
||||||
|
* $("#myObject").smartupdater("stop")
|
||||||
|
* $("#myObject").smartupdater("restart");
|
||||||
|
* $("#myObject").smartupdater("setTimeout",timeout);
|
||||||
|
* $("#myObject").smartupdater("alterUrl"[,"foo.php"[,data]]);
|
||||||
|
* $("#myObject").smartupdater("alterCallback"[, foo]);
|
||||||
|
*
|
||||||
|
* Public Attributes:
|
||||||
|
* var status = $("#myObject").smartupdater("getState");
|
||||||
|
* var timeout = $("#myObject").smartupdater("getTimeout");
|
||||||
|
*
|
||||||
|
**/
|
||||||
|
|
||||||
|
(function($) {
|
||||||
|
|
||||||
|
|
||||||
|
var methods = {
|
||||||
|
|
||||||
|
init : function( options, callback) {
|
||||||
|
return this.each(function () {
|
||||||
|
var elem = this,
|
||||||
|
es = {};
|
||||||
|
|
||||||
|
elem.settings = jQuery.extend(true,{
|
||||||
|
url : '', // see jQuery.ajax for details
|
||||||
|
type : 'get', // see jQuery.ajax for details
|
||||||
|
data : '', // see jQuery.ajax for details
|
||||||
|
dataType : 'text', // see jQuery.ajax for details
|
||||||
|
|
||||||
|
minTimeout : 60000, // 1 minute
|
||||||
|
maxFailedRequests : 10, // max. number of consecutive ajax failures
|
||||||
|
maxFailedRequestsCb : false, // falure callback function
|
||||||
|
httpCache : false, // http cache
|
||||||
|
rCallback : false, // remote callback functions
|
||||||
|
selfStart : true, // start automatically after initializing
|
||||||
|
smartStop : { active: false, //disabled by default
|
||||||
|
monitorTimeout: 2500, // 2.5 seconds
|
||||||
|
minHeight: 1, // 1px
|
||||||
|
minWidth: 1 // 1px
|
||||||
|
}
|
||||||
|
|
||||||
|
}, options);
|
||||||
|
|
||||||
|
elem.smartupdaterStatus = {state:'',timeout:0};
|
||||||
|
|
||||||
|
es = elem.settings;
|
||||||
|
|
||||||
|
es.prevContent = '';
|
||||||
|
es.failedRequests = 0;
|
||||||
|
es.etag = '0';
|
||||||
|
es.lastModified = '0';
|
||||||
|
es.callback = callback;
|
||||||
|
es.origReq = {url:es.url,data:es.data,callback:callback};
|
||||||
|
es.stopFlag = false;
|
||||||
|
|
||||||
|
|
||||||
|
function start() {
|
||||||
|
|
||||||
|
/* check if element has been deleted and clean it up */
|
||||||
|
if(!$(elem).parents('body').length) {
|
||||||
|
clearInterval(elem.smartupdaterStatus.smartStop);
|
||||||
|
clearTimeout(elem.settings.h);
|
||||||
|
elem = {};
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url : es.url,
|
||||||
|
type : es.type,
|
||||||
|
data : es.data,
|
||||||
|
dataType: es.dataType,
|
||||||
|
cache : false, // MUST be set to false to prevent IE caching issue.
|
||||||
|
|
||||||
|
success: function (data, statusText, xhr) {
|
||||||
|
|
||||||
|
var dataNotModified = false,
|
||||||
|
rCallback = false,
|
||||||
|
xSmart = jQuery.parseJSON(xhr.getResponseHeader("X-Smartupdater")),
|
||||||
|
xhrEtag, xhrLM;
|
||||||
|
|
||||||
|
if(xSmart) { // remote control
|
||||||
|
|
||||||
|
/* remote timeout */
|
||||||
|
es.minTimeout = xSmart.timeout ? xSmart.timeout : es.minTimeout;
|
||||||
|
|
||||||
|
/* remote callback */
|
||||||
|
rCallback = xSmart.callback ? xSmart.callback : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(es.httpCache) { // http cache process here
|
||||||
|
|
||||||
|
xhrEtag = xhr.getResponseHeader("ETag");
|
||||||
|
xhrLM = xhr.getResponseHeader("Last-Modified");
|
||||||
|
|
||||||
|
dataNotModified = (es.etag == xhrEtag || es.lastModified == xhrLM) ? true : false;
|
||||||
|
es.etag = xhrEtag ? xhrEtag : es.etag;
|
||||||
|
es.lastModified = xhrLM ? xhrLM : es.lastModified;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( dataNotModified ||
|
||||||
|
es.prevContent == xhr.responseText ||
|
||||||
|
xhr.status == 304 ) { // data is not changed
|
||||||
|
|
||||||
|
if(!es.stopFlag) {
|
||||||
|
clearTimeout(es.h);
|
||||||
|
es.h = setTimeout(start, es.minTimeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else { // data is changed
|
||||||
|
|
||||||
|
/* cache response data */
|
||||||
|
es.prevContent = xhr.responseText;
|
||||||
|
|
||||||
|
/* reset timeout */
|
||||||
|
if(!es.stopFlag) {
|
||||||
|
clearTimeout(es.h);
|
||||||
|
es.h = setTimeout(start, es.minTimeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* run callback function */
|
||||||
|
if(es.rCallback && rCallback && es.rCallback.search(rCallback) != -1) {
|
||||||
|
window[rCallback](data);
|
||||||
|
} else {
|
||||||
|
es.callback(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
elem.smartupdaterStatus.timeout = es.minTimeout;
|
||||||
|
es.failedRequests = 0;
|
||||||
|
},
|
||||||
|
|
||||||
|
error: function(xhr, textStatus, errorThrown) {
|
||||||
|
if ( ++es.failedRequests < es.maxFailedRequests ) {
|
||||||
|
|
||||||
|
/* increment falure counter and reset timeout */
|
||||||
|
if(!es.stopFlag) {
|
||||||
|
clearTimeout(es.h);
|
||||||
|
es.h = setTimeout(start, es.minTimeout);
|
||||||
|
elem.smartupdaterStatus.timeout = es.minTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
/* stop smartupdater */
|
||||||
|
clearTimeout(es.h);
|
||||||
|
elem.smartupdaterStatus.state = 'OFF';
|
||||||
|
if( typeof(es.maxFailedRequestsCb)==='function') {
|
||||||
|
es.maxFailedRequestsCb(xhr, textStatus, errorThrown);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeSend: function(xhr, settings) {
|
||||||
|
|
||||||
|
if(es.httpCache) {
|
||||||
|
|
||||||
|
/* set http cache-related headers */
|
||||||
|
xhr.setRequestHeader("If-None-Match", es.etag );
|
||||||
|
xhr.setRequestHeader("If-Modified-Since", es.lastModified );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Feedback: Smartupdater sends it's current timeout to server */
|
||||||
|
xhr.setRequestHeader("X-Smartupdater", '{"timeout":"'+elem.smartupdaterStatus.timeout+'"}');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
elem.smartupdaterStatus.state = 'ON';
|
||||||
|
}
|
||||||
|
|
||||||
|
es.fnStart = start;
|
||||||
|
|
||||||
|
if(es.selfStart) {
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(es.smartStop.active) {
|
||||||
|
|
||||||
|
elem.smartupdaterStatus.smartStop = setInterval(function(){
|
||||||
|
|
||||||
|
// check if object has been deleted
|
||||||
|
if(!$(elem).parents('body').length) {
|
||||||
|
clearInterval(elem.smartupdaterStatus.smartStop);
|
||||||
|
clearTimeout(elem.settings.h);
|
||||||
|
elem = {};
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var $elem = $(elem);
|
||||||
|
var width = $elem.width(),
|
||||||
|
height = $elem.height(),
|
||||||
|
hidden = $elem.is(":hidden");
|
||||||
|
|
||||||
|
//element has been expanded, so smartupdater should be re-started.
|
||||||
|
if(!hidden && height > es.smartStop.minHeight && width > es.smartStop.minWidth
|
||||||
|
&& elem.smartupdaterStatus.state=="OFF") {
|
||||||
|
$elem.smartupdater("restart");
|
||||||
|
} else
|
||||||
|
//element has been minimized, so smartupdater should be stopped.
|
||||||
|
if( (hidden || height <= es.smartStop.minHeight || width <= es.smartStop.minWidth)
|
||||||
|
&& elem.smartupdaterStatus.state=="ON") {
|
||||||
|
$elem.smartupdater("stop");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
},es.smartStop.monitorTimeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
},// init()
|
||||||
|
|
||||||
|
stop : function () {
|
||||||
|
return this.each(function () {
|
||||||
|
this.settings.stopFlag = true;
|
||||||
|
clearTimeout(this.settings.h);
|
||||||
|
this.smartupdaterStatus.state = 'OFF';
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
restart : function () {
|
||||||
|
return this.each(function () {
|
||||||
|
this.settings.stopFlag = false;
|
||||||
|
clearTimeout(this.settings.h);
|
||||||
|
this.settings.failedRequests = 0;
|
||||||
|
this.settings.etag = "0";
|
||||||
|
this.settings.lastModified = "0";
|
||||||
|
this.settings.fnStart();
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
setTimeout : function (period) {
|
||||||
|
return this.each(function () {
|
||||||
|
clearTimeout(this.settings.h);
|
||||||
|
this.settings.minTimeout = period;
|
||||||
|
this.settings.fnStart();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
alterCallback : function (callback) {
|
||||||
|
return this.each(function () {
|
||||||
|
this.settings.callback = callback ? callback : this.settings.origReq.callback;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
alterUrl : function (url,data) {
|
||||||
|
return this.each(function () {
|
||||||
|
this.settings.url = url ? url : this.settings.origReq.url;
|
||||||
|
this.settings.data = data ? data : this.settings.origReq.data;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
getTimeout : function () {
|
||||||
|
return this[0].smartupdaterStatus.timeout;
|
||||||
|
},
|
||||||
|
|
||||||
|
getState : function () {
|
||||||
|
return this[0].smartupdaterStatus.state;
|
||||||
|
}
|
||||||
|
|
||||||
|
}; //methods
|
||||||
|
|
||||||
|
jQuery.fn.smartupdater = function (options, callback) {
|
||||||
|
|
||||||
|
if ( methods[options] ) {
|
||||||
|
return methods[ options ].apply( this, Array.prototype.slice.call( arguments, 1 ));
|
||||||
|
} else if ( typeof options === 'object' || ! method ) {
|
||||||
|
return methods.init.apply( this, arguments );
|
||||||
|
} else {
|
||||||
|
$.error( 'Method ' + options + ' does not exist on jQuery.tooltip' );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
})(jQuery);
|
Loading…
Reference in New Issue
Block a user