=a)return t[2*n];if(r[n+1]>a)return Math.floor(a/r[n])+" "+t[2*n+1]}}(e.creationDate)} ago`,getLocalDate:e=>e.ociImage?"unavailable on OCI index/Buildkit export cache":e.creationDate&&e.creationDate.toLocaleString()||"unknown"},template:(e,t,r,a)=>e('
',[{redundantAttribute:"expr171",selector:"[expr171]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>e.getDate(e.props.image)},{type:t.ATTRIBUTE,name:"title",evaluate:e=>["Creation date ",e.getLocalDate(e.props.image)].join("")}]}]),name:"image-date"},$a={css:null,exports:{onMounted(e,t){this.load(e,t)},onUpdated(e,t){this.load(e,t)},load(e,t){"number"!=typeof e.image.size&&(e.image.on("size",(e=>{this.update({size:e})})),e.image.trigger("get-size"))},getImageSize:e=>Wr(e.size)},template:(e,t,r,a)=>e('
',[{redundantAttribute:"expr173",selector:"[expr173]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>e.getImageSize(e.props.image)}]}]),name:"image-size"},Xa={css:null,exports:{onMounted(e){e.image.on("sha256",(e=>{this.update({sha256:e&&e.substring(0,19)})})),e.image.trigger("get-sha256")}},template:(e,t,r,a)=>e('
',[{redundantAttribute:"expr172",selector:"[expr172]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>e.props.image.tag},{type:t.ATTRIBUTE,name:"title",evaluate:e=>e.state.sha256}]}]),name:"image-tag"},qa={css:null,exports:{onMounted(e,t){this.load(e,t)},onUpdated(e,t){this.load(e,t)},load(e,t){e.image.contentDigest||(t.chars=-1,e.image.one("content-digest",(t=>{this.contentDigest=t,e.image.on("content-digest-chars",this.onResize),e.image.trigger("get-content-digest-chars")})),e.image.trigger("get-content-digest"))},onResize(e){e!==this.state.chars&&this.update({chars:e})},getTitle:(e,t)=>t>=70?"":e.contentDigest||"",getContentDigest:(e,t)=>t>=70?e.contentDigest||"":t<=0?"":e.contentDigest&&e.contentDigest.slice(0,t)+"..."},template:(e,t,r,a)=>e('
',[{redundantAttribute:"expr176",selector:"[expr176]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>e.getContentDigest(e.props.image,e.state.chars)},{type:t.ATTRIBUTE,name:"title",evaluate:e=>e.getTitle(e.props.image,e.state.chars)}]}]),name:"image-content-digest"},Wa={css:null,exports:{onMounted(e,t){this.load(e,t)},onUpdated(e,t){this.load(e,t)},getDockerCmd:e=>"tag"===e.target?`docker pull ${e.pullUrl}/${e.image.name}:${e.image.tag}`:`docker pull ${e.pullUrl}/${e.image.name}@${e.image.contentDigest}`,load(e,t){"tag"===e.target||e.image.contentDigest||(e.image.one("content-digest",(e=>{this.update()})),e.image.trigger("get-content-digest"))},copy(){const e=this.$("input");e.value?(e.style.display="block",e.select(),document.execCommand("copy"),e.style.display="none",this.props.onNotify("`"+e.value+"` has been copied to clipboard.")):this.props.onNotify(ea)}},template:(e,t,r,a)=>e('
',[{redundantAttribute:"expr177",selector:"[expr177]",expressions:[{type:t.VALUE,evaluate:e=>e.getDockerCmd(e.props)}]},{type:r.TAG,getComponent:a,evaluate:e=>"material-button",slots:[{id:"default",html:'content_copy ',bindings:[]}],attributes:[{type:t.EVENT,name:"onClick",evaluate:e=>e.copy}],redundantAttribute:"expr178",selector:"[expr178]"}]),name:"copy-to-clipboard"},Ka={css:null,exports:{onMounted(e){e.image.one("oci-image",(()=>{this.update()}))},buttonTittle(){return this.props.image.ociImage?"History is unavailable on OCI index/Buildkit export cache":"This will show the history of given tag"},routeToHistory(){if(!this.props.image.ociImage)return ma.history(this.props.image.name,this.props.image.tag)}},template:(e,t,r,a)=>e(' ',[{type:r.TAG,getComponent:a,evaluate:e=>"material-button",slots:[{id:"default",html:'history ',bindings:[]}],attributes:[{type:t.ATTRIBUTE,name:"title",evaluate:e=>e.buttonTittle()},{type:t.ATTRIBUTE,name:"href",evaluate:e=>e.routeToHistory()},{type:t.ATTRIBUTE,name:"disabled",evaluate:e=>e.props.image.ociImage}],redundantAttribute:"expr179",selector:"[expr179]"}]),name:"tag-history-button"},Ya={css:null,exports:{onBeforeMount(e,t){t.checked=e.checked,e.image.one("content-digest",(e=>{this.update({contentDigest:e})}))},onMounted(e,t){e.image.trigger("get-content-digest")},onBeforeUpdate(e,t){t.checked=e.checked},deleteImage(){this.props.handleCheckboxChange(tn,this.props.image)},handleCheckboxChange(e){const t=e.target.checked?Za:en;this.props.handleCheckboxChange(t,this.props.image,e.shiftKey)}},template:(e,t,r,a)=>e(' ',[{type:r.IF,evaluate:e=>!e.props.multiDelete,redundantAttribute:"expr174",selector:"[expr174]",template:e(null,[{type:r.TAG,getComponent:a,evaluate:e=>"material-button",slots:[{id:"default",html:'delete ',bindings:[]}],attributes:[{type:t.ATTRIBUTE,name:"disabled",evaluate:e=>!e.state.contentDigest},{type:t.EVENT,name:"onClick",evaluate:e=>e.deleteImage}]}])},{type:r.IF,evaluate:e=>e.props.multiDelete,redundantAttribute:"expr175",selector:"[expr175]",template:e(null,[{type:r.TAG,getComponent:a,evaluate:e=>"material-checkbox",slots:[],attributes:[{type:t.ATTRIBUTE,name:"disabled",evaluate:e=>!e.state.contentDigest},{type:t.EVENT,name:"onChange",evaluate:e=>e.handleCheckboxChange},{type:t.ATTRIBUTE,name:"checked",evaluate:e=>e.state.checked}]}])}]),name:"remove-image"},Ja={css:'architectures architectures,[is="architectures"] architectures{ display: flex; flex-direction: column; } architectures .architecture { background-color: var(--hover-background); padding: 2px 4px; border-radius: 12px; margin: 4px 0; text-align: center; } architectures .architecture:first-child { margin-top: 0; } architectures .architecture:last-child { margin-bottom: 0; }',exports:{onMounted(e,t){this.onLoad(e,t)},onUpdated(e,t){e.image!==t.image&&this.onLoad(e,t)},onLoad(e,t){return e.image.manifests?this.onList(e.image.manifests,e,t):e.image.blobs?this.onBlobs(e.image.blobs,e,t):(e.image.on("blobs",(r=>this.onBlobs(r,e,t))),void e.image.on("list",(r=>this.onList(r,e,t))))},onBlobs(e,t,r){const a=[Va(e)];t.image.manifests||this.update({architectures:a,image:t.image})},onList(e,t,r){const a=e.map((({platform:e})=>Va(e)));this.update({architectures:a,image:t.image})}},template:(e,t,r,a)=>e('
',[{type:r.EACH,getKey:null,condition:null,template:e(" ",[{expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>e.architecture}]}]),redundantAttribute:"expr180",selector:"[expr180]",itemName:"architecture",indexName:null,evaluate:e=>e.state.architectures}]),name:"architectures"},Qa={css:'confirm-delete-image,[is="confirm-delete-image"]{ color: #000; list-style-type: disc; margin-block-start: 0.7em; } confirm-delete-image material-popup .content .material-popup-content,[is="confirm-delete-image"] material-popup .content .material-popup-content{ overflow-y: auto; max-height: 250px; }',exports:{displayImagesToDelete(e,t){const r=new Set;return e.forEach((e=>{e.contentDigest&&r.add(e.contentDigest)})),t.filter((e=>r.has(e.contentDigest)))},deleteImages(){this.props.toDelete.forEach((e=>this.getContentDigestThenDelete(e,this.props))),this.props.onImageDeleted()},getContentDigestThenDelete({name:e,tag:t},r){const{registryUrl:a,onNotify:n,onAuthentication:o,isRegistrySecured:i}=r,s=new va({onAuthentication:o,withCredentials:i}),l=this;s.addEventListener("loadend",(function(){200===this.status||202===this.status?s.getContentDigest((function(a){a?l.deleteImage({name:e,tag:t,contentDigest:a},r):n(ERROR_CAN_NOT_READ_CONTENT_DIGEST)})):404===this.status?n(`Manifest for ${e}:${t} not found`,!0):n(this.responseText)})),s.open("GET",`${a}/v2/${e}/manifests/${t}`),s.setRequestHeader("Accept","application/vnd.docker.distribution.manifest.v2+json, application/vnd.oci.image.manifest.v1+json, application/vnd.docker.distribution.manifest.list.v2+json, application/vnd.oci.image.index.v1+json"),s.send()},deleteImage({name:e,tag:t,contentDigest:r},a){const{registryUrl:n,ignoreError:o,onNotify:i,onAuthentication:s,onClick:l,isRegistrySecured:u}=a,p=new va({onAuthentication:s,withCredentials:u});p.addEventListener("loadend",(function(){200===this.status||202===this.status?(ma.taglist(e),i(`Deleting ${e}:${t} image. Run \`registry garbage-collect config.yml\` on your registry`)):404===this.status?o||i({message:"Digest not found for this image in your registry.",isError:!0}):i(this.responseText),l()})),p.open("DELETE",`${n}/v2/${e}/manifests/${r}`),p.setRequestHeader("Accept","application/vnd.docker.distribution.manifest.v2+json, application/vnd.oci.image.manifest.v1+json"),p.addEventListener("error",(function(){const e=this.withCredentials?" When you use credentials on a different hostname, the registry server may fail preflight requests. Check FAQ and issue #104.":"";i({message:"An error occurred when deleting image. Check if your server accept DELETE methods Access-Control-Allow-Methods: ['DELETE']."+e,isError:!0})})),p.send()}},template:(e,t,r,a)=>e(' ',[{type:r.TAG,getComponent:a,evaluate:e=>"material-popup",slots:[{id:"default",html:'',bindings:[{type:r.EACH,getKey:null,condition:null,template:e(" ",[{expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>[e.image.name,":",e.image.tag].join("")}]}]),redundantAttribute:"expr182",selector:"[expr182]",itemName:"image",indexName:null,evaluate:e=>e.displayImagesToDelete(e.props.toDelete,e.props.tags)},{type:r.TAG,getComponent:a,evaluate:e=>"material-button",slots:[{id:"default",html:"\n Delete\n ",bindings:[]}],attributes:[{type:t.EVENT,name:"onClick",evaluate:e=>e.deleteImages}],redundantAttribute:"expr183",selector:"[expr183]"},{type:r.TAG,getComponent:a,evaluate:e=>"material-button",slots:[{id:"default",html:"\n Cancel\n ",bindings:[]}],attributes:[{type:t.EVENT,name:"onClick",evaluate:e=>e.props.onClick}],redundantAttribute:"expr184",selector:"[expr184]"}]}],attributes:[{type:t.ATTRIBUTE,name:"opened",evaluate:e=>e.props.opened},{type:t.EVENT,name:"onClick",evaluate:e=>e.props.onClick}],redundantAttribute:"expr181",selector:"[expr181]"}]),name:"confirm-delete-image"};const Za="CHECK",en="UNCHECK",tn="DELETE";var rn={css:"tag-table table th.architectures { text-align: center; }",exports:{components:{ImageDate:Ha,ImageSize:$a,ImageTag:Xa,ImageContentDigest:qa,CopyToClipboard:Wa,RemoveImage:Ya,TagHistoryButton:Ka,ConfirmDeleteImage:Qa,Architectures:Ja},onBeforeMount(e){this.state={toDelete:new Set,multiDelete:!1,page:e.page}},onBeforeUpdate(e,t){t.page!==e.page&&t.toDelete.clear(),t.page=e.page},deleteImages(){this.update({confirmDeleteImage:!0})},onConfirmDeleteImageClick(){this.state.singleDeleteAction&&this.state.toDelete.clear(),this.update({singleDeleteAction:!1,confirmDeleteImage:!1})},onRemoveImageHeaderChange(e){if(!0===e.altKey){Kr(this.props.tags,this.props.page).filter((e=>Ta(this.props.filterResults,e.tag))).forEach((e=>this.state.toDelete.add(e))),this.update({multiDelete:!0,toDelete:this.state.toDelete,selectedImage:void 0})}else this.update({multiDelete:e.target.checked,selectedImage:void 0})},onRemoveImageChange(e,t,r){let a,n=!1,o=!1;switch(e){case Za:this.state.toDelete.add(t),r&&(a=this.supportShiftKey(t,!0));break;case en:this.state.toDelete.delete(t),r&&(a=this.supportShiftKey(t,!1));break;case tn:this.state.toDelete.clear(),this.state.toDelete.add(t),n=!0,o=!0}this.update({toDelete:this.state.toDelete,confirmDeleteImage:n,singleDeleteAction:o,selectedImage:a})},supportShiftKey(e,t){if(!this.state.selectedImage)return e;{let r=!1;this.getPage(this.props.tags,this.props.page).filter((t=>t==this.state.selectedImage||t==e?(r=!r,!0):r)).forEach((e=>{t?this.state.toDelete.add(e):this.state.toDelete.delete(e)}))}},onReverseOrder(){this.state.orderType=null,this.state.desc=!1,this.props.onReverseOrder()},onPageReorder(e){this.update({orderType:e,desc:this.state.orderType&&this.state.orderType!==e||!this.state.desc})},getPage(e,t){const r=Kr(e,t,this.props.tagsPerPage);return"date"===this.state.orderType?r.sort(((e,t)=>this.state.desc?(e.creationDate?.getTime()||0)-(t.creationDate?.getTime()||0):(t.creationDate?.getTime()||0)-(e.creationDate?.getTime()||0))):"size"===this.state.orderType&&r.sort(((e,t)=>this.state.desc?e.size-t.size:t.size-e.size)),r},matchSearch:Ta},template:(e,t,r,a)=>e(' ',[{type:r.TAG,getComponent:a,evaluate:e=>"confirm-delete-image",slots:[],attributes:[{type:t.ATTRIBUTE,name:"opened",evaluate:e=>e.state.confirmDeleteImage},{type:t.EVENT,name:"on-click",evaluate:e=>e.onConfirmDeleteImageClick},{type:t.ATTRIBUTE,name:"registry-url",evaluate:e=>e.props.registryUrl},{type:t.EVENT,name:"on-notify",evaluate:e=>e.props.onNotify},{type:t.EVENT,name:"on-authentication",evaluate:e=>e.props.onAuthentication},{type:t.ATTRIBUTE,name:"tags",evaluate:e=>e.props.tags},{type:t.ATTRIBUTE,name:"to-delete",evaluate:e=>e.state.toDelete},{type:t.ATTRIBUTE,name:"is-registry-secured",evaluate:e=>e.props.isRegistrySecured},{type:t.EVENT,name:"on-image-deleted",evaluate:e=>e.props.onImageDeleted}],redundantAttribute:"expr85",selector:"[expr85]"},{type:r.TAG,getComponent:a,evaluate:e=>"material-card",slots:[{id:"default",html:'\n Creation date\n \n Size\n Arch History
',bindings:[{redundantAttribute:"expr87",selector:"[expr87]",expressions:[{type:t.ATTRIBUTE,name:"class",evaluate:e=>["creation-date ",e.state.desc&&"date"===e.state.orderType?"material-card-th-sorted-descending":"material-card-th-sorted-ascending"].join("")},{type:t.EVENT,name:"onclick",evaluate:e=>()=>e.onPageReorder("date")}]},{redundantAttribute:"expr88",selector:"[expr88]",expressions:[{type:t.ATTRIBUTE,name:"class",evaluate:e=>["image-size ",e.state.desc&&"size"===e.state.orderType?"material-card-th-sorted-descending":"material-card-th-sorted-ascending"].join("")},{type:t.EVENT,name:"onclick",evaluate:e=>()=>e.onPageReorder("size")}]},{type:r.IF,evaluate:e=>e.props.showContentDigest,redundantAttribute:"expr89",selector:"[expr89]",template:e("Content Digest",[])},{redundantAttribute:"expr90",selector:"[expr90]",expressions:[{type:t.ATTRIBUTE,name:"class",evaluate:e=>e.props.asc?"material-card-th-sorted-ascending":"material-card-th-sorted-descending"},{type:t.EVENT,name:"onclick",evaluate:e=>e.onReverseOrder}]},{type:r.IF,evaluate:e=>e.props.isImageRemoveActivated,redundantAttribute:"expr91",selector:"[expr91]",template:e(' ',[{expressions:[{type:t.ATTRIBUTE,name:"class",evaluate:e=>["remove-tag ",e.state.toDelete.size>0&&!e.state.singleDeleteAction?"delete":""].join("")}]},{type:r.IF,evaluate:e=>0===e.state.toDelete.size||e.state.singleDeleteAction,redundantAttribute:"expr92",selector:"[expr92]",template:e(null,[{type:r.TAG,getComponent:a,evaluate:e=>"material-checkbox",slots:[],attributes:[{type:t.ATTRIBUTE,name:"checked",evaluate:e=>e.state.multiDelete},{type:t.EVENT,name:"onChange",evaluate:e=>e.onRemoveImageHeaderChange}]}])},{type:r.IF,evaluate:e=>e.state.toDelete.size>0&&!e.state.singleDeleteAction,redundantAttribute:"expr93",selector:"[expr93]",template:e(null,[{type:r.TAG,getComponent:a,evaluate:e=>"material-button",slots:[{id:"default",html:'delete ',bindings:[]}],attributes:[{type:t.EVENT,name:"onClick",evaluate:e=>e.deleteImages}]}])}])},{type:r.EACH,getKey:null,condition:e=>e.matchSearch(e.props.filterResults,e.image.tag),template:e(' ',[{type:r.TAG,getComponent:a,evaluate:e=>"image-date",slots:[],attributes:[{type:t.ATTRIBUTE,name:"image",evaluate:e=>e.image}],redundantAttribute:"expr95",selector:"[expr95]"},{type:r.TAG,getComponent:a,evaluate:e=>"image-size",slots:[],attributes:[{type:t.ATTRIBUTE,name:"image",evaluate:e=>e.image}],redundantAttribute:"expr96",selector:"[expr96]"},{type:r.IF,evaluate:e=>e.props.showContentDigest,redundantAttribute:"expr97",selector:"[expr97]",template:e(' ',[{type:r.TAG,getComponent:a,evaluate:e=>"image-content-digest",slots:[],attributes:[{type:t.ATTRIBUTE,name:"image",evaluate:e=>e.image}],redundantAttribute:"expr98",selector:"[expr98]"},{type:r.TAG,getComponent:a,evaluate:e=>"copy-to-clipboard",slots:[],attributes:[{type:t.ATTRIBUTE,name:"image",evaluate:e=>e.image},{type:t.ATTRIBUTE,name:"pull-url",evaluate:e=>e.props.pullUrl},{type:t.EVENT,name:"on-notify",evaluate:e=>e.props.onNotify}],redundantAttribute:"expr99",selector:"[expr99]"}])},{type:r.TAG,getComponent:a,evaluate:e=>"image-tag",slots:[],attributes:[{type:t.ATTRIBUTE,name:"image",evaluate:e=>e.image}],redundantAttribute:"expr100",selector:"[expr100]"},{type:r.TAG,getComponent:a,evaluate:e=>"copy-to-clipboard",slots:[],attributes:[{type:t.ATTRIBUTE,name:"image",evaluate:e=>e.image},{type:t.ATTRIBUTE,name:"pull-url",evaluate:e=>e.props.pullUrl},{type:t.EVENT,name:"on-notify",evaluate:e=>e.props.onNotify}],redundantAttribute:"expr101",selector:"[expr101]"},{type:r.TAG,getComponent:a,evaluate:e=>"architectures",slots:[],attributes:[{type:t.ATTRIBUTE,name:"image",evaluate:e=>e.image}],redundantAttribute:"expr102",selector:"[expr102]"},{type:r.TAG,getComponent:a,evaluate:e=>"tag-history-button",slots:[],attributes:[{type:t.ATTRIBUTE,name:"image",evaluate:e=>e.image}],redundantAttribute:"expr103",selector:"[expr103]"},{type:r.IF,evaluate:e=>e.props.isImageRemoveActivated,redundantAttribute:"expr104",selector:"[expr104]",template:e(' ',[{type:r.TAG,getComponent:a,evaluate:e=>"remove-image",slots:[],attributes:[{type:t.ATTRIBUTE,name:"multi-delete",evaluate:e=>e.state.multiDelete},{type:t.ATTRIBUTE,name:"image",evaluate:e=>e.image},{type:t.ATTRIBUTE,name:"registry-url",evaluate:e=>e.props.registryUrl},{type:t.ATTRIBUTE,name:"handleCheckboxChange",evaluate:e=>e.onRemoveImageChange},{type:t.ATTRIBUTE,name:"checked",evaluate:e=>e.state.toDelete.has(e.image)},{type:t.EVENT,name:"on-notify",evaluate:e=>e.props.onNotify},{type:t.EVENT,name:"on-authentication",evaluate:e=>e.props.onAuthentication}],redundantAttribute:"expr105",selector:"[expr105]"}])}]),redundantAttribute:"expr94",selector:"[expr94]",itemName:"image",indexName:null,evaluate:e=>e.getPage(e.props.tags,e.props.page)}]}],attributes:[],redundantAttribute:"expr86",selector:"[expr86]"}]),name:"tag-table"},an=/(alpha-(asc|desc);num-(asc|desc))|(num-(asc|desc);alpha-(asc|desc))/,nn=function(e){var t=function(e){switch(e){case"desc":return"alpha-desc;num-desc";case"asc":return"num-asc;alpha-asc";case"alpha-desc":case"alpha-asc":case"num-desc":case"num-asc":return"".concat(e,";").concat(e.startsWith("num")?"alpha":"num","-asc");default:if(!e)return"alpha-asc;num-desc";if(an.test(e))return e;throw new wa("The taglist order `".concat(e,"` is not recognized."))}}(e).split(";").filter((function(e){return e})).map((function(e){return e.split("-").filter((function(e){return e}))})).reduce((function(e,t,r){return t.length>1&&(e[t[0]+"Asc"]="asc"===t[1]),0===r&&(e.numFirst="num"===t[0]),e}),{});return t},on=function(e,t){return e.length>0&&Zr(e[e.length-1].charAt(0))==Zr(t)?e[e.length-1]+=t:e.push(t),e},sn=function(e){return e.split("").reduce(on,[]).map((function(e){return Zr(e.charAt(0))?parseInt(e):e}))},ln=function(e,t,r){if(t===r)return 0;var a=e.numFirst?1:-1;if("number"==typeof t){var n=e.numAsc?1:-1;return"number"==typeof r?(t-r)*n:-1*a}if("number"==typeof r)return 1*a;var o=e.alphaAsc?1:-1;return t.localeCompare(r)*o},un={css:null,exports:{components:{Pagination:Fa,TagTable:rn},onBeforeMount(e){this.state={registryName:e.registryName,tags:[],loadend:!1,asc:!0,page:ma.getPageQueryParam()||1};try{this.state.taglistOrder=nn(e.taglistOrder)}catch(t){e.onNotify(t)}},onMounted(e,t){var r;this.display(e,t),window.addEventListener("resize",this.onResize),window.requestAnimationFrame(this.onResize),this.tagComparator=(r=e.taglistOrder,function(e,t){for(var a=sn(e.tag||e),n=sn(t.tag||t),o=0;osetTimeout((()=>this.display(e,t)),1e3),t.tags=[];const r=this,a=new va({onAuthentication:e.onAuthentication,withCredentials:e.isRegistrySecured});a.addEventListener("load",(function(){if(200===this.status){const a=(JSON.parse(this.responseText).tags||[]).map((t=>new za(e.image,t,{list:!0,registryUrl:e.registryUrl,onNotify:e.onNotify,onAuthentication:e.onAuthentication,useControlCacheHeader:e.useControlCacheHeader,isRegistrySecured:e.isRegistrySecured}))).sort(r.tagComparator);window.requestAnimationFrame(r.onResize),r.update({page:Math.min(t.page,Yr(a,e.tagsPerPage)),tags:a})}else 404===this.status?r.props.onNotify("Server not found",!0):r.props.onNotify(this.responseText,!0)})),a.addEventListener("error",(function(){r.props.onNotify(this.getErrorMessage(),!0),t.tags=[]})),a.addEventListener("loadend",(function(){r.update({loadend:!0})})),a.open("GET",e.registryUrl+"/v2/"+e.image+"/tags/list"),a.send(),t.asc=!0},onPageUpdate(e){const t=Jr(this.state.page,Yr(this.state.tags,this.props.tagsPerPage))[e].page;this.update({page:t}),ma.updatePageQueryParam(t)},onResize(){const e=window.innerWidth;let t=0;const r=this.state.tags.reduce((function(e,t){return t.tag.length>e?t.tag.length:e}),0);t=e>=1440?71:e<1024?0:15+(e-1024)/416*56,r>20&&(t-=r-20),t=Math.floor(t),this.state.tags.map((function(e){e.trigger("content-digest-chars",t)}))},onReverseOrder(){this.state.asc?(this.state.tags.reverse(),this.state.asc=!1):(this.state.tags.sort(this.tagComparator),this.state.asc=!0),this.update()},getPageLabels:Jr,getNumPages:Yr,router:ma},template:(e,t,r,a)=>e('
',[{type:r.TAG,getComponent:a,evaluate:e=>"material-card",slots:[{id:"default",html:'',bindings:[{type:r.TAG,getComponent:a,evaluate:e=>"material-button",slots:[{id:"default",html:'arrow_back ',bindings:[]}],attributes:[{type:t.ATTRIBUTE,name:"href",evaluate:e=>e.router.home()}],redundantAttribute:"expr47",selector:"[expr47]"},{redundantAttribute:"expr48",selector:"[expr48]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>["Tags of ",e.props.image].join("")}]},{redundantAttribute:"expr49",selector:"[expr49]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>["Sourced from ",e.state.registryName+"/"+e.props.image].join("")}]},{redundantAttribute:"expr50",selector:"[expr50]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>[e.state.tags.length," tags"].join("")}]}]}],attributes:[],redundantAttribute:"expr46",selector:"[expr46]"},{type:r.IF,evaluate:e=>!e.state.loadend,redundantAttribute:"expr51",selector:"[expr51]",template:e(' ',[{type:r.TAG,getComponent:a,evaluate:e=>"material-spinner",slots:[],attributes:[],redundantAttribute:"expr52",selector:"[expr52]"}])},{type:r.TAG,getComponent:a,evaluate:e=>"pagination",slots:[],attributes:[{type:t.ATTRIBUTE,name:"pages",evaluate:e=>e.getPageLabels(e.state.page,e.getNumPages(e.state.tags,e.props.tagsPerPage))},{type:t.EVENT,name:"onPageUpdate",evaluate:e=>e.onPageUpdate}],redundantAttribute:"expr53",selector:"[expr53]"},{type:r.IF,evaluate:e=>e.state.loadend,redundantAttribute:"expr54",selector:"[expr54]",template:e(null,[{type:r.TAG,getComponent:a,evaluate:e=>"tag-table",slots:[],attributes:[{type:t.ATTRIBUTE,name:"tags",evaluate:e=>e.state.tags},{type:t.ATTRIBUTE,name:"asc",evaluate:e=>e.state.asc},{type:t.ATTRIBUTE,name:"page",evaluate:e=>e.state.page},{type:t.ATTRIBUTE,name:"show-content-digest",evaluate:e=>e.props.showContentDigest},{type:t.ATTRIBUTE,name:"is-image-remove-activated",evaluate:e=>e.props.isImageRemoveActivated},{type:t.EVENT,name:"onReverseOrder",evaluate:e=>e.onReverseOrder},{type:t.ATTRIBUTE,name:"registry-url",evaluate:e=>e.props.registryUrl},{type:t.ATTRIBUTE,name:"pull-url",evaluate:e=>e.props.pullUrl},{type:t.EVENT,name:"on-notify",evaluate:e=>e.props.onNotify},{type:t.ATTRIBUTE,name:"filter-results",evaluate:e=>e.props.filterResults},{type:t.EVENT,name:"on-authentication",evaluate:e=>e.props.onAuthentication},{type:t.ATTRIBUTE,name:"tags-per-page",evaluate:e=>e.props.tagsPerPage},{type:t.ATTRIBUTE,name:"is-registry-secured",evaluate:e=>e.props.isRegistrySecured},{type:t.EVENT,name:"on-image-deleted",evaluate:e=>()=>e.state.reload()}]}])},{type:r.TAG,getComponent:a,evaluate:e=>"pagination",slots:[],attributes:[{type:t.ATTRIBUTE,name:"pages",evaluate:e=>e.getPageLabels(e.state.page,e.getNumPages(e.state.tags,e.props.tagsPerPage))},{type:t.EVENT,name:"onPageUpdate",evaluate:e=>e.onPageUpdate}],redundantAttribute:"expr55",selector:"[expr55]"}]),name:"tag-list"},pn={css:'dockerfile material-popup .popup material-button,[is="dockerfile"] material-popup .popup material-button{ margin-right: 1em; } dockerfile material-popup .popup > .content,[is="dockerfile"] material-popup .popup > .content{ max-width: 75em; width: 80%; } dockerfile .material-popup-content,[is="dockerfile"] .material-popup-content{ background-color: var(--hover-background); } @media screen and (max-width: 800px) { dockerfile material-popup .popup > .content,[is="dockerfile"] material-popup .popup > .content{ width: 100%; } } dockerfile .instruction,[is="dockerfile"] .instruction{ font-family: \'Roboto Mono\', monospace !important; margin: 0.75em 0; } dockerfile .instruction .keyword,[is="dockerfile"] .instruction .keyword{ color: var(--accent-text); }',exports:null,template:(e,t,r,a)=>e(' ',[{type:r.TAG,getComponent:a,evaluate:e=>"material-popup",slots:[{id:"default",html:'',bindings:[{type:r.EACH,getKey:null,condition:null,template:e(' ',[{type:r.EACH,getKey:null,condition:null,template:e('
',[{redundantAttribute:"expr109",selector:"[expr109]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>e.element.value}]},{redundantAttribute:"expr110",selector:"[expr110]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>" "+e.element.content}]}]),redundantAttribute:"expr108",selector:"[expr108]",itemName:"element",indexName:null,evaluate:e=>e.props.elements[e.props.elements.length-1-e.idx].filter((e=>"created_by"===e.key))}]),redundantAttribute:"expr107",selector:"[expr107]",itemName:"_",indexName:"idx",evaluate:e=>e.props.elements},{type:r.TAG,getComponent:a,evaluate:e=>"material-button",slots:[{id:"default",html:"\n Close\n ",bindings:[]}],attributes:[{type:t.EVENT,name:"onClick",evaluate:e=>e.props.onClose}],redundantAttribute:"expr111",selector:"[expr111]"}]}],attributes:[{type:t.ATTRIBUTE,name:"opened",evaluate:e=>e.props.opened},{type:t.EVENT,name:"onClick",evaluate:e=>e.props.onClose}],redundantAttribute:"expr106",selector:"[expr106]"}]),name:"dockerfile"};var cn={css:'tag-history-element.Labels .value,[is="tag-history-element"].Labels .value, :host.Env .value { margin-bottom: 0.5em; } tag-history-element i,[is="tag-history-element"] i{ font-size: 20px; padding: 0px; } tag-history-element.docker_version .headline .material-icons,[is="tag-history-element"].docker_version .headline .material-icons, :host.docker_version .headline #docker_verion { height: 24px; } tag-history-element,[is="tag-history-element"]{ display: block; padding: 20px; min-width: 100px; min-height: 3em; width: 420px; float: left; } tag-history-element .content,[is="tag-history-element"] .content{ overflow-x: auto; } tag-history-element.id .content,[is="tag-history-element"].id .content{ overflow-x: initial; } tag-history-element .headline,[is="tag-history-element"] .headline{ height: 24px; display: flex; flex-direction: row; align-items: center; font-weight: bold; } tag-history-element .headline *,[is="tag-history-element"] .headline *{ margin-right: 6px; } tag-history-element.id div.value,[is="tag-history-element"].id div.value{ font-size: 12px; }',exports:{onBeforeStart(e,t){t.key=e.entry.key,t.icon=function(e){switch(e){case"architecture":return"memory";case"created":return"event";case"docker_version":return"";case"os":return"developer_board";case"Cmd":return"launch";case"Entrypoint":return"input";case"Env":return"notes";case"Labels":return"label";case"User":return"face";case"Volumes":return"storage";case"WorkingDir":return"home";case"author":return"account_circle";case"id":case"digest":return"settings_ethernet";case"created_by":return"build";case"size":return"get_app";case"ExposedPorts":return"router";case"comment":return"chat";default:return e.startsWith("custom-label-")?"label":""}}(e.entry.key),t.name=this.cleanName(e.entry.key),e.entry.value instanceof Array?t.values=e.entry.value:t.value=e.entry.value},onBeforeMount(e,t){this.onBeforeStart(e,t)},onBeforeUpdate(e,t){this.onBeforeStart(e,t)},onMounted(e,t){const r=this.$("#docker_verion");r&&(r.innerHTML=(new DOMParser).parseFromString('\n \n \n \n \n',"image/svg+xml").firstElementChild.outerHTML)},cleanName:e=>"id"===e?e:"os"===e?"OS":(e.startsWith("custom-label-")&&(e=e.replace("custom-label-","")),e.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/[_-]/g," ").split(" ").map((e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`)).join(" "))},template:(e,t,r,a)=>e('
',[{expressions:[{type:t.ATTRIBUTE,name:"class",evaluate:e=>e.state.key}]},{type:r.IF,evaluate:e=>"docker_version"!==e.state.key,redundantAttribute:"expr112",selector:"[expr112]",template:e(" ",[{expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>e.state.icon}]}])},{type:r.IF,evaluate:e=>"docker_version"===e.state.key,redundantAttribute:"expr113",selector:"[expr113]",template:e(null,[])},{redundantAttribute:"expr114",selector:"[expr114]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>e.state.name}]},{type:r.IF,evaluate:e=>e.state.value,redundantAttribute:"expr115",selector:"[expr115]",template:e(" ",[{expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>e.state.value}]}])},{type:r.EACH,getKey:null,condition:e=>e.state.values,template:e(" ",[{expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>e.value}]}]),redundantAttribute:"expr116",selector:"[expr116]",itemName:"value",indexName:null,evaluate:e=>e.state.values}]),name:"tag-history-element"};const dn=function(e){switch(e){case"created":return 1;case"created_by":return 2;case"size":return 3;case"os":return 4;case"architecture":return 5;case"id":return 6;case"linux":return 7;case"docker_version":return 8;default:return 10}},mn=function(e,t){return dn(e.key)-dn(t.key)},hn=e=>{if(e.startsWith("COPY"))return{value:"COPY",content:e.replace(/^COPY /,"")};let t=e.match(/\/bin\/sh *-c *#\(nop\) *([A-Z]+) (.*)/);return{value:t&&t[1]||"RUN",content:t&&t[2]||e.replace(/^\/bin\/sh *-c *(#\(nop\))?/,"")}},gn=function(e,t){switch(e){case"created":return{key:e,value:new Date(t).toLocaleString()};case"created_by":return t.match(/\/bin\/sh *-c *#\(nop\) *([A-Z]+) (.*)/),{key:e,...hn(t)};case"size":return{key:e,value:Wr(t)};case"Entrypoint":case"Cmd":return{key:e,value:(t||[]).join(" ")};case"Labels":return{key:e,value:Object.keys(t||{}).map((function(e){return t[e]?e+"="+t[e]:""}))};case"Volumes":case"ExposedPorts":return{key:e,value:Object.keys(t)}}return{key:e,value:t||""}};var vn={css:'tag-history h2,[is="tag-history"] h2{ flex-grow: 1; display: flex; flex-direction: row; align-items: center; }',exports:{components:{TagHistoryElement:cn,Dockerfile:pn},onBeforeMount(e,t){t.elements=[],t.image=new za(e.image,e.tag,{list:!0,registryUrl:e.registryUrl,onNotify:e.onNotify,onAuthentication:e.onAuthentication,useControlCacheHeader:e.useControlCacheHeader,isRegistrySecured:e.isRegistrySecured}),t.image.fillInfo()},onMounted(e,t){t.image.on("blobs",this.processBlobs),t.image.on("list",this.multiArchList)},onTabChanged(e,t){const r=this.state,{registryUrl:a,onNotify:n,useControlCacheHeader:o}=this.props;if(r.elements=[],r.image.variants[t]=r.image.variants[t]||new za(this.props.image,e.digest,{list:!1,registryUrl:a,onNotify:n,useControlCacheHeader:o}),r.image.variants[t].blobs)return this.processBlobs(r.image.variants[t].blobs);r.image.variants[t].fillInfo(),r.image.variants[t].on("blobs",this.processBlobs)},processBlobs(e){this.state;const{historyCustomLabels:t}=this.props;function r(e){const t=[];for(var r in e)if(e.hasOwnProperty(r)&&"empty_layer"!=r){const a=e[r],n=gn(r,a);t.push(n)}return t.sort(mn)}const a=new Array(e.history.length+1);a[0]=r(function(e,{historyCustomLabels:t}){const r=["architecture","User","created","docker_version","os","Cmd","Entrypoint","Env","Labels","User","Volumes","WorkingDir","author","id","ExposedPorts"].reduce((function(t,r){const a=e[r]||e.config[r];return a&&"architecture"===r&&e.variant?t[r]=a+e.variant:a&&(t[r]=a),t}),{});return!r.author&&r.Labels&&r.Labels.maintainer&&(r.author=e.config.Labels.maintainer,delete r.Labels.maintainer),r.Labels&&t.filter((e=>r.Labels[e])).forEach((e=>{r[`custom-label-${e}`]=r.Labels[e],delete r.Labels[e]})),r}(e,{historyCustomLabels:t})),e.history.forEach((function(t,n){a[e.history.length-n]=r(t)})),this.update({elements:a,loadend:!0})},multiArchList(e){const t=(e=e.manifests||e).map((function(e){return{title:e.platform.os+"/"+e.platform.architecture+(e.platform.variant?e.platform.variant:""),digest:e.digest}}));this.update({archs:t})},toTaglist(){return ma.taglist(this.props.image)},showDockerfile(){this.update({showDockerfile:!0})},onDockerfileClose(){this.update({showDockerfile:!1})}},template:(e,t,r,a)=>e('
',[{type:r.TAG,getComponent:a,evaluate:e=>"material-card",slots:[{id:"default",html:'
history ',bindings:[{type:r.TAG,getComponent:a,evaluate:e=>"material-button",slots:[{id:"default",html:'arrow_back ',bindings:[]}],attributes:[{type:t.ATTRIBUTE,name:"href",evaluate:e=>e.toTaglist()}],redundantAttribute:"expr57",selector:"[expr57]"},{redundantAttribute:"expr58",selector:"[expr58]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>["History of ",e.props.image,":",e.props.tag].join("")}]},{type:r.TAG,getComponent:a,evaluate:e=>"material-button",slots:[{id:"default",html:"\n Dockerfile\n ",bindings:[]}],attributes:[{type:t.EVENT,name:"onClick",evaluate:e=>e.showDockerfile}],redundantAttribute:"expr59",selector:"[expr59]"}]}],attributes:[],redundantAttribute:"expr56",selector:"[expr56]"},{type:r.IF,evaluate:e=>!e.state.loadend,redundantAttribute:"expr60",selector:"[expr60]",template:e(' ',[{type:r.TAG,getComponent:a,evaluate:e=>"material-spinner",slots:[],attributes:[],redundantAttribute:"expr61",selector:"[expr61]"}])},{type:r.TAG,getComponent:a,evaluate:e=>"dockerfile",slots:[],attributes:[{type:t.ATTRIBUTE,name:"opened",evaluate:e=>e.state.showDockerfile},{type:t.EVENT,name:"on-close",evaluate:e=>e.onDockerfileClose},{type:t.ATTRIBUTE,name:"elements",evaluate:e=>e.state.elements}],redundantAttribute:"expr62",selector:"[expr62]"},{type:r.IF,evaluate:e=>e.state.archs&&e.state.loadend,redundantAttribute:"expr63",selector:"[expr63]",template:e(null,[{type:r.TAG,getComponent:a,evaluate:e=>"material-tabs",slots:[],attributes:[{type:t.ATTRIBUTE,name:"useLine",evaluate:e=>!0},{type:t.ATTRIBUTE,name:"tabs",evaluate:e=>e.state.archs},{type:t.EVENT,name:"onTabChanged",evaluate:e=>e.onTabChanged}]}])},{type:r.EACH,getKey:null,condition:null,template:e(null,[{type:r.TAG,getComponent:a,evaluate:e=>"material-card",slots:[{id:"default",html:' ',bindings:[{type:r.EACH,getKey:null,condition:e=>e.entry.value&&e.entry.value.length>0,template:e(null,[{type:r.TAG,getComponent:a,evaluate:e=>"tag-history-element",slots:[],attributes:[{type:t.ATTRIBUTE,name:"entry",evaluate:e=>e.entry}]}]),redundantAttribute:"expr65",selector:"[expr65]",itemName:"entry",indexName:null,evaluate:e=>e.element}]}],attributes:[]}]),redundantAttribute:"expr64",selector:"[expr64]",itemName:"element",indexName:null,evaluate:e=>e.state.elements}]),name:"tag-history"},fn={css:null,exports:{onKeyUp(e){13===e.keyCode&&this.add()},add(){const e=this.$("input");if(!e||!e.value||0===e.value.length)return this.props.onNotify("The input field is empty. Please enter an url.",!0);if(!e.value.startsWith("http"))return this.props.onNotify("The input field should start with http:// or https://.",!0);const t=aa(e.value);ma.home(),this.props.onServerChange(t),this.props.onClose(),setTimeout((()=>ma.updateUrlQueryParam(t)),100)},registryUrlValidator:e=>/^https?:\/\//.test(e)&&!/\/v2\/?$/.test(e)},template:(e,t,r,a)=>e(' ',[{type:r.TAG,getComponent:a,evaluate:e=>"material-popup",slots:[{id:"default",html:'',bindings:[{type:r.TAG,getComponent:a,evaluate:e=>"material-input",slots:[],attributes:[{type:t.EVENT,name:"onkeyup",evaluate:e=>e.onKeyUp},{type:t.ATTRIBUTE,name:"valid",evaluate:e=>e.registryUrlValidator}],redundantAttribute:"expr118",selector:"[expr118]"},{type:r.TAG,getComponent:a,evaluate:e=>"material-button",slots:[{id:"default",html:"\n Add\n ",bindings:[]}],attributes:[{type:t.EVENT,name:"onClick",evaluate:e=>e.add}],redundantAttribute:"expr119",selector:"[expr119]"},{type:r.TAG,getComponent:a,evaluate:e=>"material-button",slots:[{id:"default",html:"\n Cancel\n ",bindings:[]}],attributes:[{type:t.EVENT,name:"onClick",evaluate:e=>e.props.onClose}],redundantAttribute:"expr120",selector:"[expr120]"}]}],attributes:[{type:t.ATTRIBUTE,name:"opened",evaluate:e=>e.props.opened},{type:t.EVENT,name:"onClick",evaluate:e=>e.props.onClose}],redundantAttribute:"expr117",selector:"[expr117]"}]),name:"add-registry-url"},yn={css:'change-registry-url select,[is="change-registry-url"] select{ position: relative; outline: 0; box-shadow: none; padding: 0; width: 100%; background: 0 0; border: none; font-weight: 400; font-size: 1em; line-height: 24px; height: 24px; border-bottom: 1px solid var(--accent-text); appearance: none; -moz-appearance: none; -webkit-appearance: none; margin: 1.5em 0; color: var(--primary-text); } change-registry-url select option,[is="change-registry-url"] select option{ background-color: var(--background); }',exports:{change(e){const t=this.$("select");if(!t||!t.value||0===t.value.length)return this.props.onNotify("The select field is empty. Please add an url.",!0);if(!t.value.startsWith("http"))return this.props.onNotify("The select field should start with http:// or https://.",!0);const r=aa(t.value);ma.home(),this.props.onServerChange(r),this.props.onClose(),setTimeout((()=>ma.updateUrlQueryParam(r)),100)},getRegistryServers:ta},template:(e,t,r,a)=>e(' ',[{type:r.TAG,getComponent:a,evaluate:e=>"material-popup",slots:[{id:"default",html:'',bindings:[{type:r.EACH,getKey:null,condition:null,template:e(" ",[{expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>e.url},{type:t.ATTRIBUTE,name:"value",evaluate:e=>e.url}]}]),redundantAttribute:"expr122",selector:"[expr122]",itemName:"url",indexName:null,evaluate:e=>e.getRegistryServers()},{type:r.TAG,getComponent:a,evaluate:e=>"material-button",slots:[{id:"default",html:"\n Change\n ",bindings:[]}],attributes:[{type:t.EVENT,name:"onClick",evaluate:e=>e.change}],redundantAttribute:"expr123",selector:"[expr123]"},{type:r.TAG,getComponent:a,evaluate:e=>"material-button",slots:[{id:"default",html:"\n Cancel\n ",bindings:[]}],attributes:[{type:t.EVENT,name:"onClick",evaluate:e=>e.props.onClose}],redundantAttribute:"expr124",selector:"[expr124]"}]}],attributes:[{type:t.ATTRIBUTE,name:"opened",evaluate:e=>e.props.opened},{type:t.EVENT,name:"onClick",evaluate:e=>e.props.onClose}],redundantAttribute:"expr121",selector:"[expr121]"}]),name:"change-registry-url"},xn={css:'remove-registry-url material-popup .popup material-button,[is="remove-registry-url"] material-popup .popup material-button{ margin-right: 1em; }',exports:{remove(e){return t=>{var r;r=e,ra(ta().filter((function(e){return e!==r}))),setTimeout((()=>this.update()),100)}},getRegistryServers:ta},template:(e,t,r,a)=>e(' ',[{type:r.TAG,getComponent:a,evaluate:e=>"material-popup",slots:[{id:"default",html:'',bindings:[{type:r.EACH,getKey:null,condition:null,template:e(' ',[{type:r.TAG,getComponent:a,evaluate:e=>"material-button",slots:[{id:"default",html:'delete ',bindings:[]}],attributes:[{type:t.EVENT,name:"onClick",evaluate:e=>e.remove(e.url)},{type:t.ATTRIBUTE,name:"url",evaluate:e=>e.url}],redundantAttribute:"expr127",selector:"[expr127]"},{redundantAttribute:"expr128",selector:"[expr128]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>e.url}]}]),redundantAttribute:"expr126",selector:"[expr126]",itemName:"url",indexName:null,evaluate:e=>e.getRegistryServers()},{type:r.TAG,getComponent:a,evaluate:e=>"material-button",slots:[{id:"default",html:"\n Close\n ",bindings:[]}],attributes:[{type:t.EVENT,name:"onClick",evaluate:e=>e.props.onClose}],redundantAttribute:"expr129",selector:"[expr129]"}]}],attributes:[{type:t.ATTRIBUTE,name:"opened",evaluate:e=>e.props.opened},{type:t.EVENT,name:"onClick",evaluate:e=>e.props.onClose}],redundantAttribute:"expr125",selector:"[expr125]"}]),name:"remove-registry-url"},bn={css:'dialogs-menu > .material-dropdown-wrapper,[is="dialogs-menu"] > .material-dropdown-wrapper{ color: var(--primary-text); list-style-type: disc; margin-block-start: 0.7em; } dialogs-menu material-dropdown .material-dropdown-container,[is="dialogs-menu"] material-dropdown .material-dropdown-container,dialogs-menu material-dropdown .material-dropdown-container .material-dropdown-item,[is="dialogs-menu"] material-dropdown .material-dropdown-container .material-dropdown-item{ background-color: var(--background); color: var(--primary-text); } dialogs-menu material-dropdown .material-dropdown-container .material-dropdown-item:hover,[is="dialogs-menu"] material-dropdown .material-dropdown-container .material-dropdown-item:hover{ background-color: rgba(0, 0, 0, 0.12); } dialogs-menu .material-dropdown-wrapper material-dropdown .material-dropdown-container,[is="dialogs-menu"] .material-dropdown-wrapper material-dropdown .material-dropdown-container{ right: 0; top: 2em; } dialogs-menu .overlay,[is="dialogs-menu"] .overlay{ position: fixed; height: 100%; width: 100%; top: 0; right: 0; z-index: 10; } dialogs-menu material-button button,[is="dialogs-menu"] material-button button{ float: right; z-index: 2; } dialogs-menu material-button .content i.material-icons,[is="dialogs-menu"] material-button .content i.material-icons{ font-size: 24px; } dialogs-menu material-popup *,[is="dialogs-menu"] material-popup *{ line-height: 1em; } dialogs-menu material-popup material-button .content,[is="dialogs-menu"] material-popup material-button .content{ line-height: 36px; }',exports:{components:{AddRegistryUrl:fn,ChangeRegistryUrl:yn,RemoveRegistryUrl:xn},dropdownItems:[{title:"Add URL",name:"add-registry-url",ro:!1},{title:"Change URL",name:"change-registry-url",ro:!0},{title:"Remove URL",name:"remove-registry-url",ro:!1}],onDropdownSelect(e){this.update({[e.target.item]:!0,isDropdownOpened:!1})},onClose(e){return()=>{this.update({[e]:!1,isDropdownOpened:!1})}},onClick(){this.update({isDropdownOpened:!this.state.isDropdownOpened})}},template:(e,t,r,a)=>e('
',[{type:r.IF,evaluate:e=>!e.props.readOnlyRegistries,redundantAttribute:"expr66",selector:"[expr66]",template:e(null,[{type:r.TAG,getComponent:a,evaluate:e=>"add-registry-url",slots:[],attributes:[{type:t.ATTRIBUTE,name:"opened",evaluate:e=>e.state["add-registry-url"]},{type:t.EVENT,name:"on-close",evaluate:e=>e.onClose("add-registry-url")},{type:t.EVENT,name:"on-notify",evaluate:e=>e.props.onNotify},{type:t.EVENT,name:"on-server-change",evaluate:e=>e.props.onServerChange}]}])},{type:r.TAG,getComponent:a,evaluate:e=>"change-registry-url",slots:[],attributes:[{type:t.ATTRIBUTE,name:"opened",evaluate:e=>e.state["change-registry-url"]},{type:t.EVENT,name:"on-close",evaluate:e=>e.onClose("change-registry-url")},{type:t.EVENT,name:"on-notify",evaluate:e=>e.props.onNotify},{type:t.EVENT,name:"on-server-change",evaluate:e=>e.props.onServerChange}],redundantAttribute:"expr67",selector:"[expr67]"},{type:r.IF,evaluate:e=>!e.props.readOnlyRegistries,redundantAttribute:"expr68",selector:"[expr68]",template:e(null,[{type:r.TAG,getComponent:a,evaluate:e=>"remove-registry-url",slots:[],attributes:[{type:t.ATTRIBUTE,name:"opened",evaluate:e=>e.state["remove-registry-url"]},{type:t.EVENT,name:"on-close",evaluate:e=>e.onClose("remove-registry-url")},{type:t.EVENT,name:"on-notify",evaluate:e=>e.props.onNotify},{type:t.EVENT,name:"on-server-change",evaluate:e=>e.props.onServerChange}]}])},{type:r.TAG,getComponent:a,evaluate:e=>"material-button",slots:[{id:"default",html:'more_vert ',bindings:[]}],attributes:[{type:t.EVENT,name:"onClick",evaluate:e=>e.onClick}],redundantAttribute:"expr69",selector:"[expr69]"},{type:r.TAG,getComponent:a,evaluate:e=>"material-dropdown",slots:[],attributes:[{type:t.ATTRIBUTE,name:"items",evaluate:e=>e.dropdownItems.filter((t=>t.ro||!e.props.readOnlyRegistries))},{type:t.EVENT,name:"on-click",evaluate:e=>e.onDropdownSelect},{type:t.ATTRIBUTE,name:"opened",evaluate:e=>e.state.isDropdownOpened}],redundantAttribute:"expr70",selector:"[expr70]"},{type:r.IF,evaluate:e=>e.state.isDropdownOpened,redundantAttribute:"expr71",selector:"[expr71]",template:e(null,[{expressions:[{type:t.EVENT,name:"onclick",evaluate:e=>e.onClick}]}])}]),name:"dialogs-menu"},Tn={css:'error-page,[is="error-page"]{ display: flex; flex-direction: row; margin: 20px 3em; } error-page .content,[is="error-page"] .content{ margin: auto; text-align: center; } error-page .content a,[is="error-page"] .content a{ color: var(--accent-text); } error-page .content a:visited,[is="error-page"] .content a:visited{ color: var(--accent-text); } error-page .content p span,[is="error-page"] .content p span{ color: var(--accent-text); font-weight: 700; } error-page .content h2,[is="error-page"] .content h2{ font-weight: 700; } error-page pre,[is="error-page"] pre,error-page code,[is="error-page"] code{ background-color: var(--hover-background); font-family: \'Roboto Mono\', monospace !important; text-align: left; border-radius: 5px; } error-page code,[is="error-page"] code{ padding: 0 0.5em; } error-page pre,[is="error-page"] pre{ padding: 0.5em; } error-page pre .keyword,[is="error-page"] pre .keyword{ color: var(--accent-text); }',exports:{getStatusCode(){const{props:e}=this;switch(e.code){case"CATALOG_NOT_FOUND":return"404";case"PAGINATION_NUMBER_INVALID":return"400"}},URL:window.URL},template:(e,t,r,a)=>e('
',[{type:r.IF,evaluate:e=>e.getStatusCode(),redundantAttribute:"expr20",selector:"[expr20]",template:e(" ",[{expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>e.getStatusCode()}]}])},{redundantAttribute:"expr21",selector:"[expr21]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>e.props.code}]},{type:r.IF,evaluate:e=>"CATALOG_NOT_FOUND"===e.props.code,redundantAttribute:"expr22",selector:"[expr22]",template:e('We received a 404 status code from your registry.
The contact point was
\n This may be caused by a misconfiguration of Docker Registry UI. Check the\n FAQ and\n Available options
',[{redundantAttribute:"expr23",selector:"[expr23]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>e.props.url},{type:t.ATTRIBUTE,name:"href",evaluate:e=>e.props.url}]}])},{type:r.IF,evaluate:e=>"MIXED_CONTENT"===e.props.code,redundantAttribute:"expr24",selector:"[expr24]",template:e('Mixed Content : The page at ` `\n was loaded over HTTPS, but requested an insecure server endpoint ` `.\n
This request may has been blocked; the content must be served over HTTPS.
\n You may unset the option `REGISTRY_URL ` and set the registry server container URL in\n `NGINX_PROXY_PASS_URL `. It\'s usually the name of your container, and it should be on the shame\n network as the UI.\n
You can check the issue #277 .
',[{redundantAttribute:"expr25",selector:"[expr25]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>window.location.origin},{type:t.ATTRIBUTE,name:"href",evaluate:e=>window.location.origin}]},{redundantAttribute:"expr26",selector:"[expr26]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>new e.URL(e.props.url).origin},{type:t.ATTRIBUTE,name:"href",evaluate:e=>new e.URL(e.props.url).origin}]}])},{type:r.IF,evaluate:e=>"INCORRECT_URL"===e.props.code,redundantAttribute:"expr27",selector:"[expr27]",template:e('
',[{redundantAttribute:"expr28",selector:"[expr28]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>["`",e.props.url,"` does not seems to be a correct URL, should starts with http:// or https://."].join("")}]}])},{type:r.IF,evaluate:e=>"PAGINATION_NUMBER_INVALID"===e.props.code,redundantAttribute:"expr29",selector:"[expr29]",template:e('\n A default limit of 1000
images in catalog has been added in docker registry server\n v2.8.2 (May 11, 2023) and we\n cannot exceed this value without configuration.\n
\n The new default value for the UI is 1000
since\n 2.5.0 and was 100000
from\n 0.3.6 .\n
Possible fixes \n You can update the environment variable\n
of your\n docker registry server or you can update your\n /etc/docker/registry/config.yml
configuration of your docker registry server and add\n those lines:\n
\ncatalog :\n maxentries : \n \n If you don\'t need that many images, you can reduce the number of elements fetch by the\n docker registry UI with the environment variable CATALOG_ELEMENTS_LIMIT=1000
.\n
\n More about this issue:\n Joxit/docker-registry-ui#306 .\n
',[{redundantAttribute:"expr30",selector:"[expr30]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>["REGISTRY_CATALOG_MAXENTRIES=",e.props.detail?.n||1e5].join("")}]},{redundantAttribute:"expr31",selector:"[expr31]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>e.props.detail?.n||1e5}]}])},{type:r.IF,evaluate:e=>"CATALOG_BRANCHING_CONFIGURATION"===e.props.code,redundantAttribute:"expr32",selector:"[expr32]",template:e('
Configuration environment variables are : CATALOG_MIN_BRANCH and CATALOG_MAX_BRANCH
',[{redundantAttribute:"expr33",selector:"[expr33]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>["Wrong configuration for the branching feature: ",e.props.message].join("")}]}])}]),name:"error-page"};const An="version-notification:latest",En="version-notification:expiration-date";var wn,Cn={css:'version-notification,[is="version-notification"]{ display: inline; } version-notification svg,[is="version-notification"] svg{ margin-left: 10px; cursor: pointer; } version-notification material-popup material-button > a:first-child,[is="version-notification"] material-popup material-button > a:first-child{ display: flex; align-items: center; } version-notification material-popup .material-popup-content code,[is="version-notification"] material-popup .material-popup-content code{ background-color: var(--hover-background); padding: 0 5px; border-radius: 4px; line-height: 1.5em; } version-notification material-popup .material-popup-content b,[is="version-notification"] material-popup .material-popup-content b{ color: var(--accent-text); }',exports:{onMounted(e,t){const r=la(localStorage.getItem(An)),a=parseInt(localStorage.getItem(En));r&&r.tag_name&&this.update({tag_name:r.tag_name,latest:r}),(isNaN(a)||(new Date).getTime()>a)&&this.checkForUpdates(e,t)},onUpdated(e,t){const r=this.$("span");r&&(r.innerHTML=(new DOMParser).parseFromString('\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n',"image/svg+xml").firstElementChild.outerHTML)},onClose(){this.update({open:!1})},onClick(){this.update({open:!0})},checkForUpdates(e,t){const r=new va,a=this;r.addEventListener("load",(function(){if(localStorage.setItem(En,(new Date).getTime()+864e5),200===this.status){const t=la(this.responseText);t&&a.tag_name!==t.tag_name&&!sa(e.version,t.tag_name)&&e.onNotify("A new version of Docker Registry UI is available!"),localStorage.setItem(An,this.responseText),a.update({tag_name:t.tag_name,latest:t})}else 404!==this.status&&(e.onNotify("Cannot check for new updates. Will try again in 24 hours. See the browser console."),console.error("Cannot check for new Docker Registry UI updates. This is most likely a GitHub issue. You don't need to worry about it."),console.error(`Got status code ${this.status} from Github API with response ${this.responseText}`))})),r.open("GET","https://api.github.com/repos/joxit/docker-registry-ui/releases/latest"),r.send()},isNewestVersion:sa},template:(e,t,r,a)=>e(' ',[{type:r.IF,evaluate:e=>e.state.tag_name&&!e.isNewestVersion(e.props.version,e.state.tag_name),redundantAttribute:"expr34",selector:"[expr34]",template:e(null,[{expressions:[{type:t.EVENT,name:"onclick",evaluate:e=>e.onClick}]}])},{type:r.TAG,getComponent:a,evaluate:e=>"material-popup",slots:[{id:"default",html:'',bindings:[{redundantAttribute:"expr36",selector:"[expr36]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>e.state.tag_name}]},{redundantAttribute:"expr37",selector:"[expr37]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>["joxit/docker-registry-ui:",e.state.tag_name].join("")}]},{type:r.TAG,getComponent:a,evaluate:e=>"material-button",slots:[{id:"default",html:"\n Release Note\n ",bindings:[]}],attributes:[{type:t.ATTRIBUTE,name:"href",evaluate:e=>e.state.latest&&e.state.latest.html_url}],redundantAttribute:"expr38",selector:"[expr38]"},{type:r.TAG,getComponent:a,evaluate:e=>"material-button",slots:[{id:"default",html:"\n Close\n ",bindings:[]}],attributes:[{type:t.EVENT,name:"onClick",evaluate:e=>e.onClose}],redundantAttribute:"expr39",selector:"[expr39]"}]}],attributes:[{type:t.ATTRIBUTE,name:"opened",evaluate:e=>e.state.open},{type:t.EVENT,name:"onClick",evaluate:e=>e.onClose}],redundantAttribute:"expr35",selector:"[expr35]"}]),name:"version-notification"},In={"primary-text":"#25313b","neutral-text":"#777",background:"#fff","hover-background":"#eee","accent-text":"#6680a1","header-text":"#fff","header-background":"#25313b","footer-text":"#fff","footer-neutral-text":"#999","footer-background":"#555"},kn={"primary-text":"#8A9EBA","neutral-text":"#36527A",background:"#22272e","hover-background":"#30404D","accent-text":"#5684FF","header-text":"#fff","header-background":"#333A45","footer-text":"#fff","footer-neutral-text":"#999","footer-background":"#555"},Rn="registryUiTheme",Nn=function(e){return e.replace(/([A-Z])/g,"-$1").toLowerCase().replace(/^theme-/,"")},Un=function(e,t){var r=function(e){var t=e.theme;if("auto"===t||""===t)switch(localStorage.getItem(Rn)){case"dark":return!0;case"light":return!1;default:if("function"==typeof window.matchMedia){var r=window.matchMedia("(prefers-color-scheme: dark)");return r&&r.matches}}return"dark"===t}(e);wn=S({},r?kn:In),Object.entries(e).filter((function(e){var t=K(e,2),r=t[0];return t[1]&&/^theme[A-Z]/.test(r)})).map((function(e){var t=K(e,2),r=t[0],a=t[1];return[Nn(r),a]})).forEach((function(e){var t=K(e,2),r=t[0],a=t[1];return wn[r]=a})),Object.entries(wn).forEach((function(e){var r=K(e,2),a=r[0],n=r[1];return t.setProperty("--".concat(a),n)}));var a=r?"dark":"light";return localStorage.setItem(Rn,a),a},Bn={css:'docker-registry-ui,[is="docker-registry-ui"]{ display: flex; flex-direction: column; min-height: 100vh; } docker-registry-ui main,[is="docker-registry-ui"] main{ flex-grow: 1; margin: 0.5em 0; } docker-registry-ui material-navbar,[is="docker-registry-ui"] material-navbar{ height: 64px; color: var(--header-text); background-color: var(--header-background); } docker-registry-ui material-navbar .menu,[is="docker-registry-ui"] material-navbar .menu{ display: flex; } docker-registry-ui material-navbar .nav-wrapper .menu,[is="docker-registry-ui"] material-navbar .nav-wrapper .menu{ flex-shrink: 1; } docker-registry-ui material-navbar .nav-wrapper .logo,[is="docker-registry-ui"] material-navbar .nav-wrapper .logo{ display: flex; align-items: center; flex-direction: row; } docker-registry-ui material-footer,[is="docker-registry-ui"] material-footer{ color: var(--footer-neutral-text); background-color: var(--footer-background); } docker-registry-ui material-footer .material-footer-logo,[is="docker-registry-ui"] material-footer .material-footer-logo{ color: var(--footer-text); } docker-registry-ui material-switch i,[is="docker-registry-ui"] material-switch i{ user-select: none; }',exports:{components:{Catalog:Na,TagList:un,TagHistory:vn,DialogsMenu:bn,SearchBar:Aa,Router:Xr,Route:mr,ErrorPage:Tn,VersionNotification:Cn},onUpdated(e,t){t.snackbarIsError=!1,t.snackbarMessage=void 0},onBeforeMount(e){(e.defaultRegistries&&e.defaultRegistries.length>0&&0===ta().length||oa(e.readOnlyRegistries))&&ra(e.defaultRegistries),window.onselectstart=e=>{if(e.target&&e.target.className&&"function"==typeof e.target.className.indexOf)return!["checkbox","checkmark","remove-tag"].find((t=>e.target.className.indexOf(t)>=0))};const t=e.registryUrl||("true"===e.singleRegistry?void 0:ma.getUrlQueryParam()||ta(0))||window.location.origin+window.location.pathname.replace(/\/+$/,"");this.state.registryUrl=t.replace(/\/$/,"").replace(/index(\.html?)?$/,""),this.state.name=e.name||Qr(e.registryUrl),this.state.catalogElementsLimit=e.catalogElementsLimit||1e3,this.state.pullUrl=this.pullUrl(this.state.registryUrl,e.pullUrl),this.state.useControlCacheHeader=e.useControlCacheHeader;const r=Un(e,this.root.parentNode.style);this.state.themeSwitch="dark"===r},onServerChange(e){this.update({registryUrl:e,name:Qr(e),pullUrl:this.pullUrl(e),snackbarMessage:"Registry server changed to `"+e+"`."})},onAuthentication(e,t){if(e&&e.realm&&e.service&&e.scope){const{realm:r,service:a,scope:n}=e,o=new XMLHttpRequest;o.addEventListener("loadend",(()=>{try{const e=JSON.parse(o.responseText);t(e)}catch(e){this.notifySnackbar(`Failed to log in: ${e.message}`,!0)}})),o.withCredentials=!0,o.open("GET",`${r}?service=${a}&scope=${n}`),o.send()}else t()},onAuthenticationClose(){this.update({authenticationDialogOpened:!1})},pullUrl:(e,t)=>Qr(t||e&&e.length>0&&e||window.location.host),notifySnackbar(e,t){"string"==typeof e?this.update({snackbarMessage:e,snackbarIsError:t||!1}):e&&(e.code||e.errors)?(this.update({pageError:e}),setTimeout((()=>delete this.state.pageError),1e3)):e&&e.message&&this.update({snackbarMessage:e.message,snackbarIsError:e.isError})},onSearch(e){this.update({filter:e})},onThemeChange(e){const t=e.target.checked?"dark":"light";Un({...this.props,theme:t},this.root.parentNode.style),this.update({themeSwitch:e.target.checked})},baseRoute:"([^#]*?)/(\\?[^#]*?)?(#!)?(/?)",router:ma,version:"2.5.7",latest:"2.5.7",truthy:oa,stringToArray:function(e){return e&&"string"==typeof e?e.split(","):[]}},template:(e,t,r,a)=>e(' ',[{type:r.TAG,getComponent:a,evaluate:e=>"material-navbar",slots:[{id:"default",html:'Docker Registry UI ',bindings:[{type:r.TAG,getComponent:a,evaluate:e=>"version-notification",slots:[],attributes:[{type:t.ATTRIBUTE,name:"version",evaluate:e=>e.latest},{type:t.EVENT,name:"on-notify",evaluate:e=>e.notifySnackbar}],redundantAttribute:"expr1",selector:"[expr1]"},{type:r.TAG,getComponent:a,evaluate:e=>"search-bar",slots:[],attributes:[{type:t.EVENT,name:"on-search",evaluate:e=>e.onSearch}],redundantAttribute:"expr2",selector:"[expr2]"},{type:r.IF,evaluate:e=>"true"!==e.props.singleRegistry,redundantAttribute:"expr3",selector:"[expr3]",template:e(null,[{type:r.TAG,getComponent:a,evaluate:e=>"dialogs-menu",slots:[],attributes:[{type:t.EVENT,name:"on-notify",evaluate:e=>e.notifySnackbar},{type:t.EVENT,name:"on-server-change",evaluate:e=>e.onServerChange},{type:t.ATTRIBUTE,name:"default-registries",evaluate:e=>e.props.defaultRegistries},{type:t.ATTRIBUTE,name:"read-only-registries",evaluate:e=>e.truthy(e.props.readOnlyRegistries)}]}])}]}],attributes:[],redundantAttribute:"expr0",selector:"[expr0]"},{type:r.IF,evaluate:e=>e.state.pageError&&!Array.isArray(e.state.pageError.errors),redundantAttribute:"expr4",selector:"[expr4]",template:e(null,[{type:r.TAG,getComponent:a,evaluate:e=>"error-page",slots:[],attributes:[{type:t.ATTRIBUTE,name:"code",evaluate:e=>e.state.pageError.code},{type:t.ATTRIBUTE,name:"status",evaluate:e=>e.state.pageError.status},{type:t.ATTRIBUTE,name:"message",evaluate:e=>e.state.pageError.message},{type:t.ATTRIBUTE,name:"url",evaluate:e=>e.state.pageError.url}]}])},{type:r.EACH,getKey:null,condition:e=>e.state.pageError&&Array.isArray(e.state.pageError.errors),template:e(null,[{type:r.TAG,getComponent:a,evaluate:e=>"error-page",slots:[],attributes:[{type:t.ATTRIBUTE,name:"code",evaluate:e=>e.error.code},{type:t.ATTRIBUTE,name:"detail",evaluate:e=>e.error.detail},{type:t.ATTRIBUTE,name:"message",evaluate:e=>e.error.message},{type:t.ATTRIBUTE,name:"url",evaluate:e=>e.state.pageError.url}]}]),redundantAttribute:"expr5",selector:"[expr5]",itemName:"error",indexName:null,evaluate:e=>e.state.pageError&&e.state.pageError.errors},{type:r.TAG,getComponent:a,evaluate:e=>"router",slots:[{id:"default",html:' ',bindings:[{type:r.TAG,getComponent:a,evaluate:e=>"route",slots:[{id:"default",html:' ',bindings:[{type:r.TAG,getComponent:a,evaluate:e=>"catalog",slots:[],attributes:[{type:t.ATTRIBUTE,name:"registry-url",evaluate:e=>e.state.registryUrl},{type:t.ATTRIBUTE,name:"registry-name",evaluate:e=>e.state.name},{type:t.ATTRIBUTE,name:"catalog-elements-limit",evaluate:e=>e.state.catalogElementsLimit},{type:t.EVENT,name:"on-notify",evaluate:e=>e.notifySnackbar},{type:t.ATTRIBUTE,name:"filter-results",evaluate:e=>e.state.filter},{type:t.EVENT,name:"on-authentication",evaluate:e=>e.onAuthentication},{type:t.ATTRIBUTE,name:"show-catalog-nb-tags",evaluate:e=>e.truthy(e.props.showCatalogNbTags)},{type:t.ATTRIBUTE,name:"catalog-default-expanded",evaluate:e=>e.truthy(e.props.catalogDefaultExpanded)},{type:t.ATTRIBUTE,name:"catalog-min-branches",evaluate:e=>e.props.catalogMinBranches},{type:t.ATTRIBUTE,name:"catalog-max-branches",evaluate:e=>e.props.catalogMaxBranches},{type:t.ATTRIBUTE,name:"is-registry-secured",evaluate:e=>e.truthy(e.props.isRegistrySecured)}],redundantAttribute:"expr8",selector:"[expr8]"}]}],attributes:[{type:t.ATTRIBUTE,name:"path",evaluate:e=>e.baseRoute}],redundantAttribute:"expr7",selector:"[expr7]"},{type:r.TAG,getComponent:a,evaluate:e=>"route",slots:[{id:"default",html:' ',bindings:[{type:r.TAG,getComponent:a,evaluate:e=>"tag-list",slots:[],attributes:[{type:t.ATTRIBUTE,name:"registry-url",evaluate:e=>e.state.registryUrl},{type:t.ATTRIBUTE,name:"registry-name",evaluate:e=>e.state.name},{type:t.ATTRIBUTE,name:"pull-url",evaluate:e=>e.state.pullUrl},{type:t.ATTRIBUTE,name:"image",evaluate:e=>e.router.getTagListImage()},{type:t.ATTRIBUTE,name:"show-content-digest",evaluate:e=>e.truthy(e.props.showContentDigest)},{type:t.ATTRIBUTE,name:"is-image-remove-activated",evaluate:e=>e.truthy(e.props.isImageRemoveActivated)},{type:t.EVENT,name:"on-notify",evaluate:e=>e.notifySnackbar},{type:t.ATTRIBUTE,name:"filter-results",evaluate:e=>e.state.filter},{type:t.EVENT,name:"on-authentication",evaluate:e=>e.onAuthentication},{type:t.ATTRIBUTE,name:"use-control-cache-header",evaluate:e=>e.truthy(e.props.useControlCacheHeader)},{type:t.ATTRIBUTE,name:"taglist-order",evaluate:e=>e.props.taglistOrder},{type:t.ATTRIBUTE,name:"tags-per-page",evaluate:e=>e.props.tagsPerPage},{type:t.ATTRIBUTE,name:"is-registry-secured",evaluate:e=>e.truthy(e.props.isRegistrySecured)}],redundantAttribute:"expr10",selector:"[expr10]"}]}],attributes:[{type:t.ATTRIBUTE,name:"path",evaluate:e=>[e.baseRoute,"taglist/(.*)"].join("")}],redundantAttribute:"expr9",selector:"[expr9]"},{type:r.TAG,getComponent:a,evaluate:e=>"route",slots:[{id:"default",html:' ',bindings:[{type:r.TAG,getComponent:a,evaluate:e=>"tag-history",slots:[],attributes:[{type:t.ATTRIBUTE,name:"registry-url",evaluate:e=>e.state.registryUrl},{type:t.ATTRIBUTE,name:"registry-name",evaluate:e=>e.state.name},{type:t.ATTRIBUTE,name:"pull-url",evaluate:e=>e.state.pullUrl},{type:t.ATTRIBUTE,name:"image",evaluate:e=>e.router.getTagHistoryImage()},{type:t.ATTRIBUTE,name:"tag",evaluate:e=>e.router.getTagHistoryTag()},{type:t.ATTRIBUTE,name:"is-image-remove-activated",evaluate:e=>e.truthy(e.props.isImageRemoveActivated)},{type:t.EVENT,name:"on-notify",evaluate:e=>e.notifySnackbar},{type:t.EVENT,name:"on-authentication",evaluate:e=>e.onAuthentication},{type:t.ATTRIBUTE,name:"history-custom-labels",evaluate:e=>e.stringToArray(e.props.historyCustomLabels)},{type:t.ATTRIBUTE,name:"use-control-cache-header",evaluate:e=>e.truthy(e.props.useControlCacheHeader)},{type:t.ATTRIBUTE,name:"is-registry-secured",evaluate:e=>e.truthy(e.props.isRegistrySecured)}],redundantAttribute:"expr12",selector:"[expr12]"}]}],attributes:[{type:t.ATTRIBUTE,name:"path",evaluate:e=>[e.baseRoute,"taghistory/(.*)"].join("")}],redundantAttribute:"expr11",selector:"[expr11]"}]}],attributes:[],redundantAttribute:"expr6",selector:"[expr6]"},{type:r.TAG,getComponent:a,evaluate:e=>"registry-authentication",slots:[],attributes:[{type:t.ATTRIBUTE,name:"realm",evaluate:e=>e.state.realm},{type:t.ATTRIBUTE,name:"scope",evaluate:e=>e.state.scope},{type:t.ATTRIBUTE,name:"service",evaluate:e=>e.state.service},{type:t.EVENT,name:"on-close",evaluate:e=>e.onAuthenticationClose},{type:t.EVENT,name:"on-authenticated",evaluate:e=>e.state.onAuthenticated},{type:t.ATTRIBUTE,name:"opened",evaluate:e=>e.state.authenticationDialogOpened}],redundantAttribute:"expr13",selector:"[expr13]"},{type:r.TAG,getComponent:a,evaluate:e=>"material-snackbar",slots:[],attributes:[{type:t.ATTRIBUTE,name:"message",evaluate:e=>e.state.snackbarMessage},{type:t.ATTRIBUTE,name:"is-error",evaluate:e=>e.state.snackbarIsError}],redundantAttribute:"expr14",selector:"[expr14]"},{type:r.TAG,getComponent:a,evaluate:e=>"material-footer",slots:[{id:"default",html:'',bindings:[{redundantAttribute:"expr16",selector:"[expr16]",expressions:[{type:t.TEXT,childNodeIndex:0,evaluate:e=>["Docker Registry UI ",e.version].join("")}]},{type:r.IF,evaluate:e=>"auto"===e.props.theme||""===e.props.theme,redundantAttribute:"expr17",selector:"[expr17]",template:e(' ',[{type:r.TAG,getComponent:a,evaluate:e=>"material-switch",slots:[{id:"thumb-icon",html:'wb_sunny ',bindings:[]},{id:"thumb-selected-icon",html:'\n brightness_2\n ',bindings:[]}],attributes:[{type:t.EVENT,name:"on-change",evaluate:e=>e.onThemeChange},{type:t.ATTRIBUTE,name:"checked",evaluate:e=>e.state.themeSwitch}],redundantAttribute:"expr18",selector:"[expr18]"}])}]}],attributes:[],redundantAttribute:"expr15",selector:"[expr15]"}]),name:"docker-registry-ui"};bt("material-card",{css:null,exports:null,template:(e,t,r,a)=>e(' ',[{type:r.SLOT,attributes:[],name:"default",redundantAttribute:"expr130",selector:"[expr130]"}]),name:"material-card"}),bt("material-footer",{css:null,exports:{},template:(e,t,r,a)=>e('
',[{type:r.SLOT,attributes:[],name:"default",redundantAttribute:"expr143",selector:"[expr143]"}]),name:"material-footer"}),bt("material-navbar",{css:null,exports:null,template:(e,t,r,a)=>e('
',[{expressions:[{type:t.ATTRIBUTE,name:"role",evaluate:e=>"toolbar"}]},{type:r.SLOT,attributes:[],name:"default",redundantAttribute:"expr155",selector:"[expr155]"}]),name:"material-navbar"}),bt("material-spinner",{css:null,exports:null,template:(e,t,r,a)=>e(' ',[{redundantAttribute:"expr161",selector:"[expr161]",expressions:[{type:t.ATTRIBUTE,name:"stroke-width",evaluate:e=>e.props.strokeWidth||3}]}]),name:"material-spinner"}),bt("material-button",Rt),bt("material-waves",Et),bt("material-checkbox",Nt),bt("material-snackbar",Lt),bt("material-tabs",Mt),bt("material-dropdown",Ut),bt("material-popup",Dt),bt("material-input",St),bt("material-switch",jt);for(var On,Sn=(On=Bn,function(e,t,r){var a=void 0===r?{}:r,n=a.slots,o=a.attributes,i=a.parentScope;return function(){for(var e=arguments.length,t=new Array(e),r=0;r expires) {
+ if (isNaN(expires) || new Date().getTime() > expires) {
this.checkForUpdates(props, state);
}
},
@@ -64,16 +64,22 @@
const self = this;
oReq.addEventListener('load', function () {
+ localStorage.setItem(EXPIRES, new Date().getTime() + ONE_DAY);
if (this.status === 200) {
const latest = parseJSON(this.responseText);
if (latest && self.tag_name !== latest.tag_name && !isNewestVersion(props.version, latest.tag_name)) {
props.onNotify('A new version of Docker Registry UI is available!');
}
localStorage.setItem(LATEST, this.responseText);
- localStorage.setItem(EXPIRES, new Date().getTime() + ONE_DAY);
self.update({ tag_name: latest.tag_name, latest });
- } else {
- props.onNotify('Cannot check for new updates. See the browser console.');
+ } else if (this.status !== 404) {
+ // Should not notify if the project is not found.
+ props.onNotify('Cannot check for new updates. Will try again in 24 hours. See the browser console.');
+
+ console.error(
+ `Cannot check for new Docker Registry UI updates. This is most likely a GitHub issue. You don't need to worry about it.`
+ );
+
console.error(`Got status code ${this.status} from Github API with response ${this.responseText}`);
}
});
From dc9bdcbedd336b3bdc32d503e29f037a7a7a32bd Mon Sep 17 00:00:00 2001
From: toinux <26522723+itzwam@users.noreply.github.com>
Date: Sun, 10 Mar 2024 11:09:21 +0100
Subject: [PATCH 04/17] fix(nginx): too big request header when cookie is
defined (#356)
---
nginx/default.conf | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/nginx/default.conf b/nginx/default.conf
index b94e037..478f660 100644
--- a/nginx/default.conf
+++ b/nginx/default.conf
@@ -5,8 +5,11 @@ server {
# charset koi8-r;
# access_log /var/log/nginx/host.access.log main;
- # disable any limits to avoid HTTP 413 for large image uploads
+ # disable any limits to avoid HTTP 413 for large image uploads and 400 on large headers (eg: cookie)
client_max_body_size 0;
+ client_body_buffer_size 32k;
+ client_header_buffer_size 8k;
+ large_client_header_buffers 8 64k;
# required to avoid HTTP 411: see Issue #1486 (https://github.com/moby/moby/issues/1486)
chunked_transfer_encoding on;
From cfbc6e76a81a9046d8329dd83bd9c276271cd9c3 Mon Sep 17 00:00:00 2001
From: Lukas Engelter
Date: Tue, 12 Mar 2024 22:35:45 +0100
Subject: [PATCH 05/17] feat(theme): contrast changes for light and dark themes
(#361)
---
README.md | 15 +++++----
src/components/search-bar.riot | 4 +--
src/components/tag-history/tag-history.riot | 3 ++
src/index.html | 8 +++--
src/scripts/theme.js | 36 +++++++++++----------
5 files changed, 37 insertions(+), 29 deletions(-)
diff --git a/README.md b/README.md
index b45953b..c3c98d7 100644
--- a/README.md
+++ b/README.md
@@ -128,16 +128,17 @@ This featureswas added to version 2.4.0. See more about this in [#283](https://g
| Environment variable | light theme value | dark theme value |
| --- | --- | --- |
-| `THEME_PRIMARY_TEXT` | `#25313b` | `#8A9EBA` |
-| `THEME_NEUTRAL_TEXT` | `#777777` | `#36527A` |
+| `THEME_PRIMARY_TEXT` | `#25313b` | `#98a8bd` |
+| `THEME_NEUTRAL_TEXT` | `#777777` | `#6d7fab` |
| `THEME_BACKGROUND` | `#ffffff` | `#22272e` |
-| `THEME_HOVER_BACKGROUND` | `#eeeeee` | `#30404D` |
-| `THEME_ACCENT_TEXT` | `#6680a1` | `#5684FF` |
+| `THEME_HOVER_BACKGROUND` | `#eeeeee` | `#343a4b` |
+| `THEME_ACCENT_TEXT` | `#5f7796` | `#5c88ff` |
| `THEME_HEADER_TEXT` | `#ffffff` | `#ffffff` |
-| `THEME_HEADER_BACKGROUND` | `#25313b` | `#333A45` |
+| `THEME_HEADER_ACCENT_TEXT` | `#7b9ac2` | `#7ea1ff` |
+| `THEME_HEADER_BACKGROUND` | `#25313b` | `#333a45` |
| `THEME_FOOTER_TEXT` | `#ffffff` | `#ffffff` |
-| `THEME_FOOTER_NEUTRAL_TEXT` | `#999999` | `#999999` |
-| `THEME_FOOTER_BACKGROUND` | `#555555` | `#555555` |
+| `THEME_FOOTER_NEUTRAL_TEXT` | `#adbacd` | `#98afcf` |
+| `THEME_FOOTER_BACKGROUND` | `#344251` | `#344251` |
## Recommended Docker Registry Usage
diff --git a/src/components/search-bar.riot b/src/components/search-bar.riot
index 4b4691b..9a17883 100644
--- a/src/components/search-bar.riot
+++ b/src/components/search-bar.riot
@@ -2,8 +2,8 @@
diff --git a/src/components/tag-list/tag-list.riot b/src/components/tag-list/tag-list.riot
index c039809..f028ddd 100644
--- a/src/components/tag-list/tag-list.riot
+++ b/src/components/tag-list/tag-list.riot
@@ -50,6 +50,7 @@ along with this program. If not, see .
asc="{state.asc}"
page="{ state.page }"
show-content-digest="{props.showContentDigest}"
+ show-tag-history="{props.showTagHistory}"
is-image-remove-activated="{props.isImageRemoveActivated}"
onReverseOrder="{ onReverseOrder }"
registry-url="{ props.registryUrl }"
diff --git a/src/components/tag-list/tag-table.riot b/src/components/tag-list/tag-table.riot
index eab05c6..72fbd3a 100644
--- a/src/components/tag-list/tag-table.riot
+++ b/src/components/tag-list/tag-table.riot
@@ -52,7 +52,7 @@ along with this program. If not, see .
Tag
Arch
- History
+ History
.
-
+
diff --git a/src/index.html b/src/index.html
index 640bd36..6f4a3b6 100644
--- a/src/index.html
+++ b/src/index.html
@@ -39,6 +39,7 @@
name="${REGISTRY_TITLE}"
pull-url="${PULL_URL}"
show-content-digest="${SHOW_CONTENT_DIGEST}"
+ show-tag-history="${SHOW_TAG_HISTORY}"
is-image-remove-activated="${DELETE_IMAGES}"
catalog-elements-limit="${CATALOG_ELEMENTS_LIMIT}"
single-registry="${SINGLE_REGISTRY}"
@@ -74,6 +75,7 @@
name="Development Registry"
pull-url=""
show-content-digest="true"
+ show-tag-history="true"
is-image-remove-activated="true"
catalog-elements-limit="1000"
single-registry="false"
diff --git a/src/scripts/utils.js b/src/scripts/utils.js
index 010a461..924c8ae 100644
--- a/src/scripts/utils.js
+++ b/src/scripts/utils.js
@@ -217,6 +217,17 @@ export function truthy(value) {
return value === true || value === 'true';
}
+/**
+ * only is false if explicitly set to boolean false or string 'false'.
+ * defaults to true in any other case, e.g. if empty.
+ *
+ * @param {string|boolean} value the input value to check
+ * @returns {boolean} false if explicity set, true otherwise
+ */
+export function falsy(value) {
+ return value !== false && value !== 'false';
+}
+
export function stringToArray(value) {
return value && typeof value === 'string' ? value.split(',') : [];
}
From a36e3aac57b957260c87fdb387ef0a425ac6e3ee Mon Sep 17 00:00:00 2001
From: silverwind
Date: Fri, 5 Apr 2024 21:59:24 +0200
Subject: [PATCH 07/17] docs: improve `examples/read-only-auth` (#371)
* Improve `examples/read-only-auth`
* Update examples/read-only-auth/nginx.conf
---
examples/read-only-auth/README.md | 7 +++++--
examples/read-only-auth/docker-compose.yml | 6 +++---
examples/read-only-auth/nginx.conf | 8 ++++----
.../read-only-auth/{read-only.htpasswd => read.htpasswd} | 0
.../{read-write.htpasswd => write.htpasswd} | 0
5 files changed, 12 insertions(+), 9 deletions(-)
rename examples/read-only-auth/{read-only.htpasswd => read.htpasswd} (100%)
rename examples/read-only-auth/{read-write.htpasswd => write.htpasswd} (100%)
diff --git a/examples/read-only-auth/README.md b/examples/read-only-auth/README.md
index 009e367..34d95b3 100644
--- a/examples/read-only-auth/README.md
+++ b/examples/read-only-auth/README.md
@@ -2,9 +2,12 @@
This example will override the original nginx conf with read only access to the registry. You will need to rewrite all the project configuration (replaces `proxy_pass` with your own value, in this example `http://registry:5000` is fine).
-There are two htpasswd files. `read-write.htpasswd` a read and write access to the registry and `read-only.htpasswd` for a read only access.
+There are two htpasswd files:
-All users in `read-only.htpasswd` should be in `read-write.htpasswd`.
+- `write.htpasswd` for write access
+- `read.htpasswd` for read access
+
+All users in `write.htpasswd` should also be in `read.htpasswd` so that they can read and write.
Read only user: login: `read` password: `registry`.
Read and write user: login: `write` password: `registry`.
diff --git a/examples/read-only-auth/docker-compose.yml b/examples/read-only-auth/docker-compose.yml
index bce9fa0..c83bbce 100644
--- a/examples/read-only-auth/docker-compose.yml
+++ b/examples/read-only-auth/docker-compose.yml
@@ -17,11 +17,11 @@ services:
- SINGLE_REGISTRY=true
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- - ./read-write.htpasswd:/etc/nginx/auth/read-write.htpasswd:ro
- - ./read-only.htpasswd:/etc/nginx/auth/read-only.htpasswd
+ - ./read-write.htpasswd:/etc/nginx/auth/write.htpasswd:ro
+ - ./read-only.htpasswd:/etc/nginx/auth/read.htpasswd:ro
depends_on:
- registry
networks:
- registry-ui-net
networks:
- registry-ui-net:
\ No newline at end of file
+ registry-ui-net:
diff --git a/examples/read-only-auth/nginx.conf b/examples/read-only-auth/nginx.conf
index c2da71c..f56fd24 100644
--- a/examples/read-only-auth/nginx.conf
+++ b/examples/read-only-auth/nginx.conf
@@ -28,10 +28,10 @@ server {
}
# To add basic authentication to v2 use auth_basic setting.
auth_basic "Registry realm";
- auth_basic_user_file /etc/nginx/auth/read-write.htpasswd;
- # For requests that *aren't* a PUT, POST, or DELETE
- limit_except PUT POST DELETE {
- auth_basic_user_file /etc/nginx/auth/read-only.htpasswd;
+ auth_basic_user_file /etc/nginx/auth/read.htpasswd;
+ # For requests that *aren't* a GET, HEAD or OPTIONS use the write file instead
+ limit_except GET HEAD OPTIONS {
+ auth_basic_user_file /etc/nginx/auth/write.htpasswd;
}
proxy_pass http://registry:5000;
diff --git a/examples/read-only-auth/read-only.htpasswd b/examples/read-only-auth/read.htpasswd
similarity index 100%
rename from examples/read-only-auth/read-only.htpasswd
rename to examples/read-only-auth/read.htpasswd
diff --git a/examples/read-only-auth/read-write.htpasswd b/examples/read-only-auth/write.htpasswd
similarity index 100%
rename from examples/read-only-auth/read-write.htpasswd
rename to examples/read-only-auth/write.htpasswd
From 079f35976f1e6c5db35c34b3083f2654161a6102 Mon Sep 17 00:00:00 2001
From: Joxit
Date: Sat, 7 Sep 2024 23:42:04 +0200
Subject: [PATCH 08/17] fix: avoid exceptions and display date when using OCI
images (#372)
fixes #372
---
src/scripts/docker-image.js | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/scripts/docker-image.js b/src/scripts/docker-image.js
index 0c591b4..8ae7546 100644
--- a/src/scripts/docker-image.js
+++ b/src/scripts/docker-image.js
@@ -113,6 +113,7 @@ export class DockerImage {
}
self.ociImage = response.mediaType === 'application/vnd.oci.image.index.v1+json';
self.layers = response.layers || response.manifests;
+ self.annotations = response.annotations;
self.size = self.layers.reduce(function (acc, e) {
return acc + e.size;
}, 0);
@@ -160,8 +161,9 @@ export class DockerImage {
oReq.addEventListener('loadend', function () {
if (this.status === 200 || this.status === 202) {
const response = JSON.parse(this.responseText);
- self.creationDate = new Date(response.created);
+ self.creationDate = new Date(response.created || self.annotations?.['org.opencontainers.image.created']);
self.blobs = response;
+ self.blobs.history = self.blobs.history || [];
self.blobs.history
.filter(function (e) {
return !e.empty_layer;
From b7f732a60671cebe5716ef9f21af0bf8c1d036be Mon Sep 17 00:00:00 2001
From: Joxit
Date: Sun, 8 Sep 2024 01:20:30 +0200
Subject: [PATCH 09/17] feat(oci): add support to helm exports history and use
material symbols
---
src/components/tag-history/tag-history.riot | 8 ++++++-
src/fonts/material-symbols-rounded.ttf | Bin 0 -> 1703512 bytes
src/fonts/material-symbols-rounded.woff | Bin 0 -> 626076 bytes
src/fonts/material-symbols-rounded.woff2 | Bin 0 -> 457452 bytes
...erial-icons.scss => material-symbols.scss} | 20 +++++++++++-------
src/scripts/utils.js | 11 ++++++++++
src/style.scss | 2 +-
7 files changed, 31 insertions(+), 10 deletions(-)
create mode 100644 src/fonts/material-symbols-rounded.ttf
create mode 100644 src/fonts/material-symbols-rounded.woff
create mode 100644 src/fonts/material-symbols-rounded.woff2
rename src/{material-icons.scss => material-symbols.scss} (65%)
diff --git a/src/components/tag-history/tag-history.riot b/src/components/tag-history/tag-history.riot
index 99c04db..4042971 100644
--- a/src/components/tag-history/tag-history.riot
+++ b/src/components/tag-history/tag-history.riot
@@ -253,8 +253,14 @@ along with this program. If not, see .
'author',
'id',
'ExposedPorts',
+ 'name',
+ 'appVersion',
+ 'kubeVersion',
+ 'keywords',
+ 'home',
+ 'sources'
].reduce(function (acc, e) {
- const value = blobs[e] || blobs.config[e];
+ const value = blobs[e] || (blobs.config && blobs.config[e]);
if (value && e === 'architecture' && blobs.variant) {
acc[e] = value + blobs.variant;
} else if (value) {
diff --git a/src/fonts/material-symbols-rounded.ttf b/src/fonts/material-symbols-rounded.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..459df522447f23500bcd90648b2acdccaca1027d
GIT binary patch
literal 1703512
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