Initial Commit
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
.venv/
|
||||
36
data/color_options.json
Normal file
@ -0,0 +1,36 @@
|
||||
{
|
||||
"main":{
|
||||
"enabled": false
|
||||
},
|
||||
"general": {
|
||||
"ColorModel": "RGB",
|
||||
"StpColorPrecision": "Normal",
|
||||
"StpiShrinkOutput": "Shrink"
|
||||
},
|
||||
"common": {
|
||||
"StpColorCorrection": "None",
|
||||
"StpBrightness": "None",
|
||||
"StpFineBrightness": "0",
|
||||
"StpContrast": "None",
|
||||
"StpFineContrast": "0",
|
||||
"StpSaturation": "None",
|
||||
"StpFineSaturation": "0",
|
||||
"StpImageType": "TextGraphics"
|
||||
},
|
||||
"extra": {
|
||||
"StpGamma": "None",
|
||||
"StpFineGamma": "0",
|
||||
"StpCyanGamma": "None",
|
||||
"StpFineCyanGamma": "0",
|
||||
"StpMagentaGamma": "None",
|
||||
"StpFineMagentaGamma": "0",
|
||||
"StpYellowGamma": "None",
|
||||
"StpFineYellowGamma": "0",
|
||||
"StpCyanBalance": "None",
|
||||
"StpFineCyanBalance": "0",
|
||||
"StpMagentaBalance": "None",
|
||||
"StpFineMagentaBalance": "0",
|
||||
"StpYellowBalance": "None",
|
||||
"StpFineYellowBalance": "0"
|
||||
}
|
||||
}
|
||||
36
data/color_options_default.json
Normal file
@ -0,0 +1,36 @@
|
||||
{
|
||||
"main":{
|
||||
"enabled": false
|
||||
},
|
||||
"general": {
|
||||
"ColorModel": "KCMY",
|
||||
"StpColorPrecision": "Normal",
|
||||
"StpiShrinkOutput": "Expand"
|
||||
},
|
||||
"common": {
|
||||
"StpColorCorrection": "None",
|
||||
"StpBrightness": "None",
|
||||
"StpFineBrightness": "0",
|
||||
"StpContrast": "None",
|
||||
"StpFineContrast": "0",
|
||||
"StpSaturation": "None",
|
||||
"StpFineSaturation": "0",
|
||||
"StpImageType": "TextGraphics"
|
||||
},
|
||||
"extra": {
|
||||
"StpGamma": "None",
|
||||
"StpFineGamma": "0",
|
||||
"StpCyanGamma": "None",
|
||||
"StpFineCyanGamma": "0",
|
||||
"StpMagentaGamma": "None",
|
||||
"StpFineMagentaGamma": "0",
|
||||
"StpYellowGamma": "None",
|
||||
"StpFineYellowGamma": "0",
|
||||
"StpCyanBalance": "None",
|
||||
"StpFineCyanBalance": "0",
|
||||
"StpMagentaBalance": "None",
|
||||
"StpFineMagentaBalance": "0",
|
||||
"StpYellowBalance": "None",
|
||||
"StpFineYellowBalance": "0"
|
||||
}
|
||||
}
|
||||
5
data/cups.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"dockerized": true,
|
||||
"lpinfo-com": "docker exec cups_233op2 lpinfo",
|
||||
"lpadmin-com": "docker exec cups_233op2 lpadmin"
|
||||
}
|
||||
898
data/printers.json
Normal file
@ -0,0 +1,898 @@
|
||||
[
|
||||
{
|
||||
"display-name": "----- DNP Printers -----",
|
||||
"make-model": " ",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 0,
|
||||
"enabled": false,
|
||||
"media-size": " ",
|
||||
"media-size-display": " "
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "DNP-DS620",
|
||||
"make-model": "dnp-ds620",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 230,
|
||||
"enabled": false,
|
||||
"media-size": "B7",
|
||||
"media-size-display": "3.5x5"
|
||||
},
|
||||
{
|
||||
"capacity": 400,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 400,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "2x6-div2"
|
||||
},
|
||||
{
|
||||
"capacity": 700,
|
||||
"enabled": false,
|
||||
"media-size": "w324h432",
|
||||
"media-size-display": "4.5x6"
|
||||
},
|
||||
{
|
||||
"capacity": 400,
|
||||
"enabled": false,
|
||||
"media-size": "w360h360",
|
||||
"media-size-display": "5x5"
|
||||
},
|
||||
{
|
||||
"capacity": 400,
|
||||
"enabled": false,
|
||||
"media-size": "w360h504",
|
||||
"media-size-display": "5x7"
|
||||
},
|
||||
{
|
||||
"capacity": 400,
|
||||
"enabled": false,
|
||||
"media-size": "w360h504-div2",
|
||||
"media-size-display": "3.5x5-div2"
|
||||
},
|
||||
{
|
||||
"capacity": 350,
|
||||
"enabled": false,
|
||||
"media-size": "w360h504-w360h360_w360h144",
|
||||
"media-size-display": "5x5+2x5"
|
||||
},
|
||||
{
|
||||
"capacity": 350,
|
||||
"enabled": false,
|
||||
"media-size": "w432h432",
|
||||
"media-size-display": "6x6"
|
||||
},
|
||||
{
|
||||
"capacity": 350,
|
||||
"enabled": false,
|
||||
"media-size": "w432h576",
|
||||
"media-size-display": "6x8"
|
||||
},
|
||||
{
|
||||
"capacity": 350,
|
||||
"enabled": false,
|
||||
"media-size": "w432h576-w432h432_w432h144",
|
||||
"media-size-display": "6x6+2x6"
|
||||
},
|
||||
{
|
||||
"capacity": 350,
|
||||
"enabled": false,
|
||||
"media-size": "w432h576-div4",
|
||||
"media-size-display": "2x6*4"
|
||||
},
|
||||
{
|
||||
"capacity": 350,
|
||||
"enabled": false,
|
||||
"media-size": "w432h576-div2",
|
||||
"media-size-display": "4x6-div2"
|
||||
},
|
||||
{
|
||||
"capacity": 350,
|
||||
"enabled": false,
|
||||
"media-size": "w432h648",
|
||||
"media-size-display": "6x9"
|
||||
},
|
||||
{
|
||||
"capacity": 350,
|
||||
"enabled": false,
|
||||
"media-size": "w432h648-div2",
|
||||
"media-size-display": "4.5x6-div2"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "DNP-DSRX1",
|
||||
"make-model": "dnp-dsrx1",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 700,
|
||||
"enabled": false,
|
||||
"media-size": "B7",
|
||||
"media-size-display": "3.5x5"
|
||||
},
|
||||
{
|
||||
"capacity": 700,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 700,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "2x6-div2"
|
||||
},
|
||||
{
|
||||
"capacity": 400,
|
||||
"enabled": false,
|
||||
"media-size": "w360h360",
|
||||
"media-size-display": "5x5"
|
||||
},
|
||||
{
|
||||
"capacity": 400,
|
||||
"enabled": false,
|
||||
"media-size": "w360h504",
|
||||
"media-size-display": "5x7"
|
||||
},
|
||||
{
|
||||
"capacity": 400,
|
||||
"enabled": false,
|
||||
"media-size": "w360h504-div2",
|
||||
"media-size-display": "3.5x5-div2"
|
||||
},
|
||||
{
|
||||
"capacity": 350,
|
||||
"enabled": false,
|
||||
"media-size": "w432h432",
|
||||
"media-size-display": "6x6"
|
||||
},
|
||||
{
|
||||
"capacity": 350,
|
||||
"enabled": false,
|
||||
"media-size": "w432h576",
|
||||
"media-size-display": "6x8"
|
||||
},
|
||||
{
|
||||
"capacity": 350,
|
||||
"enabled": false,
|
||||
"media-size": "w432h576-div4",
|
||||
"media-size-display": "2x6*4"
|
||||
},
|
||||
{
|
||||
"capacity": 350,
|
||||
"enabled": false,
|
||||
"media-size": "w432h576-div2",
|
||||
"media-size-display": "4x6-div2"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "DNP-DS40",
|
||||
"make-model": "dnp-ds40",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 400,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 400,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "2x6-div2"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "DNP-DS80",
|
||||
"make-model": "dnp-ds80",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 260,
|
||||
"enabled": true,
|
||||
"media-size": "w288h576",
|
||||
"media-size-display": "8x4"
|
||||
},
|
||||
{
|
||||
"capacity": 260,
|
||||
"enabled": false,
|
||||
"media-size": "w360h576",
|
||||
"media-size-display": "8x5"
|
||||
},
|
||||
{
|
||||
"capacity": 260,
|
||||
"enabled": false,
|
||||
"media-size": "w432h576",
|
||||
"media-size-display": "8x6"
|
||||
},
|
||||
{
|
||||
"capacity": 260,
|
||||
"enabled": false,
|
||||
"media-size": "w576h576",
|
||||
"media-size-display": "8x8"
|
||||
},
|
||||
{
|
||||
"capacity": 260,
|
||||
"enabled": false,
|
||||
"media-size": "w576h576-div2",
|
||||
"media-size-display": "8x4-div2"
|
||||
},
|
||||
{
|
||||
"capacity": 260,
|
||||
"enabled": false,
|
||||
"media-size": "w576h648-w576h360_w576h288",
|
||||
"media-size-display": "8x5+8x4"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "DNP-DS80DX",
|
||||
"make-model": "dnp-ds80dx",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 260,
|
||||
"enabled": true,
|
||||
"media-size": "w288h576",
|
||||
"media-size-display": "8x4"
|
||||
},
|
||||
{
|
||||
"capacity": 260,
|
||||
"enabled": false,
|
||||
"media-size": "w360h576",
|
||||
"media-size-display": "8x5"
|
||||
},
|
||||
{
|
||||
"capacity": 260,
|
||||
"enabled": false,
|
||||
"media-size": "w432h576",
|
||||
"media-size-display": "8x6"
|
||||
},
|
||||
{
|
||||
"capacity": 260,
|
||||
"enabled": false,
|
||||
"media-size": "w576h576",
|
||||
"media-size-display": "8x8"
|
||||
},
|
||||
{
|
||||
"capacity": 260,
|
||||
"enabled": false,
|
||||
"media-size": "w576h576-div2",
|
||||
"media-size-display": "8x4-div2"
|
||||
},
|
||||
{
|
||||
"capacity": 260,
|
||||
"enabled": false,
|
||||
"media-size": "w576h648-w576h360_w576h288",
|
||||
"media-size-display": "8x5+8x4"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "DNP-DS820",
|
||||
"make-model": "dnp-ds820",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 260,
|
||||
"enabled": true,
|
||||
"media-size": "w288h576",
|
||||
"media-size-display": "8x4"
|
||||
},
|
||||
{
|
||||
"capacity": 260,
|
||||
"enabled": false,
|
||||
"media-size": "w360h576",
|
||||
"media-size-display": "8x5"
|
||||
},
|
||||
{
|
||||
"capacity": 260,
|
||||
"enabled": false,
|
||||
"media-size": "w432h576",
|
||||
"media-size-display": "8x6"
|
||||
},
|
||||
{
|
||||
"capacity": 260,
|
||||
"enabled": false,
|
||||
"media-size": "w576h576",
|
||||
"media-size-display": "8x8"
|
||||
},
|
||||
{
|
||||
"capacity": 260,
|
||||
"enabled": false,
|
||||
"media-size": "w576h576-div2",
|
||||
"media-size-display": "8x4-div2"
|
||||
},
|
||||
{
|
||||
"capacity": 260,
|
||||
"enabled": false,
|
||||
"media-size": "w576h648-w576h360_w576h288",
|
||||
"media-size-display": "8x5+8x4"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "DNP-DS80DX",
|
||||
"make-model": "dnp-ds80dx",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 400,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 400,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "2x6-div2"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "DNP-SL10",
|
||||
"make-model": "dnp-sl10",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 200,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 200,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "2x6-div2"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "DNP-SL20",
|
||||
"make-model": "dnp-sl20",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 200,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 200,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "2x6-div2"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "DNP-QW410",
|
||||
"make-model": "dnp-qw410",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 150,
|
||||
"enabled": true,
|
||||
"media-size": "w288h288",
|
||||
"media-size-display": "4x4"
|
||||
},
|
||||
{
|
||||
"capacity": 150,
|
||||
"enabled": true,
|
||||
"media-size": "w288h288-div2",
|
||||
"media-size-display": "2x4*2"
|
||||
},
|
||||
{
|
||||
"capacity": 150,
|
||||
"enabled": true,
|
||||
"media-size": "w288h216",
|
||||
"media-size-display": "4x3"
|
||||
},
|
||||
{
|
||||
"capacity": 150,
|
||||
"enabled": true,
|
||||
"media-size": "w288h288_w288h144",
|
||||
"media-size-display": "4x4+4x2"
|
||||
},
|
||||
{
|
||||
"capacity": 150,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 150,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "4x3*2"
|
||||
},
|
||||
{
|
||||
"capacity": 150,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div3",
|
||||
"media-size-display": "2x4*3"
|
||||
},
|
||||
{
|
||||
"capacity": 150,
|
||||
"enabled": false,
|
||||
"media-size": "w288h576",
|
||||
"media-size-display": "4x8"
|
||||
},
|
||||
{
|
||||
"capacity": 150,
|
||||
"enabled": false,
|
||||
"media-size": "w288h432_w288h144",
|
||||
"media-size-display": "4x6+4x2"
|
||||
},
|
||||
{
|
||||
"capacity": 150,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2_w288h144",
|
||||
"media-size-display": "4x3*2+4x2"
|
||||
},
|
||||
{
|
||||
"capacity": 150,
|
||||
"enabled": false,
|
||||
"media-size": "w288h576-div2",
|
||||
"media-size-display": "4x4*2"
|
||||
},
|
||||
{
|
||||
"capacity": 150,
|
||||
"enabled": false,
|
||||
"media-size": "w288h576-div4",
|
||||
"media-size-display": "2x4*4"
|
||||
},
|
||||
{
|
||||
"capacity": 110,
|
||||
"enabled": false,
|
||||
"media-size": "w324h216",
|
||||
"media-size-display": "4.5x3"
|
||||
},
|
||||
{
|
||||
"capacity": 110,
|
||||
"enabled": false,
|
||||
"media-size": "w324h288",
|
||||
"media-size-display": "4.5x4"
|
||||
},
|
||||
{
|
||||
"capacity": 110,
|
||||
"enabled": false,
|
||||
"media-size": "w324h324",
|
||||
"media-size-display": "4.5x4.5"
|
||||
},
|
||||
{
|
||||
"capacity": 110,
|
||||
"enabled": false,
|
||||
"media-size": "w324h432",
|
||||
"media-size-display": "4.5x6"
|
||||
},
|
||||
{
|
||||
"capacity": 110,
|
||||
"enabled": false,
|
||||
"media-size": "w324h432-div2",
|
||||
"media-size-display": "4.5x3*2"
|
||||
},
|
||||
{
|
||||
"capacity": 110,
|
||||
"enabled": false,
|
||||
"media-size": "w324h486",
|
||||
"media-size-display": "4.5x6.75"
|
||||
},
|
||||
{
|
||||
"capacity": 110,
|
||||
"enabled": false,
|
||||
"media-size": "w324h432-div3",
|
||||
"media-size-display": "4.5x2*3"
|
||||
},
|
||||
{
|
||||
"capacity": 110,
|
||||
"enabled": false,
|
||||
"media-size": "w324h476",
|
||||
"media-size-display": "4.5x8"
|
||||
},
|
||||
{
|
||||
"capacity": 110,
|
||||
"enabled": false,
|
||||
"media-size": "w324h576-div2",
|
||||
"media-size-display": "4.5x4*2"
|
||||
},
|
||||
{
|
||||
"capacity": 110,
|
||||
"enabled": false,
|
||||
"media-size": "w324h576-div4",
|
||||
"media-size-display": "4.5x2*4"
|
||||
},
|
||||
{
|
||||
"capacity": 110,
|
||||
"enabled": false,
|
||||
"media-size": "w324h432_w324h144",
|
||||
"media-size-display": "4.5x6+4.5x2"
|
||||
},
|
||||
{
|
||||
"capacity": 110,
|
||||
"enabled": false,
|
||||
"media-size": "w324h432-div2_w324h144",
|
||||
"media-size-display": "4.5x3*2+4.5x2"
|
||||
}
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "----- Sinfonia Printers -----",
|
||||
"make-model": " ",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 0,
|
||||
"enabled": false,
|
||||
"media-size": " ",
|
||||
"media-size-display": " "
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "Sinf-6145-CS2",
|
||||
"make-model": "sinfonia-chcs6145",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 300,
|
||||
"enabled": false,
|
||||
"media-size": "w144h432",
|
||||
"media-size-display": "2x6"
|
||||
},
|
||||
{
|
||||
"capacity": 300,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 300,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "2x6-div2"
|
||||
},
|
||||
{
|
||||
"capacity": 170,
|
||||
"enabled": false,
|
||||
"media-size": "w360h360",
|
||||
"media-size-display": "5x5"
|
||||
},
|
||||
{
|
||||
"capacity": 170,
|
||||
"enabled": false,
|
||||
"media-size": "w360h504",
|
||||
"media-size-display": "5x7"
|
||||
},
|
||||
{
|
||||
"capacity": 150,
|
||||
"enabled": false,
|
||||
"media-size": "w432h432",
|
||||
"media-size-display": "6x6"
|
||||
},
|
||||
{
|
||||
"capacity": 150,
|
||||
"enabled": false,
|
||||
"media-size": "w432h576",
|
||||
"media-size-display": "6x8"
|
||||
},
|
||||
{
|
||||
"capacity": 150,
|
||||
"enabled": false,
|
||||
"media-size": "w432h576-w432h432_w432h144",
|
||||
"media-size-display": "6x6+2x6"
|
||||
},
|
||||
{
|
||||
"capacity": 150,
|
||||
"enabled": false,
|
||||
"media-size": "w432h576-div2",
|
||||
"media-size-display": "4x6-div2"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "Sinf-1245-E1",
|
||||
"make-model": "sinfonia-chcs1245",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 300,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 300,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "2x6-div2"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "Sinf-2145-S2",
|
||||
"make-model": "sinfonia-chcs2145",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 300,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 300,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "2x6-div2"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "Sinf-2245-S2",
|
||||
"make-model": "sinfonia-chcs2245",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 300,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 300,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "2x6-div2"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "Sinf-6245-CE1",
|
||||
"make-model": "sinfonia-chcs6245",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 300,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 300,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "2x6-div2"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "----- Fujifilm Printers -----",
|
||||
"make-model": " ",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 0,
|
||||
"enabled": false,
|
||||
"media-size": " ",
|
||||
"media-size-display": " "
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "Fujifilm-ASK-300",
|
||||
"make-model": "fujifilm-ask-300",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 400,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 400,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "2x6-div2"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "Fujifilm-ASK-2000",
|
||||
"make-model": "fujifilm-ask-2000",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 600,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 600,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "2x6-div2"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "Fujifilm-ASK-2500",
|
||||
"make-model": "fujifilm-ask-2500",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 600,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 600,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "2x6-div2"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "Fujifilm-ASK-4000",
|
||||
"make-model": "fujifilm-ask-4000",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 300,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 300,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "2x6-div2"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "----- Mitsubishi Printers -----",
|
||||
"make-model": " ",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 0,
|
||||
"enabled": false,
|
||||
"media-size": " ",
|
||||
"media-size-display": " "
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "Mitsubishi-K60DW",
|
||||
"make-model": "mitsubishi-k60dw",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 320,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 320,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "2x6-div2"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "Mitsubishi-CP-D70DW",
|
||||
"make-model": "mitsubishi-cp-d70dw",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 400,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 400,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "2x6-div2"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "----- Hiti Printers -----",
|
||||
"make-model": " ",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 0,
|
||||
"enabled": false,
|
||||
"media-size": " ",
|
||||
"media-size-display": " "
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "Hiti-P525L",
|
||||
"make-model": "hiti-p525l",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 500,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 500,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "2x6-div2"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "Hiti-P520L",
|
||||
"make-model": "hiti-p520l",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 500,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432",
|
||||
"media-size-display": "4x6"
|
||||
},
|
||||
{
|
||||
"capacity": 500,
|
||||
"enabled": true,
|
||||
"media-size": "w288h432-div2",
|
||||
"media-size-display": "2x6-div2"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "----- Sony Printers -----",
|
||||
"make-model": " ",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 0,
|
||||
"enabled": false,
|
||||
"media-size": " ",
|
||||
"media-size-display": " "
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "----- Canon Printers -----",
|
||||
"make-model": " ",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 0,
|
||||
"enabled": false,
|
||||
"media-size": " ",
|
||||
"media-size-display": " "
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "----- Citizen Printers -----",
|
||||
"make-model": " ",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 0,
|
||||
"enabled": false,
|
||||
"media-size": " ",
|
||||
"media-size-display": " "
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"display-name": "----- Zebra Printers -----",
|
||||
"make-model": " ",
|
||||
"media-sizes": [
|
||||
{
|
||||
"capacity": 0,
|
||||
"enabled": false,
|
||||
"media-size": " ",
|
||||
"media-size-display": " "
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
]
|
||||
26
requirements.txt
Normal file
@ -0,0 +1,26 @@
|
||||
beautifulsoup4
|
||||
blinker
|
||||
bs4
|
||||
certifi
|
||||
cffi
|
||||
charset-normalizer
|
||||
click
|
||||
cryptography
|
||||
Flask
|
||||
Flask-Cors
|
||||
idna
|
||||
itsdangerous
|
||||
Jinja2
|
||||
MarkupSafe
|
||||
psutil
|
||||
pyarmor
|
||||
pycparser
|
||||
pycups
|
||||
pyudev
|
||||
requests
|
||||
soupsieve
|
||||
spidev
|
||||
swig
|
||||
urllib3
|
||||
Werkzeug
|
||||
gunicorn
|
||||
BIN
src/__pycache__/app.cpython-310.pyc
Normal file
BIN
src/__pycache__/app.cpython-311.pyc
Normal file
BIN
src/__pycache__/globals.cpython-310.pyc
Normal file
BIN
src/__pycache__/globals.cpython-311.pyc
Normal file
BIN
src/__pycache__/led_status.cpython-310.pyc
Normal file
BIN
src/__pycache__/led_status.cpython-311.pyc
Normal file
BIN
src/__pycache__/license_checker.cpython-310.pyc
Normal file
BIN
src/__pycache__/license_checker.cpython-311.pyc
Normal file
BIN
src/__pycache__/printer_admin.cpython-310.pyc
Normal file
BIN
src/__pycache__/printer_admin.cpython-311.pyc
Normal file
BIN
src/__pycache__/printer_monitor.cpython-310.pyc
Normal file
BIN
src/__pycache__/printer_monitor.cpython-311.pyc
Normal file
BIN
src/__pycache__/resources.cpython-310.pyc
Normal file
BIN
src/__pycache__/resources.cpython-311.pyc
Normal file
BIN
src/__pycache__/spi_flash.cpython-310.pyc
Normal file
BIN
src/__pycache__/spi_flash.cpython-311.pyc
Normal file
BIN
src/__pycache__/systemId.cpython-310.pyc
Normal file
BIN
src/__pycache__/unique_activation.cpython-310.pyc
Normal file
BIN
src/__pycache__/wifi_config.cpython-310.pyc
Normal file
BIN
src/__pycache__/wifi_config.cpython-311.pyc
Normal file
BIN
src/__pycache__/wsgi.cpython-310.pyc
Normal file
BIN
src/__pycache__/wsgi.cpython-311.pyc
Normal file
3
src/app.py
Normal file
3
src/cupsconnect.py
Normal file
@ -0,0 +1,3 @@
|
||||
# Pyarmor 9.0.7 (trial), 000000, non-profits, 2025-03-14T02:02:35.798448
|
||||
from pyarmor_runtime_000000 import __pyarmor__
|
||||
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00x\x02\x00\x00\x12\t\x04\x00S\xe3\\\x0f5d8 \xcf\x05\x074%\xa1\x04\x8e\x00\x00\x00\x00\x00\x00\x00\x00E\x91\xe1\x86\x0ea\xa1\x16\x0e\xb4\x1b\x1b\xea\xc4\xe8N\xcc\xb5\x08\x1e\x92\x90\x01S\xac\xab\xf0\xee\xbc\xcdr\xc3\xad\xa6\xee\x19"\\B\x1f\xd8\x83\xaaU`\xb2\xa5\'\xf3_=\xeb@\x10D&\xbc1P|\x81\xf5^\x01Z\xd6\xbc\xcc6Y\x1d\xe4q\x16\xda\xee\n\xa9\x88\xf5`M"4\x97\x9f\xef\xd9\xb6%\xf8\x1d\x8f\xd5\xee\xa9\x922\xe79\xf4\xea,\xff\tm\xc1S\x91\xc6M\xe1,I\xef\xb9\xeb\x9d\x93\xc5}\x03,i.\xf4$\x9c\x8b\xeaF\xa9\xc2\x94\xc8\xf3\xf5\x9d\xa0C\x97\xe3[p\xa3\xdem\x0f\x9bwW\xca\xca.\x043\xf064g\x1f\xd5l\x9e\xd5U$.\xda$QY\xa2\xd3\xfa\xb9P\x1f\x84\xfa\x9c\x86/\xc8X\xab+Zn\x14\xe0\xf3\xa5H\xabF\x9f\x89\xec\xdb3\xf74\xf6e1\x06\xc5$\xb7\x8cH\x7f\xd50\x0e`\x8f\x1d&\x0e&\xef\x92\xca\xc3\x85\xef\xea/"\x1b)\xf7\xfd\x9c\x1d9l\xbe\xee\xae\xf0\x96}\xc0`\x06]\xdb\x9a=\\\xe8\xdbU\x8ac5S\x84J\x8f\xdd\xda\x82\xfd\x02\xe0\xb3D\xd4R=\x90|r\xa8\xdd/\xd0\xd3.6\x7f\x1fD\xf7!\x1e\xeb\x92\xc0)\x95qN\xd8\x0b\x126\xf7B\x88\x12\x98j\x1f\xb8\x08\xdf_\xbb\x1c\x0f7K!\xb2\xc3\xe4\xfe\x80\xacc\x18\xb7\x0c\x94\xbe\xbc\xec\x93<\xf60\x97\x87\x811\xe6\xa1\xad 0\x08\xe1Q#\'S\xb6\xa0!e\xa7\xe8\xb1\xe8\x14\x198\x14I\xf2\x1a$\x8f\xe6\xb6&\x90B\xae\xddm\xd06@\x1f\x98\xf29\x10\x7f\xab=\xf2y\xdex\x08\x1b\x93\xe9\x00\xff\xb2\x9f\x07P\xbe$\xa3\xe8\x10\xd3\xf4R\x98\xac\xe22\xf1A\xa3B\xb7\x81l\x18\xb6:mHf\xc53Zo&Q0\x1e4\xc5\xaa\xca\x07\xc5\x8f\x15\xad\xb3\x8f}\xa1<\xb1Z\xc8\x16\xf53r\xd8\xdf~\xa6\xdbn\xc3nN{Pp\xbc\x87\n\xde\xaf \xeb=\xd9\x87\x9dGhX\xa67.\x80\xe7\xd2\xb9P\xc3\xbfP;\xd9\x9e\x82\xa8,\xca\x18/n\x9es\x15\xd7\xc0\xdc\x05i\xbb)\xbc\xad\xeb\xe4>\x88H)\x10\xb5<\xd9\x8a\x82\xdc\xfdq\xa7\xb2\x91\rL\x1d\xd2\x1f\xc4\xd6\xaf\x1d\x1d\xed\xe9\xb1\xf0\xde,\xdbaZH\x1an\xddO@[0\nC\xfc\xfe\x15N8\xcd&o!\x1a\xb5f\x13{4\x85ED\xdd0\x1bm\xbbXb\xbc\x8dL\x81\xfez2\x19$\x1f\xe61\x95\xd8\x1c\xfd\x8e8i\xd4\xa7\xae\x01\xdb{b\x17X\xc3)\xd0\x9f\xafX\x0c<\xd0v\xd2\x08\xef\x0f\x91Y\n\xa2')
|
||||
3
src/cupstest.py
Normal file
@ -0,0 +1,3 @@
|
||||
# Pyarmor 9.0.7 (trial), 000000, non-profits, 2025-03-14T02:02:35.823082
|
||||
from pyarmor_runtime_000000 import __pyarmor__
|
||||
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00-\x04\x00\x00\x12\t\x04\x00\xf8\xe9\xce]\xe7y;\xf5\x82\x91+~x=\xc2\x8d\x00\x00\x00\x00\x00\x00\x00\x00\xa5\xdb\x0b\x90\xdeN\x00J\xe3\x18 \xae\xd5]\xabH9\x052\x8f\xfc\xcf\x9a\xc1\xe0?)_)l\xe4\xb4H\x8f~\xb6*L\xb7y&\x9f\\E\xd4\x04:\x04\xe3\xb9"\x8f\xe1\x86\x88\xb1\xf3\xa3\xb4\x98\x97\xf2\xb6\x1a|\x16w(^\x96\x13\xa6\xf0\x91\xfd\r\x11<\x10\xe7\xbd\xf6\x10\xfe\xa5\xb98C\x84[\x18\xb0j\xce\xd6\xa7[\xf1\xcb;R\x9ec\xaa\x05\xa34\xa6lo\xbe\xa9\x03U\x9fU\xc6\x16\x03\x9c^\x18|(\xd7\xa0}T\xce^\xb87\x88nH~\xe7\xd0\xe3\x10\x14+\x8b\x04\xb49!\x0b\x08\xbbx\xd5\x98\x7f\xee\xfb\x04\x8f\x0f;\x96\xbe\xf8\xa7\xeb\xf1\xed_\xa0\xfdl]\x9f\x1a6"\x185<\xca\xf7\xaa\xa6\xe1wC\xbe\xcfzE\x8fM.9\xcc\xc3\xc1\xf9*\x14\x86I\x9fz\xda\xf9\xd2\x149\xe9\x8a\xd0i\\\x81\xa0_X\x07\x8a5\xb4\xdf\x7fc\xd2\x1ag\x11\x1fj\xc8\x1d\x02\x88X\x05|\x81\xd0\xc8\x81x\xab@r\x13\xdbY\xcem\xf4v\x0e\x9a\'\xbb\x1b\xd0\x95\xb9\xc9J\x80\x94\xbe{\xab\x7f\x12\xeca)-\xc05\x02u\xb3\xb2\x9e\xf0\xaf \xf8a\xcc\xee\x1ayj\xdb|\td\x05*2\xd9d8\xb0\xdb\xf2\xa9\x98\x0cH@\xd5\x0f\x9b\xbb.\x95xdr\x85\xb4\xcb\xc6\xba\xf8\xc8\xbf\\\x16\xd7\xdfZd\xa5\xb8\xc4\xf5\xff\x12\xcc@\x9cp\xe6\xe2G"\x11\xac\xdd>\xdd\xfe\xbc9\xf6@\xaa\xd4\xe7\x0f\xf6\xa5\xfe\x85\x98\xe3\xcc\xd2\xde\x9a\x98\xd0\xe9\x9eR\x95\xe3\x1f\x0e\xc1\xff\xaf\x00-Z_\x08CA\xe8\x97\x96q\x93\x0b\x8d\xdaO\x93\x9c\x90\xfa>k\xe1\x90?\xc4E\x98\xe3L\xaf\x02_\x06\xe9\xc0\x18\xc90X\xfe\x17i\xbc\x86;\xae\x91\xc0\x1dV\xb9*VG\xa76}\xc7\xba`x\xe9/g\xc4\x02#\xa5\xe8\xc9|3\x1c?@\xf2\xd6R\xa3w"\'$EY\t~)\xc0\xec\xb1\x18\xb9l\x1e\x18P/\xa7\xaf\xdf\xf4\xd3\xd0\x85\xe7]n\xae\x1e\x88Hi\xc7O<R\x06\xfc\x04Y\x01\xfeS\x94\x0f\xa7pFRe\xb1D5\xaa\xee\xec\x00\x90\x8e\xc5\xf1\x99\x8fo=\x88k\x96\xb0\xdfD\x94|\x92\xe6\xba1#\x8a\xb9L\xec8e:\x8e\x9e\xb8\x01AQ\x04\xeaz\xa0\x92\x16\xf2\xab2D\xfb\xd8\x86\xe1=\xfb\xbf\x7f\xa0\x97Z\x81\xb6\xa4\x7f*\x8c\xa2k\xccV\xdb.\x05\x8f]\xce\xf3"\xefL\xa4V\xfd\xc7\x81\xf3>\x8b\x00\x81\xca@\xdc[\\7\x89\x00\xa5b\xfb\xd0\t\xa4}\x96\xfe.=A\xc2\xfe\xa7\xcf+}\xea\xae}J\xe1\xf8\xc5\xaf\x94"\xa0\xd7\x1f\x96\x17\xach\xf6\x94#\x02\x9et\xd0S\xf9@\x8cA\xc9o\x1c\xbc\xa5$dD\xceY#\x8e\xe7\xdf\xdb\xb2\t\xf1V\xa0\x90\xcc\xc0\x90\xbc\x1b\xe3\xdd\x96=\x80/(\xca\x18L\x087\xfe\x98B\x94v\xe5j\x17\xb13\xcb,\xd5\x8aT\xf3!\x98\xeb\x11\xef\xcd\xf8\x1e\x15\xcf\xee3\x8d\x86\xa1\xeaE3\x9c\xc0@mp\xc4\xd3\x16;\x9eS\x15\x83\x8e\xb1\xc1\xba\xbaZ:\xa3D\xd8<\x1c\xb7\xe9\x1d\x0e06\x8c\xa4\x98\x9bISa\x7f\xe3\xdd\x90R6WZ\x11Z9\x87\x1fS}\xdf*\xf2\x0f\xb2\xd8\x11\x16\x18\xfa\xcb\xd6\x14\xfby"\xa5&\xb53\xeb\x03\xc1\xbc\xfa\x11!H\x9d\xa7\x1a\x03wx\xed\xa5\x9e\x90\xa1\x99\xba\x05\x1e\xf8\xd4IO\rs$`\x1d\x06\xa6\x98\xa3\x14\xeb\xed@\xb1f\xf3\xc7\xae[r\r\\5\xf3\xee\t\xb5I\xd3\x16\xc4\x02\x84&5\xae\xc1\x03]+\xcf#c\xaf\xd5l6\xf5?\x1e\nPB\xd9\xd6\x89\x7f \x94\xfaS\xd6\xac\xb5\xfeB\x85\xcf\xeb\x86w\x1b\x1bY\xa0\x83\xa9\xf5\xd1\x1b&\xdc\x05\xe32!>\xb0\xc3\x9f\xf8\xc8\xe1%:W\x03i\xda\xb4\xc4\xb0\xbd\xf6\x07! \x01\x14\x1b\xcc\x9b\x8d\xa6\xbc\x84\tY>\x08\xd0\x00\xcbR<\x0e\x13\xb5\xfdSO5\x83\x1c\xd5T/\xa3\xc5q\x9di\xe5i\xbf\x10\xceE\xd4&\xf6h\xe9\xcd\x83\xf3%\xcb\xbe\xc0\xcda\xd8P\xb2m\xb7\xde\xf8\x97m\x08H\xc0t\xfd\x9e\x85d\xad\x90\x1a%K\xd2\x82\xf1\x8a\x86\x80\xf0\xa1\x89\x87\x9b\x15%\xd2t\x17\x1b\x8c\xc4\x91\x04\xbd\x97\x8aZ\xd2\x8f\xf7\x90\xb9\xb4\x99\xec\x98P\x13z\x0b\xa8\xfc%\xd2\xfd\x80(\x10\x998i\xe0d!')
|
||||
3
src/globals.py
Normal file
3
src/led_heartbeats.py
Normal file
@ -0,0 +1,3 @@
|
||||
# Pyarmor 9.0.7 (trial), 000000, non-profits, 2025-03-14T02:02:35.897509
|
||||
from pyarmor_runtime_000000 import __pyarmor__
|
||||
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x84\x00\x00\x00\x12\t\x04\x00\xb0*\x98l\xa4\xf4\x12\x14\xb8\n_\xa9\x03\xce\xedi\x00\x00\x00\x00\x00\x00\x00\x00\x1d\xe6\x1aC\xa8\xe6#\xbf{\x99\xc4\xce\x88\xad[4\xc8\xfbs\xb4\x9d8\xde\xe3!\xaab\xf9\xd3\xcf\xc9\xd7\x84+\xa8;\xcb\x11\x0c\xc5\x1b\xd1\xa9\x90\x08\xab\xad\x8fE\xd0b\xad\x15\xb0\'7TK\x82L\xc9\xbd\xda=x(\xdf\x83\xd0\x84f\xe2\xd3\xdd\xb1\xa8lU\xde\x0f`\xa9\x07`\xeeg4\xa4w\xeb\n%\xdck\x12\\\xde\xd1Z\xeaZ\x90\x86o\xa6\xa7\xb9\x7f\xba\xda\x06\xe3\x0c\xadv\x9f$\xc6\x87\xfc"\xb1E\x8e@T`\xd40\xa2\xfbc')
|
||||
3
src/led_status.py
Normal file
1
src/license
Normal file
@ -0,0 +1 @@
|
||||
gAAAAABn0-rYDgclBAdn9yHHzQ70ZL0G2jlh9OR774Nfj0N6M7_eqMr_K01oAOI8FycV7yLBChe4iaQpNtsnpLaRpXotZtWxt7-AIOEi4591QDXfxpgJIfo_RY57H20-FpDtWCXzei2kFupOVIeoShiyg7fUN1HOO4AurzG64vaoVlylEcl3rZ4=
|
||||
3
src/license_checker.py
Normal file
3
src/printer_admin.py
Normal file
3
src/printer_monitor.py
Normal file
2
src/pyarmor_runtime_000000/__init__.py
Normal file
@ -0,0 +1,2 @@
|
||||
# Pyarmor 9.0.7 (trial), 000000, 2025-03-14T02:02:35.420965
|
||||
from .pyarmor_runtime import __pyarmor__
|
||||
BIN
src/pyarmor_runtime_000000/__pycache__/__init__.cpython-310.pyc
Normal file
BIN
src/pyarmor_runtime_000000/__pycache__/__init__.cpython-311.pyc
Normal file
BIN
src/pyarmor_runtime_000000/pyarmor_runtime.so
Executable file
3
src/resources.py
Normal file
@ -0,0 +1,3 @@
|
||||
# Pyarmor 9.0.7 (trial), 000000, non-profits, 2025-03-14T02:02:36.425013
|
||||
from pyarmor_runtime_000000 import __pyarmor__
|
||||
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x0b\x03\x00\x00\x12\t\x04\x00\xfcN\x18\xea\xa1JKN\xb1\xb4\xf5O?\x92\x1a\xce\x00\x00\x00\x00\x00\x00\x00\x00\xb3d\x87\xc41\xfc\x8fS\x9d\x9aBs\xc0y]b\xaeK\xc2\xc40m\xdc\xbf\xbe\xdf\x8b\xab\xae\x87Fc\x07\x1a\x11n\xbd\xbd\x8fS\x9eZ\x8d\xb5"\xaa\xe8\xc3\x8bdt\xdf\xe7\xdf\x84\xe2r\xda\xf5Z\x00p\xf2\xe5@\x8e\x0e4j\xa5;\xbd\xff\x14?\xf6\xa7\xc4[\x19\x9f\x9b\x1f7\xd0Iy\xcb\xa4\x96\xff\xbeF\x12q0q\xf7>~2\xb5n\x03\x14\x10\xa8\x1f\x1fl\xd4\x8f;\x02\x1d\'\xcf_\xf3\x85\xc4\xe2\x84\xdb\x9c}\xfb\xabF\xe3\xa4A\x97\xd7\x80\xdbz^\x1e\xf3\x95\t\xba\xb2HM\x97\xf9\xa5\x18\xa9\x12\xffY\xa7\x0f\x1b\xca7}C9Q5\xf64^\xe2\xfd{TM\xfe\xb8\xb0\x16\x9bj\x8eJ \xd7\xd3\xc9\xe2\x0fW\xfe\x11C\xb5\xb7\x0e\xe4\xa4\x9b\xad\x9f\xce\xeeb\xf2\xc4HW6\xc2I\xac\xf87\x96\xa8\xc1\xee\x1f\xab@\x9d\xb3|\x85\xbd\xf2\x98\x95\xbb\x1b\xb99\xb7\xca\xf3\x90\x81Tk9R\t+\xb4H\x14\xae\xba8\x02\xe6\xca\x9dm\r]-\xa9b,\x8f\t\xe7m\x1b\x88M\x8f\xb4\x16"\xffT\x04\xda,zV\x82\xa0\x98\x00\x1d\r0i\xa6\xfd\xb3\xef\x18\x13<\xbc\xd9\xf8\xa0 \xedn\xcf\x86\xe4\x91\x10\xd5\xf6\x9a\xe8%|\xc7Rn<Y\xa2\x95\x0f)\xb1\x89P\xd4p9\xb1\x14\xc4Em\xc9%F\x9c\xb5\x985\xcb\x07\xfb\xf7V\xe4\xc8{\xdd\xad?\xc7r\xc1\x8aDA\xbdc\xd6\x0c\xb1\x08f\xe1XE\x1d\xc6\x15@\xe0\xb3\xc5\xbaf\xfa\x90\xb3\xddps\xf3\xd1\xcfqM\xce\xcb\r\xb2\xfc\x95d\x1c\xc4\x8e\x85`\x0f\x92\xad\\v\x07v\x16w2\xe6\xf7h\xab\xbf\xaf\x81e\xea\xaf\xcd\xd6P\xb5\x02x\xf2\xf6\xb0Q\x84)\x1d\x94~\xdc\xfbL/F\x15\xcb,\xc1\xd0G0\xb3\x1dNW\x8fa6F!\xd8\xbf9\xa5k?\x8c\n\'t3\x1a\x1d\xafk\xca\xd4\xda\x8d)\xc6\xf0\xc6\n\x9f\xaa\x1c\xd7b\x8c\xee\x96\x1c\xc9\x9d\xe9\xb0\xf6L\x87m\xeb\xf3\x0eI\xf7\xf3\x93^FL\xa2\xe2\xf1R~\xb9q\xc6K6\xc7\xf9\xee\xce\xc5\x1c\xb7\x8fbQ=\x02\x89\xb1\xbd \xb3\x04\x98,\x05\xddv\x10~\x05\xf2\x158D\xcb\xf2\xef\xeb\xd2\xcc\xd8\r\xd6\x8fe\'\xa66\x8f\xa8I\xe5`\x0bH\xda\xa3W\n\xdc\x05\xfb\xb8\x81\xaax\xed\xe5*\xba\x97\xfe\xbev\xbe\x9aL\xc0\xf0\x88\xf0\xd2V\xeaT\xee\x19\xb1\tT\x1f\xc4\x92\xc0\xc3Z\xcd`\x8e\xc4\xaa\x8e1*\xb3\xc3\xaf\xd9\x15P\x8f-\x8c\x91GD\x92\xf33J#\x1cM\x01\x9b$\xf2\xc5L0\x1e4\xbe_\xebt\x16\x0f\x19x[\xe6\x95m\xb3\xbf\x90Yt\xb6\x16\xa2L\x895\xa2\xcd\x0c\x00Vz\xc7zs\x81*\x81%CU\x98l\x15\xb0\x80\xb8KN\xfa\x9c\xacYg\'\x99\xe5\xc3\xdcb\x15\xc7t\xb8Bk\x96\x04\xf1!G\xef\xfbs\xcf\xe7\xa5\xb3h?\x9c\xd7\xa8\xd8[\r\xb1|\xc6\x0f\xe4\xee\xe1\x10\xd9\xfe\xa5\x9b\xf2\xdf])\x89]x\x01\xee\xb7\xdaR\xc2\xa5\xa2A\xee\x87 w\x19\x1fF\xb3\x01\xae@\xb2\x94\xfd\xbd\xbc&\x8c\xc28\xff\xd7&\xd6\xc1\r5\xb5')
|
||||
3
src/spi_flash.py
Normal file
3
src/systemId.py
Normal file
@ -0,0 +1,3 @@
|
||||
# Pyarmor 9.0.7 (trial), 000000, non-profits, 2025-03-14T02:02:36.557856
|
||||
from pyarmor_runtime_000000 import __pyarmor__
|
||||
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00e\x05\x00\x00\x12\t\x04\x00\xaaQU<z\x0f\xcd\xba\xca$\xc9\xb4JX\xf5]\x00\x00\x00\x00\x00\x00\x00\x00;\t\xf7b+\x13\x01g\xe0\x9e\xdfR\x80\xa7\xca*\xbaAmU\x94z\xd5\x8b\x9d\xc7\x05<A\xb5\x0b$\x81\xdbk3%cT$\'\xc2\x19\x1dgG\x81#\xd5Dc`\xdd[Z\xc8\xff\xee\x1doM\x13\'\xa1j\xa0\xe3:\xbab\xd8TF\xfd\x90H\xbe{\xc1C\x9e\x90\xc1\xda\xbf\xcb\xc5\x0fB\xc4*A\xc5\x87\xca\xe4\xedb-\xb5\xbc\xed\xf9\xec\xb4o\x02\x12^{\x9f\xc1\xaf\x11\x8ey\x85N9^O\x9e\x15\xd4`\xb7\xb1\x92x\x11\xa2Z\xc2s\x89\xdb\x1cO-\xb7\xd7\xe61;\xc6l\x04_ji\x8d%\xba\x901f\n\x90\xc0o\xfdH\x87\xe2<\xab\xc1\xb4\x8c\xf00D{h\xd8p\x0c\x03V\xeeO\x05\x91\xcb\x85\x01z$\xa6\x020D\x8f\xd3\xaeZ4.\xfag\x82\xaf\xcf\x17\xa3\xae\xf7\x0e\x173\xdd\x16\x91\x88-\x1f\x9a\xec%\x1e\x87\x98\x89\x9a\x912I#P}\xd74RTP<\xf0T\xd9\xdf\xbb\xfd\xe8\xf8\x9e\x01\x86\xf1\xdd\xf6Kl\xc0\xd3X\x8f\xc4\xbb\xc9\xff\xa4\x9d\xb6\x02\xae\x13h Sm\xcb\xc3\xe26!\xa8\xafB\xae\xca\x04\x11\xc3\x83\xfa%%w\xce\x82\x8cx"\x85/\x9a\xf7\xbf\x8c\x88\xc9^\xd6b_T\t\xa1U:\xd7s\'\x8cy\xaf\xea\xa6i\xa5&|\xc4\xd6\x17;\xb2\x04\xf7\xeel\xbc\xb0\xe1u\xa9\xe3\x9fO\xaa\x0c\x10\xdc\xb5\x8b\xe8\xa8|~N\x1e\xe7\x06Z;N\xbd\x95_\xa6`,\x97*D\xc0\xd1\r9"\xf2\x8dn\x11\xc3\x0bA\xe2;\x15{S8J\xa52\x00\xd0\x06\xfaYsgU,\x0b\xc9K\xf6\xeey3F1\xc1\xfc\xbf+\x81\xa6\x00\x0b\xa9\xc0\xc9mzN\x82\xb1Ti6\x1f\x98$\xc3\x87\x89\tn*\x18S\t\xcdQ\x83=\x84\xd8\x189\xc8\xf7I\x83\xb3m5\x9a\xf3Q\xb5\xeb[g\x12\xcf=\x19\xb5Z\x1f\x9d%^\x97!;@T\x80\x9c\xc7\xd4y\xb3\x00x\xd2\x0eI\x05\xf0s\xe2\xc0\x83\xb9\xad\x8dl\x0b\x0e5\xf5C\x88\x84w\xde=\x9a\xfe<{\x07\x97}X\x9c\x1f\xba\xe1\xdc\xa9C\xe1:]=v\xb2\x8es\xb6&\xa2\x06\xd9Y\x0cX\xe7\x8e\xf0`#C\xe8#\x9e\x18PFP\xff\xef\xc2R\xc8\xfd?|\xc3W\xd9C\xf4\x0bL\x9b^\x13\xceY\xb6\xee\xc2{\x0b\x0b1\xc3\x99-\xb3\xbe\xd6!l\xd7\xadW\x97\x9b\xddoq\xd2\xd3\x16\xb9\x84\xe6\x04\xf9\xfe[\xc0\x1c\x0bc\xb8>\xa7)(\xe2\xf6\xe8\xea\xe7\xf6\xeb\x8b[\xe7\xce\xd2\xbe\xa8!\xe1\xda\xd1\xce\xa1?Yj%\xb4\x07\x93\x0c\x1d"\xe1\xb9\xe3\xeaXm\xaa\xe3\xd9\x8a-\xac\xb0\xe86d\xad\xb0\xfdY{\xb4@\xadS]\xd0\x8e\xe7M\x08e\xbc/\xa1C\xc2j)\xad\x06\x1eo14\x0bg\x14H\x8a\xc2\x05\xdf\\w\x07\x0c\x1f\xe2R\x06\x02!\xb3|\xe2\xed\x86vZ\xce\x8f4l4R\x15\x170\xa2\x10\xe3\xb9\x06v\'q\xc75\x82\x00\xd6\x15\xa3;am\x93\x9aA\xd5d\x87\xdab\x87\x05\x11\x11\x94\x10\x1ah+G\xf9\x1c8\xeac\xd4uK\xb7h\x8c\x02c\x88\x88\xb6F\xdc\xeb\xeenD\xbdRo\xed\xbf+\xc8DFp\xc8\xf2\xfc\x16\xca\xef\x0b\xb4o\x07\x8e\xaf\x1dh\x19(\xd8\xce\xe4\xb5|\x99\xe3\xb4\xdf58\xea\xa5s\xca\x17i\xc7\xe9\xf9\xef\xf6I_2\xa0\x11\x84\xdf\x08\x1dG\x00zR\xc3d\x87\xcfq\xff\x8e\'\xf2P\x8f\x03\xca\xf4*\x85\xf0\x16\xb3~\x0c\xa5\xdb\xeb\xa7.\xcc&\x14\xba\xf7\xca\xec\xc6\x9cL\x86c\xf3\x8bz\x8d\x8d;$\xf4\x85\xa7\xdfJS;\xbcSi\x83\xfe\x9do\xb7C\x12\x0c\x86\xcb\xcc\xac\x06<\xcf\xb5\xafmO]o\xcc)p\x0c\x84\x85\xf2\xd9\xaaj\xd6F\xc1W\x10\xb1\xebR\xf1\xdb\xfa\xbc\x99\x999\x90\xb6;\t\x83\x0cH\x85\xbe\x8a.\x84@\x01a6\xea\x8c\xc0\xa9\x9c\x08\x95\xa8\xa6R\x08\xdbaU\xce\x9e\xd1\\\x0e\x89Cy%\xad\xb0\xf3\xe4\x10}\x83\x93\xb3B\xe5%\xe4e\xc0P\xb9\xde\x12en\xa9\x1aE\xa0\xa9{\xb1\x05\rV\xfbG\x1c\x7f\xa0\xfe\xb2\xe9&~\xfax{\xc3\\\x9f!\xfb\x1c\x11S\xfff\r\xbc{<\xbe\x8bf`r\x13\\k^a\xa7\\\xd1\xf8\xca+\x15\xf9\xa9\xccG\xb9#\x9f\xbc\xb2\xfb\xfa\xee=5"\x97R\xb6\xa9\xf38\xe72\x07S\xf0?\\h\\w\xa9\xdeC\xfb\x11\xb4\xef_\xc7\xffFH=\x88\xd74\x8b\x0f}\xc9\t\xa8_\x87\x10\xdf\xd8\xc2\xf3\xd0\x9a\xaa\xea\xfee\x80\xe0\xf7x\x0e\x9d\x17\x89\x8euW\x97\xf4=:\x87f\x14\x94df\xb1t\xbdt6\xd7\xf3\x01\x85.\xecE\xdd{\xfc\xb7\x88\x98\xc7RB\xfe\xc3\xb9\xcf&,\xbd&\xc4\x8d\xab2\x7f\xa3\xabQ\xe6n\x0f\x16\x0c?X\x18<|\xc4\xa1OSh\xffL\xc4\xef\x11\x8c\x83He\xc9\x9a\x073\x0e\xbc\xbf:\x81.\xbf\xa5\x95\x9c\xf9\xaeJ\xe7\xce\xd0\xd7\xe4\x02\xea\x9d\xe8V\xe6!\xa0\xd7d\xa9Dk\x14\xd8\xbd\xc4\x01I\x8e\xd0\xf8\x04\x9c\xcbO\x84\xcf\xb4\x01\t\x01\xb3!\t\xb2\xfdnjU\x84W\x8a>\xc6\xd8\xca\xeb\x82\x15\xbb\x9f\x81\xc9\x85\xe0\xa5\x1b\xe3\xea\xc1\x13 rH&&$\xc3\xd4\xbf\x8f\x84/\xbbfx\xb1:\x91\xf9\x8e\xbaC\xe9\x8al~\xa1\x87\x13\xa6\xbb\'\x15\xc4\xe3) x\x8a?\x8bR\x05\xf0\x8d\xf5\t\xfd\xfaV\xbeZ*XQ\xf4\x04s\xe0\xb6\r\x07<\x88\xb7E\xf3\x1f\x1c\xb7\xf4\x10\xbb\xb8\xe5\xae\x9b\x91@\x19\x18r\xc4WS\x18K\x97\xab\x82\xe4\x96g\xce\x18\x08v')
|
||||
3
src/unique_activation.py
Normal file
3
src/wifi_config.py
Normal file
3
src/wsgi.py
Normal file
@ -0,0 +1,3 @@
|
||||
# Pyarmor 9.0.7 (trial), 000000, non-profits, 2025-03-14T02:02:36.778423
|
||||
from pyarmor_runtime_000000 import __pyarmor__
|
||||
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x9a\x01\x00\x00\x12\t\x04\x00\x91F\xcf4\xbeWf\xf6|\xf4\x84\xc4\x82\x82f\xec\x00\x00\x00\x00\x00\x00\x00\x00\xbc\xa3?\xcd\x02\x9b\x98\xf3g\xdc1\xb3\xdb\xc34G\xa0\x03E\xd9G;&b\xa7!\x97\xf3\xf6y\x9dkujO8~\x9f\x03_F&\x9d\x00\x0c\xf1\x9ct\x83|/\xccr\xcf\x9c\x07\x8b9\x89\xef\xd2\xc1\xe2<\xec$\x19\xea\xf5\x04\xc8}\x9e\x83\xa1\x11\xbe\x8a+\x8c\xcf\xf7U~9,gaqA\xeb\x89\x87\xe4\x94\x14r\x98n_\xb1&\xd1R\xa5b\x87(\xc0\xfc\xd7\xca\x17\xde\xbe\x9aU\nFm\r\xb9h\xbf\xd1\xd9\xcb\xab\xe8$\x0e\x1e\xb4i,4%d\xc2G\xefY2b1i\x97M\xb7\x88\x82\x9c\x8c\xef\xdfm\nY)g\xc4\xee\x9d\xda\x83!\xd23\xfe\xce\xa5A\xf1)\xd2k+\xcdsg\xb8\xa9\xef\xa8e\x9f\xd3@\xeb\xab\xf2=|\x14\xb4\xd2\xe7\x14C\x1a;\xe7k\xf8dk>\x8e\xfd\xce\xf7\x0fL\xc5\x0b\x9d\x0e\xae\xd9\x17\xe6\xffx\xbf\xcd\xf7\xf8\xef\x99$-UQ\x0f\xd7|g\xd3n4\xefz\n\x16\xa81\xacPZ\xc3\xa8\xe45\xb6H\x81\xc8#\x81N\xff\xb8;B\xe6\xb7p\xc00@)`\xdd7K\x1cB\xb7\xbar\xb7\x7f^\xf3F\xed\x9d\xf2GX\xb6d\xef1\x18"\xab\xb9n\xefZ\x94\xb0\x94\xf5\xbbo\xeb\x94\x83\xaeR6\n\xfd\xf5/_\x0f\xef\xfd\\Y\xe1"\xc9I\xc4\x19\xf7\x95\xa6:\x8f\xfb\xa3\xa4R\xdb2&.\xbe\xf2\xab\x1f\x11!an\x9d\xe8n\x88\xb6%\xb7\x15\x95s\xcc\xfch\x99\x00Ls\x9be\xaaU\xee\x7f\xde\xa7|a3\xe2A\xa7\xdb\xec6\xaf\x13\xd5yG\x02\xe2"K\x96\xa1q\x84Iv\xd5\xf9\x95\x9c\xfd\xc2\x17\x88_zu')
|
||||
107
static/css/styles.css
Normal file
@ -0,0 +1,107 @@
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background-color: #f0f0f0;
|
||||
}
|
||||
|
||||
.navbar {
|
||||
width: 100%;
|
||||
background-color: black;
|
||||
border-bottom: 2px solid white;
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
align-items: center;
|
||||
box-sizing: border-box; /* Ensure padding and border are included in the width */
|
||||
}
|
||||
|
||||
.navbar-left {
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
.navbar ul {
|
||||
list-style-type: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
position: relative; /* Ensure relative positioning for the submenu */
|
||||
}
|
||||
|
||||
.navbar ul li {
|
||||
float: left;
|
||||
position: relative; /* Ensure relative positioning for the submenu */
|
||||
}
|
||||
|
||||
.navbar ul li a {
|
||||
display: block;
|
||||
color: white;
|
||||
text-align: center;
|
||||
padding: 14px 16px;
|
||||
text-decoration: none;
|
||||
border-right: 1px solid white;
|
||||
}
|
||||
|
||||
.navbar ul li a:hover {
|
||||
background-color: grey;
|
||||
}
|
||||
|
||||
.navbar ul li a.disabled {
|
||||
color: grey;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.navbar ul .submenu {
|
||||
display: none;
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
background-color: black;
|
||||
list-style-type: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border-top: 2px solid white;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.navbar ul .submenu li {
|
||||
float: none;
|
||||
border-right: none;
|
||||
}
|
||||
|
||||
.navbar ul .submenu li a {
|
||||
padding: 10px 16px;
|
||||
border-bottom: 1px solid white;
|
||||
}
|
||||
|
||||
.navbar ul .submenu li a:hover {
|
||||
background-color: grey;
|
||||
}
|
||||
|
||||
.navbar ul li:hover > .submenu {
|
||||
display: block;
|
||||
}
|
||||
|
||||
|
||||
.nav-image {
|
||||
height: 40px;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.content-wrapper {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
box-sizing: border-box; /* Ensure padding and border are included in the width */
|
||||
}
|
||||
|
||||
.content {
|
||||
width: 90%; /* Increased width */
|
||||
max-width: 1400px; /* Increased max-width */
|
||||
text-align: center;
|
||||
box-sizing: border-box; /* Ensure padding and border are included in the width */
|
||||
}
|
||||
|
||||
.content h1 {
|
||||
color: black;
|
||||
}
|
||||
8030
static/fontawesome/css/all.css
vendored
Normal file
9
static/fontawesome/css/all.min.css
vendored
Normal file
1594
static/fontawesome/css/brands.css
vendored
Normal file
6
static/fontawesome/css/brands.min.css
vendored
Normal file
6375
static/fontawesome/css/fontawesome.css
vendored
Normal file
9
static/fontawesome/css/fontawesome.min.css
vendored
Normal file
19
static/fontawesome/css/regular.css
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
:root, :host {
|
||||
--fa-style-family-classic: 'Font Awesome 6 Free';
|
||||
--fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free'; }
|
||||
|
||||
@font-face {
|
||||
font-family: 'Font Awesome 6 Free';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: block;
|
||||
src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }
|
||||
|
||||
.far,
|
||||
.fa-regular {
|
||||
font-weight: 400; }
|
||||
6
static/fontawesome/css/regular.min.css
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}
|
||||
19
static/fontawesome/css/solid.css
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
:root, :host {
|
||||
--fa-style-family-classic: 'Font Awesome 6 Free';
|
||||
--fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free'; }
|
||||
|
||||
@font-face {
|
||||
font-family: 'Font Awesome 6 Free';
|
||||
font-style: normal;
|
||||
font-weight: 900;
|
||||
font-display: block;
|
||||
src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
|
||||
|
||||
.fas,
|
||||
.fa-solid {
|
||||
font-weight: 900; }
|
||||
6
static/fontawesome/css/solid.min.css
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}
|
||||
640
static/fontawesome/css/svg-with-js.css
vendored
Normal file
@ -0,0 +1,640 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
:root, :host {
|
||||
--fa-font-solid: normal 900 1em/1 'Font Awesome 6 Solid';
|
||||
--fa-font-regular: normal 400 1em/1 'Font Awesome 6 Regular';
|
||||
--fa-font-light: normal 300 1em/1 'Font Awesome 6 Light';
|
||||
--fa-font-thin: normal 100 1em/1 'Font Awesome 6 Thin';
|
||||
--fa-font-duotone: normal 900 1em/1 'Font Awesome 6 Duotone';
|
||||
--fa-font-sharp-solid: normal 900 1em/1 'Font Awesome 6 Sharp';
|
||||
--fa-font-sharp-regular: normal 400 1em/1 'Font Awesome 6 Sharp';
|
||||
--fa-font-sharp-light: normal 300 1em/1 'Font Awesome 6 Sharp';
|
||||
--fa-font-sharp-thin: normal 100 1em/1 'Font Awesome 6 Sharp';
|
||||
--fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; }
|
||||
|
||||
svg:not(:root).svg-inline--fa, svg:not(:host).svg-inline--fa {
|
||||
overflow: visible;
|
||||
box-sizing: content-box; }
|
||||
|
||||
.svg-inline--fa {
|
||||
display: var(--fa-display, inline-block);
|
||||
height: 1em;
|
||||
overflow: visible;
|
||||
vertical-align: -.125em; }
|
||||
.svg-inline--fa.fa-2xs {
|
||||
vertical-align: 0.1em; }
|
||||
.svg-inline--fa.fa-xs {
|
||||
vertical-align: 0em; }
|
||||
.svg-inline--fa.fa-sm {
|
||||
vertical-align: -0.07143em; }
|
||||
.svg-inline--fa.fa-lg {
|
||||
vertical-align: -0.2em; }
|
||||
.svg-inline--fa.fa-xl {
|
||||
vertical-align: -0.25em; }
|
||||
.svg-inline--fa.fa-2xl {
|
||||
vertical-align: -0.3125em; }
|
||||
.svg-inline--fa.fa-pull-left {
|
||||
margin-right: var(--fa-pull-margin, 0.3em);
|
||||
width: auto; }
|
||||
.svg-inline--fa.fa-pull-right {
|
||||
margin-left: var(--fa-pull-margin, 0.3em);
|
||||
width: auto; }
|
||||
.svg-inline--fa.fa-li {
|
||||
width: var(--fa-li-width, 2em);
|
||||
top: 0.25em; }
|
||||
.svg-inline--fa.fa-fw {
|
||||
width: var(--fa-fw-width, 1.25em); }
|
||||
|
||||
.fa-layers svg.svg-inline--fa {
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
margin: auto;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0; }
|
||||
|
||||
.fa-layers-text, .fa-layers-counter {
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
text-align: center; }
|
||||
|
||||
.fa-layers {
|
||||
display: inline-block;
|
||||
height: 1em;
|
||||
position: relative;
|
||||
text-align: center;
|
||||
vertical-align: -.125em;
|
||||
width: 1em; }
|
||||
.fa-layers svg.svg-inline--fa {
|
||||
-webkit-transform-origin: center center;
|
||||
transform-origin: center center; }
|
||||
|
||||
.fa-layers-text {
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
-webkit-transform: translate(-50%, -50%);
|
||||
transform: translate(-50%, -50%);
|
||||
-webkit-transform-origin: center center;
|
||||
transform-origin: center center; }
|
||||
|
||||
.fa-layers-counter {
|
||||
background-color: var(--fa-counter-background-color, #ff253a);
|
||||
border-radius: var(--fa-counter-border-radius, 1em);
|
||||
box-sizing: border-box;
|
||||
color: var(--fa-inverse, #fff);
|
||||
line-height: var(--fa-counter-line-height, 1);
|
||||
max-width: var(--fa-counter-max-width, 5em);
|
||||
min-width: var(--fa-counter-min-width, 1.5em);
|
||||
overflow: hidden;
|
||||
padding: var(--fa-counter-padding, 0.25em 0.5em);
|
||||
right: var(--fa-right, 0);
|
||||
text-overflow: ellipsis;
|
||||
top: var(--fa-top, 0);
|
||||
-webkit-transform: scale(var(--fa-counter-scale, 0.25));
|
||||
transform: scale(var(--fa-counter-scale, 0.25));
|
||||
-webkit-transform-origin: top right;
|
||||
transform-origin: top right; }
|
||||
|
||||
.fa-layers-bottom-right {
|
||||
bottom: var(--fa-bottom, 0);
|
||||
right: var(--fa-right, 0);
|
||||
top: auto;
|
||||
-webkit-transform: scale(var(--fa-layers-scale, 0.25));
|
||||
transform: scale(var(--fa-layers-scale, 0.25));
|
||||
-webkit-transform-origin: bottom right;
|
||||
transform-origin: bottom right; }
|
||||
|
||||
.fa-layers-bottom-left {
|
||||
bottom: var(--fa-bottom, 0);
|
||||
left: var(--fa-left, 0);
|
||||
right: auto;
|
||||
top: auto;
|
||||
-webkit-transform: scale(var(--fa-layers-scale, 0.25));
|
||||
transform: scale(var(--fa-layers-scale, 0.25));
|
||||
-webkit-transform-origin: bottom left;
|
||||
transform-origin: bottom left; }
|
||||
|
||||
.fa-layers-top-right {
|
||||
top: var(--fa-top, 0);
|
||||
right: var(--fa-right, 0);
|
||||
-webkit-transform: scale(var(--fa-layers-scale, 0.25));
|
||||
transform: scale(var(--fa-layers-scale, 0.25));
|
||||
-webkit-transform-origin: top right;
|
||||
transform-origin: top right; }
|
||||
|
||||
.fa-layers-top-left {
|
||||
left: var(--fa-left, 0);
|
||||
right: auto;
|
||||
top: var(--fa-top, 0);
|
||||
-webkit-transform: scale(var(--fa-layers-scale, 0.25));
|
||||
transform: scale(var(--fa-layers-scale, 0.25));
|
||||
-webkit-transform-origin: top left;
|
||||
transform-origin: top left; }
|
||||
|
||||
.fa-1x {
|
||||
font-size: 1em; }
|
||||
|
||||
.fa-2x {
|
||||
font-size: 2em; }
|
||||
|
||||
.fa-3x {
|
||||
font-size: 3em; }
|
||||
|
||||
.fa-4x {
|
||||
font-size: 4em; }
|
||||
|
||||
.fa-5x {
|
||||
font-size: 5em; }
|
||||
|
||||
.fa-6x {
|
||||
font-size: 6em; }
|
||||
|
||||
.fa-7x {
|
||||
font-size: 7em; }
|
||||
|
||||
.fa-8x {
|
||||
font-size: 8em; }
|
||||
|
||||
.fa-9x {
|
||||
font-size: 9em; }
|
||||
|
||||
.fa-10x {
|
||||
font-size: 10em; }
|
||||
|
||||
.fa-2xs {
|
||||
font-size: 0.625em;
|
||||
line-height: 0.1em;
|
||||
vertical-align: 0.225em; }
|
||||
|
||||
.fa-xs {
|
||||
font-size: 0.75em;
|
||||
line-height: 0.08333em;
|
||||
vertical-align: 0.125em; }
|
||||
|
||||
.fa-sm {
|
||||
font-size: 0.875em;
|
||||
line-height: 0.07143em;
|
||||
vertical-align: 0.05357em; }
|
||||
|
||||
.fa-lg {
|
||||
font-size: 1.25em;
|
||||
line-height: 0.05em;
|
||||
vertical-align: -0.075em; }
|
||||
|
||||
.fa-xl {
|
||||
font-size: 1.5em;
|
||||
line-height: 0.04167em;
|
||||
vertical-align: -0.125em; }
|
||||
|
||||
.fa-2xl {
|
||||
font-size: 2em;
|
||||
line-height: 0.03125em;
|
||||
vertical-align: -0.1875em; }
|
||||
|
||||
.fa-fw {
|
||||
text-align: center;
|
||||
width: 1.25em; }
|
||||
|
||||
.fa-ul {
|
||||
list-style-type: none;
|
||||
margin-left: var(--fa-li-margin, 2.5em);
|
||||
padding-left: 0; }
|
||||
.fa-ul > li {
|
||||
position: relative; }
|
||||
|
||||
.fa-li {
|
||||
left: calc(var(--fa-li-width, 2em) * -1);
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
width: var(--fa-li-width, 2em);
|
||||
line-height: inherit; }
|
||||
|
||||
.fa-border {
|
||||
border-color: var(--fa-border-color, #eee);
|
||||
border-radius: var(--fa-border-radius, 0.1em);
|
||||
border-style: var(--fa-border-style, solid);
|
||||
border-width: var(--fa-border-width, 0.08em);
|
||||
padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); }
|
||||
|
||||
.fa-pull-left {
|
||||
float: left;
|
||||
margin-right: var(--fa-pull-margin, 0.3em); }
|
||||
|
||||
.fa-pull-right {
|
||||
float: right;
|
||||
margin-left: var(--fa-pull-margin, 0.3em); }
|
||||
|
||||
.fa-beat {
|
||||
-webkit-animation-name: fa-beat;
|
||||
animation-name: fa-beat;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);
|
||||
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
|
||||
|
||||
.fa-bounce {
|
||||
-webkit-animation-name: fa-bounce;
|
||||
animation-name: fa-bounce;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); }
|
||||
|
||||
.fa-fade {
|
||||
-webkit-animation-name: fa-fade;
|
||||
animation-name: fa-fade;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
|
||||
|
||||
.fa-beat-fade {
|
||||
-webkit-animation-name: fa-beat-fade;
|
||||
animation-name: fa-beat-fade;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
|
||||
|
||||
.fa-flip {
|
||||
-webkit-animation-name: fa-flip;
|
||||
animation-name: fa-flip;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);
|
||||
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
|
||||
|
||||
.fa-shake {
|
||||
-webkit-animation-name: fa-shake;
|
||||
animation-name: fa-shake;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, linear);
|
||||
animation-timing-function: var(--fa-animation-timing, linear); }
|
||||
|
||||
.fa-spin {
|
||||
-webkit-animation-name: fa-spin;
|
||||
animation-name: fa-spin;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 2s);
|
||||
animation-duration: var(--fa-animation-duration, 2s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, linear);
|
||||
animation-timing-function: var(--fa-animation-timing, linear); }
|
||||
|
||||
.fa-spin-reverse {
|
||||
--fa-animation-direction: reverse; }
|
||||
|
||||
.fa-pulse,
|
||||
.fa-spin-pulse {
|
||||
-webkit-animation-name: fa-spin;
|
||||
animation-name: fa-spin;
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, steps(8));
|
||||
animation-timing-function: var(--fa-animation-timing, steps(8)); }
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.fa-beat,
|
||||
.fa-bounce,
|
||||
.fa-fade,
|
||||
.fa-beat-fade,
|
||||
.fa-flip,
|
||||
.fa-pulse,
|
||||
.fa-shake,
|
||||
.fa-spin,
|
||||
.fa-spin-pulse {
|
||||
-webkit-animation-delay: -1ms;
|
||||
animation-delay: -1ms;
|
||||
-webkit-animation-duration: 1ms;
|
||||
animation-duration: 1ms;
|
||||
-webkit-animation-iteration-count: 1;
|
||||
animation-iteration-count: 1;
|
||||
-webkit-transition-delay: 0s;
|
||||
transition-delay: 0s;
|
||||
-webkit-transition-duration: 0s;
|
||||
transition-duration: 0s; } }
|
||||
|
||||
@-webkit-keyframes fa-beat {
|
||||
0%, 90% {
|
||||
-webkit-transform: scale(1);
|
||||
transform: scale(1); }
|
||||
45% {
|
||||
-webkit-transform: scale(var(--fa-beat-scale, 1.25));
|
||||
transform: scale(var(--fa-beat-scale, 1.25)); } }
|
||||
|
||||
@keyframes fa-beat {
|
||||
0%, 90% {
|
||||
-webkit-transform: scale(1);
|
||||
transform: scale(1); }
|
||||
45% {
|
||||
-webkit-transform: scale(var(--fa-beat-scale, 1.25));
|
||||
transform: scale(var(--fa-beat-scale, 1.25)); } }
|
||||
|
||||
@-webkit-keyframes fa-bounce {
|
||||
0% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
10% {
|
||||
-webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);
|
||||
transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
|
||||
30% {
|
||||
-webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));
|
||||
transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
|
||||
50% {
|
||||
-webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);
|
||||
transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
|
||||
57% {
|
||||
-webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));
|
||||
transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
|
||||
64% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
100% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); } }
|
||||
|
||||
@keyframes fa-bounce {
|
||||
0% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
10% {
|
||||
-webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);
|
||||
transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
|
||||
30% {
|
||||
-webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));
|
||||
transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
|
||||
50% {
|
||||
-webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);
|
||||
transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
|
||||
57% {
|
||||
-webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));
|
||||
transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
|
||||
64% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
100% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); } }
|
||||
|
||||
@-webkit-keyframes fa-fade {
|
||||
50% {
|
||||
opacity: var(--fa-fade-opacity, 0.4); } }
|
||||
|
||||
@keyframes fa-fade {
|
||||
50% {
|
||||
opacity: var(--fa-fade-opacity, 0.4); } }
|
||||
|
||||
@-webkit-keyframes fa-beat-fade {
|
||||
0%, 100% {
|
||||
opacity: var(--fa-beat-fade-opacity, 0.4);
|
||||
-webkit-transform: scale(1);
|
||||
transform: scale(1); }
|
||||
50% {
|
||||
opacity: 1;
|
||||
-webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));
|
||||
transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
|
||||
|
||||
@keyframes fa-beat-fade {
|
||||
0%, 100% {
|
||||
opacity: var(--fa-beat-fade-opacity, 0.4);
|
||||
-webkit-transform: scale(1);
|
||||
transform: scale(1); }
|
||||
50% {
|
||||
opacity: 1;
|
||||
-webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));
|
||||
transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
|
||||
|
||||
@-webkit-keyframes fa-flip {
|
||||
50% {
|
||||
-webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));
|
||||
transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
|
||||
|
||||
@keyframes fa-flip {
|
||||
50% {
|
||||
-webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));
|
||||
transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
|
||||
|
||||
@-webkit-keyframes fa-shake {
|
||||
0% {
|
||||
-webkit-transform: rotate(-15deg);
|
||||
transform: rotate(-15deg); }
|
||||
4% {
|
||||
-webkit-transform: rotate(15deg);
|
||||
transform: rotate(15deg); }
|
||||
8%, 24% {
|
||||
-webkit-transform: rotate(-18deg);
|
||||
transform: rotate(-18deg); }
|
||||
12%, 28% {
|
||||
-webkit-transform: rotate(18deg);
|
||||
transform: rotate(18deg); }
|
||||
16% {
|
||||
-webkit-transform: rotate(-22deg);
|
||||
transform: rotate(-22deg); }
|
||||
20% {
|
||||
-webkit-transform: rotate(22deg);
|
||||
transform: rotate(22deg); }
|
||||
32% {
|
||||
-webkit-transform: rotate(-12deg);
|
||||
transform: rotate(-12deg); }
|
||||
36% {
|
||||
-webkit-transform: rotate(12deg);
|
||||
transform: rotate(12deg); }
|
||||
40%, 100% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg); } }
|
||||
|
||||
@keyframes fa-shake {
|
||||
0% {
|
||||
-webkit-transform: rotate(-15deg);
|
||||
transform: rotate(-15deg); }
|
||||
4% {
|
||||
-webkit-transform: rotate(15deg);
|
||||
transform: rotate(15deg); }
|
||||
8%, 24% {
|
||||
-webkit-transform: rotate(-18deg);
|
||||
transform: rotate(-18deg); }
|
||||
12%, 28% {
|
||||
-webkit-transform: rotate(18deg);
|
||||
transform: rotate(18deg); }
|
||||
16% {
|
||||
-webkit-transform: rotate(-22deg);
|
||||
transform: rotate(-22deg); }
|
||||
20% {
|
||||
-webkit-transform: rotate(22deg);
|
||||
transform: rotate(22deg); }
|
||||
32% {
|
||||
-webkit-transform: rotate(-12deg);
|
||||
transform: rotate(-12deg); }
|
||||
36% {
|
||||
-webkit-transform: rotate(12deg);
|
||||
transform: rotate(12deg); }
|
||||
40%, 100% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg); } }
|
||||
|
||||
@-webkit-keyframes fa-spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg); }
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg); } }
|
||||
|
||||
@keyframes fa-spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg); }
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg); } }
|
||||
|
||||
.fa-rotate-90 {
|
||||
-webkit-transform: rotate(90deg);
|
||||
transform: rotate(90deg); }
|
||||
|
||||
.fa-rotate-180 {
|
||||
-webkit-transform: rotate(180deg);
|
||||
transform: rotate(180deg); }
|
||||
|
||||
.fa-rotate-270 {
|
||||
-webkit-transform: rotate(270deg);
|
||||
transform: rotate(270deg); }
|
||||
|
||||
.fa-flip-horizontal {
|
||||
-webkit-transform: scale(-1, 1);
|
||||
transform: scale(-1, 1); }
|
||||
|
||||
.fa-flip-vertical {
|
||||
-webkit-transform: scale(1, -1);
|
||||
transform: scale(1, -1); }
|
||||
|
||||
.fa-flip-both,
|
||||
.fa-flip-horizontal.fa-flip-vertical {
|
||||
-webkit-transform: scale(-1, -1);
|
||||
transform: scale(-1, -1); }
|
||||
|
||||
.fa-rotate-by {
|
||||
-webkit-transform: rotate(var(--fa-rotate-angle, 0));
|
||||
transform: rotate(var(--fa-rotate-angle, 0)); }
|
||||
|
||||
.fa-stack {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
height: 2em;
|
||||
position: relative;
|
||||
width: 2.5em; }
|
||||
|
||||
.fa-stack-1x,
|
||||
.fa-stack-2x {
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
margin: auto;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
z-index: var(--fa-stack-z-index, auto); }
|
||||
|
||||
.svg-inline--fa.fa-stack-1x {
|
||||
height: 1em;
|
||||
width: 1.25em; }
|
||||
|
||||
.svg-inline--fa.fa-stack-2x {
|
||||
height: 2em;
|
||||
width: 2.5em; }
|
||||
|
||||
.fa-inverse {
|
||||
color: var(--fa-inverse, #fff); }
|
||||
|
||||
.sr-only,
|
||||
.fa-sr-only {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
white-space: nowrap;
|
||||
border-width: 0; }
|
||||
|
||||
.sr-only-focusable:not(:focus),
|
||||
.fa-sr-only-focusable:not(:focus) {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
white-space: nowrap;
|
||||
border-width: 0; }
|
||||
|
||||
.svg-inline--fa .fa-primary {
|
||||
fill: var(--fa-primary-color, currentColor);
|
||||
opacity: var(--fa-primary-opacity, 1); }
|
||||
|
||||
.svg-inline--fa .fa-secondary {
|
||||
fill: var(--fa-secondary-color, currentColor);
|
||||
opacity: var(--fa-secondary-opacity, 0.4); }
|
||||
|
||||
.svg-inline--fa.fa-swap-opacity .fa-primary {
|
||||
opacity: var(--fa-secondary-opacity, 0.4); }
|
||||
|
||||
.svg-inline--fa.fa-swap-opacity .fa-secondary {
|
||||
opacity: var(--fa-primary-opacity, 1); }
|
||||
|
||||
.svg-inline--fa mask .fa-primary,
|
||||
.svg-inline--fa mask .fa-secondary {
|
||||
fill: black; }
|
||||
|
||||
.fad.fa-inverse,
|
||||
.fa-duotone.fa-inverse {
|
||||
color: var(--fa-inverse, #fff); }
|
||||
6
static/fontawesome/css/svg-with-js.min.css
vendored
Normal file
26
static/fontawesome/css/v4-font-face.css
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'FontAwesome';
|
||||
font-display: block;
|
||||
src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
|
||||
|
||||
@font-face {
|
||||
font-family: 'FontAwesome';
|
||||
font-display: block;
|
||||
src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }
|
||||
|
||||
@font-face {
|
||||
font-family: 'FontAwesome';
|
||||
font-display: block;
|
||||
src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype");
|
||||
unicode-range: U+F003,U+F006,U+F014,U+F016-F017,U+F01A-F01B,U+F01D,U+F022,U+F03E,U+F044,U+F046,U+F05C-F05D,U+F06E,U+F070,U+F087-F088,U+F08A,U+F094,U+F096-F097,U+F09D,U+F0A0,U+F0A2,U+F0A4-F0A7,U+F0C5,U+F0C7,U+F0E5-F0E6,U+F0EB,U+F0F6-F0F8,U+F10C,U+F114-F115,U+F118-F11A,U+F11C-F11D,U+F133,U+F147,U+F14E,U+F150-F152,U+F185-F186,U+F18E,U+F190-F192,U+F196,U+F1C1-F1C9,U+F1D9,U+F1DB,U+F1E3,U+F1EA,U+F1F7,U+F1F9,U+F20A,U+F247-F248,U+F24A,U+F24D,U+F255-F25B,U+F25D,U+F271-F274,U+F278,U+F27B,U+F28C,U+F28E,U+F29C,U+F2B5,U+F2B7,U+F2BA,U+F2BC,U+F2BE,U+F2C0-F2C1,U+F2C3,U+F2D0,U+F2D2,U+F2D4,U+F2DC; }
|
||||
|
||||
@font-face {
|
||||
font-family: 'FontAwesome';
|
||||
font-display: block;
|
||||
src: url("../webfonts/fa-v4compatibility.woff2") format("woff2"), url("../webfonts/fa-v4compatibility.ttf") format("truetype");
|
||||
unicode-range: U+F041,U+F047,U+F065-F066,U+F07D-F07E,U+F080,U+F08B,U+F08E,U+F090,U+F09A,U+F0AC,U+F0AE,U+F0B2,U+F0D0,U+F0D6,U+F0E4,U+F0EC,U+F10A-F10B,U+F123,U+F13E,U+F148-F149,U+F14C,U+F156,U+F15E,U+F160-F161,U+F163,U+F175-F178,U+F195,U+F1F8,U+F219,U+F27A; }
|
||||
6
static/fontawesome/css/v4-font-face.min.css
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a}
|
||||
2194
static/fontawesome/css/v4-shims.css
vendored
Normal file
6
static/fontawesome/css/v4-shims.min.css
vendored
Normal file
22
static/fontawesome/css/v5-font-face.css
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Font Awesome 5 Brands';
|
||||
font-display: block;
|
||||
font-weight: 400;
|
||||
src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }
|
||||
|
||||
@font-face {
|
||||
font-family: 'Font Awesome 5 Free';
|
||||
font-display: block;
|
||||
font-weight: 900;
|
||||
src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
|
||||
|
||||
@font-face {
|
||||
font-family: 'Font Awesome 5 Free';
|
||||
font-display: block;
|
||||
font-weight: 400;
|
||||
src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }
|
||||
6
static/fontawesome/css/v5-font-face.min.css
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}
|
||||
BIN
static/fontawesome/webfonts/fa-brands-400.ttf
Normal file
BIN
static/fontawesome/webfonts/fa-brands-400.woff2
Normal file
BIN
static/fontawesome/webfonts/fa-regular-400.ttf
Normal file
BIN
static/fontawesome/webfonts/fa-regular-400.woff2
Normal file
BIN
static/fontawesome/webfonts/fa-solid-900.ttf
Normal file
BIN
static/fontawesome/webfonts/fa-solid-900.woff2
Normal file
BIN
static/fontawesome/webfonts/fa-v4compatibility.ttf
Normal file
BIN
static/fontawesome/webfonts/fa-v4compatibility.woff2
Normal file
18
static/html/nav.html
Normal file
@ -0,0 +1,18 @@
|
||||
<nav class="navbar">
|
||||
<div class="navbar-left">
|
||||
<img src="/static/images/printio_white_logo.png" alt="Left Image" class="nav-image">
|
||||
</div>
|
||||
<ul>
|
||||
<li><a href="/"><i class="fas fa-home"></i> Home</a></li>
|
||||
<li><a href="/internet"><i class="fas fa-globe"></i> Internet</a></li>
|
||||
<!--<li><a href="#" class="disabled"><i class="fas fa-wifi"></i> Hotspot</a></li>-->
|
||||
<li>
|
||||
<a href="#"><i class="fas fa-cog"></i> System</a>
|
||||
<ul class="submenu">
|
||||
<li><a href="/mediaconfig"><i class="fas fa-wrench"></i> Config</a></li>
|
||||
<li><a href="/static/html/power.html"><i class="fas fa-power-off"></i> Power</a></li>
|
||||
<li><a href="/about"><i class="fas fa-info-circle"></i> About</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
119
static/html/power.html
Normal file
@ -0,0 +1,119 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Printer Media Sizes</title>
|
||||
<link rel="icon" type="image/x-icon" href="/static/images/favicon.ico">
|
||||
<link rel="stylesheet" href="/static/css/styles.css">
|
||||
<link rel="stylesheet" href="/static/fontawesome/css/all.min.css">
|
||||
<script src="/static/js/jquery-3.7.1.js"></script>
|
||||
<style>
|
||||
|
||||
.header-img {
|
||||
margin-top: 30px; /* Adjust the margin as needed */
|
||||
margin-bottom: 30px;
|
||||
width: auto;
|
||||
height: 70px; /* Adjust the height as needed */
|
||||
}
|
||||
.center-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
h1 {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
label, select, #media-sizes, button {
|
||||
margin: 5px 0;
|
||||
text-align: center;
|
||||
font-size: larger;
|
||||
font-weight: 200;
|
||||
}
|
||||
|
||||
select {
|
||||
padding: 3px;
|
||||
font-size: 1.1em;
|
||||
width: 250px;
|
||||
}
|
||||
|
||||
#media-sizes ul {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#media-sizes li {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
#media-sizes input[type="checkbox"] {
|
||||
transform: scale(1.5);
|
||||
margin-right: 12px;
|
||||
}
|
||||
|
||||
#media-sizes span {
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
button {
|
||||
background-color: red;
|
||||
color: white;
|
||||
padding: 10px 20px;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
font-size: 1.2em;
|
||||
cursor: pointer;
|
||||
width: 150px;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background-color: darkblue;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="navbar"></div>
|
||||
<script>
|
||||
fetch('/static/html/nav.html')
|
||||
.then(response => response.text())
|
||||
.then(data => {
|
||||
document.getElementById('navbar').innerHTML = data;
|
||||
});
|
||||
</script>
|
||||
|
||||
<div class="content-wrapper">
|
||||
<div class="content center-content">
|
||||
<h1>Power Options</h1>
|
||||
<img src="/static/images/switch-icon.png" alt="cards" class="header-img">
|
||||
<button id="reboot-button">Reboot</button>
|
||||
<button id="shutdown-button">Shutdown</button>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
|
||||
$('#reboot-button').click(function() {
|
||||
$.post('/reboot', function(response) {
|
||||
alert("Reboot initiated");
|
||||
}).fail(function() {
|
||||
alert("Reboot failed");
|
||||
});
|
||||
});
|
||||
|
||||
$('#shutdown-button').click(function() {
|
||||
$.post('/shutdown', function(response) {
|
||||
alert("Shutdown initiated");
|
||||
}).fail(function() {
|
||||
alert("Shutdown failed");
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
</html>
|
||||
23
static/html/status.html
Normal file
@ -0,0 +1,23 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Status</title>
|
||||
<link rel="stylesheet" href="/static/css/styles.css">
|
||||
<link rel="stylesheet" href="/static/fontawesome/css/all.min.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="navbar"></div>
|
||||
<div class="content">
|
||||
<h1>Status Page</h1>
|
||||
</div>
|
||||
<script>
|
||||
fetch('/static/html/nav.html')
|
||||
.then(response => response.text())
|
||||
.then(data => {
|
||||
document.getElementById('navbar').innerHTML = data;
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
BIN
static/images/ata_print_test.jpg
Normal file
|
After Width: | Height: | Size: 224 KiB |
BIN
static/images/color_cards.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
static/images/favicon.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
static/images/internet_icon.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
static/images/printio_help_qr.jpg
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
static/images/printio_logo.png
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
static/images/printio_white_logo.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
static/images/switch-icon.png
Normal file
|
After Width: | Height: | Size: 9.0 KiB |
1
static/js/crypto-js.min.js
vendored
Normal file
29
static/js/data-request.js
Normal file
@ -0,0 +1,29 @@
|
||||
function requestJsonFromServer(route) {
|
||||
return fetch(route)
|
||||
.then(response => {
|
||||
if (!response.ok) {
|
||||
throw new Error('Network response was not ok');
|
||||
}
|
||||
return response.json(); // Assuming the server returns a JSON response
|
||||
})
|
||||
.then(jsonData => {
|
||||
//console.log('Received JSON data:', jsonData);
|
||||
return jsonData; // Return the JSON data
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('There was a problem with the fetch operation:', error);
|
||||
return null; // Return null in case of an error
|
||||
});
|
||||
}
|
||||
|
||||
/* Example usage
|
||||
requestJsonFromServer('/get_data')
|
||||
.then(data => {
|
||||
if (data !== null) {
|
||||
console.log("Data received:", data);
|
||||
// You can process the data here as needed
|
||||
} else {
|
||||
console.log("Failed to retrieve data from the server.");
|
||||
}
|
||||
});
|
||||
*/
|
||||
10716
static/js/jquery-3.7.1.js
vendored
Normal file
77
static/js/printers copy.js
Normal file
@ -0,0 +1,77 @@
|
||||
$(document).ready(function() {
|
||||
console.log('Document is ready');
|
||||
|
||||
var printersData = [];
|
||||
|
||||
// Fetch printer data from the server when the page loads
|
||||
$.get('/get_printers', function(data) {
|
||||
console.log('Fetched printer data:', data);
|
||||
printersData = data;
|
||||
data.forEach(function(printer) {
|
||||
$('#printers').append(new Option(printer["display-name"], printer["display-name"]));
|
||||
});
|
||||
console.log('Printers dropdown populated');
|
||||
}).fail(function() {
|
||||
console.error('Failed to fetch printer data');
|
||||
});
|
||||
|
||||
// Handle printer selection change
|
||||
$('#printers').change(function() {
|
||||
var selectedPrinter = $(this).val();
|
||||
console.log('Printer selected:', selectedPrinter);
|
||||
if (selectedPrinter) {
|
||||
var printer = printersData.find(p => p["display-name"] === selectedPrinter);
|
||||
console.log('Selected printer data:', printer);
|
||||
if (printer) {
|
||||
var mediaSizesHtml = '<ul>';
|
||||
printer['media-sizes'].forEach(function(media) {
|
||||
mediaSizesHtml += '<li>';
|
||||
mediaSizesHtml += '<input type="checkbox" ' + (media.enabled ? 'checked' : '') + '>';
|
||||
mediaSizesHtml += '<span>' + media['media-size-display'] + ' - (' + media['capacity'] + ')' + '</span>';
|
||||
mediaSizesHtml += '</li>';
|
||||
});
|
||||
mediaSizesHtml += '</ul>';
|
||||
$('#media-sizes').html(mediaSizesHtml);
|
||||
console.log('Media sizes displayed for selected printer');
|
||||
}
|
||||
} else {
|
||||
$('#media-sizes').html('');
|
||||
console.log('No printer selected, media sizes cleared');
|
||||
}
|
||||
});
|
||||
|
||||
// Handle save button click
|
||||
$('#save').click(function() {
|
||||
var selectedPrinter = $('#printers').val();
|
||||
console.log('Save button clicked for printer:', selectedPrinter);
|
||||
if (selectedPrinter) {
|
||||
var printer = printersData.find(p => p["display-name"] === selectedPrinter);
|
||||
if (printer) {
|
||||
printer['media-sizes'] = [];
|
||||
$('#media-sizes li').each(function() {
|
||||
var enabled = $(this).find('input').is(':checked');
|
||||
var mediaSizeDisplay = $(this).find('span').text();
|
||||
var mediaSize = mediaSizeDisplay.match(/\(([^)]+)\)/)[1]; // Extract media-size from display text
|
||||
printer['media-sizes'].push({ "enabled": enabled, "media-size": mediaSize, "media-size-display": mediaSizeDisplay });
|
||||
});
|
||||
console.log('Updated printer data to be saved:', printersData);
|
||||
$.ajax({
|
||||
url: '/save_printers',
|
||||
type: 'POST',
|
||||
contentType: 'application/json',
|
||||
data: JSON.stringify(printersData),
|
||||
success: function(response) {
|
||||
console.log('Save response:', response);
|
||||
alert('Changes saved successfully!');
|
||||
},
|
||||
error: function() {
|
||||
console.error('Failed to save changes');
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
console.warn('Please select a printer before saving');
|
||||
alert('Please select a printer.');
|
||||
}
|
||||
});
|
||||
});
|
||||
72
static/js/printers.js
Normal file
@ -0,0 +1,72 @@
|
||||
$(document).ready(function() {
|
||||
var printersData = [];
|
||||
|
||||
// Fetch printer data from the server when the page loads
|
||||
$.get('/get_printers', function(data) {
|
||||
printersData = data;
|
||||
data.forEach(function(printer) {
|
||||
$('#printers').append(new Option(printer["display-name"], printer["display-name"]));
|
||||
});
|
||||
}).fail(function() {
|
||||
console.error('Failed to fetch printer data');
|
||||
});
|
||||
|
||||
// Handle printer selection change
|
||||
$('#printers').change(function() {
|
||||
var selectedPrinter = $(this).val();
|
||||
if (selectedPrinter) {
|
||||
var printer = printersData.find(p => p["display-name"] === selectedPrinter);
|
||||
if (printer) {
|
||||
var mediaSizesHtml = '<ul>';
|
||||
printer['media-sizes'].forEach(function(media) {
|
||||
mediaSizesHtml += '<li>';
|
||||
mediaSizesHtml += '<input type="checkbox" ' + (media.enabled ? 'checked' : '') + '>';
|
||||
mediaSizesHtml += '<span>' + 'Size = ' + media['media-size-display'] + ' - cap = ' + media['capacity'] + '</span>';
|
||||
mediaSizesHtml += '</li>';
|
||||
});
|
||||
mediaSizesHtml += '</ul>';
|
||||
$('#media-sizes').html(mediaSizesHtml);
|
||||
}
|
||||
} else {
|
||||
$('#media-sizes').html('');
|
||||
}
|
||||
});
|
||||
|
||||
// Handle checkbox change event
|
||||
$(document).on('change', '#media-sizes input[type="checkbox"]', function() {
|
||||
var selectedPrinter = $('#printers').val();
|
||||
if (selectedPrinter) {
|
||||
var printer = printersData.find(p => p["display-name"] === selectedPrinter);
|
||||
if (printer) {
|
||||
$('#media-sizes li').each(function(index) {
|
||||
var enabled = $(this).find('input').is(':checked');
|
||||
printer['media-sizes'][index].enabled = enabled;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Handle save button click
|
||||
$('#save').click(function() {
|
||||
var selectedPrinter = $('#printers').val();
|
||||
if (selectedPrinter) {
|
||||
var printer = printersData.find(p => p["display-name"] === selectedPrinter);
|
||||
if (printer) {
|
||||
$.ajax({
|
||||
url: '/save_printers',
|
||||
type: 'POST',
|
||||
contentType: 'application/json',
|
||||
data: JSON.stringify(printersData),
|
||||
success: function(response) {
|
||||
alert('Changes saved successfully!');
|
||||
},
|
||||
error: function() {
|
||||
console.error('Failed to save changes');
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
alert('Please select a printer.');
|
||||
}
|
||||
});
|
||||
});
|
||||
51
systemd/bash/overlayfs_mount.sh
Normal file
@ -0,0 +1,51 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# Function to create and mount overlay
|
||||
mount_overlay() {
|
||||
local target_dir=$1
|
||||
local size=$2
|
||||
|
||||
# Create base directory
|
||||
if [ ! -d "/overlayfs/${target_dir}" ]; then
|
||||
sudo mkdir -p "/overlayfs/${target_dir}"
|
||||
sudo chmod 755 "/overlayfs/${target_dir}"
|
||||
fi
|
||||
|
||||
# Mount tmpfs
|
||||
if ! mountpoint -q "/overlayfs/${target_dir}"; then
|
||||
sudo mount -t tmpfs -o size=${size} tmpfs "/overlayfs/${target_dir}" -o mode=0755
|
||||
echo "mounted tmpfs ${target_dir}"
|
||||
fi
|
||||
|
||||
# Create upper and work directories
|
||||
if [ ! -d "/overlayfs/${target_dir}/upper" ]; then
|
||||
sudo mkdir -p "/overlayfs/${target_dir}/upper"
|
||||
sudo chmod 755 "/overlayfs/${target_dir}/upper"
|
||||
fi
|
||||
if [ ! -d "/overlayfs/${target_dir}/work" ]; then
|
||||
sudo mkdir -p "/overlayfs/${target_dir}/work"
|
||||
sudo chmod 755 "/overlayfs/${target_dir}/work"
|
||||
fi
|
||||
|
||||
# Mount overlay
|
||||
if ! mountpoint -q "${target_dir}"; then
|
||||
sudo mount -t overlay overlay -o lowerdir="${target_dir}",upperdir="/overlayfs/${target_dir}/upper",workdir="/overlayfs/${target_dir}/work" "${target_dir}"
|
||||
echo "mounted overlay ${target_dir}"
|
||||
fi
|
||||
}
|
||||
|
||||
# /var directory with max RAM size
|
||||
#mount_overlay /etc 100M
|
||||
|
||||
# /var directory with max RAM size
|
||||
mount_overlay /var 200M
|
||||
|
||||
# /tmp directory with max RAM size
|
||||
mount_overlay /tmp 100M
|
||||
|
||||
# /run directory with max RAM size
|
||||
mount_overlay /run 100M
|
||||
|
||||
echo "OverlayFS setup completed successfully."
|
||||
53
systemd/bash/overlayfs_unmount.sh
Normal file
@ -0,0 +1,53 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# Function to unmount overlay and tmpfs, and remove directories
|
||||
unmount_overlay() {
|
||||
local target_dir=$1
|
||||
local base_dir="/overlayfs/${target_dir}"
|
||||
|
||||
# Unmount tmpfs
|
||||
if mountpoint -q "${base_dir}"; then
|
||||
echo "Unmounting tmpfs from ${base_dir}"
|
||||
echo "Command: sudo umount -l ${base_dir}"
|
||||
sudo umount -l "${base_dir}" || { echo "Failed to unmount tmpfs from ${base_dir}"; exit 1; }
|
||||
echo "Unmounted tmpfs from ${base_dir}"
|
||||
else
|
||||
echo "No tmpfs mounted on ${base_dir}"
|
||||
fi
|
||||
|
||||
# Unmount overlay
|
||||
if mountpoint -q "/${target_dir}"; then
|
||||
echo "Unmounting overlay from ${target_dir}"
|
||||
echo "Command: sudo umount -l /${target_dir}"
|
||||
sudo umount -l /"${target_dir}" || { echo "Failed to unmount overlay from ${target_dir}"; exit 1; }
|
||||
echo "Unmounted overlay from ${target_dir}"
|
||||
else
|
||||
echo "No overlay mounted on ${target_dir}"
|
||||
fi
|
||||
|
||||
# Remove directories
|
||||
if [ -d "${base_dir}" ]; then
|
||||
echo "Clearing work and upper directories in ${base_dir}"
|
||||
sudo rm -rf "${base_dir}/work/*"
|
||||
sudo rm -rf "${base_dir}/upper/*"
|
||||
echo "Removed work and upper directories in ${base_dir}"
|
||||
else
|
||||
echo "Directory ${base_dir} does not exist"
|
||||
fi
|
||||
}
|
||||
|
||||
# /var directory
|
||||
unmount_overlay etc
|
||||
|
||||
# /var directory
|
||||
unmount_overlay var
|
||||
|
||||
# /tmp directory
|
||||
unmount_overlay tmp
|
||||
|
||||
# /run directory
|
||||
unmount_overlay run
|
||||
|
||||
echo "OverlayFS cleanup completed successfully."
|
||||
36
systemd/commands.txt
Normal file
@ -0,0 +1,36 @@
|
||||
# Start app service
|
||||
sudo systemctl start printio
|
||||
sudo systemctl stop printio
|
||||
sudo systemctl enable printio
|
||||
sudo ln -s /home/orangepi/printio/systemd/printio.service /etc/systemd/system/printio.service
|
||||
|
||||
|
||||
#Start OverlayFS Mount service
|
||||
sudo systemctl enable overlayfs_mount
|
||||
sudo ln -s /home/orangepi/printio/systemd/overlayfs_mount.service /etc/systemd/system/overlayfs_mount.service
|
||||
|
||||
|
||||
|
||||
# Testing command
|
||||
PYTHONPATH=/home/orangepi/printio/src /home/orangepi/printio/.venv/bin/gunicorn --workers 1 --bind unix:/home/orangepi/printio/src/flaskapp.sock -m 007 wsgi:app
|
||||
|
||||
|
||||
|
||||
sudo ln -s /home/orangepi/printio/systemd/printio.service /etc/systemd/system/printio.service
|
||||
sudo ln -s /home/orangepi/printio/systemd/overlayfs_mount.service /etc/systemd/system/overlayfs_mount.service
|
||||
sudo systemctl enable printio
|
||||
sudo systemctl enable overlayfs_mount
|
||||
|
||||
|
||||
# Stop Overlay to make system changes
|
||||
sudo bash /home/orangepi/printio/systemd/bash/overlayfs_unmount.sh
|
||||
|
||||
|
||||
|
||||
#socket permissions
|
||||
#sudo chmod 775 /home/orangepi/printio
|
||||
sudo chown www-data:www-data /home/orangepi/printio/src/flaskapp.sock
|
||||
sudo chmod 660 /home/orangepi/printio/src/flaskapp.sock
|
||||
sudo chmod +x /home/orangepi/
|
||||
sudo chmod +x /home/orangepi/printio/
|
||||
sudo chmod +x /home/orangepi/printio/src/
|
||||
17
systemd/overlayfs_mount.service
Normal file
@ -0,0 +1,17 @@
|
||||
[Unit]
|
||||
Description=Mount OverlayFS at Boot
|
||||
DefaultDependencies=no
|
||||
Before=sysinit.target local-fs.target
|
||||
Wants=local-fs-pre.target
|
||||
After=local-fs-pre.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/home/orangepi/printio_studio/systemd/bash/overlayfs_mount.sh
|
||||
RemainAfterExit=true
|
||||
user=root
|
||||
Group=root
|
||||
|
||||
[Install]
|
||||
WantedBy=sysinit.target
|
||||
|
||||
15
systemd/printio.service
Normal file
@ -0,0 +1,15 @@
|
||||
[Unit]
|
||||
Description=Gunicorn instance to serve Printio
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
User=root
|
||||
Group=www-data
|
||||
WorkingDirectory=/home/orangepi/printio/src/
|
||||
ExecStart=/home/orangepi/printio/.venv/bin/gunicorn --workers 1 --bind unix:/home/orangepi/printio/src/flaskapp.sock --umask 0007 wsgi:app
|
||||
ExecReload=/bin/kill -s HUP $MAINPID
|
||||
KillMode=mixed
|
||||
Environment="PATH=/home/orangepi/printio/.venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
309
templates/about.html
Normal file
@ -0,0 +1,309 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>About Printio</title>
|
||||
<link rel="icon" type="image/x-icon" href="/static/images/favicon.ico">
|
||||
<link rel="stylesheet" href="/static/css/styles.css">
|
||||
<link rel="stylesheet" href="/static/fontawesome/css/all.min.css">
|
||||
<style>
|
||||
h1 {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
label, select, #media-sizes, button {
|
||||
margin: 5px 0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
select {
|
||||
padding: 3px;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
#media-sizes ul {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#media-sizes li {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
#media-sizes input[type="checkbox"] {
|
||||
transform: scale(1.5);
|
||||
margin-right: 12px;
|
||||
}
|
||||
|
||||
#media-sizes span {
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
button {
|
||||
background-color: blue;
|
||||
color: white;
|
||||
padding: 10px 20px;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
font-size: 1.2em;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background-color: darkblue;
|
||||
}
|
||||
|
||||
p {
|
||||
display: block;
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.license-section {
|
||||
margin-top: 30px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.license-status {
|
||||
font-size: 1.1em;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.license-input {
|
||||
margin-top: 10px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.license-input input {
|
||||
padding: 10px;
|
||||
width: 300px;
|
||||
font-size: 1.1em;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.license-input button {
|
||||
background-color: #4CAF50;
|
||||
padding: 10px 20px;
|
||||
font-size: 1.1em;
|
||||
cursor: pointer;
|
||||
border-radius: 5px;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.license-input button:hover {
|
||||
background-color: #45a049;
|
||||
}
|
||||
|
||||
/* New Styles for Layout */
|
||||
.content-wrapper {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.left-column {
|
||||
width: 280px;
|
||||
padding-right: 20px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.right-column {
|
||||
width: 70%;
|
||||
}
|
||||
|
||||
.info-box {
|
||||
padding: 15px;
|
||||
margin-bottom: 20px;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.license-box {
|
||||
padding: 15px;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 5px;
|
||||
}
|
||||
#p {
|
||||
margin-left: 10px;
|
||||
}
|
||||
</style>
|
||||
<script src="/static/js/crypto-js.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="navbar"></div>
|
||||
<script>
|
||||
fetch('/static/html/nav.html')
|
||||
.then(response => response.text())
|
||||
.then(data => {
|
||||
document.getElementById('navbar').innerHTML = data;
|
||||
});
|
||||
</script>
|
||||
|
||||
<div class="content-wrapper">
|
||||
<div class="left-column">
|
||||
<div class="info-box">
|
||||
<h3>System Info</h3>
|
||||
<p>Version: {{info.software_version}}
|
||||
<p>CPU %: {{info.cpu}}</p>
|
||||
<p>CPU T: {{info.cpu_t}}</p>
|
||||
<p>Disk Size: {{info.disk_size}}</p>
|
||||
<p>Disk Used: {{info.disk_used}}</p>
|
||||
<p>RAM Size: {{info.ram_size}}</p>
|
||||
<p>RAM Used: {{info.ram_used}}</p>
|
||||
<p>Up Time: {{info.uptime}}</p>
|
||||
</div>
|
||||
|
||||
<div class="license-box">
|
||||
<h3>License Info </h3>
|
||||
<p>License: {{info.license}}</p>
|
||||
<!--p>Image Magic: {{info.image_magic}}</p-->
|
||||
<!--p>Hashtag: {{info.hash}}</p-->
|
||||
<!--p>Drop Folder: {{info.drop_folder}}</p-->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="right-column">
|
||||
<h1>About Printio</h1>
|
||||
<p>
|
||||
Printio is a professional printing solution designed for seamless
|
||||
printing from iPads. It is particularly popular in the photobooth
|
||||
industry, supporting a wide range of sublimation printers. Printio
|
||||
is compatible with well-known brands such as DNP, Sinfonia, Hiti,
|
||||
and Mitsubishi, as well as many other printers, including Zebra label
|
||||
printers, and most HP and Epson models. This versatility makes Printio
|
||||
an ideal choice for diverse printing needs.
|
||||
</p>
|
||||
<p>
|
||||
Warning: Unauthorized reproduction or distribution of this product
|
||||
is strictly prohibited and may result in severe civil and criminal
|
||||
penalties.
|
||||
</p>
|
||||
<a href="https://www.ataphotobooths.com/knowledge-base/category/printio-setup/" target="_blank">Printio Help: Click me!</a>
|
||||
<div></div>
|
||||
<img src="/static/images/printio_help_qr.jpg" alt="Printio" style="width: 120px; margin-top: 20px;">
|
||||
|
||||
|
||||
<div class="license-section" {{info.hidden}}>
|
||||
<div class="license-input">
|
||||
<label>__________________________________________________________</label>
|
||||
</div>
|
||||
<div class="license-input">
|
||||
<label for="activation-serial">ID Code:</label>
|
||||
<input type="text" id="idcode" value={{info.idcode}} readonly>
|
||||
<button onclick="copyToClipboard()">Copy</button>
|
||||
</div>
|
||||
<div class="license-input">
|
||||
<label for="activation-serial">SerialNo</label>
|
||||
<input type="password" id="license-password" placeholder="Enter Activation Key">
|
||||
<button onclick="activateLicense()">Activate</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function encryptPassword(password) {
|
||||
// Simple encryption using CryptoJS (you can replace with your method)
|
||||
return password;
|
||||
}
|
||||
|
||||
function activateLicense() {
|
||||
const password = document.getElementById('license-password').value;
|
||||
const encryptedPassword = encryptPassword(password);
|
||||
fetch('/activate', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({ pass: encryptedPassword })
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
console.log("Activation result:", data);
|
||||
if (data.reply == true) {
|
||||
alert("Activation Successful!!!");
|
||||
window.location.href = "/about"; // Redirect to /about page
|
||||
} else {
|
||||
alert("Activation Failed.... Try Again");
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error("Error during activation attempt:", error);
|
||||
alert("Error during activation attempt.");
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function copyToClipboard() {
|
||||
const idCode = document.getElementById('idcode');
|
||||
|
||||
// Check if the element exists
|
||||
if (!idCode) {
|
||||
console.error('Element with ID "idcode" not found');
|
||||
alert('Error: Could not find the text to copy');
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the value or text content (depending on element type)
|
||||
const textToCopy = idCode.value || idCode.textContent || '';
|
||||
console.log('Text to copy:', textToCopy);
|
||||
|
||||
// Ensure there's something to copy
|
||||
if (!textToCopy) {
|
||||
console.warn('No text to copy');
|
||||
alert('Nothing to copy');
|
||||
return;
|
||||
}
|
||||
|
||||
// First, try the Clipboard API if available
|
||||
if (navigator.clipboard && navigator.clipboard.writeText) {
|
||||
console.log('Attempting to use Clipboard API');
|
||||
navigator.clipboard.writeText(textToCopy)
|
||||
.then(() => {
|
||||
console.log('Clipboard API success');
|
||||
alert('ID code copied to clipboard');
|
||||
})
|
||||
.catch(err => {
|
||||
console.error('Clipboard API failed:', err);
|
||||
attemptFallbackCopy(textToCopy);
|
||||
});
|
||||
} else {
|
||||
console.log('Clipboard API unavailable, using fallback');
|
||||
attemptFallbackCopy(textToCopy);
|
||||
}
|
||||
}
|
||||
|
||||
function attemptFallbackCopy(textToCopy) {
|
||||
try {
|
||||
// Create a temporary textarea for copying
|
||||
const tempTextarea = document.createElement('textarea');
|
||||
tempTextarea.value = textToCopy;
|
||||
tempTextarea.style.position = 'fixed'; // Prevent scrolling issues
|
||||
tempTextarea.style.opacity = '0'; // Make it invisible
|
||||
document.body.appendChild(tempTextarea);
|
||||
tempTextarea.focus();
|
||||
tempTextarea.select();
|
||||
|
||||
// Attempt to copy
|
||||
const successful = document.execCommand('copy');
|
||||
document.body.removeChild(tempTextarea);
|
||||
|
||||
if (successful) {
|
||||
console.log('Fallback copy successful');
|
||||
//alert('ID code copied to clipboard (using fallback)');
|
||||
} else {
|
||||
console.warn('Fallback copy failed: execCommand returned false');
|
||||
alert('Failed to copy to clipboard: Copy command unsuccessful');
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Fallback copy error:', err);
|
||||
alert('Failed to copy to clipboard: ' + err.message);
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
157
templates/index.html
Normal file
@ -0,0 +1,157 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Printio</title>
|
||||
<link rel="icon" type="image/x-icon" href="/static/images/favicon.ico">
|
||||
<link rel="stylesheet" href="/static/css/styles.css">
|
||||
<link rel="stylesheet" href="/static/fontawesome/css/all.min.css">
|
||||
<style>
|
||||
.header-img {
|
||||
margin-top: 30px;
|
||||
margin-bottom: 30px;
|
||||
width: auto;
|
||||
height: 100px;
|
||||
}
|
||||
h2 {
|
||||
margin-top: 0;
|
||||
font-size: 24px;
|
||||
color: #565656;
|
||||
}
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
margin-top: 20px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
th, td {
|
||||
border: 1px solid #ccc;
|
||||
padding: 10px;
|
||||
text-align: left;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
th {
|
||||
background-color: #f8f8f8;
|
||||
}
|
||||
.button-red {
|
||||
padding: 5px 10px;
|
||||
background-color: #f44336;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.button-test {
|
||||
padding: 5px 10px;
|
||||
background-color: #4CAF50;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.placeholder-img {
|
||||
position: absolute;
|
||||
top: 20px;
|
||||
right: 20px;
|
||||
}
|
||||
.placeholder-img img {
|
||||
top: 20px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
/* Styles for the message log */
|
||||
#messageLog {
|
||||
display: none;
|
||||
margin-top: 20px;
|
||||
width: 100%;
|
||||
height: 350px;
|
||||
box-sizing: border-box;
|
||||
resize: none;
|
||||
overflow: auto;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.toggle-button {
|
||||
margin-top: 20px;
|
||||
background-color: #007BFF;
|
||||
color: white;
|
||||
border: none;
|
||||
padding: 3px 20px;
|
||||
cursor: pointer;
|
||||
border-radius: 5px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="navbar"></div>
|
||||
<script>
|
||||
fetch('/static/html/nav.html')
|
||||
.then(response => response.text())
|
||||
.then(data => {
|
||||
document.getElementById('navbar').innerHTML = data;
|
||||
});
|
||||
</script>
|
||||
|
||||
<div class="content-wrapper">
|
||||
<div class="content">
|
||||
<img src="/static/images/printio_logo.png" alt="Printio" class="header-img">
|
||||
<h2>Active Printers</h2>
|
||||
<table border="1">
|
||||
<tr>
|
||||
<th>Printer Name</th>
|
||||
<th>Status</th>
|
||||
<th>Prints Left</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
{% for printer in printers %}
|
||||
<tr>
|
||||
<td>{{ printer.name }}</td>
|
||||
<td>{{ printer.state }}</td>
|
||||
<td>{{ printer.prints_left_message }}</td>
|
||||
<td>
|
||||
<form action="{{ url_for('cancel_all_jobs', printer_name=printer.name) }}" method="post" style="display:inline;">
|
||||
<button type="submit" class="button-red">Kill Jobs</button>
|
||||
</form>
|
||||
<form action="{{ url_for('test_print', printer_name=printer.name) }}" method="post" style="display:inline;">
|
||||
<button type="submit" class="button-test">Test Print</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
<!-- Button to toggle the message log -->
|
||||
<button class="toggle-button" onclick="toggleMessageLog()">Job History</button>
|
||||
<!-- Hidden textarea for the message log -->
|
||||
<textarea id="messageLog" placeholder="Job Status Log..." readonly></textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Toggles the visibility of the message log textarea
|
||||
function toggleMessageLog() {
|
||||
var messageLog = document.getElementById('messageLog');
|
||||
if (messageLog.style.display === '' || messageLog.style.display === 'none') {
|
||||
messageLog.style.display = 'block';
|
||||
loadPrinterJobs(); // Load job messages when showing the textarea
|
||||
} else {
|
||||
messageLog.style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
// Load the printer job information and show in the textarea
|
||||
function loadPrinterJobs() {
|
||||
var messageLog = document.getElementById('messageLog');
|
||||
var jobs = {{ job_history | tojson | safe }};
|
||||
var logText = "";
|
||||
|
||||
jobs.forEach(function(job, index) {
|
||||
logText += "Job: " + job.job_id + ", Time: " + job.time + ", Size: " + job.job_size + ", Printer: " + job.printer_name + ", State: " + job.job_state + ', Reason: ' + job.job_reason + "\r\n";
|
||||
});
|
||||
|
||||
// Set the value of the textarea to display the job information
|
||||
messageLog.value = logText;
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
350
templates/internet.html
Normal file
@ -0,0 +1,350 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>WiFi Configuration</title>
|
||||
<link rel="icon" type="image/x-icon" href="/static/images/favicon.ico">
|
||||
<link rel="stylesheet" href="/static/css/styles.css">
|
||||
<link rel="stylesheet" href="/static/fontawesome/css/all.min.css">
|
||||
<style>
|
||||
h1 {
|
||||
margin-top: 30px;
|
||||
font-size: 36px;
|
||||
color: #333;
|
||||
}
|
||||
.button-container {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-top: 20px;
|
||||
}
|
||||
.btn {
|
||||
padding: 10px 20px;
|
||||
font-size: 1.2em;
|
||||
cursor: pointer;
|
||||
background-color: blue;
|
||||
color: white;
|
||||
width: 150px;
|
||||
border-radius: 5px;
|
||||
border: none;
|
||||
text-decoration: none;
|
||||
}
|
||||
.btn:hover {
|
||||
background-color: #0056b3;
|
||||
}
|
||||
.small-btn {
|
||||
width: 100px;
|
||||
padding: 5px 10px;
|
||||
font-size: 0.8em;
|
||||
background-color: darkslateblue;
|
||||
}
|
||||
.small-btn-container {
|
||||
margin-left: auto;
|
||||
}
|
||||
.scan-container {
|
||||
margin-top: 20px;
|
||||
}
|
||||
.scan-container .btn {
|
||||
background-color: #28a745;
|
||||
}
|
||||
.scan-container .btn:hover {
|
||||
background-color: #218838;
|
||||
}
|
||||
.connect-container {
|
||||
margin-top: 20px;
|
||||
}
|
||||
.connect-container .btn {
|
||||
padding: 5px 15px;
|
||||
border-radius: 5px;
|
||||
background-color: #ffc107;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
.connect-container .btn:hover {
|
||||
background-color: #e0a800;
|
||||
}
|
||||
.network-list {
|
||||
margin-top: 20px;
|
||||
width: 100%;
|
||||
max-height: 200px;
|
||||
overflow-y: auto;
|
||||
border: 1px solid #ccc;
|
||||
background-color: white;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.network-list table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
table-layout: auto;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.network-list th, .network-list td {
|
||||
padding: 8px;
|
||||
text-align: left;
|
||||
border-bottom: 1px solid #ddd;
|
||||
white-space: nowrap;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.network-list th {
|
||||
background-color: #f2f2f2;
|
||||
}
|
||||
.network-list tr.selected {
|
||||
background-color: #d1e7dd;
|
||||
}
|
||||
.status {
|
||||
margin-top: 20px;
|
||||
font-size: 18px;
|
||||
color: #555;
|
||||
}
|
||||
.home-btn {
|
||||
position: absolute;
|
||||
top: 20px;
|
||||
left: 20px;
|
||||
padding: 10px 20px;
|
||||
background-color: #6c757d;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.home-btn:hover {
|
||||
background-color: #5a6268;
|
||||
}
|
||||
.placeholder-img {
|
||||
position: absolute;
|
||||
top: 20px;
|
||||
right: 20px;
|
||||
}
|
||||
.placeholder-img img {
|
||||
top: 20px;
|
||||
width: 70px;
|
||||
height: 70px;
|
||||
}
|
||||
.header-img {
|
||||
margin-top: 20px; /* Adjust the margin as needed */
|
||||
margin-bottom: 30px;
|
||||
width: auto;
|
||||
height: 80px; /* Adjust the height as needed */
|
||||
position: absolute;
|
||||
left: 30px;
|
||||
top: 60px;
|
||||
}
|
||||
button:disabled {
|
||||
opacity: 0.5; /* Makes the button look visually disabled */
|
||||
cursor: not-allowed; /* Changes the cursor to indicate it's disabled */
|
||||
}
|
||||
details {
|
||||
width: 100%;
|
||||
margin-bottom: 20px; /* Adds space between details sections */
|
||||
}
|
||||
|
||||
.details-container {
|
||||
width: 80%; /* Set container width to keep content centered */
|
||||
margin: 0 auto;
|
||||
}
|
||||
summary {
|
||||
font-size: 1.3em;
|
||||
font-weight: bold;
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
width: 250px; /* Set a fixed width for alignment */
|
||||
text-align: left; /* Ensures left alignment of the text */
|
||||
white-space: nowrap; /* Prevents wrapping */
|
||||
}
|
||||
summary::before {
|
||||
content: "▼ "; /* Bullet symbol */
|
||||
color: black; /* Bullet color */
|
||||
margin-right: 8px; /* Space between bullet and text */
|
||||
font-size: 1.3em; /* Matches summary font size */
|
||||
}
|
||||
.details-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="navbar"></div>
|
||||
<script>
|
||||
fetch('/static/html/nav.html')
|
||||
.then(response => response.text())
|
||||
.then(data => {
|
||||
document.getElementById('navbar').innerHTML = data;
|
||||
});
|
||||
</script>
|
||||
|
||||
<div class="content-wrapper">
|
||||
<div class="content">
|
||||
<h1>WiFi Internet Access</h1>
|
||||
<img src="/static/images/internet_icon.png" alt="internet" class="header-img">
|
||||
<label id="label-status">Status:</label>
|
||||
<div class="button-container">
|
||||
<button class="btn" id="scanButton" onclick="scanWifi()">Scan</button>
|
||||
<div class="small-btn-container">
|
||||
<button class="btn small-btn" id="forgetButton" onclick="checkForgetNetworks()">Forget all</button>
|
||||
<button class="btn small-btn" id="testButton" onclick="checkInternetAccess()">Test Internet</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="scan-container">
|
||||
<div id="scanStatus" class="status"></div>
|
||||
</div>
|
||||
<div class="network-list">
|
||||
<table id="networksTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>SSID</th>
|
||||
<th>Freq</th>
|
||||
<th>Signal</th>
|
||||
<th>Bssid</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!-- List of networks will be appended here -->
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="connect-container">
|
||||
<button class="btn" id="connectToNetworkButton"onclick="connectToNetwork()">Connect</button>
|
||||
</div>
|
||||
<details>
|
||||
<summary>Connection Status</summary>
|
||||
<div class="status" id="connectionStatus"></div>
|
||||
</details>
|
||||
<details>
|
||||
<summary>Notice</summary>
|
||||
<label id="label-wifi">*WPA3 is not currently supported. If your hotsport/Access point is setup for WPA3, please change it to WPA2 before trying to connect to it.</label>
|
||||
</details>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
window.onload = function() { OnPageLoad(); };
|
||||
|
||||
function scanWifi() {
|
||||
console.log("Starting WiFi scan...");
|
||||
document.getElementById('connectionStatus').innerText = ""
|
||||
document.getElementById('scanStatus').innerText = "Scanning for networks...";
|
||||
fetch('/wifi_scan')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
console.log("Scan complete. Data received:", data);
|
||||
document.getElementById('scanStatus').innerText = "Scan complete.";
|
||||
let tableBody = document.getElementById('networksTable').getElementsByTagName('tbody')[0];
|
||||
tableBody.innerHTML = '';
|
||||
data.networks.forEach(network => {
|
||||
let row = tableBody.insertRow();
|
||||
let cell1 = row.insertCell(0);
|
||||
let cell2 = row.insertCell(1);
|
||||
let cell3 = row.insertCell(2);
|
||||
let cell4 = row.insertCell(3);
|
||||
cell1.textContent = network.ssid || '';
|
||||
cell2.textContent = network.Freq || '';
|
||||
cell3.textContent = network.signal || '';
|
||||
cell4.textContent = network.bssid || '';
|
||||
row.addEventListener('click', function() {
|
||||
const rows = document.querySelectorAll('#networksTable tbody tr');
|
||||
rows.forEach(r => r.classList.remove('selected'));
|
||||
row.classList.add('selected');
|
||||
});
|
||||
});
|
||||
})
|
||||
.catch(error => {
|
||||
console.error("Error during scan:", error);
|
||||
document.getElementById('scanStatus').innerText = "Error during scan.";
|
||||
});
|
||||
}
|
||||
|
||||
function connectToNetwork() {
|
||||
console.log("Attempting to connect to network...");
|
||||
const table = document.getElementById('networksTable');
|
||||
const selectedRow = table.querySelector('tbody tr.selected');
|
||||
if (!selectedRow) {
|
||||
document.getElementById('connectionStatus').innerText = "Please select a network to connect to.";
|
||||
return;
|
||||
}
|
||||
const ssid = selectedRow.cells[0].textContent;
|
||||
const bssid = selectedRow.cells[3].textContent;
|
||||
const password = prompt("Enter the WiFi password for " + ssid + ":");
|
||||
if (!password) {
|
||||
document.getElementById('connectionStatus').innerText = "Connection cancelled.";
|
||||
return;
|
||||
}
|
||||
document.getElementById('connectionStatus').innerText = "Please wait...";
|
||||
document.getElementById('connectToNetworkButton').disabled = true;
|
||||
document.getElementById('scanButton').disabled = true;
|
||||
document.getElementById('testButton').disabled = true;
|
||||
document.getElementById('forgetButton').disabled = true;
|
||||
fetch('/wifi_connect', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({ ssid: ssid, bssid: bssid, password: password })
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
console.log("Connection attempt result:", data);
|
||||
document.getElementById('connectionStatus').innerText = data.message;
|
||||
checkWifiStatus();
|
||||
})
|
||||
.catch(error => {
|
||||
console.error("Error during connection attempt:", error);
|
||||
document.getElementById('connectionStatus').innerText = "Error during connection attempt.";
|
||||
})
|
||||
.finally(() => {
|
||||
// Re-enable buttons after the connection attempt
|
||||
document.getElementById('connectToNetworkButton').disabled = false;
|
||||
document.getElementById('scanButton').disabled = false;
|
||||
document.getElementById('testButton').disabled = false;
|
||||
document.getElementById('forgetButton').disabled = false;
|
||||
});
|
||||
}
|
||||
|
||||
function checkInternetAccess() {
|
||||
fetch('/wifi_test')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
const statusMessage = data.success ? "Internet Access Ok" : "No Internet Access";
|
||||
alert(statusMessage); // Display message in a popup
|
||||
})
|
||||
.catch(error => {
|
||||
console.error("Error checking internet access:", error);
|
||||
alert("Error checking internet access."); // Display error in a popup
|
||||
});
|
||||
}
|
||||
|
||||
function checkForgetNetworks() {
|
||||
fetch('/wifi_forget')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
const statusMessage = data.success ? "All networks forgotten" : "Nothing happened";
|
||||
alert(statusMessage); // Display message in a popup
|
||||
})
|
||||
.catch(error => {
|
||||
console.error("Error forgetting networks:", error);
|
||||
alert("Error forgetting networks."); // Display error in a popup
|
||||
});
|
||||
}
|
||||
|
||||
function checkWifiStatus() {
|
||||
fetch('/wifi_status')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
console.log("Data received:", data);
|
||||
document.getElementById('label-status').innerText = "Status: " + data.msg;
|
||||
})
|
||||
.catch(error => {
|
||||
console.error("Error getting wifi status:", error);
|
||||
document.getElementById('label-status').innerText = "Status: ...";
|
||||
});
|
||||
}
|
||||
|
||||
function OnPageLoad(){
|
||||
checkWifiStatus();
|
||||
}
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
437
templates/mediaconfig.html
Normal file
@ -0,0 +1,437 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Printer Media Sizes</title>
|
||||
<link rel="icon" type="image/x-icon" href="/static/images/favicon.ico">
|
||||
<link rel="stylesheet" href="/static/css/styles.css">
|
||||
<link rel="stylesheet" href="/static/fontawesome/css/all.min.css">
|
||||
<script src="/static/js/jquery-3.7.1.js"></script>
|
||||
<script src="/static/js/printers.js"></script>
|
||||
<style>
|
||||
|
||||
.header-img {
|
||||
margin-top: 30px; /* Adjust the margin as needed */
|
||||
margin-bottom: 30px;
|
||||
width: auto;
|
||||
height: 100px; /* Adjust the height as needed */
|
||||
}
|
||||
h1 {
|
||||
margin-bottom: 40px;
|
||||
font-size: 2.0em;
|
||||
}
|
||||
.center-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
label, select, #media-sizes, button {
|
||||
margin: 5px 0;
|
||||
text-align: center;
|
||||
font-size: larger;
|
||||
font-weight: 200;
|
||||
}
|
||||
|
||||
select {
|
||||
padding: 3px;
|
||||
font-size: 1.1em;
|
||||
width: 200px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
#media-sizes ul {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#media-sizes li {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
#media-sizes input[type="checkbox"] {
|
||||
transform: scale(1.5);
|
||||
margin-right: 12px;
|
||||
}
|
||||
|
||||
#media-sizes span {
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
button, input {
|
||||
background-color: blue;
|
||||
color: white;
|
||||
padding: 5px 10px;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
font-size: 1.2em;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background-color: darkblue;
|
||||
}
|
||||
|
||||
details {
|
||||
width: 100%;
|
||||
margin-bottom: 20px; /* Adds space between details sections */
|
||||
}
|
||||
|
||||
.details-container {
|
||||
width: 80%; /* Set container width to keep content centered */
|
||||
margin: 0 auto;
|
||||
}
|
||||
summary {
|
||||
font-size: 1.4em;
|
||||
font-weight: bold;
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
width: 250px; /* Set a fixed width for alignment */
|
||||
text-align: left; /* Ensures left alignment of the text */
|
||||
white-space: nowrap; /* Prevents wrapping */
|
||||
}
|
||||
summary::before {
|
||||
content: "▼ "; /* Bullet symbol */
|
||||
color: black; /* Bullet color */
|
||||
margin-right: 8px; /* Space between bullet and text */
|
||||
font-size: 1.4em; /* Matches summary font size */
|
||||
}
|
||||
.details-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
table th {
|
||||
text-align: right; /* Right-aligns the labels in table header cells */
|
||||
padding-right: 10px; /* Adds some space between label and input */
|
||||
}
|
||||
|
||||
table td {
|
||||
text-align: left; /* Left-aligns the select elements */
|
||||
}
|
||||
|
||||
table td select {
|
||||
width: auto;
|
||||
padding: 5px;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="navbar"></div>
|
||||
<script>
|
||||
fetch('/static/html/nav.html')
|
||||
.then(response => response.text())
|
||||
.then(data => {
|
||||
document.getElementById('navbar').innerHTML = data;
|
||||
});
|
||||
</script>
|
||||
|
||||
<div class="content-wrapper">
|
||||
<div class="content center-content">
|
||||
<h1> Media and Color Settings</h1>
|
||||
<div class="details-container">
|
||||
<details>
|
||||
<summary>Printer Media Sizes</summary>
|
||||
<div class="details-content"> <!-- Container to center contents -->
|
||||
<img src="/static/images/color_cards.png" alt="cards" class="header-img">
|
||||
<label for="printers">Select Printer:</label>
|
||||
<select id="printers">
|
||||
<option value="">--Select a printer--</option>
|
||||
</select>
|
||||
<label for="printers">Available Sizes:</label>
|
||||
<div id="media-sizes"></div>
|
||||
</div>
|
||||
<button id="save">Save Changes</button>
|
||||
</details>
|
||||
<form id="colorOptionsForm" action="/save_color_options" onsubmit="submitForm(event)">
|
||||
<details>
|
||||
<summary>Color Settings (General)</summary>
|
||||
<TABLE WIDTH="100%">
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="ColorModel">Color Model</A>:</TH>
|
||||
<input type="checkbox" name="color-enabled" id="color-enabled" style="margin-right: 10px; transform: scale(1.5);">
|
||||
<label for="color-enabled">Enabled</label>
|
||||
<TD><SELECT NAME="ColorModel" ID="select-ColorModel" ONCHANGE="update_paramtable('ColorModel')">
|
||||
<OPTION VALUE="Gray">Grayscale<OPTION VALUE="Black">Inverted Grayscale<OPTION VALUE="RGB">RGB Color<OPTION VALUE="CMY">CMY Color<OPTION VALUE="CMYK">CMYK<OPTION VALUE="KCMY">KCMY
|
||||
</SELECT>
|
||||
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpColorPrecision">Color Precision</A>:</TH>
|
||||
<TD><SELECT NAME="StpColorPrecision" ID="select-StpColorPrecision" ONCHANGE="update_paramtable('StpColorPrecision')">
|
||||
<OPTION VALUE="Normal">Normal<OPTION VALUE="Best">Best
|
||||
</SELECT>
|
||||
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpiShrinkOutput">Shrink Page If Necessary to Fit Borders</A>:</TH>
|
||||
<TD><SELECT NAME="StpiShrinkOutput" ID="select-StpiShrinkOutput" ONCHANGE="update_paramtable('StpiShrinkOutput')">
|
||||
<OPTION VALUE="Shrink">Shrink (print the whole page)<OPTION VALUE="Crop">Crop (preserve dimensions)<OPTION VALUE="Expand">Expand (use maximum page area)
|
||||
</SELECT>
|
||||
|
||||
</TR>
|
||||
</TABLE>
|
||||
<button type="submit">Save Changes</button>
|
||||
</details>
|
||||
<details>
|
||||
<summary>Color Settings (Common)</summary>
|
||||
<TABLE WIDTH="100%">
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpColorCorrection">Color Correction</A>:</TH>
|
||||
<TD><SELECT NAME="StpColorCorrection" ID="select-StpColorCorrection" ONCHANGE="update_paramtable('StpColorCorrection')">
|
||||
<OPTION VALUE="None">Default<OPTION VALUE="Accurate">High Accuracy<OPTION VALUE="Bright">Bright Colors<OPTION VALUE="Hue">Correct Hue Only<OPTION VALUE="Uncorrected">Uncorrected<OPTION VALUE="Desaturated">Desaturated<OPTION VALUE="Threshold">Threshold<OPTION VALUE="Density">Density<OPTION VALUE="Raw">Raw<OPTION VALUE="Predithered">Pre-Dithered
|
||||
</SELECT>
|
||||
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpBrightness">Brightness</A>:</TH>
|
||||
<TD><SELECT NAME="StpBrightness" ID="select-StpBrightness" ONCHANGE="update_paramtable('StpBrightness')">
|
||||
<OPTION VALUE="0">0.000<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="None">1.000<OPTION VALUE="1100">1.100<OPTION VALUE="1200">1.200<OPTION VALUE="1300">1.300<OPTION VALUE="1400">1.400<OPTION VALUE="1500">1.500<OPTION VALUE="1600">1.600<OPTION VALUE="1700">1.700<OPTION VALUE="1800">1.800<OPTION VALUE="1900">1.900<OPTION VALUE="2000">2.000
|
||||
</SELECT>
|
||||
|
||||
</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineBrightness">Brightness Fine Adjustment</A>:</TH>
|
||||
<TD><SELECT NAME="StpFineBrightness" ID="select-StpFineBrightness" ONCHANGE="update_paramtable('StpFineBrightness')">
|
||||
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
|
||||
</SELECT>
|
||||
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpContrast">Contrast</A>:</TH>
|
||||
<TD><SELECT NAME="StpContrast" ID="select-StpContrast" ONCHANGE="update_paramtable('StpContrast')">
|
||||
<OPTION VALUE="0">0.000<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="None">1.000<OPTION VALUE="1100">1.100<OPTION VALUE="1200">1.200<OPTION VALUE="1300">1.300<OPTION VALUE="1400">1.400<OPTION VALUE="1500">1.500<OPTION VALUE="1600">1.600<OPTION VALUE="1700">1.700<OPTION VALUE="1800">1.800<OPTION VALUE="1900">1.900<OPTION VALUE="2000">2.000<OPTION VALUE="2100">2.100<OPTION VALUE="2200">2.200<OPTION VALUE="2300">2.300<OPTION VALUE="2400">2.400<OPTION VALUE="2500">2.500<OPTION VALUE="2600">2.600<OPTION VALUE="2700">2.700<OPTION VALUE="2800">2.800<OPTION VALUE="2900">2.900<OPTION VALUE="3000">3.000<OPTION VALUE="3100">3.100<OPTION VALUE="3200">3.200<OPTION VALUE="3300">3.300<OPTION VALUE="3400">3.400<OPTION VALUE="3500">3.500<OPTION VALUE="3600">3.600<OPTION VALUE="3700">3.700<OPTION VALUE="3800">3.800<OPTION VALUE="3900">3.900<OPTION VALUE="4000">4.000
|
||||
</SELECT>
|
||||
|
||||
</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineContrast">Contrast Fine Adjustment</A>:</TH>
|
||||
<TD><SELECT NAME="StpFineContrast" ID="select-StpFineContrast" ONCHANGE="update_paramtable('StpFineContrast')">
|
||||
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
|
||||
</SELECT>
|
||||
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpSaturation">Saturation</A>:</TH>
|
||||
<TD><SELECT NAME="StpSaturation" ID="select-StpSaturation" ONCHANGE="update_paramtable('StpSaturation')">
|
||||
<OPTION VALUE="0">0.000<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="None">1.000<OPTION VALUE="1100">1.100<OPTION VALUE="1200">1.200<OPTION VALUE="1300">1.300<OPTION VALUE="1400">1.400<OPTION VALUE="1500">1.500<OPTION VALUE="1600">1.600<OPTION VALUE="1700">1.700<OPTION VALUE="1800">1.800<OPTION VALUE="1900">1.900<OPTION VALUE="2000">2.000<OPTION VALUE="2100">2.100<OPTION VALUE="2200">2.200<OPTION VALUE="2300">2.300<OPTION VALUE="2400">2.400<OPTION VALUE="2500">2.500<OPTION VALUE="2600">2.600<OPTION VALUE="2700">2.700<OPTION VALUE="2800">2.800<OPTION VALUE="2900">2.900<OPTION VALUE="3000">3.000<OPTION VALUE="3100">3.100<OPTION VALUE="3200">3.200<OPTION VALUE="3300">3.300<OPTION VALUE="3400">3.400<OPTION VALUE="3500">3.500<OPTION VALUE="3600">3.600<OPTION VALUE="3700">3.700<OPTION VALUE="3800">3.800<OPTION VALUE="3900">3.900<OPTION VALUE="4000">4.000<OPTION VALUE="4100">4.100<OPTION VALUE="4200">4.200<OPTION VALUE="4300">4.300<OPTION VALUE="4400">4.400<OPTION VALUE="4500">4.500<OPTION VALUE="4600">4.600<OPTION VALUE="4700">4.700<OPTION VALUE="4800">4.800<OPTION VALUE="4900">4.900<OPTION VALUE="5000">5.000<OPTION VALUE="5100">5.100<OPTION VALUE="5200">5.200<OPTION VALUE="5300">5.300<OPTION VALUE="5400">5.400<OPTION VALUE="5500">5.500<OPTION VALUE="5600">5.600<OPTION VALUE="5700">5.700<OPTION VALUE="5800">5.800<OPTION VALUE="5900">5.900<OPTION VALUE="6000">6.000<OPTION VALUE="6100">6.100<OPTION VALUE="6200">6.200<OPTION VALUE="6300">6.300<OPTION VALUE="6400">6.400<OPTION VALUE="6500">6.500<OPTION VALUE="6600">6.600<OPTION VALUE="6700">6.700<OPTION VALUE="6800">6.800<OPTION VALUE="6900">6.900<OPTION VALUE="7000">7.000<OPTION VALUE="7100">7.100<OPTION VALUE="7200">7.200<OPTION VALUE="7300">7.300<OPTION VALUE="7400">7.400<OPTION VALUE="7500">7.500<OPTION VALUE="7600">7.600<OPTION VALUE="7700">7.700<OPTION VALUE="7800">7.800<OPTION VALUE="7900">7.900<OPTION VALUE="8000">8.000<OPTION VALUE="8100">8.100<OPTION VALUE="8200">8.200<OPTION VALUE="8300">8.300<OPTION VALUE="8400">8.400<OPTION VALUE="8500">8.500<OPTION VALUE="8600">8.600<OPTION VALUE="8700">8.700<OPTION VALUE="8800">8.800<OPTION VALUE="8900">8.900<OPTION VALUE="9000">9.000
|
||||
</SELECT>
|
||||
|
||||
</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineSaturation">Saturation Fine Adjustment</A>:</TH>
|
||||
<TD><SELECT NAME="StpFineSaturation" ID="select-StpFineSaturation" ONCHANGE="update_paramtable('StpFineSaturation')">
|
||||
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
|
||||
</SELECT>
|
||||
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpImageType">Image Type</A>:</TH>
|
||||
<TD><SELECT NAME="StpImageType" ID="select-StpImageType" ONCHANGE="update_paramtable('StpImageType')">
|
||||
<OPTION VALUE="None">Manual Control<OPTION VALUE="Text">Text<OPTION VALUE="Graphics">Graphics<OPTION VALUE="TextGraphics">Mixed Text and Graphics<OPTION VALUE="Photo">Photograph<OPTION VALUE="LineArt">Line Art
|
||||
</SELECT>
|
||||
|
||||
</TR>
|
||||
</TABLE>
|
||||
<button type="submit">Save Changes</button>
|
||||
</details>
|
||||
<details>
|
||||
<summary>Color Settings (Extra)</summary>
|
||||
<TABLE WIDTH="100%">
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpGamma">Composite Gamma</A>:</TH>
|
||||
<TD><SELECT NAME="StpGamma" ID="select-StpGamma" ONCHANGE="update_paramtable('StpGamma')">
|
||||
<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="1000">1.000<OPTION VALUE="1100">1.100<OPTION VALUE="1200">1.200<OPTION VALUE="1300">1.300<OPTION VALUE="1400">1.400<OPTION VALUE="1500">1.500<OPTION VALUE="1600">1.600<OPTION VALUE="1700">1.700<OPTION VALUE="1800">1.800<OPTION VALUE="1900">1.900<OPTION VALUE="2000">2.000<OPTION VALUE="2100">2.100<OPTION VALUE="2200">2.200<OPTION VALUE="2300">2.300<OPTION VALUE="2400">2.400<OPTION VALUE="2500">2.500<OPTION VALUE="2600">2.600<OPTION VALUE="2700">2.700<OPTION VALUE="2800">2.800<OPTION VALUE="2900">2.900<OPTION VALUE="3000">3.000<OPTION VALUE="3100">3.100<OPTION VALUE="3200">3.200<OPTION VALUE="3300">3.300<OPTION VALUE="3400">3.400<OPTION VALUE="3500">3.500<OPTION VALUE="3600">3.600<OPTION VALUE="3700">3.700<OPTION VALUE="3800">3.800<OPTION VALUE="3900">3.900<OPTION VALUE="4000">4.000<OPTION VALUE="None">None<OPTION VALUE="Custom">Custom
|
||||
</SELECT>
|
||||
</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineGamma">Composite Gamma Fine Adjustment</A>:</TH>
|
||||
<TD><SELECT NAME="StpFineGamma" ID="select-StpFineGamma" ONCHANGE="update_paramtable('StpFineGamma')">
|
||||
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
|
||||
</SELECT>
|
||||
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpCyanGamma">Cyan</A>:</TH>
|
||||
<TD><SELECT NAME="StpCyanGamma" ID="select-StpCyanGamma" ONCHANGE="update_paramtable('StpCyanGamma')">
|
||||
<OPTION VALUE="0">0.000<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="1000">1.000<OPTION VALUE="1100">1.100<OPTION VALUE="1200">1.200<OPTION VALUE="1300">1.300<OPTION VALUE="1400">1.400<OPTION VALUE="1500">1.500<OPTION VALUE="1600">1.600<OPTION VALUE="1700">1.700<OPTION VALUE="1800">1.800<OPTION VALUE="1900">1.900<OPTION VALUE="2000">2.000<OPTION VALUE="2100">2.100<OPTION VALUE="2200">2.200<OPTION VALUE="2300">2.300<OPTION VALUE="2400">2.400<OPTION VALUE="2500">2.500<OPTION VALUE="2600">2.600<OPTION VALUE="2700">2.700<OPTION VALUE="2800">2.800<OPTION VALUE="2900">2.900<OPTION VALUE="3000">3.000<OPTION VALUE="3100">3.100<OPTION VALUE="3200">3.200<OPTION VALUE="3300">3.300<OPTION VALUE="3400">3.400<OPTION VALUE="3500">3.500<OPTION VALUE="3600">3.600<OPTION VALUE="3700">3.700<OPTION VALUE="3800">3.800<OPTION VALUE="3900">3.900<OPTION VALUE="4000">4.000<OPTION VALUE="None">None<OPTION VALUE="Custom">Custom
|
||||
</SELECT>
|
||||
</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineCyanGamma">Cyan Fine Adjustment</A>:</TH>
|
||||
<TD><SELECT NAME="StpFineCyanGamma" ID="select-StpFineCyanGamma" ONCHANGE="update_paramtable('StpFineCyanGamma')">
|
||||
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
|
||||
</SELECT>
|
||||
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpMagentaGamma">Magenta</A>:</TH>
|
||||
<TD><SELECT NAME="StpMagentaGamma" ID="select-StpMagentaGamma" ONCHANGE="update_paramtable('StpMagentaGamma')">
|
||||
<OPTION VALUE="0">0.000<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="1000">1.000<OPTION VALUE="1100">1.100<OPTION VALUE="1200">1.200<OPTION VALUE="1300">1.300<OPTION VALUE="1400">1.400<OPTION VALUE="1500">1.500<OPTION VALUE="1600">1.600<OPTION VALUE="1700">1.700<OPTION VALUE="1800">1.800<OPTION VALUE="1900">1.900<OPTION VALUE="2000">2.000<OPTION VALUE="2100">2.100<OPTION VALUE="2200">2.200<OPTION VALUE="2300">2.300<OPTION VALUE="2400">2.400<OPTION VALUE="2500">2.500<OPTION VALUE="2600">2.600<OPTION VALUE="2700">2.700<OPTION VALUE="2800">2.800<OPTION VALUE="2900">2.900<OPTION VALUE="3000">3.000<OPTION VALUE="3100">3.100<OPTION VALUE="3200">3.200<OPTION VALUE="3300">3.300<OPTION VALUE="3400">3.400<OPTION VALUE="3500">3.500<OPTION VALUE="3600">3.600<OPTION VALUE="3700">3.700<OPTION VALUE="3800">3.800<OPTION VALUE="3900">3.900<OPTION VALUE="4000">4.000<OPTION VALUE="None">None<OPTION VALUE="Custom">Custom
|
||||
</SELECT>
|
||||
</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineMagentaGamma">Magenta Fine Adjustment</A>:</TH>
|
||||
<TD><SELECT NAME="StpFineMagentaGamma" ID="select-StpFineMagentaGamma" ONCHANGE="update_paramtable('StpFineMagentaGamma')">
|
||||
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
|
||||
</SELECT>
|
||||
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpYellowGamma">Yellow</A>:</TH>
|
||||
<TD><SELECT NAME="StpYellowGamma" ID="select-StpYellowGamma" ONCHANGE="update_paramtable('StpYellowGamma')">
|
||||
<OPTION VALUE="0">0.000<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="1000">1.000<OPTION VALUE="1100">1.100<OPTION VALUE="1200">1.200<OPTION VALUE="1300">1.300<OPTION VALUE="1400">1.400<OPTION VALUE="1500">1.500<OPTION VALUE="1600">1.600<OPTION VALUE="1700">1.700<OPTION VALUE="1800">1.800<OPTION VALUE="1900">1.900<OPTION VALUE="2000">2.000<OPTION VALUE="2100">2.100<OPTION VALUE="2200">2.200<OPTION VALUE="2300">2.300<OPTION VALUE="2400">2.400<OPTION VALUE="2500">2.500<OPTION VALUE="2600">2.600<OPTION VALUE="2700">2.700<OPTION VALUE="2800">2.800<OPTION VALUE="2900">2.900<OPTION VALUE="3000">3.000<OPTION VALUE="3100">3.100<OPTION VALUE="3200">3.200<OPTION VALUE="3300">3.300<OPTION VALUE="3400">3.400<OPTION VALUE="3500">3.500<OPTION VALUE="3600">3.600<OPTION VALUE="3700">3.700<OPTION VALUE="3800">3.800<OPTION VALUE="3900">3.900<OPTION VALUE="4000">4.000<OPTION VALUE="None">None<OPTION VALUE="Custom">Custom
|
||||
</SELECT>
|
||||
</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineYellowGamma">Yellow Fine Adjustment</A>:</TH>
|
||||
<TD><SELECT NAME="StpFineYellowGamma" ID="select-StpFineYellowGamma" ONCHANGE="update_paramtable('StpFineYellowGamma')">
|
||||
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
|
||||
</SELECT>
|
||||
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpCyanBalance">Cyan Balance</A>:</TH>
|
||||
<TD><SELECT NAME="StpCyanBalance" ID="select-StpCyanBalance" ONCHANGE="update_paramtable('StpCyanBalance')">
|
||||
<OPTION VALUE="0">0.000<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="1000">1.000<OPTION VALUE="None">None<OPTION VALUE="Custom">Custom
|
||||
</SELECT>
|
||||
</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineCyanBalance">Cyan Balance Fine Adjustment</A>:</TH>
|
||||
<TD><SELECT NAME="StpFineCyanBalance" ID="select-StpFineCyanBalance" ONCHANGE="update_paramtable('StpFineCyanBalance')">
|
||||
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
|
||||
</SELECT>
|
||||
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpMagentaBalance">Magenta Balance</A>:</TH>
|
||||
<TD><SELECT NAME="StpMagentaBalance" ID="select-StpMagentaBalance" ONCHANGE="update_paramtable('StpMagentaBalance')">
|
||||
<OPTION VALUE="0">0.000<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="1000">1.000<OPTION VALUE="None">None<OPTION VALUE="Custom">Custom
|
||||
</SELECT>
|
||||
</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineMagentaBalance">Magenta Balance Fine Adjustment</A>:</TH>
|
||||
<TD><SELECT NAME="StpFineMagentaBalance" ID="select-StpFineMagentaBalance" ONCHANGE="update_paramtable('StpFineMagentaBalance')">
|
||||
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
|
||||
</SELECT>
|
||||
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpYellowBalance">Yellow Balance</A>:</TH>
|
||||
<TD><SELECT NAME="StpYellowBalance" ID="select-StpYellowBalance" ONCHANGE="update_paramtable('StpYellowBalance')">
|
||||
<OPTION VALUE="0">0.000<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="1000">1.000<OPTION VALUE="None">None<OPTION VALUE="Custom">Custom
|
||||
</SELECT>
|
||||
</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineYellowBalance">Yellow Balance Fine Adjustment</A>:</TH>
|
||||
<TD><SELECT NAME="StpFineYellowBalance" ID="select-StpFineYellowBalance" ONCHANGE="update_paramtable('StpFineYellowBalance')">
|
||||
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
|
||||
</SELECT>
|
||||
|
||||
</TR>
|
||||
</TABLE>
|
||||
<button type="submit">Save Changes</button>
|
||||
</details>
|
||||
</form>
|
||||
<details>
|
||||
<summary>Tools</summary>
|
||||
<TABLE WIDTH="100%">
|
||||
<TR>
|
||||
<button onclick="ReloadCups()">Reload...</button>
|
||||
</TR>
|
||||
</details>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
window.onload = function() { OnPageLoad(); };
|
||||
|
||||
function OnPageLoad() {
|
||||
console.log("Page loaded");
|
||||
// General settings
|
||||
document.getElementById('color-enabled').checked = {{options.main.enabled|lower}};
|
||||
document.getElementById('select-ColorModel').value = "{{options.general.ColorModel}}";
|
||||
document.getElementById('select-StpColorPrecision').value = "{{options.general.StpColorPrecision}}";
|
||||
document.getElementById('select-StpiShrinkOutput').value = "{{options.general.StpiShrinkOutput}}";
|
||||
|
||||
// Common settings
|
||||
document.getElementById('select-StpColorCorrection').value = "{{options.common.StpColorCorrection}}";
|
||||
document.getElementById('select-StpBrightness').value = "{{options.common.StpBrightness}}";
|
||||
document.getElementById('select-StpFineBrightness').value = "{{options.common.StpFineBrightness}}";
|
||||
document.getElementById('select-StpContrast').value = "{{options.common.StpContrast}}";
|
||||
document.getElementById('select-StpFineContrast').value = "{{options.common.StpFineContrast}}";
|
||||
document.getElementById('select-StpSaturation').value = "{{options.common.StpSaturation}}";
|
||||
document.getElementById('select-StpFineSaturation').value = "{{options.common.StpFineSaturation}}";
|
||||
document.getElementById('select-StpImageType').value = "{{options.common.StpImageType}}";
|
||||
|
||||
// Extra settings
|
||||
document.getElementById('select-StpGamma').value = "{{options.extra.StpGamma}}";
|
||||
document.getElementById('select-StpFineGamma').value = "{{options.extra.StpFineGamma}}";
|
||||
document.getElementById('select-StpCyanGamma').value = "{{options.extra.StpCyanGamma}}";
|
||||
document.getElementById('select-StpFineCyanGamma').value = "{{options.extra.StpFineCyanGamma}}";
|
||||
document.getElementById('select-StpMagentaGamma').value = "{{options.extra.StpMagentaGamma}}";
|
||||
document.getElementById('select-StpFineMagentaGamma').value = "{{options.extra.StpFineMagentaGamma}}";
|
||||
document.getElementById('select-StpYellowGamma').value = "{{options.extra.StpYellowGamma}}";
|
||||
document.getElementById('select-StpFineYellowGamma').value = "{{options.extra.StpFineYellowGamma}}";
|
||||
document.getElementById('select-StpCyanBalance').value = "{{options.extra.StpCyanBalance}}";
|
||||
document.getElementById('select-StpFineCyanBalance').value = "{{options.extra.StpFineCyanBalance}}";
|
||||
document.getElementById('select-StpMagentaBalance').value = "{{options.extra.StpMagentaBalance}}";
|
||||
document.getElementById('select-StpFineMagentaBalance').value = "{{options.extra.StpFineMagentaBalance}}";
|
||||
document.getElementById('select-StpYellowBalance').value = "{{options.extra.StpYellowBalance}}";
|
||||
document.getElementById('select-StpFineYellowBalance').value = "{{options.extra.StpFineYellowBalance}}";
|
||||
}
|
||||
|
||||
function submitForm(event) {
|
||||
event.preventDefault(); // Prevent form from submitting the traditional way
|
||||
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: "/save_color_options",
|
||||
data: $("#colorOptionsForm").serialize(),
|
||||
success: function(response) {
|
||||
alert(response.message); // Show a popup window with the success message
|
||||
},
|
||||
error: function() {
|
||||
alert("An error occurred while saving the settings.");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function ReloadCups() {
|
||||
fetch('/reload_cups', {
|
||||
method: 'POST'
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
if (data.status == "success") {
|
||||
alert("Reload Successful!");
|
||||
} else {
|
||||
alert("Reload Failed: " + data.message);
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error("Error during reload attempt:", error);
|
||||
alert("Error during reload attempt.");
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||