<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ZingGrid Demo</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<script nonce="undefined" src="https://cdn.zinggrid.com/zinggrid.min.js"></script>
<style>
:root {
/* Define custom colors for build status */
--build-success: #00c853;
--build-failed: #d50000;
--build: pending: #ffab00;
--zg-caption-background: #3f51b5;
--zg-caption-color: #fff;
/* Modify ZG Display */
--zing-grid-background: #fff;
}
/* ZingGrid Overrides
---------------------------------- */
/* Hide grid's body 'header' cells */
zg-head {
display: none;
}
/* Turn off native row highlighting */
zg-row:hover {
background: inherit;
}
/* Remove native cell padding - we add our own to the custom row */
zg-cell {
padding: 0;
}
/* Allow full-width custom rows */
[data-field-index] {
width: 100%;
}
/* Custom Row Styling
---------------------------------- */
.row-wrapper {
padding: 1rem;
}
.row-container {
background: #fff;
border-radius: .5rem;
cursor: pointer;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
margin-bottom: .25rem;
overflow: hidden;
padding: 1rem;
}
.row-container:hover {
box-shadow: 6px 6px 31px -1px rgba(156, 156, 156, 0.82);
}
/* First Cell */
.row-container .first-cell {
display: flex;
flex-wrap: wrap;
flex-grow: 1;
justify-content: space-between;
align-items: center;
}
/* First Cell Child Elements */
.flex-center {
display: flex;
align-items: center;
}
/* Add padding for mobile view */
zing-grid[viewport="mobile"] .flex-center {
margin: 1.0rem;
}
/* On all views EXCEPT zing-grid mobile view */
zing-grid:not([viewport="mobile"]) .user-contents {
min-width: 300px;
}
/* User Contents Cell */
.user-contents span {
margin-right: 1.5rem;
}
.user-contents img {
height: 25px;
}
/* Font Awesome icon styling */
.build-status {
display: flex;
flex-direction: row;
align-items: center;
}
.build-status::before {
font-family: FontAwesome;
font-size: 3rem;
margin-right: 1rem;
}
/* Content defined by Font-Awesome unicode characters */
.build-success::before {
content: '\f164';
color: var(--build-success, green);
}
.build-failed::before {
content: '\f165';
color: var(--build-failed, red);
}
.build-pending::before {
content: '\f017';
color: var(--build-pending, orange);
}
zing-grid[loading] {
height: 961px;
}
</style>
</head>
<body>
<zing-grid layout="row" layout-controls="disabled" vieport-stop caption="Current Pipelines">
<zg-data data='[
{
"status": "success",
"branch": "dev",
"username": "chocolateRainGuy",
"commitId": "1582393",
"runTime": "4:52",
"avatar": "https://storage.googleapis.com/zg-demos.appspot.com/default_avatar.png"
},
{
"status": "failed",
"branch": "master",
"username": "jennaMarbles",
"commitId": "32532315",
"runTime": "0:52",
"avatar": "https://storage.googleapis.com/zg-demos.appspot.com/default_avatar.png"
},
{
"status": "success",
"branch": "master",
"username": "starWarsKid",
"commitId": "cd34123as",
"runTime": "4:52",
"avatar": "https://storage.googleapis.com/zg-demos.appspot.com/default_avatar.png"
},
{
"status": "pending",
"branch": "ci-integration",
"username": "dramticLookGopher",
"commitId": "aaf1234s",
"runTime": "1:23",
"avatar": "https://storage.googleapis.com/zg-demos.appspot.com/default_avatar.png"
},
{
"status": "failed",
"branch": "dev-unit-tests",
"username": "leeroyJenkins",
"commitId": "2345623",
"runTime": "0:09",
"avatar": "https://storage.googleapis.com/zg-demos.appspot.com/default_avatar.png"
},
{
"status": "success",
"branch": "master",
"username": "britneySpears",
"commitId": "cd34123as",
"runTime": "4:52",
"avatar": "https://storage.googleapis.com/zg-demos.appspot.com/default_avatar.png"
},
{
"status": "failed",
"branch": "master",
"username": "numaNumaGuy",
"commitId": "62562345",
"runTime": "0:52",
"avatar": "https://storage.googleapis.com/zg-demos.appspot.com/default_avatar.png"
}
]'></zg-data>
<zg-colgroup>
<zg-column index=" " renderer="addChangeEvent">
<!-- Template tag is preferred so that the content is never rendered -->
<template>
<div class="row-wrapper">
<div class="row-container">
<!-- First Cell -->
<div class="first-cell">
<div class="flex-center">
<!-- Dynamically inject class with templating -->
<div class="build-status build-[[record.status]]"></div>
<span>[[record.branch]]/[[record.commitId]]</span>
</div>
<div class="user-contents flex-center">
<span><img src="[[record.avatar]]" alt="N/A"></span>
<span>[[record.username]]</span>
<span>[[record.runTime]]</span>
</div>
</div>
<!-- Select Dropdown Cell -->
<div class="flex-center">
<select>
<option disabled selected>Please Select One</option>
<option value="1">Restart Build</option>
<option value="2">Reset Cache</option>
</select>
</div>
</div>
</div>
</template>
</zg-column>
</zg-colgroup>
</zing-grid>
<script>
ZingGrid.setLicense(['26ccbfec16b8be9ee98c7d57bee6e498']);
/**
* @description This custom render function should return NOTHING. If you
* return content here it will override your slotted contents.
* NOTE: renderer NOT REQUIRED for slotted content.
*/
function addChangeEvent(customIndex, cellRef, $cell) {
// $cell.record gives us us direct information related to this row
const record = $cell.record;
// $cell.dom() gives us direct access to zg-cell DOM contents
const selectRef = cellRef.querySelector('select');
selectRef.addEventListener('change', e => {
const changeValue = e.target.value;
if (changeValue == 1) alert(`Restarting pipeline on branch: ${record.branch}-${record.commitId}`);
else alert('Resetting cache');
});
}
// Init
// ----------------------------------
/* Get the ZG instance */
const zgRef = document.querySelector('zing-grid')
// Add click event listener, so you can drill into another page on row click
zgRef.addEventListener('row:click', e => {
console.log('row clicked', e.detail);
});
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ZingGrid Demo</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<script src="https://cdn.zinggrid.com/zinggrid.min.js"></script>
</head>
<body>
<zing-grid layout="row" layout-controls="disabled" vieport-stop caption="Current Pipelines">
<zg-data data='[
{
"status": "success",
"branch": "dev",
"username": "chocolateRainGuy",
"commitId": "1582393",
"runTime": "4:52",
"avatar": "https://storage.googleapis.com/zg-demos.appspot.com/default_avatar.png"
},
{
"status": "failed",
"branch": "master",
"username": "jennaMarbles",
"commitId": "32532315",
"runTime": "0:52",
"avatar": "https://storage.googleapis.com/zg-demos.appspot.com/default_avatar.png"
},
{
"status": "success",
"branch": "master",
"username": "starWarsKid",
"commitId": "cd34123as",
"runTime": "4:52",
"avatar": "https://storage.googleapis.com/zg-demos.appspot.com/default_avatar.png"
},
{
"status": "pending",
"branch": "ci-integration",
"username": "dramticLookGopher",
"commitId": "aaf1234s",
"runTime": "1:23",
"avatar": "https://storage.googleapis.com/zg-demos.appspot.com/default_avatar.png"
},
{
"status": "failed",
"branch": "dev-unit-tests",
"username": "leeroyJenkins",
"commitId": "2345623",
"runTime": "0:09",
"avatar": "https://storage.googleapis.com/zg-demos.appspot.com/default_avatar.png"
},
{
"status": "success",
"branch": "master",
"username": "britneySpears",
"commitId": "cd34123as",
"runTime": "4:52",
"avatar": "https://storage.googleapis.com/zg-demos.appspot.com/default_avatar.png"
},
{
"status": "failed",
"branch": "master",
"username": "numaNumaGuy",
"commitId": "62562345",
"runTime": "0:52",
"avatar": "https://storage.googleapis.com/zg-demos.appspot.com/default_avatar.png"
}
]'></zg-data>
<zg-colgroup>
<zg-column index=" " renderer="addChangeEvent">
<!-- Template tag is preferred so that the content is never rendered -->
<template>
<div class="row-wrapper">
<div class="row-container">
<!-- First Cell -->
<div class="first-cell">
<div class="flex-center">
<!-- Dynamically inject class with templating -->
<div class="build-status build-[[record.status]]"></div>
<span>[[record.branch]]/[[record.commitId]]</span>
</div>
<div class="user-contents flex-center">
<span><img src="[[record.avatar]]" alt="N/A"></span>
<span>[[record.username]]</span>
<span>[[record.runTime]]</span>
</div>
</div>
<!-- Select Dropdown Cell -->
<div class="flex-center">
<select>
<option disabled selected>Please Select One</option>
<option value="1">Restart Build</option>
<option value="2">Reset Cache</option>
</select>
</div>
</div>
</div>
</template>
</zg-column>
</zg-colgroup>
</zing-grid>
</body>
</html>
:root {
/* Define custom colors for build status */
--build-success: #00c853;
--build-failed: #d50000;
--build: pending: #ffab00;
--zg-caption-background: #3f51b5;
--zg-caption-color: #fff;
/* Modify ZG Display */
--zing-grid-background: #fff;
}
/* ZingGrid Overrides
---------------------------------- */
/* Hide grid's body 'header' cells */
zg-head {
display: none;
}
/* Turn off native row highlighting */
zg-row:hover {
background: inherit;
}
/* Remove native cell padding - we add our own to the custom row */
zg-cell {
padding: 0;
}
/* Allow full-width custom rows */
[data-field-index] {
width: 100%;
}
/* Custom Row Styling
---------------------------------- */
.row-wrapper {
padding: 1rem;
}
.row-container {
background: #fff;
border-radius: .5rem;
cursor: pointer;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
margin-bottom: .25rem;
overflow: hidden;
padding: 1rem;
}
.row-container:hover {
box-shadow: 6px 6px 31px -1px rgba(156, 156, 156, 0.82);
}
/* First Cell */
.row-container .first-cell {
display: flex;
flex-wrap: wrap;
flex-grow: 1;
justify-content: space-between;
align-items: center;
}
/* First Cell Child Elements */
.flex-center {
display: flex;
align-items: center;
}
/* Add padding for mobile view */
zing-grid[viewport="mobile"] .flex-center {
margin: 1.0rem;
}
/* On all views EXCEPT zing-grid mobile view */
zing-grid:not([viewport="mobile"]) .user-contents {
min-width: 300px;
}
/* User Contents Cell */
.user-contents span {
margin-right: 1.5rem;
}
.user-contents img {
height: 25px;
}
/* Font Awesome icon styling */
.build-status {
display: flex;
flex-direction: row;
align-items: center;
}
.build-status::before {
font-family: FontAwesome;
font-size: 3rem;
margin-right: 1rem;
}
/* Content defined by Font-Awesome unicode characters */
.build-success::before {
content: '\f164';
color: var(--build-success, green);
}
.build-failed::before {
content: '\f165';
color: var(--build-failed, red);
}
.build-pending::before {
content: '\f017';
color: var(--build-pending, orange);
}
/**
* @description This custom render function should return NOTHING. If you
* return content here it will override your slotted contents.
* NOTE: renderer NOT REQUIRED for slotted content.
*/
function addChangeEvent(customIndex, cellRef, $cell) {
// $cell.record gives us us direct information related to this row
const record = $cell.record;
// $cell.dom() gives us direct access to zg-cell DOM contents
const selectRef = cellRef.querySelector('select');
selectRef.addEventListener('change', e => {
const changeValue = e.target.value;
if (changeValue == 1) alert(`Restarting pipeline on branch: ${record.branch}-${record.commitId}`);
else alert('Resetting cache');
});
}
// Init
// ----------------------------------
/* Get the ZG instance */
const zgRef = document.querySelector('zing-grid')
// Add click event listener, so you can drill into another page on row click
zgRef.addEventListener('row:click', e => {
console.log('row clicked', e.detail);
});