diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index c1a7847..cb9804c 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -13,6 +13,8 @@ - Haibo Jia [@bluethon](https://github.com/bluethon) - Manuel Leitold [@agrippa1994](https://github.com/agrippa1994) - Murad [@muradheydarov](https://github.com/muradheydarov) +- Giacomo Mazzamuto [@gmazzamuto](https://github.com/gmazzamuto) +- Joe Bureau [@jabstone](https://github.com/jabstone) ## Because committers are not the only contributors @@ -31,4 +33,6 @@ - Cristian Posoiu [@cr1st1p](https://github.com/cr1st1p) - Sepp Zuther [@Herr-Sepp](https://github.com/Herr-Sepp) - Tomas Hulata [@tombokombo](https://github.com/tombokombo) -- Ben Jackson [@bjj](https://github.com/bjj) \ No newline at end of file +- Ben Jackson [@bjj](https://github.com/bjj) +- 三十文 [@xfduan](https://github.com/xfduan) +- Dario Piombo [@pidario](https://github.com/pidario) \ No newline at end of file diff --git a/dist/fonts/Roboto-Bold.ttf b/dist/fonts/Roboto-Bold.ttf new file mode 100644 index 0000000..d998cf5 Binary files /dev/null and b/dist/fonts/Roboto-Bold.ttf differ diff --git a/dist/fonts/Roboto-Bold.woff b/dist/fonts/Roboto-Bold.woff new file mode 100644 index 0000000..0f14eff Binary files /dev/null and b/dist/fonts/Roboto-Bold.woff differ diff --git a/dist/fonts/Roboto-Bold.woff2 b/dist/fonts/Roboto-Bold.woff2 new file mode 100644 index 0000000..7445d92 Binary files /dev/null and b/dist/fonts/Roboto-Bold.woff2 differ diff --git a/dist/fonts/Roboto-Light.ttf b/dist/fonts/Roboto-Light.ttf new file mode 100644 index 0000000..3526798 Binary files /dev/null and b/dist/fonts/Roboto-Light.ttf differ diff --git a/dist/fonts/Roboto-Light.woff b/dist/fonts/Roboto-Light.woff new file mode 100644 index 0000000..2f6bdb5 Binary files /dev/null and b/dist/fonts/Roboto-Light.woff differ diff --git a/dist/fonts/Roboto-Light.woff2 b/dist/fonts/Roboto-Light.woff2 new file mode 100644 index 0000000..ef8c883 Binary files /dev/null and b/dist/fonts/Roboto-Light.woff2 differ diff --git a/dist/fonts/Roboto-Regular.eot b/dist/fonts/Roboto-Regular.eot new file mode 100644 index 0000000..4f34800 Binary files /dev/null and b/dist/fonts/Roboto-Regular.eot differ diff --git a/dist/fonts/Roboto-Regular.ttf b/dist/fonts/Roboto-Regular.ttf new file mode 100644 index 0000000..2b6392f Binary files /dev/null and b/dist/fonts/Roboto-Regular.ttf differ diff --git a/dist/fonts/Roboto-Regular.woff b/dist/fonts/Roboto-Regular.woff new file mode 100644 index 0000000..69c8825 Binary files /dev/null and b/dist/fonts/Roboto-Regular.woff differ diff --git a/dist/fonts/Roboto-Regular.woff2 b/dist/fonts/Roboto-Regular.woff2 new file mode 100644 index 0000000..165cbac Binary files /dev/null and b/dist/fonts/Roboto-Regular.woff2 differ diff --git a/dist/fonts/RobotoMono-Regular.eot b/dist/fonts/RobotoMono-Regular.eot new file mode 100644 index 0000000..8c56483 Binary files /dev/null and b/dist/fonts/RobotoMono-Regular.eot differ diff --git a/dist/fonts/RobotoMono-Regular.ttf b/dist/fonts/RobotoMono-Regular.ttf new file mode 100644 index 0000000..7c4ce36 Binary files /dev/null and b/dist/fonts/RobotoMono-Regular.ttf differ diff --git a/dist/fonts/RobotoMono-Regular.woff b/dist/fonts/RobotoMono-Regular.woff new file mode 100644 index 0000000..f319fbf Binary files /dev/null and b/dist/fonts/RobotoMono-Regular.woff differ diff --git a/dist/fonts/RobotoMono-Regular.woff2 b/dist/fonts/RobotoMono-Regular.woff2 new file mode 100644 index 0000000..ed384d2 Binary files /dev/null and b/dist/fonts/RobotoMono-Regular.woff2 differ diff --git a/dist/index.html b/dist/index.html index b508a68..fdfa3dc 100644 --- a/dist/index.html +++ b/dist/index.html @@ -13,4 +13,4 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . --->Docker Registry UI \ No newline at end of file +-->Docker Registry UI \ No newline at end of file diff --git a/dist/scripts/docker-registry-ui-static.js b/dist/scripts/docker-registry-ui-static.js index c93c4fb..41acce3 100644 --- a/dist/scripts/docker-registry-ui-static.js +++ b/dist/scripts/docker-registry-ui-static.js @@ -15,4 +15,4 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -function Http(){this.oReq=new XMLHttpRequest,this.oReq.hasHeader=Http.hasHeader,this.oReq.getErrorMessage=Http.getErrorMessage,this._events={},this._headers={}}Http.prototype.getContentDigest=function(t){this.oReq.hasHeader("Docker-Content-Digest")?t(this.oReq.getResponseHeader("Docker-Content-Digest")):window.crypto&&window.TextEncoder&&crypto.subtle.digest("SHA-256",(new TextEncoder).encode(this.oReq.responseText)).then(function(e){t("sha256:"+Array.from(new Uint8Array(e)).map(function(t){return t.toString(16).padStart(2,"0")}).join(""))})},Http.prototype.addEventListener=function(t,e){this._events[t]=e;const i=this;switch(t){case"loadend":i.oReq.addEventListener("loadend",function(){if(401==this.status){const t=new XMLHttpRequest;for(key in t.open(i._method,i._url),i._events)t.addEventListener(key,i._events[key]);for(key in i._headers)t.setRequestHeader(key,i._headers[key]);t.withCredentials=!0,t.hasHeader=Http.hasHeader,t.getErrorMessage=Http.getErrorMessage,i.oReq=t,t.send()}else e.bind(this)()});break;case"load":i.oReq.addEventListener("load",function(){401!==this.status&&e.bind(this)()});break;default:i.oReq.addEventListener(t,function(){e.bind(this)()})}},Http.prototype.setRequestHeader=function(t,e){this.oReq.setRequestHeader(t,e),this._headers[t]=e},Http.prototype.open=function(t,e){this._method=t,this._url=e,this.oReq.open(t,e)},Http.prototype.send=function(){this.oReq.send()},Http.hasHeader=function(t){return this.getAllResponseHeaders().split("\n").some(function(e){return new RegExp("^"+t+":","i").test(e)})},Http.getErrorMessage=function(){return registryUI.url()&®istryUI.url().match("^http://")&&"https:"===window.location.protocol?"Mixed Content: The page at `"+window.location.origin+"` was loaded over HTTPS, but requested an insecure server endpoint `"+registryUI.url()+"`. This request has been blocked; the content must be served over HTTPS.":registryUI.url()?this.withCredentials&&!this.hasHeader("Access-Control-Allow-Credentials")?"The `Access-Control-Allow-Credentials` header in the response is missing and must be set to `true` when the request's credentials mode is on. Origin `"+registryUI.url()+"` is therefore not allowed access.":"An error occured: Check your connection and your registry must have `Access-Control-Allow-Origin` header set to `"+window.location.origin+"`":"Incorrect server endpoint."};var registryUI={url:function(){var t="${URL}";return t||((t=window.location.origin+window.location.pathname).endsWith("/")?t.substr(0,t.length-1):t)},name:function(){const t="${REGISTRY_TITLE}";return t},pullUrl:"${PULL_URL}",isImageRemoveActivated:!0,showContentDigest:!0,catalogElementsLimit:1e5,catalog:{},taglist:{},taghistory:{}};window.addEventListener("DOMContentLoaded",function(){riot.mount("*")}),registryUI.bytesToSize=function(t){if(null==t||isNaN(t))return"?";if(0==t)return"0 Byte";const e=parseInt(Math.floor(Math.log(t)/Math.log(1024)));return Math.ceil(t/Math.pow(1024,e))+" "+["Bytes","KB","MB","GB","TB"][e]},registryUI.dateFormat=function(t){if(void 0===t)return"";const e=["a second","seconds","a minute","minutes","an hour","hours","a day","days","a month","months","a year","years"],i=[1,60,3600,86400,2592e3,31104e3,1/0],r=(new Date-t)/1e3;for(var a=0;a=r)return e[2*a];if(i[a+1]>r)return Math.floor(r/i[a])+" "+e[2*a+1]}},registryUI.getHistoryIcon=function(t){switch(t){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"}},registryUI.getPage=function(t,e,i){return i||(i=100),t?t.slice((e-1)*i,i*e):[]},registryUI.getNumPages=function(t,e){return e||(e=100),t?Math.trunc(t.length/e)+1:0},registryUI.getPageLabels=function(t,e){var i=[];if(1===e)return i;1!==t&&e>=10&&(i.push({icon:"first_page",page:1}),i.push({icon:"chevron_left",page:t-1}));for(var r=Math.round(Math.max(1,Math.min(t-5,e-10+1))),a=r;a10,"space-right":t===e&&e>10});return t!==e&&e>=10&&(i.push({icon:"chevron_right",page:t+1}),i.push({icon:"last_page",page:e})),i},registryUI.updateQueryString=function(t){var e="";for(var i in t)void 0!==t[i]&&(e+=(e.length>0?"&":"?")+i+"="+t[i]);history.pushState(null,"",e+window.location.hash)},registryUI.stripHttps=function(t){return t?t.replace(/^https?:\/\//,""):""},registryUI.eventTransfer=function(t,e){t.on("*",function(t,i){e.trigger(t,i)})},riot.tag2("app",'
',"","",function(t){registryUI.appTag=this,route.base("#!"),route("",function(){route.routeName="home",registryUI.catalog.display&&(registryUI.catalog.loadend=!1),registryUI.appTag.update()}),route("/taglist/*",function(t){route.routeName="taglist",registryUI.taglist.name=t,registryUI.taglist.display&&(registryUI.taglist.loadend=!1),registryUI.appTag.update()}),route("/taghistory/image/*/tag/*",function(t,e){route.routeName="taghistory",registryUI.taghistory.image=t,registryUI.taghistory.tag=e,registryUI.taghistory.display&&(registryUI.taghistory.loadend=!1),registryUI.appTag.update()}),registryUI.home=function(){"home"==route.routeName?registryUI.catalog.display:route("")},registryUI.taghistory.go=function(t,e){route("/taghistory/image/"+t+"/tag/"+e)},registryUI.snackbar=function(t,e){registryUI.appTag.tags["material-snackbar"].addToast({message:t,isError:e},15e3)},registryUI.errorSnackbar=function(t){return registryUI.snackbar(t,!0)},registryUI.showErrorCanNotReadContentDigest=function(){registryUI.errorSnackbar("Access on registry response was blocked. Try adding the header `Access-Control-Expose-Headers: Docker-Content-Digest` to your proxy or registry: https://docs.docker.com/registry/configuration/#http")},registryUI.cleanName=function(){const t=registryUI.pullUrl||registryUI.url()&®istryUI.url().length>0&®istryUI.url()||window.location.host;return registryUI.stripHttps(t)},route.parser(null,function(t,e){const i=e.replace(/\?/g,"\\?").replace(/\*/g,"([^?#]+?)").replace(/\.\./,".*"),r=new RegExp("^"+i+"$"),a=t.match(r);if(a)return a.slice(1)}),registryUI.isDigit=function(t){return t>="0"&&t<="9"},registryUI.DockerImage=function(t,e,i){this.name=t,this.tag=e,this.list=i,this.chars=0,riot.observable(this),this.on("get-size",function(){return void 0!==this.size?this.trigger("size",this.size):this.fillInfo()}),this.on("get-sha256",function(){return void 0!==this.size?this.trigger("sha256",this.sha256):this.fillInfo()}),this.on("get-date",function(){return void 0!==this.creationDate?this.trigger("creation-date",this.creationDate):this.fillInfo()}),this.on("content-digest-chars",function(t){this.chars=t}),this.on("get-content-digest-chars",function(){return this.trigger("content-digest-chars",this.chars)}),this.on("get-content-digest",function(){return void 0!==this.digest?this.trigger("content-digest",this.digest):this.fillInfo()})},registryUI.DockerImage._tagReduce=function(t,e){return t.length>0&®istryUI.isDigit(t[t.length-1].charAt(0))==registryUI.isDigit(e)?t[t.length-1]+=e:t.push(e),t},registryUI.DockerImage.compare=function(t,e){const i=t.tag.match(/./g).reduce(registryUI.DockerImage._tagReduce,[]),r=e.tag.match(/./g).reduce(registryUI.DockerImage._tagReduce,[]);for(var a=0;a send {typeof opts.item === ⁗string⁗ ? opts.item : opts.item.repo}
{opts.item.images && opts.item.images.length} images expand_more
',"","",function(t){this.on("mount",function(){const t=this,e=this.tags["material-card"];e&&(e.launch=function(t){e.tags["material-waves"].trigger("launch",t)},this.item.images&&1===this.item.images.length&&(this.item=this.item.images[0]),e.root.onclick=function(e){t.item.repo?(t.expanded=!t.expanded,t.update({expanded:t.expanded,expanding:!0}),setTimeout(function(){t.update({expanded:t.expanded,expanding:!1})},50)):registryUI.taglist.go(t.item)})})}),riot.tag2("catalog",'

Repositories of {registryUI.name()}
{registryUI.catalog.length} images

',"","",function(t){registryUI.catalog.instance=this,registryUI.catalog.display=function(){registryUI.catalog.repositories=[];const t=new Http;t.addEventListener("load",function(){registryUI.catalog.repositories=[],200==this.status?(registryUI.url()||(registryUI._url=window.location.origin+window.location.pathname.replace(/\/+$/,"")),registryUI.catalog.repositories=JSON.parse(this.responseText).repositories||[],registryUI.catalog.repositories.sort(),registryUI.catalog.length=registryUI.catalog.repositories.length,registryUI.catalog.repositories=registryUI.catalog.repositories.reduce(function(t,e){const i=e.indexOf("/");if(i>0){const r=e.substring(0,i)+"/";return 0!=t.length&&t[t.length-1].repo==r||t.push({repo:r,images:[]}),t[t.length-1].images.push(e),t}return t.push(e),t},[])):404==this.status?registryUI.snackbar("Server not found",!0):registryUI.snackbar(this.responseText)}),t.addEventListener("error",function(){registryUI.snackbar(this.getErrorMessage(),!0),registryUI.catalog.repositories=[]}),t.addEventListener("loadend",function(){registryUI.catalog.loadend=!0,registryUI.catalog.instance.update()}),t.open("GET",registryUI.url()+"/v2/_catalog?n="+registryUI.catalogElementsLimit),t.send()},registryUI.catalog.display()}),riot.tag2("copy-to-clipboard",'
content_copy
',"","",function(t){this.prefix="docker pull "+registryUI.cleanName()+"/"+t.image.name;const e=this;"tag"===t.target?e.dockerCmd=e.prefix+":"+t.image.tag:(t.image.one("content-digest",function(t){e.dockerCmd=e.prefix+"@"+t}),t.image.trigger("get-content-digest")),this.copy=function(){if(!e.dockerCmd)return void registryUI.showErrorCanNotReadContentDigest();const t=this.refs.input;t.style.display="block",t.select(),document.execCommand("copy"),t.style.display="none",registryUI.snackbar("`"+this.dockerCmd+"` has been copied to clipboard.")}}),riot.tag2("image-content-digest",'
{this.display_id}
',"","",function(t){const e=this;e.chars=-1,e.onResize=function(t){t!==e.chars&&(e.chars=t,t>=70?(e.display_id=e.digest,e.title=""):t<=0?(e.display_id="",e.title=e.digest):(e.display_id=e.digest.slice(0,t)+"...",e.title=e.digest),e.update())},t.image.one("content-digest",function(i){e.digest=i,t.image.on("content-digest-chars",e.onResize),t.image.trigger("get-content-digest-chars")}),t.image.trigger("get-content-digest")}),riot.tag2("image-date",'
{registryUI.dateFormat(this.date)} ago
',"","",function(t){const e=this;t.image.on("creation-date",function(t){e.date=t,e.localDate=t.toLocaleString(),e.update()}),t.image.trigger("get-date")}),riot.tag2("image-size",'
{registryUI.bytesToSize(this.size)}
',"","",function(t){const e=this;t.image.on("size",function(t){e.size=t,e.update()}),t.image.trigger("get-size")}),riot.tag2("image-tag",'
{opts.image.tag}
',"","",function(t){const e=this;t.image.on("sha256",function(t){e.sha256=t.substring(0,19),e.update()}),t.image.trigger("get-sha256")}),riot.tag2("pagination",'
{p.icon}
{p.page}
',"","",function(t){this.on("updated",function(){this.tags["material-button"]&&(Array.isArray(this.tags["material-button"])?this.tags["material-button"]:[this.tags["material-button"]]).forEach(function(t){t.root.onclick=function(){registryUI.taglist.instance.trigger("page-update",t.p.page)}})})}),riot.tag2("remove-image",' delete ',"","",function(t){const e=this;this.on("updated",function(){}),this.on("updated",function(){e.multiDelete!=e.opts.multiDelete&&(e.tags["material-button"]&&(e.delete=function(t){const i=e.opts.image.name,r=e.opts.image.tag;if(registryUI.taglist.go(i),!e.digest)return void registryUI.snackbar("Information for "+i+":"+r+" are not yet loaded.");const a=new Http;a.addEventListener("loadend",function(){200==this.status||202==this.status?(registryUI.taglist.display(),registryUI.snackbar("Deleting "+i+":"+r+" image. Run `registry garbage-collect config.yml` on your registry")):404==this.status?t||registryUI.errorSnackbar("Digest not found for this image in your registry."):registryUI.snackbar(this.responseText)}),a.open("DELETE",registryUI.url()+"/v2/"+i+"/manifests/"+e.digest),a.setRequestHeader("Accept","application/vnd.docker.distribution.manifest.v2+json, application/vnd.oci.image.manifest.v1+json"),a.addEventListener("error",function(){registryUI.errorSnackbar("An error occurred when deleting image. Check if your server accept DELETE methods Access-Control-Allow-Methods: ['DELETE'].")}),a.send()},e.tags["material-button"].root.onclick=function(){e.delete()}),e.tags["material-checkbox"]&&(!e.opts.multiDelete&&e.tags["material-checkbox"].checked&&e.tags["material-checkbox"].toggle(),e.tags["material-checkbox"].on("toggle",function(){registryUI.taglist.instance.trigger("toggle-remove-image",this.checked)})),e.multiDelete=e.opts.multiDelete)}),t.image.one("content-digest",function(t){e.digest=t,e.update()}),t.image.trigger("get-content-digest")}),riot.tag2("tag-history-button",' history ',"","",function(t){this.on("mount",function(){const t=this;this.refs.button.root.onclick=function(){registryUI.taghistory.go(t.opts.image.name,t.opts.image.tag)}}),this.update()}),riot.tag2("tag-history-element",'
{registryUI.getHistoryIcon(entry.key)}

{entry.key.replace(\'_\', \' \')}

{entry.value}
{e}
',"",'class="{entry.key}"',function(t){}),riot.tag2("tag-history",'
arrow_back

History of {registryUI.taghistory.image}:{registryUI.taghistory.tag} history

',"","",function(t){const e=this,i=function(t){switch(t){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}},r=function(t,e){return i(t.key)-i(e.key)},a=function(t,e){switch(t){case"created":return new Date(e).toLocaleString();case"created_by":const i=e.match(/\/bin\/sh *-c *#\(nop\) *([A-Z]+)/);return i&&i[1]||"RUN";case"size":return registryUI.bytesToSize(e);case"Entrypoint":case"Cmd":return(e||[]).join(" ");case"Labels":return Object.keys(e||{}).map(function(t){return e[t]?t+"="+e[t]:""});case"Volumes":case"ExposedPorts":return Object.keys(e)}return e||""},s=function(t){function i(t){const e=[];for(var i in t)if(t.hasOwnProperty(i)&&"empty_layer"!=i){const r=t[i],s={key:i,value:a(i,r)};e.push(s)}return e.sort(r)}e.elements=new Array(t.history.length+1),e.elements[0]=i(function(t){const e=["architecture","User","created","docker_version","os","Cmd","Entrypoint","Env","Labels","User","Volumes","WorkingDir","author","id","ExposedPorts"].reduce(function(e,i){const r=t[i]||t.config[i];return r&&"architecture"===i&&t.variant?e[i]=r+t.variant:r&&(e[i]=r),e},{});return!e.author&&e.Labels&&e.Labels.maintainer&&(e.author=t.config.Labels.maintainer,delete e.Labels.maintainer),e}(t)),t.history.forEach(function(r,a){e.elements[t.history.length-a]=i(r)}),registryUI.taghistory.loadend=!0,e.update()},n=function(t){t=t.manifests||t,e.archs=t.map(function(t){return{title:t.platform.os+"/"+t.platform.architecture+(t.platform.variant?t.platform.variant:""),digest:t.digest}}),e.update()};e.tabchanged=function(t,i){if(e.elements=[],e.image.variants[i]=e.image.variants[i]||new registryUI.DockerImage(registryUI.taghistory.image,t.digest),e.image.variants[i].blobs)return s(e.image.variants[i].blobs);e.image.variants[i].fillInfo(),e.image.variants[i].on("blobs",s)},registryUI.taghistory.display=function(){e.elements=[],e.image=new registryUI.DockerImage(registryUI.taghistory.image,registryUI.taghistory.tag,!0),e.image.fillInfo(),e.image.on("blobs",s),e.image.on("list",n)},this.on("mount",function(){e.refs["tag-history-tag"].tags["material-button"].root.onclick=function(){registryUI.taglist.go(registryUI.taghistory.image)}}),registryUI.taghistory.display(),e.update()}),riot.tag2("taglist",'
arrow_back

Tags of {registryUI.taglist.name}
Sourced from {registryUI.name() + \'/\' + registryUI.taglist.name}
{registryUI.taglist.tags.length} tags

Creation date Size Content Digest Tag History delete
',"","",function(t){var e=registryUI.taglist.instance=this;e.page=registryUI.getPageQueryParam(),registryUI.taglist.tags=[];const i=function(){const t=window.innerWidth;var e=0,i=registryUI.taglist.tags.reduce(function(t,e){return e.tag.length>t?e.tag.length:t},0);e=t>=1440?71:t<1024?0:15+(t-1024)/416*56,i>20&&(e-=i-20),registryUI.taglist.tags.map(function(t){t.trigger("content-digest-chars",e)})};window.addEventListener("resize",i),window.requestAnimationFrame(i),this.multiDelete=!1,this.toDelete=0,this.on("delete",function(){registryUI.isImageRemoveActivated&&this.multiDelete}),this.on("multi-delete",function(){registryUI.isImageRemoveActivated&&(this.multiDelete=!this.multiDelete)}),this.on("toggle-remove-image",function(t){t?this.toDelete++:this.toDelete--,this.toDelete<=1&&this.update()}),this.on("page-update",function(t){e.page=t<1?1:t,registryUI.updateQueryString(registryUI.getQueryParams({page:e.page})),this.toDelete=0,this.update()}),this._getRemoveImageTags=function(){var t=e.refs["taglist-tag"].tags["remove-image"];return t instanceof Array||(t=[t]),t},registryUI.taglist.bulkDelete=function(t){e.multiDelete&&e.toDelete>0&&(t.altKey&&e._getRemoveImageTags().filter(function(t){return t.tags["material-checkbox"].checked}).forEach(function(t){t.tags["material-checkbox"].toggle()}),e._getRemoveImageTags().filter(function(t){return t.tags["material-checkbox"].checked}).forEach(function(t){t.delete(!0)}))},this.on("update",function(){var t=this.refs["taglist-tag"].refs["remove-tag-checkbox"];t&&!t._toggle&&(t._toggle=t.toggle,t.toggle=function(t){t.altKey?(this.checked||this._toggle(),e._getRemoveImageTags().filter(function(t){return!t.tags["material-checkbox"].checked}).forEach(function(t){t.tags["material-checkbox"].toggle()})):this._toggle()},t.on("toggle",function(){registryUI.taglist.instance.multiDelete=this.checked,registryUI.taglist.instance.update()}))}),registryUI.taglist.display=function(){if(registryUI.taglist.tags=[],"taglist"==route.routeName){const t=new Http;registryUI.taglist.instance.update(),t.addEventListener("load",function(){if(registryUI.taglist.tags=[],200==this.status){const t=JSON.parse(this.responseText).tags||[];registryUI.taglist.tags=t.map(function(t){return new registryUI.DockerImage(registryUI.taglist.name,t)}).sort(registryUI.DockerImage.compare),window.requestAnimationFrame(i),e.trigger("page-update",Math.min(e.page,registryUI.getNumPages(registryUI.taglist.tags)))}else 404==this.status?registryUI.snackbar("Server not found",!0):registryUI.snackbar(this.responseText,!0)}),t.addEventListener("error",function(){registryUI.snackbar(this.getErrorMessage(),!0),registryUI.taglist.tags=[]}),t.addEventListener("loadend",function(){registryUI.taglist.loadend=!0,registryUI.taglist.instance.update()}),t.open("GET",registryUI.url()+"/v2/"+registryUI.taglist.name+"/tags/list"),t.send(),registryUI.taglist.asc=!0}},registryUI.taglist.display(),registryUI.taglist.instance.update(),registryUI.taglist.reverse=function(){registryUI.taglist.asc?(registryUI.taglist.tags.reverse(),registryUI.taglist.asc=!1):(registryUI.taglist.tags.sort(registryUI.DockerImage.compare),registryUI.taglist.asc=!0),registryUI.taglist.instance.update()}}); \ No newline at end of file +function Http(){this.oReq=new XMLHttpRequest,this.oReq.hasHeader=Http.hasHeader,this.oReq.getErrorMessage=Http.getErrorMessage,this._events={},this._headers={}}Http.prototype.getContentDigest=function(t){this.oReq.hasHeader("Docker-Content-Digest")?t(this.oReq.getResponseHeader("Docker-Content-Digest")):window.crypto&&window.TextEncoder&&crypto.subtle.digest("SHA-256",(new TextEncoder).encode(this.oReq.responseText)).then(function(e){t("sha256:"+Array.from(new Uint8Array(e)).map(function(t){return t.toString(16).padStart(2,"0")}).join(""))})},Http.prototype.addEventListener=function(t,e){this._events[t]=e;const i=this;switch(t){case"loadend":i.oReq.addEventListener("loadend",function(){if(401==this.status){const t=new XMLHttpRequest;for(key in t.open(i._method,i._url),i._events)t.addEventListener(key,i._events[key]);for(key in i._headers)t.setRequestHeader(key,i._headers[key]);t.withCredentials=!0,t.hasHeader=Http.hasHeader,t.getErrorMessage=Http.getErrorMessage,i.oReq=t,t.send()}else e.bind(this)()});break;case"load":i.oReq.addEventListener("load",function(){401!==this.status&&e.bind(this)()});break;default:i.oReq.addEventListener(t,function(){e.bind(this)()})}},Http.prototype.setRequestHeader=function(t,e){this.oReq.setRequestHeader(t,e),this._headers[t]=e},Http.prototype.open=function(t,e){this._method=t,this._url=e,this.oReq.open(t,e)},Http.prototype.send=function(){this.oReq.send()},Http.hasHeader=function(t){return this.getAllResponseHeaders().split("\n").some(function(e){return new RegExp("^"+t+":","i").test(e)})},Http.getErrorMessage=function(){return registryUI.url()&®istryUI.url().match("^http://")&&"https:"===window.location.protocol?"Mixed Content: The page at `"+window.location.origin+"` was loaded over HTTPS, but requested an insecure server endpoint `"+registryUI.url()+"`. This request has been blocked; the content must be served over HTTPS.":registryUI.url()?this.withCredentials&&!this.hasHeader("Access-Control-Allow-Credentials")?"The `Access-Control-Allow-Credentials` header in the response is missing and must be set to `true` when the request's credentials mode is on. Origin `"+registryUI.url()+"` is therefore not allowed access.":"An error occured: Check your connection and your registry must have `Access-Control-Allow-Origin` header set to `"+window.location.origin+"`":"Incorrect server endpoint."};var registryUI={url:function(){var t="${URL}";return t||((t=window.location.origin+window.location.pathname).endsWith("/")?t.substr(0,t.length-1):t)},name:function(){const t="${REGISTRY_TITLE}";return t},pullUrl:"${PULL_URL}",isImageRemoveActivated:!0,showContentDigest:!0,catalogElementsLimit:1e5,catalog:{},taglist:{},taghistory:{}};window.addEventListener("DOMContentLoaded",function(){riot.mount("*")}),registryUI.bytesToSize=function(t){if(null==t||isNaN(t))return"?";if(0==t)return"0 Byte";const e=parseInt(Math.floor(Math.log(t)/Math.log(1024)));return Math.ceil(t/Math.pow(1024,e))+" "+["Bytes","KB","MB","GB","TB"][e]},registryUI.dateFormat=function(t){if(void 0===t)return"";const e=["a second","seconds","a minute","minutes","an hour","hours","a day","days","a month","months","a year","years"],i=[1,60,3600,86400,2592e3,31104e3,1/0],r=(new Date-t)/1e3;for(var a=0;a=r)return e[2*a];if(i[a+1]>r)return Math.floor(r/i[a])+" "+e[2*a+1]}},registryUI.getHistoryIcon=function(t){switch(t){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"}},registryUI.getPage=function(t,e,i){return i||(i=100),t?t.slice((e-1)*i,i*e):[]},registryUI.getNumPages=function(t,e){return e||(e=100),t?Math.trunc(t.length/e)+1:0},registryUI.getPageLabels=function(t,e){var i=[];if(1===e)return i;1!==t&&e>=10&&(i.push({icon:"first_page",page:1}),i.push({icon:"chevron_left",page:t-1}));for(var r=Math.round(Math.max(1,Math.min(t-5,e-10+1))),a=r;a10,"space-right":t===e&&e>10});return t!==e&&e>=10&&(i.push({icon:"chevron_right",page:t+1}),i.push({icon:"last_page",page:e})),i},registryUI.updateQueryString=function(t){var e="";for(var i in t)void 0!==t[i]&&(e+=(e.length>0?"&":"?")+i+"="+t[i]);history.pushState(null,"",e+window.location.hash)},registryUI.stripHttps=function(t){return t?t.replace(/^https?:\/\//,""):""},registryUI.eventTransfer=function(t,e){t.on("*",function(t,i){e.trigger(t,i)})},riot.tag2("app",'
',"","",function(t){registryUI.appTag=this,route.base("#!"),route("",function(){route.routeName="home",registryUI.catalog.display&&(registryUI.catalog.loadend=!1),registryUI.appTag.update()}),route("/taglist/*",function(t){route.routeName="taglist",registryUI.taglist.name=t,registryUI.taglist.display&&(registryUI.taglist.loadend=!1),registryUI.appTag.update()}),route("/taghistory/image/*/tag/*",function(t,e){route.routeName="taghistory",registryUI.taghistory.image=t,registryUI.taghistory.tag=e,registryUI.taghistory.display&&(registryUI.taghistory.loadend=!1),registryUI.appTag.update()}),registryUI.home=function(){"home"==route.routeName?registryUI.catalog.display:route("")},registryUI.taghistory.go=function(t,e){route("/taghistory/image/"+t+"/tag/"+e)},registryUI.snackbar=function(t,e){registryUI.appTag.tags["material-snackbar"].addToast({message:t,isError:e},15e3)},registryUI.errorSnackbar=function(t){return registryUI.snackbar(t,!0)},registryUI.showErrorCanNotReadContentDigest=function(){registryUI.errorSnackbar("Access on registry response was blocked. Try adding the header `Access-Control-Expose-Headers: Docker-Content-Digest` to your proxy or registry: https://docs.docker.com/registry/configuration/#http")},registryUI.cleanName=function(){const t=registryUI.pullUrl||registryUI.url()&®istryUI.url().length>0&®istryUI.url()||window.location.host;return registryUI.stripHttps(t)},route.parser(null,function(t,e){const i=e.replace(/\?/g,"\\?").replace(/\*/g,"([^?#]+?)").replace(/\.\./,".*"),r=new RegExp("^"+i+"$"),a=t.match(r);if(a)return a.slice(1)}),registryUI.isDigit=function(t){return t>="0"&&t<="9"},registryUI.DockerImage=function(t,e,i){this.name=t,this.tag=e,this.list=i,this.chars=0,riot.observable(this),this.on("get-size",function(){return void 0!==this.size?this.trigger("size",this.size):this.fillInfo()}),this.on("get-sha256",function(){return void 0!==this.size?this.trigger("sha256",this.sha256):this.fillInfo()}),this.on("get-date",function(){return void 0!==this.creationDate?this.trigger("creation-date",this.creationDate):this.fillInfo()}),this.on("content-digest-chars",function(t){this.chars=t}),this.on("get-content-digest-chars",function(){return this.trigger("content-digest-chars",this.chars)}),this.on("get-content-digest",function(){return void 0!==this.digest?this.trigger("content-digest",this.digest):this.fillInfo()})},registryUI.DockerImage._tagReduce=function(t,e){return t.length>0&®istryUI.isDigit(t[t.length-1].charAt(0))==registryUI.isDigit(e)?t[t.length-1]+=e:t.push(e),t},registryUI.DockerImage.compare=function(t,e){const i=t.tag.match(/./g).reduce(registryUI.DockerImage._tagReduce,[]),r=e.tag.match(/./g).reduce(registryUI.DockerImage._tagReduce,[]);for(var a=0;a send {typeof opts.item === ⁗string⁗ ? opts.item : opts.item.repo}
{opts.item.images && opts.item.images.length} images expand_more
',"","",function(t){this.on("mount",function(){const t=this,e=this.tags["material-card"];e&&(e.launch=function(t){e.tags["material-waves"].trigger("launch",t)},this.item.images&&1===this.item.images.length&&(this.item=this.item.images[0]),e.root.onclick=function(e){t.item.repo?(t.expanded=!t.expanded,t.update({expanded:t.expanded,expanding:!0}),setTimeout(function(){t.update({expanded:t.expanded,expanding:!1})},50)):registryUI.taglist.go(t.item)})})}),riot.tag2("catalog",'

Repositories of {registryUI.name()}
{registryUI.catalog.length} images

',"","",function(t){registryUI.catalog.instance=this,registryUI.catalog.display=function(){registryUI.catalog.repositories=[];const t=new Http;t.addEventListener("load",function(){registryUI.catalog.repositories=[],200==this.status?(registryUI.url()||(registryUI._url=window.location.origin+window.location.pathname.replace(/\/+$/,"")),registryUI.catalog.repositories=JSON.parse(this.responseText).repositories||[],registryUI.catalog.repositories.sort(),registryUI.catalog.length=registryUI.catalog.repositories.length,registryUI.catalog.repositories=registryUI.catalog.repositories.reduce(function(t,e){const i=e.indexOf("/");if(i>0){const r=e.substring(0,i)+"/";return 0!=t.length&&t[t.length-1].repo==r||t.push({repo:r,images:[]}),t[t.length-1].images.push(e),t}return t.push(e),t},[])):404==this.status?registryUI.snackbar("Server not found",!0):registryUI.snackbar(this.responseText)}),t.addEventListener("error",function(){registryUI.snackbar(this.getErrorMessage(),!0),registryUI.catalog.repositories=[]}),t.addEventListener("loadend",function(){registryUI.catalog.loadend=!0,registryUI.catalog.instance.update()}),t.open("GET",registryUI.url()+"/v2/_catalog?n="+registryUI.catalogElementsLimit),t.send()},registryUI.catalog.display()}),riot.tag2("copy-to-clipboard",'
content_copy
',"","",function(t){this.prefix="docker pull "+registryUI.cleanName()+"/"+t.image.name;const e=this;"tag"===t.target?e.dockerCmd=e.prefix+":"+t.image.tag:(t.image.one("content-digest",function(t){e.dockerCmd=e.prefix+"@"+t}),t.image.trigger("get-content-digest")),this.copy=function(){if(!e.dockerCmd)return void registryUI.showErrorCanNotReadContentDigest();const t=this.refs.input;t.style.display="block",t.select(),document.execCommand("copy"),t.style.display="none",registryUI.snackbar("`"+this.dockerCmd+"` has been copied to clipboard.")}}),riot.tag2("image-content-digest",'
{this.display_id}
',"","",function(t){const e=this;e.chars=-1,e.onResize=function(t){t!==e.chars&&(e.chars=t,t>=70?(e.display_id=e.digest,e.title=""):t<=0?(e.display_id="",e.title=e.digest):(e.display_id=e.digest.slice(0,t)+"...",e.title=e.digest),e.update())},t.image.one("content-digest",function(i){e.digest=i,t.image.on("content-digest-chars",e.onResize),t.image.trigger("get-content-digest-chars")}),t.image.trigger("get-content-digest")}),riot.tag2("image-date",'
{registryUI.dateFormat(this.date)} ago
',"","",function(t){const e=this;t.image.on("creation-date",function(t){e.date=t,e.localDate=t.toLocaleString(),e.update()}),t.image.trigger("get-date")}),riot.tag2("image-size",'
{registryUI.bytesToSize(this.size)}
',"","",function(t){const e=this;t.image.on("size",function(t){e.size=t,e.update()}),t.image.trigger("get-size")}),riot.tag2("image-tag",'
{opts.image.tag}
',"","",function(t){const e=this;t.image.on("sha256",function(t){e.sha256=t.substring(0,19),e.update()}),t.image.trigger("get-sha256")}),riot.tag2("pagination",'
{p.icon}
{p.page}
',"","",function(t){this.on("updated",function(){this.tags["material-button"]&&(Array.isArray(this.tags["material-button"])?this.tags["material-button"]:[this.tags["material-button"]]).forEach(function(t){t.root.onclick=function(){registryUI.taglist.instance.trigger("page-update",t.p.page)}})})}),riot.tag2("remove-image",' delete ',"","",function(t){const e=this;this.on("updated",function(){}),this.on("updated",function(){e.multiDelete!=e.opts.multiDelete&&(e.tags["material-button"]&&(e.delete=function(t){const i=e.opts.image.name,r=e.opts.image.tag;if(registryUI.taglist.go(i),!e.digest)return void registryUI.snackbar("Information for "+i+":"+r+" are not yet loaded.");const a=new Http;a.addEventListener("loadend",function(){200==this.status||202==this.status?(registryUI.taglist.display(),registryUI.snackbar("Deleting "+i+":"+r+" image. Run `registry garbage-collect config.yml` on your registry")):404==this.status?t||registryUI.errorSnackbar("Digest not found for this image in your registry."):registryUI.snackbar(this.responseText)}),a.open("DELETE",registryUI.url()+"/v2/"+i+"/manifests/"+e.digest),a.setRequestHeader("Accept","application/vnd.docker.distribution.manifest.v2+json, application/vnd.oci.image.manifest.v1+json"),a.addEventListener("error",function(){registryUI.errorSnackbar("An error occurred when deleting image. Check if your server accept DELETE methods Access-Control-Allow-Methods: ['DELETE'].")}),a.send()},e.tags["material-button"].root.onclick=function(){e.delete()}),e.tags["material-checkbox"]&&(!e.opts.multiDelete&&e.tags["material-checkbox"].checked&&e.tags["material-checkbox"].toggle(),e.tags["material-checkbox"].on("toggle",function(){registryUI.taglist.instance.trigger("toggle-remove-image",this.checked)})),e.multiDelete=e.opts.multiDelete)}),t.image.one("content-digest",function(t){e.digest=t,e.update()}),t.image.trigger("get-content-digest")}),riot.tag2("tag-history-button",' history ',"","",function(t){this.on("mount",function(){const t=this;this.refs.button.root.onclick=function(){registryUI.taghistory.go(t.opts.image.name,t.opts.image.tag)}}),this.update()}),riot.tag2("tag-history-element",'
{registryUI.getHistoryIcon(entry.key)}

{entry.key.replace(\'_\', \' \')}

{entry.value}
{e}
',"",'class="{entry.key}"',function(t){}),riot.tag2("tag-history",'
arrow_back

History of {registryUI.taghistory.image}:{registryUI.taghistory.tag} history

',"","",function(t){const e=this,i=function(t){switch(t){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}},r=function(t,e){return i(t.key)-i(e.key)},a=function(t,e){switch(t){case"created":return new Date(e).toLocaleString();case"created_by":const i=e.match(/\/bin\/sh *-c *#\(nop\) *([A-Z]+)/);return i&&i[1]||"RUN";case"size":return registryUI.bytesToSize(e);case"Entrypoint":case"Cmd":return(e||[]).join(" ");case"Labels":return Object.keys(e||{}).map(function(t){return e[t]?t+"="+e[t]:""});case"Volumes":case"ExposedPorts":return Object.keys(e)}return e||""},s=function(t){function i(t){const e=[];for(var i in t)if(t.hasOwnProperty(i)&&"empty_layer"!=i){const r=t[i],s={key:i,value:a(i,r)};e.push(s)}return e.sort(r)}e.elements=new Array(t.history.length+1),e.elements[0]=i(function(t){const e=["architecture","User","created","docker_version","os","Cmd","Entrypoint","Env","Labels","User","Volumes","WorkingDir","author","id","ExposedPorts"].reduce(function(e,i){const r=t[i]||t.config[i];return r&&"architecture"===i&&t.variant?e[i]=r+t.variant:r&&(e[i]=r),e},{});return!e.author&&e.Labels&&e.Labels.maintainer&&(e.author=t.config.Labels.maintainer,delete e.Labels.maintainer),e}(t)),t.history.forEach(function(r,a){e.elements[t.history.length-a]=i(r)}),registryUI.taghistory.loadend=!0,e.update()},n=function(t){t=t.manifests||t,e.archs=t.map(function(t){return{title:t.platform.os+"/"+t.platform.architecture+(t.platform.variant?t.platform.variant:""),digest:t.digest}}),e.update()};e.tabchanged=function(t,i){if(e.elements=[],e.image.variants[i]=e.image.variants[i]||new registryUI.DockerImage(registryUI.taghistory.image,t.digest),e.image.variants[i].blobs)return s(e.image.variants[i].blobs);e.image.variants[i].fillInfo(),e.image.variants[i].on("blobs",s)},registryUI.taghistory.display=function(){e.elements=[],e.image=new registryUI.DockerImage(registryUI.taghistory.image,registryUI.taghistory.tag,!0),e.image.fillInfo(),e.image.on("blobs",s),e.image.on("list",n)},this.on("mount",function(){e.refs["tag-history-tag"].tags["material-button"].root.onclick=function(){registryUI.taglist.go(registryUI.taghistory.image)}}),registryUI.taghistory.display(),e.update()}),riot.tag2("taglist",'
arrow_back

Tags of {registryUI.taglist.name}
Sourced from {registryUI.name() + \'/\' + registryUI.taglist.name}
{registryUI.taglist.tags.length} tags

Creation date Size Content Digest Tag History delete
',"","",function(t){var e=registryUI.taglist.instance=this;e.page=registryUI.getPageQueryParam(),registryUI.taglist.tags=[];const i=function(){const t=window.innerWidth;var e=0,i=registryUI.taglist.tags.reduce(function(t,e){return e.tag.length>t?e.tag.length:t},0);e=t>=1440?71:t<1024?0:15+(t-1024)/416*56,i>20&&(e-=i-20),registryUI.taglist.tags.map(function(t){t.trigger("content-digest-chars",e)})};window.addEventListener("resize",i),window.requestAnimationFrame(i),this.multiDelete=!1,this.toDelete=0,this.on("delete",function(){registryUI.isImageRemoveActivated&&this.multiDelete}),this.on("multi-delete",function(){registryUI.isImageRemoveActivated&&(this.multiDelete=!this.multiDelete)}),this.on("toggle-remove-image",function(t){t?this.toDelete++:this.toDelete--,this.toDelete<=1&&this.update()}),this.on("page-update",function(t){e.page=t<1?1:t,registryUI.updateQueryString(registryUI.getQueryParams({page:e.page})),this.toDelete=0,this.update()}),this._getRemoveImageTags=function(){var t=e.refs["taglist-tag"].tags["remove-image"];return t instanceof Array||(t=[t]),t},registryUI.taglist.bulkDelete=function(t){e.multiDelete&&e.toDelete>0&&(t.altKey&&e._getRemoveImageTags().filter(function(t){return t.tags["material-checkbox"].checked}).forEach(function(t){t.tags["material-checkbox"].toggle()}),e._getRemoveImageTags().filter(function(t){return t.tags["material-checkbox"].checked}).forEach(function(t){t.delete(!0)}))},this.on("update",function(){var t=this.refs["taglist-tag"].refs["remove-tag-checkbox"];t&&!t._toggle&&(t._toggle=t.toggle,t.toggle=function(t){t.altKey?(this.checked||this._toggle(),e._getRemoveImageTags().filter(function(t){return!t.tags["material-checkbox"].checked}).forEach(function(t){t.tags["material-checkbox"].toggle()})):this._toggle()},t.on("toggle",function(){registryUI.taglist.instance.multiDelete=this.checked,registryUI.taglist.instance.update()}))}),registryUI.taglist.display=function(){if(registryUI.taglist.tags=[],"taglist"==route.routeName){const t=new Http;registryUI.taglist.instance.update(),t.addEventListener("load",function(){if(registryUI.taglist.tags=[],200==this.status){const t=JSON.parse(this.responseText).tags||[];registryUI.taglist.tags=t.map(function(t){return new registryUI.DockerImage(registryUI.taglist.name,t)}).sort(registryUI.DockerImage.compare),window.requestAnimationFrame(i),e.trigger("page-update",Math.min(e.page,registryUI.getNumPages(registryUI.taglist.tags)))}else 404==this.status?registryUI.snackbar("Server not found",!0):registryUI.snackbar(this.responseText,!0)}),t.addEventListener("error",function(){registryUI.snackbar(this.getErrorMessage(),!0),registryUI.taglist.tags=[]}),t.addEventListener("loadend",function(){registryUI.taglist.loadend=!0,registryUI.taglist.instance.update()}),t.open("GET",registryUI.url()+"/v2/"+registryUI.taglist.name+"/tags/list"),t.send(),registryUI.taglist.asc=!0}},registryUI.taglist.display(),registryUI.taglist.instance.update(),registryUI.taglist.reverse=function(){registryUI.taglist.asc?(registryUI.taglist.tags.reverse(),registryUI.taglist.asc=!1):(registryUI.taglist.tags.sort(registryUI.DockerImage.compare),registryUI.taglist.asc=!0),registryUI.taglist.instance.update()}}); \ No newline at end of file diff --git a/dist/scripts/docker-registry-ui.js b/dist/scripts/docker-registry-ui.js index 80020d5..3f1b3b3 100644 --- a/dist/scripts/docker-registry-ui.js +++ b/dist/scripts/docker-registry-ui.js @@ -15,4 +15,4 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -function Http(){this.oReq=new XMLHttpRequest,this.oReq.hasHeader=Http.hasHeader,this.oReq.getErrorMessage=Http.getErrorMessage,this._events={},this._headers={}}Http.prototype.getContentDigest=function(t){this.oReq.hasHeader("Docker-Content-Digest")?t(this.oReq.getResponseHeader("Docker-Content-Digest")):window.crypto&&window.TextEncoder&&crypto.subtle.digest("SHA-256",(new TextEncoder).encode(this.oReq.responseText)).then(function(e){t("sha256:"+Array.from(new Uint8Array(e)).map(function(t){return t.toString(16).padStart(2,"0")}).join(""))})},Http.prototype.addEventListener=function(t,e){this._events[t]=e;const r=this;switch(t){case"loadend":r.oReq.addEventListener("loadend",function(){if(401==this.status){const t=new XMLHttpRequest;for(key in t.open(r._method,r._url),r._events)t.addEventListener(key,r._events[key]);for(key in r._headers)t.setRequestHeader(key,r._headers[key]);t.withCredentials=!0,t.hasHeader=Http.hasHeader,t.getErrorMessage=Http.getErrorMessage,r.oReq=t,t.send()}else e.bind(this)()});break;case"load":r.oReq.addEventListener("load",function(){401!==this.status&&e.bind(this)()});break;default:r.oReq.addEventListener(t,function(){e.bind(this)()})}},Http.prototype.setRequestHeader=function(t,e){this.oReq.setRequestHeader(t,e),this._headers[t]=e},Http.prototype.open=function(t,e){this._method=t,this._url=e,this.oReq.open(t,e)},Http.prototype.send=function(){this.oReq.send()},Http.hasHeader=function(t){return this.getAllResponseHeaders().split("\n").some(function(e){return new RegExp("^"+t+":","i").test(e)})},Http.getErrorMessage=function(){return registryUI.url()&®istryUI.url().match("^http://")&&"https:"===window.location.protocol?"Mixed Content: The page at `"+window.location.origin+"` was loaded over HTTPS, but requested an insecure server endpoint `"+registryUI.url()+"`. This request has been blocked; the content must be served over HTTPS.":registryUI.url()?this.withCredentials&&!this.hasHeader("Access-Control-Allow-Credentials")?"The `Access-Control-Allow-Credentials` header in the response is missing and must be set to `true` when the request's credentials mode is on. Origin `"+registryUI.url()+"` is therefore not allowed access.":"An error occured: Check your connection and your registry must have `Access-Control-Allow-Origin` header set to `"+window.location.origin+"`":"Incorrect server endpoint."};var registryUI={URL_QUERY_PARAM_REGEX:/[&?]url=/,URL_PARAM_REGEX:/^url=/,showContentDigest:!0,catalogElementsLimit:1e5,url:function(t){if(!registryUI._url){const t=registryUI.getUrlQueryParam();if(t)try{return registryUI._url=registryUI.decodeURI(t),registryUI._url}catch(t){console.log(t)}registryUI._url=registryUI.getRegistryServer(0)}return registryUI._url},name:function(){return registryUI.stripHttps(registryUI.url())},getRegistryServer:function(t){try{const e=JSON.parse(localStorage.getItem("registryServer"));if(e instanceof Array)return isNaN(t)?e.map(function(t){return t.trim().replace(/\/*$/,"")}):e[t]}catch(t){}return isNaN(t)?[]:""},addServer:function(t){const e=registryUI.getRegistryServer();t=t.trim().replace(/\/*$/,""),-1==e.indexOf(t)&&(e.push(t),registryUI._url||registryUI.updateHistory(t),localStorage.setItem("registryServer",JSON.stringify(e)))},changeServer:function(t){var e=registryUI.getRegistryServer();t=t.trim().replace(/\/*$/,"");const r=e.indexOf(t);-1!=r&&(e.splice(r,1),e=[t].concat(e),registryUI.updateHistory(t),localStorage.setItem("registryServer",JSON.stringify(e)))},removeServer:function(t){const e=registryUI.getRegistryServer();t=t.trim().replace(/\/*$/,"");const r=e.indexOf(t);-1!=r&&(e.splice(r,1),localStorage.setItem("registryServer",JSON.stringify(e)),t==registryUI.url()&&(registryUI.updateHistory(registryUI.getRegistryServer(0)),route("")))},updateHistory:function(t){registryUI.updateQueryString({url:registryUI.encodeURI(t)}),registryUI._url=t},getUrlQueryParam:function(){const t=window.location.search;if(registryUI.URL_QUERY_PARAM_REGEX.test(t)){const e=t.split(/^\?|&/).find(function(t){return t&®istryUI.URL_PARAM_REGEX.test(t)});return e?e.replace(registryUI.URL_PARAM_REGEX,""):e}},encodeURI:function(t){if(t)return t.indexOf("&")<0?window.encodeURIComponent(t):btoa(t)},decodeURI:function(t){if(t)return t.startsWith("http")?window.decodeURIComponent(t):atob(t)},isImageRemoveActivated:!0,catalog:{},taglist:{},taghistory:{}};window.addEventListener("DOMContentLoaded",function(){riot.mount("*")}),registryUI.bytesToSize=function(t){if(null==t||isNaN(t))return"?";if(0==t)return"0 Byte";const e=parseInt(Math.floor(Math.log(t)/Math.log(1024)));return Math.ceil(t/Math.pow(1024,e))+" "+["Bytes","KB","MB","GB","TB"][e]},registryUI.dateFormat=function(t){if(void 0===t)return"";const e=["a second","seconds","a minute","minutes","an hour","hours","a day","days","a month","months","a year","years"],r=[1,60,3600,86400,2592e3,31104e3,1/0],i=(new Date-t)/1e3;for(var a=0;a=i)return e[2*a];if(r[a+1]>i)return Math.floor(i/r[a])+" "+e[2*a+1]}},registryUI.getHistoryIcon=function(t){switch(t){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"}},registryUI.getPage=function(t,e,r){return r||(r=100),t?t.slice((e-1)*r,r*e):[]},registryUI.getNumPages=function(t,e){return e||(e=100),t?Math.trunc(t.length/e)+1:0},registryUI.getPageLabels=function(t,e){var r=[];if(1===e)return r;1!==t&&e>=10&&(r.push({icon:"first_page",page:1}),r.push({icon:"chevron_left",page:t-1}));for(var i=Math.round(Math.max(1,Math.min(t-5,e-10+1))),a=i;a10,"space-right":t===e&&e>10});return t!==e&&e>=10&&(r.push({icon:"chevron_right",page:t+1}),r.push({icon:"last_page",page:e})),r},registryUI.updateQueryString=function(t){var e="";for(var r in t)void 0!==t[r]&&(e+=(e.length>0?"&":"?")+r+"="+t[r]);history.pushState(null,"",e+window.location.hash)},registryUI.stripHttps=function(t){return t?t.replace(/^https?:\/\//,""):""},registryUI.eventTransfer=function(t,e){t.on("*",function(t,r){e.trigger(t,r)})},riot.tag2("app",'
',"","",function(t){registryUI.appTag=this,route.base("#!"),route("",function(){route.routeName="home",registryUI.catalog.display&&(registryUI.catalog.loadend=!1),registryUI.appTag.update()}),route("/taglist/*",function(t){route.routeName="taglist",registryUI.taglist.name=t,registryUI.taglist.display&&(registryUI.taglist.loadend=!1),registryUI.appTag.update()}),route("/taghistory/image/*/tag/*",function(t,e){route.routeName="taghistory",registryUI.taghistory.image=t,registryUI.taghistory.tag=e,registryUI.taghistory.display&&(registryUI.taghistory.loadend=!1),registryUI.appTag.update()}),registryUI.home=function(){"home"==route.routeName?registryUI.catalog.display:route("")},registryUI.taghistory.go=function(t,e){route("/taghistory/image/"+t+"/tag/"+e)},registryUI.snackbar=function(t,e){registryUI.appTag.tags["material-snackbar"].addToast({message:t,isError:e},15e3)},registryUI.errorSnackbar=function(t){return registryUI.snackbar(t,!0)},registryUI.showErrorCanNotReadContentDigest=function(){registryUI.errorSnackbar("Access on registry response was blocked. Try adding the header `Access-Control-Expose-Headers: Docker-Content-Digest` to your proxy or registry: https://docs.docker.com/registry/configuration/#http")},registryUI.cleanName=function(){const t=registryUI.pullUrl||registryUI.url()&®istryUI.url().length>0&®istryUI.url()||window.location.host;return registryUI.stripHttps(t)},route.parser(null,function(t,e){const r=e.replace(/\?/g,"\\?").replace(/\*/g,"([^?#]+?)").replace(/\.\./,".*"),i=new RegExp("^"+r+"$"),a=t.match(i);if(a)return a.slice(1)}),registryUI.isDigit=function(t){return t>="0"&&t<="9"},registryUI.DockerImage=function(t,e,r){this.name=t,this.tag=e,this.list=r,this.chars=0,riot.observable(this),this.on("get-size",function(){return void 0!==this.size?this.trigger("size",this.size):this.fillInfo()}),this.on("get-sha256",function(){return void 0!==this.size?this.trigger("sha256",this.sha256):this.fillInfo()}),this.on("get-date",function(){return void 0!==this.creationDate?this.trigger("creation-date",this.creationDate):this.fillInfo()}),this.on("content-digest-chars",function(t){this.chars=t}),this.on("get-content-digest-chars",function(){return this.trigger("content-digest-chars",this.chars)}),this.on("get-content-digest",function(){return void 0!==this.digest?this.trigger("content-digest",this.digest):this.fillInfo()})},registryUI.DockerImage._tagReduce=function(t,e){return t.length>0&®istryUI.isDigit(t[t.length-1].charAt(0))==registryUI.isDigit(e)?t[t.length-1]+=e:t.push(e),t},registryUI.DockerImage.compare=function(t,e){const r=t.tag.match(/./g).reduce(registryUI.DockerImage._tagReduce,[]),i=e.tag.match(/./g).reduce(registryUI.DockerImage._tagReduce,[]);for(var a=0;a send {typeof opts.item === ⁗string⁗ ? opts.item : opts.item.repo}
{opts.item.images && opts.item.images.length} images expand_more
',"","",function(t){this.on("mount",function(){const t=this,e=this.tags["material-card"];e&&(e.launch=function(t){e.tags["material-waves"].trigger("launch",t)},this.item.images&&1===this.item.images.length&&(this.item=this.item.images[0]),e.root.onclick=function(e){t.item.repo?(t.expanded=!t.expanded,t.update({expanded:t.expanded,expanding:!0}),setTimeout(function(){t.update({expanded:t.expanded,expanding:!1})},50)):registryUI.taglist.go(t.item)})})}),riot.tag2("catalog",'

Repositories of {registryUI.name()}
{registryUI.catalog.length} images

',"","",function(t){registryUI.catalog.instance=this,registryUI.catalog.display=function(){registryUI.catalog.repositories=[];const t=new Http;t.addEventListener("load",function(){registryUI.catalog.repositories=[],200==this.status?(registryUI.url()||(registryUI._url=window.location.origin+window.location.pathname.replace(/\/+$/,"")),registryUI.catalog.repositories=JSON.parse(this.responseText).repositories||[],registryUI.catalog.repositories.sort(),registryUI.catalog.length=registryUI.catalog.repositories.length,registryUI.catalog.repositories=registryUI.catalog.repositories.reduce(function(t,e){const r=e.indexOf("/");if(r>0){const i=e.substring(0,r)+"/";return 0!=t.length&&t[t.length-1].repo==i||t.push({repo:i,images:[]}),t[t.length-1].images.push(e),t}return t.push(e),t},[])):404==this.status?registryUI.snackbar("Server not found",!0):registryUI.snackbar(this.responseText)}),t.addEventListener("error",function(){registryUI.snackbar(this.getErrorMessage(),!0),registryUI.catalog.repositories=[]}),t.addEventListener("loadend",function(){registryUI.catalog.loadend=!0,registryUI.catalog.instance.update()}),t.open("GET",registryUI.url()+"/v2/_catalog?n="+registryUI.catalogElementsLimit),t.send()},registryUI.catalog.display()}),riot.tag2("copy-to-clipboard",'
content_copy
',"","",function(t){this.prefix="docker pull "+registryUI.cleanName()+"/"+t.image.name;const e=this;"tag"===t.target?e.dockerCmd=e.prefix+":"+t.image.tag:(t.image.one("content-digest",function(t){e.dockerCmd=e.prefix+"@"+t}),t.image.trigger("get-content-digest")),this.copy=function(){if(!e.dockerCmd)return void registryUI.showErrorCanNotReadContentDigest();const t=this.refs.input;t.style.display="block",t.select(),document.execCommand("copy"),t.style.display="none",registryUI.snackbar("`"+this.dockerCmd+"` has been copied to clipboard.")}}),riot.tag2("image-content-digest",'
{this.display_id}
',"","",function(t){const e=this;e.chars=-1,e.onResize=function(t){t!==e.chars&&(e.chars=t,t>=70?(e.display_id=e.digest,e.title=""):t<=0?(e.display_id="",e.title=e.digest):(e.display_id=e.digest.slice(0,t)+"...",e.title=e.digest),e.update())},t.image.one("content-digest",function(r){e.digest=r,t.image.on("content-digest-chars",e.onResize),t.image.trigger("get-content-digest-chars")}),t.image.trigger("get-content-digest")}),riot.tag2("image-date",'
{registryUI.dateFormat(this.date)} ago
',"","",function(t){const e=this;t.image.on("creation-date",function(t){e.date=t,e.localDate=t.toLocaleString(),e.update()}),t.image.trigger("get-date")}),riot.tag2("image-size",'
{registryUI.bytesToSize(this.size)}
',"","",function(t){const e=this;t.image.on("size",function(t){e.size=t,e.update()}),t.image.trigger("get-size")}),riot.tag2("image-tag",'
{opts.image.tag}
',"","",function(t){const e=this;t.image.on("sha256",function(t){e.sha256=t.substring(0,19),e.update()}),t.image.trigger("get-sha256")}),riot.tag2("pagination",'
{p.icon}
{p.page}
',"","",function(t){this.on("updated",function(){this.tags["material-button"]&&(Array.isArray(this.tags["material-button"])?this.tags["material-button"]:[this.tags["material-button"]]).forEach(function(t){t.root.onclick=function(){registryUI.taglist.instance.trigger("page-update",t.p.page)}})})}),riot.tag2("remove-image",' delete ',"","",function(t){const e=this;this.on("updated",function(){}),this.on("updated",function(){e.multiDelete!=e.opts.multiDelete&&(e.tags["material-button"]&&(e.delete=function(t){const r=e.opts.image.name,i=e.opts.image.tag;if(registryUI.taglist.go(r),!e.digest)return void registryUI.snackbar("Information for "+r+":"+i+" are not yet loaded.");const a=new Http;a.addEventListener("loadend",function(){200==this.status||202==this.status?(registryUI.taglist.display(),registryUI.snackbar("Deleting "+r+":"+i+" image. Run `registry garbage-collect config.yml` on your registry")):404==this.status?t||registryUI.errorSnackbar("Digest not found for this image in your registry."):registryUI.snackbar(this.responseText)}),a.open("DELETE",registryUI.url()+"/v2/"+r+"/manifests/"+e.digest),a.setRequestHeader("Accept","application/vnd.docker.distribution.manifest.v2+json, application/vnd.oci.image.manifest.v1+json"),a.addEventListener("error",function(){registryUI.errorSnackbar("An error occurred when deleting image. Check if your server accept DELETE methods Access-Control-Allow-Methods: ['DELETE'].")}),a.send()},e.tags["material-button"].root.onclick=function(){e.delete()}),e.tags["material-checkbox"]&&(!e.opts.multiDelete&&e.tags["material-checkbox"].checked&&e.tags["material-checkbox"].toggle(),e.tags["material-checkbox"].on("toggle",function(){registryUI.taglist.instance.trigger("toggle-remove-image",this.checked)})),e.multiDelete=e.opts.multiDelete)}),t.image.one("content-digest",function(t){e.digest=t,e.update()}),t.image.trigger("get-content-digest")}),riot.tag2("tag-history-button",' history ',"","",function(t){this.on("mount",function(){const t=this;this.refs.button.root.onclick=function(){registryUI.taghistory.go(t.opts.image.name,t.opts.image.tag)}}),this.update()}),riot.tag2("tag-history-element",'
{registryUI.getHistoryIcon(entry.key)}

{entry.key.replace(\'_\', \' \')}

{entry.value}
{e}
',"",'class="{entry.key}"',function(t){}),riot.tag2("tag-history",'
arrow_back

History of {registryUI.taghistory.image}:{registryUI.taghistory.tag} history

',"","",function(t){const e=this,r=function(t){switch(t){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}},i=function(t,e){return r(t.key)-r(e.key)},a=function(t,e){switch(t){case"created":return new Date(e).toLocaleString();case"created_by":const r=e.match(/\/bin\/sh *-c *#\(nop\) *([A-Z]+)/);return r&&r[1]||"RUN";case"size":return registryUI.bytesToSize(e);case"Entrypoint":case"Cmd":return(e||[]).join(" ");case"Labels":return Object.keys(e||{}).map(function(t){return e[t]?t+"="+e[t]:""});case"Volumes":case"ExposedPorts":return Object.keys(e)}return e||""},s=function(t){function r(t){const e=[];for(var r in t)if(t.hasOwnProperty(r)&&"empty_layer"!=r){const i=t[r],s={key:r,value:a(r,i)};e.push(s)}return e.sort(i)}e.elements=new Array(t.history.length+1),e.elements[0]=r(function(t){const e=["architecture","User","created","docker_version","os","Cmd","Entrypoint","Env","Labels","User","Volumes","WorkingDir","author","id","ExposedPorts"].reduce(function(e,r){const i=t[r]||t.config[r];return i&&"architecture"===r&&t.variant?e[r]=i+t.variant:i&&(e[r]=i),e},{});return!e.author&&e.Labels&&e.Labels.maintainer&&(e.author=t.config.Labels.maintainer,delete e.Labels.maintainer),e}(t)),t.history.forEach(function(i,a){e.elements[t.history.length-a]=r(i)}),registryUI.taghistory.loadend=!0,e.update()},n=function(t){t=t.manifests||t,e.archs=t.map(function(t){return{title:t.platform.os+"/"+t.platform.architecture+(t.platform.variant?t.platform.variant:""),digest:t.digest}}),e.update()};e.tabchanged=function(t,r){if(e.elements=[],e.image.variants[r]=e.image.variants[r]||new registryUI.DockerImage(registryUI.taghistory.image,t.digest),e.image.variants[r].blobs)return s(e.image.variants[r].blobs);e.image.variants[r].fillInfo(),e.image.variants[r].on("blobs",s)},registryUI.taghistory.display=function(){e.elements=[],e.image=new registryUI.DockerImage(registryUI.taghistory.image,registryUI.taghistory.tag,!0),e.image.fillInfo(),e.image.on("blobs",s),e.image.on("list",n)},this.on("mount",function(){e.refs["tag-history-tag"].tags["material-button"].root.onclick=function(){registryUI.taglist.go(registryUI.taghistory.image)}}),registryUI.taghistory.display(),e.update()}),riot.tag2("taglist",'
arrow_back

Tags of {registryUI.taglist.name}
Sourced from {registryUI.name() + \'/\' + registryUI.taglist.name}
{registryUI.taglist.tags.length} tags

Creation date Size Content Digest Tag History delete
',"","",function(t){var e=registryUI.taglist.instance=this;e.page=registryUI.getPageQueryParam(),registryUI.taglist.tags=[];const r=function(){const t=window.innerWidth;var e=0,r=registryUI.taglist.tags.reduce(function(t,e){return e.tag.length>t?e.tag.length:t},0);e=t>=1440?71:t<1024?0:15+(t-1024)/416*56,r>20&&(e-=r-20),registryUI.taglist.tags.map(function(t){t.trigger("content-digest-chars",e)})};window.addEventListener("resize",r),window.requestAnimationFrame(r),this.multiDelete=!1,this.toDelete=0,this.on("delete",function(){registryUI.isImageRemoveActivated&&this.multiDelete}),this.on("multi-delete",function(){registryUI.isImageRemoveActivated&&(this.multiDelete=!this.multiDelete)}),this.on("toggle-remove-image",function(t){t?this.toDelete++:this.toDelete--,this.toDelete<=1&&this.update()}),this.on("page-update",function(t){e.page=t<1?1:t,registryUI.updateQueryString(registryUI.getQueryParams({page:e.page})),this.toDelete=0,this.update()}),this._getRemoveImageTags=function(){var t=e.refs["taglist-tag"].tags["remove-image"];return t instanceof Array||(t=[t]),t},registryUI.taglist.bulkDelete=function(t){e.multiDelete&&e.toDelete>0&&(t.altKey&&e._getRemoveImageTags().filter(function(t){return t.tags["material-checkbox"].checked}).forEach(function(t){t.tags["material-checkbox"].toggle()}),e._getRemoveImageTags().filter(function(t){return t.tags["material-checkbox"].checked}).forEach(function(t){t.delete(!0)}))},this.on("update",function(){var t=this.refs["taglist-tag"].refs["remove-tag-checkbox"];t&&!t._toggle&&(t._toggle=t.toggle,t.toggle=function(t){t.altKey?(this.checked||this._toggle(),e._getRemoveImageTags().filter(function(t){return!t.tags["material-checkbox"].checked}).forEach(function(t){t.tags["material-checkbox"].toggle()})):this._toggle()},t.on("toggle",function(){registryUI.taglist.instance.multiDelete=this.checked,registryUI.taglist.instance.update()}))}),registryUI.taglist.display=function(){if(registryUI.taglist.tags=[],"taglist"==route.routeName){const t=new Http;registryUI.taglist.instance.update(),t.addEventListener("load",function(){if(registryUI.taglist.tags=[],200==this.status){const t=JSON.parse(this.responseText).tags||[];registryUI.taglist.tags=t.map(function(t){return new registryUI.DockerImage(registryUI.taglist.name,t)}).sort(registryUI.DockerImage.compare),window.requestAnimationFrame(r),e.trigger("page-update",Math.min(e.page,registryUI.getNumPages(registryUI.taglist.tags)))}else 404==this.status?registryUI.snackbar("Server not found",!0):registryUI.snackbar(this.responseText,!0)}),t.addEventListener("error",function(){registryUI.snackbar(this.getErrorMessage(),!0),registryUI.taglist.tags=[]}),t.addEventListener("loadend",function(){registryUI.taglist.loadend=!0,registryUI.taglist.instance.update()}),t.open("GET",registryUI.url()+"/v2/"+registryUI.taglist.name+"/tags/list"),t.send(),registryUI.taglist.asc=!0}},registryUI.taglist.display(),registryUI.taglist.instance.update(),registryUI.taglist.reverse=function(){registryUI.taglist.asc?(registryUI.taglist.tags.reverse(),registryUI.taglist.asc=!1):(registryUI.taglist.tags.sort(registryUI.DockerImage.compare),registryUI.taglist.asc=!0),registryUI.taglist.instance.update()}}),riot.tag2("add",'
Add your Server ?
Write your URL without /v2
Add Cancel
',"","",function(t){registryUI.addTag=registryUI.addTag||{},this.one("mount",function(){registryUI.addTag.dialog=this.tags["material-popup"],registryUI.addTag.dialog.getAddServer=function(){return this.tags["material-input"]?this.tags["material-input"].value:""}}),registryUI.addTag.onkeyup=function(t){13==t.keyCode&®istryUI.addTag.add()},registryUI.addTag.show=function(){registryUI.addTag.dialog.open()},registryUI.addTag.add=function(){registryUI.addTag.dialog.getAddServer().length>0&®istryUI.addServer(registryUI.addTag.dialog.getAddServer()),registryUI.home(),registryUI.addTag.close()},registryUI.addTag.close=function(){registryUI.addTag.dialog.tags["material-input"].value="",registryUI.addTag.dialog.close()}}),riot.tag2("change",'
Change your Server ?
Change Cancel
',"","",function(t){registryUI.changeTag=registryUI.changeTag||{},this.one("mount",function(){registryUI.changeTag.dialog=this.tags["material-popup"],registryUI.changeTag.dialog.getServerUrl=function(){return this.refs["server-list"]?this.refs["server-list"].value:""},registryUI.changeTag.dialog.on("updated",function(){this.refs["server-list"]&&(this.refs["server-list"].value=registryUI.url())})}),registryUI.changeTag.show=function(){registryUI.changeTag.dialog.open()},registryUI.changeTag.change=function(){registryUI.changeTag.dialog.getServerUrl().length>0&®istryUI.changeServer(registryUI.changeTag.dialog.getServerUrl()),registryUI.home(),registryUI.changeTag.dialog.close()},registryUI.changeTag.close=function(){registryUI.changeTag.dialog.close()}}),riot.tag2("menu",' more_vert

Add URL

Change URL

Remove URL

',"","",function(t){registryUI.menuTag=registryUI.menuTag||{},registryUI.menuTag.update=this.update,this.one("mount",function(t){const e=this;registryUI.menuTag.close=function(){e.tags["material-dropdown"].close(),e.update()},registryUI.menuTag.isOpen=function(){return e.tags["material-dropdown"].opened},registryUI.menuTag.toggle=function(){e.tags["material-dropdown"].opened?e.tags["material-dropdown"].close():e.tags["material-dropdown"].open(),e.update()}})}),riot.tag2("remove",'
Remove your Registry Server ?
Close
',"","",function(t){registryUI.removeTag=registryUI.removeTag||{},registryUI.removeTag.update=this.update,registryUI.removeTag.removeUrl=function(t){registryUI.removeServer(t),registryUI.removeTag.close()},registryUI.removeTag.close=function(){registryUI.removeTag.dialog.close(),registryUI.removeTag.update()},registryUI.removeTag.show=function(){registryUI.removeTag.dialog.open()},this.one("mount",function(){registryUI.removeTag.dialog=this.tags["material-popup"]})}); \ No newline at end of file +function Http(){this.oReq=new XMLHttpRequest,this.oReq.hasHeader=Http.hasHeader,this.oReq.getErrorMessage=Http.getErrorMessage,this._events={},this._headers={}}Http.prototype.getContentDigest=function(t){this.oReq.hasHeader("Docker-Content-Digest")?t(this.oReq.getResponseHeader("Docker-Content-Digest")):window.crypto&&window.TextEncoder&&crypto.subtle.digest("SHA-256",(new TextEncoder).encode(this.oReq.responseText)).then(function(e){t("sha256:"+Array.from(new Uint8Array(e)).map(function(t){return t.toString(16).padStart(2,"0")}).join(""))})},Http.prototype.addEventListener=function(t,e){this._events[t]=e;const r=this;switch(t){case"loadend":r.oReq.addEventListener("loadend",function(){if(401==this.status){const t=new XMLHttpRequest;for(key in t.open(r._method,r._url),r._events)t.addEventListener(key,r._events[key]);for(key in r._headers)t.setRequestHeader(key,r._headers[key]);t.withCredentials=!0,t.hasHeader=Http.hasHeader,t.getErrorMessage=Http.getErrorMessage,r.oReq=t,t.send()}else e.bind(this)()});break;case"load":r.oReq.addEventListener("load",function(){401!==this.status&&e.bind(this)()});break;default:r.oReq.addEventListener(t,function(){e.bind(this)()})}},Http.prototype.setRequestHeader=function(t,e){this.oReq.setRequestHeader(t,e),this._headers[t]=e},Http.prototype.open=function(t,e){this._method=t,this._url=e,this.oReq.open(t,e)},Http.prototype.send=function(){this.oReq.send()},Http.hasHeader=function(t){return this.getAllResponseHeaders().split("\n").some(function(e){return new RegExp("^"+t+":","i").test(e)})},Http.getErrorMessage=function(){return registryUI.url()&®istryUI.url().match("^http://")&&"https:"===window.location.protocol?"Mixed Content: The page at `"+window.location.origin+"` was loaded over HTTPS, but requested an insecure server endpoint `"+registryUI.url()+"`. This request has been blocked; the content must be served over HTTPS.":registryUI.url()?this.withCredentials&&!this.hasHeader("Access-Control-Allow-Credentials")?"The `Access-Control-Allow-Credentials` header in the response is missing and must be set to `true` when the request's credentials mode is on. Origin `"+registryUI.url()+"` is therefore not allowed access.":"An error occured: Check your connection and your registry must have `Access-Control-Allow-Origin` header set to `"+window.location.origin+"`":"Incorrect server endpoint."};var registryUI={URL_QUERY_PARAM_REGEX:/[&?]url=/,URL_PARAM_REGEX:/^url=/,showContentDigest:!0,catalogElementsLimit:1e5,url:function(t){if(!registryUI._url){const t=registryUI.getUrlQueryParam();if(t)try{return registryUI._url=registryUI.decodeURI(t),registryUI._url}catch(t){console.log(t)}registryUI._url=registryUI.getRegistryServer(0)}return registryUI._url},name:function(){return registryUI.stripHttps(registryUI.url())},getRegistryServer:function(t){try{const e=JSON.parse(localStorage.getItem("registryServer"));if(e instanceof Array)return isNaN(t)?e.map(function(t){return t.trim().replace(/\/*$/,"")}):e[t]}catch(t){}return isNaN(t)?[]:""},addServer:function(t){const e=registryUI.getRegistryServer();t=t.trim().replace(/\/*$/,""),-1==e.indexOf(t)&&(e.push(t),registryUI._url||registryUI.updateHistory(t),localStorage.setItem("registryServer",JSON.stringify(e)))},changeServer:function(t){var e=registryUI.getRegistryServer();t=t.trim().replace(/\/*$/,"");const r=e.indexOf(t);-1!=r&&(e.splice(r,1),e=[t].concat(e),registryUI.updateHistory(t),localStorage.setItem("registryServer",JSON.stringify(e)))},removeServer:function(t){const e=registryUI.getRegistryServer();t=t.trim().replace(/\/*$/,"");const r=e.indexOf(t);-1!=r&&(e.splice(r,1),localStorage.setItem("registryServer",JSON.stringify(e)),t==registryUI.url()&&(registryUI.updateHistory(registryUI.getRegistryServer(0)),route("")))},updateHistory:function(t){registryUI.updateQueryString({url:registryUI.encodeURI(t)}),registryUI._url=t},getUrlQueryParam:function(){const t=window.location.search;if(registryUI.URL_QUERY_PARAM_REGEX.test(t)){const e=t.split(/^\?|&/).find(function(t){return t&®istryUI.URL_PARAM_REGEX.test(t)});return e?e.replace(registryUI.URL_PARAM_REGEX,""):e}},encodeURI:function(t){if(t)return t.indexOf("&")<0?window.encodeURIComponent(t):btoa(t)},decodeURI:function(t){if(t)return t.startsWith("http")?window.decodeURIComponent(t):atob(t)},isImageRemoveActivated:!0,catalog:{},taglist:{},taghistory:{}};window.addEventListener("DOMContentLoaded",function(){riot.mount("*")}),registryUI.bytesToSize=function(t){if(null==t||isNaN(t))return"?";if(0==t)return"0 Byte";const e=parseInt(Math.floor(Math.log(t)/Math.log(1024)));return Math.ceil(t/Math.pow(1024,e))+" "+["Bytes","KB","MB","GB","TB"][e]},registryUI.dateFormat=function(t){if(void 0===t)return"";const e=["a second","seconds","a minute","minutes","an hour","hours","a day","days","a month","months","a year","years"],r=[1,60,3600,86400,2592e3,31104e3,1/0],i=(new Date-t)/1e3;for(var a=0;a=i)return e[2*a];if(r[a+1]>i)return Math.floor(i/r[a])+" "+e[2*a+1]}},registryUI.getHistoryIcon=function(t){switch(t){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"}},registryUI.getPage=function(t,e,r){return r||(r=100),t?t.slice((e-1)*r,r*e):[]},registryUI.getNumPages=function(t,e){return e||(e=100),t?Math.trunc(t.length/e)+1:0},registryUI.getPageLabels=function(t,e){var r=[];if(1===e)return r;1!==t&&e>=10&&(r.push({icon:"first_page",page:1}),r.push({icon:"chevron_left",page:t-1}));for(var i=Math.round(Math.max(1,Math.min(t-5,e-10+1))),a=i;a10,"space-right":t===e&&e>10});return t!==e&&e>=10&&(r.push({icon:"chevron_right",page:t+1}),r.push({icon:"last_page",page:e})),r},registryUI.updateQueryString=function(t){var e="";for(var r in t)void 0!==t[r]&&(e+=(e.length>0?"&":"?")+r+"="+t[r]);history.pushState(null,"",e+window.location.hash)},registryUI.stripHttps=function(t){return t?t.replace(/^https?:\/\//,""):""},registryUI.eventTransfer=function(t,e){t.on("*",function(t,r){e.trigger(t,r)})},riot.tag2("app",'
',"","",function(t){registryUI.appTag=this,route.base("#!"),route("",function(){route.routeName="home",registryUI.catalog.display&&(registryUI.catalog.loadend=!1),registryUI.appTag.update()}),route("/taglist/*",function(t){route.routeName="taglist",registryUI.taglist.name=t,registryUI.taglist.display&&(registryUI.taglist.loadend=!1),registryUI.appTag.update()}),route("/taghistory/image/*/tag/*",function(t,e){route.routeName="taghistory",registryUI.taghistory.image=t,registryUI.taghistory.tag=e,registryUI.taghistory.display&&(registryUI.taghistory.loadend=!1),registryUI.appTag.update()}),registryUI.home=function(){"home"==route.routeName?registryUI.catalog.display:route("")},registryUI.taghistory.go=function(t,e){route("/taghistory/image/"+t+"/tag/"+e)},registryUI.snackbar=function(t,e){registryUI.appTag.tags["material-snackbar"].addToast({message:t,isError:e},15e3)},registryUI.errorSnackbar=function(t){return registryUI.snackbar(t,!0)},registryUI.showErrorCanNotReadContentDigest=function(){registryUI.errorSnackbar("Access on registry response was blocked. Try adding the header `Access-Control-Expose-Headers: Docker-Content-Digest` to your proxy or registry: https://docs.docker.com/registry/configuration/#http")},registryUI.cleanName=function(){const t=registryUI.pullUrl||registryUI.url()&®istryUI.url().length>0&®istryUI.url()||window.location.host;return registryUI.stripHttps(t)},route.parser(null,function(t,e){const r=e.replace(/\?/g,"\\?").replace(/\*/g,"([^?#]+?)").replace(/\.\./,".*"),i=new RegExp("^"+r+"$"),a=t.match(i);if(a)return a.slice(1)}),registryUI.isDigit=function(t){return t>="0"&&t<="9"},registryUI.DockerImage=function(t,e,r){this.name=t,this.tag=e,this.list=r,this.chars=0,riot.observable(this),this.on("get-size",function(){return void 0!==this.size?this.trigger("size",this.size):this.fillInfo()}),this.on("get-sha256",function(){return void 0!==this.size?this.trigger("sha256",this.sha256):this.fillInfo()}),this.on("get-date",function(){return void 0!==this.creationDate?this.trigger("creation-date",this.creationDate):this.fillInfo()}),this.on("content-digest-chars",function(t){this.chars=t}),this.on("get-content-digest-chars",function(){return this.trigger("content-digest-chars",this.chars)}),this.on("get-content-digest",function(){return void 0!==this.digest?this.trigger("content-digest",this.digest):this.fillInfo()})},registryUI.DockerImage._tagReduce=function(t,e){return t.length>0&®istryUI.isDigit(t[t.length-1].charAt(0))==registryUI.isDigit(e)?t[t.length-1]+=e:t.push(e),t},registryUI.DockerImage.compare=function(t,e){const r=t.tag.match(/./g).reduce(registryUI.DockerImage._tagReduce,[]),i=e.tag.match(/./g).reduce(registryUI.DockerImage._tagReduce,[]);for(var a=0;a send {typeof opts.item === ⁗string⁗ ? opts.item : opts.item.repo}
{opts.item.images && opts.item.images.length} images expand_more
',"","",function(t){this.on("mount",function(){const t=this,e=this.tags["material-card"];e&&(e.launch=function(t){e.tags["material-waves"].trigger("launch",t)},this.item.images&&1===this.item.images.length&&(this.item=this.item.images[0]),e.root.onclick=function(e){t.item.repo?(t.expanded=!t.expanded,t.update({expanded:t.expanded,expanding:!0}),setTimeout(function(){t.update({expanded:t.expanded,expanding:!1})},50)):registryUI.taglist.go(t.item)})})}),riot.tag2("catalog",'

Repositories of {registryUI.name()}
{registryUI.catalog.length} images

',"","",function(t){registryUI.catalog.instance=this,registryUI.catalog.display=function(){registryUI.catalog.repositories=[];const t=new Http;t.addEventListener("load",function(){registryUI.catalog.repositories=[],200==this.status?(registryUI.url()||(registryUI._url=window.location.origin+window.location.pathname.replace(/\/+$/,"")),registryUI.catalog.repositories=JSON.parse(this.responseText).repositories||[],registryUI.catalog.repositories.sort(),registryUI.catalog.length=registryUI.catalog.repositories.length,registryUI.catalog.repositories=registryUI.catalog.repositories.reduce(function(t,e){const r=e.indexOf("/");if(r>0){const i=e.substring(0,r)+"/";return 0!=t.length&&t[t.length-1].repo==i||t.push({repo:i,images:[]}),t[t.length-1].images.push(e),t}return t.push(e),t},[])):404==this.status?registryUI.snackbar("Server not found",!0):registryUI.snackbar(this.responseText)}),t.addEventListener("error",function(){registryUI.snackbar(this.getErrorMessage(),!0),registryUI.catalog.repositories=[]}),t.addEventListener("loadend",function(){registryUI.catalog.loadend=!0,registryUI.catalog.instance.update()}),t.open("GET",registryUI.url()+"/v2/_catalog?n="+registryUI.catalogElementsLimit),t.send()},registryUI.catalog.display()}),riot.tag2("copy-to-clipboard",'
content_copy
',"","",function(t){this.prefix="docker pull "+registryUI.cleanName()+"/"+t.image.name;const e=this;"tag"===t.target?e.dockerCmd=e.prefix+":"+t.image.tag:(t.image.one("content-digest",function(t){e.dockerCmd=e.prefix+"@"+t}),t.image.trigger("get-content-digest")),this.copy=function(){if(!e.dockerCmd)return void registryUI.showErrorCanNotReadContentDigest();const t=this.refs.input;t.style.display="block",t.select(),document.execCommand("copy"),t.style.display="none",registryUI.snackbar("`"+this.dockerCmd+"` has been copied to clipboard.")}}),riot.tag2("image-content-digest",'
{this.display_id}
',"","",function(t){const e=this;e.chars=-1,e.onResize=function(t){t!==e.chars&&(e.chars=t,t>=70?(e.display_id=e.digest,e.title=""):t<=0?(e.display_id="",e.title=e.digest):(e.display_id=e.digest.slice(0,t)+"...",e.title=e.digest),e.update())},t.image.one("content-digest",function(r){e.digest=r,t.image.on("content-digest-chars",e.onResize),t.image.trigger("get-content-digest-chars")}),t.image.trigger("get-content-digest")}),riot.tag2("image-date",'
{registryUI.dateFormat(this.date)} ago
',"","",function(t){const e=this;t.image.on("creation-date",function(t){e.date=t,e.localDate=t.toLocaleString(),e.update()}),t.image.trigger("get-date")}),riot.tag2("image-size",'
{registryUI.bytesToSize(this.size)}
',"","",function(t){const e=this;t.image.on("size",function(t){e.size=t,e.update()}),t.image.trigger("get-size")}),riot.tag2("image-tag",'
{opts.image.tag}
',"","",function(t){const e=this;t.image.on("sha256",function(t){e.sha256=t.substring(0,19),e.update()}),t.image.trigger("get-sha256")}),riot.tag2("pagination",'
{p.icon}
{p.page}
',"","",function(t){this.on("updated",function(){this.tags["material-button"]&&(Array.isArray(this.tags["material-button"])?this.tags["material-button"]:[this.tags["material-button"]]).forEach(function(t){t.root.onclick=function(){registryUI.taglist.instance.trigger("page-update",t.p.page)}})})}),riot.tag2("remove-image",' delete ',"","",function(t){const e=this;this.on("updated",function(){}),this.on("updated",function(){e.multiDelete!=e.opts.multiDelete&&(e.tags["material-button"]&&(e.delete=function(t){const r=e.opts.image.name,i=e.opts.image.tag;if(registryUI.taglist.go(r),!e.digest)return void registryUI.snackbar("Information for "+r+":"+i+" are not yet loaded.");const a=new Http;a.addEventListener("loadend",function(){200==this.status||202==this.status?(registryUI.taglist.display(),registryUI.snackbar("Deleting "+r+":"+i+" image. Run `registry garbage-collect config.yml` on your registry")):404==this.status?t||registryUI.errorSnackbar("Digest not found for this image in your registry."):registryUI.snackbar(this.responseText)}),a.open("DELETE",registryUI.url()+"/v2/"+r+"/manifests/"+e.digest),a.setRequestHeader("Accept","application/vnd.docker.distribution.manifest.v2+json, application/vnd.oci.image.manifest.v1+json"),a.addEventListener("error",function(){registryUI.errorSnackbar("An error occurred when deleting image. Check if your server accept DELETE methods Access-Control-Allow-Methods: ['DELETE'].")}),a.send()},e.tags["material-button"].root.onclick=function(){e.delete()}),e.tags["material-checkbox"]&&(!e.opts.multiDelete&&e.tags["material-checkbox"].checked&&e.tags["material-checkbox"].toggle(),e.tags["material-checkbox"].on("toggle",function(){registryUI.taglist.instance.trigger("toggle-remove-image",this.checked)})),e.multiDelete=e.opts.multiDelete)}),t.image.one("content-digest",function(t){e.digest=t,e.update()}),t.image.trigger("get-content-digest")}),riot.tag2("tag-history-button",' history ',"","",function(t){this.on("mount",function(){const t=this;this.refs.button.root.onclick=function(){registryUI.taghistory.go(t.opts.image.name,t.opts.image.tag)}}),this.update()}),riot.tag2("tag-history-element",'
{registryUI.getHistoryIcon(entry.key)}

{entry.key.replace(\'_\', \' \')}

{entry.value}
{e}
',"",'class="{entry.key}"',function(t){}),riot.tag2("tag-history",'
arrow_back

History of {registryUI.taghistory.image}:{registryUI.taghistory.tag} history

',"","",function(t){const e=this,r=function(t){switch(t){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}},i=function(t,e){return r(t.key)-r(e.key)},a=function(t,e){switch(t){case"created":return new Date(e).toLocaleString();case"created_by":const r=e.match(/\/bin\/sh *-c *#\(nop\) *([A-Z]+)/);return r&&r[1]||"RUN";case"size":return registryUI.bytesToSize(e);case"Entrypoint":case"Cmd":return(e||[]).join(" ");case"Labels":return Object.keys(e||{}).map(function(t){return e[t]?t+"="+e[t]:""});case"Volumes":case"ExposedPorts":return Object.keys(e)}return e||""},s=function(t){function r(t){const e=[];for(var r in t)if(t.hasOwnProperty(r)&&"empty_layer"!=r){const i=t[r],s={key:r,value:a(r,i)};e.push(s)}return e.sort(i)}e.elements=new Array(t.history.length+1),e.elements[0]=r(function(t){const e=["architecture","User","created","docker_version","os","Cmd","Entrypoint","Env","Labels","User","Volumes","WorkingDir","author","id","ExposedPorts"].reduce(function(e,r){const i=t[r]||t.config[r];return i&&"architecture"===r&&t.variant?e[r]=i+t.variant:i&&(e[r]=i),e},{});return!e.author&&e.Labels&&e.Labels.maintainer&&(e.author=t.config.Labels.maintainer,delete e.Labels.maintainer),e}(t)),t.history.forEach(function(i,a){e.elements[t.history.length-a]=r(i)}),registryUI.taghistory.loadend=!0,e.update()},n=function(t){t=t.manifests||t,e.archs=t.map(function(t){return{title:t.platform.os+"/"+t.platform.architecture+(t.platform.variant?t.platform.variant:""),digest:t.digest}}),e.update()};e.tabchanged=function(t,r){if(e.elements=[],e.image.variants[r]=e.image.variants[r]||new registryUI.DockerImage(registryUI.taghistory.image,t.digest),e.image.variants[r].blobs)return s(e.image.variants[r].blobs);e.image.variants[r].fillInfo(),e.image.variants[r].on("blobs",s)},registryUI.taghistory.display=function(){e.elements=[],e.image=new registryUI.DockerImage(registryUI.taghistory.image,registryUI.taghistory.tag,!0),e.image.fillInfo(),e.image.on("blobs",s),e.image.on("list",n)},this.on("mount",function(){e.refs["tag-history-tag"].tags["material-button"].root.onclick=function(){registryUI.taglist.go(registryUI.taghistory.image)}}),registryUI.taghistory.display(),e.update()}),riot.tag2("taglist",'
arrow_back

Tags of {registryUI.taglist.name}
Sourced from {registryUI.name() + \'/\' + registryUI.taglist.name}
{registryUI.taglist.tags.length} tags

Creation date Size Content Digest Tag History delete
',"","",function(t){var e=registryUI.taglist.instance=this;e.page=registryUI.getPageQueryParam(),registryUI.taglist.tags=[];const r=function(){const t=window.innerWidth;var e=0,r=registryUI.taglist.tags.reduce(function(t,e){return e.tag.length>t?e.tag.length:t},0);e=t>=1440?71:t<1024?0:15+(t-1024)/416*56,r>20&&(e-=r-20),registryUI.taglist.tags.map(function(t){t.trigger("content-digest-chars",e)})};window.addEventListener("resize",r),window.requestAnimationFrame(r),this.multiDelete=!1,this.toDelete=0,this.on("delete",function(){registryUI.isImageRemoveActivated&&this.multiDelete}),this.on("multi-delete",function(){registryUI.isImageRemoveActivated&&(this.multiDelete=!this.multiDelete)}),this.on("toggle-remove-image",function(t){t?this.toDelete++:this.toDelete--,this.toDelete<=1&&this.update()}),this.on("page-update",function(t){e.page=t<1?1:t,registryUI.updateQueryString(registryUI.getQueryParams({page:e.page})),this.toDelete=0,this.update()}),this._getRemoveImageTags=function(){var t=e.refs["taglist-tag"].tags["remove-image"];return t instanceof Array||(t=[t]),t},registryUI.taglist.bulkDelete=function(t){e.multiDelete&&e.toDelete>0&&(t.altKey&&e._getRemoveImageTags().filter(function(t){return t.tags["material-checkbox"].checked}).forEach(function(t){t.tags["material-checkbox"].toggle()}),e._getRemoveImageTags().filter(function(t){return t.tags["material-checkbox"].checked}).forEach(function(t){t.delete(!0)}))},this.on("update",function(){var t=this.refs["taglist-tag"].refs["remove-tag-checkbox"];t&&!t._toggle&&(t._toggle=t.toggle,t.toggle=function(t){t.altKey?(this.checked||this._toggle(),e._getRemoveImageTags().filter(function(t){return!t.tags["material-checkbox"].checked}).forEach(function(t){t.tags["material-checkbox"].toggle()})):this._toggle()},t.on("toggle",function(){registryUI.taglist.instance.multiDelete=this.checked,registryUI.taglist.instance.update()}))}),registryUI.taglist.display=function(){if(registryUI.taglist.tags=[],"taglist"==route.routeName){const t=new Http;registryUI.taglist.instance.update(),t.addEventListener("load",function(){if(registryUI.taglist.tags=[],200==this.status){const t=JSON.parse(this.responseText).tags||[];registryUI.taglist.tags=t.map(function(t){return new registryUI.DockerImage(registryUI.taglist.name,t)}).sort(registryUI.DockerImage.compare),window.requestAnimationFrame(r),e.trigger("page-update",Math.min(e.page,registryUI.getNumPages(registryUI.taglist.tags)))}else 404==this.status?registryUI.snackbar("Server not found",!0):registryUI.snackbar(this.responseText,!0)}),t.addEventListener("error",function(){registryUI.snackbar(this.getErrorMessage(),!0),registryUI.taglist.tags=[]}),t.addEventListener("loadend",function(){registryUI.taglist.loadend=!0,registryUI.taglist.instance.update()}),t.open("GET",registryUI.url()+"/v2/"+registryUI.taglist.name+"/tags/list"),t.send(),registryUI.taglist.asc=!0}},registryUI.taglist.display(),registryUI.taglist.instance.update(),registryUI.taglist.reverse=function(){registryUI.taglist.asc?(registryUI.taglist.tags.reverse(),registryUI.taglist.asc=!1):(registryUI.taglist.tags.sort(registryUI.DockerImage.compare),registryUI.taglist.asc=!0),registryUI.taglist.instance.update()}}),riot.tag2("add",'
Add your Server ?
Write your URL without /v2
Add Cancel
',"","",function(t){registryUI.addTag=registryUI.addTag||{},this.one("mount",function(){registryUI.addTag.dialog=this.tags["material-popup"],registryUI.addTag.dialog.getAddServer=function(){return this.tags["material-input"]?this.tags["material-input"].value:""}}),registryUI.addTag.onkeyup=function(t){13==t.keyCode&®istryUI.addTag.add()},registryUI.addTag.show=function(){registryUI.addTag.dialog.open()},registryUI.addTag.add=function(){registryUI.addTag.dialog.getAddServer().length>0&®istryUI.addServer(registryUI.addTag.dialog.getAddServer()),registryUI.home(),registryUI.addTag.close()},registryUI.addTag.close=function(){registryUI.addTag.dialog.tags["material-input"].value="",registryUI.addTag.dialog.close()}}),riot.tag2("change",'
Change your Server ?
Change Cancel
',"","",function(t){registryUI.changeTag=registryUI.changeTag||{},this.one("mount",function(){registryUI.changeTag.dialog=this.tags["material-popup"],registryUI.changeTag.dialog.getServerUrl=function(){return this.refs["server-list"]?this.refs["server-list"].value:""},registryUI.changeTag.dialog.on("updated",function(){this.refs["server-list"]&&(this.refs["server-list"].value=registryUI.url())})}),registryUI.changeTag.show=function(){registryUI.changeTag.dialog.open()},registryUI.changeTag.change=function(){registryUI.changeTag.dialog.getServerUrl().length>0&®istryUI.changeServer(registryUI.changeTag.dialog.getServerUrl()),registryUI.home(),registryUI.changeTag.dialog.close()},registryUI.changeTag.close=function(){registryUI.changeTag.dialog.close()}}),riot.tag2("menu",' more_vert

Add URL

Change URL

Remove URL

',"","",function(t){registryUI.menuTag=registryUI.menuTag||{},registryUI.menuTag.update=this.update,this.one("mount",function(t){const e=this;registryUI.menuTag.close=function(){e.tags["material-dropdown"].close(),e.update()},registryUI.menuTag.isOpen=function(){return e.tags["material-dropdown"].opened},registryUI.menuTag.toggle=function(){e.tags["material-dropdown"].opened?e.tags["material-dropdown"].close():e.tags["material-dropdown"].open(),e.update()}})}),riot.tag2("remove",'
Remove your Registry Server ?
Close
',"","",function(t){registryUI.removeTag=registryUI.removeTag||{},registryUI.removeTag.update=this.update,registryUI.removeTag.removeUrl=function(t){registryUI.removeServer(t),registryUI.removeTag.close()},registryUI.removeTag.close=function(){registryUI.removeTag.dialog.close(),registryUI.removeTag.update()},registryUI.removeTag.show=function(){registryUI.removeTag.dialog.open()},this.one("mount",function(){registryUI.removeTag.dialog=this.tags["material-popup"]})}); \ No newline at end of file diff --git a/dist/style.css b/dist/style.css index cb42020..54c0abe 100644 --- a/dist/style.css +++ b/dist/style.css @@ -15,4 +15,4 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(fonts/MaterialIcons-Regular.eot);src:local('Material Icons'),local('MaterialIcons-Regular'),url(fonts/MaterialIcons-Regular.woff2) format('woff2'),url(fonts/MaterialIcons-Regular.woff) format('woff'),url(fonts/MaterialIcons-Regular.ttf) format('truetype')}i.material-icons,material-button .content i.material-icons,material-button[rounded=true] .content i.material-icons{font-family:'Material Icons';font-weight:400;font-style:normal;font-size:24px;display:inline-block;width:1em;height:1em;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:'liga'}material-button .content i.material-icons,material-button[rounded=true] .content i.material-icons{margin:auto}html>body{font-family:Roboto,Helvetica,Arial,sans-serif!important}body,html{margin:0;height:100%}main{margin-bottom:100px}.section-centerd{margin:auto}.full-table{width:100%;border:none}.url{font-size:14px;word-break:break-all}.material-card-title-action a{color:inherit;text-decoration:none;font-weight:inherit}material-card,material-tabs,pagination .conatianer{max-width:95%;margin:auto;margin-top:20px;margin-bottom:20px}pagination .conatianer{display:flex;display:-moz-flex;display:-webkit-flex;display:-ms-flexbox}pagination .conatianer .pagination-centered{margin:auto}@media screen and (min-width:1515px){material-card,material-tabs,pagination .conatianer{max-width:1440px}}material-tabs{display:block;-webkit-box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);-ms-box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);-moz-box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);-o-box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}material-tabs material-button,material-tabs material-button .content .text{background-color:#fff;color:#aaa;text-transform:none}material-tabs .line-wrapper .line{background-color:#25313b}material-tabs material-button.selected .content .text{color:#25313b}material-spinner{align-self:center}.spinner-wrapper{margin-top:50px;display:flex;flex-direction:column}material-navbar{height:64px}.logo{padding:0 16px 0 72px;text-decoration:none;font-size:20px;line-height:1;letter-spacing:.02em;font-weight:400}h2{padding:16px;margin:auto;font-size:24px;font-weight:300;line-height:normal;overflow:hidden}.material-card-title-action h2 .item-count,.material-card-title-action h2 .source-hint{font-size:.7em;margin-left:1em}.list{display:block;padding:8px 0;list-style:none}.list.highlight:hover{background-color:#eee;cursor:pointer}.list>li,.list>span{box-sizing:border-box;line-height:1;height:48px;padding:0 16px;overflow:hidden}.list>li i.material-icons,.list>span i.material-icons{margin-right:32px;height:24px;width:24px;font-size:24px;box-sizing:border-box;color:#757575}.list>span .right i.material-icons.animated{transition:all 350ms cubic-bezier(.4,0,.2,1);margin-right:10px}.list>span .right{position:absolute;align-self:end;display:flex;align-items:center;right:0}.list>span i.material-icons.animated.expanded{transform:rotate(180deg)}.list>span .item-count{font-size:.75em}.list>li>span,.list>span{height:100%;text-decoration:none;box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center}material-card.list{margin-top:10px;margin-bottom:10px}.material-card-title-action{-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:block;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:16px}.material-card-title-action h2{margin:0}material-card table{width:100%;border:none;position:relative;border:1px solid rgba(0,0,0,.12);border-collapse:collapse;white-space:nowrap;font-size:13px;background-color:#fff;border:none}material-card table th{font-size:18px;vertical-align:bottom;line-height:24px;height:48px;color:rgba(0,0,0,.54);box-sizing:border-box;padding:0 18px 12px 18px;text-align:right}.material-card-th-left{text-align:left}material-card material-button:hover,material-card table tbody tr:hover,pagination material-button:hover{background-color:#eee}material-card material-button,material-card table tbody tr,pagination material-button{transition-duration:.28s;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-property:background-color}material-card table tbody tr{position:relative;height:48px}material-card table td{font-size:16px;position:relative;height:48px;border-top:1px solid rgba(0,0,0,.12);border-bottom:1px solid rgba(0,0,0,.12);padding:12px 18px;box-sizing:border-box;vertical-align:middle;text-align:right}material-card table th.material-card-th-sorted-ascending:hover,material-card table th.material-card-th-sorted-descending:hover,tag-history-button button:hover{cursor:pointer}material-card table th.material-card-th-sorted-ascending:hover:before,material-card table th.material-card-th-sorted-descending:hover:before{color:rgba(0,0,0,.26)}material-card table th.material-card-th-sorted-ascending:before,material-card table th.material-card-th-sorted-descending:before{font-family:'Material Icons';font-weight:400;font-style:normal;line-height:1;font-size:16px;content:"\e5d8";margin-right:5px;vertical-align:sub}material-card table th.material-card-th-sorted-descending:before{content:"\e5db"}.material-icons,material-button .content i.material-icons{color:#777}material-button[disabled] .content i.material-icons,material-checkbox[disabled] .content i.material-icons{color:#bbb}material-snackbar .toast{height:auto}menu{position:absolute;top:0;right:16px;color:#000}menu .overlay{position:fixed;height:100%;width:100%;top:0;right:0;z-index:1}#menu-control-button{background:rgba(255,255,255,0);float:right}#menu-control-button i{color:#fff;font-size:24px}#menu-control-dropdown{display:inline-block;position:relative}.dropdown{min-width:124px;padding:8px 0;margin:0}#menu-control-dropdown p,dropdown-item{padding:0 16px;margin:auto;line-height:48px;height:48px;cursor:pointer}#menu-control-dropdown p:hover{background-color:#eee}#menu-control-dropdown p:active,.material-button-active:active{background-color:#e0e0e0}material-popup material-button,pagination material-button{background-color:#fff;color:#000}material-popup material-button:hover material-waves{background-color:hsla(0,0%,75%,.2)}material-popup .popup{max-width:450px;top:2em}footer{width:100%;position:fixed;z-index:75;bottom:0}@media screen and (max-height:750px){main{min-height:calc(100% - 164px - 2.5em);margin-bottom:2em}footer{position:relative}}material-footer{padding:.5em 1em}@media screen and (min-width:760px) and (max-height:750px){main{min-height:calc(100% - 144px - 2.5em)}}.select-padding{padding:20px 0}select{position:relative;outline:0;box-shadow:none;padding:0;width:100%;background:0 0;border:none;font-weight:400;line-height:24px;height:24px;border-bottom:1px solid #2f6975;appearance:none;-moz-appearance:none;-webkit-appearance:none}.copy-to-clipboard{padding-left:5px}#image-tag-header{padding-right:57px}.copy-to-clipboard,image-tag{display:inline-block}image-content-digest{display:none;font-family:'Roboto Mono',Roboto,Helvetica,Arial,sans-serif!important}@media screen and (min-width:1024px){#image-content-digest-header{padding-right:57px}image-content-digest{display:inline-block}}.show-tag-history{width:30px;text-align:center}.remove-tag{padding:12px 5px;width:66px;text-align:center}.remove-tag.delete{padding:7px 5px}taglist .creation-date{width:10em}taglist .image-size{width:7em}catalog material-card,tag-history material-card{min-height:auto}tag-history-element i{font-size:20px;padding:0}tag-history-element.docker_version .headline .material-icons{background-size:24px auto;background-image:url(images/docker-logo.svg);background-repeat:no-repeat}tag-history-element{display:block;padding:20px;min-width:100px;min-height:3em;width:420px;float:left;overflow-x:auto}tag-history-element .headline p{font-weight:700;line-height:20px;position:relative;display:inline;top:-4px}tag-history-element.id div.value{font-size:12px}tag-history-button button{background:0 0;border:none}material-card material-button,pagination material-button{max-height:30px;max-width:30px}material-button:hover material-waves{background:0 0}material-card material-button,pagination material-button{background-color:inherit}catalog-element material-card{z-index:2;position:relative}catalog-element catalog-element material-card{transition:all 350ms cubic-bezier(.4,0,.2,1);z-index:1;position:relative}catalog-element catalog-element.hide material-card,catalog-element catalog-element.showing material-card{margin-top:-50px;opacity:0}catalog-element catalog-element>.content{margin-left:3em}@media screen and (min-width:1515px){catalog-element catalog-element>.content material-card{max-width:calc(1440px - 3em)}}remove-image{width:30px}material-checkbox .label{display:none}taglist material-checkbox{margin:auto;width:18px}material-checkbox.indeterminate .checkbox .checkmark{border-bottom:none}material-checkbox.indeterminate .checkbox.checked .checkmark{transform:rotate(90deg) scale(1);-webkit-transform:rotate(90deg) scale(1);-ms-transform:rotate(90deg) scale(1);-moz-transform:rotate(90deg) scale(1);-o-transform:rotate(90deg) scale(1)}material-checkbox .checkbox{border-color:#777}material-checkbox .checkbox.checked{background-color:#777}pagination material-button{padding:.2em .75em}pagination material-button .content{display:flex;align-content:center;line-height:1.9em}pagination material-button.current{border:1px solid rgba(0,0,0,.12)}pagination material-button.current.space-left{margin-left:85px}pagination material-button.current.space-right{margin-right:85px}pagination material-button .content i.material-icons{color:#000} \ No newline at end of file +@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(fonts/MaterialIcons-Regular.eot);src:local('Material Icons'),local('MaterialIcons-Regular'),url(fonts/MaterialIcons-Regular.woff2) format('woff2'),url(fonts/MaterialIcons-Regular.woff) format('woff'),url(fonts/MaterialIcons-Regular.ttf) format('truetype')}i.material-icons,material-button .content i.material-icons,material-button[rounded=true] .content i.material-icons{font-family:'Material Icons';font-weight:400;font-style:normal;font-size:24px;display:inline-block;width:1em;height:1em;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:'liga'}material-button .content i.material-icons,material-button[rounded=true] .content i.material-icons{margin:auto}@font-face{font-family:Roboto;font-style:normal;font-weight:300;font-display:swap;src:url(fonts/Roboto-Regular.eot);src:local('Roboto Light'),local('Roboto-Light'),url(fonts/Roboto-Light.woff2) format('woff2'),url(fonts/Roboto-Light.woff) format('woff'),url(fonts/Roboto-Light.ttf) format('truetype')}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:url(fonts/Roboto-Regular.eot);src:local('Roboto Regular'),local('Roboto-Regular'),url(fonts/Roboto-Regular.woff2) format('woff2'),url(fonts/Roboto-Regular.woff) format('woff'),url(fonts/Roboto-Regular.ttf) format('truetype')}@font-face{font-family:Roboto;font-style:normal;font-weight:700;font-display:swap;src:url(fonts/Roboto-Regular.eot);src:local('Roboto Bold'),local('Roboto-Bold'),url(fonts/Roboto-Bold.woff2) format('woff2'),url(fonts/Roboto-Bold.woff) format('woff'),url(fonts/Roboto-Bold.ttf) format('truetype')}@font-face{font-family:'Roboto Mono';font-style:normal;font-weight:400;font-display:swap;src:url(fonts/RobotoMono-Regular.eot);src:local('Roboto Mono Regular'),local('RobotoMono-Regular'),local('Roboto-Mono-Regular'),url(fonts/RobotoMono-Regular.woff2) format('woff2'),url(fonts/RobotoMono-Regular.woff) format('woff'),url(fonts/RobotoMono-Regular.ttf) format('truetype')}html>body{font-family:Roboto,Helvetica,Arial,sans-serif!important}body,html{margin:0;height:100%}main{margin-bottom:100px}.section-centerd{margin:auto}.full-table{width:100%;border:none}.url{font-size:14px;word-break:break-all}.material-card-title-action a{color:inherit;text-decoration:none;font-weight:inherit}material-card,material-tabs,pagination .conatianer{max-width:95%;margin:auto;margin-top:20px;margin-bottom:20px}pagination .conatianer{display:flex;display:-moz-flex;display:-webkit-flex;display:-ms-flexbox}pagination .conatianer .pagination-centered{margin:auto}@media screen and (min-width:1515px){material-card,material-tabs,pagination .conatianer{max-width:1440px}}material-tabs{display:block;-webkit-box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);-ms-box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);-moz-box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);-o-box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}material-tabs material-button,material-tabs material-button .content .text{background-color:#fff;color:#aaa;text-transform:none}material-tabs .line-wrapper .line{background-color:#25313b}material-tabs material-button.selected .content .text{color:#25313b}material-spinner{align-self:center}.spinner-wrapper{margin-top:50px;display:flex;flex-direction:column}material-navbar{height:64px}.logo{padding:0 16px 0 72px;text-decoration:none;font-size:20px;line-height:1;letter-spacing:.02em;font-weight:400}h2{padding:16px;margin:auto;font-size:24px;font-weight:300;line-height:normal;overflow:hidden}.material-card-title-action h2 .item-count,.material-card-title-action h2 .source-hint{font-size:.7em;margin-left:1em}.list{display:block;padding:8px 0;list-style:none}.list.highlight:hover{background-color:#eee;cursor:pointer}.list>li,.list>span{box-sizing:border-box;line-height:1;height:48px;padding:0 16px;overflow:hidden}.list>li i.material-icons,.list>span i.material-icons{margin-right:32px;height:24px;width:24px;font-size:24px;box-sizing:border-box;color:#757575}.list>span .right i.material-icons.animated{transition:all 350ms cubic-bezier(.4,0,.2,1);margin-right:10px}.list>span .right{position:absolute;align-self:end;display:flex;align-items:center;right:0}.list>span i.material-icons.animated.expanded{transform:rotate(180deg)}.list>span .item-count{font-size:.75em}.list>li>span,.list>span{height:100%;text-decoration:none;box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center}material-card.list{margin-top:10px;margin-bottom:10px}.material-card-title-action{-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:block;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:16px}.material-card-title-action h2{margin:0}material-card table{width:100%;border:none;position:relative;border:1px solid rgba(0,0,0,.12);border-collapse:collapse;white-space:nowrap;font-size:13px;background-color:#fff;border:none}material-card table th{font-size:18px;vertical-align:bottom;line-height:24px;height:48px;color:rgba(0,0,0,.54);box-sizing:border-box;padding:0 18px 12px 18px;text-align:right}.material-card-th-left{text-align:left}material-card material-button:hover,material-card table tbody tr:hover,pagination material-button:hover{background-color:#eee}material-card material-button,material-card table tbody tr,pagination material-button{transition-duration:.28s;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-property:background-color}material-card table tbody tr{position:relative;height:48px}material-card table td{font-size:16px;position:relative;height:48px;border-top:1px solid rgba(0,0,0,.12);border-bottom:1px solid rgba(0,0,0,.12);padding:12px 18px;box-sizing:border-box;vertical-align:middle;text-align:right}material-card table th.material-card-th-sorted-ascending:hover,material-card table th.material-card-th-sorted-descending:hover,tag-history-button button:hover{cursor:pointer}material-card table th.material-card-th-sorted-ascending:hover:before,material-card table th.material-card-th-sorted-descending:hover:before{color:rgba(0,0,0,.26)}material-card table th.material-card-th-sorted-ascending:before,material-card table th.material-card-th-sorted-descending:before{font-family:'Material Icons';font-weight:400;font-style:normal;line-height:1;font-size:16px;content:"\e5d8";margin-right:5px;vertical-align:sub}material-card table th.material-card-th-sorted-descending:before{content:"\e5db"}.material-icons,material-button .content i.material-icons{color:#777}material-button[disabled] .content i.material-icons,material-checkbox[disabled] .content i.material-icons{color:#bbb}material-snackbar .toast{height:auto}menu{position:absolute;top:0;right:16px;color:#000}menu .overlay{position:fixed;height:100%;width:100%;top:0;right:0;z-index:1}#menu-control-button{background:rgba(255,255,255,0);float:right}#menu-control-button i{color:#fff;font-size:24px}#menu-control-dropdown{display:inline-block;position:relative}.dropdown{min-width:124px;padding:8px 0;margin:0}#menu-control-dropdown p,dropdown-item{padding:0 16px;margin:auto;line-height:48px;height:48px;cursor:pointer}#menu-control-dropdown p:hover{background-color:#eee}#menu-control-dropdown p:active,.material-button-active:active{background-color:#e0e0e0}material-popup material-button,pagination material-button{background-color:#fff;color:#000}material-popup material-button:hover material-waves{background-color:hsla(0,0%,75%,.2)}material-popup .popup{max-width:450px;top:2em}footer{width:100%;position:fixed;z-index:75;bottom:0}@media screen and (max-height:750px){main{min-height:calc(100% - 164px - 2.5em);margin-bottom:2em}footer{position:relative}}material-footer{padding:.5em 1em}@media screen and (min-width:760px) and (max-height:750px){main{min-height:calc(100% - 144px - 2.5em)}}.select-padding{padding:20px 0}select{position:relative;outline:0;box-shadow:none;padding:0;width:100%;background:0 0;border:none;font-weight:400;line-height:24px;height:24px;border-bottom:1px solid #2f6975;appearance:none;-moz-appearance:none;-webkit-appearance:none}.copy-to-clipboard{padding-left:5px}#image-tag-header{padding-right:57px}.copy-to-clipboard,image-tag{display:inline-block}image-content-digest{display:none;font-family:'Roboto Mono',Roboto,Helvetica,Arial,sans-serif!important}@media screen and (min-width:1024px){#image-content-digest-header{padding-right:57px}image-content-digest{display:inline-block}}.show-tag-history{width:30px;text-align:center}.remove-tag{padding:12px 5px;width:66px;text-align:center}.remove-tag.delete{padding:7px 5px}taglist .creation-date{width:10em}taglist .image-size{width:7em}catalog material-card,tag-history material-card{min-height:auto}tag-history-element i{font-size:20px;padding:0}tag-history-element.docker_version .headline .material-icons{background-size:24px auto;background-image:url(images/docker-logo.svg);background-repeat:no-repeat}tag-history-element{display:block;padding:20px;min-width:100px;min-height:3em;width:420px;float:left;overflow-x:auto}tag-history-element .headline p{font-weight:700;line-height:20px;position:relative;display:inline;top:-4px}tag-history-element.id div.value{font-size:12px}tag-history-button button{background:0 0;border:none}material-card material-button,pagination material-button{max-height:30px;max-width:30px}material-button:hover material-waves{background:0 0}material-card material-button,pagination material-button{background-color:inherit}catalog-element material-card{z-index:2;position:relative}catalog-element catalog-element material-card{transition:all 350ms cubic-bezier(.4,0,.2,1);z-index:1;position:relative}catalog-element catalog-element.hide material-card,catalog-element catalog-element.showing material-card{margin-top:-50px;opacity:0}catalog-element catalog-element>.content{margin-left:3em}@media screen and (min-width:1515px){catalog-element catalog-element>.content material-card{max-width:calc(1440px - 3em)}}remove-image{width:30px}material-checkbox .label{display:none}taglist material-checkbox{margin:auto;width:18px}material-checkbox.indeterminate .checkbox .checkmark{border-bottom:none}material-checkbox.indeterminate .checkbox.checked .checkmark{transform:rotate(90deg) scale(1);-webkit-transform:rotate(90deg) scale(1);-ms-transform:rotate(90deg) scale(1);-moz-transform:rotate(90deg) scale(1);-o-transform:rotate(90deg) scale(1)}material-checkbox .checkbox{border-color:#777}material-checkbox .checkbox.checked{background-color:#777}pagination material-button{padding:.2em .75em}pagination material-button .content{display:flex;align-content:center;line-height:1.9em}pagination material-button.current{border:1px solid rgba(0,0,0,.12)}pagination material-button.current.space-left{margin-left:85px}pagination material-button.current.space-right{margin-right:85px}pagination material-button .content i.material-icons{color:#000} \ No newline at end of file diff --git a/package.json b/package.json index 0fba89e..50d8510 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "docker-registry-ui", - "version": "1.5.0", + "version": "1.5.1", "scripts": { "build": "./node_modules/gulp/bin/gulp.js build", "build:electron": "npm run build && cd examples/electron && npm install && npm run dist"