From 7ad5bb3124281caf11def56711dce7c3db5b8e5f Mon Sep 17 00:00:00 2001 From: subsub Date: Fri, 27 Sep 2024 17:29:29 +0900 Subject: [PATCH] =?UTF-8?q?2024/09/27=20=EA=B4=80=EB=A6=AC=EC=9E=90?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=A0=88=EC=9D=B4=EC=95=84?= =?UTF-8?q?=EC=9B=83=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adm/images/layout/icon_ip.png | Bin 0 -> 3112 bytes .../adm/images/layout/icon_time.png | Bin 0 -> 3185 bytes .../adm/images/layout/icon_timeout.png | Bin 0 -> 3163 bytes .../adm/images/layout/icon_user.png | Bin 0 -> 3085 bytes .../images/layout/icon_userinfo_select.png | Bin 0 -> 2961 bytes .../adm/images/layout/logo.png | Bin 0 -> 5883 bytes .../adm/images/layout/menu_dashboard.png | Bin 0 -> 569 bytes .../adm/images/layout/menu_error.png | Bin 0 -> 957 bytes .../adm/images/layout/menu_file.png | Bin 0 -> 633 bytes .../adm/images/layout/menu_function.png | Bin 0 -> 1051 bytes .../adm/images/layout/menu_site.png | Bin 0 -> 576 bytes .../adm/images/layout/menu_skin.png | Bin 0 -> 738 bytes .../adm/images/layout/menu_statistics.png | Bin 0 -> 379 bytes .../webapp/kofair_case_seed/adm/index.html | 38 + .../kofair_case_seed/adm/layout/leftmenu.html | 157 + .../adm/layout/user_info.html | 26 + .../kofair_case_seed/adm/scripts/common.js | 18 + .../kofair_case_seed/adm/scripts/layout.js | 20 + .../kofair_case_seed/adm/style/common.css | 230 + .../kofair_case_seed/adm/style/layout.css | 55 + .../kofair_case_seed/adm/style/style.css | 1 + .../webapp/kofair_case_seed/css/reset.css | 14 +- .../datapicker/css-shim-3dfae0d3.system.js | 1 + .../plugin/datapicker/css-shim-934c915f.js | 1 + .../script/plugin/datapicker/default.css | 528 ++ .../plugin/datapicker/dom-9370655f.system.js | 21 + .../script/plugin/datapicker/dom-fb6a473e.js | 696 ++ .../datapicker/duet-date-picker.entry.js | 666 ++ .../duet-date-picker.system.entry.js | 1037 +++ .../script/plugin/datapicker/duet.esm.js | 64 + .../script/plugin/datapicker/duet.js | 6862 +++++++++++++++++ .../script/plugin/datapicker/duet.system.js | 1 + .../datapicker/index-7f002a21.system.js | 1410 ++++ .../plugin/datapicker/index-a3afd6e1.js | 486 ++ .../script/plugin/datapicker/index.esm.js | 0 .../script/plugin/datapicker/index.system.js | 1 + .../script/plugin/datapicker/test.html | 69 + .../date-picker-master/.eslintignore | 7 + .../.github/ISSUE_TEMPLATE/bug_report.md | 38 + .../.github/ISSUE_TEMPLATE/feature_request.md | 20 + .../.github/workflows/test.yml | 26 + .../date-picker-master/.gitignore | 33 + .../date-picker-master/.npmrc | 1 + .../date-picker-master/.prettierignore | 11 + .../date-picker-master/.prettierrc | 14 + .../date-picker-master/.sasslintrc.json | 43 + .../date-picker-master/CODE_OF_CONDUCT.md | 46 + .../date-picker-master/LICENSE | 21 + .../date-picker-master/README.md | 728 ++ .../accessibility-audit.pdf | Bin 0 -> 185608 bytes .../date-picker-master/docs/index.html | 573 ++ .../date-picker-master/docs/themes/dark.css | 17 + .../docs/themes/default.css | 17 + .../date-picker-master/hydrate/package.json | 6 + .../date-picker-master/illustration.png | Bin 0 -> 47741 bytes .../date-picker-master/jest/jest-setup.js | 10 + .../date-picker-master/package.json | 128 + .../date-picker-master/prerender.config.ts | 12 + ...max-support-supports-a-max-date-1-snap.png | Bin 0 -> 24480 bytes ...max-support-supports-a-min-date-1-snap.png | Bin 0 -> 24404 bytes .../duet-date-picker/date-adapter.ts | 13 + .../duet-date-picker/date-localization.ts | 49 + .../duet-date-picker/date-picker-day.tsx | 65 + .../duet-date-picker/date-picker-input.tsx | 92 + .../duet-date-picker/date-picker-month.tsx | 92 + .../duet-date-picker/date-utils.spec.ts | 359 + .../components/duet-date-picker/date-utils.ts | 222 + .../duet-date-picker/duet-date-picker.e2e.ts | 878 +++ .../duet-date-picker/duet-date-picker.scss | 533 ++ .../duet-date-picker/duet-date-picker.tsx | 796 ++ .../src/components/duet-date-picker/readme.md | 74 + .../date-picker-master/src/index.html | 564 ++ .../date-picker-master/src/themes/dark.css | 17 + .../date-picker-master/src/themes/default.css | 17 + .../src/utils/test-utils.ts | 38 + .../date-picker-master/stencil.config.ts | 74 + .../date-picker-master/tsconfig.json | 18 + .../kofair_case_seed/usr/layout/_header.html | 774 +- .../usr/request/apl_05-2.html | 527 ++ .../kofair_case_seed/usr/request/apl_05.html | 347 +- .../kofair_case_seed/usr/scripts/common.js | 448 +- .../kofair_case_seed/usr/scripts/layout.js | 28 +- .../kofair_case_seed/usr/scripts/request.js | 88 +- .../kofair_case_seed/usr/style/common.css | 19 +- .../kofair_case_seed/usr/style/layout.css | 27 +- .../kofair_case_seed/usr/style/request.css | 30 + .../kofair_case_seed/usr/style/style.css | 34 +- 87 files changed, 19994 insertions(+), 382 deletions(-) create mode 100644 src/main/webapp/kofair_case_seed/adm/images/layout/icon_ip.png create mode 100644 src/main/webapp/kofair_case_seed/adm/images/layout/icon_time.png create mode 100644 src/main/webapp/kofair_case_seed/adm/images/layout/icon_timeout.png create mode 100644 src/main/webapp/kofair_case_seed/adm/images/layout/icon_user.png create mode 100644 src/main/webapp/kofair_case_seed/adm/images/layout/icon_userinfo_select.png create mode 100644 src/main/webapp/kofair_case_seed/adm/images/layout/logo.png create mode 100644 src/main/webapp/kofair_case_seed/adm/images/layout/menu_dashboard.png create mode 100644 src/main/webapp/kofair_case_seed/adm/images/layout/menu_error.png create mode 100644 src/main/webapp/kofair_case_seed/adm/images/layout/menu_file.png create mode 100644 src/main/webapp/kofair_case_seed/adm/images/layout/menu_function.png create mode 100644 src/main/webapp/kofair_case_seed/adm/images/layout/menu_site.png create mode 100644 src/main/webapp/kofair_case_seed/adm/images/layout/menu_skin.png create mode 100644 src/main/webapp/kofair_case_seed/adm/images/layout/menu_statistics.png create mode 100644 src/main/webapp/kofair_case_seed/adm/layout/leftmenu.html create mode 100644 src/main/webapp/kofair_case_seed/adm/layout/user_info.html create mode 100644 src/main/webapp/kofair_case_seed/adm/style/style.css create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/datapicker/css-shim-3dfae0d3.system.js create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/datapicker/css-shim-934c915f.js create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/datapicker/default.css create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/datapicker/dom-9370655f.system.js create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/datapicker/dom-fb6a473e.js create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/datapicker/duet-date-picker.entry.js create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/datapicker/duet-date-picker.system.entry.js create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/datapicker/duet.esm.js create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/datapicker/duet.js create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/datapicker/duet.system.js create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/datapicker/index-7f002a21.system.js create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/datapicker/index-a3afd6e1.js create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/datapicker/index.esm.js create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/datapicker/index.system.js create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/datapicker/test.html create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.eslintignore create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.github/ISSUE_TEMPLATE/bug_report.md create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.github/workflows/test.yml create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.gitignore create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.npmrc create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.prettierignore create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.prettierrc create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.sasslintrc.json create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/CODE_OF_CONDUCT.md create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/LICENSE create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/README.md create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/accessibility-audit.pdf create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/docs/index.html create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/docs/themes/dark.css create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/docs/themes/default.css create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/hydrate/package.json create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/illustration.png create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/jest/jest-setup.js create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/package.json create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/prerender.config.ts create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/__image_snapshots__/duet-date-picker-e-2-e-ts-duet-date-picker-min-max-support-supports-a-max-date-1-snap.png create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/__image_snapshots__/duet-date-picker-e-2-e-ts-duet-date-picker-min-max-support-supports-a-min-date-1-snap.png create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-adapter.ts create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-localization.ts create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-picker-day.tsx create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-picker-input.tsx create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-picker-month.tsx create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-utils.spec.ts create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-utils.ts create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/duet-date-picker.e2e.ts create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/duet-date-picker.scss create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/duet-date-picker.tsx create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/readme.md create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/index.html create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/themes/dark.css create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/themes/default.css create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/utils/test-utils.ts create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/stencil.config.ts create mode 100644 src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/tsconfig.json create mode 100644 src/main/webapp/kofair_case_seed/usr/request/apl_05-2.html diff --git a/src/main/webapp/kofair_case_seed/adm/images/layout/icon_ip.png b/src/main/webapp/kofair_case_seed/adm/images/layout/icon_ip.png new file mode 100644 index 0000000000000000000000000000000000000000..e0413281a5e9bbe69538c235657192dfb4621f1f GIT binary patch literal 3112 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 B{Hp)} literal 0 HcmV?d00001 diff --git a/src/main/webapp/kofair_case_seed/adm/images/layout/icon_user.png b/src/main/webapp/kofair_case_seed/adm/images/layout/icon_user.png new file mode 100644 index 0000000000000000000000000000000000000000..cd485bc289f17face71596652efaf2dc7ad1d26b GIT binary patch literal 3085 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 bpHTh;Fi1iqPFoAq00000NkvXXu0mjfX@%Rn literal 0 HcmV?d00001 diff --git a/src/main/webapp/kofair_case_seed/adm/images/layout/icon_userinfo_select.png b/src/main/webapp/kofair_case_seed/adm/images/layout/icon_userinfo_select.png new file mode 100644 index 0000000000000000000000000000000000000000..cb5ccf20847e708f086b4f24ea665757f4578b20 GIT binary patch literal 2961 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/kofair_case_seed/adm/images/layout/menu_error.png b/src/main/webapp/kofair_case_seed/adm/images/layout/menu_error.png new file mode 100644 index 0000000000000000000000000000000000000000..8a7e5ad07d8f4e593c507b0fc010e113240b91ad GIT binary patch literal 957 zcmV;u148_XP)9*iA2g@$xmD+Wed_i-)pa{m##tAP8sL0t0CUv<=BfeARRfr-u?M`c%E1xQvroMQ zcpTUO%tXY|m16ZZa5kWNIdD5Lv*e42-+^Pm18VPy+lK~`!4~jCMEs~usJqk&;6va_;FggA zs_TK| zS?YrnAM(Y1j<0k-2y6mAP4%~~<|*!c`chTEkAO$XTR+dHIDM(=B_6uQ{x?Yjn5zab zR}EmU8o*pNfVpY_bJYOmssYSZ1DLA@FjtiTBckUExB@s1ECTyiI(DV~mJX?Xzs?iq zpn6PwL_MQ!8^pK+0aQ1tr_|l4{i^!rI03$(&Xn3))YEEf=m2z4{4Zns!YZY}wyQU+Tk-xKO@>ScAt%>jH}eWlH}H34ob`PQgksm}}z zP`xY7y{&D7u1kQM+WZe$tdpCE1$aa~+&N*EFKNfzR%g_gRvl1nS*&~4c7d2sAGX+z zZSUJ*sRXVj;8FGY9@#sTF7crr{mUhARRGo9X)bN-0kB7%Q}^`fUoL^G1^9{jY`4Mt zl|>1h?RU(oPx%)q{u?u!!8irHO!xh~4prSJIgo-^J+G`YDNbK%_DOQp0OqOz%vA%J fs|GMvV-NTroYQQ;CD0`Z00000NkvXXu0mjfVI#C~ literal 0 HcmV?d00001 diff --git a/src/main/webapp/kofair_case_seed/adm/images/layout/menu_file.png b/src/main/webapp/kofair_case_seed/adm/images/layout/menu_file.png new file mode 100644 index 0000000000000000000000000000000000000000..a20d2aa837630ceb393aecd3352f3270c9ed29ec GIT binary patch literal 633 zcmeAS@N?(olHy`uVBq!ia0vp^8bBPt!3HF=`^^smDb50q$YKTtZeb8+WSBKaf`Nfa z+tbA{B%|@|OvCIDM-jL4>Reh;H(ffD61`@dWUjds@k96zbC}SEO`A6h9l3Ps*s;3q zkYyVTdO5bSsYqXO>SjHuJ?%r}9>FGy*XQm$-_>Hd;p(00=O5n9u6)yzv-!-NU-y~n z7jwF0HU-W~n4%`Jl+(>Jc9sI?ZSe;7hG#y;A6zc=U&^oF_+aCn&Lzt~v)sP7YVPYN zTYr@2#Iu)+%%tmhcD4=`?+8_ki)c$Y1#alHfk9-WzM(q>08$1&gbEGTw+lh$?9&oX=I zlgi24L==l+o!_tNyIPz zSmBLbh-hWpN$GjqQ4>&!6oOcI@pt~X8KWk>{LkqE{j5sXD57>kZ4SPL;Wv!;4U z{lJ&ZHTWqoYG(hwz`i{MTVNS54IFd%3)eLz7=qv-mSmD@1-Tbk2Rt;h88e#!9s=t; zFSn~nYCZ%lU?JUYW=PrrYyj>6{{Y*7KY(jyHsxg20)xOR;0mx57yxdY*@YmVfyb>? zzzA?2cn^3NxL{@z&5R{|0PFzn0zU)0fm7a~wh%l3{Ap(AOGMrRHUq0&^$T#z%w|h= zyMcFrZ>l;BorC`YbsxgqX%Da;*aZCQX%n#D^K!ejK;7%84oM-&Bn?VBB58@2ACfdu zS~xY=4Y|C;%M5xQm3;>FpqUAnbaBSN?*n6I)+pFDfHBW2+D>{MmC^A#Nf1GgV|5qv z`Sla9r98yI7SAi%)V% zTis%^c{G(P%xp%|Y37HSA1H+xGnpaF~Wu;K@T?Z65%JLS3& zvblEA%%)ve1D=?fLVN~?88cHU=1l|RK%b-@Uo?Hdcuvmk8lf=|Uf+4}Z=e@A1Y?m1#v&1nMIsoBL@*Yi7nn^Gum)%V z^3(v4kk=q>iGNZvh18?~^N}84Qsid=#ewVbTMdSCl z%~>xq>vdH28G1K!1Gr;mpO=XA0-pgNy6Q4;vUt1Yb|=X03Aa{t7&<2&1H1C~4|m!J zTqk>l`rgw4;JWAKc0<4}ucJBwhqz19VP#n9<&R3bsrj!;J+3?I@=7mr*z0J|9CT*` z?yTG82}%2!G<=_=3IE;gWd=e!Wnt|k%Hr5g7yJGD9dNKb#K1w%E86Z9UrJ)WfgbsR_B#JcUX{gM$%Y8H|DyghlREh ze8Er-OS&iNZBO@#JsLBuUe`m;B(R*hKk__b?qxm-=^-Z;iC`=e!B`}Mu}B1C@eD`k VgUR9*1S$Xk002ovPDHLkV1gty+j;;1 literal 0 HcmV?d00001 diff --git a/src/main/webapp/kofair_case_seed/adm/images/layout/menu_site.png b/src/main/webapp/kofair_case_seed/adm/images/layout/menu_site.png new file mode 100644 index 0000000000000000000000000000000000000000..44550a1d256b510e363f8400fc2c039f4163ea39 GIT binary patch literal 576 zcmeAS@N?(olHy`uVBq!ia0vp^8bBPt!3HF=`^^smDb50q$YKTtZeb8+WSBKaf`NhY zlc$SgNJit^TejJvjv@^YpZ^l%R$Q_nK!-{5jmt!ZjD=289~X+PR zqq8L-K#)~CFtDj(X;bUO6rHlB>30@bR~y7V*<-LFeTMO8qc`t17+Y&Cosm}dC%e&p zVpCv{fftvX=RplkiPZ4q-=8CnWIU)~Jzuar-)Z#&rMQR5$@kdUv*qi33tF~UT%57} zV4zH%=Zs&~2CR#hBuo+Mx%5k}#qy23#l4tppa!mUSB$1iopx;TvG$VeZnZ zh~4fTz&7pcE%*E=`#aYQxc#Fh9kb~3-gS0a-ISmxFU_So=FfVjKfUGte$M}Qa(BwW zAu+S+pknla&%286E1ub|wq>14e~I-ELAl2%_m8b@sxCb9B*?V+_Kv8>**h{m*`)BE z|G4&hM`LRC9-XN{_j-=zXT|P#zi{`T%{!Xzn(kZhJMmFn@AMM;xH~I9^53~Icdm(H t$OjQQlV@{|9lqB1X^sjk=pnA2f2AYz<&mX1KENcw;OXk;vd$@?2>_982cZA} literal 0 HcmV?d00001 diff --git a/src/main/webapp/kofair_case_seed/adm/images/layout/menu_skin.png b/src/main/webapp/kofair_case_seed/adm/images/layout/menu_skin.png new file mode 100644 index 0000000000000000000000000000000000000000..485c798aec09fed3b6d0bb7ba2e573224f0180c4 GIT binary patch literal 738 zcmeAS@N?(olHy`uVBq!ia0vp^8bBPt!3HF=`^^smDb50q$YKTtZeb8+WSBKaf`Nf) zil>WXNJit^S&rGljv~kF*L!Xe+oB-q65aj4RbQ@ZMabKOli4+!)PFPDa4(vFIRAm~ z(Zv;4n^%PItrJiR{_%wG3^CYY9e;@|K92} ztwCx6qkW@61$#xHO5oles|QLSY&OI)i2Z%ebAxRktKDo@;i;lCIz5c@1FqiQSyB36 zQ^y|enoWy37u{)IwTolU(b!APk9)Sy?lAS(bwKX}kHGzRRl7T9EZ(84WY17@yHl{l zO8r&gB$lX^dk$<8E_Dul&sO+qRTck@kGZlt7Owiaa#^5B;LWW+gqq{?cyAokEj)do z@0^~*a{yr%x(clNx6o>x7?8kTjuVf?Y}bAq#yvs$bY-Yy-L!i6<>gfmci52&t;uc GLK6UfpG>j< literal 0 HcmV?d00001 diff --git a/src/main/webapp/kofair_case_seed/adm/images/layout/menu_statistics.png b/src/main/webapp/kofair_case_seed/adm/images/layout/menu_statistics.png new file mode 100644 index 0000000000000000000000000000000000000000..712f1020d026fb1ebd8a1211cdc260a13d5daae1 GIT binary patch literal 379 zcmeAS@N?(olHy`uVBq!ia0vp^8bBPt!3HF=`^^smDb50q$YKTtZeb8+WSBKaf`Nfi z*VDx@B%|@|Oj|A{LxI+K7crfq+?6^TC#*dZU8y3?y|L4`OE+fH8R^o3`|O7V3clU8 z@c*X%bdKQ6tLs^_JSMm{=?JAvROn`jyw%naunm-glwbAiA@>@ts7$O%GWQO_x-5kfo)gJ8BQ)< zxjmsOI9Ml(&Atg@myWT8c-v0NC5Mtlb0)63>ig#@Pn{^|rWWxn`_v`pURxc(;?Gbv z`PQy`E?$~kn;cl literal 0 HcmV?d00001 diff --git a/src/main/webapp/kofair_case_seed/adm/index.html b/src/main/webapp/kofair_case_seed/adm/index.html index e69de29b..a2f4d8bd 100644 --- a/src/main/webapp/kofair_case_seed/adm/index.html +++ b/src/main/webapp/kofair_case_seed/adm/index.html @@ -0,0 +1,38 @@ + + + + + + + 관리자페이지 + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + +
+ +
+ + + \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/adm/layout/leftmenu.html b/src/main/webapp/kofair_case_seed/adm/layout/leftmenu.html new file mode 100644 index 00000000..8a541873 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/adm/layout/leftmenu.html @@ -0,0 +1,157 @@ + +
+

FAIR 한국공정거래조정원 분쟁조정사건처리시스템

+ +
+ \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/adm/layout/user_info.html b/src/main/webapp/kofair_case_seed/adm/layout/user_info.html new file mode 100644 index 00000000..5f1e2ce9 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/adm/layout/user_info.html @@ -0,0 +1,26 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/adm/scripts/common.js b/src/main/webapp/kofair_case_seed/adm/scripts/common.js index e69de29b..f6db74fa 100644 --- a/src/main/webapp/kofair_case_seed/adm/scripts/common.js +++ b/src/main/webapp/kofair_case_seed/adm/scripts/common.js @@ -0,0 +1,18 @@ + // header, footer 공통 영역 불러오기 + window.addEventListener('load', function () { + var allElements = document.getElementsByTagName('*'); + Array.prototype.forEach.call(allElements, function (el) { + var includePath = el.dataset.includePath; + if (includePath) { + var xhttp = new XMLHttpRequest(); + xhttp.onreadystatechange = function () { + if (this.readyState == 4 && this.status == 200) { + el.outerHTML = this.responseText; + leftMenu(); + } + }; + xhttp.open('GET', includePath, true); + xhttp.send(); + } + }); + }); \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/adm/scripts/layout.js b/src/main/webapp/kofair_case_seed/adm/scripts/layout.js index e69de29b..158c62cd 100644 --- a/src/main/webapp/kofair_case_seed/adm/scripts/layout.js +++ b/src/main/webapp/kofair_case_seed/adm/scripts/layout.js @@ -0,0 +1,20 @@ +function leftMenu() { + + // 첫 화면에 하위메뉴 닫기 + $('.depth01_li').removeClass('active'); + $('.depth02_ul').slideUp(0); + + + $('.menu_title').click(function () { + + // 대시보드 메뉴는 하위메뉴가 없을 수도 있으니 클릭 이벤트 막음 + if ($(this).closest(".depth01_li").index() !== 0) { + $(this).closest('.depth01_li').toggleClass('active'); + $(this).next('.depth02_ul').toggleClass('active'); + $(this).next('.depth02_ul').slideToggle(400); + $(this).closest('.depth01_li').siblings('.depth01_li').removeClass('active'); + $(this).closest('.depth01_li').siblings('.depth01_li').find('.depth02_ul').slideUp(400); + } + + }); +} \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/adm/style/common.css b/src/main/webapp/kofair_case_seed/adm/style/common.css index e69de29b..b23bcbe4 100644 --- a/src/main/webapp/kofair_case_seed/adm/style/common.css +++ b/src/main/webapp/kofair_case_seed/adm/style/common.css @@ -0,0 +1,230 @@ +@charset "utf-8"; + + +/* 버튼 */ +.btn_wrap{display:flex;margin:40px 0 0 0;justify-content:space-between;align-items:center;gap:10px;} +.btn_wrap.right{justify-content:flex-end;} +.btn_wrap.left{justify-content:flex-start;} +.btn_wrap.center{justify-content:center;} + +.btn{display:inline-block;color:#333;border-radius:4px;transition:all 0.2s ease-in-out;} +.btn.round{border-radius:100%;} +.btn.only_icon{padding:0;} + +.btn:hover{box-shadow:0 0 5px rgba(0,0,0,0.3);transition:all 0.2s ease-in-out;} + +.btn.orange_border{border:1px solid #fd6e18;color:#fd6e18;} +.btn.light_orange_fill{background:#fdeade;color:#fd6e18;} + +.btn.gray_fill{background:#adadb5;color:#fff;} + +/* 아이콘 */ +.icon{display:inline-block;} + + +/* 텍스트 */ +.fw_light{font-weight:300 !important;} +.fw_regular{font-weight:400 !important;} +.fw_medium{font-weight:500 !important;} +.fw_bold{font-weight:700 !important;} +.fw_extrabold{font-weight:800 !important;} + +.color_333{color:#333 !important;} +.color_666{color:#666 !important;} +.color_orange{color:#fa6718 !important;} + + +/* 노출/숨김 */ +.show{display:block !important;} +.hide{display:none !important;} + + + + + + +/* 간격 */ +.p0 {padding: 0px!important;} +.p5 {padding: 5px!important;} + +.pt5 {padding-top: 5px!important;} +.pt10 {padding-top: 10px!important;} +.pt15 {padding-top: 15px!important;} +.pt20 {padding-top: 20px!important;} +.pt25 {padding-top: 25px!important;} +.pt30 {padding-top: 30px!important;} +.pt35 {padding-top: 35px!important;} +.pt40 {padding-top: 40px!important;} +.pt45 {padding-top: 45px!important;} +.pt50 {padding-top: 50px!important;} + +.pr0 {padding-right: 0px!important;} +.pr20 {padding-right: 20px!important;} + +.pb5 {padding-bottom: 5px!important;} +.pb10 {padding-bottom: 10px!important;} +.pb15 {padding-bottom: 15px!important;} +.pb20 {padding-bottom: 20px!important;} +.pb25 {padding-bottom: 25px!important;} +.pb30 {padding-bottom: 30px!important;} +.pb35 {padding-bottom: 35px!important;} +.pb40 {padding-bottom: 40px!important;} +.pb45 {padding-bottom: 45px!important;} +.pb50 {padding-bottom: 50px!important;} + +.pl0 {padding-left: 0px!important;} +.pl15 {padding-left: 15px!important;} +.pl20 {padding-left: 20px!important;} + +.m20 {margin: 20px!important;} + +.mt-1 {margin-top: -1px!important;} +.mt0 {margin-top: 0px!important;} +.mt5 {margin-top: 5px!important;} +.mt10 {margin-top: 10px!important;} +.mt15 {margin-top: 15px!important;} +.mt20 {margin-top: 20px!important;} +.mt25 {margin-top: 25px!important;} +.mt30 {margin-top: 30px!important;} +.mt35 {margin-top: 35px!important;} +.mt40 {margin-top: 40px!important;} +.mt45 {margin-top: 45px!important;} +.mt50 {margin-top: 50px!important;} +.mt60 {margin-top: 60px!important;} +.mt70 {margin-top: 70px!important;} +.mt80 {margin-top: 80px!important;} +.mt90 {margin-top: 90px!important;} +.mt100 {margin-top: 100px!important;} + +.mr0 {margin-right: 0px!important;} +.mr3 {margin-right: 3px!important;} +.mr5 {margin-right: 5px!important;} +.mr10 {margin-right: 10px!important;} +.mr15 {margin-right: 15px!important;} +.mr20 {margin-right: 20px!important;} +.mr25 {margin-right: 25px!important;} +.mr30 {margin-right: 30px!important;} +.mr35 {margin-right: 35px!important;} +.mr40 {margin-right: 40px!important;} +.mr45 {margin-right: 45px!important;} +.mr50 {margin-right: 50px!important;} +.mr60 {margin-right: 60px!important;} +.mr70 {margin-right: 70px!important;} +.mr80 {margin-right: 80px!important;} +.mr90 {margin-right: 90px!important;} +.mr100 {margin-right: 100px!important;} + +.mb-4 {margin-bottom: -4px!important;} +.mb0 {margin-bottom: 0px!important;} +.mb1 {margin-bottom: 1px!important;} +.mb5 {margin-bottom: 5px!important;} +.mb10 {margin-bottom: 10px!important;} +.mb15 {margin-bottom: 15px!important;} +.mb18 {margin-bottom: 18px!important;} +.mb20 {margin-bottom: 20px!important;} +.mb25 {margin-bottom: 25px!important;} +.mb30 {margin-bottom: 30px!important;} +.mb35 {margin-bottom: 35px!important;} +.mb40 {margin-bottom: 40px!important;} +.mb45 {margin-bottom: 45px!important;} +.mb50 {margin-bottom: 50px!important;} +.mb60 {margin-bottom: 60px!important;} +.mb70 {margin-bottom: 70px!important;} +.mb80 {margin-bottom: 80px!important;} +.mb90 {margin-bottom: 90px!important;} +.mb100 {margin-bottom: 100px!important;} + +.ml0 {margin-left: 0px!important;} +.ml5 {margin-left: 5px!important;} +.ml10 {margin-left: 10px!important;} +.ml15 {margin-left: 15px!important;} +.ml20 {margin-left: 20px!important;} +.ml25 {margin-left: 25px!important;} +.ml30 {margin-left: 30px!important;} +.ml35 {margin-left: 35px!important;} +.ml40 {margin-left: 40px!important;} +.ml45 {margin-left: 45px!important;} +.ml50 {margin-left: 50px!important;} +.ml60 {margin-left: 60px!important;} +.ml70 {margin-left: 70px!important;} +.ml80 {margin-left: 80px!important;} +.ml90 {margin-left: 90px!important;} +.ml100 {margin-left: 100px!important;} + +/* 너비, 높이 */ +.w100per {width: 100% !important;} +.w99per {width: 99%;} +.w95per {width: 95%;} +.w90per {width: 90%;} +.w85per {width: 85%;} +.w80per {width: 80%;} +.w75per {width: 75%;} +.w70per {width: 70%;} +.w65per {width: 65%;} +.w60per {width: 60%;} +.w50per {width: 50%;} +.w55per {width: 55%;} +.w45per {width: 45%;} +.w40per {width: 40%;} +.w35per {width: 35%;} +.w33per {width: 33.3333333%;} +.w30per {width: 30%;} +.w25per {width: 25%;} +.w20per {width: 20%;} +.w19per {width: 19%;} +.w18per {width: 18%;} +.w17per {width: 17%;} +.w16per {width: 16%;} +.w15per {width: 15%;} +.w14per {width: 14%;} +.w13per {width: 13%;} +.w12per {width: 12%;} +.w11per {width: 11%;} +.w10per {width: 10%;} +.w9per {width: 9%;} +.w8per {width: 8%;} +.w7per {width: 7%;} +.w6per {width: 6%;} +.w5per {width: 5%;} +.w4per {width: 4%;} +.w3per {width: 3%;} +.w2per {width: 2%;} +.w1per {width: 1%;} + +.w5 {width: 5px;} +.w10 {width: 10px;} +.w15 {width: 15px;} +.w20 {width: 20px;} +.w25 {width: 25px;} +.w30 {width: 30px;} +.w35 {width: 35px;} +.w40 {width: 40px;} +.w45 {width: 45px;} +.w50 {width: 50px;} +.w55 {width: 55px;} +.w60 {width: 60px;} +.w70 {width: 70px;} +.w80 {width: 80px;} +.w90 {width: 90px;} +.w100 {width: 100px;} +.w110 {width: 110px;} +.w120 {width: 120px;} +.w130 {width: 130px;} +.w140 {width: 140px;} +.w150 {width: 150px;} +.w160 {width: 160px;} +.w170 {width: 170px;} +.w180 {width: 180px;} +.w190 {width: 190px;} +.w200 {width: 200px;} +.w250 {width: 250px;} +.w300 {width: 300px;} +.w325 {width: 325px;} +.w350 {width: 350px;} +.w400 {width: 400px;} +.w500 {width: 500px;} + +.mw100 {min-width: 100px;} + +.h100 {height: 100px;} +.h100per {height: 100%;} diff --git a/src/main/webapp/kofair_case_seed/adm/style/layout.css b/src/main/webapp/kofair_case_seed/adm/style/layout.css index e69de29b..8a708138 100644 --- a/src/main/webapp/kofair_case_seed/adm/style/layout.css +++ b/src/main/webapp/kofair_case_seed/adm/style/layout.css @@ -0,0 +1,55 @@ +@charset "utf-8"; + +.wrap{position:relative;display:flex;width:100%;min-width:1440px;} +.contents{width:calc(100% - 300px);padding:0 30px 0 70px;} + +/* leftmenu */ +.leftmenu{width:300px;height:100vh;box-shadow:3px 0 7px rgba(0,0,0,0.2);background:#171c70;border-radius:0 30px 30px 0;} +.leftmenu .logo{display:flex;height:110px;border-bottom:1px solid #5d619b;justify-content:center;align-items:center;} +.leftmenu .menu{padding:0 20px;} +.leftmenu .menu_ul{display:flex;flex-direction:column;color:#888bbc;} +.leftmenu .depth01_li{border-bottom:1px solid #2f337f;} +.leftmenu .depth01_li.active{border:0;} +.leftmenu .menu_title{position:relative;display:flex;width:100%;height:54px;font-size:18px;font-weight:500;text-align:left;color:#888bbc;letter-spacing:-0.4px;align-items:center;} +.leftmenu .menu_title::after{position:absolute;content:"";width:10px;height:10px;border-top:2px solid #888bbc;border-right:2px solid #888bbc;transform:rotate(-45deg);right:20px;top:23px;} +.leftmenu .active .menu_title{color:#fff;} +.leftmenu .active .menu_title::after{border-top:2px solid #fff;border-right:2px solid #fff;transform:rotate(135deg);top:20px;} + +.leftmenu .menu_icon{display:inline-flex;width:40px;height:40px;justify-content:center;align-items:center;background-position:top center;} +.leftmenu .active .menu_icon{background-position:center bottom;} +.leftmenu .menu_icon.dashboard{background-image:url(/kofair_case_seed/adm/images/layout/menu_dashboard.png);} +.leftmenu .menu_icon.site{background-image:url(/kofair_case_seed/adm/images/layout/menu_site.png);} +.leftmenu .menu_icon.function{background-image:url(/kofair_case_seed/adm/images/layout/menu_function.png);} +.leftmenu .menu_icon.file{background-image:url(/kofair_case_seed/adm/images/layout/menu_file.png);} +.leftmenu .menu_icon.skin{background-image:url(/kofair_case_seed/adm/images/layout/menu_skin.png);} +.leftmenu .menu_icon.statistics{background-image:url(/kofair_case_seed/adm/images/layout/menu_statistics.png);} +.leftmenu .menu_icon.error{background-image:url(/kofair_case_seed/adm/images/layout/menu_error.png);} + +.leftmenu .depth02_ul{display:flex;width:calc(100% - 40px);font-size:16px;font-weight:400;color:#666;margin:0 auto;padding:25px 20px;background:#fff;;border-radius:5px;box-sizing:border-box;flex-direction:column;gap:15px;} +.leftmenu .depth02_li a{position:relative;padding:0 0 0 10px;} +.leftmenu .depth02_li a::after{position:absolute;content:"·";width:4px;height:4px;left:0;color:#666;} +.leftmenu .depth02_li.active a,.leftmenu .depth02_li:hover a{font-weight:bold;color:#fa6718;} +.leftmenu .depth02_li.active a::after,.leftmenu .depth02_li:hover a::after{color:#fa6718;} + + +/* f4f5f6 */ + +.user_info{display:flex;height:110px;justify-content:space-between;align-items:center;} +.user_info .user_util_ul,.user_info .user_util_ul li{display:inline-flex;font-size:14px;font-weight:400;color:#444;align-items:center;} +.user_info .user_util_ul{gap:25px;} +.user_info .user_util_ul .icon{width:20px;height:20px;background-repeat:no-repeat;background-position:center;margin:2px 6px 0 0;} +.user_info .user_util_ul .time{background-image:url(/kofair_case_seed/adm/images/layout/icon_time.png);} +.user_info .user_util_ul .ip{background-image:url(/kofair_case_seed/adm/images/layout/icon_ip.png);} +.user_info .user_util_ul .timeout{background-image:url(/kofair_case_seed/adm/images/layout/icon_timeout.png);} +.user_info .user_util_ul span{margin:0 0 0 4px;} +.user_info .user_util_ul .btn_extension{width:43px;height:28px;margin:0 0 0 10px;} + +.user_info .area_right{display:flex;gap:10px;} +.user_info_ul{display:flex;height:38px;padding:0 20px 0 0;border-radius:35px; background:#f4f5f6;align-items:center;} +.user_info_ul li{position:relative;display:inline-flex;align-items:center;line-height:1.8;} +.user_info_ul li:first-child{margin:0 20px 0 0;} +.user_info_ul li:first-child:after{position:absolute;content:"";width:1px;height:15px;background:#d5d5d5;right:0;} +.user_info_ul li .icon.user{width:20px;height:20px;margin:0 4px 0 0;background:url(/kofair_case_seed/adm/images/layout/icon_user.png) no-repeat center center;} + +.user_info_ul select{width:145px;padding:0 0 0 20px;font-size:16px;border:0;background:transparent url(/kofair_case_seed/adm/images/layout/icon_userinfo_select.png) no-repeat calc(100% - 20px) center;} +.user_info .btn_logout{width:94px;height:38px;font-size:16px;border-radius:40px;background:#adadb5;} \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/adm/style/style.css b/src/main/webapp/kofair_case_seed/adm/style/style.css new file mode 100644 index 00000000..55cfd4ea --- /dev/null +++ b/src/main/webapp/kofair_case_seed/adm/style/style.css @@ -0,0 +1 @@ +@charset "utf-8"; \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/css/reset.css b/src/main/webapp/kofair_case_seed/css/reset.css index 20fb6956..569a67db 100644 --- a/src/main/webapp/kofair_case_seed/css/reset.css +++ b/src/main/webapp/kofair_case_seed/css/reset.css @@ -1,10 +1,10 @@ /* reset 파일 정리 */ -html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video {margin: 0;padding: 0;border: 0;font-size: 100%;font: inherit;vertical-align: baseline;color: inherit;font-weight: inherit;font-family: 'Noto Sans KR', sans-serif;} +html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video {margin: 0;padding: 0;border: 0;font-size: 100%;font: inherit;vertical-align: baseline;color: inherit;font-weight: inherit;font-family: 'Noto Sans KR', sans-serif; word-break: keep-all;} article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section {display: block; font-family: 'Noto Sans KR', sans-serif; margin: 0; padding: 0; border: 0; font-size: 100%;} -body {min-height: 100vh;line-height: 1.3;-webkit-font-smoothing: antialiased;} +body {min-height: 100vh;line-height: 1.4;-webkit-font-smoothing: antialiased;letter-spacing:-0.5px;;} ol,ul,li {list-style: none;} -p, h1, h2, h3, h4, h5, h6 {margin: 0; padding: 0;letter-spacing: -0.5px;} +p, h1, h2, h3, h4, h5, h6 {margin: 0; padding: 0;letter-spacing: -0.35px;} h1, h2, h3, h4, h5, h6, button, input, label{line-height:1.1;} a {color: inherit; text-decoration: none; display: block;} /* a:focus:active:hover{outline: 0} */ @@ -21,6 +21,7 @@ button[disabled],html input[disabled] {cursor: default;} input[type="checkbox"],input[type="radio"] {box-sizing: border-box; padding: 0; *height: 13px; *width: 13px;} /* 아이폰 기본적으로 적용되어 있는 버튼 css 변경 */ input{-webkit-appearance: button;} +input::placeholder{font-size:15px;font-weight:300;font-family:'Noto Sans KR', sans-serif;} /* 사파리5, 크롬에서 기본적으로 적용되어 있는 css 변경 */ input[type="search"] {-webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box;} input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration {-webkit-appearance: none;} @@ -36,10 +37,9 @@ textarea{color: #666;font-size: 20px;font-weight: 300; font-family: 'Noto Sans K input::placeholder,input[type="text"]::placeholder,input[type="password"]::placeholder,input[type="text"]:-ms-input-placeholder,input[type="password"]:-ms-input-placeholder{color: #666 !important; font-size: 16px !important;} input[type="text"]:focus::placeholder,input[type="password"]:focus::placeholder{color: transparent;} -input:disabled,input[disabled="disabled"],input:read-only,input[readonly="readonly"]{background-color: #eee !important; color: #aaa !important; font-size: 16px;} -button:disabled,button[disabled="disabled"]{background-color: #eee !important; color: #aaa !important; border: none !important;} -select:disabled,select[disabled="disabled"]{background-color: #eee !important; color: #aaa !important; border: none !important;} - +input:disabled,input[disabled="disabled"],input:read-only,input[readonly="readonly"]{background-color: #f8f9fa !important; color: #aaa !important; border:1px solid #d8d8d8 !important; font-size: 16px;} +button:disabled,button[disabled="disabled"]{background-color: #f8f9fa !important; color: #aaa !important; border: 1px solid #d8d8d8 !important;} +select:disabled,select[disabled="disabled"],select.read-only,select[readonly="readonly"]{background-color: #f8f9fa !important; color: #aaa !important; border: 1px solid #d8d8d8 !important;pointer-events:none;} *,*::before,*::after {box-sizing: border-box;} :target{scroll-margin-block: 5ex;} diff --git a/src/main/webapp/kofair_case_seed/script/plugin/datapicker/css-shim-3dfae0d3.system.js b/src/main/webapp/kofair_case_seed/script/plugin/datapicker/css-shim-3dfae0d3.system.js new file mode 100644 index 00000000..cde9abd9 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/datapicker/css-shim-3dfae0d3.system.js @@ -0,0 +1 @@ +System.register([],(function(){"use strict";return{execute:function(){var t=function(){return(t=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0?i.join(",").trim():void 0}}function x(t,e,r){var n=E(t,r);if(!n)return e.push(t.substring(r,t.length)),t.length;var s=n.propName,o=null!=n.fallback?I(n.fallback):void 0;return e.push(t.substring(r,n.start),(function(t){return S(t,s,o)})),n.end}function M(t,e){for(var r="",n=0;n0&&t.parsedSelector.split(",").forEach((function(t){t=t.trim(),r.push({selector:t,declarations:n,specificity:A(),nu:e})})),e++})),r}function A(t){return 1}var L="!important",_=/(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gm;function O(t){for(var e,r=[];e=_.exec(t.trim());){var n=T(e[2]),s=n.value,o=n.important;r.push({prop:e[1].trim(),value:I(s),important:o})}return r}function T(t){var e=(t=t.replace(/\s+/gim," ").trim()).endsWith(L);return e&&(t=t.substr(0,t.length-L.length).trim()),{value:t,important:e}}function U(t,e,r){var n=[],s=N(e,t);return r.forEach((function(t){return n.push(t)})),s.forEach((function(t){return n.push(t)})),$(P(n).filter((function(e){return G(t,e.selector)})))}function N(t,e){for(var r=[];e;){var n=t.get(e);n&&r.push(n),e=e.parentElement}return r}function P(t){var e=[];return t.forEach((function(t){e.push.apply(e,t.selectors)})),e}function $(t){return t.sort((function(t,e){return t.specificity===e.specificity?t.nu-e.nu:t.specificity-e.specificity})),t}function G(t,e){return":root"===e||"html"===e||t.matches(e)}function H(t){var e=r(t),n=I(t);return{original:t,template:n,selectors:k(e),usesCssVars:n.length>1}}function V(t,e){if(t.some((function(t){return t.styleEl===e})))return!1;var r=H(e.textContent);return r.styleEl=e,t.push(r),!0}function Y(t){var e=R(P(t));t.forEach((function(t){t.usesCssVars&&(t.styleEl.textContent=M(t.template,e))}))}function j(e,r){var n=e.template.map((function(t){return"string"==typeof t?q(t,e.scopeId,r):t})),s=e.selectors.map((function(n){return t(t({},n),{selector:q(n.selector,e.scopeId,r)})}));return t(t({},e),{template:n,selectors:s,scopeId:r})}function q(t,e,r){return t=F(t,"\\."+e,"."+r)}function F(t,e,r){return t.replace(new RegExp(e,"g"),r)}function B(t,e){return K(t,e),D(t,e).then((function(){Y(e)}))}function W(t,e){"undefined"!=typeof MutationObserver&&new MutationObserver((function(){K(t,e)&&Y(e)})).observe(document.head,{childList:!0})}function D(t,e){for(var r=[],n=t.querySelectorAll('link[rel="stylesheet"][href]:not([data-no-shim])'),s=0;s-1||z.test(t)}var J=/url[\s]*\([\s]*['"]?(?!(?:https?|data)\:|\/)([^\'\"\)]*)[\s]*['"]?\)[\s]*/gim;function Q(t){return J.lastIndex=0,J.test(t)}function tt(t,e){var r=e.replace(/[^/]*$/,"");return t.replace(J,(function(t,e){var n=r+e;return t.replace(e,n)}))}var et=function(){function t(t,e){this.win=t,this.doc=e,this.count=0,this.hostStyleMap=new WeakMap,this.hostScopeMap=new WeakMap,this.globalScopes=[],this.scopesMap=new Map,this.didInit=!1}return t.prototype.i=function(){var t=this;return this.didInit||!this.win.requestAnimationFrame?Promise.resolve():(this.didInit=!0,new Promise((function(e){t.win.requestAnimationFrame((function(){W(t.doc,t.globalScopes),B(t.doc,t.globalScopes).then((function(){return e()}))}))})))},t.prototype.addLink=function(t){var e=this;return X(this.doc,this.globalScopes,t).then((function(){e.updateGlobal()}))},t.prototype.addGlobalStyle=function(t){V(this.globalScopes,t)&&this.updateGlobal()},t.prototype.createHostStyle=function(t,e,r,n){if(this.hostScopeMap.has(t))throw new Error("host style already created");var s=this.registerHostTemplate(r,e,n),o=this.doc.createElement("style");return o.setAttribute("data-no-shim",""),s.usesCssVars?n?(o["s-sc"]=e=s.scopeId+"-"+this.count,o.textContent="/*needs update*/",this.hostStyleMap.set(t,o),this.hostScopeMap.set(t,j(s,e)),this.count++):(s.styleEl=o,s.usesCssVars||(o.textContent=M(s.template,{})),this.globalScopes.push(s),this.updateGlobal(),this.hostScopeMap.set(t,s)):o.textContent=r,o},t.prototype.removeHost=function(t){var e=this.hostStyleMap.get(t);e&&e.remove(),this.hostStyleMap.delete(t),this.hostScopeMap.delete(t)},t.prototype.updateHost=function(t){var e=this.hostScopeMap.get(t);if(e&&e.usesCssVars&&e.isScoped){var r=this.hostStyleMap.get(t);if(r){var n=R(U(t,this.hostScopeMap,this.globalScopes));r.textContent=M(e.template,n)}}},t.prototype.updateGlobal=function(){Y(this.globalScopes)},t.prototype.registerHostTemplate=function(t,e,r){var n=this.scopesMap.get(e);return n||((n=H(t)).scopeId=e,n.isScoped=r,this.scopesMap.set(e,n)),n},t}();!function(t){!t||t.__cssshim||t.CSS&&t.CSS.supports&&t.CSS.supports("color","var(--c)")||(t.__cssshim=new et(t,t.document))}("undefined"!=typeof window&&window)}}})); \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/script/plugin/datapicker/css-shim-934c915f.js b/src/main/webapp/kofair_case_seed/script/plugin/datapicker/css-shim-934c915f.js new file mode 100644 index 00000000..5b0e05c9 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/datapicker/css-shim-934c915f.js @@ -0,0 +1 @@ +var n=function(){return(n=Object.assign||function(n){for(var t,r=1,i=arguments.length;r0?o.join(",").trim():void 0}}(n,r);if(!i)return t.push(n.substring(r,n.length)),n.length;var u=i.propName,e=null!=i.fallback?w(i.fallback):void 0;return t.push(n.substring(r,i.start),(function(n){return function(n,t,r){return n[t]?n[t]:r?y(r,n):""}(n,u,e)})),i.end}function y(n,t){for(var r="",i=0;i0&&n.parsedSelector.split(",").forEach((function(n){n=n.trim(),r.push({selector:n,declarations:i,specificity:1,nu:t})})),t++})),r}var k=/(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gm;function M(n){var t=(n=n.replace(/\s+/gim," ").trim()).endsWith("!important");return t&&(n=n.substr(0,n.length-10).trim()),{value:n,important:t}}function R(n){var t=[];return n.forEach((function(n){t.push.apply(t,n.selectors)})),t}function A(n){var t=r(n),i=w(n);return{original:n,template:i,selectors:E(t),usesCssVars:i.length>1}}function L(n,t){if(n.some((function(n){return n.styleEl===t})))return!1;var r=A(t.textContent);return r.styleEl=t,n.push(r),!0}function $(n){var t=b(R(n));n.forEach((function(n){n.usesCssVars&&(n.styleEl.textContent=y(n.template,t))}))}function O(n,t,r){return function(n,t,r){return n.replace(RegExp(t,"g"),r)}(n,"\\."+t,"."+r)}function P(n,t){return Array.from(n.querySelectorAll("style:not([data-styles]):not([data-no-shim])")).map((function(n){return L(t,n)})).some(Boolean)}function I(n,t,r){var i=r.href;return fetch(i).then((function(n){return n.text()})).then((function(u){if(function(n){return n.indexOf("var(")>-1||U.test(n)}(u)&&r.parentNode){(function(n){return _.lastIndex=0,_.test(n)})(u)&&(u=function(n,t){var r=t.replace(/[^/]*$/,"");return n.replace(_,(function(n,t){return n.replace(t,r+t)}))}(u,i));var e=n.createElement("style");e.setAttribute("data-styles",""),e.textContent=u,L(t,e),r.parentNode.insertBefore(e,r),r.remove()}})).catch((function(n){console.error(n)}))}var U=/[\s;{]--[-a-zA-Z0-9]+\s*:/m,_=/url[\s]*\([\s]*['"]?(?!(?:https?|data)\:|\/)([^\'\"\)]*)[\s]*['"]?\)[\s]*/gim,j=function(){function t(n,t){this.win=n,this.doc=t,this.count=0,this.hostStyleMap=new WeakMap,this.hostScopeMap=new WeakMap,this.globalScopes=[],this.scopesMap=new Map,this.didInit=!1}return t.prototype.i=function(){var n=this;return this.didInit||!this.win.requestAnimationFrame?Promise.resolve():(this.didInit=!0,new Promise((function(t){n.win.requestAnimationFrame((function(){(function(n,t){"undefined"!=typeof MutationObserver&&new MutationObserver((function(){P(n,t)&&$(t)})).observe(document.head,{childList:!0})})(n.doc,n.globalScopes),function(n,t){return P(n,t),function(n,t){for(var r=[],i=n.querySelectorAll('link[rel="stylesheet"][href]:not([data-no-shim])'),u=0;u0?t.setAttribute("class",e.join(" ")):t.removeAttribute("class")}return""===e[0]&&e.splice(0,1),e.toggle=function(t,o){void 0!==o?o?e.add(t):e.remove(t):-1!==e.indexOf(t)?e.splice(e.indexOf(t),1):e.push(t),n()},e.add=function(){for(var t=[].slice.call(arguments),o=0,i=t.length;o 0 ? t.setAttribute("class", n.join(" ")) : t.removeAttribute("class") + } + return "" === n[0] && n.splice(0, 1), n.toggle = function (t, e) { + void 0 !== e ? e ? n.add(t) : n.remove(t) : -1 !== n.indexOf(t) ? n.splice(n.indexOf(t), 1) : n.push(t), i() + }, n.add = function () { + for (var t = [].slice.call(arguments), e = 0, o = t.length; e < o; e++) - 1 === n.indexOf(t[e]) && n.push(t[e]); + i() + }, n.remove = function () { + for (var t = [].slice.call(arguments), e = 0, o = t.length; e < o; e++) - 1 !== n.indexOf(t[e]) && n.splice(n.indexOf(t[e]), 1); + i() + }, n.item = function (t) { + return n[t] + }, n.contains = function (t) { + return -1 !== n.indexOf(t) + }, n.replace = function (t, e) { + -1 !== n.indexOf(t) && n.splice(n.indexOf(t), 1, e), i() + }, n.value = t.getAttribute("class") || "", n + } + }) + }(Element.prototype), + /*! + DOMTokenList + */ + function (t) { + try { + document.body.classList.add() + } catch (e) { + var n = t.add, + i = t.remove; + t.add = function () { + for (var t = 0; t < arguments.length; t++) n.call(this, arguments[t]) + }, t.remove = function () { + for (var t = 0; t < arguments.length; t++) i.call(this, arguments[t]) + } + } + }(DOMTokenList.prototype); \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/script/plugin/datapicker/duet-date-picker.entry.js b/src/main/webapp/kofair_case_seed/script/plugin/datapicker/duet-date-picker.entry.js new file mode 100644 index 00000000..93d83ae6 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/datapicker/duet-date-picker.entry.js @@ -0,0 +1,666 @@ +import { + h as t, + r as e, + c as a, + H as i, + g as o +} from "./index-a3afd6e1.js"; +const d = /^(\d{4}).(\d{2}).(\d{2})$/; +var r; + +function s(t, e, a) { + var i = parseInt(a, 10), + o = parseInt(e, 10), + d = parseInt(t, 10); + if (Number.isInteger(d) && Number.isInteger(o) && Number.isInteger(i) && o > 0 && o <= 12 && i > 0 && i <= 31 && d > 0) return new Date(d, o - 1, i) +} + +function n(t) { + if (!t) return; + const e = t.match(d); + return e ? s(e[1], e[2], e[3]) : void 0 +} + +function l(t) { + if (!t) return ""; + var e = t.getDate().toString(10), + a = (t.getMonth() + 1).toString(10), + i = t.getFullYear().toString(10); + return t.getDate() < 10 && (e = `0${e}`), t.getMonth() < 9 && (a = `0${a}`), `${i}.${a}.${e}` +} + +function u(t, e) { + return null != t && null != e && c(t, e) && t.getDate() === e.getDate() +} + +function c(t, e) { + return null != t && null != e && t.getFullYear() === e.getFullYear() && t.getMonth() === e.getMonth() +} + +function h(t, e) { + var a = new Date(t); + return a.setDate(a.getDate() + e), a +} + +function p(t, e = r.Monday) { + var a = new Date(t), + i = a.getDay(), + o = (i < e ? 7 : 0) + i - e; + return a.setDate(a.getDate() - o), a +} + +function b(t, e = r.Monday) { + var a = new Date(t), + i = a.getDay(), + o = 6 + (i < e ? -7 : 0) - (i - e); + return a.setDate(a.getDate() + o), a +} + +function _(t) { + return new Date(t.getFullYear(), t.getMonth(), 1) +} + +function m(t) { + return new Date(t.getFullYear(), t.getMonth() + 1, 0) +} + +function v(t, e) { + const a = new Date(t); + return a.setMonth(e), a +} + +function f(t, e) { + const a = new Date(t); + return a.setFullYear(e), a +} + +function g(t, e, a) { + return x(t, e, a) === t +} + +function x(t, e, a) { + const i = t.getTime(); + return e && e instanceof Date && i < e.getTime() ? e : a && a instanceof Date && i > a.getTime() ? a : t +} + +function y() { + return Math.random().toString(16).slice(-4) +} + +function w(t) { + return `${t}-${y()}${y()}-${y()}-${y()}-${y()}-${y()}${y()}${y()}` +}! function (t) { + t[t.Sunday = 0] = "Sunday", t[t.Monday = 1] = "Monday", t[t.Tuesday = 2] = "Tuesday", t[t.Wednesday = 3] = "Wednesday", t[t.Thursday = 4] = "Thursday", t[t.Friday = 5] = "Friday", t[t.Saturday = 6] = "Saturday" +}(r || (r = {})); +const k = ({ + onClick: e, + dateFormatter: a, + localization: i, + name: o, + formattedValue: d, + valueAsDate: r, + value: s, + identifier: n, + disabled: l, + required: u, + role: c, + buttonRef: h, + inputRef: p, + onInput: b, + onBlur: _, + onFocus: m + }) => t("div", { + class: "duet-date__input-wrapper" + }, t("input", { + class: "duet-date__input", + value: s, + placeholder: i.placeholder, + id: n, + disabled: l, + role: c, + required: !!u || void 0, + "aria-autocomplete": "none", + onInput: b, + onFocus: m, + onBlur: _, + autoComplete: "off", + ref: p + }), t("input", { + type: "hidden", + name: o, + value: s + }), t("button", { + class: "duet-date__toggle", + onClick: e, + disabled: l, + ref: h, + type: "button" + }, t("span", { + class: "duet-date__toggle-icon" + }, t("svg", { + "aria-hidden": "true", + height: "24", + viewBox: "0 0 21 21", + width: "24", + xmlns: "http://www.w3.org/2000/svg" + }, t("g", { + fill: "none", + "fill-rule": "evenodd", + transform: "translate(2 2)" + }, t("path", { + d: "m2.5.5h12c1.1045695 0 2 .8954305 2 2v12c0 1.1045695-.8954305 2-2 2h-12c-1.1045695 0-2-.8954305-2-2v-12c0-1.1045695.8954305-2 2-2z", + stroke: "currentColor", + "stroke-linecap": "round", + "stroke-linejoin": "round" + }), t("path", { + d: "m.5 4.5h16", + stroke: "currentColor", + "stroke-linecap": "round", + "stroke-linejoin": "round" + }), t("g", { + fill: "currentColor" + }, t("circle", { + cx: "8.5", + cy: "8.5", + r: "1" + }), t("circle", { + cx: "4.5", + cy: "8.5", + r: "1" + }), t("circle", { + cx: "12.5", + cy: "8.5", + r: "1" + }), t("circle", { + cx: "8.5", + cy: "12.5", + r: "1" + }), t("circle", { + cx: "4.5", + cy: "12.5", + r: "1" + }), t("circle", { + cx: "12.5", + cy: "12.5", + r: "1" + }))))), t("span", { + class: "duet-date__vhidden" + }, i.buttonLabel, r && t("span", null, ", ", i.selectedDateMessage, " ", a.format(r))))), + D = ({ + focusedDay: e, + today: a, + day: i, + onDaySelect: o, + onKeyboardNavigation: d, + focusedDayRef: r, + disabled: s, + inRange: n, + isSelected: l, + dateFormatter: h + }) => { + const p = u(i, a), + b = c(i, e), + _ = u(i, e), + m = !n; + return t("button", { + class: { + "duet-date__day": !0, "is-outside": m, "is-today": p, "is-month": b, "is-disabled": s + }, + tabIndex: _ ? 0 : -1, + onClick: function (t) { + o(t, i) + }, + onKeyDown: d, + "aria-disabled": s ? "true" : void 0, + disabled: m, + type: "button", + "aria-pressed": l ? "true" : "false", + "title":h.format(i), + ref: t => { + _ && t && r && r(t) + } + }, t("span", { + "aria-hidden": "true" + }, i.getDate()), t("span", { + class: "duet-date__vhidden" + }/*, h.format(i)*/)) + }, + z = ({ + selectedDate: e, + focusedDate: a, + labelledById: i, + localization: o, + firstDayOfWeek: d, + min: s, + max: n, + dateFormatter: l, + isDateDisabled: c, + onDateSelect: v, + onKeyboardNavigation: f, + focusedDayRef: x + }) => { + const y = new Date, + w = function (t, e = r.Monday) { + return function (t, e) { + const a = []; + let i = t; + for (; !u(i, e);) a.push(i), i = h(i, 1); + return a.push(i), a + }(p(_(t), e), b(m(t), e)) + }(a, d); + + /*mt = this.focusedDay.getMonth(), + yt = this.focusedDay.getFullYear();*/ + + return t("table", { + class: "duet-date__table", + "aria-labelledby": i + },t("caption"), + t("thead", null, t("tr", null, (z = d, M = e => t("th", { + class: "duet-date__table-header", + scope: "col" + }, t("span", { + "aria-hidden": "true" + }, e.substr(0, 2)), t("span", { + class: "duet-date__vhidden" + })), (k = o.dayNames).map(((t, e) => M(k[(e + z) % k.length])))))), t("tbody", null, function (t) { + const e = []; + for (let a = 0; a < t.length; a += 7) e.push(t.slice(a, a + 7)); + return e + }(w).map((i => t("tr", { + class: "duet-date__row" + }, i.map((i => t("td", { + class: "duet-date__cell" + }, t(D, { + day: i, + today: y, + focusedDay: a, + isSelected: u(i, e), + disabled: c(i), + inRange: g(i, s, n), + onDaySelect: v, + dateFormatter: l, + onKeyboardNavigation: f, + focusedDayRef: x + }))))))))); + var k, z, M + }, + M = { + buttonLabel: "Choose date", + placeholder: "YYYY-MM-DD", + selectedDateMessage: "Selected date is", + prevMonthLabel: "Previous month", + nextMonthLabel: "Next month", + monthSelectLabel: "Month", + yearSelectLabel: "Year", + closeLabel: "Close window", + calendarHeading: "Choose a date", + dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + monthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + locale: "en-GB" + }, + C = { + parse: n, + format: l + }, + F = /[^0-9\.\/\-]+/g, + L = class { + constructor(t) { + e(this, t), this.duetChange = a(this, "duetChange", 7), this.duetBlur = a(this, "duetBlur", 7), this.duetFocus = a(this, "duetFocus", 7), this.duetOpen = a(this, "duetOpen", 7), this.duetClose = a(this, "duetClose", 7), this.monthSelectId = w("DuetDateMonth"), this.yearSelectId = w("DuetDateYear"), this.dialogLabelId = w("DuetDateLabel"), this.initialTouchX = null, this.initialTouchY = null, this.activeFocus = !1, this.focusedDay = new Date, this.open = !1, this.name = "date", this.identifier = "", this.disabled = !1, this.direction = "right", this.required = !1, this.value = "", this.min = "", this.max = "", this.firstDayOfWeek = r.Monday, this.localization = M, this.dateAdapter = C, this.isDateDisabled = () => !1, this.enableActiveFocus = () => { + this.activeFocus = !0 + }, this.disableActiveFocus = () => { + this.activeFocus = !1 + }, this.toggleOpen = t => { + t.preventDefault(), this.open ? this.hide(!1) : this.show(); + }, this.handleEscKey = t => { + 27 === t.keyCode && this.hide() + }, this.handleBlur = t => { + t.stopPropagation(), this.duetBlur.emit({ + component: "duet-date-picker" + }) + }, this.handleFocus = t => { + t.stopPropagation(), this.duetFocus.emit({ + component: "duet-date-picker" + }) + }, this.handleTouchStart = t => { + const e = t.changedTouches[0]; + this.initialTouchX = e.pageX, this.initialTouchY = e.pageY + }, this.handleTouchMove = t => { + t.preventDefault() + }, this.handleTouchEnd = t => { + const e = t.changedTouches[0], + a = e.pageX - this.initialTouchX, + i = e.pageY - this.initialTouchY, + o = Math.abs(a) >= 70 && Math.abs(i) <= 70, + d = Math.abs(i) >= 70 && Math.abs(a) <= 70 && i > 0; + o ? this.addMonths(a < 0 ? 1 : -1) : d && (this.hide(!1), t.preventDefault()), this.initialTouchY = null, this.initialTouchX = null + }, this.handleNextMonthClick = t => { + t.preventDefault(), this.addMonths(1) + }, this.handlePreviousMonthClick = t => { + t.preventDefault(), this.addMonths(-1) + }, this.handleFirstFocusableKeydown = t => { + 9 === t.keyCode && t.shiftKey && (this.focusedDayNode.focus(), t.preventDefault()) + }, this.handleKeyboardNavigation = t => { + if (9 === t.keyCode && !t.shiftKey) return t.preventDefault(), void this.firstFocusableElement.focus(); + var e = !0; + switch (t.keyCode) { + case 39: + this.addDays(1); + break; + case 37: + this.addDays(-1); + break; + case 40: + this.addDays(7); + break; + case 38: + this.addDays(-7); + break; + case 33: + t.shiftKey ? this.addYears(-1) : this.addMonths(-1); + break; + case 34: + t.shiftKey ? this.addYears(1) : this.addMonths(1); + break; + case 36: + this.startOfWeek(); + break; + case 35: + this.endOfWeek(); + break; + default: + e = !1 + } + e && (t.preventDefault(), this.enableActiveFocus()) + }, this.handleDaySelect = (t, e) => { + const a = g(e, n(this.min), n(this.max)), + i = !this.isDateDisabled(e); + a && i ? (this.setValue(e), this.hide()) : this.setFocusedDay(e) + }, this.handleMonthSelect = t => { + this.setMonth(parseInt(t.target.value, 10)) + }, this.handleYearSelect = t => { + this.setYear(parseInt(t.target.value, 10)) + }, this.handleInputChange = () => { + const t = this.datePickerInput; + ! function (t, e) { + const a = t.value, + i = t.selectionStart, + o = a.slice(0, i), + d = a.slice(i, a.length), + r = o.replace(e, ""), + s = r + d.replace(e, ""), + n = r.length; + t.value = s, t.selectionStart = t.selectionEnd = n + }(t, F); + const e = this.dateAdapter.parse(t.value, s); + (e || "" === t.value) && this.setValue(e) + }, this.processFocusedDayNode = t => { + this.focusedDayNode = t, this.activeFocus && this.open && setTimeout((() => t.focus()), 0); + } + } + connectedCallback() { + this.createDateFormatters() + } + createDateFormatters() { + this.dateFormatShort = new Intl.DateTimeFormat(this.localization.locale, { + day: "numeric", + month: "long" + }), this.dateFormatLong = new Intl.DateTimeFormat(this.localization.locale, { + day: "numeric", + month: "long", + year: "numeric" + }) + } + handleDocumentClick(t) { + this.open && t.composedPath().every((t => t !== this.dialogWrapperNode && t !== this.datePickerButton)) && this.hide(!1) + } + async setFocus() { + return this.datePickerInput.focus() + } + async show() { + this.open = !0, this.duetOpen.emit({ + component: "duet-date-picker" + }), this.setFocusedDay(n(this.value) || new Date), clearTimeout(this.focusTimeoutId), this.focusTimeoutId = setTimeout((() => this.monthSelectNode.focus()), 300); + $(this.dialogWrapperNode).find("caption").text(this.focusedDay.getFullYear()+"년 " + Number(this.focusedDay.getMonth()+1)+"월 달력입니다."); + } + async hide(t = !0) { + this.open = !1, this.duetClose.emit({ + component: "duet-date-picker" + }), clearTimeout(this.focusTimeoutId), t && setTimeout((() => this.datePickerButton.focus()), 0) + } + addDays(t) { + this.setFocusedDay(h(this.focusedDay, t)) + } + addMonths(t) { + this.setMonth(this.focusedDay.getMonth() + t) + } + addYears(t) { + this.setYear(this.focusedDay.getFullYear() + t) + } + startOfWeek() { + this.setFocusedDay(p(this.focusedDay, this.firstDayOfWeek)) + } + endOfWeek() { + this.setFocusedDay(b(this.focusedDay, this.firstDayOfWeek)) + } + setMonth(t) { + const e = v(_(this.focusedDay), t), + a = m(e), + i = v(this.focusedDay, t); + this.setFocusedDay(x(i, e, a)) + } + setYear(t) { + const e = f(_(this.focusedDay), t), + a = m(e), + i = f(this.focusedDay, t); + this.setFocusedDay(x(i, e, a)) + } + setFocusedDay(t) { + this.focusedDay = x(t, n(this.min), n(this.max)) + } + setValue(t) { + this.value = l(t), this.duetChange.emit({ + component: "duet-date-picker", + value: this.value, + valueAsDate: t + }) + } + render() { + const e = n(this.value), + a = e && this.dateAdapter.format(e), + o = (e || this.focusedDay).getFullYear(), + d = this.focusedDay.getMonth(), + r = this.focusedDay.getFullYear(), + s = n(this.min), + l = n(this.max), + u = null != s && s.getMonth() === d && s.getFullYear() === r, + c = null != l && l.getMonth() === d && l.getFullYear() === r, + h = s ? s.getFullYear() : o - 70, + p = l ? l.getFullYear() : o + 10; + return t(i, null, t("div", { + class: "duet-date" + }, t(k, { + dateFormatter: this.dateFormatLong, + value: this.value, + valueAsDate: e, + formattedValue: a, + onInput: this.handleInputChange, + onBlur: this.handleBlur, + onFocus: this.handleFocus, + onClick: this.toggleOpen, + name: this.name, + disabled: this.disabled, + role: this.role, + required: this.required, + identifier: this.identifier, + localization: this.localization, + buttonRef: t => this.datePickerButton = t, + inputRef: t => this.datePickerInput = t + }), t("div", { + class: { + "duet-date__dialog": !0, "is-left": "left" === this.direction, "is-active": this.open + }, + role: "dialog", + "aria-modal": "true", + "aria-hidden": this.open ? "false" : "true", + "aria-labelledby": this.dialogLabelId, + onTouchMove: this.handleTouchMove, + onTouchStart: this.handleTouchStart, + onTouchEnd: this.handleTouchEnd + }, t("div", { + class: "duet-date__dialog-content", + onKeyDown: this.handleEscKey, + ref: t => this.dialogWrapperNode = t + }, t("div", { + class: "duet-date__mobile", + onFocusin: this.disableActiveFocus + }, t("label", { + class: "duet-date__mobile-heading" + }, this.localization.calendarHeading), t("button", { + class: "duet-date__close", + ref: t => this.firstFocusableElement = t, + onKeyDown: this.handleFirstFocusableKeydown, + onClick: () => this.hide(), + type: "button", + "title" : this.localization.closeLabel + }, t("svg", { + "aria-hidden": "true", + fill: "currentColor", + xmlns: "http://www.w3.org/2000/svg", + width: "16", + height: "16", + viewBox: "0 0 24 24" + }, t("path", { + d: "M0 0h24v24H0V0z", + fill: "none" + }), t("path", { + d: "M18.3 5.71c-.39-.39-1.02-.39-1.41 0L12 10.59 7.11 5.7c-.39-.39-1.02-.39-1.41 0-.39.39-.39 1.02 0 1.41L10.59 12 5.7 16.89c-.39.39-.39 1.02 0 1.41.39.39 1.02.39 1.41 0L12 13.41l4.89 4.89c.39.39 1.02.39 1.41 0 .39-.39.39-1.02 0-1.41L13.41 12l4.89-4.89c.38-.38.38-1.02 0-1.4z" + })), t("span", { + class: "duet-date__vhidden" + }))), t("div", { + class: "duet-date__header", + onFocusin: this.disableActiveFocus + }, t("div", null, /*t("h2", { + id: this.dialogLabelId, + class: "duet-date__vhidden", + "aria-live": "polite", + "aria-atomic": "true" + }, this.localization.monthNames[d], " ", this.focusedDay.getFullYear()),*/ t("label", { + htmlFor: this.monthSelectId, + class: "duet-date__vhidden", + }), t("div", { + class: "duet-date__select" + }, t("select", { + id: this.monthSelectId, + class: "duet-date__select--month", + "title": this.localization.monthSelectLabel, + ref: t => this.monthSelectNode = t, + onChange: this.handleMonthSelect + }, this.localization.monthNames.map(((e, a) => t("option", { + key: e, + value: a, + selected: a === d, + disabled: !g(new Date(r, a, 1), s ? _(s) : null, l ? m(l) : null) + }, e)))), t("div", { + class: "duet-date__select-label", + "aria-hidden": "true" + }, t("span", null, this.localization.monthNamesShort[d]), t("svg", { + fill: "currentColor", + xmlns: "http://www.w3.org/2000/svg", + width: "16", + height: "16", + viewBox: "0 0 24 24" + }, t("path", { + d: "M8.12 9.29L12 13.17l3.88-3.88c.39-.39 1.02-.39 1.41 0 .39.39.39 1.02 0 1.41l-4.59 4.59c-.39.39-1.02.39-1.41 0L6.7 10.7c-.39-.39-.39-1.02 0-1.41.39-.38 1.03-.39 1.42 0z" + })))), t("label", { + htmlFor: this.yearSelectId, + class: "duet-date__vhidden" + }), t("div", { + class: "duet-date__select" + }, t("select", { + id: this.yearSelectId, + class: "duet-date__select--year", + onChange: this.handleYearSelect, + "title":this.localization.yearSelectLabel + }, function (t, e) { + for (var a = [], i = t; i <= e; i++) a.push(i); + return a + }(h, p).map((e => t("option", { + key: e, + selected: e === r + }, e)))), t("div", { + class: "duet-date__select-label", + "aria-hidden": "true" + }, t("span", null, this.focusedDay.getFullYear()), t("svg", { + fill: "currentColor", + xmlns: "http://www.w3.org/2000/svg", + width: "16", + height: "16", + viewBox: "0 0 24 24" + }, t("path", { + d: "M8.12 9.29L12 13.17l3.88-3.88c.39-.39 1.02-.39 1.41 0 .39.39.39 1.02 0 1.41l-4.59 4.59c-.39.39-1.02.39-1.41 0L6.7 10.7c-.39-.39-.39-1.02 0-1.41.39-.38 1.03-.39 1.42 0z" + }))))), t("div", { + class: "duet-date__nav" + }, t("button", { + class: "duet-date__prev", + onClick: this.handlePreviousMonthClick, + disabled: u, + type: "button", + "title":this.localization.prevMonthLabel, + }, t("svg", { + "aria-hidden": "true", + fill: "currentColor", + xmlns: "http://www.w3.org/2000/svg", + width: "21", + height: "21", + viewBox: "0 0 24 24" + }, t("path", { + d: "M14.71 15.88L10.83 12l3.88-3.88c.39-.39.39-1.02 0-1.41-.39-.39-1.02-.39-1.41 0L8.71 11.3c-.39.39-.39 1.02 0 1.41l4.59 4.59c.39.39 1.02.39 1.41 0 .38-.39.39-1.03 0-1.42z" + })), t("span", { + class: "duet-date__vhidden" + })), t("button", { + class: "duet-date__next", + onClick: this.handleNextMonthClick, + disabled: c, + type: "button", + "title":this.localization.nextMonthLabel, + }, t("svg", { + "aria-hidden": "true", + fill: "currentColor", + xmlns: "http://www.w3.org/2000/svg", + width: "21", + height: "21", + viewBox: "0 0 24 24" + }, t("path", { + d: "M9.29 15.88L13.17 12 9.29 8.12c-.39-.39-.39-1.02 0-1.41.39-.39 1.02-.39 1.41 0l4.59 4.59c.39.39.39 1.02 0 1.41L10.7 17.3c-.39.39-1.02.39-1.41 0-.38-.39-.39-1.03 0-1.42z" + })), t("span", { + class: "duet-date__vhidden" + })))), t(z, { + dateFormatter: this.dateFormatShort, + selectedDate: e, + focusedDate: this.focusedDay, + onDateSelect: this.handleDaySelect, + onKeyboardNavigation: this.handleKeyboardNavigation, + labelledById: this.dialogLabelId, + localization: this.localization, + firstDayOfWeek: this.firstDayOfWeek, + focusedDayRef: this.processFocusedDayNode, + min: s, + max: l, + isDateDisabled: this.isDateDisabled + }))))) + } + get element() { + return o(this) + } + static get watchers() { + return { + localization: ["createDateFormatters"] + } + } + }; +L.style = '.duet-date *,.duet-date *::before,.duet-date *::after{box-sizing:border-box;margin:0;width:auto}.duet-date{box-sizing:border-box;color:var(--duet-color-text);display:block;font-family:var(--duet-font);margin:0;position:relative;text-align:left;width:100%}.duet-date__input{-webkit-appearance:none;appearance:none;background:var(--duet-color-surface);border:1px solid var(--duet-color-border, var(--duet-color-text));border-radius:var(--duet-radius);color:var(--duet-color-text);float:none;font-family:var(--duet-font);font-size:100%;line-height:normal;padding:14px 60px 14px 14px;width:100%}.duet-date__input:focus{border-color:var(--duet-color-primary);box-shadow:0 0 0 1px var(--duet-color-primary);outline:0}.duet-date__input::-webkit-input-placeholder{color:var(--duet-color-placeholder);opacity:1}.duet-date__input:-moz-placeholder{color:var(--duet-color-placeholder);opacity:1}.duet-date__input:-ms-input-placeholder{color:var(--duet-color-placeholder)}.duet-date__input-wrapper{position:relative;width:100%}.duet-date__toggle{-moz-appearance:none;-webkit-appearance:none;-webkit-user-select:none;align-items:center;appearance:none;background:var(--duet-color-button);border:0;border-radius:0;border-bottom-right-radius:var(--duet-radius);border-top-right-radius:var(--duet-radius);box-shadow:inset 1px 0 0 rgba(0, 0, 0, 0.1);color:var(--duet-color-text);cursor:pointer;display:flex;height:calc(100% - 2px);justify-content:center;padding:0;position:absolute;right:1px;top:1px;user-select:none;width:48px;z-index:2}.duet-date__toggle:focus{box-shadow:0 0 0 2px var(--duet-color-primary);outline:0}.duet-date__toggle-icon{display:flex;flex-basis:100%;justify-content:center;align-items:center}.duet-date__dialog{display:flex;left:0;min-width:320px;opacity:0;position:absolute;top:100%;transform:scale(0.96) translateZ(0) translateY(-20px);transform-origin:top right;transition:transform 300ms ease, opacity 300ms ease, visibility 300ms ease;visibility:hidden;width:100%;will-change:transform, opacity, visibility;z-index:var(--duet-z-index)}@media (max-width: 35.9375em){.duet-date__dialog{background:var(--duet-color-overlay);bottom:0;position:fixed;right:0;top:0;transform:translateZ(0);transform-origin:bottom center}}.duet-date__dialog.is-left{left:auto;right:0;width:auto}.duet-date__dialog.is-active{opacity:1;transform:scale(1.0001) translateZ(0) translateY(0);visibility:visible}.duet-date__dialog-content{background:var(--duet-color-surface);border:1px solid rgba(0, 0, 0, 0.1);border-radius:var(--duet-radius);box-shadow:0 4px 10px 0 rgba(0, 0, 0, 0.1);margin-left:auto;margin-top:8px;max-width:310px;min-width:290px;padding:16px 16px 20px;position:relative;transform:none;width:100%;z-index:var(--duet-z-index)}@media (max-width: 35.9375em){.duet-date__dialog-content{border:0;border-radius:0;border-top-left-radius:var(--duet-radius);border-top-right-radius:var(--duet-radius);bottom:0;left:0;margin:0;max-width:none;min-height:26em;opacity:0;padding:0 8% 20px;position:absolute;transform:translateZ(0) translateY(100%);transition:transform 400ms ease, opacity 400ms ease, visibility 400ms ease;visibility:hidden;will-change:transform, opacity, visibility}.is-active .duet-date__dialog-content{opacity:1;transform:translateZ(0) translateY(0);visibility:visible}}.duet-date__table{border-collapse:collapse;border-spacing:0;color:var(--duet-color-text);font-size:1rem;font-weight:var(--duet-font-normal);line-height:1.25;text-align:center;width:100%}.duet-date__table-header{font-size:0.75rem;font-weight:var(--duet-font-bold);letter-spacing:1px;line-height:1.25;padding-bottom:8px;text-decoration:none;text-transform:uppercase}.duet-date__cell{text-align:center}.duet-date__day{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:transparent;border:0;border-radius:50%;color:var(--duet-color-text);cursor:pointer;display:inline-block;font-family:var(--duet-font);font-size:0.875rem;font-variant-numeric:tabular-nums;font-weight:var(--duet-font-normal);height:36px;line-height:1.25;padding:0 0 1px;position:relative;text-align:center;vertical-align:middle;width:36px;z-index:1}.duet-date__day.is-today{box-shadow:0 0 0 1px var(--duet-color-primary);position:relative;z-index:200}.duet-date__day:hover::before,.duet-date__day.is-today::before{background:var(--duet-color-primary);border-radius:50%;bottom:0;content:"";left:0;opacity:0.06;position:absolute;right:0;top:0}.duet-date__day[aria-pressed=true],.duet-date__day:focus{background:var(--duet-color-primary);box-shadow:none;color:var(--duet-color-text-active);outline:0}.duet-date__day:active{background:var(--duet-color-primary);box-shadow:0 0 5px var(--duet-color-primary);color:var(--duet-color-text-active);z-index:200}.duet-date__day:focus{box-shadow:0 0 5px var(--duet-color-primary);z-index:200}.duet-date__day:not(.is-month){box-shadow:none}.duet-date__day:not(.is-month),.duet-date__day[aria-disabled=true]{background:transparent;color:var(--duet-color-text);cursor:default;opacity:0.5}.duet-date__day[aria-disabled=true].is-today{box-shadow:0 0 0 1px var(--duet-color-primary)}.duet-date__day[aria-disabled=true].is-today:focus{box-shadow:0 0 5px var(--duet-color-primary);background:var(--duet-color-primary);color:var(--duet-color-text-active)}.duet-date__day[aria-disabled=true]:not(.is-today)::before{display:none}.duet-date__day.is-outside{background:var(--duet-color-button);box-shadow:none;color:var(--duet-color-text);cursor:default;opacity:0.6;pointer-events:none}.duet-date__day.is-outside::before{display:none}.duet-date__header{align-items:center;display:flex;justify-content:space-between;margin-bottom:16px;width:100%}.duet-date__nav{white-space:nowrap}.duet-date__prev,.duet-date__next{-moz-appearance:none;-webkit-appearance:none;align-items:center;appearance:none;background:var(--duet-color-button);border:0;border-radius:50%;color:var(--duet-color-text);cursor:pointer;display:inline-flex;height:32px;justify-content:center;margin-left:8px;padding:0;transition:background-color 300ms ease;width:32px}@media (max-width: 35.9375em){.duet-date__prev,.duet-date__next{height:40px;width:40px}}.duet-date__prev:focus,.duet-date__next:focus{box-shadow:0 0 0 2px var(--duet-color-primary);outline:0}.duet-date__prev:active:focus,.duet-date__next:active:focus{box-shadow:none}.duet-date__prev:disabled,.duet-date__next:disabled{cursor:default;opacity:0.5}.duet-date__prev svg,.duet-date__next svg{margin:0 auto}.duet-date__select{display:inline-flex;margin-top:4px;position:relative}.duet-date__select span{margin-right:4px}.duet-date__select select{cursor:pointer;font-size:1rem;height:100%;left:0;opacity:0;position:absolute;top:0;width:100%;z-index:2}.duet-date__select select:focus+.duet-date__select-label{box-shadow:0 0 0 2px var(--duet-color-primary)}.duet-date__select-label{align-items:center;border-radius:var(--duet-radius);color:var(--duet-color-text);display:flex;font-size:1.25rem;font-weight:var(--duet-font-bold);line-height:1.25;padding:0 4px 0 8px;pointer-events:none;position:relative;width:100%;z-index:1}.duet-date__select-label svg{width:16px;height:16px}.duet-date__mobile{align-items:center;border-bottom:1px solid rgba(0, 0, 0, 0.12);display:flex;justify-content:space-between;margin-bottom:20px;margin-left:-10%;overflow:hidden;padding:12px 20px;position:relative;text-overflow:ellipsis;white-space:nowrap;width:120%}@media (min-width: 36em){.duet-date__mobile{border:0;margin:0;overflow:visible;padding:0;position:absolute;right:-8px;top:-8px;width:auto}}.duet-date__mobile-heading{display:inline-block;font-weight:var(--duet-font-bold);max-width:84%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media (min-width: 36em){.duet-date__mobile-heading{display:none}}.duet-date__close{-webkit-appearance:none;align-items:center;appearance:none;background:var(--duet-color-button);border:0;border-radius:50%;color:var(--duet-color-text);cursor:pointer;display:flex;height:24px;justify-content:center;padding:0;width:24px}@media (min-width: 36em){.duet-date__close{opacity:0}}.duet-date__close:focus{box-shadow:0 0 0 2px var(--duet-color-primary);outline:none}@media (min-width: 36em){.duet-date__close:focus{opacity:1}}.duet-date__close svg{margin:0 auto}.duet-date__vhidden{border:0;clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;padding:0;position:absolute;top:0;width:1px}'; +export { + L as duet_date_picker +} \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/script/plugin/datapicker/duet-date-picker.system.entry.js b/src/main/webapp/kofair_case_seed/script/plugin/datapicker/duet-date-picker.system.entry.js new file mode 100644 index 00000000..eb34a50c --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/datapicker/duet-date-picker.system.entry.js @@ -0,0 +1,1037 @@ +var __awaiter = this && this.__awaiter || function (e, t, a, o) { + function i(e) { + return e instanceof a ? e : new a((function (t) { + t(e) + })) + } + return new(a || (a = Promise))((function (a, r) { + function n(e) { + try { + s(o.next(e)) + } catch (e) { + r(e) + } + } + + function d(e) { + try { + s(o["throw"](e)) + } catch (e) { + r(e) + } + } + + function s(e) { + e.done ? a(e.value) : i(e.value).then(n, d) + } + s((o = o.apply(e, t || [])).next()) + })) +}; +var __generator = this && this.__generator || function (e, t) { + var a = { + label: 0, + sent: function () { + if (r[0] & 1) throw r[1]; + return r[1] + }, + trys: [], + ops: [] + }, + o, i, r, n; + return n = { + next: d(0), + throw: d(1), + return: d(2) + }, typeof Symbol === "function" && (n[Symbol.iterator] = function () { + return this + }), n; + + function d(e) { + return function (t) { + return s([e, t]) + } + } + + function s(n) { + if (o) throw new TypeError("Generator is already executing."); + while (a) try { + if (o = 1, i && (r = n[0] & 2 ? i["return"] : n[0] ? i["throw"] || ((r = i["return"]) && r.call(i), 0) : i.next) && !(r = r.call(i, n[1])).done) return r; + if (i = 0, r) n = [n[0] & 2, r.value]; + switch (n[0]) { + case 0: + case 1: + r = n; + break; + case 4: + a.label++; + return { + value: n[1], done: false + }; + case 5: + a.label++; + i = n[1]; + n = [0]; + continue; + case 7: + n = a.ops.pop(); + a.trys.pop(); + continue; + default: + if (!(r = a.trys, r = r.length > 0 && r[r.length - 1]) && (n[0] === 6 || n[0] === 2)) { + a = 0; + continue + } + if (n[0] === 3 && (!r || n[1] > r[0] && n[1] < r[3])) { + a.label = n[1]; + break + } + if (n[0] === 6 && a.label < r[1]) { + a.label = r[1]; + r = n; + break + } + if (r && a.label < r[2]) { + a.label = r[2]; + a.ops.push(n); + break + } + if (r[2]) a.ops.pop(); + a.trys.pop(); + continue + } + n = t.call(e, a) + } catch (e) { + n = [6, e]; + i = 0 + } finally { + o = r = 0 + } + if (n[0] & 5) throw n[1]; + return { + value: n[0] ? n[1] : void 0, + done: true + } + } +}; +System.register(["./index-7f002a21.system.js"], (function (e) { + "use strict"; + var t, a, o, i, r; + return { + setters: [function (e) { + t = e.h; + a = e.r; + o = e.c; + i = e.H; + r = e.g + }], + execute: function () { + var n = /^(\d{4}).(\d{2}).(\d{2})$/; + var d; + (function (e) { + e[e["Sunday"] = 0] = "Sunday"; + e[e["Monday"] = 1] = "Monday"; + e[e["Tuesday"] = 2] = "Tuesday"; + e[e["Wednesday"] = 3] = "Wednesday"; + e[e["Thursday"] = 4] = "Thursday"; + e[e["Friday"] = 5] = "Friday"; + e[e["Saturday"] = 6] = "Saturday" + })(d || (d = {})); + + function s(e, t, a) { + var o = parseInt(a, 10); + var i = parseInt(t, 10); + var r = parseInt(e, 10); + var n = Number.isInteger(r) && Number.isInteger(i) && Number.isInteger(o) && i > 0 && i <= 12 && o > 0 && o <= 31 && r > 0; + if (n) { + return new Date(r, i - 1, o) + } + } + + function l(e) { + if (!e) { + return + } + var t = e.match(n); + if (t) { + return s(t[1], t[2], t[3]) + } + } + + function u(e) { + if (!e) { + return "" + } + var t = e.getDate().toString(10); + var a = (e.getMonth() + 1).toString(10); + var o = e.getFullYear().toString(10); + if (e.getDate() < 10) { + t = "0" + t + } + if (e.getMonth() < 9) { + a = "0" + a + } + return o + "-" + a + "-" + t + } + + function c(e, t) { + if (e == null || t == null) { + return false + } + return h(e, t) && e.getDate() === t.getDate() + } + + function h(e, t) { + if (e == null || t == null) { + return false + } + return e.getFullYear() === t.getFullYear() && e.getMonth() === t.getMonth() + } + + function p(e, t) { + var a = new Date(e); + a.setDate(a.getDate() + t); + return a + } + + function f(e, t) { + if (t === void 0) { + t = d.Monday + } + var a = new Date(e); + var o = a.getDay(); + var i = (o < t ? 7 : 0) + o - t; + a.setDate(a.getDate() - i); + return a + } + + function v(e, t) { + if (t === void 0) { + t = d.Monday + } + var a = new Date(e); + var o = a.getDay(); + var i = (o < t ? -7 : 0) + 6 - (o - t); + a.setDate(a.getDate() + i); + return a + } + + function y(e) { + return new Date(e.getFullYear(), e.getMonth(), 1) + } + + function b(e) { + return new Date(e.getFullYear(), e.getMonth() + 1, 0) + } + + function g(e, t) { + var a = new Date(e); + a.setMonth(t); + return a + } + + function m(e, t) { + var a = new Date(e); + a.setFullYear(t); + return a + } + + function _(e, t, a) { + return x(e, t, a) === e + } + + function x(e, t, a) { + var o = e.getTime(); + if (t && t instanceof Date && o < t.getTime()) { + return t + } + if (a && a instanceof Date && o > a.getTime()) { + return a + } + return e + } + + function w(e, t) { + var a = []; + var o = e; + while (!c(o, t)) { + a.push(o); + o = p(o, 1) + } + a.push(o); + return a + } + + function D(e, t) { + if (t === void 0) { + t = d.Monday + } + var a = f(y(e), t); + var o = v(b(e), t); + return w(a, o) + } + + function k() { + return Math.random().toString(16).slice(-4) + } + + function F(e) { + return e + "-" + k() + k() + "-" + k() + "-" + k() + "-" + k() + "-" + k() + k() + k() + } + var M = function (e) { + var a = e.onClick, + o = e.dateFormatter, + i = e.localization, + r = e.name, + n = e.formattedValue, + d = e.valueAsDate, + s = e.value, + l = e.identifier, + u = e.disabled, + c = e.required, + h = e.role, + p = e.buttonRef, + f = e.inputRef, + v = e.onInput, + y = e.onBlur, + b = e.onFocus; + return t("div", { + class: "duet-date__input-wrapper" + }, t("input", { + class: "duet-date__input", + value: s, + placeholder: i.placeholder, + id: l, + disabled: u, + role: h, + required: c ? true : undefined, + "aria-autocomplete": "none", + onInput: v, + onFocus: b, + onBlur: y, + autoComplete: "off", + ref: f + }), t("input", { + type: "hidden", + name: r, + value: s + }), t("button", { + class: "duet-date__toggle", + onClick: a, + disabled: u, + ref: p, + type: "button" + }, t("span", { + class: "duet-date__toggle-icon" + }, t("svg", { + "aria-hidden": "true", + height: "24", + viewBox: "0 0 21 21", + width: "24", + xmlns: "http://www.w3.org/2000/svg" + }, t("g", { + fill: "none", + "fill-rule": "evenodd", + transform: "translate(2 2)" + }, t("path", { + d: "m2.5.5h12c1.1045695 0 2 .8954305 2 2v12c0 1.1045695-.8954305 2-2 2h-12c-1.1045695 0-2-.8954305-2-2v-12c0-1.1045695.8954305-2 2-2z", + stroke: "currentColor", + "stroke-linecap": "round", + "stroke-linejoin": "round" + }), t("path", { + d: "m.5 4.5h16", + stroke: "currentColor", + "stroke-linecap": "round", + "stroke-linejoin": "round" + }), t("g", { + fill: "currentColor" + }, t("circle", { + cx: "8.5", + cy: "8.5", + r: "1" + }), t("circle", { + cx: "4.5", + cy: "8.5", + r: "1" + }), t("circle", { + cx: "12.5", + cy: "8.5", + r: "1" + }), t("circle", { + cx: "8.5", + cy: "12.5", + r: "1" + }), t("circle", { + cx: "4.5", + cy: "12.5", + r: "1" + }), t("circle", { + cx: "12.5", + cy: "12.5", + r: "1" + }))))), t("span", { + class: "duet-date__vhidden" + }, i.buttonLabel, d && t("span", null, ", ", i.selectedDateMessage, " ", o.format(d))))) + }; + var S = function (e) { + var a = e.focusedDay, + o = e.today, + i = e.day, + r = e.onDaySelect, + n = e.onKeyboardNavigation, + d = e.focusedDayRef, + s = e.disabled, + l = e.inRange, + u = e.isSelected, + p = e.dateFormatter; + var f = c(i, o); + var v = h(i, a); + var y = c(i, a); + var b = !l; + + function g(e) { + r(e, i) + } + return t("button", { + class: { + "duet-date__day": true, "is-outside": b, "is-today": f, "is-month": v, "is-disabled": s + }, + tabIndex: y ? 0 : -1, + onClick: g, + onKeyDown: n, + "aria-disabled": s ? "true" : undefined, + disabled: b, + type: "button", + "aria-pressed": u ? "true" : "false", + ref: function (e) { + if (y && e && d) { + d(e) + } + } + }, t("span", { + "aria-hidden": "true" + }, i.getDate()), t("span", { + class: "duet-date__vhidden" + }, p.format(i))) + }; + + function z(e, t) { + var a = []; + for (var o = 0; o < e.length; o += t) { + a.push(e.slice(o, o + t)) + } + return a + } + + function T(e, t, a) { + return e.map((function (o, i) { + var r = (i + t) % e.length; + return a(e[r]) + })) + } + var C = function (e) { + var a = e.selectedDate, + o = e.focusedDate, + i = e.labelledById, + r = e.localization, + n = e.firstDayOfWeek, + d = e.min, + s = e.max, + l = e.dateFormatter, + u = e.isDateDisabled, + h = e.onDateSelect, + p = e.onKeyboardNavigation, + f = e.focusedDayRef; + var v = new Date; + var y = D(o, n); + return t("table", { + class: "duet-date__table", + "aria-labelledby": i + }, t("thead", null, t("tr", null, T(r.dayNames, n, (function (e) { + return t("th", { + class: "duet-date__table-header", + scope: "col" + }, t("span", { + "aria-hidden": "true" + }, e.substr(0, 2)), t("span", { + class: "duet-date__vhidden" + }, e)) + })))), t("tbody", null, z(y, 7).map((function (e) { + return t("tr", { + class: "duet-date__row" + }, e.map((function (e) { + return t("td", { + class: "duet-date__cell" + }, t(S, { + day: e, + today: v, + focusedDay: o, + isSelected: c(e, a), + disabled: u(e), + inRange: _(e, d, s), + onDaySelect: h, + dateFormatter: l, + onKeyboardNavigation: p, + focusedDayRef: f + })) + }))) + })))) + }; + var Y = { + buttonLabel: "Choose date", + placeholder: "YYYY-MM-DD", + selectedDateMessage: "Selected date is", + prevMonthLabel: "Previous month", + nextMonthLabel: "Next month", + monthSelectLabel: "Month", + yearSelectLabel: "Year", + closeLabel: "Close window", + calendarHeading: "Choose a date", + dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + monthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + locale: "en-GB" + }; + var I = { + parse: l, + format: u + }; + var N = '.duet-date *,.duet-date *::before,.duet-date *::after{box-sizing:border-box;margin:0;width:auto}.duet-date{box-sizing:border-box;color:var(--duet-color-text);display:block;font-family:var(--duet-font);margin:0;position:relative;text-align:left;width:100%}.duet-date__input{-webkit-appearance:none;appearance:none;background:var(--duet-color-surface);border:1px solid var(--duet-color-border, var(--duet-color-text));border-radius:var(--duet-radius);color:var(--duet-color-text);float:none;font-family:var(--duet-font);font-size:100%;line-height:normal;padding:14px 60px 14px 14px;width:100%}.duet-date__input:focus{border-color:var(--duet-color-primary);box-shadow:0 0 0 1px var(--duet-color-primary);outline:0}.duet-date__input::-webkit-input-placeholder{color:var(--duet-color-placeholder);opacity:1}.duet-date__input:-moz-placeholder{color:var(--duet-color-placeholder);opacity:1}.duet-date__input:-ms-input-placeholder{color:var(--duet-color-placeholder)}.duet-date__input-wrapper{position:relative;width:100%}.duet-date__toggle{-moz-appearance:none;-webkit-appearance:none;-webkit-user-select:none;align-items:center;appearance:none;background:var(--duet-color-button);border:0;border-radius:0;border-bottom-right-radius:var(--duet-radius);border-top-right-radius:var(--duet-radius);box-shadow:inset 1px 0 0 rgba(0, 0, 0, 0.1);color:var(--duet-color-text);cursor:pointer;display:flex;height:calc(100% - 2px);justify-content:center;padding:0;position:absolute;right:1px;top:1px;user-select:none;width:48px;z-index:2}.duet-date__toggle:focus{box-shadow:0 0 0 2px var(--duet-color-primary);outline:0}.duet-date__toggle-icon{display:flex;flex-basis:100%;justify-content:center;align-items:center}.duet-date__dialog{display:flex;left:0;min-width:320px;opacity:0;position:absolute;top:100%;transform:scale(0.96) translateZ(0) translateY(-20px);transform-origin:top right;transition:transform 300ms ease, opacity 300ms ease, visibility 300ms ease;visibility:hidden;width:100%;will-change:transform, opacity, visibility;z-index:var(--duet-z-index)}@media (max-width: 35.9375em){.duet-date__dialog{background:var(--duet-color-overlay);bottom:0;position:fixed;right:0;top:0;transform:translateZ(0);transform-origin:bottom center}}.duet-date__dialog.is-left{left:auto;right:0;width:auto}.duet-date__dialog.is-active{opacity:1;transform:scale(1.0001) translateZ(0) translateY(0);visibility:visible}.duet-date__dialog-content{background:var(--duet-color-surface);border:1px solid rgba(0, 0, 0, 0.1);border-radius:var(--duet-radius);box-shadow:0 4px 10px 0 rgba(0, 0, 0, 0.1);margin-left:auto;margin-top:8px;max-width:310px;min-width:290px;padding:16px 16px 20px;position:relative;transform:none;width:100%;z-index:var(--duet-z-index)}@media (max-width: 35.9375em){.duet-date__dialog-content{border:0;border-radius:0;border-top-left-radius:var(--duet-radius);border-top-right-radius:var(--duet-radius);bottom:0;left:0;margin:0;max-width:none;min-height:26em;opacity:0;padding:0 8% 20px;position:absolute;transform:translateZ(0) translateY(100%);transition:transform 400ms ease, opacity 400ms ease, visibility 400ms ease;visibility:hidden;will-change:transform, opacity, visibility}.is-active .duet-date__dialog-content{opacity:1;transform:translateZ(0) translateY(0);visibility:visible}}.duet-date__table{border-collapse:collapse;border-spacing:0;color:var(--duet-color-text);font-size:1rem;font-weight:var(--duet-font-normal);line-height:1.25;text-align:center;width:100%}.duet-date__table-header{font-size:0.75rem;font-weight:var(--duet-font-bold);letter-spacing:1px;line-height:1.25;padding-bottom:8px;text-decoration:none;text-transform:uppercase}.duet-date__cell{text-align:center}.duet-date__day{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:transparent;border:0;border-radius:50%;color:var(--duet-color-text);cursor:pointer;display:inline-block;font-family:var(--duet-font);font-size:0.875rem;font-variant-numeric:tabular-nums;font-weight:var(--duet-font-normal);height:36px;line-height:1.25;padding:0 0 1px;position:relative;text-align:center;vertical-align:middle;width:36px;z-index:1}.duet-date__day.is-today{box-shadow:0 0 0 1px var(--duet-color-primary);position:relative;z-index:200}.duet-date__day:hover::before,.duet-date__day.is-today::before{background:var(--duet-color-primary);border-radius:50%;bottom:0;content:"";left:0;opacity:0.06;position:absolute;right:0;top:0}.duet-date__day[aria-pressed=true],.duet-date__day:focus{background:var(--duet-color-primary);box-shadow:none;color:var(--duet-color-text-active);outline:0}.duet-date__day:active{background:var(--duet-color-primary);box-shadow:0 0 5px var(--duet-color-primary);color:var(--duet-color-text-active);z-index:200}.duet-date__day:focus{box-shadow:0 0 5px var(--duet-color-primary);z-index:200}.duet-date__day:not(.is-month){box-shadow:none}.duet-date__day:not(.is-month),.duet-date__day[aria-disabled=true]{background:transparent;color:var(--duet-color-text);cursor:default;opacity:0.5}.duet-date__day[aria-disabled=true].is-today{box-shadow:0 0 0 1px var(--duet-color-primary)}.duet-date__day[aria-disabled=true].is-today:focus{box-shadow:0 0 5px var(--duet-color-primary);background:var(--duet-color-primary);color:var(--duet-color-text-active)}.duet-date__day[aria-disabled=true]:not(.is-today)::before{display:none}.duet-date__day.is-outside{background:var(--duet-color-button);box-shadow:none;color:var(--duet-color-text);cursor:default;opacity:0.6;pointer-events:none}.duet-date__day.is-outside::before{display:none}.duet-date__header{align-items:center;display:flex;justify-content:space-between;margin-bottom:16px;width:100%}.duet-date__nav{white-space:nowrap}.duet-date__prev,.duet-date__next{-moz-appearance:none;-webkit-appearance:none;align-items:center;appearance:none;background:var(--duet-color-button);border:0;border-radius:50%;color:var(--duet-color-text);cursor:pointer;display:inline-flex;height:32px;justify-content:center;margin-left:8px;padding:0;transition:background-color 300ms ease;width:32px}@media (max-width: 35.9375em){.duet-date__prev,.duet-date__next{height:40px;width:40px}}.duet-date__prev:focus,.duet-date__next:focus{box-shadow:0 0 0 2px var(--duet-color-primary);outline:0}.duet-date__prev:active:focus,.duet-date__next:active:focus{box-shadow:none}.duet-date__prev:disabled,.duet-date__next:disabled{cursor:default;opacity:0.5}.duet-date__prev svg,.duet-date__next svg{margin:0 auto}.duet-date__select{display:inline-flex;margin-top:4px;position:relative}.duet-date__select span{margin-right:4px}.duet-date__select select{cursor:pointer;font-size:1rem;height:100%;left:0;opacity:0;position:absolute;top:0;width:100%;z-index:2}.duet-date__select select:focus+.duet-date__select-label{box-shadow:0 0 0 2px var(--duet-color-primary)}.duet-date__select-label{align-items:center;border-radius:var(--duet-radius);color:var(--duet-color-text);display:flex;font-size:1.25rem;font-weight:var(--duet-font-bold);line-height:1.25;padding:0 4px 0 8px;pointer-events:none;position:relative;width:100%;z-index:1}.duet-date__select-label svg{width:16px;height:16px}.duet-date__mobile{align-items:center;border-bottom:1px solid rgba(0, 0, 0, 0.12);display:flex;justify-content:space-between;margin-bottom:20px;margin-left:-10%;overflow:hidden;padding:12px 20px;position:relative;text-overflow:ellipsis;white-space:nowrap;width:120%}@media (min-width: 36em){.duet-date__mobile{border:0;margin:0;overflow:visible;padding:0;position:absolute;right:-8px;top:-8px;width:auto}}.duet-date__mobile-heading{display:inline-block;font-weight:var(--duet-font-bold);max-width:84%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media (min-width: 36em){.duet-date__mobile-heading{display:none}}.duet-date__close{-webkit-appearance:none;align-items:center;appearance:none;background:var(--duet-color-button);border:0;border-radius:50%;color:var(--duet-color-text);cursor:pointer;display:flex;height:24px;justify-content:center;padding:0;width:24px}@media (min-width: 36em){.duet-date__close{opacity:0}}.duet-date__close:focus{box-shadow:0 0 0 2px var(--duet-color-primary);outline:none}@media (min-width: 36em){.duet-date__close:focus{opacity:1}}.duet-date__close svg{margin:0 auto}.duet-date__vhidden{border:0;clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;padding:0;position:absolute;top:0;width:1px}'; + + function L(e, t) { + var a = []; + for (var o = e; o <= t; o++) { + a.push(o) + } + return a + } + var O = { + TAB: 9, + ESC: 27, + SPACE: 32, + PAGE_UP: 33, + PAGE_DOWN: 34, + END: 35, + HOME: 36, + LEFT: 37, + UP: 38, + RIGHT: 39, + DOWN: 40 + }; + + function P(e, t) { + var a = e.value; + var o = e.selectionStart; + var i = a.slice(0, o); + var r = a.slice(o, a.length); + var n = i.replace(t, ""); + var d = r.replace(t, ""); + var s = n + d; + var l = n.length; + e.value = s; + e.selectionStart = e.selectionEnd = l; + return s + } + var A = /[^0-9\.\/\-]+/g; + var B = 300; + var E = e("duet_date_picker", function () { + function e(e) { + var t = this; + a(this, e); + this.duetChange = o(this, "duetChange", 7); + this.duetBlur = o(this, "duetBlur", 7); + this.duetFocus = o(this, "duetFocus", 7); + this.duetOpen = o(this, "duetOpen", 7); + this.duetClose = o(this, "duetClose", 7); + this.monthSelectId = F("DuetDateMonth"); + this.yearSelectId = F("DuetDateYear"); + this.dialogLabelId = F("DuetDateLabel"); + this.initialTouchX = null; + this.initialTouchY = null; + this.activeFocus = false; + this.focusedDay = new Date; + this.open = false; + this.name = "date"; + this.identifier = ""; + this.disabled = false; + this.direction = "right"; + this.required = false; + this.value = ""; + this.min = ""; + this.max = ""; + this.firstDayOfWeek = d.Monday; + this.localization = Y; + this.dateAdapter = I; + this.isDateDisabled = function () { + return false + }; + this.enableActiveFocus = function () { + t.activeFocus = true + }; + this.disableActiveFocus = function () { + t.activeFocus = false + }; + this.toggleOpen = function (e) { + e.preventDefault(); + t.open ? t.hide(false) : t.show() + }; + this.handleEscKey = function (e) { + if (e.keyCode === O.ESC) { + t.hide() + } + }; + this.handleBlur = function (e) { + e.stopPropagation(); + t.duetBlur.emit({ + component: "duet-date-picker" + }) + }; + this.handleFocus = function (e) { + e.stopPropagation(); + t.duetFocus.emit({ + component: "duet-date-picker" + }) + }; + this.handleTouchStart = function (e) { + var a = e.changedTouches[0]; + t.initialTouchX = a.pageX; + t.initialTouchY = a.pageY + }; + this.handleTouchMove = function (e) { + e.preventDefault() + }; + this.handleTouchEnd = function (e) { + var a = e.changedTouches[0]; + var o = a.pageX - t.initialTouchX; + var i = a.pageY - t.initialTouchY; + var r = 70; + var n = Math.abs(o) >= r && Math.abs(i) <= r; + var d = Math.abs(i) >= r && Math.abs(o) <= r && i > 0; + if (n) { + t.addMonths(o < 0 ? 1 : -1) + } else if (d) { + t.hide(false); + e.preventDefault() + } + t.initialTouchY = null; + t.initialTouchX = null + }; + this.handleNextMonthClick = function (e) { + e.preventDefault(); + t.addMonths(1) + }; + this.handlePreviousMonthClick = function (e) { + e.preventDefault(); + t.addMonths(-1) + }; + this.handleFirstFocusableKeydown = function (e) { + if (e.keyCode === O.TAB && e.shiftKey) { + t.focusedDayNode.focus(); + e.preventDefault() + } + }; + this.handleKeyboardNavigation = function (e) { + if (e.keyCode === O.TAB && !e.shiftKey) { + e.preventDefault(); + t.firstFocusableElement.focus(); + return + } + var a = true; + switch (e.keyCode) { + case O.RIGHT: + t.addDays(1); + break; + case O.LEFT: + t.addDays(-1); + break; + case O.DOWN: + t.addDays(7); + break; + case O.UP: + t.addDays(-7); + break; + case O.PAGE_UP: + if (e.shiftKey) { + t.addYears(-1) + } else { + t.addMonths(-1) + } + break; + case O.PAGE_DOWN: + if (e.shiftKey) { + t.addYears(1) + } else { + t.addMonths(1) + } + break; + case O.HOME: + t.startOfWeek(); + break; + case O.END: + t.endOfWeek(); + break; + default: + a = false + } + if (a) { + e.preventDefault(); + t.enableActiveFocus() + } + }; + this.handleDaySelect = function (e, a) { + var o = _(a, l(t.min), l(t.max)); + var i = !t.isDateDisabled(a); + if (o && i) { + t.setValue(a); + t.hide() + } else { + t.setFocusedDay(a) + } + }; + this.handleMonthSelect = function (e) { + t.setMonth(parseInt(e.target.value, 10)) + }; + this.handleYearSelect = function (e) { + t.setYear(parseInt(e.target.value, 10)) + }; + this.handleInputChange = function () { + var e = t.datePickerInput; + P(e, A); + var a = t.dateAdapter.parse(e.value, s); + if (a || e.value === "") { + t.setValue(a) + } + }; + this.processFocusedDayNode = function (e) { + t.focusedDayNode = e; + if (t.activeFocus && t.open) { + setTimeout((function () { + return e.focus() + }), 0) + } + } + } + e.prototype.connectedCallback = function () { + this.createDateFormatters() + }; + e.prototype.createDateFormatters = function () { + this.dateFormatShort = new Intl.DateTimeFormat(this.localization.locale, { + day: "numeric", + month: "long" + }); + this.dateFormatLong = new Intl.DateTimeFormat(this.localization.locale, { + day: "numeric", + month: "long", + year: "numeric" + }) + }; + e.prototype.handleDocumentClick = function (e) { + var t = this; + if (!this.open) { + return + } + var a = e.composedPath().every((function (e) { + return e !== t.dialogWrapperNode && e !== t.datePickerButton + })); + if (a) { + this.hide(false) + } + }; + e.prototype.setFocus = function () { + return __awaiter(this, void 0, void 0, (function () { + return __generator(this, (function (e) { + return [2, this.datePickerInput.focus()] + })) + })) + }; + e.prototype.show = function () { + return __awaiter(this, void 0, void 0, (function () { + var e = this; + return __generator(this, (function (t) { + this.open = true; + this.duetOpen.emit({ + component: "duet-date-picker" + }); + this.setFocusedDay(l(this.value) || new Date); + clearTimeout(this.focusTimeoutId); + this.focusTimeoutId = setTimeout((function () { + return e.monthSelectNode.focus() + }), B); + return [2] + })) + })) + }; + e.prototype.hide = function (e) { + if (e === void 0) { + e = true + } + return __awaiter(this, void 0, void 0, (function () { + var t = this; + return __generator(this, (function (a) { + this.open = false; + this.duetClose.emit({ + component: "duet-date-picker" + }); + clearTimeout(this.focusTimeoutId); + if (e) { + setTimeout((function () { + return t.datePickerButton.focus() + }), B + 200) + } + return [2] + })) + })) + }; + e.prototype.addDays = function (e) { + this.setFocusedDay(p(this.focusedDay, e)) + }; + e.prototype.addMonths = function (e) { + this.setMonth(this.focusedDay.getMonth() + e) + }; + e.prototype.addYears = function (e) { + this.setYear(this.focusedDay.getFullYear() + e) + }; + e.prototype.startOfWeek = function () { + this.setFocusedDay(f(this.focusedDay, this.firstDayOfWeek)) + }; + e.prototype.endOfWeek = function () { + this.setFocusedDay(v(this.focusedDay, this.firstDayOfWeek)) + }; + e.prototype.setMonth = function (e) { + var t = g(y(this.focusedDay), e); + var a = b(t); + var o = g(this.focusedDay, e); + this.setFocusedDay(x(o, t, a)) + }; + e.prototype.setYear = function (e) { + var t = m(y(this.focusedDay), e); + var a = b(t); + var o = m(this.focusedDay, e); + this.setFocusedDay(x(o, t, a)) + }; + e.prototype.setFocusedDay = function (e) { + this.focusedDay = x(e, l(this.min), l(this.max)) + }; + e.prototype.setValue = function (e) { + this.value = u(e); + this.duetChange.emit({ + component: "duet-date-picker", + value: this.value, + valueAsDate: e + }) + }; + e.prototype.render = function () { + var e = this; + var a = l(this.value); + var o = a && this.dateAdapter.format(a); + var r = (a || this.focusedDay).getFullYear(); + var n = this.focusedDay.getMonth(); + var d = this.focusedDay.getFullYear(); + var s = l(this.min); + var u = l(this.max); + var c = s != null && s.getMonth() === n && s.getFullYear() === d; + var h = u != null && u.getMonth() === n && u.getFullYear() === d; + var p = s ? s.getFullYear() : r - 70; + var f = u ? u.getFullYear() : r + 10; + return t(i, null, t("div", { + class: "duet-date" + }, t(M, { + dateFormatter: this.dateFormatLong, + value: this.value, + valueAsDate: a, + formattedValue: o, + onInput: this.handleInputChange, + onBlur: this.handleBlur, + onFocus: this.handleFocus, + onClick: this.toggleOpen, + name: this.name, + disabled: this.disabled, + role: this.role, + required: this.required, + identifier: this.identifier, + localization: this.localization, + buttonRef: function (t) { + return e.datePickerButton = t + }, + inputRef: function (t) { + return e.datePickerInput = t + } + }), t("div", { + class: { + "duet-date__dialog": true, "is-left": this.direction === "left", "is-active": this.open + }, + role: "dialog", + "aria-modal": "true", + "aria-hidden": this.open ? "false" : "true", + "aria-labelledby": this.dialogLabelId, + onTouchMove: this.handleTouchMove, + onTouchStart: this.handleTouchStart, + onTouchEnd: this.handleTouchEnd + }, t("div", { + class: "duet-date__dialog-content", + onKeyDown: this.handleEscKey, + ref: function (t) { + return e.dialogWrapperNode = t + } + }, t("div", { + class: "duet-date__mobile", + onFocusin: this.disableActiveFocus + }, t("label", { + class: "duet-date__mobile-heading" + }, this.localization.calendarHeading), t("button", { + class: "duet-date__close", + ref: function (t) { + return e.firstFocusableElement = t + }, + onKeyDown: this.handleFirstFocusableKeydown, + onClick: function () { + return e.hide() + }, + type: "button" + }, t("svg", { + "aria-hidden": "true", + fill: "currentColor", + xmlns: "http://www.w3.org/2000/svg", + width: "16", + height: "16", + viewBox: "0 0 24 24" + }, t("path", { + d: "M0 0h24v24H0V0z", + fill: "none" + }), t("path", { + d: "M18.3 5.71c-.39-.39-1.02-.39-1.41 0L12 10.59 7.11 5.7c-.39-.39-1.02-.39-1.41 0-.39.39-.39 1.02 0 1.41L10.59 12 5.7 16.89c-.39.39-.39 1.02 0 1.41.39.39 1.02.39 1.41 0L12 13.41l4.89 4.89c.39.39 1.02.39 1.41 0 .39-.39.39-1.02 0-1.41L13.41 12l4.89-4.89c.38-.38.38-1.02 0-1.4z" + })), t("span", { + class: "duet-date__vhidden" + }, this.localization.closeLabel))), t("div", { + class: "duet-date__header", + onFocusin: this.disableActiveFocus + }, t("div", null, t("h2", { + id: this.dialogLabelId, + class: "duet-date__vhidden", + "aria-live": "polite", + "aria-atomic": "true" + }, this.localization.monthNames[n], " ", this.focusedDay.getFullYear()), t("label", { + htmlFor: this.monthSelectId, + class: "duet-date__vhidden" + }, this.localization.monthSelectLabel), t("div", { + class: "duet-date__select" + }, t("select", { + id: this.monthSelectId, + class: "duet-date__select--month", + ref: function (t) { + return e.monthSelectNode = t + }, + onChange: this.handleMonthSelect + }, this.localization.monthNames.map((function (e, a) { + return t("option", { + key: e, + value: a, + selected: a === n, + disabled: !_(new Date(d, a, 1), s ? y(s) : null, u ? b(u) : null) + }, e) + }))), t("div", { + class: "duet-date__select-label", + "aria-hidden": "true" + }, t("span", null, this.localization.monthNamesShort[n]), t("svg", { + fill: "currentColor", + xmlns: "http://www.w3.org/2000/svg", + width: "16", + height: "16", + viewBox: "0 0 24 24" + }, t("path", { + d: "M8.12 9.29L12 13.17l3.88-3.88c.39-.39 1.02-.39 1.41 0 .39.39.39 1.02 0 1.41l-4.59 4.59c-.39.39-1.02.39-1.41 0L6.7 10.7c-.39-.39-.39-1.02 0-1.41.39-.38 1.03-.39 1.42 0z" + })))), t("label", { + htmlFor: this.yearSelectId, + class: "duet-date__vhidden" + }, this.localization.yearSelectLabel), t("div", { + class: "duet-date__select" + }, t("select", { + id: this.yearSelectId, + class: "duet-date__select--year", + onChange: this.handleYearSelect + }, L(p, f).map((function (e) { + return t("option", { + key: e, + selected: e === d + }, e) + }))), t("div", { + class: "duet-date__select-label", + "aria-hidden": "true" + }, t("span", null, this.focusedDay.getFullYear()), t("svg", { + fill: "currentColor", + xmlns: "http://www.w3.org/2000/svg", + width: "16", + height: "16", + viewBox: "0 0 24 24" + }, t("path", { + d: "M8.12 9.29L12 13.17l3.88-3.88c.39-.39 1.02-.39 1.41 0 .39.39.39 1.02 0 1.41l-4.59 4.59c-.39.39-1.02.39-1.41 0L6.7 10.7c-.39-.39-.39-1.02 0-1.41.39-.38 1.03-.39 1.42 0z" + }))))), t("div", { + class: "duet-date__nav" + }, t("button", { + class: "duet-date__prev", + onClick: this.handlePreviousMonthClick, + disabled: c, + type: "button" + }, t("svg", { + "aria-hidden": "true", + fill: "currentColor", + xmlns: "http://www.w3.org/2000/svg", + width: "21", + height: "21", + viewBox: "0 0 24 24" + }, t("path", { + d: "M14.71 15.88L10.83 12l3.88-3.88c.39-.39.39-1.02 0-1.41-.39-.39-1.02-.39-1.41 0L8.71 11.3c-.39.39-.39 1.02 0 1.41l4.59 4.59c.39.39 1.02.39 1.41 0 .38-.39.39-1.03 0-1.42z" + })), t("span", { + class: "duet-date__vhidden" + }, this.localization.prevMonthLabel)), t("button", { + class: "duet-date__next", + onClick: this.handleNextMonthClick, + disabled: h, + type: "button" + }, t("svg", { + "aria-hidden": "true", + fill: "currentColor", + xmlns: "http://www.w3.org/2000/svg", + width: "21", + height: "21", + viewBox: "0 0 24 24" + }, t("path", { + d: "M9.29 15.88L13.17 12 9.29 8.12c-.39-.39-.39-1.02 0-1.41.39-.39 1.02-.39 1.41 0l4.59 4.59c.39.39.39 1.02 0 1.41L10.7 17.3c-.39.39-1.02.39-1.41 0-.38-.39-.39-1.03 0-1.42z" + })), t("span", { + class: "duet-date__vhidden" + }, this.localization.nextMonthLabel)))), t(C, { + dateFormatter: this.dateFormatShort, + selectedDate: a, + focusedDate: this.focusedDay, + onDateSelect: this.handleDaySelect, + onKeyboardNavigation: this.handleKeyboardNavigation, + labelledById: this.dialogLabelId, + localization: this.localization, + firstDayOfWeek: this.firstDayOfWeek, + focusedDayRef: this.processFocusedDayNode, + min: s, + max: u, + isDateDisabled: this.isDateDisabled + }))))) + }; + Object.defineProperty(e.prototype, "element", { + get: function () { + return r(this) + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(e, "watchers", { + get: function () { + return { + localization: ["createDateFormatters"] + } + }, + enumerable: false, + configurable: true + }); + return e + }()); + E.style = N + } + } +})); \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/script/plugin/datapicker/duet.esm.js b/src/main/webapp/kofair_case_seed/script/plugin/datapicker/duet.esm.js new file mode 100644 index 00000000..ef72396f --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/datapicker/duet.esm.js @@ -0,0 +1,64 @@ +import { + p as e, + w as a, + d as t, + N as s, + a as i, + b as r +} from "./index-a3afd6e1.js"; +(() => { + e.t = a.__cssshim; + const r = Array.from(t.querySelectorAll("script")).find((e => new RegExp(`/${s}(\\.esm)?\\.js($|\\?|#)`).test(e.src) || e.getAttribute("data-stencil-namespace") === s)), + n = {}; + return n.resourcesUrl = new URL(".", new URL(r.getAttribute("data-resources-url") || r.src, a.location.href)).href, ((e, i) => { + const r = `__sc_import_${s.replace(/\s|-/g,"_")}`; + try { + a[r] = new Function("w", `return import(w);//${Math.random()}`) + } catch (s) { + const n = new Map; + a[r] = s => { + const o = new URL(s, e).href; + let c = n.get(o); + if (!c) { + const e = t.createElement("script"); + e.type = "module", e.crossOrigin = i.crossOrigin, e.src = URL.createObjectURL(new Blob([`import * as m from '${o}'; window.${r}.m = m;`], { + type: "application/javascript" + })), c = new Promise((t => { + e.onload = () => { + t(a[r].m), e.remove() + } + })), n.set(o, c), t.head.appendChild(e) + } + return c + } + } + })(n.resourcesUrl, r), a.customElements ? i(n) : __sc_import_duet("./dom-fb6a473e.js").then((() => n)) +})().then((e => r([ + ["duet-date-picker", [ + [0, "duet-date-picker", { + name: [1], + identifier: [1], + disabled: [516], + role: [1], + direction: [1], + required: [4], + value: [1537], + min: [1], + max: [1], + firstDayOfWeek: [2, "first-day-of-week"], + localization: [16], + dateAdapter: [16], + isDateDisabled: [16], + activeFocus: [32], + focusedDay: [32], + open: [32], + setFocus: [64], + show: [64], + hide: [64] + }, + [ + [6, "click", "handleDocumentClick"] + ] + ] + ]] +], e))); \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/script/plugin/datapicker/duet.js b/src/main/webapp/kofair_case_seed/script/plugin/datapicker/duet.js new file mode 100644 index 00000000..99b1650b --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/datapicker/duet.js @@ -0,0 +1,6862 @@ +'use strict'; +(function () { + var currentScript = document.currentScript; + + // Safari 10 support type="module" but still download and executes the nomodule script + if (!currentScript || !currentScript.hasAttribute('nomodule') || !('onbeforeload' in currentScript)) { + + /** + * core-js 3.6.5 + * https://github.com/zloirock/core-js + * License: http://rock.mit-license.org + * © 2019 Denis Pushkarev (zloirock.ru) + */ + ! function (t) { + "use strict"; + ! function (t) { + var n = {}; + + function e(r) { + if (n[r]) return n[r].exports; + var o = n[r] = { + i: r, + l: !1, + exports: {} + }; + return t[r].call(o.exports, o, o.exports, e), o.l = !0, o.exports + } + e.m = t, e.c = n, e.d = function (t, n, r) { + e.o(t, n) || Object.defineProperty(t, n, { + enumerable: !0, + get: r + }) + }, e.r = function (t) { + "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(t, Symbol.toStringTag, { + value: "Module" + }), Object.defineProperty(t, "__esModule", { + value: !0 + }) + }, e.t = function (t, n) { + if (1 & n && (t = e(t)), 8 & n) return t; + if (4 & n && "object" == typeof t && t && t.__esModule) return t; + var r = Object.create(null); + if (e.r(r), Object.defineProperty(r, "default", { + enumerable: !0, + value: t + }), 2 & n && "string" != typeof t) + for (var o in t) e.d(r, o, function (n) { + return t[n] + }.bind(null, o)); + return r + }, e.n = function (t) { + var n = t && t.__esModule ? function () { + return t.default + } : function () { + return t + }; + return e.d(n, "a", n), n + }, e.o = function (t, n) { + return Object.prototype.hasOwnProperty.call(t, n) + }, e.p = "", e(e.s = 0) + }([function (t, n, e) { + e(1), e(55), e(62), e(68), e(70), e(71), e(72), e(73), e(75), e(76), e(78), e(87), e(88), e(89), e(98), e(99), e(101), e(102), e(103), e(105), e(106), e(107), e(108), e(110), e(111), e(112), e(113), e(114), e(115), e(116), e(117), e(118), e(127), e(130), e(131), e(133), e(135), e(136), e(137), e(138), e(139), e(141), e(143), e(146), e(148), e(150), e(151), e(153), e(154), e(155), e(156), e(157), e(159), e(160), e(162), e(163), e(164), e(165), e(166), e(167), e(168), e(169), e(170), e(172), e(173), e(183), e(184), e(185), e(189), e(191), e(192), e(193), e(194), e(195), e(196), e(198), e(201), e(202), e(203), e(204), e(208), e(209), e(212), e(213), e(214), e(215), e(216), e(217), e(218), e(219), e(221), e(222), e(223), e(226), e(227), e(228), e(229), e(230), e(231), e(232), e(233), e(234), e(235), e(236), e(237), e(238), e(240), e(241), e(243), e(248), t.exports = e(246) + }, function (t, n, e) { + var r = e(2), + o = e(6), + i = e(45), + a = e(14), + u = e(46), + c = e(39), + f = e(47), + s = e(48), + l = e(52), + p = e(49), + h = e(53), + v = p("isConcatSpreadable"), + g = h >= 51 || !o((function () { + var t = []; + return t[v] = !1, t.concat()[0] !== t + })), + d = l("concat"), + y = function (t) { + if (!a(t)) return !1; + var n = t[v]; + return void 0 !== n ? !!n : i(t) + }; + r({ + target: "Array", + proto: !0, + forced: !g || !d + }, { + concat: function (t) { + var n, e, r, o, i, a = u(this), + l = s(a, 0), + p = 0; + for (n = -1, r = arguments.length; n < r; n++) + if (i = -1 === n ? a : arguments[n], y(i)) { + if (p + (o = c(i.length)) > 9007199254740991) throw TypeError("Maximum allowed index exceeded"); + for (e = 0; e < o; e++, p++) e in i && f(l, p, i[e]) + } else { + if (p >= 9007199254740991) throw TypeError("Maximum allowed index exceeded"); + f(l, p++, i) + } return l.length = p, l + } + }) + }, function (t, n, e) { + var r = e(3), + o = e(4).f, + i = e(18), + a = e(21), + u = e(22), + c = e(32), + f = e(44); + t.exports = function (t, n) { + var e, s, l, p, h, v = t.target, + g = t.global, + d = t.stat; + if (e = g ? r : d ? r[v] || u(v, {}) : (r[v] || {}).prototype) + for (s in n) { + if (p = n[s], l = t.noTargetGet ? (h = o(e, s)) && h.value : e[s], !f(g ? s : v + (d ? "." : "#") + s, t.forced) && void 0 !== l) { + if (typeof p == typeof l) continue; + c(p, l) + }(t.sham || l && l.sham) && i(p, "sham", !0), a(e, s, p, t) + } + } + }, function (t, n) { + var e = function (t) { + return t && t.Math == Math && t + }; + t.exports = e("object" == typeof globalThis && globalThis) || e("object" == typeof window && window) || e("object" == typeof self && self) || e("object" == typeof global && global) || Function("return this")() + }, function (t, n, e) { + var r = e(5), + o = e(7), + i = e(8), + a = e(9), + u = e(13), + c = e(15), + f = e(16), + s = Object.getOwnPropertyDescriptor; + n.f = r ? s : function (t, n) { + if (t = a(t), n = u(n, !0), f) try { + return s(t, n) + } catch (t) {} + if (c(t, n)) return i(!o.f.call(t, n), t[n]) + } + }, function (t, n, e) { + var r = e(6); + t.exports = !r((function () { + return 7 != Object.defineProperty({}, 1, { + get: function () { + return 7 + } + })[1] + })) + }, function (t, n) { + t.exports = function (t) { + try { + return !!t() + } catch (t) { + return !0 + } + } + }, function (t, n, e) { + var r = {}.propertyIsEnumerable, + o = Object.getOwnPropertyDescriptor, + i = o && !r.call({ + 1: 2 + }, 1); + n.f = i ? function (t) { + var n = o(this, t); + return !!n && n.enumerable + } : r + }, function (t, n) { + t.exports = function (t, n) { + return { + enumerable: !(1 & t), + configurable: !(2 & t), + writable: !(4 & t), + value: n + } + } + }, function (t, n, e) { + var r = e(10), + o = e(12); + t.exports = function (t) { + return r(o(t)) + } + }, function (t, n, e) { + var r = e(6), + o = e(11), + i = "".split; + t.exports = r((function () { + return !Object("z").propertyIsEnumerable(0) + })) ? function (t) { + return "String" == o(t) ? i.call(t, "") : Object(t) + } : Object + }, function (t, n) { + var e = {}.toString; + t.exports = function (t) { + return e.call(t).slice(8, -1) + } + }, function (t, n) { + t.exports = function (t) { + if (null == t) throw TypeError("Can't call method on " + t); + return t + } + }, function (t, n, e) { + var r = e(14); + t.exports = function (t, n) { + if (!r(t)) return t; + var e, o; + if (n && "function" == typeof (e = t.toString) && !r(o = e.call(t))) return o; + if ("function" == typeof (e = t.valueOf) && !r(o = e.call(t))) return o; + if (!n && "function" == typeof (e = t.toString) && !r(o = e.call(t))) return o; + throw TypeError("Can't convert object to primitive value") + } + }, function (t, n) { + t.exports = function (t) { + return "object" == typeof t ? null !== t : "function" == typeof t + } + }, function (t, n) { + var e = {}.hasOwnProperty; + t.exports = function (t, n) { + return e.call(t, n) + } + }, function (t, n, e) { + var r = e(5), + o = e(6), + i = e(17); + t.exports = !r && !o((function () { + return 7 != Object.defineProperty(i("div"), "a", { + get: function () { + return 7 + } + }).a + })) + }, function (t, n, e) { + var r = e(3), + o = e(14), + i = r.document, + a = o(i) && o(i.createElement); + t.exports = function (t) { + return a ? i.createElement(t) : {} + } + }, function (t, n, e) { + var r = e(5), + o = e(19), + i = e(8); + t.exports = r ? function (t, n, e) { + return o.f(t, n, i(1, e)) + } : function (t, n, e) { + return t[n] = e, t + } + }, function (t, n, e) { + var r = e(5), + o = e(16), + i = e(20), + a = e(13), + u = Object.defineProperty; + n.f = r ? u : function (t, n, e) { + if (i(t), n = a(n, !0), i(e), o) try { + return u(t, n, e) + } catch (t) {} + if ("get" in e || "set" in e) throw TypeError("Accessors not supported"); + return "value" in e && (t[n] = e.value), t + } + }, function (t, n, e) { + var r = e(14); + t.exports = function (t) { + if (!r(t)) throw TypeError(String(t) + " is not an object"); + return t + } + }, function (t, n, e) { + var r = e(3), + o = e(18), + i = e(15), + a = e(22), + u = e(23), + c = e(25), + f = c.get, + s = c.enforce, + l = String(String).split("String"); + (t.exports = function (t, n, e, u) { + var c = !!u && !!u.unsafe, + f = !!u && !!u.enumerable, + p = !!u && !!u.noTargetGet; + "function" == typeof e && ("string" != typeof n || i(e, "name") || o(e, "name", n), s(e).source = l.join("string" == typeof n ? n : "")), t !== r ? (c ? !p && t[n] && (f = !0) : delete t[n], f ? t[n] = e : o(t, n, e)) : f ? t[n] = e : a(n, e) + })(Function.prototype, "toString", (function () { + return "function" == typeof this && f(this).source || u(this) + })) + }, function (t, n, e) { + var r = e(3), + o = e(18); + t.exports = function (t, n) { + try { + o(r, t, n) + } catch (e) { + r[t] = n + } + return n + } + }, function (t, n, e) { + var r = e(24), + o = Function.toString; + "function" != typeof r.inspectSource && (r.inspectSource = function (t) { + return o.call(t) + }), t.exports = r.inspectSource + }, function (t, n, e) { + var r = e(3), + o = e(22), + i = r["__core-js_shared__"] || o("__core-js_shared__", {}); + t.exports = i + }, function (t, n, e) { + var r, o, i, a = e(26), + u = e(3), + c = e(14), + f = e(18), + s = e(15), + l = e(27), + p = e(31), + h = u.WeakMap; + if (a) { + var v = new h, + g = v.get, + d = v.has, + y = v.set; + r = function (t, n) { + return y.call(v, t, n), n + }, o = function (t) { + return g.call(v, t) || {} + }, i = function (t) { + return d.call(v, t) + } + } else { + var x = l("state"); + p[x] = !0, r = function (t, n) { + return f(t, x, n), n + }, o = function (t) { + return s(t, x) ? t[x] : {} + }, i = function (t) { + return s(t, x) + } + } + t.exports = { + set: r, + get: o, + has: i, + enforce: function (t) { + return i(t) ? o(t) : r(t, {}) + }, + getterFor: function (t) { + return function (n) { + var e; + if (!c(n) || (e = o(n)).type !== t) throw TypeError("Incompatible receiver, " + t + " required"); + return e + } + } + } + }, function (t, n, e) { + var r = e(3), + o = e(23), + i = r.WeakMap; + t.exports = "function" == typeof i && /native code/.test(o(i)) + }, function (t, n, e) { + var r = e(28), + o = e(30), + i = r("keys"); + t.exports = function (t) { + return i[t] || (i[t] = o(t)) + } + }, function (t, n, e) { + var r = e(29), + o = e(24); + (t.exports = function (t, n) { + return o[t] || (o[t] = void 0 !== n ? n : {}) + })("versions", []).push({ + version: "3.6.5", + mode: r ? "pure" : "global", + copyright: "© 2020 Denis Pushkarev (zloirock.ru)" + }) + }, function (t, n) { + t.exports = !1 + }, function (t, n) { + var e = 0, + r = Math.random(); + t.exports = function (t) { + return "Symbol(" + String(void 0 === t ? "" : t) + ")_" + (++e + r).toString(36) + } + }, function (t, n) { + t.exports = {} + }, function (t, n, e) { + var r = e(15), + o = e(33), + i = e(4), + a = e(19); + t.exports = function (t, n) { + for (var e = o(n), u = a.f, c = i.f, f = 0; f < e.length; f++) { + var s = e[f]; + r(t, s) || u(t, s, c(n, s)) + } + } + }, function (t, n, e) { + var r = e(34), + o = e(36), + i = e(43), + a = e(20); + t.exports = r("Reflect", "ownKeys") || function (t) { + var n = o.f(a(t)), + e = i.f; + return e ? n.concat(e(t)) : n + } + }, function (t, n, e) { + var r = e(35), + o = e(3), + i = function (t) { + return "function" == typeof t ? t : void 0 + }; + t.exports = function (t, n) { + return arguments.length < 2 ? i(r[t]) || i(o[t]) : r[t] && r[t][n] || o[t] && o[t][n] + } + }, function (t, n, e) { + var r = e(3); + t.exports = r + }, function (t, n, e) { + var r = e(37), + o = e(42).concat("length", "prototype"); + n.f = Object.getOwnPropertyNames || function (t) { + return r(t, o) + } + }, function (t, n, e) { + var r = e(15), + o = e(9), + i = e(38).indexOf, + a = e(31); + t.exports = function (t, n) { + var e, u = o(t), + c = 0, + f = []; + for (e in u) !r(a, e) && r(u, e) && f.push(e); + for (; n.length > c;) r(u, e = n[c++]) && (~i(f, e) || f.push(e)); + return f + } + }, function (t, n, e) { + var r = e(9), + o = e(39), + i = e(41), + a = function (t) { + return function (n, e, a) { + var u, c = r(n), + f = o(c.length), + s = i(a, f); + if (t && e != e) { + for (; f > s;) + if ((u = c[s++]) != u) return !0 + } else + for (; f > s; s++) + if ((t || s in c) && c[s] === e) return t || s || 0; + return !t && -1 + } + }; + t.exports = { + includes: a(!0), + indexOf: a(!1) + } + }, function (t, n, e) { + var r = e(40), + o = Math.min; + t.exports = function (t) { + return t > 0 ? o(r(t), 9007199254740991) : 0 + } + }, function (t, n) { + var e = Math.ceil, + r = Math.floor; + t.exports = function (t) { + return isNaN(t = +t) ? 0 : (t > 0 ? r : e)(t) + } + }, function (t, n, e) { + var r = e(40), + o = Math.max, + i = Math.min; + t.exports = function (t, n) { + var e = r(t); + return e < 0 ? o(e + n, 0) : i(e, n) + } + }, function (t, n) { + t.exports = ["constructor", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "toLocaleString", "toString", "valueOf"] + }, function (t, n) { + n.f = Object.getOwnPropertySymbols + }, function (t, n, e) { + var r = e(6), + o = /#|\.prototype\./, + i = function (t, n) { + var e = u[a(t)]; + return e == f || e != c && ("function" == typeof n ? r(n) : !!n) + }, + a = i.normalize = function (t) { + return String(t).replace(o, ".").toLowerCase() + }, + u = i.data = {}, + c = i.NATIVE = "N", + f = i.POLYFILL = "P"; + t.exports = i + }, function (t, n, e) { + var r = e(11); + t.exports = Array.isArray || function (t) { + return "Array" == r(t) + } + }, function (t, n, e) { + var r = e(12); + t.exports = function (t) { + return Object(r(t)) + } + }, function (t, n, e) { + var r = e(13), + o = e(19), + i = e(8); + t.exports = function (t, n, e) { + var a = r(n); + a in t ? o.f(t, a, i(0, e)) : t[a] = e + } + }, function (t, n, e) { + var r = e(14), + o = e(45), + i = e(49)("species"); + t.exports = function (t, n) { + var e; + return o(t) && ("function" != typeof (e = t.constructor) || e !== Array && !o(e.prototype) ? r(e) && null === (e = e[i]) && (e = void 0) : e = void 0), new(void 0 === e ? Array : e)(0 === n ? 0 : n) + } + }, function (t, n, e) { + var r = e(3), + o = e(28), + i = e(15), + a = e(30), + u = e(50), + c = e(51), + f = o("wks"), + s = r.Symbol, + l = c ? s : s && s.withoutSetter || a; + t.exports = function (t) { + return i(f, t) || (u && i(s, t) ? f[t] = s[t] : f[t] = l("Symbol." + t)), f[t] + } + }, function (t, n, e) { + var r = e(6); + t.exports = !!Object.getOwnPropertySymbols && !r((function () { + return !String(Symbol()) + })) + }, function (t, n, e) { + var r = e(50); + t.exports = r && !Symbol.sham && "symbol" == typeof Symbol.iterator + }, function (t, n, e) { + var r = e(6), + o = e(49), + i = e(53), + a = o("species"); + t.exports = function (t) { + return i >= 51 || !r((function () { + var n = []; + return (n.constructor = {})[a] = function () { + return { + foo: 1 + } + }, 1 !== n[t](Boolean).foo + })) + } + }, function (t, n, e) { + var r, o, i = e(3), + a = e(54), + u = i.process, + c = u && u.versions, + f = c && c.v8; + f ? o = (r = f.split("."))[0] + r[1] : a && (!(r = a.match(/Edge\/(\d+)/)) || r[1] >= 74) && (r = a.match(/Chrome\/(\d+)/)) && (o = r[1]), t.exports = o && +o + }, function (t, n, e) { + var r = e(34); + t.exports = r("navigator", "userAgent") || "" + }, function (t, n, e) { + var r = e(2), + o = e(56), + i = e(57); + r({ + target: "Array", + proto: !0 + }, { + copyWithin: o + }), i("copyWithin") + }, function (t, n, e) { + var r = e(46), + o = e(41), + i = e(39), + a = Math.min; + t.exports = [].copyWithin || function (t, n) { + var e = r(this), + u = i(e.length), + c = o(t, u), + f = o(n, u), + s = arguments.length > 2 ? arguments[2] : void 0, + l = a((void 0 === s ? u : o(s, u)) - f, u - c), + p = 1; + for (f < c && c < f + l && (p = -1, f += l - 1, c += l - 1); l-- > 0;) f in e ? e[c] = e[f] : delete e[c], c += p, f += p; + return e + } + }, function (t, n, e) { + var r = e(49), + o = e(58), + i = e(19), + a = r("unscopables"), + u = Array.prototype; + null == u[a] && i.f(u, a, { + configurable: !0, + value: o(null) + }), t.exports = function (t) { + u[a][t] = !0 + } + }, function (t, n, e) { + var r, o = e(20), + i = e(59), + a = e(42), + u = e(31), + c = e(61), + f = e(17), + s = e(27), + l = s("IE_PROTO"), + p = function () {}, + h = function (t) { + return " + + + + + + + + + +
+ +
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.eslintignore b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.eslintignore new file mode 100644 index 00000000..6c8ffc31 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.eslintignore @@ -0,0 +1,7 @@ +node_modules +custom-element +dist +www + +hydrate/index.js +hydrate/index.d.ts diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.github/ISSUE_TEMPLATE/bug_report.md b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..dd84ea78 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.github/ISSUE_TEMPLATE/feature_request.md b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..bbcbbe7d --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.github/workflows/test.yml b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.github/workflows/test.yml new file mode 100644 index 00000000..141c4fe2 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.github/workflows/test.yml @@ -0,0 +1,26 @@ +name: CI + +on: [push] + +jobs: + test: + name: Test on Node.js 12 running on macOS-latest + runs-on: macOS-latest + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: 12 + registry-url: https://registry.npmjs.org + + - name: Install dependencies + run: npm install + + - name: Build project + run: npm run build + + - name: Run tests + run: npm test + + - name: Run hydrate tests + run: cd hydrate/tests && npm install && npm test diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.gitignore b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.gitignore new file mode 100644 index 00000000..7dd8a750 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.gitignore @@ -0,0 +1,33 @@ +node_modules +**/node_modules/* +lerna-debug.log +npm-debug.log +yarn-error.log +.idea +.eslintcache +.DS_Store +.vscode +.stencil +.stats +package-lock.json +www +__diff_output__ +src/components.d.ts +dist/* +hydrate/* +custom-element/* + +!hydrate/tests/test.js +!hydrate/tests/setup.js +!hydrate/tests/package.js +!hydrate/tests/.npmrc +!hydrate/tests/fixtures +!hydrate/tests/__image_snapshots__ +!hydrate/tests/.gitignore +!hydrate/package.json + +*.suo +*.ntvs* +*.njsproj +*.sln +*.vsix \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.npmrc b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.npmrc new file mode 100644 index 00000000..9cf94950 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.npmrc @@ -0,0 +1 @@ +package-lock=false \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.prettierignore b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.prettierignore new file mode 100644 index 00000000..b9c43c04 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.prettierignore @@ -0,0 +1,11 @@ +node_modules +custom-element +dist +www + +package.json +package-lock.json + +*.md + +src/components.d.ts \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.prettierrc b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.prettierrc new file mode 100644 index 00000000..a8682342 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.prettierrc @@ -0,0 +1,14 @@ +{ + "printWidth": 120, + "singleQuote": false, + "trailingComma": "es5", + "bracketSpacing": true, + "jsxBracketSameLine": false, + "semi": false, + "requirePragma": false, + "insertPragma": false, + "useTabs": false, + "tabWidth": 2, + "arrowParens": "avoid", + "proseWrap": "preserve" +} diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.sasslintrc.json b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.sasslintrc.json new file mode 100644 index 00000000..308da3e6 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/.sasslintrc.json @@ -0,0 +1,43 @@ +{ + "files": { + "include": "./src/components/duet-date-picker/*.scss", + "ignore": ["dist/**/*", "www/**/*", "node_modules/**"] + }, + "rules": { + "property-sort-order": [ + 1, + { + "order": "alphabetical" + } + ], + "class-name-format": [ + 1, + { + "convention": "strictbem" + } + ], + "no-vendor-prefixes": 0, + "no-color-literals": 0, + "nesting-depth": [ + 1, + { + "max-depth": 2 + } + ], + "no-qualifying-elements": [ + 1, + { + "allow-element-with-attribute": true + } + ], + "force-pseudo-nesting": 0, + "mixins-before-declarations": 1, + "leading-zero": 0, + "quotes": [ + 1, + { + "style": "double" + } + ] + } +} diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/CODE_OF_CONDUCT.md b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..ae5155da --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at duetdesignsystem@lahitapiola.fi. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/LICENSE b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/LICENSE new file mode 100644 index 00000000..bf9c830f --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 LocalTapiola Services Ltd / Duet Design System + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/README.md b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/README.md new file mode 100644 index 00000000..43f2bea4 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/README.md @@ -0,0 +1,728 @@ +![CI Status](https://github.com/duetds/duet-date-picker-prep/workflows/CI/badge.svg) [![NPM Version](https://img.shields.io/npm/v/@duetds/date-picker.svg)](https://www.npmjs.com/package/@duetds/date-picker) ![MIT License](https://img.shields.io/badge/license-MIT-blue.svg) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) + +# Duet Date Picker + +Duet Date Picker is an open source version of Duet Design System’s [accessible date picker](https://www.duetds.com/components/date-picker/). Duet Date Picker can be implemented and used across any JavaScript framework or no framework at all. We accomplish this by using standardized web platform APIs and Web Components. + +Why yet another date picker? Our team working on [Duet Design System](https://www.duetds.com/) couldn’t find an existing date picker that would’ve ticked all the requirements we had for accessibility _(supporting WCAG 2.1 as well as we can),_ so we decided to build one and open source it so that others could benefit from this work as well. + +Duet Date Picker comes with built-in functionality that allows you to set a minimum and a maximum allowed date. These settings can be combined or used alone, depending on the need. Please note that the date values must be passed in IS0-8601 format: `YYYY-MM-DD`. + +**[Read getting started instructions ›](#getting-started)** +
+**[Learn more about Duet ›](https://www.duetds.com)** + +![Duet Date Picker](illustration.png) + +## Live demo + +- [https://duetds.github.io/date-picker/](https://duetds.github.io/date-picker/) + +## Features + +- Can be used with any JavaScript framework. +- No external dependencies. +- Weighs only ~10kb minified and Gzip’ed (this includes all styles and icons). +- Built with accessibility in mind. +- Supports all modern browsers and screen readers. +- Additionally, limited support offered for IE11 and Edge 17+. +- Allows theming using CSS Custom Properties. +- Support for localization. +- Customizable date parsing and formatting. +- Support for changing the first day of the week. +- Comes with modified interface for mobile devices to provide better user experience. +- Supports touch gestures for changing months and closing the picker. +- Built using [Stencil.js](https://stenciljs.com/) and Web Components. +- Free to use under the MIT license. + +## Browser support + +- Google Chrome 61+ +- Apple Safari 10+ +- Firefox 63+ +- Microsoft Edge 17+ +- Opera 63+ +- Samsung Browser 8.2+ +- Internet Explorer 11 + +## Screen Reader support + +We offer support for the following screen readers. For more information about the level of support and possible issues with the implementation, please refer to the included [accessibility audit](https://github.com/duetds/date-picker/blob/master/accessibility-audit.pdf). + +- VoiceOver on macOS and iOS +- TalkBack on Android +- NVDA on Windows +- Jaws on Windows + +## Keyboard support + +Duet Date Picker’s keyboard support is built to closely follow [W3C Date Picker Dialog example](https://www.w3.org/TR/wai-aria-practices/examples/dialog-modal/datepicker-dialog.html) with some small exceptions to e.g. better support iOS VoiceOver and Android TalkBack. + +### Choose date button + +- `Space, Enter`: Opens the date picker dialog and moves focus to the first select menu in the dialog. + +### Date picker dialog + +- `Esc`: Closes the date picker dialog and moves focus back to the “choose date” button. +- `Tab`: Moves focus to the next element in the dialog. Please note since the calendar uses `role="grid"`, only one button in the calendar grid is in the tab sequence. Additionally, if focus is on the last focusable element, focus is next moved back to the first focusable element inside the date picker dialog. +- `Shift + Tab`: Same as above, but in reverse order. + +### Date picker dialog: Month/year buttons + +- `Space, Enter`: Changes the month and/or year displayed. + +### Date picker dialog: Date grid + +- `Space, Enter`: Selects a date, closes the dialog, and moves focus back to the “Choose Date” button. Additionally updates the value of the Duet Date Picker input with the selected date, and adds selected date to “Choose Date” button label. +- `Arrow up`: Moves focus to the same day of the previous week. +- `Arrow down`: Moves focus to the same day of the next week. +- `Arrow right`: Moves focus to the next day. +- `Arrow left`: Moves focus to the previous day. +- `Home`: Moves focus to the first day (e.g Monday) of the current week. +- `End`: Moves focus to the last day (e.g. Sunday) of the current week. +- `Page Up`: Changes the grid of dates to the previous month and sets focus on the same day of the same week. +- `Shift + Page Up`: Changes the grid of dates to the previous year and sets focus on the same day of the same week. +- `Page Down`: Changes the grid of dates to the next month and sets focus on the same day of the same week. +- `Shift + Page Down`: Changes the grid of dates to the next year and sets focus on the same day of the same week. + +### Date picker dialog: Close button + +- `Space, Enter`: Closes the dialog, moves focus to “choose date” button, but does not update the date in input. + +## Getting started + +Integrating Duet Date Picker to a project without a JavaScript framework is very straight forward. If you’re working on a simple HTML page, you can start using Duet Date Picker immediately by adding these tags to the ``: + +```html + + + +``` + +Once included, Duet Date Picker can be used in your markup like any other regular HTML element: + +```html + + +``` + +**Please note: Importing the CSS file is optional and only needed if you’re planning on using the default theme. See [theming section](#theming) for more information. Additionally, while the above method is the easiest and fastest way to get started, you can also install Duet Date Picker via NPM. Scroll down for the [installation instructions](#installation).** + +## Properties + +| Property | Attribute | Description | Type | Default | +| ---------------- | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------- | +| `dateAdapter` | -- | Date adapter, for custom parsing/formatting. Must be object with a `parse` function which accepts a `string` and returns a `Date`, and a `format` function which accepts a `Date` and returns a `string`. Default is IS0-8601 parsing and formatting. | `DuetDateAdapter` | `isoAdapter` | +| `direction` | `direction` | Forces the opening direction of the calendar modal to be always left or right. This setting can be useful when the input is smaller than the opening date picker would be as by default the picker always opens towards right. | `"left" \| "right"` | `"right"` | +| `disabled` | `disabled` | Makes the date picker input component disabled. This prevents users from being able to interact with the input, and conveys its inactive state to assistive technologies. | `boolean` | `false` | +| `firstDayOfWeek` | `first-day-of-week` | Which day is considered first day of the week? `0` for Sunday, `1` for Monday, etc. Default is Monday. | `DaysOfWeek.Friday \| DaysOfWeek.Monday \| DaysOfWeek.Saturday \| DaysOfWeek.Sunday \| DaysOfWeek.Thursday \| DaysOfWeek.Tuesday \| DaysOfWeek.Wednesday` | `DaysOfWeek.Monday` | +| `identifier` | `identifier` | Adds a unique identifier for the date picker input. Use this instead of html `id` attribute. | `string` | `""` | +| `localization` | -- | Button labels, day names, month names, etc, used for localization. Default is English. | `{ buttonLabel: string; placeholder: string; selectedDateMessage: string; prevMonthLabel: string; nextMonthLabel: string; monthSelectLabel: string; yearSelectLabel: string; closeLabel: string; calendarHeading: string; dayNames: DayNames; monthNames: MonthsNames; monthNamesShort: MonthsNames; }` | `defaultLocalization` | +| `max` | `max` | Maximum date allowed to be picked. Must be in IS0-8601 format: YYYY-MM-DD. This setting can be used alone or together with the min property. | `string` | `""` | +| `min` | `min` | Minimum date allowed to be picked. Must be in IS0-8601 format: YYYY-MM-DD. This setting can be used alone or together with the max property. | `string` | `""` | +| `name` | `name` | Name of the date picker input. | `string` | `"date"` | +| `role` | `role` | Defines a specific role attribute for the date picker input. | `string` | `undefined` | +| `required` | `required` | Should the input be marked as required? | `boolean` | `false` | +| `value` | `value` | Date value. Must be in IS0-8601 format: YYYY-MM-DD. | `string` | `""` | + +## Events + +| Event | Description | Type | +| ------------ | ----------------------------------------------- | ----------------------------------------------------------------------------------- | +| `duetBlur` | Event emitted the date picker input is blurred. | `CustomEvent<{ component: "duet-date-picker"; }>` | +| `duetChange` | Event emitted when a date is selected. | `CustomEvent<{ component: "duet-date-picker"; valueAsDate: Date; value: string; }>` | +| `duetFocus` | Event emitted the date picker input is focused. | `CustomEvent<{ component: "duet-date-picker"; }>` | +| `duetOpen` | Event emitted when the date picker modal is opened. | `CustomEvent<{ component: "duet-date-picker"; }>` | +| `duetClose` | Event emitted the date picker modal is closed. | `CustomEvent<{ component: "duet-date-picker"; }>` | + +## Methods + +### `hide(moveFocusToButton?: boolean) => Promise` + +Hide the calendar modal. Set `moveFocusToButton` to false to prevent focus +returning to the date picker's button. Default is true. + +#### Returns + +Type: `Promise` + +### `setFocus() => Promise` + +Sets focus on the date picker's input. Use this method instead of the global `focus()`. + +#### Returns + +Type: `Promise` + +### `show() => Promise` + +Show the calendar modal, moving focus to the calendar inside. + +#### Returns + +Type: `Promise` + +## Installation + +Before moving further, please make sure you have [Node.js](https://nodejs.org/en/) installed on your machine. You can install the latest version through [their website](https://nodejs.org/en/). If you’re planning on using Duet Date Picker in a project that doesn’t yet use [Node Package Manager](https://www.npmjs.com), you’ll have to first create a [package.json](https://docs.npmjs.com/files/package.json) file. To do so, run npm init and follow the steps provided. + +Once finished, you can install Duet Date Picker by running: + +```shell +# WEB COMPONENT for HTML, Ember, Vue.js, React, Angular and Vanilla JS: +npm install @duetds/date-picker +``` + +## Usage with basic HTML + +**Please note: We recommend the usage of CDN like JSDelivr over the below approach if you’re not [server side rendering](#server-side-rendering) Duet Date Picker. See [getting started section](#getting-started) to find the correct script tags.** + +Once you’ve installed `@duetds/date-picker` package into your project, it’s recommended to create a copy task that copies Duet Date Picker component from `node_modules` to a location you’ve specified. One such tool that can do this is [NCP](https://www.npmjs.com/package/ncp). You can install `ncp` by running: + +```shell +npm install ncp --save-dev +``` + +Once installed, add a script to your package.json that copies the component library from Duet’s package into a location you’ve specified: + +```json +"scripts": { + "copy:duet-date-picker": "ncp node_modules/@duetds/date-picker/dist src/SPECIFY_PATH" +} +``` + +You can call this script while starting up your app to make sure you’ve always got the latest code copied over. If you’re using an UNIX-like environment, you can use `&` as the separator: + +```json +"start": "copy:duet-date-picker & dev" +``` + +Otherwise, if you need a cross-platform solution, use [npm-run-all module](https://www.npmjs.com/package/npm-run-all): + +```json +"start": "npm-run-all copy:duet-date-picker dev" +``` + +Once you have a copy task in place and have copied Duet Date Picker over, you can put tags similar to these in the `` of your `index.html` (importing the CSS file is optional and only needed if you’re planning on using the default theme. See [theming section](#theming) for more information): + +```html + + + +``` + +Once included, Duet Date Picker can be used in your basic HTML markup as in the following example: + +```html + + +``` + +To know when this tag name becomes defined, you can use `window.customElements.whenDefined()`. It returns a Promise that resolves when the element becomes defined: + +```js +customElements.whenDefined("duet-date-picker").then(() => { + document.querySelector("duet-date-picker").show() +}); +``` + +## Usage with Angular + +Before you can use Duet Date Picker in Angular, you must import and add Angular’s `CUSTOM_ELEMENTS_SCHEMA`. This allows the use of Web Components in HTML markup, without the compiler producing errors. The `CUSTOM_ELEMENTS_SCHEMA` needs to be included in any module that uses custom elements. Typically, this can be added to `AppModule`: + +```js +// ... +// Import custom elements schema +import { CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; + +@NgModule({ + // ... + // Add custom elements schema to NgModule + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class AppModule { } +``` + +The final step is to load and register Duet Date Picker in the browser. `@duetds/date-picker` includes a main function that handles this. That function is called `defineCustomElements()` and it needs to be called once during the bootstrapping of your application. One convenient place to do this is in `main.ts` as such: + +```js +// Import Duet Date Picker +import { defineCustomElements } from "@duetds/date-picker/dist/loader"; +// ... +// Register Duet Date Picker +defineCustomElements(window); +``` + +Once included, Duet Date Picker can be used in your HTML markup as in the following example: + +```html + + +``` + +Please note that you need to also import `duet.css` separately if you want to use the default theme. See [theming section](#theming) for more information. + +### Accessing using ViewChild and ViewChildren + +Once included, components could also be referenced in your code using `ViewChild` and `ViewChildren` as shown in the [Stencil.js documentation](https://stenciljs.com/docs/angular). + +## Usage with Vue.js + +To integrate `@duetds/date-picker` into a [Vue.js application](https://vuejs.org/), edit `src/main.js` to include: + +```js +// Import Duet Date Picker +import { defineCustomElements } from "@duetds/date-picker/dist/loader"; + +// ... +// configure Vue.js to ignore Duet Date Picker +Vue.config.ignoredElements = [/duet-\w*/]; + +// Register Duet Date Picker +defineCustomElements(window); + +new Vue({ + render: h => h(App) +}).$mount("#app"); +``` + +Once included, Duet Date Picker can be used in your HTML markup as in the following example: + +```html + + + +``` + +Please note that you need to also import `duet.css` separately if you want to use the default theme. See [theming section](#theming) for more information. + +Please also note that in order to use duet-date-picker's own custom properties (as seen on the properties section), vue must recognise that such options are being passed down as properties rather than attributes, hence the `.prop` at the end. + +## Usage with React + +With an application built using the `create-react-app` script the easiest way to include Duet Date Picker is to call `defineCustomElements(window)` from the `index.js` file: + +```js +// Import Duet Date Picker +import { defineCustomElements } from "@duetds/date-picker/dist/loader"; + +// ... +// Register Duet Date Picker +defineCustomElements(window); +``` + +Then you can create a thin React wrapper component to handle listening for events, cleanup, passing properties etc: + +```js +import React, { useEffect, useRef } from "react"; + +function useListener(ref, eventName, handler) { + useEffect(() => { + if (ref.current) { + const element = ref.current; + element.addEventListener(eventName, handler) + return () => element.removeEventListener(eventName, handler) + } + }, [eventName, handler, ref]) +} + +export function DatePicker({ + onChange, + onFocus, + onBlur, + onOpen, + onClose, + dateAdapter, + localization, + ...props +}) { + const ref = useRef(null) + + useListener(ref, "duetChange", onChange) + useListener(ref, "duetFocus", onFocus) + useListener(ref, "duetBlur", onBlur) + useListener(ref, "duetOpen", onOpen) + useListener(ref, "duetClose", onClose) + + useEffect(() => { + ref.current.localization = localization + ref.current.dateAdapter = dateAdapter + }, [localization, dateAdapter]) + + return +} +``` + +Then the wrapper can be used like any other React component: + +```js + console.log(e.detail)} +/> +``` + +Please note that you need to also import `duet.css` separately if you want to use the default theme. See [theming section](#theming) for more information. + +## Usage with Ember + +Duet Date Picker can be easily integrated into Ember thanks to the `ember-cli-stencil` addon that handles: + +- Importing the required files into your `vendor.js` +- Copying the component definitions into your `assets` directory +- Optionally generating a wrapper component for improved compatibility with older Ember versions + +Start by installing the Ember addon: + +```shell +ember install ember-cli-stencil ember-auto-import +``` + +When you build your application, Stencil collections in your dependencies will be automatically discovered and pulled into your application. You might get a ```Can't resolve``` error when building. The easiest way to resolve that issue is by adding an alias to your ```ember-cli-build.js``` file. + +```js + autoImport: { + alias: { + '@duetds/date-picker/loader': '@duetds/date-picker/dist/loader/index.cjs', + }, + }, +``` + For more information, see [ember-cli-stencil documentation](https://github.com/alexlafroscia/ember-cli-stencil). + +Ember octane example: + +```html + + +``` + +```js +import Controller from "@ember/controller"; +import { action } from "@ember/object"; +import { tracked } from "@glimmer/tracking"; + +export default class ExampleController extends Controller { + @tracked localization = { + buttonLabel: "Choose date", + placeholder: "mm/dd/yyyy", + selectedDateMessage: "Selected date is", + prevMonthLabel: "Previous month", + nextMonthLabel: "Next month", + monthSelectLabel: "Month", + yearSelectLabel: "Year", + closeLabel: "Close window", + calendarHeading: "Choose a date", + dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + monthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + }; +} +``` + + +## IE11 and Edge 17/18 polyfills + +If you want the Duet Date Picker custom element to work on older browser, you need to add the `applyPolyfills()` that surround the `defineCustomElements()` function: + +```js +import { applyPolyfills, defineCustomElements } from "@duetds/date-picker/lib/loader"; +// ... +applyPolyfills().then(() => { + defineCustomElements(window) +}) +``` + +## Using events + +We encourage the use of DOM events, but additionally provide custom events to make handling of certain event types easier. All custom events are documented in this same readme [under the “Events” heading](#events). + +Duet Date Picker provides e.g. a custom event called `duetChange`. This custom event includes an object called `detail` which includes for example the selected date: + +```js +// Select the date picker component +const date = document.querySelector("duet-date-picker") + +// Listen for when date is selected +date.addEventListener("duetChange", function(e) { + console.log("selected date", e.detail.valueAsDate) +}) +``` + +The console output for the above code looks like this: + +```shell +selected date Sat Aug 15 2020 00:00:00 GMT+0300 (Eastern European Summer Time) +``` + +## Theming + +Duet Date Picker uses CSS Custom Properties to make it easy to theme the picker. The component ships with a default theme that you can import either from the NPM package or directly from a CDN like JSDelivr: + +```html + +``` + +The above CSS file provides the following Custom Properties that you can override with your own properties: + +```css +:root { + --duet-color-primary: #005fcc; + --duet-color-text: #333; + --duet-color-text-active: #fff; + --duet-color-placeholder: #666; + --duet-color-button: #f5f5f5; + --duet-color-surface: #fff; + --duet-color-overlay: rgba(0, 0, 0, 0.8); + --duet-color-border: #333; + + --duet-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + --duet-font-normal: 400; + --duet-font-bold: 600; + + --duet-radius: 4px; + --duet-z-index: 600; +} + +``` + +If you wish to customize any of the default properties shown above, *we recommend to NOT import or link to the provided CSS,* but instead copying the above code into your own stylesheet and replacing the values used there. + +Additionally, you’re able to override Duet Date Picker’s default styles by using e.g. `.duet-date__input` selector in your own stylesheet. This allows you to give the form input and e.g. date picker toggle button a visual look that matches the rest of your website. + +## Localization + +Duet Date Picker offers full support for localization. This includes the text labels and date formats used. Below is an example of a date picker that is using Finnish date format and localization. + +```html + + + + +``` + +Please note that you must provide the entirety of the localization properties in the object when overriding with your custom localization. + +## Control which days are selectable + +Duet Date Picker allows you to disable the selection of specific days. Below is an example of a date picker that is disabling weekends. + +Be aware, this only disables selection of dates in the popup calendar. You must still handle the case where a user manually enters a disallowed date into the input. + +```html + + + + +``` + +## Server side rendering + +Duet Date Picker package includes a hydrate app that is a bundle of the same components, but compiled so that they can be hydrated on a NodeJS server and generate static HTML and CSS. To get started, import the hydrate app into your server’s code like so: + +```js +import hydrate from "@duetds/date-picker/hydrate" +``` + +If you are using for example [Eleventy](https://www.11ty.dev/), you could now add a transform into `.eleventy.js` configuration file that takes content as an input and processes it using Duet’s hydrate app: + +```js +eleventyConfig.addTransform("hydrate", async(content, outputPath) => { + if (process.env.ELEVENTY_ENV == "production") { + if (outputPath.endsWith(".html")) { + try { + const results = await hydrate.renderToString(content, { + clientHydrateAnnotations: true, + removeScripts: false, + removeUnusedStyles: false + }) + return results.html + } catch (error) { + return error + } + } + } + return content +}) +``` + +The above transform gives you server side rendered components that function without JavaScript. Please note that you need to separately pre-render the content for each theme you want to support. + +## Single file bundle + +Duet Date Picker also offers a single file bundle without the polyfills and other additional functionality included in the default output. To import that instead of the default output, use: + +```jsx +import { DuetDatePicker } from "@duetds/date-picker/custom-element"; + +customElements.define("duet-date-picker", DuetDatePicker); +``` + +Please note that this custom-element output does not automatically define the custom elements or apply any polyfills which is why we’re defining the custom element above ourselves. + +For more details, please see [Stencil.js documentation](https://stenciljs.com/docs/custom-elements). + +## Optimizing CDN performance + +If you wish to make sure Duet Date Picker shows up as quickly as possible when loading the scripts from JSDelivr CDN, you can preload the key parts using link `rel="preload"`. To do this, add these tags in the `` of your webpage before any other ` + + + + + + + + +
+

Duet Date Picker

+

+ Duet Date Picker is an open source version of + Duet Design System’s accessible date picker. It can be implemented and used + across any JavaScript framework or no framework at all. +

+ +

+ + For documentation, please see the + GitHub repository. + +

+ + + + +

Default

+ + +
<label for="date">Choose a date</label>
+<duet-date-picker identifier="date"></duet-date-picker>
+ +

Using show() method

+ + + + +
<label for="date">Choose a date</label>
+<duet-date-picker identifier="date"></duet-date-picker>
+<button type="button">Show date picker</button>
+
+<script>
+  const button = document.querySelector("button")
+
+  button.addEventListener("click", function() {
+    document.querySelector("duet-date-picker").show()
+  });
+</script>
+ +

Using setFocus() method

+ + + + +
<label for="date">Choose a date</label>
+<duet-date-picker identifier="date"></duet-date-picker>
+<button type="button">Focus date picker</button>
+
+<script>
+  const button = document.querySelector("button")
+
+  button.addEventListener("click", function() {
+    document.querySelector("duet-date-picker").setFocus()
+  });
+</script>
+ +

Getting selected value

+ + + undefined + +
<label for="date">Choose a date</label>
+<duet-date-picker identifier="date"></duet-date-picker>
+<output>undefined</output>
+
+<script>
+  const picker = document.querySelector("duet-date-picker")
+  const output = document.querySelector("output")
+
+  picker.addEventListener("duetChange", function(event) {
+    output.innerHTML = event.detail.valueAsDate
+  });
+</script>
+ +

Predefined value

+ + +
<label for="date">Choose a date</label>
+<duet-date-picker identifier="date" value="2020-06-16">
+</duet-date-picker>
+ +

Minimum and maximum date

+ + +
<label for="date">Choose a date</label>
+<duet-date-picker identifier="date" min="1990-06-10"
+  max="2020-07-18" value="2020-06-16">
+</duet-date-picker>
+ +

Localization

+ + + +
<label for="date">Valitse päivämäärä</label>
+<duet-date-picker identifier="date"></duet-date-picker>
+
+<script>
+  const picker = document.querySelector("duet-date-picker")
+  const DATE_FORMAT = /^(\d{1,2})\.(\d{1,2})\.(\d{4})$/
+
+  picker.dateAdapter = {
+    parse(value = "", createDate) {
+      const matches = value.match(DATE_FORMAT)
+      if (matches) {
+        return createDate(matches[3], matches[2], matches[1])
+      }
+    },
+    format(date) {
+      return `${date.getDate()}.${date.getMonth() + 1}.${date.getFullYear()}`
+    },
+  }
+
+  picker.localization = {
+    buttonLabel: "Valitse päivämäärä",
+    placeholder: "pp.kk.vvvv",
+    selectedDateMessage: "Valittu päivämäärä on",
+    prevMonthLabel: "Edellinen kuukausi",
+    nextMonthLabel: "Seuraava kuukausi",
+    monthSelectLabel: "Kuukausi",
+    yearSelectLabel: "Vuosi",
+    closeLabel: "Sulje ikkuna",
+    calendarHeading: "Valitse päivämäärä",
+    dayNames: ["Sunnuntai", "Maanantai", "Tiistai", "Keskiviikko", "Torstai", "Perjantai", "Lauantai"],
+    monthNames: ["Tammikuu", "Helmikuu", "Maaliskuu", "Huhtikuu", "Toukokuu", "Kesäkuu", "Heinäkuu", "Elokuu", "Syyskuu", "Lokakuu", "Marraskuu", "Joulukuu"],
+    monthNamesShort: ["Tammi", "Helmi", "Maalis", "Huhti", "Touko", "Kesä", "Heinä", "Elo", "Syys", "Loka", "Marras", "Joulu"],
+    locale: "fi-FI",
+  }
+</script>
+ +

Changing first day of week and date format

+ + + +
<label for="date">Choose a date</label>
+<duet-date-picker first-day-of-week="0" identifier="date"></duet-date-picker>
+
+<script>
+  const picker = document.querySelector("duet-date-picker")
+  const DATE_FORMAT_US = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/
+
+  picker.dateAdapter = {
+    parse(value = "", createDate) {
+      const matches = value.match(DATE_FORMAT_US)
+
+      if (matches) {
+        return createDate(matches[3], matches[1], matches[2])
+      }
+    },
+    format(date) {
+      return `${date.getMonth() + 1}/${date.getDate()}/${date.getFullYear()}`
+    },
+  }
+
+  picker.localization = {
+    buttonLabel: "Choose date",
+    placeholder: "mm/dd/yyyy",
+    selectedDateMessage: "Selected date is",
+    prevMonthLabel: "Previous month",
+    nextMonthLabel: "Next month",
+    monthSelectLabel: "Month",
+    yearSelectLabel: "Year",
+    closeLabel: "Close window",
+    calendarHeading: "Choose a date",
+    dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
+    monthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
+    monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
+    locale: "en-US",
+  }
+</script>
+ +

Required atrribute

+ +
+ + +
+ +
<form class="form-picker-required">
+  <label for="date">Choose a date</label>
+  <duet-date-picker required identifier="date"></duet-date-picker>
+</form>
+
+<script>
+  const form = document.querySelector(".form-picker-required")
+  form.addEventListener("submit", function(e) {
+    e.preventDefault()
+    alert("Submitted")
+  })
+</script>
+ +

Disable selectable days

+ + + +
<label for="date">Choose a date</label>
+<duet-date-picker identifier="date"></duet-date-picker>
+
+<script>
+  function isWeekend(date) {
+    return date.getDay() === 0 || date.getDay() === 6
+  }
+
+  const pickerDisableWeekend = document.querySelector("duet-date-picker")
+  pickerDisableWeekend.isDateDisabled = isWeekend
+
+  pickerDisableWeekend.addEventListener("duetChange", function(e) {
+    if (isWeekend(e.detail.valueAsDate)) {
+      alert("Please select a weekday")
+    }
+  })
+</script>
+
+

+ © 2020 LocalTapiola Services Ltd / + Duet Design System.
Licensed under the MIT license. +

+
+
Loading…
+ + diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/docs/themes/dark.css b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/docs/themes/dark.css new file mode 100644 index 00000000..c2a6e870 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/docs/themes/dark.css @@ -0,0 +1,17 @@ +:root { + --duet-color-primary: #005fcc; + --duet-color-text: #fff; + --duet-color-text-active: #fff; + --duet-color-placeholder: #aaa; + --duet-color-button: #444; + --duet-color-surface: #222; + --duet-color-overlay: rgba(0, 0, 0, 0.8); + --duet-color-border: #fff; + + --duet-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + --duet-font-normal: 400; + --duet-font-bold: 600; + + --duet-radius: 4px; + --duet-z-index: 600; +} diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/docs/themes/default.css b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/docs/themes/default.css new file mode 100644 index 00000000..7b79327d --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/docs/themes/default.css @@ -0,0 +1,17 @@ +:root { + --duet-color-primary: #005fcc; + --duet-color-text: #333; + --duet-color-text-active: #fff; + --duet-color-placeholder: #666; + --duet-color-button: #f5f5f5; + --duet-color-surface: #fff; + --duet-color-overlay: rgba(0, 0, 0, 0.8); + --duet-color-border: #333; + + --duet-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + --duet-font-normal: 400; + --duet-font-bold: 600; + + --duet-radius: 4px; + --duet-z-index: 600; +} diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/hydrate/package.json b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/hydrate/package.json new file mode 100644 index 00000000..b04196a5 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/hydrate/package.json @@ -0,0 +1,6 @@ +{ + "name": "@duetds/date-picker/hydrate", + "description": "duet component hydration app.", + "main": "index.js", + "types": "index.d.ts" +} \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/illustration.png b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/illustration.png new file mode 100644 index 0000000000000000000000000000000000000000..8469a07614ab7893641a2e911611d98886172540 GIT binary patch literal 47741 zcmc%v^prS}K(s5{{6aLpo=MZs|r+x@RaUhYslm5y=6hLApg6 z1f;*?b$_nceLsJ}^TV38&)R#f{a)*=9kb7lP*s+{fA7gX5D0W%;f<_12t){gK=}A~ z@vss|U0EKMnW#cFU*F!|Vv8gsBzt@N`0|3|nA*_lz*7L<->7(08@qvyzeN_Dm(KKd_@ zw-4mWBM&#Zpb!nz8Ck2a&()Iz13G^Xc?I;9;CTVEpR)mZ{zWzF{e0zL4G2yJ^tE?uq90AiDVWJr47VGg z8YzWiMWy13pwEyqiVVSug8Z}X-u=v(F5lPa%-ItOq$BpvykiJhw|DooA$S_7PraIG zIHF{Pb##qpe9W_#%z&|bcW(kgT@N=sD23LCY#2W>~s0h@&Rh>61uP3Q7v_E+}mo&4xA5$wA5om-b+?w|{)iDKkzXN*GVx`qm(uUiOQ_rry~8Bh*r4QQNzVSRh3Vw`YzW zFSdh~I)h?1h&jVCUijxLn*MxRYNhmW^C70M?o92I6sEwr0bDFjd^non0114S`_M1> z0TTVpG;ALBRa$Y6(dTnq%bCKF;R;W;!6Na7n3>qC0ujC>D8T1`XK=Th*rj;}8{JMATvY$+U`K%P ztHY_@20lf6tJT~<3jOJapng4~4wU3FIemgdR{qI?x&XcT!AI%A;zlYC2PzzHpVkOm zGMgwHoVlrpX58#VC0toURK0eo?VktPZv9W}z_2LO0cCvWNaJU!m?;MYkgR~=yan&{ z8wjd7F<9^fP#{Y<^ktnk?n?7*7S@Nyh`yU3oa9Ol|7amZ@EuXU#d_$mDoUsu{zhwP z<=Jyo{adxdyXj#7ym#gl9be5wPl4jF3xL_o{%jBtI?sWk0sic7f&xiIe`lw5wV%b= z>t}%k>fhkMv5$X4e=^OeyW6cU-Lx^=NmauV%p!Kc@4e6!V} zDLHy$zp;Z!3t@M9p@34-jD9U+|H%jEJ8i>^B>w`KULGFT;k@5pQ~%K8F}Us%zMXu8 zlr!OptG7Jv;WGz``CfC;Bu~=rx$Z21u635g%X@`i6e`s8<{jWbvMvpOBwYdY&X3Od@Gtj6LzJ1!sm3jvh>4zu2h^>I@~l%)LaOJdv~1jlTm|3V z|B-`f`;aU)xJZ=PSHR8>O7qu5OiSHMLdyirJ)&zWin|>CirX-k%!b*Whsi#zZErrp zE9&_4K%Jo9xp-rLKXzfLAA{?~Q!dk**hi?0lG~$`DVGVW%g!@L_-o{kX5Rwx!Oo0wUL*QUc6| zC7AWRSbAp+N`t~vZe3HT=Wm=?`TqtZidd;({(W)v3JrwQ{*B#;H55Wuj3LY(ROwGT&xIb+uG(|F@eLVsFZ+t) zs;^2Aop4dwxD-%nI^1T^WwT3JQDF1RM`yMdw{s~MBc?|;eL1zsixNf1-Tps#-= z)p8u4OJ*e@d}0+#ioT_32VCq<;gz3`FRWpF<16}oHkQi$c`Gu#f;AKnsEELHTEPTlscrGSzo&WbU- zX*50w!1Lo)C?$iya=Qk4xrJ5(y>E*JqzQ9ilAQwrwcd-DyfiLq>nJ6j3LzrFaqnZ?NV zCv6B>$1^VAFLOg54WGd{aJcLQ7!<`g5>+Hhe)ZQpVb*qd6@AfejJbE|*Rg5?oUi*| z7i8I{Kx;0-*!Z1K37(Pj&pIW9f7Ro8q@8Fw6r}F*H2J0ir{(@YUJ`eI%OA~Jw!|yH zsg&O9_bI3gynC)#I7h~}L=NU&WnrerMqivai-JXX&NL z2>Ok@v=H3;Ov3@?&=B+I%gsO!c1n50E2Y8)kK)q@7)8yq`=!nn7v+fD_bviE$lZlD7_@QPAjDjtQ&VGH2NkH%G7h(UarY4_4tlHR2DP@7^Z%IZywPOn=~y1mNpCC(E_;*;6f_Q?zR*Gp2C2 zl#(pN(NN07nLpk6&|iul-W!BY*tD`%*JRmPebW5ZpMTbzwIMPf-n~-yA-m9FG<4Dl zIDZ2dqL8*~*wdz>zf$QZxu~QjuKAu$SYsDItA61-L0?-gQ%vyLZ=Po92>F7?|E7od z?%rXoR@+Leg|2;GF2^w%^0`A^iFX$A}DI_F59jNyJ737c&cbYo%M z**n~E)Y0KyQvXgSne<|yb);ndwKC*W38nxPFEE>t(t79Z#UbahBF>xT_&i&^r(w}# zb&|gs)8@O!H#;W_-Udxui{k*|v@>|)Kldu}i@1iiW}|1G?n}(vi$W6z`uK_Gc9&zG z=Gacm_GHaJjK;0wcjGq8E>y?PD$vyE%im_G6J*V}xHd>!k&AuA$SG{HuTQ zzBHEO$L+Ixfjmu{&{FS_cgi?NAW z3G`fRjjEf-Jil4)-cfyimka#5wu9>)&E0A`D~b$ft|k3YMw&M+fH`}a7S2aV4Q5P@ z{Z76hP3&MaA@R>-woA!WI=6!o6cqj{4bpDGuT}|fp*-isrrwI4_CS%^jvui&Bg08? zRZYk73~sCTr5N!0JCga-<7D79s_eUtY4xD!!R$9z-yp>ItldFJjB z3%jYqt#2Rx+0Dy)?`6Gq{9N+({bI%3Bw>_r1v|X-4mEr-zMR z^cj%HA+gjQJrn(dR?&JVJL;xtcPW)0)gNr6bhkE?3@kSEWcvsC0?F$Hqtz6I8RJs& z!&e@kgOY?10|yimVR3SOjEKX3{WJ4_jNmYXyG3^9 zH|t8+DZe{)6Y#OV)HG?oOE@h*TPF+z8SS55dkR^gIUB zS3DBNhBd)i!CFG z9P0g2?~bBv@G*t#1|%x|h3{x@hO1lkWBQabk-RJao@fmBMd<;4I7U3#O!)~)QiVSY zCtg>qY}JWr>~&s#VDH>YRcm^Bq8z%k*)k!GD&B}rQ6gL=tf)XmA_V}1W zoo+6V&^8M=eFw9i*?#J}(VG!?T@PghPrn`*mxa(T0w0!KLwju_ptd7GZL%C}@0lek zFonpc5^g<`*o*(5E=6Gg|0lmcuOcj{79%}?zp$q(iDUs@4v@TtX2WqmS)=s+FatP; zDQsd_U?h^@w2DUqjOtLE0<2Ib#%Nwfu*gmuR1cyvFz#Hy0-TZ7{Ie1x%7- z2ciGMqwyr3sJ9-Y+BoSj5E-E>y|g8DvC-1Fw@~9-7op1tE`h z)mVskl`*FrHDyddU{5WkGPD*d-3I5DjJ}pjFFJOew`AYHVFULOhjSk9WEUpCclm^jbasZChTSHTCn70KfBZEq(Z89v8!dHL$^O$Na3qXfo3U883 z&*^Gfi3UpHxCtt^=WYw=EL!7_YHmuiUE|aD7{O!|?-UXHX1anf!5{wu=gEIL#!|4; zM6>eVLa_jz*!Llz;1=57btJE|&_2@0p%{1u#|?4-Mhu@AMMEF))N--^=gocFEelo< zbV3y>`tIFaJ>~+(O{X^ctPIaGxhQ~9CFP6Pm&OzOt;ha!x8J8O{3Ylnf!mLmBR$y7 zL!E)EuYRWcZ`@uX?=d@zFH5Yf;-}0nePP zj5fz%eh=^5u$P)aB-ANRGYUVNA~(|Cp)BgGI9Uvr+Rwu*d4w5Zwop>k$#mk;k8=g+CA~obG;|OG%s1@4?Qt z9j8kCtAj(=p96!gxouh$cVRzTu;3m#c=?zgQR1NIy!>1wWB3A@*Wc2)A_{u^b$yKA zF2d78{6MkC^*e1e8M(BQ;HHv7h{?Sf?suJk8B2=~62vGfvJ@D4)bDDyq}YE7Q-eES zf={1SmpAVIg0n{kgN5ZNnMx&p5os)iRz&>hjIl=4ISQ%+swPBE8|Z}A7P9WJO0T;X zdo{#iG=sZSQ$5?_44(12Le&H$K1MuaA1-Kl-7q(aDG|8RgJPnCR2@D%Y3lRqn3e|h~Y9yjjvLqBF@ z;C)%D0gS;O-zYS~E`w_}(9)gY40f{2A3 zcBAz;z@fAFZdllXX5&ZQP83zb;hUeDC9mK4F+WlIWxCYrjq0g@-5kF_kXFQo%n);? z;9zQCB6$6jV`(_Kt?MMp-&eA@3-3$62`SNy`Phoa7#8JQmJ4nb@g7{F4p#6xf0bMMh^Weh$qg)ZF|g>o?9VGVs{rK4|W-LiXFcgp;P-)K}CO^ z+w6txaF7+t9p3Lyds3#Tz5R0FU06!(h7^nTba>9mi9_gtczE{Z8)e%P+BorW8N6wx7g zj1fWtVzshon}%~xK#aTpNFP<;t*V+6KY5poTx~q+rSpoW$6)7?rp{@*QHgpatUf72 z$^`DFiP~|#Ahq~nkh@$(@TCMWE?}rs9H2>w82ape|2Yxoi*&-cL5QoqtzEi5=R7+} zhvp;1=j-EMk6M@XgK9BB&B$)ZP6_XB`;A3P$49s`f!SC#s3Q#Cb{R8cGcazixHV3g z32(Y?9~sy&i-oaBOTXuW&s95X8i4Ojn{epr7Q5z}Ny<}r84#Cn?!3DHDJVY&kNP+AhbElHRiGTItjS5U&r!f3TpQ7r;;-?YQLHl7jBXvqThdM7lfJmakWHF zT{k^YC`639JCiRw%S-K3F2*>s9I+gTBJUO4X@$2v-Y*0yMg-};ZkphJPv?U?aNgt8 zXmYFW4!gfVgJ)uz7Tjnp&aLDj@yPx)g3END(^!8}W;e|5arYlO&MAe!dn{z22?o)^ zC;5EWn@{?GmDy*I*(n0Eu3#Apl(o_t{KXUsAmfs{Or8!l^}C06tmSd*8oQ=MH2=+* z1CvSf!M$giubHqF{={2;RJ2cE*^WDqsbzQ&sAvlYIFDa&W(86t<;7KGR(~&=*O|OX znIN>m`GpI5LqrzxqSkBx^olA*>F*?Q{XOk`FS6I?DU;bzm-quTt(|flCN=m&Qkk~~tzzjc87~HQ2t#b2erS--Cy^cI2~i@id)K)xlqk#aeOw z8nq^?xs@n5R7po#oV=X5oc=cjgY-xo~6Ihq>Fx|Q*cX`lfFdtn}L(E#pBD?z&lkpx;zl!KudcgJcd2dkQ?*1 z`<)tHSn~c$mR3zvX)|{H>t1QVJvf`SNoI@DLT{BoWd`}S|ImG()j}MW)+Rt?{hR!}e!=aDtGm^dpLCN&q0$+M%HxkQ~@Xr!0^t-%ElpSh3CCX+!# z_0LJhO?x;W4ES6cp)cKs;Z085$Czq-v!9t<@!-tC5x>>=4IL7D2L*N~COhTe^$6bm z-~wpcOr&G_*8A=+j-*elu2htaC_m^$LV6~kZ7Cz8y!{D9SdZ^z+w4p~%tq9_$aeqA`GJa}r zv*S`5Ro;9}3L zJu)s&!bafX67{Tl$E>^buyC6dFFGq#TIA1$b<#_!Cn=s0wZe6Jq95V6Pa-^IN!^J- z5DAN=&tl2G+$j586&B;WVNw%LC5~S;pH-WFp-3usdiquPAYKdoFzS**XDG-IKa{|| z)_gMBXyalDkUeOBA*(S6CFjFj0RBL{uN z1eE1fUchEJ<=Xa`akLRIV<$#2{!*mno&^T={%?XnRoxRsvz?psLh9;06O?^)wk%Pw zbsouE-eL?#@Vg%T6tdR2wA8fqt|%*RT7*^l0l!0Hkcph^Q=8@RU?Z&~ZqD|*J<1~T zZK4}7ROC}-XA#vwXV|%J;OF83z$GD1{bP<0Fyj2TeeG1I;TM@xRVShaJTRro?6O>AhVUR#BP#{~ zE&pc4Lpm?D#Q=`Y-P3#=0t}FPhKN@NF8xZ|J8`4;vOO3_Y3QBh!`%!8?eRm)EiKd&rO!E^=b-Z zUQZ3|92_@d4qKt&Rc0>TMACfZ!KFQN4=X^g*aQ0vXmK^NfA4&P-AkDP{JG_s}j9gLCm+$L;AX>jxcqYLf@~bXpq(ld^yDwZ_tB?b5Ui z<>n=CY38~igFhcWv!#DNE{Ay6$@MNIa69XLMUNWNhN#DM3G9Y3iUN?bN)Zw6Une>_ zo6CVP_z;EH^eF+k>RX(yTF3XLDY_(X-XQVa#Ql%k63&=M`dl!Blr8#FqmTljCxtyw zmhI^e1g>~{9rAyG`7KsFV-2@SUq>s{UPU=D6>OZLR8-rPQj)1CWU5y}ahBY`v)(OY zcdsuk(}#t|rj7`2icq~4`d#Sh>76?Z_5CeKa(%Ajdyifq{CD6F1~eshn3`QRlZxsa z~<879pBd6%y_>6cAXevGIqd(dH*lI`d`Ig0faJ z40i^N$?5O=qIC3Wh!zRp%u`is`#~eM#{3?#^)yK;*C)YnMg0>M*4*VzC6^DV=8D#z zRqF;&RUgLc8w)GFsIdAi!{^m8!-Q%KU>hUth7xu6w(Q4J)m^ngeV3k9f7_wz5!z+d zXr)vHY6IC^gwn$@rzy{mcA1Bhh^}@&>Y^S$`mm#X>_%}%>Tx`VrXy+V`P9L9o7hmv z6>C+C`Kg;pf7D8!$%jmEw-ni>A}|rira`9xsl3reVT zn`sjvfiZVP&*sB$7F0m4*w}A6H0GouNmNfDU7*~uMLLSJPgbrJc~X*kOX7)!TAF{~ zsmvd9K|^op`+|kAEHx3W0!v|Yq2h&iV_5dScDrmT%Q1tSkN}lO7W@^C2I6R_G=Cq{ z|MvqcGuZQhlYhbXq~!TvmVbc-YH}${hmT{`rK;gH%mPJ<2Ssg#w*5)k+U}I5`!oQp zKt@}1PbAIo)rhs*0FkPna3oHSc7B14+59d$`$&4c9O4Ky(9;A7BIFLEr(u=HgUyg* z%9wR()v+#4>ymr#+V_$gOC-$EVra}CbEv|ZODIixvBwz9tGdhz@eqpI{=CTVeXroi zHIcd)P4R&S3G^shSb*92)uQ>)JF^><3mmACzKpa4OGH;Sv|{W>tLx3GYogV?Ma}1T zlnU8`_=Zq>ODq1F{O=A8Zhc)&Zu!f>Jf`(Mr&m^3EY)n7a_ixA=e)}5YGI|!4;9L0 zG3oD=(KFhclXUFT-1yJa}#XcIi>_eO4 zsdmMgg8QkMUzqvqp0I;;^MBQlH(z`mrI#`K5PtUbCSOZwL%*v#F2>vq%1a%~buz!| z#HWN}msW9bc-uRimK;|ZM%({*F@xz*pf?cgVQL%{#5`7p7YCI9_2tKBXETFAwHY9+ z)O_5TLK^VLmFBYmF}vLD;2_|itNijMTEZW|iNiE%`w`oK%7rtBHkGkvMEloSl6*O* zFjTg-c|JFV8~o3~pgx+DD$;eqloAlPJzqL`UkmO**Y~K^&t}hGO3EOkAbt2IS%dUQ z(~hd@#Y%a;G?ff2mSYRvGRh`Uqbxros{W^KfAvatw|2_YgvLEl#9eMO=$eV)ZFnNA z_*YQT#Xif^+4dKG27Itk`_x>r?I_x%%b}2G57L;AA@l8y{Q*+8kiMvGv(KzSYIhp; z5k_|gY5Q8Ny7Q5}IR^HSK7ng7-A6&6k-Za8qGy}9eJ#4>)Zpnj%y)*d;B9Z>d@?+k zNi*Lu0Kem+&#$l%YQ~tF07EyFZ2Rik1c;lX?@x)2;U{=T8aHzhCnx|i!mv~4`BVb# zz8yM5+Lbw^&w!Nm(HvL$fNJPTqOMi|6d<%@eODjWs~)Am7}Gt>>*W85R1|B1S*)(pR^1Jv8 zVcT)ujy&?7`7)URT^nUNraK)n>9Hfbo1GGe)F3D9KEIW+8}oXtlkrt#n!V)AZMIkx zbF#(PeeR65P32dE^y9O;(86SjpbdF|3+(qRcrG*>*erwYSCnH5##5-KY-kdZ<_181 zF^c@n^G{fxsOx#dsret(;(mjpROFmCs)PIZx5J<;3Z%K=@lgrVAH2;mRAZYWkT`X6Iw*M!U&qWZbP@Xn~@K5mWMm+(%mY@YPzOOm^Sq;Y-b|k7_mVvyBoR6Js_Z=4$hN{(DwsBH?u%Nz z70s(c-%Fk$?GLW`nNJ>KrI^^iW&{aO`RMXuBWcfS=n*9yI~KI5v{~r!W|5N}IXGGL z;90d)BcN;6G{&JMD8Fu{i6CVKCzuXEpNMhA6ho65uaXQQmc9>~+sBe<&6`G3?Jo!E zi2iv?64Cj?p%JEBRq!u7d|0j_=e(#LFR&1cY{L%YsOMtqkl%|Rj=Od=} zbjmnMDj7)G_KRZG_^COK&4tIc9wa@P=i8SxCR*Dc`tyNhVlJ*p3L|elz9Fp>JsO=@&J+I|%A5Fg53v^&q%PR8d^2ko-{Y?a`>ong`b#L-{~sDv|oMQ|j9sGbn$5 zl}PF!Yw`>(Jjj=E)_ba}%DxionIj&Kuo?X7ma&>;#KT8VXZDkL zAvR62<;)+pasK$w_uEHl*PLn(u9ppc!=<)Ip+EL2Hk1jQ6|Y+BF^@CZPHS-A6<6Ji zbDRNKEHHoFm{M5}R^XepBwxD1zZVH>^IndfJzGDmr&ZFnptQM(tsIa=(S7}5D~~|u zj1^*nK3&J?{vBL6XMNERSY># zxIgTXQxaIpUCmhi+h7*Q%OOHkAheD5_HkBu6DDn-6as$v=KNKVE4(+ve87taRmOch z)Jv0?q9};SY?VxTcX88Ts}@$0+^9fOHUVFN8*jvo8=X7-rBCpadVSeI>xUDBl*Tkv z!@Li)6(vd59^3KD#7EBp9&gz+Q_rb-qZDpl8C_UPkL(i~_!unui(BJ{Bb`*r!YdL` zn&0Vny*56N-kD@GAA6VT2~O=RyNJ)6hOZ>X97t3hZ};5&R%*~xzVWi{)s1WC0~#5N z(J0G;<#fGua(G#ET`m{pktzs1+h5o6?%9Ji#dhVjM-7;d7!g~F3$ZR)E+jVbk7eh7 zDNUhqy1lF0lz%zBy6Ier66K}&YoBP9u0R!)%h3hDpFEWD+Tq3^RNrtzf*m1K?XlTf zpE?8Nw4T`~o-IIoKez$sO~)nH%#vR!w_SoL{w`5iZGqvTm4f7FNp{rhPz`}xrkvd(QZ2Y=B746^xTyF2%juZ1Wcc^~2kb^NE z)tHpV5@doZ;n1NdiS`wI-buTCO3JkYXS#VyVP;E^Z{RRw!*rqVE>kfreGH5e5V(9s( zAa7g*b+nTs{Zbz3CDG7qU?4&VM2P9I=ZH9s|1Hu1=G(30@!^`nyghnm#_N7Dh^hbd z#G3o~rdNPu+--`U|G{56nO;9GY{h zQ=8Hc$b6#j7RaJF-K0a5s~sLmG)jTrMQJJ=CC(D3a7>njoH+(@sOpq8VrH4f&NxdB z2MF}OQXlD-$X|EV7}DL(2w(WgO@}7@qaj9}13!aRe}+)INX!CrumD3i5a3G=4|^Qv1zJJr)2Cib=J&ZV%Tj~8B;gGR7?0etzz zopPrKvjM!b0sWS9<>|X#k8RVk>v2RI|HvNPI;J;7>%@ef>=i*}yfHt>@K|8w{yRZG z+W$g7j$=nMHdDnfesTIvg@N2sQVZRYI`v49PfMrM38MuWsQK0k?@+krSCjy?ZPK@>stGBnHw?jm$tJa%h?YODR4(%vD(0%-1S5A z^qCX2TX{<89@43#-h8E9zPP}Fy$arJ&uH`M(vW8|8ja7h11k!POusi=#W&&nIm)09 zxxcud&Xky<)TQbFoA7;k{L6S0x(PG8GeApMQ)WVyxuD{pHij-;fxU}w}UqcGnC>R`t+WM3+X+<-RHKiXK3oFT}-lJP^C*Q zf@+@4q@K0rd`JXTkC%x*5%Jy?btaGAS9fYwB3OM;E;@f=NXO4?ck5!dJpEKcFn8-c zjrrn9=1D&3=h%VXq^tO7P3K74LMLj5&aulD<%=-JE}Azf9|pj-V*E@Sk|*Ydpu(rI zpZ3LIqsXy0P;~)70VRV7vR?vhVrSg=U7Viey6dk7!_UaY6a^SFT({&kES}YW5e?R>;eu7Z6>`U-ps=tdEB* zM;yh;mAsz;qPzSdM|)d*M28fBr|2{>ri;K&t$G94kAVs^4?mo>fC+`Yq?!XQPOt}=a_!uNY-}Ks!Mm4}r zKKGWYWr??eQ0O(j+2?#)_fuE9PB@o}@s*o84nGlr0*5Z!fH#rE! zS797$9a9VWP5QCF5c0v`@4jmH{l~n+`QvPTjB0BiJB57C9Uy(|28LkZb?k#n4fc$d zw>QVOJ0p4QQ@zcte{J+Kga?oB1UcaY5#DY+t?mm4xP|cfR8JQe`+;q_f&!s5n*0SU zbay+BBV?_b`fgGJSa#*Z_vmDUhC}4DAqHxf4A)>nitsyA_EN4g+fOnh?}}ab!ef+o zY>*fsiiLpy!*AZPFJ9@_8svVlB^ESyuH?Q+91sYZw*6Qc@yv5D+5j;Kf5rVn_aT}R zwZ7jA3x~3qkcOR=oN=ebZ>=UpY>8uUUNrcbkgB61?C6s}nl7HFcGjD|=z7D=`Z!?6 zsM6V}p6^Bv7W9`kM(K}a%12j`Xy|W*c;}x&i2a+Mf0M8rEMV>C~HDlUDZ zD5zsUt$a!O35O!_@8hAka6whAW{HK-rKq^KX_Q~zr|;T4%5msq$(_El68+Tx(v!2= zVS8xE+92%mSIPM18C5kE>PyHk7TX_|m%^}^0E|_0>bG0V%*ipKvL!(NMP=P$HZR{~ z#xyk%|KrtbBqPFv-bMU*&|tvxr9#{PR(;2@F%%O zZt5bi81Fexnw$@f*Q)*SH0-qX8(<*&4UN1hkHYv=#DXoNhKDwrp1$gUmP?2lX(O4s zwbSuCB62Q*w~eQ_M$Iu?->6@$SO;jx@r`-E0P(GdP*t~3DrCl?l3c|Lkt{2%*j*NB z&SxzS#C{A0#!c8BC0){|!3~aU{5@yc5u3No!ej{HO{}hyQi9sLPcT`$7@JmTLh6d&q_UR`0W&CU=P$Hben~MqMtAf5It&^-8|#_9P_mLj+%N z<1=o!W9WMhJUwypF$TW#GcAlZ>|QrB?5?0d#}masUFjd)oqS(Ex}kcZ3wB*m1>r<2 z6^s%e*pd6(4h--#TnIiG| zK(lF-Bg&zdMuMyw=WR;70zZE+M}%jbFFwL;1ImFH$HpZ@2Wn`-*qp(Y`@#u!hW6}O znZ{TY!*sg<%0SfZD`>}KMi(wZL_G2rrD?Y$FL5JOOvsy!&&s&h{}K~OTi}hM^@i%z z_Uz2ZZ++E6$4E*eyU81&g-F)}yZ*b*;3wk!$vO}8rIf*m+aaeg++#@C;3UyTkO<^=Mun zg><=W8iD^zzV)!UYgSjmBdhz=Q}YJzNljYkiQUY|*~mF2;@6snUn0>w!j1P0M*T8a z)o`OMzVRMw{meMgfrmL8?^E5n9ECRdRE2(_v7&xDX0-qO(_-@bt8G_=5q%T5Q*y79 zZ{vD{J9D~?ZXk(y)0|TTB;B1tD%K?t7u7uiCrS|aUbwSIgaW=@SUC@)%XBEyg(Svz zG~t`$g1KY_+c6~3O~t+TIRpv{VPJ5%sqO1}D4hQw(2%`J(_)i9wS0}H&zkYCQY#NQ zB7(`o-Pd^II^L>N(SUKyH|ldoDNcSgs;+^d>P_$=NedVRC+?ChnB5gdz2Rfz+kB|R z#^}=C7yRu8Wp+O3E4D!{j`wM1?Edjk8&6_2PcB zy`4ORFFZj>B%eR_XVSn0h8r=7WxqNAM!qk6IOU|xoCSx%e4m8I@9P|=;}5?`r8|)9 z&4<4>XX0{a6tsqnP*?2{)@r7D)(&Xig~okAd%kK-S5+% zEG}Y(9Q@e8)={qMGrV4lk2kU>2VcyrwkkFle)?xVlTh0Q0baS|J?j5=7C_QbOwlj`c zx>c@m@j#1*G5U?_)`58VeMRNXEa`>!xm!st)8;~G^SsTXMbmLGQ z7U?O%5B>CrzX$Evb;fB^kR!rVRM_WXc+FpM2NlKh-kJ;qj;o?s%4NUsztJ|_h>jQ4 zi#QRdXJIhD>nSUQ(H@qD{^Cpj@z7)J1WX1t*pLtJ^EgX-mCp9zN53Ub&1u~0`v)G+ ztc7@ls;MTCv~7)p&K9BxX4%KHtn-AqEmQy2SZ^rl-fwpZjMC_5;gHkxDWmLCps-GjC$@_gU1eNl0IAF?dVHT15rbcabeU52C!w4pYUw;RS zu*?ubIW3ED#UD<`2Q-}Y3c3oJlo2q$YNIf|nfPrt_mWY~ zpEZ@*QDO6VKO@%Gdk!zLdlO_d{eslRu^;$Wu=K>_H@{{$F^wVeDHyDS?3jR|dJv-#Ohf z!#yrKQrOTMt?!{0WQ`VVuxp*FYl!Z!mn_^E0XwKlnp^E&-t7&}WTB0tEZA`A{R5KL zltZscs6K5#;mN3bv|KV=jXLi-buFeLv+-W^owZl5F$DI7yrFT?DZ_3Bd4Mt~PLg5Y zecNyS(fHEyBxNK*-%)TUJEGKcHCX3>xSEc*zBB}bYzslszY8^Qyx8;*^pfyecWs=8 zYp1e#x0jdDo$}ZkO}eW2wC6Fjmn{p!NP>HG|M9 zzJh?SP3iIBi&>$`4+c{BZti`CD@Xgd)ypQeqku=?SjmLJhD1E-7vtb|&E`=2w3Bq+ z$umt1#8dEoLTzqj$#uI6s>(l#ttPtqaDXnZv1RbCp@DtH2`N?e##Kt3$E!Q+NLHX$7Vh| zrOxnF@=yVncvwn(uiA#8#_le357LqG=h2)p=I;ZwKB)MLtnKNiyBI|_r9SMK76oE! z_f!OL-&~uj^m?gy%i5)K&7ieG0A(8x4Y5EU=39?RLc|P7u1M(Ig&Q)`A>O%B}NecO6tK!Pc3%|n$_;Rqo`1Rz0@C-RpLBw2F`J`5b98- za=&8YPhTgv-BH+mkf*{g-+&{hl+xcHBoo07J##1gahnDl&&e@XH-7B{rM>t?#weCELzLcTQt*L1uaSNIo^GhsMmjfY1FKJ~{w)cFfxaTSID2L_-{vwjV9R&d=Z#}Kf29zM|V}_7IXktWv>E{0{ zXrlfjua5hKB-sDgLIWQ39}O!&3$lk56hf0Du-1sM6}kWO*vC=y&%_^YuqL`s7Jkvq z`TtBltzI(xCuthM|BtCLSTS@Co(9EY1OKzBiSCz$r(x<}!i%x8f2jTsh)))P8fp*t zitQ_+Ula8|mWrW{spsPVI*ZnI#5$*jYU3kjAA{ur^YEbl(tj!o*n$8Gi<0O+awT*# zv}Hg5>y;K{;eY!+w)+R-9~dkM{N#U@*uk0ziU0UfU3=?4V<^E*Gu-0#bDz$CTJ$MI zRI4D;ovXL`hvkRG+jPk>)>Yet0&8lG+nt3Y=wh{PFgD zBzKZNBN%?Q{M&tZNWI+sSQ#Y@ILxyh`*quXt(KM@h( z#BcW3^2xLg`MZk!gL5rAglZKiE zMaQu*jN+DxqEi8eE*$!v^yCi9YQ`?aEq-($!?GhL$Xm^<#M+=Ext73u=UwK;uZ$ww zfMus2HqosZ$hQeUwULGbl6L~LJ><_Ej##69)rONvi(rwmSLNh*e(}ntmQW+Mi}_L8SzP1f zSlM$CodRtmmi{Nw1ix3T+Y7BeYoy>bjvJw};vC5oEy&{suy0ry~x;`Vi7S2)N?AS6SV zpxVsuQsZKDQuUwwV1xBW-gnTd)AofqGMRBBK>IZA>#52n4VLVK>Hd1{9F}4E?CSUy zVt7grz5MOXMb3EFC+z+Z;v0lkCZ&iq%W6+Q`POr2kRHns>Rx#2o5BpZGVHj;O~Dne2ihEjq5-~raz z!NO#EAZtza(0o8PmV$|rFW;3DiL_0WW(voo6w#>(P9zBu#CiwF0K>~ioO-q~S{KyY zT#_#Q+7TApzDyHG{a#fok3}8i&#R8_HUa`hgz^t1CzBy?SGB56?UENW7LD3qo2xeZ zK#~h%@#8xfI?7=`7{xo1h?`7nFX7kLkNgfUfWt(4%kGMYS7=4#GqJdyCB)n(&wr9I z>9jLbA7~t2>u9b!LPHE6N4pbeuQ&;Jw~jOQp*lW4Bu^-RHATLZx4G_cRE+%7uW`Rn zHF&dW#fGvjeX!l9i|U(=xvF^Ebw$%px)+c?yk>VZXA{1cG=y|8hd0u`zabp{cABCz zBzHgKuBJnk84N+f(^grXS*!#labU!C6$5K5HVY{!3$^prN`%l>iwZ-ndRh`=M;bbPO8g$^>t5k(q;Fqg+Z{l=V5Cu z*iZ7S7RYHh#kg$DnCDD{e^p}vD|m@d=IwLBeYWeyWJ4#=hwV^&iUE*j)p+Gu{ZK9> z)WCE-5;kCs>Bt7(dFlC{rrARHMkW1|D)Q6lSQDAi#Nf{aPNs$<1Ssk)+Y?!ssTk_cWy($d>s zxv4S_X`aZ)btd2n!J=}VQIJ1^;0%)cF1O(Ek$U-&E`mUhtgGZQqUSFUS^a(No>XA`rnElkatSA#$trimdT?Os4 z5HJd7OS2Q%tuUaQ68upyzsk^7OYFGv%(W|?r0}U9w?6%{+y`^yiKd-h5@zxiT2Htp zdLbR=pL-pAq$(ap3e3OuT)1krR+DK7ZAh8+u7*$jJXsbo-|a(c3Vg!6Ii>v3VRoUD zVLuR3dliu|{kRT(>YQ4kL2BllufEbDC^O=tliJ7Lf95svlaM8%Lw}((x-lrcbfQw< zJ^FWP=J1E(RUVlCN?_>XDO#%Df_or8#uogpV~z_1RtUGbr1nv}r&jp=xB;+lg`%>! z{wu9IbJ& zPcbZ>*4Kh?<;Px!q-d$x=?@Qg8S9!!75M4*P~rq^xy<+S;tGPAZ=xu5jU6}>fLqZ& zhzN)1^f0oh2caP1li#i(!*a|~pYEJefsdZ*>Gru-L+#aukK(@HmL%k=Q!5=-D6W09 zgS0~N#D;1!f>dhQeP_}vX$sn#?9x1$l7;(uIZka*ZIwdY zzkP!jZ(-+Wm3p|g4ePHQao<9NCCrVpAI}&^$PRl8>n|LE&t!z5lO%la)rW7Ls7foX zUNAkoJ>nr+`A~%6uBbW%IeAgzHh=4o=$ED@h^Ng&FcaE99!Q2<%cQvBkgrSN*37<2 zV&S%OEgT$G@4K1w-3k3L{rTuGV?a#=?l#~hVVe0v9W}NCxv9uE(A|(-G0zU}`8X<6 z&G^<_HcKP$gUAm56J9{^Ui{ZjJm_5V$D7zh4B0*kH29G0@vx}3%fjVh;U}6RGT|qZ z!ZN3yn{Zsf4Rv;U0Y4bHIz$)SG#7SP2jPaPju7^-lZ9L`$R8$ykS~AID%uYqdeSI7 z>gG)Vx4!q}b#k2LYD^j2()txX`$;()g_J~Hz_*m$booW@$R2l+_Al^b9VwoqSGTU}%b$Da9KNpBK%U@IwO30)>{-}hg+roxaZeej* z@)AB;tC|n)X#0lnSs~y_s-wlqMVLI%^vU3n>R|o!a(u8j!FdzQ?6+k1^4iA=;`v8N z3&k6uT2HY4cxaJX{o1brv4%0;qkBuCZ!G<~T8B%vu*--)q5-(U6#6m}Fx_1^v|i~0 zi9zB1iw_3MC9>r&080qJ#onRR5M(d=Xk)x4Z%O`qp`$&?CvxTEiWVwGOMg4HeGh6r&1`qa$UJDJ8kw#S7glgcQu(mgpn*l%X&h0GFr5T zF!F6}q5#~zWrcdkpdo4u^R9j+r7wB#mWntu1Q=dq*dYufh;%I2mvLARrR$R%ztZQg zN$|;>4P?%y4Wp`rBku6ONYi+tX<;3ZljR}v{-|<0{DL{o?g?<%TV5WSrDhnRRdGC- z87Sz3q9h3^Py*k>alXxi6|4q44&?%58d@Oo;%{_2>fF8=^6w6HiYk&7ng}b~36JGK zL88Ysp@2BTIN}=%Rf=h1+$_fvM`bd-W8^BmPCa)nFiKKC!ye(n_w8z};q=a7)5)@J0!RUZ08iv=ue!kM=~s)jMt)O0Mh~rT1XZ8(WpM$(+)? ztoIX}_-fjGVGp$$-|N_HJSeobPdo5{Xx+*MPmj9;{x#c}S~N7`1d`PpQ{KGjrf*$9 zx71o=_>2^u5HpKT|lxCg>n4Xh=$cBSC@<8X5V}oxINX z<)ZrFH_E3B##Sou+7bxuV-&<&afIm7Ij7ANgK&2+xs=v zC8l!A(R2kIl#(s1;751+uBJWp zT6&W5JQ1v`tq9dWo$n$#Be~VY4mBA|t9!l*`$NyCQ&%)I;`&gAV_%qZj1Xl5$qg;J z`Al-<%lYo(H4eLmlD-WN(SWNd>k(cmLT70iRBCO;{ZJ?0% zCXc{yk(=xnSYMucwQbTEK4jVr#ovSg3o&QVp!FOj1!|X83GtG!mPWg&C1EZ44w*_r zRts@M(?TIVf-I)rnDF(LHcx(;UpI+ys8ZEPJGB^7%BuM|_0Yetchk2F7ghis@*C?svCf}=qdI?rOR>Rr zq_vH8w>&NDEnnHnc|DQ!L)CI@e7YX5c2mMyCGTu#jOT$H-9-oHg|k{RS-wVrmR^N$ z(v+Un%5I<2>Z95GGq~iL&#JuzerhC=cyynL&3!`Qy{AMNe2#jFF!=e%&!vB1@e;D& z!e6*c1kQ`_F@T7FtwB%zLg}Z{)DO>5_&L%)|M3qz|BKd%*KWgua`e^zMbLl$zkz=x z!uyL^6=2G90p}=w{%=HJ2{|BsUMUfztDZ*_${{VpYKTt~@%`V{SO6FQ`Ok*_Ps#sa zbke`=hr+*R|0D75bHo~mAq66!Z~s>g7y6(7HxUP1|AZFAna(8;uU3G){)PMhTL<)c zSfCi(i6w>{{#&PW9q_S#mG~`j-ewDc^#4)fpSEUO{-gckKXDISu*kWoc=txNKYH23 zy`<P;eF9+mdc2=-RJ9;Z0-I_#8sMmHWb_XXMP^Sl9O6gbA_ z9jx9te9H~GrS)3*moHD~Be+R0IiEce$Tpnk_M54xR`iQ6`e=#GeGmH8A9ABC@%KT327akm5`fgh!Bm$MXYb`uT!b^IdBaDd6F- zBII$}Gdd>@-yV1Qz_ZU4gC0_aLn>EtZoboogD*EtS!WL0R8oMER>W=W&OjabJyJUI zdoKQ%ap=|?uv5er$36Ao7fYYUG@Jq_9vp#7BBf-7+v3D)dwzK+esk)}z_)&EEvp;d z`kfAb^)~GECj~snsVpvHV$P9`*l(8_ah4C9p&84il;--)DKMLeRN4Eaqt{sPg?Bu< z|BgIEKXMc%*#zTk?1ynXc;^BnMjxq`l0E7<-0OKxPri!3_V<)hdL+6C-DvD|w1c9) zN`Jhz_zIWqw(N~%abtXh4e0>8--FY3B5IpZCniZSG9h2fg}dk;D>JPhccGk#`M45K zxjt_?hg~#Eug-^p+F>ikLDH9u_xpvxX(}e3+rO@~x{uft3X9Cv;G*2cm^-W#k z1X6LR+YRs543pL2;u?XT>S$&900W!A7?Es#8Ml*->kSk%FGn78VJCBi$qV1k(F73c zmTsB79WspKpkB|qLnMU|_KCK7^=@5!B(cI#tJJ{g7jYbm%8<4;7VO@T^LhSfxqRT= zrSMidk-`&=(8qt2nP;9~|3z8}_I3I5XKFj2zvq|MOayWfMZfV?a63%xk{Vc|%a)!P zIn1;iko|rCp&35L2-^RES4H@DGwynbq|em%1iQ-v2f|`)Y{nffwR?T#b7vU|%vx{} z>qCNQtwWy(wqN8!cJ1TIZaK~aa(p+$~z zy)hB9TQ*6YNzGo99cOuViPv2zsf#I(^_@n0J)D7wl?#O3_mv+^c)wxc2V0je6xn!W zArJUus9~po7U2mkkWD8MB`4+y%fwp;ZvlNP~R^B!Flf8a(c4gzf|w_;dQTZOB_$CMJ99ICxO-|nx7!phqP@T zfN*4sP{TG(T@aCqOad__v0V)&ZqJ}J4dX0npmkJ7_4wall>MlLUJM%m745@c)VJMV z5MsTS|2W_ALkAwb;?dMe2_V4t=jUt?MbgxLz88(bdC$u>>5QsHv8bfaZ^mR_lHvMHgkk9)xNJtep1eg(Y&BfO*1qTMT5a^q230 zh9YPhGLbH@PR$(;DfVSDz;qFQF(_HhbAF3aB zj$*W&5ay!Q1UT$R2{mky*=jF-_MXw%v!geoF!M>~QmriPhLa)msf!IicY7zbu6KRE z+-+9=NMGNa;ukl$D1I@WlgE7j6?wIX^89V)EqrzGc$E z%;@Xtc+gc^rRBzdN5paf1bfIcog94u5VlGkW(9haQv89R-%fCciL*twQEBQJ9uR>{ zsr5Yp$@lB^uJFsy4kcN08Ors3rZ*_bS53tR|n+Q=!bGUz;hdSHgK(oUh#|$q= zInc&=zY>U)Q1><}R#ff*2;(@br|EBv;RP-j|UPRJtrJf^`eC(Dc zs*45Cq3v_o4MyPnbB43G@2OqA@wBJj`#a3sTQ&6xca48Ed3)Q4P8uU08vN&RqKE0% zpaXh(k(#YGOnyy~MfdQsb1H|4Zjxdz%nlvpQfjl`BIVgH29}w9VC-V)8W-7iKlAK! zy~WM5AtT~eA4L?UI$ux#@TgTXBZj=stS%Sw_?7atOv78ppp{)QU4eJhi8m_s9?-G0 z?WVC-QP_Q^9WXF*G#FWVjmhLg1OVO7APj_t;fvBHWsy~jZL$acjsn$5gP&*zx_(#I z_HRbsyul~8AcUgb4t|MkWG+=(fOieRDW2f0At2FMgGFJv=c7`Q9+B{HUb1T-!50vDidxe{tQs zMc}8bw$QddWuXoS?sdb?)c2Rt1VCcqx?}H5K+Zut8lu|kWOoy&kNN`ZwThvPx)R8j zO&%CsI>jd9RUhmF@LfNx`OpC7kEeJarN#tE1Zl>^ED@`lHHIK@*nX`rL=`C3HG!j= zz%6H9yAyR~i!LWFq-&s8&Z=}Mv=(cltIEKDZpYngg{V?J!Er%|JHiDn4v+G=l$LaW z(M)aou0Qkdnt=J};`il+!D)%Lr+@93-9xa!Gg821U$*0j`};xg2D@)sM1RiK6{ zAXkL}2$7u{?^U>-|M=&IGjW2hckJ3Ozjbgz4>y*wBXFn-#UU;C;XTPGnLubB1ee)Z z$rq!g3d-GRSF^Q{ue;;8p6Q;tUHNs1%ogSE(EiBl$lFY9>D+fi^j=?@2le1S9-5ZU z#HM*a5n}6I@3#RgXUwkUza`IQF%wFU9sUyhyZFr?dDGZyj@!C#aKi#GlXN=I#L!DH z^L~#y00NB<-5FC+Fsv_~dMyxN)t`R9k2WVfAn<56ezN|j$ZN`k-payNaMLH%cdMp4 zYIEl`tK)BSx5K~@A_IffCWMvWdw*=mPI_7o?gR)x zmm(nDhbq-SBnX$%4$@x!zIjFo01`gmc8bFICce#j{O}<#WhP1%@u97xeXLkgg(Ug+dVw1bb<&q`0I5 zOQ)Anj12jOjd~}+ckb_$zICj_GXGw>gWK!EUAicF(7W|M@;;iAQDMKj@#3o9^2u+; zoY^C=-03`PYEb$7*=!pbW4Hs~<>&p~Yvq4d!a10R(w~|E3B=r@PZ$yKJe>cVS^b-z zlt4TFO(J&un^Syr4y7uH59LBQ&y%Qslac}dWLGED5VzrW(nPp&_Md#L_`k`>;hh1o z#edVR|3aa^X;vKaJXcBtE}O(!{s%Ubegw4si+BE$o&8%3jps!_`FrEUiS-}&_Am0; z1PA{GPyfl^+T*_di+oi6lbk(oI}!c$TmJ*^{`d0%=O~Ma#ncf0TqpkU`V0Spu>F7W z;97#E`TwN?Bun4;|59NQtl##3sX!Dw9QglHL7$j%{_hm@f2**3uEGV5l}lE5Phd=B!^vdIfqo2?$=pA)LyzH@ z;(nh8TgkFG2(=?1oADL zv_kA-;rx!pq6&VkK)Ykj4OT}Fp{I;He?+hyg6L~DGq_b&x91Uov4S$aov+K-Rp*cF zXBj1`MOtsFi*I+=U8gHBmX`U_t9>el?GT?R_5X1E?3POmZQ@veCO;l2Yd=X_m3!Pi z{;>oAI7iv~zhW!`-{<==X0$Lk%KUb>T?kDfTBt2I3MwpoDW~NLh=;^q3ol)4_Z>>L zzXau`PUK61)Y#3?rg1PAe`o^B1oYS4(Wh;FYK?c^g;$1{%S^37L`5+i72qqL^$-)^ zoh1`CwuvlZ_p+eU3HsQ2RQD8%=p|aphujHnEqaAd{4wllPYz{$L4|AXVuWNIST6b@ z&XWGSrLh9-!?&KXIMvj-1cAGEspr;T=5s3+3EXOAThO2s%%HUyu|c)4+uf~te8Hlc z`!L*dr5R_ED_tde$!`|%xtM|=lLfhf?!)Gyc1C`x^@$_}%;aKxCZ@!CC442jWI;HPxZ%mbiQNJw?xv_a$0 z@4NSo>diZz`eML!QsT)fQYkT3!l{V+3yn5$Lc}IG>pd~S3e|*E+DsH;Xy(PFxaB{u zDpE)dikjAwn>Y?f*4PZyViNm9I~sGHyN|%#c!>;+;%(Iz3l9KNy(S`ePigV=u$Gwp z9R=>McM`{jobJhpVy_Vza64S>mJfkJ{_ZK1gVT9si^x#k<~H9zWagFWof#$|3vKWw zpnwk~vzF$ome@QKMJ4Kjd3>*#mPDj*LQ@AMzq!kYJf5B>8r9M+CXxGNay#Th{cp2? zd3d@;o%mJVTCoKou0(b5z0Eu=>3u`|FvVUmVcAV8WR?}6_|_^;$PgnekW|W zW?Ev%S-&AxYI?C)?c5b88=vyKw@Le|TkDVANIkjkC?W6?ZZt2xO#? zN*n7UK=?qR%N);I*Gkd>2=m{1mt(IhnzRMjmOTp=ld)D`!9i%8Vp3UV&?3y_`gyxp5b+JjHA*yg?-U(2+rh=uH zbKu^_G!|m%-(T3xgjRkM0Dh7NchZoScYFzAF&!qQe3wFx#?66AFU^TUb6A2qOWTIQ z&@D=~=!)C@E;yqvFW-Z|bqfL&+lj2|BmG9hG8uoA1La50ty_r^TQNgeIJ&;Pn8jOq zY=wI48fBHYs+~;*j<`V)NaJs)>mZ&gHJ0(1ty-v-MI*z=XrkS0lp+(Etz9v)3%lH#e?}3YpblEc(db(-_UO{#nesR+)OmmFL@1f8lFwFuDT=$5XI< zyHys$y!t@=^YKE?fzc}(M8R<`S!N_hy&_5Q2_xyesTm?#rlW3enaKS5+5Sk`UkmZY z5PVY$Z*R=H_c&%Ju-4r8tNBcbh5h+^Ymb{rqVb8N-LhKjfakMLxs6|1PX}Ya6=^ts zRpq<3;^QCd_3HQJ7Eci~zXr#vGb>-j8{!M>8hA|)l&NAHUG*)DqZgx`?iO|lZFRRw z>!>i$PB!(XA&SH}%x(DUckSj%Zu{V>Kh55qY8(a@JV zlS}FQw=Jss-Br{e;#(tioPu@cBY-%AJh5JR_UMs};(@bK7rNRkUPR2qdISQuD1(S` zsI{fN!GolymY%aaGs{{{8`Qh>dy?U+tK6&T4@s@FHR-}nNzhfKc>-P^Q{Ts;@5=8E z!+wcp2U>%i)ejV%cekg*MiO+%-~8Dvst6avaVX|928bP!X1Ui`_PAyn;thvaU=O(c z#%5_!OO7VPANoa;)gKT~U5w{S=fyei>C$X}kqH)LdJ2Yb$^2H9hjG{BhSK#rbi=6F z0c0V4@$36wQYfIg7YK&WXCItl&Rz$A+ecfzE8HwF|E!36;R8sm zSGSjbJrd6t?XFA~)-LL0n3{gz$L9l#?4G7BUwF(2pN+nk(BdQ++Ga)nLO61jqIJxI zbag<&=l5Cnwr(j-A*ZczVUtZ`_gc7~KVvbZ_A517g)Dx+?xA9o1j)1Zv+vT09SMpW z;puV97I)^3F572t}@L=e=mad^-@qMcZc7u_whC->S%uly{mt%h|O@XUz-Q7-#Upebx zx|M^PqaPUn6W{}}tY+gTcG1gKO(gMN6_ZCgs%K?@-{%FvHbS$WBfd_{&7A z%s6%#E572~c;tm(#3C91t4Y8W-T#oP3$LA!e$V#-OxfYr4^ir!l;s&LBf*u&gzf|E z7*8q*4cTpmoh?O?2JYj;I4AvX5hl>m`KlaO4DPYU$Nfzh{I7NR-2YtKKZO$)>8H}v z=PPoN32V^#3jJ?t;`hHUFS3>?N zb}Efk{fjQvc>iwVRLNQs|7YtZaib+s;@_=|s9~WpaOl5HAi|G-w^9C@X>;Nk^5moY zMru>fU{2Xjqfd8m`Ur4oTqL7wakkEMVOx?MW%W843UE@?@w>Uuj}gxp?!T07lrEG^ zqXUsIadQBLs?fPhqE_1tRqAJ*r7&AzHSdS`Y6$&Ux|}JI!G7+xdADRqS?ML`qfhS& zBS)5P@fT+l4?34PgQ?RRlk% z-G1fAYxDx#2DhWg-Itr}j_<0n49q#8gMdmxuaz8Qpy;DBZTNQ5th@TYaERDpqeu&G z4GEbq`z0+o3L?@n1d@vlxV@bYjK~jrTv6$7n6!vx!PLf38yV&J072EN3gw@gEV=BOGh9 z$%u{p3O%!&x`x(*Z%g>FKR@Ir)Yr?2oL}E&1B{Z7re!jSqsQcJ3;dDd=ey#%A_Q{? zDA$j}ajG2BC7mE6AX9Ev0Q_yO|FB0@;*5L_@%c+VfH6^cz~y)CB)Gs{qAd; zf&i=Nh&VyxTxZ=hV6gUF=>zsjvGrmP)I7MZ59Vm7#W4;cjz&mgm(=^S86_tCpe@Ka zfR?X+p_pQ=v-_-No?#Aib#C@@saux#$>|WENm~^lXma)0ubUY@PYF!B3K{lJz;$qe z5B)v4qlBiPl2db5y01?Io86S$+vL=I?57m=_hxZn`PqRmtgL`HMNHzAud9kq0=Z}O zTi6j@4Fk|iDNBj*w2iT!uE3Bk%4Z*`%5J@wV&{W6#Lph75__}5Aqc8kc!bNW? zIjSr=Smb}O*3Aa*A2Iab96EF<9o)@zT}jv%>699^xwG4dTY3i3{ltECKIl%EJv+Va zfD~un@4}#XE+-`=!$Bm=+ovqI7Ohyrom3 zU&{#UT6Rn4=+-9o4PT;u&utUQ#N;HkH6}g3(^>H2&S-( z{gpPP2Mw=HY|3E)nnV0`p8o8u)5!fw)oN8eCR2YELoP&>va9mGB&KjonXy^nH{eqE z<7OUIYK!ZM&)vf17krlf?eZ@syR)^l(K*40QCHxSF2ZSu5F&f>}rvPP$H&rfX6%gCA_w5YTcN zuHfUJEws!vRdUB>;3_UaJXXyKd`TZ^5`wqWi1C(n&V&@}p<&VwXv{AQrLP&;ndfz!kX@Bw6#DA_}jd;c;W?eSy zLGBr-h0>vdFD64?rM@%QL?maddORpP8>!0%+v}k!3T7JwWCTR)!UP0_r*@IU2R3-p z)C1vXWZnD|!gQ$yrO!!YTVLNFVC>dKITCqhV{o!0zZ|p?BvO73Ou8hm?}U?OJYZLE z^@=Bj${H~X(GZU~OJY+G1i|`xQhokd-)0feBTT-_MJB`>*t$8QJnZ^GJT9!HW74%NgXp9SC3eRg|~D}k1TGlm7QkY>|h16TBN z5u15Yp-u4@2X2a7kDAZGEvePaZcW~YeW%$Gec{3Fh1A)f`R-HCa6-?5JFP&V&q-hG z1qe|vH;_?%^#W2H+uOUN5T7{x-brxBmrNHVM z3ji^3`@;&(DOv;PwhNoLPBL`q{nJi}>L!wWIXvtzdwiQnWaHQ;$jralaLkJ}WR z&=52B6Oge!7Q72{^Re{v9q`aaMaOQ^0V6-WIjGow4my%*d7Vb%{H^asU4`kedo_!K z6G-enk%8v?&u(>UsS(Y?FX@=O`sUCeR#vT4BJOGrQLRjcZ5mPVr3Dw_C;E2lYd*OM zDf3NOMEVNI{HEE*aI<6CHq7R7ECV@7HpOJDn=Izq-wFvOg9k*VtuNIy{&uqAWJdQ_Q($=y@DVY3Mk!eAx3Q_74 zWMGBM0&q>B%fJK=w#ljL-;I z0uX8A!01R(aM7a%3QB8lPgoO9j`MXLd$%s=Udb(Aei_47T@X^eC(?W*hrU{Diyqvn ziyG{06X!KE>rz1Mea;RPK*P0BHy?DkCwOq*yzs;g(-DoLgEhApSHWvvTv3PcRAh6U zDyqHZA_mn)p_+)JCh(#h>|wH9+8XUIuktI4p?-Vg#}WY;W@_pwFFz$fXa7AkTYBO4zdo{Z6j8K@>tIV}m1Zi*8(uixMT-!zd~vP2XV z>I!Ith#r_XoEEKYHhu>x+}K9k1Rser*$HNlYlyzMe)t|d^qlu~Xn#mO?ml9)m>wWW$sVTW zkIwXXv5%|9L_Xq!@(1lGCcgj^$YC$e-&{)wz%4wsMJbXZ`fM5#;sCgjaI~Y2*ub_p zMiOu2o`8=5qrjV@*N{8Gj8ji*t1<(aJTb?gz-r_f>&4o3*;=-k`A5L26(R**i-|1K zKpmUG=(43~-evukgdINDyZ_Y=D;uwT3A2E~?PIh=UjN{heB^2Ml#Te^s5?9|M&*CD znJv?ZWhye` z-EetWyj#vK{6OStOKXG`-W33)cJfy)AXU=gbh-6@O%q`F*sM#xfWH+=$AIxE2Aniy zwwU~oJ!U^!xZBT(6$^I}%QExlBgBrw3*CY0f?H712XxNBKzKFJrZv`sNJNv`G#3S7 z=Gz$hw8@D*-q=uM--aU*jSWsm<89f2#1jD~b76FF zp!RXtvp^|wOIT|d&L=Zg<^2M9OCWF)8qa$aOByzvny z%sAt^o?Ah=+3BQ@dMYOx{W(pWR_p{e0c^kif!I!jTvnbRm%~ zK!A<`uW1Py)WLPS1NyP<8A8u0R51DEdL*fjjb`8gjJ9PHQFmn_`V~!~m``)ymz*of z-ujyyz>xCEstqVp^?G2! zGU!-`B`cH%^DbfL{mg_9U`Jz)*sS=KG}NHRPh2xV<7WMF4{v3k)Mp1;fv6~LuB5?9 za#3WKproA8jiMK!?m(C$1#4<7Guh{dOTrROJ?Fk|J(ZX&%N!)k+*4L6U-Wq>aHk>X9x?ac^5J}e5uERt@}-W zB6)O5UPiIAd^vL4O|CqqAlju|C+)%ulkrEXckY^CkNt=r&TuD*Mn+zgf-9yIzuADn zb8hU_z=I@6`^(8m*gvM={QAaBHjo3Eq!3Qpx5d9boj3ZryBcvEMz%WoX)6OWH+fI} zw9c0%&okc(e%xVXVpg%l?~q|K<1VjpPAZ8*b4?RQCp(KUnFk!e#O5lvlv`HdV~94y zQqA#D3A6me3U__>_mzpE5DB8+8o|-XMf`@EeAi7Iz6VPV2(a_^CJx$yRgPMM#ltN# zir_Sbxm`hZ9y_&VYdXO;SAs6&9yXH}K(AuceQHH-Y>oy74!y=rfPKUa8bu$53J=do|%70>Tp^iR#`kljIBqmR~stxb&{=zT%|XP@UHV16WEq4z8XD! z_M^L5mqu>2()PjEXpTPUtX1Wx$jNRxy{?1vJPOPFocoCdG?w&5 zphEybzC}b!jSykpI(D`YlG&wsLW0@}^)Ep=Bm?TBqNxy#fcGAp;3o~0s1t;Dbz41Q zR$g6EsFyhRZbQ2G<NwH*N;bv?tMXKXH{p%Z)JHz?&SNlE6u6B z-y7RgDn6dHn|*^kNISyLhT#Zj^#K$j$#W0bX)a6gv4%eoFibx=eKhMLuF5^O;8%TP zEEgy#opygA5w-UHY^A;SWMEp@$O3=;4kGHyXZAOXWi#!bI|b|0VFI8fTRH*O69 zoHp@t^%#8y3!L^7wBH|BgmTu36Qc>rYQ;FnaJ!;nQF8s ze5!sO&El(=Qwq)t2Y-=wb@sohnB#dDn8zxseTMq_A(6*XM4r@lbQ`$4sUIGfg6F!O zSjUnQgm-G6tGd`{pWnM6PI5;|gb2U)wvbU!Ns=~^ovUPy3 z2Vt2!9nd)g=p+Kg8d!Oqh|9UqrfGnGw@l4Lq!f{`@*P;lJsWY!h=|NZnA~y@ujY&< z--w}!l%SqDi1lgs-^;(HqfXc$FFP-vQ)&u!MQ0Aq8S7{hNig9W;;Pz9?L0en?P^3; z*~sRfYPmd3N1AYNNhY^7+ZlziM#bz>V*QN>gNX>47AoI&uf@)bsT9No=g-a|U$*^~ z>F%7Y#0ecN0RzNaw$m#%vg3*qVwZ>}A+|6#Ptix|9>;mW;!D(6Vpo`VGLR&^;U!6I zjC=IQrr9qo(Ah5{#8?*7;ueGh`d6*OFGFM8Q(WgV1Bb*qVrPNfq+u~)iD2i4+J7(p z>dM+=M^03}E5o=8$AhX{pVw~$3S2c0wR3G*5mbkgQ6t9>;ORLxUo0vcxfu8D zvN`Yfsr(ZLs;eYbTXo+h*^fEt6 z$syPQOzfYSLvR>=30^Xmkw2cDiTlJorTz`Gyj7&@qJb#_b#xv20h)3iB-3Sw z2D)|`9q66Pw8U%n6_y+F zM->);2&gHrRSO9bcCc~^J*}2vEAw0Oy?(1;W78&RHSsmax6K{vqx2DF;y2-YGbMN} z??YG7tHsCm8i5T}#o&}TIdRh0a7CC3OAW%sQeaJM$+my>E@-45X~_+E@mLbHUR0>s zsKc)wC0mZcl5Dv#(F{(L#gdWQZdSqZaj5V8+C;`%0#g~15f!2!ekpXqqD0~JhEXwi zeMuU-n9@Xr11|*g4c6D=^%bEOs(MG~WW?DrxR=-+`Ud<5BE2#g8{*|;<#aZlqw!%< z3py4Va6T=B@J7#s?Q5+w-j#r7k)BUP+_B6u{X0x%f<~`KXQ|I8L6YTV^gQG^&UFnE zN$iJeB0sOagkzAT!ztv(nD5GCR-$MvU~4|}j)Q;^(QSo@CJfG-A_dB2yv`YumwGdL zCy%^0rN++(#I$LmYsW$+QXpHr7(A{;^duu5yhN773@MgeJ!08|PDrBbLOzn;Q!7{< z?zN|Kx0pEZ%NpjAD&9@fnaU9(g2Q}-VNJ`lg5g^kL?519e6E@a<&FcYM(HhTsBMT0o!Z+NY8feoCYE5W~dSuqEQ8*&_~DFgSTDzRIYuo2eU#S(1D)&k+!_v}B3i8kye%t zhg9=#KgkYrXFSN&Kc7k#sNZ)pa6fReH_rP&(mB+&Swg0c$l)C-$>bygu8IpHf4BO# zf3V#rhQ~vTZ7xHVBA)Go%R=7F)VTVirS;RT?K9Ii()xLw16!$ueOA|ZRcP+_K+*_$1QRa=_1YcBl8PBC#M_z zp-YI$l%mvO%DA%v+nprnaY)#s;(g*qKx%+OMYTSni$Xpw^e~?zv_bxb>qB5EMDCh< zjV@YA!Wx2KQ$A^F$A4+50t?Ff-`{+>tc&jaQN0L?uJAWw!4hjcJ_*J#%1hm$TYLM% zzT-CJ^|KzCTRcHEWYAG@u0J}}6ULWx{0#xMMC{^28B1r1kAbh_f1dhU=C+}6kqw)3 zcg*D9MYr=gZoYh49OCow_WDzoH5oH29eKwp<-jdJfDJtAa#Y)bP{j4dN+( zdAlrTN@!Odt(e>A*ak0Z*W2q8cr>~K4ht2B?mmU|1wmQ@#44h7oBJrgToEeKrnF^} zsn~mEX5tu~N$}k1{3HtB9Lwn(k1`pbY)?CuBboQlL2R0hMOb^1;i6-W+b)uV0-mRlfRBvNsjdul$fvmKv8tR zfwhE$xXymFVVS4djgalUc^=UKl_3#Syh-aK*4~?O7JH0Lku<Ve{T5$(}|W>fIJ3j@T(7dSFUb2jHUGm1fBKYUX|8gt=0{_ zZwRA$!TT{oJOSDGz2MXAp>u$Z|Cr^is>_ZNZ3m=ZoeI(KHXcaJG(_4dws^+=U<#TX zdd)m7kxm)PMu^K_T2#D#BDChyyUEQsL5gT+h+ugdRm)m)iZ24$_eM z%`@^|`tT#~Xp(YkucG||M^sQJ@XP=iM4lJ@_y>b06By7{N)374nj7>XWl>t9p-fww$uFM;T=S7o?V^m09+k2w_4bYabdD$!W3L2l>Uy&3rPj zn`=XpUVLNKG)WKvVkY*tvJgrkRdoe_`8(Siw6;g1ZQDTi6x@!O3elR|hu%hna>g%y zdu%buKXNwqd;roWB*ZO!rap_im{e+QcM z-LW@Jp6=B&`Pc7Xg987nx$g{Xs_ELLh=K(LRC*CK^cITJ1nDJ!R1H-j3DSiCN=NBR ziy*LRDkVr0Ar$E%odghrAYCazqzR$dZ==t1-uJuCpY!u@U32a1&CHrvYt~Ng*?ZQ# zavn8T@eqAER478)FJ4Y`?Em8VeV|#4Otdr8(0)s%tQL;aSj-==6(hT1=2R$HC36BL_jH&(q3jdc^pujCetmd zoNXFDR@m7ql-8cDku`b#F;dJ|>wYMK|5I zYp37t<@=PmesSb6zScdAAg(@`MfRFeVP!qWFMDPn1UAoP%PIGc2ir&?Cl9+wAHErM za6(4_CxR(ozsT9pXhquNO;pwX7Kr1)I{$_VdS+^_(E)*jG6t1AI9xEe>5E<^_W6lT z3c}(CLZ-*?jo@CB@*ZM5vu|y^4BEjeS-9HjrP=El)wkL*-Ioyt&jbRjxDOIBUA}h* zn5b_=5uRMA|bx+H0+~gv()EiJdLA9>{%^_#e-C#-6_{Jj@A?cl$>%+kx z$n*XdWMkr%oO)8E6)Lkj=(*nM30zk({d$!$a+5Cz4Lp-<iu?ER!ags zFOE22ieNkU^fJwO7HFZen%%+TladMD@q9 zu;vTbCcOb=cO#02mL15isP^W72i=R)G56x1z_TogPYFWI{_8({{qKK87v2)m(*D*V zZf2k-p0d+e35!P+ce=;`*Vb@Bp#-D$ysD~;RO?<9$Q;(D4}{9txAQSSE>}Mn2HMRLs1my^9ABve%r<0<2Ngl9CWn(A+B%W6zad5*vENjH*0i`l z)9peDH?%8iSFArl(mtj<8J(j%|YtSki2&BMVx5A6(~-_^b!JVzY2;@14-e1b~yiQ?^VLYE%U6l0hX7^W4Qa zzDX6Eh69Cu0V}V3`3=v1Ah4Ai6i8kIV*9Dzx-zrsP)b*gn`p^ai+fw&t0^G5+obr` zfb{%6i8b*s3KTl^OezcZ= zN17-4P9STg-)u3BEEnTXB!6CbQa+KbrN?eXik&Imi-Wykvx2NBc8@$mizU|eZPVPk zHqvg%;}_39@`cW$btYnK!hTZ~Re)Sh2T6U|xJ_AwjR;v@Kn^tp+iqN2@f@2KX=xhB zrvaA4h*!<8Kah)s6{wv3a1F(MtL9{$aU{0j-M(NvruS&qf>hbzqCxUatkFOr9M{q$ zFVD;<1Tg}3zkjC0vgY~6!t#Q=fJZdEhV;8PzoT=L;k*&1>>h(i&83FDb+}M}_3kIJ zKsz~ym~$gJ=YsEul0AW81pP#YCU%AQH&4kx?lu9H0@qEYP_%@d)@}3z_BxB5B_FM= zzs5^vQ3?R(`}l}=X+G8u-_~W~snr)rXGAX0iRXDy(@t26kyDl>>*8U?FcKUg6e*Yx zPQk{c5DmK!+KObq_zRnCLCTOS8Z^4X|5K&t5x5C zueU-4KCN4=z)L4n&-b%P$>C}p96oo4aOb6-l z2k-!0Lzt`sGj5*n+uyjG)TQ0^;Y!8*c!~I6<;31d~fpt~Rbfr-c=1 zorEO~>j=yE3#E4m zeMFqy=|rI-Ejnv{;^uf5CwUaq9W64EHL@nUn}<4E$Iw99%;Bzm@{Q+&E2wyQWlSE=N!zdI!@5KsVOw|gp1**f zuA}X4NIX_r2AIR>tp9Y)50SFw_mJf?d9#(qFv7n+-hUkkpa>x7U1XO(vz_W*J6ZtYO zH|C(>MHY^$z0yC(G3QtBx&JT`F*3SbbhXZh&6n(b>|N{#T^iM_+iGh&fdJ;hC&~wj zByI~#w6(#DVzXq4Wl_Rd7x6>8R*#7hd0j=2iP}_V;*}anTh^{7+Y!B1nd_SsKTRrjNUv5r@ zborcUwHyNN9c>+$o=o?!8xhA888y0fXD%v~vyT_8-oZUfW?o8f@A*VHP%McWBh6#z za5p|eWIL~lcE;Qe73mDq_v)~M9As5QUs{4q;*p0wDRk zxg%CU)UybYc3U5v{T(xi%&(eJS9cvdi?3``AcSADQXdAX9bE4~3)hlGkDbXL=LahkzLqe_HWjSlVo9ifr9}!7B(Fpt_4RTtLgLjZFLD)} z5zmHSK_p82K6IDUuPHQHJuHw*+!va#yh^gl8^>z{DU=N`{A8{GuD4qzlG#P@4E%7EwahJky zu$R6Wv2xO#1i@vzF^b#(>sD`|7*GXxezk)@>?ObeB-ONuBtkKxFeyGLs|m7@ zkbid!;Or~nBfBctry-58iNhNJE2d`3${eK3;Kw;jN%5jtuA5`KbHOuaOaau4q=z6? zh(V|CZho^mCj<&xkTwCyGyMStOe2EinANbE6XxRr!X(^>3a{k%2 zGM5fe;b{VXBRXA~7ko}Og7=cPT%pM1mLf^eyJx!L3t`O_IPT7j<^&uN}>VF^Pno- zGlU-B=qe5^xU=axJnl%FD14gCcdB#k1c>&f}1Wc zCf!RlK^OGMH^;DI1&>WOwn}n&Xu()p%wInGs;dxm`09|S_XX^Mww=wxHt$z&PB5ak zz&{nDS(crj{Cd@;_{$cNY**`?d?G0^Bnh+bpZc_l#HpABJuOqRL4^{ zsF=K>6D`pL6-3*vdCpy(?00<%Iy%I0ka|QRZk80%5Dt2+iD2M^)hxA@dQ*_TR)%Qp zjD4}52by%qxu+%2c6X=%^xkppGfqM@M;E}`g>Xm20C{}7*yNT@4Wxhuv1O?;1yI1A zNy`iIC8ROrIEr!Wb1pdMFp%0M1oYx;Wg#Lv?)Z}`NV#$OHjqU3(lHt2mjP>x(fb1- zpi>^R$NssH3!2~?J{P6}YVhwd6%>2Ss{{VD>wvXQ!ELfhVC|RSGg$DnA|?6|Yzp$* zTt~eD@21<}q=bXrgBRcs*=8FEl5{j&M|El52y(Z$&?vSFE3q=FDUBe7%;7d>@^9mXm9%OM#mdy?};ZZHSwn3^Uq1z8J2V|?0XL8s(sybe>tJ6 zymOAf=ri?(CU7JqW${wO7cDMYa80?hFsMxtNY3kY3VP36up;a)`s;0-wnw^)fPc_6 zcv_zb+1(P-k$|LInzP$I*_Vj%))kFD8LNN(b3Jsg6l$Q+#WBUn?RbTodr6~2vf-n_ zWJB^Z)7~}N3u>60-|*IVi{VN$p$8E7&JMh)LkYc_2%S_y4vzg)*}bnW1eK99B+0`+ z4A6E+C*&82ta2kaETX$%iCyZa7H2v2a`+h`KbSbfEAtK!`8*P(gw5=TB3AC7?68^% z2w#4`k=YDR)A8`P2-zOc{}JXR{(QlhvcmC;z{5`+2E;CfPa>9yH}1ivxP?zv{;oKv z?L|_(>VDSD6qI>YkDvMV$ZUtf7JYQ}sK^J7@{roIXv0hVp6QU$l#$^8|A3~@EM-A* zi3v&+#($%mzsUfm=n7y@)+R{PM?IW`7C8q9lI@WXT-)x^3(-T7LC!$?s8Mp!+^4P} z3D33EFg9I_JLZ9Y@6W(^J3O90J)GNf9o`>K+9@MIC`H3$KjVp#B^~GRRwW^FofP+n zh|p^>jR}Kw-51_nI&XT#E8Ix2t?Gq;LgwJAS=jQ8Z!;Ov^eSIfO;y@Ayp%#m=AF~L z35w4OYf8gTqu;Y{f9QR|YU&}xRMrtB_fwx_*c~vP%+UdFmw5!oVQc||G#BdC3asqE#PDl4t^;)yV%uCf24$6Gom zAXM5yV`?}*Rp3p-p(;H-(=+E3dv-8VpY^8I;76JFDf!f#d)Y6h2}{xbytdp! z_u6Vw+-rV)q~ul7PVyX7E5l`nXFWN`FB;L+dmR<1K>g;))n_ED=!;^NA1lOVylvEZ zgPmf%-lhKfP*byQDSMj4qeu8M-^|p`)}KgK!t zw);D(oCizU{iI*(AIpOh%ff6L<=%ee81_~==<9`}PL2i9dRz)xS$>x?on;h(aXrW- zRO|WfTfTHd17?yi!m`-;7;4+=zi71%y`%I1sofwh0gJMypO|BAW z6Hid5JIVA}?|QYH6IV!1gLtZXddEc(%(CVfp2_ijOTP;Nb}^9o%ZGUbr;cyWa&~hG z%1%I!>2T;Q)y&2Z^O0^}yw^w)!*vaLQ6?fXxudL-9-n6UR4fs(G(mEWEm~$4sYAM59w||f z>a#?N2tAB9*Z@r{JIMA{G*A=u2JhQNuxL3GS(q?-GH`_t7RX#qDC+3 ziXHGab0o8F{7fjlWe;VsVBb^1v8DBit411Vo=KRzfeb`_H1M#7rfC`~P=2bM z>5iplTDUiw_e4pXvZ=CShLN}QdRNuiushVYnw|9~4$#}KOB1La2@}d&M1*~z6<+?u zLMm+cgF#}+LVMoSH<)?|%UQbH`#QkN5hQW$JM0vM22F%&#Y=8H7fn_fZLHRq<|=d_ z52i7?u*@^PcM4KJ%Z>cX09{cL-<$W;JT=ABkdj;wqw3!47RYwa)MO-9R6+C171L?R zx!cicw<51rZAjtwi;{P4$lkAC>eo@tcfCszEvMr1=L)?|bxOBR(AB$kG$GumtA!=> z*W-pfmvdYr6XyZtmoniNe&$2Jdq<4lP*2u54rX-KUq=n~r+)RYuyPhfsaPpXov=Q8 znGe^9?%r3lHxJXYt&;Yk+73tVKHf3zQDCSZ{K;(o;++we|FlnjqUgjrp=ETe=z>Pl zLnbqssz!2cI|n-&z5DLKCeeby=hszv$;oYcD{V|^PLW>>R4d?s06p5ICKqd2`@O}h zyz#zEI=4u9$2K`-RcUgK;PH^=hm+Or>7|B`KY;4a>=TzQY}FtGNh zDt|Av+=P_!UwS>lz})v%a$!zb@XZsvkLdRyqq=3MNs!h#OVT;6K1sc)!ar$Sqg$F+ zGMu3$)i_yB+O1|nrY5)avXF0*3%HL^5}mNY1t&Sr#bH`q zS5>!FCvT^QMJq^|tYVJ{+VK@x-**3eo68lqzOCBi@bRGzz7Gt(POi)sS1Cf6^oLAa zb}PmxDzj2#z{RvxB6VE(F0)MzrqIMXRr`M%H;E9re|-4La~U zW+K;ayk@lR@(i5NVVzVw9)Ho9_$rqk^_nSWK@-JzsRvr3A6a;=8yuQ%vq2tNpiD#L zl;l`pIhzLgzUP39hvzj%8fvt<#$0r(Bqw!=nhaVSB7n=o&8QM`a&*Fr*os$@CZF}X zD_p?D9RN4pg*Cxv=?aa^@69v#3cIsC=0cxR4zywLSDK3M*BF1h5~gAdZ5RB+bhG$# z&OY9&H6|=2)I^?cSmeuT!58PAT;uG^rP`L>oPR(uL9N=CPl(ks|8nQ!sc-t2o)=^+ojxE8ggw5BEKnxEbUb#$8s~ zUcJl7Qc?P}pi{37K`sjlpEuLvn|S0V=aE=_xbj=8c6sFB+bRacNbFw7p?b();`Hs=h4}%8+|H#6H>l7?}jzJdNUk;~PMlW@{-6eJB-Q+}1?|vKeYk>}lI!1lA z|FOak4CatF$B6#crRFMzd&U&&YZt5B7ix)BK{S*yFVEDpVFbZP(Ac$j4`I2~EpTVH z4q(rW?{uebt+({xd#`(zHYKB-(!@;~Wj2#?_W_kr(9N!P!;Vjxx^2QxkHQbsKV zf9%F&OpTacob!(n7Qe)+n5mv!>)j}+z(G{IVPiX_+rSPjQ4jnu{7VR`Btj%upbEhx z3+#PQt*cj>l&JA%htra5A9JQ5f_LND6zXpp9{G}!1ec!Mvz6t3KH@dfeV!E;ZghB~ z_RE@fsky;r!SfyazC2f>${GfK4d3m&C}i_yB?6Yi9OOaxHJ$Te3~Pb~cZtp2?|a=r zocub&HPK^pYmA}p^fbGSvMdYy=*}z2y)qD7@fLGx%@Fd`C~9tG`M?~TB=wr3|h`3m10;~hum+oPJa5p093lZ5ylX zrP*Pl4Bw|emz(TOeVmA)J zIRm!&KdsM9vVuuk+&!QcADQ zdKo1=55eeZ@osY=k_gVA>AfGV;4pRV;vJp{qx|w8P3~Z1wxEdwxsfxtq4`MN?nSB^ z1T`Vg8PAMj3^rMDQ6kLnpzSBb9L>*b{UnlK=X1NQ7vsA0mSnZ0UXPz)70th^=YJ{*Xp$HvQHk<9DlI3qI_3bQu& z(Is((=|Drb`x$4_y$F>B%;kQ%aH-dumdU{C(^($9@+r{oUX(NnFy)tDv_FbeXpQI(TTa70!yn#i8ie6IE z!QzGCrOtHMxy>xeXNKXaPrUNqzyCQbKQ0V>fO<4JFp^nRp(oXC1*x_{K)w%2T-!#k zds;NlD%M#KCTDagUn?FjwlX&^%qvMmc+7vPEf3shPD+BFN?W%*EsorzUp0C??slbK zKzRNtu7NN`zbqI7wN3K)xh3L8+%Ctj4qJVa{hS=?GKK?JkSh)ZHkkd>UcLD_xnD=j zd3i~G7Vmdf3S~nzwFU1HO5I0!$REJhbM3+vDUDRyIB-1-EEw*S-GekX@7nVQJsiKr z{+yk`bz$Y#e)Y#mJ&=oitGj9xq1Jiyt>z3z`xAkvr&CdlJdckOBRpI%Z`922gi*h= zm^)^MuW;;}{#Yn=Uuw^h*JNj@XPKky@|hK6ZHlk&kjzizMRK~CxALR!j|R!Ekq5>r z%0+C4XIvU_n~&Z(eOhrLw3=-w|4=~&t-&E5Qg$RkA}BI(1^E<55YK{j-U0LZH~=lj z#K!+g?DHoJQ3{=qR3Dfs$n0;*Bd=t-WiSl?xY`yNrw>0S>B7N|69C1)AA)iEMnKk| z+(Iv~(9D16ySDz&dHo}}%NVc$r(!hs8-$jnI68+QF-=s>ELc|6z>K~*9 zn`Z?B_ami1PJq5tn&Zxeh{viN_Xz>1kHMzLM8r4#A;tQKGI{0?OU2D9}qO%7` zgVH?9KaY;qS%z=G`_@B~T3}xXgVMq~3(ua%$KpL{<(8E^hCSI2Vt3tX-HFOw&}yX6 zm2gzG0nXegdG+YLQbm9z$@Ug@F=1JA zbnQ!a`kM!24>ybT`1b^*lmg-&(kb@Vd%(qR!;ax9-36(0l2SI5R8$M_h-j%756(p0 z8|r#4brFo|x~{J@3B3-@adA<1j+@OqipxzMeEva!gIAtW`0Tb$)QPLj3@Tn)f?jyb zNUM$-=)+T#AzELf7C=TVY7tzQ4IhM#6w_QTJh)+D4_CwXNW529hb5S6pSZAql;~ch zaL8VTWnFke;mL8u8l&@$Xcf12akJJ1AD{>oelX}M@c_6?5?VEo-qgK2OUnQ~cnfWa z*ZZxGWd7{@Mq3MtkY{>IcO~_%`Siq=BMIw@uiwMLW}OVJq^`l1=1cgmT(%!f7{1Db zh1mh3e6(#9jPECgzSI@3#&pWGtzA{cs$ezV|4RHC?wF;;PVAvVZTzkw#KO4crr#wS z$0ARcGS0-nDzFS&( z7Lg}SiLa1uh|QfwYj1bNt^jNM(PhkVf17GJEV5(f zDR5i8BlT*xhKtD@Mm{RUUWx)&LkQzl(RQ)IuiDm zNsc`m@#_geCReKc6qGK9;+9l))J{zNRIJTu#ILZLuKj1G7auuHB6arP)DQxbZW+c7 zw-~#N3m@ zC(Eh20gMvY)81U7c+HBxNL$WuMT$@LGB2f_@d^L%gfLhX&tVwYL9O$U+~6yE!w{I^ zbHcBvU-iwx5vZ$DNvffQ>mu>rX;WDrUgdzq;H$v5d)T*SSu$K7e~KhxEU^?PdZQAe zqbO8O>IJ^X&;lVmr;=PW6Bas8yf1}byC8LRCbsTUI0{5%i!SYY{_rB~0O!l5rjbNM!zAUy2t|-kh^Cb~=CeVPX~S{3;p%(|I`D zBb+pJ2i9A2yUGIg`y3~*@)(_$x27uP-7i=lOyv8&KrXM~2gWkBYKxE~ikS%_@>kwH z(a{OJswS}M%h7BaU8shq@24_FfGvKWsprG z)BdD7I_Sv|bG+n3sT0Y=O(yvr(4gQ3uD5Q=_<#sxH(SrFh3NPOob>ZnKZ{OlhFHHH zC(KWi_ioA19CS&`=2m$df%vU5+-T1QKh~+3i5h!J7O{px2%@6okIgl>fii=ql!-Y( zQS-m-M(d4xkP*9*t>1^@kD6~Ck>)h@H+U2jP?dYpK#5!@N-eT>}WKv8xrZxJqx5j&nQp(Ol z#O~?jCOhP|*^g!mTnucEiUvAf8iqV5Y?q7d4Y%pEzAgXFCH9&T&{tM zB|Zpkndz6ljz>MXTu}Ty?NHOv93_`?y86?vnu^FiEGSZP?os$rLCj4GLm@f{)sMyVVI)fneVykM?u#W_B@=c)eq3u z0?Q|xzT6z{SY0s%N_SdCDvtt{cNDUMLFAZNT{1oa_aE;2YVpeuzayywzL0N*lc@eM zmX=eztoir{-~FLcML+TX%L#i-5lc8uVA%_8Za9XaAcnL-G5-DV2TV5DU(Wc0HoL}5 z|K`!~O8(0jHU4i>3-WR5O^}Q^LEw#Q*YG{gV#V5d_{-Hh&?ghxq>j#iTzF{aC^OM#H3le+RLWs_|z~6Mvv7 z+VL&S0W|0FGQiL7Un~A!2>Y+?{s8P_zAn&4G1<_Rtm7rZBFX?VAf8w=^Ji+-H(#-B zyd?x4BBn%e#ev|^vY`zJ9pWf3wnx)Dx#l}~o{8joIlKfuH8(|_1F>-8OJQOIVF#4C zzqTIV1*h%J9l!GRK+kNMx7~SI zpQJV->Mt#sstkv{WVM&t623Yb-?ra!yyJ$x?KaCzr`*Rz-t$|*UonY^p4O1?WD&o- zBOK>F6#M*u)xEPYUh-2i;e14m)6EI4YY+_3eTW(Mwme-p)^xLz&k<{n z^AE0atX-YFXF#xq`6knabc%F1pop0H&nIju&Ce^4YEO}5r$m@SAYfb!`kuV>6K4a- zqLpeG4Teqy_YQF0sI}zC{J4^W7kY%(V*)RlblvaqvKuKkgOBxH)Y$NEEAQr2(?L+B zy5UWe_6Dq~o-gDBIz}zrR)HOaZx4DqPkdy@v8vgTwi^ygP|DF(hfwHW zD-R^LI-_tE4s$IMjb3s1!-Nu?{h0!ny1$_XxKX34zYC_!E4FQgzM<54@>awI%W>_v<#R_#_z|ehv zEtmI+Bc-lB+(D)#Lw_vWGi5nOt*|5&tUg@9pO$R7V_b4JLXOk@MfZ;hR)H0INlEy-RfZuY43Lip?hu_ng!rDhPx3eqYvg@;3|b6ex#vRy6&z z_4nqX0RMO%1pm^|<)yt1c@6vT0tQ;b{uY%GC?)dge-*0k6UcuGRT7;5(|?!S5CNvY z<-))1|2>94ZvlVH6N-P^|9ecL>ptzsLU!i$~?3_W#QH&#", + "license": "MIT", + "module": "dist/index.js", + "es2015": "dist/esm/index.js", + "es2017": "dist/esm/index.js", + "jsnext:main": "dist/esm/index.js", + "main": "dist/index.cjs.js", + "unpkg": "dist/duet/duet.js", + "types": "dist/types/components.d.ts", + "collection": "dist/collection/collection-manifest.json", + "repository": { + "type": "git", + "url": "https://github.com/duetds/date-picker.git" + }, + "publishConfig": { + "access": "public" + }, + "files": [ + "custom-element", + "dist", + "hydrate/index.js", + "hydrate/index.d.ts" + ], + "scripts": { + "start": "npm run dev", + "dev": "stencil build --dev --es5 --watch --serve", + "docs": "stencil build --docs-readme", + "build": "stencil build --es5", + "precommit": "stencil test --spec --silent", + "test": "stencil test --spec --e2e --silent", + "test:dev": "stencil test --spec --e2e --watchAll", + "test:unit": "stencil test --spec --silent", + "test:e2e": "stencil test --e2e --silent", + "lint:js": "eslint \"**/*.{js,ts,tsx}\" --cache --quiet", + "lint:sass": "sass-lint -c ./.sasslintrc.json", + "lint:sass:fix": "sass-lint-auto-fix", + "preversion": "npm run lint:js && npm run lint:sass && npm test", + "version": "npm run build", + "postversion": "npm publish", + "postpublish": "git push origin master --tags" + }, + "husky": { + "hooks": { + "pre-commit": "pretty-quick --staged", + "pre-push": "npm run lint:js && npm run lint:sass" + } + }, + "engines": { + "node": ">= 12.17.0", + "npm": ">= 6.14.0" + }, + "bugs": { + "email": "duetdesignsystem@lahitapiola.fi" + }, + "dependencies": { + "@stencil/core": "^2.3.0" + }, + "devDependencies": { + "@stencil/sass": "1.3.2", + "@stencil/utils": "latest", + "@types/jest": "26.0.10", + "@types/jest-image-snapshot": "3.1.0", + "@types/puppeteer": "3.0.1", + "@typescript-eslint/eslint-plugin": "2.13.0", + "@typescript-eslint/parser": "2.13.0", + "eslint": "6.8.0", + "eslint-config-prettier": "6.7.0", + "eslint-plugin-prettier": "3.1.2", + "husky": "4.2.5", + "jest": "26.4.1", + "jest-cli": "26.4.1", + "jest-image-snapshot": "4.1.0", + "prettier": "1.19.1", + "prettier-stylelint": "0.4.2", + "pretty-quick": "^2.0.1", + "puppeteer": "5.2.1", + "sass-lint": "1.13.1", + "sass-lint-auto-fix": "0.21.2", + "typescript": "3.9.7" + }, + "sasslintConfig": "./.sasslintrc.json", + "eslintConfig": { + "parser": "@typescript-eslint/parser", + "parserOptions": { + "sourceType": "module", + "accessibility": "off", + "ecmaVersion": 2018, + "ecmaFeatures": { + "jsx": true + } + }, + "extends": [ + "plugin:@typescript-eslint/recommended", + "prettier/@typescript-eslint", + "plugin:prettier/recommended" + ], + "plugins": [ + "@typescript-eslint" + ], + "rules": { + "comma-dangle": [ + "error", + "only-multiline" + ], + "curly": [ + "error", + "all" + ], + "no-console": "off", + "no-undef": "off", + "no-var": "off", + "prefer-rest-params": "off", + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/explicit-member-accessibility": "off", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/no-inferrable-types": "off", + "@typescript-eslint/no-this-alias": "off", + "@typescript-eslint/ban-ts-ignore": "off" + } + } +} diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/prerender.config.ts b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/prerender.config.ts new file mode 100644 index 00000000..ede86ed9 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/prerender.config.ts @@ -0,0 +1,12 @@ +import { PrerenderConfig } from "@stencil/core" + +export const config: PrerenderConfig = { + hydrateOptions(url) { + return { + prettyHtml: false, + clientHydrateAnnotations: true, + removeScripts: false, + removeUnusedStyles: false, + } + }, +} diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/__image_snapshots__/duet-date-picker-e-2-e-ts-duet-date-picker-min-max-support-supports-a-max-date-1-snap.png b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/__image_snapshots__/duet-date-picker-e-2-e-ts-duet-date-picker-min-max-support-supports-a-max-date-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..ecf2290bea3a6d4f2872c27758591b17cdb98cc6 GIT binary patch literal 24480 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 He>?v#j2hvj literal 0 HcmV?d00001 diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/__image_snapshots__/duet-date-picker-e-2-e-ts-duet-date-picker-min-max-support-supports-a-min-date-1-snap.png b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/__image_snapshots__/duet-date-picker-e-2-e-ts-duet-date-picker-min-max-support-supports-a-min-date-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..a3c2b89e11c9506d8890f6372385d2e95cd6de00 GIT binary patch literal 24404 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 ald~N7B&aia3Keh)g?{qPi3&6K_`d)u^3+-Y literal 0 HcmV?d00001 diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-adapter.ts b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-adapter.ts new file mode 100644 index 00000000..1947287d --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-adapter.ts @@ -0,0 +1,13 @@ +import { parseISODate, printISODate, createDate } from "./date-utils" + +type CreateDate = typeof createDate +export type DuetDateParser = (input: string, createDate: CreateDate) => Date | undefined +export type DuetDateFormatter = (date: Date) => string + +export interface DuetDateAdapter { + parse: DuetDateParser + format: DuetDateFormatter +} + +const isoAdapter: DuetDateAdapter = { parse: parseISODate, format: printISODate } +export default isoAdapter diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-localization.ts b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-localization.ts new file mode 100644 index 00000000..341e7cfe --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-localization.ts @@ -0,0 +1,49 @@ +type MonthsNames = [string, string, string, string, string, string, string, string, string, string, string, string] +type DayNames = [string, string, string, string, string, string, string] + +export type DuetLocalizedText = { + buttonLabel: string + placeholder: string + selectedDateMessage: string + prevMonthLabel: string + nextMonthLabel: string + monthSelectLabel: string + yearSelectLabel: string + closeLabel: string + calendarHeading: string + dayNames: DayNames + monthNames: MonthsNames + monthNamesShort: MonthsNames + locale: string | string[] +} + +const localization: DuetLocalizedText = { + buttonLabel: "Choose date", + placeholder: "YYYY-MM-DD", + selectedDateMessage: "Selected date is", + prevMonthLabel: "Previous month", + nextMonthLabel: "Next month", + monthSelectLabel: "Month", + yearSelectLabel: "Year", + closeLabel: "Close window", + calendarHeading: "Choose a date", + dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + monthNames: [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + ], + monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + locale: "en-GB", +} + +export default localization diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-picker-day.tsx b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-picker-day.tsx new file mode 100644 index 00000000..16cf8852 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-picker-day.tsx @@ -0,0 +1,65 @@ +import { h, FunctionalComponent } from "@stencil/core" +import { isEqual, isEqualMonth } from "./date-utils" + +export type DatePickerDayProps = { + focusedDay: Date + today: Date + day: Date + disabled: boolean + inRange: boolean + isSelected: boolean + dateFormatter: Intl.DateTimeFormat + onDaySelect: (event: MouseEvent, day: Date) => void + onKeyboardNavigation: (event: KeyboardEvent) => void + focusedDayRef?: (element: HTMLElement) => void +} + +export const DatePickerDay: FunctionalComponent = ({ + focusedDay, + today, + day, + onDaySelect, + onKeyboardNavigation, + focusedDayRef, + disabled, + inRange, + isSelected, + dateFormatter, +}) => { + const isToday = isEqual(day, today) + const isMonth = isEqualMonth(day, focusedDay) + const isFocused = isEqual(day, focusedDay) + const isOutsideRange = !inRange + + function handleClick(e) { + onDaySelect(e, day) + } + + return ( + + ) +} diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-picker-input.tsx b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-picker-input.tsx new file mode 100644 index 00000000..f144ca7e --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-picker-input.tsx @@ -0,0 +1,92 @@ +import { h, FunctionalComponent } from "@stencil/core" +import { DuetLocalizedText } from "./date-localization" + +type DatePickerInputProps = { + value: string + formattedValue: string + valueAsDate: Date + localization: DuetLocalizedText + name: string + identifier: string + disabled: boolean + required: boolean + role: string + dateFormatter: Intl.DateTimeFormat + onClick: (event: MouseEvent) => void + onInput: (event: InputEvent) => void + onBlur: (event: FocusEvent) => void + onFocus: (event: FocusEvent) => void + buttonRef: (element: HTMLButtonElement) => void + inputRef: (element: HTMLInputElement) => void +} + +export const DatePickerInput: FunctionalComponent = ({ + onClick, + dateFormatter, + localization, + name, + formattedValue, + valueAsDate, + value, + identifier, + disabled, + required, + role, + buttonRef, + inputRef, + onInput, + onBlur, + onFocus, +}) => { + return ( +
+ + + +
+ ) +} diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-picker-month.tsx b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-picker-month.tsx new file mode 100644 index 00000000..5e133788 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-picker-month.tsx @@ -0,0 +1,92 @@ +import { h, FunctionalComponent } from "@stencil/core" +import { DuetLocalizedText } from "./date-localization" +import { DatePickerDay, DatePickerDayProps } from "./date-picker-day" +import { getViewOfMonth, inRange, DaysOfWeek, isEqual } from "./date-utils" +import { DateDisabledPredicate } from "./duet-date-picker" + +function chunk(array: T[], chunkSize: number): T[][] { + const result = [] + + for (let i = 0; i < array.length; i += chunkSize) { + result.push(array.slice(i, i + chunkSize)) + } + + return result +} + +function mapWithOffset(array: T[], startingOffset: number, mapFn: (item: T) => U): U[] { + return array.map((_, i) => { + const adjustedIndex = (i + startingOffset) % array.length + return mapFn(array[adjustedIndex]) + }) +} + +type DatePickerMonthProps = { + selectedDate: Date + focusedDate: Date + labelledById: string + localization: DuetLocalizedText + firstDayOfWeek: DaysOfWeek + min?: Date + max?: Date + dateFormatter: Intl.DateTimeFormat + isDateDisabled: DateDisabledPredicate + onDateSelect: DatePickerDayProps["onDaySelect"] + onKeyboardNavigation: DatePickerDayProps["onKeyboardNavigation"] + focusedDayRef: (element: HTMLElement) => void +} + +export const DatePickerMonth: FunctionalComponent = ({ + selectedDate, + focusedDate, + labelledById, + localization, + firstDayOfWeek, + min, + max, + dateFormatter, + isDateDisabled, + onDateSelect, + onKeyboardNavigation, + focusedDayRef, +}) => { + const today = new Date() + const days = getViewOfMonth(focusedDate, firstDayOfWeek) + + return ( + + + + {mapWithOffset(localization.dayNames, firstDayOfWeek, dayName => ( + + ))} + + + + {chunk(days, 7).map(week => ( + + {week.map(day => ( + + ))} + + ))} + +
+ + {dayName} +
+ +
+ ) +} diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-utils.spec.ts b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-utils.spec.ts new file mode 100644 index 00000000..c144d0b2 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-utils.spec.ts @@ -0,0 +1,359 @@ +import { + isEqual, + isEqualMonth, + addDays, + addMonths, + addYears, + startOfWeek, + endOfWeek, + setMonth, + setYear, + inRange, + clamp, + startOfMonth, + endOfMonth, + getViewOfMonth, + parseISODate, + printISODate, + DaysOfWeek, +} from "./date-utils" + +describe("duet-date-picker/date-utils", () => { + describe("parseISODate", () => { + it("handles falsy values", () => { + // @ts-ignore + expect(parseISODate()).toBeUndefined() + // @ts-ignore + expect(parseISODate(false)).toBeUndefined() + // @ts-ignore + expect(parseISODate("")).toBeUndefined() + // @ts-ignore + expect(parseISODate(null)).toBeUndefined() + // @ts-ignore + expect(parseISODate(0)).toBeUndefined() + }) + + it("returns undefined for invalid strings", () => { + // invalid format + expect(parseISODate("hello world")).toBeUndefined() + expect(parseISODate("01/01/2020")).toBeUndefined() + expect(parseISODate("01.01.2020")).toBeUndefined() + expect(parseISODate("01-01-2020")).toBeUndefined() + expect(parseISODate("2020/01/01")).toBeUndefined() + // expect(parseISODate("2020-01-01")).toBeUndefined() + expect(parseISODate("2020--01--01")).toBeUndefined() + expect(parseISODate("19-01-01")).toBeUndefined() + expect(parseISODate("190-01-01")).toBeUndefined() + expect(parseISODate("2020-000001-000001")).toBeUndefined() + expect(parseISODate("0xAA-01-01")).toBeUndefined() + + // correct format, but invalid dates + expect(parseISODate("2020-12-32")).toBeUndefined() + expect(parseISODate("2020-13-01")).toBeUndefined() + }) + + it("returns a date for valid strings", () => { + expect(parseISODate("2020-01-01")).toEqual(new Date(2020, 0, 1)) + }) + }) + + describe("isEqual", () => { + it("compares dates", () => { + expect(isEqual(new Date(2020, 0, 1), new Date(2020, 0, 1))).toBe(true) + expect(isEqual(new Date(2020, 0, 1), new Date(2020, 0, 2))).toBe(false) + + expect(isEqual(null, new Date(2020, 0, 1))).toBe(false) + expect(isEqual(new Date(2020, 0, 1), null)).toBe(false) + expect(isEqual(null, null)).toBe(false) + }) + }) + + describe("isEqualMonth", () => { + it("compares dates", () => { + expect(isEqualMonth(new Date(2020, 0, 1), new Date(2020, 0, 1))).toBe(true) + expect(isEqualMonth(new Date(2020, 0, 1), new Date(2020, 0, 31))).toBe(true) + + expect(isEqualMonth(new Date(2020, 0, 1), new Date(2020, 1, 1))).toBe(false) + expect(isEqualMonth(new Date(2020, 0, 1), new Date(2021, 0, 1))).toBe(false) + + expect(isEqualMonth(null, new Date(2020, 0, 1))).toBe(false) + expect(isEqualMonth(new Date(2020, 0, 1), null)).toBe(false) + expect(isEqualMonth(null, null)).toBe(false) + }) + }) + + describe("printISODate", () => { + it("should print in format dd.mm.yyyy", () => { + expect(printISODate(new Date(2020, 0, 1))).toBe("2020-01-01") + expect(printISODate(new Date(2020, 8, 9))).toBe("2020-09-09") + expect(printISODate(new Date(2020, 9, 10))).toBe("2020-10-10") + }) + + it("returns empty string for undefined dates", () => { + expect(printISODate(undefined)).toBe("") + }) + }) + + describe("addDays", () => { + it("can add days", () => { + const date = new Date(2020, 0, 30) + expect(addDays(date, 1)).toEqual(new Date(2020, 0, 31)) + expect(addDays(date, 7)).toEqual(new Date(2020, 1, 6)) + expect(addDays(date, 366)).toEqual(new Date(2021, 0, 30)) + }) + + it("can subtract days", () => { + const date = new Date(2020, 0, 31) + expect(addDays(date, -1)).toEqual(new Date(2020, 0, 30)) + expect(addDays(date, -2)).toEqual(new Date(2020, 0, 29)) + expect(addDays(date, -7)).toEqual(new Date(2020, 0, 24)) + }) + }) + + describe("addMonths", () => { + it("can add months", () => { + const date = new Date(2020, 0, 1) + expect(addMonths(date, 1)).toEqual(new Date(2020, 1, 1)) + expect(addMonths(date, 2)).toEqual(new Date(2020, 2, 1)) + expect(addMonths(date, 12)).toEqual(new Date(2021, 0, 1)) + }) + + it("can subtract months", () => { + const date = new Date(2020, 2, 1) + expect(addMonths(date, -1)).toEqual(new Date(2020, 1, 1)) + expect(addMonths(date, -2)).toEqual(new Date(2020, 0, 1)) + expect(addMonths(date, -12)).toEqual(new Date(2019, 2, 1)) + }) + }) + + describe("addYears", () => { + it("can add years", () => { + const date = new Date(2020, 0, 1) + expect(addYears(date, 1)).toEqual(new Date(2021, 0, 1)) + expect(addYears(date, 10)).toEqual(new Date(2030, 0, 1)) + }) + + it("can subtract years", () => { + const date = new Date(2020, 0, 1) + expect(addYears(date, -1)).toEqual(new Date(2019, 0, 1)) + expect(addYears(date, -10)).toEqual(new Date(2010, 0, 1)) + }) + }) + + describe("startOfWeek", () => { + it("returns the first day of the week", () => { + expect(startOfWeek(new Date(2020, 0, 1))).toEqual(new Date(2019, 11, 30)) + }) + + it("returns the same date if already start of the week", () => { + const start = startOfWeek(new Date(2020, 0, 1)) + expect(startOfWeek(start)).toEqual(start) + }) + + it("supports changing the first day of the week", () => { + expect(startOfWeek(new Date(2020, 0, 1), DaysOfWeek.Sunday)).toEqual(new Date(2019, 11, 29)) + }) + }) + + describe("endOfWeek", () => { + it("returns the first day of the week", () => { + expect(endOfWeek(new Date(2020, 0, 1))).toEqual(new Date(2020, 0, 5)) + }) + + it("returns the same date if already start of the week", () => { + const end = endOfWeek(new Date(2020, 0, 1)) + expect(endOfWeek(end)).toEqual(end) + }) + + it("supports changing the first day of the week", () => { + expect(endOfWeek(new Date(2020, 0, 1), DaysOfWeek.Sunday)).toEqual(new Date(2020, 0, 4)) + }) + }) + + describe("setMonths", () => { + it("sets the month and returns a new date", () => { + const date = new Date(2020, 0, 1) + const result = setMonth(date, 1) + + expect(result).not.toBe(date) + expect(result).toEqual(new Date(2020, 1, 1)) + }) + }) + + describe("setYears", () => { + it("sets the year and returns a new date", () => { + const date = new Date(2020, 0, 1) + const result = setYear(date, 2021) + + expect(result).not.toBe(date) + expect(result).toEqual(new Date(2021, 0, 1)) + }) + }) + + describe("inRange", () => { + it("returns false for dates below min", () => { + const min = new Date(2020, 0, 1) + const max = new Date(2020, 11, 31) + const date = new Date(2019, 1, 1) + + expect(inRange(date, min, max)).toBe(false) + }) + + it("returns false for dates above max", () => { + const min = new Date(2020, 0, 1) + const max = new Date(2020, 11, 31) + const date = new Date(2021, 1, 1) + + expect(inRange(date, min, max)).toBe(false) + }) + + it("returns true for dates in range", () => { + const min = new Date(2020, 0, 1) + const max = new Date(2020, 11, 31) + const date = new Date(2020, 1, 1) + + expect(inRange(date, min, max)).toBe(true) + expect(inRange(min, min, max)).toBe(true) + expect(inRange(max, min, max)).toBe(true) + }) + + it("supports only specifying a minimum", () => { + const min = new Date(2020, 0, 1) + + expect(inRange(new Date(2020, 1, 1), min)).toBe(true) + expect(inRange(min, min)).toBe(true) + expect(inRange(new Date(2019, 0, 1), min)).toBe(false) + }) + + it("supports only specifying a maximum", () => { + const max = new Date(2020, 1, 1) + + expect(inRange(new Date(2020, 0, 1), undefined, max)).toBe(true) + expect(inRange(max, undefined, max)).toBe(true) + expect(inRange(new Date(2021, 0, 1), undefined, max)).toBe(false) + }) + + it("handles undefined min and max", () => { + expect(inRange(new Date(2020, 0, 1))).toBe(true) + }) + }) + + describe("clamp", () => { + it("returns min date for dates below min", () => { + const min = new Date(2020, 0, 1) + const max = new Date(2020, 11, 31) + const date = new Date(2019, 11, 31) + + expect(clamp(date, min, max)).toBe(min) + }) + + it("returns max date for dates above max", () => { + const min = new Date(2020, 0, 1) + const max = new Date(2020, 11, 31) + const date = new Date(2021, 0, 1) + + expect(clamp(date, min, max)).toBe(max) + }) + + it("returns date if in range", () => { + const min = new Date(2020, 0, 1) + const max = new Date(2020, 11, 31) + const date = new Date(2020, 5, 1) + + expect(clamp(date, min, max)).toBe(date) + expect(clamp(min, min, max)).toBe(min) + expect(clamp(max, min, max)).toBe(max) + }) + + it("supports only specifying a minimum", () => { + const min = new Date(2020, 0, 1) + const date = new Date(2020, 1, 1) + + expect(clamp(date, min)).toBe(date) + expect(clamp(min, min)).toBe(min) + }) + + it("supports only specifying a maximum", () => { + const max = new Date(2020, 1, 1) + const date = new Date(2020, 0, 1) + + expect(clamp(date, undefined, max)).toBe(date) + expect(clamp(max, undefined, max)).toBe(max) + }) + + it("handles undefined min and max", () => { + const date = new Date(2020, 0, 1) + expect(clamp(date)).toBe(date) + }) + }) + + describe("startOfMonth", () => { + it("returns the first day of the month", () => { + for (var i = 0; i < 12; i++) { + var date = new Date(2020, i, 10) // arbitrary day in middle of month + expect(startOfMonth(date)).toEqual(new Date(2020, i, 1)) + } + }) + }) + + describe("endOfMonth", () => { + it("returns the last day of the month", () => { + expect(endOfMonth(new Date(2020, 0, 10))).toEqual(new Date(2020, 0, 31)) // jan + expect(endOfMonth(new Date(2020, 1, 10))).toEqual(new Date(2020, 1, 29)) // feb (leap year) + expect(endOfMonth(new Date(2019, 1, 10))).toEqual(new Date(2019, 1, 28)) // feb (regular year) + expect(endOfMonth(new Date(2020, 2, 10))).toEqual(new Date(2020, 2, 31)) // march + expect(endOfMonth(new Date(2020, 3, 10))).toEqual(new Date(2020, 3, 30)) // april + expect(endOfMonth(new Date(2020, 4, 10))).toEqual(new Date(2020, 4, 31)) // may + expect(endOfMonth(new Date(2020, 5, 10))).toEqual(new Date(2020, 5, 30)) // june + expect(endOfMonth(new Date(2020, 6, 10))).toEqual(new Date(2020, 6, 31)) // july + expect(endOfMonth(new Date(2020, 7, 10))).toEqual(new Date(2020, 7, 31)) // august + expect(endOfMonth(new Date(2020, 8, 10))).toEqual(new Date(2020, 8, 30)) // september + expect(endOfMonth(new Date(2020, 9, 10))).toEqual(new Date(2020, 9, 31)) // october + expect(endOfMonth(new Date(2020, 10, 10))).toEqual(new Date(2020, 10, 30)) // november + expect(endOfMonth(new Date(2020, 11, 10))).toEqual(new Date(2020, 11, 31)) // december + }) + }) + + describe("getViewOfMonth", () => { + function range(from: number, to: number) { + var result = [] + for (var i = 0; i <= to - from; i++) { + result.push(from + i) + } + return result + } + + function assertMonth(days: Date[], expected) { + expect(days.map(d => d.getDate())).toEqual(expected) + } + + it("gives a correct view of the month", () => { + // jan + assertMonth(getViewOfMonth(new Date(2020, 0, 10)), [30, 31, ...range(1, 31), 1, 2]) + // feb (leap year) + assertMonth(getViewOfMonth(new Date(2020, 1, 10)), [...range(27, 31), ...range(1, 29), 1]) + // feb (regular year) + assertMonth(getViewOfMonth(new Date(2019, 1, 10)), [...range(28, 31), ...range(1, 28), ...range(1, 3)]) + //march + assertMonth(getViewOfMonth(new Date(2020, 2, 10)), [...range(24, 29), ...range(1, 31), ...range(1, 5)]) + // april + assertMonth(getViewOfMonth(new Date(2020, 3, 10)), [30, 31, ...range(1, 30), ...range(1, 3)]) + // may + assertMonth(getViewOfMonth(new Date(2020, 4, 10)), [...range(27, 30), ...range(1, 31)]) + // june + assertMonth(getViewOfMonth(new Date(2020, 5, 10)), [...range(1, 30), ...range(1, 5)]) + // july + assertMonth(getViewOfMonth(new Date(2020, 6, 10)), [29, 30, ...range(1, 31), 1, 2]) + // august + assertMonth(getViewOfMonth(new Date(2020, 7, 10)), [...range(27, 31), ...range(1, 31), ...range(1, 6)]) + // september + assertMonth(getViewOfMonth(new Date(2020, 8, 10)), [31, ...range(1, 30), ...range(1, 4)]) + // october + assertMonth(getViewOfMonth(new Date(2020, 9, 10)), [...range(28, 30), ...range(1, 31), 1]) + // november + assertMonth(getViewOfMonth(new Date(2020, 10, 10)), [...range(26, 31), ...range(1, 30), ...range(1, 6)]) + // december + assertMonth(getViewOfMonth(new Date(2020, 11, 10)), [30, ...range(1, 31), ...range(1, 3)]) + }) + }) +}) diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-utils.ts b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-utils.ts new file mode 100644 index 00000000..4ffd7818 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/date-utils.ts @@ -0,0 +1,222 @@ +const ISO_DATE_FORMAT = /^(\d{4})-(\d{2})-(\d{2})$/ + +export enum DaysOfWeek { + Sunday = 0, + Monday = 1, + Tuesday = 2, + Wednesday = 3, + Thursday = 4, + Friday = 5, + Saturday = 6, +} + +export function createDate(year: string, month: string, day: string): Date { + var dayInt = parseInt(day, 10) + var monthInt = parseInt(month, 10) + var yearInt = parseInt(year, 10) + + const isValid = + Number.isInteger(yearInt) && // all parts should be integers + Number.isInteger(monthInt) && + Number.isInteger(dayInt) && + monthInt > 0 && // month must be 1-12 + monthInt <= 12 && + dayInt > 0 && // day must be 1-31 + dayInt <= 31 && + yearInt > 0 + + if (isValid) { + return new Date(yearInt, monthInt - 1, dayInt) + } +} + +/** + * @param value date string in ISO format YYYY-MM-DD + */ +export function parseISODate(value: string): Date { + if (!value) { + return + } + + const matches = value.match(ISO_DATE_FORMAT) + + if (matches) { + return createDate(matches[1], matches[2], matches[3]) + } +} + +/** + * print date in format YYYY-MM-DD + * @param date + */ +export function printISODate(date: Date): string { + if (!date) { + return "" + } + + var d = date.getDate().toString(10) + var m = (date.getMonth() + 1).toString(10) + var y = date.getFullYear().toString(10) + + // days are not zero-indexed, so pad if less than 10 + if (date.getDate() < 10) { + d = `0${d}` + } + + // months *are* zero-indexed, pad if less than 9! + if (date.getMonth() < 9) { + m = `0${m}` + } + + return `${y}-${m}-${d}` +} + +/** + * Compare if two dates are equal in terms of day, month, and year + */ +export function isEqual(a: Date, b: Date): boolean { + if (a == null || b == null) { + return false + } + + return isEqualMonth(a, b) && a.getDate() === b.getDate() +} + +/** + * Compare if two dates are in the same month of the same year. + */ +export function isEqualMonth(a: Date, b: Date): boolean { + if (a == null || b == null) { + return false + } + + return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() +} + +export function addDays(date: Date, days: number): Date { + var d = new Date(date) + d.setDate(d.getDate() + days) + return d +} + +export function addMonths(date: Date, months: number): Date { + const d = new Date(date) + d.setMonth(date.getMonth() + months) + return d +} + +export function addYears(date: Date, years: number): Date { + const d = new Date(date) + d.setFullYear(date.getFullYear() + years) + return d +} + +export function startOfWeek(date: Date, firstDayOfWeek: DaysOfWeek = DaysOfWeek.Monday): Date { + var d = new Date(date) + var day = d.getDay() + var diff = (day < firstDayOfWeek ? 7 : 0) + day - firstDayOfWeek + + d.setDate(d.getDate() - diff) + return d +} + +export function endOfWeek(date: Date, firstDayOfWeek: DaysOfWeek = DaysOfWeek.Monday): Date { + var d = new Date(date) + var day = d.getDay() + var diff = (day < firstDayOfWeek ? -7 : 0) + 6 - (day - firstDayOfWeek) + + d.setDate(d.getDate() + diff) + return d +} + +export function startOfMonth(date: Date): Date { + return new Date(date.getFullYear(), date.getMonth(), 1) +} + +export function endOfMonth(date: Date): Date { + return new Date(date.getFullYear(), date.getMonth() + 1, 0) +} + +export function setMonth(date: Date, month: number): Date { + const d = new Date(date) + d.setMonth(month) + return d +} + +export function setYear(date: Date, year: number): Date { + const d = new Date(date) + d.setFullYear(year) + return d +} + +/** + * Check if date is within a min and max + */ +export function inRange(date: Date, min?: Date, max?: Date): boolean { + return clamp(date, min, max) === date +} + +/** + * Ensures date is within range, returns min or max if out of bounds + */ +export function clamp(date: Date, min?: Date, max?: Date): Date { + const time = date.getTime() + + if (min && min instanceof Date && time < min.getTime()) { + return min + } + + if (max && max instanceof Date && time > max.getTime()) { + return max + } + + return date +} + +/** + * given start and end date, return an (inclusive) array of all dates in between + * @param start + * @param end + */ +function getDaysInRange(start: Date, end: Date): Date[] { + const days: Date[] = [] + let current = start + + while (!isEqual(current, end)) { + days.push(current) + current = addDays(current, 1) + } + + days.push(current) + + return days +} + +/** + * given a date, return an array of dates from a calendar perspective + * @param date + * @param firstDayOfWeek + */ +export function getViewOfMonth(date: Date, firstDayOfWeek: DaysOfWeek = DaysOfWeek.Monday): Date[] { + const start = startOfWeek(startOfMonth(date), firstDayOfWeek) + const end = endOfWeek(endOfMonth(date), firstDayOfWeek) + + return getDaysInRange(start, end) +} + +/** + * Form random hash + */ +export function chr4() { + return Math.random() + .toString(16) + .slice(-4) +} + +/** + * Create random identifier with a prefix + * @param prefix + */ +export function createIdentifier(prefix) { + return `${prefix}-${chr4()}${chr4()}-${chr4()}-${chr4()}-${chr4()}-${chr4()}${chr4()}${chr4()}` +} diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/duet-date-picker.e2e.ts b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/duet-date-picker.e2e.ts new file mode 100644 index 00000000..b5b824c3 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/duet-date-picker.e2e.ts @@ -0,0 +1,878 @@ +import { createPage } from "../../utils/test-utils" +import { E2EElement, E2EPage } from "@stencil/core/testing" +import localization from "./date-localization" + +async function getFocusedElement(page: E2EPage) { + return page.evaluateHandle(() => document.activeElement) +} + +async function getChooseDateButton(page: E2EPage) { + return page.find(".duet-date__toggle") +} + +async function getInput(page: E2EPage) { + return page.find(".duet-date__input") +} + +async function getDialog(page: E2EPage) { + return page.find(`[role="dialog"]`) +} + +async function getGrid(page: E2EPage) { + const dialog = await getDialog(page) + return dialog.find("table") +} + +async function getPicker(page: E2EPage) { + return page.find("duet-date-picker") +} + +async function setMonthDropdown(page: E2EPage, month: string) { + await page.select(".duet-date__select--month", month) + await page.waitForChanges() +} + +async function setYearDropdown(page: E2EPage, year: string) { + await page.select(".duet-date__select--year", year) + await page.waitForChanges() +} + +async function getPrevMonthButton(page: E2EPage) { + const dialog = await getDialog(page) + return dialog.find(`.duet-date__prev`) +} + +async function getNextMonthButton(page: E2EPage) { + const dialog = await getDialog(page) + return dialog.find(`.duet-date__next`) +} + +async function findByText(context: E2EPage | E2EElement, selector: string, text: string) { + const elements = await context.findAll(selector) + return elements.find(element => element.innerText.includes(text)) +} + +async function clickDay(page: E2EPage, date: string) { + const grid = await getGrid(page) + const button = await findByText(grid, "button", date) + await button.click() + await page.waitForChanges() +} + +async function openCalendar(page: E2EPage) { + const button = await getChooseDateButton(page) + await button.click() + await page.waitForChanges() + const dialog = await getDialog(page) + await dialog.waitForVisible() +} + +async function clickOutside(page: E2EPage) { + const input = await getInput(page) + await input.click() + await page.waitForChanges() + const dialog = await getDialog(page) + await dialog.waitForNotVisible() +} + +async function isCalendarOpen(page: E2EPage): Promise { + const dialog = await getDialog(page) + return dialog.isVisible() +} + +async function getYearOptions(page: E2EPage) { + return page.$eval(".duet-date__select--year", (select: HTMLSelectElement) => { + return Array.from(select.options).map(option => option.value) + }) +} + +const generatePage = (props: Partial = {}) => { + const attrs = Object.entries(props) + .map(([attr, value]) => `${attr}="${value}"`) + .join(" ") + + return createPage(` + + + + + `) +} + +const ANIMATION_DELAY = 600 + +describe("duet-date-picker", () => { + it("should render a date picker", async () => { + const page = await generatePage() + const component = await getPicker(page) + expect(component).not.toBeNull() + }) + + describe("mouse interaction", () => { + it("should open on button click", async () => { + const page = await generatePage() + + expect(await isCalendarOpen(page)).toBe(false) + await openCalendar(page) + expect(await isCalendarOpen(page)).toBe(true) + }) + + it("should close on click outside", async () => { + const page = await generatePage() + + await openCalendar(page) + expect(await isCalendarOpen(page)).toBe(true) + + await clickOutside(page) + expect(await isCalendarOpen(page)).toBe(false) + }) + + it("supports selecting a date in the future", async () => { + const page = await generatePage({ value: "2020-01-01" }) + await openCalendar(page) + + const picker = await getPicker(page) + const nextMonth = await getNextMonthButton(page) + const spy = await picker.spyOnEvent("duetChange") + + await nextMonth.click() + await nextMonth.click() + await nextMonth.click() + await clickDay(page, "19 April") + + expect(spy).toHaveReceivedEventTimes(1) + expect(spy.lastEvent.detail).toEqual({ + component: "duet-date-picker", + value: "2020-04-19", + valueAsDate: new Date(2020, 3, 19).toISOString(), + }) + }) + + it("supports selecting a date in the past", async () => { + const page = await generatePage({ value: "2020-01-01" }) + await openCalendar(page) + + const picker = await getPicker(page) + const spy = await picker.spyOnEvent("duetChange") + + await setMonthDropdown(page, "3") + await setYearDropdown(page, "2019") + await clickDay(page, "19 April") + + expect(spy).toHaveReceivedEventTimes(1) + expect(spy.lastEvent.detail).toEqual({ + component: "duet-date-picker", + value: "2019-04-19", + valueAsDate: new Date(2019, 3, 19).toISOString(), + }) + }) + }) + + // see: https://www.w3.org/TR/wai-aria-practices/examples/dialog-modal/datepicker-dialog.html + describe("a11y/ARIA requirements", () => { + describe("button", () => { + it("has an accessible label", async () => { + const page = await generatePage() + const button = await getChooseDateButton(page) + const element = await button.find(".duet-date__vhidden") + expect(element).toEqualText(localization.buttonLabel) + }) + }) + + describe("dialog", () => { + it("meets a11y requirements", async () => { + const page = await generatePage() + const dialog = await getDialog(page) + + // has aria-modal attr + expect(dialog).toBeDefined() + expect(dialog).toEqualAttribute("aria-modal", "true") + + // has accessible label + const labelledById = dialog.getAttribute("aria-labelledby") + const title = await page.find(`#${labelledById}`) + expect(title).toBeDefined() + }) + }) + + describe("grid", () => { + it("meets a11y requirements", async () => { + const page = await generatePage({ value: "2020-01-01" }) + const grid = await getGrid(page) + + // has accessible label + const labelledById = await grid.getAttribute("aria-labelledby") + const title = await page.find(`#${labelledById}`) + expect(title).toBeDefined() + + await openCalendar(page) + + // should be single selected element + const selected = await grid.findAll(`[aria-pressed="true"]`) + expect(selected.length).toBe(1) + + // only one button is in focus order, has accessible label, and correct text content + expect(selected[0]).toEqualAttribute("tabindex", "0") + expect(selected[0].innerText).toContain("1 January") + }) + + it.todo("correctly abbreviates the shortened day names") + }) + + describe("controls", () => { + it.todo("has a label for next month button") + it.todo("has a label for previous month button") + it.todo("has a label for the month select dropdown") + it.todo("has a label for the year select dropdown") + }) + }) + + describe("keyboard a11y", () => { + it("closes on ESC press", async () => { + const page = await generatePage() + await openCalendar(page) + + expect(await isCalendarOpen(page)).toBe(true) + + await page.waitFor(ANIMATION_DELAY) + await page.keyboard.press("Escape") + await page.waitFor(ANIMATION_DELAY) + + expect(await isCalendarOpen(page)).toBe(false) + }) + + it("supports selecting a date in the future", async () => { + const page = await generatePage({ value: "2020-01-01" }) + const picker = await getPicker(page) + const spy = await picker.spyOnEvent("duetChange") + + // open calendar + await page.keyboard.press("Tab") + await page.waitForChanges() + await page.keyboard.press("Tab") + await page.waitForChanges() + await page.keyboard.press("Enter") + await page.waitForChanges() + + // wait for calendar to open + await page.waitFor(ANIMATION_DELAY) + + // set month to april + await setMonthDropdown(page, "3") + + // tab to grid + await page.keyboard.press("Tab") + await page.waitForChanges() + await page.keyboard.press("Tab") + await page.waitForChanges() + await page.keyboard.press("Tab") + await page.waitForChanges() + await page.keyboard.press("Tab") + await page.waitForChanges() + + // tab to grid, select 19th of month + await page.keyboard.press("ArrowDown") + await page.waitForChanges() + await page.keyboard.press("ArrowDown") + await page.waitForChanges() + await page.keyboard.press("ArrowRight") + await page.waitForChanges() + await page.keyboard.press("ArrowRight") + await page.waitForChanges() + await page.keyboard.press("ArrowRight") + await page.waitForChanges() + await page.keyboard.press("ArrowRight") + await page.waitForChanges() + await page.keyboard.press("Enter") + await page.waitForChanges() + + expect(spy).toHaveReceivedEventTimes(1) + expect(spy.lastEvent.detail).toEqual({ + component: "duet-date-picker", + value: "2020-04-19", + valueAsDate: new Date(2020, 3, 19).toISOString(), + }) + }) + + it("supports selecting a date in the past", async () => { + const page = await generatePage({ value: "2020-01-01" }) + const picker = await getPicker(page) + const spy = await picker.spyOnEvent("duetChange") + + // open calendar + await page.keyboard.press("Tab") + await page.waitForChanges() + await page.keyboard.press("Tab") + await page.waitForChanges() + await page.keyboard.press("Enter") + await page.waitForChanges() + + // wait for calendar to open + await page.waitFor(ANIMATION_DELAY) + + // select april from month dropdown + await setMonthDropdown(page, "3") + + // tab to year dropdown, select 2019 + await page.keyboard.press("Tab") + await setYearDropdown(page, "2019") + + // tab to grid + await page.keyboard.press("Tab") + await page.keyboard.press("Tab") + await page.keyboard.press("Tab") + + // select date 19th of month + await page.keyboard.press("ArrowDown") + await page.waitForChanges() + await page.keyboard.press("ArrowDown") + await page.waitForChanges() + await page.keyboard.press("ArrowRight") + await page.waitForChanges() + await page.keyboard.press("ArrowRight") + await page.waitForChanges() + await page.keyboard.press("ArrowRight") + await page.waitForChanges() + await page.keyboard.press("ArrowRight") + await page.waitForChanges() + await page.keyboard.press("Enter") + await page.waitForChanges() + + expect(spy).toHaveReceivedEventTimes(1) + expect(spy.lastEvent.detail).toEqual({ + component: "duet-date-picker", + value: "2019-04-19", + valueAsDate: new Date(2019, 3, 19).toISOString(), + }) + }) + + it("supports navigating to disabled dates", async () => { + const page = await generatePage({ value: "2020-01-01" }) + + // disable weekends + await page.$eval("duet-date-picker", async (picker: HTMLDuetDatePickerElement) => { + picker.isDateDisabled = function isWeekend(date) { + return date.getDay() === 0 || date.getDay() === 6 + } + }) + + const picker = await getPicker(page) + const spy = await picker.spyOnEvent("duetChange") + + // open calendar + await page.keyboard.press("Tab") + await page.waitForChanges() + await page.keyboard.press("Tab") + await page.waitForChanges() + await page.keyboard.press("Enter") + await page.waitForChanges() + + // wait for calendar to open + await page.waitFor(ANIMATION_DELAY) + + // set month to april + await setMonthDropdown(page, "3") + + // tab to grid + await page.keyboard.press("Tab") + await page.waitForChanges() + await page.keyboard.press("Tab") + await page.waitForChanges() + await page.keyboard.press("Tab") + await page.waitForChanges() + await page.keyboard.press("Tab") + await page.waitForChanges() + + // navigate to 2. april thursday + await page.keyboard.press("ArrowRight") + await page.waitForChanges() + // navigate to 3. april friday + await page.keyboard.press("ArrowRight") + await page.waitForChanges() + // navigate to 4. april saturday + await page.keyboard.press("ArrowRight") + await page.waitForChanges() + + await page.keyboard.press("Enter") + await page.waitForChanges() + expect(spy).toHaveReceivedEventTimes(0) + + // navigate to 5. april sunday + await page.keyboard.press("ArrowRight") + await page.waitForChanges() + + await page.keyboard.press("Enter") + await page.waitForChanges() + expect(spy).toHaveReceivedEventTimes(0) + + // navigate to 6. april monday + await page.keyboard.press("ArrowRight") + await page.waitForChanges() + + await page.keyboard.press("Enter") + await page.waitForChanges() + + expect(spy).toHaveReceivedEventTimes(1) + expect(spy.lastEvent.detail).toEqual({ + component: "duet-date-picker", + value: "2020-04-06", + valueAsDate: new Date(2020, 3, 6).toISOString(), + }) + }) + + it.todo("moves focus to start of week on home press") + it.todo("moves focus to end of week end press") + + it.todo("moves focus to previous month on page up press") + it.todo("moves focus to next month on page down press") + + it.todo("moves focus to previous year on shift + page down press") + it.todo("moves focus to next year on shift + page down press") + + it("maintains curosor position when typing disallowed characters", async () => { + const page = await generatePage() + const element = await getPicker(page) + const input = await getInput(page) + const DATE = "2020-03-19" + + // tab to input + await page.keyboard.press("Tab") + + // type some _allowed_ chars + await page.keyboard.type(DATE, { delay: 50 }) + + // move cursor so we can test maintaining position + await page.keyboard.press("ArrowLeft") + + // store cursor position + const cursorBefore = await input.getProperty("selectionStart") + expect(cursorBefore).toBe(DATE.length - 1) + + // attempt to enter _disallowed_ character + await page.keyboard.press("a") + + const cursorAfter = await input.getProperty("selectionStart") + const value = await element.getProperty("value") + + // we should see cursor hasn't changed + expect(cursorAfter).toBe(cursorBefore) + + // and value contains no disallowed chars + expect(value).toBe(DATE) + }) + }) + + describe("events", () => { + it("raises a duetBlur event when the input is blurred", async () => { + const page = await generatePage() + const picker = await getPicker(page) + const spy = await picker.spyOnEvent("duetBlur") + + await page.keyboard.press("Tab") + await page.keyboard.press("Tab") + expect(spy).toHaveReceivedEventTimes(1) + }) + + it("raises a duetFocus event when the input is focused", async () => { + const page = await generatePage() + const picker = await getPicker(page) + const spy = await picker.spyOnEvent("duetFocus") + + await page.keyboard.press("Tab") + + expect(spy).toHaveReceivedEventTimes(1) + }) + + it("raises a duetOpen event on open", async () => { + const page = await generatePage() + const picker = await getPicker(page) + const spy = await picker.spyOnEvent("duetOpen") + + await picker.callMethod("show") + expect(spy).toHaveReceivedEventTimes(1) + }) + + it("raises a duetClose event on close", async () => { + const page = await generatePage() + const picker = await getPicker(page) + const spy = await picker.spyOnEvent("duetClose") + + await picker.callMethod("hide") + expect(spy).toHaveReceivedEventTimes(1) + }) + }) + + describe("focus management", () => { + it("traps focus in calendar", async () => { + const page = await generatePage() + + await openCalendar(page) + + // wait for calendar to open + await page.waitFor(ANIMATION_DELAY) + + // month dropdown + let focused = await getFocusedElement(page) + let id = await page.evaluate(element => element.id, focused) + let label = await page.find(`label[for="${id}"]`) + expect(label).toEqualText(localization.monthSelectLabel) + + // year dropdown + await page.keyboard.press("Tab") + focused = await getFocusedElement(page) + id = await page.evaluate(element => element.id, focused) + label = await page.find(`label[for="${id}"]`) + expect(label).toEqualText(localization.yearSelectLabel) + + // prev month + await page.keyboard.press("Tab") + focused = await getFocusedElement(page) + let ariaLabel = await page.evaluate(element => element.innerText, focused) + expect(ariaLabel).toEqual(localization.prevMonthLabel) + + // next month + await page.keyboard.press("Tab") + focused = await getFocusedElement(page) + ariaLabel = await page.evaluate(element => element.innerText, focused) + expect(ariaLabel).toBe(localization.nextMonthLabel) + + // day + await page.keyboard.press("Tab") + focused = await getFocusedElement(page) + const tabIndex = await page.evaluate(element => element.tabIndex, focused) + expect(tabIndex).toBe(0) + + // close button + await page.keyboard.press("Tab") + focused = await getFocusedElement(page) + ariaLabel = await page.evaluate(element => element.innerText, focused) + expect(ariaLabel).toBe(localization.closeLabel) + + // back to month + await page.keyboard.press("Tab") + focused = await getFocusedElement(page) + id = await page.evaluate(element => element.id, focused) + label = await page.find(`label[for="${id}"]`) + expect(label).toEqualText(localization.monthSelectLabel) + }) + + it.todo("doesn't shift focus when interacting with calendar navigation controls") + it.todo("shifts focus back to button on date select") + it.todo("shifts focus back to button on ESC press") + it.todo("doesn't shift focus to button on click outside") + }) + + describe("min/max support", () => { + it("supports a min date", async () => { + const page = await generatePage({ value: "2020-01-15", min: "2020-01-02" }) + const picker = await getPicker(page) + const spy = await picker.spyOnEvent("duetChange") + + await openCalendar(page) + + // wait for calendar to open + await page.waitFor(ANIMATION_DELAY) + + // make sure it's rendered correctly + // We use a slightly higher threshold here since the CSS transition + // makes certain parts move slightly depending on how the browser converts + // the percentage based units into pixels. + const screenshot = await page.screenshot() + expect(screenshot).toMatchImageSnapshot({ + failureThreshold: 0.001, + failureThresholdType: "percent", + }) + + // try clicking a day outside the range + await clickDay(page, "1 January") + expect(spy).toHaveReceivedEventTimes(0) + + // click a day inside the range + await clickDay(page, "2 January") + + expect(spy).toHaveReceivedEventTimes(1) + expect(spy.lastEvent.detail).toEqual({ + component: "duet-date-picker", + value: "2020-01-02", + valueAsDate: new Date(2020, 0, 2).toISOString(), + }) + }) + + it("supports a max date", async () => { + const page = await generatePage({ value: "2020-01-15", max: "2020-01-30" }) + const picker = await getPicker(page) + const spy = await picker.spyOnEvent("duetChange") + + await openCalendar(page) + + // wait for calendar to open + await page.waitFor(ANIMATION_DELAY) + + // make sure it's rendered correctly + // We use a slightly higher threshold here since the CSS transition + // makes certain parts move slightly depending on how the browser converts + // the percentage based units into pixels. + const screenshot = await page.screenshot() + expect(screenshot).toMatchImageSnapshot({ + failureThreshold: 0.001, + failureThresholdType: "percent", + }) + + // try clicking a day outside the range + await clickDay(page, "31 January") + expect(spy).toHaveReceivedEventTimes(0) + + // click a day inside the range + await clickDay(page, "30 January") + + expect(spy).toHaveReceivedEventTimes(1) + expect(spy.lastEvent.detail).toEqual({ + component: "duet-date-picker", + value: "2020-01-30", + valueAsDate: new Date(2020, 0, 30).toISOString(), + }) + }) + + it("supports min and max dates", async () => { + const page = await generatePage({ value: "2020-01-15", min: "2020-01-02", max: "2020-01-30" }) + const picker = await getPicker(page) + const spy = await picker.spyOnEvent("duetChange") + + await openCalendar(page) + + // wait for calendar to open + await page.waitFor(ANIMATION_DELAY) + + // make sure it's rendered correctly. + // We use a slightly higher threshold here since the CSS transition + // makes certain parts move slightly depending on how the browser converts + // the percentage based units into pixels. + const screenshot = await page.screenshot() + expect(screenshot).toMatchImageSnapshot({ + failureThreshold: 0.001, + failureThresholdType: "percent", + }) + + // try clicking a day less than min + await clickDay(page, "1 January") + expect(spy).toHaveReceivedEventTimes(0) + + // try clicking a day greater than max + await clickDay(page, "31 January") + expect(spy).toHaveReceivedEventTimes(0) + + // click a day inside the range + await clickDay(page, "30 January") + + expect(spy).toHaveReceivedEventTimes(1) + expect(spy.lastEvent.detail).toEqual({ + component: "duet-date-picker", + value: "2020-01-30", + valueAsDate: new Date(2020, 0, 30).toISOString(), + }) + }) + + it("disables prev month button if same month and year as min", async () => { + const page = await generatePage({ value: "2020-04-19", min: "2020-04-01" }) + + await openCalendar(page) + + const prevMonthButton = await getPrevMonthButton(page) + expect(prevMonthButton).toHaveAttribute("disabled") + }) + + it("disables next month button if same month and year as max", async () => { + const page = await generatePage({ value: "2020-04-19", max: "2020-04-30" }) + + await openCalendar(page) + + const nextMonthButton = await getNextMonthButton(page) + expect(nextMonthButton).toHaveAttribute("disabled") + }) + + it("does not disable prev/next buttons when only month value (but not year) is same as min and max", async () => { + // there was a bug whereby both buttons would be disabled if the min/max/selected date + // had the same month (here: 4), but different years. this tests ensures no regression + const page = await generatePage({ value: "2020-04-19", min: "2019-04-19", max: "2021-04-19" }) + + await openCalendar(page) + + const prevMonthButton = await getPrevMonthButton(page) + const nextMonthButton = await getNextMonthButton(page) + + expect(prevMonthButton).not.toHaveAttribute("disabled") + expect(nextMonthButton).not.toHaveAttribute("disabled") + }) + + it("respects min/max dates when generating year dropdown", async () => { + const page = await generatePage({ value: "2020-04-19", min: "2019-04-19", max: "2021-04-19" }) + const picker = await getPicker(page) + + // range smaller than default 40 year range + let options = await getYearOptions(page) + expect(options).toEqual(["2019", "2020", "2021"]) + + // range larger than default 40 year range + const minYear = 1990 + const maxYear = 2050 + picker.setAttribute("min", `${minYear}-01-02`) + picker.setAttribute("max", `${maxYear}-01-30`) + await page.waitForChanges() + + options = await getYearOptions(page) + + expect(options.length).toBe(maxYear - minYear + 1) + expect(options[0]).toBe(minYear.toString()) + expect(options[options.length - 1]).toBe(maxYear.toString()) + }) + + it("respects min/max dates when generating month dropdown", async () => { + const page = await generatePage({ value: "2020-04-19", min: "2019-04-01", max: "2020-05-31" }) + + await openCalendar(page) + + function getAllowedMonths() { + return page.$eval(".duet-date__select--month", (select: HTMLSelectElement) => { + return Array.from(select.options) + .filter(option => !option.disabled) + .map(option => option.value) + }) + } + + // in 2020, January - May is allowed + let allowedMonths = await getAllowedMonths() + expect(allowedMonths).toEqual(["0", "1", "2", "3", "4"]) + + await setYearDropdown(page, "2019") + + // in 2019, April - December is allowed + allowedMonths = await getAllowedMonths() + expect(allowedMonths).toEqual(["3", "4", "5", "6", "7", "8", "9", "10", "11"]) + }) + }) + + describe("methods", () => { + it("should open calendar on show()", async () => { + const page = await generatePage() + const picker = await getPicker(page) + + expect(await isCalendarOpen(page)).toBe(false) + + await picker.callMethod("show") + await page.waitForChanges() + + expect(await isCalendarOpen(page)).toBe(true) + }) + + it("should close calendar on hide()", async () => { + const page = await generatePage() + const picker = await getPicker(page) + + await picker.callMethod("show") + await page.waitForChanges() + expect(await isCalendarOpen(page)).toBe(true) + + await picker.callMethod("hide") + await page.waitForChanges() + + const dialog = await getDialog(page) + await dialog.waitForNotVisible() + + expect(await isCalendarOpen(page)).toBe(false) + }) + + it("should focus input on setFocus()", async () => { + const page = await generatePage() + const picker = await getPicker(page) + + await picker.callMethod("setFocus") + await page.waitForChanges() + + const focused = await getFocusedElement(page) + const tagName = await page.evaluate(element => element.tagName, focused) + + expect(tagName.toLowerCase()).toEqualText("input") + }) + }) + + describe("form interaction", () => { + it("supports required attribute", async () => { + const page = await createPage(` +
+ + +
+ `) + + const picker = await getPicker(page) + const form = await page.find("form") + const button = await page.find("button[type='submit']") + const spy = await form.spyOnEvent("submit") + + await button.click() + await page.waitForChanges() + + expect(spy).toHaveReceivedEventTimes(0) + + picker.setProperty("value", "2020-01-01") + await page.waitForChanges() + await button.click() + + expect(spy).toHaveReceivedEventTimes(1) + }) + + it("always submits value as ISO date", async () => { + const page = await createPage(` +
+ + +
+ `) + + const picker = await getPicker(page) + const input = await getInput(page) + + // use non-ISO date format + await page.$eval("duet-date-picker", async (picker: HTMLDuetDatePickerElement) => { + var DATE_FORMAT = /^(\d{1,2})\.(\d{1,2})\.(\d{4})$/ + + picker.dateAdapter = { + parse(value = "", createDate) { + const matches = value.match(DATE_FORMAT) + if (matches) { + return createDate(matches[3], matches[2], matches[1]) + } + }, + format(date) { + return `${date.getDate()}.${date.getMonth() + 1}.${date.getFullYear()}` + }, + } + }) + + picker.setProperty("value", "2020-01-01") + await page.waitForChanges() + + // submitted value should be ISO format + const submittedValue = await page.$eval("form", (form: HTMLFormElement) => new FormData(form).get("test")) + expect(submittedValue).toEqual("2020-01-01") + + // whilst the displayed value should be Finnish format + expect(await input.getProperty("value")).toEqual("1.1.2020") + }) + }) +}) diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/duet-date-picker.scss b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/duet-date-picker.scss new file mode 100644 index 00000000..376ba77f --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/duet-date-picker.scss @@ -0,0 +1,533 @@ +// --------------------------------------------- +// DUET DATE PICKER +// --------------------------------------------- + +.duet-date *, +.duet-date *::before, +.duet-date *::after { + box-sizing: border-box; + margin: 0; + width: auto; +} + +.duet-date { + box-sizing: border-box; + color: var(--duet-color-text); + display: block; + font-family: var(--duet-font); + margin: 0; + position: relative; + text-align: left; + width: 100%; +} + +// --------------------------------------------- +// DUET DATE PICKER __ INPUT +// --------------------------------------------- + +.duet-date__input { + -webkit-appearance: none; + appearance: none; + background: var(--duet-color-surface); + border: 1px solid var(--duet-color-border, var(--duet-color-text)); // for backwards compatibility, fallback to old value + border-radius: var(--duet-radius); + color: var(--duet-color-text); + float: none; + font-family: var(--duet-font); + font-size: 100%; + line-height: normal; + padding: 14px 60px 14px 14px; + width: 100%; + + &:focus { + border-color: var(--duet-color-primary); + box-shadow: 0 0 0 1px var(--duet-color-primary); + outline: 0; + } + + &::-webkit-input-placeholder { + color: var(--duet-color-placeholder); + opacity: 1; + } + + &:-moz-placeholder { + color: var(--duet-color-placeholder); + opacity: 1; + } + + &:-ms-input-placeholder { + color: var(--duet-color-placeholder); + } +} + +.duet-date__input-wrapper { + position: relative; + width: 100%; +} + +// --------------------------------------------- +// DUET DATE PICKER __ TOGGLE +// --------------------------------------------- + +.duet-date__toggle { + -moz-appearance: none; + -webkit-appearance: none; + -webkit-user-select: none; + align-items: center; + appearance: none; + background: var(--duet-color-button); + border: 0; + border-radius: 0; + border-bottom-right-radius: var(--duet-radius); + border-top-right-radius: var(--duet-radius); + box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.1); + color: var(--duet-color-text); + cursor: pointer; + display: flex; + height: calc(100% - 2px); + justify-content: center; + padding: 0; + position: absolute; + right: 1px; + top: 1px; + user-select: none; + width: 48px; + z-index: 2; + + &:focus { + box-shadow: 0 0 0 2px var(--duet-color-primary); + outline: 0; + } +} + +.duet-date__toggle-icon { + display: flex; + flex-basis: 100%; + justify-content: center; + align-items: center; +} + +// --------------------------------------------- +// DUET DATE PICKER __ DIALOG +// --------------------------------------------- + +.duet-date__dialog { + display: flex; + left: 0; + min-width: 320px; + opacity: 0; + position: absolute; + top: 100%; + transform: scale(0.96) translateZ(0) translateY(-20px); + transform-origin: top right; + transition: transform 300ms ease, opacity 300ms ease, visibility 300ms ease; + visibility: hidden; + width: 100%; + will-change: transform, opacity, visibility; + z-index: var(--duet-z-index); + + @media (max-width: 35.9375em) { + background: var(--duet-color-overlay); + bottom: 0; + position: fixed; + right: 0; + top: 0; + transform: translateZ(0); + transform-origin: bottom center; + } + + &.is-left { + left: auto; + right: 0; + width: auto; + } + + &.is-active { + opacity: 1; + // The value of 1.0001 fixes a Chrome glitch with scaling + transform: scale(1.0001) translateZ(0) translateY(0); + visibility: visible; + } +} + +.duet-date__dialog-content { + background: var(--duet-color-surface); + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: var(--duet-radius); + box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1); + margin-left: auto; + margin-top: 8px; + max-width: 310px; + min-width: 290px; + padding: 16px 16px 20px; + position: relative; + transform: none; + width: 100%; + z-index: var(--duet-z-index); + + @media (max-width: 35.9375em) { + border: 0; + border-radius: 0; + border-top-left-radius: var(--duet-radius); + border-top-right-radius: var(--duet-radius); + bottom: 0; + left: 0; + margin: 0; + max-width: none; + min-height: 26em; + opacity: 0; + padding: 0 8% 20px; + position: absolute; + transform: translateZ(0) translateY(100%); + transition: transform 400ms ease, opacity 400ms ease, visibility 400ms ease; + visibility: hidden; + will-change: transform, opacity, visibility; + + .is-active & { + opacity: 1; + transform: translateZ(0) translateY(0); + visibility: visible; + } + } +} + +// --------------------------------------------- +// DUET DATE PICKER __ TABLE +// --------------------------------------------- + +.duet-date__table { + border-collapse: collapse; + border-spacing: 0; + color: var(--duet-color-text); + font-size: 1rem; + font-weight: var(--duet-font-normal); + line-height: 1.25; + text-align: center; + width: 100%; +} + +.duet-date__table-header { + font-size: 0.75rem; + font-weight: var(--duet-font-bold); + letter-spacing: 1px; + line-height: 1.25; + padding-bottom: 8px; + text-decoration: none; + text-transform: uppercase; +} + +.duet-date__cell { + text-align: center; +} + +.duet-date__day { + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; + background: transparent; + border: 0; + border-radius: 50%; + color: var(--duet-color-text); + cursor: pointer; + display: inline-block; + font-family: var(--duet-font); + font-size: 0.875rem; + font-variant-numeric: tabular-nums; + font-weight: var(--duet-font-normal); + height: 36px; + line-height: 1.25; + padding: 0 0 1px; + position: relative; + text-align: center; + vertical-align: middle; + width: 36px; + z-index: 1; + + &.is-today { + box-shadow: 0 0 0 1px var(--duet-color-primary); + position: relative; + z-index: 200; + } + + &:hover::before, + &.is-today::before { + background: var(--duet-color-primary); + border-radius: 50%; + bottom: 0; + content: ""; + left: 0; + opacity: 0.06; + position: absolute; + right: 0; + top: 0; + } + + &[aria-pressed="true"], + &:focus { + background: var(--duet-color-primary); + box-shadow: none; + color: var(--duet-color-text-active); + outline: 0; + } + + &:active { + background: var(--duet-color-primary); + box-shadow: 0 0 5px var(--duet-color-primary); + color: var(--duet-color-text-active); + z-index: 200; + } + + &:focus { + box-shadow: 0 0 5px var(--duet-color-primary); + z-index: 200; + } + + &:not(.is-month) { + box-shadow: none; + } + + &:not(.is-month), + &[aria-disabled="true"] { + background: transparent; + color: var(--duet-color-text); + cursor: default; + opacity: 0.5; + } + + &[aria-disabled="true"] { + &.is-today { + box-shadow: 0 0 0 1px var(--duet-color-primary); + + &:focus { + box-shadow: 0 0 5px var(--duet-color-primary); + background: var(--duet-color-primary); + color: var(--duet-color-text-active); + } + } + + &:not(.is-today)::before { + display: none; + } + } + + &.is-outside { + background: var(--duet-color-button); + box-shadow: none; + color: var(--duet-color-text); + cursor: default; + opacity: 0.6; + pointer-events: none; + + &::before { + display: none; + } + } +} + +// --------------------------------------------- +// DUET DATE PICKER __ HEADER +// --------------------------------------------- + +.duet-date__header { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 16px; + width: 100%; +} + +// --------------------------------------------- +// DUET DATE PICKER __ NAVIGATION +// --------------------------------------------- + +.duet-date__nav { + white-space: nowrap; +} + +.duet-date__prev, +.duet-date__next { + -moz-appearance: none; + -webkit-appearance: none; + align-items: center; + appearance: none; + background: var(--duet-color-button); + border: 0; + border-radius: 50%; + color: var(--duet-color-text); + cursor: pointer; + display: inline-flex; + height: 32px; + justify-content: center; + margin-left: 8px; + padding: 0; + transition: background-color 300ms ease; + width: 32px; + + @media (max-width: 35.9375em) { + height: 40px; + width: 40px; + } + + &:focus { + box-shadow: 0 0 0 2px var(--duet-color-primary); + outline: 0; + } + + &:active:focus { + box-shadow: none; + } + + &:disabled { + cursor: default; + opacity: 0.5; + } + + svg { + margin: 0 auto; + } +} + +// --------------------------------------------- +// DUET DATE PICKER __ SELECT +// --------------------------------------------- + +.duet-date__select { + display: inline-flex; + margin-top: 4px; + position: relative; + + span { + margin-right: 4px; + } + + select { + cursor: pointer; + font-size: 1rem; + height: 100%; + left: 0; + opacity: 0; + position: absolute; + top: 0; + width: 100%; + z-index: 2; + + &:focus + .duet-date__select-label { + box-shadow: 0 0 0 2px var(--duet-color-primary); + } + } +} + +.duet-date__select-label { + align-items: center; + border-radius: var(--duet-radius); + color: var(--duet-color-text); + display: flex; + font-size: 1.25rem; + font-weight: var(--duet-font-bold); + line-height: 1.25; + padding: 0 4px 0 8px; + pointer-events: none; + position: relative; + width: 100%; + z-index: 1; + + svg { + width: 16px; + height: 16px; + } +} + +// --------------------------------------------- +// DUET DATE PICKER __ MOBILE +// --------------------------------------------- + +.duet-date__mobile { + align-items: center; + border-bottom: 1px solid rgba(0, 0, 0, 0.12); + display: flex; + justify-content: space-between; + margin-bottom: 20px; + margin-left: -10%; + overflow: hidden; + padding: 12px 20px; + position: relative; + text-overflow: ellipsis; + white-space: nowrap; + width: 120%; + + @media (min-width: 36em) { + border: 0; + margin: 0; + overflow: visible; + padding: 0; + position: absolute; + right: -8px; + top: -8px; + width: auto; + } +} + +.duet-date__mobile-heading { + display: inline-block; + font-weight: var(--duet-font-bold); + max-width: 84%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + @media (min-width: 36em) { + display: none; + } +} + +// --------------------------------------------- +// DUET DATE PICKER __ CLOSE +// --------------------------------------------- + +.duet-date__close { + -webkit-appearance: none; + align-items: center; + appearance: none; + background: var(--duet-color-button); + border: 0; + border-radius: 50%; + color: var(--duet-color-text); + cursor: pointer; + display: flex; + height: 24px; + justify-content: center; + padding: 0; + width: 24px; + + @media (min-width: 36em) { + opacity: 0; + } + + &:focus { + box-shadow: 0 0 0 2px var(--duet-color-primary); + outline: none; + + @media (min-width: 36em) { + opacity: 1; + } + } + + svg { + margin: 0 auto; + } +} + +// --------------------------------------------- +// DUET DATE PICKER __ VISUALLY HIDDEN +// --------------------------------------------- + +.duet-date__vhidden { + border: 0; + clip: rect(1px, 1px, 1px, 1px); + height: 1px; + overflow: hidden; + padding: 0; + position: absolute; + top: 0; + width: 1px; +} diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/duet-date-picker.tsx b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/duet-date-picker.tsx new file mode 100644 index 00000000..ad1d8110 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/duet-date-picker.tsx @@ -0,0 +1,796 @@ +import { + Component, + ComponentInterface, + Host, + Prop, + Element, + h, + Event, + EventEmitter, + State, + Listen, + Method, + Watch, +} from "@stencil/core" +import { + addDays, + startOfWeek, + endOfWeek, + setMonth, + setYear, + clamp, + inRange, + endOfMonth, + startOfMonth, + printISODate, + parseISODate, + createIdentifier, + DaysOfWeek, + createDate, +} from "./date-utils" +import { DatePickerInput } from "./date-picker-input" +import { DatePickerMonth } from "./date-picker-month" +import defaultLocalization, { DuetLocalizedText } from "./date-localization" +import isoAdapter, { DuetDateAdapter } from "./date-adapter" + +function range(from: number, to: number) { + var result: number[] = [] + for (var i = from; i <= to; i++) { + result.push(i) + } + return result +} + +const keyCode = { + TAB: 9, + ESC: 27, + SPACE: 32, + PAGE_UP: 33, + PAGE_DOWN: 34, + END: 35, + HOME: 36, + LEFT: 37, + UP: 38, + RIGHT: 39, + DOWN: 40, +} + +function cleanValue(input: HTMLInputElement, regex: RegExp): string { + const value = input.value + const cursor = input.selectionStart + + const beforeCursor = value.slice(0, cursor) + const afterCursor = value.slice(cursor, value.length) + + const filteredBeforeCursor = beforeCursor.replace(regex, "") + const filterAfterCursor = afterCursor.replace(regex, "") + + const newValue = filteredBeforeCursor + filterAfterCursor + const newCursor = filteredBeforeCursor.length + + input.value = newValue + input.selectionStart = input.selectionEnd = newCursor + + return newValue +} + +export type DuetDatePickerChangeEvent = { + component: "duet-date-picker" + valueAsDate: Date + value: string +} +export type DuetDatePickerFocusEvent = { + component: "duet-date-picker" +} +export type DuetDatePickerOpenEvent = { + component: "duet-date-picker" +} +export type DuetDatePickerCloseEvent = { + component: "duet-date-picker" +} +export type DuetDatePickerDirection = "left" | "right" + +const DISALLOWED_CHARACTERS = /[^0-9\.\/\-]+/g +const TRANSITION_MS = 300 + +export type DateDisabledPredicate = (date: Date) => boolean + +@Component({ + tag: "duet-date-picker", + styleUrl: "duet-date-picker.scss", + shadow: false, + scoped: false, +}) +export class DuetDatePicker implements ComponentInterface { + /** + * Own Properties + */ + private monthSelectId = createIdentifier("DuetDateMonth") + private yearSelectId = createIdentifier("DuetDateYear") + private dialogLabelId = createIdentifier("DuetDateLabel") + + private datePickerButton: HTMLButtonElement + private datePickerInput: HTMLInputElement + private firstFocusableElement: HTMLElement + private monthSelectNode: HTMLElement + private dialogWrapperNode: HTMLElement + private focusedDayNode: HTMLButtonElement + + private focusTimeoutId: ReturnType + + private initialTouchX: number = null + private initialTouchY: number = null + + /** + * Whilst dateAdapter is used for handling the formatting/parsing dates in the input, + * these are used to format dates exclusively for the benefit of screen readers. + * + * We prefer DateTimeFormat over date.toLocaleDateString, as the former has + * better performance when formatting large number of dates. See: + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString#Performance + */ + private dateFormatShort: Intl.DateTimeFormat + private dateFormatLong: Intl.DateTimeFormat + + /** + * Reference to host HTML element. + */ + @Element() element: HTMLElement + + /** + * State() variables + */ + @State() activeFocus = false + @State() focusedDay = new Date() + @State() open = false + + /** + * Public Property API + */ + + /** + * Name of the date picker input. + */ + @Prop() name: string = "date" + + /** + * Adds a unique identifier for the date picker input. Use this instead of html `id` attribute. + */ + @Prop() identifier: string = "" + + /** + * Makes the date picker input component disabled. This prevents users from being able to + * interact with the input, and conveys its inactive state to assistive technologies. + */ + @Prop({ reflect: true }) disabled: boolean = false + + /** + * Defines a specific role attribute for the date picker input. + */ + @Prop() role: string + + /** + * Forces the opening direction of the calendar modal to be always left or right. + * This setting can be useful when the input is smaller than the opening date picker + * would be as by default the picker always opens towards right. + */ + @Prop() direction: DuetDatePickerDirection = "right" + + /** + * Should the input be marked as required? + */ + @Prop() required: boolean = false + + /** + * Date value. Must be in IS0-8601 format: YYYY-MM-DD. + */ + @Prop({ reflect: true, mutable: true }) value: string = "" + + /** + * Minimum date allowed to be picked. Must be in IS0-8601 format: YYYY-MM-DD. + * This setting can be used alone or together with the max property. + */ + @Prop() min: string = "" + + /** + * Maximum date allowed to be picked. Must be in IS0-8601 format: YYYY-MM-DD. + * This setting can be used alone or together with the min property. + */ + @Prop() max: string = "" + + /** + * Which day is considered first day of the week? `0` for Sunday, `1` for Monday, etc. + * Default is Monday. + */ + @Prop() firstDayOfWeek: DaysOfWeek = DaysOfWeek.Monday + + /** + * Button labels, day names, month names, etc, used for localization. + * Default is English. + */ + @Prop() localization: DuetLocalizedText = defaultLocalization + + /** + * Date adapter, for custom parsing/formatting. + * Must be object with a `parse` function which accepts a `string` and returns a `Date`, + * and a `format` function which accepts a `Date` and returns a `string`. + * Default is IS0-8601 parsing and formatting. + */ + @Prop() dateAdapter: DuetDateAdapter = isoAdapter + + /** + * Controls which days are disabled and therefore disallowed. + * For example, this can be used to disallow selection of weekends. + */ + @Prop() isDateDisabled: DateDisabledPredicate = () => false + + /** + * Events section. + */ + + /** + * Event emitted when a date is selected. + */ + @Event() duetChange: EventEmitter + + /** + * Event emitted the date picker input is blurred. + */ + @Event() duetBlur: EventEmitter + + /** + * Event emitted the date picker input is focused. + */ + @Event() duetFocus: EventEmitter + + /** + * Event emitted the date picker modal is opened. + */ + @Event() duetOpen: EventEmitter + + /** + * Event emitted the date picker modal is closed. + */ + @Event() duetClose: EventEmitter + + connectedCallback() { + this.createDateFormatters() + } + + @Watch("localization") + createDateFormatters() { + this.dateFormatShort = new Intl.DateTimeFormat(this.localization.locale, { day: "numeric", month: "long" }) + this.dateFormatLong = new Intl.DateTimeFormat(this.localization.locale, { + day: "numeric", + month: "long", + year: "numeric", + }) + } + + /** + * Component event handling. + */ + @Listen("click", { target: "document", capture: true }) + handleDocumentClick(e: MouseEvent) { + if (!this.open) { + return + } + + // the dialog and the button aren't considered clicks outside. + // dialog for obvious reasons, but the button needs to be skipped + // so that two things are possible: + // + // a) clicking again on the button when dialog is open should close the modal. + // without skipping the button here, we would see a click outside + // _and_ a click on the button, so the `open` state goes + // open -> close (click outside) -> open (click button) + // + // b) clicking another date picker's button should close the current calendar + // and open the new one. this means we can't stopPropagation() on the button itself + // + // this was the only satisfactory combination of things to get the above to work + + const isClickOutside = e + .composedPath() + .every(node => node !== this.dialogWrapperNode && node !== this.datePickerButton) + + if (isClickOutside) { + this.hide(false) + } + } + + /** + * Public methods API + */ + + /** + * Sets focus on the date picker's input. Use this method instead of the global `focus()`. + */ + @Method() async setFocus() { + return this.datePickerInput.focus() + } + + /** + * Show the calendar modal, moving focus to the calendar inside. + */ + @Method() async show() { + this.open = true + this.duetOpen.emit({ + component: "duet-date-picker", + }) + this.setFocusedDay(parseISODate(this.value) || new Date()) + + clearTimeout(this.focusTimeoutId) + this.focusTimeoutId = setTimeout(() => this.monthSelectNode.focus(), TRANSITION_MS) + } + + /** + * Hide the calendar modal. Set `moveFocusToButton` to false to prevent focus + * returning to the date picker's button. Default is true. + */ + @Method() async hide(moveFocusToButton = true) { + this.open = false + this.duetClose.emit({ + component: "duet-date-picker", + }) + + // in cases where calendar is quickly shown and hidden + // we should avoid moving focus to the button + clearTimeout(this.focusTimeoutId) + + if (moveFocusToButton) { + // iOS VoiceOver needs to wait for all transitions to finish. + setTimeout(() => this.datePickerButton.focus(), TRANSITION_MS + 200) + } + } + + /** + * Local methods. + */ + private enableActiveFocus = () => { + this.activeFocus = true + } + + private disableActiveFocus = () => { + this.activeFocus = false + } + + private addDays(days: number) { + this.setFocusedDay(addDays(this.focusedDay, days)) + } + + private addMonths(months: number) { + this.setMonth(this.focusedDay.getMonth() + months) + } + + private addYears(years: number) { + this.setYear(this.focusedDay.getFullYear() + years) + } + + private startOfWeek() { + this.setFocusedDay(startOfWeek(this.focusedDay, this.firstDayOfWeek)) + } + + private endOfWeek() { + this.setFocusedDay(endOfWeek(this.focusedDay, this.firstDayOfWeek)) + } + + private setMonth(month: number) { + const min = setMonth(startOfMonth(this.focusedDay), month) + const max = endOfMonth(min) + const date = setMonth(this.focusedDay, month) + + this.setFocusedDay(clamp(date, min, max)) + } + + private setYear(year: number) { + const min = setYear(startOfMonth(this.focusedDay), year) + const max = endOfMonth(min) + const date = setYear(this.focusedDay, year) + + this.setFocusedDay(clamp(date, min, max)) + } + + private setFocusedDay(day: Date) { + this.focusedDay = clamp(day, parseISODate(this.min), parseISODate(this.max)) + } + + private toggleOpen = (e: Event) => { + e.preventDefault() + this.open ? this.hide(false) : this.show() + } + + private handleEscKey = (event: KeyboardEvent) => { + if (event.keyCode === keyCode.ESC) { + this.hide() + } + } + + private handleBlur = (event: Event) => { + event.stopPropagation() + + this.duetBlur.emit({ + component: "duet-date-picker", + }) + } + + private handleFocus = (event: Event) => { + event.stopPropagation() + + this.duetFocus.emit({ + component: "duet-date-picker", + }) + } + + private handleTouchStart = (event: TouchEvent) => { + const touch = event.changedTouches[0] + this.initialTouchX = touch.pageX + this.initialTouchY = touch.pageY + } + + private handleTouchMove = (event: TouchEvent) => { + event.preventDefault() + } + + private handleTouchEnd = (event: TouchEvent) => { + const touch = event.changedTouches[0] + const distX = touch.pageX - this.initialTouchX // get horizontal dist traveled + const distY = touch.pageY - this.initialTouchY // get vertical dist traveled + const threshold = 70 + + const isHorizontalSwipe = Math.abs(distX) >= threshold && Math.abs(distY) <= threshold + const isDownwardsSwipe = Math.abs(distY) >= threshold && Math.abs(distX) <= threshold && distY > 0 + + if (isHorizontalSwipe) { + this.addMonths(distX < 0 ? 1 : -1) + } else if (isDownwardsSwipe) { + this.hide(false) + event.preventDefault() + } + + this.initialTouchY = null + this.initialTouchX = null + } + + private handleNextMonthClick = (event: MouseEvent) => { + event.preventDefault() + this.addMonths(1) + } + + private handlePreviousMonthClick = (event: MouseEvent) => { + event.preventDefault() + this.addMonths(-1) + } + + private handleFirstFocusableKeydown = (event: KeyboardEvent) => { + // this ensures focus is trapped inside the dialog + if (event.keyCode === keyCode.TAB && event.shiftKey) { + this.focusedDayNode.focus() + event.preventDefault() + } + } + + private handleKeyboardNavigation = (event: KeyboardEvent) => { + // handle tab separately, since it needs to be treated + // differently to other keyboard interactions + if (event.keyCode === keyCode.TAB && !event.shiftKey) { + event.preventDefault() + this.firstFocusableElement.focus() + return + } + + var handled = true + + switch (event.keyCode) { + case keyCode.RIGHT: + this.addDays(1) + break + case keyCode.LEFT: + this.addDays(-1) + break + case keyCode.DOWN: + this.addDays(7) + break + case keyCode.UP: + this.addDays(-7) + break + case keyCode.PAGE_UP: + if (event.shiftKey) { + this.addYears(-1) + } else { + this.addMonths(-1) + } + break + case keyCode.PAGE_DOWN: + if (event.shiftKey) { + this.addYears(1) + } else { + this.addMonths(1) + } + break + case keyCode.HOME: + this.startOfWeek() + break + case keyCode.END: + this.endOfWeek() + break + default: + handled = false + } + + if (handled) { + event.preventDefault() + this.enableActiveFocus() + } + } + + private handleDaySelect = (_event: MouseEvent, day: Date) => { + const isInRange = inRange(day, parseISODate(this.min), parseISODate(this.max)) + const isAllowed = !this.isDateDisabled(day) + + if (isInRange && isAllowed) { + this.setValue(day) + this.hide() + } else { + // for consistency we should set the focused day in cases where + // user has selected a day that has been specifically disallowed + this.setFocusedDay(day) + } + } + + private handleMonthSelect = e => { + this.setMonth(parseInt(e.target.value, 10)) + } + + private handleYearSelect = e => { + this.setYear(parseInt(e.target.value, 10)) + } + + private handleInputChange = () => { + const target = this.datePickerInput + + // clean up any invalid characters + cleanValue(target, DISALLOWED_CHARACTERS) + + const parsed = this.dateAdapter.parse(target.value, createDate) + if (parsed || target.value === "") { + this.setValue(parsed) + } + } + + private setValue(date: Date) { + this.value = printISODate(date) + this.duetChange.emit({ + component: "duet-date-picker", + value: this.value, + valueAsDate: date, + }) + } + + private processFocusedDayNode = (element: HTMLButtonElement) => { + this.focusedDayNode = element + + if (this.activeFocus && this.open) { + setTimeout(() => element.focus(), 0) + } + } + + /** + * render() function + * Always the last one in the class. + */ + render() { + const valueAsDate = parseISODate(this.value) + const formattedDate = valueAsDate && this.dateAdapter.format(valueAsDate) + const selectedYear = (valueAsDate || this.focusedDay).getFullYear() + const focusedMonth = this.focusedDay.getMonth() + const focusedYear = this.focusedDay.getFullYear() + + const minDate = parseISODate(this.min) + const maxDate = parseISODate(this.max) + const prevMonthDisabled = + minDate != null && minDate.getMonth() === focusedMonth && minDate.getFullYear() === focusedYear + const nextMonthDisabled = + maxDate != null && maxDate.getMonth() === focusedMonth && maxDate.getFullYear() === focusedYear + + const minYear = minDate ? minDate.getFullYear() : selectedYear - 10 + const maxYear = maxDate ? maxDate.getFullYear() : selectedYear + 10 + + return ( + +
+ (this.datePickerButton = element)} + inputRef={element => (this.datePickerInput = element)} + /> + + +
+
+ ) + } +} diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/readme.md b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/readme.md new file mode 100644 index 00000000..c5bd4dbe --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/components/duet-date-picker/readme.md @@ -0,0 +1,74 @@ +# duet-date-picker + + + + + + +## Properties + +| Property | Attribute | Description | Type | Default | +| ---------------- | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- | +| `dateAdapter` | -- | Date adapter, for custom parsing/formatting. Must be object with a `parse` function which accepts a `string` and returns a `Date`, and a `format` function which accepts a `Date` and returns a `string`. Default is IS0-8601 parsing and formatting. | `DuetDateAdapter` | `isoAdapter` | +| `direction` | `direction` | Forces the opening direction of the calendar modal to be always left or right. This setting can be useful when the input is smaller than the opening date picker would be as by default the picker always opens towards right. | `"left" \| "right"` | `"right"` | +| `disabled` | `disabled` | Makes the date picker input component disabled. This prevents users from being able to interact with the input, and conveys its inactive state to assistive technologies. | `boolean` | `false` | +| `firstDayOfWeek` | `first-day-of-week` | Which day is considered first day of the week? `0` for Sunday, `1` for Monday, etc. Default is Monday. | `DaysOfWeek.Friday \| DaysOfWeek.Monday \| DaysOfWeek.Saturday \| DaysOfWeek.Sunday \| DaysOfWeek.Thursday \| DaysOfWeek.Tuesday \| DaysOfWeek.Wednesday` | `DaysOfWeek.Monday` | +| `identifier` | `identifier` | Adds a unique identifier for the date picker input. Use this instead of html `id` attribute. | `string` | `""` | +| `isDateDisabled` | -- | Controls which days are disabled and therefore disallowed. For example, this can be used to disallow selection of weekends. | `(date: Date) => boolean` | `() => false` | +| `localization` | -- | Button labels, day names, month names, etc, used for localization. Default is English. | `{ buttonLabel: string; placeholder: string; selectedDateMessage: string; prevMonthLabel: string; nextMonthLabel: string; monthSelectLabel: string; yearSelectLabel: string; closeLabel: string; calendarHeading: string; dayNames: DayNames; monthNames: MonthsNames; monthNamesShort: MonthsNames; locale: string \| string[]; }` | `defaultLocalization` | +| `max` | `max` | Maximum date allowed to be picked. Must be in IS0-8601 format: YYYY-MM-DD. This setting can be used alone or together with the min property. | `string` | `""` | +| `min` | `min` | Minimum date allowed to be picked. Must be in IS0-8601 format: YYYY-MM-DD. This setting can be used alone or together with the max property. | `string` | `""` | +| `name` | `name` | Name of the date picker input. | `string` | `"date"` | +| `required` | `required` | Should the input be marked as required? | `boolean` | `false` | +| `role` | `role` | Defines a specific role attribute for the date picker input. | `string` | `undefined` | +| `value` | `value` | Date value. Must be in IS0-8601 format: YYYY-MM-DD. | `string` | `""` | + + +## Events + +| Event | Description | Type | +| ------------ | ----------------------------------------------- | ----------------------------------------------------------------------------------- | +| `duetBlur` | Event emitted the date picker input is blurred. | `CustomEvent<{ component: "duet-date-picker"; }>` | +| `duetChange` | Event emitted when a date is selected. | `CustomEvent<{ component: "duet-date-picker"; valueAsDate: Date; value: string; }>` | +| `duetClose` | Event emitted the date picker modal is closed. | `CustomEvent<{ component: "duet-date-picker"; }>` | +| `duetFocus` | Event emitted the date picker input is focused. | `CustomEvent<{ component: "duet-date-picker"; }>` | +| `duetOpen` | Event emitted the date picker modal is opened. | `CustomEvent<{ component: "duet-date-picker"; }>` | + + +## Methods + +### `hide(moveFocusToButton?: boolean) => Promise` + +Hide the calendar modal. Set `moveFocusToButton` to false to prevent focus +returning to the date picker's button. Default is true. + +#### Returns + +Type: `Promise` + + + +### `setFocus() => Promise` + +Sets focus on the date picker's input. Use this method instead of the global `focus()`. + +#### Returns + +Type: `Promise` + + + +### `show() => Promise` + +Show the calendar modal, moving focus to the calendar inside. + +#### Returns + +Type: `Promise` + + + + +---------------------------------------------- + +*Built with [StencilJS](https://stenciljs.com/)* diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/index.html b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/index.html new file mode 100644 index 00000000..a2446384 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/index.html @@ -0,0 +1,564 @@ + + + + + + Duet Date Picker examples + + + + + + + + + + + + +
+
Loading…
+ + diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/themes/dark.css b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/themes/dark.css new file mode 100644 index 00000000..c2a6e870 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/themes/dark.css @@ -0,0 +1,17 @@ +:root { + --duet-color-primary: #005fcc; + --duet-color-text: #fff; + --duet-color-text-active: #fff; + --duet-color-placeholder: #aaa; + --duet-color-button: #444; + --duet-color-surface: #222; + --duet-color-overlay: rgba(0, 0, 0, 0.8); + --duet-color-border: #fff; + + --duet-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + --duet-font-normal: 400; + --duet-font-bold: 600; + + --duet-radius: 4px; + --duet-z-index: 600; +} diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/themes/default.css b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/themes/default.css new file mode 100644 index 00000000..7b79327d --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/themes/default.css @@ -0,0 +1,17 @@ +:root { + --duet-color-primary: #005fcc; + --duet-color-text: #333; + --duet-color-text-active: #fff; + --duet-color-placeholder: #666; + --duet-color-button: #f5f5f5; + --duet-color-surface: #fff; + --duet-color-overlay: rgba(0, 0, 0, 0.8); + --duet-color-border: #333; + + --duet-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + --duet-font-normal: 400; + --duet-font-bold: 600; + + --duet-radius: 4px; + --duet-z-index: 600; +} diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/utils/test-utils.ts b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/utils/test-utils.ts new file mode 100644 index 00000000..02c67d0c --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/src/utils/test-utils.ts @@ -0,0 +1,38 @@ +import { newE2EPage, E2EPage } from "@stencil/core/testing" +import { Page as PuppeteerPage } from "puppeteer" + +export type DuetE2EPage = E2EPage & Pick + +type DuetE2EPageOptions = { html: string; viewportWidth: number } + +export async function createPage(optionsOrHtml?: string | DuetE2EPageOptions) { + const options: DuetE2EPageOptions = + typeof optionsOrHtml === "string" ? { html: optionsOrHtml, viewportWidth: 600 } : optionsOrHtml + + const page = (await newE2EPage()) as DuetE2EPage + const viewport = Object.assign({ height: page.viewport().height }, { width: options.viewportWidth }) + await page.setViewport(viewport) + await page.setContent(options.html, { waitUntil: "networkidle0" }) + await page.evaluateHandle(() => (document as any).fonts.ready) + + // monkey patch screenshot function to add some extra features + const screenshot = page.screenshot + page.screenshot = async function() { + // get the element's height, and set viewport to that height + // this enables us to get full page, clipped screenshots + const htmlElement = await page.$("html") + const { width, height } = await htmlElement.boundingBox() + await page.setViewport({ width: page.viewport().width, height: Math.round(height) }) + + return screenshot.call(page, { + clip: { + x: 0, + y: 0, + width: Math.round(width), + height: Math.round(height), + }, + }) + } + + return page +} diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/stencil.config.ts b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/stencil.config.ts new file mode 100644 index 00000000..1e6afd53 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/stencil.config.ts @@ -0,0 +1,74 @@ +import { Config } from "@stencil/core" +import { sass } from "@stencil/sass" + +export const config: Config = { + // See https://github.com/ionic-team/stencil/blob/master/src/declarations/config.ts for config + namespace: "duet", + enableCache: true, + hashFileNames: false, + autoprefixCss: false, + minifyCss: true, + buildEs5: true, + taskQueue: "immediate", + preamble: "Built with Duet Design System", + hashedFileNameLength: 8, + commonjs: { include: /node_modules|(..\/.+)/ } as any, + bundles: [{ components: ["duet-date-picker"] }], + devServer: { + openBrowser: true, + port: 3333, + reloadStrategy: "pageReload", + }, + extras: { + // We need the following for IE11 and old Edge: + cssVarsShim: true, + dynamicImportShim: true, + // We don’t use shadow DOM so this is not needed: + shadowDomShim: false, + // Setting the below option to “true” will actually break Safari 10 support: + safari10: false, + // This is to tackle an Angular specific performance issue: + initializeNextTick: true, + // Don’t need any of these so setting them to “false”: + scriptDataOpts: false, + appendChildSlotFix: false, + cloneNodeFix: false, + slotChildNodesFix: false, + }, + outputTargets: [ + { + type: "dist-hydrate-script", + dir: "hydrate", + empty: false, + }, + { + type: "dist-custom-elements-bundle", + dir: "custom-element", + empty: true, + }, + { + type: "dist", + dir: "dist", + empty: true, + copy: [{ src: "themes", warn: true }], + }, + { + type: "docs-readme", + }, + { + type: "www", + dir: "www", + serviceWorker: null, + empty: true, + baseUrl: "https://duetds.github.io/", + prerenderConfig: "./prerender.config.ts", + copy: [{ src: "themes", dest: "themes", warn: true }], + }, + ], + plugins: [sass()], + testing: { + browserHeadless: process.env.TEST_HEADLESS !== "false", + setupFilesAfterEnv: ["/jest/jest-setup.js"], + testPathIgnorePatterns: ["/hydrate/", "/dist/"], + }, +} diff --git a/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/tsconfig.json b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/tsconfig.json new file mode 100644 index 00000000..1ba94909 --- /dev/null +++ b/src/main/webapp/kofair_case_seed/script/plugin/date-picker-master/date-picker-master/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "allowUnreachableCode": false, + "declaration": false, + "experimentalDecorators": true, + "lib": ["dom", "es2017"], + "moduleResolution": "node", + "module": "esnext", + "target": "es2017", + "noUnusedLocals": true, + "noUnusedParameters": true, + "jsx": "react", + "jsxFactory": "h" + }, + "include": ["src", "types/jsx.d.ts"], + "exclude": ["node_modules"] +} diff --git a/src/main/webapp/kofair_case_seed/usr/layout/_header.html b/src/main/webapp/kofair_case_seed/usr/layout/_header.html index 7d21af88..9fe3e1e9 100644 --- a/src/main/webapp/kofair_case_seed/usr/layout/_header.html +++ b/src/main/webapp/kofair_case_seed/usr/layout/_header.html @@ -1,371 +1,463 @@ - + -
-
-

한국공정거래조정원 KOREA FAIR TRADE MEDIATION AGENCY

-
-
- - -
-
- - - - +
+
+

한국공정거래조정원 KOREA FAIR TRADE MEDIATION AGENCY

+
+
+ + +
+
+ + + + +
-
- - -
- -
- - -
-
-
-

한국공정거래조정원 KOREA FAIR TRADE MEDIATION AGENCY

- -
- -
-
-
+ \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/usr/request/apl_05-2.html b/src/main/webapp/kofair_case_seed/usr/request/apl_05-2.html new file mode 100644 index 00000000..3be3676e --- /dev/null +++ b/src/main/webapp/kofair_case_seed/usr/request/apl_05-2.html @@ -0,0 +1,527 @@ + + + + + + + 한국공정거래조정원 온라인분쟁조정시스템 > 분쟁조정 신청 > 분쟁조정 신청하기 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ +
+

분쟁조정 신청

+
+ +
+ + +
+

분쟁조정 신청

+ +
+ +
+ + +
    +
  • +
  • 분쟁조정 신청
  • +
  • 분쟁조정 신청하기
  • +
+ + +

분쟁조정 신청하기

+

거래유형에 따른 분쟁조정 신청방법 및 절차를 알려드립니다.

+ +
    +
  • +

    STEP 01 개인정보수집

    + +
  • +
  • +

    STEP 02 신청인 정보

    + +
  • +
  • +

    STEP 03 피신청인 정보

    + +
  • +
  • +

    STEP 04 사건현황

    + +
  • +
  • +

    STEP 05 분쟁정보

    + +
  • +
+ + + +
+

사건현황

+
+ + + + +
+

신청 확인사항(필수)

+

중복선택 불가

+
+ +
+
+ 1. 귀하는 '한국공정거래조정원'을 어떤 경로로 알게 되셨습니까? +
+
+
+
1) 대중매체 광고
+
+ +
+
+ +
+
+ +
+
+
+
2) SNS채널
+
+ +
+
+ +
+
+
+
3) 기타
+
+ + +
+
+
+
+ + +

기타 확인사항

+ +
+
1. 소송이 진행중인가요?
+
+
    +
  • +
  • + +
      +
    • +

      *진행일 경우 하단 증빙자료에 소장 반드시 첨부 요망

      +
    • +
    • +
    +
  • +
+
+
2. 소송 내용이 조정신청 내용과 동일한가요?
+
+
    +
  • +
  • + +
  • +
+
+
3. 타 협의회 조정이 진행중인가요?
+
+
    +
  • +
  • + +
      +
    • +
    +
  • +
+
+
4. 중재가 진행중인가요?
+
+
    +
  • +
  • + +
      +
    • +
    +
  • +
+
+
5. 타 조정기구 조정이 진행중인가요?
+
+
    +
  • +
  • + +
      +
    • +
    +
  • +
+
+
6. 공정거래위원회 조사가 진행중인가요?
+
+
    +
  • +
  • + +
      +
    • +
    +
  • +
+
+
7. 당사자간 합의가 완료되어 조정조서 작성을 요청하는 사안인지 여부
+
+
    +
  • +
  • + +
  • +
+
+
+

※ 기타확인사항은 일반현황표 참조, 하단 증빙자료 첨부 또는 우편으로 별도 제출이 가능합니다.

+ + + + 증빙자료 첨부시 선택해주세요. +
+ + + + + + + + + + + +
증빙자료 첨부
+
+ + + +
+

협의회별 상세 현황

+
+

하도급 분야

+
+ + + + + + + + + + + + + + + + + + + + + +
상시종업원수대/중소기업 구분 + +
공사업등록여부 + + 시공능력 평가액
+
+

※ 우편용 신청서 참조

+ + + +
+

하도급대금 내역(신청인)

+
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
목적물인도(수)-기성청구서상하도급대금수령(지급)비고
구분일자금액현금어음총액미지급
일자금액지급일만기일금액
+ +
소계: 가870,000,000870,000,0002,0002,00035,000
870,000,000870,000,0002,0002,00035,000
+
+ + + +
+

도급대금 내역(피신청인)

+
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
목적물인도(수)-기성청구서상도급대금수령비고
구분일자금액현금어음총액미지급
일자금액지급일만기일금액
+ +
소계: 870,000,000870,000,0002,0002,00035,000
870,000,000870,000,0002,0002,00035,000
+
+ + + + +
+
+ +
+
+ + +
+
+
+ + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/usr/request/apl_05.html b/src/main/webapp/kofair_case_seed/usr/request/apl_05.html index 71aca1d9..a7f8dea0 100644 --- a/src/main/webapp/kofair_case_seed/usr/request/apl_05.html +++ b/src/main/webapp/kofair_case_seed/usr/request/apl_05.html @@ -23,6 +23,12 @@ + + + + + + @@ -52,7 +58,8 @@ -
+
    @@ -89,18 +96,346 @@
-
+ +

사건현황

-

+ +

대리인 정보

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
상호대표자
전화번호 +
+ - + - + +
+
휴대폰 +
+ - + - + +
+
+

*필수입력

이메일 +
+ +
+

*필수입력

우편번호 +
+
    +
  • +
  • +
  • +
+
+

*필수입력

도로명 주소 +
+
    +
  • +
  • +
+
+
+

※ 대리인 정보는 하단 증빙자료 첨부 또는 우편으로 별도 제출이 가능합니다.

+ + + + +

주요재무현황

+
+ + + + + + + + + + + + + + + + + + + + + +
자본금자산총액
총매출액영업이익
+
+

※ 대리인 정보는 하단 증빙자료 첨부 또는 우편으로 별도 제출이 가능합니다.

+ + + + +

사건 확인사항

+
+ + + + + + + + + + + + + + + + + + + +
최초 계약일 +
+
+ +
+
+
계약기간 +
+
+ +
+ ~ +
+ +
+
+
계약서 사본 + +
+
+

※ 사건 확인사항은 일반현황표 참조, 하단 증빙자료 첨부 또는 우편으로 별도 제출이 가능합니다.

+ + + + + +
+

담당자 인적사항

+
    +
  • +
  • +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
성함FAX +
+ - + - + +
+
전화번호 +
+ - + - + +
+
휴대폰 +
+ - + - + +
+
부서/직위
+

*필수입력

이메일 +
+ +
+

*필수입력

우편번호 +
+
    +
  • +
  • +
  • +
+
+

*필수입력

도로명 주소 +
+
    +
  • +
  • +
+
+
+

※ 담당자 인적사항은 일반현황표 참조, 하단 증빙자료 첨부 또는 우편으로 별도 제출이 가능합니다.

+ + + + 증빙자료 첨부시 선택해주세요. +
+ + + + + + + + + + + +
증빙자료 첨부
+
+ - - +
+
+ +
+
+ + +
+
- +
diff --git a/src/main/webapp/kofair_case_seed/usr/scripts/common.js b/src/main/webapp/kofair_case_seed/usr/scripts/common.js index 8b36abed..57420082 100644 --- a/src/main/webapp/kofair_case_seed/usr/scripts/common.js +++ b/src/main/webapp/kofair_case_seed/usr/scripts/common.js @@ -1,4 +1,11 @@ +$(function () { + if ($(".input_calendar").length > 0) { + setTimeout(function () { + calendar(); + }, 100) + } +}) // header, footer 공통 영역 불러오기 window.addEventListener('load', function () { @@ -9,11 +16,450 @@ window.addEventListener('load', function () { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState == 4 && this.status == 200) { + header(); el.outerHTML = this.responseText; + } }; xhttp.open('GET', includePath, true); xhttp.send(); } }); -}); \ No newline at end of file +}); + + + +// 달력 +function calendar() { + + // 캘린더 고유 클래스 추가 + $(".input_calendar").each(function (idx, itm) { + idx += 1; + $(itm).addClass("input_calendar" + idx); + }); + + $(".start_date").each(function (idx, itm) { + idx += 1; + $(itm).addClass("start_date" + idx); + }); + + $(".end_date").each(function (idx, itm) { + idx += 1; + $(itm).addClass("end_date" + idx); + }); + + setTimeout(function () { + + calendarTitle(); // 달력 타이틀 + calednarCaption(); // 달력 caption + }, 100) + + + + // input value 값 추가, 검색 시 input value 값 안없어지게. + var start_duetValue = $("duet-date-picker.start_date").val(); + var end_duetValue = $("duet-date-picker.end_date").val(); + var startcalendar_name = $(".start_date").attr("name"); + var endcalendar_name = $(".end_date").attr("name"); + + //달력 입력창 최대 입력 수 10자 제한('.' 포함) + $("input.duet-date__input").attr("maxlength", "10"); + + var DATE_FORMAT = /^(\d{1,2})\.(\d{1,2})\.(\d{4})$/ + var duetdateleng = $("duet-date-picker").length + 1; + + var calendarNum = []; + var startDateNum = []; + var endDateNum = []; + setTimeout(function () { + for (var i = 1; i < duetdateleng; i++) { + calendarNum[i] = document.querySelector(".input_calendar" + i); + calendarNum[i].dateAdapter = { + parse: function parse() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "" + var createDate = arguments.length > 1 ? arguments[1] : undefined + var matches = value.match(DATE_FORMAT) + + if (matches) { + return createDate(matches[3], matches[2], matches[1]) + } + }, + format: function format(date) { + if (date.getMonth() < 9) { + if (date.getDate() < 10) { + return "" + .concat(date.getFullYear(), ".") + .concat('0', date.getMonth() + 1, ".") + .concat('0', date.getDate()) + } else { + return "" + .concat(date.getFullYear(), ".") + .concat('0', date.getMonth() + 1, ".") + .concat(date.getDate()) + } + } else { + if (date.getDate() < 10) { + return "" + .concat(date.getFullYear(), ".") + .concat(date.getMonth() + 1, ".") + .concat('0', date.getDate()) + } else { + return "" + .concat(date.getFullYear(), ".") + .concat(date.getMonth() + 1, ".") + .concat(date.getDate()) + } + } + }, + } + + // 달력 플러그인 실행 + calendarNum[i].localization = { + placeholder: '날짜 입력', + selectedDateMessage: 'Selected date is', + prevMonthLabel: '이전 달 보기', + nextMonthLabel: '다음 달 보기', + monthSelectLabel: '달 선택', + yearSelectLabel: '년도 선택', + closeLabel: '달력 닫기', + dayNames: ['일', '월', '화', '수', '목', '금', '토'], + monthNames: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'], + monthNamesShort: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'], + identifier: "input_date", + name: "input_date" + } + + // 달력 닫았을 때 input, input[type=hidden]에 value 값 넣어주기 + calendarNum[i].addEventListener("duetClose", function (e) { + startDt = e.target; + startDtVal = e.target.value; + startSub = startDtVal.replace(/\-/g, ''); + var inputName = $(this).attr("name"); + }); + + setTimeout(function () { + $("duet-date-picker .duet-date__input").each(function (idx, itm) { + idx += 1; + $(itm).attr("name", "input_date" + idx); + $(itm).attr("id", "input_date" + idx); + }); + $("duet-date-picker .duet-date__input").attr('onkeydown', 'this.value=dateSetting(this.value);'); + }, 100) + } + + // 시작날짜 + + for (var i = 1; i < duetdateleng; i++) { + startDateNum[i] = document.querySelector(".start_date" + i); + startDateNum[i].dateAdapter = { + parse: function parse() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "" + var createDate = arguments.length > 1 ? arguments[1] : undefined + var matches = value.match(DATE_FORMAT) + + if (matches) { + return createDate(matches[3], matches[2], matches[1]) + } + }, + format: function format(date) { + if (date.getMonth() < 9) { + if (date.getDate() < 10) { + return "" + .concat(date.getFullYear(), ".") + .concat('0', date.getMonth() + 1, ".") + .concat('0', date.getDate()) + } else { + return "" + .concat(date.getFullYear(), ".") + .concat('0', date.getMonth() + 1, ".") + .concat(date.getDate()) + } + } else { + if (date.getDate() < 10) { + return "" + .concat(date.getFullYear(), ".") + .concat(date.getMonth() + 1, ".") + .concat('0', date.getDate()) + } else { + return "" + .concat(date.getFullYear(), ".") + .concat(date.getMonth() + 1, ".") + .concat(date.getDate()) + } + } + }, + } + + // 달력 플러그인 실행 + startDateNum[i].localization = { + placeholder: '날짜 입력', + selectedDateMessage: 'Selected date is', + prevMonthLabel: '이전 달 보기', + nextMonthLabel: '다음 달 보기', + monthSelectLabel: '달 선택', + yearSelectLabel: '년도 선택', + closeLabel: '달력 닫기', + dayNames: ['일', '월', '화', '수', '목', '금', '토'], + monthNames: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'], + monthNamesShort: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'], + identifier: "start_date", + name: "start_date" + } + + // 달력 닫았을 때 input, input[type=hidden]에 value 값 넣어주기 + startDateNum[i].addEventListener("duetClose", function (e) { + startDt = e.target; + startDtVal = e.target.value; + startSub = startDtVal.replace(/\-/g, ''); + var inputName = $(this).attr("name"); + $(".start_date").each(function (idx, itm) { + $(this).find(".duet-date__input").attr("id", inputName + idx); + $(this).find(".duet-date__input").attr("name", inputName); + $(this).find(".duet-date__input").attr("value", startSub); + $(this).find(".duet-date__input").next().attr("name", inputName + i + "_submit"); + $(this).find(".duet-date__input").next().attr("value", startSub); + }); + }); + + //날짜 값 바꼈을 때 시작일, 종료일 찾아 alert 띄우기 + startDateNum[i].addEventListener("duetChange", function (e) { + startDt = e.target; + startDtVal = e.target.value; + var n = i - 1; + var endDtVal = $(".end_date" + n).find(".duet-date__input").val(); + endDtVal = endDtVal.replace(/[.]/gi, ''); + startDtVal = startDtVal.replace(/[.]/gi, ''); + if (startDtVal > endDtVal && endDtVal != "") { + e.target.value = ""; + alert("시작일이 종료일보다 클 수 없습니다."); + } else {} + }); + + setTimeout(function () { + $("duet-date-picker.start_date .duet-date__input").each(function (idx, itm) { + idx += 1; + $(itm).attr("name", "start_date" + idx); + $(itm).attr("id", "start_date" + idx); + }); + $("duet-date-picker .duet-date__input").attr('onkeydown', 'this.value=dateSetting(this.value);'); + }, 100) + + startDateNum[i].addEventListener("duetFocus", function (e) { + calendarSetting(); + }); + } + + // 종료날짜 + + for (var i = 1; i < duetdateleng; i++) { + endDateNum[i] = document.querySelector(".end_date" + i); + endDateNum[i].dateAdapter = { + parse: function parse() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "" + var createDate = arguments.length > 1 ? arguments[1] : undefined + var matches = value.match(DATE_FORMAT) + + if (matches) { + return createDate(matches[3], matches[2], matches[1]) + } + }, + format: function format(date) { + if (date.getMonth() < 9) { + if (date.getDate() < 10) { + return "" + .concat(date.getFullYear(), ".") + .concat('0', date.getMonth() + 1, ".") + .concat('0', date.getDate()) + } else { + return "" + .concat(date.getFullYear(), ".") + .concat('0', date.getMonth() + 1, ".") + .concat(date.getDate()) + } + } else { + if (date.getDate() < 10) { + return "" + .concat(date.getFullYear(), ".") + .concat(date.getMonth() + 1, ".") + .concat('0', date.getDate()) + } else { + return "" + .concat(date.getFullYear(), ".") + .concat(date.getMonth() + 1, ".") + .concat(date.getDate()) + } + } + }, + } + + // 달력 플러그인 실행 + endDateNum[i].localization = { + placeholder: '날짜 입력', + selectedDateMessage: 'Selected date is', + prevMonthLabel: '이전 달 보기', + nextMonthLabel: '다음 달 보기', + monthSelectLabel: '달 선택', + yearSelectLabel: '년도 선택', + closeLabel: '달력 닫기', + dayNames: ['일', '월', '화', '수', '목', '금', '토'], + monthNames: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'], + monthNamesShort: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'], + identifier: "end_date", + name: "end_date" + } + + // 달력 닫았을 때 input, input[type=hidden]에 value 값 넣어주기 + endDateNum[i].addEventListener("duetClose", function (e) { + endDt = e.target; + endDtVal = e.target.value; + endSub = endDtVal.replace(/\-/g, ''); + var inputName = $(this).attr("name"); + $(".end_date").each(function (idx, itm) { + $(this).find(".duet-date__input").attr("id", inputName + idx); + $(this).find(".duet-date__input").attr("name", inputName); + $(this).find(".duet-date__input").attr("value", endSub); + $(this).find(".duet-date__input").next().attr("name", inputName + i + "_submit"); + $(this).find(".duet-date__input").next().attr("value", endSub); + }); + }); + + //날짜 값 바꼈을 때 시작일, 종료일 찾아 alert 띄우기 + endDateNum[i].addEventListener("duetChange", function (e) { + endDt = e.target; + endDtVal = e.target.value; + var n = i - 1 + var startDtVal = $(".start_date" + n).find(".duet-date__input").val(); + startDtVal = startDtVal.replace(/[.]/gi, ''); + endDtVal = endDtVal.replace(/[.]/gi, ''); + //console.log("2",startDtVal,endDtVal); + if (endDtVal < startDtVal) { + e.target.value = ""; + alert("종료일이 시작일보다 작을 수 없습니다."); + } else {} + }); + + setTimeout(function () { + $("duet-date-picker.end_date").each(function (idx, itm) { + idx += 1; + $(itm).attr("name", "end_date" + idx); + $(itm).attr("id", "end_date" + idx); + }); + $("duet-date-picker .duet-date__input").attr('onkeydown', 'this.value=dateSetting(this.value);'); + }, 100) + + endDateNum[i].addEventListener("duetFocus", function (e) { + calendarSetting(); + }); + } + + + + }, 10) + + function calendarMsgKey(ipt, startVal, endVal, startName, endName) { + startVal = startVal.replace(/[.]/gi, ''); + endVal = endVal.replace(/[.]/gi, ''); + //console.log(startVal+"start", endVal+"end"); + if ($(ipt).is("[name=start_date]") > 0) { + if (startVal > endVal && $(ipt).is("[name=start_date]") == true && endVal != "") { + //console.log("1",startVal,endVal); + alert("시작일이 종료일보다 클 수 없습니다."); + ipt.value = ""; + } else if (startVal > endVal && $(ipt).is("[name=end_date]") == true && startVal != "") { + //console.log("2",startVal,endVal); + //console.log(ipt); + if ($("duet-date-picker.end_date").val() == "") { + + } else { + alert("종료일이 시작일보다 작을 수 없습니다."); + ipt.value = ""; + } + } else {} + } else { + if (startVal > endVal && $(ipt).is("[name=" + startName + "]") == true && endVal != "") { + //console.log("1",startVal,endVal); + alert("시작일이 종료일보다 클 수 없습니다."); + ipt.value = ""; + } else if (startVal > endVal && $(ipt).is("[name=" + endName + "]") == true && startVal != "") { + //console.log("2",startVal,endVal); + //console.log(ipt); + if ($("duet-date-picker.end_date").val() == "") { + + } else { + alert("종료일이 시작일보다 작을 수 없습니다."); + ipt.value = ""; + } + } else {} + } + + } + + +} + +function calendarSetting() { + $('.calendar_wrap').each(function () { + $(this).find('.duet-date__input').attr('onkeydown', 'this.value=dateSetting(this.value);'); + $(this).find('.duet-date__input').attr('onblur', 'this.value=dateSettingHere(this.value);'); + }); +} + +function dateSetting(objValue) { + var v = objValue.replace("..", "."); + console.log(event.keyCode); // 한글쪽 - 189, 숫자키 쪽 109 + if (v.match(/^\d{4}$/) !== null) { + if (event.keyCode == "8") { + // 백스페이스 키를 누를 때 '.' 안생기게 + } else { + v = v + '.'; + } + } else if (v.match(/^\d{4}\.\d{2}$/) !== null) { + if (event.keyCode == "8") { + // 백스페이스 키를 누를 때 '.' 안생기게 + } else { + v = v + '.'; + } + } + + // '-' 막기 + if (event.keyCode == "189" || event.keyCode == "109") { + event.preventDefault(); + return v; + } else {} + + + return v; +} + +function calednarCaption() { + // 이전, 다음달 클릭 시 table caption 변경 + $(".duet-date__prev").on("click", function () { + var monthText = $(this).closest(".duet-date__dialog-content").find(".duet-date__select--month").val(); + var yearText = $(this).closest(".duet-date__dialog-content").find(".duet-date__select--year").val(); + monthText = Number(monthText) + 1; + monthText = monthText + "월"; + yearText = yearText + "년 "; + $(this).closest(".duet-date__dialog-content").find(".duet-date__table caption").remove(); + $(this).closest(".duet-date__dialog-content").find(".duet-date__table").prepend("" + yearText + monthText + " 달력입니다."); + }); + + $(".duet-date__next").on("click", function () { + var monthText = $(this).closest(".duet-date__dialog-content").find(".duet-date__select--month").val(); + var yearText = $(this).closest(".duet-date__dialog-content").find(".duet-date__select--year").val(); + monthText = Number(monthText) + 1; + monthText = monthText + "월"; + yearText = yearText + "년 "; + $(this).closest(".duet-date__dialog-content").find(".duet-date__table caption").remove(); + $(this).closest(".duet-date__dialog-content").find(".duet-date__table").prepend("" + yearText + monthText + " 달력입니다."); + }); +} + +function calendarTitle() { + setTimeout(function () { + $(".start_date .duet-date__input").attr("title", "시작날짜를 YYYY.MM.DD 형식으로 입력해주세요"); + $(".end_date .duet-date__input").attr("title", "종료날짜를 YYYY.MM.DD 형식으로 입력해주세요"); + + //웹접근성>달력 버튼 title추가 + $(".duet-date__input-wrapper .duet-date__toggle").attr("title", "달력팝업 열림"); + }, 100) +} \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/usr/scripts/layout.js b/src/main/webapp/kofair_case_seed/usr/scripts/layout.js index f3f4ea4c..5ce2a4a9 100644 --- a/src/main/webapp/kofair_case_seed/usr/scripts/layout.js +++ b/src/main/webapp/kofair_case_seed/usr/scripts/layout.js @@ -3,21 +3,21 @@ function header() { // ================= PC header ================= $(".menu_depth01>a").on("mouseover",function () { $(this).siblings(".sub_menu_wrap").stop().slideDown(600); - $(this).closest(".menu_depth01").siblings(".menu_depth01").find(".sub_menu_wrap").stop().slideUp(200); - return false + $(this).closest(".menu_depth01").siblings(".menu_depth01").find(".sub_menu_wrap").stop().slideUp(300); }); $(".sub_menu_wrap").mouseleave(function () { - $(this).slideUp(10) + $(this).stop().slideUp(300) }); + // 웹접근성 - gnb $(".menu_depth01>a").focus(function () { $(this).siblings(".sub_menu_wrap").slideDown(600); }); $(".menu_depth01").each(function (idx, itm) { $(itm).find("a").each(function (idx2, itm2) { - console.log(idx2, itm2, $(itm).find("a").length); + // console.log(idx2, itm2, $(itm).find("a").length); if ($(itm).find("a").length - 1 == idx2) { $(itm2).addClass("last"); } else if (idx2 == 0) { @@ -26,7 +26,6 @@ function header() { }); }); - // 웹접근성 - gnb $(".first").keydown(function (e) { if (e.keyCode == "9") { if (e.shiftKey) { @@ -48,12 +47,22 @@ function header() { } }); + + // 전체메뉴 + $(".btn_all_menu").click(function(){ + $(".full_all_menu").addClass("active"); + }); + + $(".full_all_menu .btn_menu_close").click(function(){ + $(".full_all_menu").removeClass("active"); + }) + // ================= 모바일 header ================= $(".m_sub_menu").slideUp(0) // 모바일 전체메뉴 - $(".m_menu_depth01").click(function () { + $(".m_menu_depth01").on("click",function () { $(this).next(".m_sub_menu").slideToggle(300); $(this).closest(".m_menu_depth01_li").toggleClass("active"); @@ -72,7 +81,7 @@ function header() { if ($(this).is(".btn_search") == true) { $(".mobile_header .search_area").toggleClass("active"); } else if ($(this).is(".btn_menu") == true) { - $(".mobile_header .all_menu_wrap").toggleClass("active"); + $(".mobile_header .all_menu_wrap").addClass("active"); } }); @@ -93,7 +102,10 @@ function snb() { $(this).closest("li").siblings("li").removeClass("active"); $(this).closest("li").siblings("li").find(".lnb_sub_menu").slideUp(400); } - }) + }); + + + } $(function () { diff --git a/src/main/webapp/kofair_case_seed/usr/scripts/request.js b/src/main/webapp/kofair_case_seed/usr/scripts/request.js index da07f457..ddcf287a 100644 --- a/src/main/webapp/kofair_case_seed/usr/scripts/request.js +++ b/src/main/webapp/kofair_case_seed/usr/scripts/request.js @@ -35,6 +35,89 @@ $(function () { $(".apl_list>li").last().find('.btn_delete_apl').attr("title", "신청인" + aplNum + " 삭제"); } }); + + // 하도급대금 내역, 도급대금 내역 입력 추가 및 삭제 + + // var priceTr = `` + // priceTr +=``; + // priceTr +=``; + // priceTr +=``; + // priceTr +=``; + // priceTr +=``; + // priceTr +=``; + // priceTr +=``; + // priceTr +=``; + // priceTr +=``; + // priceTr +=``; + + + + $(".btn_add_tr").on("click", function () { + + var trName = $(this).closest('.table_top').next(".price_table"); + trName = trName[0].classList[4]; + + var trLength = $(this).closest('.table_top').next(".price_table").find(".contract_input").length; + + var priceTr = `` + priceTr += `` + priceTr += ``; + priceTr += ``; + priceTr += ``; + priceTr += ``; + priceTr += ``; + priceTr += ``; + priceTr += ``; + priceTr += ``; + priceTr += ``; + priceTr += ``; + + $(this).closest('.table_top').next(".price_table").find("tbody").prepend(priceTr); + + $(".contract_input .select").change(function () { + if ($(this).val() !== "00") { + var selectTitle = $(this).find(":selected").text(); + + var reasonTr = `소계:` + selectTitle + ``; + reasonTr += ``; + reasonTr += ``; + reasonTr += ``; + reasonTr += ``; + reasonTr += ``; + reasonTr += ``; + reasonTr += ``; + reasonTr += ``; + reasonTr += ``; + reasonTr += ``; + reasonTr += ``; + + if ($(".reason_tr." + trName + trLength).length == 0) { + $(this).closest('.price_table').find("tbody").append(reasonTr); + } else { + $(this).closest(".price_table").find(".reason_tr." + trName + trLength).find("td").eq(0).text("소계:" + selectTitle); + } + $(this).closest(".contract_input").find(".input_text").removeAttr("readonly"); + } else {} + }) + + + + + }); + + $(".contract_input .select").change(function () { + if ($(this).val() !== "00") { + var selectTitle = $(this).find(":selected").text(); + console.log(selectTitle) + $(this).closest(".contract_input").find(".input_text").removeAttr("readonly"); + var trClass = $(this).closest(".contract_input")[0].classList[1]; + if ($(".reason_tr." + trClass).length == 0) {} else { + $(this).closest(".price_table").find(".reason_tr." + trClass).find("td").eq(0).text("소계:" + selectTitle); + } + } else {} + }) + + }) // 타이틀 클릭 시 하위 정보 노출/숨김 @@ -52,14 +135,15 @@ function removeLi(button) { if ($(itm1).closest(".apl_list").is(".rapl_list")) { $(itm1).html('피신청인' + idx1 + ' '); $(itm1).next(".btn_delete_apl").attr("title", "피신청인" + idx1 + " 삭제"); - }else{ + } else { $(itm1).html('신청인' + idx1 + ' '); $(itm1).next(".btn_delete_apl").attr("title", "신청인" + idx1 + " 삭제"); } }) } }) +} - +function deleteReadOnly(select) { } \ No newline at end of file diff --git a/src/main/webapp/kofair_case_seed/usr/style/common.css b/src/main/webapp/kofair_case_seed/usr/style/common.css index d0cbde31..2c148589 100644 --- a/src/main/webapp/kofair_case_seed/usr/style/common.css +++ b/src/main/webapp/kofair_case_seed/usr/style/common.css @@ -6,8 +6,12 @@ .btn_wrap.left{justify-content:flex-start;} .btn_wrap.center{justify-content:center;} +.btn_wrap .area_left,.btn_wrap .area_right{display:flex;gap:15px;} + + .btn{display:inline-block;color:#333;border-radius:5px;transition:all 0.2s ease-in-out;} .btn:hover{box-shadow:0 0 5px rgba(0,0,0,0.3);transition:all 0.2s ease-in-out;} +.btn.only_icon:hover{box-shadow:none;} .btn_35{height:35px;font-size:1.6rem;font-weight:400;padding:0 25px;} .btn_35.only_icon{width:35px;} @@ -40,8 +44,12 @@ .input_box{display:flex;align-items:center;gap:18px;flex-wrap:wrap;} .input_box.column{flex-direction:column;} -.input_text{height:40px;font-size:17px;color:#333;padding:0 10px;background:#fff;border:1px solid #d8d8d8;border-radius:5px;} -.input_text:active{border:1px solid #333;} +.input_text,.input_calendar .duet-date__input{height:40px;font-size:17px;color:#333;padding:0 10px;background:#fff;border:1px solid #d8d8d8;border-radius:5px;} +.input_text:active,.input_calendar .duet-date__input:active{border:1px solid #333;} + +.input_calendar .duet-date__toggle{width:38px;background:transparent url(/kofair_case_seed/usr/images/component/icon_calendar.png) no-repeat center center;background-size:18px 20px;border:0;box-shadow:none;} +.input_calendar .duet-date__toggle svg{display:none;} +.calendar_term{display:flex;align-items:center;gap:4px;} .input_file{position:absolute;width:0;height:0;padding:0;overflow:hidden;border:0;} .input_file+.file{display:inline-flex;justify-content:center;align-items:center;} @@ -64,6 +72,10 @@ input:disabled, input:read-only{background:#f8f9fa;border:1px solid #d8d8d8;} .fw_bold{font-weight:700 !important;} .fw_extrabold{font-weight:800 !important;} +.text_center{text-align:center;} +.text_left{text-align:left;} +.text_right{text-align:right;} + .gMarket_light{font-family:'GmarketSansLight';} .gMarket_medium{font-family:'GmarketSansMedium';} .gMarket_bold{font-family:'GmarketSansBold';} @@ -137,11 +149,14 @@ input:disabled, input:read-only{background:#f8f9fa;border:1px solid #d8d8d8;} /* 버튼 */ .btn{border-radius:10px;} + .btn:hover{box-shadow:none;} + .btn_35{height:70px;font-size:3.2rem;padding:0 50px;} .btn_40{height:80px;font-size:3.4rem;padding:0 38px;} .btn_45{height:90px;font-size:3.4rem;padding:0 36px;} .btn_50{height:100px;font-size:4rem;} + /* 노출/숨김 */ .pc_hide{display:inline-block;} diff --git a/src/main/webapp/kofair_case_seed/usr/style/layout.css b/src/main/webapp/kofair_case_seed/usr/style/layout.css index 7005688f..52e0ff1f 100644 --- a/src/main/webapp/kofair_case_seed/usr/style/layout.css +++ b/src/main/webapp/kofair_case_seed/usr/style/layout.css @@ -30,7 +30,7 @@ html{font-size:62.5%;} .header .nav .menu_ul{display:inline-flex;width:calc(100% - 43px);} .header .menu_depth01{width:calc(100% / 5);} .header .menu_depth01>a{display:flex;height:80px;font-size:2.3rem;font-weight:700;color:#333;text-align:center;align-items:center;justify-content:center;} -.header .sub_menu_wrap{position:absolute;display:none;width:100%;left:0;background:#fff;border-top:1px solid #d8d8d8;margin:-1px 0 0 0;top:79px;box-shadow:0px 6px 6px rgba(0,0,0,.19);} +.header .sub_menu_wrap{position:absolute;display:none;width:100%;left:0;background:#fff;border-top:1px solid #d8d8d8;margin:-1px 0 0 0;top:79px;box-shadow:0px 8px 8px rgba(0,0,0,.08);} .header .sub_menu{display:flex;} .header .sub_menu_wrap .sub_menu_title_wrap{width:400px;background:#2e40ba;color:#fff;text-align:right;padding:52px 70px 0 0;} .header .sub_menu_wrap .sub_menu_title_wrap h2{position:relative;font-size:3.3rem;font-weight:700;} @@ -50,6 +50,28 @@ html{font-size:62.5%;} .header .btn_search:hover,.header .btn_all_menu:hover{box-shadow:none;} /* //header */ +/* 전체메뉴 */ +.full_all_menu{position:fixed;width:100%;border-top:10px solid #171b70;background:#fff;top:-150vh;left:0;z-index:12;transition:top 0.3s ease-in-out;} +.full_all_menu.active{top:0;transition:top 0.3s ease-in-out;} +.full_all_menu .top_area{height:105px;justify-content:space-between;align-items:center;} +.full_all_menu .top_area .inner{display:flex;height:100%;justify-content:space-between;align-items:center;} +.full_all_menu .top_area .btn_menu_close{width:20px;height:20px;} +.full_all_menu .top_area .btn_menu_close i.icon.menu.close{background:url(/kofair_case_seed/usr/images/component/icon_close.png) no-repeat center center;background-size:20px auto;} + +.full_all_menu .nav{position:relative;display:flex;border-bottom:0;align-items:stretch;} +.full_all_menu .nav::after{position:absolute;content:"";width:100%;height:4px;background:#2e40ba;top:80px;} +.full_all_menu .menu_ul li{width:calc(100%/5);height:auto;text-align:center;} +.full_all_menu .menu_title{display:flex;width:100%;height:80px;font-size:23px;font-weight:bold;color:#333;justify-content:center;align-items:center;} +.full_all_menu .depth02_ul{display:flex;height:calc(100% - 95px);padding:32px 0 35px 30px;border-right:1px solid #d8d8d8;flex-direction:column;gap:30px;} +.full_all_menu li:last-child .depth02_ul{border-right:0;} +.full_all_menu .depth02_ul li{width:100%;text-align:left;} +.full_all_menu .depth02{display:flex;font-size:21px;font-weight:500;color:#333;align-items:center;} +.full_all_menu .depth03_ul{display:flex;margin:14px 0 0 0;font-size:19px;color:#666;flex-direction:column;gap:4px;} +.full_all_menu .depth03_ul a{position:relative;min-height:30px;padding:0 0 0 10px;} +.full_all_menu .depth03_ul a::after{position:absolute;content:"";width:4px;height:4px;background:#b4b4b4;left:0;top:12px;} + +/* //전체메뉴 */ + /* footer */ .footer{width:100%;background:#d0d1d3;padding:40px 0 35px 0;font-size:1.7rem;font-weight:400;color:#585858;} .footer_content{display:flex;margin:40px 0 0 0;align-items:flex-end;justify-content:space-between;} @@ -78,6 +100,9 @@ html{font-size:62.5%;} .pc_logo{display:none;} .m_logo{display:block;} + .full_all_menu{display:none !important;} + + /* header */ .header{border-top:0;} diff --git a/src/main/webapp/kofair_case_seed/usr/style/request.css b/src/main/webapp/kofair_case_seed/usr/style/request.css index c2ddeb79..ee2b97d3 100644 --- a/src/main/webapp/kofair_case_seed/usr/style/request.css +++ b/src/main/webapp/kofair_case_seed/usr/style/request.css @@ -60,6 +60,36 @@ .apl03_info_content .apl_info_input .phone_wrap .select{width:80px;} .apl03_info_content .apl_info_input .fax_wrap .input_text{width:calc((100% - 30px)/3);} +.apl03_info_content.apl05 .apl_info_input{display:block;} +.apl03_info_content.apl05 .title.depth02:nth-child(6){margin:30px 0 0 0;} +.apl03_info_content.apl05 .title.depth02{margin:50px 0 0 0;} +.apl03_info_content.apl05 .table_top .title.depth02,.apl03_info_content.apl05 .table_top .btn_wrap{margin:0;} +.apl03_info_content.apl05 .table_type_cols.line thead tr:nth-child(n+2) th:last-child{border-right:1px solid #d8d8d8;} +.apl03_info_content.apl05 .table_type_cols.line thead tr:nth-child(2) th{height:40px;font-size:1.6rem;} +.apl03_info_content.apl05 .table_type_cols.line thead tr:last-child th{height:40px;font-size:1.5rem;} +.apl03_info_content.apl05 .table_type_cols.line .input_text{width:100%;} +.apl03_info_content.apl05 .table_type_cols.line tr:hover td{text-decoration:none;} +.apl03_info_content.apl05 .table_type_cols.line td .select{font-size:1.6rem;font-weight:400;text-align:left;padding:0 8px;background-position:calc(100% - 8px) 51%;} +.apl03_info_content.apl05 td:first-child{font-size:1.5rem;font-weight:500;color:#333;} +.apl03_info_content.apl05 td:nth-child(n+2){font-size:1.4rem;} +.apl03_info_content.apl05 .title.blue_border.orange_border{margin:0;} +.apl03_info_content.apl05 .blue_row_dl{display:flex;margin:20px 0 0 0;flex-direction:column;border-top:2px solid #2e40ba;} +.apl03_info_content.apl05 .blue_row_dl>dt{display:flex;height:60px;padding:0 30px;font-size:1.7rem;font-weight:500;color:#333;background:#f4f5f7;border-bottom:1px solid #d8d8d8;align-items:center;} +.apl03_info_content.apl05 .blue_row_dl>dd{display:flex;min-height:65px;padding:14px 30px;border-bottom:1px solid #d8d8d8;align-items:center;} +.apl03_info_content.apl05 .blue_row_dl>dd.request_check{display:flex;align-items:flex-start;} +.apl03_info_content.apl05 .blue_row_dl>dd.request_check dl{width:calc(70% / 3)} +.apl03_info_content.apl05 .blue_row_dl .radio+label{font-size:1.7rem;font-weight:300;transform:skew(-0.1deg);} +.apl03_info_content.apl05 .request_check dt{font-size:1.7rem;margin:0 0 14px 0;} +.apl03_info_content.apl05 .request_check dd{padding:0 0 10px 16px;font-size:1.7rem;font-weight:300;} +.apl03_info_content.apl05 .etc_check_dl dd>.input_box{width:100%;} +.apl03_info_content.apl05 .etc_check_dl dd>.input_box>li:last-child{display:inline-flex;width:85%;align-items:center;} +.apl03_info_content.apl05 .etc_check_dl dd>.input_box .input_box{width:calc(100% - 100px);margin:0 0 0 15px;} +.apl03_info_content.apl05 .etc_check_dl dd>.input_box .input_box li{width:50%;} +.apl03_info_content.apl05 .etc_check_dl dd>.input_box .input_box li .input_text{width:100%;} +.apl03_info_content.apl05 .etc_check_dl dd>.input_box .cf_text.color_red{font-size:1.4rem;margin:5px 0 0 0;} +.apl03_info_content.apl05 .title.blue_border{display:block;margin:50px 0 0 0;} +.apl03_info_content.apl05 .title.blue_border::after{top:8px;} + /* 분쟁조정 사건조회 */ .inquiry_content .box.gray_fill{padding:50px 20px;} .inquiry_content .input_box.column{width:500px;justify-content:center;margin:0 auto;} diff --git a/src/main/webapp/kofair_case_seed/usr/style/style.css b/src/main/webapp/kofair_case_seed/usr/style/style.css index 01550d2d..eeb9f9c7 100644 --- a/src/main/webapp/kofair_case_seed/usr/style/style.css +++ b/src/main/webapp/kofair_case_seed/usr/style/style.css @@ -56,6 +56,7 @@ /* table */ .table_top{display:flex;align-items:center;justify-content:space-between;} .table_top.title{align-items:flex-end;} +.table_top.title .depth02{font-size:2.2rem;} .table_top.title .cf_text{font-size:1.5rem;font-weight:400;color:#666;} .table_top .search_wrap{padding:0;margin:0;background:#fff;} .table_top .list_total_number{font-size:1.7rem;color:#666;} @@ -73,10 +74,14 @@ .table_type_cols table tbody td.table_number{color:#666;} .table_type_cols table tbody td.list_none{color:#666;} .table_type_cols table tbody td .list_title{color:#333;text-align:left;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;} +.table_type_cols table tbody td .select{min-width:0;} +.table_type_cols table tfoot tr{border-bottom:1px solid #d8d8d8;background:#f4f5f7;text-align:center;} +.table_type_cols table tfoot tr td{height:50px;color:#333;vertical-align:middle;} -.table_type_cols.line th,.table_type_cols.line td{color:#333;border-right:1px solid #d8d8d8;} -.table_type_cols.line td{font-weight:300;} +.table_type_cols.line th,.table_type_cols.line td{color:#333;border-right:1px solid #d8d8d8;padding:0 5px;} +.table_type_cols.line td{font-weight:300;color:#666;} .table_type_cols.line th:last-child,.table_type_cols.line td:last-child{border-right:0;} +.table_type_cols.line tfoot td{font-weight:400;color:#333;} .table_type_cols+.cf_text{margin:15px 0 0 0;} @@ -89,7 +94,6 @@ .table_type_rows table .phone_wrap .input_text{width:calc((100% - 115px)/2);} .table_type_rows+.cf_text{margin:15px 0 0 0;} - /* view */ .list_view{margin:40px 0 0 0;} .list_view_tit{border-bottom:1px solid #c9c9c9;padding:24px;font-size:2.1rem;font-weight:bold;color:#333;border-top:3px solid #2e40ba;background:#f4f5f7;} @@ -224,17 +228,17 @@ .table_type_cols table{font-size:3.4rem;} - .table_type_cols:not(.mobile_view_table) colgroup,.table_type_cols:not(.line) thead{display:none;} - .table_type_cols:not(.mobile_view_table) table tbody tr{position:relative;display:flex;min-height:120px;padding:30px 40px 30px 120px;flex-wrap:wrap;align-items:center;justify-content:flex-start;box-sizing:border-box;gap:20px;} - .table_type_cols:not(.mobile_view_table) table tbody tr.tr_list_none{justify-content:center;padding:0;} - .table_type_cols:not(.mobile_view_table) table tbody td{max-width:50%;height:auto;order:5;background:none;} - .table_type_cols:not(.mobile_view_table) table tbody td.list_none{display:flex;max-width:100%;height:40px;align-items:center;justify-content:center;text-align:center;} - .table_type_cols:not(.mobile_view_table) table tbody .table_number{position:absolute;width:110px;left:0;top:50%;transform:translateY(-50%);} - .table_type_cols:not(.mobile_view_table) table tbody .td_title{width:100%;max-width:100%;order:1;white-space:wrap;} - .table_type_cols:not(.mobile_view_table) table tbody .td_title a{display:-webkit-box;text-align:left;max-height:96px;line-height:1.4;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;white-space:wrap;} - .table_type_cols:not(.mobile_view_table) table tbody .td_title a .pc_hide{text-align:left;} - .table_type_cols:not(.mobile_view_table) table tbody .td_icon{display:inline-block !important;margin:-5px 13px 0 0;} - .table_type_cols:not(.mobile_view_table) table tbody .td_hide{display:none;} + .table_type_cols:not(.mobile_view_table, .scroll_table) colgroup,.table_type_cols:not(.line) thead{display:none;} + .table_type_cols:not(.mobile_view_table, .scroll_table) table tbody tr{position:relative;display:flex;min-height:120px;padding:30px 40px 30px 120px;flex-wrap:wrap;align-items:center;justify-content:flex-start;box-sizing:border-box;gap:20px;} + .table_type_cols:not(.mobile_view_table, .scroll_table) table tbody tr.tr_list_none{justify-content:center;padding:0;} + .table_type_cols:not(.mobile_view_table, .scroll_table) table tbody td{max-width:50%;height:auto;order:5;background:none;} + .table_type_cols:not(.mobile_view_table, .scroll_table) table tbody td.list_none{display:flex;max-width:100%;height:40px;align-items:center;justify-content:center;text-align:center;} + .table_type_cols:not(.mobile_view_table, .scroll_table) table tbody .table_number{position:absolute;width:110px;left:0;top:50%;transform:translateY(-50%);} + .table_type_cols:not(.mobile_view_table, .scroll_table) table tbody .td_title{width:100%;max-width:100%;order:1;white-space:wrap;} + .table_type_cols:not(.mobile_view_table, .scroll_table) table tbody .td_title a{display:-webkit-box;text-align:left;max-height:96px;line-height:1.4;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;white-space:wrap;} + .table_type_cols:not(.mobile_view_table, .scroll_table) table tbody .td_title a .pc_hide{text-align:left;} + .table_type_cols:not(.mobile_view_table, .scroll_table) table tbody .td_icon{display:inline-block !important;margin:-5px 13px 0 0;} + .table_type_cols:not(.mobile_view_table, .scroll_table) table tbody .td_hide{display:none;} .mobile_view_table table{margin:40px 0 0 0;border-top:4px solid #2e40ba;} .mobile_view_table table thead th,.mobile_view_table table tbody td{height:100px;border-bottom:2px solid #d8d8d8;border-right:2px solid #d8d8d8;} @@ -257,6 +261,8 @@ .table_type_rows table .email_wrap .email_select{width:calc(45% - 20px);} .table_type_rows table+.cf_text{margin:30px 0 0 0;} + + .scroll_table{overflow:auto;} /* view */
+

Duet Date Picker examples

+

+ Duet Date Picker is an open source version of + Duet Design System’s accessible date picker. It can be implemented and used + across any JavaScript framework or no framework at all. +

+ +

+ + For documentation, please see the + GitHub repository. + +

+ + + + +

Default

+ + +
<label for="date">Choose a date</label>
+<duet-date-picker identifier="date"></duet-date-picker>
+ +

Using show() method

+ + + + +
<label for="date">Choose a date</label>
+<duet-date-picker identifier="date"></duet-date-picker>
+<button type="button">Show date picker</button>
+
+<script>
+  const button = document.querySelector("button")
+
+  button.addEventListener("click", function() {
+    document.querySelector("duet-date-picker").show()
+  });
+</script>
+ +

Using setFocus() method

+ + + + +
<label for="date">Choose a date</label>
+<duet-date-picker identifier="date"></duet-date-picker>
+<button type="button">Focus date picker</button>
+
+<script>
+  const button = document.querySelector("button")
+
+  button.addEventListener("click", function() {
+    document.querySelector("duet-date-picker").setFocus()
+  });
+</script>
+ +

Getting selected value

+ + + undefined + +
<label for="date">Choose a date</label>
+<duet-date-picker identifier="date"></duet-date-picker>
+<output>undefined</output>
+
+<script>
+  const picker = document.querySelector("duet-date-picker")
+  const output = document.querySelector("output")
+
+  picker.addEventListener("duetChange", function(event) {
+    output.innerHTML = event.detail.valueAsDate
+  });
+</script>
+ +

Predefined value

+ + +
<label for="date">Choose a date</label>
+<duet-date-picker identifier="date" value="2020-06-16">
+</duet-date-picker>
+ +

Minimum and maximum date

+ + +
<label for="date">Choose a date</label>
+<duet-date-picker identifier="date" min="1990-06-10"
+  max="2020-07-18" value="2020-06-16">
+</duet-date-picker>
+ +

Localization

+ + + +
<label for="date">Valitse päivämäärä</label>
+<duet-date-picker identifier="date"></duet-date-picker>
+
+<script>
+  const picker = document.querySelector("duet-date-picker")
+  const DATE_FORMAT = /^(\d{1,2})\.(\d{1,2})\.(\d{4})$/
+
+  picker.dateAdapter = {
+    parse(value = "", createDate) {
+      const matches = value.match(DATE_FORMAT)
+      if (matches) {
+        return createDate(matches[3], matches[2], matches[1])
+      }
+    },
+    format(date) {
+      return `${date.getDate()}.${date.getMonth() + 1}.${date.getFullYear()}`
+    },
+  }
+
+  picker.localization = {
+    buttonLabel: "Valitse päivämäärä",
+    placeholder: "pp.kk.vvvv",
+    selectedDateMessage: "Valittu päivämäärä on",
+    prevMonthLabel: "Edellinen kuukausi",
+    nextMonthLabel: "Seuraava kuukausi",
+    monthSelectLabel: "Kuukausi",
+    yearSelectLabel: "Vuosi",
+    closeLabel: "Sulje ikkuna",
+    calendarHeading: "Valitse päivämäärä",
+    dayNames: ["Sunnuntai", "Maanantai", "Tiistai", "Keskiviikko", "Torstai", "Perjantai", "Lauantai"],
+    monthNames: ["Tammikuu", "Helmikuu", "Maaliskuu", "Huhtikuu", "Toukokuu", "Kesäkuu", "Heinäkuu", "Elokuu", "Syyskuu", "Lokakuu", "Marraskuu", "Joulukuu"],
+    monthNamesShort: ["Tammi", "Helmi", "Maalis", "Huhti", "Touko", "Kesä", "Heinä", "Elo", "Syys", "Loka", "Marras", "Joulu"],
+    locale: "fi-FI",
+  }
+</script>
+ +

Changing first day of week and date format

+ + + +
<label for="date">Choose a date</label>
+<duet-date-picker first-day-of-week="0" identifier="date"></duet-date-picker>
+
+<script>
+  const picker = document.querySelector("duet-date-picker")
+  const DATE_FORMAT_US = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/
+
+  picker.dateAdapter = {
+    parse(value = "", createDate) {
+      const matches = value.match(DATE_FORMAT_US)
+
+      if (matches) {
+        return createDate(matches[3], matches[1], matches[2])
+      }
+    },
+    format(date) {
+      return `${date.getMonth() + 1}/${date.getDate()}/${date.getFullYear()}`
+    },
+  }
+
+  picker.localization = {
+    buttonLabel: "Choose date",
+    placeholder: "mm/dd/yyyy",
+    selectedDateMessage: "Selected date is",
+    prevMonthLabel: "Previous month",
+    nextMonthLabel: "Next month",
+    monthSelectLabel: "Month",
+    yearSelectLabel: "Year",
+    closeLabel: "Close window",
+    calendarHeading: "Choose a date",
+    dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
+    monthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
+    monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
+    locale: "en-US",
+  }
+</script>
+ +

Required atrribute

+ +
+ + +
+ +
<label for="date">Choose a date</label>
+<duet-date-picker required identifier="date"></duet-date-picker>
+
+<script>
+  const form = document.querySelector(".form-picker-required")
+  form.addEventListener("submit", function(e) {
+    e.preventDefault()
+    alert("Submitted")
+  })
+</script>
+ +

Disable selectable days

+

+ This only disables selection of dates in the popup calendar. You must still handle the case where a user enters + a disallowed date into the input. +

+ + + +
<label for="date">Choose a date</label>
+<duet-date-picker identifier="date"></duet-date-picker>
+
+<script>
+  function isWeekend(date) {
+    return date.getDay() === 0 || date.getDay() === 6
+  }
+
+  const pickerDisableWeekend = document.querySelector(".picker-disabled-weekend")
+  pickerDisableWeekend.isDateDisabled = isWeekend
+
+  pickerDisableWeekend.addEventListener("duetChange", function(e) {
+    if (isWeekend(e.detail.valueAsDate)) {
+      alert("Please select a weekday")
+    }
+  })
+</script>
+
+

+ © 2020 LocalTapiola Services Ltd / + Duet Design System.
Licensed under the MIT license. +

+