Files
eacp_webapp/components/Frequency.js
T
2026-06-16 11:24:50 +08:00

168 lines
4.8 KiB
JavaScript

let valueMatch = /^(-?\d+(.\d+)?)(g|m|k)?(hz)?$/i;
function TextToValue(text,min,max){
let value = 0;
if(valueMatch.test(text)){
let result = valueMatch.exec(text);
let [number,decimal,calcuate] = result.slice(1,4);
if(calcuate){
calcuate = calcuate.toLocaleLowerCase();
}
let n = parseFloat(number);
let pow = 0;
switch(calcuate){
case "k":
pow = 1;
break;
case "m":
pow = 2;
break;
case "g":
pow = 3;
break;
}
value = n * Math.pow(1000,pow);
if(!isNaN(max) && value > max)value = max;
if(!isNaN(min) && value < min)value = min;
}
return value;
}
function ValueToText(value){
if(value == 0)return 0;
var pow = Math.floor(Math.log(Math.abs(value)) / Math.log(1000));
var unit = "";
switch(pow){
case -1:
case 0:
unit = ""
break;
case 1:
unit = "k";
break;
case 2:
unit = "m";
break;
default:
unit = "g";
break;
}
if(pow > 3) pow = 3;
if(pow > 0) value = value / Math.pow(1000,pow);
return value + unit.toUpperCase();
}
class Input extends HTMLElement{
constructor(){
super();
var shadow = this.attachShadow({ mode: 'open' });
this.$attrs = new Proxy({},{
get:(source,property)=>{
return this.getAttribute(property)
},
set:(source,property,value)=>{
this.setAttribute(property,value);
return true;
}
},{})
// Object.defineProperty(this,'value',{
// get(){},
// set(){}
// })
let $el = this.$el = document.createElement('input');
Object.assign($el.style,this.$attrs.style);
$el.addEventListener("change",(e)=>{
let text = (e.target.value).toLowerCase();
this.input = 1;
this.value = TextToValue(text,this.min,this.max);
e.target.value = ValueToText(this.value);
this.change();
});
$el.innerHTML = this.innerHTML;
if(this.$attrs.value){
this.input = 0;
this.value = parseInt(this.$attrs.value);
}else if($el.value = this.$attrs.text){
this.input = 0;
this.value = TextToValue($el.value,this.min,this.max);
}
if(this.value != 0){
this.$el.value = ValueToText( this.value);
}
this.textContent = "";
var style = document.createElement('style');
shadow.appendChild(style);
shadow.appendChild($el);
}
change(){
var event = new Event("change");
event.value = this.value;
if(this.input == 0){
this.$el.value = ValueToText( this.value);
}
this.dispatchEvent(event);
}
updateStyle(el){
var shadow = el.shadowRoot;
shadow.querySelector("style").textContent = `
:host{ display:block;box-sizing: border-box;}
input {
background-color:#021F40;
color:#fff;
width:100%;
text-align: right;
border: solid 1px #0D5E9B;
outline: none;
padding: 9px 16px;
box-sizing: border-box;
}
input:focus{
border: solid 1px #409eff;
}
input[readonly],input[disabled]{user-select: none;pointer-events: none;}
`;
}
static get observedAttributes(){
return ['class','style','title','size',"readonly","disabled","min","max","value"];
}
connectedCallback(){
this.updateStyle(this);
}
disconnectedCallback(){
}
adoptedCallback(){
}
attributeChangedCallback(name,oldValue,newValue){
switch(name){
case "size":{
this.$el.setAttribute('class',newValue);
break;
}
case "value":{
let text = (newValue).toLowerCase();
this.input = 1;
this.value = TextToValue(text);
this.$el.value = ValueToText(this.value);
this.change();
break;
}
case "max":{
this.max = parseFloat(newValue);
break;
}
case "min":{
this.min = parseFloat(newValue);
break;
}
default:{
this.$el.setAttribute(name,newValue);
}
}
}
}
Input.prototype.CONSOLE = false;
customElements.define('ex-input',Input);
document.body.addEventListener("contextmenu",(e)=>{
e.preventDefault();
e.stopPropagation();
})