From 6fbc238ed7f3db7ef5d8d632697f08953d62cd24 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Wed, 21 Jan 2026 15:39:16 +0800 Subject: [PATCH 1/9] fix & test --- .../common/appointmentForm/form.visual.ts | 32 ++++++++++ .../appointmentForm/recurrence-form.visual.ts | 64 +++++++++++++++++++ .../scss/widgets/base/scheduler/_index.scss | 22 +++++-- 3 files changed, 112 insertions(+), 6 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/scheduler/common/appointmentForm/form.visual.ts b/e2e/testcafe-devextreme/tests/scheduler/common/appointmentForm/form.visual.ts index 99681154d827..0d61f2799deb 100644 --- a/e2e/testcafe-devextreme/tests/scheduler/common/appointmentForm/form.visual.ts +++ b/e2e/testcafe-devextreme/tests/scheduler/common/appointmentForm/form.visual.ts @@ -337,3 +337,35 @@ test.meta({ browserSize: [1500, 1500] })('Recurrence settings button should have currentDate: new Date(2021, 2, 25), }); }); + +test.meta({ browserSize: [1500, 1500] })('appointment form with labelMode=static', async (t) => { + const { takeScreenshot, compareResults } = createScreenshotsComparer(t); + + const scheduler = new Scheduler(SCHEDULER_SELECTOR); + const appointmentPopup = await scheduler.openAppointmentPopup(t, undefined, false); + + await testScreenshot( + t, + takeScreenshot, + 'scheduler__appointment__main-form__with-labelMode-static.png', + { element: appointmentPopup.contentElement }, + ); + + await t + .expect(compareResults.isValid()) + .ok(compareResults.errorMessages()); +}).before(async () => { + await createWidget('dxScheduler', { + dataSource: [], + views: ['week'], + currentView: 'week', + currentDate: new Date(2021, 2, 25), + resources: getResources(true), + editing: { + allowUpdating: true, + form: { + labelMode: 'static', + }, + }, + }); +}); diff --git a/e2e/testcafe-devextreme/tests/scheduler/common/appointmentForm/recurrence-form.visual.ts b/e2e/testcafe-devextreme/tests/scheduler/common/appointmentForm/recurrence-form.visual.ts index e6754d3c33b0..d37dbc6e2332 100644 --- a/e2e/testcafe-devextreme/tests/scheduler/common/appointmentForm/recurrence-form.visual.ts +++ b/e2e/testcafe-devextreme/tests/scheduler/common/appointmentForm/recurrence-form.visual.ts @@ -145,3 +145,67 @@ test.meta({ browserSize: [450, 1000] })('recurrence form on mobile screen', asyn }, }, })); + +test.meta({ browserSize: [1500, 1500] })('recurrence form with labelMode=static', async (t) => { + const { takeScreenshot, compareResults } = createScreenshotsComparer(t); + + const appointment = { + text: 'Readonly Recurrent Appointment', + startDate: new Date('2024-01-01T10:00:00'), + endDate: new Date('2024-01-01T11:00:00'), + recurrenceRule: 'FREQ=WEEKLY;BYDAY=MO,WE,FR;COUNT=10', + }; + + const scheduler = new Scheduler(SCHEDULER_SELECTOR); + const appointmentPopup = await scheduler.openAppointmentPopup(t, appointment, false); + + await appointmentPopup.openRecurrenceSettings(t); + + await testScreenshot( + t, + takeScreenshot, + 'scheduler__appointment__recurrence-form__with-labelMode-static.png', + { element: appointmentPopup.contentElement }, + ); + + await t + .expect(compareResults.isValid()) + .ok(compareResults.errorMessages()); +}).before(async () => { + await createWidget('dxScheduler', { + dataSource: [], + views: ['week'], + currentView: 'week', + currentDate: new Date(2021, 2, 25), + editing: { + allowUpdating: true, + form: { + iconsShowMode: 'both', + labelMode: 'static', + items: [ + 'mainGroup', + { + name: 'recurrenceGroup', + items: [ + 'recurrenceStartDateGroup', + 'recurrenceRuleGroup', + { + name: 'recurrenceEndGroup', + items: [ + 'recurrenceEndIcon', + { + name: 'recurrenceEndEditor', + label: { + visible: true, + location: 'top', + }, + }, + ], + }, + ], + }, + ], + }, + }, + }); +}); diff --git a/packages/devextreme-scss/scss/widgets/base/scheduler/_index.scss b/packages/devextreme-scss/scss/widgets/base/scheduler/_index.scss index f9b961f6ee2a..ee55d0ed6c40 100644 --- a/packages/devextreme-scss/scss/widgets/base/scheduler/_index.scss +++ b/packages/devextreme-scss/scss/widgets/base/scheduler/_index.scss @@ -507,21 +507,31 @@ $scheduler-appointment-form-label-padding: 20px; align-items: start; } + .dx-scheduler-form-group-with-icon:not( + .dx-scheduler-form-date-range-group, + .dx-scheduler-form-recurrence-end-group + ) { + .dx-item:has(+ .dx-item .dx-first-row > .dx-field-item-label-location-top) { + .dx-scheduler-form-icon { + /* + If the item next to icon element has label on top, + then in order to align icon with the editor we need to add margin to icon. + For date range and recurrence end groups, alignment is not needed. + */ + margin-top: $scheduler-appointment-popup-icon-margin-top; + } + } + } + .dx-scheduler-form-icon { display: flex; align-items: center; - margin-top: $scheduler-appointment-popup-icon-margin-top; > .dx-field-item-content { line-height: 1; } } - .dx-scheduler-form-date-range-group .dx-scheduler-form-icon, - .dx-scheduler-form-recurrence-end-group .dx-scheduler-form-icon { - margin-top: 0; - } - /* Editors alignment */ .dx-scheduler-form-all-day-switch.dx-field-item.dx-label-h-align { align-items: center; From 4297ee6735a7dea8a4193e0e2611d22685bfe460 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Wed, 21 Jan 2026 15:48:40 +0800 Subject: [PATCH 2/9] fix lint --- .../devextreme-scss/scss/widgets/base/scheduler/_index.scss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/devextreme-scss/scss/widgets/base/scheduler/_index.scss b/packages/devextreme-scss/scss/widgets/base/scheduler/_index.scss index ee55d0ed6c40..573cda9027c5 100644 --- a/packages/devextreme-scss/scss/widgets/base/scheduler/_index.scss +++ b/packages/devextreme-scss/scss/widgets/base/scheduler/_index.scss @@ -508,13 +508,13 @@ $scheduler-appointment-form-label-padding: 20px; } .dx-scheduler-form-group-with-icon:not( - .dx-scheduler-form-date-range-group, + .dx-scheduler-form-date-range-group, .dx-scheduler-form-recurrence-end-group ) { .dx-item:has(+ .dx-item .dx-first-row > .dx-field-item-label-location-top) { .dx-scheduler-form-icon { - /* - If the item next to icon element has label on top, + /* + If the item next to icon element has label on top, then in order to align icon with the editor we need to add margin to icon. For date range and recurrence end groups, alignment is not needed. */ From f899422ab8b3a4b4338d045eaa70c76ea3427639 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Thu, 22 Jan 2026 14:45:55 +0800 Subject: [PATCH 3/9] refix --- .../scss/widgets/base/scheduler/_index.scss | 16 ++----------- .../widgets/generic/scheduler/_index.scss | 4 ++++ .../widgets/generic/scheduler/_sizes.scss | 3 +++ .../scheduler/appointment_popup/m_form.ts | 24 +++++++++++++++++++ 4 files changed, 33 insertions(+), 14 deletions(-) diff --git a/packages/devextreme-scss/scss/widgets/base/scheduler/_index.scss b/packages/devextreme-scss/scss/widgets/base/scheduler/_index.scss index 573cda9027c5..24b04b1d6359 100644 --- a/packages/devextreme-scss/scss/widgets/base/scheduler/_index.scss +++ b/packages/devextreme-scss/scss/widgets/base/scheduler/_index.scss @@ -507,20 +507,8 @@ $scheduler-appointment-form-label-padding: 20px; align-items: start; } - .dx-scheduler-form-group-with-icon:not( - .dx-scheduler-form-date-range-group, - .dx-scheduler-form-recurrence-end-group - ) { - .dx-item:has(+ .dx-item .dx-first-row > .dx-field-item-label-location-top) { - .dx-scheduler-form-icon { - /* - If the item next to icon element has label on top, - then in order to align icon with the editor we need to add margin to icon. - For date range and recurrence end groups, alignment is not needed. - */ - margin-top: $scheduler-appointment-popup-icon-margin-top; - } - } + .dx-scheduler-form-top-label-offset { + margin-top: $scheduler-appointment-popup-icon-margin-top; } .dx-scheduler-form-icon { diff --git a/packages/devextreme-scss/scss/widgets/generic/scheduler/_index.scss b/packages/devextreme-scss/scss/widgets/generic/scheduler/_index.scss index b204799a3646..4bef8ff8be1f 100644 --- a/packages/devextreme-scss/scss/widgets/generic/scheduler/_index.scss +++ b/packages/devextreme-scss/scss/widgets/generic/scheduler/_index.scss @@ -277,6 +277,10 @@ $generic-scheduler-agenda-group-header-padding: $generic-scheduler-agenda-time-c font-size: $generic-scheduler-appointment-popup-icon-size; } } + + &.dx-scheduler-form-inner-label-offset { + margin-top: $generic-scheduler-appointment-popup-icon-inner-label-margin-top; + } } .dx-scheduler-form-icon-sized-gap { diff --git a/packages/devextreme-scss/scss/widgets/generic/scheduler/_sizes.scss b/packages/devextreme-scss/scss/widgets/generic/scheduler/_sizes.scss index deac8c0cc6dc..97a54afea79d 100644 --- a/packages/devextreme-scss/scss/widgets/generic/scheduler/_sizes.scss +++ b/packages/devextreme-scss/scss/widgets/generic/scheduler/_sizes.scss @@ -33,6 +33,7 @@ $generic-scheduler-appointment-popup-icon-size: null !default; $generic-scheduler-appointment-popup-icon-container-height: null !default; $generic-scheduler-appointment-popup-icon-padding-right: null !default; $generic-scheduler-appointment-popup-icon-margin-top: null !default; +$generic-scheduler-appointment-popup-icon-inner-label-margin-top: null !default; $generic-scheduler-appointment-popup-item-padding-horizontal: null !default; $generic-scheduler-appointment-popup-item-padding-top: null !default; $generic-scheduler-appointment-popup-all-day-item-height: null !default; @@ -99,6 +100,7 @@ $generic-scheduler-group-header-agenda-font-size: 14px !default; $generic-scheduler-appointment-popup-icon-container-height: 36px !default; $generic-scheduler-appointment-popup-icon-padding-right: 5px !default; $generic-scheduler-appointment-popup-icon-margin-top: 22px !default; + $generic-scheduler-appointment-popup-icon-inner-label-margin-top: null !default; $generic-scheduler-appointment-popup-item-padding-horizontal: 5px !default; $generic-scheduler-appointment-popup-item-padding-top: 20px !default; $generic-scheduler-appointment-popup-all-day-item-height: 36px !default; @@ -167,6 +169,7 @@ $generic-scheduler-group-header-agenda-font-size: 14px !default; $generic-scheduler-appointment-popup-icon-container-height: 26px !default; $generic-scheduler-appointment-popup-icon-padding-right: 5px !default; $generic-scheduler-appointment-popup-icon-margin-top: 18px !default; + $generic-scheduler-appointment-popup-icon-inner-label-margin-top: 4.5px !default; $generic-scheduler-appointment-popup-item-padding-horizontal: 5px !default; $generic-scheduler-appointment-popup-item-padding-top: 10px !default; $generic-scheduler-appointment-popup-all-day-item-height: 24px !default; diff --git a/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts b/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts index 816df5c92e08..26b09c15abc9 100644 --- a/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts +++ b/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts @@ -34,9 +34,14 @@ const CLASSES = { icon: 'dx-icon', hidden: 'dx-hidden', fieldItemContent: 'dx-field-item-content', + formItem: 'dx-item', + labelTop: 'dx-field-item-label-location-top', + label: 'dx-label', groupWithIcon: 'dx-scheduler-form-group-with-icon', formIcon: 'dx-scheduler-form-icon', + formIconTopLabelOffset: 'dx-scheduler-form-top-label-offset', + formIconInnerLabelOffset: 'dx-scheduler-form-inner-label-offset', defaultResourceIcon: 'dx-scheduler-default-resources-icon', mainGroup: 'dx-scheduler-form-main-group', @@ -307,6 +312,8 @@ export class AppointmentForm { this._$mainGroup = $formElement.find(`.${CLASSES.mainGroup}`); this._$recurrenceGroup = $formElement.find(`.${CLASSES.recurrenceGroup}`); + this.alignIconsWithEditors(); + onContentReady?.call(this, e); }, } as FormProperties; @@ -858,6 +865,23 @@ export class AppointmentForm { } } + private alignIconsWithEditors(): void { + const $groups = this.dxForm.$element().find(`.${CLASSES.groupWithIcon}`); + + $groups.toArray().forEach((groupElement) => { + const $group = $(groupElement); + const $icon = $group.find(`.${CLASSES.formIcon}`); + const $items = $group.find(`.${CLASSES.formItem}:not(:has(.${CLASSES.formIcon}))`); + const $firstSimpleItem = $items.filter(`:not(:has(.${CLASSES.formItem}))`).first(); + + const hasTopLabel = $firstSimpleItem.find(`.${CLASSES.labelTop}`).length > 0; + const hasInnerLabel = $firstSimpleItem.find(`.${CLASSES.label}`).length > 0; + + $icon.toggleClass(CLASSES.formIconTopLabelOffset, hasTopLabel); + $icon.toggleClass(CLASSES.formIconInnerLabelOffset, hasInnerLabel); + }); + } + showMainGroup(): void { this._popup.updateToolbarForMainGroup(); From 2a6ce91b0e6691535266f2ba9ddef9e1c9aff526 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Thu, 22 Jan 2026 15:27:42 +0800 Subject: [PATCH 4/9] fix tests --- ...h-labelMode-static (fluent.blue.light).png | Bin 0 -> 32316 bytes .../appointmentForm/recurrence-form.visual.ts | 2 +- .../scheduler/appointment_popup/m_form.ts | 30 ++++++++++++------ 3 files changed, 21 insertions(+), 11 deletions(-) create mode 100644 e2e/testcafe-devextreme/tests/scheduler/common/appointmentForm/etalons/scheduler__appointment__main-form__with-labelMode-static (fluent.blue.light).png diff --git a/e2e/testcafe-devextreme/tests/scheduler/common/appointmentForm/etalons/scheduler__appointment__main-form__with-labelMode-static (fluent.blue.light).png b/e2e/testcafe-devextreme/tests/scheduler/common/appointmentForm/etalons/scheduler__appointment__main-form__with-labelMode-static (fluent.blue.light).png new file mode 100644 index 0000000000000000000000000000000000000000..436343b8a71e704ce9a9db9b27238e902de9ca7b GIT binary patch literal 32316 zcmdSCd05Zu`u@Ev^H`B76bWTag%Fmglu9$1r=pMs8cdNXg=nCXsieUyl$i!YG9hUbktA}iQ^*?#*#lW^YdD(jT7Iyd4b#7+2&g$c3 zQK!p5r_33hB2T|M|0?R0r{CnEhS@d4)m-i;+wcE%X|CQ(ohWxNuddqKiY6u|9XoYO z8h=DJpmU@2j3XybDDSj189A~}+kR6u`t?&V4c+3@-Za!|hk5sn#$9_x1RXu9Z8&Pw zR*l9Z73&q|+8miW%wX8CPoF>UbIIEuGh}hltgD-6=&5XVYJW0!Zszst8*c3!T3k@D zvU8(=^4DP+8`|`lSWsM?abfunO-;?e21c1z{rK^Zzqd-&A3C)7e@ z-|)eY5?$WLJ9!Qov8%C1$y7T#yFCxzY4z=UWxDqC4F?Y%JbLnE)~#DDPENG2u>kvvqS~}*TH}((ZQSxrjg0F1`T0G1^r+zN+aTk(%Pk|e zZ?~O1*?j6$RW~=c#QUzUp&L6lI_WmUQ)Th}^p|>N#z!8`nl)>6TwGU`O%2Az=gxIs zv?!BLe}3vXi!h~ndmrq)-8c5|klj-T*x5Lg&It}&SckW!w^{^hg-tQ-< zI+T@_omlunb^Q48wVU(vCqFne>1vusvDJb522D;ae6cwtMc3Nex>11pQk|2D{9csq zoQlNiuTK|h_3LMH$RWkA(%HOwD}@7Y&(0ikzNw`ZOz`jHMF(2RKB`hscmB$Y`n4E<=y_Z*K4XP-{haxZPB7de(apg?R6VOm}Pzc^3Lzahg8RNzWs+S`Fv?Ui(wwEw_(c` z#g;8wCMGZaR%YkmaD3@Ex3ZVzg&C7CEQ=zX?;aT6kH3DD=FxTQ)~$9APc4|FGRQ3_ zeQi_63(E$tS5PZ`d;dVa`t|#Jm6|^};j;QM3szOQUTuu2>5MOL@4tVV8lpSrmYj`1 zrLOIUFVnYw^JR(it(fa9`t_SPIRQ~uHg(Wl{(aHJ6LVKRjvg>CaMPxexRBwoJ|Ca& zOGwB&IdA-x&7E%KjT><@JEGTM-}25SB_-_AE}!Rq4F?Sxq}*rXi9P%F)iWA1rqS`< zUS;`%2fF27JLs4);iPM8M@Pr`Pfu;iOBmOxO`9uwMy`IH8`to~iXVM8Y}l}G|Nf$P z?{3^nvh}OD-XkeFF){FQ%ABy!P(wGjzWh%fYSxuzfByNW_KtxIRGyw%P|SWTtGqd= z=5yY-nBmK#*ER2;<9biCL9=!%XJ!Sp?mgk?AN*gh3CCvE59@9*v!?3PJ$ogKj!{+N z{bn@(;BnO6t4l)UDF3&S=Rc@tl^FM4l{@!kaK8)F-#s`q+u3>MoH-`EQM+MF^tyEE z(kQiuZBwGDNnGwVHaPdqqGjcm8|DWenv`1cWZsb(3m4vITYW#C|JJBcqv^S^M&>d4 zN=9~e%0Y1^AvX65Gu9tVNs$ly`pc3WPcJVCA%ZvmCQ)Ghx$N1F#6(RpTs2#jw&LfI z`$_j*D=I2vgW}`kd9AIHk?s0UJ$LQS-chH0KdC#ro>a+->_1C?$!E>F4O?go9N5M* zG*Wj?iw=X_GT*av)6Zz>I+xm3X(%P_h z)OsDae0}*WnHyR~4fg6j>D2rgyo>pcftxBSJg;nQKZ*@=c5-rRrfLw$0bsY)IBLFS zr(fwW|E`ytn;WC=@u#l5CRx1X+YA3WkB-hbS9xnFiCLE|=8Oi$a!zt~4eMZZWa{~< z(j5z5KTYko`2MV^6EAdXYdq4U{*mQg>%Mv^9M|f$ZE^2N-{Ez+q${aP&q;a=RdksaCvp(=FLmIgMxx0NB9pP zw)E?4_AQcA68z}Vga-#5Gx}YuNiPl=v3d7yHP*^*@#{NXzJL38n-gYgYFc=`$L`S{ z^WgjJdo%Q~Ze)Hxgc2dJM*8f*+?#Nfd3!{4P37%3 zcjKEnj~iaCF>crwWe*RJgHz8(4>h&0=r(w8`-KY^Do;7<-Az|F?BR#cdaLYpwbIT~gZTk3HI*|L)Ur zbBWIB9cs5tmK3`jDYTi||JU=yQJJm$40?x#hE{#Ls#eYMfAjqOQ2POH`H?AeZr?pL zX^=9Bc<_kYs;+Zx?}~T2vCVw<@SWTGOp1N|;^K(qKfac*_meNK*clqy^0{wub1H+? z?Af!mmwugZV`DS-UZPU*)sO@du%@S{XXLP@1J}3clz!#Py1rA+lv7@2Em&|f!?ILO zn;gq>Ei7apT54IXUktFL#=35k%nx0hqnIwKFOE_U#adLlZp;F4ZwJGfNBO zsf#{*u(02xGQiNIB)fH4R@k`VruI{(PSsTPukpC&I>7n)^XHm6Iy%~u&U*K`eEBlF zZe^dbuK9+I8(&s^Dh}Va&Bi`Nby#BdjT=oj8IM}BWXQJHlf9MtdOPI2ejNGzi(TYT z-%^!%3P0DzZXG*pc*l-84=+01o%wY|k;3dxg_oue8R#+n$EV3bH+uP&_p%?Z)^x!?{Jy85y#4dh;G^EPHm=cFOMI%OkaC z{29cSMlHNhy^h1V;`^H(H9vp0CpR0%DXr~&W7(Jc<2mrFzr1^>J2SJ<%$YN_qs$}C zyH8#I#XkSpGYW}9obe|0?%mgsa`sA2zjf=DM)&R&6lYIr)N}t|%T?>U*46=Xm`CZX zJ?-_XqGbCtoh6^=x^?T*r+L=ABj>MtAV&7QesrwsyoZOob?dg)a_5j^{=Zgm*zFHE zoN&oo$9B&0CL>Htb=%}{pu`fuvVP{ZEnOn3tEv=Rx6V3pu{L{aSChF94|lRZefsp? z`>sjZ+1X9z%$Y+)NV>(&y)`f}uzLCO<@9;;Zfxo>Xzu;w)}b2KQ#e{n zyGoLI3ycaPe9P8?PVMg>7_adA3&%;5;xzmAHMVwiG<9%jL%prnpn>PmH*elhK4+Ac zmKrZs*|e^xXlC!+=U(;C9ji8&HS~wh=}BEJ=RBYNV(p&~)Ur$Gdn*NP4AA-B+q7GW zS(l)!vw419?(T5+H)%2X%;j9W z%4*%F>@^AO)m2?Z@$83|3adYVUKBlO;jL$j-apz}RpqNPz;(^cyZcNJPD+H4(xuM7Eo$XIn=rvJGSTef4zE0`&b#@Vp<2J5edwF`nRM31S3IEfLeiz-pytU8a zVE6a(^2*40@ou%DQQv3b*goNVPudij8-yAVI zRHOFiNB_Kw{{GMXUUhOfIAN8Bsa;7?Q9ycD*4pxN_p;1ew>Hzpkx{KW4p|gPhZZ+C zZ+~-ACCl&r;mLsCh4VUj%zAQ~`zmUWd#|BBWiJn`_^sR#7fh0|9qoVJg zKizboN^2vh2wFC^we@O#oV`)A^r4fg1G%!M_Q%Kkn`b{>xIt#9D$h`8+_>@H6DPt? zEqGdSQ76j$(c{NkqocDADYt1;p>12KKr`v|`p({iQ_gPtc=4Ai-JHE-S zphKR0_NSt(F`=Uu?-;bu85k^aOQ6nju(KQO?LBbUu3eGsn>9E*?V@Gzl}$-ycjL#d zS+m9pl+mJzf`Y>Q`Sabqy-UIFbQiHUNr`VcESk%fE%Tl5m_D+oC_SRr_%!biDnM?# zFAt~r7nYQ)b)U2F>wI&+wOd2{$HXPS==;`6pEkB+((Y-u+8!+}n5LQkc3!zp%HL$lAK#eaLv5Bxf3U<;MJ@3Q;+n} z)omrrG!;+Gc zB8`lUtfx-BB{6tn-oq9tUq3tzi;gyPb?r%aH6}Fk!~Dm`>#x3iNm>;We_>(an)T~j zfo_O0{>3~}yH3`b#qSdP^4iJXAD(c&IvW_oylvU4RZ`EPLwAISD+jDz?cwQZ`00Jh z?by6GkIwq^v)?(`YhBZ}eecANZA%(gFg(BHi&eX34OI8h;Mq7jUZ1mjxv~A)wQE0r zc)ET2v=vbot+%O|H1?)HD>-)#ce*OIR{>jN;;!mkVhq1KBRwM?GxA(M^ zsVMLBPqzXOtXMJJC-1n^*gxym^`rf{cH;&mwv)j5YsbweOlWsAdcZ7Ri`qF|yPW{- z;I{ort@o6wInSAMH780pYWVUYq!?Kfhx$G8!xz(uv-!w4&rj@2Th7ot${{=!}fS!@R_XRz2>< znJ9c-GK^yhi6t#%PIvRjzs$^jJ1~7|-X_=+Q%W z-h)iq^NV)PWx4M?{}d}-QOf{zXkQJd;k7QhaARE zpWc}kWMAL!pkd(eo9FovT|Nx+IAQOlmAYp6t0O71eTD>;{Lp#*I6WdKWXRrr2Q-|2 zIv%{Q^YM$qzQlu}k3MXFw7BQ)tWj!lM^6MSf7MiblD~e3aSi8n_o*!Y>0jTY;;n`A zvZcFPjbB)y?RaL977?g1eE2RFvZ%0dBmqrM(_8qwqx4ac`X1_3+4P4Gw}UP6_Kd7c zfyzj>KakeSG<3qL`R%2Lpk~HXw`tRMT)Q?#nG)G!;J|IemwzvK|K5D`=z1y6H;dTl zE_YHFPUD1+-ak%huQR)mJ!LUHBcmErCZ)pu zF-lEx%B3a^_B@4SFf%g>{VKR#Q$egU6{#%3!mqZ538$R?cNX^ zoB^8%aI3u1Vd0&9rma-NU%#H)cXHaL)E6tpa!}i8Pya(9VAH1NblS6t?f1{m?-=xA zSu3cIA&XvL3aH-{0-)gI7L5(xo-YldV_TD!rf7H;*d+?_9Q4l5K*{;3DrXJ=-;l{1a+FH`3n|!czKOF zZ&okTgY(2nY)7qqi2lpL3 zxbeqg5G)nWgwCLQ*aqmbyO09`0Rd@Y(^gckegA$wZR?oD$BrG#%*-qR=lulPK+D}d zvv^*;k-m%CZ!)G`IeO}pal8#N(t9Id@*~tuT>#6*4udvBQNhkp#7&Motn|sca;1pZ zc(FAiA`9G3jJRpHYj#g>K$|Ob^*k>&YfyL4!si;jdvAmRi<9EYtIRz)@$TKbRrJ_V zI!;Z3h|3E>Um` z(LD1)%JlC}ziNNpJ1{Q?@d+&sBvHHGkRjxo5)?Np%L~0|Q3RoT(lJ+pwDY zP;qx`zy6C}Tgf_88mF9Dw3lqvti!-&(BMnEbj=TYwQFe$P|Me{XE%;J-KeT64jJtI zzTLN2QmGWdrAwERNd5w@+3y_Tud1e|1~{`4UZ@7LgPzuM_izgeAs_HkUS1eHd*O!< zn^0AL+H}n)I}4@SB*N1P|1$|)5)j5l^yZ9=cQZ=c4kUBiMMot?Ww3C6SF z0zvrT&~{dn&-rdmhPn{E8q}(XB`x77dngRR#+IEsH*xHPKVJCJ!iXksuwR8ngVlA; zPrXg5*V5Fyl${-voo$9{Q5F$Bakk#&q?jf_&GWbB){9ze+{A3-8s9`~)0#N4#v7mr zblDteVL%$uCzT46Ep3}IS^{4RR{`@B%Sy0?;R~LglJ4*QhYu2{_B^*l1Z8F;bpyKG zpfX4I_iqE&)s~gl0fiD{#lJDFyv;Hgdy;>1BIfK?^Is$ToOVAHS~IiNw+xG3N(Bdt zMxqy$&JajuZr*J3=FMm>l1am6yP9sOQxR;Df8?Bct8NY6#>B?5Q$6LxqHqnob}w}P z`K=dwOTd>ob9^dtV8KX z&xhH+|Gq=i#F-2G6uS2ExHx%1xA%v-iEj35lX;&CABP!nrMn(aSamU_35BN6zlUwG zT}xK~Sn9U44h`pRQ1ltl^S26E$IAA`Jsmxt@mt5wS0BG{-_e}W_Fo^gEc4cJJJpg8 zk-j>vRISLlSE2I(L&>?F{w+cNhcw;3DdZc!sL;W2Tat@Tn=5cJe601GA|gneSJD&h zdcvHdG4f6S=-xLbK(5d*xw!V;Vis>0Z^M&LH~oJ*vHz#f{jX9ZCqH2A&}CKHAaeAX zuwA<>p`sN+&z~O#%UJdO``twAt}rV%MvVOZqdm2>y7cYaV#J6M00Xd8#>0ng>9AGz zfoHbx%g}qIhoV=z{hbj^cx2lh_i9E#iaZ8507M`(>qeNZ-M+nTpGl`)l98^`tFu7S zo~1eMq50d5SYZGxit9dDUtdv0#cb|e%^(y2U6;EW-N)@RM^8OzWYOoq!GjvKOj34W z(WEz$kEu)=F9eaF`%!jQ5+1!_Q{GFqb`h^08WtwFHK?X$*@dd2raHR1TF|PnXrExP zVe78kzaP<1OG9G~gzqu;LPO*lQc(QB#F@WVPn=2fF=(M`gVn3FZ1?lQg4VBZ_~5|< z9^YcrE_;`H08~I}vU|mS?rAn<^uRU;}7g>hG;EpaZ zgJY7jb7)&5ssPOVA8aAmZFP1J`uqA>qr>FhEEg zl&A1u8__t}wyuK)ZAY>wyAJ|J4lEhj6rO|n1!H5CM}nY3xpUfU4p{pe%vU)A#c`jH zQ$G zZasReCj>;V%+Jqnr|;ewzG=?)&u=38I38ca`yF+<(FXK!^ln~WuIoun=)INKXBSP4 zGVd--- z0lS7RJ?>F#T)P=Aaz)K26MDE?P~`elVD#6F-hKOSzF7M``1XijG4QWMTn0g5{rTgI z-Msn?oha=ea4>c)_8T^=)3j;RltIn;I2!a^4O!(eaEJS^-wPGK;_ch)pD??! zs0|nV{Qjj`JMBNRR@SLoMdqzW*f~Az`t|E*g6qL2^22a|K%~g?-`^g{**!vy*9K3u z8#uom>tvLRj0V{yignO|@kcyS^J3%Tl;Wy`)y3K7EqDJwGHS zrsI+?Z`Vd8B=i7|N0z*NS5KqA_ArsT$Uuc7eXX=lzeMI&H zgQcm3YIyYGSFPiWb3vUDz%F<9HD;C0RhRCFL_ZH4KW%x$@#8w|O#2~=G^tL_SSDfv zDbMJ@{n&@^POEW*qPJ|@wvLbjNVh#gQT2 zt{#ky4aki%2@4O;grB={zM{Om^PoX(Q^3Rkq#)J!LnRFXU4khRP-F}p<-?5{^fG!9Kv$B6<}(|^X1rKd*&M#-E zp1pug%OL+n$O8rM&7GTgLlV&Qr5}euIIW&|h(j7}>)>z&CPp}mpv=tCr`(lGek2yw{~^9AMGdt^dL@hW+?tqnC1;_GyS*3;R4L+vh@!5@8S6ZNRty1<8~ zb}VOTx3OryS2)caAqW6>clUykXFQ4N=kh9|20zj+m!V; zD72cjs%NiWPy_8Y8P_ZHp6w{u4^PeugtPzZqEkVK@E4#!*JzcdwkT?xuy60cC*q=^ z^#NZU`LET&(F0-&k_k^@#1*gJbVaU z-}31lJ9bQK4XQ)Tp(bZuz3Np}K0`WQnjs(wM1HKp0kJ!Pu;%BdZKa2iB8_6dRbvBq z&U)g+AUV6fOPAW(qo*Z|+bvBxw60S7_8ZElv6MfY^i-7A{Jh}l2C|As%!qzG9=R-fU|*D$CH#NJlWQoEK_m?9@zEC!JnI75+$AfZd)gzcz4E1D>% z%G%&pO=V>Dj~^*urR2Ofi(ZzNwq!9#rHwjt=s|GPBQ$vl3;TyhrU~nw%v)LOx!k4Ed#gGieG0&YM!gYLx{GN`95Xer zt?(?O={S0L^e00UMU0<%`Ps9bWRo_%CtO-RT_+0ud@mg;f@KQE6G_yF`C7eui@!%` zh4u8)3(tRP6VTZ}pZM#j@4gau+m@)P4QBD|;%c%W|931k_0^0xp!&9z@usxNUQCy9#p!1GS>Mq%D0l0$*M1 zm)DMOq{;`81_U3fZ2IS`p$W(A+=)pi9)AGm_}GG{1HXU$5NsT`_b|59>6G-Cp+1{A z?Pa6mZG^7&x;<=tSXiq7_Yq{LYBWb7xCJ2m{G3N1DjLDSketPOHhT2vJLi}B5R(c` zuYXpXumw@Sb~D<_ajG;LGC-0OQVBvY!s|M-Bs&68y&}D7zoR$`5kGKso`7A)3{&{> zx;C%^cCc6=P~(KW8T00i z1-eLUh>2-q$H4+3LZhOtCtAlPPP;fB zva?~4k=Nj`ji55Vr6cV8u!bGB`Ucf9{QK*!EMR*8FpzE%&7L|nH6Y+mAq0)%3a9=i zJv8$Cr;iK@4pw@*3j%U@RY6?=l5J`9Xqt}A%~dZGtoki3Ev?<&GDj>f5HRP;)0^6T z@&EPB|Jrw)p3dZ?Dj9I}Tf-j5-xpN;4_OXA+0i z6v7}?2TDmgM%oqy0xfoHuPkJm%y zD80S=Hn`vxTHEChyiMV&S0=ngLj~1+R0unog-k)#5V)ZlGrYgPcccaK3;&7g3Z@06 zrHzNy!z3p*3Xa2#5f;Y2(`!Hestt)ByS<|G>qSF&R1?I5fD(dOBy^6kWHr#5_<~6R zZ{RpZ6XHoVWgifJNJhruPTRHOy9VHkB>VwB^B>so990}6Y*9>Z|+L+O2ZZ%_atMix|3|*OVw%4t(d*g3i(Ia z)LSuwGcx|#f^2Ec6l>ex9{!_uD!yA|L|J>B9Icd;R!NeiqiRi?p#19g z?m3v1>{_d+WK$=pSq%mc9t;9k(Zx4#?%X;3rC)nnMCA9ENLdM9nS%M$wS)iH=j{mQ38fv zhXbRWIMqe+Exon#1}Habs83&LqGoiS0FmyNF@dS6gF-bvCH^Q_tw67zagY-wLfsk7 zE?rjTmhYX1ZMQfud6Hy$l%;(Q{Ip2)l3!F2F&@jypLL?L}2*;Q&HuC;q z8jVduecN4YfG3AXd5JV5Wq-8 z|G_J2^n=LQGx0L-6o(Yva%CJ-@^mda4Jp8!jX48Ws2jBU=g*72etdCT^i^7A5dXue zOE(dvGxbyeP5=3%x;;O4okQoxc?8PILujJ*z-e`bbs=*do_yMH3OIEFPWIi)DjHKO z=qNpVkw!prmfM^(ObscqiI$-n$-3>DiIW^{Hba(FNayK z)o;rm1g(`l{y3qPeHUX_5T_yXN`|gWDHW+QNM^Qa+cz%d&f~8WscGoigGESQV0~|}XGr*9H9xTQ0 zaqZ6^E>BPONe$hySCh@7MTOzOw$q!d2wLm`O-ayulJJ!;{`}fOn&G%yt0{oH zrfqsp$DIk#b?32>MUt{}bCt4i9whetzfVp1Yt;8*0I{Hc)N1!0h)u|kHurg17Ak`r zOJNF)jt+9fVUDUIp3Apbu#AabM_m3GHm2kFKRDr707`$#;&%?oOG~5X=o8p11@zya zBr?^-orWwbz}OVe$jDMc;1;eMfpQ9U2c!?1hqswRP(qyIZwaFlKMI66JoUU8qUnqo zGwdL@WS{`5j3|P8wubuMo_xmpgBhYPiEj_6L#9QD8>?p|^GF=>B7{|y7b2VyjUE!u z&i{{BNg7Ks=YPb2&Wak}9I|a%L{Lx@z8ew>q&>eT$l>3l*)3gX7? z9xnM4EFq>lRJ~D1ZDJA+0<0ZfR_)0c6(KJq^`f`;8nFf(UNvcdq=;Z!;l@84W0U_3C%}zKybo z-(KS%PH=LexSYk~nj2f65u+5I!TI*Cn`9qHU?tU~&=OAb+V$%rJ;>D1yrb;luw*tv zI95*Zj8cruM7cc;gEFBmwkNS*Uky>41Bj&>t~qms{sNYo4;VzD_Q7G8j?yWPK@3Pn}_2;vrnIHB-7+*J(qM+KJQ%!_nH9jiBPFTv5Oh(H35o58VUJ;{G~}; z?jGOT>Q|@H6(MWl_U&6khS6R4+#vbsIX~Sxb?V5%y(Mwdh&26ORSw*@gSzP_pyrIv zN6RVw=icc&yrz8A@Lx4v%ph#W59|PeB(n^H{ome8GU)wZ(Dn2*(W-$Jq_pPLQDs=` z*(j%?M}!Rj-Ut|ulpFk*v+)@EmnubGw7HKfJO~{Ipm_B?-BbdpT}Cce{QNG>97xOR zWl2fyk!d5Gb0SAFN0Hc*9LRzkr_ECtI6rVEBLZTa2KBVg`nT8i9C~Qt$s%Tax~Z!N zm{_nKsFKALUNEs|561Hf3a0N`S~eJ)U77&q{1Cd2HD{90mzkLeC7}rn14*u=TeP;b z%VcU~jG0+F`z8)8xMhzcD67@}k5;!zOKe*6>DQ6luXHmmHPdXQ{%1ggCOre%I!<*e zJ@n3c+bWZ76V*>2cG>T?!}-(>lX)(#Wn1^}Px5=Y{N?ifE9VwP#J3D;+qpoqh3@WY zl~u!i4XP?rTMkm*`K{7%TeH9y_Gi5pxV^Y=6ADoB)F8L~0(mSvTV@eG36RlL3N6O7 zu3%{qsMaQUZK$%*3?KxxQ?XU64A7AgCmR{LFGW~m$Pg7EaF9@JL_{7YVly!)k}PYA z)qYLSPxGLu?N8ALak!g}9XpGW66QdZgR|1(vhf`ewre!!;WBU5US|ztG~hpr?&|2% z5Be_A#;m%OLq1)FajyTWrpG28$`8g=po2O>lrv0O3=iJ}!`S)^;he?S&Kc3Sz_Je8 zWNQPo1Du&WTr3^5bR*ZU?cpspw(B1N;wFg3T3IQQ3-zC+d8~$8^z6Z8R4kPN#y|&b zO;=An-$O6kOl^2aBkM>|Jh?q#9~_XdFc2*Q?7PvFZ{kdMtqplRf4|;AhhB!^+xV)t z*7ttyT^tUy?qYUh{yD-z&~39!CV50$-i72t*o@>8Vd; zmW;5TP3|Ee>ls;B^#K8Pr#m^jm{LtRz_z>uVa4B5A47as|?)HoE>sb z+3TX>bbV#8hknPJT(QYfSS=s`xA&X2AJ;C$S%|2N!s#GvIOSr@#1MZMP4e{Ms~fjy z;Y()OMQpIlKJU1qL?S*4r^%njg%(;+YJJm2QWD&b79fdK)!q5~~kv z7E?a9w9%C4okJEI=11}HCs<>{@O6B3Fe&g?RC2NmP|_I6w4Shme6n?Uu$Mw(``1>A z^G_07xO7KQidS67`*ugB?i}>oceM;TiB0m}u~{a17PF*dJ~&}3eZAEIhd%3?wKs&l z5;^nCVcQtqh*p~w3)`_Hm>JndpXTazE_;HWp>>OS1YCq2dO$02(%qXhYSfw8=L7_# zt(;Cf`z+23`HF;cdJ-Nzp~vVKMg$preKbqR)=*Jj7#ySqXCz^r^!4?Xp*||S)?vg> zp(?2j@MemJ22Yv=o*f96fM4abm=l8t&WyrK*IiGF+fym!vAGy`dm(ZKX9bYQ5*|_5 zpndc^woo?O%NVW!8!bVa#Uvk9(#!)ireD8){Vr>KKetzO%AP;a>)nGsK@$!+lx;iw zP8|M#vzaF+ibT&yqVV0!?1JM)o8pk+qn1CsSlhbG=*M&rPA@Jj-xnVbv$bl!i(Qh< zS{{FwZ&Bl(c8P!a&H5`miTXlCH>O)Zz4%=l`sdF2`jIb+-1Vgg<*?9jZV`w`TWDt= z4=1PJN#FgCDGv!lh@(YQt`@qB7bxB=LMTLfL}g{=qptUR3Nrv%7m^H!5+ft($g!s% zYT8)j1qKEdAS|U{z1ontc1ulxWfu<@ioMM1;Ns2D8a8YvZ9#uXAv8oYh_76|O%>@Y z)8>()_wQpv@CIZZad~u9$dK6;FRugVT4Gzq%jFZgbLY)R$7X4@R8_sjbQ8?J-JyvQ zmoEJ^y!vIU9A{mETzDgbO6;-{(L!Z0ZaD7a^Yf0VSFj9!+1rB~R?7n%$I+^!sCa2a z?I#5~z^XnD2O_{90#Vq8b&5VWoKvI;>1m&w3Bi4ALT}~q36`Ds^-+)|j`Y~#Wd@YO zc3P`y{v&OFdM#udeTX0vUZjm>g%`#k1s;dsev(YVe;R`Wb>`xP!5zuFS zm!m`BD9CC%?WO!|c4(b0s&%~2?z~u2($AoYFec)!wo7UWn2bxK@G*02ijc~P_@a-` zcftpj&y%x`CRGKNNt%?}mmqq%p~tRErVkgh)tLg_Zr@G--N?`?)%(*t>dtM0%4W1L zj1#pmverEA{b8aEpb}m}Wojj%`-1MoM25nlumjOjVCR((wQ;8SW%5n2Z^@`1<%~Y( z)1LN%lCc6N9b-R2#SIz6ErN`+(vj_&fYF>!CB} zR!4bzR5{r(>a3hve1nxQe${TrK+vDjgr4IM=g@!oy*rdz_3h%Xn@2=V;cQWXg}N2O zKdAE4rx|ETf7f75&!Wu6eWzW>$&e9oacFa#%eD~(Onc4&1uUW%H?%OSnIU*nX1Ue6 zV5*={0DLyNcN(~3lYlagm>ERGUb-6$BLyEnjzi!S2@;FR6)n6Wu%}pRJeXN3`sn{_ zC?7Wqyhc8ku_Oq?pggdU48j>RvVyk=f;dPV!8mhP+(Z?7Lk}g}K?>TpkH97@#cZ5) z$T4LdGoj_$V;Q9a+T2a%8VFeI@P-XCr2W;FEG(ShIcWr2wre+r$EC4Vu#{F0uoeFK=Aaki=E(zLV#~OKiV8t2i$DiRrimvy zn{^rz4t|NjyKsvmh{!}&EcSxuD}F4{v&fK#hk2#3G()zQX*8NDWm1W3{;%3^7jvQq z1Ot}TRX0LxR?d@a0jR)QWuPHZ5)wFM<&>2|x_4VzXH7R8mHPN!J%4^*EXq9bpk)(p z);ihYP&SmHH2wQ_ulT+JHA!c|6Fq1|nM=hPVV7vNN*(e`8ruQ$9^5(MVjJ_`dnn+0 z7DrVY()IQfITk-0Zb=Qh)LsMa&MO|G3Hw%;Y!|14Ojm&Ai)1GJ*bnZd5JsKq-!W-wW){oJ=`TlVfPoJ8d9i#uFja@MA$K^4 z31`2{xu0L3CMIXI^)iIYv<4*UVCg`xLh4Mv^oPt!b3y?A;&75_Oy9!#Zux1KX+9e_ zX<}%ttm;j!DJ6F(Crv#+M3Rm5iJ4hVWI-@pTGD3`s#bR=Ej*uvX(@^H0a@1tAwupj zpt&*fXx+;}13GG`R2`0k_+SvT!4^<_3tvAwJ4j&EJqB&)IkMP%5}|bGO;&$>YOib2DH~Z- zW*UWkCDRKFNjM3xkcB2C24oa=<~S2aTefUjdGX>1=!-oFN*#wUYnMQo7786Z!1`EC zgM-ROmzfvvl1bS1y3X3{7T(z#amEi9ixxcMSM@l;cwN@a!c-wN0r0J`n4o$LM!RO6 z_Pra@O)JRIl#Ia}3Uxb5&A^i<`F;NjC*}%bJ*c`1{<*er!D!? z(??>NR`W8?;QMN)k7gO%Eshu))pm*(d$DPv6>H#yA`tT+)q~Iua&i5|{I~N&Boebi zlMfyo1+e+F{bJ2pK6z0%ek^*PB%~$Fg%_&3XNf}^P6y+`BU&NkQ3ycmebflBlLr9y zzr8f`rtlAn3hPlBMe$%GbMQJ^@^}|}Fu4VX0!9!~{t8naQncKOfXmFmsEe>kg$@;0 z4A@EN0{N4*oGB?$Hr@?6bGZ0(!ib+6C?_&@55&Aes9(Q*`_&AG6lV(zc_7~XdgM|w zAe@#05Y3zHDGIDD7+-3yk=VkC)6-!@_Li+%N0Jyla0&@8Cg;rnBhE7DUe3i)-%m4f zV@eMQmn(HV^uDVTbRkEu9g9MzZ@jiiYt36vpLR%~@>!qubPAdTcg1}sc-Py0Dv#tgMfe$v(wUPmYN*2nI+st9TPCR)V= zE}H>NzJGRhI|_mIU9x#QUFT+eOIY9@M%H&0?;L8ayjK0p;Yy}{f}6z+;IBY&sJv%8uJGNvu^ueENYs4byZlnnQp`)$KVJO0MVZq&%#|eu zU+#%uA@f9GCL?i?5lAIW>AnP8l)CkvoVJB5CRp5W`d|42*kW;@3qZx9Dsmx6Ls~>u z9xJ6LNA{XbtTG!aH%K5p7N=q}_j+@;TMU{1^^=pmvV`I0xrNBu{i|k95GZKt&Ycz> zBs6{d!;{-5{P$xL5{(4LxbNj13omTIM0>G>O3TFFI^Ny(xj5lDzF4g?3r=9Pge192 zzK~lavM6lFASB6TnKI$XodQ@AXETW*>x3&-taJDQg>ZvJ)hA7a5Vrln11JZk6j47; znwATC9giV1X=ZOpwQ{u!e+TRjdWVM*OVWOzi$PB*HVDP(@>V2P5`X@6=_KjXppHcX z3U3=!+jMf^eb@LCvVn++V%H%|ns@2buw(kMrQ)sSCY8%KZ#GW=3yDh4vsyrNYL>A^VriqcTOFD>Am&1KX@^=O z;J9arSqus83YKHpD?V&Zv|uJyM8rhPL0 z!L@vvOYUm(tNOOTzJIL&05T3jm6IJKMR!%*hH`5VNb_7pb}tkJuT%?<;;vEq z=RP|#fR;Q~1OMa1Q}eG&yFw+G2_)iH9V2=I##!makh*zlgJg;cYyDT?@zS!gTez3F z_rM9*dvM~(CTE{*4%_c?FWEjAv4~Hnxls9M+cd=k_p{IIV`c>tP*Lgwj#atXg25mV zoRlv-#090L>+-_2Y-RJi{UZz)O_>AtAejnj&h_Epn_P$_+3)Z9&aKqiJi=uzkjh5~ z^SWr#FcT;~a^(tVPjqt8>Xg?a5@=($GQ%W4i=2RUcQ@a%vVoxxH+<2r|7xB_yF^KA z6#MJXwlvC0u_xGo_!XV$z4QzMxa31P4haZAz`!orbVYZHtHaAx`<=Yl{ zim|<2qSx(rX=FY1{~$5;FYMa%OZ6Xr@TQq;vA!OP>4e0))c7o zHHsk(cHHC%!-WScbT2m%lOl=*8kW^;QUf_t(a0LhN&`Fv#@5Qx9+FkkKxKlkIYZ*V z(I=3$ad7u&HsSD-?I{ZGPtGjvg);Gq(*rup6M5~!)2kSxGs#{gvF02t<3^v#z4SY> zW!A3LALwT!N^_iRmhc+W@l`bIs867;quO5vXRi;7)fB9Z*-36MkpVc7pO7j=;KnmF zOGJ7&6WaaaaDE3^J}Z|)Nyc2R-5)Qa>(MIn0*LZTdF_pr8AU+@~1Cf;sdj0?hV9#%LioJ z-N8OWNqb&nY(1-(Xxy8Qd+z5DQI7P#w+84u==+OtNn$bYZRX5L&b@1bUo^?L{u zm6Akb<{q?pb9XLw;R3iqW>81NPZ&XgdYl2>QoFfEK~YI*Boi{ilTG2y3O2cT5kr;q z8{`3zb+JW|20U<1Dz|9^+Z?}l(~tTkYlvVxhs(Iw?B1bC+acyFOi~`t4~IAt6`SQR zEGyd_23=^a?EUe%1rJ$XSt%?OS2jU}T>%D3k%#LiJ*@@>hzV4nq73W{mq@+^kIBtZ zG?k)fv>IoyitG&aCbb!oLjq51i^u^+1Rpj@Vw3!k=x|8IFwkUm?%aJs-=~FaRvYnq zB!ZL*sWgqTw5zBmRdJ3meW^0kOfSQgLhO5u3N)glj=P$SYOo_1QEvlRHX=%O`^hC4 zg6ZgqVq{_wzzgI5>7w=Nadh^h@!<)%$o^!)iiV=BS2G0E4og2_ef13*+$*rls775f ze;JnyN9k=vs~x*y7=G>k^buGy3!-^iaI7W(tI9lB)3b)^POd8h?zgkqu@ zVpkT1fMLr8k}Jm2mV<)g(x{Sh>5u9OAaVt_M|shw2mJu4agU5qqr!=@;^+J-0gV7g zq11$n^xNmD#w?53*gQQbM+5iY^gyRBYnXSv>Vl~L=z}+{I;}4mgt-N+kY@QkU=3$6 zf-31l`TDhMmk7|nX>zfLp`oFs0vFX?0_U2`IfWAO@g$OPm|SCh-FaF@i)UPu5Zdidkrfvfa5RcReR!O7e3RJygTUs<{g0S;A$7)M?&A`?l`_nN zEV@QfVO^}In2?Aj9pHG3WZPxS41!{E%BLUhGcmDX140 zN%m@PisPfm%*2_)UOnXAE2uYIVQUa617*kytP}&t&tSbY-QY)Y7`91(L9Yu*FYKO) z+VV{3nO;T$ytRSeg`X5f!|+7A+aI(-k|~3!co9W%Joe)cTuACaoWzhvat(G55pxLH^qc2CXY1DeW{m^HlI`!#wI4!@4(-3=CaxxJ_kzDb7Z!ede)orf8VZfT0SW;l%;dc;g$LHKuT|uL^fY!1hVc{h2@jAC|k0}pn@?<0> z|2mB%hImfgc^kh!AbYNWZfK-hjQCZfs}Ogw_RA3(xD8OZK_tR0$ozznCOAeei!%~< z#042tv;s1z+}@G^zadHnRn!Qg7G8{uUfZar!WbU29mNWEc)c~ZM2bz1b=yCN%Z4a9 z!tR2w+wZt}1<@pmmdZ%_NG3z1t`G}xbV~Y0CMK=gx4+JN$+Zo~9?v)5We~*_2m+&j zy@-a1q)2QE6-P1iDWbM24}y6GD)B0@aKdw=uRw}xl|7!byF|=B?8Sfl2_?h85dr@N z*9-$It^u_F*HUJe(SC8sJq3qRYS$>no)Zf{U@gu?1-;VVo>y#W@!xgIHSXR11u^{} zlquV}kMus<3HXyy_*bJYsv7q8e4x3}#v-z^0dS@0WZz^O{5RQYL~(;+8`-D}-$v{q zsbxn81+%{S2axB8{D_|RMNmxn2jFG;bKMrt7^2 z-6(XodSI71C3o>o%A_zBG$;Ct-zu|43Dn3iL>f%az9kXkt?VPH8(tV=kEf)x$4)0< znw%_ScR^##%!=T)YG}0fs$~FrrF5}`aXJm4 z#}F)6a@8jH6o?Ce_Cv;&0Q^Sz5j1!$p|gL>$oRu#F42lq@Bl#v5K=6;dJ6qbjx0J~qZTc?>+82mKu_`H=@w0S z#Zl06%Ws$R7=2y(cRDg;@|9`5n7ivZ)O#auY?JAFvSp`E7UVe00wp}6pb9!U0biKc zgiIhyP3L&>Qjs)tRx$Tovv8NHBV@`Di8?GZiv$`&#d(EqQ2cX6phfvtG7WPLYt`B}URwn@|VV8fcpX-BzrhcRwxdcn@Sw-IOu|DH+L$zfqd8hdUNe8CD zJ{%s?3)9yUYos`tyaMPGe@B@Irfj3pDT_`8EunlJR_&W8bo?SyZkqoBCkbl(h=xGV zFlbaRv%EzsD@-{CFu`zQ8?MkmHGnPDvxo~!PL`&WfCpP;0Yp8HPv~t2d%`UYAPf;! zEom8u7|e~DeTnzKw^D8`kmlhVWkN=;vDH~JkvSc0LGl|{-=BGHu{jE`8_>aEpI?Ag zlJRJ4+2jHl;NxTm$+nS&D{lMOid>8>RW>G7)~9XTt6WsUeG>(sZMl#+0b!m8yMnX^ zgOll&TFIpsWM1eLRbhE`83KgF9xXJI5ZY7`n>N&d61h*9g9SWLU*q1#IVI}&zKWHa zK>?Si@6oWxbMGb%5ll6jGF4Ho?;PNIkF-@gw}I-GA&cK4xsB$;YnH*P5+M!8TSJq} z6fgSyFCr_EZs&Ky_4jX3+jr4}3GXQ`+wTB8(b^!3GVF;DCTPgU$DIr6H0H`)Ncoyq zBYqWf)p5EOt|yR#Tt^&N%6>}X(dgdY=A^4V4a5rF@;|t+N?IV*2IM>hBY|`@X+cu!dVMyTZ|~0z%J4eO7n^ z$a3L669#54Nm#?!;noc~{7(Pz{DIsnIu1t@*_}Er>=YIOt?SMy$M9d{$Hkr2nHhSn z-lT`z#Q06KW@NIZ@7LlRij{k*e2^w>piiTNfl9_k47XYC=kgtPO* zK6q737T8RTIDYJgU9w%{1Yo~#+px#nG)9Q&Fp{unN`ka&|Ka=CnLxWCbQLmqN|6`H zNvvW;WfWXyLZHoLO~#fCZ_>DNA>>{DA!+WCn4y88$b9y!Qvx;~&+ngI z&>TeEVNgXK<8ejiTs=v5x%n)8kQla!ufXorm ztA6z6Kqw5aT1lvEq1Tv*=2irLzd)R5WIz*a>WJFJHZqnc_UiYj8B_wP}|% zX>A**{y}q33J~2|LB_k}0x?=Ov73@B3h>=1B;_Jv=r5p(k*E~gwF^{CU))~tB14tp=V0tOTP_geG*Qh(Wgui_0K=Bm z0*!FL-K>6 zCu4X}9^1k=!sZA{J|6$t}?{Fr^TAZu>{!X|~ zY4^$IGBMGj1q4fWS5k)$A}9Vi#O zmb}#xwc@ATXcBEoyEB#1SqRkGI%d;7w=owOALSD5nn;M++iBS=+irK1s>h zd^)WpT;I|ZsSAB0f4WgRM8>hUf#nl{+DPtI_Tbq~KvJ6j)@GIkQzpds%XR*NibaLn zLqh`&zYE6)zyw>kNrSSke=})8=RV&ZD>GbFU7P1v1R*JJf{;Y^2gN}aR4`~N*0!IE z=qXqlZe28K^l7@Z52PZ}GX4a8L|k$;bxd#Wos|{F@g2Fa0NpM-4lREj{NbI0j=KC; zG)6*4SldTP=R^>eC2-Q@o?`ebOGqK%SgyFGLIXxI77!E*={U}BcENBPWug5nt(Ajh zBBMh7V;y*Fp1{qa=v>gl ziY;3jvhp&q!&O!8Fll#Y0*bPPuq*>-_(<>m=kLe88$wrl70ML< zt}K_ZY7jT%f=jb?lvoP%3?)MY{om^n0s#zkWC)%1w z81rr;K-ge}p-EkP)47=TPfWjZ^J;LGAq*+f-=p~hnYkNlDv}E}9BI$67ylCwad#UH zD*C|~+9TlfueEiodqQH9jxj-i7%?OiXms2%=RH{;zUn zl5A;VLbn6K=8JYub_-HDM0ij>jAU;jl?-2^jTXEWkW=CX&BZ7@QY7&Ma)|k{OnuSa z?Xu_qDk$4?0311_u5=E>Dd|FX?6Sc4@W_hBMWBE>y1J$$3p%?vETBNvsH*}wkz%(l zb3^b4a?j(>`I(};As+LIxYqfA{u7VS@!7#3krM$=r(?&n!2}zcstvT;>+~`&It~)W z#swQs&xc5{WF-zWB~1Q(KUO4QU=Bl_Dq8*2V8iWcG_{$^@6fXU3XA{3@1afY1h#ptfsw+r~@?vE@@yd@#t#2$C{>`$R`{u@y$@Cfglv~Ds1 zfUYGI-bm&{%E8l&T`)8nBUjO>@I88sqkkmzjvwi``4a|Mgf+y~j8+g_W{p_e_8Pra zcr@~;Oog~$OP2p}^71o;UfF5{t=FQ`5f#Op8}^u28SpE>1f+i>(^(;xm7x-9G>iFY z$(vpt&x0V&BEJAS<^+l&Eu$|#KY9P>(IOtZ!LArN83#|jG^B9^oRpck_>2s?1shg1 zP{FtiUi70jEm-7jAo@F?>lw|MH<$@PgbzBVN^rW?cRK$01VOK9HOq1A|l*Zm-&eGuUm zD;K0<=k?H=fAtQlx>Uee-bNxz9T0jQh@41WX$14<@|kN67n)Q@bRO2z%&g5`KuGe4 z@LLo`pCQ?3-1}Ns2sou}X6oW1{~~mm5F}tO*TG`(b@io9mr6Yj(yK@& z=Uxw|g%glbTx99QgvL&23?d53ZVJfpN#I7_#fVC~4_Wjnd+Jhc8Jd%&N3y{MF!@(R zBXl298To%{^pdER7aXUma%CQMX&G;jcrXJ@Q0VDHno?BDmMdKzz)Crs0G}g2Y<}1Xkb?d7CAL zWb_rq0FcIw@nA={NkA|FJLn>J08m6TqBQ5Y4KbcB83^Th(diW)d}8_i@Saol6l|_BvtTg?xW~1H5^tapg*!<|e*bcg5gVy+ltV?{6oUp39 zrfJ)sordcl=$buYuh)qeZ6eZc>_{57pyu)Yr6=dUDs(j8fAH9!8deT9v9q(wI(94$ zNSnN`+b+V}GS>B(P=1ppIfsVg<=r3^ny;1X)Jc;*;_`25@4%HMZK?z?M#{CivNX7Q8PMyx~5*$Vf{AhLUnn#aiM9~4zcm^ z&dijgOwcLRJjm?$mARhI1Z>X0O0I!5S9FO~L?VGhQ`c_Y%6&vp$cXcE)LG9FMFZt_ z69sDD1hr*?JEd$s!YHubk0C2SyXQfShlGaadh|^I>067C3Ep5lNE9bcypb-!ppe;>zYUR{ z2qZzGpQLhjrEpW!`LY~GG-^=&P^}`Og5&8D*_LQg6A~RAEyVSrl9CehF1oTA>58F| zQQZ;;Ol{&45?oF)BCb}?H*;8cM4)kQhSA(_Moh)*IhdPGw<>=kpvuF{Z>Gs!fk5Q+ zXZ@^2ok&h8g*F*e$t14hP>!NFA_GO`Xo@=i@V|cjT;VDtj{B?{#h{233zcDVHfz)0E!aS!qcWk%zi5tGu=${OVDS*ZhbM5p4 z2YS7G^mG|AP=@d}4NI-%j6B;89EjCfu|&vf`&4GXG}y^+PfBtVkJ&3%u4G-O1`7`l z|K*=r?M;V;DZW-kh!K^=fl*aR7Vm?1%tF;*YiC#WsxkN8Rxdfd{2gXth=V!pq$owr z;<=rxCs?ejsJ+Jsfp_q4eydm5lN-6Bk)b}^g8G}%LVO>CDKI4z%IKU7zIuAPaA%PK zsKaO;Wtf%ugK|_EvWt$5S&qt&_fnfyyZ9Y8P^)iFglXwfj77=kR*Ze=cT}tW-jC2~ zr{w!~_vb%uMqB?SX4avoidq*X^<>?$Qwwb)W_nkgtErz6H9|?<-`)RN!}6TW(WB~p zO)J7RJ|C%6Nd}5?wnICW>hRhTit@EDI-yVg$d_*CI~51SDe4hkUPfxQPq9HnMeVt8 zpTXPPUo?+*o9gA&uqrD%Tl%)j_glXw0~YWrMU1)ZX5c+awq$f{m%DXx-*X&ODYj&g zoTx@j;bVDm(E|q#yk0)cyJC;o(nDj^vA36rbO))jMy7b!s>K^I%FRueqHAF)WJBHJ zM~@!KUNWgOne4#BP`R6D7VCQZM86)z5i=_*D|1u?NxVs!<&UVgmxsc8UM}V!L`9A9 z2Ab@&@yRiK3w1Wceqt8Cu8uu@XvfA9oJG8VHdg#Oq++8*5pgl$TFfyyf8x+Yqqr@| z_5whw3~`SgJC@l0oJ;f<-s|E;p%<#=ZEJ6`WHsq}($uN$mGpG!85w6Z#{5|YA|B&- zz+(g;kCzTBEv+{yzfuGSME;7aS4WPrDGE2@V8O?I{FuY|@Q^(|4fk~hcz_)vUzSsAtb<+Z@n?*9C&toNyJ2qLQp)DJ6=f{6fX>S0Z< z{Y7r=+1=1@FFHpfP^(_r^KuSe?fdrY=*h49v~U zB7$r;YH#dtC<<@H%9b}ExpWjE?8uQgnzizN#5DdQ5nzi%jlQvjolY0bHaj>iSYWd< zFFCZX@$H*L;1jZ0Nw^Oo+0xR|d$g_Lxu>tb?+4t%ha18rhj0%ar+PCm_*{M79$k@2V;nMWFhUG#|Pp}|8?;MhT z@L&x|fN`5`;$4tMA$*A5n~gB5Z#~_+Ygg;dh0az60fak;#vhO7WL}hc8syjczFV-3 z<&0eDvG_(lS;-#SUjUX>67G238fIkJ_Txrwg-ly=YFb>e`4>iN8AoFy0~N+A*hsN&BL#Op9lyHw4n`D&JG**sPn=&V3g;VhCD4p4cipCb!#^< zZjud8dA+)As++DKsfZ4pW=mUC!Um`Kn1BaL-I5(9Lzg`pKQkaeZ*!qa6>C(JvPt%5 z^6n*f=baZ<14U^XYI358c5zE{DH4P}mXY+nRY~IlC2%(d+98AW$pItG{Sy2YZY#4Xbryh1GBLlS>PEiFMaIX|+Ys^<|N* z*R*00f>!HVWAmRG<~Neg|G)H0`u#(9VrG=JR=aTEd4s{*^ZQRb_>n61$@$tB<==JO z+7g#GShrKfX3mPruc@yhXO%>(CzFT!D9UWVKboX}mE9xH`SH|CEW2%*K~=1$icRuz zc5ah)_%I_Hxw&=&2KZ&{-|yBtUVf-gtm{0SeZLhCR?&KEiK4Wtg}gFWG1c>MLjCy? zqy7EOhQE2%CZ^iA$#E*pfS8XYxSOig&0*=2#cc90>#fV9td~Str)EO0M>XYz4(Z^@(iWNgMYyG0~4GNlDr48_(dB64Y;cSI(<>oR@$#n8v F`%hV?Qf~kN literal 0 HcmV?d00001 diff --git a/e2e/testcafe-devextreme/tests/scheduler/common/appointmentForm/recurrence-form.visual.ts b/e2e/testcafe-devextreme/tests/scheduler/common/appointmentForm/recurrence-form.visual.ts index d37dbc6e2332..3e0168b0dc72 100644 --- a/e2e/testcafe-devextreme/tests/scheduler/common/appointmentForm/recurrence-form.visual.ts +++ b/e2e/testcafe-devextreme/tests/scheduler/common/appointmentForm/recurrence-form.visual.ts @@ -157,7 +157,7 @@ test.meta({ browserSize: [1500, 1500] })('recurrence form with labelMode=static' }; const scheduler = new Scheduler(SCHEDULER_SELECTOR); - const appointmentPopup = await scheduler.openAppointmentPopup(t, appointment, false); + const appointmentPopup = await scheduler.openAppointmentPopup(t, appointment, true); await appointmentPopup.openRecurrenceSettings(t); diff --git a/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts b/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts index 26b09c15abc9..cc0967acb44a 100644 --- a/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts +++ b/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts @@ -866,19 +866,29 @@ export class AppointmentForm { } private alignIconsWithEditors(): void { - const $groups = this.dxForm.$element().find(`.${CLASSES.groupWithIcon}`); + const groupElements = this.dxForm.element().querySelectorAll(`.${CLASSES.groupWithIcon}`); - $groups.toArray().forEach((groupElement) => { - const $group = $(groupElement); - const $icon = $group.find(`.${CLASSES.formIcon}`); - const $items = $group.find(`.${CLASSES.formItem}:not(:has(.${CLASSES.formIcon}))`); - const $firstSimpleItem = $items.filter(`:not(:has(.${CLASSES.formItem}))`).first(); + groupElements.forEach((groupElement) => { + const iconElement = groupElement.querySelector(`.${CLASSES.formIcon}`); - const hasTopLabel = $firstSimpleItem.find(`.${CLASSES.labelTop}`).length > 0; - const hasInnerLabel = $firstSimpleItem.find(`.${CLASSES.label}`).length > 0; + const itemElements = groupElement.querySelectorAll(`.${CLASSES.fieldItemContent}`); + const firstSimpleItemElement = Array.from(itemElements) + .find((itemElement) => { + const isGroup = itemElement.querySelector(`.${CLASSES.formItem}`) !== null; + const isIcon = itemElement.querySelector(`.${CLASSES.formIcon}`) !== null; - $icon.toggleClass(CLASSES.formIconTopLabelOffset, hasTopLabel); - $icon.toggleClass(CLASSES.formIconInnerLabelOffset, hasInnerLabel); + return !isGroup && !isIcon; + }); + + if (!firstSimpleItemElement || !iconElement) { + return; + } + + const hasTopLabel = firstSimpleItemElement.querySelector(`.${CLASSES.labelTop}`) !== null; + const hasInnerLabel = firstSimpleItemElement.querySelector(`.${CLASSES.label}`) !== null; + + iconElement.classList.toggle(CLASSES.formIconTopLabelOffset, hasTopLabel); + iconElement.classList.toggle(CLASSES.formIconInnerLabelOffset, hasInnerLabel); }); } From 4b6f3bd9b6ceb2e5a4e2c6fd23d40bc57ebdbd4e Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Thu, 22 Jan 2026 15:54:04 +0800 Subject: [PATCH 5/9] fix bug --- .../js/__internal/scheduler/appointment_popup/m_form.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts b/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts index cc0967acb44a..9a4734d70df1 100644 --- a/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts +++ b/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts @@ -866,9 +866,9 @@ export class AppointmentForm { } private alignIconsWithEditors(): void { - const groupElements = this.dxForm.element().querySelectorAll(`.${CLASSES.groupWithIcon}`); + const $groups = this.dxForm.$element().find(`.${CLASSES.groupWithIcon}`); - groupElements.forEach((groupElement) => { + $groups.toArray().forEach((groupElement) => { const iconElement = groupElement.querySelector(`.${CLASSES.formIcon}`); const itemElements = groupElement.querySelectorAll(`.${CLASSES.fieldItemContent}`); From c72bc877c36473c5b88497f863b03c4feeeb24b5 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Thu, 22 Jan 2026 16:19:29 +0800 Subject: [PATCH 6/9] fix bug --- .../js/__internal/scheduler/appointment_popup/m_form.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts b/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts index 9a4734d70df1..028853b63843 100644 --- a/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts +++ b/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts @@ -871,7 +871,7 @@ export class AppointmentForm { $groups.toArray().forEach((groupElement) => { const iconElement = groupElement.querySelector(`.${CLASSES.formIcon}`); - const itemElements = groupElement.querySelectorAll(`.${CLASSES.fieldItemContent}`); + const itemElements = groupElement.querySelectorAll(`.${CLASSES.formItem}`); const firstSimpleItemElement = Array.from(itemElements) .find((itemElement) => { const isGroup = itemElement.querySelector(`.${CLASSES.formItem}`) !== null; From 87fdb6a8208bc97d6c4335df0e53a9c9eb18de0c Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Thu, 22 Jan 2026 16:40:17 +0800 Subject: [PATCH 7/9] fix popup size in test --- .../common/appointmentForm/recurrence-form.visual.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/e2e/testcafe-devextreme/tests/scheduler/common/appointmentForm/recurrence-form.visual.ts b/e2e/testcafe-devextreme/tests/scheduler/common/appointmentForm/recurrence-form.visual.ts index 3e0168b0dc72..8652011eb263 100644 --- a/e2e/testcafe-devextreme/tests/scheduler/common/appointmentForm/recurrence-form.visual.ts +++ b/e2e/testcafe-devextreme/tests/scheduler/common/appointmentForm/recurrence-form.visual.ts @@ -179,6 +179,10 @@ test.meta({ browserSize: [1500, 1500] })('recurrence form with labelMode=static' currentDate: new Date(2021, 2, 25), editing: { allowUpdating: true, + popup: { + width: 420, + height: 500, + }, form: { iconsShowMode: 'both', labelMode: 'static', From b718c43f6bcae0d3e7234fa95712a68d1a698974 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Thu, 22 Jan 2026 16:43:50 +0800 Subject: [PATCH 8/9] apply copilot review --- .../js/__internal/scheduler/appointment_popup/m_form.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts b/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts index 028853b63843..88f091c34ee5 100644 --- a/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts +++ b/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts @@ -885,7 +885,7 @@ export class AppointmentForm { } const hasTopLabel = firstSimpleItemElement.querySelector(`.${CLASSES.labelTop}`) !== null; - const hasInnerLabel = firstSimpleItemElement.querySelector(`.${CLASSES.label}`) !== null; + const hasInnerLabel = !hasTopLabel && firstSimpleItemElement.querySelector(`.${CLASSES.label}`) !== null; iconElement.classList.toggle(CLASSES.formIconTopLabelOffset, hasTopLabel); iconElement.classList.toggle(CLASSES.formIconInnerLabelOffset, hasInnerLabel); From d0e3d0b9209157a0493a354170159e95163c7ea7 Mon Sep 17 00:00:00 2001 From: Aleksey Semikozov Date: Thu, 22 Jan 2026 10:20:13 -0300 Subject: [PATCH 9/9] Simplify code. Use css --- .../scss/widgets/base/scheduler/_index.scss | 20 +++++++++--- .../scheduler/appointment_popup/m_form.ts | 31 ------------------- 2 files changed, 16 insertions(+), 35 deletions(-) diff --git a/packages/devextreme-scss/scss/widgets/base/scheduler/_index.scss b/packages/devextreme-scss/scss/widgets/base/scheduler/_index.scss index 24b04b1d6359..f6d013dc851e 100644 --- a/packages/devextreme-scss/scss/widgets/base/scheduler/_index.scss +++ b/packages/devextreme-scss/scss/widgets/base/scheduler/_index.scss @@ -507,10 +507,6 @@ $scheduler-appointment-form-label-padding: 20px; align-items: start; } - .dx-scheduler-form-top-label-offset { - margin-top: $scheduler-appointment-popup-icon-margin-top; - } - .dx-scheduler-form-icon { display: flex; align-items: center; @@ -520,6 +516,22 @@ $scheduler-appointment-form-label-padding: 20px; } } + .dx-scheduler-form-subject-group .dx-scheduler-form-icon, + .dx-scheduler-form-repeat-group .dx-scheduler-form-icon, + .dx-scheduler-form-description-group .dx-scheduler-form-icon { + align-items: start; + margin-top: $scheduler-appointment-popup-icon-margin-top; + } + + .dx-scheduler-form-date-range-group .dx-scheduler-form-icon { + align-items: center; + } + + .dx-scheduler-form-resources-group .dx-scheduler-form-group-with-icon .dx-scheduler-form-icon { + align-items: start; + margin-top: $scheduler-appointment-popup-icon-margin-top; + } + /* Editors alignment */ .dx-scheduler-form-all-day-switch.dx-field-item.dx-label-h-align { align-items: center; diff --git a/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts b/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts index 88f091c34ee5..3c242bc652ff 100644 --- a/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts +++ b/packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts @@ -40,8 +40,6 @@ const CLASSES = { groupWithIcon: 'dx-scheduler-form-group-with-icon', formIcon: 'dx-scheduler-form-icon', - formIconTopLabelOffset: 'dx-scheduler-form-top-label-offset', - formIconInnerLabelOffset: 'dx-scheduler-form-inner-label-offset', defaultResourceIcon: 'dx-scheduler-default-resources-icon', mainGroup: 'dx-scheduler-form-main-group', @@ -312,8 +310,6 @@ export class AppointmentForm { this._$mainGroup = $formElement.find(`.${CLASSES.mainGroup}`); this._$recurrenceGroup = $formElement.find(`.${CLASSES.recurrenceGroup}`); - this.alignIconsWithEditors(); - onContentReady?.call(this, e); }, } as FormProperties; @@ -865,33 +861,6 @@ export class AppointmentForm { } } - private alignIconsWithEditors(): void { - const $groups = this.dxForm.$element().find(`.${CLASSES.groupWithIcon}`); - - $groups.toArray().forEach((groupElement) => { - const iconElement = groupElement.querySelector(`.${CLASSES.formIcon}`); - - const itemElements = groupElement.querySelectorAll(`.${CLASSES.formItem}`); - const firstSimpleItemElement = Array.from(itemElements) - .find((itemElement) => { - const isGroup = itemElement.querySelector(`.${CLASSES.formItem}`) !== null; - const isIcon = itemElement.querySelector(`.${CLASSES.formIcon}`) !== null; - - return !isGroup && !isIcon; - }); - - if (!firstSimpleItemElement || !iconElement) { - return; - } - - const hasTopLabel = firstSimpleItemElement.querySelector(`.${CLASSES.labelTop}`) !== null; - const hasInnerLabel = !hasTopLabel && firstSimpleItemElement.querySelector(`.${CLASSES.label}`) !== null; - - iconElement.classList.toggle(CLASSES.formIconTopLabelOffset, hasTopLabel); - iconElement.classList.toggle(CLASSES.formIconInnerLabelOffset, hasInnerLabel); - }); - } - showMainGroup(): void { this._popup.updateToolbarForMainGroup();