iobroker.telegram-menu 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -33,6 +33,11 @@ You can create a separate menu for each user, or you can use the global user to
33
33
  Placeholder for the next version (at the beginning of the line):
34
34
  ### **WORK IN PROGRESS**
35
35
  -->
36
+ ### 0.3.0 (2023-07-02)
37
+
38
+ - add ack Flag
39
+ - Copy-Button to copy User-elements to activ User
40
+
36
41
  ### 0.2.0 (2023-05-28)
37
42
 
38
43
  - rename button
@@ -18,6 +18,7 @@
18
18
  "Choose your option": "Wählen Sie Ihre Option",
19
19
  "Close": "Schließen",
20
20
  "Confirm": "Bestätigen",
21
+ "Confirm set value": "Eingestellten Wert bestätigen",
21
22
  "Delay": "Verzögerung",
22
23
  "Delay (ms)": "Verzögerung (ms)",
23
24
  "Delete User": "Benutzer löschen",
@@ -25,6 +26,7 @@
25
26
  "Do you really want to delete the group?": "Möchten Sie die Gruppe wirklich löschen?",
26
27
  "Each entry may only occur once in the complete navigation": "Jeder Eintrag darf in der gesamten Navigation nur einmal vorkommen",
27
28
  "Edit Username": "Benutzernamen bearbeiten",
29
+ "Entry not found!": "Eintrag nicht gefunden!",
28
30
  "Filename": "Dateinamen",
29
31
  "Global User activ": "Globaler Benutzer aktiv",
30
32
  "Instanze": "Instanz",
@@ -38,6 +40,7 @@
38
40
  "Settings": "Einstellungen",
39
41
  "Startside": "Startseite",
40
42
  "Switch": "Schalten",
43
+ "Text will be send if no entry was found!": "Text wird gesendet, wenn kein Eintrag gefunden wurde!",
41
44
  "Trigger": "Auslöser",
42
45
  "Users for this Group, seperate with": "Benutzer für diese Gruppe, trennen Sie mit",
43
46
  "Value": "Wert",
@@ -18,6 +18,7 @@
18
18
  "Choose your option": "Choose your option",
19
19
  "Close": "Close",
20
20
  "Confirm": "Confirm",
21
+ "Confirm set value": "Confirm set value",
21
22
  "Delay": "Delay",
22
23
  "Delay (ms)": "Delay (ms)",
23
24
  "Delete User": "Delete User",
@@ -25,6 +26,7 @@
25
26
  "Do you really want to delete the group?": "Do you really want to delete the group?",
26
27
  "Each entry may only occur once in the complete navigation": "Each entry may only occur once in the complete navigation",
27
28
  "Edit Username": "Edit Username",
29
+ "Entry not found!": "Entry not found!",
28
30
  "Filename": "Filename",
29
31
  "Global User activ": "Global user activ",
30
32
  "Instanze": "Instanze",
@@ -38,6 +40,7 @@
38
40
  "Settings": "Settings",
39
41
  "Startside": "Startside",
40
42
  "Switch": "Switch",
43
+ "Text will be send if no entry was found!": "Text will be send if no entry was found!",
41
44
  "Trigger": "Trigger",
42
45
  "Users for this Group, seperate with": "Users for this Group, seperate with",
43
46
  "Value": "Value",
@@ -18,6 +18,7 @@
18
18
  "Choose your option": "Elige tu opción",
19
19
  "Close": "Cerca",
20
20
  "Confirm": "Confirmar",
21
+ "Confirm set value": "Confirmar valor establecido",
21
22
  "Delay": "Demora",
22
23
  "Delay (ms)": "Retardo (ms)",
23
24
  "Delete User": "Borrar usuario",
@@ -25,6 +26,7 @@
25
26
  "Do you really want to delete the group?": "¿Realmente quieres eliminar el grupo?",
26
27
  "Each entry may only occur once in the complete navigation": "Cada entrada solo puede ocurrir una vez en la navegación completa",
27
28
  "Edit Username": "Editar nombre de usuario",
29
+ "Entry not found!": "¡Entrada no encontrada!",
28
30
  "Filename": "Nombre del archivo",
29
31
  "Global User activ": "Actividad de usuario global",
30
32
  "Instanze": "Instancia",
@@ -38,6 +40,7 @@
38
40
  "Settings": "Ajustes",
39
41
  "Startside": "Lado de salida",
40
42
  "Switch": "Cambiar",
43
+ "Text will be send if no entry was found!": "¡Se enviará texto si no se encontró ninguna entrada!",
41
44
  "Trigger": "Desencadenar",
42
45
  "Users for this Group, seperate with": "Usuarios para este Grupo, separe con",
43
46
  "Value": "Valor",
@@ -18,6 +18,7 @@
18
18
  "Choose your option": "Choisissez votre option",
19
19
  "Close": "Fermer",
20
20
  "Confirm": "Confirmer",
21
+ "Confirm set value": "Confirmer la valeur définie",
21
22
  "Delay": "Retard",
22
23
  "Delay (ms)": "Délai (ms)",
23
24
  "Delete User": "Supprimer l'utilisateur",
@@ -25,6 +26,7 @@
25
26
  "Do you really want to delete the group?": "Voulez-vous vraiment supprimer le groupe ?",
26
27
  "Each entry may only occur once in the complete navigation": "Chaque entrée ne peut apparaître qu'une seule fois dans la navigation complète",
27
28
  "Edit Username": "Modifier le nom d'utilisateur",
29
+ "Entry not found!": "Entrée introuvable !",
28
30
  "Filename": "Nom de fichier",
29
31
  "Global User activ": "Activation globale de l'utilisateur",
30
32
  "Instanze": "Instantané",
@@ -38,6 +40,7 @@
38
40
  "Settings": "Paramètres",
39
41
  "Startside": "Côté départ",
40
42
  "Switch": "Changer",
43
+ "Text will be send if no entry was found!": "Le texte sera envoyé si aucune entrée n'a été trouvée !",
41
44
  "Trigger": "Déclencher",
42
45
  "Users for this Group, seperate with": "Utilisateurs pour ce groupe, séparés par",
43
46
  "Value": "Valeur",
@@ -18,6 +18,7 @@
18
18
  "Choose your option": "Scegli la tua opzione",
19
19
  "Close": "Vicino",
20
20
  "Confirm": "Confermare",
21
+ "Confirm set value": "Conferma il valore impostato",
21
22
  "Delay": "Ritardo",
22
23
  "Delay (ms)": "Ritardo (ms)",
23
24
  "Delete User": "Elimina utente",
@@ -25,6 +26,7 @@
25
26
  "Do you really want to delete the group?": "Vuoi davvero eliminare il gruppo?",
26
27
  "Each entry may only occur once in the complete navigation": "Ogni voce può comparire una sola volta nella navigazione completa",
27
28
  "Edit Username": "Modifica nome utente",
29
+ "Entry not found!": "Voce non trovata!",
28
30
  "Filename": "Nome del file",
29
31
  "Global User activ": "Utente globale attivo",
30
32
  "Instanze": "Istanza",
@@ -38,6 +40,7 @@
38
40
  "Settings": "Impostazioni",
39
41
  "Startside": "Lato iniziale",
40
42
  "Switch": "Interruttore",
43
+ "Text will be send if no entry was found!": "Il testo verrà inviato se non è stata trovata alcuna voce!",
41
44
  "Trigger": "Grilletto",
42
45
  "Users for this Group, seperate with": "Utenti per questo gruppo, separati da",
43
46
  "Value": "Valore",
@@ -18,6 +18,7 @@
18
18
  "Choose your option": "Kies uw optie",
19
19
  "Close": "Dichtbij",
20
20
  "Confirm": "Bevestigen",
21
+ "Confirm set value": "Bevestig ingestelde waarde",
21
22
  "Delay": "Vertraging",
22
23
  "Delay (ms)": "Vertraging (ms)",
23
24
  "Delete User": "Verwijder gebruiker",
@@ -25,6 +26,7 @@
25
26
  "Do you really want to delete the group?": "Wilt u de groep echt verwijderen?",
26
27
  "Each entry may only occur once in the complete navigation": "Elke invoer mag slechts één keer voorkomen in de volledige navigatie",
27
28
  "Edit Username": "Gebruikersnaam bewerken",
29
+ "Entry not found!": "Invoer niet gevonden!",
28
30
  "Filename": "Bestandsnaam",
29
31
  "Global User activ": "Globale gebruiker actief",
30
32
  "Instanze": "Instanze",
@@ -38,6 +40,7 @@
38
40
  "Settings": "Instellingen",
39
41
  "Startside": "Startzijde",
40
42
  "Switch": "Schakelaar",
43
+ "Text will be send if no entry was found!": "Er wordt een tekst verzonden als er geen item is gevonden!",
41
44
  "Trigger": "Trekker",
42
45
  "Users for this Group, seperate with": "Gebruikers voor deze groep, scheid met",
43
46
  "Value": "Waarde",
@@ -18,6 +18,7 @@
18
18
  "Choose your option": "Wybierz swoją opcję",
19
19
  "Close": "Zamknąć",
20
20
  "Confirm": "Potwierdzać",
21
+ "Confirm set value": "Potwierdź ustawioną wartość",
21
22
  "Delay": "Opóźnienie",
22
23
  "Delay (ms)": "Opóźnienie (ms)",
23
24
  "Delete User": "Usuń użytkownika",
@@ -25,6 +26,7 @@
25
26
  "Do you really want to delete the group?": "Czy na pewno chcesz usunąć grupę?",
26
27
  "Each entry may only occur once in the complete navigation": "Każdy wpis może wystąpić tylko raz w całej nawigacji",
27
28
  "Edit Username": "Edytuj nazwę użytkownika",
29
+ "Entry not found!": "Nie znaleziono wpisu!",
28
30
  "Filename": "Nazwa pliku",
29
31
  "Global User activ": "Globalna aktywność użytkowników",
30
32
  "Instanze": "Instancja",
@@ -38,6 +40,7 @@
38
40
  "Settings": "Ustawienia",
39
41
  "Startside": "Strona startowa",
40
42
  "Switch": "Przełącznik",
43
+ "Text will be send if no entry was found!": "Tekst zostanie wysłany, jeśli nie znaleziono żadnego wpisu!",
41
44
  "Trigger": "Spust",
42
45
  "Users for this Group, seperate with": "Użytkownicy dla tej grupy, oddzielni od",
43
46
  "Value": "Wartość",
@@ -18,6 +18,7 @@
18
18
  "Choose your option": "Escolha sua opção",
19
19
  "Close": "Fechar",
20
20
  "Confirm": "confirme",
21
+ "Confirm set value": "Confirme o valor definido",
21
22
  "Delay": "Atraso",
22
23
  "Delay (ms)": "Atraso (ms)",
23
24
  "Delete User": "Deletar usuário",
@@ -25,6 +26,7 @@
25
26
  "Do you really want to delete the group?": "Você realmente deseja excluir o grupo?",
26
27
  "Each entry may only occur once in the complete navigation": "Cada entrada só pode ocorrer uma vez na navegação completa",
27
28
  "Edit Username": "Editar nome de usuário",
29
+ "Entry not found!": "Entrada não encontrada!",
28
30
  "Filename": "Nome do arquivo",
29
31
  "Global User activ": "Atividade global do usuário",
30
32
  "Instanze": "instância",
@@ -38,6 +40,7 @@
38
40
  "Settings": "Configurações",
39
41
  "Startside": "Startside",
40
42
  "Switch": "Trocar",
43
+ "Text will be send if no entry was found!": "O texto será enviado se nenhuma entrada for encontrada!",
41
44
  "Trigger": "Acionar",
42
45
  "Users for this Group, seperate with": "Usuários deste Grupo, separados por",
43
46
  "Value": "Valor",
@@ -18,6 +18,7 @@
18
18
  "Choose your option": "Выберите свой вариант",
19
19
  "Close": "Закрывать",
20
20
  "Confirm": "Подтверждать",
21
+ "Confirm set value": "Подтвердить установленное значение",
21
22
  "Delay": "Задерживать",
22
23
  "Delay (ms)": "Задержка (мс)",
23
24
  "Delete User": "Удалить пользователя",
@@ -25,6 +26,7 @@
25
26
  "Do you really want to delete the group?": "Вы действительно хотите удалить группу?",
26
27
  "Each entry may only occur once in the complete navigation": "Каждая запись может встречаться только один раз за всю навигацию.",
27
28
  "Edit Username": "Изменить имя пользователя",
29
+ "Entry not found!": "Запись не найдена!",
28
30
  "Filename": "Имя файла",
29
31
  "Global User activ": "Активность глобального пользователя",
30
32
  "Instanze": "Инстанц",
@@ -38,6 +40,7 @@
38
40
  "Settings": "Настройки",
39
41
  "Startside": "Стартовая сторона",
40
42
  "Switch": "Выключатель",
43
+ "Text will be send if no entry was found!": "Текст будет отправлен, если запись не найдена!",
41
44
  "Trigger": "Курок",
42
45
  "Users for this Group, seperate with": "Пользователи для этой группы, отдельно с",
43
46
  "Value": "Ценить",
@@ -18,6 +18,7 @@
18
18
  "Choose your option": "Виберіть свій варіант",
19
19
  "Close": "Закрити",
20
20
  "Confirm": "Підтвердити",
21
+ "Confirm set value": "Підтвердьте встановлене значення",
21
22
  "Delay": "Затримка",
22
23
  "Delay (ms)": "Затримка (мс)",
23
24
  "Delete User": "Видалити користувача",
@@ -25,6 +26,7 @@
25
26
  "Do you really want to delete the group?": "Ви справді хочете видалити групу?",
26
27
  "Each entry may only occur once in the complete navigation": "Кожен запис може з’являтися лише один раз у повній навігації",
27
28
  "Edit Username": "Редагувати ім'я користувача",
29
+ "Entry not found!": "Запис не знайдено!",
28
30
  "Filename": "Ім'я файлу",
29
31
  "Global User activ": "Глобальна активність користувачів",
30
32
  "Instanze": "Instanze",
@@ -38,6 +40,7 @@
38
40
  "Settings": "Налаштування",
39
41
  "Startside": "Стартова сторона",
40
42
  "Switch": "Перемикач",
43
+ "Text will be send if no entry was found!": "Текст буде надіслано, якщо запис не знайдено!",
41
44
  "Trigger": "Тригер",
42
45
  "Users for this Group, seperate with": "Користувачі для цієї групи, окремо від",
43
46
  "Value": "Значення",
@@ -18,6 +18,7 @@
18
18
  "Choose your option": "选择你的选项",
19
19
  "Close": "关闭",
20
20
  "Confirm": "确认",
21
+ "Confirm set value": "确认设定值",
21
22
  "Delay": "延迟",
22
23
  "Delay (ms)": "延迟(毫秒)",
23
24
  "Delete User": "删除用户",
@@ -25,6 +26,7 @@
25
26
  "Do you really want to delete the group?": "您真的要删除该组吗?",
26
27
  "Each entry may only occur once in the complete navigation": "每个条目在完整导航中只能出现一次",
27
28
  "Edit Username": "修改用户名",
29
+ "Entry not found!": "找不到条目!",
28
30
  "Filename": "文件名",
29
31
  "Global User activ": "全球用户活跃度",
30
32
  "Instanze": "瞬间",
@@ -38,6 +40,7 @@
38
40
  "Settings": "设置",
39
41
  "Startside": "起跑线",
40
42
  "Switch": "转变",
43
+ "Text will be send if no entry was found!": "如果没有找到条目,将发送文本!",
41
44
  "Trigger": "扳机",
42
45
  "Users for this Group, seperate with": "该组的用户,与",
43
46
  "Value": "价值",
@@ -10,6 +10,7 @@
10
10
  <script type="text/javascript" src="../../socket.io/socket.io.js"></script>
11
11
  <script type="text/javascript" src="./js/main.js"></script>
12
12
  <script type="text/javascript" src="./js/component.js"></script>
13
+ <script type="text/javascript" src="./js/groupJQ.js"></script>
13
14
 
14
15
 
15
16
  <script type="text/javascript" src="../../js/translate.js"></script>
@@ -147,7 +148,6 @@
147
148
  let gefundenerName = users.find(function (name) {
148
149
  return name.toLowerCase() === userInput.toLowerCase();
149
150
  });
150
- console.log(gefundenerName)
151
151
  if ($(this).val() !== "" && !gefundenerName) {
152
152
  $("#addNewGroup").removeClass("disabled")
153
153
  } else $("#addNewGroup").addClass("disabled")
@@ -205,7 +205,7 @@
205
205
  showHideUserCheckbox(activeGroup)
206
206
  })
207
207
 
208
- // Edit User
208
+ // Edit Group
209
209
  $("#editUser").click(function () {
210
210
  $("#dialog-change-groupname").show()
211
211
  $("#inputEditUser").val(activeGroup)
@@ -218,7 +218,7 @@
218
218
  if (gefundenerName) $("#dialog-change-groupname .btn-set").attr("disabled", "disabled")
219
219
  else $("#dialog-change-groupname .btn-set").removeAttr("disabled")
220
220
  })
221
- // Save Edit User
221
+ // Save Edit Group
222
222
  $("#dialog-change-groupname .btn-set").click(function () {
223
223
  // ActiveUser aus der User List enfernen und die Änderung hinzufügen
224
224
  users = users.filter(function (element) {
@@ -495,6 +495,79 @@
495
495
  checkUpAndDownArrowBtn(activeGroup)
496
496
  _onChange()
497
497
  })
498
+
499
+ // Copy Data
500
+ $("#btn_copy_nav").click(function () {
501
+ $("#dialog-copy-data").show()
502
+ })
503
+ $("#select-copy-data").on("change", function () {
504
+ $("#copyData").empty()
505
+ //TODO -
506
+ if ($(this).val() == "nav") {
507
+ findElementsToCopy("#tab-nav tbody", "nav")
508
+ }
509
+ else findElementsToCopy(`#tab-action tbody[data-name='${$(this).val()}']`, $(this).val())
510
+
511
+ // if ($(this).val() == "set") {
512
+ // )
513
+ // }
514
+ // else if ($(this).val() == "get") {
515
+ // findElementsToCopy("#tab-action tbody[data-name='get']", "get")
516
+ // }
517
+ // else if ($(this).val() == "pic") {
518
+ // findElementsToCopy("#tab-action tbody[data-name='pic']", "pic")
519
+ // }
520
+ })
521
+ function findElementsToCopy(selektor, toDo) {
522
+ const $bodys = $(selektor).map((index, tbody) => {
523
+ if ($(tbody).attr("name") != activeGroup) return tbody
524
+ })
525
+ let tbody = $("<tbody>")
526
+ $bodys.each(function (index, $body) {
527
+ $($body).find("tr").each(function () {
528
+ let newData = $(this).clone().removeClass("startRow")
529
+ newData.find("a").parent().remove()
530
+ newData.find("td:empty").remove()
531
+ let checkbox = $("<a>").addClass(`btn-floating btn-small waves-effect waves-light blue ${toDo} checkboxCopyData `).append($("<i>").addClass("material-icons").text("add"))
532
+ newData = newData.append($("<td>").append(checkbox))
533
+ tbody.append(newData)
534
+ })
535
+ })
536
+ $("#copyData").append($("<table>").addClass("striped").append(tbody))
537
+ }
538
+ // Save new Rows
539
+ $("#dialog-copy-data").on("click", ".checkboxCopyData", function () {
540
+ const action = $("#select-copy-data").val()
541
+
542
+ const rowToCopy = $(this).parents().eq(1)
543
+ // Add Button entfernen
544
+ rowToCopy.find("a").parent().remove()
545
+ const buttonsNav = `<td><a class="deleteRow btn-floating btn-small waves-effect waves-light red"><i class="material-icons">delete</i></a></td>
546
+ <td><a class="btn-floating btn-small waves-effect waves-light blue btn_down"><i class="material-icons" name="down">arrow_downward</i></a></td>
547
+ <td><a class="btn-floating btn-small waves-effect waves-light blue btn_up"><i class="material-icons" name="up">arrow_upward</i></a></td>`
548
+ const buttonsAction = `<td><a class="deleteEveryRow btn-floating btn-small waves-effect waves-light red"><i class="material-icons">delete</i></a></td>
549
+ <td><a data-target="tab_action" class="editEntry modal-trigger btn-floating btn-small waves-effect waves-light green"><i class="material-icons">edit</i></a></td>`;
550
+ if (action == "nav") {
551
+ rowToCopy.append(buttonsNav)
552
+ $(`#${activeGroup}`).append(rowToCopy)
553
+ checkUpAndDownArrowBtn(activeGroup)
554
+ }
555
+ else {
556
+ rowToCopy.append(buttonsAction)
557
+ $(`#tab-action tbody[name="${activeGroup}"][data-name="${action}"]`).append(rowToCopy)
558
+ }
559
+ })
560
+
561
+ $("#dialog-copy-data .btn-close").click(function () {
562
+ resetSelect()
563
+ _onChange()
564
+ })
565
+ function resetSelect() {
566
+ $("#copyData").empty()
567
+ $("#select-copy-data").val("").select()
568
+ $("#dialog-copy-data").hide()
569
+ }
570
+
498
571
  })
499
572
  </script>
500
573
  </head>
@@ -559,11 +632,12 @@
559
632
  <table id="tab_set" class="resetHide">
560
633
  <thead>
561
634
  <tr>
562
- <th style="width: 20%; background: #64b5f6 ">ID</th>
635
+ <th style="width: 25%; background: #64b5f6 ">ID</th>
563
636
  <th style="width: 1%; background: #64b5f6 "></th>
564
- <th style="width: 5%; background: #64b5f6 " class="translate">Value</th>
565
- <th style="width: 15%; background: #64b5f6 " class="translate">Return text</th>
566
- <th style="width: 1%; background: #64b5f6 " class="text-xsm translate">Confirm</th>
637
+ <th style="width: 4%; background: #64b5f6 " class="translate">Value</th>
638
+ <th style="background: #64b5f6 " class="translate">Return text</th>
639
+ <th style="width: 1%; background: #64b5f6 " class="text-xsm
640
+ translate">Confirm set value</th>
567
641
  <th style="width: 1%; background: #64b5f6 " class="text-xsm translate">Switch</th>
568
642
  <th style="width: 1%; background: #64b5f6 "></th>
569
643
  </tr>
@@ -687,6 +761,9 @@
687
761
  <a class="btn-add btn-floating btn-large waves-effect waves-light green translateT"
688
762
  id="btn_add_nav" name="nav" title="Add new Navigation"><i
689
763
  class="material-icons translate ">add</i></a>
764
+ <a class="btn-add btn-floating btn-small waves-effect waves-light blue translateT"
765
+ id="btn_copy_nav" name="nav" title="Copy Elementes from other Groups"><i
766
+ class="material-icons translate ">content_copy</i></a>
690
767
  </div>
691
768
  <div class="col s8" id="group_UserInput">
692
769
  </div>
@@ -733,6 +810,12 @@
733
810
  <label>Instance</label>
734
811
  </div>
735
812
  </div>
813
+ <div class="row">
814
+ <div class="col s3">
815
+ <input id="textNoEntry" type="text" class="value translateV" value="Entry not found!">
816
+ <label for="textNoEntry" class="translate">Text will be send if no entry was found!</label>
817
+ </div>
818
+ </div>
736
819
  <div class="row">
737
820
  <div class="input-field col s3">
738
821
  <label>
@@ -816,6 +899,30 @@
816
899
  class="large material-icons left ">close</i><span class="translate">Cancel</span></a>
817
900
  </div>
818
901
  </div>
902
+ <div id="dialog-copy-data" class="modal modal-fixed-footer">
903
+ <div class="modal-content">
904
+ <div class="row">
905
+ <div class="input-field col s3">
906
+ <select id="select-copy-data">
907
+ <option value="" disabled selected>Choose your option</option>
908
+ <option value="nav">Navigation</option>
909
+ <option value="set">SetState</option>
910
+ <option value="get">GetState</option>
911
+ <option value="pic">Send Picture</option>
912
+ </select>
913
+ <label class="translate">Copy Data</label>
914
+ </div>
915
+ </div>
916
+ <div class="row">
917
+ <div id="copyData" class="col s12 ">
918
+ </div>
919
+ </div>
920
+ </div>
921
+ <div class="modal-footer">
922
+ <a class="modal-action modal-close waves-effect waves-green btn btn-close"><i
923
+ class="large material-icons left ">close</i><span class="translate">Close</span></a>
924
+ </div>
925
+ </div>
819
926
  </div>
820
927
 
821
928
 
@@ -21,9 +21,9 @@ function navElement(user) {
21
21
  <td><input type="text" data-name="call" class="isString nav-call translateV startside" value="Startside" ></td>
22
22
  <td><input type="text" data-name="value" class="isString nav-value " value="Licht, Steckdose && Iobroker, Heizung"></td>
23
23
  <td><input type="text" data-name="text" class="isString nav-text" value="Wähle eine Aktion"></td>
24
- <td ></td>
25
- <td ></td>
26
- <td ></td>
24
+ <td></td>
25
+ <td></td>
26
+ <td></td>
27
27
  </tr>
28
28
  </tbody>`;
29
29
  }
@@ -32,13 +32,23 @@ function navElement(user) {
32
32
  * @param {string} activuser Active User
33
33
  * @param {array} users List of Users
34
34
  */
35
- function newTableRow_Nav(activuser, users) {
35
+ function newTableRow_Nav(activuser, users, array) {
36
36
  const userIndex = users.indexOf(activuser);
37
+ let call, value, text;
38
+ if (array) {
39
+ if (array[0]) call = array[0];
40
+ if (array[1]) value = array[1];
41
+ if (array[2]) text = array[2];
42
+ } else {
43
+ call = "";
44
+ value = "";
45
+ text = "Wähle eine Aktion";
46
+ }
37
47
  return /*html*/ `
38
48
  <tr>
39
- <td><input type="text" data-name="call" class="isString nav-call "></td>
40
- <td><input type="text" data-name="value" class="isString nav-value "></td>
41
- <td><input type="text" data-name="text" class="isString nav-text " value="Wähle eine Aktion"></td>
49
+ <td><input type="text" data-name="call" class="isString nav-call" value="${call}"></td>
50
+ <td><input type="text" data-name="value" class="isString nav-value" value="${value}"></td>
51
+ <td><input type="text" data-name="text" class="isString nav-text" value="${text}"></td>
42
52
  <td><a class="deleteRow btn-floating btn-small waves-effect waves-light red"><i class="material-icons">delete</i></a></td>
43
53
  <td><a class="btn-floating btn-small waves-effect waves-light blue btn_down"><i class="material-icons" name="down">arrow_downward</i></a></td>
44
54
  <td><a class="btn-floating btn-small waves-effect waves-light blue btn_up"><i class="material-icons" name="up">arrow_upward</i></a></td>
@@ -138,7 +148,7 @@ function actionElement(user) {
138
148
  ID</th>
139
149
  <th data-name="value" data-type="string" class="translate">Value</th>
140
150
  <th data-name="returnText" data-type="string" class="translate">Return text</th>
141
- <th data-name="confirm" data-type="string" style="width: 2%;" class="translate">Confirm</th>
151
+ <th data-name="confirm" data-type="string" style="width: 8%;" class="translate">Confirm set value</th>
142
152
  <th data-name="switch" data-type="string" style="width: 2%;" class="translate">Switch</th>
143
153
  <th data-name="edit" style="width: 2%;">
144
154
  </th>
package/admin/style.css CHANGED
@@ -103,7 +103,10 @@ h1 {
103
103
  #dialog-confirm div.modal-content {
104
104
  width: 100% !important;
105
105
  }
106
-
106
+ #dialog-copy-data {
107
+ width: 99% !important;
108
+ top: 100px !important;
109
+ }
107
110
  .showHideMenu {
108
111
  height: 28px;
109
112
  font-size: 1rem;
package/admin/words.js CHANGED
@@ -27,11 +27,15 @@ systemDictionary = {
27
27
  "Choose your option": { "en": "Choose your option", "de": "Wählen Sie Ihre Option", "ru": "Выберите свой вариант", "pt": "Escolha sua opção", "nl": "Kies uw optie", "fr": "Choisissez votre option", "it": "Scegli la tua opzione", "es": "Elige tu opción", "pl": "Wybierz swoją opcję", "uk": "Виберіть свій варіант", "zh-cn": "选择你的选项"},
28
28
  "Close": { "en": "Close", "de": "Schließen", "ru": "Закрывать", "pt": "Fechar", "nl": "Dichtbij", "fr": "Fermer", "it": "Vicino", "es": "Cerca", "pl": "Zamknąć", "uk": "Закрити", "zh-cn": "关闭"},
29
29
  "Confirm": { "en": "Confirm", "de": "Bestätigen", "ru": "Подтверждать", "pt": "confirme", "nl": "Bevestigen", "fr": "Confirmer", "it": "Confermare", "es": "Confirmar", "pl": "Potwierdzać", "uk": "Підтвердити", "zh-cn": "确认"},
30
+ "Confirm set value": { "en": "Confirm set value", "de": "Eingestellten Wert bestätigen", "ru": "Подтвердить установленное значение", "pt": "Confirme o valor definido", "nl": "Bevestig ingestelde waarde", "fr": "Confirmer la valeur définie", "it": "Conferma il valore impostato", "es": "Confirmar valor establecido", "pl": "Potwierdź ustawioną wartość", "uk": "Підтвердьте встановлене значення", "zh-cn": "确认设定值"},
30
31
  "Delay": { "en": "Delay", "de": "Verzögerung", "ru": "Задерживать", "pt": "Atraso", "nl": "Vertraging", "fr": "Retard", "it": "Ritardo", "es": "Demora", "pl": "Opóźnienie", "uk": "Затримка", "zh-cn": "延迟"},
31
32
  "Delay (ms)": { "en": "Delay (ms)", "de": "Verzögerung (ms)", "ru": "Задержка (мс)", "pt": "Atraso (ms)", "nl": "Vertraging (ms)", "fr": "Délai (ms)", "it": "Ritardo (ms)", "es": "Retardo (ms)", "pl": "Opóźnienie (ms)", "uk": "Затримка (мс)", "zh-cn": "延迟(毫秒)"},
32
33
  "Delete User": { "en": "Delete User", "de": "Benutzer löschen", "ru": "Удалить пользователя", "pt": "Deletar usuário", "nl": "Verwijder gebruiker", "fr": "Supprimer l'utilisateur", "it": "Elimina utente", "es": "Borrar usuario", "pl": "Usuń użytkownika", "uk": "Видалити користувача", "zh-cn": "删除用户"},
33
34
  "Directory": { "en": "Directory", "de": "Verzeichnis", "ru": "Каталог", "pt": "Diretório", "nl": "Gids", "fr": "Annuaire", "it": "Direttorio", "es": "Directorio", "pl": "Informator", "uk": "Довідник", "zh-cn": "目录"},
35
+ "Do you really want to delete the group?": { "en": "Do you really want to delete the group?", "de": "Möchten Sie die Gruppe wirklich löschen?", "ru": "Вы действительно хотите удалить группу?", "pt": "Você realmente deseja excluir o grupo?", "nl": "Wilt u de groep echt verwijderen?", "fr": "Voulez-vous vraiment supprimer le groupe ?", "it": "Vuoi davvero eliminare il gruppo?", "es": "¿Realmente quieres eliminar el grupo?", "pl": "Czy na pewno chcesz usunąć grupę?", "uk": "Ви справді хочете видалити групу?", "zh-cn": "您真的要删除该组吗?"},
34
36
  "Each entry may only occur once in the complete navigation": {"en": "Each entry may only occur once in the complete navigation", "de": "Jeder Eintrag darf in der gesamten Navigation nur einmal vorkommen", "ru": "Каждая запись может встречаться только один раз за всю навигацию.", "pt": "Cada entrada só pode ocorrer uma vez na navegação completa", "nl": "Elke invoer mag slechts één keer voorkomen in de volledige navigatie", "fr": "Chaque entrée ne peut apparaître qu'une seule fois dans la navigation complète", "it": "Ogni voce può comparire una sola volta nella navigazione completa", "es": "Cada entrada solo puede ocurrir una vez en la navegación completa", "pl": "Każdy wpis może wystąpić tylko raz w całej nawigacji", "uk": "Кожен запис може з’являтися лише один раз у повній навігації", "zh-cn": "每个条目在完整导航中只能出现一次"},
37
+ "Edit Username": { "en": "Edit Username", "de": "Benutzernamen bearbeiten", "ru": "Изменить имя пользователя", "pt": "Editar nome de usuário", "nl": "Gebruikersnaam bewerken", "fr": "Modifier le nom d'utilisateur", "it": "Modifica nome utente", "es": "Editar nombre de usuario", "pl": "Edytuj nazwę użytkownika", "uk": "Редагувати ім'я користувача", "zh-cn": "修改用户名"},
38
+ "Entry not found!": { "en": "Entry not found!", "de": "Eintrag nicht gefunden!", "ru": "Запись не найдена!", "pt": "Entrada não encontrada!", "nl": "Invoer niet gevonden!", "fr": "Entrée introuvable !", "it": "Voce non trovata!", "es": "¡Entrada no encontrada!", "pl": "Nie znaleziono wpisu!", "uk": "Запис не знайдено!", "zh-cn": "找不到条目!"},
35
39
  "Filename": { "en": "Filename", "de": "Dateinamen", "ru": "Имя файла", "pt": "Nome do arquivo", "nl": "Bestandsnaam", "fr": "Nom de fichier", "it": "Nome del file", "es": "Nombre del archivo", "pl": "Nazwa pliku", "uk": "Ім'я файлу", "zh-cn": "文件名"},
36
40
  "Global User activ": { "en": "Global user activ", "de": "Globaler Benutzer aktiv", "ru": "Активность глобального пользователя", "pt": "Atividade global do usuário", "nl": "Globale gebruiker actief", "fr": "Activation globale de l'utilisateur", "it": "Utente globale attivo", "es": "Actividad de usuario global", "pl": "Globalna aktywność użytkowników", "uk": "Глобальна активність користувачів", "zh-cn": "全球用户活跃度"},
37
41
  "Instanze": { "en": "Instanze", "de": "Instanz", "ru": "Инстанц", "pt": "instância", "nl": "Instanze", "fr": "Instantané", "it": "Istanza", "es": "Instancia", "pl": "Instancja", "uk": "Instanze", "zh-cn": "瞬间"},
@@ -45,12 +49,11 @@ systemDictionary = {
45
49
  "Settings": { "en": "Settings", "de": "Einstellungen", "ru": "Настройки", "pt": "Configurações", "nl": "Instellingen", "fr": "Paramètres", "it": "Impostazioni", "es": "Ajustes", "pl": "Ustawienia", "uk": "Налаштування", "zh-cn": "设置"},
46
50
  "Startside": { "en": "Startside", "de": "Startseite", "ru": "Стартовая сторона", "pt": "Startside", "nl": "Startzijde", "fr": "Côté départ", "it": "Lato iniziale", "es": "Lado de salida", "pl": "Strona startowa", "uk": "Стартова сторона", "zh-cn": "起跑线"},
47
51
  "Switch": { "en": "Switch", "de": "Schalten", "ru": "Выключатель", "pt": "Trocar", "nl": "Schakelaar", "fr": "Changer", "it": "Interruttore", "es": "Cambiar", "pl": "Przełącznik", "uk": "Перемикач", "zh-cn": "转变"},
52
+ "Text will be send if no entry was found!": { "en": "Text will be send if no entry was found!", "de": "Text wird gesendet, wenn kein Eintrag gefunden wurde!", "ru": "Текст будет отправлен, если запись не найдена!", "pt": "O texto será enviado se nenhuma entrada for encontrada!", "nl": "Er wordt een tekst verzonden als er geen item is gevonden!", "fr": "Le texte sera envoyé si aucune entrée n'a été trouvée !", "it": "Il testo verrà inviato se non è stata trovata alcuna voce!", "es": "¡Se enviará texto si no se encontró ninguna entrada!", "pl": "Tekst zostanie wysłany, jeśli nie znaleziono żadnego wpisu!", "uk": "Текст буде надіслано, якщо запис не знайдено!", "zh-cn": "如果没有找到条目,将发送文本!"},
48
53
  "Trigger": { "en": "Trigger", "de": "Auslöser", "ru": "Курок", "pt": "Acionar", "nl": "Trekker", "fr": "Déclencher", "it": "Grilletto", "es": "Desencadenar", "pl": "Spust", "uk": "Тригер", "zh-cn": "扳机"},
49
54
  "Users for this Group, seperate with": { "en": "Users for this Group, seperate with", "de": "Benutzer für diese Gruppe, trennen Sie mit", "ru": "Пользователи для этой группы, отдельно с", "pt": "Usuários deste Grupo, separados por", "nl": "Gebruikers voor deze groep, scheid met", "fr": "Utilisateurs pour ce groupe, séparés par", "it": "Utenti per questo gruppo, separati da", "es": "Usuarios para este Grupo, separe con", "pl": "Użytkownicy dla tej grupy, oddzielni od", "uk": "Користувачі для цієї групи, окремо від", "zh-cn": "该组的用户,与"},
50
55
  "Value": { "en": "Value", "de": "Wert", "ru": "Ценить", "pt": "Valor", "nl": "Waarde", "fr": "Valeur", "it": "Valore", "es": "Valor", "pl": "Wartość", "uk": "Значення", "zh-cn": "价值"},
51
56
  "What is to do?": { "en": "What is to do?", "de": "Was ist zu tun?", "ru": "Что делать?", "pt": "O que fazer?", "nl": "Wat is er te doen?", "fr": "Que faire ?", "it": "Cosa fare?", "es": "¿Qué hay que hacer?", "pl": "Co robić?", "uk": "Що робити?", "zh-cn": "怎么办?"},
52
57
  "active": { "en": "active", "de": "aktiv", "ru": "активный", "pt": "ativo", "nl": "actief", "fr": "actif", "it": "attivo", "es": "activo", "pl": "aktywny", "uk": "активний", "zh-cn": "积极的"},
53
58
  "telegram-menu adapter settings": { "en": "Adapter settings for telegram-menu", "de": "Adaptereinstellungen für Telegram-Menü", "ru": "Настройки адаптера для телеграм-меню", "pt": "Configurações do adaptador para menu de telegrama", "nl": "Adapterinstellingen voor telegrammenu", "fr": "Paramètres de l'adaptateur pour le menu télégramme", "it": "Impostazioni dell'adattatore per il menu del telegramma", "es": "Configuración del adaptador para el menú de telegramas", "pl": "Ustawienia adaptera dla menu telegramu", "uk": "Налаштування адаптера для telegram-меню", "zh-cn": "电报菜单的适配器设置"},
54
- "Do you really want to delete the group?": { "en": "Do you really want to delete the group?", "de": "Möchten Sie die Gruppe wirklich löschen?", "ru": "Вы действительно хотите удалить группу?", "pt": "Você realmente deseja excluir o grupo?", "nl": "Wilt u de groep echt verwijderen?", "fr": "Voulez-vous vraiment supprimer le groupe ?", "it": "Vuoi davvero eliminare il gruppo?", "es": "¿Realmente quieres eliminar el grupo?", "pl": "Czy na pewno chcesz usunąć grupę?", "uk": "Ви справді хочете видалити групу?", "zh-cn": "您真的要删除该组吗?"},
55
- "Edit Username": { "en": "Edit Username", "de": "Benutzernamen bearbeiten", "ru": "Изменить имя пользователя", "pt": "Editar nome de usuário", "nl": "Gebruikersnaam bewerken", "fr": "Modifier le nom d'utilisateur", "it": "Modifica nome utente", "es": "Editar nombre de usuario", "pl": "Edytuj nazwę użytkownika", "uk": "Редагувати ім'я користувача", "zh-cn": "修改用户名"},
56
59
  };
package/io-package.json CHANGED
@@ -1,8 +1,21 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "telegram-menu",
4
- "version": "0.2.0",
4
+ "version": "0.3.0",
5
5
  "news": {
6
+ "0.3.0": {
7
+ "en": "add ack Flag\nCopy-Button to copy User-elements to activ User",
8
+ "de": "eine Seite hinzufügen\nCopy-Button zu kopieren Benutzerelemente zum Aktivieren",
9
+ "ru": "добавить ack Флаг\nCopy-Button для копирования Пользователи для активного пользователя",
10
+ "pt": "adicionar ack Flag\nCopiar botão para copiar Elementos de usuário para agir",
11
+ "nl": "ack Flag\nBegrepen. User-elements om User te acteren",
12
+ "fr": "ajouter le drapeau\nCopy-Button to copy Utilisateurs pour activer Utilisateur",
13
+ "it": "aggiungi una bandiera\nCopia pulsante per copiare Selezione utente per attivare l'Utente",
14
+ "es": "añadir ack Bandera\nCopiar-Button para copiar Elementos de usuario para activ Usuario",
15
+ "pl": "dodać flagę\nCopy-Button do kopienia Użytkowniki do aktywowania Użytkownicy",
16
+ "uk": "додати ack Прапор\nКопіювати кнопку Користувачі-елементи для активації Користувача",
17
+ "zh-cn": "增加包装滞后\n印本 使用器操作器"
18
+ },
6
19
  "0.2.0": {
7
20
  "en": "rename button\ncreate groups with users",
8
21
  "de": "rename taste\ngruppen mit benutzern erstellen",
@@ -80,19 +93,6 @@
80
93
  "pl": "Fixe SetState and GetState (ang.)\nTranslat",
81
94
  "uk": "Фіксований SetState і GetState\nПереклад",
82
95
  "zh-cn": "B. 固定的国家和国\n笔译"
83
- },
84
- "0.0.2": {
85
- "en": "initial release",
86
- "de": "erstausstrahlung",
87
- "ru": "начальный выпуск",
88
- "pt": "lançamento inicial",
89
- "nl": "niet",
90
- "fr": "initial release",
91
- "it": "rilascio iniziale",
92
- "es": "liberación inicial",
93
- "pl": "pierwsze wydanie",
94
- "uk": "початковий реліз",
95
- "zh-cn": "初步释放"
96
96
  }
97
97
  },
98
98
  "titleLang": {
@@ -168,7 +168,8 @@
168
168
  "tokenGrafana": "",
169
169
  "directory": "",
170
170
  "userActiveCheckbox": [],
171
- "usersInGroup": {}
171
+ "usersInGroup": {},
172
+ "textNoEntry": ""
172
173
  },
173
174
  "objects": [],
174
175
  "instanceObjects": [
@@ -6,26 +6,36 @@ function setstate(_this, part, userToSend) {
6
6
  /** @type {{ id: string; value: boolean; toggle:boolean; confirm:Boolean; returnText: string }} */ element,
7
7
  ) => {
8
8
  _this.log.debug("Element to set " + JSON.stringify(element));
9
+ let ack = true;
10
+ let returnText = element.returnText;
11
+ if (returnText.includes("ack:true")) {
12
+ ack = true;
13
+ returnText = returnText.replace("ack:true", "");
14
+ } else if (returnText.includes("ack:false")) {
15
+ ack = false;
16
+ returnText = element.returnText.replace("ack:false", "").trim();
17
+ }
9
18
  setStateIds.push({
10
19
  id: element.id,
11
20
  confirm: element.confirm,
12
- returnText: element.returnText,
21
+ returnText: returnText,
13
22
  userToSend: userToSend,
14
23
  });
24
+
15
25
  if (element.toggle) {
16
- if (element.toggle) _this.log.debug("Toggle");
26
+ _this.log.debug("Toggle");
17
27
  _this
18
28
  .getForeignStateAsync(element.id)
19
29
  .then((val) => {
20
30
  _this.log.debug("Value " + JSON.stringify(val));
21
- if (val) _this.setForeignStateAsync(element.id, !val.val);
31
+ if (val) _this.setForeignStateAsync(element.id, !val.val, ack);
22
32
  })
23
33
  .catch((e) => {
24
34
  console.log(e);
25
35
  });
26
36
  } else {
27
37
  _this.log.debug("Value " + JSON.stringify(element.value));
28
- _this.setForeignStateAsync(element.id, element.value);
38
+ _this.setForeignStateAsync(element.id, element.value, ack);
29
39
  }
30
40
  },
31
41
  );
package/main.js CHANGED
@@ -18,7 +18,6 @@ const getstate = require("./lib/js/getstate").getstate;
18
18
  // const lichtAn = require("./lib/js/action").lichtAn;
19
19
  // const wertUebermitteln = require("./lib/js/action").wertUebermitteln;
20
20
 
21
- const telegramID = "telegram.0.communicate.request";
22
21
  let timeouts = [];
23
22
  let timeoutKey = 0;
24
23
  let setStateIds;
@@ -46,6 +45,7 @@ class TelegramMenu extends utils.Adapter {
46
45
  async onReady() {
47
46
  this.setState("info.connection", false, true);
48
47
  let instanceTelegram = this.config.instance;
48
+ const telegramID = `${instanceTelegram}.communicate.request`;
49
49
  if (instanceTelegram.length == 0) instanceTelegram = "telegram.0";
50
50
  const datapoint = `${instanceTelegram}.info.connection`;
51
51
  this.log.debug("Instance " + JSON.stringify(instanceTelegram));
@@ -64,6 +64,7 @@ class TelegramMenu extends utils.Adapter {
64
64
  const directoryPicture = this.config.directory;
65
65
  const userActiveCheckbox = this.config.userActiveCheckbox;
66
66
  const usersInGroup = this.config.usersInGroup;
67
+ const textNoEntryFound = this.config.textNoEntry;
67
68
  const menu = {
68
69
  data: {},
69
70
  };
@@ -137,12 +138,11 @@ class TelegramMenu extends utils.Adapter {
137
138
  restartAdapter = false;
138
139
  }
139
140
  }
140
- //TODO - heraus nehmen damit auf den connection state reagiert wird
141
141
  let oldValue;
142
142
  this.on("stateChange", async (id, state) => {
143
143
  try {
144
144
  let userToSend;
145
- if (telegramAktiv) {
145
+ if (telegramAktiv && state?.ack) {
146
146
  if (state && typeof state.val === "string" && state.val != "" && id == telegramID) {
147
147
  const value = state.val;
148
148
  const user = value.slice(1, value.indexOf("]"));
@@ -223,7 +223,7 @@ class TelegramMenu extends utils.Adapter {
223
223
  }
224
224
  } else {
225
225
  if (typeof userToSend == "string")
226
- sendToTelegram(this, userToSend, "Eintrag wurde nicht gefunden!");
226
+ sendToTelegram(this, userToSend, textNoEntryFound);
227
227
  }
228
228
  // Auf Setstate reagieren und Wert schicken
229
229
  } else if (
@@ -240,10 +240,24 @@ class TelegramMenu extends utils.Adapter {
240
240
  let textToSend = element.returnText;
241
241
  // Wenn eine Rückkgabe des Value an den User nicht gewünscht ist soll value durch einen leeren String ersetzt werden
242
242
  let value;
243
+ // Change set value in another Value, like true => on, false => off
244
+ let objChangeValue = {};
245
+ let valueChange = "";
246
+ if (textToSend.toString().includes("change{")) {
247
+ const startindex = textToSend.indexOf("change{");
248
+ const match = textToSend.substring(
249
+ startindex + "change".length + 1,
250
+ textToSend.indexOf("}", startindex),
251
+ );
252
+ objChangeValue = JSON.parse("{" + match + "}");
253
+ valueChange = objChangeValue[String(state.val)];
254
+ textToSend = textToSend.substring(0, startindex);
255
+ }
243
256
  textToSend?.toString().includes("{novalue}")
244
257
  ? (value = "")
245
258
  : (value = state.val);
246
259
  textToSend = textToSend.replace("{novalue}", "");
260
+ valueChange ? (value = valueChange) : value;
247
261
  textToSend.indexOf("&amp;&amp;") != -1
248
262
  ? (textToSend = textToSend.replace("&amp;&amp;", value))
249
263
  : (textToSend += " " + value);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.telegram-menu",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Easily create Telegram Menus",
5
5
  "author": {
6
6
  "name": "MiRo1310",
@@ -30,26 +30,26 @@
30
30
  "@alcalzone/release-script-plugin-manual-review": "^3.5.9",
31
31
  "@iobroker/adapter-dev": "^1.2.0",
32
32
  "@iobroker/testing": "^4.1.0",
33
- "@tsconfig/node16": "^1.0.3",
33
+ "@tsconfig/node16": "^16.1.0",
34
34
  "@types/chai": "^4.3.5",
35
35
  "@types/chai-as-promised": "^7.1.5",
36
36
  "@types/jquery": "^3.5.16",
37
37
  "@types/mocha": "^10.0.1",
38
- "@types/node": "^18.16.3",
38
+ "@types/node": "^20.3.3",
39
39
  "@types/proxyquire": "^1.3.28",
40
40
  "@types/sinon": "^10.0.13",
41
41
  "@types/sinon-chai": "^3.2.9",
42
42
  "chai": "^4.3.7",
43
43
  "chai-as-promised": "^7.1.1",
44
- "eslint": "^8.39.0",
44
+ "eslint": "^8.44.0",
45
45
  "eslint-config-prettier": "^8.8.0",
46
46
  "eslint-plugin-prettier": "^4.2.1",
47
47
  "mocha": "^10.2.0",
48
48
  "prettier": "^2.8.8",
49
49
  "proxyquire": "^2.1.3",
50
- "sinon": "^15.0.4",
50
+ "sinon": "^15.2.0",
51
51
  "sinon-chai": "^3.7.0",
52
- "typescript": "~5.0.4"
52
+ "typescript": "~5.1.6"
53
53
  },
54
54
  "main": "main.js",
55
55
  "files": [