@yinuo-ngm/server 1.0.15 → 1.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/plugins/error-handler.plugin.js +5 -0
- package/lib/routes/api-client/hub-token.routes.js +22 -0
- package/lib/routes/index.js +2 -0
- package/lib/routes/node-version.routes.d.ts +2 -0
- package/lib/routes/node-version.routes.js +56 -0
- package/lib/routes/project.routes.js +5 -0
- package/lib/routes/sprite-browse.routes.js +19 -5
- package/lib/routes/sprite.routes.js +17 -11
- package/lib/routes/static-files.routes.js +16 -0
- package/lib/routes/task.routes.js +7 -0
- package/package.json +3 -3
- package/www/3rdpartylicenses.txt +14 -66
- package/www/browser/chunk-2BZRE4G7.js +1 -0
- package/www/browser/chunk-2X3MRS27.js +1 -0
- package/www/browser/chunk-4KETC6EB.js +1 -0
- package/www/browser/chunk-5T5KA5PG.js +1 -0
- package/www/browser/chunk-6CGHNKJI.js +1 -0
- package/www/browser/chunk-76TVIB33.js +63 -0
- package/www/browser/chunk-7J24TP36.js +1 -0
- package/www/browser/chunk-ACAZUX6C.js +1 -0
- package/www/browser/chunk-B6MBYCXI.js +1 -0
- package/www/browser/chunk-BYEU6KGP.js +2 -0
- package/www/browser/chunk-CZ5AZ3VW.js +1 -0
- package/www/browser/chunk-DW7F5PEA.js +1 -0
- package/www/browser/chunk-DXF7BVK5.js +1 -0
- package/www/browser/chunk-EEVPZGEY.js +1 -0
- package/www/browser/chunk-G2W3B7TJ.js +1 -0
- package/www/browser/chunk-GDWS2L66.js +1 -0
- package/www/browser/chunk-HFZLJHYR.js +1 -0
- package/www/browser/chunk-HGONFYP6.js +1 -0
- package/www/browser/chunk-HHBPULJW.js +2 -0
- package/www/browser/chunk-HRXCR3IN.js +1 -0
- package/www/browser/chunk-INL2PELS.js +1 -0
- package/www/browser/chunk-JHMEKUZ5.js +1 -0
- package/www/browser/chunk-JU3TEDBV.js +37 -0
- package/www/browser/chunk-JZULA5JV.js +1 -0
- package/www/browser/chunk-KVFR7GFV.js +20 -0
- package/www/browser/chunk-L5D75AMV.js +1 -0
- package/www/browser/chunk-L7TMCSHV.js +1 -0
- package/www/browser/chunk-LQ5OXSW7.js +3 -0
- package/www/browser/chunk-MVQTKINJ.js +1 -0
- package/www/browser/chunk-N4LRZJBP.js +1 -0
- package/www/browser/chunk-O2EYEF7J.js +1 -0
- package/www/browser/chunk-OMDHJIUB.js +1 -0
- package/www/browser/chunk-OWUAAOHW.js +2 -0
- package/www/browser/chunk-PIK5YPIB.js +1 -0
- package/www/browser/chunk-RHLQRQDK.js +9 -0
- package/www/browser/chunk-RW2JPJV7.js +1 -0
- package/www/browser/chunk-S3SJ4VVM.js +11 -0
- package/www/browser/chunk-SIVPP74B.js +0 -0
- package/www/browser/chunk-SPRWNZHF.js +15 -0
- package/www/browser/chunk-SQQNR223.js +1 -0
- package/www/browser/chunk-SVQWPHF5.js +1 -0
- package/www/browser/chunk-SYCNSLAW.js +4 -0
- package/www/browser/chunk-T3KK7ZXB.js +2 -0
- package/www/browser/chunk-TMX5TTV3.js +1 -0
- package/www/browser/chunk-UFY3FLDK.js +1 -0
- package/www/browser/chunk-UJOHBN2Y.js +1 -0
- package/www/browser/chunk-UQGCUFNM.js +1 -0
- package/www/browser/chunk-UXXWRMM6.js +1 -0
- package/www/browser/chunk-UZRJGJTD.js +2 -0
- package/www/browser/chunk-WD4IAQR3.js +1 -0
- package/www/browser/chunk-WF2QTF5L.js +1 -0
- package/www/browser/chunk-WI67LAOV.js +4 -0
- package/www/browser/chunk-WNCM6QKB.js +1 -0
- package/www/browser/chunk-XJ5KZQNN.js +1 -0
- package/www/browser/chunk-YETDFSQE.js +1 -0
- package/www/browser/chunk-YMTC5GZK.js +1 -0
- package/www/browser/chunk-YVZHJ76K.js +1 -0
- package/www/browser/chunk-ZNTJRLVH.js +1 -0
- package/www/browser/dark.css +1 -30433
- package/www/browser/default.css +1 -30149
- package/www/browser/index.html +3 -3
- package/www/browser/main-6LN5C22E.js +34 -0
- package/www/browser/scripts-U25HCVEI.js +6 -0
- package/www/browser/styles-ROAHD7MY.css +1 -0
- package/www/browser/add-widget-drawer.component.css.map +0 -7
- package/www/browser/advanced-editor.component.css.map +0 -7
- package/www/browser/api-client.component.css.map +0 -7
- package/www/browser/api-history-drawer.component.css.map +0 -7
- package/www/browser/app.css.map +0 -7
- package/www/browser/attachment-viewer.component.css.map +0 -7
- package/www/browser/auth-editor.component.css.map +0 -7
- package/www/browser/body-editor.component.css.map +0 -7
- package/www/browser/chunk-2YSUXBGC.js +0 -627
- package/www/browser/chunk-2YSUXBGC.js.map +0 -1
- package/www/browser/chunk-3G2GEOPV.js +0 -456
- package/www/browser/chunk-3G2GEOPV.js.map +0 -1
- package/www/browser/chunk-3L72DF3R.js +0 -1683
- package/www/browser/chunk-3L72DF3R.js.map +0 -1
- package/www/browser/chunk-3MCIETCQ.js +0 -8279
- package/www/browser/chunk-3MCIETCQ.js.map +0 -1
- package/www/browser/chunk-665WC4RU.js +0 -5383
- package/www/browser/chunk-665WC4RU.js.map +0 -1
- package/www/browser/chunk-6QMSEZPT.js +0 -10044
- package/www/browser/chunk-6QMSEZPT.js.map +0 -1
- package/www/browser/chunk-6TBQERYX.js +0 -280
- package/www/browser/chunk-6TBQERYX.js.map +0 -1
- package/www/browser/chunk-6UW4MRJZ.js +0 -43
- package/www/browser/chunk-6UW4MRJZ.js.map +0 -7
- package/www/browser/chunk-6XUMIL3W.js +0 -5495
- package/www/browser/chunk-6XUMIL3W.js.map +0 -1
- package/www/browser/chunk-724YOJI3.js +0 -903
- package/www/browser/chunk-724YOJI3.js.map +0 -1
- package/www/browser/chunk-766T7YES.js +0 -437
- package/www/browser/chunk-766T7YES.js.map +0 -1
- package/www/browser/chunk-7FC7DN65.js +0 -728
- package/www/browser/chunk-7FC7DN65.js.map +0 -1
- package/www/browser/chunk-APGQRYWX.js +0 -156
- package/www/browser/chunk-APGQRYWX.js.map +0 -7
- package/www/browser/chunk-AQHSGTHS.js +0 -1960
- package/www/browser/chunk-AQHSGTHS.js.map +0 -1
- package/www/browser/chunk-CTOEAJQK.js +0 -40
- package/www/browser/chunk-CTOEAJQK.js.map +0 -7
- package/www/browser/chunk-DEGQJKKZ.js +0 -409
- package/www/browser/chunk-DEGQJKKZ.js.map +0 -1
- package/www/browser/chunk-DIJX2663.js +0 -1166
- package/www/browser/chunk-DIJX2663.js.map +0 -1
- package/www/browser/chunk-E4XD4GLT.js +0 -427
- package/www/browser/chunk-E4XD4GLT.js.map +0 -1
- package/www/browser/chunk-EQOY6A3M.js +0 -212
- package/www/browser/chunk-EQOY6A3M.js.map +0 -1
- package/www/browser/chunk-ETTBRXVA.js +0 -2643
- package/www/browser/chunk-ETTBRXVA.js.map +0 -1
- package/www/browser/chunk-FLSUSPBD.js +0 -5569
- package/www/browser/chunk-FLSUSPBD.js.map +0 -1
- package/www/browser/chunk-FZNHBEAZ.js +0 -102
- package/www/browser/chunk-FZNHBEAZ.js.map +0 -1
- package/www/browser/chunk-GJC7CZIJ.js +0 -361
- package/www/browser/chunk-GJC7CZIJ.js.map +0 -7
- package/www/browser/chunk-GMCNMOTD.js +0 -844
- package/www/browser/chunk-GMCNMOTD.js.map +0 -7
- package/www/browser/chunk-H43HGCRW.js +0 -198
- package/www/browser/chunk-H43HGCRW.js.map +0 -7
- package/www/browser/chunk-J447GBHM.js +0 -160
- package/www/browser/chunk-J447GBHM.js.map +0 -1
- package/www/browser/chunk-JN3VOWP7.js +0 -384
- package/www/browser/chunk-JN3VOWP7.js.map +0 -1
- package/www/browser/chunk-KSHAGY2M.js +0 -399
- package/www/browser/chunk-KSHAGY2M.js.map +0 -7
- package/www/browser/chunk-KV72AKOD.js +0 -59
- package/www/browser/chunk-KV72AKOD.js.map +0 -7
- package/www/browser/chunk-LAVMY2SJ.js +0 -26
- package/www/browser/chunk-LAVMY2SJ.js.map +0 -7
- package/www/browser/chunk-LLRVGHG5.js +0 -73
- package/www/browser/chunk-LLRVGHG5.js.map +0 -7
- package/www/browser/chunk-LPME4AJ3.js +0 -196
- package/www/browser/chunk-LPME4AJ3.js.map +0 -1
- package/www/browser/chunk-LVPSURVU.js +0 -4615
- package/www/browser/chunk-LVPSURVU.js.map +0 -1
- package/www/browser/chunk-MMPO7QLO.js +0 -4146
- package/www/browser/chunk-MMPO7QLO.js.map +0 -7
- package/www/browser/chunk-O7LB6VFM.js +0 -1953
- package/www/browser/chunk-O7LB6VFM.js.map +0 -1
- package/www/browser/chunk-P5CWA4FO.js +0 -685
- package/www/browser/chunk-P5CWA4FO.js.map +0 -1
- package/www/browser/chunk-RBWIWNTL.js +0 -203
- package/www/browser/chunk-RBWIWNTL.js.map +0 -7
- package/www/browser/chunk-RUXJCM3V.js +0 -26199
- package/www/browser/chunk-RUXJCM3V.js.map +0 -1
- package/www/browser/chunk-S77VVYUZ.js +0 -168
- package/www/browser/chunk-S77VVYUZ.js.map +0 -1
- package/www/browser/chunk-SCXPYFOB.js +0 -4316
- package/www/browser/chunk-SCXPYFOB.js.map +0 -1
- package/www/browser/chunk-SS73S33S.js +0 -471
- package/www/browser/chunk-SS73S33S.js.map +0 -7
- package/www/browser/chunk-T6UAOWNP.js +0 -600
- package/www/browser/chunk-T6UAOWNP.js.map +0 -1
- package/www/browser/chunk-TEW4MY4J.js +0 -148
- package/www/browser/chunk-TEW4MY4J.js.map +0 -7
- package/www/browser/chunk-TVORF3SF.js +0 -82
- package/www/browser/chunk-TVORF3SF.js.map +0 -7
- package/www/browser/chunk-UAN42EUZ.js +0 -2147
- package/www/browser/chunk-UAN42EUZ.js.map +0 -1
- package/www/browser/chunk-ULOHDK7Y.js +0 -1
- package/www/browser/chunk-ULOHDK7Y.js.map +0 -7
- package/www/browser/chunk-UYJ3FVRV.js +0 -3978
- package/www/browser/chunk-UYJ3FVRV.js.map +0 -1
- package/www/browser/chunk-VXHZMSDM.js +0 -5509
- package/www/browser/chunk-VXHZMSDM.js.map +0 -1
- package/www/browser/chunk-VYNQPZQO.js +0 -281
- package/www/browser/chunk-VYNQPZQO.js.map +0 -1
- package/www/browser/chunk-W3J23PZI.js +0 -9213
- package/www/browser/chunk-W3J23PZI.js.map +0 -1
- package/www/browser/chunk-W5HGHCQT.js +0 -1642
- package/www/browser/chunk-W5HGHCQT.js.map +0 -7
- package/www/browser/chunk-XF5H7E4L.js +0 -4723
- package/www/browser/chunk-XF5H7E4L.js.map +0 -1
- package/www/browser/chunk-XNFNEBMY.js +0 -398
- package/www/browser/chunk-XNFNEBMY.js.map +0 -7
- package/www/browser/chunk-XQY5SPGI.js +0 -30811
- package/www/browser/chunk-XQY5SPGI.js.map +0 -1
- package/www/browser/chunk-Y7JBZHNK.js +0 -514
- package/www/browser/chunk-Y7JBZHNK.js.map +0 -1
- package/www/browser/chunk-YWHRP4X3.js +0 -406
- package/www/browser/chunk-YWHRP4X3.js.map +0 -1
- package/www/browser/chunk-Z7FJIV62.js +0 -95
- package/www/browser/chunk-Z7FJIV62.js.map +0 -7
- package/www/browser/chunk-ZBZHXS46.js +0 -1674
- package/www/browser/chunk-ZBZHXS46.js.map +0 -1
- package/www/browser/chunk-ZZA5NVAI.js +0 -735
- package/www/browser/chunk-ZZA5NVAI.js.map +0 -1
- package/www/browser/collection-modal.component.css.map +0 -7
- package/www/browser/collection-tree-item.component.css.map +0 -7
- package/www/browser/collection-tree.component.css.map +0 -7
- package/www/browser/config-change-bar-component.css.map +0 -7
- package/www/browser/config-item-component.css.map +0 -7
- package/www/browser/config-nav-component.css.map +0 -7
- package/www/browser/config-section-component.css.map +0 -7
- package/www/browser/create-summary-aside.component.css.map +0 -7
- package/www/browser/curl-actions.component.css.map +0 -7
- package/www/browser/dark.css.map +0 -7
- package/www/browser/dashboard-canvas.component.css.map +0 -7
- package/www/browser/dashboard.component.css.map +0 -7
- package/www/browser/default.css.map +0 -7
- package/www/browser/detail-item-card.component.css.map +0 -7
- package/www/browser/ellipsis-text.component.css.map +0 -7
- package/www/browser/env-modal.component.css.map +0 -7
- package/www/browser/env-picker.component.css.map +0 -7
- package/www/browser/feedback.component.css.map +0 -7
- package/www/browser/fs-explorer.component.css.map +0 -7
- package/www/browser/git-import-modal.component.css.map +0 -7
- package/www/browser/hub-v2-personal-token-modal.component.css.map +0 -7
- package/www/browser/issue-action-area.component.css.map +0 -7
- package/www/browser/issue-add-participants-dialog.component.css.map +0 -7
- package/www/browser/issue-assign-dialog.component.css.map +0 -7
- package/www/browser/issue-attachment-area.component.css.map +0 -7
- package/www/browser/issue-base-info-area.component.css.map +0 -7
- package/www/browser/issue-branches.component.css.map +0 -7
- package/www/browser/issue-close-dialog.component.css.map +0 -7
- package/www/browser/issue-collaborators-panel.component.css.map +0 -7
- package/www/browser/issue-comment-editor.component.css.map +0 -7
- package/www/browser/issue-create-branch-dialog.component.css.map +0 -7
- package/www/browser/issue-description-area.component.css.map +0 -7
- package/www/browser/issue-detail.component.css.map +0 -7
- package/www/browser/issue-resolve-dialog.component.css.map +0 -7
- package/www/browser/issue-start-own-branch-dialog.component.css.map +0 -7
- package/www/browser/issues-list-table.component.css.map +0 -7
- package/www/browser/issues.component.css.map +0 -7
- package/www/browser/kill-port-widget.component.css.map +0 -7
- package/www/browser/kv-table.component.css.map +0 -7
- package/www/browser/layout-footer.component.css.map +0 -7
- package/www/browser/layout-header.component.css.map +0 -7
- package/www/browser/layout-menu.component.css.map +0 -7
- package/www/browser/layout-project-nav.component.css.map +0 -7
- package/www/browser/layout-sidebar.component.css.map +0 -7
- package/www/browser/layout.component.css.map +0 -7
- package/www/browser/less-viewport-component.css.map +0 -7
- package/www/browser/main.js +0 -1872
- package/www/browser/main.js.map +0 -1
- package/www/browser/markdown-viewer.component.css.map +0 -7
- package/www/browser/news-feed-widget.component.css.map +0 -7
- package/www/browser/ng-devtool.component.css.map +0 -7
- package/www/browser/nginx-config-editor.component.css.map +0 -7
- package/www/browser/nginx-log-viewer.component.css.map +0 -7
- package/www/browser/nginx-secondary-logs-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-perf-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-settings-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-ssl-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-test-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-traffic-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-upstream-tab.component.css.map +0 -7
- package/www/browser/nginx-section-card.component.css.map +0 -7
- package/www/browser/nginx-server-drawer.component.css.map +0 -7
- package/www/browser/nginx-server-list.component.css.map +0 -7
- package/www/browser/nginx-stat-card.component.css.map +0 -7
- package/www/browser/nginx.component.css.map +0 -7
- package/www/browser/page-layout.component.css.map +0 -7
- package/www/browser/pick-workspace-modal.component.css.map +0 -7
- package/www/browser/polyfills.js +0 -26584
- package/www/browser/polyfills.js.map +0 -7
- package/www/browser/project-conf.component.css.map +0 -7
- package/www/browser/project-create-modal.component.css.map +0 -7
- package/www/browser/project-create.component.css.map +0 -7
- package/www/browser/project-deps.component.css.map +0 -7
- package/www/browser/project-edit-modal.component.css.map +0 -7
- package/www/browser/project-import.component.css.map +0 -7
- package/www/browser/project-item-popover.component.css.map +0 -7
- package/www/browser/project-item.component.css.map +0 -7
- package/www/browser/project-list.component.css.map +0 -7
- package/www/browser/projects.component.css.map +0 -7
- package/www/browser/quick-task-widget.component.css.map +0 -7
- package/www/browser/rd-action-area.component.css.map +0 -7
- package/www/browser/rd-advance-stage-dialog.component.css.map +0 -7
- package/www/browser/rd-block-dialog.component.css.map +0 -7
- package/www/browser/rd-create-dialog.component.css.map +0 -7
- package/www/browser/rd-detail.component.css.map +0 -7
- package/www/browser/rd-item-card.component.css.map +0 -7
- package/www/browser/rd-list-board.component.css.map +0 -7
- package/www/browser/rd-list-table.component.css.map +0 -7
- package/www/browser/rd.component.css.map +0 -7
- package/www/browser/request-collections.component.css.map +0 -7
- package/www/browser/request-editor.component.css.map +0 -7
- package/www/browser/request-list-item.component.css.map +0 -7
- package/www/browser/request-list.component.css.map +0 -7
- package/www/browser/request-tabs-bar.component.css.map +0 -7
- package/www/browser/request-tabs.component.css.map +0 -7
- package/www/browser/request-urlbar.component.css.map +0 -7
- package/www/browser/response-viewer.component.css.map +0 -7
- package/www/browser/scripts.js +0 -245
- package/www/browser/scripts.js.map +0 -7
- package/www/browser/setting.component.css.map +0 -7
- package/www/browser/sprite-conf-modal.component.css.map +0 -7
- package/www/browser/sprite-icons-panel-component.css.map +0 -7
- package/www/browser/sprite-images-panel-component.css.map +0 -7
- package/www/browser/sprite-result-tabs.component.css.map +0 -7
- package/www/browser/sprite-viewport-component.css.map +0 -7
- package/www/browser/sprite.component.css.map +0 -7
- package/www/browser/step-advance.component.css.map +0 -7
- package/www/browser/step-basic.component.css.map +0 -7
- package/www/browser/step-config.component.css.map +0 -7
- package/www/browser/step-features.component.css.map +0 -7
- package/www/browser/step-preset.component.css.map +0 -7
- package/www/browser/step-summary-aside.component.css.map +0 -7
- package/www/browser/styles.css +0 -258
- package/www/browser/styles.css.map +0 -7
- package/www/browser/system-log.component.css.map +0 -7
- package/www/browser/task-actions.component.css.map +0 -7
- package/www/browser/task-console.component.css.map +0 -7
- package/www/browser/task-header.component.css.map +0 -7
- package/www/browser/task-list.component.css.map +0 -7
- package/www/browser/tasks.component.css.map +0 -7
- package/www/browser/terminal-view.component.css.map +0 -7
- package/www/browser/welcome-widget.component.css.map +0 -7
- package/www/browser/widget-base.component.css.map +0 -7
- package/www/browser/widget-host.component.css.map +0 -7
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["angular:jit:style:inline:src\\app\\pages\\dashboard\\dashboard.component.ts;CiAgICA6aG9zdHsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjJzOwogICAgfQogICAgOmhvc3QuY29sbGFwc2VkIHsKICAgICAgd2lkdGg6IGNhbGMoMTAwJSAtIDM2MHB4KTsKICAgIH0KICAgIC5zaWRlLXBhbmVsIHsKICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB0b3A6IDA7CiAgICAgIHJpZ2h0OiAwOwogICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICB3aWR0aDogMzYwcHg7CiAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgIGJveC1zaGFkb3c6IC04cHggMCAyNHB4IHJnYmEoMCwwLDAsLjEyKTsKICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpOwogICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycyBlYXNlOwogICAgICB6LWluZGV4OiAxMDAwOwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgfQogICAgLnNpZGUtcGFuZWwub3BlbiB7CiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTsKICAgIH0KCiAgICAuc2lkZS1oZWFkZXJ7CiAgICAgIGhlaWdodDogNTZweDsKICAgICAgcGFkZGluZzogMCAxMnB4OwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDAsMCwwLC4wNik7CiAgICB9CiAgICAuc2lkZS1ib2R5ewogICAgICBmbGV4OiAxOwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgfQogIA==","angular:jit:style:src\\app\\pages\\dashboard\\components\\add-widget-drawer\\add-widget-drawer.component.less","src/app/pages/dashboard/services/dashboard-api.service.ts","src/app/pages/dashboard/services/dashboard-layout.service.ts","src/app/pages/dashboard/components/add-widget-drawer/add-widget-drawer.component.ts","angular:jit:style:inline:src\\app\\pages\\dashboard\\components\\dashboard-canvas\\dashboard-canvas.component.ts;CiAgICA6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyBoZWlnaHQ6IDEwMCU7IH0KICAgIGdyaWRzdGVyIHsgZGlzcGxheTpibG9jazsgaGVpZ2h0OjEwMCU7YmFja2dyb3VuZDogdmFyKC0tYXBwLXByaW1hcnktMSk7IH0KICAgIGdyaWRzdGVyLWl0ZW17CiAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICB9CiAgICAuY2FyZCB7CiAgICAgIGhlaWdodDogMTAwJTsKICAgICAgYmFja2dyb3VuZDogI2ZmZjsKICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgYm94LXNoYWRvdzogMCAycHggMTBweCByZ2JhKDAsMCwwLC4wNik7CiAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIH0KCiAgICAuY2FyZC5lZGl0LW1vZGUgeyB1c2VyLXNlbGVjdDogbm9uZTsgfQoKICAgIC8qIG92ZXJsYXkg5Y+q5YGa6KeG6KeJ5bGC77yM5LiN5oum5oiq5LqL5Lu2ICovCiAgICAuY2FyZC1vdmVybGF5ewogICAgICBwb3NpdGlvbjphYnNvbHV0ZTsgaW5zZXQ6MDsKICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjU1KTsKICAgICAgZGlzcGxheTpmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyBhbGlnbi1pdGVtczpjZW50ZXI7CiAgICAgIHBvaW50ZXItZXZlbnRzOm5vbmU7CiAgICAgIHotaW5kZXg6IDI7CiAgICB9CiAgICAucmVtb3ZlLWJ1dHRvbnsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICByaWdodDogMTZweDsKICAgICAgdG9wOiAxNnB4OwogICAgICB6LWluZGV4OiAzOwogICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hcHAtcHJpbWFyeS0xKTsKICAgICAgY29sb3I6IHZhcigtLWFwcC1wcmltYXJ5KTsKICAgICAgdHJhbnNpdGlvbjogYWxsIDAuM3M7CiAgICAgICY6aG92ZXJ7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYXBwLXByaW1hcnkpOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICB9CiAgICAuY2FyZC1vdmVybGF5IGJ1dHRvbiB7IHBvaW50ZXItZXZlbnRzOm5vbmU7IGJvcmRlci1yYWRpdXM6IDIwcHg7IH0KICAgIC50aXRsZXsgZm9udC1zaXplOiAxMnB4OyBjb2xvcjogcmdiYSgwLDAsMCwuNzUpOyB9CgogICAgLmNhcmQtYm9keXsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICBoZWlnaHQ6IDEwMCU7CiAgICB9CiAgICAuY2FyZC5lZGl0LW1vZGUgLmNhcmQtYm9keSB7Y3Vyc29yOiBtb3ZlO3BvaW50ZXItZXZlbnRzOiBub25lO29wYWNpdHk6IDAuODt9CiAg","node_modules/angular-gridster2/fesm2022/angular-gridster2.mjs","angular:jit:style:inline:src\\app\\pages\\dashboard\\components\\widget-host\\widget-host.component.ts;CiAgICA6aG9zdCB7IGRpc3BsYXk6YmxvY2s7IHdpZHRoOjEwMCU7IGhlaWdodDoxMDAlOyB9CiAgICAud2lkZ2V0LXNoZWxsIHsgd2lkdGg6MTAwJTsgaGVpZ2h0OjEwMCU7IH0KICAgIC53aWRnZXQtc2hlbGxbZGF0YS1maXQ9InNjcm9sbCJdIHsgb3ZlcmZsb3c6IGF1dG87IH0KICAgIC53aWRnZXQtc2hlbGxbZGF0YS1maXQ9InJlc3BvbnNpdmUiXSB7IG92ZXJmbG93OiBoaWRkZW47IH0KICAgIC53aWRnZXQtc2hlbGxbZGF0YS1maXQ9InNjYWxlIl0geyBvdmVyZmxvdzogaGlkZGVuOyB9CiAgICAud2lkZ2V0LXNjYWxlIHsgd2lkdGg6MTAwJTsgaGVpZ2h0OjEwMCU7IH0KICAgIA==","angular:jit:style:inline:src\\app\\pages\\dashboard\\components\\widgets\\kill-port\\kill-port-widget.component.ts;CiAgICAgIC5sb2dvIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgcGFkZGluZzogMTJweCAyNHB4OwogICAgICAgIC5pY29uLXdyYXBwZXJ7CiAgICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICAgIGZsZXg6IDAgMCBhdXRvOwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFwcC1ncmF5KTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJSA1MCU7CiAgICAgICAgICBuei1pY29uIHsKICAgICAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgICAgIGNvbG9yOiB2YXIoLS1hcHAtcHJpbWFyeS01KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaDN7CiAgICAgICAgICBmbGV4OjEgMSBhdXRvOwogICAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgICAgbWFyZ2luOiAwOwogICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB9CiAgICAgIH0KICAgIA==","angular:jit:style:inline:src\\app\\pages\\dashboard\\components\\widgets\\widget-base.component.ts;CiAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgfQoKICAgIC53aWRnZXQgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBwYWRkaW5nOiAxMnB4IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgfQogICAgLmhlYWRlciB7CiAgICAgICAgZmxleCA6IDAgMCBhdXRvOwogICAgICAgIHBhZGRpbmc6MCAgMTZweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgfQogICAgLnRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICB9CgogICAgLmFjdGlvbnMgewogICAgICAgIGZsZXg6IDAgMCBhdXRvOwogICAgfQoKICAgIC5jb250ZW50IHsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47IAogICAgfQogIA==","src/app/pages/dashboard/components/widgets/widget-base.component.ts","src/app/pages/dashboard/components/widgets/kill-port/kill-port-widget.component.ts","angular:jit:template:src\\app\\pages\\dashboard\\components\\widgets\\news-feed\\news-feed-widget.component.html","angular:jit:style:src\\app\\pages\\dashboard\\components\\widgets\\news-feed\\news-feed-widget.component.less","src/app/pages/dashboard/services/rss.service.ts","src/app/pages/dashboard/components/widgets/news-feed/news-feed-widget.component.ts","angular:jit:template:src\\app\\pages\\dashboard\\components\\widgets\\quick-task\\quick-task-widget.component.html","angular:jit:style:src\\app\\pages\\dashboard\\components\\widgets\\quick-task\\quick-task-widget.component.less","src/app/pages/dashboard/components/widgets/quick-task/quick-task-widget.component.ts","angular:jit:style:src\\app\\pages\\dashboard\\components\\widgets\\welcome\\welcome-widget.component.less","src/app/pages/dashboard/components/widgets/welcome/welcome-widget.component.ts","src/app/pages/dashboard/components/widget-host/widget-host.component.ts","src/app/pages/dashboard/components/dashboard-canvas/dashboard-canvas.component.ts","src/app/pages/dashboard/dashboard.component.ts"],"sourcesContent":["/* angular:styles/component:less;d3a924ccfa0f5b8e2ab6167ab3b23f602bd22a2b18b4453a2443a23049360ad0;D:\\ng-manager\\webapp\\src\\app\\pages\\dashboard\\dashboard.component.ts */\n:host {\n height: 100%;\n display: block;\n position: relative;\n transition: width 0.2s;\n}\n:host.collapsed {\n width: calc(100% - 360px);\n}\n.side-panel {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n width: 360px;\n background: #fff;\n box-shadow: -8px 0 24px rgba(0, 0, 0, 0.12);\n transform: translateX(100%);\n transition: transform 0.2s ease;\n z-index: 1000;\n display: flex;\n flex-direction: column;\n}\n.side-panel.open {\n transform: translateX(0);\n}\n.side-header {\n height: 56px;\n padding: 0 12px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n border-bottom: 1px solid rgba(0, 0, 0, 0.06);\n}\n.side-body {\n flex: 1;\n overflow: hidden;\n}\n/*# sourceMappingURL=dashboard.component.css.map */\n","/* src/app/pages/dashboard/components/add-widget-drawer/add-widget-drawer.component.less */\n.list {\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n}\n.list .topbar {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 16px;\n}\n.list .topbar nz-input-wrapper {\n width: 100%;\n border-radius: 18px;\n}\n.list .items {\n flex: 1 1 auto;\n overflow: auto;\n height: 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 8px;\n overflow-x: hidden;\n overflow-y: auto;\n}\n.list .items .item {\n border-radius: 3px;\n padding: 10px 10px;\n cursor: pointer;\n}\n.list .items .item:hover,\n.list .items .item.active {\n background: var(--app-primary-3);\n}\n.list .items .item .row {\n display: flex;\n gap: 10px;\n align-items: center;\n overflow: hidden;\n justify-content: space-between;\n}\n.list .items .item .row .icon {\n font-size: 28px;\n flex: 0 0 auto;\n position: relative;\n border-radius: 50% 50%;\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--app-primary-1);\n}\n.list .items .item .row .info {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n gap: 4px;\n overflow: hidden;\n}\n.list .items .item .row .info .name {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.list .items .item .row .info .description {\n font-size: 13px;\n color: var(--app-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.list .items .item .row .actions {\n flex: 0 0 auto;\n}\n/*# sourceMappingURL=add-widget-drawer.component.css.map */\n","import { inject, Injectable } from '@angular/core';\r\nimport { ApiClient } from '@core/api';\r\nimport { Observable } from 'rxjs';\r\nimport { DashboardDocV1, DashboardItem, DashboardItemConfig, KillPortResult, WidgetKey } from '../dashboard.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DashboardApiService {\r\n private api: ApiClient = inject(ApiClient);\r\n\r\n getInfo(projectId: string): Observable<DashboardDocV1> {\r\n return this.api.get<DashboardDocV1>(`/api/dashboard/getInfo/${projectId}`)\r\n }\r\n\r\n update(projectId: string, doc: DashboardDocV1): Observable<DashboardDocV1> {\r\n return this.api.post<DashboardDocV1>(`/api/dashboard/update/${projectId}`, doc);\r\n }\r\n\r\n widgets(projectId: string): Observable<DashboardItem[]> {\r\n return this.api.get<DashboardItem[]>(`/api/dashboard/widgets/${projectId}`);\r\n }\r\n\r\n addWidget(projectId: string, data: { widgetKey: WidgetKey, x: number, y: number }): Observable<DashboardDocV1> {\r\n const { x, y } = data;\r\n return this.api.get<DashboardDocV1>(`/api/dashboard/addWidget/${projectId}/${data.widgetKey}/${x}/${y}`);\r\n }\r\n\r\n removeWidget(projectId: string, widgetId: string): Observable<DashboardDocV1> {\r\n return this.api.delete<DashboardDocV1>(`/api/dashboard/removeWidget/${projectId}/${widgetId}`);\r\n }\r\n\r\n updateItemConfig(projectId: string, widgetId: string, config: DashboardItemConfig): Observable<DashboardDocV1> {\r\n return this.api.post<DashboardDocV1>(`/api/dashboard/updateItemConfig/${projectId}/${widgetId}`, config);\r\n }\r\n\r\n killPort(port: number): Observable<KillPortResult> {\r\n return this.api.get<KillPortResult>(`/api/dashboard/killPort/${port}`);\r\n }\r\n}","import { computed, inject, Injectable, signal } from \"@angular/core\";\r\nimport { firstValueFrom } from \"rxjs/internal/firstValueFrom\";\r\nimport { DashboardDocV1, DashboardItem, DashboardItemConfig } from \"../dashboard.model\";\r\nimport { DashboardApiService } from \"./dashboard-api.service\";\r\n@Injectable({ providedIn: \"root\" })\r\nexport class DashboardLayoutService {\r\n private api: DashboardApiService = inject(DashboardApiService);\r\n\r\n private _doc = signal<DashboardDocV1 | null>(null);\r\n\r\n\r\n items = computed(() => this._doc()?.items ?? []);\r\n\r\n updatedAt = computed(() => this._doc()?.updatedAt ?? 0);\r\n\r\n widgets = signal<DashboardItem[]>([]);\r\n\r\n private saveTimer: any = null;\r\n\r\n async load(projectId: string) {\r\n try {\r\n const doc = await firstValueFrom(\r\n this.api.getInfo(projectId)\r\n );\r\n this._doc.set(doc);\r\n return;\r\n } catch {\r\n this._doc.set({\r\n version: 1,\r\n projectId,\r\n updatedAt: Date.now(),\r\n items: [],\r\n });\r\n }\r\n }\r\n\r\n setItems(projectId: string, items: DashboardItem[]) {\r\n const cur = this._doc();\r\n if (!cur) return;\r\n this._doc.set({ ...cur, items });\r\n // 编辑中自动保存(debounce)\r\n this.scheduleAutoSave(projectId);\r\n }\r\n\r\n /**\r\n * 调度一次自动保存(防抖)\r\n * @param projectId \r\n * @param ms 毫秒,默认 10 秒\r\n */\r\n scheduleAutoSave(projectId: string, ms = 10_000) {\r\n if (this.saveTimer) clearTimeout(this.saveTimer);\r\n this.saveTimer = setTimeout(() => {\r\n this.flushSave(projectId).catch(() => void 0);\r\n }, ms);\r\n }\r\n\r\n async flushSave(projectId: string) {\r\n if (this.saveTimer) {\r\n clearTimeout(this.saveTimer);\r\n this.saveTimer = null;\r\n }\r\n const doc = this._doc();\r\n if (!doc) return;\r\n const saved = await firstValueFrom(\r\n this.api.update(projectId, doc)\r\n );\r\n this._doc.set(saved);\r\n return;\r\n }\r\n\r\n add(widget: DashboardItem) {\r\n console.log('add widget', widget);\r\n const cur = this._doc();\r\n if (!cur) return;\r\n\r\n this._doc.set({\r\n ...cur,\r\n items: [...cur.items, widget],\r\n });\r\n\r\n setTimeout(() => {\r\n const { x, y } = widget;\r\n this.api.addWidget(cur.projectId, {\r\n widgetKey: widget.key,\r\n x,\r\n y,\r\n }).subscribe(doc => {\r\n this._doc.set(doc);\r\n this.getWidgets();\r\n });\r\n }, 0);\r\n\r\n }\r\n\r\n remove(widgetId: string) {\r\n const cur = this._doc();\r\n if (!cur) return;\r\n this.api.removeWidget(cur.projectId, widgetId).subscribe(\r\n doc => {\r\n this._doc.set(doc);\r\n this.getWidgets();\r\n },\r\n );\r\n }\r\n\r\n killProcess(port: string) {\r\n this.api.killPort(Number(port)).subscribe(res => {\r\n console.log('Killed port', port);\r\n });\r\n }\r\n\r\n getWidgets() {\r\n const cur = this._doc();;\r\n if (!cur) return;\r\n this.api.widgets(cur.projectId).subscribe(\r\n widgets => {\r\n this.widgets.set(widgets);\r\n }\r\n );\r\n }\r\n updateConfig(projectId: string, widgetId: string, config: DashboardItemConfig) {\r\n const cur = this._doc();\r\n if (!cur) return;\r\n this.api.updateItemConfig(projectId, widgetId, config).subscribe(\r\n doc => {\r\n this._doc.set(doc);\r\n },\r\n );\r\n }\r\n}\r\n\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, computed, EventEmitter, inject, Output, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { DashboardLayoutService } from '@pages/dashboard/services/dashboard-layout.service';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzTooltipModule } from 'ng-zorro-antd/tooltip';\r\nimport { DashboardItem } from '../../dashboard.model';\r\n\r\n@Component({\r\n selector: 'app-add-widget-drawer',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n NzIconModule,\r\n NzInputModule,\r\n NzButtonModule,\r\n NzTooltipModule,\r\n ],\r\n template: `\r\n <div class=\"list\">\r\n <div class=\"topbar\">\r\n <nz-input-wrapper>\r\n <nz-icon class=\"search-icon\" nzInputPrefix nzType=\"search\" />\r\n <input\r\n nz-input\r\n placeholder=\"\"\r\n [ngModel]=\"keyword()\"\r\n (ngModelChange)=\"keyword.set($event)\"\r\n />\r\n </nz-input-wrapper>\r\n </div>\r\n <div class=\"items\">\r\n @for (it of filtered(); track it.key) {\r\n <div\r\n class=\"item\"\r\n >\r\n <div class=\"row\">\r\n <div class=\"icon\">\r\n <nz-icon\r\n [nzType]=\"it.icon || 'appstore'\"\r\n nzTheme=\"outline\"\r\n />\r\n </div>\r\n <div class=\"info\">\r\n <div class=\"name\">{{ it.title }}</div>\r\n <div class=\"description\">{{ it.desc }}</div>\r\n </div>\r\n <div class=\"actions\">\r\n <button nz-button nzType=\"primary\" nzSize=\"small\" nzTooltip=\"添加部件\" (click)=\"addWidget(it)\">\r\n <nz-icon nzType=\"plus\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n `,\r\n styleUrls: ['./add-widget-drawer.component.less']\r\n})\r\nexport class AddWidgetDrawerComponent {\r\n private layout: DashboardLayoutService = inject(DashboardLayoutService);\r\n @Output() add = new EventEmitter<DashboardItem>();\r\n keyword = signal(\"\");\r\n\r\n widgets = this.layout.widgets\r\n\r\n filtered = computed(() => {\r\n const k = this.keyword().trim().toLowerCase();\r\n if (!k) return this.widgets();\r\n return this.widgets().filter(w => (w.title + (w.desc ?? \"\")).toLowerCase().includes(k));\r\n });\r\n\r\n constructor() { }\r\n\r\n addWidget(widget: DashboardItem) {\r\n this.add.emit(widget);\r\n }\r\n}\r\n","/* angular:styles/component:less;3ab85a83069fb8a7a44891e4777bc7750f9c48bc10e18ecb82108c144f5f463c;D:\\ng-manager\\webapp\\src\\app\\pages\\dashboard\\components\\dashboard-canvas\\dashboard-canvas.component.ts */\n:host {\n display: block;\n height: 100%;\n}\ngridster {\n display: block;\n height: 100%;\n background: var(--app-primary-1);\n}\ngridster-item {\n border-radius: 10px;\n}\n.card {\n height: 100%;\n background: #fff;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n position: relative;\n}\n.card.edit-mode {\n -webkit-user-select: none;\n user-select: none;\n}\n.card-overlay {\n position: absolute;\n inset: 0;\n background: rgba(255, 255, 255, 0.55);\n display: flex;\n justify-content: center;\n align-items: center;\n pointer-events: none;\n z-index: 2;\n}\n.remove-button {\n position: absolute;\n right: 16px;\n top: 16px;\n z-index: 3;\n background: var(--app-primary-1);\n color: var(--app-primary);\n transition: all 0.3s;\n}\n.remove-button:hover {\n background: var(--app-primary);\n color: #fff;\n}\n.card-overlay button {\n pointer-events: none;\n border-radius: 20px;\n}\n.title {\n font-size: 12px;\n color: rgba(0, 0, 0, 0.75);\n}\n.card-body {\n position: relative;\n height: 100%;\n}\n.card.edit-mode .card-body {\n cursor: move;\n pointer-events: none;\n opacity: 0.8;\n}\n/*# sourceMappingURL=dashboard-canvas.component.css.map */\n","import { NgStyle } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { Input, ViewEncapsulation, Component, viewChild, ElementRef, Renderer2, ChangeDetectorRef, NgZone, Inject, EventEmitter, HostBinding, Output, NgModule } from '@angular/core';\nimport { Subject, debounceTime, takeUntil, switchMap, timer } from 'rxjs';\n\nvar GridType;\n(function (GridType) {\n GridType[\"Fit\"] = \"fit\";\n GridType[\"ScrollVertical\"] = \"scrollVertical\";\n GridType[\"ScrollHorizontal\"] = \"scrollHorizontal\";\n GridType[\"Fixed\"] = \"fixed\";\n GridType[\"VerticalFixed\"] = \"verticalFixed\";\n GridType[\"HorizontalFixed\"] = \"horizontalFixed\";\n})(GridType || (GridType = {}));\nvar DisplayGrid;\n(function (DisplayGrid) {\n DisplayGrid[\"Always\"] = \"always\";\n DisplayGrid[\"OnDragAndResize\"] = \"onDrag&Resize\";\n DisplayGrid[\"None\"] = \"none\";\n})(DisplayGrid || (DisplayGrid = {}));\nvar CompactType;\n(function (CompactType) {\n CompactType[\"None\"] = \"none\";\n CompactType[\"CompactUp\"] = \"compactUp\";\n CompactType[\"CompactLeft\"] = \"compactLeft\";\n CompactType[\"CompactUpAndLeft\"] = \"compactUp&Left\";\n CompactType[\"CompactLeftAndUp\"] = \"compactLeft&Up\";\n CompactType[\"CompactRight\"] = \"compactRight\";\n CompactType[\"CompactUpAndRight\"] = \"compactUp&Right\";\n CompactType[\"CompactRightAndUp\"] = \"compactRight&Up\";\n CompactType[\"CompactDown\"] = \"compactDown\";\n CompactType[\"CompactDownAndLeft\"] = \"compactDown&Left\";\n CompactType[\"CompactLeftAndDown\"] = \"compactLeft&Down\";\n CompactType[\"CompactDownAndRight\"] = \"compactDown&Right\";\n CompactType[\"CompactRightAndDown\"] = \"compactRight&Down\";\n CompactType[\"CompactGrid\"] = \"compactGrid\";\n})(CompactType || (CompactType = {}));\nvar DirTypes;\n(function (DirTypes) {\n DirTypes[\"LTR\"] = \"ltr\";\n DirTypes[\"RTL\"] = \"rtl\";\n})(DirTypes || (DirTypes = {}));\n\nclass GridsterCompact {\n gridster;\n constructor(gridster) {\n this.gridster = gridster;\n }\n destroy() {\n this.gridster = null;\n }\n checkCompact() {\n if (this.gridster.$options.compactType !== CompactType.None) {\n if (this.gridster.$options.compactType === CompactType.CompactUp) {\n this.checkCompactMovement('y', -1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactLeft) {\n this.checkCompactMovement('x', -1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactUpAndLeft) {\n this.checkCompactMovement('y', -1);\n this.checkCompactMovement('x', -1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactLeftAndUp) {\n this.checkCompactMovement('x', -1);\n this.checkCompactMovement('y', -1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactRight) {\n this.checkCompactMovement('x', 1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactUpAndRight) {\n this.checkCompactMovement('y', -1);\n this.checkCompactMovement('x', 1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactRightAndUp) {\n this.checkCompactMovement('x', 1);\n this.checkCompactMovement('y', -1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactDown) {\n this.checkCompactMovement('y', 1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactDownAndLeft) {\n this.checkCompactMovement('y', 1);\n this.checkCompactMovement('x', -1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactDownAndRight) {\n this.checkCompactMovement('y', 1);\n this.checkCompactMovement('x', 1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactLeftAndDown) {\n this.checkCompactMovement('x', -1);\n this.checkCompactMovement('y', 1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactRightAndDown) {\n this.checkCompactMovement('x', 1);\n this.checkCompactMovement('y', 1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactGrid) {\n this.checkCompactGrid();\n }\n }\n }\n checkCompactItem(item) {\n if (this.gridster.$options.compactType !== CompactType.None) {\n if (this.gridster.$options.compactType === CompactType.CompactUp) {\n this.moveTillCollision(item, 'y', -1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactLeft) {\n this.moveTillCollision(item, 'x', -1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactUpAndLeft) {\n this.moveTillCollision(item, 'y', -1);\n this.moveTillCollision(item, 'x', -1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactLeftAndUp) {\n this.moveTillCollision(item, 'x', -1);\n this.moveTillCollision(item, 'y', -1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactUpAndRight) {\n this.moveTillCollision(item, 'y', -1);\n this.moveTillCollision(item, 'x', 1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactDown) {\n this.moveTillCollision(item, 'y', 1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactDownAndLeft) {\n this.moveTillCollision(item, 'y', 1);\n this.moveTillCollision(item, 'x', -1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactLeftAndDown) {\n this.moveTillCollision(item, 'x', -1);\n this.moveTillCollision(item, 'y', 1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactDownAndRight) {\n this.moveTillCollision(item, 'y', 1);\n this.moveTillCollision(item, 'x', 1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactRightAndDown) {\n this.moveTillCollision(item, 'x', 1);\n this.moveTillCollision(item, 'y', 1);\n }\n else if (this.gridster.$options.compactType === CompactType.CompactGrid) {\n this.moveToGridPosition(item);\n }\n }\n }\n checkCompactMovement(direction, delta) {\n let widgetMoved = false;\n this.gridster.grid.forEach((widget) => {\n if (widget.$item.compactEnabled !== false) {\n const moved = this.moveTillCollision(widget.$item, direction, delta);\n if (moved) {\n widgetMoved = true;\n widget.item[direction] = widget.$item[direction];\n widget.itemChanged();\n }\n }\n });\n if (widgetMoved) {\n this.checkCompact();\n }\n }\n moveTillCollision(item, direction, delta) {\n item[direction] += delta;\n if (this.gridster.checkCollision(item)) {\n item[direction] -= delta;\n return false;\n }\n else {\n this.moveTillCollision(item, direction, delta);\n return true;\n }\n }\n checkCompactGrid() {\n // Sort items by their current position (top to bottom, left to right)\n const sortedItems = this.gridster.grid\n .filter((widget) => widget.$item.compactEnabled !== false)\n .sort((a, b) => {\n if (a.$item.y !== b.$item.y) {\n return a.$item.y - b.$item.y;\n }\n return a.$item.x - b.$item.x;\n });\n // Reposition all items in a grid-like manner\n let currentY = 0;\n let currentX = 0;\n let maxYInRow = 0;\n sortedItems.forEach((widget) => {\n const item = widget.$item;\n // Check if item fits in current row\n if (currentX + item.cols > this.gridster.columns) {\n // Move to next row\n currentY = maxYInRow;\n currentX = 0;\n maxYInRow = currentY;\n }\n // Position item\n const oldX = item.x;\n const oldY = item.y;\n item.x = currentX;\n item.y = currentY;\n // Update widget if position changed\n if (oldX !== item.x || oldY !== item.y) {\n widget.item.x = item.x;\n widget.item.y = item.y;\n widget.itemChanged();\n }\n // Update position for next item\n currentX += item.cols;\n maxYInRow = Math.max(maxYInRow, currentY + item.rows);\n });\n }\n moveToGridPosition(item) {\n // Find the next available position in grid layout\n let currentY = 0;\n let currentX = 0;\n let maxYInRow = 0;\n // Sort existing items to find occupied positions\n const sortedItems = this.gridster.grid\n .filter((widget) => widget.$item !== item)\n .sort((a, b) => {\n if (a.$item.y !== b.$item.y) {\n return a.$item.y - b.$item.y;\n }\n return a.$item.x - b.$item.x;\n });\n // Find the next available position\n for (const widget of sortedItems) {\n const existingItem = widget.$item;\n // Check if we need to move to next row\n if (currentX + existingItem.cols > this.gridster.columns) {\n currentY = maxYInRow;\n currentX = 0;\n maxYInRow = currentY;\n }\n // Check if current item overlaps with the position we want to place our item\n if (currentY < existingItem.y + existingItem.rows &&\n currentY + item.rows > existingItem.y &&\n currentX < existingItem.x + existingItem.cols &&\n currentX + item.cols > existingItem.x) {\n // Move to position after this item\n currentX = existingItem.x + existingItem.cols;\n currentY = existingItem.y;\n maxYInRow = Math.max(maxYInRow, currentY + existingItem.rows);\n }\n else {\n // Update position for next iteration\n currentX += existingItem.cols;\n maxYInRow = Math.max(maxYInRow, currentY + existingItem.rows);\n }\n }\n // Check if item fits in current row\n if (currentX + item.cols > this.gridster.columns) {\n currentY = maxYInRow;\n currentX = 0;\n }\n // Set the position\n item.x = currentX;\n item.y = currentY;\n }\n}\n\nconst GridsterConfigService = {\n gridType: GridType.Fit, // 'fit' will fit the items in the container without scroll;\n scale: 1, // scale param to zoom in/zoom out\n // 'scrollVertical' will fit on width and height of the items will be the same as the width\n // 'scrollHorizontal' will fit on height and width of the items will be the same as the height\n // 'fixed' will set the rows and columns dimensions based on fixedColWidth and fixedRowHeight options\n // 'verticalFixed' will set the rows to fixedRowHeight and columns width will fit the space available\n // 'horizontalFixed' will set the columns to fixedColWidth and rows height will fit the space available\n fixedColWidth: 250, // fixed col width for gridType: 'fixed'\n fixedRowHeight: 250, // fixed row height for gridType: 'fixed'\n keepFixedHeightInMobile: false, // keep the height from fixed gridType in mobile layout\n keepFixedWidthInMobile: false, // keep the width from fixed gridType in mobile layout\n setGridSize: false, // sets grid size depending on content\n compactType: CompactType.None, // compact items: 'none' | 'compactUp' | 'compactLeft' | 'compactUp&Left' | 'compactLeft&Up'\n mobileBreakpoint: 640, // if the screen is not wider that this, remove the grid layout and stack the items\n useBodyForBreakpoint: false, // whether to use the body width to determine the mobile breakpoint. Uses the element width when false.\n allowMultiLayer: false,\n defaultLayerIndex: 0,\n maxLayerIndex: 2,\n baseLayerIndex: 1,\n minCols: 1, // minimum amount of columns in the grid\n maxCols: 100, // maximum amount of columns in the grid\n minRows: 1, // minimum amount of rows in the grid\n maxRows: 100, // maximum amount of rows in the grid\n defaultItemCols: 1, // default width of an item in columns\n defaultItemRows: 1, // default height of an item in rows\n itemAspectRatio: undefined, // set a fixed aspect ratio for an item to have in cols/rows e.g. 1/1 or 4/3 or 16/9\n maxItemCols: 50, // max item number of cols\n maxItemRows: 50, // max item number of rows\n minItemCols: 1, // min item number of columns\n minItemRows: 1, // min item number of rows\n minItemArea: 1, // min item area: cols * rows\n maxItemArea: 2500, // max item area: cols * rows\n addEmptyRowsCount: 0, // add a number of extra empty rows at the end\n rowHeightRatio: 1, // row height ratio from column width\n margin: 10, // margin between grid items\n outerMargin: true, // if margins will apply to the sides of the container\n outerMarginTop: null, // override outer margin for grid\n outerMarginRight: null, // override outer margin for grid\n outerMarginBottom: null, // override outer margin for grid\n outerMarginLeft: null, // override outer margin for grid\n useTransformPositioning: true, // toggle between transform or top/left positioning of items\n scrollSensitivity: 10, // margin of the dashboard where to start scrolling\n scrollSpeed: 20, // how much to scroll each mouse move when in the scrollSensitivity zone\n initCallback: undefined, // callback to call after grid has initialized. Arguments: gridsterComponent\n destroyCallback: undefined, // callback to call after grid has destroyed. Arguments: gridsterComponent\n gridSizeChangedCallback: undefined, // callback to call after grid has changed size. Arguments: gridsterComponent\n itemChangeCallback: undefined, // callback to call for each item when is changes x, y, rows, cols.\n // Arguments: gridsterItem, gridsterItemComponent\n itemResizeCallback: undefined, // callback to call for each item when width/height changes.\n // Arguments: gridsterItem, gridsterItemComponent\n itemInitCallback: undefined, // callback to call for each item when is initialized.\n // Arguments: gridsterItem, gridsterItemComponent\n itemRemovedCallback: undefined, // callback to call for each item when is initialized.\n // Arguments: gridsterItem, gridsterItemComponent\n itemValidateCallback: undefined, // callback to call to validate item position/size. Return true if valid.\n // Arguments: gridsterItem\n enableEmptyCellClick: false, // enable empty cell click events\n enableEmptyCellContextMenu: false, // enable empty cell context menu (right click) events\n enableEmptyCellDrop: false, // enable empty cell drop events\n enableEmptyCellDrag: false, // enable empty cell drag events\n enableOccupiedCellDrop: false, // enable occupied cell drop events\n emptyCellClickCallback: undefined, // empty cell click callback\n emptyCellContextMenuCallback: undefined, // empty cell context menu (right click) callback\n emptyCellDropCallback: undefined, // empty cell drag drop callback. HTML5 Drag & Drop\n emptyCellDragCallback: undefined, // empty cell drag and create item like excel cell selection\n emptyCellDragMaxCols: 50, // limit empty cell drag max cols\n emptyCellDragMaxRows: 50, // limit empty cell drag max rows\n // Arguments: event, gridsterItem{x, y, rows: defaultItemRows, cols: defaultItemCols}\n ignoreMarginInRow: false, // ignore the gap between rows for items which span multiple rows (see #162, #224)\n draggable: {\n delayStart: 0, // milliseconds to delay the start of drag, useful for touch interaction\n enabled: false, // enable/disable draggable items\n ignoreContentClass: 'gridster-item-content', // default content class to ignore the drag event from\n ignoreContent: false, // if true drag will start only from elements from `dragHandleClass`\n dragHandleClass: 'drag-handler', // drag event only from this class. If `ignoreContent` is true.\n stop: undefined, // callback when dragging an item stops. Accepts Promise return to cancel/approve drag.\n start: undefined, // callback when dragging an item starts.\n // Arguments: item, gridsterItem, event\n dropOverItems: false, // enable drop items on top other item\n dropOverItemsCallback: undefined // callback on drop over another item\n // Arguments: source, target, gridComponent\n },\n resizable: {\n delayStart: 0, // milliseconds to delay the start of resize, useful for touch interaction\n enabled: false, // enable/disable resizable items\n handles: {\n s: true,\n e: true,\n n: true,\n w: true,\n se: true,\n ne: true,\n sw: true,\n nw: true\n }, // resizable edges of an item\n stop: undefined, // callback when resizing an item stops. Accepts Promise return to cancel/approve resize.\n start: undefined // callback when resizing an item starts.\n // Arguments: item, gridsterItem, event\n },\n swap: true, // allow items to switch position if drop on top of another\n swapWhileDragging: false, // allow items to switch position while dragging\n pushItems: false, // push items when resizing and dragging\n disablePushOnDrag: false, // disable push on drag\n disablePushOnResize: false, // disable push on resize\n pushDirections: { north: true, east: true, south: true, west: true }, // control the directions items are pushed\n pushResizeItems: false, // on resize of item will shrink adjacent items\n displayGrid: DisplayGrid.OnDragAndResize, // display background grid of rows and columns\n disableWindowResize: false, // disable the window on resize listener. This will stop grid to recalculate on window resize.\n disableWarnings: false, // disable console log warnings about misplacement of grid items\n scrollToNewItems: false, // scroll to new items placed in a scrollable view\n disableScrollHorizontal: false, // disable horizontal scrolling\n disableScrollVertical: false, // disable vertical scrolling\n enableBoundaryControl: false, // enable boundary control while dragging items\n disableAutoPositionOnConflict: false, // disable auto-position of items on conflict state,\n dirType: DirTypes.LTR // page direction, rtl=right to left ltr= left to right, if you use rtl language set dirType to rtl\n};\n\nclass GridsterUtils {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static merge(obj1, obj2, properties) {\n for (const p in obj2) {\n if (obj2[p] !== void 0 && properties.hasOwnProperty(p)) {\n if (typeof obj2[p] === 'object') {\n // create an empty object for the property if obj1 does not already have one.\n if (!(p in obj1)) {\n obj1[p] = {};\n }\n obj1[p] = GridsterUtils.merge(obj1[p], obj2[p], properties[p]);\n }\n else {\n obj1[p] = obj2[p];\n }\n }\n }\n return obj1;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static checkTouchEvent(e) {\n if (e.clientX === undefined && e.touches) {\n if (e.touches && e.touches.length) {\n e.clientX = e.touches[0].clientX;\n e.clientY = e.touches[0].clientY;\n }\n else if (e.changedTouches && e.changedTouches.length) {\n e.clientX = e.changedTouches[0].clientX;\n e.clientY = e.changedTouches[0].clientY;\n }\n }\n }\n static checkContentClassForEvent(gridster, e) {\n if (gridster.$options.draggable.ignoreContent) {\n if (!GridsterUtils.checkDragHandleClass(e.target, e.currentTarget, gridster.$options.draggable.dragHandleClass, gridster.$options.draggable.ignoreContentClass)) {\n return true;\n }\n }\n else {\n if (GridsterUtils.checkContentClass(e.target, e.currentTarget, gridster.$options.draggable.ignoreContentClass)) {\n return true;\n }\n }\n return false;\n }\n static checkContentClassForEmptyCellClickEvent(gridster, e) {\n return (GridsterUtils.checkContentClass(e.target, e.currentTarget, gridster.$options.draggable.ignoreContentClass) ||\n GridsterUtils.checkContentClass(e.target, e.currentTarget, gridster.$options.draggable.dragHandleClass));\n }\n static checkDragHandleClass(target, current, dragHandleClass, ignoreContentClass) {\n if (!target || target === current) {\n return false;\n }\n if (target.hasAttribute('class')) {\n const classnames = target.getAttribute('class').split(' ');\n if (classnames.indexOf(dragHandleClass) > -1) {\n return true;\n }\n if (classnames.indexOf(ignoreContentClass) > -1) {\n return false;\n }\n }\n return GridsterUtils.checkDragHandleClass(target.parentNode, current, dragHandleClass, ignoreContentClass);\n }\n static checkContentClass(target, current, contentClass) {\n if (!target || target === current) {\n return false;\n }\n if (target.hasAttribute('class') &&\n target.getAttribute('class').split(' ').indexOf(contentClass) > -1) {\n return true;\n }\n else {\n return GridsterUtils.checkContentClass(target.parentNode, current, contentClass);\n }\n }\n static compareItems(a, b) {\n if (a.y > b.y) {\n return -1;\n }\n else if (a.y < b.y) {\n return 1;\n }\n else if (a.x > b.x) {\n return -1;\n }\n else {\n return 1;\n }\n }\n}\n\nclass GridsterEmptyCell {\n gridster;\n initialItem;\n removeEmptyCellClickListenerFn;\n removeEmptyCellTouchendListenerFn;\n removeEmptyCellContextMenuListenerFn;\n removeEmptyCellDropListenerFn;\n removeEmptyCellMousedownListenerFn;\n removeEmptyCellTouchstartListenerFn;\n removeWindowMousemoveListenerFn;\n removeWindowTouchmoveListenerFn;\n removeWindowMouseupListenerFn;\n removeWindowTouchendListenerFn;\n removeEmptyCellDragoverListenerFn;\n removeDocumentDragendListenerFn;\n constructor(gridster) {\n this.gridster = gridster;\n }\n destroy() {\n if (this.gridster.previewStyle) {\n this.gridster.previewStyle();\n }\n this.gridster.movingItem = null;\n this.initialItem = this.gridster = null;\n if (this.removeDocumentDragendListenerFn) {\n this.removeDocumentDragendListenerFn();\n this.removeDocumentDragendListenerFn = null;\n }\n }\n updateOptions() {\n if (this.gridster.$options.enableEmptyCellClick &&\n !this.removeEmptyCellClickListenerFn &&\n this.gridster.options.emptyCellClickCallback) {\n this.removeEmptyCellClickListenerFn = this.gridster.renderer.listen(this.gridster.el, 'click', this.emptyCellClickCb);\n this.removeEmptyCellTouchendListenerFn = this.gridster.renderer.listen(this.gridster.el, 'touchend', this.emptyCellClickCb);\n }\n else if (!this.gridster.$options.enableEmptyCellClick &&\n this.removeEmptyCellClickListenerFn &&\n this.removeEmptyCellTouchendListenerFn) {\n this.removeEmptyCellClickListenerFn();\n this.removeEmptyCellTouchendListenerFn();\n this.removeEmptyCellClickListenerFn = null;\n this.removeEmptyCellTouchendListenerFn = null;\n }\n if (this.gridster.$options.enableEmptyCellContextMenu &&\n !this.removeEmptyCellContextMenuListenerFn &&\n this.gridster.options.emptyCellContextMenuCallback) {\n this.removeEmptyCellContextMenuListenerFn = this.gridster.renderer.listen(this.gridster.el, 'contextmenu', this.emptyCellContextMenuCb);\n }\n else if (!this.gridster.$options.enableEmptyCellContextMenu &&\n this.removeEmptyCellContextMenuListenerFn) {\n this.removeEmptyCellContextMenuListenerFn();\n this.removeEmptyCellContextMenuListenerFn = null;\n }\n if (this.gridster.$options.enableEmptyCellDrop &&\n !this.removeEmptyCellDropListenerFn &&\n this.gridster.options.emptyCellDropCallback) {\n this.removeEmptyCellDropListenerFn = this.gridster.renderer.listen(this.gridster.el, 'drop', this.emptyCellDragDrop);\n this.gridster.zone.runOutsideAngular(() => {\n this.removeEmptyCellDragoverListenerFn = this.gridster.renderer.listen(this.gridster.el, 'dragover', this.emptyCellDragOver);\n });\n this.removeDocumentDragendListenerFn = this.gridster.renderer.listen('document', 'dragend', () => {\n this.gridster.movingItem = null;\n this.gridster.previewStyle();\n });\n }\n else if (!this.gridster.$options.enableEmptyCellDrop &&\n this.removeEmptyCellDropListenerFn &&\n this.removeEmptyCellDragoverListenerFn &&\n this.removeDocumentDragendListenerFn) {\n this.removeEmptyCellDropListenerFn();\n this.removeEmptyCellDragoverListenerFn();\n this.removeDocumentDragendListenerFn();\n this.removeEmptyCellDragoverListenerFn = null;\n this.removeEmptyCellDropListenerFn = null;\n this.removeDocumentDragendListenerFn = null;\n }\n if (this.gridster.$options.enableEmptyCellDrag &&\n !this.removeEmptyCellMousedownListenerFn &&\n this.gridster.options.emptyCellDragCallback) {\n this.removeEmptyCellMousedownListenerFn = this.gridster.renderer.listen(this.gridster.el, 'mousedown', this.emptyCellMouseDown);\n this.removeEmptyCellTouchstartListenerFn = this.gridster.renderer.listen(this.gridster.el, 'touchstart', this.emptyCellMouseDown);\n }\n else if (!this.gridster.$options.enableEmptyCellDrag &&\n this.removeEmptyCellMousedownListenerFn &&\n this.removeEmptyCellTouchstartListenerFn) {\n this.removeEmptyCellMousedownListenerFn();\n this.removeEmptyCellTouchstartListenerFn();\n this.removeEmptyCellMousedownListenerFn = null;\n this.removeEmptyCellTouchstartListenerFn = null;\n }\n }\n emptyCellClickCb = (e) => {\n if (!this.gridster ||\n this.gridster.movingItem ||\n GridsterUtils.checkContentClassForEmptyCellClickEvent(this.gridster, e)) {\n return;\n }\n const item = this.getValidItemFromEvent(e);\n if (!item) {\n return;\n }\n if (this.gridster.options.emptyCellClickCallback) {\n this.gridster.options.emptyCellClickCallback(e, item);\n }\n this.gridster.cdRef.markForCheck();\n };\n emptyCellContextMenuCb = (e) => {\n if (this.gridster.movingItem ||\n GridsterUtils.checkContentClassForEmptyCellClickEvent(this.gridster, e)) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n const item = this.getValidItemFromEvent(e);\n if (!item) {\n return;\n }\n if (this.gridster.options.emptyCellContextMenuCallback) {\n this.gridster.options.emptyCellContextMenuCallback(e, item);\n }\n this.gridster.cdRef.markForCheck();\n };\n emptyCellDragDrop = (e) => {\n const item = this.getValidItemFromEvent(e);\n if (!item) {\n return;\n }\n if (this.gridster.options.emptyCellDropCallback) {\n this.gridster.options.emptyCellDropCallback(e, item);\n }\n this.gridster.cdRef.markForCheck();\n };\n emptyCellDragOver = (e) => {\n e.preventDefault();\n e.stopPropagation();\n const item = this.getValidItemFromEvent(e);\n if (item) {\n if (e.dataTransfer) {\n e.dataTransfer.dropEffect = 'move';\n }\n this.gridster.movingItem = item;\n }\n else {\n if (e.dataTransfer) {\n e.dataTransfer.dropEffect = 'none';\n }\n this.gridster.movingItem = null;\n }\n this.gridster.previewStyle();\n };\n emptyCellMouseDown = (e) => {\n if (GridsterUtils.checkContentClassForEmptyCellClickEvent(this.gridster, e)) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n const item = this.getValidItemFromEvent(e);\n const leftMouseButtonCode = 1;\n if (!item ||\n (e.buttons !== leftMouseButtonCode && !(e instanceof TouchEvent))) {\n return;\n }\n this.initialItem = item;\n this.gridster.movingItem = item;\n this.gridster.previewStyle();\n this.gridster.zone.runOutsideAngular(() => {\n this.removeWindowMousemoveListenerFn = this.gridster.renderer.listen('window', 'mousemove', this.emptyCellMouseMove);\n this.removeWindowTouchmoveListenerFn = this.gridster.renderer.listen('window', 'touchmove', this.emptyCellMouseMove);\n });\n this.removeWindowMouseupListenerFn = this.gridster.renderer.listen('window', 'mouseup', this.emptyCellMouseUp);\n this.removeWindowTouchendListenerFn = this.gridster.renderer.listen('window', 'touchend', this.emptyCellMouseUp);\n };\n emptyCellMouseMove = (e) => {\n e.preventDefault();\n e.stopPropagation();\n const item = this.getValidItemFromEvent(e, this.initialItem);\n if (!item) {\n return;\n }\n this.gridster.movingItem = item;\n this.gridster.previewStyle();\n };\n emptyCellMouseUp = (e) => {\n this.removeWindowMousemoveListenerFn();\n this.removeWindowTouchmoveListenerFn();\n this.removeWindowMouseupListenerFn();\n this.removeWindowTouchendListenerFn();\n const item = this.getValidItemFromEvent(e, this.initialItem);\n if (item) {\n this.gridster.movingItem = item;\n }\n if (this.gridster.options.emptyCellDragCallback &&\n this.gridster.movingItem) {\n this.gridster.options.emptyCellDragCallback(e, this.gridster.movingItem);\n }\n setTimeout(() => {\n this.initialItem = null;\n if (this.gridster) {\n this.gridster.movingItem = null;\n this.gridster.previewStyle();\n }\n });\n this.gridster.cdRef.markForCheck();\n };\n getPixelsX(e, rect) {\n const scale = this.gridster.options.scale;\n if (scale) {\n return ((e.clientX - rect.left) / scale +\n this.gridster.el.scrollLeft -\n this.gridster.gridRenderer.getLeftMargin());\n }\n return (e.clientX +\n this.gridster.el.scrollLeft -\n rect.left -\n this.gridster.gridRenderer.getLeftMargin());\n }\n getPixelsY(e, rect) {\n const scale = this.gridster.options.scale;\n if (scale) {\n return ((e.clientY - rect.top) / scale +\n this.gridster.el.scrollTop -\n this.gridster.gridRenderer.getTopMargin());\n }\n return (e.clientY +\n this.gridster.el.scrollTop -\n rect.top -\n this.gridster.gridRenderer.getTopMargin());\n }\n getValidItemFromEvent(e, oldItem) {\n e.preventDefault();\n e.stopPropagation();\n GridsterUtils.checkTouchEvent(e);\n const rect = this.gridster.el.getBoundingClientRect();\n const x = this.getPixelsX(e, rect);\n const y = this.getPixelsY(e, rect);\n const item = {\n x: this.gridster.pixelsToPositionX(x, Math.floor, true),\n y: this.gridster.pixelsToPositionY(y, Math.floor, true),\n cols: this.gridster.$options.defaultItemCols,\n rows: this.gridster.$options.defaultItemRows\n };\n if (oldItem) {\n item.cols = Math.min(Math.abs(oldItem.x - item.x) + 1, this.gridster.$options.emptyCellDragMaxCols);\n item.rows = Math.min(Math.abs(oldItem.y - item.y) + 1, this.gridster.$options.emptyCellDragMaxRows);\n if (oldItem.x < item.x) {\n item.x = oldItem.x;\n }\n else if (oldItem.x - item.x >\n this.gridster.$options.emptyCellDragMaxCols - 1) {\n item.x = this.gridster.movingItem ? this.gridster.movingItem.x : 0;\n }\n if (oldItem.y < item.y) {\n item.y = oldItem.y;\n }\n else if (oldItem.y - item.y >\n this.gridster.$options.emptyCellDragMaxRows - 1) {\n item.y = this.gridster.movingItem ? this.gridster.movingItem.y : 0;\n }\n }\n if (!this.gridster.$options.enableOccupiedCellDrop &&\n this.gridster.checkCollision(item)) {\n return;\n }\n return item;\n }\n}\n\nclass GridsterRenderer {\n gridster;\n /**\n * Caches the last grid column styles.\n * This improves the grid responsiveness by caching and reusing the last style object instead of creating a new one.\n */\n lastGridColumnStyles = {};\n /**\n * Caches the last grid column styles.\n * This improves the grid responsiveness by caching and reusing the last style object instead of creating a new one.\n */\n lastGridRowStyles = {};\n constructor(gridster) {\n this.gridster = gridster;\n }\n destroy() {\n this.gridster = null;\n }\n updateItem(el, item, renderer) {\n if (this.gridster.mobile) {\n this.clearCellPosition(renderer, el);\n if (this.gridster.$options.keepFixedHeightInMobile) {\n renderer.setStyle(el, 'height', (item.rows - 1) * this.gridster.$options.margin +\n item.rows * this.gridster.$options.fixedRowHeight +\n 'px');\n }\n else {\n renderer.setStyle(el, 'height', (item.rows * this.gridster.curWidth) / item.cols + 'px');\n }\n if (this.gridster.$options.keepFixedWidthInMobile) {\n renderer.setStyle(el, 'width', this.gridster.$options.fixedColWidth + 'px');\n }\n else {\n renderer.setStyle(el, 'width', '');\n }\n renderer.setStyle(el, 'margin-bottom', this.gridster.$options.margin + 'px');\n renderer.setStyle(el, DirTypes.LTR ? 'margin-right' : 'margin-left', '');\n }\n else {\n const x = Math.round(this.gridster.curColWidth * item.x);\n const y = Math.round(this.gridster.curRowHeight * item.y);\n const width = this.gridster.curColWidth * item.cols - this.gridster.$options.margin;\n const height = this.gridster.curRowHeight * item.rows - this.gridster.$options.margin;\n // set the cell style\n this.setCellPosition(renderer, el, x, y);\n renderer.setStyle(el, 'width', width + 'px');\n renderer.setStyle(el, 'height', height + 'px');\n let marginBottom = null;\n let marginRight = null;\n if (this.gridster.$options.outerMargin) {\n if (this.gridster.rows === item.rows + item.y) {\n if (this.gridster.$options.outerMarginBottom !== null) {\n marginBottom = this.gridster.$options.outerMarginBottom + 'px';\n }\n else {\n marginBottom = this.gridster.$options.margin + 'px';\n }\n }\n if (this.gridster.columns === item.cols + item.x) {\n if (this.gridster.$options.outerMarginBottom !== null) {\n marginRight = this.gridster.$options.outerMarginRight + 'px';\n }\n else {\n marginRight = this.gridster.$options.margin + 'px';\n }\n }\n }\n renderer.setStyle(el, 'margin-bottom', marginBottom);\n renderer.setStyle(el, this.gridster.$options.dirType === DirTypes.LTR\n ? 'margin-right'\n : 'margin-left', marginRight);\n }\n }\n updateGridster() {\n let addClass = '';\n let removeClass1 = '';\n let removeClass2 = '';\n let removeClass3 = '';\n if (this.gridster.$options.gridType === GridType.Fit) {\n addClass = GridType.Fit;\n removeClass1 = GridType.ScrollVertical;\n removeClass2 = GridType.ScrollHorizontal;\n removeClass3 = GridType.Fixed;\n }\n else if (this.gridster.$options.gridType === GridType.ScrollVertical) {\n this.gridster.curRowHeight =\n this.gridster.curColWidth * this.gridster.$options.rowHeightRatio;\n addClass = GridType.ScrollVertical;\n removeClass1 = GridType.Fit;\n removeClass2 = GridType.ScrollHorizontal;\n removeClass3 = GridType.Fixed;\n }\n else if (this.gridster.$options.gridType === GridType.ScrollHorizontal) {\n const widthRatio = this.gridster.$options.rowHeightRatio;\n const calWidthRatio = widthRatio >= 1 ? widthRatio : widthRatio + 1;\n this.gridster.curColWidth = this.gridster.curRowHeight * calWidthRatio;\n addClass = GridType.ScrollHorizontal;\n removeClass1 = GridType.Fit;\n removeClass2 = GridType.ScrollVertical;\n removeClass3 = GridType.Fixed;\n }\n else if (this.gridster.$options.gridType === GridType.Fixed) {\n this.gridster.curColWidth =\n this.gridster.$options.fixedColWidth +\n (this.gridster.$options.ignoreMarginInRow\n ? 0\n : this.gridster.$options.margin);\n this.gridster.curRowHeight =\n this.gridster.$options.fixedRowHeight +\n (this.gridster.$options.ignoreMarginInRow\n ? 0\n : this.gridster.$options.margin);\n addClass = GridType.Fixed;\n removeClass1 = GridType.Fit;\n removeClass2 = GridType.ScrollVertical;\n removeClass3 = GridType.ScrollHorizontal;\n }\n else if (this.gridster.$options.gridType === GridType.VerticalFixed) {\n this.gridster.curRowHeight =\n this.gridster.$options.fixedRowHeight +\n (this.gridster.$options.ignoreMarginInRow\n ? 0\n : this.gridster.$options.margin);\n addClass = GridType.ScrollVertical;\n removeClass1 = GridType.Fit;\n removeClass2 = GridType.ScrollHorizontal;\n removeClass3 = GridType.Fixed;\n }\n else if (this.gridster.$options.gridType === GridType.HorizontalFixed) {\n this.gridster.curColWidth =\n this.gridster.$options.fixedColWidth +\n (this.gridster.$options.ignoreMarginInRow\n ? 0\n : this.gridster.$options.margin);\n addClass = GridType.ScrollHorizontal;\n removeClass1 = GridType.Fit;\n removeClass2 = GridType.ScrollVertical;\n removeClass3 = GridType.Fixed;\n }\n if (this.gridster.mobile ||\n (this.gridster.$options.setGridSize &&\n this.gridster.$options.gridType !== GridType.Fit)) {\n this.gridster.renderer.removeClass(this.gridster.el, addClass);\n }\n else {\n this.gridster.renderer.addClass(this.gridster.el, addClass);\n }\n this.gridster.renderer.removeClass(this.gridster.el, removeClass1);\n this.gridster.renderer.removeClass(this.gridster.el, removeClass2);\n this.gridster.renderer.removeClass(this.gridster.el, removeClass3);\n }\n getGridColumnStyle(i) {\n // generates the new style\n const newPos = {\n left: this.gridster.curColWidth * i,\n width: this.gridster.curColWidth - this.gridster.$options.margin,\n height: this.gridster.gridRows.length * this.gridster.curRowHeight -\n this.gridster.$options.margin,\n style: {}\n };\n newPos.style = {\n ...this.getLeftPosition(newPos.left),\n width: newPos.width + 'px',\n height: newPos.height + 'px'\n };\n // use the last cached style if it has same values as the generated one\n const last = this.lastGridColumnStyles[i];\n if (last &&\n last.left === newPos.left &&\n last.width === newPos.width &&\n last.height === newPos.height) {\n return last.style;\n }\n // cache and set new style\n this.lastGridColumnStyles[i] = newPos;\n return newPos.style;\n }\n getGridRowStyle(i) {\n // generates the new style\n const newPos = {\n top: this.gridster.curRowHeight * i,\n width: this.gridster.gridColumns.length * this.gridster.curColWidth +\n this.gridster.$options.margin,\n height: this.gridster.curRowHeight - this.gridster.$options.margin,\n style: {}\n };\n newPos.style = {\n ...this.getTopPosition(newPos.top),\n width: newPos.width + 'px',\n height: newPos.height + 'px'\n };\n // use the last cached style if it has same values as the generated one\n const last = this.lastGridRowStyles[i];\n if (last &&\n last.top === newPos.top &&\n last.width === newPos.width &&\n last.height === newPos.height) {\n return last.style;\n }\n // cache and set new style\n this.lastGridRowStyles[i] = newPos;\n return newPos.style;\n }\n getLeftPosition(d) {\n const dPosition = this.gridster.$options.dirType === DirTypes.RTL ? -d : d;\n if (this.gridster.$options.useTransformPositioning) {\n return {\n transform: 'translateX(' + dPosition + 'px)'\n };\n }\n else {\n return {\n left: this.getLeftMargin() + dPosition + 'px'\n };\n }\n }\n getTopPosition(d) {\n if (this.gridster.$options.useTransformPositioning) {\n return {\n transform: 'translateY(' + d + 'px)'\n };\n }\n else {\n return {\n top: this.getTopMargin() + d + 'px'\n };\n }\n }\n clearCellPosition(renderer, el) {\n if (this.gridster.$options.useTransformPositioning) {\n renderer.setStyle(el, 'transform', '');\n }\n else {\n renderer.setStyle(el, 'top', '');\n renderer.setStyle(el, 'left', '');\n }\n }\n setCellPosition(renderer, el, x, y) {\n const xPosition = this.gridster.$options.dirType === DirTypes.RTL ? -x : x;\n if (this.gridster.$options.useTransformPositioning) {\n const transform = 'translate3d(' + xPosition + 'px, ' + y + 'px, 0)';\n renderer.setStyle(el, 'transform', transform);\n }\n else {\n renderer.setStyle(el, 'left', this.getLeftMargin() + xPosition + 'px');\n renderer.setStyle(el, 'top', this.getTopMargin() + y + 'px');\n }\n }\n getLeftMargin() {\n if (this.gridster.$options.outerMargin) {\n if (this.gridster.$options.outerMarginLeft !== null) {\n return this.gridster.$options.outerMarginLeft;\n }\n else {\n return this.gridster.$options.margin;\n }\n }\n else {\n return 0;\n }\n }\n getTopMargin() {\n if (this.gridster.$options.outerMargin) {\n if (this.gridster.$options.outerMarginTop !== null) {\n return this.gridster.$options.outerMarginTop;\n }\n else {\n return this.gridster.$options.margin;\n }\n }\n else {\n return 0;\n }\n }\n}\n\nclass GridsterPreviewComponent {\n renderer;\n gridRenderer;\n el;\n constructor(el, renderer) {\n this.renderer = renderer;\n this.el = el.nativeElement;\n }\n previewStyle(item) {\n if (item) {\n this.renderer.setStyle(this.el, 'display', 'block');\n this.gridRenderer.updateItem(this.el, item, this.renderer);\n }\n else {\n this.renderer.setStyle(this.el, 'display', '');\n }\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.13\", ngImport: i0, type: GridsterPreviewComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"20.3.13\", type: GridsterPreviewComponent, isStandalone: true, selector: \"gridster-preview\", inputs: { gridRenderer: \"gridRenderer\" }, ngImport: i0, template: '', isInline: true, styles: [\"gridster-preview{position:absolute;display:none;background:#00000026}\\n\"], encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.13\", ngImport: i0, type: GridsterPreviewComponent, decorators: [{\n type: Component,\n args: [{ selector: 'gridster-preview', template: '', encapsulation: ViewEncapsulation.None, styles: [\"gridster-preview{position:absolute;display:none;background:#00000026}\\n\"] }]\n }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { gridRenderer: [{\n type: Input\n }] } });\n\nclass GridsterComponent {\n renderer;\n cdRef;\n zone;\n gridsterPreview = viewChild.required(GridsterPreviewComponent);\n options;\n movingItem;\n el;\n $options;\n mobile;\n curWidth;\n curHeight;\n grid;\n columns = 0;\n rows = 0;\n curColWidth;\n curRowHeight;\n gridColumns = [];\n gridRows = [];\n windowResize;\n dragInProgress;\n emptyCell;\n compact;\n gridRenderer;\n calculateLayout$ = new Subject();\n resize$ = new Subject();\n destroy$ = new Subject();\n constructor(el, renderer, cdRef, zone) {\n this.renderer = renderer;\n this.cdRef = cdRef;\n this.zone = zone;\n this.el = el.nativeElement;\n this.$options = JSON.parse(JSON.stringify(GridsterConfigService));\n this.mobile = false;\n this.curWidth = 0;\n this.curHeight = 0;\n this.grid = [];\n this.curColWidth = 0;\n this.curRowHeight = 0;\n this.dragInProgress = false;\n this.emptyCell = new GridsterEmptyCell(this);\n this.compact = new GridsterCompact(this);\n this.gridRenderer = new GridsterRenderer(this);\n }\n // ------ Function for swapWhileDragging option\n // identical to checkCollision() except that here we add boundaries.\n static checkCollisionTwoItemsForSwaping(item, item2) {\n // if the cols or rows of the items are 1 , doesnt make any sense to set a boundary. Only if the item is bigger we set a boundary\n const horizontalBoundaryItem1 = item.cols === 1 ? 0 : 1;\n const horizontalBoundaryItem2 = item2.cols === 1 ? 0 : 1;\n const verticalBoundaryItem1 = item.rows === 1 ? 0 : 1;\n const verticalBoundaryItem2 = item2.rows === 1 ? 0 : 1;\n return (item.x + horizontalBoundaryItem1 < item2.x + item2.cols &&\n item.x + item.cols > item2.x + horizontalBoundaryItem2 &&\n item.y + verticalBoundaryItem1 < item2.y + item2.rows &&\n item.y + item.rows > item2.y + verticalBoundaryItem2);\n }\n checkCollisionTwoItems(item, item2) {\n const collision = item.x < item2.x + item2.cols &&\n item.x + item.cols > item2.x &&\n item.y < item2.y + item2.rows &&\n item.y + item.rows > item2.y;\n if (!collision) {\n return false;\n }\n if (!this.$options.allowMultiLayer) {\n return true;\n }\n const defaultLayerIndex = this.$options.defaultLayerIndex;\n const layerIndex = item.layerIndex === undefined ? defaultLayerIndex : item.layerIndex;\n const layerIndex2 = item2.layerIndex === undefined ? defaultLayerIndex : item2.layerIndex;\n return layerIndex === layerIndex2;\n }\n ngOnInit() {\n if (this.options.initCallback) {\n this.options.initCallback(this);\n }\n this.calculateLayout$\n .pipe(debounceTime(0), takeUntil(this.destroy$))\n .subscribe(() => this.calculateLayout());\n this.resize$\n .pipe(\n // Cancel previously scheduled DOM timer if `calculateLayout()` has been called\n // within this time range.\n switchMap(() => timer(100)), takeUntil(this.destroy$))\n .subscribe(() => this.resize());\n }\n ngOnChanges(changes) {\n if (changes.options) {\n this.setOptions();\n this.options.api = {\n optionsChanged: this.optionsChanged,\n resize: this.onResize,\n getNextPossiblePosition: this.getNextPossiblePosition,\n getFirstPossiblePosition: this.getFirstPossiblePosition,\n getLastPossiblePosition: this.getLastPossiblePosition,\n getItemComponent: (item) => this.getItemComponent(item)\n };\n this.columns = this.$options.minCols;\n this.rows = this.$options.minRows + this.$options.addEmptyRowsCount;\n this.setGridSize();\n this.calculateLayout();\n }\n }\n resize() {\n let height;\n let width;\n if (this.$options.gridType === 'fit' && !this.mobile) {\n width = this.el.offsetWidth;\n height = this.el.offsetHeight;\n }\n else {\n width = this.el.clientWidth;\n height = this.el.clientHeight;\n }\n if ((width !== this.curWidth || height !== this.curHeight) &&\n this.checkIfToResize()) {\n this.onResize();\n }\n }\n setOptions() {\n this.$options = GridsterUtils.merge(this.$options, this.options, this.$options);\n if (!this.$options.disableWindowResize && !this.windowResize) {\n this.windowResize = this.renderer.listen('window', 'resize', this.onResize);\n }\n else if (this.$options.disableWindowResize && this.windowResize) {\n this.windowResize();\n this.windowResize = null;\n }\n this.emptyCell.updateOptions();\n }\n optionsChanged = () => {\n this.setOptions();\n let widgetsIndex = this.grid.length - 1;\n let widget;\n for (; widgetsIndex >= 0; widgetsIndex--) {\n widget = this.grid[widgetsIndex];\n widget.updateOptions();\n }\n this.calculateLayout();\n };\n ngOnDestroy() {\n this.destroy$.next();\n if (this.windowResize) {\n this.windowResize();\n }\n if (this.options && this.options.destroyCallback) {\n this.options.destroyCallback(this);\n }\n if (this.options && this.options.api) {\n this.options.api.resize = undefined;\n this.options.api.optionsChanged = undefined;\n this.options.api.getNextPossiblePosition = undefined;\n this.options.api = undefined;\n }\n this.emptyCell.destroy();\n this.emptyCell = null;\n this.compact.destroy();\n this.compact = null;\n }\n onResize = () => {\n if (this.el.clientWidth) {\n if (this.options.setGridSize) {\n // reset width/height so the size is recalculated afterwards\n this.renderer.setStyle(this.el, 'width', '');\n this.renderer.setStyle(this.el, 'height', '');\n }\n this.setGridSize();\n this.calculateLayout();\n }\n };\n checkIfToResize() {\n const clientWidth = this.el.clientWidth;\n const offsetWidth = this.el.offsetWidth;\n const scrollWidth = this.el.scrollWidth;\n const clientHeight = this.el.clientHeight;\n const offsetHeight = this.el.offsetHeight;\n const scrollHeight = this.el.scrollHeight;\n const verticalScrollPresent = clientWidth < offsetWidth &&\n scrollHeight > offsetHeight &&\n scrollHeight - offsetHeight < offsetWidth - clientWidth;\n const horizontalScrollPresent = clientHeight < offsetHeight &&\n scrollWidth > offsetWidth &&\n scrollWidth - offsetWidth < offsetHeight - clientHeight;\n if (verticalScrollPresent) {\n return false;\n }\n return !horizontalScrollPresent;\n }\n checkIfMobile() {\n if (this.$options.useBodyForBreakpoint) {\n return this.$options.mobileBreakpoint > document.body.clientWidth;\n }\n else {\n return this.$options.mobileBreakpoint > this.curWidth;\n }\n }\n setGridSize() {\n const el = this.el;\n let width;\n let height;\n if (this.$options.setGridSize ||\n (this.$options.gridType === GridType.Fit && !this.mobile)) {\n width = el.offsetWidth;\n height = el.offsetHeight;\n }\n else {\n width = el.clientWidth;\n height = el.clientHeight;\n }\n this.curWidth = width;\n this.curHeight = height;\n }\n setGridDimensions() {\n this.setGridSize();\n if (!this.mobile && this.checkIfMobile()) {\n this.mobile = !this.mobile;\n this.renderer.addClass(this.el, 'mobile');\n }\n else if (this.mobile && !this.checkIfMobile()) {\n this.mobile = !this.mobile;\n this.renderer.removeClass(this.el, 'mobile');\n }\n let rows = this.$options.minRows;\n let columns = this.$options.minCols;\n let widgetsIndex = this.grid.length - 1;\n let widget;\n for (; widgetsIndex >= 0; widgetsIndex--) {\n widget = this.grid[widgetsIndex];\n if (!widget.notPlaced) {\n rows = Math.max(rows, widget.$item.y + widget.$item.rows);\n columns = Math.max(columns, widget.$item.x + widget.$item.cols);\n }\n }\n rows += this.$options.addEmptyRowsCount;\n if (this.columns !== columns || this.rows !== rows) {\n this.columns = columns;\n this.rows = rows;\n if (this.options.gridSizeChangedCallback) {\n this.options.gridSizeChangedCallback(this);\n }\n }\n }\n calculateLayout() {\n if (this.compact) {\n this.compact.checkCompact();\n }\n this.setGridDimensions();\n if (this.$options.outerMargin) {\n let marginWidth = -this.$options.margin;\n if (this.$options.outerMarginLeft !== null) {\n marginWidth += this.$options.outerMarginLeft;\n this.renderer.setStyle(this.el, 'padding-left', this.$options.outerMarginLeft + 'px');\n }\n else {\n marginWidth += this.$options.margin;\n this.renderer.setStyle(this.el, 'padding-left', this.$options.margin + 'px');\n }\n if (this.$options.outerMarginRight !== null) {\n marginWidth += this.$options.outerMarginRight;\n this.renderer.setStyle(this.el, 'padding-right', this.$options.outerMarginRight + 'px');\n }\n else {\n marginWidth += this.$options.margin;\n this.renderer.setStyle(this.el, 'padding-right', this.$options.margin + 'px');\n }\n this.curColWidth = (this.curWidth - marginWidth) / this.columns;\n let marginHeight = -this.$options.margin;\n if (this.$options.outerMarginTop !== null) {\n marginHeight += this.$options.outerMarginTop;\n this.renderer.setStyle(this.el, 'padding-top', this.$options.outerMarginTop + 'px');\n }\n else {\n marginHeight += this.$options.margin;\n this.renderer.setStyle(this.el, 'padding-top', this.$options.margin + 'px');\n }\n if (this.$options.outerMarginBottom !== null) {\n marginHeight += this.$options.outerMarginBottom;\n this.renderer.setStyle(this.el, 'padding-bottom', this.$options.outerMarginBottom + 'px');\n }\n else {\n marginHeight += this.$options.margin;\n this.renderer.setStyle(this.el, 'padding-bottom', this.$options.margin + 'px');\n }\n this.curRowHeight =\n ((this.curHeight - marginHeight) / this.rows) *\n this.$options.rowHeightRatio;\n }\n else {\n this.curColWidth = (this.curWidth + this.$options.margin) / this.columns;\n this.curRowHeight =\n ((this.curHeight + this.$options.margin) / this.rows) *\n this.$options.rowHeightRatio;\n this.renderer.setStyle(this.el, 'padding-left', 0 + 'px');\n this.renderer.setStyle(this.el, 'padding-right', 0 + 'px');\n this.renderer.setStyle(this.el, 'padding-top', 0 + 'px');\n this.renderer.setStyle(this.el, 'padding-bottom', 0 + 'px');\n }\n this.gridRenderer.updateGridster();\n if (this.$options.setGridSize) {\n this.renderer.addClass(this.el, 'gridSize');\n if (!this.mobile) {\n this.renderer.setStyle(this.el, 'width', this.columns * this.curColWidth + this.$options.margin + 'px');\n this.renderer.setStyle(this.el, 'height', this.rows * this.curRowHeight + this.$options.margin + 'px');\n }\n }\n else {\n this.renderer.removeClass(this.el, 'gridSize');\n this.renderer.setStyle(this.el, 'width', '');\n this.renderer.setStyle(this.el, 'height', '');\n }\n this.updateGrid();\n let widgetsIndex = this.grid.length - 1;\n let widget;\n for (; widgetsIndex >= 0; widgetsIndex--) {\n widget = this.grid[widgetsIndex];\n widget.setSize();\n widget.drag.toggle();\n widget.resize.toggle();\n }\n this.resize$.next();\n }\n updateGrid() {\n if (this.$options.displayGrid === 'always' && !this.mobile) {\n this.renderer.addClass(this.el, 'display-grid');\n }\n else if (this.$options.displayGrid === 'onDrag&Resize' &&\n this.dragInProgress) {\n this.renderer.addClass(this.el, 'display-grid');\n }\n else if (this.$options.displayGrid === 'none' ||\n !this.dragInProgress ||\n this.mobile) {\n this.renderer.removeClass(this.el, 'display-grid');\n }\n this.setGridDimensions();\n this.gridColumns.length = GridsterComponent.getNewArrayLength(this.columns, this.curWidth, this.curColWidth);\n this.gridRows.length = GridsterComponent.getNewArrayLength(this.rows, this.curHeight, this.curRowHeight);\n this.cdRef.markForCheck();\n }\n addItem(itemComponent) {\n if (itemComponent.$item.cols === undefined) {\n itemComponent.$item.cols = this.$options.defaultItemCols;\n itemComponent.item.cols = itemComponent.$item.cols;\n itemComponent.itemChanged();\n }\n if (itemComponent.$item.rows === undefined) {\n itemComponent.$item.rows = this.$options.defaultItemRows;\n itemComponent.item.rows = itemComponent.$item.rows;\n itemComponent.itemChanged();\n }\n if (itemComponent.$item.x === -1 || itemComponent.$item.y === -1) {\n this.autoPositionItem(itemComponent);\n }\n else if (this.checkCollision(itemComponent.$item)) {\n if (!this.$options.disableWarnings) {\n itemComponent.notPlaced = true;\n console.warn(\"Can't be placed in the bounds of the dashboard, trying to auto position!/n\" +\n JSON.stringify(itemComponent.item, ['cols', 'rows', 'x', 'y']));\n }\n if (!this.$options.disableAutoPositionOnConflict) {\n this.autoPositionItem(itemComponent);\n }\n else {\n itemComponent.notPlaced = true;\n }\n }\n this.grid.push(itemComponent);\n this.calculateLayout$.next();\n }\n removeItem(itemComponent) {\n this.grid.splice(this.grid.indexOf(itemComponent), 1);\n this.calculateLayout$.next();\n if (this.options.itemRemovedCallback) {\n this.options.itemRemovedCallback(itemComponent.item, itemComponent);\n }\n // check the moving item was removed\n if (this.movingItem && this.movingItem === itemComponent.$item) {\n this.movingItem = null;\n this.previewStyle();\n }\n }\n checkCollision(item, checkRatio) {\n let collision = false;\n if (this.options.itemValidateCallback) {\n collision = !this.options.itemValidateCallback(item);\n }\n if (!collision && this.checkGridCollision(item, checkRatio)) {\n collision = true;\n }\n if (!collision) {\n const c = this.findItemWithItem(item);\n if (c) {\n collision = c;\n }\n }\n return collision;\n }\n checkGridCollision(item, checkRatio = false) {\n const noNegativePosition = item.y > -1 && item.x > -1;\n const maxGridCols = item.cols + item.x <= this.$options.maxCols;\n const maxGridRows = item.rows + item.y <= this.$options.maxRows;\n const maxItemCols = item.maxItemCols === undefined\n ? this.$options.maxItemCols\n : item.maxItemCols;\n const minItemCols = item.minItemCols === undefined\n ? this.$options.minItemCols\n : item.minItemCols;\n const maxItemRows = item.maxItemRows === undefined\n ? this.$options.maxItemRows\n : item.maxItemRows;\n const minItemRows = item.minItemRows === undefined\n ? this.$options.minItemRows\n : item.minItemRows;\n const inColsLimits = item.cols <= maxItemCols && item.cols >= minItemCols;\n const inRowsLimits = item.rows <= maxItemRows && item.rows >= minItemRows;\n let inRatio = true;\n if (checkRatio) {\n const itemAspectRatio = item.itemAspectRatio || this.$options.itemAspectRatio;\n if (itemAspectRatio) {\n inRatio = item.cols / item.rows === itemAspectRatio;\n }\n }\n const minAreaLimit = item.minItemArea === undefined\n ? this.$options.minItemArea\n : item.minItemArea;\n const maxAreaLimit = item.maxItemArea === undefined\n ? this.$options.maxItemArea\n : item.maxItemArea;\n const area = item.cols * item.rows;\n const inMinArea = minAreaLimit <= area;\n const inMaxArea = maxAreaLimit >= area;\n return !(noNegativePosition &&\n maxGridCols &&\n maxGridRows &&\n inRatio &&\n inColsLimits &&\n inRowsLimits &&\n inMinArea &&\n inMaxArea);\n }\n findItemWithItem(item) {\n let widgetsIndex = 0;\n let widget;\n for (; widgetsIndex < this.grid.length; widgetsIndex++) {\n widget = this.grid[widgetsIndex];\n if (widget.$item !== item &&\n this.checkCollisionTwoItems(widget.$item, item)) {\n return widget;\n }\n }\n return false;\n }\n findItemsWithItem(item) {\n const a = [];\n let widgetsIndex = 0;\n let widget;\n for (; widgetsIndex < this.grid.length; widgetsIndex++) {\n widget = this.grid[widgetsIndex];\n if (widget.$item !== item &&\n this.checkCollisionTwoItems(widget.$item, item)) {\n a.push(widget);\n }\n }\n return a;\n }\n autoPositionItem(itemComponent) {\n if (this.getNextPossiblePosition(itemComponent.$item)) {\n itemComponent.notPlaced = false;\n itemComponent.item.x = itemComponent.$item.x;\n itemComponent.item.y = itemComponent.$item.y;\n itemComponent.itemChanged();\n }\n else {\n itemComponent.notPlaced = true;\n if (!this.$options.disableWarnings) {\n console.warn(\"Can't be placed in the bounds of the dashboard!/n\" +\n JSON.stringify(itemComponent.item, ['cols', 'rows', 'x', 'y']));\n }\n }\n }\n getNextPossiblePosition = (newItem, startingFrom = {}) => {\n if (newItem.cols === -1) {\n newItem.cols = this.$options.defaultItemCols;\n }\n if (newItem.rows === -1) {\n newItem.rows = this.$options.defaultItemRows;\n }\n this.setGridDimensions();\n let rowsIndex = startingFrom.y || 0;\n let colsIndex;\n for (; rowsIndex < this.rows; rowsIndex++) {\n newItem.y = rowsIndex;\n colsIndex = startingFrom.x || 0;\n for (; colsIndex < this.columns; colsIndex++) {\n newItem.x = colsIndex;\n if (!this.checkCollision(newItem)) {\n return true;\n }\n }\n }\n const canAddToRows = this.$options.maxRows >= this.rows + newItem.rows;\n const canAddToColumns = this.$options.maxCols >= this.columns + newItem.cols;\n const addToRows = this.rows <= this.columns && canAddToRows;\n if (!addToRows && canAddToColumns) {\n newItem.x = this.columns;\n newItem.y = 0;\n return true;\n }\n else if (canAddToRows) {\n newItem.y = this.rows;\n newItem.x = 0;\n return true;\n }\n return false;\n };\n getFirstPossiblePosition = (item) => {\n const tmpItem = Object.assign({}, item);\n this.getNextPossiblePosition(tmpItem);\n return tmpItem;\n };\n getLastPossiblePosition = (item) => {\n let farthestItem = { y: 0, x: 0 };\n farthestItem = this.grid.reduce((prev, curr) => {\n const currCoords = {\n y: curr.$item.y + curr.$item.rows - 1,\n x: curr.$item.x + curr.$item.cols - 1\n };\n if (GridsterUtils.compareItems(prev, currCoords) === 1) {\n return currCoords;\n }\n else {\n return prev;\n }\n }, farthestItem);\n const tmpItem = Object.assign({}, item);\n this.getNextPossiblePosition(tmpItem, farthestItem);\n return tmpItem;\n };\n pixelsToPositionX(x, roundingMethod, noLimit) {\n const position = roundingMethod(x / this.curColWidth);\n if (noLimit) {\n return position;\n }\n else {\n return Math.max(position, 0);\n }\n }\n pixelsToPositionY(y, roundingMethod, noLimit) {\n const position = roundingMethod(y / this.curRowHeight);\n if (noLimit) {\n return position;\n }\n else {\n return Math.max(position, 0);\n }\n }\n positionXToPixels(x) {\n return x * this.curColWidth;\n }\n positionYToPixels(y) {\n return y * this.curRowHeight;\n }\n getItemComponent(item) {\n return this.grid.find(c => c.item === item);\n }\n // ------ Functions for swapWhileDragging option\n // identical to checkCollision() except that this function calls findItemWithItemForSwaping() instead of findItemWithItem()\n checkCollisionForSwaping(item) {\n let collision = false;\n if (this.options.itemValidateCallback) {\n collision = !this.options.itemValidateCallback(item);\n }\n if (!collision && this.checkGridCollision(item)) {\n collision = true;\n }\n if (!collision) {\n const c = this.findItemWithItemForSwapping(item);\n if (c) {\n collision = c;\n }\n }\n return collision;\n }\n // identical to findItemWithItem() except that this function calls checkCollisionTwoItemsForSwaping() instead of checkCollisionTwoItems()\n findItemWithItemForSwapping(item) {\n let widgetsIndex = this.grid.length - 1;\n let widget;\n for (; widgetsIndex > -1; widgetsIndex--) {\n widget = this.grid[widgetsIndex];\n if (widget.$item !== item &&\n GridsterComponent.checkCollisionTwoItemsForSwaping(widget.$item, item)) {\n return widget;\n }\n }\n return false;\n }\n previewStyle(drag = false) {\n const preview = this.gridsterPreview();\n if (this.movingItem) {\n if (this.compact && drag) {\n this.compact.checkCompactItem(this.movingItem);\n }\n preview.previewStyle(this.movingItem);\n }\n else {\n preview.previewStyle(null);\n }\n }\n // ------ End of functions for swapWhileDragging option\n // eslint-disable-next-line @typescript-eslint/member-ordering\n static getNewArrayLength(length, overallSize, size) {\n const newLength = Math.max(length, Math.floor(overallSize / size));\n if (newLength < 0) {\n return 0;\n }\n if (Number.isFinite(newLength)) {\n return Math.floor(newLength);\n }\n return 0;\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.13\", ngImport: i0, type: GridsterComponent, deps: [{ token: ElementRef }, { token: Renderer2 }, { token: ChangeDetectorRef }, { token: NgZone }], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.13\", type: GridsterComponent, isStandalone: true, selector: \"gridster\", inputs: { options: \"options\" }, viewQueries: [{ propertyName: \"gridsterPreview\", first: true, predicate: GridsterPreviewComponent, descendants: true, isSignal: true }], usesOnChanges: true, ngImport: i0, template: \"@for (column of gridColumns; track i; let i = $index) {\\n<div\\n class=\\\"gridster-column\\\"\\n [ngStyle]=\\\"gridRenderer.getGridColumnStyle(i)\\\"\\n></div>\\n} @for (row of gridRows; track i; let i = $index) {\\n<div class=\\\"gridster-row\\\" [ngStyle]=\\\"gridRenderer.getGridRowStyle(i)\\\"></div>\\n}\\n<ng-content></ng-content>\\n<gridster-preview\\n [gridRenderer]=\\\"gridRenderer\\\"\\n class=\\\"gridster-preview\\\"\\n></gridster-preview>\\n\", styles: [\"gridster{position:relative;box-sizing:border-box;background:gray;width:100%;height:100%;-webkit-user-select:none;user-select:none;display:block}gridster.fit{overflow-x:hidden;overflow-y:hidden}gridster.scrollVertical{overflow-x:hidden;overflow-y:auto}gridster.scrollHorizontal{overflow-x:auto;overflow-y:hidden}gridster.fixed{overflow:auto}gridster.mobile{overflow-x:hidden;overflow-y:auto}gridster.mobile gridster-item{position:relative}gridster.gridSize{height:initial;width:initial}gridster.gridSize.fit{height:100%;width:100%}gridster .gridster-column,gridster .gridster-row{position:absolute;display:none;transition:.3s;box-sizing:border-box}gridster.display-grid .gridster-column,gridster.display-grid .gridster-row{display:block}gridster .gridster-column{border-left:1px solid white;border-right:1px solid white}gridster .gridster-row{border-top:1px solid white;border-bottom:1px solid white}\\n\"], dependencies: [{ kind: \"directive\", type: NgStyle, selector: \"[ngStyle]\", inputs: [\"ngStyle\"] }, { kind: \"component\", type: GridsterPreviewComponent, selector: \"gridster-preview\", inputs: [\"gridRenderer\"] }], encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.13\", ngImport: i0, type: GridsterComponent, decorators: [{\n type: Component,\n args: [{ selector: 'gridster', encapsulation: ViewEncapsulation.None, imports: [NgStyle, GridsterPreviewComponent], template: \"@for (column of gridColumns; track i; let i = $index) {\\n<div\\n class=\\\"gridster-column\\\"\\n [ngStyle]=\\\"gridRenderer.getGridColumnStyle(i)\\\"\\n></div>\\n} @for (row of gridRows; track i; let i = $index) {\\n<div class=\\\"gridster-row\\\" [ngStyle]=\\\"gridRenderer.getGridRowStyle(i)\\\"></div>\\n}\\n<ng-content></ng-content>\\n<gridster-preview\\n [gridRenderer]=\\\"gridRenderer\\\"\\n class=\\\"gridster-preview\\\"\\n></gridster-preview>\\n\", styles: [\"gridster{position:relative;box-sizing:border-box;background:gray;width:100%;height:100%;-webkit-user-select:none;user-select:none;display:block}gridster.fit{overflow-x:hidden;overflow-y:hidden}gridster.scrollVertical{overflow-x:hidden;overflow-y:auto}gridster.scrollHorizontal{overflow-x:auto;overflow-y:hidden}gridster.fixed{overflow:auto}gridster.mobile{overflow-x:hidden;overflow-y:auto}gridster.mobile gridster-item{position:relative}gridster.gridSize{height:initial;width:initial}gridster.gridSize.fit{height:100%;width:100%}gridster .gridster-column,gridster .gridster-row{position:absolute;display:none;transition:.3s;box-sizing:border-box}gridster.display-grid .gridster-column,gridster.display-grid .gridster-row{display:block}gridster .gridster-column{border-left:1px solid white;border-right:1px solid white}gridster .gridster-row{border-top:1px solid white;border-bottom:1px solid white}\\n\"] }]\n }], ctorParameters: () => [{ type: i0.ElementRef, decorators: [{\n type: Inject,\n args: [ElementRef]\n }] }, { type: i0.Renderer2, decorators: [{\n type: Inject,\n args: [Renderer2]\n }] }, { type: i0.ChangeDetectorRef, decorators: [{\n type: Inject,\n args: [ChangeDetectorRef]\n }] }, { type: i0.NgZone, decorators: [{\n type: Inject,\n args: [NgZone]\n }] }], propDecorators: { gridsterPreview: [{ type: i0.ViewChild, args: [i0.forwardRef(() => GridsterPreviewComponent), { isSignal: true }] }], options: [{\n type: Input\n }] } });\n\nclass GridsterPush {\n fromSouth;\n fromNorth;\n fromEast;\n fromWest;\n pushedItems;\n pushedItemsTemp;\n pushedItemsTempPath;\n pushedItemsPath;\n gridsterItem;\n gridster;\n pushedItemsOrder;\n tryPattern;\n iteration = 0;\n constructor(gridsterItem) {\n this.pushedItems = [];\n this.pushedItemsTemp = [];\n this.pushedItemsTempPath = [];\n this.pushedItemsPath = [];\n this.gridsterItem = gridsterItem;\n this.gridster = gridsterItem.gridster;\n this.tryPattern = {\n fromEast: [this.tryWest, this.trySouth, this.tryNorth, this.tryEast],\n fromWest: [this.tryEast, this.trySouth, this.tryNorth, this.tryWest],\n fromNorth: [this.trySouth, this.tryEast, this.tryWest, this.tryNorth],\n fromSouth: [this.tryNorth, this.tryEast, this.tryWest, this.trySouth]\n };\n this.fromSouth = 'fromSouth';\n this.fromNorth = 'fromNorth';\n this.fromEast = 'fromEast';\n this.fromWest = 'fromWest';\n }\n destroy() {\n this.gridster = this.gridsterItem = null;\n }\n pushItems(direction, disable) {\n if (this.gridster.$options.pushItems && !disable) {\n this.pushedItemsOrder = [];\n this.iteration = 0;\n const pushed = this.push(this.gridsterItem, direction);\n if (!pushed) {\n this.restoreTempItems();\n }\n this.pushedItemsOrder = [];\n this.pushedItemsTemp = [];\n this.pushedItemsTempPath = [];\n return pushed;\n }\n else {\n return false;\n }\n }\n restoreTempItems() {\n let i = this.pushedItemsTemp.length - 1;\n for (; i > -1; i--) {\n this.removeFromTempPushed(this.pushedItemsTemp[i]);\n }\n }\n restoreItems() {\n let i = 0;\n const l = this.pushedItems.length;\n let pushedItem;\n for (; i < l; i++) {\n pushedItem = this.pushedItems[i];\n pushedItem.$item.x = pushedItem.item.x || 0;\n pushedItem.$item.y = pushedItem.item.y || 0;\n pushedItem.setSize();\n }\n this.pushedItems = [];\n this.pushedItemsPath = [];\n }\n setPushedItems() {\n let i = 0;\n const l = this.pushedItems.length;\n let pushedItem;\n for (; i < l; i++) {\n pushedItem = this.pushedItems[i];\n pushedItem.checkItemChanges(pushedItem.$item, pushedItem.item);\n }\n this.pushedItems = [];\n this.pushedItemsPath = [];\n }\n checkPushBack() {\n let i = this.pushedItems.length - 1;\n let change = false;\n for (; i > -1; i--) {\n if (this.checkPushedItem(this.pushedItems[i], i)) {\n change = true;\n }\n }\n if (change) {\n this.checkPushBack();\n }\n }\n push(gridsterItem, direction) {\n if (this.iteration > 100) {\n console.warn('max iteration reached');\n return false;\n }\n if (this.gridster.checkGridCollision(gridsterItem.$item)) {\n return false;\n }\n if (direction === '') {\n return false;\n }\n const conflicts = this.gridster.findItemsWithItem(gridsterItem.$item);\n const invert = direction === this.fromNorth || direction === this.fromWest;\n // sort the list of conflicts in order of [y,x]. Invert when the push is from north and west\n // this is done so they don't conflict witch each other and revert positions, keeping the previous order\n conflicts.sort((a, b) => {\n if (invert) {\n return b.$item.y - a.$item.y || b.$item.x - a.$item.x;\n }\n else {\n return a.$item.y - b.$item.y || a.$item.x - b.$item.x;\n }\n });\n let i = 0;\n let itemCollision;\n let makePush = true;\n const pushedItems = [];\n for (; i < conflicts.length; i++) {\n itemCollision = conflicts[i];\n if (itemCollision === this.gridsterItem) {\n continue;\n }\n if (!itemCollision.canBeDragged()) {\n makePush = false;\n break;\n }\n const p = this.pushedItemsTemp.indexOf(itemCollision);\n if (p > -1 && this.pushedItemsTempPath[p].length > 10) {\n // stop if item is pushed more than 10 times to break infinite loops\n makePush = false;\n break;\n }\n if (this.tryPattern[direction][0].call(this, itemCollision, gridsterItem)) {\n this.pushedItemsOrder.push(itemCollision);\n pushedItems.push(itemCollision);\n }\n else if (this.tryPattern[direction][1].call(this, itemCollision, gridsterItem)) {\n this.pushedItemsOrder.push(itemCollision);\n pushedItems.push(itemCollision);\n }\n else if (this.tryPattern[direction][2].call(this, itemCollision, gridsterItem)) {\n this.pushedItemsOrder.push(itemCollision);\n pushedItems.push(itemCollision);\n }\n else if (this.tryPattern[direction][3].call(this, itemCollision, gridsterItem)) {\n this.pushedItemsOrder.push(itemCollision);\n pushedItems.push(itemCollision);\n }\n else {\n makePush = false;\n break;\n }\n }\n if (!makePush) {\n i = this.pushedItemsOrder.lastIndexOf(pushedItems[0]);\n if (i > -1) {\n let j = this.pushedItemsOrder.length - 1;\n for (; j >= i; j--) {\n itemCollision = this.pushedItemsOrder[j];\n this.pushedItemsOrder.pop();\n this.removeFromTempPushed(itemCollision);\n this.removeFromPushedItem(itemCollision);\n }\n }\n }\n this.iteration++;\n return makePush;\n }\n trySouth(gridsterItemCollide, gridsterItem) {\n if (!this.gridster.$options.pushDirections.south) {\n return false;\n }\n this.addToTempPushed(gridsterItemCollide);\n gridsterItemCollide.$item.y =\n gridsterItem.$item.y + gridsterItem.$item.rows;\n if (this.push(gridsterItemCollide, this.fromNorth)) {\n gridsterItemCollide.setSize();\n this.addToPushed(gridsterItemCollide);\n return true;\n }\n else {\n this.removeFromTempPushed(gridsterItemCollide);\n }\n return false;\n }\n tryNorth(gridsterItemCollide, gridsterItem) {\n if (!this.gridster.$options.pushDirections.north) {\n return false;\n }\n this.addToTempPushed(gridsterItemCollide);\n gridsterItemCollide.$item.y =\n gridsterItem.$item.y - gridsterItemCollide.$item.rows;\n if (this.push(gridsterItemCollide, this.fromSouth)) {\n gridsterItemCollide.setSize();\n this.addToPushed(gridsterItemCollide);\n return true;\n }\n else {\n this.removeFromTempPushed(gridsterItemCollide);\n }\n return false;\n }\n tryEast(gridsterItemCollide, gridsterItem) {\n if (!this.gridster.$options.pushDirections.east) {\n return false;\n }\n this.addToTempPushed(gridsterItemCollide);\n gridsterItemCollide.$item.x =\n gridsterItem.$item.x + gridsterItem.$item.cols;\n if (this.push(gridsterItemCollide, this.fromWest)) {\n gridsterItemCollide.setSize();\n this.addToPushed(gridsterItemCollide);\n return true;\n }\n else {\n this.removeFromTempPushed(gridsterItemCollide);\n }\n return false;\n }\n tryWest(gridsterItemCollide, gridsterItem) {\n if (!this.gridster.$options.pushDirections.west) {\n return false;\n }\n this.addToTempPushed(gridsterItemCollide);\n gridsterItemCollide.$item.x =\n gridsterItem.$item.x - gridsterItemCollide.$item.cols;\n if (this.push(gridsterItemCollide, this.fromEast)) {\n gridsterItemCollide.setSize();\n this.addToPushed(gridsterItemCollide);\n return true;\n }\n else {\n this.removeFromTempPushed(gridsterItemCollide);\n }\n return false;\n }\n addToTempPushed(gridsterItem) {\n let i = this.pushedItemsTemp.indexOf(gridsterItem);\n if (i === -1) {\n i = this.pushedItemsTemp.push(gridsterItem) - 1;\n this.pushedItemsTempPath[i] = [];\n }\n this.pushedItemsTempPath[i].push({\n x: gridsterItem.$item.x,\n y: gridsterItem.$item.y\n });\n }\n removeFromTempPushed(gridsterItem) {\n const i = this.pushedItemsTemp.indexOf(gridsterItem);\n const tempPosition = this.pushedItemsTempPath[i].pop();\n if (!tempPosition) {\n return;\n }\n gridsterItem.$item.x = tempPosition.x;\n gridsterItem.$item.y = tempPosition.y;\n gridsterItem.setSize();\n if (!this.pushedItemsTempPath[i].length) {\n this.pushedItemsTemp.splice(i, 1);\n this.pushedItemsTempPath.splice(i, 1);\n }\n }\n addToPushed(gridsterItem) {\n if (this.pushedItems.indexOf(gridsterItem) < 0) {\n this.pushedItems.push(gridsterItem);\n this.pushedItemsPath.push([\n { x: gridsterItem.item.x || 0, y: gridsterItem.item.y || 0 },\n { x: gridsterItem.$item.x, y: gridsterItem.$item.y }\n ]);\n }\n else {\n const i = this.pushedItems.indexOf(gridsterItem);\n this.pushedItemsPath[i].push({\n x: gridsterItem.$item.x,\n y: gridsterItem.$item.y\n });\n }\n }\n removeFromPushed(i) {\n if (i > -1) {\n this.pushedItems.splice(i, 1);\n this.pushedItemsPath.splice(i, 1);\n }\n }\n removeFromPushedItem(gridsterItem) {\n const i = this.pushedItems.indexOf(gridsterItem);\n if (i > -1) {\n this.pushedItemsPath[i].pop();\n if (!this.pushedItemsPath.length) {\n this.pushedItems.splice(i, 1);\n this.pushedItemsPath.splice(i, 1);\n }\n }\n }\n checkPushedItem(pushedItem, i) {\n const path = this.pushedItemsPath[i];\n let j = path.length - 2;\n let lastPosition;\n let x;\n let y;\n let change = false;\n for (; j > -1; j--) {\n lastPosition = path[j];\n x = pushedItem.$item.x;\n y = pushedItem.$item.y;\n pushedItem.$item.x = lastPosition.x;\n pushedItem.$item.y = lastPosition.y;\n if (!this.gridster.findItemWithItem(pushedItem.$item)) {\n pushedItem.setSize();\n path.splice(j + 1, path.length - j - 1);\n change = true;\n }\n else {\n pushedItem.$item.x = x;\n pushedItem.$item.y = y;\n }\n }\n if (path.length < 2) {\n this.removeFromPushed(i);\n }\n return change;\n }\n}\n\nlet scrollSensitivity;\nlet scrollSpeed;\nconst intervalDuration = 50;\nlet gridsterElement;\nlet resizeEvent;\nlet resizeEventType;\nlet intervalE;\nlet intervalW;\nlet intervalN;\nlet intervalS;\nfunction scroll(gridster, left, top, width, height, event, lastMouse, calculateItemPosition, resize, resizeEventScrollType) {\n scrollSensitivity = gridster.$options.scrollSensitivity;\n scrollSpeed = gridster.$options.scrollSpeed;\n gridsterElement = gridster.el;\n resizeEvent = resize;\n resizeEventType = resizeEventScrollType;\n const offsetWidth = gridsterElement.offsetWidth;\n const offsetHeight = gridsterElement.offsetHeight;\n const offsetLeft = gridsterElement.scrollLeft;\n const offsetTop = gridsterElement.scrollTop;\n const elemTopOffset = top - offsetTop;\n const elemBottomOffset = offsetHeight + offsetTop - top - height;\n const { clientX, clientY } = event;\n if (!gridster.$options.disableScrollVertical) {\n if (lastMouse.clientY < clientY && elemBottomOffset < scrollSensitivity) {\n cancelN();\n if ((resizeEvent && resizeEventType && !resizeEventType.south) ||\n intervalS) {\n return;\n }\n intervalS = startVertical(1, calculateItemPosition, lastMouse);\n }\n else if (lastMouse.clientY > clientY &&\n offsetTop > 0 &&\n elemTopOffset < scrollSensitivity) {\n cancelS();\n if ((resizeEvent && resizeEventType && !resizeEventType.north) ||\n intervalN) {\n return;\n }\n intervalN = startVertical(-1, calculateItemPosition, lastMouse);\n }\n else if (lastMouse.clientY !== clientY) {\n cancelVertical();\n }\n }\n const elemRightOffset = offsetLeft + offsetWidth - left - width;\n const elemLeftOffset = left - offsetLeft;\n if (!gridster.$options.disableScrollHorizontal) {\n const isRTL = gridster.$options.dirType === DirTypes.RTL;\n const moveRight = lastMouse.clientX < clientX;\n const moveLeft = lastMouse.clientX > clientX;\n const shouldScrollRight = isRTL ? moveLeft : moveRight;\n const shouldScrollLeft = isRTL ? moveRight : moveLeft;\n if (shouldScrollRight && elemRightOffset <= scrollSensitivity) {\n cancelW();\n if ((resizeEvent && resizeEventType && !resizeEventType.east) || intervalE)\n return;\n intervalE = startHorizontal(1, calculateItemPosition, lastMouse, isRTL);\n }\n else if (shouldScrollLeft && offsetLeft > 0 && elemLeftOffset < scrollSensitivity) {\n cancelE();\n if ((resizeEvent && resizeEventType && !resizeEventType.west) || intervalW)\n return;\n intervalW = startHorizontal(-1, calculateItemPosition, lastMouse, isRTL);\n }\n else if (lastMouse.clientX !== clientX) {\n cancelHorizontal();\n }\n }\n}\nfunction startVertical(sign, calculateItemPosition, lastMouse) {\n let clientY = lastMouse.clientY;\n return window.setInterval(() => {\n if (!gridsterElement ||\n (sign === -1 && gridsterElement.scrollTop - scrollSpeed < 0)) {\n cancelVertical();\n }\n gridsterElement.scrollTop += sign * scrollSpeed;\n clientY += sign * scrollSpeed;\n calculateItemPosition({ clientX: lastMouse.clientX, clientY });\n }, intervalDuration);\n}\nfunction startHorizontal(sign, calculateItemPosition, lastMouse, isRTL) {\n let clientX = lastMouse.clientX;\n return window.setInterval(() => {\n if (!gridsterElement) {\n cancelHorizontal();\n return;\n }\n const scrollAmount = sign * scrollSpeed;\n const left = isRTL ? -scrollAmount : scrollAmount;\n gridsterElement.scrollBy({ left, behavior: 'auto' });\n clientX += left;\n calculateItemPosition({ clientX, clientY: lastMouse.clientY });\n }, intervalDuration);\n}\nfunction cancelScroll() {\n cancelHorizontal();\n cancelVertical();\n gridsterElement = null;\n}\nfunction cancelHorizontal() {\n cancelE();\n cancelW();\n}\nfunction cancelVertical() {\n cancelN();\n cancelS();\n}\nfunction cancelE() {\n if (intervalE) {\n clearInterval(intervalE);\n intervalE = 0;\n }\n}\nfunction cancelW() {\n if (intervalW) {\n clearInterval(intervalW);\n intervalW = 0;\n }\n}\nfunction cancelS() {\n if (intervalS) {\n clearInterval(intervalS);\n intervalS = 0;\n }\n}\nfunction cancelN() {\n if (intervalN) {\n clearInterval(intervalN);\n intervalN = 0;\n }\n}\n\nclass GridsterSwap {\n swapedItem;\n gridsterItem;\n gridster;\n constructor(gridsterItem) {\n this.gridsterItem = gridsterItem;\n this.gridster = gridsterItem.gridster;\n }\n destroy() {\n this.gridster = this.gridsterItem = this.swapedItem = null;\n }\n swapItems() {\n if (this.gridster.$options.swap) {\n this.checkSwapBack();\n this.checkSwap(this.gridsterItem);\n }\n }\n checkSwapBack() {\n if (this.swapedItem) {\n const x = this.swapedItem.$item.x;\n const y = this.swapedItem.$item.y;\n this.swapedItem.$item.x = this.swapedItem.item.x || 0;\n this.swapedItem.$item.y = this.swapedItem.item.y || 0;\n if (this.gridster.checkCollision(this.swapedItem.$item)) {\n this.swapedItem.$item.x = x;\n this.swapedItem.$item.y = y;\n }\n else {\n this.swapedItem.setSize();\n this.gridsterItem.$item.x = this.gridsterItem.item.x || 0;\n this.gridsterItem.$item.y = this.gridsterItem.item.y || 0;\n this.swapedItem = undefined;\n }\n }\n }\n restoreSwapItem() {\n if (this.swapedItem) {\n this.swapedItem.$item.x = this.swapedItem.item.x || 0;\n this.swapedItem.$item.y = this.swapedItem.item.y || 0;\n this.swapedItem.setSize();\n this.swapedItem = undefined;\n }\n }\n setSwapItem() {\n if (this.swapedItem) {\n this.swapedItem.checkItemChanges(this.swapedItem.$item, this.swapedItem.item);\n this.swapedItem = undefined;\n }\n }\n checkSwap(pushedBy) {\n let gridsterItemCollision;\n if (this.gridster.$options.swapWhileDragging) {\n gridsterItemCollision = this.gridster.checkCollisionForSwaping(pushedBy.$item);\n }\n else {\n gridsterItemCollision = this.gridster.checkCollision(pushedBy.$item);\n }\n if (gridsterItemCollision &&\n gridsterItemCollision !== true &&\n gridsterItemCollision.canBeDragged()) {\n const gridsterItemCollide = gridsterItemCollision;\n const copyCollisionX = gridsterItemCollide.$item.x;\n const copyCollisionY = gridsterItemCollide.$item.y;\n const copyX = pushedBy.$item.x;\n const copyY = pushedBy.$item.y;\n const diffX = copyX - copyCollisionX;\n const diffY = copyY - copyCollisionY;\n gridsterItemCollide.$item.x = pushedBy.item.x - diffX;\n gridsterItemCollide.$item.y = pushedBy.item.y - diffY;\n pushedBy.$item.x = gridsterItemCollide.item.x + diffX;\n pushedBy.$item.y = gridsterItemCollide.item.y + diffY;\n if (this.gridster.checkCollision(gridsterItemCollide.$item) ||\n this.gridster.checkCollision(pushedBy.$item)) {\n pushedBy.$item.x = copyX;\n pushedBy.$item.y = copyY;\n gridsterItemCollide.$item.x = copyCollisionX;\n gridsterItemCollide.$item.y = copyCollisionY;\n }\n else {\n gridsterItemCollide.setSize();\n this.swapedItem = gridsterItemCollide;\n if (this.gridster.$options.swapWhileDragging) {\n this.gridsterItem.checkItemChanges(this.gridsterItem.$item, this.gridsterItem.item);\n this.setSwapItem();\n }\n }\n }\n }\n}\n\nconst GRIDSTER_ITEM_RESIZABLE_HANDLER_CLASS = 'gridster-item-resizable-handler';\nvar Direction;\n(function (Direction) {\n Direction[\"UP\"] = \"UP\";\n Direction[\"DOWN\"] = \"DOWN\";\n Direction[\"LEFT\"] = \"LEFT\";\n Direction[\"RIGHT\"] = \"RIGHT\";\n})(Direction || (Direction = {}));\nclass GridsterDraggable {\n zone;\n gridsterItem;\n gridster;\n lastMouse;\n offsetLeft;\n offsetTop;\n margin;\n outerMarginTop;\n outerMarginRight;\n outerMarginBottom;\n outerMarginLeft;\n diffTop;\n diffLeft;\n originalClientX;\n originalClientY;\n top;\n left;\n height;\n width;\n positionX;\n positionY;\n positionXBackup;\n positionYBackup;\n enabled;\n mousemove;\n mouseup;\n mouseleave;\n cancelOnBlur;\n touchmove;\n touchend;\n touchcancel;\n mousedown;\n touchstart;\n push;\n swap;\n path;\n collision = false;\n constructor(gridsterItem, gridster, zone) {\n this.zone = zone;\n this.gridsterItem = gridsterItem;\n this.gridster = gridster;\n this.lastMouse = {\n clientX: 0,\n clientY: 0\n };\n this.path = [];\n }\n destroy() {\n if (this.gridster.previewStyle) {\n this.gridster.previewStyle(true);\n }\n this.gridsterItem = this.gridster = this.collision = null;\n if (this.mousedown) {\n this.mousedown();\n this.touchstart();\n }\n }\n dragStart(e) {\n if ((e.which && e.which !== 1) || this.gridster.dragInProgress) {\n return;\n }\n if (this.gridster.options.draggable &&\n this.gridster.options.draggable.start) {\n this.gridster.options.draggable.start(this.gridsterItem.item, this.gridsterItem, e);\n }\n e.stopPropagation();\n e.preventDefault();\n this.zone.runOutsideAngular(() => {\n this.mousemove = this.gridsterItem.renderer.listen('document', 'mousemove', this.dragMove);\n this.touchmove = this.gridster.renderer.listen(this.gridster.el, 'touchmove', this.dragMove);\n });\n this.mouseup = this.gridsterItem.renderer.listen('document', 'mouseup', this.dragStop);\n this.mouseleave = this.gridsterItem.renderer.listen('document', 'mouseleave', this.dragStop);\n this.cancelOnBlur = this.gridsterItem.renderer.listen('window', 'blur', this.dragStop);\n this.touchend = this.gridsterItem.renderer.listen('document', 'touchend', this.dragStop);\n this.touchcancel = this.gridsterItem.renderer.listen('document', 'touchcancel', this.dragStop);\n this.gridsterItem.renderer.addClass(this.gridsterItem.el, 'gridster-item-moving');\n this.margin = this.gridster.$options.margin;\n this.outerMarginTop = this.gridster.$options.outerMarginTop;\n this.outerMarginRight = this.gridster.$options.outerMarginRight;\n this.outerMarginBottom = this.gridster.$options.outerMarginBottom;\n this.outerMarginLeft = this.gridster.$options.outerMarginLeft;\n this.offsetLeft = this.gridster.el.scrollLeft - this.gridster.el.offsetLeft;\n this.offsetTop = this.gridster.el.scrollTop - this.gridster.el.offsetTop;\n this.left = this.gridsterItem.left - this.margin;\n this.top = this.gridsterItem.top - this.margin;\n this.originalClientX = e.clientX;\n this.originalClientY = e.clientY;\n this.width = this.gridsterItem.width;\n this.height = this.gridsterItem.height;\n if (this.gridster.$options.dirType === DirTypes.RTL) {\n this.diffLeft =\n e.clientX - this.gridster.el.scrollWidth + this.gridsterItem.left;\n }\n else {\n this.diffLeft = e.clientX + this.offsetLeft - this.margin - this.left;\n }\n this.diffTop = e.clientY + this.offsetTop - this.margin - this.top;\n this.gridster.movingItem = this.gridsterItem.$item;\n this.gridster.previewStyle(true);\n this.push = new GridsterPush(this.gridsterItem);\n this.swap = new GridsterSwap(this.gridsterItem);\n this.gridster.dragInProgress = true;\n this.gridster.updateGrid();\n this.path.push({\n x: this.gridsterItem.item.x || 0,\n y: this.gridsterItem.item.y || 0\n });\n }\n dragMove = (e) => {\n e.stopPropagation();\n e.preventDefault();\n GridsterUtils.checkTouchEvent(e);\n // get the directions of the mouse event\n let directions = this.getDirections(e);\n if (this.gridster.options.enableBoundaryControl) {\n // prevent moving up at the top of gridster\n if (directions.includes(Direction.UP) &&\n this.gridsterItem.el.getBoundingClientRect().top <\n this.gridster.el.getBoundingClientRect().top +\n (this.outerMarginTop ?? this.margin)) {\n directions = directions.filter(direction => direction != Direction.UP);\n e = new MouseEvent(e.type, {\n clientX: e.clientX,\n clientY: this.lastMouse.clientY\n });\n }\n // prevent moving left at the leftmost column of gridster\n if (directions.includes(Direction.LEFT) &&\n this.gridsterItem.el.getBoundingClientRect().left <\n this.gridster.el.getBoundingClientRect().left +\n (this.outerMarginLeft ?? this.margin)) {\n directions = directions.filter(direction => direction != Direction.LEFT);\n e = new MouseEvent(e.type, {\n clientX: this.lastMouse.clientX,\n clientY: e.clientY\n });\n }\n // prevent moving right at the rightmost column of gridster\n if (directions.includes(Direction.RIGHT) &&\n this.gridsterItem.el.getBoundingClientRect().right >\n this.gridster.el.getBoundingClientRect().right -\n (this.outerMarginRight ?? this.margin)) {\n directions = directions.filter(direction => direction != Direction.RIGHT);\n e = new MouseEvent(e.type, {\n clientX: this.lastMouse.clientX,\n clientY: e.clientY\n });\n }\n // prevent moving down at the bottom of gridster\n if (directions.includes(Direction.DOWN) &&\n this.gridsterItem.el.getBoundingClientRect().bottom >\n this.gridster.el.getBoundingClientRect().bottom -\n (this.outerMarginBottom ?? this.margin)) {\n directions = directions.filter(direction => direction != Direction.DOWN);\n e = new MouseEvent(e.type, {\n clientX: e.clientX,\n clientY: this.lastMouse.clientY\n });\n }\n }\n // do not change item location when there is no direction to go\n if (directions.length) {\n this.offsetLeft =\n this.gridster.el.scrollLeft - this.gridster.el.offsetLeft;\n this.offsetTop = this.gridster.el.scrollTop - this.gridster.el.offsetTop;\n scroll(this.gridster, this.left, this.top, this.width, this.height, e, this.lastMouse, this.calculateItemPositionFromMousePosition);\n this.calculateItemPositionFromMousePosition(e);\n }\n };\n calculateItemPositionFromMousePosition = (e) => {\n if (this.gridster.options.scale) {\n this.calculateItemPositionWithScale(e, this.gridster.options.scale);\n }\n else {\n this.calculateItemPositionWithoutScale(e);\n }\n this.calculateItemPosition();\n this.lastMouse.clientX = e.clientX;\n this.lastMouse.clientY = e.clientY;\n this.zone.run(() => {\n this.gridster.updateGrid();\n });\n };\n calculateItemPositionWithScale(e, scale) {\n if (this.gridster.$options.dirType === DirTypes.RTL) {\n this.left =\n this.gridster.el.scrollWidth -\n this.originalClientX +\n (e.clientX - this.originalClientX) / scale +\n this.diffLeft;\n }\n else {\n this.left =\n this.originalClientX +\n (e.clientX - this.originalClientX) / scale +\n this.offsetLeft -\n this.diffLeft;\n }\n this.top =\n this.originalClientY +\n (e.clientY - this.originalClientY) / scale +\n this.offsetTop -\n this.diffTop;\n }\n calculateItemPositionWithoutScale(e) {\n const isRTL = this.gridster.$options.dirType === DirTypes.RTL;\n if (isRTL) {\n this.left = this.gridster.el.offsetWidth - (e.clientX + this.offsetLeft - this.diffLeft);\n }\n else {\n this.left = e.clientX + this.offsetLeft - this.diffLeft;\n }\n this.top = e.clientY + this.offsetTop - this.diffTop;\n }\n dragStop = (e) => {\n e.stopPropagation();\n e.preventDefault();\n cancelScroll();\n this.cancelOnBlur();\n this.mousemove();\n this.mouseup();\n this.mouseleave();\n this.touchmove();\n this.touchend();\n this.touchcancel();\n this.gridsterItem.renderer.removeClass(this.gridsterItem.el, 'gridster-item-moving');\n this.gridster.dragInProgress = false;\n this.gridster.updateGrid();\n this.path = [];\n if (this.gridster.options.draggable &&\n this.gridster.options.draggable.stop) {\n Promise.resolve(this.gridster.options.draggable.stop(this.gridsterItem.item, this.gridsterItem, e)).then(this.makeDrag, this.cancelDrag);\n }\n else {\n this.makeDrag();\n }\n setTimeout(() => {\n if (this.gridster) {\n this.gridster.movingItem = null;\n this.gridster.previewStyle(true);\n }\n });\n };\n cancelDrag = () => {\n this.gridsterItem.$item.x = this.gridsterItem.item.x || 0;\n this.gridsterItem.$item.y = this.gridsterItem.item.y || 0;\n this.gridsterItem.setSize();\n if (this.push) {\n this.push.restoreItems();\n }\n if (this.swap) {\n this.swap.restoreSwapItem();\n }\n if (this.push) {\n this.push.destroy();\n this.push = null;\n }\n if (this.swap) {\n this.swap.destroy();\n this.swap = null;\n }\n };\n makeDrag = () => {\n if (this.gridster.$options.draggable.dropOverItems &&\n this.gridster.options.draggable &&\n this.gridster.options.draggable.dropOverItemsCallback &&\n this.collision &&\n this.collision !== true &&\n this.collision.$item) {\n this.gridster.options.draggable.dropOverItemsCallback(this.gridsterItem.item, this.collision.item, this.gridster);\n }\n this.collision = false;\n this.gridsterItem.setSize();\n this.gridsterItem.checkItemChanges(this.gridsterItem.$item, this.gridsterItem.item);\n if (this.push) {\n this.push.setPushedItems();\n }\n if (this.swap) {\n this.swap.setSwapItem();\n }\n if (this.push) {\n this.push.destroy();\n this.push = null;\n }\n if (this.swap) {\n this.swap.destroy();\n this.swap = null;\n }\n };\n calculateItemPosition() {\n this.gridster.movingItem = this.gridsterItem.$item;\n this.positionX = this.gridster.pixelsToPositionX(this.left, Math.round);\n this.positionY = this.gridster.pixelsToPositionY(this.top, Math.round);\n this.positionXBackup = this.gridsterItem.$item.x;\n this.positionYBackup = this.gridsterItem.$item.y;\n this.gridsterItem.$item.x = this.positionX;\n if (this.gridster.checkGridCollision(this.gridsterItem.$item)) {\n this.gridsterItem.$item.x = this.positionXBackup;\n }\n this.gridsterItem.$item.y = this.positionY;\n if (this.gridster.checkGridCollision(this.gridsterItem.$item)) {\n this.gridsterItem.$item.y = this.positionYBackup;\n }\n this.gridster.gridRenderer.setCellPosition(this.gridsterItem.renderer, this.gridsterItem.el, this.left, this.top);\n if (this.positionXBackup !== this.gridsterItem.$item.x ||\n this.positionYBackup !== this.gridsterItem.$item.y) {\n const lastPosition = this.path[this.path.length - 1];\n let direction = '';\n if (lastPosition.x < this.gridsterItem.$item.x) {\n direction = this.push.fromWest;\n }\n else if (lastPosition.x > this.gridsterItem.$item.x) {\n direction = this.push.fromEast;\n }\n else if (lastPosition.y < this.gridsterItem.$item.y) {\n direction = this.push.fromNorth;\n }\n else if (lastPosition.y > this.gridsterItem.$item.y) {\n direction = this.push.fromSouth;\n }\n this.push.pushItems(direction, this.gridster.$options.disablePushOnDrag);\n this.swap.swapItems();\n this.collision = this.gridster.checkCollision(this.gridsterItem.$item);\n if (this.collision) {\n this.gridsterItem.$item.x = this.positionXBackup;\n this.gridsterItem.$item.y = this.positionYBackup;\n if (this.gridster.$options.draggable.dropOverItems &&\n this.collision !== true &&\n this.collision.$item) {\n this.gridster.movingItem = null;\n }\n }\n else {\n this.path.push({\n x: this.gridsterItem.$item.x,\n y: this.gridsterItem.$item.y\n });\n }\n this.push.checkPushBack();\n }\n else {\n // reset the collision when you drag and drop on an adjacent cell that is not empty\n // and go back to the cell you were in from the beginning,\n // this is to prevent `dropOverItemsCallback'\n this.collision = false;\n }\n this.gridster.previewStyle(true);\n }\n toggle() {\n const enableDrag = this.gridsterItem.canBeDragged();\n if (!this.enabled && enableDrag) {\n this.enabled = !this.enabled;\n this.mousedown = this.gridsterItem.renderer.listen(this.gridsterItem.el, 'mousedown', this.dragStartDelay);\n this.touchstart = this.gridsterItem.renderer.listen(this.gridsterItem.el, 'touchstart', this.dragStartDelay);\n }\n else if (this.enabled && !enableDrag) {\n this.enabled = !this.enabled;\n this.mousedown();\n this.touchstart();\n }\n }\n dragStartDelay = (e) => {\n const target = e.target;\n if (target.classList.contains(GRIDSTER_ITEM_RESIZABLE_HANDLER_CLASS)) {\n return;\n }\n if (GridsterUtils.checkContentClassForEvent(this.gridster, e)) {\n return;\n }\n GridsterUtils.checkTouchEvent(e);\n if (!this.gridster.$options.draggable.delayStart) {\n this.dragStart(e);\n return;\n }\n const timeout = setTimeout(() => {\n this.dragStart(e);\n cancelDrag();\n }, this.gridster.$options.draggable.delayStart);\n const cancelMouse = this.gridsterItem.renderer.listen('document', 'mouseup', cancelDrag);\n const cancelMouseLeave = this.gridsterItem.renderer.listen('document', 'mouseleave', cancelDrag);\n const cancelOnBlur = this.gridsterItem.renderer.listen('window', 'blur', cancelDrag);\n const cancelTouchMove = this.gridsterItem.renderer.listen('document', 'touchmove', cancelMove);\n const cancelTouchEnd = this.gridsterItem.renderer.listen('document', 'touchend', cancelDrag);\n const cancelTouchCancel = this.gridsterItem.renderer.listen('document', 'touchcancel', cancelDrag);\n function cancelMove(eventMove) {\n GridsterUtils.checkTouchEvent(eventMove);\n if (Math.abs(eventMove.clientX - e.clientX) > 9 ||\n Math.abs(eventMove.clientY - e.clientY) > 9) {\n cancelDrag();\n }\n }\n function cancelDrag() {\n clearTimeout(timeout);\n cancelOnBlur();\n cancelMouse();\n cancelMouseLeave();\n cancelTouchMove();\n cancelTouchEnd();\n cancelTouchCancel();\n }\n };\n /**\n * Returns the list of directions for given mouse event\n * @param e Mouse event\n * */\n getDirections(e) {\n const directions = [];\n if (this.lastMouse.clientX === 0 && this.lastMouse.clientY === 0) {\n this.lastMouse.clientY = e.clientY;\n this.lastMouse.clientX = e.clientX;\n }\n if (this.lastMouse.clientY > e.clientY) {\n directions.push(Direction.UP);\n }\n if (this.lastMouse.clientY < e.clientY) {\n directions.push(Direction.DOWN);\n }\n if (this.lastMouse.clientX < e.clientX) {\n directions.push(Direction.RIGHT);\n }\n if (this.lastMouse.clientX > e.clientX) {\n directions.push(Direction.LEFT);\n }\n return directions;\n }\n}\n\nclass GridsterPushResize {\n fromSouth;\n fromNorth;\n fromEast;\n fromWest;\n pushedItems;\n pushedItemsPath;\n gridsterItem;\n gridster;\n tryPattern;\n constructor(gridsterItem) {\n this.pushedItems = [];\n this.pushedItemsPath = [];\n this.gridsterItem = gridsterItem;\n this.gridster = gridsterItem.gridster;\n this.tryPattern = {\n fromEast: this.tryWest,\n fromWest: this.tryEast,\n fromNorth: this.trySouth,\n fromSouth: this.tryNorth\n };\n this.fromSouth = 'fromSouth';\n this.fromNorth = 'fromNorth';\n this.fromEast = 'fromEast';\n this.fromWest = 'fromWest';\n }\n destroy() {\n this.gridster = this.gridsterItem = null;\n }\n pushItems(direction) {\n if (this.gridster.$options.pushResizeItems) {\n return this.push(this.gridsterItem, direction);\n }\n else {\n return false;\n }\n }\n restoreItems() {\n let i = 0;\n const l = this.pushedItems.length;\n let pushedItem;\n for (; i < l; i++) {\n pushedItem = this.pushedItems[i];\n pushedItem.$item.x = pushedItem.item.x || 0;\n pushedItem.$item.y = pushedItem.item.y || 0;\n pushedItem.$item.cols = pushedItem.item.cols || 1;\n pushedItem.$item.row = pushedItem.item.row || 1;\n pushedItem.setSize();\n }\n this.pushedItems = [];\n this.pushedItemsPath = [];\n }\n setPushedItems() {\n let i = 0;\n const l = this.pushedItems.length;\n let pushedItem;\n for (; i < l; i++) {\n pushedItem = this.pushedItems[i];\n pushedItem.checkItemChanges(pushedItem.$item, pushedItem.item);\n }\n this.pushedItems = [];\n this.pushedItemsPath = [];\n }\n checkPushBack() {\n let i = this.pushedItems.length - 1;\n let change = false;\n for (; i > -1; i--) {\n if (this.checkPushedItem(this.pushedItems[i], i)) {\n change = true;\n }\n }\n if (change) {\n this.checkPushBack();\n }\n }\n push(gridsterItem, direction) {\n const gridsterItemCollision = this.gridster.checkCollision(gridsterItem.$item);\n if (gridsterItemCollision &&\n gridsterItemCollision !== true &&\n gridsterItemCollision !== this.gridsterItem &&\n gridsterItemCollision.canBeResized()) {\n if (this.tryPattern[direction].call(this, gridsterItemCollision, gridsterItem, direction)) {\n return true;\n }\n }\n else if (gridsterItemCollision === false) {\n return true;\n }\n return false;\n }\n trySouth(gridsterItemCollide, gridsterItem, direction) {\n const backUpY = gridsterItemCollide.$item.y;\n const backUpRows = gridsterItemCollide.$item.rows;\n gridsterItemCollide.$item.y =\n gridsterItem.$item.y + gridsterItem.$item.rows;\n gridsterItemCollide.$item.rows =\n backUpRows + backUpY - gridsterItemCollide.$item.y;\n if (!this.gridster.checkCollisionTwoItems(gridsterItemCollide.$item, gridsterItem.$item) &&\n !this.gridster.checkGridCollision(gridsterItemCollide.$item)) {\n gridsterItemCollide.setSize();\n this.addToPushed(gridsterItemCollide);\n this.push(gridsterItem, direction);\n return true;\n }\n else {\n gridsterItemCollide.$item.y = backUpY;\n gridsterItemCollide.$item.rows = backUpRows;\n }\n return false;\n }\n tryNorth(gridsterItemCollide, gridsterItem, direction) {\n const backUpRows = gridsterItemCollide.$item.rows;\n gridsterItemCollide.$item.rows =\n gridsterItem.$item.y - gridsterItemCollide.$item.y;\n if (!this.gridster.checkCollisionTwoItems(gridsterItemCollide.$item, gridsterItem.$item) &&\n !this.gridster.checkGridCollision(gridsterItemCollide.$item)) {\n gridsterItemCollide.setSize();\n this.addToPushed(gridsterItemCollide);\n this.push(gridsterItem, direction);\n return true;\n }\n else {\n gridsterItemCollide.$item.rows = backUpRows;\n }\n return false;\n }\n tryEast(gridsterItemCollide, gridsterItem, direction) {\n const backUpX = gridsterItemCollide.$item.x;\n const backUpCols = gridsterItemCollide.$item.cols;\n gridsterItemCollide.$item.x =\n gridsterItem.$item.x + gridsterItem.$item.cols;\n gridsterItemCollide.$item.cols =\n backUpCols + backUpX - gridsterItemCollide.$item.x;\n if (!this.gridster.checkCollisionTwoItems(gridsterItemCollide.$item, gridsterItem.$item) &&\n !this.gridster.checkGridCollision(gridsterItemCollide.$item)) {\n gridsterItemCollide.setSize();\n this.addToPushed(gridsterItemCollide);\n this.push(gridsterItem, direction);\n return true;\n }\n else {\n gridsterItemCollide.$item.x = backUpX;\n gridsterItemCollide.$item.cols = backUpCols;\n }\n return false;\n }\n tryWest(gridsterItemCollide, gridsterItem, direction) {\n const backUpCols = gridsterItemCollide.$item.cols;\n gridsterItemCollide.$item.cols =\n gridsterItem.$item.x - gridsterItemCollide.$item.x;\n if (!this.gridster.checkCollisionTwoItems(gridsterItemCollide.$item, gridsterItem.$item) &&\n !this.gridster.checkGridCollision(gridsterItemCollide.$item)) {\n gridsterItemCollide.setSize();\n this.addToPushed(gridsterItemCollide);\n this.push(gridsterItem, direction);\n return true;\n }\n else {\n gridsterItemCollide.$item.cols = backUpCols;\n }\n return false;\n }\n addToPushed(gridsterItem) {\n if (this.pushedItems.indexOf(gridsterItem) < 0) {\n this.pushedItems.push(gridsterItem);\n this.pushedItemsPath.push([\n {\n x: gridsterItem.item.x || 0,\n y: gridsterItem.item.y || 0,\n cols: gridsterItem.item.cols || 0,\n rows: gridsterItem.item.rows || 0\n },\n {\n x: gridsterItem.$item.x,\n y: gridsterItem.$item.y,\n cols: gridsterItem.$item.cols,\n rows: gridsterItem.$item.rows\n }\n ]);\n }\n else {\n const i = this.pushedItems.indexOf(gridsterItem);\n this.pushedItemsPath[i].push({\n x: gridsterItem.$item.x,\n y: gridsterItem.$item.y,\n cols: gridsterItem.$item.cols,\n rows: gridsterItem.$item.rows\n });\n }\n }\n removeFromPushed(i) {\n if (i > -1) {\n this.pushedItems.splice(i, 1);\n this.pushedItemsPath.splice(i, 1);\n }\n }\n checkPushedItem(pushedItem, i) {\n const path = this.pushedItemsPath[i];\n let j = path.length - 2;\n let lastPosition;\n let x;\n let y;\n let cols;\n let rows;\n for (; j > -1; j--) {\n lastPosition = path[j];\n x = pushedItem.$item.x;\n y = pushedItem.$item.y;\n cols = pushedItem.$item.cols;\n rows = pushedItem.$item.rows;\n pushedItem.$item.x = lastPosition.x;\n pushedItem.$item.y = lastPosition.y;\n pushedItem.$item.cols = lastPosition.cols;\n pushedItem.$item.rows = lastPosition.rows;\n if (!this.gridster.findItemWithItem(pushedItem.$item)) {\n pushedItem.setSize();\n path.splice(j + 1, path.length - 1 - j);\n }\n else {\n pushedItem.$item.x = x;\n pushedItem.$item.y = y;\n pushedItem.$item.cols = cols;\n pushedItem.$item.rows = rows;\n }\n }\n if (path.length < 2) {\n this.removeFromPushed(i);\n return true;\n }\n return false;\n }\n}\n\nclass GridsterResizable {\n zone;\n gridsterItem;\n gridster;\n lastMouse;\n itemBackup = { x: 0, y: 0, cols: 0, rows: 0 };\n resizeEventScrollType;\n /**\n * The direction function may reference any of the `GridsterResizable` class methods, that are\n * responsible for gridster resize when the `dragmove` event is being handled. E.g. it may reference\n * the `handleNorth` method when the north handle is pressed and moved by a mouse.\n */\n directionFunction = null;\n resizeEnabled;\n resizableHandles;\n mousemove;\n mouseup;\n mouseleave;\n cancelOnBlur;\n touchmove;\n touchend;\n touchcancel;\n push;\n pushResize;\n minHeight;\n minWidth;\n offsetTop;\n offsetLeft;\n diffTop;\n diffLeft;\n diffRight;\n diffBottom;\n margin;\n outerMarginTop;\n outerMarginRight;\n outerMarginBottom;\n outerMarginLeft;\n originalClientX;\n originalClientY;\n top;\n left;\n bottom;\n right;\n width;\n height;\n hasRatio;\n constructor(gridsterItem, gridster, zone) {\n this.zone = zone;\n this.gridsterItem = gridsterItem;\n this.gridster = gridster;\n this.lastMouse = {\n clientX: 0,\n clientY: 0\n };\n this.resizeEventScrollType = {\n west: false,\n east: false,\n north: false,\n south: false\n };\n }\n destroy() {\n this.gridster?.previewStyle();\n this.gridster = this.gridsterItem = null;\n }\n dragStart(e) {\n if ((e.which && e.which !== 1) || this.gridster.dragInProgress) {\n return;\n }\n if (this.gridster.options.resizable &&\n this.gridster.options.resizable.start) {\n this.gridster.options.resizable.start(this.gridsterItem.item, this.gridsterItem, e);\n }\n e.stopPropagation();\n e.preventDefault();\n this.zone.runOutsideAngular(() => {\n this.mousemove = this.gridsterItem.renderer.listen('document', 'mousemove', this.dragMove);\n this.touchmove = this.gridster.renderer.listen(this.gridster.el, 'touchmove', this.dragMove);\n });\n this.mouseup = this.gridsterItem.renderer.listen('document', 'mouseup', this.dragStop);\n this.mouseleave = this.gridsterItem.renderer.listen('document', 'mouseleave', this.dragStop);\n this.cancelOnBlur = this.gridsterItem.renderer.listen('window', 'blur', this.dragStop);\n this.touchend = this.gridsterItem.renderer.listen('document', 'touchend', this.dragStop);\n this.touchcancel = this.gridsterItem.renderer.listen('document', 'touchcancel', this.dragStop);\n this.gridsterItem.renderer.addClass(this.gridsterItem.el, 'gridster-item-resizing');\n this.lastMouse.clientX = e.clientX;\n this.lastMouse.clientY = e.clientY;\n this.left = this.gridsterItem.left;\n this.top = this.gridsterItem.top;\n this.originalClientX = e.clientX;\n this.originalClientY = e.clientY;\n this.width = this.gridsterItem.width;\n this.height = this.gridsterItem.height;\n this.bottom = this.gridsterItem.top + this.gridsterItem.height;\n this.right = this.gridsterItem.left + this.gridsterItem.width;\n this.margin = this.gridster.$options.margin;\n this.outerMarginTop = this.gridster.$options.outerMarginTop;\n this.outerMarginRight = this.gridster.$options.outerMarginRight;\n this.outerMarginBottom = this.gridster.$options.outerMarginBottom;\n this.outerMarginLeft = this.gridster.$options.outerMarginLeft;\n this.offsetLeft = this.gridster.el.scrollLeft - this.gridster.el.offsetLeft;\n this.offsetTop = this.gridster.el.scrollTop - this.gridster.el.offsetTop;\n this.diffLeft = e.clientX + this.offsetLeft - this.left;\n this.diffRight = e.clientX + this.offsetLeft - this.right;\n this.diffTop = e.clientY + this.offsetTop - this.top;\n this.diffBottom = e.clientY + this.offsetTop - this.bottom;\n this.minHeight =\n this.gridster.positionYToPixels(this.gridsterItem.$item.minItemRows ||\n this.gridster.$options.minItemRows) - this.margin;\n this.minWidth =\n this.gridster.positionXToPixels(this.gridsterItem.$item.minItemCols ||\n this.gridster.$options.minItemCols) - this.margin;\n this.gridster.movingItem = this.gridsterItem.$item;\n this.gridster.previewStyle();\n this.push = new GridsterPush(this.gridsterItem);\n this.pushResize = new GridsterPushResize(this.gridsterItem);\n this.gridster.dragInProgress = true;\n this.hasRatio = !!(this.gridster.$options.itemAspectRatio ||\n this.gridsterItem.$item.itemAspectRatio);\n this.itemBackup = { x: 0, y: 0, cols: 0, rows: 0 };\n this.gridster.updateGrid();\n const { classList } = e.target;\n if (classList.contains('handle-n')) {\n this.resizeEventScrollType.north = true;\n this.directionFunction = this.handleNorth;\n }\n else if (classList.contains('handle-w')) {\n if (this.gridster.$options.dirType === DirTypes.RTL) {\n this.resizeEventScrollType.east = true;\n this.directionFunction = this.handleEast;\n }\n else {\n this.resizeEventScrollType.west = true;\n this.directionFunction = this.handleWest;\n }\n }\n else if (classList.contains('handle-s')) {\n this.resizeEventScrollType.south = true;\n this.directionFunction = this.handleSouth;\n }\n else if (classList.contains('handle-e')) {\n if (this.gridster.$options.dirType === DirTypes.RTL) {\n this.resizeEventScrollType.west = true;\n this.directionFunction = this.handleWest;\n }\n else {\n this.resizeEventScrollType.east = true;\n this.directionFunction = this.handleEast;\n }\n }\n else if (classList.contains('handle-nw')) {\n if (this.gridster.$options.dirType === DirTypes.RTL) {\n this.resizeEventScrollType.north = true;\n this.resizeEventScrollType.east = true;\n this.directionFunction = this.handleNorthEast;\n }\n else {\n this.resizeEventScrollType.north = true;\n this.resizeEventScrollType.west = true;\n this.directionFunction = this.handleNorthWest;\n }\n }\n else if (classList.contains('handle-ne')) {\n if (this.gridster.$options.dirType === DirTypes.RTL) {\n this.resizeEventScrollType.north = true;\n this.resizeEventScrollType.west = true;\n this.directionFunction = this.handleNorthWest;\n }\n else {\n this.resizeEventScrollType.north = true;\n this.resizeEventScrollType.east = true;\n this.directionFunction = this.handleNorthEast;\n }\n }\n else if (classList.contains('handle-sw')) {\n if (this.gridster.$options.dirType === DirTypes.RTL) {\n this.resizeEventScrollType.south = true;\n this.resizeEventScrollType.east = true;\n this.directionFunction = this.handleSouthEast;\n }\n else {\n this.resizeEventScrollType.south = true;\n this.resizeEventScrollType.west = true;\n this.directionFunction = this.handleSouthWest;\n }\n }\n else if (classList.contains('handle-se')) {\n if (this.gridster.$options.dirType === DirTypes.RTL) {\n this.resizeEventScrollType.south = true;\n this.resizeEventScrollType.west = true;\n this.directionFunction = this.handleSouthWest;\n }\n else {\n this.resizeEventScrollType.south = true;\n this.resizeEventScrollType.east = true;\n this.directionFunction = this.handleSouthEast;\n }\n }\n }\n dragMove = (e) => {\n if (this.directionFunction === null) {\n throw new Error('The `directionFunction` has not been set before calling `dragMove`.');\n }\n e.stopPropagation();\n e.preventDefault();\n GridsterUtils.checkTouchEvent(e);\n this.offsetTop = this.gridster.el.scrollTop - this.gridster.el.offsetTop;\n this.offsetLeft = this.gridster.el.scrollLeft - this.gridster.el.offsetLeft;\n scroll(this.gridster, this.left, this.top, this.width, this.height, e, this.lastMouse, this.directionFunction, true, this.resizeEventScrollType);\n const scale = this.gridster.options.scale || 1;\n this.directionFunction({\n clientX: this.originalClientX + (e.clientX - this.originalClientX) / scale,\n clientY: this.originalClientY + (e.clientY - this.originalClientY) / scale\n });\n this.lastMouse.clientX = e.clientX;\n this.lastMouse.clientY = e.clientY;\n this.zone.run(() => {\n this.gridster.updateGrid();\n });\n };\n dragStop = (e) => {\n e.stopPropagation();\n e.preventDefault();\n cancelScroll();\n this.mousemove();\n this.mouseup();\n this.mouseleave();\n this.cancelOnBlur();\n this.touchmove();\n this.touchend();\n this.touchcancel();\n this.gridster.dragInProgress = false;\n this.resizeEventScrollType = {\n west: false,\n east: false,\n north: false,\n south: false\n };\n this.gridster.updateGrid();\n if (this.gridster.options.resizable &&\n this.gridster.options.resizable.stop) {\n Promise.resolve(this.gridster.options.resizable.stop(this.gridsterItem.item, this.gridsterItem, e)).then(this.makeResize, this.cancelResize);\n }\n else {\n this.makeResize();\n }\n setTimeout(() => {\n this.gridsterItem.renderer.removeClass(this.gridsterItem.el, 'gridster-item-resizing');\n if (this.gridster) {\n this.gridster.movingItem = null;\n this.gridster.previewStyle();\n }\n });\n };\n cancelResize = () => {\n this.gridsterItem.$item.cols = this.gridsterItem.item.cols || 1;\n this.gridsterItem.$item.rows = this.gridsterItem.item.rows || 1;\n this.gridsterItem.$item.x = this.gridsterItem.item.x || 0;\n this.gridsterItem.$item.y = this.gridsterItem.item.y || 0;\n this.gridsterItem.setSize();\n this.push.restoreItems();\n this.pushResize.restoreItems();\n this.push.destroy();\n this.push = null;\n this.pushResize.destroy();\n this.pushResize = null;\n };\n makeResize = () => {\n this.gridsterItem.setSize();\n this.gridsterItem.checkItemChanges(this.gridsterItem.$item, this.gridsterItem.item);\n this.push.setPushedItems();\n this.pushResize.setPushedItems();\n this.push.destroy();\n this.push = null;\n this.pushResize.destroy();\n this.pushResize = null;\n };\n check = (direction) => {\n this.hasRatio && this.enforceAspectRatio();\n this.pushResize.pushItems(direction);\n this.push.pushItems(direction, this.gridster.$options.disablePushOnResize);\n if (this.gridster.checkCollision(this.gridsterItem.$item, true)) {\n this.resetItem(this.hasRatio);\n return false;\n }\n this.gridster.previewStyle();\n this.pushResize.checkPushBack();\n this.push.checkPushBack();\n return true;\n };\n getNewNorthPosition = (e) => {\n this.top = e.clientY + this.offsetTop - this.diffTop;\n this.height = this.bottom - this.top;\n if (this.minHeight > this.height) {\n this.height = this.minHeight;\n this.top = this.bottom - this.minHeight;\n }\n else if (this.gridster.options.enableBoundaryControl) {\n this.top = Math.max(0, this.top);\n this.height = this.bottom - this.top;\n }\n const marginTop = this.gridster.options.pushItems ? this.margin : 0;\n return this.gridster.pixelsToPositionY(this.top + marginTop, Math.floor);\n };\n handleNorth = (e) => {\n const newPosition = this.getNewNorthPosition(e);\n if (this.gridsterItem.$item.y !== newPosition) {\n this.makeItemBackup();\n this.gridsterItem.$item.rows += this.gridsterItem.$item.y - newPosition;\n this.gridsterItem.$item.y = newPosition;\n if (!this.check(this.pushResize.fromSouth)) {\n return;\n }\n }\n this.setItemTop(this.top);\n this.setItemHeight(this.height);\n };\n getNewWestPosition = (e) => {\n const clientX = this.gridster.$options.dirType === DirTypes.RTL\n ? this.originalClientX + (this.originalClientX - e.clientX)\n : e.clientX;\n this.left = clientX + this.offsetLeft - this.diffLeft;\n this.width = this.right - this.left;\n if (this.minWidth > this.width) {\n this.width = this.minWidth;\n this.left = this.right - this.minWidth;\n }\n else if (this.gridster.options.enableBoundaryControl) {\n this.left = Math.max(0, this.left);\n this.width = this.right - this.left;\n }\n const marginLeft = this.gridster.options.pushItems ? this.margin : 0;\n return this.gridster.pixelsToPositionX(this.left + marginLeft, Math.floor);\n };\n handleWest = (e) => {\n const newPosition = this.getNewWestPosition(e);\n if (this.gridsterItem.$item.x !== newPosition) {\n this.makeItemBackup();\n this.gridsterItem.$item.cols += this.gridsterItem.$item.x - newPosition;\n this.gridsterItem.$item.x = newPosition;\n if (!this.check(this.pushResize.fromEast)) {\n return;\n }\n }\n this.setItemLeft(this.left);\n this.setItemWidth(this.width);\n };\n getNewSouthPosition = (e) => {\n this.height = e.clientY + this.offsetTop - this.diffBottom - this.top;\n if (this.minHeight > this.height) {\n this.height = this.minHeight;\n }\n this.bottom = this.top + this.height;\n if (this.gridster.options.enableBoundaryControl) {\n const margin = this.outerMarginBottom ?? this.margin;\n const box = this.gridster.el.getBoundingClientRect();\n this.bottom = Math.min(this.bottom, box.bottom - box.top - 2 * margin);\n this.height = this.bottom - this.top;\n }\n const marginBottom = this.gridster.options.pushItems ? 0 : this.margin;\n return this.gridster.pixelsToPositionY(this.bottom + marginBottom, Math.ceil);\n };\n handleSouth = (e) => {\n const newPosition = this.getNewSouthPosition(e);\n if (this.gridsterItem.$item.y + this.gridsterItem.$item.rows !==\n newPosition) {\n this.makeItemBackup();\n this.gridsterItem.$item.rows = newPosition - this.gridsterItem.$item.y;\n if (!this.check(this.pushResize.fromNorth)) {\n return;\n }\n }\n this.setItemHeight(this.height);\n };\n getNewEastPosition = (e) => {\n const clientX = this.gridster.$options.dirType === DirTypes.RTL\n ? this.originalClientX + (this.originalClientX - e.clientX)\n : e.clientX;\n this.width = clientX + this.offsetLeft - this.diffRight - this.left;\n if (this.minWidth > this.width) {\n this.width = this.minWidth;\n }\n this.right = this.left + this.width;\n if (this.gridster.options.enableBoundaryControl) {\n const margin = this.outerMarginRight ?? this.margin;\n const box = this.gridster.el.getBoundingClientRect();\n this.right = Math.min(this.right, box.right - box.left - 2 * margin);\n this.width = this.right - this.left;\n }\n const marginRight = this.gridster.options.pushItems ? 0 : this.margin;\n return this.gridster.pixelsToPositionX(this.right + marginRight, Math.ceil);\n };\n handleEast = (e) => {\n const newPosition = this.getNewEastPosition(e);\n if (this.gridsterItem.$item.x + this.gridsterItem.$item.cols !==\n newPosition) {\n this.makeItemBackup();\n this.gridsterItem.$item.cols = newPosition - this.gridsterItem.$item.x;\n if (!this.check(this.pushResize.fromWest)) {\n return;\n }\n }\n this.setItemWidth(this.width);\n };\n handleNorthWest = (e) => {\n const newNorth = this.getNewNorthPosition(e);\n const newWest = this.getNewWestPosition(e);\n if (this.gridsterItem.$item.y !== newNorth ||\n this.gridsterItem.$item.x !== newWest) {\n this.makeItemBackup();\n this.gridsterItem.$item.rows += this.gridsterItem.$item.y - newNorth;\n this.gridsterItem.$item.y = newNorth;\n this.gridsterItem.$item.cols += this.gridsterItem.$item.x - newWest;\n this.gridsterItem.$item.x = newWest;\n if (!this.check(this.pushResize.fromSouth)) {\n return;\n }\n }\n this.setItemTop(this.top);\n this.setItemHeight(this.height);\n this.setItemLeft(this.left);\n this.setItemWidth(this.width);\n };\n handleNorthEast = (e) => {\n const newNorth = this.getNewNorthPosition(e);\n const newEast = this.getNewEastPosition(e);\n if (this.gridsterItem.$item.y !== newNorth ||\n this.gridsterItem.$item.x + this.gridsterItem.$item.cols !== newEast) {\n this.makeItemBackup();\n this.gridsterItem.$item.rows += this.gridsterItem.$item.y - newNorth;\n this.gridsterItem.$item.y = newNorth;\n this.gridsterItem.$item.cols = newEast - this.gridsterItem.$item.x;\n if (!this.check(this.pushResize.fromSouth)) {\n return;\n }\n }\n this.setItemTop(this.top);\n this.setItemHeight(this.height);\n this.setItemWidth(this.width);\n };\n handleSouthWest = (e) => {\n const newSouth = this.getNewSouthPosition(e);\n const newWest = this.getNewWestPosition(e);\n if (this.gridsterItem.$item.y + this.gridsterItem.$item.rows !== newSouth ||\n this.gridsterItem.$item.x !== newWest) {\n this.makeItemBackup();\n this.gridsterItem.$item.rows = newSouth - this.gridsterItem.$item.y;\n this.gridsterItem.$item.cols += this.gridsterItem.$item.x - newWest;\n this.gridsterItem.$item.x = newWest;\n if (!this.check(this.pushResize.fromNorth)) {\n return;\n }\n }\n this.setItemLeft(this.left);\n this.setItemHeight(this.height);\n this.setItemWidth(this.width);\n };\n handleSouthEast = (e) => {\n const newSouth = this.getNewSouthPosition(e);\n const newEast = this.getNewEastPosition(e);\n if (this.gridsterItem.$item.y + this.gridsterItem.$item.rows !== newSouth ||\n this.gridsterItem.$item.x + this.gridsterItem.$item.cols !== newEast) {\n this.makeItemBackup();\n this.gridsterItem.$item.rows = newSouth - this.gridsterItem.$item.y;\n this.gridsterItem.$item.cols = newEast - this.gridsterItem.$item.x;\n if (!this.check(this.pushResize.fromNorth)) {\n return;\n }\n }\n this.setItemHeight(this.height);\n this.setItemWidth(this.width);\n };\n makeItemBackup() {\n this.itemBackup.x = this.gridsterItem.$item.x;\n this.itemBackup.y = this.gridsterItem.$item.y;\n this.itemBackup.cols = this.gridsterItem.$item.cols;\n this.itemBackup.rows = this.gridsterItem.$item.rows;\n }\n resetItem(soft = false) {\n if (this.gridsterItem.$item.x !== this.itemBackup.x) {\n this.gridsterItem.$item.x = this.itemBackup.x;\n if (!soft) {\n this.left = this.gridster.positionXToPixels(this.gridsterItem.$item.x);\n this.setItemLeft(this.left);\n }\n }\n if (this.gridsterItem.$item.y !== this.itemBackup.y) {\n this.gridsterItem.$item.y = this.itemBackup.y;\n if (!soft) {\n this.top = this.gridster.positionYToPixels(this.gridsterItem.$item.y);\n this.setItemTop(this.top);\n }\n }\n if (this.gridsterItem.$item.cols !== this.itemBackup.cols) {\n this.gridsterItem.$item.cols = this.itemBackup.cols;\n if (!soft) {\n this.setItemWidth(this.gridster.positionXToPixels(this.gridsterItem.$item.cols) -\n this.margin);\n }\n }\n if (this.gridsterItem.$item.rows !== this.itemBackup.rows) {\n this.gridsterItem.$item.rows = this.itemBackup.rows;\n if (!soft) {\n this.setItemHeight(this.gridster.positionYToPixels(this.gridsterItem.$item.rows) -\n this.margin);\n }\n }\n }\n toggle() {\n this.resizeEnabled = this.gridsterItem.canBeResized();\n this.resizableHandles = this.gridsterItem.getResizableHandles();\n }\n dragStartDelay(e) {\n GridsterUtils.checkTouchEvent(e);\n if (!this.gridster.$options.resizable.delayStart) {\n this.dragStart(e);\n return;\n }\n const timeout = setTimeout(() => {\n this.dragStart(e);\n cancelDrag();\n }, this.gridster.$options.resizable.delayStart);\n const { cancelMouse, cancelMouseLeave, cancelOnBlur, cancelTouchMove, cancelTouchEnd, cancelTouchCancel } = this.zone.runOutsideAngular(() => {\n // Note: all of these events are being added within the `<root>` zone since they all\n // don't do any view updates and don't require Angular running change detection.\n // All event listeners call `cancelDrag` once the event is dispatched, the `cancelDrag`\n // is responsible only for removing event listeners.\n const cancelMouse = this.gridsterItem.renderer.listen('document', 'mouseup', cancelDrag);\n const cancelMouseLeave = this.gridsterItem.renderer.listen('document', 'mouseleave', cancelDrag);\n const cancelOnBlur = this.gridsterItem.renderer.listen('window', 'blur', cancelDrag);\n const cancelTouchMove = this.gridsterItem.renderer.listen('document', 'touchmove', cancelMove);\n const cancelTouchEnd = this.gridsterItem.renderer.listen('document', 'touchend', cancelDrag);\n const cancelTouchCancel = this.gridsterItem.renderer.listen('document', 'touchcancel', cancelDrag);\n return {\n cancelMouse,\n cancelMouseLeave,\n cancelOnBlur,\n cancelTouchMove,\n cancelTouchEnd,\n cancelTouchCancel\n };\n });\n function cancelMove(eventMove) {\n GridsterUtils.checkTouchEvent(eventMove);\n if (Math.abs(eventMove.clientX - e.clientX) > 9 ||\n Math.abs(eventMove.clientY - e.clientY) > 9) {\n cancelDrag();\n }\n }\n function cancelDrag() {\n clearTimeout(timeout);\n cancelOnBlur();\n cancelMouse();\n cancelMouseLeave();\n cancelTouchMove();\n cancelTouchEnd();\n cancelTouchCancel();\n }\n }\n setItemTop(top) {\n this.gridster.gridRenderer.setCellPosition(this.gridsterItem.renderer, this.gridsterItem.el, this.left, top);\n }\n setItemLeft(left) {\n this.gridster.gridRenderer.setCellPosition(this.gridsterItem.renderer, this.gridsterItem.el, left, this.top);\n }\n setItemHeight(height) {\n this.gridsterItem.renderer.setStyle(this.gridsterItem.el, 'height', height + 'px');\n }\n setItemWidth(width) {\n this.gridsterItem.renderer.setStyle(this.gridsterItem.el, 'width', width + 'px');\n }\n /**\n * Enforces the aspect ratio by recalculating grid positions based on current pixel dimensions\n */\n enforceAspectRatio() {\n const aspectRatio = this.gridsterItem.$item.itemAspectRatio ||\n this.gridster.$options.itemAspectRatio;\n if (!aspectRatio) {\n return;\n }\n // Calculate target ratio considering column/row dimensions\n const targetRatio = aspectRatio * (this.gridster.curColWidth / this.gridster.curRowHeight);\n // Get min/max dimensions\n const minCols = this.gridsterItem.$item.minItemCols || this.gridster.$options.minItemCols;\n const minRows = this.gridsterItem.$item.minItemRows || this.gridster.$options.minItemRows;\n const minWidth = this.gridster.positionXToPixels(minCols) - this.margin;\n const minHeight = this.gridster.positionYToPixels(minRows) - this.margin;\n const maxCols = this.gridsterItem.$item.maxItemCols ||\n this.gridster.$options.maxItemCols ||\n 0;\n const maxRows = this.gridsterItem.$item.maxItemRows ||\n this.gridster.$options.maxItemRows ||\n 0;\n const maxWidth = maxCols\n ? this.gridster.positionXToPixels(maxCols) - this.margin\n : Number.MAX_VALUE;\n const maxHeight = maxRows\n ? this.gridster.positionYToPixels(maxRows) - this.margin\n : Number.MAX_VALUE;\n let newWidth = this.width;\n let newHeight = this.height;\n // For north/south resize, prioritize height and calculate width\n if (this.resizeEventScrollType.north || this.resizeEventScrollType.south) {\n newWidth = this.height * targetRatio;\n // Check width constraints\n if (newWidth < minWidth) {\n newWidth = minWidth;\n newHeight = minWidth / targetRatio;\n }\n else if (newWidth > maxWidth) {\n newWidth = maxWidth;\n newHeight = maxWidth / targetRatio;\n }\n }\n // For east/west resize, prioritize width and calculate height\n else if (this.resizeEventScrollType.east ||\n this.resizeEventScrollType.west) {\n newHeight = this.width / targetRatio;\n // Check height constraints\n if (newHeight < minHeight) {\n newHeight = minHeight;\n newWidth = minHeight * targetRatio;\n }\n else if (newHeight > maxHeight) {\n newHeight = maxHeight;\n newWidth = maxHeight * targetRatio;\n }\n }\n // Ensure we don't exceed grid boundaries\n if (this.gridster.options.enableBoundaryControl) {\n const box = this.gridster.el.getBoundingClientRect();\n const margin = Math.max(this.outerMarginTop || this.margin, this.outerMarginRight || this.margin, this.outerMarginBottom || this.margin, this.outerMarginLeft || this.margin);\n const maxRight = box.width - 2 * margin;\n const maxBottom = box.height - 2 * margin;\n if (this.resizeEventScrollType.west) {\n if (this.right - newWidth < 0) {\n newWidth = this.right;\n newHeight = newWidth / targetRatio;\n }\n }\n else if (this.resizeEventScrollType.east) {\n if (this.left + newWidth > maxRight) {\n newWidth = maxRight - this.left;\n newHeight = newWidth / targetRatio;\n }\n }\n if (this.resizeEventScrollType.north) {\n if (this.bottom - newHeight < 0) {\n newHeight = this.bottom;\n newWidth = newHeight * targetRatio;\n }\n }\n else if (this.resizeEventScrollType.south) {\n if (this.top + newHeight > maxBottom) {\n newHeight = maxBottom - this.top;\n newWidth = newHeight * targetRatio;\n }\n }\n }\n // Update dimensions and positions\n this.width = newWidth;\n this.height = newHeight;\n if (this.resizeEventScrollType.west) {\n this.left = this.right - this.width;\n }\n if (this.resizeEventScrollType.north) {\n this.top = this.bottom - this.height;\n }\n // Update grid positions\n const marginLeft = this.gridster.options.pushItems ? 0 : this.margin;\n const marginTop = this.gridster.options.pushItems ? 0 : this.margin;\n const marginRight = this.gridster.options.pushItems ? this.margin : 0;\n const marginBottom = this.gridster.options.pushItems ? this.margin : 0;\n this.gridsterItem.$item.x = this.gridster.pixelsToPositionX(this.left + marginLeft, Math.floor);\n this.gridsterItem.$item.y = this.gridster.pixelsToPositionY(this.top + marginTop, Math.floor);\n this.gridsterItem.$item.cols = this.gridster.pixelsToPositionX(this.width + marginRight, Math.ceil);\n this.gridsterItem.$item.rows = this.gridster.pixelsToPositionY(this.height + marginBottom, Math.ceil);\n // Update visual dimensions\n this.setItemTop(this.top);\n this.setItemLeft(this.left);\n this.setItemWidth(this.width);\n this.setItemHeight(this.height);\n }\n}\n\nclass GridsterItemComponent {\n renderer;\n zone;\n item;\n itemInit = new EventEmitter();\n itemChange = new EventEmitter();\n itemResize = new EventEmitter();\n $item;\n el;\n gridster;\n top;\n left;\n width;\n height;\n drag;\n resize;\n notPlaced;\n init;\n get zIndex() {\n return this.getLayerIndex() + this.gridster.$options.baseLayerIndex;\n }\n constructor(el, gridster, renderer, zone) {\n this.renderer = renderer;\n this.zone = zone;\n this.el = el.nativeElement;\n this.$item = {\n cols: -1,\n rows: -1,\n x: -1,\n y: -1\n };\n this.gridster = gridster;\n this.drag = new GridsterDraggable(this, gridster, this.zone);\n this.resize = new GridsterResizable(this, gridster, this.zone);\n }\n ngOnInit() {\n this.gridster.addItem(this);\n }\n ngOnChanges(changes) {\n if (changes.item) {\n this.updateOptions();\n if (!this.init) {\n this.gridster.calculateLayout$.next();\n }\n }\n if (changes.item && changes.item.previousValue) {\n this.setSize();\n }\n }\n updateOptions() {\n this.$item = GridsterUtils.merge(this.$item, this.item, {\n cols: undefined,\n rows: undefined,\n x: undefined,\n y: undefined,\n layerIndex: undefined,\n dragEnabled: undefined,\n resizeEnabled: undefined,\n compactEnabled: undefined,\n itemAspectRatio: undefined,\n maxItemRows: undefined,\n minItemRows: undefined,\n maxItemCols: undefined,\n minItemCols: undefined,\n maxItemArea: undefined,\n minItemArea: undefined,\n resizableHandles: {\n s: undefined,\n e: undefined,\n n: undefined,\n w: undefined,\n se: undefined,\n ne: undefined,\n sw: undefined,\n nw: undefined\n }\n });\n }\n ngOnDestroy() {\n this.gridster.removeItem(this);\n this.drag.destroy();\n this.resize.destroy();\n this.gridster = this.drag = this.resize = null;\n }\n setSize() {\n this.renderer.setStyle(this.el, 'display', this.notPlaced ? '' : 'block');\n this.gridster.gridRenderer.updateItem(this.el, this.$item, this.renderer);\n this.updateItemSize();\n }\n updateItemSize() {\n const top = this.$item.y * this.gridster.curRowHeight;\n const left = this.$item.x * this.gridster.curColWidth;\n const width = this.$item.cols * this.gridster.curColWidth -\n this.gridster.$options.margin;\n const height = this.$item.rows * this.gridster.curRowHeight -\n this.gridster.$options.margin;\n this.top = top;\n this.left = left;\n if (!this.init && width > 0 && height > 0) {\n this.init = true;\n if (this.item.initCallback) {\n this.item.initCallback(this.item, this);\n }\n if (this.gridster.options.itemInitCallback) {\n this.gridster.options.itemInitCallback(this.item, this);\n }\n this.itemInit.next({ item: this.item, itemComponent: this });\n if (this.gridster.$options.scrollToNewItems) {\n this.el.scrollIntoView({\n block: 'end',\n inline: 'nearest',\n behavior: 'smooth'\n });\n }\n }\n if (width !== this.width || height !== this.height) {\n this.width = width;\n this.height = height;\n if (this.gridster.options.itemResizeCallback) {\n this.gridster.options.itemResizeCallback(this.item, this);\n }\n this.itemResize.next({ item: this.item, itemComponent: this });\n }\n }\n itemChanged() {\n if (this.gridster.options.itemChangeCallback) {\n this.gridster.options.itemChangeCallback(this.item, this);\n }\n this.itemChange.next({ item: this.item, itemComponent: this });\n }\n checkItemChanges(newValue, oldValue) {\n if (newValue.rows === oldValue.rows &&\n newValue.cols === oldValue.cols &&\n newValue.x === oldValue.x &&\n newValue.y === oldValue.y) {\n return;\n }\n if (this.gridster.checkCollision(this.$item)) {\n this.$item.x = oldValue.x || 0;\n this.$item.y = oldValue.y || 0;\n this.$item.cols = oldValue.cols || 1;\n this.$item.rows = oldValue.rows || 1;\n this.setSize();\n }\n else {\n this.item.cols = this.$item.cols;\n this.item.rows = this.$item.rows;\n this.item.x = this.$item.x;\n this.item.y = this.$item.y;\n this.gridster.calculateLayout$.next();\n this.itemChanged();\n }\n }\n canBeDragged() {\n const gridDragEnabled = this.gridster.$options.draggable.enabled;\n const itemDragEnabled = this.$item.dragEnabled === undefined\n ? gridDragEnabled\n : this.$item.dragEnabled;\n return !this.gridster.mobile && gridDragEnabled && itemDragEnabled;\n }\n canBeResized() {\n const gridResizable = this.gridster.$options.resizable.enabled;\n const itemResizable = this.$item.resizeEnabled === undefined\n ? gridResizable\n : this.$item.resizeEnabled;\n return !this.gridster.mobile && gridResizable && itemResizable;\n }\n getResizableHandles() {\n const gridResizableHandles = this.gridster.$options.resizable.handles;\n const itemResizableHandles = this.$item.resizableHandles;\n // use grid settings if no settings are provided for the item.\n if (itemResizableHandles === undefined) {\n return gridResizableHandles;\n }\n // else merge the settings\n return {\n ...gridResizableHandles,\n ...itemResizableHandles\n };\n }\n bringToFront(offset) {\n if (offset && offset <= 0) {\n return;\n }\n const layerIndex = this.getLayerIndex();\n const topIndex = this.gridster.$options.maxLayerIndex;\n if (layerIndex < topIndex) {\n const targetIndex = offset ? layerIndex + offset : topIndex;\n this.item.layerIndex = this.$item.layerIndex =\n targetIndex > topIndex ? topIndex : targetIndex;\n }\n }\n sendToBack(offset) {\n if (offset && offset <= 0) {\n return;\n }\n const layerIndex = this.getLayerIndex();\n if (layerIndex > 0) {\n const targetIndex = offset ? layerIndex - offset : 0;\n this.item.layerIndex = this.$item.layerIndex =\n targetIndex < 0 ? 0 : targetIndex;\n }\n }\n getLayerIndex() {\n if (this.item.layerIndex !== undefined) {\n return this.item.layerIndex;\n }\n if (this.gridster.$options.defaultLayerIndex !== undefined) {\n return this.gridster.$options.defaultLayerIndex;\n }\n return 0;\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.13\", ngImport: i0, type: GridsterItemComponent, deps: [{ token: ElementRef }, { token: GridsterComponent }, { token: Renderer2 }, { token: NgZone }], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.13\", type: GridsterItemComponent, isStandalone: true, selector: \"gridster-item\", inputs: { item: \"item\" }, outputs: { itemInit: \"itemInit\", itemChange: \"itemChange\", itemResize: \"itemResize\" }, host: { properties: { \"style.z-index\": \"this.zIndex\" } }, usesOnChanges: true, ngImport: i0, template: \"<ng-content></ng-content>\\n@if (resize.resizableHandles?.s && resize.resizeEnabled) {\\n<div\\n (mousedown)=\\\"resize.dragStartDelay($event)\\\"\\n (touchstart)=\\\"resize.dragStartDelay($event)\\\"\\n class=\\\"gridster-item-resizable-handler handle-s\\\"\\n></div>\\n} @if (resize.resizableHandles?.e && resize.resizeEnabled) {\\n<div\\n (mousedown)=\\\"resize.dragStartDelay($event)\\\"\\n (touchstart)=\\\"resize.dragStartDelay($event)\\\"\\n class=\\\"gridster-item-resizable-handler handle-e\\\"\\n></div>\\n} @if (resize.resizableHandles?.n && resize.resizeEnabled) {\\n<div\\n (mousedown)=\\\"resize.dragStartDelay($event)\\\"\\n (touchstart)=\\\"resize.dragStartDelay($event)\\\"\\n class=\\\"gridster-item-resizable-handler handle-n\\\"\\n></div>\\n} @if (resize.resizableHandles?.w && resize.resizeEnabled) {\\n<div\\n (mousedown)=\\\"resize.dragStartDelay($event)\\\"\\n (touchstart)=\\\"resize.dragStartDelay($event)\\\"\\n class=\\\"gridster-item-resizable-handler handle-w\\\"\\n></div>\\n} @if (resize.resizableHandles?.se && resize.resizeEnabled) {\\n<div\\n (mousedown)=\\\"resize.dragStartDelay($event)\\\"\\n (touchstart)=\\\"resize.dragStartDelay($event)\\\"\\n class=\\\"gridster-item-resizable-handler handle-se\\\"\\n></div>\\n} @if (resize.resizableHandles?.ne && resize.resizeEnabled) {\\n<div\\n (mousedown)=\\\"resize.dragStartDelay($event)\\\"\\n (touchstart)=\\\"resize.dragStartDelay($event)\\\"\\n class=\\\"gridster-item-resizable-handler handle-ne\\\"\\n></div>\\n} @if (resize.resizableHandles?.sw && resize.resizeEnabled) {\\n<div\\n (mousedown)=\\\"resize.dragStartDelay($event)\\\"\\n (touchstart)=\\\"resize.dragStartDelay($event)\\\"\\n class=\\\"gridster-item-resizable-handler handle-sw\\\"\\n></div>\\n} @if (resize.resizableHandles?.nw && resize.resizeEnabled) {\\n<div\\n (mousedown)=\\\"resize.dragStartDelay($event)\\\"\\n (touchstart)=\\\"resize.dragStartDelay($event)\\\"\\n class=\\\"gridster-item-resizable-handler handle-nw\\\"\\n></div>\\n}\\n\", styles: [\"gridster-item{box-sizing:border-box;z-index:1;position:absolute;overflow:hidden;transition:.3s;display:none;background:#fff;-webkit-user-select:text;user-select:text}gridster-item.gridster-item-moving{cursor:move}gridster-item.gridster-item-resizing,gridster-item.gridster-item-moving{transition:0s;z-index:2;box-shadow:0 0 5px 5px #0003,0 6px 10px #00000024,0 1px 18px #0000001f}.gridster-item-resizable-handler{position:absolute;z-index:2}.gridster-item-resizable-handler.handle-n{cursor:ns-resize;height:10px;right:0;top:0;left:0}.gridster-item-resizable-handler.handle-e{cursor:ew-resize;width:10px;bottom:0;right:0;top:0}.gridster-item-resizable-handler.handle-s{cursor:ns-resize;height:10px;right:0;bottom:0;left:0}.gridster-item-resizable-handler.handle-w{cursor:ew-resize;width:10px;left:0;top:0;bottom:0}.gridster-item-resizable-handler.handle-ne{cursor:ne-resize;width:10px;height:10px;right:0;top:0}.gridster-item-resizable-handler.handle-nw{cursor:nw-resize;width:10px;height:10px;left:0;top:0}.gridster-item-resizable-handler.handle-se{cursor:se-resize;width:0;height:0;right:0;bottom:0;border-style:solid;border-width:0 0 10px 10px;border-color:transparent}.gridster-item-resizable-handler.handle-sw{cursor:sw-resize;width:10px;height:10px;left:0;bottom:0}gridster-item:hover .gridster-item-resizable-handler.handle-se{border-color:transparent transparent #ccc}\\n\"], encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.13\", ngImport: i0, type: GridsterItemComponent, decorators: [{\n type: Component,\n args: [{ selector: 'gridster-item', encapsulation: ViewEncapsulation.None, standalone: true, template: \"<ng-content></ng-content>\\n@if (resize.resizableHandles?.s && resize.resizeEnabled) {\\n<div\\n (mousedown)=\\\"resize.dragStartDelay($event)\\\"\\n (touchstart)=\\\"resize.dragStartDelay($event)\\\"\\n class=\\\"gridster-item-resizable-handler handle-s\\\"\\n></div>\\n} @if (resize.resizableHandles?.e && resize.resizeEnabled) {\\n<div\\n (mousedown)=\\\"resize.dragStartDelay($event)\\\"\\n (touchstart)=\\\"resize.dragStartDelay($event)\\\"\\n class=\\\"gridster-item-resizable-handler handle-e\\\"\\n></div>\\n} @if (resize.resizableHandles?.n && resize.resizeEnabled) {\\n<div\\n (mousedown)=\\\"resize.dragStartDelay($event)\\\"\\n (touchstart)=\\\"resize.dragStartDelay($event)\\\"\\n class=\\\"gridster-item-resizable-handler handle-n\\\"\\n></div>\\n} @if (resize.resizableHandles?.w && resize.resizeEnabled) {\\n<div\\n (mousedown)=\\\"resize.dragStartDelay($event)\\\"\\n (touchstart)=\\\"resize.dragStartDelay($event)\\\"\\n class=\\\"gridster-item-resizable-handler handle-w\\\"\\n></div>\\n} @if (resize.resizableHandles?.se && resize.resizeEnabled) {\\n<div\\n (mousedown)=\\\"resize.dragStartDelay($event)\\\"\\n (touchstart)=\\\"resize.dragStartDelay($event)\\\"\\n class=\\\"gridster-item-resizable-handler handle-se\\\"\\n></div>\\n} @if (resize.resizableHandles?.ne && resize.resizeEnabled) {\\n<div\\n (mousedown)=\\\"resize.dragStartDelay($event)\\\"\\n (touchstart)=\\\"resize.dragStartDelay($event)\\\"\\n class=\\\"gridster-item-resizable-handler handle-ne\\\"\\n></div>\\n} @if (resize.resizableHandles?.sw && resize.resizeEnabled) {\\n<div\\n (mousedown)=\\\"resize.dragStartDelay($event)\\\"\\n (touchstart)=\\\"resize.dragStartDelay($event)\\\"\\n class=\\\"gridster-item-resizable-handler handle-sw\\\"\\n></div>\\n} @if (resize.resizableHandles?.nw && resize.resizeEnabled) {\\n<div\\n (mousedown)=\\\"resize.dragStartDelay($event)\\\"\\n (touchstart)=\\\"resize.dragStartDelay($event)\\\"\\n class=\\\"gridster-item-resizable-handler handle-nw\\\"\\n></div>\\n}\\n\", styles: [\"gridster-item{box-sizing:border-box;z-index:1;position:absolute;overflow:hidden;transition:.3s;display:none;background:#fff;-webkit-user-select:text;user-select:text}gridster-item.gridster-item-moving{cursor:move}gridster-item.gridster-item-resizing,gridster-item.gridster-item-moving{transition:0s;z-index:2;box-shadow:0 0 5px 5px #0003,0 6px 10px #00000024,0 1px 18px #0000001f}.gridster-item-resizable-handler{position:absolute;z-index:2}.gridster-item-resizable-handler.handle-n{cursor:ns-resize;height:10px;right:0;top:0;left:0}.gridster-item-resizable-handler.handle-e{cursor:ew-resize;width:10px;bottom:0;right:0;top:0}.gridster-item-resizable-handler.handle-s{cursor:ns-resize;height:10px;right:0;bottom:0;left:0}.gridster-item-resizable-handler.handle-w{cursor:ew-resize;width:10px;left:0;top:0;bottom:0}.gridster-item-resizable-handler.handle-ne{cursor:ne-resize;width:10px;height:10px;right:0;top:0}.gridster-item-resizable-handler.handle-nw{cursor:nw-resize;width:10px;height:10px;left:0;top:0}.gridster-item-resizable-handler.handle-se{cursor:se-resize;width:0;height:0;right:0;bottom:0;border-style:solid;border-width:0 0 10px 10px;border-color:transparent}.gridster-item-resizable-handler.handle-sw{cursor:sw-resize;width:10px;height:10px;left:0;bottom:0}gridster-item:hover .gridster-item-resizable-handler.handle-se{border-color:transparent transparent #ccc}\\n\"] }]\n }], ctorParameters: () => [{ type: i0.ElementRef, decorators: [{\n type: Inject,\n args: [ElementRef]\n }] }, { type: GridsterComponent }, { type: i0.Renderer2, decorators: [{\n type: Inject,\n args: [Renderer2]\n }] }, { type: i0.NgZone, decorators: [{\n type: Inject,\n args: [NgZone]\n }] }], propDecorators: { item: [{\n type: Input\n }], itemInit: [{\n type: Output\n }], itemChange: [{\n type: Output\n }], itemResize: [{\n type: Output\n }], zIndex: [{\n type: HostBinding,\n args: ['style.z-index']\n }] } });\n\nclass GridsterItemComponentInterface {\n item;\n $item;\n top;\n left;\n width;\n height;\n drag;\n resize;\n notPlaced;\n updateOptions;\n itemChanged;\n setSize;\n checkItemChanges;\n canBeDragged;\n canBeResized;\n getResizableHandles;\n bringToFront;\n sendToBack;\n el;\n gridster;\n renderer;\n}\n\nclass GridsterComponentInterface {\n $options;\n grid;\n checkCollision;\n checkCollisionForSwaping;\n positionXToPixels;\n pixelsToPositionX;\n positionYToPixels;\n pixelsToPositionY;\n findItemWithItem;\n findItemsWithItem;\n checkGridCollision;\n checkCollisionTwoItems;\n getItemComponent;\n el;\n renderer;\n gridRenderer;\n cdRef;\n options;\n calculateLayout$;\n updateGrid;\n movingItem;\n addItem;\n removeItem;\n previewStyle;\n mobile;\n curWidth;\n curHeight;\n columns;\n rows;\n curColWidth;\n curRowHeight;\n windowResize;\n setGridDimensions;\n dragInProgress;\n emptyCell;\n compact;\n zone;\n gridRows;\n gridColumns;\n}\n\nclass GridsterModule {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.13\", ngImport: i0, type: GridsterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\n static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.3.13\", ngImport: i0, type: GridsterModule, imports: [GridsterComponent, GridsterItemComponent], exports: [GridsterComponent, GridsterItemComponent] });\n static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.3.13\", ngImport: i0, type: GridsterModule });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.13\", ngImport: i0, type: GridsterModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [GridsterComponent, GridsterItemComponent],\n exports: [GridsterComponent, GridsterItemComponent]\n }]\n }] });\n\n/*\n * Public API Surface of gridster\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { CompactType, DirTypes, DisplayGrid, GridType, GridsterComponent, GridsterComponentInterface, GridsterConfigService, GridsterItemComponent, GridsterItemComponentInterface, GridsterModule, GridsterPush, GridsterPushResize, GridsterSwap };\n\n","/* angular:styles/component:less;eedd081fc02c0d27f6ae4957e9501c8e6c07e15b995f5314c47fc7628829f6cd;D:\\ng-manager\\webapp\\src\\app\\pages\\dashboard\\components\\widget-host\\widget-host.component.ts */\n:host {\n display: block;\n width: 100%;\n height: 100%;\n}\n.widget-shell {\n width: 100%;\n height: 100%;\n}\n.widget-shell[data-fit=scroll] {\n overflow: auto;\n}\n.widget-shell[data-fit=responsive] {\n overflow: hidden;\n}\n.widget-shell[data-fit=scale] {\n overflow: hidden;\n}\n.widget-scale {\n width: 100%;\n height: 100%;\n}\n/*# sourceMappingURL=widget-host.component.css.map */\n","/* angular:styles/component:less;e7a36c16014557c6fe4d8b012f4dd11a3014b7fe15e959c779063758022e9dcd;D:\\ng-manager\\webapp\\src\\app\\pages\\dashboard\\components\\widgets\\kill-port\\kill-port-widget.component.ts */\n.logo {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 24px;\n}\n.logo .icon-wrapper {\n width: 32px;\n height: 32px;\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--app-gray);\n border-radius: 50% 50%;\n}\n.logo .icon-wrapper nz-icon {\n font-size: 20px;\n color: var(--app-primary-5);\n}\n.logo h3 {\n flex: 1 1 auto;\n font-size: 18px;\n margin: 0;\n font-weight: 500;\n}\n/*# sourceMappingURL=kill-port-widget.component.css.map */\n","/* angular:styles/component:less;2c8ea08b71cb50bfb6e4b8048c789ba51268fb2af60482ef9226740649d8d8de;D:\\ng-manager\\webapp\\src\\app\\pages\\dashboard\\components\\widgets\\widget-base.component.ts */\n:host {\n display: block;\n height: 100%;\n}\n.widget {\n height: 100%;\n padding: 12px 0;\n display: flex;\n flex-direction: column;\n}\n.header {\n flex: 0 0 auto;\n padding: 0 16px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.title {\n font-size: 18px;\n font-weight: 600;\n flex: 1 1 auto;\n opacity: 0.5;\n}\n.actions {\n flex: 0 0 auto;\n}\n.content {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 0;\n overflow: hidden;\n}\n/*# sourceMappingURL=widget-base.component.css.map */\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { DashboardItem } from '@pages/dashboard/dashboard.model';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\n\r\n@Component({\r\n selector: 'app-widget-base',\r\n imports: [CommonModule, NzButtonModule, NzIconModule],\r\n template: `\r\n <div class=\"widget\">\r\n <div class=\"header\">\r\n <div class=\"title\">{{ item.title }}</div>\r\n @if(item.configurable){\r\n <div class=\"actions\">\r\n <ng-content select=\"actions\"></ng-content>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"content\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n `,\r\n styles: `\r\n :host {\r\n display: block;\r\n height: 100%;\r\n }\r\n\r\n .widget {\r\n height: 100%;\r\n padding: 12px 0;\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n .header {\r\n flex : 0 0 auto;\r\n padding:0 16px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n }\r\n .title {\r\n font-size: 18px;\r\n font-weight: 600;\r\n flex: 1 1 auto;\r\n opacity: 0.5;\r\n }\r\n\r\n .actions {\r\n flex: 0 0 auto;\r\n }\r\n\r\n .content {\r\n flex: 1 1 auto;\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n height: 0;\r\n overflow: hidden; \r\n }\r\n `,\r\n})\r\nexport class WidgetBaseComponent {\r\n @Input() item!: DashboardItem;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, inject, Input, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzSpaceModule } from 'ng-zorro-antd/space';\r\nimport { DashboardItem } from '../../../dashboard.model';\r\nimport { WidgetBaseComponent } from '../widget-base.component';\r\nimport { DashboardApiService } from '@pages/dashboard/services/dashboard-api.service';\r\nimport { NzMessageService } from 'ng-zorro-antd/message';\r\n@Component({\r\n selector: 'app-kill-port-widget',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n WidgetBaseComponent,\r\n NzIconModule,\r\n NzInputModule,\r\n NzSpaceModule,\r\n NzButtonModule\r\n ],\r\n template: `\r\n <app-widget-base [item]=\"item\">\r\n <div class=\"logo\">\r\n <div class=\"icon-wrapper\">\r\n <nz-icon nzType=\"thunderbolt\" nzTheme=\"outline\" />\r\n </div>\r\n <h3>准备好终止</h3>\r\n </div>\r\n <nz-space style=\"padding: 12px 24px;\">\r\n <input nz-input placeholder=\"输入一个网络端口\" name=\"port\" [(ngModel)]=\"port\" (keydown.enter)=\"killPort()\" />\r\n <button nz-button nzType=\"primary\" (click)=\"killPort()\">\r\n <nz-icon [nzType]=\"spin()?'loading' : 'thunderbolt'\" nzTheme=\"outline\" />\r\n 终止\r\n </button>\r\n </nz-space>\r\n </app-widget-base>\r\n `,\r\n styles: [\r\n `\r\n .logo {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 12px 24px;\r\n .icon-wrapper{\r\n width: 32px;\r\n height: 32px;\r\n flex: 0 0 auto;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background-color: var(--app-gray);\r\n border-radius: 50% 50%;\r\n nz-icon {\r\n font-size: 20px;\r\n color: var(--app-primary-5);\r\n }\r\n }\r\n h3{\r\n flex:1 1 auto;\r\n font-size: 18px;\r\n margin: 0;\r\n font-weight: 500;\r\n }\r\n }\r\n `\r\n ],\r\n})\r\nexport class KillPortWidgetComponent {\r\n @Input() item!: DashboardItem;\r\n port: string = '';\r\n private api = inject(DashboardApiService);\r\n private msg = inject(NzMessageService);\r\n spin = signal(false);\r\n\r\n isPortValid(): boolean {\r\n const portNumber = Number(this.port);\r\n return Number.isInteger(portNumber) && portNumber > 0 && portNumber <= 65535;\r\n }\r\n\r\n killPort() {\r\n if (!this.isPortValid()) {\r\n this.msg.error('请输入有效的端口号(1-65535)');\r\n return;\r\n }\r\n this.spin.set(true);\r\n this.api.killPort(Number(this.port)).subscribe({\r\n next: (res) => {\r\n if (res.killed.length === 0) {\r\n this.msg.info(`端口 ${this.port} 没有被任何进程占用`);\r\n return;\r\n }\r\n this.port = '';\r\n this.msg.success(`端口 ${this.port} 已被终止`);\r\n }, error: (err) => {\r\n console.error('Kill port error', err);\r\n this.msg.error(`无法终止端口 ${this.port}:${err.message || err}`);\r\n }, complete: () => {\r\n this.spin.set(false);\r\n }\r\n });\r\n }\r\n}\r\n","<app-widget-base [item]=\"item\">\r\n <ng-container ngProjectAs=\"actions\">\r\n <button nz-button nzType=\"link\" nzSize=\"small\" (click)=\"reload()\">\r\n <nz-icon [nzType]=\"loading() ? 'loading' : 'reload'\" nzTheme=\"outline\" />\r\n </button>\r\n <button nz-button nzType=\"link\" nzSize=\"small\" (click)=\"openConfig()\">\r\n <nz-icon nzType=\"setting\" nzTheme=\"outline\" />\r\n </button>\r\n <!-- <button nz-button nzType=\"link\" nzSize=\"small\">\r\n <nz-icon nzType=\"fullscreen\" nzTheme=\"outline\" />\r\n </button> -->\r\n </ng-container>\r\n <div class=\"news-feed-widget\">\r\n @if (!hasConfig()) {\r\n <div class=\"empty\">\r\n <div class=\"hint\">未配置 RSS 源</div>\r\n <button nz-button nzType=\"default\" nzSize=\"small\" (click)=\"openConfig()\">去配置</button>\r\n </div>\r\n } @else {\r\n @if (errorMsg()) {\r\n <div class=\"error\">\r\n <p>{{ errorMsg() }}</p>\r\n <button nz-button nzType=\"link\" nzSize=\"small\" (click)=\"reload(true)\">重试</button>\r\n </div>\r\n } @else {\r\n <div class=\"list\">\r\n @for (it of feedItems(); track it.link) {\r\n <a class=\"row\" [href]=\"it.link\" target=\"_blank\" rel=\"noreferrer\">\r\n <div class=\"t\">{{ it.title }}</div>\r\n <div class=\"m\">\r\n @if (it.pubDate) {\r\n <span class=\"d\">{{ it.pubDate | date: 'yyyy-MM-dd HH:mm' }}</span>\r\n }\r\n @if (it.author) {\r\n <span class=\"a\">{{ it.author }}</span>\r\n }\r\n </div>\r\n </a>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n</app-widget-base>\r\n<nz-modal\r\n nzCentered\r\n [(nzVisible)]=\"isModalVisible\"\r\n nzTitle=\"配置部件\"\r\n (nzOnCancel)=\"isModalVisible.set(false)\"\r\n [nzMaskClosable]=\"false\"\r\n>\r\n <ng-container *nzModalContent>\r\n <div class=\"modal-body\">\r\n <label>RSS源地址</label>\r\n <nz-input-wrapper>\r\n <input nz-input placeholder=\"请输入RSS源地址\" [(ngModel)]=\"rssUrl\" style=\"width: 100%\" />\r\n <nz-icon nzType=\"global\" nzTheme=\"outline\" nzInputPrefix />\r\n </nz-input-wrapper>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *nzModalFooter>\r\n <button nz-button nzType=\"primary\" (click)=\"save()\" [disabled]=\"!rssUrl().trim()\">保存</button>\r\n </ng-container>\r\n</nz-modal>\r\n","/* src/app/pages/dashboard/components/widgets/news-feed/news-feed-widget.component.less */\n.news-feed-widget {\n padding: 8px 12px;\n height: 100%;\n overflow: auto;\n}\n.empty {\n display: flex;\n flex-direction: column;\n gap: 8px;\n align-items: center;\n justify-content: center;\n height: 100%;\n opacity: 0.75;\n}\n.list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.row {\n display: block;\n padding: 8px;\n border-radius: 8px;\n text-decoration: none;\n border: 1px solid rgba(0, 0, 0, 0.06);\n}\n.row:hover {\n background: rgba(0, 0, 0, 0.02);\n}\n.t {\n font-size: 13px;\n line-height: 1.3;\n color: rgba(0, 0, 0, 0.88);\n}\n.m {\n margin-top: 4px;\n display: flex;\n gap: 10px;\n font-size: 12px;\n color: rgba(0, 0, 0, 0.45);\n}\n.error {\n display: flex;\n gap: 8px;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: #d4380d;\n}\n.error p {\n width: 100%;\n white-space: pre-wrap;\n word-break: break-word;\n}\n.loading {\n display: flex;\n gap: 8px;\n align-items: center;\n opacity: 0.75;\n}\n.modal-body {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n}\n.modal-body label {\n flex: 0 0 auto;\n margin-right: 16px;\n display: inline-block;\n width: 100px;\n}\n.modal-body input {\n flex: 1;\n margin-left: 16px;\n}\n/*# sourceMappingURL=news-feed-widget.component.css.map */\n","import { HttpParams } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { RssFeed } from '../dashboard.model';\r\nimport { ApiClient } from '@core/api';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class RssService {\r\n private api: ApiClient = inject(ApiClient);\r\n /**\r\n * 预览 RSS 订阅源\r\n * @param url RSS 订阅源 URL\r\n * @param opts 选项\r\n * - limit: 限制返回的条目数量,默认 20\r\n * - force: 是否强制刷新,默认 false\r\n * - cacheSec: 缓存时间,单位秒,默认 300\r\n * @returns RSS 订阅源内容\r\n */\r\n preview(url: string, opts?: { limit?: number; force?: boolean; cacheSec?: number }): Observable<RssFeed> {\r\n let params = new HttpParams().set(\"url\", url);\r\n if (opts?.limit) params = params.set(\"limit\", String(opts.limit));\r\n if (opts?.cacheSec) params = params.set(\"cacheSec\", String(opts.cacheSec));\r\n if (opts?.force) params = params.set(\"force\", \"1\");\r\n return this.api.get<RssFeed>(\"/api/rss/preview\", params);\r\n }\r\n}\r\n","import { ChangeDetectorRef, Component, computed, inject, Input, OnChanges, signal, SimpleChanges } from '@angular/core';\r\nimport { DashboardItem, NewsFeedWidgetConfig, RssFeedItem } from '../../../dashboard.model';\r\nimport { WidgetBaseComponent } from '../widget-base.component';\r\nimport { NzModalModule } from 'ng-zorro-antd/modal';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { DashboardLayoutService } from '@pages/dashboard/services/dashboard-layout.service';\r\nimport { RssService } from '@pages/dashboard/services/rss.service';\r\n@Component({\r\n selector: 'app-news-feed-widget',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n NzInputModule,\r\n NzButtonModule,\r\n WidgetBaseComponent,\r\n NzModalModule,\r\n NzIconModule,\r\n ],\r\n templateUrl: './news-feed-widget.component.html',\r\n styleUrls: ['./news-feed-widget.component.less'],\r\n})\r\nexport class NewsFeedWidgetComponent implements OnChanges {\r\n @Input() item!: DashboardItem;\r\n\r\n private layout = inject(DashboardLayoutService);\r\n private rss = inject(RssService);\r\n private cdr = inject(ChangeDetectorRef);\r\n\r\n curConfig = signal<NewsFeedWidgetConfig | null>(null);\r\n rssUrl = signal('');\r\n isModalVisible = signal(false);\r\n readonly loading = signal(false);\r\n\r\n feedTitle = signal<string>('');\r\n feedItems = signal<RssFeedItem[]>([]);\r\n errorMsg = signal<string>('');\r\n\r\n hasConfig = computed(() => !!this.curConfig()?.rssUrl?.trim());\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['item'] && changes['item'].currentValue) {\r\n const cfg = this.item?.config as NewsFeedWidgetConfig | undefined;\r\n this.curConfig.set(cfg ? { ...cfg } : null);\r\n // 初始化时如果已有配置,自动拉一次\r\n if (cfg?.rssUrl) this.reload(false);\r\n }\r\n }\r\n openConfig() {\r\n // 回填已有配置\r\n const cfg = this.item?.config as NewsFeedWidgetConfig | undefined;\r\n this.rssUrl.set(cfg?.rssUrl ?? '');\r\n this.isModalVisible.set(true);\r\n }\r\n\r\n reload(force = true) {\r\n const cfg = this.curConfig() ?? (this.item?.config as NewsFeedWidgetConfig | undefined);\r\n const url = (cfg?.rssUrl ?? '').trim();\r\n if (!url) return;\r\n\r\n this.loading.set(true);\r\n this.errorMsg.set('');\r\n\r\n const limit = cfg?.limit ?? 20;\r\n const cacheSec = cfg?.cacheSec ?? 300;\r\n\r\n this.rss.preview(url, { limit, cacheSec, force }).subscribe({\r\n next: (data) => {\r\n this.loading.set(false);\r\n this.feedTitle.set(data.title ?? '');\r\n this.feedItems.set(data.items ?? []);\r\n if (this.feedTitle()) {\r\n this.item.title = this.feedTitle();\r\n this.cdr.markForCheck();\r\n }\r\n },\r\n error: (err) => {\r\n this.errorMsg.set(err?.error?.detail || err?.message || '加载失败');\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n save() {\r\n const pid = this.item.projectId;\r\n const rssUrl = (this.rssUrl() ?? '').trim();\r\n if (!pid || !rssUrl) return;\r\n\r\n const prev = (this.item?.config as NewsFeedWidgetConfig | undefined) ?? {};\r\n const next: NewsFeedWidgetConfig = {\r\n ...prev,\r\n rssUrl,\r\n limit: (prev as NewsFeedWidgetConfig).limit ?? 20,\r\n cacheSec: (prev as NewsFeedWidgetConfig).cacheSec ?? 300,\r\n };\r\n\r\n this.item.config = next;\r\n this.curConfig.set(next);\r\n this.layout.updateConfig(pid, this.item.id, next);\r\n this.isModalVisible.set(false);\r\n\r\n // 保存后立即刷新\r\n this.reload(true);\r\n }\r\n}\r\n","<app-widget-base [item]=\"item\">\r\n <ng-container ngProjectAs=\"actions\">\r\n <button nz-button nzType=\"link\" nzSize=\"small\" (click)=\"openConfig()\">\r\n <nz-icon nzType=\"setting\" nzTheme=\"outline\" />\r\n </button>\r\n </ng-container>\r\n @if (item.configurable) {\r\n <div class=\"configured-info\" [class.no-config]=\"curConfig() === null\">\r\n @if (curConfig() === null) {\r\n <nz-icon nzType=\"setting\" nzTheme=\"fill\" />\r\n <button nz-button (click)=\"openConfig()\" nzType=\"primary\">配置部件</button>\r\n } @else {\r\n <div class=\"item\">\r\n <div class=\"row\" [nz-tooltip]=\"curConfig()?.description ?? ''\" nzTooltipPlacement=\"right\">\r\n <div class=\"icon\">\r\n <nz-icon nzType=\"codepen-circle\" nzTheme=\"outline\" />\r\n @if (curRuntime().status === 'running') {\r\n <nz-badge nzStatus=\"processing\" />\r\n } @else if (curRuntime().status === 'stopping') {\r\n <nz-badge nzStatus=\"warning\" />\r\n } @else {\r\n <nz-badge nzStatus=\"default\" />\r\n }\r\n </div>\r\n\r\n <div class=\"info\">\r\n <div class=\"name\" [title]=\"curConfig()?.taskName\">{{ curConfig()?.taskName }}</div>\r\n <div class=\"description\">\r\n {{\r\n curRuntime().status === 'running'\r\n ? '运行中'\r\n : curRuntime().status === 'stopping'\r\n ? '停止中'\r\n : curRuntime().status === 'stopped'\r\n ? '已停止'\r\n : curConfig()?.description || '空闲中'\r\n }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"actions\">\r\n <app-task-actions\r\n [isRunning]=\"isRunning()\"\r\n [isStopping]=\"isStopping()\"\r\n [isStopped]=\"isStopped()\"\r\n (toggle)=\"toggleTask()\"\r\n ></app-task-actions>\r\n <button nz-button (click)=\"goToTask()\" nzType=\"default\">\r\n <nz-icon nzType=\"schedule\" nzTheme=\"outline\" />\r\n 前往任务页\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</app-widget-base>\r\n<nz-modal\r\n nzCentered\r\n [(nzVisible)]=\"isModalVisible\"\r\n nzTitle=\"配置部件\"\r\n (nzOnCancel)=\"isModalVisible.set(false)\"\r\n [nzMaskClosable]=\"false\"\r\n>\r\n <ng-container *nzModalContent>\r\n <div class=\"modal-body\">\r\n <label>选择一项任务</label>\r\n <nz-select\r\n nzPlaceHolder=\"请选择任务\"\r\n [(ngModel)]=\"selectedTaskId\"\r\n [nzLoading]=\"loading()\"\r\n [nzDisabled]=\"loading()\"\r\n style=\"width: 100%\"\r\n >\r\n @for (opt of taskOptions(); track opt.value) {\r\n <nz-option [nzLabel]=\"opt.label\" [nzValue]=\"opt.value\"></nz-option>\r\n }\r\n </nz-select>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *nzModalFooter>\r\n <button nz-button nzType=\"primary\" (click)=\"save()\" [disabled]=\"!selectedTaskId\">保存</button>\r\n </ng-container>\r\n</nz-modal>\r\n","/* src/app/pages/dashboard/components/widgets/quick-task/quick-task-widget.component.less */\n.configured-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n width: 100%;\n height: 100%;\n}\n.configured-info.no-config {\n gap: 20px;\n}\n.configured-info.no-config nz-icon {\n font-size: 48px;\n color: var(--app-gray);\n}\n.configured-info .actions {\n display: flex;\n align-items: center;\n width: 100%;\n justify-content: center;\n gap: 8px;\n}\n.item {\n width: 100%;\n padding: 12px 16px;\n cursor: pointer;\n}\n.item:hover,\n.item.active {\n background: var(--app-primary-3);\n}\n.item .row {\n display: flex;\n gap: 10px;\n align-items: center;\n overflow: hidden;\n justify-content: space-between;\n}\n.item .row .icon {\n font-size: 36px;\n flex: 0 0 auto;\n position: relative;\n}\n.item .row .info {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n gap: 4px;\n overflow: hidden;\n}\n.item .row .info .name {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.item .row .info .description {\n font-size: 13px;\n color: var(--app-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.item .badge {\n font-size: 12px;\n padding: 2px 8px;\n border-radius: 999px;\n border: 1px solid rgba(0, 0, 0, 0.2);\n opacity: 0.85;\n}\n.item .badge[data-status=running] {\n font-weight: 700;\n}\n.item .badge[data-status=stopped] {\n opacity: 0.7;\n}\n.item .badge[data-status=failed] {\n font-weight: 700;\n}\n.item .meta {\n margin-top: 6px;\n font-size: 12px;\n opacity: 0.75;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n.item .meta .mono {\n font-family:\n ui-monospace,\n SFMono-Regular,\n Menlo,\n Consolas,\n \"Liberation Mono\",\n monospace;\n}\n.item .meta .sep {\n opacity: 0.5;\n}\n.modal-body {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n}\n.modal-body label {\n flex: 0 0 auto;\n margin-right: 16px;\n display: inline-block;\n width: 120px;\n}\n.modal-body nz-select {\n flex: 1;\n margin-left: 16px;\n}\n/*# sourceMappingURL=quick-task-widget.component.css.map */\n","import { CommonModule } from '@angular/common';\r\nimport { Component, computed, inject, Input, OnChanges, signal, SimpleChanges } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TaskRow } from '@models/task.model';\r\nimport { DashboardLayoutService } from '@pages/dashboard/services/dashboard-layout.service';\r\nimport { TaskStateService } from '@pages/tasks/services/tasks.state.service';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzModalModule } from 'ng-zorro-antd/modal';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\nimport { DashboardItem, QuickTaskWidgetConfig } from '../../../dashboard.model';\r\nimport { WidgetBaseComponent } from '../widget-base.component';\r\nimport { NzBadgeModule } from 'ng-zorro-antd/badge';\r\nimport { NzTooltipModule } from 'ng-zorro-antd/tooltip';\r\nimport { TaskActionsComponent } from '@pages/tasks/task-actions/task-actions.component';\r\nimport { Router } from '@angular/router';\r\n@Component({\r\n selector: 'app-quick-task-widget',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n WidgetBaseComponent,\r\n NzButtonModule,\r\n NzIconModule,\r\n NzModalModule,\r\n NzSelectModule,\r\n NzBadgeModule,\r\n NzTooltipModule,\r\n TaskActionsComponent\r\n ],\r\n templateUrl: './quick-task-widget.component.html',\r\n styleUrls: ['./quick-task-widget.component.less'],\r\n})\r\nexport class QuickTaskWidgetComponent implements OnChanges {\r\n\r\n @Input() item!: DashboardItem;\r\n\r\n private taskState = inject(TaskStateService);\r\n private layout = inject(DashboardLayoutService);\r\n private router = inject(Router);\r\n\r\n isModalVisible = signal(false);\r\n\r\n readonly loading = signal(false);\r\n\r\n\r\n curConfig = signal<QuickTaskWidgetConfig | null>(null);\r\n\r\n curRuntime = computed(() => {\r\n const cfg = this.curConfig();\r\n if (!cfg) return { status: 'idle' };\r\n const taskId = cfg.taskId;\r\n return this.taskState.getRuntime(taskId) || { status: 'idle' };\r\n });\r\n\r\n readonly isRunning = computed(() => this.curRuntime().status === \"running\");\r\n readonly isStopping = computed(() => this.curRuntime().status === \"stopping\");\r\n readonly isStopped = computed(() => {\r\n const st = this.curRuntime().status;\r\n return st === \"idle\" || st === \"stopped\" || st === \"failed\" || st === \"success\";\r\n });\r\n\r\n selectedTaskId = '';\r\n\r\n /** 当前项目任务 rows */\r\n readonly rowsOfProject = computed<TaskRow[]>(() => {\r\n const pid = this.item.projectId;\r\n if (!pid) return [];\r\n return this.taskState.rowsViewOf(pid)();\r\n });\r\n\r\n readonly taskOptions = computed(() => {\r\n const rows = this.rowsOfProject();\r\n return rows\r\n .map(r => ({\r\n value: r.spec.id,\r\n label: r.spec.name ?? r.spec.id,\r\n description: r.spec.description ?? '',\r\n }));\r\n });\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['item']) {\r\n const cfg = this.item?.config as QuickTaskWidgetConfig | undefined;\r\n this.curConfig.set(cfg ? { ...cfg } : null);\r\n }\r\n }\r\n async openConfig() {\r\n const pid = this.item.projectId;\r\n if (!pid) {\r\n this.isModalVisible.set(false);\r\n return;\r\n }\r\n\r\n // 回填已有配置\r\n const cfg = this.item?.config as QuickTaskWidgetConfig | undefined;\r\n this.selectedTaskId = cfg?.taskId ?? '';\r\n this.isModalVisible.set(true);\r\n // 确保任务已加载\r\n this.loading.set(true);\r\n try {\r\n await this.taskState.ensureProjectLoaded(pid);\r\n } finally {\r\n this.loading.set(false);\r\n }\r\n }\r\n\r\n\r\n save() {\r\n const pid = this.item.projectId;\r\n const taskId = (this.selectedTaskId ?? '').trim();\r\n if (!pid || !taskId) return;\r\n const taskItem = this.rowsOfProject().find(r => r.spec.id === taskId)\r\n const taskName = taskItem?.spec.name ?? '';\r\n const description = taskItem?.spec.description ?? '';\r\n const next: QuickTaskWidgetConfig = { taskId, taskName, description };\r\n this.item.config = next;\r\n this.curConfig.set(next);\r\n this.layout.updateConfig(pid, this.item.id, next);\r\n this.isModalVisible.set(false);\r\n\r\n }\r\n toggleTask() {\r\n if (this.curConfig() == null || !this.curConfig()!.taskId) return;\r\n const taskId = this.curConfig()!.taskId;\r\n if (this.isRunning()) {\r\n this.taskState.stopSelected(taskId);\r\n } else if (this.isStopped()) {\r\n this.taskState.startSelected(taskId);\r\n }\r\n this.goToTask();\r\n }\r\n async goToTask() {\r\n const cfg = this.curConfig();\r\n if (!cfg) return;\r\n const taskId = cfg.taskId;\r\n this.taskState.select(taskId);\r\n await this.router.navigate(['/tasks']);\r\n }\r\n}\r\n","/* src/app/pages/dashboard/components/widgets/welcome/welcome-widget.component.less */\n.logo {\n width: 70px;\n height: 70px;\n border-radius: 50% 50%;\n background-color: var(--app-primary-2);\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 16px auto;\n}\n.logo nz-icon {\n font-size: 50px;\n}\nh2 {\n text-align: center;\n font-weight: 600;\n flex: 0 0 auto;\n margin-bottom: 8px;\n}\n.footer {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 30px 0;\n}\n.item {\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: 24px 16px;\n}\n.item p {\n margin-bottom: 0;\n}\n.item .icon-wrapper {\n width: 50px;\n height: 50px;\n margin-right: 12px;\n flex: 0 0 auto;\n background-color: var(--app-gray);\n border-radius: 50% 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.item .icon-wrapper nz-icon {\n font-size: 24px;\n color: var(--app-primary-5);\n}\n/*# sourceMappingURL=welcome-widget.component.css.map */\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { DashboardItem } from '../../../dashboard.model';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { CommonModule } from '@angular/common';\r\nimport { WidgetBaseComponent } from '../widget-base.component';\r\n@Component({\r\n selector: 'app-welcome-widget',\r\n imports: [\r\n CommonModule,\r\n NzIconModule,\r\n NzButtonModule,\r\n WidgetBaseComponent,\r\n ],\r\n template: `\r\n <app-widget-base [item]=\"item\">\r\n <div class=\"logo\">\r\n <nz-icon nzType=\"proj:angular\" nzTheme=\"outline\" />\r\n </div>\r\n <h2>欢迎来到新项目!</h2>\r\n <div class=\"item\">\r\n <div class=\"icon-wrapper\">\r\n <nz-icon nzType=\"dashboard\" nzTheme=\"outline\" />\r\n </div>\r\n <p>这里是项目仪表盘,你可以点击右上方的“自定义”按钮来添加部件。你的改动将会自动保存。</p>\r\n </div>\r\n <div class=\"item\">\r\n <div class=\"icon-wrapper\">\r\n <nz-icon nzType=\"arrow-left\" nzTheme=\"outline\" />\r\n </div>\r\n <p>左侧是各个管理页面。在「插件」页面可以添加新的 Vue CLI 插件,「依赖」页面用于管理项目的依赖包,「配置」页面用于配置各种工具,「任务」页面用于运行各个脚本(比如 webpack 打包)。</p>\r\n </div>\r\n <div class=\"item\">\r\n <div class=\"icon-wrapper\">\r\n <nz-icon nzType=\"home\" nzTheme=\"outline\" />\r\n </div>\r\n <p>点击左上方的下拉菜单或状态栏上的小房子按钮来返回到项目管理器。</p>\r\n </div>\r\n <div class=\"footer\">\r\n <button nz-button nzType=\"primary\" routerLink=\"/projects\" nzSize=\"large\" (click)=\"removeWidget.emit()\">\r\n <nz-icon nzType=\"check\" nzTheme=\"outline\" />\r\n <span> 了解 </span>\r\n </button>\r\n </div>\r\n </app-widget-base>\r\n `,\r\n styleUrls: ['./welcome-widget.component.less'],\r\n})\r\nexport class WelcomeWidgetComponent {\r\n @Input() item!: DashboardItem;\r\n\r\n @Output() removeWidget = new EventEmitter<void>();\r\n}\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { DashboardItem } from '../../dashboard.model';\r\nimport {\r\n WelcomeWidgetComponent,\r\n QuickTaskWidgetComponent,\r\n KillPortWidgetComponent,\r\n NewsFeedWidgetComponent\r\n} from \"../widgets\";\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-widget-host',\r\n imports: [\r\n CommonModule,\r\n WelcomeWidgetComponent,\r\n QuickTaskWidgetComponent,\r\n KillPortWidgetComponent,\r\n NewsFeedWidgetComponent\r\n ],\r\n template: `\r\n @if(item){\r\n @switch (item.key) {\r\n @case ('welcome') { <app-welcome-widget [item]=\"item\" (removeWidget)=\"remove.emit(item)\"></app-welcome-widget> }\r\n @case ('quickTasks') { <app-quick-task-widget [item]=\"item\"></app-quick-task-widget> }\r\n @case ('killPort') { <app-kill-port-widget [item]=\"item\"></app-kill-port-widget> }\r\n @case ('newsFeed') { <app-news-feed-widget [item]=\"item\"></app-news-feed-widget> }\r\n }\r\n }\r\n `,\r\n styles: [\r\n `\r\n :host { display:block; width:100%; height:100%; }\r\n .widget-shell { width:100%; height:100%; }\r\n .widget-shell[data-fit=\"scroll\"] { overflow: auto; }\r\n .widget-shell[data-fit=\"responsive\"] { overflow: hidden; }\r\n .widget-shell[data-fit=\"scale\"] { overflow: hidden; }\r\n .widget-scale { width:100%; height:100%; }\r\n `\r\n ],\r\n})\r\nexport class WidgetHostComponent {\r\n @Input() item: DashboardItem | undefined;\r\n @Input() editMode = false;\r\n\r\n @Output() remove = new EventEmitter<DashboardItem>();\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\r\nimport {\r\n CompactType,\r\n DisplayGrid,\r\n GridsterComponent,\r\n GridsterConfig,\r\n GridsterItem,\r\n GridsterItemComponent,\r\n GridsterItemComponentInterface,\r\n GridType\r\n} from 'angular-gridster2';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { DashboardItem } from '../../dashboard.model';\r\nimport { WidgetHostComponent } from '../widget-host/widget-host.component';\r\nimport { NzTooltipDirective } from \"ng-zorro-antd/tooltip\";\r\n\r\n@Component({\r\n selector: 'app-dashboard-canvas',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n NzButtonModule,\r\n NzIconModule,\r\n GridsterComponent,\r\n GridsterItemComponent,\r\n WidgetHostComponent,\r\n \r\n ],\r\n template: `\r\n <gridster [options]=\"options\">\r\n @for (it of items; track it.id) {\r\n <gridster-item [item]=\"it\">\r\n <div class=\"card\" [class.edit-mode]=\"editMode\">\r\n <!-- 编辑态遮罩 -->\r\n @if (editMode) {\r\n <div class=\"card-overlay\" aria-hidden=\"true\">\r\n <button nz-button nzType=\"primary\" nzSize=\"large\">\r\n <i nz-icon [nzType]=\"it.icon || 'appstore'\" nzTheme=\"outline\"></i>\r\n {{ it.title }}\r\n </button>\r\n </div>\r\n <button nz-button nzType=\"text\" nzSize=\"small\" nz-tooltip=\"移除部件\" class=\"remove-button\" (click)=\"remove.emit(it.id)\">\r\n <nz-icon nzType=\"close\" nzTheme=\"outline\" />\r\n </button>\r\n }\r\n <div class=\"card-body\">\r\n <app-widget-host [item]=\"it\" [editMode]=\"editMode\" (remove)=\"remove.emit($event.id)\"></app-widget-host>\r\n </div>\r\n </div>\r\n </gridster-item>\r\n }\r\n </gridster>\r\n `,\r\n styles: `\r\n :host { display: block; height: 100%; }\r\n gridster { display:block; height:100%;background: var(--app-primary-1); }\r\n gridster-item{\r\n border-radius: 10px;\r\n }\r\n .card {\r\n height: 100%;\r\n background: #fff;\r\n border-radius: 10px;\r\n box-shadow: 0 2px 10px rgba(0,0,0,.06);\r\n overflow: hidden;\r\n position: relative;\r\n }\r\n\r\n .card.edit-mode { user-select: none; }\r\n\r\n /* overlay 只做视觉层,不拦截事件 */\r\n .card-overlay{\r\n position:absolute; inset:0;\r\n background: rgba(255,255,255,0.55);\r\n display:flex; justify-content:center; align-items:center;\r\n pointer-events:none;\r\n z-index: 2;\r\n }\r\n .remove-button{\r\n position: absolute;\r\n right: 16px;\r\n top: 16px;\r\n z-index: 3;\r\n background: var(--app-primary-1);\r\n color: var(--app-primary);\r\n transition: all 0.3s;\r\n &:hover{\r\n background: var(--app-primary);\r\n color: #fff;\r\n }\r\n }\r\n .card-overlay button { pointer-events:none; border-radius: 20px; }\r\n .title{ font-size: 12px; color: rgba(0,0,0,.75); }\r\n\r\n .card-body{\r\n position: relative;\r\n height: 100%;\r\n }\r\n .card.edit-mode .card-body {cursor: move;pointer-events: none;opacity: 0.8;}\r\n `,\r\n})\r\nexport class DashboardCanvasComponent implements OnChanges {\r\n @Input() editMode = false;\r\n @Input() items: DashboardItem[] = [];\r\n @Output() itemsChange = new EventEmitter<DashboardItem[]>();\r\n @Output() remove = new EventEmitter<string>();\r\n @Output() kill = new EventEmitter<string>();\r\n\r\n private patch = new Map<string, Partial<DashboardItem>>();\r\n itemChange = (item: GridsterItem, itemComp: GridsterItemComponentInterface) => {\r\n const id = (itemComp.item as DashboardItem).id as string;\r\n if (!id) return;\r\n this.patch.set(id, {\r\n x: item.x ?? itemComp.item.x,\r\n y: item.y ?? itemComp.item.y,\r\n cols: item.cols ?? itemComp.item.cols,\r\n rows: item.rows ?? itemComp.item.rows,\r\n });\r\n };\r\n itemResize = (item: GridsterItem, itemComp: GridsterItemComponentInterface) => {\r\n\r\n }\r\n options: GridsterConfig = {\r\n gridType: GridType.Fixed,\r\n fixedColWidth: 90,\r\n fixedRowHeight: 90,\r\n margin: 10,\r\n outerMargin: true,\r\n compactType: CompactType.None,\r\n pushItems: true,\r\n\r\n // 调试时可开网格线,正式关掉\r\n displayGrid: DisplayGrid.None,\r\n resizable: {\r\n enabled: true,\r\n stop: () => this.emitSync(),\r\n },\r\n draggable: {\r\n enabled: false,\r\n // ignoreContent: true,\r\n // dragHandleClass: 'drag-handle', // 只允许手柄拖动\r\n stop: () => this.emitSync(),\r\n },\r\n itemChangeCallback: this.itemChange,\r\n itemResizeCallback: this.itemResize,\r\n };\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const editMode = changes['editMode'];\r\n if (editMode && editMode.currentValue != editMode.previousValue) {\r\n this.options = {\r\n ...this.options,\r\n draggable: { ...this.options.draggable, enabled: this.editMode },\r\n resizable: { ...this.options.resizable, enabled: this.editMode },\r\n fixedColWidth: this.editMode ? 70 : 90,\r\n fixedRowHeight: this.editMode ? 70 : 90,\r\n }\r\n }\r\n }\r\n\r\n private emitSync() {\r\n const next = this.items.map(it => {\r\n const p = this.patch.get(it.id);\r\n return p ? { ...it, ...p } : it;\r\n });\r\n this.patch.clear();\r\n this.itemsChange.emit(next);\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n afterNextRender,\r\n Component, computed, effect,\r\n EnvironmentInjector,\r\n inject,\r\n runInInjectionContext,\r\n signal,\r\n untracked\r\n} from '@angular/core';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzDrawerModule } from 'ng-zorro-antd/drawer';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\n\r\nimport { PageLayoutComponent } from '@app/shared';\r\nimport { AddWidgetDrawerComponent, DashboardCanvasComponent } from './components';\r\nimport { DashboardItem } from './dashboard.model';\r\nimport { DashboardLayoutService } from './services/dashboard-layout.service';\r\nimport { ProjectContextStore } from '@app/core/stores';\r\n\r\n@Component({\r\n selector: 'app-dashboard.component',\r\n imports: [\r\n CommonModule,\r\n NzButtonModule,\r\n NzIconModule,\r\n NzCardModule,\r\n NzDrawerModule,\r\n PageLayoutComponent,\r\n DashboardCanvasComponent,\r\n AddWidgetDrawerComponent,\r\n ],\r\n host: {\r\n '[class.collapsed]': 'editMode()',\r\n },\r\n template: `\r\n <app-page-layout [title]=\"'项目仪表盘'\" [isFullscreen]=\"true\">\r\n <ng-container ngProjectAs=\"actions\">\r\n <button nz-button nzType=\"primary\" (click)=\"toggleEdit()\">\r\n <nz-icon [nzType]=\"editMode() ? 'check' : 'edit'\" nzTheme=\"outline\"></nz-icon>\r\n {{ editMode() ? '完成' : '自定义' }}\r\n </button>\r\n </ng-container>\r\n\r\n <app-dashboard-canvas\r\n [editMode]=\"editMode()\"\r\n [items]=\"items()\"\r\n (itemsChange)=\"onItemsChange($event)\"\r\n (remove)=\"layout.remove($event)\"\r\n (kill)=\"layout.killProcess($event)\"\r\n ></app-dashboard-canvas>\r\n </app-page-layout>\r\n <div class=\"side-panel\" [class.open]=\"editMode()\">\r\n <div class=\"side-header\">\r\n <div class=\"title\">添加部件</div>\r\n <button nz-button nzType=\"text\" (click)=\"editMode.set(false)\">\r\n <nz-icon nzType=\"close\"></nz-icon>\r\n </button>\r\n </div>\r\n <div class=\"side-body\">\r\n <app-add-widget-drawer (add)=\"layout.add($event)\"></app-add-widget-drawer>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n :host{\r\n height: 100%;\r\n display: block;\r\n position: relative;\r\n transition: width 0.2s;\r\n }\r\n :host.collapsed {\r\n width: calc(100% - 360px);\r\n }\r\n .side-panel {\r\n position: fixed;\r\n top: 0;\r\n right: 0;\r\n height: 100vh;\r\n width: 360px;\r\n background: #fff;\r\n box-shadow: -8px 0 24px rgba(0,0,0,.12);\r\n transform: translateX(100%);\r\n transition: transform 0.2s ease;\r\n z-index: 1000;\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n .side-panel.open {\r\n transform: translateX(0);\r\n }\r\n\r\n .side-header{\r\n height: 56px;\r\n padding: 0 12px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n border-bottom: 1px solid rgba(0,0,0,.06);\r\n }\r\n .side-body{\r\n flex: 1;\r\n overflow: hidden;\r\n }\r\n `],\r\n})\r\nexport class DashboardComponent {\r\n private projectContext = inject(ProjectContextStore)\r\n public layout = inject(DashboardLayoutService);\r\n\r\n private envInjector = inject(EnvironmentInjector);\r\n\r\n projectId = computed(() => this.projectContext.currentProjectId() || '');\r\n editMode = signal(false);\r\n\r\n items = computed(() => this.layout.items());\r\n\r\n constructor() {\r\n effect(() => {\r\n const pid = this.projectId();\r\n if (!pid) return;\r\n // 只做数据加载,不要在这里同步关 drawer\r\n untracked(() => this.layout.load(pid));\r\n runInInjectionContext(this.envInjector, () => {\r\n afterNextRender(() => {\r\n queueMicrotask(() => this.editMode.set(false));\r\n });\r\n });\r\n });\r\n }\r\n\r\n toggleEdit() {\r\n const next = !this.editMode();\r\n this.editMode.set(next);\r\n\r\n if (!next) {\r\n this.layout.flushSave(this.projectId());\r\n } else {\r\n this.layout.getWidgets();\r\n }\r\n }\r\n\r\n onItemsChange(next: DashboardItem[]) {\r\n this.layout.setItems(this.projectId(), next);\r\n }\r\n}\r\n"],"mappings":"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","names":["DashboardApiService","DashboardLayoutService","AddWidgetDrawerComponent","GridType","DisplayGrid","CompactType","DirTypes","Direction","cancelMouse","cancelMouseLeave","cancelOnBlur","cancelTouchMove","cancelTouchEnd","cancelTouchCancel","WidgetBaseComponent","KillPortWidgetComponent","news_feed_widget_component_default","RssService","NewsFeedWidgetComponent","quick_task_widget_component_default","QuickTaskWidgetComponent","WelcomeWidgetComponent","WidgetHostComponent","DashboardCanvasComponent","DashboardComponent"],"x_google_ignoreList":[6]}
|