forked from Dgors03/Answer_Templates
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e08e220c19 | |||
| 93b67f2e73 | |||
| 86936cdf05 | |||
| 19c5af6e68 |
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"name": "Izipus",
|
||||
"version": "1.1.0",
|
||||
"manifest_version": 2,
|
||||
"description": "Izipus -- help your a...",
|
||||
"homepage_url": "https://github.com/AM-EO/izipus",
|
||||
"version": "0.3.1",
|
||||
"manifest_version": 3,
|
||||
"description": "Lzipus - assists your workflow by simplifying interactions.",
|
||||
"homepage_url": "https://git.gorshenin.info/Dgors03/Answer_Templates",
|
||||
"icons": {
|
||||
"16": "icons/icon16.png",
|
||||
"48": "icons/icon48.png",
|
||||
"128": "icons/icon128.png"
|
||||
},
|
||||
"browser_action": {
|
||||
"default_icon": "icons/icon19.png",
|
||||
"default_title": "browser action demo",
|
||||
"default_popup": "src/browser_action/popup.html"
|
||||
"action": {
|
||||
"default_icon": "icons/icon48.png",
|
||||
"default_title": "Izipus - Quick Actions",
|
||||
"default_popup": "src/popup.html"
|
||||
},
|
||||
"permissions": [
|
||||
"clipboardRead",
|
||||
@@ -20,5 +20,10 @@
|
||||
"contextMenus",
|
||||
"storage",
|
||||
"cookies"
|
||||
]
|
||||
}
|
||||
],
|
||||
"browser_specific_settings": {
|
||||
"gecko": {
|
||||
"id": "dmitriy.gorshenin1@gmail.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,387 +0,0 @@
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
document.getElementById("inWorkRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги, здравствуйте.\n\nПриняли Ваш запрос в работу. Сообщим по мере поступления информации.")
|
||||
});
|
||||
document.getElementById("inWorkEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Dear customer,\n\nWe are working on your request.")
|
||||
});
|
||||
document.getElementById("dialogueRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги, здравствуйте.\n\nУведомляем вас о том, что мы начали диалог с оператором по данному запросу. Мы ожидаем ответа и будем держать вас в курсе любых изменений.")
|
||||
});
|
||||
document.getElementById("dialogueEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Dear colleagues.\n\nWe would like to inform you that we have started a dialogue with the operator on this request. We are awaiting a response and will keep you informed of any changes.")
|
||||
});
|
||||
document.getElementById("nonDelRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги, здравствуйте.\n\nПросьба уточнить причину недоставки следующих сообщений клиенту:")
|
||||
});
|
||||
document.getElementById("nonDelEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Dear colleagues,\n\nPlease check why the following messages were not delivered:")
|
||||
});
|
||||
document.getElementById("fixItRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги,\n\nМы не фиксируем на нашей платформе ваших СМС-сообщений, просьба предоставить ответ от нашей платформы на ваш запрос отправки. Так же просьба предоставить логи, подтверждающие отправку на нашу платформу, данная информация необходима для дальнейшего анализа вашего запроса.")
|
||||
});
|
||||
document.getElementById("fixItEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Dear colleagues,\n\nWe do not record your SMS messages on our platform, please provide a response from our platform to your request to send. Please also provide logs confirming sending to our platform, this information is necessary for further analysis of your request.")
|
||||
});
|
||||
document.getElementById("fakeRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги, здравствуйте.\n\nПросьба уточнить корректность статусов доставки следующих сообщений клиенту. Абонент не получал СМС.")
|
||||
});
|
||||
document.getElementById("fakeEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Dear colleagues,\n\nPlease clarify the correctness of the delivery statuses of the following messages to the client. The subscriber did not receive an SMS.")
|
||||
});
|
||||
document.getElementById("weworkRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги, здравствуйте.\n\nУведомляем вас о том, что работы по вашему запросу продолжаются. Как только появится информация, мы вам сообщим.\n\nБлагодарим за понимание и приносим извинения за доставленные неудобства.\n")
|
||||
});
|
||||
document.getElementById("weworkEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Dear Colleagues.\n\nWe notify you that work on your request is ongoing. As soon as information becomes available, we will inform you.\n\nThank you for your understanding and we apologize for the inconvenience caused.\n")
|
||||
});
|
||||
document.getElementById("wework2Ru").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги, здравствуйте.\n\nЖдем ответа от оператора. Сообщим, как только появится соответствующая информация. Спасибо!")
|
||||
});
|
||||
document.getElementById("wework2En").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Dear Colleagues.\n\nWe are waiting for a response from the operator. We will inform you as soon as we have an update. Thank you!")
|
||||
});
|
||||
document.getElementById("wework3Ru").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Здравствуйте!\n\nОтправили повторный запрос оператору по данному поводу.\n\nСпасибо!")
|
||||
});
|
||||
document.getElementById("wework3En").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Hello!\n\nWe have sent an additional request to the operator.\n\nThank you!")
|
||||
});
|
||||
document.getElementById("theyworkRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Здравствуйте, коллеги.\n\nПоявилась ли информация по данному вопросу?\n\nСпасибо.")
|
||||
});
|
||||
document.getElementById("theyworkEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Dear colleagues,\n\nIs there any information on this request?\n\nThank you.")
|
||||
});
|
||||
document.getElementById("theywork2Ru").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Добрый день!\n\nПросим вернуться с ответом.\n\nБольшое спасибо!")
|
||||
});
|
||||
document.getElementById("theywork2En").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Hello Team!\n\nPlease let us know if there are any updates.\n\nThank you!")
|
||||
});
|
||||
document.getElementById("theywork3Ru").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Здравствуйте!\n\nПодскажите, пожалуйста, появились ли новости.\n\nСпасибо!")
|
||||
});
|
||||
document.getElementById("theywork3En").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Hello!\n\nPlease kindly advise on issue status.\n\nThank you.")
|
||||
});
|
||||
document.getElementById("delivedRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги,\n\nСообщение успешно прошло через платформу и было отправлено оператору. По информации от оператора, сообщение было своевременно доставлено. В случае, если абонент утверждает, что сообщения не были получены, просьба проверить исправность работы ТА. Возможные рекомендации: перезагрузка телефона, очистка памяти от устаревших сообщений, проверка спам-фильтров и черных списков, обновление ПО.\n\nПри сохранении проблемы, просьба запросить у абонента детализацию. Данная информация потребуется для дальнейшего взаимодействия с оператором.")
|
||||
});
|
||||
document.getElementById("delivedEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Colleagues, according to the information from the operator, messages were delivered in a timely manner. If the subscriber claims that the messages have not been received, please check that device is working correctly. Possible recommendations: reboot the phone, clear message memory, check spam filters and blacklists, update the software.\n\nIf the problem still persists, please ask the subscriber for details. This information is necessary to continue interaction with the operator.")
|
||||
});
|
||||
document.getElementById("problphRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги,\n\nСообщение успешно прошло через платформу и было отправлено оператору. По информации от оператора, сообщение не было доставлено абоненту по причине сбоя ТА. Возможные рекомендации для абонента: перезагрузка телефона, очистка памяти от устаревших сообщений, проверка спам-фильтров и черных списков, обновление ПО.\n\nПросьба уведомить нас в случае, если ситуация повторится.")
|
||||
});
|
||||
document.getElementById("problphEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Colleagues, according to the information from the operator, messages were not delivered due to subscriber’s device failure. Possible recommendations: reboot the phone, clear message memory, check spam filters and blacklists, update the software.\nPlease let us know if the problem persist.")
|
||||
});
|
||||
document.getElementById("notservRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Здравствуйте, коллеги.\n\nСообщение успешно прошло через платформу и было отправлено оператору. По информации от оператора, сообщение абоненту не было доставлено, т.к. номер телефона не существует или не обслуживается.")
|
||||
});
|
||||
document.getElementById("notservEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Colleagues\n\nThe message successfully passed through the platform and was sent to the operator. According to the information from the operator, the messages were not delivered to the subscriber because the phone number does not exist or is not serviced.")
|
||||
});
|
||||
document.getElementById("insentRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги,\n\nСообщение успешно прошло через платформу и было отправлено оператору. Сообщение находится в статусе Отправлено, SMS-центр оператора продолжает осуществлять попытки его доставки.\nНаиболее вероятной причиной задержки в доставке может являться нахождение абонента в зоне неуверенного приема сети, также возможен технический сбой в работе телефона абонента.")
|
||||
});
|
||||
document.getElementById("insentEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Colleagues,\n\nThe messages are in Sent status, operator's SMS center is continuing delivery attempts. Most likely, delivery delays are caused by subscriber being in the area of uncertain network reception, or a technical failure in the operation of the subscriber's phone is also possible.")
|
||||
});
|
||||
document.getElementById("dubleRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги,\n\nМониторингом были зафиксированы дубликаты сообщений, в связи с чем сработала блокировка. Если в короткий промежуток времени на площадку поступает два одинаковых сообщения, повторное блокируется как дубликат.\nЕсли отправка дубликатов была запланирована, либо номер абонента используется для тестирования подключения, просьба сообщить, мы добавим абонента в белый список. ")
|
||||
});
|
||||
document.getElementById("dubleEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Colleagues, duplicates were blocked by our monitoring system. If two identical messages are received within a short period of time, the second one is blocked as a duplicate. If sending duplicates was planned, or the subscriber's number is used for testing, please let us know and we will whitelist the subscriber.")
|
||||
});
|
||||
document.getElementById("unvelbRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги,\n\nСообщение успешно прошло через платформу и было отправлено оператору. Сообщение абоненту не было доставлено т.к. ТА абонента был недоступен - выключен или находился в зоне неуверенного приема сигнала.\nРекомендуем абоненту перезагрузить телефон, проверить доступность сети оператора, очистить память телефона от устаревших сообщений.\n")
|
||||
});
|
||||
document.getElementById("unvelbEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Colleagues,\n\nThe messages were not delivered to the subscriber because the subscriber's phone was unavailable - turned off or was in the zone of uncertain signal reception.\nWe recommend that the subscriber restart the phone, check the availability of the operator's network, and clear the phone's memory of outdated messages.\n")
|
||||
});
|
||||
document.getElementById("delayRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги, здравствуйте.\n\nПросьба уточнить текущий статус сообщений и причины задержек:")
|
||||
});
|
||||
document.getElementById("delayEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Dear Colleagues.\n\nPlease clarify current messages status and the reasons for the delays:")
|
||||
});
|
||||
document.getElementById("conbreRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги, здравствуйте.\n\nНаблюдаем разрыв соединения. Просьба уточнить, ситуация штатная?")
|
||||
});
|
||||
document.getElementById("conbreEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Dear colleagues.\n\nWe observe a connection break. Please clarify whether it’s a standard situation.")
|
||||
});
|
||||
document.getElementById("corroutRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги,\n\nПо информации от оператора, для абонента были внесены корректировки в таблицы маршрутизации.\n\nПросьба проверить и сообщить в случае повторения ситуации.")
|
||||
});
|
||||
document.getElementById("corroutEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Dear colleagues,\n\nThe adjustments have been made in routing settings.\n\nAs our logs are now showing positive delivery results, we would like to ask you to perform a fresh check on your side and share the results in case if further assistance is required.")
|
||||
});
|
||||
document.getElementById("tehtroubRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги,\n\nПо информации от оператора, сообщения не были доставлены абоненту из-за временных технических неполадок на стороне оператора. На текущий момент доставка сообщений осуществляется в штатном режиме.\nПросьба проверить и сообщить в случае повторения ситуации.")
|
||||
});
|
||||
document.getElementById("tehtroubEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Dear colleagues,\n\nAccording to information we got from the operator, the messages were not delivered to the subscriber due to temporary technical issues on the operator's side. At the moment, messages are being delivered in the regular mode.")
|
||||
});
|
||||
document.getElementById("senderRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги,\nСообщение не было доставлено, так как для имени отправителя ######## требуется регистрация.\nПросьба подать имя на регистрацию в ЛК или обратиться по данному вопросу к Вашему менеджеру.")
|
||||
});
|
||||
document.getElementById("senderEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Colleagues, the below reported traffic failed to be delivered due to an unregistered Sender ID. Alphanumeric registration is required towards COUNRTY OPERATOR (MCCMNC), and delivery of messages with unregistered Sender IDs is on the best effort basis. To register, please contact your Account Manager.")
|
||||
});
|
||||
document.getElementById("notResponseRU").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Здравствуйте!\n\nК сожалению, мы не получили от Вас ответа в течение 20 дней, поэтому запрос будет автоматически закрыт. Вы можете ответить на это письмо, если проблема не решена и требуется поддержка.")
|
||||
});
|
||||
document.getElementById("notResponseEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Hello!\n\nUnfortunately, we have not received a response from you within 20 days, so the request will be automatically closed. You can reply to this email if the problem has not been resolved and support is required.")
|
||||
});
|
||||
document.getElementById("fwd2treadRU").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги,\nПередали вопрос ответственной команде. Сообщим по мере поступления информации.")
|
||||
});
|
||||
document.getElementById("fwd2treadEn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Dear colleagues,\n\nWe have escalated the issue to the responsible team.\nWe will keep you informed as we receive any updates.")
|
||||
});
|
||||
document.getElementById("daoffice1RU").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Добрый день!\nДля регистрации в приложении \"КингДом\" необходимо внести Ваш номер телефона в Axapta.\n\nПо данному вопросу, пожалуйста, обратитесь к директору своего ресторана или на электронную почту: kingdom@burgerking.ru\n\nЧерез три часа после внесения номера, Вы сможете войти в сеть по номеру телефона, используя приложение \"КингДом\".")
|
||||
});
|
||||
document.getElementById("officeRU").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Добрый день!\n\nМы проверили Вашу учетную запись - все данные корректны.\nПроверочный СМС-код успешно отправлен на Ваш мобильный телефон.\n\nПожалуйста, переустановите приложение \"КингДом\" (удалить\\скачать заново) по ссылкам ниже, чтобы исключить отсутствие свежих обновлений:\n\nAndroid:\n\nhttps://play.google.com/store/apps/details?id=ru.kingdom\n\nIOS:\n\nhttps://apps.apple.com/ru/app/%D0%BA%D0%B8%D0%BD%D0%B3%D0%B4%D0%BE%D0%BC/id1543206272?l=en-GB\n\nЕсли данные действия не помогут, то, пожалуйста, опишите подробнее, на каком моменте у Вас не получается зайти в систему (при наличии ошибки приложите скриншот).")
|
||||
});
|
||||
document.getElementById("blockMsisdnRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги,\n\nДанный номер находится в глобальном ЧС.\nЭто означает, что клиент жаловался на получение СМС и отказался от получения всех СМС, либо были жалобы от данного абонента в УФАС.\nИз глобального ЧС, к сожалению, мы не можем разблокировать по Вашей просьбе, только в случае, если абонент напишет сам о просьбе разблокировать, с пометкой о согласии получения всех сообщений от оператора.\n\nЗаявление пишется в свободной форме, скан необходимо прислать на почту вашему менеджеру. Пример:\nКому: ООО «АйДиджитал»\nГенеральному директору: Баранову А.В.\nПрошу убрать мой номер ____________ из черного списка. Понимаю и соглашаюсь на возможное получение рассылок от других компаний, которые осуществляют рассылки через платформу АйДиджитал.\n\nПодпись и дата.")
|
||||
});
|
||||
document.getElementById("commonSenderRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги, сообщения были заблокированы согласно правил отправки для каналов с Общим именем. А именно -\n\n----------------------------\n\n в тексте сообщения содержится упоминания международного бренда (рассылки в интересах международных брендов).\n на канале запрещена отправка сообщений, если в качестве сендера используется международный сендер\n на канале запрещена отправка сообщений на латинице\n на канале запрещена отправка сообщений с кодами в тексте которых нет упоминания сервиса от которого идет отправка\n на канале запрещена отправка сообщений в тексте которых содержится ссылка (ссылкой считается - наличие http в URL)\n на канале запрещена отправка сообщений в тексте сообщений которых указаны только цифры\n на канале запрещена отправка сообщений с менее 13 символов в тексте")
|
||||
});
|
||||
document.getElementById("noResponse").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Здравствуйте!\nК сожалению, мы не получили от Вас ответа в течение 5 рабочих дней, поэтому запрос будет автоматически закрыт.\nВы можете ответить на это письмо, если проблема не решена и требуется дополнительная помощь.")
|
||||
});
|
||||
document.getElementById("conductedTesting").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги,\nМы провели тестирование данного направления, используя живые номера. Все сообщения были доставлены на устройства правильно и без задержек.\nПросьба провести повторное тестирование со своей стороны и сообщить в случае повторения ситуации.")
|
||||
});
|
||||
document.getElementById("HLRRu").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Коллеги, здравствуйте.\nПросьба уточнить причину возврата некорректных HLR статусов на указанные номера:")
|
||||
});
|
||||
document.getElementById("HLREn").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Dear colleagues,\nPlease clarify the correctness of HLR statuses for the following subscriber numbers:")
|
||||
});
|
||||
document.getElementById("managerTemplate").addEventListener("click", () => {
|
||||
navigator.clipboard.writeText("Страна: \nОператор: \nmccMnc: \nСендер: \nКлиент: \nSource node: \nDestination node: ")
|
||||
});
|
||||
});
|
||||
|
||||
function copyToClipboard(text) {
|
||||
navigator.clipboard.writeText(text)
|
||||
.then(() => {
|
||||
console.log('Текст скопирован в буфер обмена');
|
||||
})
|
||||
.catch(err => {
|
||||
console.error('Не удалось скопировать текст: ', err);
|
||||
});
|
||||
};
|
||||
|
||||
const templatesEl = document.querySelector('.templates');
|
||||
const addBtn = document.querySelector('.template-add');
|
||||
const editExisted = document.querySelector('template-edit-existed');
|
||||
|
||||
function createTemplate(title, RUText, ENText) {
|
||||
const templateId = Date.now();
|
||||
const templateEl = document.createElement('span');
|
||||
templateEl.setAttribute('data-template-id', templateId);
|
||||
templateEl.classList.add('template');
|
||||
templateEl.innerHTML = `
|
||||
<span id="template-title" class="font-monospace">${title}</span>
|
||||
<div class="bigFormochka">
|
||||
<div class="formochka">
|
||||
<input id="template-title-input" class="hidden form-control-sm"></input>
|
||||
<textarea id="template-textareaRU" class="hidden form-control-lg border-2" rows="1" cols="30.5">${RUText}</textarea>
|
||||
<textarea id="template-textareaEN" class="hidden form-control-lg border-2" rows="1" cols="30.5">${ENText}</textarea>
|
||||
</div>
|
||||
<span class="buttonsLong">
|
||||
<span class="btn btn-light" data-ru-text="${RUText}" id="template-ru-text">RU</span>
|
||||
<span class="btn btn-light" data-en-text="${ENText}" id="template-en-text">ENG</span>
|
||||
<button class="template-edit btn"><i class="fa-solid fa-pen-to-square"></i></button>
|
||||
<button class="template-delete btn"><i class="fa-solid fa-trash"></i></button>
|
||||
</span>
|
||||
</span>
|
||||
</div> `
|
||||
|
||||
const editBtn = templateEl.querySelector('.template-edit');
|
||||
const deleteBtn = templateEl.querySelector('.template-delete');
|
||||
const titleEl = templateEl.querySelector('#template-title');
|
||||
const textRUEl = templateEl.querySelector('#template-ru-text');
|
||||
const textENEl = templateEl.querySelector('#template-en-text');
|
||||
const titleInputEl = templateEl.querySelector('#template-title-input');
|
||||
const textRUInputEl = templateEl.querySelector('#template-textareaRU');
|
||||
const textENInputEl = templateEl.querySelector('#template-textareaEN');
|
||||
|
||||
editBtn.addEventListener('click', (e) => {
|
||||
titleEl.classList.toggle('hidden');
|
||||
textRUEl.classList.toggle('hidden');
|
||||
textENEl.classList.toggle('hidden');
|
||||
|
||||
titleInputEl.classList.toggle('hidden');
|
||||
textRUInputEl.classList.toggle('hidden');
|
||||
textENInputEl.classList.toggle('hidden');
|
||||
});
|
||||
|
||||
deleteBtn.addEventListener('click', (e) => {
|
||||
const templates = JSON.parse(localStorage.getItem('templates')) || [];
|
||||
const templateIndex = templates.findIndex(template => template.title === titleEl.innerText);
|
||||
if (templateIndex !== -1) {
|
||||
templates.splice(templateIndex, 1);
|
||||
localStorage.setItem('templates', JSON.stringify(templates));
|
||||
}
|
||||
templateEl.remove();
|
||||
});
|
||||
|
||||
titleInputEl.addEventListener('change', (e) => {
|
||||
titleEl.innerText = e.target.value;
|
||||
navigator.clipboard.writeText(titleEl);
|
||||
updateTemplateInLocalStorage(title, 'title', e.target.value);
|
||||
});
|
||||
|
||||
textRUInputEl.addEventListener('change', (e) => {
|
||||
textRUEl.dataset.ruText = e.target.value;
|
||||
navigator.clipboard.writeText(textRUEl);
|
||||
updateTemplateInLocalStorage(title, 'RUText', e.target.value);
|
||||
});
|
||||
|
||||
textENInputEl.addEventListener('change', (e) => {
|
||||
textENEl.dataset.enText = e.target.value;
|
||||
navigator.clipboard.writeText(textRUEl);
|
||||
updateTemplateInLocalStorage(title, 'ENText', e.target.value);
|
||||
});
|
||||
|
||||
textRUEl.addEventListener('click', (e) => {
|
||||
navigator.clipboard.writeText(e.target.dataset.ruText)
|
||||
.then(() => {
|
||||
console.log('Текст RU скопирован в буфер обмена');
|
||||
})
|
||||
.catch(err => {
|
||||
console.error('Не удалось скопировать текст RU: ', err);
|
||||
});
|
||||
});
|
||||
|
||||
textENEl.addEventListener('click', (e) => {
|
||||
navigator.clipboard.writeText(e.target.dataset.enText)
|
||||
.then(() => {
|
||||
console.log('Текст EN скопирован в буфер обмена');
|
||||
})
|
||||
.catch(err => {
|
||||
console.error('Не удалось скопировать текст EN: ', err);
|
||||
});
|
||||
});
|
||||
|
||||
return templateEl;
|
||||
};
|
||||
|
||||
function saveTemplateToLocalStorage(title, RUText, ENText) {
|
||||
const template = {
|
||||
title: title,
|
||||
RUText: RUText,
|
||||
ENText: ENText
|
||||
};
|
||||
const templates = JSON.parse(localStorage.getItem('templates')) || [];
|
||||
templates.push(template);
|
||||
localStorage.setItem('templates', JSON.stringify(templates));
|
||||
};
|
||||
|
||||
function updateTemplateInLocalStorage(title, key, value) {
|
||||
const templates = JSON.parse(localStorage.getItem('templates')) || [];
|
||||
const templateIndex = templates.findIndex(template => template.title === title);
|
||||
|
||||
if (templateIndex !== -1) {
|
||||
templates[templateIndex][key] = value;
|
||||
localStorage.setItem('templates', JSON.stringify(templates));
|
||||
};
|
||||
};
|
||||
|
||||
addBtn.addEventListener('click', (e) => {
|
||||
const title = "Title";
|
||||
const RUText = "RUText";
|
||||
const ENText = "ENText";
|
||||
|
||||
const el = createTemplate(title, RUText, ENText);
|
||||
templatesEl.appendChild(el);
|
||||
saveTemplateToLocalStorage(title, RUText, ENText);
|
||||
});
|
||||
|
||||
window.onload = function () {
|
||||
const templates = JSON.parse(localStorage.getItem('templates')) || [];
|
||||
templates.forEach(template => {
|
||||
const el = createTemplate(template.title, template.RUText, template.ENText);
|
||||
templatesEl.appendChild(el);
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
const themeToggle = document.getElementById('theme-toggle');
|
||||
const themeIcon = document.getElementById('theme-icon');
|
||||
|
||||
|
||||
const applySavedTheme = () => {
|
||||
const savedTheme = localStorage.getItem('theme');
|
||||
if (savedTheme === 'dark') {
|
||||
document.body.classList.add('dark-theme');
|
||||
themeIcon.classList.replace('fa-moon', 'fa-sun');
|
||||
} else {
|
||||
document.body.classList.remove('dark-theme');
|
||||
themeIcon.classList.replace('fa-sun', 'fa-moon');
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
themeToggle.addEventListener('click', () => {
|
||||
document.body.classList.toggle('dark-theme');
|
||||
|
||||
|
||||
if (document.body.classList.contains('dark-theme')) {
|
||||
themeIcon.classList.replace('fa-moon', 'fa-sun');
|
||||
localStorage.setItem('theme', 'dark');
|
||||
} else {
|
||||
themeIcon.classList.replace('fa-sun', 'fa-moon');
|
||||
localStorage.setItem('theme', 'light');
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
applySavedTheme();
|
||||
});
|
||||
|
||||
document.querySelectorAll('.category h3').forEach(function(header) {
|
||||
const categoryId = header.textContent.trim(); // Уникальный идентификатор категории по названию
|
||||
|
||||
// Проверка состояния категории при загрузке страницы
|
||||
const isCategoryOpen = localStorage.getItem(categoryId) === 'true';
|
||||
const content = header.nextElementSibling; // Содержимое категории
|
||||
const icon = header.querySelector('.toggle-icon'); // Иконка стрелки
|
||||
|
||||
// Если категория была открыта ранее, делаем ее открытой
|
||||
if (isCategoryOpen) {
|
||||
content.classList.add('show');
|
||||
icon.classList.remove('fa-chevron-down');
|
||||
icon.classList.add('fa-chevron-up');
|
||||
}
|
||||
|
||||
// Обработчик клика по заголовку категории
|
||||
header.addEventListener('click', function() {
|
||||
content.classList.toggle('show'); // Переключаем видимость категории
|
||||
|
||||
if (content.classList.contains('show')) {
|
||||
icon.classList.remove('fa-chevron-down');
|
||||
icon.classList.add('fa-chevron-up');
|
||||
// Сохраняем состояние категории как открытое
|
||||
localStorage.setItem(categoryId, 'true');
|
||||
} else {
|
||||
icon.classList.remove('fa-chevron-up');
|
||||
icon.classList.add('fa-chevron-down');
|
||||
// Сохраняем состояние категории как закрытое
|
||||
localStorage.setItem(categoryId, 'false');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -202,3 +202,66 @@ body.dark-theme {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
/* Кнопка добавления шаблона */
|
||||
.add-template-btn {
|
||||
position: absolute;
|
||||
top: 20px;
|
||||
left: 20px;
|
||||
padding: 10px 20px;
|
||||
background-color: #abcef5;
|
||||
color: white;
|
||||
font-size: 16px;
|
||||
border: none;
|
||||
border-radius: 50px;
|
||||
cursor: pointer;
|
||||
box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1);
|
||||
transition: background-color 0.3s, box-shadow 0.3s;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.add-template-btn i {
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.add-template-btn:hover {
|
||||
background-color: #88aee5;
|
||||
box-shadow: 0px 6px 8px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
.add-template-btn:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
/* Для кнопок и textarea, чтобы не "гуляли" */
|
||||
.template {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
padding: 8px 7px;
|
||||
border: 1px solid #8888c6;
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
transition: background-color 0.3s ease, color 0.3s ease, border-color 0.3s ease;
|
||||
}
|
||||
|
||||
/* Скрытие полей */
|
||||
.hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Стили для input и textarea */
|
||||
input, textarea {
|
||||
width: 100%;
|
||||
height: 40px; /* Сделаем высоту фиксированной */
|
||||
padding: 8px;
|
||||
box-sizing: border-box;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
/* Убираем возможность изменения размеров textarea */
|
||||
textarea {
|
||||
resize: none;
|
||||
}
|
||||
|
||||
256
lzipus/src/popup.js
Normal file
256
lzipus/src/popup.js
Normal file
@@ -0,0 +1,256 @@
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
// Объект с текстами для каждого элемента
|
||||
const clipboardTexts = {
|
||||
"inWorkRu": "Коллеги, здравствуйте.\nПриняли Ваш запрос в работу. Сообщим по мере поступления информации.",
|
||||
"inWorkEn": "Dear customer,\nWe are working on your request.",
|
||||
"dialogueRu": "Коллеги, здравствуйте.\nУведомляем вас о том, что мы начали диалог с оператором по данному запросу. Мы ожидаем ответа и будем держать вас в курсе любых изменений.",
|
||||
"dialogueEn": "Dear colleagues.\nWe would like to inform you that we have started a dialogue with the operator on this request. We are awaiting a response and will keep you informed of any changes.",
|
||||
"nonDelRu": "Коллеги, здравствуйте.\nПросьба уточнить причину недоставки следующих сообщений клиенту:",
|
||||
"nonDelEn": "Dear colleagues,\nPlease check why the following messages were not delivered:",
|
||||
"fixItRu": "Коллеги,\nМы не фиксируем на нашей платформе ваших СМС-сообщений, просьба предоставить ответ от нашей платформы на ваш запрос отправки. Так же просьба предоставить логи, подтверждающие отправку на нашу платформу, данная информация необходима для дальнейшего анализа вашего запроса.",
|
||||
"fixItEn": "Dear colleagues,\nWe do not record your SMS messages on our platform, please provide a response from our platform to your request to send. Please also provide logs confirming sending to our platform, this information is necessary for further analysis of your request.",
|
||||
"fakeRu": "Коллеги, здравствуйте.\nПросьба уточнить корректность статусов доставки следующих сообщений клиенту. Абонент не получал СМС.",
|
||||
"fakeEn": "Dear colleagues,\nPlease clarify the correctness of the delivery statuses of the following messages to the client. The subscriber did not receive an SMS.",
|
||||
"weworkRu": "Коллеги, здравствуйте.\nУведомляем вас о том, что работы по вашему запросу продолжаются. Как только появится информация, мы вам сообщим.\nБлагодарим за понимание и приносим извинения за доставленные неудобства.\n",
|
||||
"weworkEn": "Dear Colleagues.\nWe notify you that work on your request is ongoing. As soon as information becomes available, we will inform you.\nThank you for your understanding and we apologize for the inconvenience caused.\n",
|
||||
"wework2Ru": "Коллеги, здравствуйте.\nЖдем ответа от оператора. Сообщим, как только появится соответствующая информация. Спасибо!",
|
||||
"wework2En": "Dear Colleagues.\nWe are waiting for a response from the operator. We will inform you as soon as we have an update. Thank you!",
|
||||
"wework3Ru": "Здравствуйте!\nОтправили повторный запрос оператору по данному поводу.\nСпасибо!",
|
||||
"wework3En": "Hello!\nWe have sent an additional request to the operator.\nThank you!",
|
||||
"theyworkRu": "Здравствуйте, коллеги.\nПоявилась ли информация по данному вопросу?\nСпасибо.",
|
||||
"theyworkEn": "Dear colleagues,\nIs there any information on this request?\nThank you.",
|
||||
"theywork2Ru": "Добрый день!\nПросим вернуться с ответом.\nБольшое спасибо!",
|
||||
"theywork2En": "Hello Team!\nPlease let us know if there are any updates.\nThank you!",
|
||||
"theywork3Ru": "Здравствуйте!\nПодскажите, пожалуйста, появились ли новости.\nСпасибо!",
|
||||
"theywork3En": "Hello!\nPlease kindly advise on issue status.\nThank you.",
|
||||
"delivedRu": "Коллеги,\nСообщение успешно прошло через платформу и было отправлено оператору. По информации от оператора, сообщение было своевременно доставлено. В случае, если абонент утверждает, что сообщения не были получены, просьба проверить исправность работы ТА. Возможные рекомендации: перезагрузка телефона, очистка памяти от устаревших сообщений, проверка спам-фильтров и черных списков, обновление ПО.\nПри сохранении проблемы, просьба запросить у абонента детализацию. Данная информация потребуется для дальнейшего взаимодействия с оператором.",
|
||||
"delivedEn": "Colleagues, according to the information from the operator, messages were delivered in a timely manner. If the subscriber claims that the messages have not been received, please check that device is working correctly. Possible recommendations: reboot the phone, clear message memory, check spam filters and blacklists, update the software.\nIf the problem still persists, please ask the subscriber for details. This information is necessary to continue interaction with the operator.",
|
||||
"problphRu": "Коллеги,\nСообщение успешно прошло через платформу и было отправлено оператору. По информации от оператора, сообщение не было доставлено абоненту по причине сбоя ТА. Возможные рекомендации для абонента: перезагрузка телефона, очистка памяти от устаревших сообщений, проверка спам-фильтров и черных списков, обновление ПО.\nПросьба уведомить нас в случае, если ситуация повторится.",
|
||||
"problphEn": "Colleagues, according to the information from the operator, messages were not delivered due to subscriber’s device failure. Possible recommendations: reboot the phone, clear message memory, check spam filters and blacklists, update the software.\nPlease let us know if the problem persist.",
|
||||
"notservRu": "Здравствуйте, коллеги.\nСообщение успешно прошло через платформу и было отправлено оператору. По информации от оператора, сообщение абоненту не было доставлено, т.к. номер телефона не существует или не обслуживается.",
|
||||
"notservEn": "Colleagues\nThe message successfully passed through the platform and was sent to the operator. According to the information from the operator, the messages were not delivered to the subscriber because the phone number does not exist or is not serviced.",
|
||||
"insentRu": "Коллеги,\nСообщение успешно прошло через платформу и было отправлено оператору. Сообщение находится в статусе Отправлено, SMS-центр оператора продолжает осуществлять попытки его доставки.\nНаиболее вероятной причиной задержки в доставке может являться нахождение абонента в зоне неуверенного приема сети, также возможен технический сбой в работе телефона абонента.",
|
||||
"insentEn": "Colleagues,\nThe messages are in Sent status, operator's SMS center is continuing delivery attempts. Most likely, delivery delays are caused by subscriber being in the area of uncertain network reception, or a technical failure in the operation of the subscriber's phone is also possible.",
|
||||
"dubleRu": "Коллеги,\nМониторингом были зафиксированы дубликаты сообщений, в связи с чем сработала блокировка. Если в короткий промежуток времени на площадку поступает два одинаковых сообщения, повторное блокируется как дубликат.\nЕсли отправка дубликатов была запланирована, либо номер абонента используется для тестирования подключения, просьба сообщить, мы добавим абонента в белый список.",
|
||||
"dubleEn": "Colleagues, duplicates were blocked by our monitoring system. If two identical messages are received within a short period of time, the second one is blocked as a duplicate. If sending duplicates was planned, or the subscriber's number is used for testing, please let us know and we will whitelist the subscriber.",
|
||||
"unvelbRu": "Коллеги,\nСообщение успешно прошло через платформу и было отправлено оператору. Сообщение абоненту не было доставлено т.к. ТА абонента был недоступен - выключен или находился в зоне неуверенного приема сигнала.\nРекомендуем абоненту перезагрузить телефон, проверить доступность сети оператора, очистить память телефона от устаревших сообщений.\n",
|
||||
"unvelbEn": "Colleagues,\nThe messages were not delivered to the subscriber because the subscriber's phone was unavailable - turned off or was in the zone of uncertain signal reception.\nWe recommend that the subscriber restart the phone, check the availability of the operator's network, and clear the phone's memory of outdated messages.\n",
|
||||
"delayRu": "Коллеги, здравствуйте.\nПросьба уточнить текущий статус сообщений и причины задержек:",
|
||||
"delayEn": "Dear Colleagues.\nPlease clarify current messages status and the reasons for the delays:",
|
||||
"conbreRu": "Коллеги, здравствуйте.\nНаблюдаем разрыв соединения. Просьба уточнить, ситуация штатная?",
|
||||
"conbreEn": "Dear colleagues.\nWe observe a connection break. Please clarify whether it’s a standard situation.",
|
||||
"corroutRu": "Коллеги,\nПо информации от оператора, для абонента были внесены корректировки в таблицы маршрутизации.\nПросьба проверить и сообщить в случае повторения ситуации.",
|
||||
"corroutEn": "Dear colleagues,\nThe adjustments have been made in routing settings.\nAs our logs are now showing positive delivery results, we would like to ask you to perform a fresh check on your side and share the results in case if further assistance is required.",
|
||||
"tehtroubRu": "Коллеги,\nПо информации от оператора, сообщения не были доставлены абоненту из-за временных технических неполадок на стороне оператора. На текущий момент доставка сообщений осуществляется в штатном режиме.\nПросьба проверить и сообщить в случае повторения ситуации.",
|
||||
"tehtroubEn": "Dear colleagues,\nAccording to information we got from the operator, the messages were not delivered to the subscriber due to temporary technical issues on the operator's side. At the moment, messages are being delivered in the regular mode.",
|
||||
"senderRu": "Коллеги,\nСообщение не было доставлено, так как для имени отправителя ######## требуется регистрация.\nПросьба подать имя на регистрацию в ЛК или обратиться по данному вопросу к Вашему менеджеру.",
|
||||
"senderEn": "Colleagues, the below reported traffic failed to be delivered due to an unregistered Sender ID. Alphanumeric registration is required towards COUNRTY OPERATOR (MCCMNC), and delivery of messages with unregistered Sender IDs is on the best effort basis. To register, please contact your Account Manager.",
|
||||
"notResponseRU": "Здравствуйте!\nК сожалению, мы не получили от Вас ответа в течение 20 дней, поэтому запрос будет автоматически закрыт. Вы можете ответить на это письмо, если проблема не решена и требуется поддержка.",
|
||||
"notResponseEn": "Hello!\nUnfortunately, we have not received a response from you within 20 days, so the request will be automatically closed. You can reply to this email if the problem has not been resolved and support is required.",
|
||||
"fwd2treadRU": "Коллеги,\nПередали вопрос ответственной команде. Сообщим по мере поступления информации.",
|
||||
"fwd2treadEn": "Dear colleagues,\nWe have escalated the issue to the responsible team.\nWe will keep you informed as we receive any updates.",
|
||||
"daoffice1RU": "Добрый день!\nДля регистрации в приложении \"КингДом\" необходимо внести Ваш номер телефона в Axapta.\nПо данному вопросу, пожалуйста, обратитесь к директору своего ресторана или на электронную почту: kingdom@burgerking.ru\nЧерез три часа после внесения номера, Вы сможете войти в сеть по номеру телефона, используя приложение \"КингДом\".",
|
||||
"officeRU": "Добрый день!\nМы проверили Вашу учетную запись - все данные корректны.\nПроверочный СМС-код успешно отправлен на Ваш мобильный телефон.\nПожалуйста, переустановите приложение \"КингДом\" (удалить\\скачать заново) по ссылкам ниже, чтобы исключить отсутствие свежих обновлений:\nAndroid:\nhttps://play.google.com/store/apps/details?id=ru.kingdom\nIOS:\nhttps://apps.apple.com/ru/app/%D0%BA%D0%B8%D0%BD%D0%B3%D0%B4%D0%BE%D0%BC/id1543206272?l=en-GB\nЕсли данные действия не помогут, то, пожалуйста, опишите подробнее, на каком моменте у Вас не получается зайти в систему (при наличии ошибки приложите скриншот).",
|
||||
"blockMsisdnRu": "Коллеги,\nДанный номер находится в глобальном ЧС.\nЭто означает, что клиент жаловался на получение СМС и отказался от получения всех СМС, либо были жалобы от данного абонента в УФАС.\nИз глобального ЧС, к сожалению, мы не можем разблокировать по Вашей просьбе, только в случае, если абонент напишет сам о просьбе разблокировать, с пометкой о согласии получения всех сообщений от оператора.\nЗаявление пишется в свободной форме, скан необходимо прислать на почту вашему менеджеру. Пример:\nКому: ООО «АйДиджитал»\nГенеральному директору: Баранову А.В.\nПрошу убрать мой номер ____________ из черного списка. Понимаю и соглашаюсь на возможное получение рассылок от других компаний, которые осуществляют рассылки через платформу АйДиджитал.\nПодпись и дата.",
|
||||
"commonSenderRu": "Коллеги, сообщения были заблокированы согласно правил отправки для каналов с Общим именем. А именно -\n----------------------------\n в тексте сообщения содержится упоминания международного бренда (рассылки в интересах международных брендов).\n на канале запрещена отправка сообщений, если в качестве сендера используется международный сендер\n на канале запрещена отправка сообщений на латинице\n на канале запрещена отправка сообщений с кодами в тексте которых нет упоминания сервиса от которого идет отправка\n на канале запрещена отправка сообщений в тексте которых содержится ссылка (ссылкой считается - наличие http в URL)\n на канале запрещена отправка сообщений в тексте сообщений которых указаны только цифры\n на канале запрещена отправка сообщений с менее 13 символов в тексте",
|
||||
"noResponse": "Здравствуйте!\nК сожалению, мы не получили от Вас ответа в течение 5 рабочих дней, поэтому запрос будет автоматически закрыт.\nВы можете ответить на это письмо, если проблема не решена и требуется дополнительная помощь.",
|
||||
"conductedTesting": "Коллеги,\nМы провели тестирование данного направления, используя живые номера. Все сообщения были доставлены на устройства правильно и без задержек.\nПросьба провести повторное тестирование со своей стороны и сообщить в случае повторения ситуации.",
|
||||
"HLRRu": "Коллеги, здравствуйте.\nПросьба уточнить причину возврата некорректных HLR статусов на указанные номера:",
|
||||
"HLREn": "Dear colleagues,\nPlease clarify the correctness of HLR statuses for the following subscriber numbers:",
|
||||
"managerTemplate": "Страна: \nОператор: \nmccMnc: \nСендер: \nКлиент: \nSource node: \nDestination node: "
|
||||
};
|
||||
|
||||
// Функция для обработки кликов
|
||||
function handleClipboardClick(buttonId) {
|
||||
if (clipboardTexts[buttonId]) {
|
||||
navigator.clipboard.writeText(clipboardTexts[buttonId]);
|
||||
}
|
||||
}
|
||||
|
||||
// Привязываем обработчик событий к кнопкам
|
||||
Object.keys(clipboardTexts).forEach(buttonId => {
|
||||
const button = document.getElementById(buttonId);
|
||||
if (button) {
|
||||
button.addEventListener("click", () => handleClipboardClick(buttonId));
|
||||
}
|
||||
});
|
||||
//---------------------------------------------------Создание новых шаблонов локально---------------------------------------------------------//
|
||||
const templatesEl = document.querySelector('.templates');
|
||||
const addBtn = document.querySelector('.template-add');
|
||||
|
||||
function createTemplate(title, RUText, ENText) {
|
||||
const templateId = Date.now();
|
||||
const templateEl = document.createElement('span');
|
||||
templateEl.setAttribute('data-template-id', templateId);
|
||||
templateEl.classList.add('template');
|
||||
|
||||
templateEl.innerHTML = `
|
||||
<span id="template-title" class="font-monospace">${title}</span>
|
||||
<div class="bigFormochka">
|
||||
<div class="formochka">
|
||||
<input id="template-title-input" class="hidden form-control-sm">
|
||||
<textarea id="template-textareaRU" class="hidden form-control-lg border-2" rows="1" cols="30.5">${RUText}</textarea>
|
||||
<textarea id="template-textareaEN" class="hidden form-control-lg border-2" rows="1" cols="30.5">${ENText}</textarea>
|
||||
</div>
|
||||
<span class="buttonsLong">
|
||||
<span class="btn btn-light" data-ru-text="${RUText}" id="template-ru-text">RU</span>
|
||||
<span class="btn btn-light" data-en-text="${ENText}" id="template-en-text">ENG</span>
|
||||
<button class="template-edit btn"><i class="fa-solid fa-pen-to-square"></i></button>
|
||||
<button class="template-delete btn"><i class="fa-solid fa-trash"></i></button>
|
||||
</span>
|
||||
</div>
|
||||
`;
|
||||
|
||||
const editBtn = templateEl.querySelector('.template-edit');
|
||||
const deleteBtn = templateEl.querySelector('.template-delete');
|
||||
const titleEl = templateEl.querySelector('#template-title');
|
||||
const textRUEl = templateEl.querySelector('#template-ru-text');
|
||||
const textENEl = templateEl.querySelector('#template-en-text');
|
||||
const titleInputEl = templateEl.querySelector('#template-title-input');
|
||||
const textRUInputEl = templateEl.querySelector('#template-textareaRU');
|
||||
const textENInputEl = templateEl.querySelector('#template-textareaEN');
|
||||
|
||||
// Функция для переключения видимости элементов
|
||||
function toggleVisibility(...elements) {
|
||||
elements.forEach(el => el.classList.toggle('hidden'));
|
||||
}
|
||||
|
||||
// Обработчик для редактирования
|
||||
editBtn.addEventListener('click', () => {
|
||||
toggleVisibility(titleEl, textRUEl, textENEl, titleInputEl, textRUInputEl, textENInputEl);
|
||||
});
|
||||
|
||||
// Обработчик для удаления
|
||||
deleteBtn.addEventListener('click', () => {
|
||||
const templates = JSON.parse(localStorage.getItem('templates')) || [];
|
||||
const templateIndex = templates.findIndex(template => template.title === titleEl.innerText);
|
||||
if (templateIndex !== -1) {
|
||||
templates.splice(templateIndex, 1);
|
||||
localStorage.setItem('templates', JSON.stringify(templates));
|
||||
}
|
||||
templateEl.remove();
|
||||
});
|
||||
|
||||
// Обработчики для изменений в полях
|
||||
const handleChange = (key, valueEl, inputEl) => {
|
||||
valueEl.innerText = inputEl.value;
|
||||
navigator.clipboard.writeText(valueEl);
|
||||
updateTemplateInLocalStorage(title, key, inputEl.value);
|
||||
};
|
||||
|
||||
titleInputEl.addEventListener('change', (e) => handleChange('title', titleEl, e.target));
|
||||
textRUInputEl.addEventListener('change', (e) => handleChange('RUText', textRUEl, e.target));
|
||||
textENInputEl.addEventListener('change', (e) => handleChange('ENText', textENEl, e.target));
|
||||
|
||||
// Обработчик для копирования текста в буфер обмена
|
||||
const handleCopyText = (e, key) => {
|
||||
navigator.clipboard.writeText(e.target.dataset[key])
|
||||
.then(() => console.log(`Текст ${key} скопирован в буфер обмена`))
|
||||
.catch(err => console.error(`Не удалось скопировать текст ${key}: `, err));
|
||||
};
|
||||
|
||||
textRUEl.addEventListener('click', (e) => handleCopyText(e, 'ruText'));
|
||||
textENEl.addEventListener('click', (e) => handleCopyText(e, 'enText'));
|
||||
|
||||
return templateEl;
|
||||
}
|
||||
|
||||
function saveTemplateToLocalStorage(title, RUText, ENText) {
|
||||
const template = { title, RUText, ENText };
|
||||
const templates = JSON.parse(localStorage.getItem('templates')) || [];
|
||||
templates.push(template);
|
||||
localStorage.setItem('templates', JSON.stringify(templates));
|
||||
}
|
||||
|
||||
function updateTemplateInLocalStorage(title, key, value) {
|
||||
const templates = JSON.parse(localStorage.getItem('templates')) || [];
|
||||
const templateIndex = templates.findIndex(template => template.title === title);
|
||||
if (templateIndex !== -1) {
|
||||
templates[templateIndex][key] = value;
|
||||
localStorage.setItem('templates', JSON.stringify(templates));
|
||||
}
|
||||
}
|
||||
|
||||
addBtn.addEventListener('click', () => {
|
||||
const title = "Title";
|
||||
const RUText = "RUText";
|
||||
const ENText = "ENText";
|
||||
|
||||
const el = createTemplate(title, RUText, ENText);
|
||||
templatesEl.appendChild(el);
|
||||
saveTemplateToLocalStorage(title, RUText, ENText);
|
||||
});
|
||||
|
||||
window.onload = function () {
|
||||
const templates = JSON.parse(localStorage.getItem('templates')) || [];
|
||||
templates.forEach(template => {
|
||||
const el = createTemplate(template.title, template.RUText, template.ENText);
|
||||
templatesEl.appendChild(el);
|
||||
});
|
||||
};
|
||||
//--------------------------------------------------------------------------------------------------------------------------------//
|
||||
|
||||
// Тема
|
||||
const themeToggle = document.getElementById('theme-toggle');
|
||||
const themeIcon = document.getElementById('theme-icon');
|
||||
|
||||
// Применение сохраненной темы
|
||||
const applySavedTheme = () => {
|
||||
const savedTheme = localStorage.getItem('theme');
|
||||
if (savedTheme === 'dark') {
|
||||
document.body.classList.add('dark-theme');
|
||||
if (themeIcon) {
|
||||
themeIcon.classList.replace('fa-moon', 'fa-sun');
|
||||
}
|
||||
} else {
|
||||
document.body.classList.remove('dark-theme');
|
||||
if (themeIcon) {
|
||||
themeIcon.classList.replace('fa-sun', 'fa-moon');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Переключение темы
|
||||
if (themeToggle && themeIcon) {
|
||||
themeToggle.addEventListener('click', () => {
|
||||
document.body.classList.toggle('dark-theme');
|
||||
const theme = document.body.classList.contains('dark-theme') ? 'dark' : 'light';
|
||||
localStorage.setItem('theme', theme); // Сохраняем выбранную тему
|
||||
themeIcon.classList.replace(theme === 'dark' ? 'fa-moon' : 'fa-sun', theme === 'dark' ? 'fa-sun' : 'fa-moon');
|
||||
});
|
||||
}
|
||||
|
||||
// Применить сохраненную тему при загрузке страницы
|
||||
applySavedTheme();
|
||||
|
||||
// Управление категориями
|
||||
document.querySelectorAll('.category h3').forEach(function(header) {
|
||||
const categoryId = header.textContent.trim(); // Уникальный идентификатор категории по названию
|
||||
const content = header.nextElementSibling; // Содержимое категории
|
||||
const icon = header.querySelector('.toggle-icon'); // Иконка стрелки
|
||||
|
||||
// Проверка состояния категории при загрузке страницы
|
||||
const isCategoryOpen = localStorage.getItem(categoryId) === 'true';
|
||||
|
||||
if (isCategoryOpen) {
|
||||
content.classList.add('show');
|
||||
if (icon) {
|
||||
icon.classList.replace('fa-chevron-down', 'fa-chevron-up');
|
||||
}
|
||||
} else {
|
||||
content.classList.remove('show');
|
||||
if (icon) {
|
||||
icon.classList.replace('fa-chevron-up', 'fa-chevron-down');
|
||||
}
|
||||
}
|
||||
|
||||
// Обработчик клика по заголовку категории
|
||||
header.addEventListener('click', function() {
|
||||
content.classList.toggle('show'); // Переключаем видимость категории
|
||||
icon.classList.toggle('fa-chevron-down');
|
||||
icon.classList.toggle('fa-chevron-up');
|
||||
// Сохраняем состояние категории как открытое или закрытое
|
||||
localStorage.setItem(categoryId, content.classList.contains('show') ? 'true' : 'false');
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user