networker offline mode draft
This commit is contained in:
parent
d0de845bee
commit
ad89c7978d
@ -1502,28 +1502,27 @@ factory('MtpSha1Service', function ($q) {
|
|||||||
|
|
||||||
factory('MtpNetworkerFactory', function (MtpDcConfigurator, MtpMessageIdGenerator, MtpSecureRandom, MtpSha1Service, MtpAesService, AppConfigManager, $http, $q, $timeout, $interval) {
|
factory('MtpNetworkerFactory', function (MtpDcConfigurator, MtpMessageIdGenerator, MtpSecureRandom, MtpSha1Service, MtpAesService, AppConfigManager, $http, $q, $timeout, $interval) {
|
||||||
|
|
||||||
var updatesProcessor;
|
var updatesProcessor,
|
||||||
|
iii = 0,
|
||||||
|
offline = false;
|
||||||
|
|
||||||
|
function MtpNetworker(dcID, authKey, serverSalt, options) {
|
||||||
|
options = options || {};
|
||||||
|
|
||||||
function MtpNetworker(dcID, authKey, serverSalt) {
|
|
||||||
this.dcID = dcID;
|
this.dcID = dcID;
|
||||||
|
this.iii = iii++;
|
||||||
|
|
||||||
this.authKey = authKey;
|
this.authKey = authKey;
|
||||||
this.authKeyID = sha1Hash(authKey).slice(-8);
|
this.authKeyID = sha1Hash(authKey).slice(-8);
|
||||||
|
|
||||||
this.serverSalt = serverSalt;
|
this.serverSalt = serverSalt;
|
||||||
|
|
||||||
// if (1 == dcID) {
|
this.upload = options.upload || false;
|
||||||
// var self = this;
|
|
||||||
// (function () {
|
|
||||||
// console.log('update server salt');
|
|
||||||
// self.serverSalt = [0,0,0,0,0,0,0,0];
|
|
||||||
// $timeout(arguments.callee, nextRandomInt(2000, 12345));
|
|
||||||
// })();
|
|
||||||
// }
|
|
||||||
|
|
||||||
this.updateSession();
|
this.updateSession();
|
||||||
|
|
||||||
this.currentRequests = 0;
|
this.currentRequests = 0;
|
||||||
|
this.checkConnectionPeriod = 0;
|
||||||
|
|
||||||
this.sentMessages = {};
|
this.sentMessages = {};
|
||||||
this.serverMessages = [];
|
this.serverMessages = [];
|
||||||
@ -1540,7 +1539,7 @@ factory('MtpNetworkerFactory', function (MtpDcConfigurator, MtpMessageIdGenerato
|
|||||||
this.checkLongPoll();
|
this.checkLongPoll();
|
||||||
};
|
};
|
||||||
|
|
||||||
MtpNetworker.prototype.updateSession = function (updateMessageID) {
|
MtpNetworker.prototype.updateSession = function () {
|
||||||
console.log('Update session');
|
console.log('Update session');
|
||||||
this.seqNo = 0;
|
this.seqNo = 0;
|
||||||
this.sessionID = new Array(8);
|
this.sessionID = new Array(8);
|
||||||
@ -1668,12 +1667,12 @@ factory('MtpNetworkerFactory', function (MtpDcConfigurator, MtpMessageIdGenerato
|
|||||||
MtpNetworker.prototype.checkLongPoll = function(force) {
|
MtpNetworker.prototype.checkLongPoll = function(force) {
|
||||||
var isClean = this.cleanupSent();
|
var isClean = this.cleanupSent();
|
||||||
// console.log('Check lp', this.longPollPending, tsNow());
|
// console.log('Check lp', this.longPollPending, tsNow());
|
||||||
if (this.longPollPending && tsNow() < this.longPollPending) {
|
if (this.longPollPending && tsNow() < this.longPollPending || this.offline) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
var self = this;
|
var self = this;
|
||||||
AppConfigManager.get('dc').then(function (baseDcID) {
|
AppConfigManager.get('dc').then(function (baseDcID) {
|
||||||
if (baseDcID != self.dcID && isClean) {
|
if (isClean && (baseDcID != self.dcID || self.upload)) {
|
||||||
// console.warn('send long-poll for guest DC is delayed', self.dcID);
|
// console.warn('send long-poll for guest DC is delayed', self.dcID);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1682,15 +1681,25 @@ factory('MtpNetworkerFactory', function (MtpDcConfigurator, MtpMessageIdGenerato
|
|||||||
};
|
};
|
||||||
|
|
||||||
MtpNetworker.prototype.sendLongPoll = function() {
|
MtpNetworker.prototype.sendLongPoll = function() {
|
||||||
var maxWait = 25000;
|
var maxWait = 25000,
|
||||||
|
self = this;
|
||||||
|
|
||||||
this.longPollPending = tsNow() + maxWait;
|
this.longPollPending = tsNow() + maxWait;
|
||||||
// console.log('Set lp', this.longPollPending, tsNow());
|
// console.log('Set lp', this.longPollPending, tsNow());
|
||||||
|
|
||||||
this.wrapMtpCall('http_wait', {max_delay: 0, wait_after: 0, max_wait: maxWait}, {noResponse: true}).
|
this.wrapMtpCall('http_wait', {
|
||||||
then((function () {
|
max_delay: 0,
|
||||||
delete this.longPollPending;
|
wait_after: 0,
|
||||||
$timeout(this.checkLongPoll.bind(this), 0);
|
max_wait: maxWait
|
||||||
}).bind(this));
|
}, {
|
||||||
|
noResponse: true
|
||||||
|
}).then(function () {
|
||||||
|
delete self.longPollPending;
|
||||||
|
$timeout(self.checkLongPoll.bind(self), 0);
|
||||||
|
}, function () {
|
||||||
|
console.log('Long-poll failed');
|
||||||
|
});
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
MtpNetworker.prototype.pushMessage = function(message, options) {
|
MtpNetworker.prototype.pushMessage = function(message, options) {
|
||||||
@ -1741,9 +1750,74 @@ factory('MtpNetworkerFactory', function (MtpDcConfigurator, MtpMessageIdGenerato
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
MtpNetworker.prototype.checkConnection = function(event) {
|
||||||
|
console.log('check connection', event);
|
||||||
|
$timeout.cancel(this.checkConnectionPromise);
|
||||||
|
|
||||||
|
var serializer = new TLSerialization({mtproto: true}),
|
||||||
|
pingID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)];
|
||||||
|
|
||||||
|
serializer.storeMethod('ping', {ping_id: pingID});
|
||||||
|
|
||||||
|
var pingMessage = {
|
||||||
|
msg_id: MtpMessageIdGenerator.generateID(),
|
||||||
|
seq_no: this.generateSeqNo(true),
|
||||||
|
body: serializer.getBytes()
|
||||||
|
};
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
this.sendEncryptedRequest(pingMessage).then(function (result) {
|
||||||
|
self.toggleOffline(false);
|
||||||
|
}, function () {
|
||||||
|
console.log('delay ', self.checkConnectionPeriod * 1000);
|
||||||
|
self.checkConnectionPromise = $timeout(self.checkConnection.bind(self), parseInt(self.checkConnectionPeriod * 1000));
|
||||||
|
self.checkConnectionPeriod = Math.min(60, self.checkConnectionPeriod * 1.5);
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
MtpNetworker.prototype.toggleOffline = function(enabled) {
|
||||||
|
console.log('toggle ', enabled, this.dcID, this.iii);
|
||||||
|
if (this.offline == enabled) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.offline = enabled;
|
||||||
|
|
||||||
|
if (this.offline) {
|
||||||
|
$timeout.cancel(this.nextReqPromise);
|
||||||
|
delete this.nextReq;
|
||||||
|
|
||||||
|
if (this.checkConnectionPeriod < 1.5) {
|
||||||
|
this.checkConnectionPeriod = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.checkConnectionPromise = $timeout(this.checkConnection.bind(this), parseInt(this.checkConnectionPeriod * 1000));
|
||||||
|
this.checkConnectionPeriod = Math.min(60, (1 + this.checkConnectionPeriod) * 1.5);
|
||||||
|
|
||||||
|
this.onOnlineCb = this.checkConnection.bind(this);
|
||||||
|
|
||||||
|
$(document.body).on('online', this.onOnlineCb);
|
||||||
|
} else {
|
||||||
|
delete this.longPollPending;
|
||||||
|
this.checkLongPoll();
|
||||||
|
this.sheduleRequest();
|
||||||
|
|
||||||
|
if (this.onOnlineCb) {
|
||||||
|
$(document.body).off('online', this.onOnlineCb);
|
||||||
|
}
|
||||||
|
$timeout.cancel(this.checkConnectionPromise);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
MtpNetworker.prototype.performSheduledRequest = function() {
|
MtpNetworker.prototype.performSheduledRequest = function() {
|
||||||
// console.log('start sheduled');
|
// console.trace('sheduled', this.dcID, this.iii);
|
||||||
|
if (this.offline) {
|
||||||
|
console.log('cancel sheduled');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
delete this.nextReq;
|
delete this.nextReq;
|
||||||
if (this.pendingAcks.length) {
|
if (this.pendingAcks.length) {
|
||||||
var ackMsgIDs = [];
|
var ackMsgIDs = [];
|
||||||
@ -1846,7 +1920,32 @@ factory('MtpNetworkerFactory', function (MtpDcConfigurator, MtpMessageIdGenerato
|
|||||||
});
|
});
|
||||||
|
|
||||||
self.checkLongPoll();
|
self.checkLongPoll();
|
||||||
|
|
||||||
|
this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(this.checkConnectionPeriod));
|
||||||
|
|
||||||
});
|
});
|
||||||
|
}, function (error) {
|
||||||
|
console.log('Encrypted request failed', error);
|
||||||
|
|
||||||
|
if (message.container) {
|
||||||
|
angular.forEach(message.inner, function (msgID) {
|
||||||
|
self.pendingMessages[msgID] = 0;
|
||||||
|
});
|
||||||
|
delete self.sentMessages[message.msg_id];
|
||||||
|
} else {
|
||||||
|
self.pendingMessages[message.msg_id] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
angular.forEach(noResponseMsgs, function (msgID) {
|
||||||
|
if (self.sentMessages[msgID]) {
|
||||||
|
var deferred = self.sentMessages[msgID].deferred;
|
||||||
|
delete self.sentMessages[msgID];
|
||||||
|
delete self.pendingMessages[msgID];
|
||||||
|
deferred.reject();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
self.toggleOffline(true);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1970,6 +2069,9 @@ factory('MtpNetworkerFactory', function (MtpDcConfigurator, MtpMessageIdGenerato
|
|||||||
};
|
};
|
||||||
|
|
||||||
MtpNetworker.prototype.sheduleRequest = function (delay) {
|
MtpNetworker.prototype.sheduleRequest = function (delay) {
|
||||||
|
if (this.offline) {
|
||||||
|
this.checkConnection('forced shedule');
|
||||||
|
}
|
||||||
var nextReq = tsNow() + delay;
|
var nextReq = tsNow() + delay;
|
||||||
|
|
||||||
if (delay && this.nextReq && this.nextReq <= nextReq) {
|
if (delay && this.nextReq && this.nextReq <= nextReq) {
|
||||||
@ -1979,9 +2081,9 @@ factory('MtpNetworkerFactory', function (MtpDcConfigurator, MtpMessageIdGenerato
|
|||||||
// console.log('shedule req', delay);
|
// console.log('shedule req', delay);
|
||||||
// console.trace();
|
// console.trace();
|
||||||
|
|
||||||
clearTimeout(this.nextReqTO);
|
$timeout.cancel(this.nextReqPromise);
|
||||||
|
|
||||||
this.nextReqTO = $timeout(this.performSheduledRequest.bind(this), delay || 0);
|
this.nextReqPromise = $timeout(this.performSheduledRequest.bind(this), delay || 0);
|
||||||
this.nextReq = nextReq;
|
this.nextReq = nextReq;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2173,8 +2275,8 @@ factory('MtpNetworkerFactory', function (MtpDcConfigurator, MtpMessageIdGenerato
|
|||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
getNetworker: function (dcID, authKey, serverSalt) {
|
getNetworker: function (dcID, authKey, serverSalt, options) {
|
||||||
return new MtpNetworker(dcID, authKey, serverSalt);
|
return new MtpNetworker(dcID, authKey, serverSalt, options);
|
||||||
},
|
},
|
||||||
setUpdatesProcessor: function (callback) {
|
setUpdatesProcessor: function (callback) {
|
||||||
updatesProcessor = callback;
|
updatesProcessor = callback;
|
||||||
@ -2185,6 +2287,7 @@ factory('MtpNetworkerFactory', function (MtpDcConfigurator, MtpMessageIdGenerato
|
|||||||
|
|
||||||
factory('MtpApiManager', function (AppConfigManager, MtpAuthorizer, MtpNetworkerFactory, $q) {
|
factory('MtpApiManager', function (AppConfigManager, MtpAuthorizer, MtpNetworkerFactory, $q) {
|
||||||
var cachedNetworkers = {},
|
var cachedNetworkers = {},
|
||||||
|
cachedUploadNetworkers = {},
|
||||||
cachedExportPromise = {},
|
cachedExportPromise = {},
|
||||||
baseDcID = false;
|
baseDcID = false;
|
||||||
|
|
||||||
@ -2211,13 +2314,14 @@ factory('MtpApiManager', function (AppConfigManager, MtpAuthorizer, MtpNetworker
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function mtpGetNetworker (dcID) {
|
function mtpGetNetworker (dcID, upload) {
|
||||||
|
var cache = upload ? cachedUploadNetworkers : cachedNetworkers;
|
||||||
if (!dcID) {
|
if (!dcID) {
|
||||||
throw new Exception('get Networker without dcID');
|
throw new Exception('get Networker without dcID');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cachedNetworkers[dcID] !== undefined) {
|
if (cache[dcID] !== undefined) {
|
||||||
return $q.when(cachedNetworkers[dcID]);
|
return $q.when(cache[dcID]);
|
||||||
}
|
}
|
||||||
|
|
||||||
var akk = 'dc' + dcID + '_auth_key',
|
var akk = 'dc' + dcID + '_auth_key',
|
||||||
@ -2225,8 +2329,8 @@ factory('MtpApiManager', function (AppConfigManager, MtpAuthorizer, MtpNetworker
|
|||||||
|
|
||||||
return AppConfigManager.get(akk, ssk).then(function (result) {
|
return AppConfigManager.get(akk, ssk).then(function (result) {
|
||||||
|
|
||||||
if (cachedNetworkers[dcID] !== undefined) {
|
if (cache[dcID] !== undefined) {
|
||||||
return cachedNetworkers[dcID];
|
return cache[dcID];
|
||||||
}
|
}
|
||||||
|
|
||||||
var authKeyHex = result[0],
|
var authKeyHex = result[0],
|
||||||
@ -2236,7 +2340,7 @@ factory('MtpApiManager', function (AppConfigManager, MtpAuthorizer, MtpNetworker
|
|||||||
var authKey = bytesFromHex(authKeyHex);
|
var authKey = bytesFromHex(authKeyHex);
|
||||||
var serverSalt = bytesFromHex(serverSaltHex);
|
var serverSalt = bytesFromHex(serverSaltHex);
|
||||||
|
|
||||||
return cachedNetworkers[dcID] = MtpNetworkerFactory.getNetworker(dcID, authKey, serverSalt);
|
return cache[dcID] = MtpNetworkerFactory.getNetworker(dcID, authKey, serverSalt, {upload: upload});
|
||||||
}
|
}
|
||||||
|
|
||||||
return MtpAuthorizer.auth(dcID).then(function (auth) {
|
return MtpAuthorizer.auth(dcID).then(function (auth) {
|
||||||
@ -2245,7 +2349,7 @@ factory('MtpApiManager', function (AppConfigManager, MtpAuthorizer, MtpNetworker
|
|||||||
storeObj[ssk] = bytesToHex(auth.serverSalt);
|
storeObj[ssk] = bytesToHex(auth.serverSalt);
|
||||||
AppConfigManager.set(storeObj);
|
AppConfigManager.set(storeObj);
|
||||||
|
|
||||||
return cachedNetworkers[dcID] = MtpNetworkerFactory.getNetworker(dcID, auth.authKey, auth.serverSalt);
|
return cache[dcID] = MtpNetworkerFactory.getNetworker(dcID, auth.authKey, auth.serverSalt, {upload: upload});
|
||||||
}, function (error) {
|
}, function (error) {
|
||||||
console.log('Get networker error', error, error.stack);
|
console.log('Get networker error', error, error.stack);
|
||||||
return $q.reject(error);
|
return $q.reject(error);
|
||||||
@ -2258,13 +2362,14 @@ factory('MtpApiManager', function (AppConfigManager, MtpAuthorizer, MtpNetworker
|
|||||||
|
|
||||||
var deferred = $q.defer(),
|
var deferred = $q.defer(),
|
||||||
dcID,
|
dcID,
|
||||||
|
upload = options.fileDownload || options.fileUpload,
|
||||||
networkerPromise;
|
networkerPromise;
|
||||||
|
|
||||||
if (dcID = options.dcID) {
|
if (dcID = options.dcID) {
|
||||||
networkerPromise = mtpGetNetworker(dcID);
|
networkerPromise = mtpGetNetworker(dcID, upload);
|
||||||
} else {
|
} else {
|
||||||
networkerPromise = AppConfigManager.get('dc').then(function (baseDcID) {
|
networkerPromise = AppConfigManager.get('dc').then(function (baseDcID) {
|
||||||
return mtpGetNetworker(dcID = baseDcID || 1);
|
return mtpGetNetworker(dcID = baseDcID || 1, upload);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2543,7 +2648,10 @@ factory('MtpApiFileManager', function (MtpApiManager, $q, $window) {
|
|||||||
location: angular.extend({}, location, {_: 'inputFileLocation'}),
|
location: angular.extend({}, location, {_: 'inputFileLocation'}),
|
||||||
offset: 0,
|
offset: 0,
|
||||||
limit: 0
|
limit: 0
|
||||||
}, {dcID: location.dc_id});
|
}, {
|
||||||
|
dcID: location.dc_id,
|
||||||
|
fileDownload: true
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
fileEntry.createWriter(function (fileWriter) {
|
fileEntry.createWriter(function (fileWriter) {
|
||||||
@ -2577,7 +2685,10 @@ factory('MtpApiFileManager', function (MtpApiManager, $q, $window) {
|
|||||||
location: angular.extend({}, location, {_: 'inputFileLocation'}),
|
location: angular.extend({}, location, {_: 'inputFileLocation'}),
|
||||||
offset: 0,
|
offset: 0,
|
||||||
limit: 0
|
limit: 0
|
||||||
}, {dcID: location.dc_id});
|
}, {
|
||||||
|
dcID: location.dc_id,
|
||||||
|
fileDownload: true
|
||||||
|
});
|
||||||
}).then(function (result) {
|
}).then(function (result) {
|
||||||
deferred.resolve(cachedDownloads[fileName] = 'data:image/jpeg;base64,' + bytesToBase64(result.bytes))
|
deferred.resolve(cachedDownloads[fileName] = 'data:image/jpeg;base64,' + bytesToBase64(result.bytes))
|
||||||
}, errorHandler);
|
}, errorHandler);
|
||||||
@ -2624,7 +2735,10 @@ factory('MtpApiFileManager', function (MtpApiManager, $q, $window) {
|
|||||||
location: location,
|
location: location,
|
||||||
offset: offset,
|
offset: offset,
|
||||||
limit: limit
|
limit: limit
|
||||||
}, {dcID: dcID});
|
}, {
|
||||||
|
dcID: dcID,
|
||||||
|
fileDownload: true
|
||||||
|
});
|
||||||
|
|
||||||
}, 6).then(function (result) {
|
}, 6).then(function (result) {
|
||||||
|
|
||||||
@ -2692,7 +2806,10 @@ factory('MtpApiFileManager', function (MtpApiManager, $q, $window) {
|
|||||||
location: location,
|
location: location,
|
||||||
offset: offset,
|
offset: offset,
|
||||||
limit: limit
|
limit: limit
|
||||||
}, {dcID: dcID});
|
}, {
|
||||||
|
dcID: dcID,
|
||||||
|
fileDownload: true
|
||||||
|
});
|
||||||
}, 6).then(function (result) {
|
}, 6).then(function (result) {
|
||||||
writeBlobPromise.then(function () {
|
writeBlobPromise.then(function () {
|
||||||
try {
|
try {
|
||||||
@ -2813,7 +2930,10 @@ factory('MtpApiFileManager', function (MtpApiManager, $q, $window) {
|
|||||||
file_id: fileID,
|
file_id: fileID,
|
||||||
file_part: part,
|
file_part: part,
|
||||||
bytes: bytesFromArrayBuffer(e.target.result)
|
bytes: bytesFromArrayBuffer(e.target.result)
|
||||||
}, {startMaxLength: partSize + 256});
|
}, {
|
||||||
|
startMaxLength: partSize + 256,
|
||||||
|
fileUpload: true
|
||||||
|
});
|
||||||
}, errorHandler);
|
}, errorHandler);
|
||||||
|
|
||||||
apiCurPromise.then(function (result) {
|
apiCurPromise.then(function (result) {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<div class="chat_modal_wrap">
|
<div class="chat_modal_wrap">
|
||||||
|
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<a class="modal-close-link visible-xs visible-sm" ng-click="$close()">Close</a>
|
<a class="modal-close-link" ng-click="$close()">Close</a>
|
||||||
<h4 class="modal-title">Group Info</h4>
|
<h4 class="modal-title">Group Info</h4>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<div class="contacts_modal_wrap">
|
<div class="contacts_modal_wrap">
|
||||||
|
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<a class="modal-close-link visible-xs visible-sm" ng-click="$close()">Close</a>
|
<a class="modal-close-link" ng-click="$close()">Close</a>
|
||||||
<h4 class="modal-title">Contacts</h4>
|
<h4 class="modal-title">Contacts</h4>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<div class="error_modal_wrap">
|
<div class="error_modal_wrap">
|
||||||
|
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<a class="modal-close-link visible-xs visible-sm" ng-click="$close()">Close</a>
|
<a class="modal-close-link" ng-click="$close()">Close</a>
|
||||||
<h4 class="modal-title">{{title}}</h4>
|
<h4 class="modal-title">{{title}}</h4>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<div class="settings_modal_wrap">
|
<div class="settings_modal_wrap">
|
||||||
|
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<a class="modal-close-link visible-xs visible-sm" ng-click="$close()">Close</a>
|
<a class="modal-close-link" ng-click="$close()">Close</a>
|
||||||
<h4 class="modal-title">Settings</h4>
|
<h4 class="modal-title">Settings</h4>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<div class="user_modal_wrap">
|
<div class="user_modal_wrap">
|
||||||
|
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<a class="modal-close-link visible-xs visible-sm" ng-click="$close()">Close</a>
|
<a class="modal-close-link" ng-click="$close()">Close</a>
|
||||||
<h4 class="modal-title">Info</h4>
|
<h4 class="modal-title">Info</h4>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1074,7 +1074,7 @@ angular.module("template/modal/backdrop.html", []).run(["$templateCache", functi
|
|||||||
angular.module("template/modal/window.html", []).run(["$templateCache", function($templateCache) {
|
angular.module("template/modal/window.html", []).run(["$templateCache", function($templateCache) {
|
||||||
$templateCache.put("template/modal/window.html",
|
$templateCache.put("template/modal/window.html",
|
||||||
"<div tabindex=\"-1\" class=\"modal fade {{ windowClass }}\" ng-class=\"{in: animate}\" ng-style=\"{'z-index': 1050 + index*10, display: 'block'}\" ng-click=\"close($event)\">\n" +
|
"<div tabindex=\"-1\" class=\"modal fade {{ windowClass }}\" ng-class=\"{in: animate}\" ng-style=\"{'z-index': 1050 + index*10, display: 'block'}\" ng-click=\"close($event)\">\n" +
|
||||||
" <div class=\"modal_close_wrap visible-md visible-lg\" ng-click=\"close($event)\">\n" +
|
" <div class=\"modal_close_wrap hidden-xs hidden-sm\" ng-click=\"close($event)\">\n" +
|
||||||
" <div class=\"modal_close\"></div>\n" +
|
" <div class=\"modal_close\"></div>\n" +
|
||||||
" </div>\n" +
|
" </div>\n" +
|
||||||
" <div class=\"modal-dialog\"><div class=\"modal-content\" ng-transclude></div></div>\n" +
|
" <div class=\"modal-dialog\"><div class=\"modal-content\" ng-transclude></div></div>\n" +
|
||||||
|
Loading…
x
Reference in New Issue
Block a user