parent
1cbc2f44b0
commit
360d29128c
33 changed files with 2385 additions and 1577 deletions
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 6.5 KiB |
@ -0,0 +1,614 @@ |
||||
/** |
||||
* @fileoverview |
||||
* - Using the 'QRCode for Javascript library' |
||||
* - Fixed dataset of 'QRCode for Javascript library' for support full-spec. |
||||
* - this library has no dependencies. |
||||
* |
||||
* @author davidshimjs |
||||
* @see <a href="http://www.d-project.com/" target="_blank">http://www.d-project.com/</a>
|
||||
* @see <a href="http://jeromeetienne.github.com/jquery-qrcode/" target="_blank">http://jeromeetienne.github.com/jquery-qrcode/</a>
|
||||
*/ |
||||
var QRCode; |
||||
|
||||
(function () { |
||||
//---------------------------------------------------------------------
|
||||
// QRCode for JavaScript
|
||||
//
|
||||
// Copyright (c) 2009 Kazuhiko Arase
|
||||
//
|
||||
// URL: http://www.d-project.com/
|
||||
//
|
||||
// Licensed under the MIT license:
|
||||
// http://www.opensource.org/licenses/mit-license.php
|
||||
//
|
||||
// The word "QR Code" is registered trademark of
|
||||
// DENSO WAVE INCORPORATED
|
||||
// http://www.denso-wave.com/qrcode/faqpatent-e.html
|
||||
//
|
||||
//---------------------------------------------------------------------
|
||||
function QR8bitByte(data) { |
||||
this.mode = QRMode.MODE_8BIT_BYTE; |
||||
this.data = data; |
||||
this.parsedData = []; |
||||
|
||||
// Added to support UTF-8 Characters
|
||||
for (var i = 0, l = this.data.length; i < l; i++) { |
||||
var byteArray = []; |
||||
var code = this.data.charCodeAt(i); |
||||
|
||||
if (code > 0x10000) { |
||||
byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18); |
||||
byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12); |
||||
byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6); |
||||
byteArray[3] = 0x80 | (code & 0x3F); |
||||
} else if (code > 0x800) { |
||||
byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12); |
||||
byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6); |
||||
byteArray[2] = 0x80 | (code & 0x3F); |
||||
} else if (code > 0x80) { |
||||
byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6); |
||||
byteArray[1] = 0x80 | (code & 0x3F); |
||||
} else { |
||||
byteArray[0] = code; |
||||
} |
||||
|
||||
this.parsedData.push(byteArray); |
||||
} |
||||
|
||||
this.parsedData = Array.prototype.concat.apply([], this.parsedData); |
||||
|
||||
if (this.parsedData.length != this.data.length) { |
||||
this.parsedData.unshift(191); |
||||
this.parsedData.unshift(187); |
||||
this.parsedData.unshift(239); |
||||
} |
||||
} |
||||
|
||||
QR8bitByte.prototype = { |
||||
getLength: function (buffer) { |
||||
return this.parsedData.length; |
||||
}, |
||||
write: function (buffer) { |
||||
for (var i = 0, l = this.parsedData.length; i < l; i++) { |
||||
buffer.put(this.parsedData[i], 8); |
||||
} |
||||
} |
||||
}; |
||||
|
||||
function QRCodeModel(typeNumber, errorCorrectLevel) { |
||||
this.typeNumber = typeNumber; |
||||
this.errorCorrectLevel = errorCorrectLevel; |
||||
this.modules = null; |
||||
this.moduleCount = 0; |
||||
this.dataCache = null; |
||||
this.dataList = []; |
||||
} |
||||
|
||||
QRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+","+col);} |
||||
return this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row<this.moduleCount;row++){this.modules[row]=new Array(this.moduleCount);for(var col=0;col<this.moduleCount;col++){this.modules[row][col]=null;}} |
||||
this.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(test,maskPattern);if(this.typeNumber>=7){this.setupTypeNumber(test);} |
||||
if(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);} |
||||
this.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}} |
||||
return pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row<this.modules.length;row++){var y=row*cs;for(var col=0;col<this.modules[row].length;col++){var x=col*cs;var dark=this.modules[row][col];if(dark){qr_mc.beginFill(0,100);qr_mc.moveTo(x,y);qr_mc.lineTo(x+cs,y);qr_mc.lineTo(x+cs,y+cs);qr_mc.lineTo(x,y+cs);qr_mc.endFill();}}} |
||||
return qr_mc;},setupTimingPattern:function(){for(var r=8;r<this.moduleCount-8;r++){if(this.modules[r][6]!=null){continue;} |
||||
this.modules[r][6]=(r%2==0);} |
||||
for(var c=8;c<this.moduleCount-8;c++){if(this.modules[6][c]!=null){continue;} |
||||
this.modules[6][c]=(c%2==0);}},setupPositionAdjustPattern:function(){var pos=QRUtil.getPatternPosition(this.typeNumber);for(var i=0;i<pos.length;i++){for(var j=0;j<pos.length;j++){var row=pos[i];var col=pos[j];if(this.modules[row][col]!=null){continue;} |
||||
for(var r=-2;r<=2;r++){for(var c=-2;c<=2;c++){if(r==-2||r==2||c==-2||c==2||(r==0&&c==0)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}}}},setupTypeNumber:function(test){var bits=QRUtil.getBCHTypeNumber(this.typeNumber);for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;} |
||||
for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}} |
||||
for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}} |
||||
this.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex<data.length){dark=(((data[byteIndex]>>>bitIndex)&1)==1);} |
||||
var mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;} |
||||
this.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}} |
||||
row+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;i<dataList.length;i++){var data=dataList[i];buffer.put(data.mode,4);buffer.put(data.getLength(),QRUtil.getLengthInBits(data.mode,typeNumber));data.write(buffer);} |
||||
var totalDataCount=0;for(var i=0;i<rsBlocks.length;i++){totalDataCount+=rsBlocks[i].dataCount;} |
||||
if(buffer.getLengthInBits()>totalDataCount*8){throw new Error("code length overflow. (" |
||||
+buffer.getLengthInBits() |
||||
+">" |
||||
+totalDataCount*8 |
||||
+")");} |
||||
if(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);} |
||||
while(buffer.getLengthInBits()%8!=0){buffer.putBit(false);} |
||||
while(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;} |
||||
buffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;} |
||||
buffer.put(QRCodeModel.PAD1,8);} |
||||
return QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r<rsBlocks.length;r++){var dcCount=rsBlocks[r].dataCount;var ecCount=rsBlocks[r].totalCount-dcCount;maxDcCount=Math.max(maxDcCount,dcCount);maxEcCount=Math.max(maxEcCount,ecCount);dcdata[r]=new Array(dcCount);for(var i=0;i<dcdata[r].length;i++){dcdata[r][i]=0xff&buffer.buffer[i+offset];} |
||||
offset+=dcCount;var rsPoly=QRUtil.getErrorCorrectPolynomial(ecCount);var rawPoly=new QRPolynomial(dcdata[r],rsPoly.getLength()-1);var modPoly=rawPoly.mod(rsPoly);ecdata[r]=new Array(rsPoly.getLength()-1);for(var i=0;i<ecdata[r].length;i++){var modIndex=i+modPoly.getLength()-ecdata[r].length;ecdata[r][i]=(modIndex>=0)?modPoly.get(modIndex):0;}} |
||||
var totalCodeCount=0;for(var i=0;i<rsBlocks.length;i++){totalCodeCount+=rsBlocks[i].totalCount;} |
||||
var data=new Array(totalCodeCount);var index=0;for(var i=0;i<maxDcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<dcdata[r].length){data[index++]=dcdata[r][i];}}} |
||||
for(var i=0;i<maxEcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<ecdata[r].length){data[index++]=ecdata[r][i];}}} |
||||
return data;};var QRMode={MODE_NUMBER:1<<0,MODE_ALPHA_NUM:1<<1,MODE_8BIT_BYTE:1<<2,MODE_KANJI:1<<3};var QRErrorCorrectLevel={L:1,M:0,Q:3,H:2};var QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var QRUtil={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:(1<<10)|(1<<8)|(1<<5)|(1<<4)|(1<<2)|(1<<1)|(1<<0),G18:(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<5)|(1<<2)|(1<<0),G15_MASK:(1<<14)|(1<<12)|(1<<10)|(1<<4)|(1<<1),getBCHTypeInfo:function(data){var d=data<<10;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)>=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));} |
||||
return((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));} |
||||
return(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;} |
||||
return digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error("bad maskPattern:"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i<errorCorrectLength;i++){a=a.multiply(new QRPolynomial([1,QRMath.gexp(i)],0));} |
||||
return a;},getLengthInBits:function(mode,type){if(1<=type&&type<10){switch(mode){case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:return 8;case QRMode.MODE_KANJI:return 8;default:throw new Error("mode:"+mode);}}else if(type<27){switch(mode){case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw new Error("mode:"+mode);}}else if(type<41){switch(mode){case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw new Error("mode:"+mode);}}else{throw new Error("type:"+type);}},getLostPoint:function(qrCode){var moduleCount=qrCode.getModuleCount();var lostPoint=0;for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount;col++){var sameCount=0;var dark=qrCode.isDark(row,col);for(var r=-1;r<=1;r++){if(row+r<0||moduleCount<=row+r){continue;} |
||||
for(var c=-1;c<=1;c++){if(col+c<0||moduleCount<=col+c){continue;} |
||||
if(r==0&&c==0){continue;} |
||||
if(dark==qrCode.isDark(row+r,col+c)){sameCount++;}}} |
||||
if(sameCount>5){lostPoint+=(3+sameCount-5);}}} |
||||
for(var row=0;row<moduleCount-1;row++){for(var col=0;col<moduleCount-1;col++){var count=0;if(qrCode.isDark(row,col))count++;if(qrCode.isDark(row+1,col))count++;if(qrCode.isDark(row,col+1))count++;if(qrCode.isDark(row+1,col+1))count++;if(count==0||count==4){lostPoint+=3;}}} |
||||
for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount-6;col++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row,col+1)&&qrCode.isDark(row,col+2)&&qrCode.isDark(row,col+3)&&qrCode.isDark(row,col+4)&&!qrCode.isDark(row,col+5)&&qrCode.isDark(row,col+6)){lostPoint+=40;}}} |
||||
for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount-6;row++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row+1,col)&&qrCode.isDark(row+2,col)&&qrCode.isDark(row+3,col)&&qrCode.isDark(row+4,col)&&!qrCode.isDark(row+5,col)&&qrCode.isDark(row+6,col)){lostPoint+=40;}}} |
||||
var darkCount=0;for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount;row++){if(qrCode.isDark(row,col)){darkCount++;}}} |
||||
var ratio=Math.abs(100*darkCount/moduleCount/moduleCount-50)/5;lostPoint+=ratio*10;return lostPoint;}};var QRMath={glog:function(n){if(n<1){throw new Error("glog("+n+")");} |
||||
return QRMath.LOG_TABLE[n];},gexp:function(n){while(n<0){n+=255;} |
||||
while(n>=256){n-=255;} |
||||
return QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<<i;} |
||||
for(var i=8;i<256;i++){QRMath.EXP_TABLE[i]=QRMath.EXP_TABLE[i-4]^QRMath.EXP_TABLE[i-5]^QRMath.EXP_TABLE[i-6]^QRMath.EXP_TABLE[i-8];} |
||||
for(var i=0;i<255;i++){QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]]=i;} |
||||
function QRPolynomial(num,shift){if(num.length==undefined){throw new Error(num.length+"/"+shift);} |
||||
var offset=0;while(offset<num.length&&num[offset]==0){offset++;} |
||||
this.num=new Array(num.length-offset+shift);for(var i=0;i<num.length-offset;i++){this.num[i]=num[i+offset];}} |
||||
QRPolynomial.prototype={get:function(index){return this.num[index];},getLength:function(){return this.num.length;},multiply:function(e){var num=new Array(this.getLength()+e.getLength()-1);for(var i=0;i<this.getLength();i++){for(var j=0;j<e.getLength();j++){num[i+j]^=QRMath.gexp(QRMath.glog(this.get(i))+QRMath.glog(e.get(j)));}} |
||||
return new QRPolynomial(num,0);},mod:function(e){if(this.getLength()-e.getLength()<0){return this;} |
||||
var ratio=QRMath.glog(this.get(0))-QRMath.glog(e.get(0));var num=new Array(this.getLength());for(var i=0;i<this.getLength();i++){num[i]=this.get(i);} |
||||
for(var i=0;i<e.getLength();i++){num[i]^=QRMath.gexp(QRMath.glog(e.get(i))+ratio);} |
||||
return new QRPolynomial(num,0).mod(e);}};function QRRSBlock(totalCount,dataCount){this.totalCount=totalCount;this.dataCount=dataCount;} |
||||
QRRSBlock.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];QRRSBlock.getRSBlocks=function(typeNumber,errorCorrectLevel){var rsBlock=QRRSBlock.getRsBlockTable(typeNumber,errorCorrectLevel);if(rsBlock==undefined){throw new Error("bad rs block @ typeNumber:"+typeNumber+"/errorCorrectLevel:"+errorCorrectLevel);} |
||||
var length=rsBlock.length/3;var list=[];for(var i=0;i<length;i++){var count=rsBlock[i*3+0];var totalCount=rsBlock[i*3+1];var dataCount=rsBlock[i*3+2];for(var j=0;j<count;j++){list.push(new QRRSBlock(totalCount,dataCount));}} |
||||
return list;};QRRSBlock.getRsBlockTable=function(typeNumber,errorCorrectLevel){switch(errorCorrectLevel){case QRErrorCorrectLevel.L:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+0];case QRErrorCorrectLevel.M:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+1];case QRErrorCorrectLevel.Q:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+2];case QRErrorCorrectLevel.H:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+3];default:return undefined;}};function QRBitBuffer(){this.buffer=[];this.length=0;} |
||||
QRBitBuffer.prototype={get:function(index){var bufIndex=Math.floor(index/8);return((this.buffer[bufIndex]>>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i<length;i++){this.putBit(((num>>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);} |
||||
if(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));} |
||||
this.length++;}};var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]]; |
||||
|
||||
function _isSupportCanvas() { |
||||
return typeof CanvasRenderingContext2D != "undefined"; |
||||
} |
||||
|
||||
// android 2.x doesn't support Data-URI spec
|
||||
function _getAndroid() { |
||||
var android = false; |
||||
var sAgent = navigator.userAgent; |
||||
|
||||
if (/android/i.test(sAgent)) { // android
|
||||
android = true; |
||||
var aMat = sAgent.toString().match(/android ([0-9]\.[0-9])/i); |
||||
|
||||
if (aMat && aMat[1]) { |
||||
android = parseFloat(aMat[1]); |
||||
} |
||||
} |
||||
|
||||
return android; |
||||
} |
||||
|
||||
var svgDrawer = (function() { |
||||
|
||||
var Drawing = function (el, htOption) { |
||||
this._el = el; |
||||
this._htOption = htOption; |
||||
}; |
||||
|
||||
Drawing.prototype.draw = function (oQRCode) { |
||||
var _htOption = this._htOption; |
||||
var _el = this._el; |
||||
var nCount = oQRCode.getModuleCount(); |
||||
var nWidth = Math.floor(_htOption.width / nCount); |
||||
var nHeight = Math.floor(_htOption.height / nCount); |
||||
|
||||
this.clear(); |
||||
|
||||
function makeSVG(tag, attrs) { |
||||
var el = document.createElementNS('http://www.w3.org/2000/svg', tag); |
||||
for (var k in attrs) |
||||
if (attrs.hasOwnProperty(k)) el.setAttribute(k, attrs[k]); |
||||
return el; |
||||
} |
||||
|
||||
var svg = makeSVG("svg" , {'viewBox': '0 0 ' + String(nCount) + " " + String(nCount), 'width': '100%', 'height': '100%', 'fill': _htOption.colorLight}); |
||||
svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink"); |
||||
_el.appendChild(svg); |
||||
|
||||
svg.appendChild(makeSVG("rect", {"fill": _htOption.colorLight, "width": "100%", "height": "100%"})); |
||||
svg.appendChild(makeSVG("rect", {"fill": _htOption.colorDark, "width": "1", "height": "1", "id": "template"})); |
||||
|
||||
for (var row = 0; row < nCount; row++) { |
||||
for (var col = 0; col < nCount; col++) { |
||||
if (oQRCode.isDark(row, col)) { |
||||
var child = makeSVG("use", {"x": String(row), "y": String(col)}); |
||||
child.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template") |
||||
svg.appendChild(child); |
||||
} |
||||
} |
||||
} |
||||
}; |
||||
Drawing.prototype.clear = function () { |
||||
while (this._el.hasChildNodes()) |
||||
this._el.removeChild(this._el.lastChild); |
||||
}; |
||||
return Drawing; |
||||
})(); |
||||
|
||||
var useSVG = document.documentElement.tagName.toLowerCase() === "svg"; |
||||
|
||||
// Drawing in DOM by using Table tag
|
||||
var Drawing = useSVG ? svgDrawer : !_isSupportCanvas() ? (function () { |
||||
var Drawing = function (el, htOption) { |
||||
this._el = el; |
||||
this._htOption = htOption; |
||||
}; |
||||
|
||||
/** |
||||
* Draw the QRCode |
||||
* |
||||
* @param {QRCode} oQRCode |
||||
*/ |
||||
Drawing.prototype.draw = function (oQRCode) { |
||||
var _htOption = this._htOption; |
||||
var _el = this._el; |
||||
var nCount = oQRCode.getModuleCount(); |
||||
var nWidth = Math.floor(_htOption.width / nCount); |
||||
var nHeight = Math.floor(_htOption.height / nCount); |
||||
var aHTML = ['<table style="border:0;border-collapse:collapse;">']; |
||||
|
||||
for (var row = 0; row < nCount; row++) { |
||||
aHTML.push('<tr>'); |
||||
|
||||
for (var col = 0; col < nCount; col++) { |
||||
aHTML.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:' + nWidth + 'px;height:' + nHeight + 'px;background-color:' + (oQRCode.isDark(row, col) ? _htOption.colorDark : _htOption.colorLight) + ';"></td>'); |
||||
} |
||||
|
||||
aHTML.push('</tr>'); |
||||
} |
||||
|
||||
aHTML.push('</table>'); |
||||
_el.innerHTML = aHTML.join(''); |
||||
|
||||
// Fix the margin values as real size.
|
||||
var elTable = _el.childNodes[0]; |
||||
var nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2; |
||||
var nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2; |
||||
|
||||
if (nLeftMarginTable > 0 && nTopMarginTable > 0) { |
||||
elTable.style.margin = nTopMarginTable + "px " + nLeftMarginTable + "px"; |
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* Clear the QRCode |
||||
*/ |
||||
Drawing.prototype.clear = function () { |
||||
this._el.innerHTML = ''; |
||||
}; |
||||
|
||||
return Drawing; |
||||
})() : (function () { // Drawing in Canvas
|
||||
function _onMakeImage() { |
||||
this._elImage.src = this._elCanvas.toDataURL("image/png"); |
||||
this._elImage.style.display = "block"; |
||||
this._elCanvas.style.display = "none"; |
||||
} |
||||
|
||||
// Android 2.1 bug workaround
|
||||
// http://code.google.com/p/android/issues/detail?id=5141
|
||||
if (this._android && this._android <= 2.1) { |
||||
var factor = 1 / window.devicePixelRatio; |
||||
var drawImage = CanvasRenderingContext2D.prototype.drawImage; |
||||
CanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) { |
||||
if (("nodeName" in image) && /img/i.test(image.nodeName)) { |
||||
for (var i = arguments.length - 1; i >= 1; i--) { |
||||
arguments[i] = arguments[i] * factor; |
||||
} |
||||
} else if (typeof dw == "undefined") { |
||||
arguments[1] *= factor; |
||||
arguments[2] *= factor; |
||||
arguments[3] *= factor; |
||||
arguments[4] *= factor; |
||||
} |
||||
|
||||
drawImage.apply(this, arguments); |
||||
}; |
||||
} |
||||
|
||||
/** |
||||
* Check whether the user's browser supports Data URI or not |
||||
* |
||||
* @private |
||||
* @param {Function} fSuccess Occurs if it supports Data URI |
||||
* @param {Function} fFail Occurs if it doesn't support Data URI |
||||
*/ |
||||
function _safeSetDataURI(fSuccess, fFail) { |
||||
var self = this; |
||||
self._fFail = fFail; |
||||
self._fSuccess = fSuccess; |
||||
|
||||
// Check it just once
|
||||
if (self._bSupportDataURI === null) { |
||||
var el = document.createElement("img"); |
||||
var fOnError = function() { |
||||
self._bSupportDataURI = false; |
||||
|
||||
if (self._fFail) { |
||||
self._fFail.call(self); |
||||
} |
||||
}; |
||||
var fOnSuccess = function() { |
||||
self._bSupportDataURI = true; |
||||
|
||||
if (self._fSuccess) { |
||||
self._fSuccess.call(self); |
||||
} |
||||
}; |
||||
|
||||
el.onabort = fOnError; |
||||
el.onerror = fOnError; |
||||
el.onload = fOnSuccess; |
||||
el.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // the Image contains 1px data.
|
||||
return; |
||||
} else if (self._bSupportDataURI === true && self._fSuccess) { |
||||
self._fSuccess.call(self); |
||||
} else if (self._bSupportDataURI === false && self._fFail) { |
||||
self._fFail.call(self); |
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* Drawing QRCode by using canvas |
||||
* |
||||
* @constructor |
||||
* @param {HTMLElement} el |
||||
* @param {Object} htOption QRCode Options |
||||
*/ |
||||
var Drawing = function (el, htOption) { |
||||
this._bIsPainted = false; |
||||
this._android = _getAndroid(); |
||||
|
||||
this._htOption = htOption; |
||||
this._elCanvas = document.createElement("canvas"); |
||||
this._elCanvas.width = htOption.width; |
||||
this._elCanvas.height = htOption.height; |
||||
el.appendChild(this._elCanvas); |
||||
this._el = el; |
||||
this._oContext = this._elCanvas.getContext("2d"); |
||||
this._bIsPainted = false; |
||||
this._elImage = document.createElement("img"); |
||||
this._elImage.alt = "Scan me!"; |
||||
this._elImage.style.display = "none"; |
||||
this._el.appendChild(this._elImage); |
||||
this._bSupportDataURI = null; |
||||
}; |
||||
|
||||
/** |
||||
* Draw the QRCode |
||||
* |
||||
* @param {QRCode} oQRCode |
||||
*/ |
||||
Drawing.prototype.draw = function (oQRCode) { |
||||
var _elImage = this._elImage; |
||||
var _oContext = this._oContext; |
||||
var _htOption = this._htOption; |
||||
|
||||
var nCount = oQRCode.getModuleCount(); |
||||
var nWidth = _htOption.width / nCount; |
||||
var nHeight = _htOption.height / nCount; |
||||
var nRoundedWidth = Math.round(nWidth); |
||||
var nRoundedHeight = Math.round(nHeight); |
||||
|
||||
_elImage.style.display = "none"; |
||||
this.clear(); |
||||
|
||||
for (var row = 0; row < nCount; row++) { |
||||
for (var col = 0; col < nCount; col++) { |
||||
var bIsDark = oQRCode.isDark(row, col); |
||||
var nLeft = col * nWidth; |
||||
var nTop = row * nHeight; |
||||
_oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; |
||||
_oContext.lineWidth = 1; |
||||
_oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; |
||||
_oContext.fillRect(nLeft, nTop, nWidth, nHeight); |
||||
|
||||
// 안티 앨리어싱 방지 처리
|
||||
_oContext.strokeRect( |
||||
Math.floor(nLeft) + 0.5, |
||||
Math.floor(nTop) + 0.5, |
||||
nRoundedWidth, |
||||
nRoundedHeight |
||||
); |
||||
|
||||
_oContext.strokeRect( |
||||
Math.ceil(nLeft) - 0.5, |
||||
Math.ceil(nTop) - 0.5, |
||||
nRoundedWidth, |
||||
nRoundedHeight |
||||
); |
||||
} |
||||
} |
||||
|
||||
this._bIsPainted = true; |
||||
}; |
||||
|
||||
/** |
||||
* Make the image from Canvas if the browser supports Data URI. |
||||
*/ |
||||
Drawing.prototype.makeImage = function () { |
||||
if (this._bIsPainted) { |
||||
_safeSetDataURI.call(this, _onMakeImage); |
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* Return whether the QRCode is painted or not |
||||
* |
||||
* @return {Boolean} |
||||
*/ |
||||
Drawing.prototype.isPainted = function () { |
||||
return this._bIsPainted; |
||||
}; |
||||
|
||||
/** |
||||
* Clear the QRCode |
||||
*/ |
||||
Drawing.prototype.clear = function () { |
||||
this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height); |
||||
this._bIsPainted = false; |
||||
}; |
||||
|
||||
/** |
||||
* @private |
||||
* @param {Number} nNumber |
||||
*/ |
||||
Drawing.prototype.round = function (nNumber) { |
||||
if (!nNumber) { |
||||
return nNumber; |
||||
} |
||||
|
||||
return Math.floor(nNumber * 1000) / 1000; |
||||
}; |
||||
|
||||
return Drawing; |
||||
})(); |
||||
|
||||
/** |
||||
* Get the type by string length |
||||
* |
||||
* @private |
||||
* @param {String} sText |
||||
* @param {Number} nCorrectLevel |
||||
* @return {Number} type |
||||
*/ |
||||
function _getTypeNumber(sText, nCorrectLevel) { |
||||
var nType = 1; |
||||
var length = _getUTF8Length(sText); |
||||
|
||||
for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) { |
||||
var nLimit = 0; |
||||
|
||||
switch (nCorrectLevel) { |
||||
case QRErrorCorrectLevel.L : |
||||
nLimit = QRCodeLimitLength[i][0]; |
||||
break; |
||||
case QRErrorCorrectLevel.M : |
||||
nLimit = QRCodeLimitLength[i][1]; |
||||
break; |
||||
case QRErrorCorrectLevel.Q : |
||||
nLimit = QRCodeLimitLength[i][2]; |
||||
break; |
||||
case QRErrorCorrectLevel.H : |
||||
nLimit = QRCodeLimitLength[i][3]; |
||||
break; |
||||
} |
||||
|
||||
if (length <= nLimit) { |
||||
break; |
||||
} else { |
||||
nType++; |
||||
} |
||||
} |
||||
|
||||
if (nType > QRCodeLimitLength.length) { |
||||
throw new Error("Too long data"); |
||||
} |
||||
|
||||
return nType; |
||||
} |
||||
|
||||
function _getUTF8Length(sText) { |
||||
var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a'); |
||||
return replacedText.length + (replacedText.length != sText ? 3 : 0); |
||||
} |
||||
|
||||
/** |
||||
* @class QRCode |
||||
* @constructor |
||||
* @example |
||||
* new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie"); |
||||
* |
||||
* @example |
||||
* var oQRCode = new QRCode("test", { |
||||
* text : "http://naver.com", |
||||
* width : 128, |
||||
* height : 128 |
||||
* }); |
||||
* |
||||
* oQRCode.clear(); // Clear the QRCode.
|
||||
* oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode.
|
||||
* |
||||
* @param {HTMLElement|String} el target element or 'id' attribute of element. |
||||
* @param {Object|String} vOption |
||||
* @param {String} vOption.text QRCode link data |
||||
* @param {Number} [vOption.width=256] |
||||
* @param {Number} [vOption.height=256] |
||||
* @param {String} [vOption.colorDark="#000000"] |
||||
* @param {String} [vOption.colorLight="#ffffff"] |
||||
* @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H] |
||||
*/ |
||||
QRCode = function (el, vOption) { |
||||
this._htOption = { |
||||
width : 256, |
||||
height : 256, |
||||
typeNumber : 4, |
||||
colorDark : "#000000", |
||||
colorLight : "#ffffff", |
||||
correctLevel : QRErrorCorrectLevel.H |
||||
}; |
||||
|
||||
if (typeof vOption === 'string') { |
||||
vOption = { |
||||
text : vOption |
||||
}; |
||||
} |
||||
|
||||
// Overwrites options
|
||||
if (vOption) { |
||||
for (var i in vOption) { |
||||
this._htOption[i] = vOption[i]; |
||||
} |
||||
} |
||||
|
||||
if (typeof el == "string") { |
||||
el = document.getElementById(el); |
||||
} |
||||
|
||||
if (this._htOption.useSVG) { |
||||
Drawing = svgDrawer; |
||||
} |
||||
|
||||
this._android = _getAndroid(); |
||||
this._el = el; |
||||
this._oQRCode = null; |
||||
this._oDrawing = new Drawing(this._el, this._htOption); |
||||
|
||||
if (this._htOption.text) { |
||||
this.makeCode(this._htOption.text); |
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* Make the QRCode |
||||
* |
||||
* @param {String} sText link data |
||||
*/ |
||||
QRCode.prototype.makeCode = function (sText) { |
||||
this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel); |
||||
this._oQRCode.addData(sText); |
||||
this._oQRCode.make(); |
||||
this._el.title = sText; |
||||
this._oDrawing.draw(this._oQRCode); |
||||
this.makeImage(); |
||||
}; |
||||
|
||||
/** |
||||
* Make the Image from Canvas element |
||||
* - It occurs automatically |
||||
* - Android below 3 doesn't support Data-URI spec. |
||||
* |
||||
* @private |
||||
*/ |
||||
QRCode.prototype.makeImage = function () { |
||||
if (typeof this._oDrawing.makeImage == "function" && (!this._android || this._android >= 3)) { |
||||
this._oDrawing.makeImage(); |
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* Clear the QRCode |
||||
*/ |
||||
QRCode.prototype.clear = function () { |
||||
this._oDrawing.clear(); |
||||
}; |
||||
|
||||
/** |
||||
* @name QRCode.CorrectLevel |
||||
*/ |
||||
QRCode.CorrectLevel = QRErrorCorrectLevel; |
||||
})(); |
@ -1,288 +1,220 @@ |
||||
{% include 'header.html' %} |
||||
{% from 'style.html' import breadcrumb_line_svg, page_back_svg, page_forwards_svg, filter_clear_svg, filter_apply_svg, circular_arrows_svg, input_arrow_down_svg %} |
||||
<div class="container mx-auto"> |
||||
<section class="p-5 mt-5"> |
||||
<div class="flex flex-wrap items-center -m-2"> |
||||
<div class="w-full md:w-1/2 p-2"> |
||||
<ul class="flex flex-wrap items-center gap-x-3 mb-2"> |
||||
<li> |
||||
<a class="flex font-medium text-xs text-coolGray-500 dark:text-gray-300 hover:text-coolGray-700" href="/"> |
||||
<p>Home</p> |
||||
</a> |
||||
</li> |
||||
<li> |
||||
<svg width="6" height="15" viewBox="0 0 6 15" fill="none" xmlns="http://www.w3.org/2000/svg"> |
||||
<path d="M5.34 0.671999L2.076 14.1H0.732L3.984 0.671999H5.34Z" fill="#BBC3CF"></path> |
||||
</svg> |
||||
</li> |
||||
<li> |
||||
<a class="flex font-medium text-xs text-coolGray-500 dark:text-gray-300 hover:text-coolGray-700" href="#">{{ page_type_available }} {{ page_type_received }} {{ page_type_sent }}</a> |
||||
</li> |
||||
<li> |
||||
<svg width="6" height="15" viewBox="0 0 6 15" fill="none" xmlns="http://www.w3.org/2000/svg"> |
||||
<path d="M5.34 0.671999L2.076 14.1H0.732L3.984 0.671999H5.34Z" fill="#BBC3CF"></path> |
||||
</svg> |
||||
</li> |
||||
</ul> |
||||
</div> |
||||
</div> |
||||
</section> |
||||
<section class="py-4"> |
||||
<div class="container px-4 mx-auto"> |
||||
<div class="relative py-11 px-16 bg-coolGray-900 dark:bg-blue-500 rounded-md overflow-hidden"> |
||||
<img class="absolute z-10 left-4 top-4" src="/static/images/elements/dots-red.svg" alt=""> |
||||
<img class="absolute z-10 right-4 bottom-4" src="/static/images/elements/dots-red.svg" alt=""> |
||||
<img class="absolute h-64 left-1/2 top-1/2 transform -translate-x-1/2 -translate-y-1/2 object-cover" src="/static/images/elements/wave.svg" alt=""> |
||||
<div class="relative z-20 flex flex-wrap items-center -m-3"> |
||||
<div class="w-full md:w-1/2 p-3"> |
||||
<h2 class="mb-6 text-4xl font-bold text-white tracking-tighter">{{ page_type_available }} {{ page_type_received }} {{ page_type_sent }}</h2> |
||||
<p class="font-normal text-coolGray-200 dark:text-white">{{ page_type_available_description }} {{ page_type_received_description }} {{ page_type_sent_description }}</p> |
||||
</div> |
||||
<div class="w-full md:w-1/2 p-3 p-6 container flex flex-wrap items-center justify-end items-center mx-auto"> {% if refresh %} <a id="refresh" href="/bid/{{ bid_id }}" class="flex flex-wrap justify-center px-5 py-4 bg-blue-500 hover:bg-blue-600 font-medium text-sm text-white border border-blue-500 rounded-md shadow-button focus:ring-0 focus:outline-none"> |
||||
<svg class="text-gray-500 w-5 h-5 mr-2" xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 24 24"> |
||||
<g fill="#ffffff"> |
||||
<path fill="#ffffff" d="M12,3c1.989,0,3.873,0.65,5.43,1.833l-3.604,3.393l9.167,0.983L22.562,0l-3.655,3.442 C16.957,1.862,14.545,1,12,1C5.935,1,1,5.935,1,12h2C3,7.037,7.037,3,12,3z"></path> |
||||
<path data-color="color-2" d="M12,21c-1.989,0-3.873-0.65-5.43-1.833l3.604-3.393l-9.167-0.983L1.438,24l3.655-3.442 C7.043,22.138,9.455,23,12,23c6.065,0,11-4.935,11-11h-2C21,16.963,16.963,21,12,21z"></path> |
||||
</g> |
||||
</svg> |
||||
<span>Refresh {{ refresh }} seconds</span> |
||||
</a> |
||||
{% endif %} |
||||
<section class="p-5 mt-5"> |
||||
<div class="flex flex-wrap items-center -m-2"> |
||||
<div class="w-full md:w-1/2 p-2"> |
||||
<ul class="flex flex-wrap items-center gap-x-3 mb-2"> |
||||
<li> |
||||
<a class="flex font-medium text-xs text-coolGray-500 dark:text-gray-300 hover:text-coolGray-700" href="/"><p>Home</p></a> |
||||
</li> |
||||
<li> {{ breadcrumb_line_svg | safe }} </li> |
||||
<li> <a class="flex font-medium text-xs text-coolGray-500 dark:text-gray-300 hover:text-coolGray-700" href="#">{{ page_type_available }} {{ page_type_received }} {{ page_type_sent }}</a> </li> |
||||
<li> {{ breadcrumb_line_svg | safe }} </li> |
||||
</ul> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</section> |
||||
{% include 'inc_messages.html' %} |
||||
<div class="pl-6 pr-6 pt-0 pb-0 mt-5 h-full overflow-hidden"> |
||||
<div class="pb-6 border-coolGray-100"> |
||||
<div class="flex flex-wrap items-center justify-between -m-2"> |
||||
<div class="w-full pt-2"> |
||||
<form method="post"> |
||||
<div class="flex justify-between items-center pb-4 dark:text-white"> |
||||
<div class="rounded-b-md"> |
||||
<div class="w-full md:w-0/12"> |
||||
<div class="flex flex-wrap justify-end -m-1.5"> |
||||
<div class="w-full md:w-auto p-1.5"> |
||||
<div class="relative"> |
||||
<svg class="absolute right-4 top-1/2 transform -translate-y-1/2" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> |
||||
<path d="M11.3333 6.1133C11.2084 5.98913 11.0395 5.91943 10.8633 5.91943C10.6872 5.91943 10.5182 5.98913 10.3933 6.1133L8.00001 8.47329L5.64001 6.1133C5.5151 5.98913 5.34613 5.91943 5.17001 5.91943C4.99388 5.91943 4.82491 5.98913 4.70001 6.1133C4.63752 6.17527 4.58792 6.249 4.55408 6.33024C4.52023 6.41148 4.50281 6.49862 4.50281 6.58663C4.50281 6.67464 4.52023 6.76177 4.55408 6.84301C4.58792 6.92425 4.63752 6.99799 4.70001 7.05996L7.52667 9.88663C7.58865 9.94911 7.66238 9.99871 7.74362 10.0326C7.82486 10.0664 7.912 10.0838 8.00001 10.0838C8.08801 10.0838 8.17515 10.0664 8.25639 10.0326C8.33763 9.99871 8.41136 9.94911 8.47334 9.88663L11.3333 7.05996C11.3958 6.99799 11.4454 6.92425 11.4793 6.84301C11.5131 6.76177 11.5305 6.67464 11.5305 6.58663C11.5305 6.49862 11.5131 6.41148 11.4793 6.33024C11.4454 6.249 11.3958 6.17527 11.3333 6.1133Z" fill="#8896AB"></path> |
||||
</svg> |
||||
<select name="sort_by" class="hover:border-blue-500 bg-gray-50 text-gray-900 appearance-none pr-10 dark:bg-gray-500 dark:text-white border border-gray-300 dark:border-gray-400 dark:text-gray-50 dark:placeholder-gray-50 text-sm rounded-lg outline-none focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 focus:ring-0"> |
||||
<option value="created_at" {% if filters.sort_by=='created_at' %} selected{% endif %}>Time At</option> |
||||
</select> |
||||
</div> |
||||
</div> |
||||
<div class="w-full md:w-auto p-1.5"> |
||||
<div class="relative"> |
||||
<svg class="absolute right-4 top-1/2 transform -translate-y-1/2" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> |
||||
<path d="M11.3333 6.1133C11.2084 5.98913 11.0395 5.91943 10.8633 5.91943C10.6872 5.91943 10.5182 5.98913 10.3933 6.1133L8.00001 8.47329L5.64001 6.1133C5.5151 5.98913 5.34613 5.91943 5.17001 5.91943C4.99388 5.91943 4.82491 5.98913 4.70001 6.1133C4.63752 6.17527 4.58792 6.249 4.55408 6.33024C4.52023 6.41148 4.50281 6.49862 4.50281 6.58663C4.50281 6.67464 4.52023 6.76177 4.55408 6.84301C4.58792 6.92425 4.63752 6.99799 4.70001 7.05996L7.52667 9.88663C7.58865 9.94911 7.66238 9.99871 7.74362 10.0326C7.82486 10.0664 7.912 10.0838 8.00001 10.0838C8.08801 10.0838 8.17515 10.0664 8.25639 10.0326C8.33763 9.99871 8.41136 9.94911 8.47334 9.88663L11.3333 7.05996C11.3958 6.99799 11.4454 6.92425 11.4793 6.84301C11.5131 6.76177 11.5305 6.67464 11.5305 6.58663C11.5305 6.49862 11.5131 6.41148 11.4793 6.33024C11.4454 6.249 11.3958 6.17527 11.3333 6.1133Z" fill="#8896AB"></path> |
||||
</svg> |
||||
<select name="sort_dir" class="hover:border-blue-500 bg-gray-50 text-gray-900 appearance-none pr-10 dark:bg-gray-500 dark:text-white border border-gray-300 dark:border-gray-400 dark:text-gray-50 dark:placeholder-gray-50 text-sm rounded-lg outline-none focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 focus:ring-0"> |
||||
<option value="asc" {% if filters.sort_dir=='asc' %} selected{% endif %}>Ascending</option> |
||||
<option value="desc" {% if filters.sort_dir=='desc' %} selected{% endif %}>Descending</option> |
||||
</select> |
||||
</div> |
||||
</div> |
||||
<div class="flex items-center"> |
||||
<div class="w-full md:w-auto p-1.5"> |
||||
<p class="text-sm font-heading bold">State:</p> |
||||
</div> |
||||
</div> |
||||
<div class="w-full md:w-auto p-1.5"> |
||||
<div class="relative"> |
||||
<svg class="absolute right-4 top-1/2 transform -translate-y-1/2" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> |
||||
<path d="M11.3333 6.1133C11.2084 5.98913 11.0395 5.91943 10.8633 5.91943C10.6872 5.91943 10.5182 5.98913 10.3933 6.1133L8.00001 8.47329L5.64001 6.1133C5.5151 5.98913 5.34613 5.91943 5.17001 5.91943C4.99388 5.91943 4.82491 5.98913 4.70001 6.1133C4.63752 6.17527 4.58792 6.249 4.55408 6.33024C4.52023 6.41148 4.50281 6.49862 4.50281 6.58663C4.50281 6.67464 4.52023 6.76177 4.55408 6.84301C4.58792 6.92425 4.63752 6.99799 4.70001 7.05996L7.52667 9.88663C7.58865 9.94911 7.66238 9.99871 7.74362 10.0326C7.82486 10.0664 7.912 10.0838 8.00001 10.0838C8.08801 10.0838 8.17515 10.0664 8.25639 10.0326C8.33763 9.99871 8.41136 9.94911 8.47334 9.88663L11.3333 7.05996C11.3958 6.99799 11.4454 6.92425 11.4793 6.84301C11.5131 6.76177 11.5305 6.67464 11.5305 6.58663C11.5305 6.49862 11.5131 6.41148 11.4793 6.33024C11.4454 6.249 11.3958 6.17527 11.3333 6.1133Z" fill="#8896AB"></path> |
||||
</svg> |
||||
<select name="state" class="hover:border-blue-500 bg-gray-50 text-gray-900 appearance-none pr-10 dark:bg-gray-500 dark:text-white border border-gray-300 dark:border-gray-400 dark:text-gray-50 dark:placeholder-gray-50 text-sm rounded-lg outline-none focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 focus:ring-0"> |
||||
<option value="-1" {% if filters.bid_state_ind==-1 %} selected{% endif %}>Any</option> |
||||
{% for s in data.bid_states %} |
||||
<option value="{{ s[0] }}" {% if filters.bid_state_ind==s[0] %} selected{% endif %}>{{ s[1] }}</option> |
||||
{% endfor %} |
||||
</select> |
||||
</div> |
||||
</div> |
||||
<div class="flex items-center"> |
||||
<div class="w-full md:w-auto p-1.5"> |
||||
<p class="text-sm font-heading bold">Include Expired:</p> |
||||
</div> |
||||
</section> |
||||
<section class="py-4"> |
||||
<div class="container px-4 mx-auto"> |
||||
<div class="relative py-11 px-16 bg-coolGray-900 dark:bg-blue-500 rounded-md overflow-hidden"> |
||||
<img class="absolute z-10 left-4 top-4" src="/static/images/elements/dots-red.svg" alt=""> <img class="absolute z-10 right-4 bottom-4" src="/static/images/elements/dots-red.svg" alt=""> |
||||
<img class="absolute h-64 left-1/2 top-1/2 transform -translate-x-1/2 -translate-y-1/2 object-cover" src="/static/images/elements/wave.svg" alt=""> |
||||
<div class="relative z-20 flex flex-wrap items-center -m-3"> |
||||
<div class="w-full md:w-1/2 p-3"> |
||||
<h2 class="mb-6 text-4xl font-bold text-white tracking-tighter">{{ page_type_available }} {{ page_type_received }} {{ page_type_sent }}</h2> |
||||
<p class="font-normal text-coolGray-200 dark:text-white">{{ page_type_available_description }} {{ page_type_received_description }} {{ page_type_sent_description }}</p> |
||||
</div> |
||||
<div class="w-full md:w-auto p-1.5"> |
||||
<div class="relative"> |
||||
<svg class="absolute right-4 top-1/2 transform -translate-y-1/2" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> |
||||
<path d="M11.3333 6.1133C11.2084 5.98913 11.0395 5.91943 10.8633 5.91943C10.6872 5.91943 10.5182 5.98913 10.3933 6.1133L8.00001 8.47329L5.64001 6.1133C5.5151 5.98913 5.34613 5.91943 5.17001 5.91943C4.99388 5.91943 4.82491 5.98913 4.70001 6.1133C4.63752 6.17527 4.58792 6.249 4.55408 6.33024C4.52023 6.41148 4.50281 6.49862 4.50281 6.58663C4.50281 6.67464 4.52023 6.76177 4.55408 6.84301C4.58792 6.92425 4.63752 6.99799 4.70001 7.05996L7.52667 9.88663C7.58865 9.94911 7.66238 9.99871 7.74362 10.0326C7.82486 10.0664 7.912 10.0838 8.00001 10.0838C8.08801 10.0838 8.17515 10.0664 8.25639 10.0326C8.33763 9.99871 8.41136 9.94911 8.47334 9.88663L11.3333 7.05996C11.3958 6.99799 11.4454 6.92425 11.4793 6.84301C11.5131 6.76177 11.5305 6.67464 11.5305 6.58663C11.5305 6.49862 11.5131 6.41148 11.4793 6.33024C11.4454 6.249 11.3958 6.17527 11.3333 6.1133Z" fill="#8896AB"></path> |
||||
</svg> |
||||
<select name="with_expired" class="hover:border-blue-500 bg-gray-50 text-gray-900 appearance-none pr-10 dark:bg-gray-500 dark:text-white border border-gray-300 dark:border-gray-400 dark:text-gray-50 dark:placeholder-gray-50 text-sm rounded-lg outline-none focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 focus:ring-0"> |
||||
<option value="true" {% if filters.with_expired==true %} selected{% endif %}>Include</option> |
||||
<option value="false" {% if filters.with_expired==false %} selected{% endif %}>Exclude</option> |
||||
</select> |
||||
</div> |
||||
</div> |
||||
<div class="w-full md:w-auto p-1.5"> |
||||
<div class="relative"> |
||||
<button type="submit" name='clearfilters' value="Clear Filters" class="flex flex-wrap justify-center w-full px-4 py-2.5 font-medium text-sm text-white bg-blue-500 hover:bg-blue-600 rounded-lg transition duration-200 border border-blue-500 rounded-md shadow-button focus:ring-0 focus:outline-none"> |
||||
<svg class="mr-2 w-5 h-5" xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 24 24"> |
||||
<g stroke-linecap="round" stroke-width="2" fill="none" stroke="#fff" stroke-linejoin="round"> |
||||
<line x1="20" y1="2" x2="12.329" y2="11.506"></line> |
||||
<path d="M11,11a2,2,0,0,1,2,2,3.659,3.659,0,0,1-.2.891A9.958,9.958,0,0,0,13.258,23H1C1,16.373,4.373,11,11,11Z"></path> |
||||
<line x1="18" y1="15" x2="23" y2="15" stroke="#fff"></line> |
||||
<line x1="17" y1="19" x2="23" y2="19" stroke="#fff"></line> |
||||
<line x1="19" y1="23" x2="23" y2="23" stroke="#fff"></line> |
||||
<path d="M8.059,11.415A3.9,3.9,0,0,0,12,16c.041,0,.079-.011.12-.012" data-cap="butt"></path> |
||||
<path d="M5,23a13.279,13.279,0,0,1,.208-3.4" data-cap="butt"></path> |
||||
<path d="M9.042,23c-.688-1.083-.313-3.4-.313-3.4" data-cap="butt"></path> |
||||
</g> |
||||
</svg> |
||||
<span>Clear</span> |
||||
</button> |
||||
</div> |
||||
</div> |
||||
<div class="w-full md:w-auto p-1.5"> |
||||
<div class="relative"> |
||||
<button type="submit" name='applyfilters' value="Apply Filters" class="flex flex-wrap justify-center w-full px-4 py-2.5 font-medium text-sm text-white bg-blue-500 hover:bg-blue-600 rounded-lg transition duration-200 border border-blue-500 rounded-md shadow-button focus:ring-0 focus:outline-none"> |
||||
<svg class="mr-2 w-5 h-5" xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 24 24"> |
||||
<g stroke-linecap="round" stroke-width="2" fill="none" stroke="#fff" stroke-linejoin="round"> |
||||
<rect x="2" y="2" width="7" height="7"></rect> |
||||
<rect x="15" y="15" width="7" height="7"></rect> |
||||
<rect x="2" y="15" width="7" height="7"></rect> |
||||
<polyline points="15 6 17 8 22 3" stroke="#fff"></polyline> |
||||
</g> |
||||
</svg> |
||||
<span>Apply Filters</span> |
||||
</button> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div class="w-full md:w-1/2 p-3 p-6 container flex flex-wrap items-center justify-end items-center mx-auto"> |
||||
{% if refresh %} |
||||
<a id="refresh" href="/bid/{{ bid_id }}" class="rounded-full mr-5 flex flex-wrap justify-center px-5 py-3 bg-blue-500 hover:bg-blue-600 font-medium text-sm text-white border dark:bg-gray-500 dark:hover:bg-gray-700 border-blue-500 rounded-md shadow-button focus:ring-0 focus:outline-none"> |
||||
{{ circular_arrows_svg | safe }} |
||||
<span>Refresh {{ refresh }} seconds</span> |
||||
</a> |
||||
{% endif %} |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div class="container mt-5 mx-auto"> |
||||
<div class="pt-6 pb-6 bg-coolGray-100 dark:bg-gray-500 rounded-xl"> |
||||
<div class="px-6"> |
||||
<div class="w-full mt-6 pb-6 overflow-x-auto"> |
||||
<table class="w-full min-w-max"> |
||||
<thead class="uppercase"> |
||||
<tr class="text-left"> |
||||
<th class="p-0"> |
||||
<div class="py-3 px-6 rounded-tl-xl bg-coolGray-200 dark:bg-gray-600"> |
||||
<span class="text-xs text-gray-600 dark:text-gray-300 font-semibold">Date/Time at</span> |
||||
</div> |
||||
</th> |
||||
<th class="p-0"> |
||||
<div class="py-3 px-6 bg-coolGray-200 dark:bg-gray-600"> |
||||
<span class="text-xs text-gray-600 dark:text-gray-300 font-semibold">Bid ID</span> |
||||
</div> |
||||
</th> |
||||
<th class="p-0"> |
||||
<div class="py-3 px-6 bg-coolGray-200 dark:bg-gray-600"> |
||||
<span class="text-xs text-gray-600 dark:text-gray-300 font-semibold">Offer ID</span> |
||||
</div> |
||||
</th> |
||||
<th class="p-0"> |
||||
<div class="py-3 px-6 bg-coolGray-200 dark:bg-gray-600"> |
||||
<span class="text-xs text-gray-600 dark:text-gray-300 font-semibold">Bid From</span> |
||||
</div> |
||||
</th> |
||||
<th class="p-0"> |
||||
<div class="py-3 px-6 bg-coolGray-200 dark:bg-gray-600"> |
||||
<span class="text-xs text-gray-600 dark:text-gray-300 font-semibold">Bid Status</span> |
||||
</div> |
||||
</th> |
||||
<th class="p-0"> |
||||
<div class="py-3 px-6 bg-coolGray-200 dark:bg-gray-600"> |
||||
<span class="text-xs text-gray-600 dark:text-gray-300 font-semibold">ITX Status</span> |
||||
</div> |
||||
</th> |
||||
<th class="p-0"> |
||||
<div class="py-3 px-6 bg-coolGray-200 dark:bg-gray-600"> |
||||
<span class="text-xs text-gray-600 dark:text-gray-300 font-semibold">PTX Status</span> |
||||
</div> |
||||
</th> |
||||
<th class="p-0"> |
||||
<div class="py-3 px-6 rounded-tr-xl bg-coolGray-200 dark:bg-gray-600"> |
||||
<span class="text-xs text-gray-600 dark:text-gray-300 font-semibold">Details</span> |
||||
</div> |
||||
</th> |
||||
</tr> |
||||
</thead> |
||||
<tbody> |
||||
{% for b in bids %} |
||||
<tr class="opacity-100 text-gray-500 dark:text-gray-100 hover:bg-coolGray-200 dark:hover:bg-gray-600"> |
||||
<th scope="row" class="flex items-center py-7 px-46 text-gray-900 whitespace-nowrap"> |
||||
<svg class="w-5 h-5 rounded-full ml-5" xmlns="http://www.w3.org/2000/svg" height="20" width="20" viewBox="0 0 24 24"> |
||||
<g stroke-linecap="round" stroke-width="2" fill="none" stroke="#6b7280" stroke-linejoin="round"> |
||||
<circle cx="12" cy="12" r="11"></circle> |
||||
<polyline points=" 12,6 12,12 18,12 " stroke="#6b7280"></polyline> |
||||
</g> |
||||
</svg> |
||||
<div class="pl-3"> |
||||
<div class="font-semibold text-xs dark:text-white">{{ b[0] }}</div> |
||||
</div> |
||||
</th> |
||||
<td class="py-3 px-6 text-xs monospace"> |
||||
<a href=/bid/{{ b[1] }}>{{ b[1]|truncate(20, True) }}</a> |
||||
</td> |
||||
<td class="py-3 px-6 text-xs monospace"> |
||||
<a href=/offer/{{ b[2] }}>{{ b[2]|truncate(20, True) }}</a> |
||||
</td> |
||||
<td class="py-3 px-6 text-xs monospace"> |
||||
<a href=/identity/{{ b[6] }}>{{ b[6] }}</a> |
||||
</td> |
||||
<td class="py-3 px-6 text-xs">{{ b[3] }}</td> |
||||
<td class="py-3 px-6 text-xs">{{ b[4] }}</td> |
||||
<td class="py-3 px-6 text-xs">{{ b[5] }}</td> |
||||
{% if page_type_received or page_type_sent %} |
||||
<td class="py-3 px-6 text-xs"> |
||||
<a class="inline-block w-20 py-1 px-2 font-medium text-center text-sm rounded-md bg-blue-500 text-white border border-blue-500 hover:bg-blue-600 transition duration-200 bg-blue-500 text-white hover:bg-blue-600 transition duration-200" href="/bid/{{ b[1] }}">Details</a> |
||||
</td> |
||||
{% elif page_type_available %} |
||||
<td class="py-3 px-6 text-xs"> |
||||
<a class="inline-block w-20 py-1 px-2 font-medium text-center text-sm rounded-md bg-blue-500 text-white border border-blue-500 hover:bg-blue-600 transition duration-200 bg-blue-500 text-white hover:bg-blue-600 transition duration-200" href="/bid/{{ b[1] }}">Accept</a> |
||||
</td> |
||||
{% endif %} |
||||
</tr> |
||||
</tbody> |
||||
{% endfor %} |
||||
</table> |
||||
<input type="hidden" name="formid" value="{{ form_id }}"> |
||||
<input type="hidden" name="pageno" value="{{ filters.page_no }}"> |
||||
</div> |
||||
</div> |
||||
|
||||
<div class="rounded-b-md"> |
||||
<div class="w-full md:w-0/12"> |
||||
<div class="flex flex-wrap justify-end pt-6 pr-6 border-t border-gray-100 dark:border-gray-400"> |
||||
{% if filters.page_no > 1 %} |
||||
</div> |
||||
</div> |
||||
</section> |
||||
{% include 'inc_messages.html' %} |
||||
<div class="pl-6 pr-6 pt-0 pb-0 mt-5 h-full overflow-hidden"> |
||||
<div class="pb-6 border-coolGray-100"> |
||||
<div class="flex flex-wrap items-center justify-between -m-2"> |
||||
<div class="w-full mx-auto pt-2"> |
||||
<form method="post"> |
||||
<div class="flex items-center justify-center pb-4 dark:text-white"> |
||||
<div class="rounded-b-md"> |
||||
<div class="w-full md:w-0/12"> |
||||
<div class="flex flex-wrap justify-center -m-1.5"> |
||||
<div class="w-full md:w-auto p-1.5"> |
||||
<button type="submit" name='pageback' value="Previous" class="inline-flex items-center h-9 py-1 px-4 text-xs text-blue-50 font-semibold bg-blue-500 hover:bg-blue-600 rounded-lg transition duration-200 focus:ring-0 focus:outline-none"> |
||||
{{ page_back_svg | safe }} |
||||
<span>Previous</span> |
||||
</button> |
||||
<div class="relative"> |
||||
{{ input_arrow_down_svg | safe }} |
||||
<select name="sort_by" class="hover:border-blue-500 bg-gray-50 text-gray-900 appearance-none pr-10 dark:bg-gray-500 dark:text-white border border-gray-300 dark:border-gray-400 dark:text-gray-50 dark:placeholder-gray-50 text-sm rounded-lg outline-none focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 focus:ring-0"> |
||||
<option value="created_at" {% if filters.sort_by=='created_at' %} selected{% endif %}>Time At</option> |
||||
</select> |
||||
</div> |
||||
</div> |
||||
<div class="w-full md:w-auto p-1.5"> |
||||
<div class="relative"> |
||||
{{ input_arrow_down_svg | safe }} |
||||
<select name="sort_dir" class="hover:border-blue-500 bg-gray-50 text-gray-900 appearance-none pr-10 dark:bg-gray-500 dark:text-white border border-gray-300 dark:border-gray-400 dark:text-gray-50 dark:placeholder-gray-50 text-sm rounded-lg outline-none focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 focus:ring-0"> |
||||
<option value="asc" {% if filters.sort_dir=='asc' %} selected{% endif %}>Ascending</option> |
||||
<option value="desc" {% if filters.sort_dir=='desc' %} selected{% endif %}>Descending</option> |
||||
</select> |
||||
</div> |
||||
</div> |
||||
{% endif %} |
||||
<div class="flex items-center"> |
||||
<div class="w-full md:w-auto p-1.5"> |
||||
<p class="text-sm font-heading dark:text-white">Page: {{ filters.page_no }}</p> |
||||
</div> |
||||
<div class="w-full md:w-auto p-1.5"> |
||||
<p class="text-sm font-heading bold">State:</p> |
||||
</div> |
||||
</div> |
||||
<div class="w-full md:w-auto p-1.5"> |
||||
<div class="relative"> |
||||
{{ input_arrow_down_svg | safe }} |
||||
<select name="state" class="hover:border-blue-500 bg-gray-50 text-gray-900 appearance-none pr-10 dark:bg-gray-500 dark:text-white border border-gray-300 dark:border-gray-400 dark:text-gray-50 dark:placeholder-gray-50 text-sm rounded-lg outline-none focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 focus:ring-0"> |
||||
<option value="-1" {% if filters.bid_state_ind==-1 %} selected{% endif %}>Any</option> |
||||
{% for s in data.bid_states %} |
||||
<option value="{{ s[0] }}" {% if filters.bid_state_ind==s[0] %} selected{% endif %}>{{ s[1] }}</option> |
||||
{% endfor %} |
||||
</select> |
||||
</div> |
||||
</div> |
||||
<div class="flex items-center"> |
||||
<div class="w-full md:w-auto p-1.5"> |
||||
<p class="text-sm font-heading bold">Include Expired:</p> |
||||
</div> |
||||
</div> |
||||
<div class="w-full md:w-auto p-1.5"> |
||||
<div class="relative"> |
||||
{{ input_arrow_down_svg | safe }} |
||||
<select name="with_expired" class="hover:border-blue-500 bg-gray-50 text-gray-900 appearance-none pr-10 dark:bg-gray-500 dark:text-white border border-gray-300 dark:border-gray-400 dark:text-gray-50 dark:placeholder-gray-50 text-sm rounded-lg outline-none focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 focus:ring-0"> |
||||
<option value="true" {% if filters.with_expired==true %} selected{% endif %}>Include</option> |
||||
<option value="false" {% if filters.with_expired==false %} selected{% endif %}>Exclude</option> |
||||
</select> </div> |
||||
</div> |
||||
{% if bids_count > 10 %} |
||||
<div class="w-full md:w-auto p-1.5"> |
||||
<button type="submit" name='pageforwards' value="Next" class="inline-flex items-center h-9 py-1 px-4 text-xs text-blue-50 font-semibold bg-blue-500 hover:bg-blue-600 rounded-lg transition duration-200 focus:ring-0 focus:outline-none"> |
||||
<span>Next</span> |
||||
{{ page_forwards_svg | safe }} |
||||
</button> |
||||
<div class="relative"> |
||||
<button type="submit" name='clearfilters' value="Clear Filters" class="flex flex-wrap justify-center w-full px-4 py-2.5 font-medium text-sm hover:text-white dark:text-white dark:bg-gray-500 bg-coolGray-200 hover:bg-green-600 hover:border-green-600 rounded-lg transition duration-200 border border-coolGray-200 dark:border-gray-400 rounded-md shadow-button focus:ring-0 focus:outline-none"> |
||||
<span>Clear Filters</span> |
||||
</button> |
||||
</div> |
||||
</div> |
||||
{% endif %} |
||||
<div class="w-full md:w-auto p-1.5"> |
||||
<div class="relative"> <button type="submit" name='applyfilters' value="Apply Filters" class="flex flex-wrap justify-center w-full px-4 py-2.5 font-medium text-sm text-white bg-blue-600 hover:bg-green-600 hover:border-green-600 rounded-lg transition duration-200 border border-blue-500 rounded-md shadow-button focus:ring-0 focus:outline-none"> |
||||
{{ filter_apply_svg | safe }} |
||||
<span>Apply Filters</span> |
||||
</button> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div class="container mt-5 mx-auto"> |
||||
<div class="pt-6 pb-6 bg-coolGray-100 dark:bg-gray-500 rounded-xl"> |
||||
<div class="px-6"> |
||||
<div class="w-full mt-6 pb-6 overflow-x-auto"> |
||||
<table class="w-full min-w-max"> |
||||
<thead class="uppercase"> |
||||
<tr class="text-left"> |
||||
<th class="p-0"> |
||||
<div class="py-3 px-6 rounded-tl-xl bg-coolGray-200 dark:bg-gray-600"> <span class="text-xs text-gray-600 dark:text-gray-300 font-semibold">Date/Time at</span> |
||||
</div> |
||||
</th> |
||||
<th class="p-0"> |
||||
<div class="py-3 px-6 bg-coolGray-200 dark:bg-gray-600"> <span class="text-xs text-gray-600 dark:text-gray-300 font-semibold">Bid ID</span> |
||||
</div> |
||||
</th> |
||||
<th class="p-0"> |
||||
<div class="py-3 px-6 bg-coolGray-200 dark:bg-gray-600"> <span class="text-xs text-gray-600 dark:text-gray-300 font-semibold">Offer ID</span> |
||||
</div> |
||||
</th> |
||||
<th class="p-0"> |
||||
<div class="py-3 px-6 bg-coolGray-200 dark:bg-gray-600"> <span class="text-xs text-gray-600 dark:text-gray-300 font-semibold">Bid From</span> |
||||
</div> |
||||
</th> |
||||
<th class="p-0"> |
||||
<div class="py-3 px-6 bg-coolGray-200 dark:bg-gray-600"> <span class="text-xs text-gray-600 dark:text-gray-300 font-semibold">Bid Status</span> |
||||
</div> |
||||
</th> |
||||
<th class="p-0"> |
||||
<div class="py-3 px-6 bg-coolGray-200 dark:bg-gray-600"> <span class="text-xs text-gray-600 dark:text-gray-300 font-semibold">ITX Status</span> |
||||
</div> |
||||
</th> |
||||
<th class="p-0"> |
||||
<div class="py-3 px-6 bg-coolGray-200 dark:bg-gray-600"> <span class="text-xs text-gray-600 dark:text-gray-300 font-semibold">PTX Status</span> |
||||
</div> |
||||
</th> |
||||
<th class="p-0"> |
||||
<div class="py-3 px-6 rounded-tr-xl bg-coolGray-200 dark:bg-gray-600"> <span class="text-xs text-gray-600 dark:text-gray-300 font-semibold">Details</span> |
||||
</div> |
||||
</th> |
||||
</tr> |
||||
</thead> |
||||
<tbody> |
||||
{% for b in bids %} |
||||
<tr class="opacity-100 text-gray-500 dark:text-gray-100 hover:bg-coolGray-200 dark:hover:bg-gray-600"> |
||||
<th scope="row" class="flex items-center py-7 px-46 text-gray-900 whitespace-nowrap"> <svg class="w-5 h-5 rounded-full ml-5" xmlns="http://www.w3.org/2000/svg" height="20" width="20" viewBox="0 0 24 24"> |
||||
<g stroke-linecap="round" stroke-width="2" fill="none" stroke="#6b7280" stroke-linejoin="round"> |
||||
<circle cx="12" cy="12" r="11"></circle> |
||||
<polyline points=" 12,6 12,12 18,12 " stroke="#6b7280"></polyline> |
||||
</g> |
||||
</svg> |
||||
<div class="pl-3"> |
||||
<div class="font-semibold text-xs dark:text-white">{{ b[0] }}</div> |
||||
</div> |
||||
</th> |
||||
<td class="py-3 px-6 text-xs monospace"> <a href=/bid/{{ b[1] }}>{{ b[1]|truncate(20, True) }}</a> </td> |
||||
<td class="py-3 px-6 text-xs monospace"> <a href=/offer/{{ b[2] }}>{{ b[2]|truncate(20, True) }}</a> </td> |
||||
<td class="py-3 px-6 text-xs monospace"> <a href=/identity/{{ b[6] }}>{{ b[6] }}</a> </td> |
||||
<td class="py-3 px-6 text-xs">{{ b[3] }}</td> |
||||
<td class="py-3 px-6 text-xs">{{ b[4] }}</td> |
||||
<td class="py-3 px-6 text-xs">{{ b[5] }}</td> |
||||
{% if page_type_received or page_type_sent %} |
||||
<td class="py-3 px-6 text-xs"> <a class="inline-block w-20 py-1 px-2 font-medium text-center text-sm rounded-md bg-blue-500 text-white border border-blue-500 hover:bg-blue-600 transition duration-200 bg-blue-500 text-white hover:bg-blue-600 transition duration-200" href="/bid/{{ b[1] }}">Details</a> |
||||
</td> {% elif page_type_available %} |
||||
<td class="py-3 px-6 text-xs"> <a class="inline-block w-20 py-1 px-2 font-medium text-center text-sm rounded-md bg-blue-500 text-white border border-blue-500 hover:bg-blue-600 transition duration-200 bg-blue-500 text-white hover:bg-blue-600 transition duration-200" href="/bid/{{ b[1] }}">Accept</a> |
||||
</td> |
||||
{% endif %} |
||||
</tr> |
||||
</tbody> |
||||
{% endfor %} |
||||
</table> <input type="hidden" name="formid" value="{{ form_id }}"> <input type="hidden" name="pageno" value="{{ filters.page_no }}"> |
||||
</div> |
||||
</div> |
||||
<div class="rounded-b-md"> |
||||
<div class="w-full md:w-0/12"> |
||||
<div class="flex flex-wrap justify-end pt-6 pr-6 border-t border-gray-100 dark:border-gray-400"> |
||||
{% if filters.page_no > 1 %} <div class="w-full md:w-auto p-1.5"> |
||||
<button type="submit" name='pageback' value="Previous" class="inline-flex items-center h-9 py-1 px-4 text-xs text-blue-50 font-semibold bg-blue-500 hover:bg-blue-600 rounded-lg transition duration-200 focus:ring-0 focus:outline-none"> |
||||
{{ page_back_svg | safe }} |
||||
<span>Previous</span> |
||||
</button> |
||||
</div> |
||||
{% endif %} |
||||
<div class="flex items-center"> |
||||
<div class="w-full md:w-auto p-1.5"> |
||||
<p class="text-sm font-heading dark:text-white">Page: {{ filters.page_no }}</p> |
||||
</div> |
||||
</div> |
||||
{% if bids_count > 20 %} |
||||
<div class="w-full md:w-auto p-1.5"> <button type="submit" name='pageforwards' value="Next" class="inline-flex items-center h-9 py-1 px-4 text-xs text-blue-50 font-semibold bg-blue-500 hover:bg-blue-600 rounded-lg transition duration-200 focus:ring-0 focus:outline-none"> |
||||
<span>Next</span> |
||||
{{ page_forwards_svg | safe }} |
||||
</button> |
||||
</div> |
||||
{% endif %} |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</form> |
||||
</div> |
||||
|
||||
</form> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</section> |
||||
</section> |
||||
</div> |
||||
{% include 'footer.html' %} |
||||
</body> |
||||
</html> |
||||
</html> |
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue