From a8e14eb797767ab76b7c249f137baa1cdae88c3b Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 1 May 2025 11:18:58 +0200 Subject: [PATCH] okay-button for input --- client/cssFiles/SEAWebClientGroup.css | 14 +++ client/cssFiles/SEAWebClientMain.css | 2 +- client/jsFiles/SEAWebClientCommunication.js | 6 +- client/jsFiles/SEAWebClientGroup.js | 126 ++++++++++---------- client/jsFiles/SEAWebClientMain.js | 4 +- client/res/icon_edit_close.png | Bin 0 -> 9670 bytes client/res/icon_okay.png | Bin 0 -> 10045 bytes 7 files changed, 84 insertions(+), 68 deletions(-) create mode 100644 client/res/icon_edit_close.png create mode 100644 client/res/icon_okay.png diff --git a/client/cssFiles/SEAWebClientGroup.css b/client/cssFiles/SEAWebClientGroup.css index 0b37705..4f34c37 100644 --- a/client/cssFiles/SEAWebClientGroup.css +++ b/client/cssFiles/SEAWebClientGroup.css @@ -179,6 +179,20 @@ display: none; } +/* ------------------------------ okay-icon ------------------------------ */ + +.icon-okay { + width: 18px; + height: 18px; + margin-top: 6px; + margin-left: 4px; +} + +.icon-okay:hover { + transform: scale(.8); + opacity: .6; +} + /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ /* INPUT ELEMENTS */ diff --git a/client/cssFiles/SEAWebClientMain.css b/client/cssFiles/SEAWebClientMain.css index 1c25a6d..ad1c523 100644 --- a/client/cssFiles/SEAWebClientMain.css +++ b/client/cssFiles/SEAWebClientMain.css @@ -177,7 +177,7 @@ meta, body { justify-content: flex-end; } -.panel-grapics-wide { +.panel-graphics-wide { padding-right: 28px; } diff --git a/client/jsFiles/SEAWebClientCommunication.js b/client/jsFiles/SEAWebClientCommunication.js index 28f998c..89db5b7 100644 --- a/client/jsFiles/SEAWebClientCommunication.js +++ b/client/jsFiles/SEAWebClientCommunication.js @@ -245,11 +245,7 @@ function updateStatus(component) { status_info.innerHTML = component.formatted; } - status_icon.classList.remove('icon-status-disabled'); - status_icon.classList.remove('icon-status-idle'); - status_icon.classList.remove('icon-status-warn'); - status_icon.classList.remove('icon-status-busy'); - status_icon.classList.remove('icon-status-error'); + status_icon.classList.remove('icon-status-disabled', 'icon-status-idle', 'icon-status-warn', 'icon-status-busy', 'icon-status-error'); row.classList.remove('row-disabled'); right.classList.remove = 'col-right-disabled'; diff --git a/client/jsFiles/SEAWebClientGroup.js b/client/jsFiles/SEAWebClientGroup.js index 15fb741..d8c1af2 100644 --- a/client/jsFiles/SEAWebClientGroup.js +++ b/client/jsFiles/SEAWebClientGroup.js @@ -154,8 +154,7 @@ function createRightColumnForModules(component) { component.type == 'pushbutton' || component.type == 'checkbox' || component.type == 'enum' - ) { - console.log(component.type); + ) { let input_element = createType(component); if (component.type != 'pushbutton') { let icon_edit = createIconEdit(input_element); @@ -212,6 +211,9 @@ function createIconEdit (input_element) { hideInputElements(); if (is_hidden) { input_element.classList.remove('input-element-hidden'); + icon_edit.setAttribute('src', 'res/icon_edit_close.png'); + } else { + icon_edit.setAttribute('src', 'res/icon_edit.png'); } } @@ -264,15 +266,23 @@ function createPushbutton(component) { function createInputText(component) { // Creates row-element containing input-item. - var command = component.command; + var input = createInputElement(component, 'input', 'input-text'); input.type = "text"; input.style.width = "100px"; + + // Prevent updates, while user is changing textfield input.addEventListener("focus", function(evt) { let elm = evt.target; setTimeout(function(){elm.setSelectionRange(0, elm.value.length);},0); }); + let submit_btn = document.createElement('input'); + submit_btn.setAttribute('type', 'image'); + submit_btn.classList.add('icon-modules', 'icon-okay'); + submit_btn.setAttribute('src', 'res/icon_okay.png'); + submit_btn + input.onkeydown = function (e) { if (e.key == "Escape") { // User decided to cancel @@ -285,10 +295,6 @@ function createInputText(component) { } } - input.onclick = function (e) { - e.stopPropagation(); - } - input.onfocus = function () { input.oldValue = input.value; if (isTouchDevice) @@ -297,47 +303,51 @@ function createInputText(component) { }, 1); } - input.onblur = function () { - if (prompt) { - return false; - } - var row = input.closest('div'); - row.classList.add('row-waiting-for-answer'); - var value = input.value; - let oldValue = 'oldValue' in input ? input.oldValue : value; - if (!('actualValue' in input)) input.actualValue = oldValue; - actualValue = input.actualValue; - if (value == actualValue || value == oldValue || - parseFloat(value) == parseFloat(actualValue) || parseFloat(value) == parseFloat(oldValue)) { - input.value = actualValue; - // nothing to do. - row.classList.remove('row-waiting-for-answer'); - return false; - } - // User changed value and moved focus to other object. - alertify.confirm("", "You changed a field without pressing the return key.
" - + "Hint: press ESC for leaving a field unchanged." - + "You are connected with " + clientTitle + ".
" - + "Are you sure you want to change the value of
" - + component.name + " from " + actualValue - + " to " + value + "?", - function () { - // User decided to proceed. - row.classList.add('row-waiting-for-answer'); - // Request for command - sendCommand(s, command + " " + value); - resizeTextfield(input); - prompt = false; - hideInputElements(); - }, function () { - // User decided to cancel - input.value = input.actualValue; - resizeTextfield(input); - row.classList.remove('row-waiting-for-answer'); - prompt = false; - hideInputElements(); - }); - } + // input.onclick = function (e) { + // e.stopPropagation(); + // } + + // input.onblur = function () { + // if (prompt) { + // return false; + // } + // var row = input.closest('div'); + // row.classList.add('row-waiting-for-answer'); + // var value = input.value; + // let oldValue = 'oldValue' in input ? input.oldValue : value; + // if (!('actualValue' in input)) input.actualValue = oldValue; + // actualValue = input.actualValue; + // if (value == actualValue || value == oldValue || + // parseFloat(value) == parseFloat(actualValue) || parseFloat(value) == parseFloat(oldValue)) { + // input.value = actualValue; + // // nothing to do. + // row.classList.remove('row-waiting-for-answer'); + // return false; + // } + // // User changed value and moved focus to other object. + // alertify.confirm("", "You changed a field without pressing the return key.
" + // + "Hint: press ESC for leaving a field unchanged." + // + "You are connected with " + clientTitle + ".
" + // + "Are you sure you want to change the value of
" + // + component.name + " from " + actualValue + // + " to " + value + "?", + // function () { + // // User decided to proceed. + // row.classList.add('row-waiting-for-answer'); + // // Request for command + // sendCommand(s, component.command + " " + value); + // resizeTextfield(input); + // prompt = false; + // hideInputElements(); + // }, function () { + // // User decided to cancel + // input.value = input.actualValue; + // resizeTextfield(input); + // row.classList.remove('row-waiting-for-answer'); + // prompt = false; + // hideInputElements(); + // }); + // } var form = document.createElement('form'); form.onsubmit = function (e) { @@ -355,19 +365,8 @@ function createInputText(component) { hideInputElements(); }; form.appendChild(input); + form.appendChild(submit_btn); return form; - - function posTextfield(s, left) { - if (debug_group_daniel) { - console.log("%cfunction: posTextfield", "color:white;background:salmon"); - } - - // var content = swiper[s].slides[swiper[s].activeIndex].childNodes[1]; - // var row = left.parentNode; - // content.scrollTop = row.offsetTop - 30; - - // ---------------------> Not working anymore since swiper was removed!!! - } } function createCheckbox(component) { @@ -441,11 +440,18 @@ function createInputElement(component, tag='span', cls='col-right-modules') { /* ---------------------------------------------------------------------------------- */ +// Hides all input elements (input text, pushbotton, enum, checkbox) +// Changes all iconEditClose (cross) back to iconEdit (pen) function hideInputElements(){ let input_elements = document.getElementsByClassName('input-element'); for (let i = 0; i < input_elements.length; i++) { input_elements[i].classList.add('input-element-hidden'); } + + let array_icon_edit = document.getElementsByClassName('icon-edit'); + for (let i = 0; i < array_icon_edit.length; i++) { + array_icon_edit[i].setAttribute('src', 'res/icon_edit.png'); + } } function resizeTextfield(input) { diff --git a/client/jsFiles/SEAWebClientMain.js b/client/jsFiles/SEAWebClientMain.js index 07cf96d..1526fbc 100644 --- a/client/jsFiles/SEAWebClientMain.js +++ b/client/jsFiles/SEAWebClientMain.js @@ -158,13 +158,13 @@ window.onload = function() { } else { if (window.wideGraphs) { window.wideGraphs = false; - document.getElementsByClassName('graphics')[0].classList.remove('panel-grapics-wide'); + document.getElementsByClassName('graphics')[0].classList.remove('panel-graphics-wide'); // icon_close_container.innerHTML = ''; icon_close_container.innerHTML = ''; icon_log_container.classList.remove("icon-main-container-hidden"); } else { window.wideGraphs = true; - document.getElementsByClassName('graphics')[0].classList.add('panel-grapics-wide'); + document.getElementsByClassName('graphics')[0].classList.add('panel-graphics-wide'); // icon_close_container.innerHTML = ''; icon_close_container.innerHTML = ''; icon_log_container.classList.add("icon-main-container-hidden"); diff --git a/client/res/icon_edit_close.png b/client/res/icon_edit_close.png new file mode 100644 index 0000000000000000000000000000000000000000..8a180c52e4d45ce25fda27d058806f1d4cd78a1a GIT binary patch literal 9670 zcmX9^bzD>5-@hXS$&DOH4ulQqlFms|hzymJiz% zH0?5~^Ik3TChYa%uCDYV1vLc`&XMIgM-8E}r$28~ESv_Xzp1M$c9CB`;_%DnU#rKt z=HvRd#j)?}>b2%aQ(288id*d-Z%iLEMK_p{GdNoJ4i5aE*gaDNy6Fg!GC(wROba+* zI-S1IjRtt*UE9<a6g3giaeYe;X0w9mSeZEP#h%r1Ub5?W6y}<#CozEhPC4R2Esp_N=We#( zf5{^JuabyRBSdI5o)vg8PwAji7_PckZ;w%Jt88v=4qq*f(88ER%ESI%GMS|#Y!3wnUU1L9-I z9Y{AH;!j@Cbc2|yX;H=n)n7*^sWJ0seDN04pEcK`c%g#bvq0Q}%KK(xZgx5|nN+_* zL7LrgV3m4M)Y)uemm|J3?Dp+B&4_Im?RBq;3cqD~gY-*4QKC(Ht%F!~$6HFrajvu| zL!mj#aFbRyd0s~i)B6sCTE46?8ZEi5XEUxC8Ws_;Q}6dx3F&&hUDS2-P7;CpnmnO_ zgCRN3c&Z{HiLz(Ab zPPt)Q#bHt?PKtEAjB3^`=ka74{hq30d#Kyr{_GB6uKBa zTA^Md@ywW^k!5bS`v&OcBUgUR&}`auR=j}QHmyf{L4bXqCVEeGx^3Q=lw)$8UN!Wk zOFRCT9iEGQQoRAV!_r*}Xc(eLsqajN6kWD8V=Yw<`YQeR@84qu$|=BdZRG}H!@%#p zt=*L@`lAc5VxQ>)c4KaNu5c+j*nQ%ryI94J@LXPaUQ-FK1doxvSmCQ^=In&zI4!Y} zJBsP_@$m3yf-WNQpUU{s{_y$4AV^Uw29of@lnr zSs8@|)^~Q?o4oqcPpj_no<~${Z*S|Tt-%q6Y2#f!(c|IF-(aZaFD0w5i^GI_tR9BK zQ{>WcE7U5;btlWho9#5+8raTe*bWI#(29*Z{5oZcAalU@lZ)QPI+U>7Dc9X4;y@blZ-} z^A!HtOR7vgFYq{`erWJVC!mW{@1)DC@r7hLub1zy@9&QN3J)9+B%oXCeBK*$Sl*J# z)Xm};x^eQgdJMP1Kl8`%qR!4k0QM+cW4E7n39YQOfqy)mLK19`Jq`Ktxn{vm2e2 z;hQe6hyO?$f|09S0S^;$ohG*PE2SfP(}%vnKFn1cGtu&-Akv^Hk`QSO)*@r$+qX6}_!mV@hZ` z?C$Os0a!9o%YO@NT#F7eZ4IfKE9~WNS-i4r99fh3XsIFXHPu=!x7@;kh@jwQg)kML-8RV26qwmztf z)|=XYshhY`oAah6ai?lja)Ww8Q3lwxM!#rFA_V``*y%vdQ;ZB*T&Ef`9WoAqBJA|- zS@M7}gm2*JV!Qx0PNAL;9Y*wo&u2+!LB9=pI(~XdKAAR3p!QhFE3Ap_aF9Gzt>;61 zlV$RDN02Uzjl_FkwI;%6)hp-)()eopPGx{>M8#w@de8Fi-Lv%&7kqV+NCEGe`x^rt ztLG(z>@e3UD}INUd~bpoFTl2NHWtmw))FFjn&L#_WzZaF4b;@ssZ#EpCsKJKd2YA% z_V%tNL2p5e;g|1}9M;)n^d}IimsGeRFVrf2AA_4d9UUE=r}fNU!qDA){;=T4C{K>M zfY7x;+CDQEXHu5VT5_RXxByGm#!lAT+SfAG{%9Fe9LcU|d71XB1oIzU+m8S8MIO_M z4tV!ny}!PFzAKKzO=%3wG>z{~cz-DHDn-W6x!@>tD!i*f?S@HHK}{r2JaTU8@;N#> zGtMc&a*HRmy)w}M;OM*+b7zRQ|X5cram`jynIr4#1@ zVB)bw@O+EkM4BE>TWPoiwyz`oP(6vj8Wa!^EkynUM<9A+Zy5NM8dTHFn(Ar#GAe}@ z)O|Nxihj0m5%OohAj2>kz>HX8#bNL(6C|%l`Rmtz$qQc!Ow!|hnTIZRvQRdg9_d|uzfqK_@xamEU?KhRarl%7Hku0}oFy^e6jCSMh z^2Kjx^@xL`+G;}!MYL-3)8?%{iD}ACA?^nnVa8V6r|B^4oy>AVQHh&h` ze<8&)rU-XqU@clIs<38+X~M{PYM)0Bms)naa^kX+vokBPTF}u3=G6 zXmtx$luoz(J#xx!(90MK#FdhQdq8G_-l4B}%OEtbQE;37}-LJ5;cCU}~9V~-aVh0g;ZG{pL`GFhvlm6pj zU=ZXc2!m#3Kt$jVY1|hdfZsKu^Qy1Tis&kKpGrp6%WyV;X-nYmGT)y;l zSs%QSGgH8OXl#1=2}(f8&8aKy@4j$W!=KBRdDjS$b9Z39O;4>0A_Wk06$G5vr>K9u zP7UyJhS3X4GuCKlo{}2fb{Fr-9O!*(JqL3o`A^o5cz1=~DL690E0eNwB^5>|!vB89 zQAE>;o8kk)=i`-Zc)#|rQ3caC16PBR z=;zi$!bU=hY=J0fq7bm6{OEsoR(D*0wVLz3bw(@dUkPr!a*vCd>V=K2nNOB7llRBW z2mQRN_)K2l2D3the{>2x+YySZa1EjPaF}1Fy5kYosw!TkyH6BplrV;{MZew>MW{iVzHo%zEZKeSxR?hb=@arNdO z+~$1)d?N0B3d!^ElT+|)R`MoErYa%B>;Vn}W-PFqRB@9%tu~@6I7@6GGM!-;5@Trf z)YF)jrx**X%)n#5tm&e;GxlD4F3Xxt0A-g<;(Tw$LQx@%-aLD`wh2E3{^nY=j|iDC_9UgBn_P<7FNa2lB2jN?uMJSBuLKH8hj zJ7tq}H(h0vtH5zm)L~pP=(G5W`XEe0Rm0WFYbtzJoU^ZNR`VJ=|>- z=X6ZgbWh7?E8U_5=$NZ9BU?MXWc3+NWwe&&@68=sjvJ|t(CNYQ%|E&T3+BGDi6eI= zqZgNGBMdCrU(g)GbvBwfxujB5x;IFp?(+Oe4*Cw&BirEDWQOyl?(OTvD1ywvZK6em zsOyxr_THn;FR-9S^&W1U_Jcr3eZ+<-6IfYj;_W$;5c7xaFK^EnupkP{h0f!yo4?-L z2Jx|7|3&)vSBq@DiX)E5{lZKaruoB76L9ju+|`^J5}#MTZF8yOjASWt67sUQT#GP4 z7LGZ{c7O$UCFez7ZQG8ui)?d!mWtu++qZ8J0AeAAMYLYIr32yJ zHN>olx)4SeBiFVVIp`O{GHeD(?0Ue2cmawoejq@HspH(nJJwwl; zX`WYefBesrn%aQ`g0KkA-n2}w#^1hX6IqFWUJJK9mK74D7oKA)Rz#m_Eo9>c{zR4;hR_&Lg{S}$wLbt;o&YySOn+ty?v z7@B;rhj6swtFb=dqiY0EKm(455gt%r@cKw=%;*K;b@Uz`TE;*SHqsXK3K~+PV)e86 z2S^Z8>9=jR>V!PL2c#}t!wC&VwPbZGC-h48KNVxAwmek*!O^+1^BBPf(`-PPYkE$% z4Un4wbZm5#xNvVwk1WW&XmM^C5rjws_H+nP&*dI#dA+a(&4Tiocn1N9n`%JTl|7Nc zW89h{?iAuK7{8QQ`ec1=ZOtJKqh4zX9h;-t_;k;3yyckyy%?rHB%M01r)eM2r^7ODslp|d0z zWv@%yIee0(gb+8CM-*yJEPqCdRut31>OOl1yS#%0!mf#J*ykvbHKIGxAOL2ly{F$} zrI?l@P{$Zue$NlR;gAz@=^Q{Wtc;{r(A9ZEEsl+|(3N90=4X&6f`|ZBoi2?FqN*NQ z*VjcW?XXOPdAezY+Wf|QEfXI)Gwj6}&+7004Ila{j9Q$&2$PUg@_DOh5J#Iqs znmi9@uz9s5`DjA`93T4?BTI=-&?z@8#R@+hUarD3mV2z|CjUTGyZqxOefWlLVFc&M zwlV_(BW!4=n~`ET6@CdTH)IMD><{6tS9Tgx4C%|gzJC@iTWEU-^_m$j-y~g3G6EBj zJsHYcodA$$)DE8XUu({tkicd|Ejzg?pqV%`U-aZKVD$PD8qE@LpHTGpkHN#ebs};@ zRSC80Y0r&yMx+KpP@sr`El#t-RzMepdt_@wU5(hFV{Qy@1KE&LN#~tSU&pE-24tBY z-~@F4f|ns+ni>MMo>)$i0Vi9L0qsk;FB|+();H-n;DV|h!IL7WZmJqraJYstz)c{HQI3gCE#@D&ig;EauT=xID z0t27u99HW~_^hA;<)`KIfnN9tJ4_Snn4fEg*<`vHdae0O7cTFTJ&|_T;Ijw%8nU+T z#&gN5h8mAC7YdFgE-NmWh=LS^FagMddL#rKSvDVQ4&t~#D<`9x3g6y zK`8mIWR>}qQn-ZCzC(UEG~SgX>8k`CN6_!F`T6+|XWjb<14039q{_o#rMrCaq=I<#vNGMHifM1;As^R%66g1X%$&fZoMiNx#w&06~5Wy~m`;Jg<B>7i%on}z zAhpg$@4?V#qOq)I69Pd(x>?p7tM7gZrVRbWrw{7kvY}S4hgL(Y6uJS)ei4bpuWf(l z(P0RTE`S$1fD}|C@@xFmhdiebLIH^brOyqoUcI`px&?OoL^?V;Zl!v-4@S4mt8hgT zI7ZU%n>RYlG+p||rCLBpyFRu%V3S(o_gZ4HR?I+7nOa3eLT>0Y`2T>`IS+4qq~&UY zEagkOp5{BU%jvK(x9poO@(0;l!LN&*`Xu}PvX(TUAp$`Bk_scFC_O~NNUJm$QnvB% zC%gVxQzqXVDKpL=!H#ybEh%X~c}48NrIErBH(gNGZ_8WeYP@MUD=~B3Bxtw@y+Uav63-oT+Acd2`z@N|qPoI5 zT>^NmXp%$HTHl)Q%ESY<$_(&f2uGFV4%DJe^ru9jqnNk|K+qNhQ`>W=0X^?R8q%); zVl6E#MMR|CB-oSuK%yiFLa>{zhn~RWEIM6Kua$(=UFT&6y5>(A)d#<+WHB!IaDKt9 zU6ok0xmpCmG>ZoA|4qgdo@!9!OBWR#tpspOFdU`_P0t;;^Bsh!D~#ISzfX|rk!LrtW+y z`>B=*CbGej5ia#Fog9d|i(E-KX)E}4d(R5|7uoxQ>4XcFPT!V;yGdm2YUF74-|?>? z?!@du6~NNX)T6@E{hDEP)NnBfTk?%W%-z=&0VSDl1K;KriS-ph!vII z${doei}qD4g!{Nm#TretWcLXTx{*&DY!Yaq1>f6o+}HwTvMrI=TWHmMDd#rc?i~)! z`#gMn9T=;pQoT|sLDQ6hIKRIbNiJ?hk`QJn_!84)-@bHC5n?7!cnH11JmB&BUao|2 zMRT~TeIteu@F>LkN*L@bHVM`E2~g{Ni4sQe{sdP|pJgiitjfPe8W2wUU6QU-<9D0N zsIT_E0f*?C@xC{$QeNcOwyn3-zCuyDr;hX?w$JDy!o$skDgrn^Ek%}GUeS1AV!)D*k+_sW zI1C65?h-@eK19Q_bgfHFGLyiySb`=I0^;VKoScYBZ+TeBC$0kPka?)Y#;1kIISt^F zo_%YcjAOp7b#^%zBvL?S$)%JsL7kmDuu9Wiia}($t!PEzw%xhtw3sWNQZnX+it9uZ zH;4OtWJ$u&@i+gk$}$S`9D!E0oXL8gnKgb2$U2tBh{}KV)yo(HOY9yPI{v zsC2RV#X{6T6#sygl53Z62;ZtMAegGAI}@m^{$xh+n~mSh<^oXNugiDHh&?srvDEd z+~L(xMl(-S8vW;1>%Rj)kL;-qdcfZG(;z4!IdxhhpVloev2{v^`5cX{dF{`QTMhbA&>uwSQVlO~l1*k%-n?AxcVf zpn~^`s(Z7QPo0f?LhU*g;HE8)&S|_ssqwPWOf_H9 z@s|Ls&h6VnP%4m%{Pq2{KQokGo>7Exk$voC9emR2KcSKuzw+J!d7q&Bt@`~5k6Z%EhbtB z$$H;*TKl&_MR{{)rz@3k$Y{UJqS3rbe05s;DN%pRSE%|#jtjRo-RC9uQTm;&_9`6oMOGoWivOnfvzBU$>>pqZ9rE{su$^iN zAMUBEt7q4T6%HC9?|W~2tb4V8cqn5?^ST1Jw%HbRmb&o*_0G%j(?#;h1A4tK1r?P7 z=gycT_nvc@##G*XY1cojsAW~l2^6 zo!NwzE0UwWcsvI~2T%E_gh=1uID$-tTXkJn=MZSy)S5_wl_B` zkORl?1?yW|lL_~=CFDv3;qc#8CUQWZh#}8#Qy4amO-J1GHhdYZ9&@HRwwwJHBx66 zbWsbquUNqHiJE^?C9A&k07k7hU>vht3aYk#T)6BARy-7`~`a#Owz-eOS zoXr*0iu_6tOHWKqMTl3tO0-=uMlBOS*NiKq1P=qP++!ou-2t*f1z8_G4+ixw+Gn1S1hTtUnvsz`PUjzYaC6!_( zysZkFvBv13(%u@pEK_BBSJ#r6_2IRpPd#`;}!Wm4I}p z>tV8r!OQt$0H8JecNXARCS5|TRUC~FQ9b$4zwpzALo)93G64KTpS!h-DXx`rz=A#K zr6_1l*7Hv&s^iu|v8VEH_gm`W*iOv{?_%WBQ2J?u5P(G7K_xi=$wAAP7Ix5KBVSts z?soc5N=ydHJj(y)S{Fym9qC~^*}89pEc>iH5;rT{d-;4*-v6SUYCMKQ%+Jq%W#vTS zzkuGe$DWRn!Z%NYCEg8&g@^k%J2`13V-B+p2Z~O8iJNg&`!RL?Mm8)S!$EV?mi}IR zmu1+;Sf{^!jeC9P=VIph?+sT$6Wkm##8_|?fQysCfBQ{bQkgdu+EEsjrn4+;Jp!dv zw^6dYX>C$FWCpaVMh7TL#!rZ$LVP&(Lq8+o_IGbqH(t=)o&p7M^O~;9^C-`3kh0?|2QxrOkYh!7i3$TNZ8Mg%)w(1bE8yJ?dFsrrW zQ#0WGRZ_n2Z{T#0Oo3?pAl=}zI1c#744XkGTqJGn8X!)sBD-GL=ADKA)eI_o7NneS zwa)*WCnWv?&?4?SEZf1d;E9NGq5o;a@no$2P194&f+JbL+VX3|HMLxAP5!J?kD;Tx zVy=VNKfdMzazNP4YzYKZ4AO z1P=d83>Xk~y*k9wVSs+9^s9}PS;~;db;^QE&xLg%9{kTY1_+X8PYUxC(dA`m(0E@` zIqExL5)lb9;aytbXcxHhRbF=&PTSMr&em`*MzxF`IHQ63MJ zjRzU_yd>AX;aq8hi)P~g2AOa0`^rf^@dK2C%k$+CTJbM+AMwe6M>ER&mXY4@{!XA% z56z9xoW;B`z@BE}f6;-mYP2eNLDl*)5{#|aPip+!fn8crZN^quBxko7ShiPWoh2@_ zErBbesi{d&3iwpSuz(V@`RfHu1T)>N$&CQg~s!yTfeJ>t(BSBFeiq*;{j2fsF zGWpQL{;EBAH}i+AFxo)~lQWhhE+h5PZxu&)$T89;nz7@av+mgsa|MvdKqF=4TRxVlGu`D%yHQ|u8!b{KH=$J z0=OU!YbxgMP0JrI*YVjxTb`=&b%$ZK__`HEC#oyiKEdu&FF2x>G4qF|4q$6^Hs+o* zstQet$JM@i6`c#Mc!VP*9@IRrath;^DtrI|8UP2#f-1sExY|X_Z@emRX=^*zAESx@ zi*LIug$^WMInYHA5j-RuidAR=KmHpZpR~gp6e|a+kNAkhn*pEb&fN9U0R=~9zz%Td r5zdWzHyyf|N6n(Luy2!a{r6eN#4WVVmvBz-3>IK~#T-r4^GNtVQ%32y literal 0 HcmV?d00001 diff --git a/client/res/icon_okay.png b/client/res/icon_okay.png new file mode 100644 index 0000000000000000000000000000000000000000..c1f16b37f8915692ef201fc390fe93fcd8d17d31 GIT binary patch literal 10045 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