@@ -14,6 +21,8 @@
-
+
+
diff --git a/assets/main.js b/assets/main.js
index 66f228c0..4ee214b4 100644
--- a/assets/main.js
+++ b/assets/main.js
@@ -1,14 +1,19 @@
import Vue from "vue";
import VueRouter from "vue-router";
import Meta from "vue-meta";
-import Vuex from "vuex";
+import { Dropdown, Switch } from "buefy";
import store from "./store";
import App from "./App.vue";
import Container from "./pages/Container.vue";
+import Settings from "./pages/Settings.vue";
import Index from "./pages/Index.vue";
Vue.use(VueRouter);
Vue.use(Meta);
+Vue.use(Dropdown);
+Vue.use(Switch);
+
+Vue.config.ignoredElements = [/^ion-/];
const routes = [
{
@@ -21,6 +26,11 @@ const routes = [
component: Container,
name: "container",
props: true
+ },
+ {
+ path: "/settings",
+ component: Settings,
+ name: "settings"
}
];
diff --git a/assets/pages/Container.vue b/assets/pages/Container.vue
index 44a55d7b..fcf2b91a 100644
--- a/assets/pages/Container.vue
+++ b/assets/pages/Container.vue
@@ -1,20 +1,17 @@
-
+
diff --git a/assets/store/index.js b/assets/store/index.js
index c1e5e38c..c53a3ab2 100644
--- a/assets/store/index.js
+++ b/assets/store/index.js
@@ -1,15 +1,20 @@
import Vue from "vue";
import Vuex from "vuex";
+import storage from "store/dist/store.modern";
+import { DEFAULT_SETTINGS, DOZZLE_SETTINGS_KEY } from "./settings";
+
+Vue.use(Vuex);
const mql = window.matchMedia("(max-width: 770px)");
-Vue.use(Vuex);
+storage.set(DOZZLE_SETTINGS_KEY, { ...DEFAULT_SETTINGS, ...storage.get(DOZZLE_SETTINGS_KEY) });
const state = {
containers: [],
activeContainers: [],
searchFilter: null,
- isMobile: mql.matches
+ isMobile: mql.matches,
+ settings: storage.get(DOZZLE_SETTINGS_KEY)
};
const mutations = {
@@ -27,6 +32,10 @@ const mutations = {
},
SET_MOBILE_WIDTH(state, value) {
state.isMobile = value;
+ },
+ UPDATE_SETTINGS(state, newValues) {
+ state.settings = { ...state.settings, ...newValues };
+ storage.set(DOZZLE_SETTINGS_KEY, state.settings);
}
};
@@ -43,13 +52,15 @@ const actions = {
async FETCH_CONTAINERS({ commit }) {
const containers = await (await fetch(`${BASE_PATH}/api/containers.json`)).json();
commit("SET_CONTAINERS", containers);
+ },
+ UPDATE_SETTING({ commit }, setting) {
+ commit("UPDATE_SETTINGS", setting);
}
};
const getters = {};
const es = new EventSource(`${BASE_PATH}/api/events/stream`);
es.addEventListener("containers-changed", e => setTimeout(() => store.dispatch("FETCH_CONTAINERS"), 1000), false);
-
mql.addListener(e => store.commit("SET_MOBILE_WIDTH", e.matches));
const store = new Vuex.Store({
diff --git a/assets/store/settings.js b/assets/store/settings.js
new file mode 100644
index 00000000..22e6a05c
--- /dev/null
+++ b/assets/store/settings.js
@@ -0,0 +1,6 @@
+export const DOZZLE_SETTINGS_KEY = "DOZZLE_SETTINGS";
+export const DEFAULT_SETTINGS = {
+ search: true,
+ size: "medium",
+ menuWidth: 15
+};
diff --git a/assets/styles.scss b/assets/styles.scss
index c62d2834..ef1f3589 100644
--- a/assets/styles.scss
+++ b/assets/styles.scss
@@ -3,8 +3,11 @@
$menu-item-active-background-color: hsl(171, 100%, 41%);
$menu-item-color: hsl(0, 6%, 87%);
-@import "../node_modules/bulma/bulma.sass";
+@import "~bulma";
@import "../node_modules/splitpanes/dist/splitpanes.css";
+@import "~buefy/src/scss/utils/_all";
+@import "~buefy/src/scss/components/_dropdown";
+@import "~buefy/src/scss/components/_switch";
.is-dark {
color: #ddd;
diff --git a/main.go b/main.go
index ed29a1f8..a0f11c09 100644
--- a/main.go
+++ b/main.go
@@ -150,7 +150,10 @@ func (h *handler) index(w http.ResponseWriter, req *http.Request) {
path = base
}
- data := struct{ Base string }{path}
+ data := struct {
+ Base string
+ Version string
+ }{path, version}
err = tmpl.Execute(w, data)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
diff --git a/package-lock.json b/package-lock.json
index c9390317..ef10657d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -153,6 +153,12 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
}
}
},
@@ -1202,6 +1208,12 @@
"lodash": "^4.17.13",
"to-fast-properties": "^2.0.0"
}
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
}
}
},
@@ -1331,6 +1343,12 @@
"lodash": "^4.17.13",
"to-fast-properties": "^2.0.0"
}
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
}
}
},
@@ -2766,6 +2784,21 @@
"node-int64": "^0.4.0"
}
},
+ "buefy": {
+ "version": "0.8.8",
+ "resolved": "https://registry.npmjs.org/buefy/-/buefy-0.8.8.tgz",
+ "integrity": "sha512-kTUnroPBLm998KFZbeJuUgJV+nJbDUJxw1c8gzeJoe+Mve73Nb3hi6AZpgrIH8FtXmh5r8nMBYBqwN54EtPWXg==",
+ "requires": {
+ "bulma": "0.7.5"
+ },
+ "dependencies": {
+ "bulma": {
+ "version": "0.7.5",
+ "resolved": "https://registry.npmjs.org/bulma/-/bulma-0.7.5.tgz",
+ "integrity": "sha512-cX98TIn0I6sKba/DhW0FBjtaDpxTelU166pf7ICXpCCuplHWyu6C9LYZmL5PEsnePIeJaiorsTEzzNk3Tsm1hw=="
+ }
+ }
+ },
"buffer": {
"version": "4.9.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
@@ -3417,6 +3450,14 @@
"semver": "^5.5.0",
"shebang-command": "^1.2.0",
"which": "^1.2.9"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
}
},
"crypto-browserify": {
@@ -4156,6 +4197,12 @@
"pseudomap": "^1.0.2",
"yallist": "^2.1.2"
}
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
}
}
},
@@ -5585,6 +5632,11 @@
"integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
"dev": true
},
+ "hotkeys-js": {
+ "version": "3.7.3",
+ "resolved": "https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-3.7.3.tgz",
+ "integrity": "sha512-CSaeVPAKEEYNexYR35znMJnCqoofk7oqG/AOOqWow1qDT0Yxy+g+Y8Hs/LhGlsZaSJ7973YN6/N41LAr3t30QQ=="
+ },
"hsl-regex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz",
@@ -5774,6 +5826,14 @@
"resolve": "^1.10.0",
"semver": "2 || 3 || 4 || 5",
"validate-npm-package-license": "^3.0.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
}
},
"parse-json": {
@@ -7783,6 +7843,12 @@
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
"integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
"dev": true
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
}
}
},
@@ -8133,6 +8199,14 @@
"semver": "^5.5.0",
"shellwords": "^0.1.1",
"which": "^1.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
}
},
"node-releases": {
@@ -8178,6 +8252,14 @@
"is-builtin-module": "^1.0.0",
"semver": "2 || 3 || 4 || 5",
"validate-npm-package-license": "^3.0.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
}
},
"normalize-path": {
@@ -8754,6 +8836,12 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ },
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -10130,9 +10218,9 @@
}
},
"sass": {
- "version": "1.23.7",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.23.7.tgz",
- "integrity": "sha512-cYgc0fanwIpi0rXisGxl+/wadVQ/HX3RhpdRcjLdj2o2ye/sxUTpAxIhbmJy3PLQgRFbf6Pn8Jsrta2vdXcoOQ==",
+ "version": "1.24.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.24.0.tgz",
+ "integrity": "sha512-1TsPyMhLTx+9DLlmwg02iBW2p4poGA7LlkWJLpUY/XticFKNhPcx+l4FsIJLKl6oSUfXmAKpVljHEez1hwjqiw==",
"dev": true,
"requires": {
"chokidar": ">=2.0.0 <4.0.0"
@@ -10154,10 +10242,9 @@
}
},
"semver": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
- "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
- "dev": true
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.1.tgz",
+ "integrity": "sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A=="
},
"semver-compare": {
"version": "1.0.0",
@@ -10535,9 +10622,9 @@
}
},
"splitpanes": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/splitpanes/-/splitpanes-2.1.2.tgz",
- "integrity": "sha512-IiVeC1wk7yVq4QZ3VTj6FbOTUJQmy/gFxpR1pDk67P+Pj8V0daUsPeoBNcKmcvJp2v3272GHSeLTNEyDCKRXSQ=="
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/splitpanes/-/splitpanes-2.2.0.tgz",
+ "integrity": "sha512-n87JXR3xNHC6Zrcvg1JGU4wgqOxV95bFShhHhGM/cvQVFxN2HRJuaVWvvwgQzd9cF+4UyXtjcreqkOxr5bPnoA=="
},
"sprintf-js": {
"version": "1.0.3",
diff --git a/package.json b/package.json
index 96f21619..4dace789 100644
--- a/package.json
+++ b/package.json
@@ -25,10 +25,13 @@
"homepage": "https://github.com/amir20/dozzle#readme",
"dependencies": {
"ansi-to-html": "^0.6.13",
+ "buefy": "^0.8.8",
"bulma": "^0.8.0",
"date-fns": "^2.8.1",
+ "hotkeys-js": "^3.7.3",
"lodash.debounce": "^4.0.8",
- "splitpanes": "^2.1.2",
+ "semver": "^7.1.1",
+ "splitpanes": "^2.2.0",
"store": "^2.0.12",
"vue": "^2.6.11",
"vue-meta": "^2.3.1",
@@ -52,7 +55,7 @@
"node-fetch": "^2.6.0",
"parcel-bundler": "^1.12.4",
"prettier": "^1.19.1",
- "sass": "^1.23.7",
+ "sass": "^1.24.0",
"vue-hot-reload-api": "^2.3.4",
"vue-jest": "^3.0.5",
"vue-template-compiler": "^2.6.11"