From c2d67fa17e0d90a55ed4d906f396cd9040de838b Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 27 Aug 2024 13:58:56 -0400 Subject: [PATCH] Closes #17256: Fix translation support in VLAN group scope assignment form (#17270) * Closes #17256: Fix translation support in VLAN group scope assignment form * Disable scope field if scope type not selected; update label on type change * Reset selected scope object when changing scope type --- netbox/ipam/forms/model_forms.py | 125 +++++--------- netbox/project-static/dist/netbox.js | Bin 391722 -> 389845 bytes netbox/project-static/dist/netbox.js.map | Bin 528655 -> 526569 bytes netbox/project-static/src/forms/index.ts | 3 +- .../project-static/src/forms/scopeSelector.ts | 153 ------------------ 5 files changed, 39 insertions(+), 242 deletions(-) delete mode 100644 netbox/project-static/src/forms/scopeSelector.ts diff --git a/netbox/ipam/forms/model_forms.py b/netbox/ipam/forms/model_forms.py index 4e405a035..f5e3bca30 100644 --- a/netbox/ipam/forms/model_forms.py +++ b/netbox/ipam/forms/model_forms.py @@ -1,9 +1,9 @@ from django import forms from django.contrib.contenttypes.models import ContentType -from django.core.exceptions import ValidationError +from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.utils.translation import gettext_lazy as _ -from dcim.models import Device, Interface, Location, Rack, Region, Site, SiteGroup +from dcim.models import Device, Interface, Site from ipam.choices import * from ipam.constants import * from ipam.formfields import IPNetworkFormField @@ -17,8 +17,10 @@ from utilities.forms.fields import ( SlugField, ) from utilities.forms.rendering import FieldSet, InlineFields, ObjectAttribute, TabbedGroups -from utilities.forms.widgets import DatePicker -from virtualization.models import Cluster, ClusterGroup, VirtualMachine, VMInterface +from utilities.forms.utils import get_field_value +from utilities.forms.widgets import DatePicker, HTMXSelect +from utilities.templatetags.builtins.filters import bettertitle +from virtualization.models import VirtualMachine, VMInterface __all__ = ( 'AggregateForm', @@ -562,91 +564,31 @@ class FHRPGroupAssignmentForm(forms.ModelForm): class VLANGroupForm(NetBoxModelForm): - scope_type = ContentTypeChoiceField( - label=_('Scope type'), - queryset=ContentType.objects.filter(model__in=VLANGROUP_SCOPE_TYPES), - required=False - ) - region = DynamicModelChoiceField( - label=_('Region'), - queryset=Region.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - sitegroup = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - }, - label=_('Site group') - ) - site = DynamicModelChoiceField( - label=_('Site'), - queryset=Site.objects.all(), - required=False, - initial_params={ - 'locations': '$location' - }, - query_params={ - 'region_id': '$region', - 'group_id': '$sitegroup', - } - ) - location = DynamicModelChoiceField( - label=_('Location'), - queryset=Location.objects.all(), - required=False, - initial_params={ - 'racks': '$rack' - }, - query_params={ - 'site_id': '$site', - } - ) - rack = DynamicModelChoiceField( - label=_('Rack'), - queryset=Rack.objects.all(), - required=False, - query_params={ - 'site_id': '$site', - 'location_id': '$location', - } - ) - clustergroup = DynamicModelChoiceField( - queryset=ClusterGroup.objects.all(), - required=False, - initial_params={ - 'clusters': '$cluster' - }, - label=_('Cluster group') - ) - cluster = DynamicModelChoiceField( - label=_('Cluster'), - queryset=Cluster.objects.all(), - required=False, - query_params={ - 'group_id': '$clustergroup', - } - ) slug = SlugField() + scope_type = ContentTypeChoiceField( + queryset=ContentType.objects.filter(model__in=VLANGROUP_SCOPE_TYPES), + widget=HTMXSelect(), + required=False, + label=_('Scope type') + ) + scope = DynamicModelChoiceField( + label=_('Scope'), + queryset=Site.objects.none(), # Initial queryset + required=False, + disabled=True, + selector=True + ) fieldsets = ( FieldSet('name', 'slug', 'description', 'tags', name=_('VLAN Group')), FieldSet('min_vid', 'max_vid', name=_('Child VLANs')), - FieldSet( - 'scope_type', 'region', 'sitegroup', 'site', 'location', 'rack', 'clustergroup', 'cluster', - name=_('Scope') - ), + FieldSet('scope_type', 'scope', name=_('Scope')), ) class Meta: model = VLANGroup fields = [ - 'name', 'slug', 'description', 'scope_type', 'region', 'sitegroup', 'site', 'location', 'rack', - 'clustergroup', 'cluster', 'min_vid', 'max_vid', 'tags', + 'name', 'slug', 'description', 'min_vid', 'max_vid', 'scope_type', 'scope', 'tags', ] def __init__(self, *args, **kwargs): @@ -654,21 +596,30 @@ class VLANGroupForm(NetBoxModelForm): initial = kwargs.get('initial', {}) if instance is not None and instance.scope: - initial[instance.scope_type.model] = instance.scope - + initial['scope'] = instance.scope kwargs['initial'] = initial super().__init__(*args, **kwargs) + if scope_type_id := get_field_value(self, 'scope_type'): + try: + scope_type = ContentType.objects.get(pk=scope_type_id) + model = scope_type.model_class() + self.fields['scope'].queryset = model.objects.all() + self.fields['scope'].widget.attrs['selector'] = model._meta.label_lower + self.fields['scope'].disabled = False + self.fields['scope'].label = _(bettertitle(model._meta.verbose_name)) + except ObjectDoesNotExist: + pass + + if self.instance and scope_type_id != self.instance.scope_type_id: + self.initial['scope'] = None + def clean(self): super().clean() - # Assign scope based on scope_type - if self.cleaned_data.get('scope_type'): - scope_field = self.cleaned_data['scope_type'].model - self.instance.scope = self.cleaned_data.get(scope_field) - else: - self.instance.scope_id = None + # Assign the selected scope (if any) + self.instance.scope = self.cleaned_data.get('scope') class VLANForm(TenancyForm, NetBoxModelForm): diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index d86103d2a6262febadc30d2a1a7e19c41dde29dd..afdbea0f820889285f7d2f4fee6a434c72f5b373 100644 GIT binary patch delta 14245 zcmZvD2XtJ;)&H59x9*mkEL)PTvdCuFdXnW5gI8M1s%!ObHOpeP^-0^bO zWAK<}8sizu;e$;q z<=|iEqEu8Oigd2nYus<9NI2xR?^WZmnVmqWK4-n^}m&rM4_K4Bx4;rG@ zV3tG4@;kHa5kpup8g1@FuaL|`o9K$!LAOCsWdETiT1VZHL-&#NLyypNN#xM~(B`>T zx7Iw{d1xCeA)!NiSmh$0+u#v>j7HPwxE#6vB{o7x)%}gS&aX&~dM71jg7O_kKAKHx z_^b2DyC|MmK*qP%DDr4`qp!#0QpC(l!r`FO7YREIjXvWz{^S}ZKWy!*^4T53=DZDZ zxsq=U1ROqlnOpJL4K;l4Lb5EaMj3Z_LXNDMl5g|-!a={M$`^=)i&1~iLb7&Njbb$6 z`?ZDSBFv*Fi5$Ru_*)mUR8AL@RU1%0+Tb%_GJ2awu?^_uGM`b7X_!%P%haWe8w)*- zaF*R?jw*&4wP7(?I!jlhtX*5fPkc#M@I4LEZ1s{9^8UFCY7}$Wt%N|sT*JqQQ7}OP2GAVzMgnt=?Bm)@$q8PR>gOHSn<^5LWy?Lv>KjE-)5~{jT8~O33->(qE$W z{C)`;1;k3pCMoQe6>cge2bQ9@)fQHwjyM4^$Cpb<6H&OajOb^D-Ny0p8s1b!euch^ z%SkPYo^oPBaipAFfZ~gC53MD_*})MeuF;otv8ymvI=cUUsaG2v@WhB zc__Sg~|lEDta(u4&Z$s;L?{bCQNX+TUZD8_{8-PZj1Wp^~6Kwx7p2|R)e9{Be(O-HN91+NXUpuk-VuyP12~vITR(HhU^T?xCXV?*}vnoE5!D!yr8<90cv%_lF z5UvEGJ*b2o8fJ*kdWE#CjYi}?2lm=A)if}PnQq(1Cte|r)Vhdl3p%V}N24FdDOfv6 zYJh+B3UQJcx4%lRAzuEUSBaNYsE*f2C7B3B%=+mO^s*N)h}iYA3tv;S)XUMShGH3d zIR@CPef3T@j92tcHPmLPmn(o65)0GILz7JtRl!v@b2nDxjbJzo0je^X(-%P}c}T5% zovfh5&fiL+%hk}|ARxpkfK>IqH^_x_zTGW5oK9#+lT$VQon*`+!@TnyQb*kCPu?M? z3Bc>#B^yxu?p@MO+&uF=GC^ATvG>R+65#vZCpUo~YfqDBNkIMgX`w<~g8sSujt|M( z^Sx8#UHtlwh@V9H+>c2yI9c^EM59H05CvNtbsOcV&+JyrW^;ByaZKI#8L<+6+dCwQ ze~?7e)JOhJh6rgn`~@lCCsOG`9{8MGMOq&Gf-EGYmnWSe2GS?SU8T01Aq(k}KDTVQ zhOJP%+Jeu$z-N83?%t&Uzn%2fR<>Yqbe_%%tio^LrrR`V18Ci8h9oz7MlEka8y&9#`G zV(8M8OwT7Je19_iDJkdYEvGvGiK+6NmQ!vhi5RSk>{E=gS1|+dC~{DdLx91K@`%BX zuU>qq-6^z^B$c?w3!M=k&aU5=RnG5SLEk0~f?PiT%}Uxt%GKqmG?^qd%xqU1AFm~i zK16Eyf^=F$>a;%UP&z#@3(I4AdKGY(E0&_i8VC5cbLdlKK%Jd~)}&r7Uqf3(dHq_t zkkW<-Z(K*0^G6Ldm(;4K3{)nVN6I=nMjF&Z>*yK^^uscBi&DRy9wxPqB&m+z1`VI6Z zqHlDYH#oM)J4CTb9^`Uq8E@H{>x4D+|W8n~N zq{F~VHnWvnw;7hMl&5T_U(VVAH7{C`Ds6UAv;R7^8A)<<%4$1fNg zQ+NI8QbY+IHk!Yv>&H)qJ)|j zMYRrvK}R?e^kud4r%K?;RPm2WXj!t$4qrxgXhK;SR9!nb5z}Hp@c#>F0P^vqU5GpS~R;k0gb$e-FpGges9T65}hMuUOzoY9cz7Vz+iQ5@>RE-0t`9@!#H7o z#O4l#t-)~4sLzUVB9ln3KMK}qIQt|Hhc|(8@@IF`<)v=a1pJB*=06fhR0S}gMi%B4 zpYU#AZN*2tU7kZ65?I`Td2@jr<7<0ydV5uCFBBw=1$fCg&8EEpPHv%T3q65xyAldu z7Y)WyzUNjL%4Jr1JArimvX9;id+D)3$+`Iv8{II=6@WW$;ENZtWT*wLCc+on={lVJ zLOXS(cmrc&I1`DPv?AVsQ48>g?9{oa4^y;RgZ@a!;el1>c@DZ_bA@1iul-v)HiU*H z!JvPr*5SlDh9|*h#pMRv%7-0LGA;ae2hEr$1A_(}F}r`rhmG`uS_v>-F$%cg2quu_ zlSq%lD%h^IYyi?8w7L@8qv2|S6JDv-Bxkf&NOm1?33)-A1hNm4wpn?FlO~@tfGLJN ziV*es8LP~L)8ft36mk_GbJCTm&Hty?=NQJC8u{H$x+1qiFk(_zhXgRmFpZR6-VrcY z*mH;MawY!|9ny0^Z$=xRU9nli{$NNim-1{EH9%cgyJ$vAf51H2Jrw9MMLcr%Fv@EG zxV)2J=%VFhQ2mXI)(}{UMG7s3C()o#neI#o%3xejfPO@wmoo%de2D@n>FuYFQy6%? zm)63h`@Ph_$^$a@`f+?7^wMEyoAo{%+Xl7TN4FE!8p!3nK^(AK{iy8c=>hr|R$-U< z$pBrcE*PZ0q1e;sLiEGOnk1l08x)460$*lR3Sye1#tehK}O zIC#;e^d8z3P~X24Mv7Jkc+vOiI}FLF_UUCCkeYI63+Uw>U^SpzBOdXZH_CSJn0H@GwkV;;;kG8LhN|N-L04T4oyUJ-m-*6uB@Zv7iWM6is|B`{`;NNZ)>X4m|E_MA5(>+>afv<*%YhsRLp3)yo6;=<~y#dZD)X zk^?lbpbFw+jfDMWu*;EJ$61!uM+6C$FRF3u4ol+Bl|n z8dDd?^i5+1_&=|s;ba%&&!H5Tc}*=|6F$nlCMcrAunj}%vBR{V!nL1wJ&a$DT5&yG zUAVA2Z=jiJm662oTKdK@tsyGZt8PH_Ln_siH`3W;zQ-&4t8SZD&QV{ui8=@fo`00) z>ssxy-NTEH(sgv$&L27ot>fkDQFw>L{FS4$v#QIB>A zbHpJm#d*-G6r6~t2bd9H62dPMZwYKasAwm0r$#+EWDP=l^<#lz;c;kC6DNM&k0Fxn zyzR$`sRrW`r=Q_Rfgx_ZVe<@J_l~L#su1(eJZ~ zHq6uOw+kKG8RtL(st9ST?-Z-Ipk{^&ssT8uf||gFxPGq)p=Cz`Yz%7tmIEGxhA)Gv zKr>C>XowOZu;;sBH#E2!9fb^ly&BvFIOqr|Bd{DA!r@A2pnSMyUL_Pt;KRUcj*TWV z->y^m@q1}%fp4;_)+J}uBG%M~J<*n$Co*ArIp~@c$4-9gUYfoo1Vp~pB0nyi{wYMB zU9o!nE-3D4RG;4-(<4|koxrx*c*hC421o0b$7v?N`2-EYvMjle{*BsPaaS|q(p*hM zWb1!MFQFxNzW7O+%qO0pOZeaJr%U{7$FM>Wf<8 zia7z|yv@Lj#3jz@!tRs{H*ea>aAODK{^v*t)~8(Pga8OkN}**+gVZFxkW1CeO#mQu z+V?K+%<=Q4^-zNtYHAvZy>?+hvFkab81Mo)ngAi48XN;0mwFBC;2%ClSDarvL&!CJ zFPcpXv4-daB4I`WCl*p6q%?V!)?kQtJdPaGFdumw3~W^)KPw3xP6$nFTxh7>#S4B$ z%lWn^5QVt-q9@@%LULZ^c9kyX?%z@;H{FlDn!5*rwEY1(pI`J(M3Pa_GK5UquO6Z4 zBEszDfBG$&&Hf!N)L9~6m(ZDA{I^fgmHgq~(QI8U_FjuRllg)ywuDPh(FaHefA}f5 z#$K-bJ$-6<#aRR^z-1QV4BDZ}Ps40TeJ*)ONXHiL{R7yS3Y+Tq+t1T>I^a6|IvCyZ0=&R_ z{+AbE!s`+nGmtpVwd#|9rvIhLiT&m;P|8@|nV0F`ld3RA*zfm*6=C=IyRXo~^BRFm zs9LLM(*ErLGC$EWPx1L2aCxd>6JZA%#j)s$@LjLcb0;d%PLm_pEkVcXiwF%~if=v!DHe8)A|&cqjxgZNZ@A!IWgFi`D)67<^enXq&)36p?7f_TgVNK>_`2}iAF z5~0P9IBzbV{uu0Q!jfB!40i;J@`7kfYFWw)2b6pt5T1@LAR1w)lha_5%rBX z=?}@geiyPvKE-UXsh9tqasmUF^AGwd4BN`L=}A`VGRE^HpS_I)W~F-1|EF`v>=AUD z6j=57f6`kKzp3F<^zQ_&L;HL5eL|aDYQ<@Kg0Xf`IQ9udZPCZH3}If&$23o}xQr%# z&&QCbHh%nLYLsdw5mKiM`4E4NX9KZd?HfWOybrZZ{Nu`V4)K`1q?|!tyKJ`UcfgUsSUZw9Ca;zk?%L{~~fi zA1!ARfAGK5yuuOfF^T)L{9asSwJKqxFpY9|Se^G34!}eZgM@6j;q!z7kmwLVsM{Hs z9GfOrp(y0aFJ?5YZmm)C1zNz3Gm$fzBYb@abX!7mX|M-P;u;xX&Zu8dv4P5D48wo> zHC+Y+`0CflBHB6mhNet}g{Fnqp65|~xH@!-K?Nuh0(#jkKo8Dao(t)aKmr@UI60$X z`?#EyGwO_vXKh270Nr9xuQv6mP|7tE%!>zl2tcCdQ9nQY4HQpIJ^c-RMx=5y9>?N5 zCPDQJ!t4|Q+ir=ih7BB(*t0rnjmGV=bsj6ov_*}^(L~_f;By#UQIYD@l6Rr7!OKs~ zV_UJ-cjvKHB%sco&khjkiSoOjfl-a{`xda=iC#<(-XdZgd|*Gc?^?gM6MbSi6ViVsG8M zGNgg$hG2%qdlPIEm-xbK%I+?Y%8FfXh=L7rxlIo84a?awz9*UW!xhrLzfNZBCA9IW z06%9ia_drA`}_er_#(2>hC21~RJKgqnH*1Jgh(w>#F#%$XP42ExSY&thK!Z_MK*Og z|HA?{mwQ*SISU%WwXh#I<4AV#y{lOA#10`WmDoy6Aq!=LLntIBX9^cVa#cf>0yP!9 zXqb^n4D@=UQ9n>|!P8pojDwosX^24};({l@RdRa*hU97WZJ1(wxBa|eHTJ5LH?3wS zYKihIRcbCeB+Uzbk{SfmVM$gW2b`MdPmq9MF89(q+8hcW_+nnQXPx9)$;d z*EuYWAIk($KR=nt?m!TPZt1*XFP+UV&tlos4;8ZqF2l)#z&w|QmOIstv)Jb%y`P=K zGWeVvwh~$%-&+t^O`}G{ceZ*Whn-83TqWiazo80O2)KMK;e$KaGWGK{Y#o_b6BRE# z#2pCVHYA;+Hk`|nD6NU|UL#9~M>J|=M-XNvuVZf`Iz6+Fy`WwzvwTEt>TmK`C!S!n&WkXcfy&r+ipc+m;mrM4Ea4jt`^@_R~H zA6B!Zl(j$;UT{j6%-_F|E#!-XlEn9yvagfFv9k5!`KDTSDZ-KumV-Q_714xHQm-cXF=Z9p3#ltdb!4K_Bn>KnjNl+ z;ebJJ(C2p8bM?kCL-+1AJ-Nk3y{vaBdZXNQ_IA06`susrLH<-7JCQnQ6ArnI0taD+ zQ26=5dR9tn?EIyAsQf|xbv?@vU`7K=Lu|XX0kutbKHk9Upa}lZz|IxmzZ%$H+HT|h zJuMJgwa(sG1aInr_%BP@}wLEnCI+?}j=E^V@c_RycEC z?#4`=ysDQq(Js4sQ!l%UEa}upjAD47))VnnFYHKz6@y#&g;sVY#$4FP^q4|HAJ&Mj zyweUFf$}Xo`#tF2y5g}#Br`nXGBnJcw<Ir*Ck z^MF@%{cH#J zZM9YFfLip?j;Y6KuCZxX`w^$6eThx|^8hQPVE-Z?dkLHKwvT!6*vPK7gjpjc9`#32 zc3>_pgA4YsOf5PSo<8FO2y%^ zo60@1*E$@3+7&W+`HL5^g1N4kEF4u+lrOxPZB7-sL>2_)L7{f0RGX7`T?{?xKHE^9 zOW+_n`E8f5Oz4;=FJXnLPK^h+dqJ>g6R}uAV>PL1m%^mrdDZ=wv7Hpn=j~%=T5aQ1 z``8AocXS_Hix~XYeXIy6fH(HBt9Z*r@GU@hKU_$ckt)|mXY3}7!p^`h*iZ+N}k;jz}1V<=;HStVC$q<%+SIA zdVsB3sgYKcu`xk@dP==~$>r>axIRO%p8w-=c09RHjPqS9c;pJ!jum}$1(R3w#)R4c zk?&Z_O;@tcM4M%Oi8j+CRq$u7WC!SwQ?oSc*j229;AY{at69;i3bES!sMQm3h}SiE z12naZxQIOnHh1vegRn|NnpMhD|8$TkBzgF3Gp#wq>X!}0;%^9N8gdXw<>`lEL|-_> zGLkA{Ge&9QUms#M@ItGvh5IqggV(aB`I-GJnKxbs5ozUt>)^?>@PpT}M0c?p~+tcFIFedDtnJIpsd5T;h~#oe57w80#(@x7-NT*1(-NvI02k{6?l< z(q+R0XOOPrPv6LHha?n#s9Vl|a1%SSvQ}e}T=yML4e;l0W?2+uyKZJt{`nEMfWLk- zTRykT27kb5X!G%dN1^E#9%UC{(5sKKqsdigbEis=G1Jn4nSxR$_`)~rlTuSf=!ToA z?@C&C6+d~5-8;M9DV&u79zD*oQ^i5WEp8x|Ctmx4;W(ngq}TuC#BnyCgw^}*VtCS| z@Eh(%_@k)L-Oc7x*sa&^Wjp6oInATxxG&|mJjhbi#uMyLCi(EHkYDfsTfr+IfLP~0 zz_`H0G@Sb81MHVN5>#*g1zRkUD)pXUvGXWvcA5`8|7aSgkKrsg@~+1qM?2Jq9%Gdf zobzvf%U)X295Zj4skR%{x1VJD78sipbEU@+P~@m04+*ErX=qZm`S60ZNhunHK#6Va z^_d$v|1;YN>-qGbS>tkx_Of?}KN7@^pb-ucQr#B5{zYuH1vwO!g2M444wgl|>_zq~ z9qehvYbEnjHu2vHz&wB@s8OyP0qrv z`jAy)YOj6B$|K3mn1yXEN4h4?Ej$3X zz{RqN=EnG80*MV;zvjt)h7?5f-|80cq#8bDr)RAI10o@V4^OSZVa?^N@`Vjes(gl} zFJYBV1K(?w(zt!TltwDmiTTp^mSVa;UoB;B(RkPG^Yy^{4>%C50DqZrSSs!dw|#4F&nYg@oibJVZcv%upfCEpqJ zd$o_SUsQ^B-K~lj*|2TqCQdR1QB|KQZInQ+?HpR14QZ&&kuFE^ zYK|mCOv^@CbV+I0^9(8@a=oUtZE_tn?YCm??OV z_vB+^U>|mOYz*?yj4`!NAW+l-z>wVpyNH@5WT!#iqL={0YkIXl5FR7iVN?shc%5|H zJP1Eltb~f1)J?gVIrb=CZ#Ea;F<_|3to3MC=jKUI&2JEMhUgXr@VwmNbA{bPj&qF; z?eV`;adiij?k1(D$NYaW;?eEc*thX&)>i2fGAmA%-)WN4!Otg6Qbsw52-`e1h6qNO zXK^eo+ABfKr{0r~hbE3;sCDpVTiym-Pm5n4hzVGf9&@7yE9|y#L!q>KGZ02oLTI9j zR&Ulv&>fFe;2dGK-|j4Wsa^DV0B4D(M!KCLRE2=-n%%6}+faN6ZjxNlcm`jr_5gbSWUqh!jg65mxNG?%Rta(xzoQzH82q-$)yk@|RVfrJ{RO z+ORC=EEUH_r7cONGwo)-`ah#mxwtzwj7xZ5rQR|wy@%jPy<$S@oV9-EStbONiKMK@ zkua4Z@nAF_o%lI=Wvg2*leWVjSBHKe{Xj=L9=uYjo3&-|?354`#Ki z7hfx7wy`#+nICvpm(Ba%k(Q`0pOR!sI#ua?39nPF{KyAV0g`FI|3F%WAWuL%!ju)d=cxi#c{N_g!l-7;iA@ZCZOV|?q7RLDO%rCT}2 zB9;n$&EG1A3$Xr_Za&}quI}IHm;0VhWK#COr~4_Q_w(MzQ?wcQC!(7b#w=%Mr@+`#dqdX*5w65p`RUDA!tQ&|3cVY2AGE8u~zY8UN#jWDd7~pj(PI zK-`Q8FaJMRJ(W!w@EPWT@`(cMS8;&BfD z;io#K)q-Zz%y78Bd-}S?AWn=U=h)?bq_*(^AK4=hc;peMywfQUI%SJfZgR@iPPt3- roq5YCUADUSUphTr!o~QHKhx=Tg0hJZV&?qbt#m0aPtJU%E0F#d)Nqz! delta 16250 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 delta 2145 zcma)8&u<%55LRi5={dkDL1`o;Bo>+SLzLs}^UK!RI2+e-%tk_J<81709ouzm*U4oM z2=$0Kg)`z0;DUVNz@1Bv{0neJLU7~zW;gC8s7(($em`cu`DWhCd;a6QwQqk|`>DKg z>!dvx#$PY5JY8P7f$z2X^2*I${z?77X^1pD#}jk-1*L?PHOGkA*mr!vJP@-7AwlR= zMOscMc2nn0;)*2hzGJaTVV$O!hlUo10vxG3HIbTA7inT@XYS=yAIpJwV>hIy7VQr9 zU%^hzs$Bz?9g~F+&3}J$>Bl$Hwvc44N|b~OW@Nw$;27?bcAcYbI%Je$oLHpeW;$(= zI2%1eXvZ#MMFOmtk2eYitsHLXa!Z^@q)kxdD_x+%GP(wIRs@A>1)1icIX|;maQs4g zU7Ksczai-;kBX;DYGspA#k|S+g955%=SsW}D+PrDp6Vjrh#;R=GSC9m=kZ?w9GjN_ zYFrmo&uoU;(c+??qw7qSl^#`!0~r<5nw2O~?&gU_F=|S7u0vHqz?)tqm$@y51<+ZZ z*9*{efr^6*SsXD1+CrT6VgwM(vAuCAfq)0(F2zPBtOPZ~QvS&0LfHifDioGS`2l0t zb)5ln_1JYGN)QTB|-+-g7XYW-%d?NcXlRW-jEtk`nK@9MgTzReTi zXVF-izi*UcV~dkd7>z}5l3tA~X}HawIzy`GmyMQdemkN1wN7xXXEvZ}tQSt$WVBTX z3%|G}cwY$OfJVSG#$^E~KDPn|KT_j}TcPS=eQW9 z_!hj7jge}vf|&EyL#yLMEznt-vD_xhdX_9yg1<*vEeO^UtIel^R-3^sdJkoE&t>)z z@G+WWsBL96KaaBdsBLkZ&kWiiKiRyw^-^OARGs%g`-%b25oEoxb&MHqX3s@<{>|#r zyB|RN81Mj2^mdq8EpH$C7JXdtEHRYzdaswI=y%=IY|zZ zUNSyich=UU_WZY>OaI>3Iq43b+)obUt>|*Iy z8T6_ARdjym&(b?z4psfR`DMdy)IaRS4ZijU<4#P)X%au-ul@&VQYk+}n%g`QP)>UpxN+@q1VB diff --git a/netbox/project-static/src/forms/index.ts b/netbox/project-static/src/forms/index.ts index f166c75a8..00b872e27 100644 --- a/netbox/project-static/src/forms/index.ts +++ b/netbox/project-static/src/forms/index.ts @@ -1,9 +1,8 @@ import { initFormElements } from './elements'; import { initSpeedSelector } from './speedSelector'; -import { initScopeSelector } from './scopeSelector'; export function initForms(): void { - for (const func of [initFormElements, initSpeedSelector, initScopeSelector]) { + for (const func of [initFormElements, initSpeedSelector]) { func(); } } diff --git a/netbox/project-static/src/forms/scopeSelector.ts b/netbox/project-static/src/forms/scopeSelector.ts deleted file mode 100644 index f7b77f041..000000000 --- a/netbox/project-static/src/forms/scopeSelector.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { getElements, toggleVisibility } from '../util'; - -type ShowHideMap = { - /** - * Name of view to which this map should apply. - * - * @example vlangroup_edit - */ - [view: string]: string; -}; - -type ShowHideLayout = { - /** - * Name of layout config - * - * @example vlangroup - */ - [config: string]: { - /** - * Default layout. - */ - default: { hide: string[]; show: string[] }; - /** - * Field name to layout mapping. - */ - [fieldName: string]: { hide: string[]; show: string[] }; - }; -}; - -/** - * Mapping of layout names to arrays of object types whose fields should be hidden or shown when - * the scope type (key) is selected. - * - * For example, if `region` is the scope type, the fields with IDs listed in - * showHideMap.region.hide should be hidden, and the fields with IDs listed in - * showHideMap.region.show should be shown. - */ -const showHideLayout: ShowHideLayout = { - vlangroup: { - region: { - hide: ['id_sitegroup', 'id_site', 'id_location', 'id_rack', 'id_clustergroup', 'id_cluster'], - show: ['id_region'], - }, - 'site group': { - hide: ['id_region', 'id_site', 'id_location', 'id_rack', 'id_clustergroup', 'id_cluster'], - show: ['id_sitegroup'], - }, - site: { - hide: ['id_location', 'id_rack', 'id_clustergroup', 'id_cluster'], - show: ['id_region', 'id_sitegroup', 'id_site'], - }, - location: { - hide: ['id_rack', 'id_clustergroup', 'id_cluster'], - show: ['id_region', 'id_sitegroup', 'id_site', 'id_location'], - }, - rack: { - hide: ['id_clustergroup', 'id_cluster'], - show: ['id_region', 'id_sitegroup', 'id_site', 'id_location', 'id_rack'], - }, - 'cluster group': { - hide: ['id_region', 'id_sitegroup', 'id_site', 'id_location', 'id_rack', 'id_cluster'], - show: ['id_clustergroup'], - }, - cluster: { - hide: ['id_region', 'id_sitegroup', 'id_site', 'id_location', 'id_rack'], - show: ['id_clustergroup', 'id_cluster'], - }, - default: { - hide: [ - 'id_region', - 'id_sitegroup', - 'id_site', - 'id_location', - 'id_rack', - 'id_clustergroup', - 'id_cluster', - ], - show: [], - }, - }, -}; - -/** - * Mapping of view names to layout configurations - * - * For example, if `vlangroup_add` is the view, use the layout configuration `vlangroup`. - */ -const showHideMap: ShowHideMap = { - vlangroup_add: 'vlangroup', - vlangroup_edit: 'vlangroup', - vlangroup_bulk_edit: 'vlangroup', -}; - -/** - * Toggle visibility of a given element's parent. - * @param query CSS Query. - * @param action Show or Hide the Parent. - */ -function toggleParentVisibility(query: string, action: 'show' | 'hide') { - for (const element of getElements(query)) { - const parent = element.parentElement?.parentElement as Nullable; - if (parent !== null) { - if (action === 'show') { - toggleVisibility(parent, 'show'); - } else { - toggleVisibility(parent, 'hide'); - } - } - } -} - -/** - * Handle changes to the Scope Type field. - */ -function handleScopeChange

(view: P, element: HTMLSelectElement) { - // Scope type's innerText looks something like `DCIM > region`. - const scopeType = element.options[element.selectedIndex].innerText.toLowerCase(); - const layoutConfig = showHideMap[view]; - - for (const [scope, fields] of Object.entries(showHideLayout[layoutConfig])) { - // If the scope type ends with the specified scope, toggle its field visibility according to - // the show/hide values. - if (scopeType.endsWith(scope)) { - for (const field of fields.hide) { - toggleParentVisibility(`#${field}`, 'hide'); - } - for (const field of fields.show) { - toggleParentVisibility(`#${field}`, 'show'); - } - // Stop on first match. - break; - } else { - // Otherwise, hide all fields. - for (const field of showHideLayout[layoutConfig].default.hide) { - toggleParentVisibility(`#${field}`, 'hide'); - } - } - } -} - -/** - * Initialize scope type select event listeners. - */ -export function initScopeSelector(): void { - for (const view of Object.keys(showHideMap)) { - for (const element of getElements( - `html[data-netbox-url-name="${view}"] #id_scope_type`, - )) { - handleScopeChange(view, element); - element.addEventListener('change', () => handleScopeChange(view, element)); - } - } -}