nopaque/app/static/js/RessourceLists/RessourceList.js

134 lines
4.1 KiB
JavaScript
Raw Normal View History

class RessourceList {
/* A wrapper class for the list.js list.
* This class is not meant to be used directly, instead it should be used as
* a base class for concrete ressource list implementations.
*/
2022-09-02 11:07:30 +00:00
static autoInit() {
CorpusList.autoInit();
CorpusFileList.autoInit();
JobList.autoInit();
JobInputList.autoInit();
JobResultList.autoInit();
2022-12-19 11:46:18 +00:00
PublicUserList.autoInit();
SpaCyNLPPipelineModelList.autoInit();
2022-11-15 14:11:16 +00:00
TesseractOCRPipelineModelList.autoInit();
2022-09-02 11:07:30 +00:00
UserList.autoInit();
}
2022-12-21 13:34:53 +00:00
static options = {page: 5, pagination: {innerWindow: 2, outerWindow: 2}};
constructor(listElement, options = {}) {
if (!(listElement.hasAttribute('id'))) {
2022-09-02 11:07:30 +00:00
let i;
for (i = 0; true; i++) {
if (document.querySelector(`#ressource-list-${i}`)) {continue;}
listElement.id = `ressource-list-${i}`;
break;
}
}
options = {
2022-12-21 13:34:53 +00:00
...RessourceList.options,
...options
}
2022-12-12 14:37:33 +00:00
if ('ressourceMapper' in options && typeof options.ressourceMapper === 'function') {
this.ressourceMapper = options.ressourceMapper;
delete options.ressourceMapper;
}
2022-12-12 14:37:33 +00:00
if ('initialHtmlGenerator' in options && typeof options.initialHtmlGenerator === 'function') {
2022-09-02 11:07:30 +00:00
this.initialHtmlGenerator = options.initialHtmlGenerator;
listElement.innerHTML = this.initialHtmlGenerator(listElement.id);
delete options.initialHtmlGenerator;
}
if ('sortArgs' in options) {
this.sortArgs = options.sortArgs;
delete options.sortArgs;
}
this.listjs = new List(listElement, {...RessourceList.options, ...options});
this.listjs.list.innerHTML = `
2021-11-30 15:22:16 +00:00
<tr>
<td class="row" colspan="100%">
<div class="col s12">&nbsp;</div>
<div class="col s3 m2 xl1">
<div class="preloader-wrapper active">
<div class="spinner-layer spinner-green-only">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
</div>
</div>
<div class="col s9 m6 xl5">
<span class="card-title">Waiting for data...</span>
<p>This list is not initialized yet.</p>
</div>
</td>
</tr>
`.trim();
2021-12-08 14:36:10 +00:00
this.userId = this.listjs.listContainer.dataset.userId;
2022-09-02 11:07:30 +00:00
this.listjs.list.addEventListener('click', (event) => {this.onClick(event)});
this.isInitialized = false;
2021-11-30 15:22:16 +00:00
if (this.userId) {
2022-09-02 11:07:30 +00:00
app.subscribeUser(this.userId)
.then((response) => {
app.socket.on('PATCH', (patch) => {
if (this.isInitialized) {this.onPatch(patch);}
});
});
app.getUser(this.userId)
.then((user) => {
this.init(user);
this.isInitialized = true;
});
}
}
2021-11-30 15:22:16 +00:00
_init(ressources) {
this.listjs.clear();
this.add(Object.values(ressources));
2022-09-02 11:07:30 +00:00
this.listjs.list.insertAdjacentHTML(
'afterbegin',
`
<tr class="show-if-only-child">
<td colspan="100%">
<span class="card-title"><i class="left material-icons" style="font-size: inherit;">file_download</i>Nothing here...</span>
<p>No ressource available.</p>
</td>
</tr>
`.trim()
);
}
2021-11-30 15:22:16 +00:00
init(user) {throw 'Not implemented';}
2022-09-02 11:07:30 +00:00
onClick(event) {throw 'Not implemented';}
2021-11-30 15:22:16 +00:00
2022-09-02 11:07:30 +00:00
onPatch(patch) {throw 'Not implemented';}
add(ressources) {
let values = Array.isArray(ressources) ? ressources : [ressources];
if ('ressourceMapper' in this) {
2022-09-02 11:07:30 +00:00
values = values.map((value) => {return this.ressourceMapper(value);});
}
this.listjs.add(values, () => {
2022-09-02 11:07:30 +00:00
if ('sortArgs' in this) {
this.listjs.sort(...this.sortArgs);
}
});
}
remove(id) {
this.listjs.remove('id', id);
}
replace(id, valueName, newValue) {
2022-09-02 11:07:30 +00:00
this.listjs.get('id', id)[0].values({[valueName]: newValue});
}
}