Merge branch 'staging' of github.com:xwiki-labs/cryptpad into staging
This commit is contained in:
commit
5a4836fe6d
@ -131,7 +131,9 @@ define(function () {
|
|||||||
out.saveTemplatePrompt = "Choose a title for the template";
|
out.saveTemplatePrompt = "Choose a title for the template";
|
||||||
out.templateSaved = "Template saved!";
|
out.templateSaved = "Template saved!";
|
||||||
out.selectTemplate = "Select a template or press escape";
|
out.selectTemplate = "Select a template or press escape";
|
||||||
out.useTemplate = "You have available templates for that type of pad. Do you want to use one?";
|
out.useTemplate = "Start with a template?"; //Would you like to "You have available templates for this type of pad. Do you want to use one?";
|
||||||
|
out.useTemplateOK = 'Pick a template (Enter)';
|
||||||
|
out.useTemplateCancel = 'Start fresh (Esc)';
|
||||||
|
|
||||||
out.previewButtonTitle = "Display or hide the Markdown preview mode";
|
out.previewButtonTitle = "Display or hide the Markdown preview mode";
|
||||||
|
|
||||||
|
|||||||
@ -237,6 +237,7 @@ define([
|
|||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
$ok.focus();
|
$ok.focus();
|
||||||
UI.notify();
|
UI.notify();
|
||||||
|
if (!document.hasFocus()) { window.focus(); }
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -282,10 +283,11 @@ define([
|
|||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
input.select().focus();
|
input.select().focus();
|
||||||
UI.notify();
|
UI.notify();
|
||||||
|
if (!document.hasFocus()) { window.focus(); }
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
UI.confirm = function (msg, cb, opt, force, styleCB) {
|
UI.confirm = function (msg, cb, opt, force) {
|
||||||
cb = cb || function () {};
|
cb = cb || function () {};
|
||||||
opt = opt || {};
|
opt = opt || {};
|
||||||
|
|
||||||
@ -328,9 +330,10 @@ define([
|
|||||||
document.body.appendChild(frame);
|
document.body.appendChild(frame);
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
UI.notify();
|
UI.notify();
|
||||||
if (typeof(styleCB) === 'function') {
|
if (typeof(opt.done) === 'function') {
|
||||||
styleCB($ok.closest('.dialog'));
|
opt.done($ok.closest('.dialog'));
|
||||||
}
|
}
|
||||||
|
if (!document.hasFocus()) { window.focus(); }
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -19,38 +19,39 @@ define([
|
|||||||
if (typeof(realtime.getAuthDoc) !== 'function') {
|
if (typeof(realtime.getAuthDoc) !== 'function') {
|
||||||
return void console.error('improper use of this function');
|
return void console.error('improper use of this function');
|
||||||
}
|
}
|
||||||
|
|
||||||
window.setTimeout(function () {
|
window.setTimeout(function () {
|
||||||
if (realtime.getAuthDoc() === realtime.getUserDoc()) {
|
if (realtime.getAuthDoc() === realtime.getUserDoc()) {
|
||||||
return void cb();
|
return void cb();
|
||||||
} else {
|
} else {
|
||||||
realtime.onSettle(cb);
|
realtime.onSettle(cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (intr) { return; }
|
|
||||||
intr = window.setInterval(function () {
|
|
||||||
var l;
|
|
||||||
try {
|
|
||||||
l = realtime.getLag();
|
|
||||||
} catch (e) {
|
|
||||||
throw new Error("ChainPad.getLag() does not exist, please `bower update`");
|
|
||||||
}
|
|
||||||
if (l.lag < BAD_STATE_TIMEOUT || !connected) { return; }
|
|
||||||
realtime.abort();
|
|
||||||
// don't launch more than one popup
|
|
||||||
if (common.infiniteSpinnerDetected) { return; }
|
|
||||||
infiniteSpinnerHandlers.forEach(function (ish) { ish(); });
|
|
||||||
|
|
||||||
// inform the user their session is in a bad state
|
|
||||||
Cryptpad.confirm(Messages.realtime_unrecoverableError, function (yes) {
|
|
||||||
if (!yes) { return; }
|
|
||||||
window.parent.location.reload();
|
|
||||||
});
|
|
||||||
common.infiniteSpinnerDetected = true;
|
|
||||||
}, 2000);
|
|
||||||
}, 0);
|
}, 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
common.beginDetectingInfiniteSpinner = function (Cryptpad, realtime) {
|
||||||
|
if (intr) { return; }
|
||||||
|
intr = window.setInterval(function () {
|
||||||
|
var l;
|
||||||
|
try {
|
||||||
|
l = realtime.getLag();
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error("ChainPad.getLag() does not exist, please `bower update`");
|
||||||
|
}
|
||||||
|
if (l.lag < BAD_STATE_TIMEOUT || !connected) { return; }
|
||||||
|
realtime.abort();
|
||||||
|
// don't launch more than one popup
|
||||||
|
if (common.infiniteSpinnerDetected) { return; }
|
||||||
|
infiniteSpinnerHandlers.forEach(function (ish) { ish(); });
|
||||||
|
|
||||||
|
// inform the user their session is in a bad state
|
||||||
|
Cryptpad.confirm(Messages.realtime_unrecoverableError, function (yes) {
|
||||||
|
if (!yes) { return; }
|
||||||
|
window.parent.location.reload();
|
||||||
|
});
|
||||||
|
common.infiniteSpinnerDetected = true;
|
||||||
|
}, 2000);
|
||||||
|
};
|
||||||
|
|
||||||
common.onInfiniteSpinner = function (f) { infiniteSpinnerHandlers.push(f); };
|
common.onInfiniteSpinner = function (f) { infiniteSpinnerHandlers.push(f); };
|
||||||
|
|
||||||
common.setConnectionState = function (bool) {
|
common.setConnectionState = function (bool) {
|
||||||
|
|||||||
@ -1,6 +1,28 @@
|
|||||||
define([], function () {
|
define([], function () {
|
||||||
var Util = {};
|
var Util = {};
|
||||||
|
|
||||||
|
// If once is true, after the event has been fired, any further handlers which are
|
||||||
|
// registered will fire immediately, and this type of event cannot be fired twice.
|
||||||
|
Util.mkEvent = function (once) {
|
||||||
|
var handlers = [];
|
||||||
|
var fired = false;
|
||||||
|
return {
|
||||||
|
reg: function (cb) {
|
||||||
|
if (once && fired) { return void setTimeout(cb); }
|
||||||
|
handlers.push(cb);
|
||||||
|
},
|
||||||
|
unreg: function (cb) {
|
||||||
|
if (handlers.indexOf(cb) === -1) { throw new Error("Not registered"); }
|
||||||
|
handlers.splice(handlers.indexOf(cb), 1);
|
||||||
|
},
|
||||||
|
fire: function () {
|
||||||
|
if (fired) { return; }
|
||||||
|
fired = true;
|
||||||
|
handlers.forEach(function (h) { h(); });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
Util.find = function (map, path) {
|
Util.find = function (map, path) {
|
||||||
return (map && path.reduce(function (p, n) {
|
return (map && path.reduce(function (p, n) {
|
||||||
return typeof(p[n]) !== 'undefined' && p[n];
|
return typeof(p[n]) !== 'undefined' && p[n];
|
||||||
|
|||||||
@ -138,6 +138,10 @@ define([
|
|||||||
Realtime.whenRealtimeSyncs(common, realtime, cb);
|
Realtime.whenRealtimeSyncs(common, realtime, cb);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
common.beginDetectingInfiniteSpinner = function (realtime) {
|
||||||
|
Realtime.beginDetectingInfiniteSpinner(common, realtime);
|
||||||
|
};
|
||||||
|
|
||||||
// Userlist
|
// Userlist
|
||||||
common.createUserList = UserList.create;
|
common.createUserList = UserList.create;
|
||||||
|
|
||||||
|
|||||||
@ -15,11 +15,16 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
define([
|
define([
|
||||||
|
'/common/common-util.js',
|
||||||
|
'/customize/application_config.js',
|
||||||
'/bower_components/chainpad/chainpad.dist.js'
|
'/bower_components/chainpad/chainpad.dist.js'
|
||||||
], function () {
|
], function (Util, AppConfig) {
|
||||||
var ChainPad = window.ChainPad;
|
var ChainPad = window.ChainPad;
|
||||||
var module = { exports: {} };
|
var module = { exports: {} };
|
||||||
|
|
||||||
|
var badStateTimeout = typeof(AppConfig.badStateTimeout) === 'number' ?
|
||||||
|
AppConfig.badStateTimeout : 30000;
|
||||||
|
|
||||||
var verbose = function (x) { console.log(x); };
|
var verbose = function (x) { console.log(x); };
|
||||||
verbose = function () {}; // comment out to enable verbose logging
|
verbose = function () {}; // comment out to enable verbose logging
|
||||||
|
|
||||||
@ -44,9 +49,25 @@ define([
|
|||||||
var chainpad;
|
var chainpad;
|
||||||
var myID;
|
var myID;
|
||||||
var isReady = false;
|
var isReady = false;
|
||||||
|
var evConnected = Util.mkEvent(true);
|
||||||
|
var evInfiniteSpinner = Util.mkEvent(true);
|
||||||
|
|
||||||
|
window.setInterval(function () {
|
||||||
|
if (!chainpad || !myID) { return; }
|
||||||
|
var l;
|
||||||
|
try {
|
||||||
|
l = chainpad.getLag();
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error("ChainPad.getLag() does not exist, please `bower update`");
|
||||||
|
}
|
||||||
|
if (l.lag < badStateTimeout) { return; }
|
||||||
|
chainpad.abort();
|
||||||
|
evInfiniteSpinner.fire();
|
||||||
|
}, 2000);
|
||||||
|
|
||||||
sframeChan.on('EV_RT_DISCONNECT', function () {
|
sframeChan.on('EV_RT_DISCONNECT', function () {
|
||||||
isReady = false;
|
isReady = false;
|
||||||
|
if (chainpad) { chainpad.abort(); }
|
||||||
onConnectionChange({ state: false });
|
onConnectionChange({ state: false });
|
||||||
});
|
});
|
||||||
sframeChan.on('EV_RT_CONNECT', function (content) {
|
sframeChan.on('EV_RT_CONNECT', function (content) {
|
||||||
@ -55,6 +76,7 @@ define([
|
|||||||
isReady = false;
|
isReady = false;
|
||||||
if (chainpad) {
|
if (chainpad) {
|
||||||
// it's a reconnect
|
// it's a reconnect
|
||||||
|
if (chainpad) { chainpad.start(); }
|
||||||
onConnectionChange({ state: true, myId: myID });
|
onConnectionChange({ state: true, myId: myID });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -77,6 +99,7 @@ define([
|
|||||||
realtime: chainpad,
|
realtime: chainpad,
|
||||||
readOnly: readOnly
|
readOnly: readOnly
|
||||||
});
|
});
|
||||||
|
evConnected.fire();
|
||||||
});
|
});
|
||||||
sframeChan.on('Q_RT_MESSAGE', function (content, cb) {
|
sframeChan.on('Q_RT_MESSAGE', function (content, cb) {
|
||||||
if (isReady) {
|
if (isReady) {
|
||||||
@ -92,9 +115,22 @@ define([
|
|||||||
setMyID({ myID: myID });
|
setMyID({ myID: myID });
|
||||||
onReady({ realtime: chainpad });
|
onReady({ realtime: chainpad });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var whenRealtimeSyncs = function (cb) {
|
||||||
|
evConnected.reg(function () {
|
||||||
|
if (chainpad.getAuthDoc() === chainpad.getUserDoc()) {
|
||||||
|
return void cb();
|
||||||
|
} else {
|
||||||
|
chainpad.onSettle(cb);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
return Object.freeze({
|
return Object.freeze({
|
||||||
getMyID: function () { return myID; },
|
getMyID: function () { return myID; },
|
||||||
metadataMgr: metadataMgr
|
metadataMgr: metadataMgr,
|
||||||
|
whenRealtimeSyncs: whenRealtimeSyncs,
|
||||||
|
onInfiniteSpinner: evInfiniteSpinner.reg
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
return Object.freeze(module.exports);
|
return Object.freeze(module.exports);
|
||||||
|
|||||||
@ -490,7 +490,10 @@ define([
|
|||||||
|
|
||||||
sframeChan.query("Q_TEMPLATE_EXIST", type, function (err, data) {
|
sframeChan.query("Q_TEMPLATE_EXIST", type, function (err, data) {
|
||||||
if (data) {
|
if (data) {
|
||||||
Cryptpad.confirm(Messages.useTemplate, onConfirm);
|
Cryptpad.confirm(Messages.useTemplate, onConfirm, {
|
||||||
|
ok: Messages.useTemplateOK,
|
||||||
|
cancel: Messages.useTemplateCancel,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@ -333,8 +333,16 @@ define([
|
|||||||
cb(hasTemplate);
|
cb(hasTemplate);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
sframeChan.on('EV_GOTO_URL', function (url) {
|
||||||
|
if (url) {
|
||||||
|
window.location.href = url;
|
||||||
|
} else {
|
||||||
|
window.location.reload();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
sframeChan.ready();
|
sframeChan.ready();
|
||||||
|
|
||||||
CpNfOuter.start({
|
CpNfOuter.start({
|
||||||
sframeChan: sframeChan,
|
sframeChan: sframeChan,
|
||||||
channel: secret.channel,
|
channel: secret.channel,
|
||||||
|
|||||||
@ -13,10 +13,25 @@ define([
|
|||||||
|
|
||||||
'/customize/application_config.js',
|
'/customize/application_config.js',
|
||||||
'/common/cryptpad-common.js',
|
'/common/cryptpad-common.js',
|
||||||
'/common/common-realtime.js'
|
'/common/common-realtime.js',
|
||||||
], function ($, nThen, Messages, CpNfInner, SFrameChannel, Title, UI, History, File, CodeMirror,
|
'/common/common-util.js'
|
||||||
|
], function (
|
||||||
|
$,
|
||||||
|
nThen,
|
||||||
|
Messages,
|
||||||
|
CpNfInner,
|
||||||
|
SFrameChannel,
|
||||||
|
Title,
|
||||||
|
UI,
|
||||||
|
History,
|
||||||
|
File,
|
||||||
|
CodeMirror,
|
||||||
MetadataMgr,
|
MetadataMgr,
|
||||||
AppConfig, Cryptpad, CommonRealtime) {
|
AppConfig,
|
||||||
|
Cryptpad,
|
||||||
|
CommonRealtime,
|
||||||
|
Util
|
||||||
|
) {
|
||||||
|
|
||||||
// Chainpad Netflux Inner
|
// Chainpad Netflux Inner
|
||||||
var funcs = {};
|
var funcs = {};
|
||||||
@ -24,12 +39,15 @@ define([
|
|||||||
|
|
||||||
funcs.Messages = Messages;
|
funcs.Messages = Messages;
|
||||||
|
|
||||||
|
var evRealtimeSynced = Util.mkEvent(true);
|
||||||
|
|
||||||
funcs.startRealtime = function (options) {
|
funcs.startRealtime = function (options) {
|
||||||
if (ctx.cpNfInner) { return ctx.cpNfInner; }
|
if (ctx.cpNfInner) { return ctx.cpNfInner; }
|
||||||
options.sframeChan = ctx.sframeChan;
|
options.sframeChan = ctx.sframeChan;
|
||||||
options.metadataMgr = ctx.metadataMgr;
|
options.metadataMgr = ctx.metadataMgr;
|
||||||
ctx.cpNfInner = CpNfInner.start(options);
|
ctx.cpNfInner = CpNfInner.start(options);
|
||||||
ctx.cpNfInner.metadataMgr.onChangeLazy(options.onLocal);
|
ctx.cpNfInner.metadataMgr.onChangeLazy(options.onLocal);
|
||||||
|
ctx.cpNfInner.whenRealtimeSyncs(function () { evRealtimeSynced.fire(); });
|
||||||
return ctx.cpNfInner;
|
return ctx.cpNfInner;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -210,6 +228,10 @@ define([
|
|||||||
});
|
});
|
||||||
}; */
|
}; */
|
||||||
|
|
||||||
|
funcs.gotoURL = function (url) { ctx.sframeChan.event('EV_GOTO_URL', url); };
|
||||||
|
|
||||||
|
funcs.whenRealtimeSyncs = evRealtimeSynced.reg;
|
||||||
|
|
||||||
Object.freeze(funcs);
|
Object.freeze(funcs);
|
||||||
return { create: function (cb) {
|
return { create: function (cb) {
|
||||||
nThen(function (waitFor) {
|
nThen(function (waitFor) {
|
||||||
|
|||||||
@ -121,6 +121,9 @@ define({
|
|||||||
'EV_FILE_UPLOAD_STATE': true,
|
'EV_FILE_UPLOAD_STATE': true,
|
||||||
'Q_CANCEL_PENDING_FILE_UPLOAD': true,
|
'Q_CANCEL_PENDING_FILE_UPLOAD': true,
|
||||||
|
|
||||||
|
// Make the browser window navigate to a given URL, if no URL is passed then it will reload.
|
||||||
|
'EV_GOTO_URL': true,
|
||||||
|
|
||||||
// Present mode URL
|
// Present mode URL
|
||||||
'Q_PRESENT_URL_GET_VALUE': true,
|
'Q_PRESENT_URL_GET_VALUE': true,
|
||||||
'EV_PRESENT_URL_SET_VALUE': true,
|
'EV_PRESENT_URL_SET_VALUE': true,
|
||||||
|
|||||||
@ -711,6 +711,7 @@ define([
|
|||||||
}, local ? 0 : SPINNER_DISAPPEAR_TIME);
|
}, local ? 0 : SPINNER_DISAPPEAR_TIME);
|
||||||
};
|
};
|
||||||
if (Cryptpad) {
|
if (Cryptpad) {
|
||||||
|
Cryptpad.beginDetectingInfiniteSpinner(config.realtime);
|
||||||
Cryptpad.whenRealtimeSyncs(config.realtime, onSynced);
|
Cryptpad.whenRealtimeSyncs(config.realtime, onSynced);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -733,6 +734,9 @@ define([
|
|||||||
// receive a patch.
|
// receive a patch.
|
||||||
if (Cryptpad) {
|
if (Cryptpad) {
|
||||||
typing = 0;
|
typing = 0;
|
||||||
|
// We're just placing this detector here because it used to be triggered by
|
||||||
|
// whenRealtimeSyncs() and now it is not because in sframe it is handled differently.
|
||||||
|
Cryptpad.beginDetectingInfiniteSpinner(config.realtime);
|
||||||
Cryptpad.whenRealtimeSyncs(config.realtime, function () {
|
Cryptpad.whenRealtimeSyncs(config.realtime, function () {
|
||||||
kickSpinner(toolbar, config);
|
kickSpinner(toolbar, config);
|
||||||
});
|
});
|
||||||
|
|||||||
@ -673,11 +673,7 @@ define([
|
|||||||
$spin.text(Messages.saved);
|
$spin.text(Messages.saved);
|
||||||
}, local ? 0 : SPINNER_DISAPPEAR_TIME);
|
}, local ? 0 : SPINNER_DISAPPEAR_TIME);
|
||||||
};
|
};
|
||||||
if (Cryptpad) {
|
config.sfCommon.whenRealtimeSyncs(onSynced);
|
||||||
Cryptpad.whenRealtimeSyncs(config.realtime, onSynced);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
onSynced();
|
|
||||||
};
|
};
|
||||||
var ks = function (toolbar, config, local) {
|
var ks = function (toolbar, config, local) {
|
||||||
return function () {
|
return function () {
|
||||||
@ -694,12 +690,10 @@ define([
|
|||||||
}
|
}
|
||||||
// without this, users in read-only mode say 'synchronizing' until they
|
// without this, users in read-only mode say 'synchronizing' until they
|
||||||
// receive a patch.
|
// receive a patch.
|
||||||
if (Cryptpad) {
|
typing = 0;
|
||||||
typing = 0;
|
config.sfCommon.whenRealtimeSyncs(function () {
|
||||||
Cryptpad.whenRealtimeSyncs(config.realtime, function () {
|
kickSpinner(toolbar, config);
|
||||||
kickSpinner(toolbar, config);
|
});
|
||||||
});
|
|
||||||
}
|
|
||||||
return $spin;
|
return $spin;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -33,7 +33,6 @@ define([
|
|||||||
'/bower_components/nthen/index.js',
|
'/bower_components/nthen/index.js',
|
||||||
'/common/sframe-common.js',
|
'/common/sframe-common.js',
|
||||||
'/api/config',
|
'/api/config',
|
||||||
'/common/common-realtime.js',
|
|
||||||
|
|
||||||
'/bower_components/file-saver/FileSaver.min.js',
|
'/bower_components/file-saver/FileSaver.min.js',
|
||||||
'/bower_components/diff-dom/diffDOM.js',
|
'/bower_components/diff-dom/diffDOM.js',
|
||||||
@ -56,8 +55,7 @@ define([
|
|||||||
Links,
|
Links,
|
||||||
nThen,
|
nThen,
|
||||||
SFCommon,
|
SFCommon,
|
||||||
ApiConfig,
|
ApiConfig)
|
||||||
CommonRealtime)
|
|
||||||
{
|
{
|
||||||
var saveAs = window.saveAs;
|
var saveAs = window.saveAs;
|
||||||
var Messages = Cryptpad.Messages;
|
var Messages = Cryptpad.Messages;
|
||||||
@ -339,8 +337,6 @@ define([
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
CommonRealtime.onInfiniteSpinner(function () { setEditable(false); });
|
|
||||||
|
|
||||||
// don't let the user edit until the pad is ready
|
// don't let the user edit until the pad is ready
|
||||||
setEditable(false);
|
setEditable(false);
|
||||||
|
|
||||||
@ -727,6 +723,15 @@ define([
|
|||||||
cpNfInner = common.startRealtime(realtimeOptions);
|
cpNfInner = common.startRealtime(realtimeOptions);
|
||||||
metadataMgr = cpNfInner.metadataMgr;
|
metadataMgr = cpNfInner.metadataMgr;
|
||||||
|
|
||||||
|
cpNfInner.onInfiniteSpinner(function () {
|
||||||
|
setEditable(false);
|
||||||
|
Cryptpad.confirm(Messages.realtime_unrecoverableError, function (yes) {
|
||||||
|
if (!yes) { return; }
|
||||||
|
common.gotoURL();
|
||||||
|
//window.parent.location.reload();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
Cryptpad.onLogout(function () { setEditable(false); });
|
Cryptpad.onLogout(function () { setEditable(false); });
|
||||||
|
|
||||||
/* hitting enter makes a new line, but places the cursor inside
|
/* hitting enter makes a new line, but places the cursor inside
|
||||||
|
|||||||
@ -217,9 +217,10 @@ define([
|
|||||||
cancelClass: 'safe',
|
cancelClass: 'safe',
|
||||||
okClass: 'danger',
|
okClass: 'danger',
|
||||||
reverseOrder: true,
|
reverseOrder: true,
|
||||||
}, true, function ($dialog) {
|
done: function ($dialog) {
|
||||||
$dialog.find('> div').addClass('half');
|
$dialog.find('> div').addClass('half');
|
||||||
});
|
},
|
||||||
|
}, true);
|
||||||
}, 150);
|
}, 150);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user