ui-soxo-bootstrap-core 2.6.6 → 2.6.7
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/.babelrc +8 -8
- package/.github/workflows/npm-publish.yml +33 -33
- package/.husky/pre-commit +11 -11
- package/.prettierrc.json +10 -10
- package/babel.config.js +2 -2
- package/core/components/component-loader/component-loader.js +125 -125
- package/core/components/component-wrapper/component-wrapper.js +121 -121
- package/core/components/external-window/DEVELOPER_GUIDE.md +705 -705
- package/core/components/external-window/external-window.js +236 -236
- package/core/components/external-window/external-window.test.js +80 -80
- package/core/components/extra-info/extra-info-details.js +155 -155
- package/core/components/extra-info/extra-info-details.scss +26 -26
- package/core/components/extra-info/extra-info.js +134 -134
- package/core/components/index.js +20 -20
- package/core/components/landing-api/landing-api.js +492 -492
- package/core/components/landing-api/landing-api.scss +19 -19
- package/core/components/menu-template-api/menu-template-api.js +321 -321
- package/core/components/root-application-api/root-application-api.js +174 -174
- package/core/index.js +13 -13
- package/core/lib/Store.js +365 -365
- package/core/lib/components/application-bootstrap/application-bootstrap.js +115 -115
- package/core/lib/components/approval-form/approval-form.js +280 -280
- package/core/lib/components/approval-form/approval-form.scss +183 -183
- package/core/lib/components/approval-list/approval-list.js +143 -143
- package/core/lib/components/approval-list/approval-list.scss +2 -2
- package/core/lib/components/approval-list/components/request-card/request-card.js +42 -42
- package/core/lib/components/approval-list/components/request-card/request-card.scss +30 -30
- package/core/lib/components/camera/camera.js +230 -230
- package/core/lib/components/camera/camera.scss +86 -86
- package/core/lib/components/comment-block/comment-block.js +138 -138
- package/core/lib/components/comment-block/comment-block.scss +3 -3
- package/core/lib/components/confirm-modal/confirm-modal.js +82 -82
- package/core/lib/components/confirm-modal/confirm-modal.scss +2 -2
- package/core/lib/components/consent/consent.js +67 -67
- package/core/lib/components/consent/pdf-signature.js +299 -299
- package/core/lib/components/consent/signature-pad.js +90 -90
- package/core/lib/components/consent/signature-pad.scss +14 -14
- package/core/lib/components/file-upload/file-upload.js +133 -133
- package/core/lib/components/finger-print-reader/finger-print-reader.js +295 -295
- package/core/lib/components/finger-print-reader/finger-print-reader.scss +47 -47
- package/core/lib/components/finger-print-search/finger-print-search.js +200 -200
- package/core/lib/components/finger-print-search/finger-print-search.scss +47 -47
- package/core/lib/components/global-header/animations.js +18 -18
- package/core/lib/components/global-header/global-header.js +413 -413
- package/core/lib/components/global-header/global-header.scss +369 -369
- package/core/lib/components/header/generic-header.js +76 -76
- package/core/lib/components/header/generic-header.scss +99 -99
- package/core/lib/components/image-preview/image-preview.js +33 -33
- package/core/lib/components/image-wrapper/image-wrapper.js +108 -108
- package/core/lib/components/image-wrapper/image-wrapper.scss +12 -12
- package/core/lib/components/index.js +206 -206
- package/core/lib/components/landing/landing.js +403 -403
- package/core/lib/components/language-switcher/language-switcher.js +49 -49
- package/core/lib/components/menu-context/menu-context.js +69 -69
- package/core/lib/components/menu-template/menu-template.js +249 -249
- package/core/lib/components/menu-template/menu-template.scss +9 -9
- package/core/lib/components/modal-search/modal-search.js +153 -153
- package/core/lib/components/modal-search/modal-search.scss +78 -78
- package/core/lib/components/modal-wrapper/modal-manager.js +15 -15
- package/core/lib/components/modal-wrapper/modal-wrapper.js +108 -108
- package/core/lib/components/modal-wrapper/modal-wrapper.scss +13 -13
- package/core/lib/components/notice-board/notice-board.js +132 -132
- package/core/lib/components/notice-board/notice-board.scss +65 -65
- package/core/lib/components/page-container/page-container.js +55 -55
- package/core/lib/components/page-container/page-container.scss +8 -8
- package/core/lib/components/page-header/page-header.js +23 -23
- package/core/lib/components/page-header/page-header.scss +17 -17
- package/core/lib/components/pdf-viewer/pdf-viewer.js +56 -56
- package/core/lib/components/portlet-table/components/table-actions/table-actions.js +58 -58
- package/core/lib/components/portlet-table/components/table-actions/table-actions.scss +1 -1
- package/core/lib/components/portlet-table/components/table-data/table-data.js +106 -106
- package/core/lib/components/portlet-table/portlet-table.js +63 -63
- package/core/lib/components/portlet-table/portlet-table.scss +90 -90
- package/core/lib/components/progress-bar/progress-bar.js +58 -58
- package/core/lib/components/progress-bar/progress-bar.scss +15 -15
- package/core/lib/components/request-form/request-form.js +110 -110
- package/core/lib/components/root-application/root-application.js +70 -70
- package/core/lib/components/rupee/rupee.js +14 -14
- package/core/lib/components/script-input/script-input.js +169 -169
- package/core/lib/components/script-input/script-input.scss +8 -8
- package/core/lib/components/sidemenu/animations.js +51 -51
- package/core/lib/components/sidemenu/sidemenu.js +578 -578
- package/core/lib/components/sidemenu/sidemenu.scss +277 -277
- package/core/lib/components/spotlight-search/spotlight-search.component.js +635 -635
- package/core/lib/components/spotlight-search/spotlight-search.component.scss +78 -78
- package/core/lib/components/table-wrapper/table-wrapper.js +135 -135
- package/core/lib/components/table-wrapper/table-wrapper.scss +72 -72
- package/core/lib/components/ui_elements/Loader.js +12 -12
- package/core/lib/components/ui_elements/Notify.js +12 -12
- package/core/lib/components/ui_elements/PlaceHolder.js +33 -33
- package/core/lib/components/web-camera/web-camera.js +161 -161
- package/core/lib/components/web-camera/web-camera.scss +28 -28
- package/core/lib/core.md +9 -9
- package/core/lib/elements/Elements.md +2 -2
- package/core/lib/elements/basic/LoggedUserRedirect.js +21 -21
- package/core/lib/elements/basic/PrivateRoute.js +16 -16
- package/core/lib/elements/basic/button/Button.md +43 -43
- package/core/lib/elements/basic/button/button.js +170 -170
- package/core/lib/elements/basic/card/Card.md +15 -15
- package/core/lib/elements/basic/card/card.js +40 -40
- package/core/lib/elements/basic/card/card.scss +13 -13
- package/core/lib/elements/basic/checkbox/checkbox.js +23 -23
- package/core/lib/elements/basic/col/col.js +15 -15
- package/core/lib/elements/basic/copy-to-clipboard/Readme.md +40 -40
- package/core/lib/elements/basic/copy-to-clipboard/copy-to-clipboard.js +61 -61
- package/core/lib/elements/basic/country-phone-input/Readme.md +98 -98
- package/core/lib/elements/basic/country-phone-input/country-phone-input.js +106 -106
- package/core/lib/elements/basic/country-phone-input/phone-input.scss +61 -61
- package/core/lib/elements/basic/datepicker/datepicker.js +33 -33
- package/core/lib/elements/basic/dragabble-wrapper/draggable-wrapper.js +136 -136
- package/core/lib/elements/basic/empty/empty.js +14 -14
- package/core/lib/elements/basic/fingerprint-protrected/fingerprint-protected.js +118 -118
- package/core/lib/elements/basic/fingerprint-protrected/fingerprint-protected.scss +10 -10
- package/core/lib/elements/basic/form/form.js +70 -70
- package/core/lib/elements/basic/form/form.scss +3 -3
- package/core/lib/elements/basic/image/image.js +45 -45
- package/core/lib/elements/basic/image/image.scss +17 -17
- package/core/lib/elements/basic/image/readme.md +26 -26
- package/core/lib/elements/basic/image-viewer/image-viewer.js +108 -108
- package/core/lib/elements/basic/image-viewer/image-viewer.scss +7 -7
- package/core/lib/elements/basic/input/input.js +81 -81
- package/core/lib/elements/basic/input/readme.md +77 -77
- package/core/lib/elements/basic/json-input/json-input.js +51 -51
- package/core/lib/elements/basic/menu-dashboard/menu-dashboard.js +216 -216
- package/core/lib/elements/basic/menu-dashboard/menu-dashboard.scss +28 -28
- package/core/lib/elements/basic/menu-tree/menu-tree.js +127 -114
- package/core/lib/elements/basic/modal/modal.js +64 -64
- package/core/lib/elements/basic/modal/readme.md +62 -62
- package/core/lib/elements/basic/popconfirm/popconfirm.js +17 -17
- package/core/lib/elements/basic/popover/popover.js +12 -12
- package/core/lib/elements/basic/radio/radio.js +18 -18
- package/core/lib/elements/basic/rangepicker/rangepicker.js +141 -141
- package/core/lib/elements/basic/rangepicker/rangepicker.scss +24 -24
- package/core/lib/elements/basic/rangepicker/readme.md +81 -81
- package/core/lib/elements/basic/reference-select/readme.md +18 -18
- package/core/lib/elements/basic/reference-select/reference-select.js +337 -337
- package/core/lib/elements/basic/row/row.js +15 -15
- package/core/lib/elements/basic/select/select.js +46 -46
- package/core/lib/elements/basic/select-box/readme.md +52 -52
- package/core/lib/elements/basic/select-box/select-box.js +63 -63
- package/core/lib/elements/basic/skeleton/readme.md +35 -35
- package/core/lib/elements/basic/skeleton/skeleton.js +35 -35
- package/core/lib/elements/basic/skeleton/skeleton.scss +53 -53
- package/core/lib/elements/basic/space/space.js +12 -12
- package/core/lib/elements/basic/switch/readme.md +29 -29
- package/core/lib/elements/basic/switch/switch.js +67 -67
- package/core/lib/elements/basic/tab/tab.js +14 -14
- package/core/lib/elements/basic/table/readme.md +8 -8
- package/core/lib/elements/basic/table/table.js +100 -100
- package/core/lib/elements/basic/tag/tag.js +63 -63
- package/core/lib/elements/basic/tag/tag.scss +2 -2
- package/core/lib/elements/basic/timeline/timeline.js +13 -13
- package/core/lib/elements/basic/title/readme.md +20 -20
- package/core/lib/elements/basic/title/title.js +37 -37
- package/core/lib/elements/basic/user-search/user-search.js +192 -192
- package/core/lib/elements/complex/barcode/barcode.js +27 -27
- package/core/lib/elements/complex/bargraph/bar-graph.js +262 -262
- package/core/lib/elements/complex/basic-table/basic-table.js +110 -110
- package/core/lib/elements/complex/basic-table/basic-table.scss +4 -4
- package/core/lib/elements/complex/date-display/date-display.js +37 -37
- package/core/lib/elements/complex/error-boundary/error-boundary.js +29 -29
- package/core/lib/elements/complex/google-location-input/map-container-library-load.js +92 -92
- package/core/lib/elements/complex/google-map/google-map.js +230 -230
- package/core/lib/elements/complex/google-map/google-map.scss +13 -13
- package/core/lib/elements/complex/line-graph/line-graph.js +108 -108
- package/core/lib/elements/complex/location-search-input/location-search-input.js +100 -100
- package/core/lib/elements/complex/pie-chart/pie-chart.js +202 -202
- package/core/lib/elements/complex/qr-code/qr-code.js +27 -27
- package/core/lib/elements/complex/qrscanner/qrscanner.js +57 -57
- package/core/lib/elements/complex/search-debounce/search-debounce.js +37 -37
- package/core/lib/elements/complex/statistic-card/dashboard-statistic-card.js +75 -75
- package/core/lib/elements/complex/statistic-card/statistic-card.js +28 -28
- package/core/lib/elements/index.js +226 -226
- package/core/lib/hooks/device-detect.js +25 -25
- package/core/lib/hooks/index.js +9 -9
- package/core/lib/hooks/use-location.js +33 -33
- package/core/lib/hooks/use-otp-timer.js +80 -80
- package/core/lib/hooks/use-window-size.js +34 -34
- package/core/lib/i18n.js +69 -69
- package/core/lib/index.js +106 -106
- package/core/lib/introduction.md +73 -73
- package/core/lib/js-styleguide.md +4112 -4112
- package/core/lib/models/actions/actions.js +127 -127
- package/core/lib/models/actions/components/action-detail/action-detail.js +190 -190
- package/core/lib/models/actions/components/custom-actions/custom-actions.js +185 -185
- package/core/lib/models/attachments/attachments.js +231 -231
- package/core/lib/models/base-loader.js +99 -99
- package/core/lib/models/base.js +716 -716
- package/core/lib/models/branches/branches.js +125 -125
- package/core/lib/models/checklists/checklists.js +114 -114
- package/core/lib/models/columns/columns.js +169 -169
- package/core/lib/models/columns/components/columns-add/columns-add.js +171 -171
- package/core/lib/models/comments/comments.js +213 -213
- package/core/lib/models/departments/departments.js +107 -107
- package/core/lib/models/financial-years/financial_years.js +127 -127
- package/core/lib/models/forms/components/form-creator/form-creator.js +624 -624
- package/core/lib/models/forms/components/form-creator/form-creator.scss +30 -30
- package/core/lib/models/forms/components/form-detail/form-detail.js +224 -224
- package/core/lib/models/forms/forms.js +121 -121
- package/core/lib/models/index.js +203 -203
- package/core/lib/models/invoice-numbers/invoice_numbers.js +204 -204
- package/core/lib/models/lookup-types/components/lookup-detail/lookup-detail.js +145 -145
- package/core/lib/models/lookup-types/lookup-types.js +113 -113
- package/core/lib/models/lookup-values/components/lookup-values-add/lookup-values-add.js +126 -126
- package/core/lib/models/lookup-values/lookup-values.js +107 -107
- package/core/lib/models/menu-roles/menu-roles.js +127 -127
- package/core/lib/models/menus/components/menu-add/menu-add.js +228 -228
- package/core/lib/models/menus/components/menu-detail/menu-detail.js +170 -170
- package/core/lib/models/menus/components/menu-list/menu-list.js +550 -593
- package/core/lib/models/menus/components/menu-list/menu-list.scss +5 -5
- package/core/lib/models/menus/components/menu-roles-add/menu-roles-add.js +183 -183
- package/core/lib/models/menus/menus.js +499 -499
- package/core/lib/models/models/components/model-detail/model-detail.js +137 -137
- package/core/lib/models/models/components/models.js +128 -128
- package/core/lib/models/modules/modules.js +204 -204
- package/core/lib/models/outbox/outbox.js +73 -73
- package/core/lib/models/pages/pages.js +107 -107
- package/core/lib/models/permissions/permissions.js +71 -71
- package/core/lib/models/process/components/process-add/process-add.js +181 -181
- package/core/lib/models/process/components/process-dashboard/process-dashboard.js +601 -601
- package/core/lib/models/process/components/process-dashboard/process-dashboard.scss +62 -62
- package/core/lib/models/process/components/process-detail/process-detail.js +140 -140
- package/core/lib/models/process/components/process-timeline/process-timeline.js +139 -139
- package/core/lib/models/process/components/task-detail/task-detail.js +240 -240
- package/core/lib/models/process/components/task-detail/task-detail.scss +27 -27
- package/core/lib/models/process/components/task-form/task-form.js +528 -528
- package/core/lib/models/process/components/task-form/task-form.scss +7 -7
- package/core/lib/models/process/components/task-list/task-list.js +221 -221
- package/core/lib/models/process/components/task-list/task-list.scss +14 -14
- package/core/lib/models/process/components/task-overview/task-overview.js +299 -299
- package/core/lib/models/process/components/task-overview-legacy/task-overview-legacy.js +192 -192
- package/core/lib/models/process/components/task-routes/task-routes.js +45 -45
- package/core/lib/models/process/components/task-status/task-status.js +175 -175
- package/core/lib/models/process/components/task-status/task-status.scss +11 -11
- package/core/lib/models/process/process.js +780 -780
- package/core/lib/models/process-transactions/process-transactions.js +123 -123
- package/core/lib/models/roles/roles.js +106 -106
- package/core/lib/models/scripts/scripts.js +111 -111
- package/core/lib/models/step-transactions/step-transcations.js +147 -147
- package/core/lib/models/steps/components/step-add/step-add.js +261 -261
- package/core/lib/models/steps/components/step-detail/step-detail.js +157 -157
- package/core/lib/models/steps/steps.js +356 -356
- package/core/lib/models/user-preferences/user-preferences.js +83 -83
- package/core/lib/models/users/components/user-add/user-add.js +226 -226
- package/core/lib/models/users/users.js +119 -119
- package/core/lib/modules/business/launch-page/launch-page.js +29 -29
- package/core/lib/modules/business/launch-page/launch-page.scss +5 -5
- package/core/lib/modules/business/slots/slots.js +231 -231
- package/core/lib/modules/business/slots/slots.scss +108 -108
- package/core/lib/modules/forms/components/field-customizer/field-customizer.js +138 -138
- package/core/lib/modules/forms/components/field-selector/field-selector.js +157 -157
- package/core/lib/modules/forms/components/field-selector/field-selector.scss +25 -25
- package/core/lib/modules/forms/components/form-display/form-display.js +203 -203
- package/core/lib/modules/forms/components/form-display/form-display.scss +9 -9
- package/core/lib/modules/forms/components/tab-customizer/tab-customizer.js +124 -124
- package/core/lib/modules/generic/generic-add/generic-add.js +213 -213
- package/core/lib/modules/generic/generic-detail/generic-detail.js +199 -199
- package/core/lib/modules/generic/generic-edit/generic-edit.js +120 -120
- package/core/lib/modules/generic/generic-list/ExportReactCSV.js +62 -62
- package/core/lib/modules/generic/generic-list/generic-list.js +705 -705
- package/core/lib/modules/generic/generic-list/generic-list.scss +34 -34
- package/core/lib/modules/generic/generic-upload/generic-upload.js +483 -483
- package/core/lib/modules/generic/table-settings/table-settings.js +226 -226
- package/core/lib/modules/generic/table-settings/table-settings.scss +37 -37
- package/core/lib/modules/index.js +52 -52
- package/core/lib/modules/modules-routes/module-routes.js +35 -35
- package/core/lib/pages/change-password/change-password.js +201 -201
- package/core/lib/pages/change-password/change-password.scss +73 -73
- package/core/lib/pages/homepage/homepage.js +53 -53
- package/core/lib/pages/index.js +19 -19
- package/core/lib/pages/login/commnication-mode-selection.js +46 -46
- package/core/lib/pages/login/communication-mode-selection.scss +60 -60
- package/core/lib/pages/login/login.js +864 -864
- package/core/lib/pages/login/login.scss +353 -344
- package/core/lib/pages/login/reset-password.js +124 -125
- package/core/lib/pages/login/reset-password.scss +31 -22
- package/core/lib/pages/manage-users/manage-users.js +429 -429
- package/core/lib/pages/manage-users/manage-users.scss +25 -25
- package/core/lib/pages/profile/profile.js +247 -247
- package/core/lib/pages/profile/profile.scss +107 -107
- package/core/lib/pages/profile/theme-config.js +18 -18
- package/core/lib/pages/profile/themes-backup.json +310 -310
- package/core/lib/pages/profile/themes.json +254 -254
- package/core/lib/pages/register/register.js +176 -176
- package/core/lib/pages/register/register.scss +128 -128
- package/core/lib/react-styleguide.md +756 -756
- package/core/lib/utils/api/api.utils.js +211 -211
- package/core/lib/utils/api/readme.md +426 -426
- package/core/lib/utils/async.js +35 -35
- package/core/lib/utils/common/common.utils.js +223 -223
- package/core/lib/utils/common/readme.md +30 -30
- package/core/lib/utils/date/date.utils.js +295 -295
- package/core/lib/utils/date/readme.md +2 -2
- package/core/lib/utils/firebase.support.utils.js +98 -98
- package/core/lib/utils/firebase.utils.js +808 -808
- package/core/lib/utils/form/form.utils.js +255 -255
- package/core/lib/utils/generic/generic.utils.js +69 -69
- package/core/lib/utils/http/auth.helper.js +95 -95
- package/core/lib/utils/http/http.utils.js +158 -158
- package/core/lib/utils/http/readme.md +14 -14
- package/core/lib/utils/index.js +40 -40
- package/core/lib/utils/location/location.utils.js +137 -137
- package/core/lib/utils/location/readme.md +18 -18
- package/core/lib/utils/modal.utils.js +15 -15
- package/core/lib/utils/notification.utils.js +34 -34
- package/core/lib/utils/pwa/pwa.utils.js +88 -88
- package/core/lib/utils/script.utils.js +235 -235
- package/core/lib/utils/setting.utils.js +68 -68
- package/core/lib/utils/upload.utils.js +29 -29
- package/core/models/Preference/Preferences.js +46 -46
- package/core/models/base/base.js +403 -403
- package/core/models/base-clone-loader.js +107 -107
- package/core/models/base-clone.js +187 -187
- package/core/models/base-loader.js +97 -97
- package/core/models/core-scripts/core-scripts.js +150 -150
- package/core/models/dashboard/dashboard.js +201 -201
- package/core/models/detail-loader.js +88 -88
- package/core/models/doctor/components/doctor-add/doctor-add.js +427 -427
- package/core/models/doctor/components/doctor-add/doctor-add.scss +32 -32
- package/core/models/groups.js +82 -82
- package/core/models/index.js +100 -100
- package/core/models/lookup-types/components/lookup-detail/lookup-detail.js +129 -129
- package/core/models/lookup-types/lookup-types.js +96 -96
- package/core/models/lookup-values/components/lookup-values-modal/lookup-values-modal.js +95 -95
- package/core/models/lookup-values/lookup-values.js +92 -92
- package/core/models/menu-roles/components/menu-roles-add/menu-roles-add.js +153 -153
- package/core/models/menu-roles/menu-roles.js +158 -158
- package/core/models/menus/components/menu-add/menu-add.js +288 -288
- package/core/models/menus/components/menu-add/menu-add.scss +31 -31
- package/core/models/menus/components/menu-detail/menu-detail.js +263 -263
- package/core/models/menus/components/menu-list/menu-list.js +392 -392
- package/core/models/menus/components/menu-lists/menu-lists.js +581 -585
- package/core/models/menus/components/menu-lists/menu-lists.scss +46 -46
- package/core/models/menus/menus.js +310 -310
- package/core/models/model-columns.js +121 -121
- package/core/models/models/components/model-detail/model-add.js +120 -120
- package/core/models/models/components/model-detail/model-detail.js +133 -133
- package/core/models/models/models.js +154 -154
- package/core/models/pages/components/page-add/page-add.js +163 -163
- package/core/models/pages/components/page-add/page-add.scss +30 -30
- package/core/models/pages/components/page-details/page-details.js +209 -209
- package/core/models/pages/components/page-list/page-list.js +248 -248
- package/core/models/pages/pages.js +142 -142
- package/core/models/pages.js +142 -142
- package/core/models/roles/components/role-add/role-add.js +345 -312
- package/core/models/roles/components/role-add/role-add.scss +4 -4
- package/core/models/roles/components/role-list/role-list.js +386 -386
- package/core/models/roles/roles.js +196 -196
- package/core/models/staff/components/staff-add/staff-add.js +467 -467
- package/core/models/user-roles/components/user-roles-add/user-roles-add.js +149 -149
- package/core/models/user-roles/user-roles.js +113 -113
- package/core/models/users/components/assign-role/assign-role.js +413 -406
- package/core/models/users/components/assign-role/assign-role.scss +281 -281
- package/core/models/users/components/assign-role/avatar-props.js +45 -45
- package/core/models/users/components/user-add/user-add.js +848 -856
- package/core/models/users/components/user-add/user-edit.js +107 -106
- package/core/models/users/components/user-detail/user-detail.js +236 -236
- package/core/models/users/components/user-list/user-list.js +397 -397
- package/core/models/users/users.js +379 -379
- package/core/modules/Informations/change-info/change-info.js +618 -618
- package/core/modules/Informations/change-info/change-info.scss +134 -134
- package/core/modules/dashboard/components/dashboard-card/animations.js +64 -64
- package/core/modules/dashboard/components/dashboard-card/dashboard-card.js +197 -197
- package/core/modules/dashboard/components/dashboard-card/menu-dashboard-card.js +430 -430
- package/core/modules/dashboard/components/dashboard-card/menu-dashboard-card.scss +59 -59
- package/core/modules/dashboard/components/pop-query-dashboard/pop-query-dashboard.js +66 -66
- package/core/modules/generic/components/generic-add/generic-add.js +121 -121
- package/core/modules/generic/components/generic-add/generic-add.scss +13 -13
- package/core/modules/generic/components/generic-add-modal/generic-add-modal.js +125 -125
- package/core/modules/generic/components/generic-add-modal/generic-add-modal.scss +13 -13
- package/core/modules/generic/components/generic-detail/generic-detail.js +184 -184
- package/core/modules/generic/components/generic-detail/generic-detail.scss +25 -25
- package/core/modules/generic/components/generic-edit/generic-edit.js +123 -123
- package/core/modules/generic/components/generic-list/generic-list.js +335 -335
- package/core/modules/generic/components/generic-list/generic-list.scss +35 -35
- package/core/modules/index.js +42 -42
- package/core/modules/module-routes/module-routes.js +37 -37
- package/core/modules/reporting/components/index.js +6 -6
- package/core/modules/reporting/components/reporting-dashboard/README.md +316 -316
- package/core/modules/reporting/components/reporting-dashboard/display-columns/build-display-columns.js +74 -74
- package/core/modules/reporting/components/reporting-dashboard/display-columns/build-display-columns.test.js +74 -74
- package/core/modules/reporting/components/reporting-dashboard/display-columns/display-cell-renderer.js +252 -252
- package/core/modules/reporting/components/reporting-dashboard/display-columns/display-cell-renderer.test.js +126 -126
- package/core/modules/reporting/components/reporting-dashboard/reporting-dashboard.js +880 -880
- package/core/modules/reporting/components/reporting-dashboard/reporting-dashboard.scss +171 -171
- package/core/modules/steps/action-buttons.js +74 -74
- package/core/modules/steps/action-buttons.scss +44 -44
- package/core/modules/steps/steps.js +348 -348
- package/core/modules/steps/steps.scss +357 -357
- package/core/modules/steps/timeline.js +56 -56
- package/core/pages/homepage-api/homepage-api.js +106 -106
- package/core/pages/homepage-api/homepage-api.scss +233 -233
- package/core/pages/homepage-api/menu-dashboard.js +169 -169
- package/core/pages/homepage-api/menu-dashboard.scss +11 -11
- package/core/translation.json +53 -53
- package/core/translations.json +19 -19
- package/core/utils/script.utils.js +129 -129
- package/core/utils/settings.utils.js +25 -25
- package/eslint.config.mjs +79 -79
- package/index.js +35 -35
- package/jest.config.js +7 -7
- package/jest.setup.js +1 -1
- package/package.json +123 -123
- package/tsconfig.json +26 -26
- package/webpack.config.js +173 -173
|
@@ -1,430 +1,430 @@
|
|
|
1
|
-
import { useState, useEffect } from 'react';
|
|
2
|
-
|
|
3
|
-
import { Modal, Skeleton, Alert, Typography, Button, Drawer } from 'antd';
|
|
4
|
-
|
|
5
|
-
import { Dashboard } from './../../../../models/';
|
|
6
|
-
|
|
7
|
-
import PopQueryDashboard from '../pop-query-dashboard/pop-query-dashboard';
|
|
8
|
-
|
|
9
|
-
import { StatisticCard, BasicTable, ExtraInfoDetail } from './../../../../lib';
|
|
10
|
-
|
|
11
|
-
import ReportingDashboard from '../../../reporting/components/reporting-dashboard/reporting-dashboard';
|
|
12
|
-
|
|
13
|
-
import DashboardStatisticCard from '../../../../lib/elements/complex/statistic-card/dashboard-statistic-card';
|
|
14
|
-
|
|
15
|
-
/** Title */
|
|
16
|
-
const { Title } = Typography;
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Dashboard Card
|
|
20
|
-
*
|
|
21
|
-
* @param {*} param0
|
|
22
|
-
* @returns {string}
|
|
23
|
-
*/
|
|
24
|
-
export default function MenuDashboardCard({ record, selectedCardId, scope, dbPtr, callback, onSelect, style, handleHide, homePage }) {
|
|
25
|
-
const isSelected = selectedCardId === record.id;
|
|
26
|
-
|
|
27
|
-
const [visible, setVisible] = useState(false);
|
|
28
|
-
const [popquery, setPopquery] = useState(false);
|
|
29
|
-
|
|
30
|
-
const [loading, setLoading] = useState(true);
|
|
31
|
-
|
|
32
|
-
const [result, setResult] = useState({});
|
|
33
|
-
|
|
34
|
-
const [showDrawer, setShowDrawer] = useState(false);
|
|
35
|
-
|
|
36
|
-
const [otherDetails, setOtherDetails] = useState({});
|
|
37
|
-
/**
|
|
38
|
-
* useEffect Hook
|
|
39
|
-
*
|
|
40
|
-
* Executes the `executeQuery` function when the component mounts.
|
|
41
|
-
*/
|
|
42
|
-
|
|
43
|
-
useEffect(() => {
|
|
44
|
-
executeQuery(record.id);
|
|
45
|
-
}, []);
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Executes the dashboard query and sets the result state with the fetched data.
|
|
49
|
-
* Handles both success and error responses.
|
|
50
|
-
*
|
|
51
|
-
* @param {string|number} id - The ID used to execute the query and fetch dashboard data.
|
|
52
|
-
* @returns {void} This function does not return anything.
|
|
53
|
-
*/
|
|
54
|
-
async function executeQuery(id) {
|
|
55
|
-
setLoading(true);
|
|
56
|
-
if (dbPtr) {
|
|
57
|
-
dbPtr = dbPtr;
|
|
58
|
-
} else {
|
|
59
|
-
dbPtr = localStorage.db_ptr;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Execute dashboard
|
|
63
|
-
try {
|
|
64
|
-
let response = await Dashboard.execDashboard(id, scope, dbPtr);
|
|
65
|
-
|
|
66
|
-
let reportData = {};
|
|
67
|
-
|
|
68
|
-
if (response.result) {
|
|
69
|
-
reportData = response.result[0];
|
|
70
|
-
} else {
|
|
71
|
-
if (response[0]) {
|
|
72
|
-
reportData = response[0];
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
if (reportData.length > 0) {
|
|
76
|
-
setResult(reportData);
|
|
77
|
-
} else {
|
|
78
|
-
// handleHide();
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
setLoading(false);
|
|
82
|
-
// })
|
|
83
|
-
} catch (error) {
|
|
84
|
-
setResult({ error: 'Error' });
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Parses `other_details` from the record and applies styles.
|
|
90
|
-
* If `other_details` exists, it is parsed as JSON; otherwise, an empty object is used.
|
|
91
|
-
*
|
|
92
|
-
* @type {Object}
|
|
93
|
-
*/
|
|
94
|
-
let styles = {};
|
|
95
|
-
|
|
96
|
-
if (record.other_details) {
|
|
97
|
-
styles = JSON.parse(record.other_details);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Opens a pop-up modal and passes the record to the callback function.
|
|
102
|
-
*
|
|
103
|
-
* @param {Object} record - The record data to be passed.
|
|
104
|
-
* @returns {void} This function does not return anything.
|
|
105
|
-
*/
|
|
106
|
-
|
|
107
|
-
function viewPopQueryModal(record) {
|
|
108
|
-
let otherDetails;
|
|
109
|
-
|
|
110
|
-
if (record.other_details) {
|
|
111
|
-
otherDetails = JSON.parse(record.other_details);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
if (otherDetails?.script_id) {
|
|
115
|
-
//If viewMode = 'modal' → open modal
|
|
116
|
-
if (otherDetails?.viewMode === 'modal') {
|
|
117
|
-
setVisible(true);
|
|
118
|
-
//If viewMode = 'drawer' → open drawer
|
|
119
|
-
} else if (otherDetails?.viewMode === 'drawer') {
|
|
120
|
-
setShowDrawer(true);
|
|
121
|
-
// callback(record, scope)
|
|
122
|
-
} else {
|
|
123
|
-
//Otherwise → fallback callback
|
|
124
|
-
callback(record);
|
|
125
|
-
}
|
|
126
|
-
//No script_id but has viewMode → set popquery
|
|
127
|
-
} else if (otherDetails?.viewMode) {
|
|
128
|
-
// No script_id but has viewMode
|
|
129
|
-
setPopquery(true);
|
|
130
|
-
} else {
|
|
131
|
-
// Default
|
|
132
|
-
callback(record);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
setOtherDetails(otherDetails);
|
|
136
|
-
onSelect();
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
*
|
|
141
|
-
*/
|
|
142
|
-
// function executePopQuery() { }
|
|
143
|
-
|
|
144
|
-
var props = {};
|
|
145
|
-
/**
|
|
146
|
-
* Stores component properties, including the loading state.
|
|
147
|
-
*
|
|
148
|
-
* @type {Object}
|
|
149
|
-
*/
|
|
150
|
-
|
|
151
|
-
if (loading) {
|
|
152
|
-
props.loading = true;
|
|
153
|
-
}
|
|
154
|
-
function onCancel() {
|
|
155
|
-
setVisible(false);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Convert nested style objects into a valid CSS string.
|
|
160
|
-
* @param {*} parentClass
|
|
161
|
-
* @param {*} nestedStyles
|
|
162
|
-
* @returns
|
|
163
|
-
*/
|
|
164
|
-
const convertNestedStylesToCSS = (parentClass, nestedStyles) => {
|
|
165
|
-
let css = '';
|
|
166
|
-
// Iterate through each child selector and its corresponding style object
|
|
167
|
-
for (const [childSelector, styleObj] of Object.entries(nestedStyles)) {
|
|
168
|
-
if (typeof styleObj !== 'object') continue;
|
|
169
|
-
|
|
170
|
-
const fullSelector = `${parentClass} ${childSelector}`;
|
|
171
|
-
const rules = Object.entries(styleObj)
|
|
172
|
-
.map(([key, value]) => `${key.replace(/([A-Z])/g, '-$1').toLowerCase()}:${value};`)
|
|
173
|
-
.join(' ');
|
|
174
|
-
css += `${fullSelector} { ${rules} }\n`;
|
|
175
|
-
}
|
|
176
|
-
// Append the formatted CSS block
|
|
177
|
-
return css;
|
|
178
|
-
};
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* defaultStyles for the cards
|
|
182
|
-
*/
|
|
183
|
-
const defaultStyles = {
|
|
184
|
-
'.menu-dashboard-card': {
|
|
185
|
-
'.text-section': {
|
|
186
|
-
fontSize: '13px',
|
|
187
|
-
textAlign: 'justify',
|
|
188
|
-
},
|
|
189
|
-
'.table-section': {
|
|
190
|
-
width: '100%',
|
|
191
|
-
},
|
|
192
|
-
height: '11px',
|
|
193
|
-
// minWidth: '130px',
|
|
194
|
-
padding: '17px 7px',
|
|
195
|
-
fontSize: '10px',
|
|
196
|
-
display: 'flex',
|
|
197
|
-
alignItems: 'center',
|
|
198
|
-
justifyContent: 'center',
|
|
199
|
-
// margin: '10px',
|
|
200
|
-
cursor: 'pointer',
|
|
201
|
-
borderRadius:'30px',
|
|
202
|
-
boxShadow: "0 0.5px 0.5px rgba(0,0,0,0.08)",
|
|
203
|
-
|
|
204
|
-
'&.selected': {
|
|
205
|
-
border: '2px solid #b1ceeb',
|
|
206
|
-
},
|
|
207
|
-
|
|
208
|
-
'.statistic-card-container': {
|
|
209
|
-
'.ant-statistic-title': {
|
|
210
|
-
color: 'rgba(0, 0, 0, 0.
|
|
211
|
-
fontSize: '10px',
|
|
212
|
-
marginBottom: '0px',
|
|
213
|
-
},
|
|
214
|
-
'.ant-statistic-content': {
|
|
215
|
-
color: 'rgba(0, 0, 0, 0.85)',
|
|
216
|
-
fontSize: '10px',
|
|
217
|
-
display: 'flex',
|
|
218
|
-
justifyContent: 'center',
|
|
219
|
-
},
|
|
220
|
-
'.ant-statistic':{
|
|
221
|
-
display: 'flex',
|
|
222
|
-
justifyContent: 'space-between',
|
|
223
|
-
alignItems: 'center',
|
|
224
|
-
gap:'5px'
|
|
225
|
-
}
|
|
226
|
-
},
|
|
227
|
-
},
|
|
228
|
-
};
|
|
229
|
-
// Extract nested styles for the ".statistic-card-container"
|
|
230
|
-
// from the deeply nested style object (if available).
|
|
231
|
-
const nestedStyles = styles?.style?.['.menu-dashboard']?.['.menu-dashboard-card']?.['.statistic-card-container'];
|
|
232
|
-
|
|
233
|
-
// Generate the dynamic CSS string using convertNestedStylesToCSS.
|
|
234
|
-
// 1. Base selector: ".statistic-card-container"
|
|
235
|
-
// 2. Styles: Use `nestedStyles` if available,
|
|
236
|
-
// otherwise fall back to default styles from `defaultStyles`.
|
|
237
|
-
const dynamicCSS = convertNestedStylesToCSS(
|
|
238
|
-
'.statistic-card-container',
|
|
239
|
-
nestedStyles || defaultStyles['.menu-dashboard-card']?.['.statistic-card-container'] || {}
|
|
240
|
-
);
|
|
241
|
-
/**
|
|
242
|
-
* Renders different dashboard tiles based on the `tiletypeptr` of the record.
|
|
243
|
-
*
|
|
244
|
-
* @param {Object} record - The record containing the tile information and tile type.
|
|
245
|
-
* @returns {JSX.Element | string} The rendered dashboard tile component or an empty string.
|
|
246
|
-
*/
|
|
247
|
-
let span = 24;
|
|
248
|
-
function displayDashboardTile(record) {
|
|
249
|
-
switch (record.tiletypeptr) {
|
|
250
|
-
case 'BASIC': {
|
|
251
|
-
if (homePage) {
|
|
252
|
-
|
|
253
|
-
return (
|
|
254
|
-
<div className={`menu-dashboard-card card ${isSelected ? 'selected' : ''}`} onClick={() => viewPopQueryModal(record)} style={{padding:"14px 20px",width:"320px",border: "1px solid rgb(239 ,230 ,230)" ,boxShadow: "0 0.5px 0.5px rgba(0,0,0,0.08)"}}>
|
|
255
|
-
<Title
|
|
256
|
-
// Apply styles for the ".text-section"
|
|
257
|
-
// Priority: use custom styles from `styles` if provided,
|
|
258
|
-
// otherwise fallback to default styles
|
|
259
|
-
style={
|
|
260
|
-
styles?.style?.['.menu-dashboard']?.['.menu-dashboard-card']?.['.text-section'] ||
|
|
261
|
-
defaultStyles['.menu-dashboard-card']?.['.text-section']
|
|
262
|
-
}
|
|
263
|
-
>
|
|
264
|
-
{record.text}
|
|
265
|
-
</Title>
|
|
266
|
-
{/* <StatisticCard result={result[0]} {...props} /> */}
|
|
267
|
-
{/* for home dashboard */}
|
|
268
|
-
<DashboardStatisticCard result={result[0]} {...props} />
|
|
269
|
-
</div>
|
|
270
|
-
);
|
|
271
|
-
} else {
|
|
272
|
-
return (
|
|
273
|
-
<div
|
|
274
|
-
// Inline style merging:
|
|
275
|
-
// 1. Base styles → from `styles` object if available, otherwise from `defaultStyles`
|
|
276
|
-
// 2. If the card is selected → merge "&.selected" styles (custom or default)
|
|
277
|
-
className={`menu-dashboard-card card ${isSelected ? 'selected' : ''}`}
|
|
278
|
-
onClick={() => viewPopQueryModal(record)}
|
|
279
|
-
style={{
|
|
280
|
-
...(styles?.style?.['.menu-dashboard']?.['.menu-dashboard-card'] || defaultStyles['.menu-dashboard-card']),
|
|
281
|
-
...(isSelected
|
|
282
|
-
? styles?.style?.['.menu-dashboard']?.['.menu-dashboard-card']?.['&.selected'] ||
|
|
283
|
-
defaultStyles['.menu-dashboard-card']?.['&.selected'] ||
|
|
284
|
-
{}
|
|
285
|
-
: {}),
|
|
286
|
-
}}
|
|
287
|
-
>
|
|
288
|
-
{dynamicCSS && <style dangerouslySetInnerHTML={{ __html: dynamicCSS }} />}
|
|
289
|
-
<div className="statistic-card-container selected">
|
|
290
|
-
<StatisticCard result={result[0]} {...props} />
|
|
291
|
-
</div>
|
|
292
|
-
</div>
|
|
293
|
-
);
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
case 'TABLE':
|
|
297
|
-
return (
|
|
298
|
-
// Apply styles for the ".table-section"
|
|
299
|
-
// Priority: use custom styles from `styles` if present,
|
|
300
|
-
// otherwise fall back to default styles
|
|
301
|
-
<div style={styles?.style?.['.menu-dashboard']?.['.table-section'] || defaultStyles['.menu-dashboard-card']?.['.table-section']}>
|
|
302
|
-
<Title
|
|
303
|
-
// Apply styles for the ".text-section"
|
|
304
|
-
// Priority: use custom styles from `styles` if provided,
|
|
305
|
-
// otherwise fallback to default styles
|
|
306
|
-
style={
|
|
307
|
-
styles?.style?.['.menu-dashboard']?.['.menu-dashboard-card']?.['.text-section'] ||
|
|
308
|
-
defaultStyles['.menu-dashboard-card']?.['.text-section']
|
|
309
|
-
}
|
|
310
|
-
>
|
|
311
|
-
{record.text}
|
|
312
|
-
</Title>
|
|
313
|
-
<BasicTable styles={styles} result={result} {...props} />
|
|
314
|
-
{styles?.action ? (
|
|
315
|
-
<span
|
|
316
|
-
style={{ display: 'flex', justifyContent: 'flex-end', cursor: 'pointer', fontWeight: 'bold', fontSize: '16px' }}
|
|
317
|
-
className="link"
|
|
318
|
-
onClick={() => viewPopQueryModal(record)}
|
|
319
|
-
>
|
|
320
|
-
View
|
|
321
|
-
</span>
|
|
322
|
-
) : null}
|
|
323
|
-
</div>
|
|
324
|
-
);
|
|
325
|
-
|
|
326
|
-
case 'LINEGPH':
|
|
327
|
-
return null;
|
|
328
|
-
// return <BarGraph data={result} {...props} />;
|
|
329
|
-
|
|
330
|
-
default:
|
|
331
|
-
return '';
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
function onClose() {
|
|
336
|
-
setShowDrawer(false);
|
|
337
|
-
}
|
|
338
|
-
function onCancelPopQuery() {
|
|
339
|
-
setPopquery(false);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
return (
|
|
343
|
-
<>
|
|
344
|
-
{loading ? (
|
|
345
|
-
// <Skeleton />
|
|
346
|
-
<Skeleton
|
|
347
|
-
active
|
|
348
|
-
title={false}
|
|
349
|
-
paragraph={{ rows: 1, width: ['80%', '50%'] }}
|
|
350
|
-
style={{ width: 100, padding: 20 }}
|
|
351
|
-
/>
|
|
352
|
-
) : (
|
|
353
|
-
<>
|
|
354
|
-
{result.length > 0 ? (
|
|
355
|
-
<>
|
|
356
|
-
{/* <div className='text-section'> */}
|
|
357
|
-
|
|
358
|
-
{/* </div> */}
|
|
359
|
-
|
|
360
|
-
<div>
|
|
361
|
-
<div className="text-section">
|
|
362
|
-
{/* <Title
|
|
363
|
-
// Apply styles for the ".text-section"
|
|
364
|
-
// Priority: use custom styles from `styles` if provided,
|
|
365
|
-
// otherwise fallback to default styles
|
|
366
|
-
style={
|
|
367
|
-
styles?.style?.['.menu-dashboard']?.['.menu-dashboard-card']?.['.text-section'] ||
|
|
368
|
-
defaultStyles['.menu-dashboard-card']?.['.text-section']
|
|
369
|
-
}
|
|
370
|
-
>
|
|
371
|
-
{record.text}
|
|
372
|
-
</Title> */}
|
|
373
|
-
</div>
|
|
374
|
-
<div>
|
|
375
|
-
{result.error ? (
|
|
376
|
-
<>
|
|
377
|
-
<Alert message="Error loading values" type="error" showIcon />
|
|
378
|
-
</>
|
|
379
|
-
) : (
|
|
380
|
-
// <>{loading ? <Skeleton /> : {(result.length ?displayDashboardTile(record)}:null)}</>
|
|
381
|
-
<> {loading ? <Skeleton /> : result.length ? displayDashboardTile(record) : null}</>
|
|
382
|
-
)}
|
|
383
|
-
</div>
|
|
384
|
-
</div>
|
|
385
|
-
</>
|
|
386
|
-
) : null}
|
|
387
|
-
</>
|
|
388
|
-
)}
|
|
389
|
-
{/* Render reporting dashboard inside the modal */}
|
|
390
|
-
<Modal
|
|
391
|
-
width="80%"
|
|
392
|
-
destroyOnClose={true}
|
|
393
|
-
visible={visible}
|
|
394
|
-
title={record.text}
|
|
395
|
-
footer={null}
|
|
396
|
-
okText="Create"
|
|
397
|
-
cancelText="Cancel"
|
|
398
|
-
onCancel={onCancel}
|
|
399
|
-
onOk={() => {}}
|
|
400
|
-
>
|
|
401
|
-
<ReportingDashboard reportId={otherDetails.script_id}></ReportingDashboard>
|
|
402
|
-
</Modal>
|
|
403
|
-
{/** end */}
|
|
404
|
-
{/* Render the PopQueryDashboard inside the modal */}
|
|
405
|
-
<Modal
|
|
406
|
-
width="80%"
|
|
407
|
-
destroyOnClose={true}
|
|
408
|
-
visible={popquery}
|
|
409
|
-
title={record.text}
|
|
410
|
-
footer={null}
|
|
411
|
-
okText="Create"
|
|
412
|
-
cancelText="Cancel"
|
|
413
|
-
onCancel={onCancelPopQuery}
|
|
414
|
-
onOk={() => {}}
|
|
415
|
-
>
|
|
416
|
-
<PopQueryDashboard record={record} id={record.id} />
|
|
417
|
-
</Modal>
|
|
418
|
-
{/** end */}
|
|
419
|
-
<>
|
|
420
|
-
{/* Inside the drawer, render ReportingDashboard
|
|
421
|
-
Passing `reportId` and `scope` as props */}
|
|
422
|
-
{showDrawer ? (
|
|
423
|
-
<Drawer width={'85%'} title={otherDetails?.groupcaption} onClose={onClose} open={showDrawer}>
|
|
424
|
-
<ReportingDashboard reportId={otherDetails.script_id} scope={scope}></ReportingDashboard>
|
|
425
|
-
</Drawer>
|
|
426
|
-
) : null}
|
|
427
|
-
</>
|
|
428
|
-
</>
|
|
429
|
-
);
|
|
430
|
-
}
|
|
1
|
+
import { useState, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
import { Modal, Skeleton, Alert, Typography, Button, Drawer } from 'antd';
|
|
4
|
+
|
|
5
|
+
import { Dashboard } from './../../../../models/';
|
|
6
|
+
|
|
7
|
+
import PopQueryDashboard from '../pop-query-dashboard/pop-query-dashboard';
|
|
8
|
+
|
|
9
|
+
import { StatisticCard, BasicTable, ExtraInfoDetail } from './../../../../lib';
|
|
10
|
+
|
|
11
|
+
import ReportingDashboard from '../../../reporting/components/reporting-dashboard/reporting-dashboard';
|
|
12
|
+
|
|
13
|
+
import DashboardStatisticCard from '../../../../lib/elements/complex/statistic-card/dashboard-statistic-card';
|
|
14
|
+
|
|
15
|
+
/** Title */
|
|
16
|
+
const { Title } = Typography;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Dashboard Card
|
|
20
|
+
*
|
|
21
|
+
* @param {*} param0
|
|
22
|
+
* @returns {string}
|
|
23
|
+
*/
|
|
24
|
+
export default function MenuDashboardCard({ record, selectedCardId, scope, dbPtr, callback, onSelect, style, handleHide, homePage }) {
|
|
25
|
+
const isSelected = selectedCardId === record.id;
|
|
26
|
+
|
|
27
|
+
const [visible, setVisible] = useState(false);
|
|
28
|
+
const [popquery, setPopquery] = useState(false);
|
|
29
|
+
|
|
30
|
+
const [loading, setLoading] = useState(true);
|
|
31
|
+
|
|
32
|
+
const [result, setResult] = useState({});
|
|
33
|
+
|
|
34
|
+
const [showDrawer, setShowDrawer] = useState(false);
|
|
35
|
+
|
|
36
|
+
const [otherDetails, setOtherDetails] = useState({});
|
|
37
|
+
/**
|
|
38
|
+
* useEffect Hook
|
|
39
|
+
*
|
|
40
|
+
* Executes the `executeQuery` function when the component mounts.
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
executeQuery(record.id);
|
|
45
|
+
}, []);
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Executes the dashboard query and sets the result state with the fetched data.
|
|
49
|
+
* Handles both success and error responses.
|
|
50
|
+
*
|
|
51
|
+
* @param {string|number} id - The ID used to execute the query and fetch dashboard data.
|
|
52
|
+
* @returns {void} This function does not return anything.
|
|
53
|
+
*/
|
|
54
|
+
async function executeQuery(id) {
|
|
55
|
+
setLoading(true);
|
|
56
|
+
if (dbPtr) {
|
|
57
|
+
dbPtr = dbPtr;
|
|
58
|
+
} else {
|
|
59
|
+
dbPtr = localStorage.db_ptr;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Execute dashboard
|
|
63
|
+
try {
|
|
64
|
+
let response = await Dashboard.execDashboard(id, scope, dbPtr);
|
|
65
|
+
|
|
66
|
+
let reportData = {};
|
|
67
|
+
|
|
68
|
+
if (response.result) {
|
|
69
|
+
reportData = response.result[0];
|
|
70
|
+
} else {
|
|
71
|
+
if (response[0]) {
|
|
72
|
+
reportData = response[0];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (reportData.length > 0) {
|
|
76
|
+
setResult(reportData);
|
|
77
|
+
} else {
|
|
78
|
+
// handleHide();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
setLoading(false);
|
|
82
|
+
// })
|
|
83
|
+
} catch (error) {
|
|
84
|
+
setResult({ error: 'Error' });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Parses `other_details` from the record and applies styles.
|
|
90
|
+
* If `other_details` exists, it is parsed as JSON; otherwise, an empty object is used.
|
|
91
|
+
*
|
|
92
|
+
* @type {Object}
|
|
93
|
+
*/
|
|
94
|
+
let styles = {};
|
|
95
|
+
|
|
96
|
+
if (record.other_details) {
|
|
97
|
+
styles = JSON.parse(record.other_details);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Opens a pop-up modal and passes the record to the callback function.
|
|
102
|
+
*
|
|
103
|
+
* @param {Object} record - The record data to be passed.
|
|
104
|
+
* @returns {void} This function does not return anything.
|
|
105
|
+
*/
|
|
106
|
+
|
|
107
|
+
function viewPopQueryModal(record) {
|
|
108
|
+
let otherDetails;
|
|
109
|
+
|
|
110
|
+
if (record.other_details) {
|
|
111
|
+
otherDetails = JSON.parse(record.other_details);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (otherDetails?.script_id) {
|
|
115
|
+
//If viewMode = 'modal' → open modal
|
|
116
|
+
if (otherDetails?.viewMode === 'modal') {
|
|
117
|
+
setVisible(true);
|
|
118
|
+
//If viewMode = 'drawer' → open drawer
|
|
119
|
+
} else if (otherDetails?.viewMode === 'drawer') {
|
|
120
|
+
setShowDrawer(true);
|
|
121
|
+
// callback(record, scope)
|
|
122
|
+
} else {
|
|
123
|
+
//Otherwise → fallback callback
|
|
124
|
+
callback(record);
|
|
125
|
+
}
|
|
126
|
+
//No script_id but has viewMode → set popquery
|
|
127
|
+
} else if (otherDetails?.viewMode) {
|
|
128
|
+
// No script_id but has viewMode
|
|
129
|
+
setPopquery(true);
|
|
130
|
+
} else {
|
|
131
|
+
// Default
|
|
132
|
+
callback(record);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
setOtherDetails(otherDetails);
|
|
136
|
+
onSelect();
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
*
|
|
141
|
+
*/
|
|
142
|
+
// function executePopQuery() { }
|
|
143
|
+
|
|
144
|
+
var props = {};
|
|
145
|
+
/**
|
|
146
|
+
* Stores component properties, including the loading state.
|
|
147
|
+
*
|
|
148
|
+
* @type {Object}
|
|
149
|
+
*/
|
|
150
|
+
|
|
151
|
+
if (loading) {
|
|
152
|
+
props.loading = true;
|
|
153
|
+
}
|
|
154
|
+
function onCancel() {
|
|
155
|
+
setVisible(false);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Convert nested style objects into a valid CSS string.
|
|
160
|
+
* @param {*} parentClass
|
|
161
|
+
* @param {*} nestedStyles
|
|
162
|
+
* @returns
|
|
163
|
+
*/
|
|
164
|
+
const convertNestedStylesToCSS = (parentClass, nestedStyles) => {
|
|
165
|
+
let css = '';
|
|
166
|
+
// Iterate through each child selector and its corresponding style object
|
|
167
|
+
for (const [childSelector, styleObj] of Object.entries(nestedStyles)) {
|
|
168
|
+
if (typeof styleObj !== 'object') continue;
|
|
169
|
+
|
|
170
|
+
const fullSelector = `${parentClass} ${childSelector}`;
|
|
171
|
+
const rules = Object.entries(styleObj)
|
|
172
|
+
.map(([key, value]) => `${key.replace(/([A-Z])/g, '-$1').toLowerCase()}:${value};`)
|
|
173
|
+
.join(' ');
|
|
174
|
+
css += `${fullSelector} { ${rules} }\n`;
|
|
175
|
+
}
|
|
176
|
+
// Append the formatted CSS block
|
|
177
|
+
return css;
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* defaultStyles for the cards
|
|
182
|
+
*/
|
|
183
|
+
const defaultStyles = {
|
|
184
|
+
'.menu-dashboard-card': {
|
|
185
|
+
'.text-section': {
|
|
186
|
+
fontSize: '13px',
|
|
187
|
+
textAlign: 'justify',
|
|
188
|
+
},
|
|
189
|
+
'.table-section': {
|
|
190
|
+
width: '100%',
|
|
191
|
+
},
|
|
192
|
+
height: '11px',
|
|
193
|
+
// minWidth: '130px',
|
|
194
|
+
padding: '17px 7px',
|
|
195
|
+
fontSize: '10px',
|
|
196
|
+
display: 'flex',
|
|
197
|
+
alignItems: 'center',
|
|
198
|
+
justifyContent: 'center',
|
|
199
|
+
// margin: '10px',
|
|
200
|
+
cursor: 'pointer',
|
|
201
|
+
borderRadius:'30px',
|
|
202
|
+
boxShadow: "0 0.5px 0.5px rgba(0,0,0,0.08)",
|
|
203
|
+
|
|
204
|
+
'&.selected': {
|
|
205
|
+
border: '2px solid #b1ceeb',
|
|
206
|
+
},
|
|
207
|
+
|
|
208
|
+
'.statistic-card-container': {
|
|
209
|
+
'.ant-statistic-title': {
|
|
210
|
+
color: 'rgba(0, 0, 0, 0.85)',
|
|
211
|
+
fontSize: '10px',
|
|
212
|
+
marginBottom: '0px',
|
|
213
|
+
},
|
|
214
|
+
'.ant-statistic-content': {
|
|
215
|
+
color: 'rgba(0, 0, 0, 0.85)',
|
|
216
|
+
fontSize: '10px',
|
|
217
|
+
display: 'flex',
|
|
218
|
+
justifyContent: 'center',
|
|
219
|
+
},
|
|
220
|
+
'.ant-statistic':{
|
|
221
|
+
display: 'flex',
|
|
222
|
+
justifyContent: 'space-between',
|
|
223
|
+
alignItems: 'center',
|
|
224
|
+
gap:'5px'
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
// Extract nested styles for the ".statistic-card-container"
|
|
230
|
+
// from the deeply nested style object (if available).
|
|
231
|
+
const nestedStyles = styles?.style?.['.menu-dashboard']?.['.menu-dashboard-card']?.['.statistic-card-container'];
|
|
232
|
+
|
|
233
|
+
// Generate the dynamic CSS string using convertNestedStylesToCSS.
|
|
234
|
+
// 1. Base selector: ".statistic-card-container"
|
|
235
|
+
// 2. Styles: Use `nestedStyles` if available,
|
|
236
|
+
// otherwise fall back to default styles from `defaultStyles`.
|
|
237
|
+
const dynamicCSS = convertNestedStylesToCSS(
|
|
238
|
+
'.statistic-card-container',
|
|
239
|
+
nestedStyles || defaultStyles['.menu-dashboard-card']?.['.statistic-card-container'] || {}
|
|
240
|
+
);
|
|
241
|
+
/**
|
|
242
|
+
* Renders different dashboard tiles based on the `tiletypeptr` of the record.
|
|
243
|
+
*
|
|
244
|
+
* @param {Object} record - The record containing the tile information and tile type.
|
|
245
|
+
* @returns {JSX.Element | string} The rendered dashboard tile component or an empty string.
|
|
246
|
+
*/
|
|
247
|
+
let span = 24;
|
|
248
|
+
function displayDashboardTile(record) {
|
|
249
|
+
switch (record.tiletypeptr) {
|
|
250
|
+
case 'BASIC': {
|
|
251
|
+
if (homePage) {
|
|
252
|
+
|
|
253
|
+
return (
|
|
254
|
+
<div className={`menu-dashboard-card card ${isSelected ? 'selected' : ''}`} onClick={() => viewPopQueryModal(record)} style={{padding:"14px 20px",width:"320px",border: "1px solid rgb(239 ,230 ,230)" ,boxShadow: "0 0.5px 0.5px rgba(0,0,0,0.08)"}}>
|
|
255
|
+
<Title
|
|
256
|
+
// Apply styles for the ".text-section"
|
|
257
|
+
// Priority: use custom styles from `styles` if provided,
|
|
258
|
+
// otherwise fallback to default styles
|
|
259
|
+
style={
|
|
260
|
+
styles?.style?.['.menu-dashboard']?.['.menu-dashboard-card']?.['.text-section'] ||
|
|
261
|
+
defaultStyles['.menu-dashboard-card']?.['.text-section']
|
|
262
|
+
}
|
|
263
|
+
>
|
|
264
|
+
{record.text}
|
|
265
|
+
</Title>
|
|
266
|
+
{/* <StatisticCard result={result[0]} {...props} /> */}
|
|
267
|
+
{/* for home dashboard */}
|
|
268
|
+
<DashboardStatisticCard result={result[0]} {...props} />
|
|
269
|
+
</div>
|
|
270
|
+
);
|
|
271
|
+
} else {
|
|
272
|
+
return (
|
|
273
|
+
<div
|
|
274
|
+
// Inline style merging:
|
|
275
|
+
// 1. Base styles → from `styles` object if available, otherwise from `defaultStyles`
|
|
276
|
+
// 2. If the card is selected → merge "&.selected" styles (custom or default)
|
|
277
|
+
className={`menu-dashboard-card card ${isSelected ? 'selected' : ''}`}
|
|
278
|
+
onClick={() => viewPopQueryModal(record)}
|
|
279
|
+
style={{
|
|
280
|
+
...(styles?.style?.['.menu-dashboard']?.['.menu-dashboard-card'] || defaultStyles['.menu-dashboard-card']),
|
|
281
|
+
...(isSelected
|
|
282
|
+
? styles?.style?.['.menu-dashboard']?.['.menu-dashboard-card']?.['&.selected'] ||
|
|
283
|
+
defaultStyles['.menu-dashboard-card']?.['&.selected'] ||
|
|
284
|
+
{}
|
|
285
|
+
: {}),
|
|
286
|
+
}}
|
|
287
|
+
>
|
|
288
|
+
{dynamicCSS && <style dangerouslySetInnerHTML={{ __html: dynamicCSS }} />}
|
|
289
|
+
<div className="statistic-card-container selected">
|
|
290
|
+
<StatisticCard result={result[0]} {...props} />
|
|
291
|
+
</div>
|
|
292
|
+
</div>
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
case 'TABLE':
|
|
297
|
+
return (
|
|
298
|
+
// Apply styles for the ".table-section"
|
|
299
|
+
// Priority: use custom styles from `styles` if present,
|
|
300
|
+
// otherwise fall back to default styles
|
|
301
|
+
<div style={styles?.style?.['.menu-dashboard']?.['.table-section'] || defaultStyles['.menu-dashboard-card']?.['.table-section']}>
|
|
302
|
+
<Title
|
|
303
|
+
// Apply styles for the ".text-section"
|
|
304
|
+
// Priority: use custom styles from `styles` if provided,
|
|
305
|
+
// otherwise fallback to default styles
|
|
306
|
+
style={
|
|
307
|
+
styles?.style?.['.menu-dashboard']?.['.menu-dashboard-card']?.['.text-section'] ||
|
|
308
|
+
defaultStyles['.menu-dashboard-card']?.['.text-section']
|
|
309
|
+
}
|
|
310
|
+
>
|
|
311
|
+
{record.text}
|
|
312
|
+
</Title>
|
|
313
|
+
<BasicTable styles={styles} result={result} {...props} />
|
|
314
|
+
{styles?.action ? (
|
|
315
|
+
<span
|
|
316
|
+
style={{ display: 'flex', justifyContent: 'flex-end', cursor: 'pointer', fontWeight: 'bold', fontSize: '16px' }}
|
|
317
|
+
className="link"
|
|
318
|
+
onClick={() => viewPopQueryModal(record)}
|
|
319
|
+
>
|
|
320
|
+
View
|
|
321
|
+
</span>
|
|
322
|
+
) : null}
|
|
323
|
+
</div>
|
|
324
|
+
);
|
|
325
|
+
|
|
326
|
+
case 'LINEGPH':
|
|
327
|
+
return null;
|
|
328
|
+
// return <BarGraph data={result} {...props} />;
|
|
329
|
+
|
|
330
|
+
default:
|
|
331
|
+
return '';
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function onClose() {
|
|
336
|
+
setShowDrawer(false);
|
|
337
|
+
}
|
|
338
|
+
function onCancelPopQuery() {
|
|
339
|
+
setPopquery(false);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
return (
|
|
343
|
+
<>
|
|
344
|
+
{loading ? (
|
|
345
|
+
// <Skeleton />
|
|
346
|
+
<Skeleton
|
|
347
|
+
active
|
|
348
|
+
title={false}
|
|
349
|
+
paragraph={{ rows: 1, width: ['80%', '50%'] }}
|
|
350
|
+
style={{ width: 100, padding: 20 }}
|
|
351
|
+
/>
|
|
352
|
+
) : (
|
|
353
|
+
<>
|
|
354
|
+
{result.length > 0 ? (
|
|
355
|
+
<>
|
|
356
|
+
{/* <div className='text-section'> */}
|
|
357
|
+
|
|
358
|
+
{/* </div> */}
|
|
359
|
+
|
|
360
|
+
<div>
|
|
361
|
+
<div className="text-section">
|
|
362
|
+
{/* <Title
|
|
363
|
+
// Apply styles for the ".text-section"
|
|
364
|
+
// Priority: use custom styles from `styles` if provided,
|
|
365
|
+
// otherwise fallback to default styles
|
|
366
|
+
style={
|
|
367
|
+
styles?.style?.['.menu-dashboard']?.['.menu-dashboard-card']?.['.text-section'] ||
|
|
368
|
+
defaultStyles['.menu-dashboard-card']?.['.text-section']
|
|
369
|
+
}
|
|
370
|
+
>
|
|
371
|
+
{record.text}
|
|
372
|
+
</Title> */}
|
|
373
|
+
</div>
|
|
374
|
+
<div>
|
|
375
|
+
{result.error ? (
|
|
376
|
+
<>
|
|
377
|
+
<Alert message="Error loading values" type="error" showIcon />
|
|
378
|
+
</>
|
|
379
|
+
) : (
|
|
380
|
+
// <>{loading ? <Skeleton /> : {(result.length ?displayDashboardTile(record)}:null)}</>
|
|
381
|
+
<> {loading ? <Skeleton /> : result.length ? displayDashboardTile(record) : null}</>
|
|
382
|
+
)}
|
|
383
|
+
</div>
|
|
384
|
+
</div>
|
|
385
|
+
</>
|
|
386
|
+
) : null}
|
|
387
|
+
</>
|
|
388
|
+
)}
|
|
389
|
+
{/* Render reporting dashboard inside the modal */}
|
|
390
|
+
<Modal
|
|
391
|
+
width="80%"
|
|
392
|
+
destroyOnClose={true}
|
|
393
|
+
visible={visible}
|
|
394
|
+
title={record.text}
|
|
395
|
+
footer={null}
|
|
396
|
+
okText="Create"
|
|
397
|
+
cancelText="Cancel"
|
|
398
|
+
onCancel={onCancel}
|
|
399
|
+
onOk={() => {}}
|
|
400
|
+
>
|
|
401
|
+
<ReportingDashboard reportId={otherDetails.script_id}></ReportingDashboard>
|
|
402
|
+
</Modal>
|
|
403
|
+
{/** end */}
|
|
404
|
+
{/* Render the PopQueryDashboard inside the modal */}
|
|
405
|
+
<Modal
|
|
406
|
+
width="80%"
|
|
407
|
+
destroyOnClose={true}
|
|
408
|
+
visible={popquery}
|
|
409
|
+
title={record.text}
|
|
410
|
+
footer={null}
|
|
411
|
+
okText="Create"
|
|
412
|
+
cancelText="Cancel"
|
|
413
|
+
onCancel={onCancelPopQuery}
|
|
414
|
+
onOk={() => {}}
|
|
415
|
+
>
|
|
416
|
+
<PopQueryDashboard record={record} id={record.id} />
|
|
417
|
+
</Modal>
|
|
418
|
+
{/** end */}
|
|
419
|
+
<>
|
|
420
|
+
{/* Inside the drawer, render ReportingDashboard
|
|
421
|
+
Passing `reportId` and `scope` as props */}
|
|
422
|
+
{showDrawer ? (
|
|
423
|
+
<Drawer width={'85%'} title={otherDetails?.groupcaption} onClose={onClose} open={showDrawer}>
|
|
424
|
+
<ReportingDashboard reportId={otherDetails.script_id} scope={scope}></ReportingDashboard>
|
|
425
|
+
</Drawer>
|
|
426
|
+
) : null}
|
|
427
|
+
</>
|
|
428
|
+
</>
|
|
429
|
+
);
|
|
430
|
+
}
|