ClementRomac's picture
ClementRomac HF staff
Added interactive demo with some policies
09a6f7f
raw
history blame
No virus
6.98 kB
import Component from '../lib/component.js';
import store from '../store/index.js';
/**
* @classdesc UI component for the sets of environments.
*/
export default class EnvsSet extends Component{
/**
* @constructor
*/
constructor() {
super({
store,
element: document.querySelector('#getting-started-tab'),
eventName: 'envsSetChange'
});
}
/**
* Renders the sets of environments and adds event listeners to the different elements.
*/
render(){
let dict = window.lang_dict[store.state.language]['envsSets'];
this.element.querySelector('#baseSetText').innerHTML = dict['baseSetText'];
this.element.querySelector('#customSetText').innerHTML = dict['customSetText'];
/* Base envs set */
let baseEnvs = this.element.querySelector('#baseEnvsSet');
baseEnvs.innerHTML = store.state.envsSets.baseEnvsSet.map(e => {
// Creates a card for each environment in the base set
return `<div class="col" name="env-set-item">
<div class="card bg-light h-100 btn p-0" name="env-card">
<!-- Thumbnail of the environment -->
<img name="env_thumbnail" class="card-image-top" src=${e.image} alt=${e.description.name}>
<!-- Name and description of the environment -->
<div class="card-body">
<h1 class="card-title"><strong>${e.description[store.state.language]['name']}</strong></h1>
<p class="card-text">${e.description[store.state.language]['text']}</p>
</div>
</div>
</div>`
}).join('');
/* Custom envs set */
let customEnvs = this.element.querySelector('#customEnvsSet');
// Creates a special card for uploading files
let uploadCard = `<div class="col mb-3">
<div class="card h-100">
<div class="card-body">
<h1 class="card-title"><strong>${dict['uploadCard']['title']}</strong></h1>
<p class="card-text">${dict['uploadCard']['text']}</p>
<div class="input-group my-3">
<input id="uploadEnvFile" type="file" class="custom-file-input" accept=".json">
</div>
</div>
<div class="card-footer">
<button id="uploadEnvBtn" class="btn btn-warning w-100" type="button"
data-bs-toggle="tooltip" title="${dict['uploadCard']['uploadBtnTooltip']}">
<i class="fas fa-upload"></i>
</button>
</div>
</div>
</div>`;
let envCards = store.state.envsSets.customEnvsSet.map((e, index) => {
// Creates a card for each environment in the custom set
return `<div class="col mb-3" name="env-set-item">
<div class="card bg-light h-100 btn p-0" name="env-card">
<!-- Thumbnail of the environment -->
<img name="env_thumbnail" class="card-image-top" src=${e.image} alt=${e.description.name}>
<!-- Name and description of the environment -->
<div class="card-body">
<h1 class="card-title"><strong>${e.description.name}</strong></h1>
<p class="card-text">${e.description.text}</p>
</div>
<!-- Download and delete buttons in the footer -->
<div class="card-footer justify-content-between">
<button name="downloadEnvBtn" class="btn btn-primary mx-1" type="button" data-bs-toggle="tooltip" title="${dict['downloadBtnTooltip']}">
<i class="fas fa-download"></i></button>
<button name="deleteEnvBtn" class="btn btn-danger mx-1" type="button" data-bs-toggle="tooltip" title="${dict['deleteBtnTooltip']}">
<i class="fa fa-trash"></i></button>
</div>
</div>
</div>`
}).join('');
customEnvs.innerHTML = [uploadCard, envCards].join('');
/* EVENT LISTENERS */
// Loads a base environment
baseEnvs.querySelectorAll('div[name="env-card"]').forEach((span, index) => {
span.addEventListener('click', () => {
store.dispatch('loadEnv', store.state.envsSets.baseEnvsSet[index]);
})
});
// Loads a custom environment
customEnvs.querySelectorAll('div[name="env-card"]').forEach((span, index) => {
span.addEventListener('click', () => {
store.dispatch('loadEnv', store.state.envsSets.customEnvsSet[index]);
})
});
// Parses the uploaded file and adds the corresponding environment to the custom set
customEnvs.querySelector('#uploadEnvBtn').addEventListener('click', () => {
let reader = new FileReader();
reader.addEventListener('load', () => {
let env = JSON.parse(reader.result);
store.dispatch('addEnv',{set: 'custom', env: env});
});
let file = customEnvs.querySelector('#uploadEnvFile').files[0];
if(file != null){
reader.readAsText(file);
}
});
// Downloads a custom environment
customEnvs.querySelectorAll('button[name="downloadEnvBtn"]').forEach((span, index) => {
span.addEventListener('click', () => {
downloadObjectAsJson(store.state.envsSets.customEnvsSet[index], store.state.envsSets.customEnvsSet[index].description.name.split(' ').join('_'));
})
});
// Deletes a custom environment
customEnvs.querySelectorAll('button[name="deleteEnvBtn"]').forEach((span, index) => {
span.addEventListener('click', () => {
store.dispatch('deleteEnv', index);
})
});
/* Initializes tooltips */
this.element.querySelectorAll('[data-bs-toggle="tooltip"]').forEach((el, index) => {
return new bootstrap.Tooltip(el, {
trigger: 'hover'
});
});
}
};