Added JSDoc for src/components/*

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
This commit is contained in:
Matthew Nickson 2022-06-02 00:32:05 +01:00
parent d939d03690
commit 2b42c3c828
No known key found for this signature in database
GPG key ID: BF229DCFD4748E05
20 changed files with 152 additions and 3 deletions

View file

@ -25,10 +25,12 @@ export default {
CertificateInfoRow, CertificateInfoRow,
}, },
props: { props: {
/** Object representing certificate */
certInfo: { certInfo: {
type: Object, type: Object,
required: true, required: true,
}, },
/** Is the TLS certificate valid? */
valid: { valid: {
type: Boolean, type: Boolean,
required: true, required: true,

View file

@ -56,12 +56,19 @@ export default {
Datetime, Datetime,
}, },
props: { props: {
/** Object representing certificate */
cert: { cert: {
type: Object, type: Object,
required: true, required: true,
}, },
}, },
methods: { methods: {
/**
* Format the subject of the certificate
* @param {Object} subject Object representing the certificates
* subject
* @returns {string}
*/
formatSubject(subject) { formatSubject(subject) {
if (subject.O && subject.CN && subject.C) { if (subject.O && subject.CN && subject.C) {
return `${subject.CN} - ${subject.O} (${subject.C})`; return `${subject.CN} - ${subject.O} (${subject.C})`;

View file

@ -29,14 +29,17 @@ import { Modal } from "bootstrap";
export default { export default {
props: { props: {
/** Style of button */
btnStyle: { btnStyle: {
type: String, type: String,
default: "btn-primary", default: "btn-primary",
}, },
/** Text to use as yes */
yesText: { yesText: {
type: String, type: String,
default: "Yes", // TODO: No idea what to translate this default: "Yes", // TODO: No idea what to translate this
}, },
/** Text to use as no */
noText: { noText: {
type: String, type: String,
default: "No", default: "No",
@ -50,9 +53,13 @@ export default {
this.modal = new Modal(this.$refs.modal); this.modal = new Modal(this.$refs.modal);
}, },
methods: { methods: {
/** Show the confirm dialog */
show() { show() {
this.modal.show(); this.modal.show();
}, },
/**
* @emits string A string that simply says "yes"
*/
yes() { yes() {
this.$emit("yes"); this.$emit("yes");
}, },

View file

@ -25,33 +25,41 @@ let timeout;
export default { export default {
props: { props: {
/** ID of this input */
id: { id: {
type: String, type: String,
default: "" default: ""
}, },
/** Type of input */
type: { type: {
type: String, type: String,
default: "text" default: "text"
}, },
/** The value of the input */
modelValue: { modelValue: {
type: String, type: String,
default: "" default: ""
}, },
/** A placeholder to use */
placeholder: { placeholder: {
type: String, type: String,
default: "" default: ""
}, },
/** Should the field auto complete */
autocomplete: { autocomplete: {
type: String, type: String,
default: undefined, default: undefined,
}, },
/** Is the input required? */
required: { required: {
type: Boolean type: Boolean
}, },
/** Should the input be read only? */
readonly: { readonly: {
type: String, type: String,
default: undefined, default: undefined,
}, },
/** Is the input disabled? */
disabled: { disabled: {
type: String, type: String,
default: undefined, default: undefined,
@ -79,14 +87,21 @@ export default {
}, },
methods: { methods: {
/** Show the input */
showInput() { showInput() {
this.visibility = "text"; this.visibility = "text";
}, },
/** Hide the input */
hideInput() { hideInput() {
this.visibility = "password"; this.visibility = "password";
}, },
/**
* Copy the provided text to the users clipboard
* @param {string} textToCopy
* @returns {Promise<void>}
*/
copyToClipboard(textToCopy) { copyToClipboard(textToCopy) {
this.icon = "check"; this.icon = "check";

View file

@ -10,6 +10,7 @@ import { sleep } from "../util.ts";
export default { export default {
props: { props: {
/** Value to count */
value: { value: {
type: [ String, Number ], type: [ String, Number ],
default: 0, default: 0,
@ -18,6 +19,7 @@ export default {
type: Number, type: Number,
default: 0.3, default: 0.3,
}, },
/** Unit of the value */
unit: { unit: {
type: String, type: String,
default: "ms", default: "ms",
@ -43,9 +45,7 @@ export default {
let frames = 12; let frames = 12;
let step = Math.floor(diff / frames); let step = Math.floor(diff / frames);
if (isNaN(step) || ! this.isNum || (diff > 0 && step < 1) || (diff < 0 && step > 1) || diff === 0) { if (! (isNaN(step) || ! this.isNum || (diff > 0 && step < 1) || (diff < 0 && step > 1) || diff === 0)) {
// Lazy to NOT this condition, hahaha.
} else {
for (let i = 1; i < frames; i++) { for (let i = 1; i < frames; i++) {
this.output += step; this.output += step;
await sleep(15); await sleep(15);

View file

@ -13,10 +13,12 @@ dayjs.extend(relativeTime);
export default { export default {
props: { props: {
/** Value of data time */
value: { value: {
type: String, type: String,
default: null, default: null,
}, },
/** Should only the date be displayed? */
dateOnly: { dateOnly: {
type: Boolean, type: Boolean,
default: false, default: false,

View file

@ -17,14 +17,17 @@
export default { export default {
props: { props: {
/** Size of the heart beat bar */
size: { size: {
type: String, type: String,
default: "big", default: "big",
}, },
/** ID of the monitor */
monitorId: { monitorId: {
type: Number, type: Number,
required: true, required: true,
}, },
/** Array of the monitors heart beats */
heartbeatList: { heartbeatList: {
type: Array, type: Array,
default: null, default: null,
@ -160,12 +163,18 @@ export default {
this.resize(); this.resize();
}, },
methods: { methods: {
/** Resize the heartbeat bar */
resize() { resize() {
if (this.$refs.wrap) { if (this.$refs.wrap) {
this.maxBeat = Math.floor(this.$refs.wrap.clientWidth / (this.beatWidth + this.beatMargin * 2)); this.maxBeat = Math.floor(this.$refs.wrap.clientWidth / (this.beatWidth + this.beatMargin * 2));
} }
}, },
/**
* Get the title of the beat
* @param {Object} beat Beat to get title from
* @returns {string}
*/
getBeatTitle(beat) { getBeatTitle(beat) {
return `${this.$root.datetime(beat.time)}` + ((beat.msg) ? ` - ${beat.msg}` : ""); return `${this.$root.datetime(beat.time)}` + ((beat.msg) ? ` - ${beat.msg}` : "");
}, },

View file

@ -24,25 +24,31 @@
<script> <script>
export default { export default {
props: { props: {
/** The value of the input */
modelValue: { modelValue: {
type: String, type: String,
default: "" default: ""
}, },
/** A placeholder to use */
placeholder: { placeholder: {
type: String, type: String,
default: "" default: ""
}, },
/** Maximum lenght of the input */
maxlength: { maxlength: {
type: Number, type: Number,
default: 255 default: 255
}, },
/** Should the field auto complete */
autocomplete: { autocomplete: {
type: String, type: String,
default: undefined, default: undefined,
}, },
/** Is the input required? */
required: { required: {
type: Boolean type: Boolean
}, },
/** Should the input be read only? */
readonly: { readonly: {
type: String, type: String,
default: undefined, default: undefined,
@ -68,9 +74,11 @@ export default {
}, },
methods: { methods: {
/** Show users input in plain text */
showInput() { showInput() {
this.visibility = "text"; this.visibility = "text";
}, },
/** Censor users input */
hideInput() { hideInput() {
this.visibility = "password"; this.visibility = "password";
}, },

View file

@ -55,6 +55,7 @@ export default {
}; };
}, },
methods: { methods: {
/** Submit the user details and attempt to log in */
submit() { submit() {
this.processing = true; this.processing = true;

View file

@ -58,6 +58,7 @@ export default {
Tag, Tag,
}, },
props: { props: {
/** Should the scrollbar be shown */
scrollbar: { scrollbar: {
type: Boolean, type: Boolean,
}, },
@ -124,6 +125,7 @@ export default {
window.removeEventListener("scroll", this.onScroll); window.removeEventListener("scroll", this.onScroll);
}, },
methods: { methods: {
/** Called when the user scrolls */
onScroll() { onScroll() {
if (window.top.scrollY <= 133) { if (window.top.scrollY <= 133) {
this.windowTop = window.top.scrollY; this.windowTop = window.top.scrollY;
@ -131,9 +133,15 @@ export default {
this.windowTop = 133; this.windowTop = 133;
} }
}, },
/**
* Get URL of monitor
* @param {number} id ID of monitor
* @returns {string} Relative URL of monitor
*/
monitorURL(id) { monitorURL(id) {
return getMonitorRelativeURL(id); return getMonitorRelativeURL(id);
}, },
/** Clear the search bar */
clearSearchText() { clearSearchText() {
this.searchText = ""; this.searchText = "";
} }

View file

@ -125,11 +125,16 @@ export default {
}, },
methods: { methods: {
/** Show dialog to confirm deletion */
deleteConfirm() { deleteConfirm() {
this.modal.hide(); this.modal.hide();
this.$refs.confirmDelete.show(); this.$refs.confirmDelete.show();
}, },
/**
* Show settings for specified notification
* @param {number} notificationID ID of notification to show
*/
show(notificationID) { show(notificationID) {
if (notificationID) { if (notificationID) {
this.id = notificationID; this.id = notificationID;
@ -152,6 +157,7 @@ export default {
this.modal.show(); this.modal.show();
}, },
/** Submit the form to the server */
submit() { submit() {
this.processing = true; this.processing = true;
this.$root.getSocket().emit("addNotification", this.notification, this.id, (res) => { this.$root.getSocket().emit("addNotification", this.notification, this.id, (res) => {
@ -170,6 +176,7 @@ export default {
}); });
}, },
/** Test the notification endpoint */
test() { test() {
this.processing = true; this.processing = true;
this.$root.getSocket().emit("testNotification", this.notification, (res) => { this.$root.getSocket().emit("testNotification", this.notification, (res) => {
@ -178,6 +185,7 @@ export default {
}); });
}, },
/** Delete the notification endpoint */
deleteNotification() { deleteNotification() {
this.processing = true; this.processing = true;
this.$root.getSocket().emit("deleteNotification", this.id, (res) => { this.$root.getSocket().emit("deleteNotification", this.id, (res) => {
@ -190,6 +198,7 @@ export default {
}); });
}, },
/** /**
* Get a unique default name for the notification
* @param {keyof NotificationFormList} notificationKey * @param {keyof NotificationFormList} notificationKey
* @return {string} * @return {string}
*/ */

View file

@ -35,6 +35,7 @@ Chart.register(LineController, BarController, LineElement, PointElement, TimeSca
export default { export default {
components: { LineChart }, components: { LineChart },
props: { props: {
/** ID of monitor */
monitorId: { monitorId: {
type: Number, type: Number,
required: true, required: true,

View file

@ -130,11 +130,16 @@ export default {
}, },
methods: { methods: {
/** Show dialog to confirm delection */
deleteConfirm() { deleteConfirm() {
this.modal.hide(); this.modal.hide();
this.$refs.confirmDelete.show(); this.$refs.confirmDelete.show();
}, },
/**
* Show settings for specified proxy
* @param {number} proxyID ID of proxy to show
*/
show(proxyID) { show(proxyID) {
if (proxyID) { if (proxyID) {
this.id = proxyID; this.id = proxyID;
@ -163,6 +168,7 @@ export default {
this.modal.show(); this.modal.show();
}, },
/** Submit form data for saving */
submit() { submit() {
this.processing = true; this.processing = true;
this.$root.getSocket().emit("addProxy", this.proxy, this.id, (res) => { this.$root.getSocket().emit("addProxy", this.proxy, this.id, (res) => {
@ -180,6 +186,7 @@ export default {
}); });
}, },
/** Delete this proxy */
deleteProxy() { deleteProxy() {
this.processing = true; this.processing = true;
this.$root.getSocket().emit("deleteProxy", this.id, (res) => { this.$root.getSocket().emit("deleteProxy", this.id, (res) => {

View file

@ -72,10 +72,12 @@ export default {
Tag, Tag,
}, },
props: { props: {
/** Are we in edit mode? */
editMode: { editMode: {
type: Boolean, type: Boolean,
required: true, required: true,
}, },
/** Should tags be shown? */
showTags: { showTags: {
type: Boolean, type: Boolean,
} }
@ -94,10 +96,20 @@ export default {
}, },
methods: { methods: {
/**
* Remove the specified group
* @param {number} index Index of group to remove
*/
removeGroup(index) { removeGroup(index) {
this.$root.publicGroupList.splice(index, 1); this.$root.publicGroupList.splice(index, 1);
}, },
/**
* Remove a monitor from a group
* @param {number} groupIndex Index of group to remove monitor
* from
* @param {number} index Index of monitor to remove
*/
removeMonitor(groupIndex, index) { removeMonitor(groupIndex, index) {
this.$root.publicGroupList[groupIndex].monitorList.splice(index, 1); this.$root.publicGroupList[groupIndex].monitorList.splice(index, 1);
}, },

View file

@ -5,6 +5,7 @@
<script> <script>
export default { export default {
props: { props: {
/** Current status of monitor */
status: { status: {
type: Number, type: Number,
default: 0, default: 0,

View file

@ -20,14 +20,20 @@
<script> <script>
export default { export default {
props: { props: {
/** Object representing tag */
item: { item: {
type: Object, type: Object,
required: true, required: true,
}, },
/** Function to remove tag */
remove: { remove: {
type: Function, type: Function,
default: null, default: null,
}, },
/**
* Size of tag
* @values normal, small
*/
size: { size: {
type: String, type: String,
default: "normal", default: "normal",

View file

@ -139,6 +139,7 @@ export default {
VueMultiselect, VueMultiselect,
}, },
props: { props: {
/** Array of tags to be pre-selected */
preSelectedTags: { preSelectedTags: {
type: Array, type: Array,
default: () => [], default: () => [],
@ -241,9 +242,11 @@ export default {
this.getExistingTags(); this.getExistingTags();
}, },
methods: { methods: {
/** Show the add tag dialog */
showAddDialog() { showAddDialog() {
this.modal.show(); this.modal.show();
}, },
/** Get all existing tags */
getExistingTags() { getExistingTags() {
this.$root.getSocket().emit("getTags", (res) => { this.$root.getSocket().emit("getTags", (res) => {
if (res.ok) { if (res.ok) {
@ -253,6 +256,10 @@ export default {
} }
}); });
}, },
/**
* Delete the specified tag
* @param {Object} tag Object representing tag to delete
*/
deleteTag(item) { deleteTag(item) {
if (item.new) { if (item.new) {
// Undo Adding a new Tag // Undo Adding a new Tag
@ -262,6 +269,13 @@ export default {
this.deleteTags.push(item); this.deleteTags.push(item);
} }
}, },
/**
* Set colour of text
* @param {Object} option Object representing color choice. If
* option.color is set, the text color will be white, else it
* be chosen based upon application theme
* @returns string
*/
textColor(option) { textColor(option) {
if (option.color) { if (option.color) {
return "white"; return "white";
@ -269,6 +283,7 @@ export default {
return this.$root.theme === "light" ? "var(--bs-body-color)" : "inherit"; return this.$root.theme === "light" ? "var(--bs-body-color)" : "inherit";
} }
}, },
/** Add a draft tag */
addDraftTag() { addDraftTag() {
console.log("Adding Draft Tag: ", this.newDraftTag); console.log("Adding Draft Tag: ", this.newDraftTag);
if (this.newDraftTag.select != null) { if (this.newDraftTag.select != null) {
@ -296,6 +311,7 @@ export default {
} }
this.clearDraftTag(); this.clearDraftTag();
}, },
/** Remove a draft tag */
clearDraftTag() { clearDraftTag() {
this.newDraftTag = { this.newDraftTag = {
name: null, name: null,
@ -307,26 +323,51 @@ export default {
}; };
this.modal.hide(); this.modal.hide();
}, },
/**
* Add a tag asynchronously
* @param {Object} newTag Object representing new tag to add
* @returns {Promise<void>}
*/
addTagAsync(newTag) { addTagAsync(newTag) {
return new Promise((resolve) => { return new Promise((resolve) => {
this.$root.getSocket().emit("addTag", newTag, resolve); this.$root.getSocket().emit("addTag", newTag, resolve);
}); });
}, },
/**
* Add a tag to a monitor asynchronously
* @param {number} tagId ID of tag to add
* @param {number} monitorId ID of monitor to add tag to
* @param {string} value Value of tag
* @returns {Promise<void>}
*/
addMonitorTagAsync(tagId, monitorId, value) { addMonitorTagAsync(tagId, monitorId, value) {
return new Promise((resolve) => { return new Promise((resolve) => {
this.$root.getSocket().emit("addMonitorTag", tagId, monitorId, value, resolve); this.$root.getSocket().emit("addMonitorTag", tagId, monitorId, value, resolve);
}); });
}, },
/**
* Delete a tag from a monitor asynchronously
* @param {number} tagId ID of tag to remove
* @param {number} monitorId ID of monitor to remove tag from
* @param {string} value Value of tag
* @returns {Promise<void>}
*/
deleteMonitorTagAsync(tagId, monitorId, value) { deleteMonitorTagAsync(tagId, monitorId, value) {
return new Promise((resolve) => { return new Promise((resolve) => {
this.$root.getSocket().emit("deleteMonitorTag", tagId, monitorId, value, resolve); this.$root.getSocket().emit("deleteMonitorTag", tagId, monitorId, value, resolve);
}); });
}, },
/** Called as user types input */
onEnter() { onEnter() {
if (!this.validateDraftTag.invalid) { if (!this.validateDraftTag.invalid) {
this.addDraftTag(); this.addDraftTag();
} }
}, },
/**
* Submit the form data
* @param {number} monitorId ID of monitor this change affects
* @returns {void}
*/
async submit(monitorId) { async submit(monitorId) {
console.log(`Submitting tag changes for monitor ${monitorId}...`); console.log(`Submitting tag changes for monitor ${monitorId}...`);
this.processing = true; this.processing = true;

View file

@ -29,10 +29,12 @@
<script> <script>
export default { export default {
props: { props: {
/** Heading to use */
heading: { heading: {
type: String, type: String,
default: "", default: "",
}, },
/** Should the selection be open by default? */
defaultOpen: { defaultOpen: {
type: Boolean, type: Boolean,
default: false, default: false,

View file

@ -100,18 +100,22 @@ export default {
this.getStatus(); this.getStatus();
}, },
methods: { methods: {
/** Show the dialog */
show() { show() {
this.modal.show(); this.modal.show();
}, },
/** Show dialog to confirm enabling 2FA */
confirmEnableTwoFA() { confirmEnableTwoFA() {
this.$refs.confirmEnableTwoFA.show(); this.$refs.confirmEnableTwoFA.show();
}, },
/** Show dialog to confirm disabling 2FA */
confirmDisableTwoFA() { confirmDisableTwoFA() {
this.$refs.confirmDisableTwoFA.show(); this.$refs.confirmDisableTwoFA.show();
}, },
/** Prepare 2FA configuration */
prepare2FA() { prepare2FA() {
this.processing = true; this.processing = true;
@ -126,6 +130,7 @@ export default {
}); });
}, },
/** Save the current 2FA configuration */
save2FA() { save2FA() {
this.processing = true; this.processing = true;
@ -143,6 +148,7 @@ export default {
}); });
}, },
/** Disable 2FA for this user */
disable2FA() { disable2FA() {
this.processing = true; this.processing = true;
@ -160,6 +166,7 @@ export default {
}); });
}, },
/** Verify the token generated by the user */
verifyToken() { verifyToken() {
this.$root.getSocket().emit("verifyToken", this.token, this.currentPassword, (res) => { this.$root.getSocket().emit("verifyToken", this.token, this.currentPassword, (res) => {
if (res.ok) { if (res.ok) {
@ -170,6 +177,7 @@ export default {
}); });
}, },
/** Get current status of 2FA */
getStatus() { getStatus() {
this.$root.getSocket().emit("twoFAStatus", (res) => { this.$root.getSocket().emit("twoFAStatus", (res) => {
if (res.ok) { if (res.ok) {

View file

@ -5,14 +5,17 @@
<script> <script>
export default { export default {
props: { props: {
/** Monitor this represents */
monitor: { monitor: {
type: Object, type: Object,
default: null, default: null,
}, },
/** Type of monitor */
type: { type: {
type: String, type: String,
default: null, default: null,
}, },
/** Is this a pill */
pill: { pill: {
type: Boolean, type: Boolean,
default: false, default: false,