@prokomssp/edoc-viewer v10.204.0
viewer.js
Pakken inneholder koden for vise skjema.
Installasjon
Legg inn viewer.min.js nederst på HTML siden før body slutt tag.
<body>
...
<script src="viewer.min.js"></script>
</body>Dersom du ønsker å benytte samme stilsett som på skjema.no, kan du legge inn styles.css i head taggen.
<head>
...
<link rel='stylesheet' href='styles.css' type='text/css' />
</head>Opprett et tomt element der skjemaet skal rendres. Du bestemmer elementets id og oppgir denne i kall til viewer.init() (beskrevet nedenfor).
<body>
<div id="skjema"></div>
</body>For å vise skjema, kalles .init() og deretter .form(). Koden nedenfor viser strukturen for oppsett av viewer.js for visning av et skjema.
document.addEventListener("DOMContentLoaded", function(){
viewer
.init({
apiUrl: "<api url>",
customerId: "<customer id>",
})
.form({
divId: "<id til div der skjema skal rendres>",
formId: "<id til skjema som skal vises>"
});
});API
init()
.init() initialiserer viewer.js og må være det første kallet til viewer.js.
viewer.init({...})init object:
viewer.init({
apiUrl : "<api url>",
customerId: "<customer id>",
hide : {
title: true,
buttons: true,
}
})| Egenskap | Eksempel | Obligatorisk | Beskrivelse |
|---|---|---|---|
| apiUrl | https://api.skjema.no | Ja | Url til API-et |
| customerId | 9998 | Ja | Kunde-id |
| hide.title | true | Nei | Oppgi true dersom det er ønskelig å skjule tittel |
| hide.buttons | true | Nei | Oppgi true dersom det er ønskelig å skjule knappene for "avbryt", "lagre" og til "kontroll" |
form()
.form() forteller viewer.js hvilket skjema som skal vises. .init() må kalles før .form().
viewer
.init({...})
.form({...})form object:
viewer
.init({...})
.form({
divId: "<id til div>",
formId: "<id til skjema som skal vises eller function() som returnerer denne>",
refId: "<id til mellomlagret utkast som skal vises eller function() som returnerer denne>",
previewId: "<id til forhåndsvisning eller function() som returnerer denne>",
onAborting: function(proceed) {},
onAborted: function() {},
onSaving: function(proceed) {},
onSaved: function() {},
onSubmitted: function() {}
});divId er obligatorisk og må oppgis.
Angi skjema
viewer.js trenger én av følgende for å vise et skjema: formId, refId eller previewId.
formIdbenyttes når et nytt, tomt skjema skal vises. For å se hvilkeformId-er som er tilgjengelig, kan du gjøre et kall tilviewer.getForms()(beskrevet nedenfor).refIdbenyttes når et mellomlagret utkast skal gjenopptas. For å se hvilkerefId-er som er tilgjengelig, kan du gjøre et kall tilviewer.getCases()(beskrevet nedenfor).previewIdvil bli sendt med når edoc-designer åpner URL for forhåndsvisning av skjema.
Det er vanlig at formId, refId eller previewId sendes med som querystring-parametre til HTML-siden. viewer.js har en utility-metode for uthenting av parameter fra querystring: viewer.util.getQuery(paramName). Eksempelet nedenfor henter parametre med navn "formId", "refId" og "previewId" fra querystring. Dersom parameteren ikke finnes, returnerer funksjonen null.
viewer
.init({...})
.form({
...
formId: function() {
return viewer.util.getQuery("formId");
},
refId: function() {
return viewer.util.getQuery("refId");
},
previewId: function() {
return viewer.util.getQuery("previewId");
}
});Verdien for formId, refId eller previewId kan alternativt "hardkodes" slik:
viewer
.init({...})
.form({
...
formId: "701660",
});Merk at viewer.js vil hive en exception dersom mer enn én av formId, refId eller previewId er satt.
Event-handling
Når et skjema er startet, kan utfyller avbryte, lagre eller sende inn skjemaet. viewer.js tilbyr event-handlere som gjør det mulig å hooke seg på disse hendelsene.
Koden nedenfor viser et eksempel på hvordan disse event-handlerne kan implementeres.
viewer
.init({...})
.form({
...
onAborting: function(proceed) {
proceed();
},
onAborted: function() {
window.location = "index.html";
},
onSaved: function(saveInfo) {
if(saveInfo.isAuthenticated) {
window.location = "cases.html";
} else {
window.location = "saveReceipt.html?refId=" + saveInfo.externalRefId;
}
},
onSubmitted: function(receipt) {
window.location = "submitReceipt.html?refId=" + receipt.refId;
}
});onAborting
onAborting blir kalt når utfyller trykker avbryt og før selve avbrytelsen blir utført. Det er valgfritt å registrere en eventhandler til dette eventet. Du kan bruke eventet til å vise en "vil du virkelig avbryte"-dialog. Dersom utfyller bekrefter avbryting, kaller du proceed() eller proceed(true). Dersom utfyller ikke ønsker å avbryte, kaller du proceed(false).
Eksempelet nedenfor tar utgangspunkt i at du har laget en funksjon showAbortDialog() som viser et bekreftelses-vindu. Avhengig av om utfyller klikker ja eller nei, kalles proceed() med true eller false.
viewer
.init({...})
.form({
...
onAborting: function(proceed) {
showAbortConfirmationDialog() //må implementeres av deg
.on("click", "#yes",
function() {
proceed(true);
})
.on("click", "#no",
function() {
proceed(false);
});
},
});onAborted
onAborted blir kalt etter at avbrytelsen er fullført. Her har du eksempelvis mulighet for å laste en ny URL i nettleseren.
viewer
.init({...})
.form({
...
onAborted: function() {
window.location = "index.html";
},
});onSaved
onSaved blir kalt etter at en mellomlagrring er fullført. Her har du eksempelvis mulighet for å laste en ny URL i nettleseren.
viewer
.init({...})
.form({
...
onSaved: function() {
window.location = "cases.html";
}
});onSubmitted
onSubmitted blir kalt etter at en innsending er fullført. Her har du eksempelvis mulighet for å laste en ny URL i nettleseren. Funksjonen får et receipt-objekt. Dette objektet inneholder referanse id for innsendingen i receipt.refId. Dette kan du eksempelvis bruke for å laste en side som viser info om innsendelsen. Se avsnittet for getCaseInfo() nedenfor.
Eksempelet nedenfor laster en ny side med referanse id i querystring.
viewer
.init({...})
.form({
...
onSubmitted: function(receipt) {
window.location = "submitReceipt.html?refId=" + receipt.refId;
}
});getCaseInfo() - uthenting av info for kvittering
Etter innsending av skjema er det vanlig å vise en side som viser skjemaets navn, tidspunkt for innsendelse og referanse id. Denne informasjonen hentes via kall til viewer.getCaseInfo(refId). refId får du fra onSubmitted()-eventet når skjemaet sendes inn.
Eksempelet nedenfor viser hvordan referanse id, skjemaets navn og tidspunkt for innsendelse hentes.
<script>
document.addEventListener("DOMContentLoaded", () => {
const refId = viewer.util.getQuery("refId");
viewer
.init(...)
.getCaseInfo(refId)
.then(info => {
document.getElementById("receipt").innerHTML =
`
refId: ${info.refId} <br/>
name: ${info.name} <br/>
updatedOn: ${info.updatedOn} <br/>
`;
}).catch((error) => {
console.log(error);
});
});
</script>
<div id="receipt"></div>session()
viewer.js benytter HTML 5 sessionStorage for lagring av skjemadata under utfylling. .session() gjør det mulig å fortelle viewer.js etter hvor lang inaktivitet disse skal fjernes fra sessionStorage. .init() må kalles før .session().
viewer
.init({...})
.session({...})session object:
Eksempelet nedenfor setter opp 20 minutter som inaktiv periode, med varsling 5 minutter før disse 20 minuttene nåes. onIdleTimeoutWarning() blir da kalt et gitt antall minutter før sesjonen utgår. Eventet gjør det mulig å vise en dialog der bruker kan forlenge eller avslutte sesjonen sin. Kall extendSession() dersom sesjonen skal forlenges, eller endSession() dersom sesjonen skal avsluttes. Det er valgfritt å registrere en handler på onIdleTimeoutWarning. Dersom 20 minutter med inaktivitet passerer, eller utfyller i onIdleTimeoutWarning velger å avslutte sesjonen, blir onIdleTimeout kalt.
viewer
.init({...})
.session({
idleTimeoutMinutes: 20,
warningTimeoutMinutes: 5,
onIdleTimeoutWarning: function(extendSession, endSession, sessionOptions) {
showTimeoutWarning(sessionOptions.warningTimeoutMinutes) //må implementeres av deg
.on("click", "#yes", function () {
extendSession();
})
.on("click", "#no", function () {
endSession();
});
},
onIdleTimeout: function() {
document.location = "idleTimeout.html";
}
})sessionOptions.warningTimeoutMinutes viser hvor mange minutter det er igjen til sesjonen avsluttes på det tidspunktet da funksjonen ble kalt. Dersom du skal lage en nedtellingsfunksjon, kan du ta utgangspunkt i denne verdien.
| Egenskap | Eksempel | Obligatorisk | Beskrivelse |
|---|---|---|---|
| idleTimeoutMinutes | 60 | Nei, default er 20 | Antall minutter med inaktivitet før skjemadata fjernes. |
| warningTimeoutMinutes | 5 | Nei | Utfyller blir gitt en advarsel om at sesjonen vil tømmes dette antall minutter i forveien. |
Brukerhåndtering
Dersom utfyller ikke er pålogget, men gjør en handling i viewer.js som krever pålogging, vil edoc-api sende brukeren til en identity-provider for pålogging. Handlinger i viewer.js som krever pålogging er mellomlagring av utkast og gjenopptaking av utkast, samt oppstart av skjema der det er satt krav til sikkerhetsnivå.
Eksempelet nedenfor viser hvordan du kan få tak i informasjon om bruker som blir logget på av viewer.js:
viewer
.init({...})
.session({
...
onAuthenticated: (getUser) => {
getUser() //if you need to get the user's id, invoke getUser.
.then((user) => {
alert(`You are logged in as ${user.id}!`); //do something with user.id
});
}
})Dersom du eksplisitt ønsker å logge en bruker inn via edoc-api, kan du kalle viewer.logIn(). Du vil motta eventet som vist ovenfor etter at pålogging er fullført.
viewer.logIn();For å logge bruker ut fra edoc-api, kaller du viewer.logOut().
viewer.logOut()
.then(() => {
alert("Your session has ended.");
window.location = "index.html";
});getForms()
viewer.getForms() returnerer tilgjengelige skjema for kunden. Eksempelet nedenfor viser hvordan skjema kan hentes og listes ut på en HTML-side.
<!DOCTYPE html>
<html>
<body>
<script>
document.addEventListener("DOMContentLoaded", () => {
setLoaderVisibility(true);
viewer
.init(...)
.getForms()
.then(forms => {
const createFormLink = (form) => {
var fragment = document.createDocumentFragment();
const formLink = document.createElement("a");
formLink.setAttribute("href", `form.html?formId=${form.formId}`);
formLink.text = `${form.name}`;
fragment.appendChild(formLink);
const br = document.createElement("br");
fragment.appendChild(br);
return fragment;
}
const formsElement = document.getElementById("forms");
if(forms) {
forms.forEach(function(form) {
formsElement.appendChild(createFormLink(form));
});
} else {
formsElement.appendChild(document.createTextNode("No forms"));
}
});
});
</script>
<div id="forms"></div>
<script src="viewer.min.js"></script>
</body>
</html>getCases() og deleteCase()
viewer.getCases() returnerer mellomlagrede utkast for en utfyller. Eksempelet nedenfor viser hvordan utkast kan hentes og listes ut på en HTML-side. Eksempelet viser også hvordan utkastene kan slettes via viewer.deleteCase().
<!DOCTYPE html>
<html>
<body>
<script>
document.addEventListener("DOMContentLoaded", () => {
viewer.init(...);
const renderCases = () =>
viewer.getCases().then(cases => {
document.getElementById("content").style.display = "block";
const createCaseLink = (c, isSaved) => {
var fragment = document.createElement("div");
fragment.setAttribute("id", c.refId);
const caseLink = document.createElement("a");
if(isSaved) {
caseLink.setAttribute("href", `form.html?refId=${c.refId}`);
}
caseLink.text = `${c.name}`;
fragment.appendChild(caseLink);
const deleteLink = document.createElement("a");
deleteLink.setAttribute("href", "#");
deleteLink.text = " delete";
deleteLink.onclick = function(event) {
viewer.deleteCase(c.refId)
.then(() => {
document.getElementById(c.refId).remove();
}).catch((error) => {
alert(JSON.stringify(error));
});
};
fragment.appendChild(deleteLink);
const br = document.createElement("br");
fragment.appendChild(br);
return fragment;
}
const savedCasesElement = document.getElementById("savedCases");
savedCasesElement.innerHTML = "";
if(cases.saved) {
cases.saved.forEach(function(c) {
savedCasesElement.appendChild(createCaseLink(c, true));
});
} else {
savedCasesElement.appendChild(document.createTextNode("No saved cases"));
}
const submittedCasesElement = document.getElementById("submittedCases");
submittedCasesElement.innerHTML = "";
if(cases.submitted) {
cases.submitted.forEach( (c) => {
submittedCasesElement.appendChild(createCaseLink(c, false));
});
} else {
submittedCasesElement.appendChild(document.createTextNode("No submitted cases"));
}
});
renderCases();
});
</script>
<div id="content">
<h2>Saved cases</h1>
<div id="savedCases"></div>
<h2>Submitted cases</h1>
<div id="submittedCases"></div>
</div>
<script src="viewer.min.js"></script>
</body>
</html>getPdf()
PDF for innsendte saker kan lastes ned via viewer.getPdf(refId). PDF-en genereres on the fly av edoc-api. Edoc-api sjekker at innlogget bruker har rettighet på saken det blir forsøkt lastet ned PDF for
Progresjonsvisning og feilhåndtering
Alle viewer metoder som gjør et kall til edoc-api returnerer et Promise-objekt. Fra det tidspunktet metoden blir kalt, og til operasjonen er fullført, kan det være lurt å vise en progresjons-indikator. Eksempelet nedenfor viser hvordan det kan gjøres.
<!DOCTYPE html>
<html>
<body>
<script>
function setLoaderVisibility (isVisible) {
const loader = document.getElementById("loader");
if(loader) {
loader.style.display = isVisible ? "block" : "none";
}
};
document.addEventListener("DOMContentLoaded", () => {
setLoaderVisibility(true);
viewer
.init(...)
.form(...)
.then(() => {
setLoaderVisibility(false);
}).catch((error) => {
alert(error);
}).finally(() => {
setLoaderVisibility(false);
});
});
</script>
<style>
.loader {
border: 16px solid #f3f3f3; /* Light grey */
border-top: 16px solid #3498db; /* Blue */
border-radius: 50%;
width: 120px;
height: 120px;
animation: spin 2s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
</style>
<div id="viewer"></div>
<div id="loader" class="loader"></div>
<script src="viewer.min.js"></script>
</body>
</html>Innhold
Viewer
- Babel Polyfill
- Handlebars
- jQuery
- jQuery UI
- DropZone
- i18next
- mathjs
- moment.js
- opn
- urijs
Styles
- Bootstrap 3.3.7
- Budicons
8 months ago
8 months ago
5 months ago
7 months ago
7 months ago
8 months ago
7 months ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago