From f44a2ba0ee2c20dc5b4dac4154cd88b0fea1d687 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 5 Apr 2023 09:59:22 -0400 Subject: [PATCH] Closes #12119: Lock & unlock dashboard layout --- netbox/project-static/dist/netbox.js | Bin 437842 -> 438231 bytes netbox/project-static/dist/netbox.js.map | Bin 401526 -> 401817 bytes netbox/project-static/src/dashboard.ts | 32 +++++++++++++++ netbox/templates/home.html | 50 +++++++++++++++-------- 4 files changed, 64 insertions(+), 18 deletions(-) diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 82215659f221d0ed7d21741d635563cac9d04e15..7f20abbd6379deb783bce50cf4679e32025cb2af 100644 GIT binary patch delta 3768 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 QjDJ07%1`9%wv=T38xN59(EtDd delta 3492 zcmYLLdvH@#8lSHuK}C64Tb|N{Qf}~&9v-4LJ=8X*?QQA%-Lh`HZElm>=AGM8S~|G9 zv+ArX3?ALM!|E!as65?hgP?~?ApE%V&c^H?GO^N9Uf4`Cp*3bzc~C%82Uu}>T|NR%JR7jHhl0=(kK=ih)~ zk$k}oy@~u?(*V|s#k>7bDIVSZs~g-h@uoPuDUN+RZx%IsR>3-P-yQ)YB6shT&?*vp zH$t0OvF`vhCcfR*0l*Wk7kl7VmrPtK=3ymTpi;&IlAY+3HTfmG(`5k055HudJX@ub zrV(3Ak7_}$&F+k<`cO1jpi^=AFH5YH1!Bk-rL1ZQ@A3c(2k{P4)@l5&3v99GUFWP1 zIQp4J#oEN8X;e}*gHVd%6{TWx;wh*T^rf*C^)hM5Y81;LhbZ$J5){e?49yw>4s|3P zis~^Iqh;|+vrKdHLe$Z3D5+~mCM_c7Le48hhygWOqiisW6ho9%8%ERwSRWNLCd!bwdE#a=C=)qL?4hjQfa|BM#kdCo z%tIyHpt?SW&XO~MnJo5B%s}=xCUT)hd^oXiag$7{vLHUnx(!L;jN|}iKEsV(Di$R3 zucu5lpnIt(OD>*8S(rLHRb{YV36qGQG%BRfPb#T+dgm=dB=FyDp<-dw}UiWJV}kXDHiBS-GKRTgGjj0oG-FZ^T>(I1rui)RP+Q4@LV_;-aiI zl~fX5;`qS>sL94dwp-H)qG*m-Xb9;xY>=|g%tgiPhwL+{eJrMxY1&#{yN9V-Nh=lq zIrP*WRMLG~%${Xz%e)x3XUyTDlsU3Ys}n;Iq29<;cevYJD3djT_~*rN%lw**%qGg3F(aI7uBCeo73U8xnVYfcHrqY6t5ND1 zN|`m9u)dy`16AVABfrjTmq}07l0wQ<52E!5*gxx$S!T1=FBQ_nKBiYZ4cOthpOE9q!%ezi=rEM*5}E(K*)Q?cP_v586@RO~ytcv`ni zqFJJDD!x2=J34sov3X0@V8_gUS(B-mn3n~;2-B5`RxM>+R4B(bO*i6UFDf#kqHAkw zG2+KoPwSG2Ka0_f@i=be!su~paji@|*)Khm>F7bCa>flMbBZLF&&6-vty>U{5O)^Fm+?fHvugB!)9n>oCgz)cTnckB{p9>*JUtq` zoW%_FhIy)ilU~kTMry6+=@C)M)9u5}#V=15qc)pP&Yj7PP+=cu>v?Ki;KxHJ7v&kR zQ{6o?goe3f^>Xp!$wdoe5z?B~Z5_%mqBO$O$rn&YNGlhs-&@+wjhwwY#8j=6mW>!9 zZbM*dFKIQNagNxpmX^z#Dy>k2@GN>;#)8I7>^T>2ym#lkw9YXsc`gMthhGhPb)TJt zG=>DZ@1MOxiIDOvh~i0`?aF|a&a^G21oP#KjY*X>osq)MP>BOeiCq4H_j_ zh#6^sR`Apech;nA5vB8P%8jJGg+LVuOoAFKS$ z99F(I9mIRCMUk;;US_2ws>WCc7njb=otnZgv08O)oV0T>=j% z#>PoU>R&^7TTMqLvo+XAH5U(@B{ks)k+bqWp7cJ@oi+#6UBlC(uZy!%`@DCdcM`Y+{rnJ=i*G+)h%4CiFP?<@#J(@=U~Y+! zb;GH)l(>BHw*U=dG{0#RP>sOCKQzH3QGnfa^VHpnF*AJUOPVE0~ zat=fi2fiNzs1PeJg!h91*2gj^y-25?8LYm`!RSse23{FF9z2`^_f3 zkkq99PMHFCnIM|1oCf-J5KJD-hsP&FEZMpMHctg_^5Rl>0bn@3sTdkyeeyyvTmW## z4=sboU|qaB+GG!(#h(Ak{p)o>FsJDGwfxWPNN8p zD%`@I19Za%nZ{2~G2JRtGBy;9DgA1Rm1edWKbDsQs{(pfDMnW*S=r?GJpj(u6;A@|%^G z9)JA1r!5olx3*cL^JB`e>h>rxUvEf>dT^yxH7jGmA-}(F7M2#)Eo}MX^@)y-+DoMluzGT2c!b(@adWo VY%iExv!>fSvWjijlw|W|2LLT-LpA^a delta 50 zcmV-20L}lI!x;9!7=VNUgaU*Egam{Iv<7b%m+uz_ke8Df21S==83xS)Lu!}c8wM7) IOd1AF2jLwNBme*a diff --git a/netbox/project-static/src/dashboard.ts b/netbox/project-static/src/dashboard.ts index b5d5da9e3..df200fffd 100644 --- a/netbox/project-static/src/dashboard.ts +++ b/netbox/project-static/src/dashboard.ts @@ -2,6 +2,20 @@ import { GridStack, GridStackOptions, GridStackWidget } from 'gridstack'; import { createToast } from './bs'; import { apiPatch, hasError } from './util'; +function lockDashboard(): void { + const dashboard = document.getElementById('dashboard') as any; + if (dashboard) { + dashboard.gridstack.disable(); + } +} + +function unlockDashboard(): void { + const dashboard = document.getElementById('dashboard') as any; + if (dashboard) { + dashboard.gridstack.enable(); + } +} + async function saveDashboardLayout( url: string, gridData: GridStackWidget[] | GridStackOptions, @@ -22,6 +36,8 @@ export function initDashboard(): void { // Initialize the grid let grid = GridStack.init({ cellHeight: 100, + disableDrag: true, + disableResize: true, draggable: { handle: '.grid-stack-item-content .card-header', appendTo: 'body', @@ -29,6 +45,22 @@ export function initDashboard(): void { } }); + // Create a listener for the dashboard lock button + const gridLockButton = document.getElementById('lock_dashboard') as HTMLButtonElement; + if (gridLockButton) { + gridLockButton.addEventListener('click', () => { + lockDashboard(); + }); + } + + // Create a listener for the dashboard unlock button + const gridUnlockButton = document.getElementById('unlock_dashboard') as HTMLButtonElement; + if (gridUnlockButton) { + gridUnlockButton.addEventListener('click', () => { + unlockDashboard(); + }); + } + // Create a listener for the dashboard save button const gridSaveButton = document.getElementById('save_dashboard') as HTMLButtonElement; if (gridSaveButton === null) { diff --git a/netbox/templates/home.html b/netbox/templates/home.html index 846ef9758..414ac3488 100644 --- a/netbox/templates/home.html +++ b/netbox/templates/home.html @@ -29,25 +29,39 @@ {% include 'extras/dashboard/widget.html' %} {% endfor %} -
-
- - Add Widget - +
+
+
+ +
-
- - - Reset Dashboard - +
+
+
+
+ +
+
{% endblock content-wrapper %}