@dbp-topics/sublibrary
Version:
[GitLab Repository](https://github.com/digital-blueprint/sublibrary-app) | [npmjs package](https://www.npmjs.com/package/@dbp-topics/sublibrary) | [Unpkg CDN](https://unpkg.com/browse/@dbp-topics/sublibrary/) | [Sublibrary Bundle](https://gitlab.tugraz.at
261 lines (229 loc) • 8.83 kB
JavaScript
import {createInstance} from './i18n.js';
import {numberFormat} from '@dbp-toolkit/common/i18next.js';
import {css, html} from 'lit';
import {ScopedElementsMixin} from '@open-wc/scoped-elements';
import {LibraryElement} from './library-element.js';
import * as commonUtils from '@dbp-toolkit/common/utils';
import * as commonStyles from '@dbp-toolkit/common/styles';
import {MiniSpinner} from '@dbp-toolkit/common';
import {classMap} from 'lit/directives/class-map.js';
import {LibrarySelect} from './library-select.js';
const pageStatus = {
none: 0,
loading: 1,
showBudget: 2,
noBudget: 3,
};
class LibraryBudget extends ScopedElementsMixin(LibraryElement) {
constructor() {
super();
this.auth = {};
this._i18n = createInstance();
this.lang = this._i18n.language;
this.entryPointUrl = '';
this.monetaryAmounts = [];
this.sublibraryIri = '';
this.abortController = null;
this.pageStatus = pageStatus.none;
let now = new Date();
now.setDate(now.getDate() - 1);
this.analyticsUpdateDate = now.toLocaleDateString(this.lang);
}
static get scopedElements() {
return {
'dbp-library-select': LibrarySelect,
'dbp-mini-spinner': MiniSpinner,
};
}
/**
* See: https://lit-element.polymer-project.org/guide/properties#conversion-type
*/
static get properties() {
return {
...super.properties,
lang: {type: String},
entryPointUrl: {type: String, attribute: 'entry-point-url'},
sublibraryIri: {type: String, attribute: 'sublibrary-iri', reflect: true},
analyticsUpdateDate: {type: Object, attribute: false},
monetaryAmounts: {type: Array, attribute: false},
pageStatus: {type: Boolean, attribute: false},
auth: {type: Object},
};
}
loginCallback() {
super.loginCallback();
this.loadBudget();
}
connectedCallback() {
super.connectedCallback();
this.updateComplete.then(() => {
this.loadBudget();
});
}
update(changedProperties) {
changedProperties.forEach((oldValue, propName) => {
if (propName === 'lang') {
this._i18n.changeLanguage(this.lang);
} else if (propName === 'sublibraryIri') {
this.loadBudget();
}
});
super.update(changedProperties);
}
disconnectedCallback() {
if (this.abortController !== null) {
this.abortController.abort();
}
super.disconnectedCallback();
}
loadBudget() {
if (!this.isLoggedIn() || this.sublibraryIri === '') {
return;
}
const that = this;
this.pageStatus = pageStatus.loading;
const parts = this.sublibraryIri.split('/');
const sublibraryIdentifier = parts[parts.length - 1];
const apiUrl =
this.entryPointUrl +
'/sublibrary/budget-monetary-amounts?sublibrary=' +
sublibraryIdentifier;
// abort previous list fetch if it is still running
if (this.abortController !== null) {
this.abortController.abort();
}
this.abortController = new AbortController();
const signal = this.abortController.signal;
console.assert(this.auth.token);
fetch(apiUrl, {
headers: {
'Content-Type': 'application/ld+json',
Authorization: 'Bearer ' + this.auth.token,
},
signal: signal,
})
.then((result) => {
if (!result.ok) throw result;
if (result.headers.has('x-analytics-update-date')) {
const date = new Date(result.headers.get('x-analytics-update-date'));
this.analyticsUpdateDate =
date.toLocaleDateString(this.lang) +
' ' +
date.toLocaleTimeString(this.lang);
}
return result.json();
})
.then((result) => {
let monetaryAmounts = {};
result['hydra:member'].forEach((monetaryAmount) => {
monetaryAmounts[monetaryAmount.name] = monetaryAmount;
});
that.monetaryAmounts = monetaryAmounts;
that.pageStatus = pageStatus.showBudget;
})
.catch((error) => {
if (error.status === 404) {
that.pageStatus = pageStatus.noBudget;
} else {
that.pageStatus = pageStatus.none;
that.handleFetchError(error, that._i18n.t('budget.load-error'));
}
});
}
onLanguageChanged(e) {
this.lang = e.detail.lang;
}
static get styles() {
// language=css
return css`
${commonStyles.getThemeCSS()}
${commonStyles.getGeneralCSS()}
${commonStyles.getNotificationCSS()}
table th {
padding: 8px;
}
`;
}
onSublibraryChanged(e) {
this.sublibraryIri = e.detail.value;
}
getMonetaryAmountRow(name) {
const i18n = this._i18n;
// For i18next scanner
i18n.t('budget.taa');
i18n.t('budget.taa-tcb');
i18n.t('budget.tcb');
i18n.t('budget.tcb-tab');
i18n.t('budget.tab');
return this.monetaryAmounts[name]
? html`
<tr>
<th>${i18n.t('budget.' + name)}</th>
<td>
${numberFormat(i18n, this.monetaryAmounts[name].value, {
style: 'currency',
currency: this.monetaryAmounts[name].currency,
})}
</td>
</tr>
`
: ``;
}
render() {
const i18n = this._i18n;
return html`
<div
class="${classMap({
hidden: !this.isLoggedIn() || !this.hasLibraryPermissions() || this.isLoading(),
})}">
<div class="field">
${i18n.t('order-list.current-state')}: ${this.analyticsUpdateDate}
</div>
<div class="field">
<label class="label">${i18n.t('organization-select.label')}</label>
<div class="control">
<dbp-library-select
subscribe="lang:lang,entry-point-url:entry-point-url,auth:auth"
value="${this.sublibraryIri}"
@change="${this.onSublibraryChanged}"></dbp-library-select>
</div>
</div>
<dbp-mini-spinner
class="${classMap({hidden: this.pageStatus !== pageStatus.loading})}"
text="${i18n.t('budget.mini-spinner-text')}"
style="font-size: 2em;"></dbp-mini-spinner>
<div class="field ${classMap({hidden: this.pageStatus !== pageStatus.showBudget})}">
<label class="label">${i18n.t('budget.budget-key-values')}</label>
<div class="control">
<table>
${this.getMonetaryAmountRow('taa')}
${this.getMonetaryAmountRow('taa-tcb')}
${this.getMonetaryAmountRow('tcb')}
${this.getMonetaryAmountRow('tcb-tab')}
${this.getMonetaryAmountRow('tab')}
</table>
</div>
</div>
<div class="field ${classMap({hidden: this.pageStatus !== pageStatus.noBudget})}">
${i18n.t('budget.no-budget')}
</div>
</div>
<div
class="notification is-warning ${classMap({
hidden: this.isLoggedIn() || this.isLoading(),
})}">
${i18n.t('error-login-message')}
</div>
<div
class="notification is-danger ${classMap({
hidden: this.hasLibraryPermissions() || !this.isLoggedIn() || this.isLoading(),
})}">
${i18n.t('error-permission-message')}
</div>
<div class="${classMap({hidden: !this.isLoading()})}">
<dbp-mini-spinner></dbp-mini-spinner>
</div>
`;
}
}
commonUtils.defineCustomElement('dbp-sublibrary-budget', LibraryBudget);