Files
grin-web-wallet/scripts/log_section.js
2024-12-20 18:08:44 -08:00

274 lines
6.9 KiB
JavaScript
Executable File

// Use strict
"use strict";
// Classes
// Log section class
class LogSection extends Section {
// Public
// Constructor
constructor(display, sections, settings, message, focus, application, unlocked, automaticLock, scroll, wallets, node, wakeLock, transactions, prices, clipboard) {
// Delegate constructor
super(display, sections, settings, message, focus, application, unlocked, automaticLock, scroll, wallets, node, wakeLock, transactions, prices, clipboard);
// Get message display
this.messageDisplay = this.getDisplay().find("div.messages");
// Set message counter
this.messageCounter = 1;
// Set maximum number of messages to setting's default value
this.maximumNumberOfMessages = LogSection.SETTINGS_MAXIMUM_NUMBER_OF_MESSAGES_DEFAULT_VALUE;
// Set scroll to bottom
this.scrollToBottom = true;
// Set self
var self = this;
// Once database is initialized
Database.onceInitialized(function() {
// Return promise
return new Promise(function(resolve, reject) {
// Return creating settings
return Promise.all([
// Maximum number of messages setting
self.getSettings().createValue(LogSection.SETTINGS_MAXIMUM_NUMBER_OF_MESSAGES_NAME, LogSection.SETTINGS_MAXIMUM_NUMBER_OF_MESSAGES_DEFAULT_VALUE)
]).then(function() {
// Initialize settings
var settings = [
// Maximum number of messages setting
LogSection.SETTINGS_MAXIMUM_NUMBER_OF_MESSAGES_NAME,
];
// Return getting settings' values
return Promise.all(settings.map(function(setting) {
// Return getting setting's value
return self.getSettings().getValue(setting);
})).then(function(settingValues) {
// Set maximum number of messages to setting's value
self.maximumNumberOfMessages = settingValues[settings.indexOf(LogSection.SETTINGS_MAXIMUM_NUMBER_OF_MESSAGES_NAME)];
// Resolve
resolve();
// Catch errors
}).catch(function(error) {
// Reject
reject();
});
// Catch errors
}).catch(function(error) {
// Reject
reject();
});
});
});
// Settings change event
$(this.getSettings()).on(Settings.CHANGE_EVENT, function(event, setting) {
// Check what setting was changes
switch(setting[Settings.DATABASE_SETTING_NAME]) {
// Maximum number of messages setting
case LogSection.SETTINGS_MAXIMUM_NUMBER_OF_MESSAGES_NAME:
// Set maximum number of messages to setting's value
self.maximumNumberOfMessages = setting[Settings.DATABASE_VALUE_NAME];
// Truncate messages
self.truncateMessages();
// Break
break;
}
});
// Check if get selection is supported
if(typeof getSelection !== "undefined") {
// Main copy event
$("main").on("copy", function(event) {
// Check if shown
if(self.isShown() === true) {
// Prevent default
event.preventDefault();
// Get selection without duplicate newlines
var selection = Common.removeDuplicateNewlines(getSelection().toString());
// Set clipboard data to the new selection
event["originalEvent"]["clipboardData"].setData("text/plain", selection);
}
});
}
// Display scroll event
this.getDisplay().on("scroll", function(event) {
// Check if shown
if(self.isShown() === true) {
// Update scroll to bottom
self.scrollToBottom = Math.abs(self.getDisplay().get(0)["scrollHeight"] - self.getDisplay().get(0)["clientHeight"] - self.getDisplay().get(0)["scrollTop"]) <= Scroll.TOLERANCE || self.getDisplay().get(0)["scrollHeight"] - self.getDisplay().get(0)["scrollTop"] <= self.getDisplay().get(0)["clientHeight"];
}
// Display language change event
}).on(Language.CHANGE_EVENT, function() {
// Check if scroll to bottom
if(self.scrollToBottom === true) {
// Scroll display to the bottom
self.getDisplay().get(0)["scrollTop"] = self.getDisplay().get(0)["scrollHeight"] - self.getDisplay().get(0)["clientHeight"] + Scroll.TOLERANCE;
}
});
// Document log message event
$(document).on(Log.MESSAGE_EVENT, function() {
// Increment message counter
++self.messageCounter;
// Truncate messages
self.truncateMessages();
});
// Section shown event
$(this).on(Section.SHOWN_EVENT, function() {
// Check if scroll to bottom
if(self.scrollToBottom === true) {
// Request animation frame
requestAnimationFrame(function() {
// Scroll display to the bottom
self.getDisplay().get(0)["scrollTop"] = self.getDisplay().get(0)["scrollHeight"] - self.getDisplay().get(0)["clientHeight"] + Scroll.TOLERANCE;
});
}
});
// Window resize event
$(window).on("resize", function() {
// Check if scroll to bottom
if(self.scrollToBottom === true) {
// Scroll display to the bottom
self.getDisplay().get(0)["scrollTop"] = self.getDisplay().get(0)["scrollHeight"] - self.getDisplay().get(0)["clientHeight"] + Scroll.TOLERANCE;
}
});
}
// Get name
getName() {
// Return name
return LogSection.NAME;
}
// Reset
reset() {
// Reset
super.reset();
}
// Name
static get NAME() {
// Return name
return "Log";
}
// Private
// Initialize
initialize(state) {
// Set base class initialize
var baseClassInitialize = super.initialize(state);
// Set self
var self = this;
// Return promise
return new Promise(function(resolve, reject) {
// Return initializing base class
return baseClassInitialize.then(function() {
// Resolve
resolve();
// Reject error
}).catch(function(error) {
// Reject error
reject(error);
});
});
}
// Get initialize error header
getInitializeErrorHeader() {
// Return initialize error header
return Language.getDefaultTranslation('Log Error');
}
// Truncate messages
truncateMessages() {
// Check if too many messages exist
if(this.messageCounter > this.maximumNumberOfMessages) {
// Remove earlier messages
this.messageDisplay.children("p:lt(" + (this.messageCounter - this.maximumNumberOfMessages).toFixed() + ")").remove();
// Update message counter
this.messageCounter = this.maximumNumberOfMessages;
}
}
// Settings maximum number of messages name
static get SETTINGS_MAXIMUM_NUMBER_OF_MESSAGES_NAME() {
// Return settings maximum number of messages name
return "Maximum Number Of Messages";
}
// Settings maximum number of messages default value
static get SETTINGS_MAXIMUM_NUMBER_OF_MESSAGES_DEFAULT_VALUE() {
// Return settings maximum number of messages default value
return 1000;
}
}
// Main function
// Set global object's log section
globalThis["LogSection"] = LogSection;