From 851f8a1585bc173e88205d18bb85d364a6fd5d37 Mon Sep 17 00:00:00 2001 From: thatmattlove Date: Wed, 8 Sep 2021 09:54:38 -0700 Subject: [PATCH] Fixes #7191: Access SlimSelect's internal options when getting current options so selection state is maintained --- docs/release-notes/version-3.0.md | 1 + netbox/project-static/dist/netbox.js | Bin 323330 -> 323406 bytes netbox/project-static/dist/netbox.js.map | Bin 311779 -> 311863 bytes .../src/select/api/apiSelect.ts | 19 +++++++++--------- netbox/project-static/src/select/api/types.ts | 10 +++++++++ 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/docs/release-notes/version-3.0.md b/docs/release-notes/version-3.0.md index ddf23432a..1e7a3022d 100644 --- a/docs/release-notes/version-3.0.md +++ b/docs/release-notes/version-3.0.md @@ -13,6 +13,7 @@ * [#7179](https://github.com/netbox-community/netbox/issues/7179) - Prevent obscuring "connect" pop-up for interfaces under device view * [#7188](https://github.com/netbox-community/netbox/issues/7188) - Fix issue where select fields with `null_option` did not render or send the null option * [#7189](https://github.com/netbox-community/netbox/issues/7189) - Set connection factory for django-redis when Sentinel is in use +* [#7191](https://github.com/netbox-community/netbox/issues/7191) - Fix issue where API-backed multi-select elements cleared selected options when adding new options * [#7193](https://github.com/netbox-community/netbox/issues/7193) - Fix prefix (flat) template issue when viewing child prefixes with prefixes available * [#7205](https://github.com/netbox-community/netbox/issues/7205) - Fix issue where selected fields with `null_option` set were not added to applied filters * [#7209](https://github.com/netbox-community/netbox/issues/7209) - Allow unlimited API results when `MAX_PAGE_SIZE` is disabled diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index e4d0f8d8ce75a47b3c94f4bb12fa5de77475f6e5..a60f4eaa83b93575879b333e8d1eda8c4fcb4f0f 100644 GIT binary patch delta 2588 zcmZ9Oe^3*57Qp8v-++o%kOBn-L#lN5SYi;Zl@JtNe-M6zU%^!_;*xA25VCQz0RrL; zmZ`taQ}65bYioP0W1Z?NGKhqd^PX~)5>IiFhsP=R+$x4M?AZv5e2LVLw4;illc(FBeJ4ErR z%p>5#VpatF_{i@TNL5y>PDdK-f?-MOEcD3fx??#8>R4$)T%}b zFWZfw8Gq>h4bNq7FZ!aZ`b7yDZ@775aYk5-HP$ET~6SWV{5e>z zd(_Zu-b|Fe^%JOWef;g{)m5DFcw6D0u7vKjS3t{tEI)!vJJ~pvwdB zmSKkA;PVR$x;dxAW*15vJUx*;2yBMHasuaMS-W3W7{O5(SGH57XAl?^SL)jb;Ug;u zq(p-kQfO2Mjn~&DDrTp{-6ZIe2LCZ82%~Pv-CgiJHI3dC`eJH;?l$;K64QDr7ru*GUDEXjWJiY9^7 z3`14|Jr$209)`z88Zmqoc)Fap3JxQEYjW)>%$mGRR#myvLUYLa0)C!M^(i;NMPE$3 z0rqSvzWo3eB?@dl6JZ2$>j4aau+{Srbk9S>-V*TXKNcEG=slow3yhvQ(5&wejBR_s zt^fO;asKYP{%FXn2IP==Z7ZX)eTt+;l~68Yk;C!bh=r!Dvih7JWHuN=JXzU`DrVO* zYFi+}Sz5%1WMS>&Vo2;970K~ll$J5RD|Lp|m}}Hq+?M>k7iId#m8ueGZIzS>PQ+kP z?yi&kiWF(HaJjap?t`-EThS$j)Ctxtqi~+xjRXUoqp_O$P&U+(SRcxv%YM2vjYkfP zYFncij7kv;7m~WoRbu#QsHhUOaFz*iHbx~S=6-fpRL6^xOS`w0q-;W|3!el~q`@+xwGetr-wHG=!~ZOFT*j}A_5z}g|jXd9~DHfG*>rc6=f?oBH~ z^wg#Xv4yq%Vjjzm)!8gD0k)rZTK+a<)yXy*Zi?61?32Q3Td7U2+=VvJLIIvpN%#bs zrQbh_N{tX8>@n2+@_0gRV#pVil*j~HVMXqVO_0ZXDW2$8$I$N(C?xn1x=NSD8Y&`> zHN=tq8fqo?PoSxK(#OaSAd^)m&~Il%cqYWM{ryk+R3rr#P!=(rL_wR#v;FZQt_V3S zAxUkKdkVaAP*w^$WuIi>g1p008E9=&%~hkammEBamO_+#dlD6Zk0k5J27Xeeqb=E9 zzF2iQ92TFbbXfB8m;jyhkfbz7J*p$9-_cP!O!4uYpZBm5<#GQsvXU*QQ3S$d!)at8 zFPuSNQ_nx0K?e+-Jjp$bQpv#~^fI)OuZNKB#V|j1JH_j(nq_}eC-tNDM!k&4Td)zBrh2f9h+Wpvcgz>}1d#zMk;hVr0?xIRPop@9?+qmyL8 z2udTS5j2k|@n7X5h$Y$xdY-&CLUDDIpN45pHRp|pTp2-Ddic=@+8iIR&(SN)cssO2 z>2(#FP<$yg+V6F8_h^ggH$O*?Sr;!Ur+hIW|D;|9-M xJrPw@$K3q)I?9AvJ^d?mcsjVq*?*!hz@_i_9yQQ!FZsv6XdTOR=RI^P;eUfCZr1<+ delta 2475 zcmZ9NYj9J?702gDN49yz7GOIVFtz|k8efD32?WbB56cGpK)$wR4303ebS=x4bcJ-~ z2Zm55Zo{J#=mOh75|SZI2!Rx`#Mj{!9^(W9X_=&f5~fU;bSTqFnh%A{G+*e-RK(?r zR%icb&)NO$IeY(fXTmFYCLB*iXkclW0$^v8bXhQ_s#>teOt#`4dyKrJPbalW1+bj; zB`pA`Cg+kBSV88dxS)pYN;wN{#4)NJmXXt=L|8}0jrPI}5*d9EmXM4w6;Q^S$7BJl zCmY9}ft93i+#0ASua7$pt62Fn3jv&DYpMY%$g$LYu#_xI^FRYRnsx_7vQ1wF<>Z#W zL$kV?h~u|_#BPt*0VwS5gc5)dnVB8}KiQqW6C!M8Mjt?w9m#wZAVAEMwt$BWOgaoP z;?9bKmwcVo1}$XKWCOG^&t$t6!t8LiSpz|GGe-s=S(+Pw4stTL2bx)d!2r-rYNvk# zrOZ6T4$w)WGv9zZl9u-#bg_ZF$p8-am*)-wEGAv1jZngVGSvc9lJa~P*vaAi2T(=c z6jpL*4}~TTwyzMHiN%^hLbH3YdWFzEY-kI1Lk;^wLAr+1`*2Pdr}y04FFCiL=enSb zG(11RvFTr^gq3W~3x(P^w-*Os6{%TZ;MigdUWW>nT9^&6l$ovjfP)(*}muC z8jE*mR|xfMG&$4eFaA;y|2#{vf#sJhJ&E?ZF#oZSJ32YgIhZ3Yf+ju_+c4vUJG!<*_P zP)bfXe+NxuQT;inC6DTFK_|Pl^1fzFU5yY4$IB}cCb`ox$#<(Ij&*rslw&1lUpfJc zne4iVx{?~9DNLGnrL&6Wu{vF4jo^4}uJffJRI&B#2a`GC?C9+zXlFlnA05Y0z4zLB z;HV5+syLqTme1l`=5O1{xm@1%zOKAYum^`jZu@PCj-&YVuKgNbOYOUPEwOKQ^JB@( zviFZE&_(XPwVhwHeBiW}Zz%tu7Wh5Se)n{`&S??qWO|_xvWR>&k9>P!G+S`WnauO; zxbQXTmRf|xPh=ze;L@RF-e2O?dzm`XB2*4b6PV+>N7JBOb!cJj7znAypMjD{wrH!j zip92qygaeU$$xTf#?s<~h0elR7L!$^`d-LL7F||OXwEOD`oi>^K}Vq8?W^ub4F5NQ#E zXZ1X*jpys>a7S{=ZO%qfl^Fa-nK|CD934%%>Iy9 z>Tz^3K9rq{2*lu=7$MUjIBeuk_s;HObs*WUyO-9B_N2Ryp96A|srn zU|8vPgcZLW8ZjG+1p@z@6ypDX393Z=KHvXEaMO7`s4q-p4ajb9X@?Y2Muck~rt$P_ zG~f@$ooH_lPK5?~pa--0aPIN&w;r5gOazTZ0tUe_BI3H36zO(8nWecKFx{Q-4$2Y9 z@YKG;5vf*=D3aG8bgbvFkj?_&sYIWDT3HsB1+D5uXF zkdz$1jlR>XNmnntj4GxiBB{GxMH`Gxm^Qz9xev>#V2tRopK&i zso0MJh|+WYn5}o)ZH7v}uT{yZlD(X5fd0^ri@-z8D$ar!eM!Xv@Y3xnz5)T7Ho&90 zRbc?zAR}fMympsKGAgExEwPX%UTHZk^ynwJhko!0PN&{e_*Wjub{h9FzUlig%3TES71&NB4e;>!CyC zk`HLwdCaDJFW`OXpqnmYE!V%g$WPF$PP~K_8tA5L2eE=S4RSm;1~C(w=)VT>efq;7 zX3-O$;Z9Abo$C9w7OH%Xc~D39e~$lzPWqe6*v}XD4&g*94&iKCG{ouY2YLRAM;peKOWmoWJUg?8Z@Wt_o>urwl7h|{wY3fx>hX!@#Rh+NWCv+uV zkHhT}ypEY!iRnb4E_t$Ced{`I)jjFQryhl<;#Nk!3T}QO9a5z~)c&Mn)aDy_C>6SB j%02u7y3`x@u#SHMY5sj|LkGVN8a$$%rViZ4y-EKCzzs|` diff --git a/netbox/project-static/dist/netbox.js.map b/netbox/project-static/dist/netbox.js.map index 10b2b5ae537d50dbacbf628f64f790979129fc38..984391b01ab2fd151be9b8b19966693ece83ca14 100644 GIT binary patch delta 249 zcmaFdEWEu%xS@ryg{g&k3rk)aW9Ih!G!}nGZO1@2ok&N=Y$qL8N5@KM9cM@93|Adr zM@N4k)6o?qm#E|EZ0?igwEa*zi!PH$wr7zONH`L#!wIO&(qlSv7R$x$&$3v~vrK;^ zz#_ux?-*F&w0&njO9JC|%|e!1CR1leS92E~cSlE0kipI%&AvLGATH1{U!8I%N9Q~z zh{ZrffjZuf?s-nr9}2LDPM=WBBD?)jF-sM*5X4r09e+p1V4z{HIWF7d%UO2uaF$d$ YRXGE-mu^>TVew&SEZd&n%~E0p0M%PdLjV8( delta 161 zcmdnqBK){nxS@ryg{g&k3rk)aWBT^|G!}nG7Uw)4x9u;}S#+61N this.handleSearch(event), 300, false); // Query the API when the input value changes or a value is pasted. - this.slim.slim.search.input.addEventListener('keyup', event => fetcher(event)); + this.slim.slim.search.input.addEventListener('keyup', event => { + // Only search when necessary keys are pressed. + if (!event.key.match(/^(Arrow|Enter|Tab).*/)) { + return fetcher(event); + } + }); this.slim.slim.search.input.addEventListener('paste', event => fetcher(event)); // Watch every scroll event to determine if the scroll position is at bottom. @@ -470,7 +469,7 @@ export class APISelect { for (const result of data.results) { let text = result.display; - if (typeof result._depth === 'number') { + if (typeof result._depth === 'number' && result._depth > 0) { // If the object has a `_depth` property, indent its display text. if (!this.preSorted) { this.preSorted = true; diff --git a/netbox/project-static/src/select/api/types.ts b/netbox/project-static/src/select/api/types.ts index a6ab12794..8179f4a3a 100644 --- a/netbox/project-static/src/select/api/types.ts +++ b/netbox/project-static/src/select/api/types.ts @@ -1,4 +1,5 @@ import type { Stringifiable } from 'query-string'; +import type { Option, Optgroup } from 'slim-select/dist/data'; /** * Map of string keys to primitive array values accepted by `query-string`. Keys are used as @@ -187,3 +188,12 @@ export function isStaticParams(value: unknown): value is DataStaticParam[] { } return false; } + +/** + * Type guard to determine if a SlimSelect `dataObject` is an `Option`. + * + * @param data Option or Option Group + */ +export function isOption(data: Option | Optgroup): data is Option { + return !('options' in data); +}