diff --git a/app/Http/Controllers/DashboardsController.php b/app/Http/Controllers/DashboardsController.php index 98862e5ae..09767a8bd 100644 --- a/app/Http/Controllers/DashboardsController.php +++ b/app/Http/Controllers/DashboardsController.php @@ -18,12 +18,12 @@ class DashboardsController extends Controller * This controller action would have been for a Vue/SPA dashboards layout. * This is parked for a future release */ -// public function index() { -// Inertia::setRootView('layouts.inertia'); -// return Inertia::render('Dashboards/Index', [ -// 'dashboard_default_layout' => config('dashboard.default_layout') -// ]); -// } + public function v2() { + Inertia::setRootView('layouts.inertia'); + return Inertia::render('Dashboards/Index', [ + 'dashboard_default_layout' => config('dashboard.default_layout') + ]); + } /** * This controller action returns an experimental blade component based dashboard. diff --git a/config/_munkireport.php b/config/_munkireport.php index 82732eceb..a7bcc176d 100644 --- a/config/_munkireport.php +++ b/config/_munkireport.php @@ -472,5 +472,7 @@ function (){ 'business_units_v2' => env('ALPHA_FEATURE_BUSINESS_UNITS_V2', False), // Enable Flexible Query (GraphQL) 'flexible_query' => env('ALPHA_FEATURE_FLEXIBLE_QUERY', false), + // Enable Vue Dashboards + 'vue_dashboards' => env('ALPHA_FEATURE_VUE_DASHBOARDS', false), ] ]; diff --git a/package-lock.json b/package-lock.json index 8d2da3c9c..34beaea1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "dependencies": { "@codemirror/lang-sql": "^6.5.5", "@codemirror/theme-one-dark": "^6.1.2", + "@derpierre65/vue3-dragable-grid-layout": "^1.9.7", "@fortawesome/fontawesome-svg-core": "^6.4.0", "@fortawesome/free-brands-svg-icons": "^5.15.4", "@fortawesome/free-regular-svg-icons": "^5.15.4", @@ -1265,6 +1266,29 @@ "w3c-keyname": "^2.2.4" } }, + "node_modules/@derpierre65/vue3-dragable-grid-layout": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@derpierre65/vue3-dragable-grid-layout/-/vue3-dragable-grid-layout-1.9.7.tgz", + "integrity": "sha512-SvBiBJgKkbKTw4tZpuot2/R191x4dQOszkv7UQctv8vzD00PbcnMQuZ8bEW0MuHl0QAfBpeJL02zH/nx0W/30w==", + "dependencies": { + "@interactjs/actions": "^1.10.17", + "@interactjs/auto-start": "^1.10.17", + "@interactjs/dev-tools": "^1.10.17", + "@interactjs/interactjs": "^1.10.17", + "@interactjs/modifiers": "^1.10.17", + "@types/element-resize-detector": "^1.1.3", + "element-resize-detector": "^1.2.4", + "mitt": "^3.0.0", + "vue": "^3.2.0" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/poltoratchi1?country.x=MD&locale.x=en_US" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, "node_modules/@esbuild/android-arm": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", @@ -2873,6 +2897,173 @@ "vue": "^3.0.0" } }, + "node_modules/@interactjs/actions": { + "version": "1.10.26", + "resolved": "https://registry.npmjs.org/@interactjs/actions/-/actions-1.10.26.tgz", + "integrity": "sha512-MiZVpNmvNVziK2LuPUFLojGhRcH3zVWyyCqT5RFhVGSNmYBPWzhpLa387D56oGZkglUJ9VQJKilLhPzLL4jSSw==", + "optionalDependencies": { + "@interactjs/interact": "1.10.26" + }, + "peerDependencies": { + "@interactjs/core": "1.10.26", + "@interactjs/utils": "1.10.26" + } + }, + "node_modules/@interactjs/auto-scroll": { + "version": "1.10.26", + "resolved": "https://registry.npmjs.org/@interactjs/auto-scroll/-/auto-scroll-1.10.26.tgz", + "integrity": "sha512-oNDJ2uMk2dBUOajuoJkjQGQOaNCN2oUxGfwyv6YnjPWTpoQtmZ9GP+Ywr4LWQ5z8VMyctzl4u7c3gTMwU4d7/w==", + "optionalDependencies": { + "@interactjs/interact": "1.10.26" + }, + "peerDependencies": { + "@interactjs/utils": "1.10.26" + } + }, + "node_modules/@interactjs/auto-start": { + "version": "1.10.26", + "resolved": "https://registry.npmjs.org/@interactjs/auto-start/-/auto-start-1.10.26.tgz", + "integrity": "sha512-CnYH3quBJuHR8IuDW258npf18tnI3Ornk4bVBi6o42jGf54X5FIb4Uu+H2mAFQm8xH81lTqa59CHb+m8KcouYg==", + "optionalDependencies": { + "@interactjs/interact": "1.10.26" + }, + "peerDependencies": { + "@interactjs/core": "1.10.26", + "@interactjs/utils": "1.10.26" + } + }, + "node_modules/@interactjs/core": { + "version": "1.10.26", + "resolved": "https://registry.npmjs.org/@interactjs/core/-/core-1.10.26.tgz", + "integrity": "sha512-UcxCkUlf2iqhqCKvGo+YGAat19OPYIlKGlyDmxLU3reyVHDvv8+FSckX4/sfQakz4yyMpUh+r8Ali9rFH9Rt9w==", + "peerDependencies": { + "@interactjs/utils": "1.10.26" + } + }, + "node_modules/@interactjs/dev-tools": { + "version": "1.10.26", + "resolved": "https://registry.npmjs.org/@interactjs/dev-tools/-/dev-tools-1.10.26.tgz", + "integrity": "sha512-bg0uvk+9cDNjksLKoFHjQmWJNnAnJPs++OqMqWE1KgSShhfNpna3Vyfcx7rMkcspirY7MYH5mdpokLyzCsvMzw==", + "optionalDependencies": { + "@interactjs/interact": "1.10.26", + "vue": "3" + }, + "peerDependencies": { + "@interactjs/modifiers": "1.10.26", + "@interactjs/utils": "1.10.26" + } + }, + "node_modules/@interactjs/inertia": { + "version": "1.10.26", + "resolved": "https://registry.npmjs.org/@interactjs/inertia/-/inertia-1.10.26.tgz", + "integrity": "sha512-W7nBCPavFNAT6iVJBAqWZPmOT4qAersceqAsjc5L8nb9AnO+IllZrNRS9EF3cnIhkg+HxdoVnAGegYl1CS3Rjg==", + "dependencies": { + "@interactjs/offset": "1.10.26" + }, + "optionalDependencies": { + "@interactjs/interact": "1.10.26" + }, + "peerDependencies": { + "@interactjs/core": "1.10.26", + "@interactjs/modifiers": "1.10.26", + "@interactjs/utils": "1.10.26" + } + }, + "node_modules/@interactjs/interact": { + "version": "1.10.26", + "resolved": "https://registry.npmjs.org/@interactjs/interact/-/interact-1.10.26.tgz", + "integrity": "sha512-thxSJDxLV8s2Nn7i0HWjW5V6dFE/Qv2AgtNkH+QV3PdAb0AtOZpidCiKS4ni/TMen+skoalirMIxnUo9yXPVvg==", + "dependencies": { + "@interactjs/core": "1.10.26", + "@interactjs/utils": "1.10.26" + } + }, + "node_modules/@interactjs/interactjs": { + "version": "1.10.26", + "resolved": "https://registry.npmjs.org/@interactjs/interactjs/-/interactjs-1.10.26.tgz", + "integrity": "sha512-Ta75sQy84yaSHzLBdXAbc2PvWEJ/9jy1YNpgrlsTuCfI3+g5Ixd2jrqPhT7K7iIaClWV/Wx2ejCH+dM0vqQwSQ==", + "dependencies": { + "@interactjs/actions": "1.10.26", + "@interactjs/auto-scroll": "1.10.26", + "@interactjs/auto-start": "1.10.26", + "@interactjs/core": "1.10.26", + "@interactjs/dev-tools": "1.10.26", + "@interactjs/inertia": "1.10.26", + "@interactjs/interact": "1.10.26", + "@interactjs/modifiers": "1.10.26", + "@interactjs/offset": "1.10.26", + "@interactjs/pointer-events": "1.10.26", + "@interactjs/reflow": "1.10.26", + "@interactjs/utils": "1.10.26" + } + }, + "node_modules/@interactjs/modifiers": { + "version": "1.10.26", + "resolved": "https://registry.npmjs.org/@interactjs/modifiers/-/modifiers-1.10.26.tgz", + "integrity": "sha512-Y7V7Qw9kD0KrBRKzpd7h1U2IDlL/J7aN2B4HzPS/JzH+mjTgzcGY2RPpGJZeX3ld5HWlfGKTgT0+1L/SBlCXbA==", + "dependencies": { + "@interactjs/snappers": "1.10.26" + }, + "optionalDependencies": { + "@interactjs/interact": "1.10.26" + }, + "peerDependencies": { + "@interactjs/core": "1.10.26", + "@interactjs/utils": "1.10.26" + } + }, + "node_modules/@interactjs/offset": { + "version": "1.10.26", + "resolved": "https://registry.npmjs.org/@interactjs/offset/-/offset-1.10.26.tgz", + "integrity": "sha512-7dSCldNhkfr23ytZU7VWb3RPb1sKaIP07v0XbMun6Z0CnpruoHfvc8DXJulixRB2EZqFpm0xY8E4CGaO/QwwDQ==", + "optionalDependencies": { + "@interactjs/interact": "1.10.26" + }, + "peerDependencies": { + "@interactjs/core": "1.10.26", + "@interactjs/utils": "1.10.26" + } + }, + "node_modules/@interactjs/pointer-events": { + "version": "1.10.26", + "resolved": "https://registry.npmjs.org/@interactjs/pointer-events/-/pointer-events-1.10.26.tgz", + "integrity": "sha512-vEvnq5qay4rtNLqMYlDXL3wFLcTas30dQzBbmy/f/IA0uIDBzYJAof/cpee+5HRc5/X4+M46pUdWUj2iz+HZrA==", + "optionalDependencies": { + "@interactjs/interact": "1.10.26" + }, + "peerDependencies": { + "@interactjs/core": "1.10.26", + "@interactjs/utils": "1.10.26" + } + }, + "node_modules/@interactjs/reflow": { + "version": "1.10.26", + "resolved": "https://registry.npmjs.org/@interactjs/reflow/-/reflow-1.10.26.tgz", + "integrity": "sha512-9mOqW1p255Bgc1ocbXYdyLTDCgc3vHZpeDbnvbdyrUYQdHTvVKsy6/FrcAICEbZ0qgjjN5qstiB1S5i+MmxW7Q==", + "optionalDependencies": { + "@interactjs/interact": "1.10.26" + }, + "peerDependencies": { + "@interactjs/core": "1.10.26", + "@interactjs/utils": "1.10.26" + } + }, + "node_modules/@interactjs/snappers": { + "version": "1.10.26", + "resolved": "https://registry.npmjs.org/@interactjs/snappers/-/snappers-1.10.26.tgz", + "integrity": "sha512-WSNQLsaprLjShqmPBcz51SX+OOoYv9gYnE4M7HfakxTl2kSd5ae4d/HkM9n41J8IcCCEOBn2l49AO00qyRmnqw==", + "optionalDependencies": { + "@interactjs/interact": "1.10.26" + }, + "peerDependencies": { + "@interactjs/utils": "1.10.26" + } + }, + "node_modules/@interactjs/utils": { + "version": "1.10.26", + "resolved": "https://registry.npmjs.org/@interactjs/utils/-/utils-1.10.26.tgz", + "integrity": "sha512-tTmHsvQrLY4KDXyXqU5Y68Z2a3IzPD1WF87x+3ike1/Tu8dHb9Ea2gN1LBTbtSj7Nv3U/vA39opgrHBFha1DGA==" + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -3358,6 +3549,11 @@ "@popperjs/core": "^2.9.2" } }, + "node_modules/@types/element-resize-detector": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@types/element-resize-detector/-/element-resize-detector-1.1.6.tgz", + "integrity": "sha512-hj0o+gfpKB3XFdMwPBxyMxKkpUpjxI2CctMeaC7gelAsnRfqluiynlM5BOCxv27HnndVWh+utrXlqo1PLyW2Sg==" + }, "node_modules/@types/fs-extra": { "version": "8.1.5", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", @@ -4254,6 +4450,11 @@ } ] }, + "node_modules/batch-processor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/batch-processor/-/batch-processor-1.0.0.tgz", + "integrity": "sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA==" + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -5233,6 +5434,14 @@ "integrity": "sha512-W1+g9qs9hviII0HAwOdehGYkr+zt7KKdmCcJcjH0mYg6oL8+ioT3Skjmt7BLoAQqXhjf40AXd+HlR4oAWMlXjA==", "dev": true }, + "node_modules/element-resize-detector": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.2.4.tgz", + "integrity": "sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==", + "dependencies": { + "batch-processor": "1.0.0" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7064,6 +7273,11 @@ "node": "*" } }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + }, "node_modules/moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", diff --git a/package.json b/package.json index 8cab1a3c2..09e860d1a 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "dependencies": { "@codemirror/lang-sql": "^6.5.5", "@codemirror/theme-one-dark": "^6.1.2", + "@derpierre65/vue3-dragable-grid-layout": "^1.9.7", "@fortawesome/fontawesome-svg-core": "^6.4.0", "@fortawesome/free-brands-svg-icons": "^5.15.4", "@fortawesome/free-regular-svg-icons": "^5.15.4", diff --git a/public/assets/js/clients/client_detail.js b/public/assets/js/clients/client_detail.js index b09d2b401..76f604413 100644 --- a/public/assets/js/clients/client_detail.js +++ b/public/assets/js/clients/client_detail.js @@ -58,12 +58,6 @@ $(document).on('appReady', function(e, lang) { // -------------------------------- end datatables - // Set table classes - $('table').addClass('table table-condensed table-striped'); - - // Set h4 classes on headings - $('#summary h4').addClass('alert alert-info'); - // Get client data $.getJSON( appUrl + '/clients/get_data/' + serialNumber, function( data ) { diff --git a/resources/_vue/components/Widget.vue b/resources/_vue/components/Widget.vue deleted file mode 100644 index bb83ce182..000000000 --- a/resources/_vue/components/Widget.vue +++ /dev/null @@ -1,60 +0,0 @@ - - - - - diff --git a/resources/_vue/components/widgets/DiskReportWidget.vue b/resources/_vue/components/widgets/DiskReportWidget.vue deleted file mode 100644 index c41dada52..000000000 --- a/resources/_vue/components/widgets/DiskReportWidget.vue +++ /dev/null @@ -1,66 +0,0 @@ - - - - - diff --git a/resources/_vue/components/widgets/EventsWidget.vue b/resources/_vue/components/widgets/EventsWidget.vue deleted file mode 100644 index 84c7ca8fb..000000000 --- a/resources/_vue/components/widgets/EventsWidget.vue +++ /dev/null @@ -1,122 +0,0 @@ - - - - - diff --git a/resources/_vue/components/widgets/ScrollBoxWidget.vue b/resources/_vue/components/widgets/ScrollBoxWidget.vue deleted file mode 100644 index 8326fe391..000000000 --- a/resources/_vue/components/widgets/ScrollBoxWidget.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - - - diff --git a/resources/_vue/i18n.js b/resources/_vue/i18n.js deleted file mode 100644 index efa205e7c..000000000 --- a/resources/_vue/i18n.js +++ /dev/null @@ -1,60 +0,0 @@ -import { nextTick } from 'vue' -import { createI18n } from 'vue-i18n' -// import i18next from 'i18next'; -// import Fetch from 'i18next-fetch-backend'; - -export const SUPPORT_LOCALES = ['en', 'de', 'fr'] - -export function setupI18n(options = { locale: 'en', fallbackLocale: 'en' }) { - const i18n = createI18n(options) - setI18nLanguage(i18n, options.locale) - return i18n -} - -export function setI18nLanguage(i18n, locale) { - if (i18n.mode === 'legacy') { - i18n.global.locale = locale - } else { - i18n.global.locale.value = locale - } - /** - * NOTE: - * If you need to specify the language setting for headers, such as the `fetch` API, set it here. - * The following is an example for axios. - * - * axios.defaults.headers.common['Accept-Language'] = locale - */ - document.querySelector('html').setAttribute('lang', locale) -} - - -export async function loadLocaleMessages(i18n, locale, ns) { - // load locale messages with dynamic import - const messages = await import( - /* webpackChunkName: "locale-[request]" */ `../../public/assets/locales/${locale}.json`) - - // set locale and locale message - i18n.global.setLocaleMessage(locale, messages.default) - - return nextTick() -} - -// Not supported by vue-i18n but preserved to indicate correct config -// const I18nOptions = { -// debug: true, // mr.debug -// fallbackLng: 'en', -// ns: ['translation', 'event'], -// backend: { -// loadPath: '/locales/{{lng}}/{{ns}}.json', -// allowMultiLoading: false, -// }, -// interpolation: { -// // To satisfy i18n interpolation used in MunkiReport v5 -// // prefix: '__', -// // suffix: '__', -// } -// }; -// -// i18next -// .use(Fetch) -// .init(I18nOptions); diff --git a/resources/_vue/mixed-app.js b/resources/_vue/mixed-app.js deleted file mode 100644 index d5c15a736..000000000 --- a/resources/_vue/mixed-app.js +++ /dev/null @@ -1,8 +0,0 @@ -/** - * This file provides an entry point for Vue.js components that exist in pages that are almost completely rendered by - * Bootstrap + jQuery. It does not use Vue Router or attach itself to any root-level element. It should be safe to - * include on a bootstrap/jquery page. - */ -const Search = require('./components/Search.vue').default; - -Vue.component('mr-search', Search); diff --git a/resources/_vue/profile.js b/resources/_vue/profile.js deleted file mode 100644 index 145b93491..000000000 --- a/resources/_vue/profile.js +++ /dev/null @@ -1,15 +0,0 @@ -import './bootstrap'; - -import Vue from 'vue'; -window.Vue = Vue; -import * as uiv from 'uiv'; -import Profile from './views/Profile.vue'; - -Vue.use(uiv); - -Vue.component('profile', Profile); - -const page = new Vue({ - el: '#page' -}); - diff --git a/resources/_vue/routes.js b/resources/_vue/routes.js deleted file mode 100644 index 683f98b6a..000000000 --- a/resources/_vue/routes.js +++ /dev/null @@ -1,10 +0,0 @@ -import Dashboard from './views/Dashboard.vue'; -import BusinessUnits from './business-units/BusinessUnits.vue'; - - -export default [ - { path: '/dashboards', component: Dashboard, }, - { path: '/dashboards/:slug', component: Dashboard, }, - { path: '/business-units', component: BusinessUnits, }, - { path: '/business-units/:id', component: BusinessUnits, }, -] diff --git a/resources/_vue/users.js b/resources/_vue/users.js deleted file mode 100644 index de507d07e..000000000 --- a/resources/_vue/users.js +++ /dev/null @@ -1,11 +0,0 @@ -import './bootstrap'; -import * as uiv from 'uiv'; - -Vue.use(uiv); - -Vue.component('users', require('./views/Users.vue').default); - -const page = new Vue({ - el: '#page' -}); - diff --git a/resources/_vue/views/Dashboard.vue b/resources/_vue/views/Dashboard.vue deleted file mode 100644 index 5d12c61fd..000000000 --- a/resources/_vue/views/Dashboard.vue +++ /dev/null @@ -1,61 +0,0 @@ - - - - - diff --git a/resources/js/Components/Dashboard/Widget.vue b/resources/js/Components/Dashboard/Widget.vue new file mode 100644 index 000000000..ec491fbde --- /dev/null +++ b/resources/js/Components/Dashboard/Widget.vue @@ -0,0 +1,50 @@ + + + diff --git a/resources/_vue/components/widgets/ButtonWidget.vue b/resources/js/Components/Dashboard/Widgets/ButtonWidget.vue similarity index 70% rename from resources/_vue/components/widgets/ButtonWidget.vue rename to resources/js/Components/Dashboard/Widgets/ButtonWidget.vue index 7bed79cbe..945a5fac1 100644 --- a/resources/_vue/components/widgets/ButtonWidget.vue +++ b/resources/js/Components/Dashboard/Widgets/ButtonWidget.vue @@ -1,3 +1,25 @@ + + - - - - diff --git a/resources/js/Components/Dashboard/Widgets/DiskReportWidget.vue b/resources/js/Components/Dashboard/Widgets/DiskReportWidget.vue new file mode 100644 index 000000000..78c797628 --- /dev/null +++ b/resources/js/Components/Dashboard/Widgets/DiskReportWidget.vue @@ -0,0 +1,48 @@ + + + diff --git a/resources/js/Components/Dashboard/Widgets/EventsWidget.vue b/resources/js/Components/Dashboard/Widgets/EventsWidget.vue new file mode 100644 index 000000000..6f9fbda14 --- /dev/null +++ b/resources/js/Components/Dashboard/Widgets/EventsWidget.vue @@ -0,0 +1,125 @@ + + + diff --git a/resources/js/Components/Dashboard/Widgets/ScrollBoxWidget.vue b/resources/js/Components/Dashboard/Widgets/ScrollBoxWidget.vue new file mode 100644 index 000000000..3ccee3736 --- /dev/null +++ b/resources/js/Components/Dashboard/Widgets/ScrollBoxWidget.vue @@ -0,0 +1,25 @@ + + + diff --git a/resources/_vue/layouts/demo.js b/resources/js/Components/Dashboard/demo-layout.ts similarity index 81% rename from resources/_vue/layouts/demo.js rename to resources/js/Components/Dashboard/demo-layout.ts index 694cd0992..a39caf6f1 100644 --- a/resources/_vue/layouts/demo.js +++ b/resources/js/Components/Dashboard/demo-layout.ts @@ -9,8 +9,8 @@ const layout = [ - {"x":0,"y":0,"w":4,"h":5,"i":"0","widget":"widget-disk-report"}, - {"x":4,"y":0,"w":8,"h":10,"i":"1","widget":"widget-event-messages"}, + {"x":0,"y":0,"w":4,"h":5,"i":0,"widget":"DiskReportWidget"}, + {"x":4,"y":0,"w":8,"h":10,"i":1,"widget":"EventsWidget"}, ]; export default layout; diff --git a/resources/js/Components/ModelIcon.vue b/resources/js/Components/ModelIcon.vue index d45a63c40..fcae4ce80 100644 --- a/resources/js/Components/ModelIcon.vue +++ b/resources/js/Components/ModelIcon.vue @@ -33,8 +33,17 @@ const formFactor = computed(() => { diff --git a/resources/_vue/components/Spinner.vue b/resources/js/Components/Spinner.vue similarity index 100% rename from resources/_vue/components/Spinner.vue rename to resources/js/Components/Spinner.vue diff --git a/resources/js/Hybrid/Search.vue b/resources/js/Hybrid/Search.vue index 6c36c4449..0d942d8a7 100644 --- a/resources/js/Hybrid/Search.vue +++ b/resources/js/Hybrid/Search.vue @@ -35,40 +35,69 @@ const onReset = (e) => { diff --git a/resources/js/Pages/Dashboards/Index.vue b/resources/js/Pages/Dashboards/Index.vue index c6741bdef..5398f727f 100644 --- a/resources/js/Pages/Dashboards/Index.vue +++ b/resources/js/Pages/Dashboards/Index.vue @@ -1,12 +1,53 @@ diff --git a/resources/views/components/widget/detail/comments.blade.php b/resources/views/components/widget/detail/comments.blade.php index d96f2581f..0e7c3af7d 100644 --- a/resources/views/components/widget/detail/comments.blade.php +++ b/resources/views/components/widget/detail/comments.blade.php @@ -1,7 +1,7 @@
-

+

@isset($icon) @endisset diff --git a/resources/views/components/widget/detail/table-card.blade.php b/resources/views/components/widget/detail/table-card.blade.php new file mode 100644 index 000000000..9341554d8 --- /dev/null +++ b/resources/views/components/widget/detail/table-card.blade.php @@ -0,0 +1,49 @@ +
+
+
+ + @isset($icon) + + @endisset + +
+ +
+ + @isset($table) + @foreach($table as $row) + + + + + @endforeach + @endisset +
+ @isset($row['prepend']) + {!! $row['prepend'] !!} + @endisset + + @isset($row['append']) + {!! $row['append'] !!} + @endisset +
+
+
+
+ +@push('scripts') +@isset($js) + +@endisset +@isset($js_link) + @foreach(is_array($js_link) ? $js_link : [$js_link] as $link) + + @endforeach +@endisset +@endpush diff --git a/resources/views/components/widget/detail/table.blade.php b/resources/views/components/widget/detail/table.blade.php index 302300ff8..8a323f868 100644 --- a/resources/views/components/widget/detail/table.blade.php +++ b/resources/views/components/widget/detail/table.blade.php @@ -1,7 +1,7 @@
-

+

@isset($icon) @endisset @@ -9,7 +9,7 @@ @isset($class)class="{{ $class }}"@endisset >

- +
@isset($table) @foreach($table as $row) diff --git a/routes/web.php b/routes/web.php index df9604858..abf3a6c34 100644 --- a/routes/web.php +++ b/routes/web.php @@ -83,6 +83,12 @@ Route::get('/show/dashboard/default', 'DashboardsController@default'); Route::get('/show/dashboard/{dashboard?}', 'DashboardsController@show'); Route::get('/dashboards/default', 'DashboardsController@default'); + + // Experimental client-side dashboards + if (config('_munkireport.alpha_features.vue_dashboards', false)) { + Route::get('/v6/dashboard', 'DashboardsController@v2'); + } + Route::get('/dashboards/{dashboard?}', 'DashboardsController@show'); Route::get('/show/listing/{module}/{name?}', 'ShowController@listing');