Browse Source

Merge upstream changes before upgrading to gulp 4 (it has issues)

master
R4SAS 6 years ago
parent
commit
054d4c3854
  1. 2
      README.md
  2. 88
      app/js/controllers.js
  3. 4
      app/js/lib/config.js
  4. 14
      app/js/lib/schema.tl
  5. 3
      app/js/lib/utils.js
  6. 2
      app/js/locales/de-de.json
  7. 14
      app/js/locales/en-us.json
  8. 16
      app/js/locales/es-es.json
  9. 74
      app/js/locales/ru-ru.json
  10. 34
      app/js/messages_manager.js
  11. 1
      app/partials/desktop/im.html
  12. 4
      app/partials/desktop/inline_results.html
  13. 2
      app/partials/desktop/message.html
  14. 2
      app/partials/desktop/message_attach_document.html
  15. 51
      app/partials/desktop/report_msgs_modal.html
  16. 2
      app/partials/desktop/settings_modal.html
  17. 2
      app/partials/desktop/user_modal.html
  18. 1
      app/partials/mobile/message_actions_modal.html
  19. 3
      app/partials/mobile/message_attach_photo.html
  20. 2
      app/partials/mobile/settings_modal.html
  21. 2
      app/partials/mobile/user_modal.html
  22. 4
      package.json

2
README.md

@ -101,7 +101,7 @@ Run `npm start` (`gulp watch`) to watch for file changes and automatically rebui
#### Running in production #### Running in production
Run `npm run clean` (`gulp clean`), then `npm run publish` (`gulp publish`) to build the minimized production version of the app. Copy `dist` folder contents to your web server. Don't forget to set `X-Frame-Options SAMEORIGIN` header ([docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/X-Frame-Options)). Run `npm run clean` (`gulp clean`), then `npm run build` (`gulp publish`) to build the minimized production version of the app. Copy `dist` folder contents to your web server. Don't forget to set `X-Frame-Options SAMEORIGIN` header ([docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/X-Frame-Options)).
### Third party libraries ### Third party libraries

88
app/js/controllers.js

@ -499,6 +499,7 @@ angular.module('myApp.controllers', ['myApp.i18n'])
canReply: false, canReply: false,
canDelete: false, canDelete: false,
canEdit: false, canEdit: false,
canReport: false,
actions: function () { actions: function () {
return $scope.historyState.selectActions ? 'selected' : ($scope.historyState.botActions ? 'bot' : ($scope.historyState.channelActions ? 'channel' : false)) return $scope.historyState.selectActions ? 'selected' : ($scope.historyState.botActions ? 'bot' : ($scope.historyState.channelActions ? 'channel' : false))
}, },
@ -1086,6 +1087,15 @@ angular.module('myApp.controllers', ['myApp.i18n'])
var wrapDialog = searchMessages ? undefined : dialog var wrapDialog = searchMessages ? undefined : dialog
var wrappedDialog = AppMessagesManager.wrapForDialog(dialog.top_message, wrapDialog) var wrappedDialog = AppMessagesManager.wrapForDialog(dialog.top_message, wrapDialog)
if (searchMessages &&
$scope.searchPeer) {
var message = AppMessagesManager.getMessage(dialog.top_message)
if (message.fromID > 0) {
wrappedDialog.peerID = message.fromID
wrappedDialog.foundInHistory = true
}
}
if (searchMessages) { if (searchMessages) {
wrappedDialog.unreadCount = -1 wrappedDialog.unreadCount = -1
} else { } else {
@ -1233,6 +1243,7 @@ angular.module('myApp.controllers', ['myApp.i18n'])
$scope.selectedEdit = selectedEdit $scope.selectedEdit = selectedEdit
$scope.selectedCancel = selectedCancel $scope.selectedCancel = selectedCancel
$scope.selectedFlush = selectedFlush $scope.selectedFlush = selectedFlush
$scope.selectedReport = selectedReport
$scope.selectInlineBot = selectInlineBot $scope.selectInlineBot = selectInlineBot
$scope.startBot = startBot $scope.startBot = startBot
@ -1742,6 +1753,7 @@ angular.module('myApp.controllers', ['myApp.i18n'])
if (Config.Mobile) { if (Config.Mobile) {
$scope.historyState.canEdit = AppMessagesManager.canEditMessage(messageID) $scope.historyState.canEdit = AppMessagesManager.canEditMessage(messageID)
$scope.historyState.canReport = AppMessagesManager.canReportMessage(messageID)
$modal.open({ $modal.open({
templateUrl: templateUrl('message_actions_modal'), templateUrl: templateUrl('message_actions_modal'),
@ -1765,6 +1777,10 @@ angular.module('myApp.controllers', ['myApp.i18n'])
selectedForward(messageID) selectedForward(messageID)
break break
case 'report':
selectedReport(messageID)
break
case 'select': case 'select':
$scope.historyState.selectActions = 'selected' $scope.historyState.selectActions = 'selected'
$scope.$broadcast('ui_panel_update') $scope.$broadcast('ui_panel_update')
@ -1824,6 +1840,15 @@ angular.module('myApp.controllers', ['myApp.i18n'])
if ($scope.selectedCount == 1) { if ($scope.selectedCount == 1) {
angular.forEach($scope.selectedMsgs, function (t, messageID) { angular.forEach($scope.selectedMsgs, function (t, messageID) {
$scope.historyState.canEdit = AppMessagesManager.canEditMessage(messageID) $scope.historyState.canEdit = AppMessagesManager.canEditMessage(messageID)
$scope.historyState.canReport = AppMessagesManager.canReportMessage(messageID)
})
} else {
$scope.historyState.canEdit = false
$scope.historyState.canReport = false
angular.forEach($scope.selectedMsgs, function (t, messageID) {
if (AppMessagesManager.canReportMessage(messageID)) {
$scope.historyState.canReport = true
}
}) })
} }
$scope.$broadcast('messages_select') $scope.$broadcast('messages_select')
@ -1966,6 +1991,38 @@ angular.module('myApp.controllers', ['myApp.i18n'])
} }
} }
function selectedReport (selectedMessageID) {
var selectedMessageIDs = []
if (selectedMessageID) {
selectedMessageIDs.push(selectedMessageID)
} else if ($scope.selectedCount > 0) {
angular.forEach($scope.selectedMsgs, function (t, messageID) {
selectedMessageIDs.push(messageID)
})
}
if (selectedMessageIDs.length) {
$modal.open({
templateUrl: templateUrl('report_msgs_modal'),
controller: 'ReportMessagesModalController',
windowClass: 'md_simple_modal_window mobile_modal',
scope: $scope.$new()
}).result.then(function (inputReason) {
selectedCancel()
AppMessagesManager.reportMessages(selectedMessageIDs, inputReason).then(function () {
var toastData = toaster.pop({
type: 'info',
body: _('confirm_modal_report_success'),
bodyOutputType: 'trustedHtml',
clickHandler: function () {
toaster.clear(toastData)
},
showCloseButton: false
})
})
})
}
}
function selectedReply (selectedMessageID) { function selectedReply (selectedMessageID) {
if (!selectedMessageID && $scope.selectedCount == 1) { if (!selectedMessageID && $scope.selectedCount == 1) {
angular.forEach($scope.selectedMsgs, function (t, messageID) { angular.forEach($scope.selectedMsgs, function (t, messageID) {
@ -3726,7 +3783,9 @@ angular.module('myApp.controllers', ['myApp.i18n'])
$scope.settings = {notifications: true} $scope.settings = {notifications: true}
AppProfileManager.getProfile($scope.userID, $scope.override).then(function (userFull) { var profilePromise = AppProfileManager.getProfile($scope.userID, $scope.override)
profilePromise.then(function (userFull) {
$scope.blocked = userFull.pFlags.blocked $scope.blocked = userFull.pFlags.blocked
$scope.bot_info = userFull.bot_info $scope.bot_info = userFull.bot_info
$scope.rAbout = userFull.rAbout $scope.rAbout = userFull.rAbout
@ -3750,6 +3809,12 @@ angular.module('myApp.controllers', ['myApp.i18n'])
$rootScope.$broadcast('history_focus', {peerString: peerString}) $rootScope.$broadcast('history_focus', {peerString: peerString})
} }
$scope.openUserPic = function () {
profilePromise.then(function () {
$scope.openPhoto($scope.user.photo.photo_id, {p: $scope.userID})
})
}
$scope.flushHistory = function (justClear) { $scope.flushHistory = function (justClear) {
ErrorService.confirm({type: justClear ? 'HISTORY_FLUSH' : 'HISTORY_FLUSH_AND_DELETE'}).then(function () { ErrorService.confirm({type: justClear ? 'HISTORY_FLUSH' : 'HISTORY_FLUSH_AND_DELETE'}).then(function () {
AppMessagesManager.flushHistory($scope.userID, justClear).then(function () { AppMessagesManager.flushHistory($scope.userID, justClear).then(function () {
@ -4178,6 +4243,7 @@ angular.module('myApp.controllers', ['myApp.i18n'])
}) })
.controller('SettingsModalController', function ($rootScope, $scope, $timeout, $modal, AppUsersManager, AppChatsManager, AppPhotosManager, MtpApiManager, Storage, NotificationsManager, MtpApiFileManager, PasswordManager, ApiUpdatesManager, ChangelogNotifyService, LayoutSwitchService, WebPushApiManager, AppRuntimeManager, ErrorService, _) { .controller('SettingsModalController', function ($rootScope, $scope, $timeout, $modal, AppUsersManager, AppChatsManager, AppPhotosManager, MtpApiManager, Storage, NotificationsManager, MtpApiFileManager, PasswordManager, ApiUpdatesManager, ChangelogNotifyService, LayoutSwitchService, WebPushApiManager, AppRuntimeManager, ErrorService, _) {
$scope.profile = {} $scope.profile = {}
$scope.photo = {} $scope.photo = {}
$scope.version = Config.App.version $scope.version = Config.App.version
@ -4186,7 +4252,7 @@ angular.module('myApp.controllers', ['myApp.i18n'])
$scope.profile = AppUsersManager.getUser(id) $scope.profile = AppUsersManager.getUser(id)
}) })
MtpApiManager.invokeApi('users.getFullUser', { var profilePromise = MtpApiManager.invokeApi('users.getFullUser', {
id: {_: 'inputUserSelf'} id: {_: 'inputUserSelf'}
}).then(function (userFullResult) { }).then(function (userFullResult) {
AppUsersManager.saveApiUser(userFullResult.user) AppUsersManager.saveApiUser(userFullResult.user)
@ -4207,6 +4273,12 @@ angular.module('myApp.controllers', ['myApp.i18n'])
var updatePasswordTimeout = false var updatePasswordTimeout = false
var stopped = false var stopped = false
$scope.openUserPic = function () {
profilePromise.then(function () {
$scope.openPhoto($scope.profile.photo.photo_id, {p: $scope.profile.id})
})
}
$scope.changePassword = function (options) { $scope.changePassword = function (options) {
options = options || {} options = options || {}
if (options.action == 'cancel_email') { if (options.action == 'cancel_email') {
@ -4490,6 +4562,18 @@ angular.module('myApp.controllers', ['myApp.i18n'])
} }
}) })
.controller('ReportMessagesModalController', function ($scope, $modalInstance) {
$scope.reason = {_: 'inputReportReasonSpam', text: ''}
$scope.toggleReportReason = function (reason) {
$scope.reason = {_: reason}
if (reason == 'inputReportReasonOther') {
onContentLoaded(function () {
$scope.$broadcast('ui_reason_text_focus')
})
}
}
})
.controller('ProfileEditModalController', function ($scope, $modalInstance, AppUsersManager, MtpApiManager) { .controller('ProfileEditModalController', function ($scope, $modalInstance, AppUsersManager, MtpApiManager) {
$scope.profile = {} $scope.profile = {}
$scope.error = {} $scope.error = {}

4
app/js/lib/config.js

File diff suppressed because one or more lines are too long

14
app/js/lib/schema.tl

@ -106,7 +106,7 @@ chatPhotoEmpty#37c1011c = ChatPhoto;
chatPhoto#6153276a photo_small:FileLocation photo_big:FileLocation = ChatPhoto; chatPhoto#6153276a photo_small:FileLocation photo_big:FileLocation = ChatPhoto;
messageEmpty#83e5de54 id:int = Message; messageEmpty#83e5de54 id:int = Message;
message#44f9b43d flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true id:int from_id:flags.8?int to_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long = Message; message#44f9b43d flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true id:int from_id:flags.8?int to_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long = Message;
messageService#9e19a1f6 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true id:int from_id:flags.8?int to_id:Peer reply_to_msg_id:flags.3?int date:int action:MessageAction = Message; messageService#9e19a1f6 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true id:int from_id:flags.8?int to_id:Peer reply_to_msg_id:flags.3?int date:int action:MessageAction = Message;
messageMediaEmpty#3ded6320 = MessageMedia; messageMediaEmpty#3ded6320 = MessageMedia;
@ -174,7 +174,6 @@ inputPeerNotifySettings#38935eb2 flags:# show_previews:flags.0?true silent:flags
peerNotifyEventsEmpty#add53cb3 = PeerNotifyEvents; peerNotifyEventsEmpty#add53cb3 = PeerNotifyEvents;
peerNotifyEventsAll#6d1ded88 = PeerNotifyEvents; peerNotifyEventsAll#6d1ded88 = PeerNotifyEvents;
peerNotifySettingsEmpty#70a68512 = PeerNotifySettings;
peerNotifySettings#9acda4c0 flags:# show_previews:flags.0?true silent:flags.1?true mute_until:int sound:string = PeerNotifySettings; peerNotifySettings#9acda4c0 flags:# show_previews:flags.0?true silent:flags.1?true mute_until:int sound:string = PeerNotifySettings;
peerSettings#818426cd flags:# report_spam:flags.0?true = PeerSettings; peerSettings#818426cd flags:# report_spam:flags.0?true = PeerSettings;
@ -185,6 +184,7 @@ wallPaperSolid#63117f24 id:int title:string bg_color:int color:int = WallPaper;
inputReportReasonSpam#58dbcab8 = ReportReason; inputReportReasonSpam#58dbcab8 = ReportReason;
inputReportReasonViolence#1e22c78d = ReportReason; inputReportReasonViolence#1e22c78d = ReportReason;
inputReportReasonPornography#2e59d922 = ReportReason; inputReportReasonPornography#2e59d922 = ReportReason;
inputReportReasonChildAbuse#adf44ee3 = ReportReason;
inputReportReasonOther#e1746d0a text:string = ReportReason; inputReportReasonOther#e1746d0a text:string = ReportReason;
userFull#f220f3f flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true user:User about:flags.1?string link:contacts.Link profile_photo:flags.2?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo common_chats_count:int = UserFull; userFull#f220f3f flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true user:User about:flags.1?string link:contacts.Link profile_photo:flags.2?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo common_chats_count:int = UserFull;
@ -423,7 +423,7 @@ accountDaysTTL#b8d0afdf days:int = AccountDaysTTL;
documentAttributeImageSize#6c37c15c w:int h:int = DocumentAttribute; documentAttributeImageSize#6c37c15c w:int h:int = DocumentAttribute;
documentAttributeAnimated#11b58939 = DocumentAttribute; documentAttributeAnimated#11b58939 = DocumentAttribute;
documentAttributeSticker#6319d612 flags:# mask:flags.1?true alt:string stickerset:InputStickerSet mask_coords:flags.0?MaskCoords = DocumentAttribute; documentAttributeSticker#6319d612 flags:# mask:flags.1?true alt:string stickerset:InputStickerSet mask_coords:flags.0?MaskCoords = DocumentAttribute;
documentAttributeVideo#ef02ce6 flags:# round_message:flags.0?true duration:int w:int h:int = DocumentAttribute; documentAttributeVideo#ef02ce6 flags:# round_message:flags.0?true supports_streaming:flags.1?true duration:int w:int h:int = DocumentAttribute;
documentAttributeAudio#9852f9c6 flags:# voice:flags.10?true duration:int title:flags.0?string performer:flags.1?string waveform:flags.2?bytes = DocumentAttribute; documentAttributeAudio#9852f9c6 flags:# voice:flags.10?true duration:int title:flags.0?string performer:flags.1?string waveform:flags.2?bytes = DocumentAttribute;
documentAttributeFilename#15590068 file_name:string = DocumentAttribute; documentAttributeFilename#15590068 file_name:string = DocumentAttribute;
documentAttributeHasStickers#9801d2f7 = DocumentAttribute; documentAttributeHasStickers#9801d2f7 = DocumentAttribute;
@ -578,7 +578,7 @@ botInlineMediaResult#17db940b flags:# id:string type:string photo:flags.0?Photo
messages.botResults#947ca848 flags:# gallery:flags.0?true query_id:long next_offset:flags.1?string switch_pm:flags.2?InlineBotSwitchPM results:Vector<BotInlineResult> cache_time:int users:Vector<User> = messages.BotResults; messages.botResults#947ca848 flags:# gallery:flags.0?true query_id:long next_offset:flags.1?string switch_pm:flags.2?InlineBotSwitchPM results:Vector<BotInlineResult> cache_time:int users:Vector<User> = messages.BotResults;
exportedMessageLink#1f486803 link:string = ExportedMessageLink; exportedMessageLink#5dab1af4 link:string html:string = ExportedMessageLink;
messageFwdHeader#559ebe6d flags:# from_id:flags.0?int date:int channel_id:flags.1?int channel_post:flags.2?int post_author:flags.3?string saved_from_peer:flags.4?Peer saved_from_msg_id:flags.4?int = MessageFwdHeader; messageFwdHeader#559ebe6d flags:# from_id:flags.0?int date:int channel_id:flags.1?int channel_post:flags.2?int post_author:flags.3?string saved_from_peer:flags.4?Peer saved_from_msg_id:flags.4?int = MessageFwdHeader;
@ -821,7 +821,6 @@ auth.signUp#1b067634 phone_number:string phone_code_hash:string phone_code:strin
auth.signIn#bcd51581 phone_number:string phone_code_hash:string phone_code:string = auth.Authorization; auth.signIn#bcd51581 phone_number:string phone_code_hash:string phone_code:string = auth.Authorization;
auth.logOut#5717da40 = Bool; auth.logOut#5717da40 = Bool;
auth.resetAuthorizations#9fab0d1a = Bool; auth.resetAuthorizations#9fab0d1a = Bool;
auth.sendInvites#771c1d97 phone_numbers:Vector<string> message:string = Bool;
auth.exportAuthorization#e5bfffcd dc_id:int = auth.ExportedAuthorization; auth.exportAuthorization#e5bfffcd dc_id:int = auth.ExportedAuthorization;
auth.importAuthorization#e3ef9613 id:int bytes:bytes = auth.Authorization; auth.importAuthorization#e3ef9613 id:int bytes:bytes = auth.Authorization;
auth.bindTempAuthKey#cdd42a05 perm_auth_key_id:long nonce:long expires_at:int encrypted_message:bytes = Bool; auth.bindTempAuthKey#cdd42a05 perm_auth_key_id:long nonce:long expires_at:int encrypted_message:bytes = Bool;
@ -833,7 +832,7 @@ auth.resendCode#3ef1a9bf phone_number:string phone_code_hash:string = auth.SentC
auth.cancelCode#1f040578 phone_number:string phone_code_hash:string = Bool; auth.cancelCode#1f040578 phone_number:string phone_code_hash:string = Bool;
auth.dropTempAuthKeys#8e48a188 except_auth_keys:Vector<long> = Bool; auth.dropTempAuthKeys#8e48a188 except_auth_keys:Vector<long> = Bool;
account.registerDevice#01280460 token_type:int token:string app_sandbox:Bool other_uids:Vector<int> = Bool; account.registerDevice#1389cc token_type:int token:string app_sandbox:Bool other_uids:Vector<int> = Bool;
account.unregisterDevice#3076c4bf token_type:int token:string other_uids:Vector<int> = Bool; account.unregisterDevice#3076c4bf token_type:int token:string other_uids:Vector<int> = Bool;
account.updateNotifySettings#84be5b93 peer:InputNotifyPeer settings:InputPeerNotifySettings = Bool; account.updateNotifySettings#84be5b93 peer:InputNotifyPeer settings:InputPeerNotifySettings = Bool;
account.getNotifySettings#12b3ad31 peer:InputNotifyPeer = PeerNotifySettings; account.getNotifySettings#12b3ad31 peer:InputNotifyPeer = PeerNotifySettings;
@ -895,6 +894,7 @@ messages.forwardMessages#708e0195 flags:# silent:flags.5?true background:flags.6
messages.reportSpam#cf1592db peer:InputPeer = Bool; messages.reportSpam#cf1592db peer:InputPeer = Bool;
messages.hideReportSpam#a8f1709b peer:InputPeer = Bool; messages.hideReportSpam#a8f1709b peer:InputPeer = Bool;
messages.getPeerSettings#3672e09c peer:InputPeer = PeerSettings; messages.getPeerSettings#3672e09c peer:InputPeer = PeerSettings;
messages.report#bd82b658 peer:InputPeer id:Vector<int> reason:ReportReason = Bool;
messages.getChats#3c6aa187 id:Vector<int> = messages.Chats; messages.getChats#3c6aa187 id:Vector<int> = messages.Chats;
messages.getFullChat#3b831c66 chat_id:int = messages.ChatFull; messages.getFullChat#3b831c66 chat_id:int = messages.ChatFull;
messages.editChatTitle#dc452855 chat_id:int title:string = Updates; messages.editChatTitle#dc452855 chat_id:int title:string = Updates;
@ -902,7 +902,6 @@ messages.editChatPhoto#ca4c79d8 chat_id:int photo:InputChatPhoto = Updates;
messages.addChatUser#f9a0aa09 chat_id:int user_id:InputUser fwd_limit:int = Updates; messages.addChatUser#f9a0aa09 chat_id:int user_id:InputUser fwd_limit:int = Updates;
messages.deleteChatUser#e0611f16 chat_id:int user_id:InputUser = Updates; messages.deleteChatUser#e0611f16 chat_id:int user_id:InputUser = Updates;
messages.createChat#9cb126e users:Vector<InputUser> title:string = Updates; messages.createChat#9cb126e users:Vector<InputUser> title:string = Updates;
messages.forwardMessage#33963bf9 peer:InputPeer id:int random_id:long = Updates;
messages.getDhConfig#26cf8950 version:int random_length:int = messages.DhConfig; messages.getDhConfig#26cf8950 version:int random_length:int = messages.DhConfig;
messages.requestEncryption#f64daf43 user_id:InputUser random_id:int g_a:bytes = EncryptedChat; messages.requestEncryption#f64daf43 user_id:InputUser random_id:int g_a:bytes = EncryptedChat;
messages.acceptEncryption#3dbc0415 peer:InputEncryptedChat g_b:bytes key_fingerprint:long = EncryptedChat; messages.acceptEncryption#3dbc0415 peer:InputEncryptedChat g_b:bytes key_fingerprint:long = EncryptedChat;
@ -915,6 +914,7 @@ messages.sendEncryptedService#32d439a4 peer:InputEncryptedChat random_id:long da
messages.receivedQueue#55a5bb66 max_qts:int = Vector<long>; messages.receivedQueue#55a5bb66 max_qts:int = Vector<long>;
messages.reportEncryptedSpam#4b0c8c0f peer:InputEncryptedChat = Bool; messages.reportEncryptedSpam#4b0c8c0f peer:InputEncryptedChat = Bool;
messages.readMessageContents#36a73f77 id:Vector<int> = messages.AffectedMessages; messages.readMessageContents#36a73f77 id:Vector<int> = messages.AffectedMessages;
messages.getStickers#ae22e045 emoticon:string hash:string = messages.Stickers;
messages.getAllStickers#1c9618b1 hash:int = messages.AllStickers; messages.getAllStickers#1c9618b1 hash:int = messages.AllStickers;
messages.getWebPagePreview#25223e24 message:string = MessageMedia; messages.getWebPagePreview#25223e24 message:string = MessageMedia;
messages.exportChatInvite#7d885289 chat_id:int = ExportedChatInvite; messages.exportChatInvite#7d885289 chat_id:int = ExportedChatInvite;

3
app/js/lib/utils.js

@ -394,7 +394,8 @@ function templateUrl (tplName) {
megagroup_edit_modal: 'desktop', megagroup_edit_modal: 'desktop',
inline_results: 'desktop', inline_results: 'desktop',
composer_dropdown: 'desktop', composer_dropdown: 'desktop',
peer_pinned_message_bar: 'desktop' peer_pinned_message_bar: 'desktop',
report_msgs_modal: 'desktop'
} }
var layout = forceLayout[tplName] || (Config.Mobile ? 'mobile' : 'desktop') var layout = forceLayout[tplName] || (Config.Mobile ? 'mobile' : 'desktop')
return 'partials/' + layout + '/' + tplName + '.html' return 'partials/' + layout + '/' + tplName + '.html'

2
app/js/locales/de-de.json

@ -486,7 +486,7 @@
"im_reply_loading": "Lade{dots}", "im_reply_loading": "Lade{dots}",
"im_X_forwarded_messages": "{'one': 'hat {} Nachricht weitergeleitet', 'other': 'hat {} Nachrichten weitergeleitet'}", "im_X_forwarded_messages": "{'one': 'hat {} Nachricht weitergeleitet', 'other': 'hat {} Nachrichten weitergeleitet'}",
"im_photos_drop_text": "Bilder hier reinschieben um sie zu verschicken", "im_photos_drop_text": "Bilder hier reinschieben um sie zu verschicken",
"im_message_field_placeholder": "Schreibe eine Nachricht...", "im_message_field_placeholder": "Nachricht",
"im_broadcast_field_placeholder": "Broadcast...", "im_broadcast_field_placeholder": "Broadcast...",
"im_emoji_tab": "Emoji", "im_emoji_tab": "Emoji",
"im_stickers_tab": "Sticker", "im_stickers_tab": "Sticker",

14
app/js/locales/en-us.json

@ -219,6 +219,15 @@
"group_invite_revoke_active": "Revoking...", "group_invite_revoke_active": "Revoking...",
"group_invite_revoke": "Revoke", "group_invite_revoke": "Revoke",
"report_reason_modal_title": "Report",
"report_reason_modal_spam": "Spam",
"report_reason_modal_violence": "Violence",
"report_reason_modal_pornography": "Pornography",
"report_reason_modal_childabuse": "Child Abuse",
"report_reason_modal_other": "Other",
"report_reason_modal_other_placeholder": "Description",
"report_reason_modal_submit_btn": "Send",
"clipboard_copied": "Copied!", "clipboard_copied": "Copied!",
"clipboard_press_ctrl_c": "Press Ctrl+C to copy", "clipboard_press_ctrl_c": "Press Ctrl+C to copy",
"clipboard_press_cmd_c": "Press ⌘+C to copy", "clipboard_press_cmd_c": "Press ⌘+C to copy",
@ -246,6 +255,7 @@
"confirm_modal_login_phone_correct": "Is this phone number correct?", "confirm_modal_login_phone_correct": "Is this phone number correct?",
"confirm_modal_forward_to_peer": "Forward to {peer}?", "confirm_modal_forward_to_peer": "Forward to {peer}?",
"confirm_modal_forward_to_peer_success": "Message was successfully forwarded.", "confirm_modal_forward_to_peer_success": "Message was successfully forwarded.",
"confirm_modal_report_success": "Report sent",
"confirm_modal_send_to_peer": "Send to {peer}?", "confirm_modal_send_to_peer": "Send to {peer}?",
"confirm_modal_share_file_peer": "Share with {peer}?", "confirm_modal_share_file_peer": "Share with {peer}?",
"confirm_modal_invite_peer": "Invite to {peer}?", "confirm_modal_invite_peer": "Invite to {peer}?",
@ -391,6 +401,7 @@
"message_action_reply": "Reply", "message_action_reply": "Reply",
"message_action_edit": "Edit", "message_action_edit": "Edit",
"message_action_delete": "Delete", "message_action_delete": "Delete",
"message_action_report": "Report",
"message_action_forward": "Forward", "message_action_forward": "Forward",
"message_action_select": "Select", "message_action_select": "Select",
"message_action_cancel": "Cancel", "message_action_cancel": "Cancel",
@ -441,7 +452,7 @@
"error_modal_recovery_na_description": "Since you haven't provided a recovery e-mail when setting up your password, your remaining options are either to remember your password or to reset your account.", "error_modal_recovery_na_description": "Since you haven't provided a recovery e-mail when setting up your password, your remaining options are either to remember your password or to reset your account.",
"error_modal_password_success_descripion": "Your password for Two-Step Verification is now active.", "error_modal_password_success_descripion": "Your password for Two-Step Verification is now active.",
"error_modal_password_disabled_descripion": "You have disabled Two-Step Verification.", "error_modal_password_disabled_descripion": "You have disabled Two-Step Verification.",
"error_modal_user_not_mutual_contact": "The user can be invited by his contact only", "error_modal_user_not_mutual_contact": "The user can be invited by their contact only",
"error_modal_invite_link_invalid": "The invite link is invalid", "error_modal_invite_link_invalid": "The invite link is invalid",
"error_modal_channel_not_accessible": "Sorry, this channel is not accessible.", "error_modal_channel_not_accessible": "Sorry, this channel is not accessible.",
"error_modal_not_contact_flood": "Sorry, you can only send messages to mutual contacts at the moment. {more-info-link: More info »}", "error_modal_not_contact_flood": "Sorry, you can only send messages to mutual contacts at the moment. {more-info-link: More info »}",
@ -529,6 +540,7 @@
"im_channel_join": "+ Join", "im_channel_join": "+ Join",
"im_channel_mute": "Mute", "im_channel_mute": "Mute",
"im_channel_unmute": "Unmute", "im_channel_unmute": "Unmute",
"im_report": "Report {count}",
"im_reply_loading": "Loading{dots}", "im_reply_loading": "Loading{dots}",
"im_X_forwarded_messages": "{'one': '{} forwarded message', 'other': '{} forwarded messages'}", "im_X_forwarded_messages": "{'one': '{} forwarded message', 'other': '{} forwarded messages'}",
"im_photos_drop_text": "Drop photos here to send", "im_photos_drop_text": "Drop photos here to send",

16
app/js/locales/es-es.json

@ -78,7 +78,7 @@
"settings_modal_change_password": "Cambiar contraseña", "settings_modal_change_password": "Cambiar contraseña",
"settings_modal_disable_password": "Desactivar", "settings_modal_disable_password": "Desactivar",
"settings_modal_disable_password_mobile": "Desactivar la contraseña", "settings_modal_disable_password_mobile": "Desactivar la contraseña",
"settings_modal_password_email_pending": "Haz click en el enlace en {email} para configurar la verificación en dos pasos.", "settings_modal_password_email_pending": "Haz clic en el enlace en {email} para configurar la verificación en dos pasos.",
"settings_modal_password_email_pending_cancel": "Cancelar", "settings_modal_password_email_pending_cancel": "Cancelar",
"settings_modal_password_email_pending_cancel_mobile": "Anular contraseña", "settings_modal_password_email_pending_cancel_mobile": "Anular contraseña",
"password_delete_title": "Desactivar contraseña", "password_delete_title": "Desactivar contraseña",
@ -88,7 +88,7 @@
"password_new_placeholder": "Pon tu nueva contraseña", "password_new_placeholder": "Pon tu nueva contraseña",
"password_confirm_placeholder": "Repite tu nueva contraseña", "password_confirm_placeholder": "Repite tu nueva contraseña",
"password_hint_placeholder": "Pon la pista para tu contraseña", "password_hint_placeholder": "Pon la pista para tu contraseña",
"password_email_placeholder": "Pon tu e-mail de recuperación", "password_email_placeholder": "Pon tu correo de recuperación",
"password_create_description": "Esta contraseña será necesaria cuando inicies sesión en un nuevo dispositivo, además del código que recibes vía SMS.", "password_create_description": "Esta contraseña será necesaria cuando inicies sesión en un nuevo dispositivo, además del código que recibes vía SMS.",
"password_create_active": "Guardando...", "password_create_active": "Guardando...",
"password_create_submit": "Guardar", "password_create_submit": "Guardar",
@ -195,7 +195,7 @@
"group_invite_link_link_label": "Copiar enlace", "group_invite_link_link_label": "Copiar enlace",
"group_invite_link_loading": "Cargando...", "group_invite_link_loading": "Cargando...",
"group_invite_revoke_active": "Revocando...", "group_invite_revoke_active": "Revocando...",
"group_invite_revoke": "Revocar", "group_invite_revoke": "Anular",
"clipboard_copied": "¡Copiado!", "clipboard_copied": "¡Copiado!",
"clipboard_press_ctrl_c": "Presiona Ctrl+C para copiar", "clipboard_press_ctrl_c": "Presiona Ctrl+C para copiar",
"clipboard_press_cmd_c": "Presiona ⌘+C para copiar", "clipboard_press_cmd_c": "Presiona ⌘+C para copiar",
@ -230,7 +230,7 @@
"confirm_modal_migrate_to_https_md": "Telegram Web ahora soporta cifrado SSL adicional. ¿Quieres cambiar a HTTPS?\nLa versión HTTP será inhabilitada pronto.", "confirm_modal_migrate_to_https_md": "Telegram Web ahora soporta cifrado SSL adicional. ¿Quieres cambiar a HTTPS?\nLa versión HTTP será inhabilitada pronto.",
"confirm_modal_resize_desktop_md": "¿Quieres cambiar a la versión de escritorio?", "confirm_modal_resize_desktop_md": "¿Quieres cambiar a la versión de escritorio?",
"confirm_modal_resize_mobile_md": "¿Quieres cambiar a la versión móvil?", "confirm_modal_resize_mobile_md": "¿Quieres cambiar a la versión móvil?",
"confirm_modal_recovery_email_empty_md": "¡Advertencia! ¿No quieres añadir un e-mail de recuperación para la contraseña?\n\nSi olvidas tu contraseña, perderás el acceso a tu cuenta de Telegram.", "confirm_modal_recovery_email_empty_md": "¡Advertencia! ¿No quieres añadir un correo de recuperación para la contraseña?\n\nSi olvidas tu contraseña, perderás el acceso a tu cuenta de Telegram.",
"confirm_modal_abort_password_setup": "¿Anular la configuración de la verificación en dos pasos?", "confirm_modal_abort_password_setup": "¿Anular la configuración de la verificación en dos pasos?",
"confirm_modal_reset_account_md": "¿Quieres hacerlo?\nEsta acción no se puede deshacer.\n\nSi continúas con el reinicio de tu cuenta, perderás todos tus chats y mensajes, junto con toda la multimedia y archivos que compartiste. ", "confirm_modal_reset_account_md": "¿Quieres hacerlo?\nEsta acción no se puede deshacer.\n\nSi continúas con el reinicio de tu cuenta, perderás todos tus chats y mensajes, junto con toda la multimedia y archivos que compartiste. ",
"confirm_modal_join_group_link": "¿Quieres unirte al grupo «{title}»?", "confirm_modal_join_group_link": "¿Quieres unirte al grupo «{title}»?",
@ -367,7 +367,7 @@
"error_modal_internal_title": "Error del servidor", "error_modal_internal_title": "Error del servidor",
"error_modal_alert": "Alerta", "error_modal_alert": "Alerta",
"error_modal_email_unconfirmed_title": "¡Ya casi!", "error_modal_email_unconfirmed_title": "¡Ya casi!",
"error_modal_email_unconfirmed_descripion": "Por favor, revisa tu e-mail (no olvides la carpeta del spam) para configurar la verificación en dos pasos.", "error_modal_email_unconfirmed_descripion": "Por favor, revisa tu correo (no olvides la carpeta del spam) para configurar la verificación en dos pasos.",
"error_modal_password_success_title": "¡Listo!", "error_modal_password_success_title": "¡Listo!",
"error_modal_password_disabled_title": "Contraseña desactivada", "error_modal_password_disabled_title": "Contraseña desactivada",
"error_modal_media_not_supported_title": "Multimedia no soportado", "error_modal_media_not_supported_title": "Multimedia no soportado",
@ -397,7 +397,7 @@
"error_modal_flood_description": "Estás realizando demasiadas acciones. Por favor, reinténtalo más tarde.", "error_modal_flood_description": "Estás realizando demasiadas acciones. Por favor, reinténtalo más tarde.",
"error_modal_internal_description": "Error interno del servidor. Por favor, reinténtalo más tarde.", "error_modal_internal_description": "Error interno del servidor. Por favor, reinténtalo más tarde.",
"error_modal_tech_details": "Haz clic para detalles técnicos", "error_modal_tech_details": "Haz clic para detalles técnicos",
"error_modal_recovery_na_description": "Como no estableciste un e-mail de recuperación cuando configuraste tu contraseña, las opciones restantes son recordar tu contraseña o restablecer tu cuenta.", "error_modal_recovery_na_description": "Como no estableciste un correo de recuperación cuando configuraste tu contraseña, las opciones restantes son recordar tu contraseña o restablecer tu cuenta.",
"error_modal_password_success_descripion": "Tu contraseña para la verificación en dos pasos está activada.", "error_modal_password_success_descripion": "Tu contraseña para la verificación en dos pasos está activada.",
"error_modal_password_disabled_descripion": "Has desactivado la verificación en dos pasos.", "error_modal_password_disabled_descripion": "Has desactivado la verificación en dos pasos.",
"error_modal_user_not_mutual_contact": "El usuario sólo puede ser invitado por su contacto", "error_modal_user_not_mutual_contact": "El usuario sólo puede ser invitado por su contacto",
@ -416,7 +416,7 @@
"head_settings": "Ajustes", "head_settings": "Ajustes",
"head_log_out": "Cerrar sesión", "head_log_out": "Cerrar sesión",
"head_peer_more": "Más", "head_peer_more": "Más",
"head_select_messages": "Elige mensajes", "head_select_messages": "Elegir mensajes",
"head_media_photos": "Fotos", "head_media_photos": "Fotos",
"head_media_video": "Vídeos", "head_media_video": "Vídeos",
"head_media_documents": "Archivos", "head_media_documents": "Archivos",
@ -545,7 +545,7 @@
"login_recovery_title": "¿Olvidaste la contraseña?", "login_recovery_title": "¿Olvidaste la contraseña?",
"login_code_placeholder": "Código", "login_code_placeholder": "Código",
"login_code_incorrect": "Código incorrecto", "login_code_incorrect": "Código incorrecto",
"login_recovery_description_md": "Hemos enviado un código de recuperación al email que nos proporcionaste:\n\n{email}\n\nPor favor, revisa tu e-mail y pon el código de 6 dígitos que enviamos.", "login_recovery_description_md": "Hemos enviado un código de recuperación al correo que nos proporcionaste:\n\n{email}\n\nPor favor, revisa tu correo y pon el código de 6 dígitos que enviamos.",
"password_recover_active": "Comprobando...", "password_recover_active": "Comprobando...",
"password_recover_submit": "Enviar", "password_recover_submit": "Enviar",
"login_controller_unknown_country": "Desconocido", "login_controller_unknown_country": "Desconocido",

74
app/js/locales/ru-ru.json

@ -10,7 +10,7 @@
"group_modal_info": "Информация о группе", "group_modal_info": "Информация о группе",
"group_modal_pluralize_participants": "{'one': '{} участник', 'few': '{} участника', 'many': '{} участников', 'other': '{} участников'}", "group_modal_pluralize_participants": "{'one': '{} участник', 'few': '{} участника', 'many': '{} участников', 'other': '{} участников'}",
"group_modal_pluralize_online_participants": "{'one': '1 в сети', 'other': '{} в сети'}", "group_modal_pluralize_online_participants": "{'one': '1 в сети', 'other': '{} в сети'}",
"group_modal_pluralize_subscribers": "{'0': 'No subscribers', 'one': '1 subscriber', 'other': '{} subscribers'}", "group_modal_pluralize_subscribers": "{'0': 'Нет подписчиков', 'one': '1 подписчик', 'other': '{} подписчиков'}",
"group_modal_participants": "{total}, {online}", "group_modal_participants": "{total}, {online}",
"group_modal_add_member": "Добавить участника", "group_modal_add_member": "Добавить участника",
"group_modal_return": "Вернуться в группу", "group_modal_return": "Вернуться в группу",
@ -63,7 +63,7 @@
"settings_modal_sounds": "Звук", "settings_modal_sounds": "Звук",
"settings_modal_language": "Язык", "settings_modal_language": "Язык",
"settings_modal_notifications": "Уведомления на рабочем столе", "settings_modal_notifications": "Уведомления на рабочем столе",
"settings_modal_pushes": "Background notifications", "settings_modal_pushes": "Фоновые уведомления",
"settings_modal_message_preview": "Предпросмотр сообщений", "settings_modal_message_preview": "Предпросмотр сообщений",
"settings_modal_sound": "Звук", "settings_modal_sound": "Звук",
"settings_modal_enter_send_description_md": "**Enter** — отправить сообщение, **Shift + Enter** — новая строка", "settings_modal_enter_send_description_md": "**Enter** — отправить сообщение, **Shift + Enter** — новая строка",
@ -125,7 +125,7 @@
"user_modal_share_contact": "Поделиться контактом", "user_modal_share_contact": "Поделиться контактом",
"user_modal_block_user": "Заблокировать пользователя", "user_modal_block_user": "Заблокировать пользователя",
"user_modal_unblock_user": "Разблокировать пользователя", "user_modal_unblock_user": "Разблокировать пользователя",
"user_modal_clear_history": "Clear history", "user_modal_clear_history": "Очистить историю",
"user_modal_delete_chat": "Delete conversation", "user_modal_delete_chat": "Delete conversation",
"user_modal_add_to_group": "Добавить в группу", "user_modal_add_to_group": "Добавить в группу",
"user_modal_info": "Информация", "user_modal_info": "Информация",
@ -152,7 +152,7 @@
"unread_messages_split": "Непрочитанные сообщения", "unread_messages_split": "Непрочитанные сообщения",
"user_name_deleted": "УДАЛЕНО", "user_name_deleted": "УДАЛЕНО",
"user_first_name_deleted": "УДАЛЕНО", "user_first_name_deleted": "УДАЛЕНО",
"user_name_saved_msgs": "Saved Messages", "user_name_saved_msgs": "Сохранённые сообщения",
"user_status_online": "в сети", "user_status_online": "в сети",
"user_status_last_seen": "был(а) в сети {0}", "user_status_last_seen": "был(а) в сети {0}",
"user_status_recently": "был(а) в сети только что", "user_status_recently": "был(а) в сети только что",
@ -160,8 +160,8 @@
"user_status_last_month": "был(а) в сети в течение месяца", "user_status_last_month": "был(а) в сети в течение месяца",
"user_status_long_ago": "был(а) в сети очень давно", "user_status_long_ago": "был(а) в сети очень давно",
"user_status_bot": "бот", "user_status_bot": "бот",
"user_status_service_notifications": "service notifications", "user_status_service_notifications": "сервисные уведомления",
"user_status_support": "support", "user_status_support": "поддержка",
"user_status_bot_noprivacy": "имеет доступ к сообщениям", "user_status_bot_noprivacy": "имеет доступ к сообщениям",
"user_status_bot_privacy": "не имеет доступа к сообщениям", "user_status_bot_privacy": "не имеет доступа к сообщениям",
"chat_title_deleted": "УДАЛЕНО", "chat_title_deleted": "УДАЛЕНО",
@ -175,7 +175,7 @@
"changelog_modal_title_current_version": "текущая версия", "changelog_modal_title_current_version": "текущая версия",
"changelog_modal_full_description_md": "Official free messaging app based on Telegram API for speed and security.\n\nThis software is licensed under GNU GPL version 3.", "changelog_modal_full_description_md": "Official free messaging app based on Telegram API for speed and security.\n\nThis software is licensed under GNU GPL version 3.",
"changelog_modal_changelog_link": "Changelog", "changelog_modal_changelog_link": "Changelog",
"changelog_app_version": "Version {version}", "changelog_app_version": "Версия {version}",
"group_create_contacts_modal_title": "Новая группа", "group_create_contacts_modal_title": "Новая группа",
"group_create_modal_title": "Создать группу", "group_create_modal_title": "Создать группу",
"group_create_name": "Название группы", "group_create_name": "Название группы",
@ -188,7 +188,7 @@
"group_edit_submit_active": "Сохранение...", "group_edit_submit_active": "Сохранение...",
"channel_edit_modal_title": "Edit channel", "channel_edit_modal_title": "Edit channel",
"channel_edit_name": "Название канала", "channel_edit_name": "Название канала",
"channel_edit_about": "Channel description", "channel_edit_about": "Описание канала",
"channel_edit_submit": "Сохранить", "channel_edit_submit": "Сохранить",
"channel_edit_submit_active": "Saving...", "channel_edit_submit_active": "Saving...",
"group_invite_link_modal_title": "Пригласительная ссылка", "group_invite_link_modal_title": "Пригласительная ссылка",
@ -196,7 +196,7 @@
"group_invite_link_loading": "Загрузка", "group_invite_link_loading": "Загрузка",
"group_invite_revoke_active": "Отмена...", "group_invite_revoke_active": "Отмена...",
"group_invite_revoke": "Отозвать", "group_invite_revoke": "Отозвать",
"clipboard_copied": "Copied!", "clipboard_copied": "Скопировано!",
"clipboard_press_ctrl_c": "Press Ctrl+C to copy", "clipboard_press_ctrl_c": "Press Ctrl+C to copy",
"clipboard_press_cmd_c": "Press ⌘+C to copy", "clipboard_press_cmd_c": "Press ⌘+C to copy",
"confirm_modal_logout": "Вы действительно хотите выйти?", "confirm_modal_logout": "Вы действительно хотите выйти?",
@ -212,9 +212,9 @@
"confirm_modal_message_delete": "Удалить это сообщение?", "confirm_modal_message_delete": "Удалить это сообщение?",
"confirm_modal_delete_X_messages": "{'one': '{} message', 'other': '{} messages'}", "confirm_modal_delete_X_messages": "{'one': '{} message', 'other': '{} messages'}",
"confirm_modal_delete_messages": "Are you sure you want to delete {messages}?", "confirm_modal_delete_messages": "Are you sure you want to delete {messages}?",
"confirm_modal_message_revoke": "Delete for {recipient}", "confirm_modal_message_revoke": "Удалить для {recipient}",
"confirm_modal_message_revoke_recipient_chat": "everyone", "confirm_modal_message_revoke_recipient_chat": "everyone",
"confirm_modal_delete_messages_for_everyone_chat": "This will delete messages for everyone in this chat.", "confirm_modal_delete_messages_for_everyone_chat": "Это удалит сообщения для всех в этом чате.",
"confirm_modal_delete_messages_for_you_only_pm": "This will delete messages just for you, not for {user}.", "confirm_modal_delete_messages_for_you_only_pm": "This will delete messages just for you, not for {user}.",
"confirm_modal_delete_messages_for_you_only_chat": "This will delete messages just for you, not for other members of the chat.", "confirm_modal_delete_messages_for_you_only_chat": "This will delete messages just for you, not for other members of the chat.",
"confirm_modal_photo_delete": "Уверены, что хотите удалить это фото?", "confirm_modal_photo_delete": "Уверены, что хотите удалить это фото?",
@ -246,9 +246,9 @@
"confirm_modal_bot_access_geo_inline": "This bot would like to know your location each time you send it a request. This can be used to provide location-specific results.", "confirm_modal_bot_access_geo_inline": "This bot would like to know your location each time you send it a request. This can be used to provide location-specific results.",
"confirm_modal_are_u_sure": "Вы уверены?", "confirm_modal_are_u_sure": "Вы уверены?",
"confirm_modal_logout_submit": "Выход", "confirm_modal_logout_submit": "Выход",
"confirm_modal_clear_history_submit": "Clear history", "confirm_modal_clear_history_submit": "Очистить историю",
"confirm_modal_leave_chat_submit": "Leave", "confirm_modal_leave_chat_submit": "Leave",
"confirm_modal_delete_chat_submit": "Delete chat", "confirm_modal_delete_chat_submit": "Удалить чат",
"confirm_modal_clipboard_files_send_submit": "Отправить", "confirm_modal_clipboard_files_send_submit": "Отправить",
"confirm_modal_clipboard_file_send_submit": "Отправить", "confirm_modal_clipboard_file_send_submit": "Отправить",
"confirm_modal_message_delete_submit": "Удалить", "confirm_modal_message_delete_submit": "Удалить",
@ -271,7 +271,7 @@
"conversations_modal_forward_submit": "Переслать", "conversations_modal_forward_submit": "Переслать",
"conversations_modal_select_recipients": "Выберите получателей", "conversations_modal_select_recipients": "Выберите получателей",
"conversations_modal_recipients": "Получатели:", "conversations_modal_recipients": "Получатели:",
"conversations_modal_share_url_loading": "Loading{dots}", "conversations_modal_share_url_loading": "Загрузка{dots}",
"conversations_modal_share_url_copy": "Click to copy share link", "conversations_modal_share_url_copy": "Click to copy share link",
"contact_edit_modal_first_name": "Имя", "contact_edit_modal_first_name": "Имя",
"contact_edit_modal_last_name": "Фамилия", "contact_edit_modal_last_name": "Фамилия",
@ -284,10 +284,10 @@
"contact_import_modal_submit": "Сохранить", "contact_import_modal_submit": "Сохранить",
"contact_import_modal_submit_active": "Импорт...", "contact_import_modal_submit_active": "Импорт...",
"conversation_you": "Вы", "conversation_you": "Вы",
"conversation_draft": "Draft:", "conversation_draft": "Черновик:",
"conversation_media_photo": "Фотография", "conversation_media_photo": "Фотография",
"conversation_media_video": "Видео", "conversation_media_video": "Видео",
"conversation_media_round": "Video message", "conversation_media_round": "Видеосообщение",
"conversation_media_document": "Файл", "conversation_media_document": "Файл",
"conversation_media_sticker": "Стикер", "conversation_media_sticker": "Стикер",
"conversation_media_gif": "GIF", "conversation_media_gif": "GIF",
@ -295,8 +295,8 @@
"conversation_media_location": "Местоположение", "conversation_media_location": "Местоположение",
"conversation_media_contact": "Контакт", "conversation_media_contact": "Контакт",
"conversation_media_attachment": "Прикрепление", "conversation_media_attachment": "Прикрепление",
"conversation_media_unsupported": "Unsupported attachment", "conversation_media_unsupported": "Вложение не поддерживается",
"conversation_search_peer": "Search in this chat", "conversation_search_peer": "Искать в этом чате",
"conversation_group_created": "создал(а) группу", "conversation_group_created": "создал(а) группу",
"conversation_group_renamed": "изменил(а) название группы", "conversation_group_renamed": "изменил(а) название группы",
"conversation_group_photo_updated": "изменил(а) фото группы", "conversation_group_photo_updated": "изменил(а) фото группы",
@ -315,7 +315,7 @@
"conversation_changed_channel_name": "Канал переименован", "conversation_changed_channel_name": "Канал переименован",
"conversation_changed_channel_photo": "Фото канала изменено", "conversation_changed_channel_photo": "Фото канала изменено",
"conversation_removed_channel_photo": "Фото канала удалено", "conversation_removed_channel_photo": "Фото канала удалено",
"conversation_pinned_message": "pinned message", "conversation_pinned_message": "закреплённое сообщение",
"conversation_scored_X": "{'one': 'scored {}', 'other': 'scored {}'}", "conversation_scored_X": "{'one': 'scored {}', 'other': 'scored {}'}",
"conversation_message_sent": "прислал(а) вам сообщение", "conversation_message_sent": "прислал(а) вам сообщение",
"conversation_forwarded_X_messages": "{'одно': 'отправленное {} сообщение', 'другие': 'отправленные {} сообщения'}", "conversation_forwarded_X_messages": "{'одно': 'отправленное {} сообщение', 'другие': 'отправленные {} сообщения'}",
@ -333,10 +333,10 @@
"message_service_joined_by_link": "присоединился к группе по пригласительной ссылке", "message_service_joined_by_link": "присоединился к группе по пригласительной ссылке",
"message_service_joined": "joined the group", "message_service_joined": "joined the group",
"message_service_pinned_message": "pinned «{message}»", "message_service_pinned_message": "pinned «{message}»",
"message_service_phonecall_incoming": "Incoming Call", "message_service_phonecall_incoming": "Входящий вызов",
"message_service_phonecall_outgoing": "Outgoing Call", "message_service_phonecall_outgoing": "Исходящий вызов",
"message_service_phonecall_missed": "Missed Call", "message_service_phonecall_missed": "Пропущенный вызов",
"message_service_phonecall_canceled": "Cancelled Call", "message_service_phonecall_canceled": "Отменённый вызов",
"message_service_phonecall": "Phone call {duration}", "message_service_phonecall": "Phone call {duration}",
"message_service_scored_game": "{scored} in {message}", "message_service_scored_game": "{scored} in {message}",
"message_service_unsupported_action": "неподдерживаемое действие {action}", "message_service_unsupported_action": "неподдерживаемое действие {action}",
@ -347,9 +347,9 @@
"message_service_changed_channel_photo": "Фото канала изменено", "message_service_changed_channel_photo": "Фото канала изменено",
"message_service_removed_channel_photo": "Фото канала удалено", "message_service_removed_channel_photo": "Фото канала удалено",
"message_service_scored_X": "{'one': 'scored {}', 'other': 'scored {}'}", "message_service_scored_X": "{'one': 'scored {}', 'other': 'scored {}'}",
"message_service_payment_sent": "Payment sent", "message_service_payment_sent": "Платёж отправлен",
"message_service_screenshot_taken": "took a screenshot!", "message_service_screenshot_taken": "took a screenshot!",
"message_admin_badge": "admin", "message_admin_badge": "админ.",
"message_action_reply": "Ответить", "message_action_reply": "Ответить",
"message_action_edit": "Edit", "message_action_edit": "Edit",
"message_action_delete": "Удалить", "message_action_delete": "Удалить",
@ -402,7 +402,7 @@
"error_modal_password_disabled_descripion": "Вы отключили двухэтапную аутентификацию.", "error_modal_password_disabled_descripion": "Вы отключили двухэтапную аутентификацию.",
"error_modal_user_not_mutual_contact": "Пользователь может быть приглашен только пользователем, у которого он есть в контактах", "error_modal_user_not_mutual_contact": "Пользователь может быть приглашен только пользователем, у которого он есть в контактах",
"error_modal_invite_link_invalid": "Пригласительная ссылка недействительна", "error_modal_invite_link_invalid": "Пригласительная ссылка недействительна",
"error_modal_channel_not_accessible": "Sorry, this channel is not accessible.", "error_modal_channel_not_accessible": "Извините, этот канал недоступен.",
"error_modal_not_contact_flood": "Sorry, you can only send messages to mutual contacts at the moment. {more-info-link: More info »}", "error_modal_not_contact_flood": "Sorry, you can only send messages to mutual contacts at the moment. {more-info-link: More info »}",
"error_modal_gelocation_na": "App was unable to determine your current location", "error_modal_gelocation_na": "App was unable to determine your current location",
"error_modal_2fa_recent_confirm": "Your recent attempts to reset this account have been cancelled by its active user. Please try again in 7 days.", "error_modal_2fa_recent_confirm": "Your recent attempts to reset this account have been cancelled by its active user. Please try again in 7 days.",
@ -416,19 +416,19 @@
"head_settings": "Настройки", "head_settings": "Настройки",
"head_log_out": "Выход", "head_log_out": "Выход",
"head_peer_more": "Ещё", "head_peer_more": "Ещё",
"head_select_messages": "Select messages", "head_select_messages": "Выберите сообщения",
"head_media_photos": "Фотографии", "head_media_photos": "Фотографии",
"head_media_video": "Видео", "head_media_video": "Видео",
"head_media_documents": "Файлы", "head_media_documents": "Файлы",
"head_media_music": "Audio", "head_media_music": "Аудио",
"head_media_links": "Shared links", "head_media_links": "Shared links",
"head_media_audio": "Голосовые сообщения", "head_media_audio": "Голосовые сообщения",
"head_media_round": "Video messages", "head_media_round": "Видеосообщения",
"head_media_mymentions": "Mentions", "head_media_mymentions": "Упоминания",
"head_media_search": "Search", "head_media_search": "Поиск",
"head_about": "О приложении", "head_about": "О приложении",
"head_clear_all": "Clear history", "head_clear_all": "Очистить историю",
"head_select": "Select", "head_select": "Выбрать",
"head_typing": "набирает", "head_typing": "набирает",
"head_pluralize_participants": "{'one': '{} участник', 'few': '{} участника', 'many': '{} участников', 'other': '{} участников'}", "head_pluralize_participants": "{'one': '{} участник', 'few': '{} участника', 'many': '{} участников', 'other': '{} участников'}",
"head_one_typing": "{name1} набирает{dots}", "head_one_typing": "{name1} набирает{dots}",
@ -460,10 +460,10 @@
"im_media_video": "Видео", "im_media_video": "Видео",
"im_media_documents": "Файлы", "im_media_documents": "Файлы",
"im_media_audio": "Голосовые сообщения", "im_media_audio": "Голосовые сообщения",
"im_media_round": "Video messages", "im_media_round": "Видеосообщения",
"im_media_music": "Audio", "im_media_music": "Аудио",
"im_media_links": "Shared Links", "im_media_links": "Shared Links",
"im_media_mentions": "Mentions and Replies", "im_media_mentions": "Упоминания и ответы",
"im_pluralize_participants": "{'one': '{} участник', 'few': '{} участника', 'many': '{} участников', 'other': '{} участников'}", "im_pluralize_participants": "{'one': '{} участник', 'few': '{} участника', 'many': '{} участников', 'other': '{} участников'}",
"im_show_recent_messages": "Показать последние сообщения", "im_show_recent_messages": "Показать последние сообщения",
"im_show_all_messages": "Показать все сообщения", "im_show_all_messages": "Показать все сообщения",
@ -495,7 +495,7 @@
"im_attach_file_title": "Отправить файл", "im_attach_file_title": "Отправить файл",
"im_emoji_btn_title": "Вставить смайл", "im_emoji_btn_title": "Вставить смайл",
"im_submit_message": "Отправить", "im_submit_message": "Отправить",
"im_submit_edit_message": "Save", "im_submit_edit_message": "Сохранить",
"im_edit_message_title": "Edit message", "im_edit_message_title": "Edit message",
"im_voice_recording_label": "Release outside this form to cancel", "im_voice_recording_label": "Release outside this form to cancel",
"im_voice_recording_cancel_label": "Release to cancel record", "im_voice_recording_cancel_label": "Release to cancel record",

34
app/js/messages_manager.js

@ -1013,6 +1013,19 @@ angular.module('myApp.services')
return true return true
} }
function canReportMessage(messageID) {
if (!messagesStorage[messageID]) {
return false
}
if (!canEditMessage(messageID)) {
var message = messagesStorage[messageID]
if (!message.pFlags.out) {
return true
}
}
return false
}
function getMessageEditData(messageID) { function getMessageEditData(messageID) {
if (!canEditMessage(messageID)) { if (!canEditMessage(messageID)) {
return $q.reject() return $q.reject()
@ -2177,6 +2190,25 @@ angular.module('myApp.services')
return $q.all(promises) return $q.all(promises)
} }
function reportMessages (mids, reason) {
mids = mids.sort()
var splitted = AppMessagesIDsManager.splitMessageIDsByChannels(mids)
var promises = []
angular.forEach(splitted.msgIDs, function (msgIDs, channelID) {
var peerID = -channelID || getMessagePeer(getMessage(msgIDs[0]))
var promise = MtpApiManager.invokeApi('messages.report', {
peer: AppPeersManager.getInputPeerByID(peerID),
id: msgIDs,
reason: reason
}).then(function (updates) {
ApiUpdatesManager.processUpdateMessage(updates)
})
promises.push(promise)
})
return $q.all(promises)
}
function startBot (botID, chatID, startParam) { function startBot (botID, chatID, startParam) {
var peerID = chatID ? -chatID : botID var peerID = chatID ? -chatID : botID
if (startParam) { if (startParam) {
@ -3847,6 +3879,7 @@ angular.module('myApp.services')
sendFile: sendFile, sendFile: sendFile,
sendOther: sendOther, sendOther: sendOther,
forwardMessages: forwardMessages, forwardMessages: forwardMessages,
reportMessages: reportMessages,
startBot: startBot, startBot: startBot,
shareGame: shareGame, shareGame: shareGame,
editMessage: editMessage, editMessage: editMessage,
@ -3856,6 +3889,7 @@ angular.module('myApp.services')
getMessageShareLink: getMessageShareLink, getMessageShareLink: getMessageShareLink,
canMessageBeEdited: canMessageBeEdited, canMessageBeEdited: canMessageBeEdited,
canEditMessage: canEditMessage, canEditMessage: canEditMessage,
canReportMessage: canReportMessage,
getMessageEditData: getMessageEditData, getMessageEditData: getMessageEditData,
canRevokeMessage: canRevokeMessage, canRevokeMessage: canRevokeMessage,
clearDialogCache: clearDialogCache, clearDialogCache: clearDialogCache,

1
app/partials/desktop/im.html

@ -200,6 +200,7 @@
<a class="btn btn-md btn-md-primary im_edit_cancel_link" ng-click="selectedCancel()" my-i18n="modal_cancel"></a> <a class="btn btn-md btn-md-primary im_edit_cancel_link" ng-click="selectedCancel()" my-i18n="modal_cancel"></a>
<a class="btn btn-primary im_edit_forward_btn" ng-click="selectedForward()" ng-class="{disabled: !selectedCount}" ng-disabled="!selectedCount" my-i18n-format="im_forward"></a> <a class="btn btn-primary im_edit_forward_btn" ng-click="selectedForward()" ng-class="{disabled: !selectedCount}" ng-disabled="!selectedCount" my-i18n-format="im_forward"></a>
<a class="btn btn-primary im_edit_delete_btn" ng-click="selectedDelete()" ng-class="{disabled: !selectedCount}" ng-disabled="!selectedCount" my-i18n-format="im_delete" ng-show="historyState.canDelete"></a> <a class="btn btn-primary im_edit_delete_btn" ng-click="selectedDelete()" ng-class="{disabled: !selectedCount}" ng-disabled="!selectedCount" my-i18n-format="im_delete" ng-show="historyState.canDelete"></a>
<a class="btn btn-primary im_edit_delete_btn" ng-click="selectedReport()" ng-class="{disabled: !selectedCount}" ng-disabled="!selectedCount" my-i18n-format="im_report" ng-show="historyState.canReport"></a>
<a class="btn btn-primary im_edit_reply_btn" ng-click="selectedReply()" ng-show="selectedCount == 1 &amp;&amp; historyState.canReply" my-i18n="im_reply"></a> <a class="btn btn-primary im_edit_reply_btn" ng-click="selectedReply()" ng-show="selectedCount == 1 &amp;&amp; historyState.canReply" my-i18n="im_reply"></a>
<a class="btn btn-primary im_edit_reply_btn" ng-click="selectedEdit()" ng-show="selectedCount == 1 &amp;&amp; historyState.canEdit" my-i18n="im_edit"></a> <a class="btn btn-primary im_edit_reply_btn" ng-click="selectedEdit()" ng-show="selectedCount == 1 &amp;&amp; historyState.canEdit" my-i18n="im_edit"></a>
<my-i18n-param name="count"><strong class="im_selected_count" ng-show="selectedCount > 0" ng-bind="selectedCount"></strong></my-i18n-param> <my-i18n-param name="count"><strong class="im_selected_count" ng-show="selectedCount > 0" ng-bind="selectedCount"></strong></my-i18n-param>

4
app/partials/desktop/inline_results.html

@ -7,7 +7,7 @@
<div class="inline_result_ind"></div> <div class="inline_result_ind"></div>
<div ng-switch-when="botInlineMediaResult" ng-switch="result.document.url !== undefined" class="inline_result_gif_mtproto"> <div ng-switch-when="botInlineMediaResult" ng-switch="result.document.url !== undefined" class="inline_result_gif_mtproto">
<div ng-switch-when="true" ng-switch="result.document.mime_type == 'video/mp4'"> <div ng-switch-when="true" ng-switch="result.document.mime_type == 'video/mp4'">
<video ng-switch-when="true" width="{{result.thumbW}}" height="{{result.thumbH}}" loop autoplay class="img_gif_video"> <video ng-switch-when="true" width="{{result.thumbW}}" height="{{result.thumbH}}" loop autoplay muted class="img_gif_video">
<source ng-src="{{result.document.url}}" type="video/mp4"> <source ng-src="{{result.document.url}}" type="video/mp4">
</video> </video>
<img ng-switch-default class="img_gif_image" ng-src="{{result.document.url}}" width="{{result.thumbW}}" height="{{result.thumbH}}" /> <img ng-switch-default class="img_gif_image" ng-src="{{result.document.url}}" width="{{result.thumbW}}" height="{{result.thumbH}}" />
@ -18,7 +18,7 @@
</div> </div>
<div ng-switch-default ng-switch="result.contentUrl !== undefined" class="inline_result_gif_http"> <div ng-switch-default ng-switch="result.contentUrl !== undefined" class="inline_result_gif_http">
<div ng-switch-when="true" ng-switch="result.content_type == 'video/mp4'"> <div ng-switch-when="true" ng-switch="result.content_type == 'video/mp4'">
<video ng-switch-when="true" width="{{result.thumbW}}" height="{{result.thumbH}}" loop autoplay class="img_gif_video"> <video ng-switch-when="true" width="{{result.thumbW}}" height="{{result.thumbH}}" loop autoplay muted class="img_gif_video">
<source ng-src="{{result.contentUrl}}" type="video/mp4"> <source ng-src="{{result.contentUrl}}" type="video/mp4">
</video> </video>
<img ng-switch-default class="img_gif_image" ng-src="{{result.contentUrl}}" width="{{result.thumbW}}" height="{{result.thumbH}}" /> <img ng-switch-default class="img_gif_image" ng-src="{{result.contentUrl}}" width="{{result.thumbW}}" height="{{result.thumbH}}" />

2
app/partials/desktop/message.html

@ -1,4 +1,4 @@
<div class="im_message_outer_wrap hasselect" ng-click="toggleMessage(historyMessage.mid, $event)"> <div class="im_message_outer_wrap hasselect" ng-click="toggleMessage(historyMessage.mid, $event)" data-msg-id="{{::historyMessage.id}}">
<div class="im_message_wrap clearfix" ng-switch="::historyMessage._ == 'messageService'"> <div class="im_message_wrap clearfix" ng-switch="::historyMessage._ == 'messageService'">

2
app/partials/desktop/message_attach_document.html

@ -1,4 +1,4 @@
<div ng-switch="::media.document.type"> <div ng-switch="::media.document.type" data-doc-id="{{::media.document.id}}">
<div ng-switch-when="gif" my-load-gif document="media.document"></div> <div ng-switch-when="gif" my-load-gif document="media.document"></div>

51
app/partials/desktop/report_msgs_modal.html

@ -0,0 +1,51 @@
<div class="md_simple_modal_wrap" my-modal-position>
<div class="md_simple_modal_body">
<form class="modal_simple_form" ng-submit="$close(reason)">
<h4 my-i18n="report_reason_modal_title"></h4>
<div class="tg_radios_wrap">
<a class="md_modal_section_radio_wrap tg_radio" ng-click="toggleReportReason('inputReportReasonSpam')" ng-class="reason._ == 'inputReportReasonSpam' ? 'tg_radio_on' : ''">
<span class="icon icon-radio-outer"><i class="icon-radio"></i></span>
<span my-i18n="report_reason_modal_spam"></span>
</a>
<a class="md_modal_section_radio_wrap tg_radio" ng-click="toggleReportReason('inputReportReasonViolence')" ng-class="reason._ == 'inputReportReasonViolence' ? 'tg_radio_on' : ''">
<span class="icon icon-radio-outer"><i class="icon-radio"></i></span>
<span my-i18n="report_reason_modal_violence"></span>
</a>
<a class="md_modal_section_radio_wrap tg_radio" ng-click="toggleReportReason('inputReportReasonChildAbuse')" ng-class="reason._ == 'inputReportReasonChildAbuse' ? 'tg_radio_on' : ''">
<span class="icon icon-radio-outer"><i class="icon-radio"></i></span>
<span class="" my-i18n="report_reason_modal_childabuse"></span>
</a>
<a class="md_modal_section_radio_wrap tg_radio" ng-click="toggleReportReason('inputReportReasonPornography')" ng-class="reason._ == 'inputReportReasonPornography' ? 'tg_radio_on' : ''">
<span class="icon icon-radio-outer"><i class="icon-radio"></i></span>
<span my-i18n="report_reason_modal_pornography"></span>
</a>
<a class="md_modal_section_radio_wrap tg_radio" ng-click="toggleReportReason('inputReportReasonOther')" ng-class="reason._ == 'inputReportReasonOther' ? 'tg_radio_on' : ''">
<span class="icon icon-radio-outer"><i class="icon-radio"></i></span>
<span my-i18n="report_reason_modal_other"></span>
</a>
</div>
<div class="md-input-group" my-labeled-input ng-show="reason._ == 'inputReportReasonOther'">
<label class="md-input-label" my-i18n="report_reason_modal_other_placeholder"></label>
<input class="md-input" my-focus-on="ui_reason_text_focus" type="text" ng-model="reason.text" />
</div>
</form>
</div>
<div class="md_simple_modal_footer">
<button class="btn btn-md" ng-click="$dismiss()" my-i18n="modal_cancel"></button>
<button class="btn btn-md btn-md-primary" ng-click="$close(reason)" my-i18n="report_reason_modal_submit_btn"></button>
</div>
</div>

2
app/partials/desktop/settings_modal.html

@ -14,7 +14,7 @@
<div ng-switch-when="true" class="peer_modal_photo md_photo_loading loading_dots"> <div ng-switch-when="true" class="peer_modal_photo md_photo_loading loading_dots">
<i></i><i></i><i></i> <i></i><i></i><i></i>
</div> </div>
<a ng-switch-default ng-click="openPhoto(profile.photo.photo_id, {p: profile.id})" class="peer_modal_photo" my-peer-photolink="::profile.id" img-class="peer_modal_photo" watch="true" no-open="true" ng-class="{disabled: !profile.photo.photo_id}" ng-disabled="!profile.photo.photo_id"></a> <a ng-switch-default ng-click="openUserPic()" class="peer_modal_photo" my-peer-photolink="::profile.id" img-class="peer_modal_photo" watch="true" no-open="true" ng-class="{disabled: !profile.photo.photo_id}" ng-disabled="!profile.photo.photo_id"></a>
</div> </div>
<div class="peer_modal_profile"> <div class="peer_modal_profile">
<div class="peer_modal_profile_name" my-peer-link="profile.id"></div> <div class="peer_modal_profile_name" my-peer-link="profile.id"></div>

2
app/partials/desktop/user_modal.html

@ -11,7 +11,7 @@
<div class="peer_modal_profile_wrap clearfix"> <div class="peer_modal_profile_wrap clearfix">
<div class="peer_modal_photo_wrap pull-left"> <div class="peer_modal_photo_wrap pull-left">
<a ng-click="openPhoto(user.photo.photo_id, {p: user.id})" class="peer_modal_photo" ng-class="{disabled: !user.photo.photo_id}" ng-disabled="!user.photo.photo_id" my-peer-photolink="::user.id" img-class="peer_modal_photo" no-open="true"></a> <a ng-click="openUserPic()" class="peer_modal_photo" ng-class="{disabled: !user.photo.photo_id}" ng-disabled="!user.photo.photo_id" my-peer-photolink="::user.id" img-class="peer_modal_photo" no-open="true"></a>
</div> </div>
<div class="peer_modal_profile"> <div class="peer_modal_profile">
<div class="peer_modal_profile_name" my-peer-link="user.id" verified="true"></div> <div class="peer_modal_profile_name" my-peer-link="user.id" verified="true"></div>

1
app/partials/mobile/message_actions_modal.html

@ -5,6 +5,7 @@
<button ng-if="historyState.canEdit" class="btn btn-md btn-md-primary btn-block" my-i18n="message_action_edit" ng-click="$close('edit')"></button> <button ng-if="historyState.canEdit" class="btn btn-md btn-md-primary btn-block" my-i18n="message_action_edit" ng-click="$close('edit')"></button>
<button class="btn btn-md btn-md-primary btn-block" my-i18n="message_action_forward" ng-click="$close('forward')"></button> <button class="btn btn-md btn-md-primary btn-block" my-i18n="message_action_forward" ng-click="$close('forward')"></button>
<button ng-if="historyState.canDelete" class="btn btn-md btn-md-primary btn-block" my-i18n="message_action_delete" ng-click="$close('delete')"></button> <button ng-if="historyState.canDelete" class="btn btn-md btn-md-primary btn-block" my-i18n="message_action_delete" ng-click="$close('delete')"></button>
<button ng-if="historyState.canReport" class="btn btn-md btn-md-primary btn-block" my-i18n="message_action_report" ng-click="$close('report')"></button>
<button class="btn btn-md btn-md-primary btn-block" my-i18n="message_action_select" ng-click="$close('select')"></button> <button class="btn btn-md btn-md-primary btn-block" my-i18n="message_action_select" ng-click="$close('select')"></button>
<button class="btn btn-md btn-block" my-i18n="message_action_cancel" ng-click="$dismiss()"></button> <button class="btn btn-md btn-block" my-i18n="message_action_cancel" ng-click="$dismiss()"></button>
</div> </div>

3
app/partials/mobile/message_attach_photo.html

@ -1,4 +1,5 @@
<a class="im_message_photo_thumb" ng-click="openPhoto(media.photo.id, {m: messageId})" ng-style="::{width: media.photo.thumb.width + 'px'}" ng-mouseover="preloadPhoto(media.photo.id)"> <a class="im_message_photo_thumb" ng-click="openPhoto(media.photo.id, {m: messageId})" ng-style="::{width: media.photo.thumb.width + 'px'}" ng-mouseover="preloadPhoto(media.photo.id)" data-photo-id="{{::media.photo.id}}">
<img <img
class="im_message_photo_thumb" class="im_message_photo_thumb"
my-load-thumb my-load-thumb

2
app/partials/mobile/settings_modal.html

@ -59,7 +59,7 @@
<div class="mobile_user_modal_photo_profile_wrap"> <div class="mobile_user_modal_photo_profile_wrap">
<a ng-click="openPhoto(profile.photo.photo_id, {p: profile.id})" class="mobile_user_modal_image_wrap pull-left" my-peer-photolink="::profile.id" img-class="mobile_user_modal_image" no-open="true" watch="true" ng-class="{disabled: !profile.photo.photo_id}" ng-disabled="!profile.photo.photo_id"></a> <a ng-click="openUserPic()" class="mobile_user_modal_image_wrap pull-left" my-peer-photolink="::profile.id" img-class="mobile_user_modal_image" no-open="true" watch="true" ng-class="{disabled: !profile.photo.photo_id}" ng-disabled="!profile.photo.photo_id"></a>
<div class="mobile_user_modal_info_wrap clearfix"> <div class="mobile_user_modal_info_wrap clearfix">
<h4 class="mobile_user_modal_header" my-peer-link="profile.id"></h4> <h4 class="mobile_user_modal_header" my-peer-link="profile.id"></h4>

2
app/partials/mobile/user_modal.html

@ -52,7 +52,7 @@
<div class="mobile_user_modal_photo_profile_wrap"> <div class="mobile_user_modal_photo_profile_wrap">
<a ng-click="openPhoto(user.photo.photo_id, {p: user.id})" class="mobile_user_modal_image_wrap pull-left" my-peer-photolink="::user.id" img-class="mobile_user_modal_image" no-open="true" watch="true" ng-class="{disabled: !user.photo.photo_id}" ng-disabled="!user.photo.photo_id"></a> <a ng-click="openUserPic()" class="mobile_user_modal_image_wrap pull-left" my-peer-photolink="::user.id" img-class="mobile_user_modal_image" no-open="true" watch="true" ng-class="{disabled: !user.photo.photo_id}" ng-disabled="!user.photo.photo_id"></a>
<div class="mobile_user_modal_info_wrap clearfix"> <div class="mobile_user_modal_info_wrap clearfix">
<h4 class="mobile_user_modal_header" my-peer-link="user.id" verified="true"></h4> <h4 class="mobile_user_modal_header" my-peer-link="user.id" verified="true"></h4>

4
package.json

@ -45,7 +45,7 @@
"homepage": "http://zhukov.github.io/webogram", "homepage": "http://zhukov.github.io/webogram",
"devDependencies": { "devDependencies": {
"del": "^1.2.0", "del": "^1.2.0",
"event-stream": "^3.1.0", "event-stream": "~3.1.0",
"gulp": "^3.9.0", "gulp": "^3.9.0",
"gulp-angular-templatecache": "^1.1.0", "gulp-angular-templatecache": "^1.1.0",
"gulp-concat": "^2.1.7", "gulp-concat": "^2.1.7",
@ -74,7 +74,7 @@
"karma-phantomjs-launcher": "^1.0.2", "karma-phantomjs-launcher": "^1.0.2",
"phantomjs-prebuilt": "^2.1.14", "phantomjs-prebuilt": "^2.1.14",
"run-sequence": "^1.0.2", "run-sequence": "^1.0.2",
"st": "^0.5.2", "st": ">=1.2.2",
"sw-precache": "^3.2.0" "sw-precache": "^3.2.0"
}, },
"standard": { "standard": {

Loading…
Cancel
Save