<!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); });