mirror of
https://github.com/openvk/openvk
synced 2025-07-07 00:09:48 +03:00
Compare commits
6 commits
d64c36d2e4
...
5b7c9df6f3
Author | SHA1 | Date | |
---|---|---|---|
|
5b7c9df6f3 | ||
|
5e7ac304a5 | ||
|
c25fd84c11 | ||
|
0a73a40f5f | ||
|
c82e2c9f4c | ||
|
04d24aaba3 |
6 changed files with 133 additions and 21 deletions
|
@ -169,6 +169,13 @@ final class SupportPresenter extends OpenVKPresenter
|
|||
$_redirect = "/support?act=list";
|
||||
}
|
||||
|
||||
$helpdeskChat = OPENVK_ROOT_CONF["openvk"]["credentials"]["telegram"]["helpdeskChat"];
|
||||
if ($helpdeskChat) {
|
||||
$serverUrl = ovk_scheme(true) . $_SERVER["SERVER_NAME"];
|
||||
$telegramText = "❌ <b>Тикет под названием</b> "{$ticket->getName()}" от <a href='$serverUrl{$ticket->getUser()->getURL()}'>{$ticket->getUser()->getCanonicalName()}</a> ({$ticket->getUser()->getRegistrationIP()}) <b>был удалён.</b>\n";
|
||||
Telegram::send($helpdeskChat, $telegramText);
|
||||
}
|
||||
|
||||
$ticket->delete();
|
||||
$this->redirect($_redirect);
|
||||
}
|
||||
|
@ -200,6 +207,16 @@ final class SupportPresenter extends OpenVKPresenter
|
|||
$comment->setCreated(time());
|
||||
$comment->save();
|
||||
|
||||
$helpdeskChat = OPENVK_ROOT_CONF["openvk"]["credentials"]["telegram"]["helpdeskChat"];
|
||||
if ($helpdeskChat) {
|
||||
$serverUrl = ovk_scheme(true) . $_SERVER["SERVER_NAME"];
|
||||
$commentText = ovk_proc_strtr($this->postParam("text"), 1500);
|
||||
$telegramText = "💬 <b>Новый комментарий от автора тикета</b> <a href='$serverUrl/support/reply/$id'>"{$ticket->getName()}"</a>\n";
|
||||
$telegramText .= "$commentText\n\n";
|
||||
$telegramText .= "Автор: <a href='$serverUrl{$ticket->getUser()->getURL()}'>{$ticket->getUser()->getCanonicalName()}</a> ({$ticket->getUser()->getRegistrationIP()})\n";
|
||||
Telegram::send($helpdeskChat, $telegramText);
|
||||
}
|
||||
|
||||
$this->redirect("/support/view/" . $id);
|
||||
} else {
|
||||
$this->flashFail("err", tr("error"), tr("you_have_not_entered_text"));
|
||||
|
@ -227,15 +244,33 @@ final class SupportPresenter extends OpenVKPresenter
|
|||
{
|
||||
$this->assertPermission('openvk\Web\Models\Entities\TicketReply', 'write', 0);
|
||||
|
||||
$support_names = new SupportAgents();
|
||||
$agent = $support_names->get($this->user->id);
|
||||
$ticket = $this->tickets->get($id);
|
||||
|
||||
if ($_SERVER["REQUEST_METHOD"] === "POST") {
|
||||
$this->willExecuteWriteAction();
|
||||
|
||||
$helpdeskChat = OPENVK_ROOT_CONF["openvk"]["credentials"]["telegram"]["helpdeskChat"];
|
||||
|
||||
if (!empty($this->postParam("text")) && !empty($this->postParam("status"))) {
|
||||
$ticket->setType($this->postParam("status"));
|
||||
$status = $this->postParam("status");
|
||||
$ticket->setType($status);
|
||||
$ticket->save();
|
||||
|
||||
switch ($status) {
|
||||
default:
|
||||
# NOTICE falling through
|
||||
case 0:
|
||||
$state = "Вопрос на рассмотрении";
|
||||
break;
|
||||
case 1:
|
||||
$state = "Есть ответ";
|
||||
break;
|
||||
case 2:
|
||||
$state = "Закрыто";
|
||||
}
|
||||
|
||||
$comment = new TicketComment();
|
||||
$comment->setUser_id($this->user->id);
|
||||
$comment->setUser_type(1);
|
||||
|
@ -243,9 +278,42 @@ final class SupportPresenter extends OpenVKPresenter
|
|||
$comment->setTicket_Id($id);
|
||||
$comment->setCreated(time());
|
||||
$comment->save();
|
||||
|
||||
if ($helpdeskChat) {
|
||||
$serverUrl = ovk_scheme(true) . $_SERVER["SERVER_NAME"] . "/support/agent" . $this->user->id;
|
||||
$ticketUrl = ovk_scheme(true) . $_SERVER["SERVER_NAME"] . "/support/reply/" . $id;
|
||||
$commentText = ovk_proc_strtr($this->postParam("text"), 1500);
|
||||
$telegramText = "💬 <b>Новый комментарий от агента к тикету</b> <a href='$ticketUrl'>"{$ticket->getName()}"</a>\n";
|
||||
$telegramText .= "Статус: {$state}\n\n";
|
||||
$telegramText .= "$commentText\n\n";
|
||||
$telegramText .= "Агент: <a href='$serverUrl'>{$this->user->identity->getFullName()}</a>\n";
|
||||
Telegram::send($helpdeskChat, $telegramText);
|
||||
}
|
||||
} elseif (empty($this->postParam("text"))) {
|
||||
$ticket->setType($this->postParam("status"));
|
||||
$status = $this->postParam("status");
|
||||
$ticket->setType($status);
|
||||
$ticket->save();
|
||||
|
||||
switch ($status) {
|
||||
default:
|
||||
# NOTICE falling through
|
||||
case 0:
|
||||
$state = "Вопрос на рассмотрении";
|
||||
break;
|
||||
case 1:
|
||||
$state = "Есть ответ";
|
||||
break;
|
||||
case 2:
|
||||
$state = "Закрыто";
|
||||
}
|
||||
|
||||
if ($helpdeskChat) {
|
||||
$serverUrl = ovk_scheme(true) . $_SERVER["SERVER_NAME"] . "/support/agent" . $this->user->id;
|
||||
$ticketUrl = ovk_scheme(true) . $_SERVER["SERVER_NAME"] . "/support/reply/" . $id;
|
||||
$telegramText = "🔔 <b>Изменён статус тикета</b> <a href='$ticketUrl'>"{$ticket->getName()}"</a>: <b>{$state}</b>\n\n";
|
||||
$telegramText .= "Агент: <a href='$serverUrl'>{$this->user->identity->getFullName()}</a>\n";
|
||||
Telegram::send($helpdeskChat, $telegramText);
|
||||
}
|
||||
}
|
||||
|
||||
$this->flashFail("succ", tr("ticket_changed"), tr("ticket_changed_comment"));
|
||||
|
@ -442,6 +510,13 @@ final class SupportPresenter extends OpenVKPresenter
|
|||
$ticket->setType(2);
|
||||
$ticket->save();
|
||||
|
||||
$helpdeskChat = OPENVK_ROOT_CONF["openvk"]["credentials"]["telegram"]["helpdeskChat"];
|
||||
if ($helpdeskChat) {
|
||||
$serverUrl = ovk_scheme(true) . $_SERVER["SERVER_NAME"];
|
||||
$telegramText = "🔒 <b>Тикет под названием</b> <a href='$serverUrl/support/reply/{$ticket->getId()}'>"{$ticket->getName()}"</a> от <a href='$serverUrl{$ticket->getUser()->getURL()}'>{$ticket->getUser()->getCanonicalName()}</a> ({$ticket->getUser()->getRegistrationIP()}) <b>был закрыт автором.</b>\n";
|
||||
Telegram::send($helpdeskChat, $telegramText);
|
||||
}
|
||||
|
||||
$this->flashFail("succ", tr("ticket_changed"), tr("ticket_changed_comment"));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -129,13 +129,15 @@
|
|||
{var $avatarLink = ((is_null($avatarPhoto) ? FALSE : $avatarPhoto->isAnonymous()) ? "/photo" . ("s/" . base_convert((string) $avatarPhoto->getId(), 10, 32)) : $club->getAvatarLink())}
|
||||
<div class="avatar_block" style="position:relative;" data-club="{$club->getId()}">
|
||||
{if $thisUser && $club->canBeModifiedBy($thisUser)}
|
||||
<a {if $avatarPhoto}style="display:none"{/if} class="add_image_text" id="add_image">{_add_image}</a>
|
||||
<div {if !$avatarPhoto}style="display:none"{/if} class="avatar_controls">
|
||||
<div class="avatarDelete hoverable"></div>
|
||||
<div class="avatar_variants">
|
||||
<a class="_add_image hoverable" id="add_image"><span>{_upload_new_picture}</span></a>
|
||||
</div>
|
||||
<div class="avatar_controls">
|
||||
<div {if !$hasAvatar}style="display:none"{/if} class="avatarDelete hoverable"></div>
|
||||
<div class="avatar_variants">
|
||||
<a {if $hasAvatar}style="display:none"{/if} class="_add_image hoverable upload_image" id="add_image">
|
||||
<span>{_add_image}</span></a>
|
||||
<a {if !$hasAvatar}style="display:none"{/if} class="_add_image hoverable set_image" id="add_image">
|
||||
<span>{_upload_new_picture}</span></a>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<a href="{$avatarLink|nocheck}">
|
||||
|
|
|
@ -73,11 +73,13 @@
|
|||
{var $hasAvatar = !str_contains($user->getAvatarUrl('miniscule'), "/assets/packages/static/openvk/img/camera_200.png")}
|
||||
|
||||
{if $thisUser && $user->getId() == $thisUser->getId()}
|
||||
<a {if $hasAvatar}style="display:none"{/if} class="add_image_text" id="add_image">{_add_image}</a>
|
||||
<div {if !$hasAvatar}style="display:none"{/if} class="avatar_controls">
|
||||
<div class="avatarDelete hoverable"></div>
|
||||
<div class="avatar_controls">
|
||||
<div {if !$hasAvatar}style="display:none"{/if} class="avatarDelete hoverable"></div>
|
||||
<div class="avatar_variants">
|
||||
<a class="_add_image hoverable" id="add_image"><span>{_upload_new_picture}</span></a>
|
||||
<a {if $hasAvatar}style="display:none"{/if} class="_add_image hoverable upload_image" id="add_image">
|
||||
<span>{_add_image}</span></a>
|
||||
<a {if !$hasAvatar}style="display:none"{/if} class="_add_image hoverable set_image" id="add_image">
|
||||
<span>{_upload_new_picture}</span></a>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
|
|
@ -2179,9 +2179,11 @@ $(document).on("click", "#add_image", (e) => {
|
|||
|
||||
document.querySelector("#bigAvatar").src = response.url
|
||||
document.querySelector("#bigAvatar").parentNode.href = "/photo" + response.new_photo
|
||||
|
||||
document.querySelector(".add_image_text").style.display = "none"
|
||||
|
||||
document.querySelector(".avatar_controls").style.display = "block"
|
||||
document.querySelector(".avatar_controls .set_image").style.display = "block"
|
||||
document.querySelector(".avatar_controls .avatarDelete").style.display = "block"
|
||||
document.querySelector(".avatar_controls .upload_image").style.display = "none"
|
||||
}
|
||||
})
|
||||
})
|
||||
|
@ -2305,17 +2307,18 @@ $(document).on("click", ".avatarDelete", (e) => {
|
|||
}
|
||||
|
||||
document.querySelector(".avatarDelete").classList.remove("lagged")
|
||||
|
||||
|
||||
u("body").removeClass("dimmed");
|
||||
document.querySelector("html").style.overflowY = "scroll"
|
||||
u(".ovk-diag-cont").remove()
|
||||
|
||||
document.querySelector("#bigAvatar").src = response.url
|
||||
document.querySelector("#bigAvatar").parentNode.href = response.new_photo ? ("/photo" + response.new_photo) : "javascript:void(0)"
|
||||
|
||||
|
||||
if(!response.has_new_photo) {
|
||||
document.querySelector(".avatar_controls").style.display = "none"
|
||||
document.querySelector(".add_image_text").style.display = "block"
|
||||
document.querySelector(".avatar_controls .set_image").style.display = "none"
|
||||
document.querySelector(".avatar_controls .avatarDelete").style.display = "none"
|
||||
document.querySelector(".avatar_controls .upload_image").style.display = "block"
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
3
install/sqls/00055-agent-card-fix.sql
Normal file
3
install/sqls/00055-agent-card-fix.sql
Normal file
|
@ -0,0 +1,3 @@
|
|||
ALTER TABLE `support_names`
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY(`id`);
|
|
@ -597,6 +597,8 @@
|
|||
"my_feedback" = "Мої Відповіді";
|
||||
"my_apps" = "Застосунки";
|
||||
"my_settings" = "Мої Налаштування";
|
||||
"bookmarks" = "Вподобані";
|
||||
"bookmarks_tab" = "Вподобане";
|
||||
"bug_tracker" = "Баг-трекер";
|
||||
|
||||
"menu_settings" = "Налаштування";
|
||||
|
@ -647,6 +649,7 @@
|
|||
"cut" = "Квадратні";
|
||||
"round avatars" = "Круглі";
|
||||
"apply_style_for_this_device" = "Застосувати стиль лише для цього пристрою";
|
||||
"ui_settings_window" = "Додаткові налаштування";
|
||||
"search_for_groups" = "Пошук спільнот";
|
||||
"search_for_users" = "Пошук користувачів";
|
||||
"search_for_posts" = "Пошук дописів";
|
||||
|
@ -853,7 +856,8 @@
|
|||
"audio_embed_deleted" = "Аудіозапис видалено";
|
||||
"audio_embed_withdrawn" = "Аудіозапис було вилучено на вимогу правовласника";
|
||||
"audio_embed_forbidden" = "Налаштування конфіденційності користувача не дозволяють вбудовувати цей аудіозапис";
|
||||
"audio_embed_processing" = "Аудіозапис ще обробляється або було оброблено неправильно.";
|
||||
"audio_embed_processing" = "Аудіозапис ще обробляється або був неправильно оброблений.";
|
||||
"audio_embed_processing_bait" = "Все одно відтворити";
|
||||
|
||||
"audios_count_zero" = "Немає аудіозаписів";
|
||||
"audios_count_one" = "Один аудіозапис";
|
||||
|
@ -872,6 +876,7 @@
|
|||
"audio_search" = "Пошук";
|
||||
|
||||
"my_audios_small" = "Мої аудіозаписи";
|
||||
"my_audios_small_uploaded" = "Завантажене";
|
||||
"my_playlists" = "Мій список відтворення";
|
||||
"playlists" = "Списки відтворення";
|
||||
"audios_explicit" = "Має нецензурну лексику";
|
||||
|
@ -962,6 +967,12 @@
|
|||
"audio_ctx_play_next" = "Відтворити наступним";
|
||||
"audio_ctx_clear_context" = "Очистити список аудіозаписів";
|
||||
|
||||
"is_x_audio_zero" = "Немає аудіозаписів";
|
||||
"is_x_audio_one" = "Один аудіозапис.";
|
||||
"is_x_audio_few" = "Всього $1 аудіозаписа.";
|
||||
"is_x_audio_many" = "Всього $1 аудіозаписів.";
|
||||
"is_x_audio_other" = "Всього $1 аудіозаписів.";
|
||||
|
||||
/* Notifications */
|
||||
|
||||
"feedback" = "Відповіді";
|
||||
|
@ -1977,6 +1988,7 @@
|
|||
"s_apps" = "Застосунки";
|
||||
"s_posts" = "Дописи";
|
||||
"s_comments" = "Коментарі";
|
||||
"s_photos" = "Фотографії";
|
||||
"s_videos" = "Відео";
|
||||
"s_audios" = "Музика";
|
||||
"s_audios_playlists" = "Списки відтворення";
|
||||
|
@ -2087,7 +2099,8 @@
|
|||
"mobile_menu" = "Меню";
|
||||
"mobile_like" = "Подобається";
|
||||
"mobile_user_info_hide" = "Приховувати";
|
||||
"mobile_user_info_show_details" = "Показати докладніше";
|
||||
"mobile_user_info_show_details" = "Відобразити докладніше";
|
||||
"mobile_attachment_only_for_pc" = "Вкладення недоступне в PDA версії, його перегляд можливий тільки з іншого пристрою";
|
||||
"my" = "Мої";
|
||||
"enter_a_name_or_artist" = "Введіть назву або виконавця...";
|
||||
|
||||
|
@ -2237,4 +2250,18 @@
|
|||
"documents_sort_size" = "За розміром";
|
||||
"select_doc" = "Вибір документа";
|
||||
"no_documents" = "Документів немає";
|
||||
"go_to_my_documents" = "Перейти до моїх документів";
|
||||
"go_to_my_documents" = "Перейти до Моїх документів";
|
||||
|
||||
/* Fave */
|
||||
|
||||
"faves" = "Закладки";
|
||||
"faves_empty_tip" = "Тут відображатиметься вподобаний Вами контент...";
|
||||
"faves_posts_empty_tip" = "Тут відображатимуться вподобані Вами дописи.";
|
||||
"faves_comments_empty_tip" = "Тут відображатимуться вподобані Вами коментарі.";
|
||||
"faves_photos_empty_tip" = "Тут відображатимуться вподобані Вами фотографії.";
|
||||
"faves_videos_empty_tip" = "Тут відображатимуться вподобані Вами відеозаписи.";
|
||||
"faves_zero" = "Жодного вподобання";
|
||||
"faves_one" = "Одна вподобання";
|
||||
"faves_few" = "$1 вподобання";
|
||||
"faves_many" = "$1 вподобань";
|
||||
"faves_other" = "$1 вподобань";
|
||||
|
|
Loading…
Reference in a new issue