style: 💄 Add eslint rules to api-skolplattformen and autofix

Add react-native-community eslint rules to project and run autofix on
all files.
This commit is contained in:
Andreas Eriksson 2022-04-24 20:26:16 +02:00
parent 0508329998
commit 20ee509c28
38 changed files with 1094 additions and 1038 deletions

View File

@ -1,5 +1,5 @@
{
"extends": ["plugin:@nrwl/nx/react", "../../.eslintrc.json"],
"extends": ["@react-native-community","plugin:@nrwl/nx/react", "../../.eslintrc.json"],
"ignorePatterns": ["!**/*", "public", ".cache", "node_modules"],
"overrides": [
{

View File

@ -1,6 +1,6 @@
import QueueFetcher from '../queue/queueFetcher'
let sut : QueueFetcher
let sut: QueueFetcher
beforeEach(() => {
jest.useFakeTimers('legacy')
sut = new QueueFetcher(async () => '')

View File

@ -112,7 +112,7 @@ describe('api', () => {
const personalNumber = 'my personal number'
try {
await api.login(personalNumber)
// eslint-disable-next-line @typescript-eslint/no-explicit-any
// eslint-disable-next-line @typescript-eslint/no-explicit-any
} catch (error: any) {
expect(error.message).toEqual(expect.stringContaining('Server Error'))
}

View File

@ -99,16 +99,17 @@ export class ApiSkolplattformen extends EventEmitter implements Api {
}
}
public async getSessionHeaders(url: string): Promise<{ [index: string]: string }> {
public async getSessionHeaders(
url: string
): Promise<{ [index: string]: string }> {
const init = this.getRequestInit()
const cookie = await this.cookieManager.getCookieString(url)
return {
...init.headers,
cookie,
...init.headers,
cookie,
}
}
public async getSession(
url: string,
options?: RequestInit
@ -157,7 +158,10 @@ export class ApiSkolplattformen extends EventEmitter implements Api {
status.on('OK', async () => {
await this.retrieveSessionCookie()
const [user, ] = await Promise.all([this.getUser(), this.retrieveXsrfToken()])
const [user] = await Promise.all([
this.getUser(),
this.retrieveXsrfToken(),
])
this.personalNumber = user.personalNumber
this.isLoggedIn = true
@ -171,14 +175,11 @@ export class ApiSkolplattformen extends EventEmitter implements Api {
}
public async loginFreja(): Promise<FrejaLoginStatusChecker> {
await this.clearSession()
const loginUrl = routes.frejaLogin
const loginResponse = await this.fetch('auth-ticket', loginUrl)
// if (!ticketResponse.ok) {
// throw new Error(
// `Server Error [${ticketResponse.status}] [${ticketResponse.statusText}] [${ticketUrl}]`
@ -190,15 +191,21 @@ export class ApiSkolplattformen extends EventEmitter implements Api {
console.log('getting freja login url: ' + cleanAppSwitchUrl)
const checkStatusSession = await this.getSession(loginUrl, {
const checkStatusSession = await this.getSession(loginUrl, {
redirect: 'manual',
})
const status = checkFrejaStatus(this.fetch, cleanAppSwitchUrl, checkStatusSession)
const status = checkFrejaStatus(
this.fetch,
cleanAppSwitchUrl,
checkStatusSession
)
status.on('APPROVED', async () => {
await this.retrieveFrejaSessionCookie()
const [user, ] = await Promise.all([this.getUser(), this.retrieveXsrfToken()])
const [user] = await Promise.all([
this.getUser(),
this.retrieveXsrfToken(),
])
this.personalNumber = user.personalNumber
this.isLoggedIn = true
@ -213,7 +220,6 @@ export class ApiSkolplattformen extends EventEmitter implements Api {
return parts[0]
}
public async setSessionCookie(sessionCookie: string): Promise<void> {
// Manually set cookie in this call and let the cookieManager
// handle it from here
@ -238,27 +244,22 @@ export class ApiSkolplattformen extends EventEmitter implements Api {
}
private async retrieveSessionCookie(): Promise<void> {
const url = routes.loginCookie
await this.fetch('login-cookie', url)
}
private async retrieveFrejaSessionCookie(): Promise<void> {
try{
try {
const url = routes.frejaReturnUrl
await this.fetch('freja-login-return-url', url)
} catch(error){
} catch (error) {
console.log(JSON.stringify(error))
}
try{
try {
const url2 = routes.frejaLoginCookie
const session = await this.getSession(url2, {
redirect: 'manual',
})
await this.fetch('freja-login-cookie', url2)
} catch(error2){
await this.fetch('freja-login-cookie', url2)
} catch (error2) {
console.log(JSON.stringify(error2))
}
}
@ -322,10 +323,14 @@ export class ApiSkolplattformen extends EventEmitter implements Api {
const data = await response.json()
const parsed = parse.children(data)
const useSpecialQueueModeForFSChildren = parsed.some((c) => (c.status || '').includes('FS'))
const useSpecialQueueModeForFSChildren = parsed.some((c) =>
(c.status || '').includes('FS')
)
if(useSpecialQueueModeForFSChildren) {
this.fetch = queueFetcherWrapper(this.fetch, (childId) => this.selectChildById(childId))
if (useSpecialQueueModeForFSChildren) {
this.fetch = queueFetcherWrapper(this.fetch, (childId) =>
this.selectChildById(childId)
)
}
return parsed
@ -359,23 +364,26 @@ export class ApiSkolplattformen extends EventEmitter implements Api {
const schoolForms = (child.status || '').split(';')
let teachers: Teacher[] = []
for(let i = 0; i< schoolForms.length; i+=1){
for (let i = 0; i < schoolForms.length; i += 1) {
const url = routes.teachers(child.sdsId, schoolForms[i])
// eslint-disable-next-line no-await-in-loop
const response = await this.fetch(`teachers_${schoolForms[i]}`, url, session)
// eslint-disable-next-line no-await-in-loop
const response = await this.fetch(
`teachers_${schoolForms[i]}`,
url,
session
)
const data = await response.json()
teachers = [
...teachers,
...parse.teachers(data)
]
teachers = [...teachers, ...parse.teachers(data)]
}
return teachers
}
public async getSchoolContacts(child: EtjanstChild): Promise<SchoolContact[]> {
if(this.isFake) return fakeResponse(fake.schoolContacts(child))
public async getSchoolContacts(
child: EtjanstChild
): Promise<SchoolContact[]> {
if (this.isFake) return fakeResponse(fake.schoolContacts(child))
const url = routes.schoolContacts(child.sdsId, child.schoolId || '')
const session = this.getRequestInit()
@ -411,7 +419,6 @@ export class ApiSkolplattformen extends EventEmitter implements Api {
return parse.news(data)
}
// eslint-disable-next-line class-methods-use-this
private CheckResponseForCorrectChildStatus(
response: Response,
child: EtjanstChild
@ -432,7 +439,12 @@ export class ApiSkolplattformen extends EventEmitter implements Api {
item: NewsItem
): Promise<NewsItem | undefined> {
if (this.isFake) {
return fakeResponse(fake.news(child).find((ni) => ni.id === item.id) || {id: "", published: ""})
return fakeResponse(
fake.news(child).find((ni) => ni.id === item.id) || {
id: '',
published: '',
}
)
}
const url = routes.newsDetails(child.id, item.id)
const session = this.getRequestInit()
@ -637,7 +649,7 @@ export class ApiSkolplattformen extends EventEmitter implements Api {
return parse.timetable(json, year, week, lang)
}
public async selectChild(child : EtjanstChild): Promise<EtjanstChild> {
public async selectChild(child: EtjanstChild): Promise<EtjanstChild> {
const response = await this.selectChildById(child.id)
const data = await response.json()
@ -660,7 +672,11 @@ export class ApiSkolplattformen extends EventEmitter implements Api {
}),
})
const response = await this.fetch('selectChild', routes.selectChild, requestInit)
const response = await this.fetch(
'selectChild',
routes.selectChild,
requestInit
)
return response
}

View File

@ -1,4 +1,4 @@
import { EtjanstChild, Skola24Child } from "@skolplattformen/api"
import { EtjanstChild, Skola24Child } from '@skolplattformen/api'
export const children = (): EtjanstChild[] => [
{
@ -24,6 +24,6 @@ export const skola24Children = (): Skola24Child[] => [
schoolGuid: 'def456',
schoolID: 'Superskolan',
timetableID: 'jkl012',
unitGuid: 'mno345'
unitGuid: 'mno345',
},
]

View File

@ -1,448 +1,452 @@
import { Child, Classmate } from '@skolplattformen/api';
import { Child, Classmate } from '@skolplattformen/api'
import { children } from './children'
export const classmates = (child: Child): Classmate[] => classmatesData.get(child.id) ?? []
export const classmates = (child: Child): Classmate[] =>
classmatesData.get(child.id) ?? []
const [child1, child2] = children()
const classmatesData = new Map<string, Classmate[]>([
[
child1.id, [
{
sisId: 'd004a-98d965a-45174-d2894ca2-f74ebcb',
firstname: 'Darion',
lastname: 'Gustafsson',
guardians: [
{
email: 'Mike_Svensson@example.net',
firstname: 'Tad',
lastname: 'Eriksson',
mobile: '07074791613',
address: 'Martinvägen 50',
},
],
className: '2B',
},
{
sisId: '54075-284de06-5664c-750b7b13-520fb61',
firstname: 'Brock',
lastname: 'Andersson',
guardians: [
{
email: 'Brad56@example.org',
firstname: 'Camren',
lastname: 'Eriksson',
mobile: '07075129297',
address: undefined,
},
],
className: '2B',
},
{
sisId: 'c1fc7-285f95d-c0f37-ea48a297-281e985',
firstname: 'Eloy',
lastname: 'Karlsson',
guardians: [
{
email: 'Samara.Larsson@example.net',
firstname: 'Ike',
lastname: 'Gustafsson',
mobile: '07077667407',
address: undefined,
},
],
className: '2B',
},
{
sisId: '212e9-8a2609c-b29c1-97a32bd8-5f84645',
firstname: 'Kristina',
lastname: 'Eriksson',
guardians: [
{
email: 'Doug57@example.com',
firstname: 'Rollin',
lastname: 'Olsson',
mobile: '07071720107',
address: 'Höckertsvägen 2',
},
],
className: '2B',
},
{
sisId: '01d21-ebc6f8b-526f8-7cfba0ab-26b9956',
firstname: 'Cydney',
lastname: 'Larsson',
guardians: [
{
email: 'Davon6@example.org',
firstname: 'Oleta',
lastname: 'Svensson',
mobile: '07079762186',
address: undefined,
},
],
className: '2B',
},
{
sisId: 'a45bb-8a481af-0ad12-7bd1fa4c-1eed4b1',
firstname: 'Berneice',
lastname: 'Persson',
guardians: [
{
email: 'Milford_Johansson72@example.com',
firstname: 'Arely',
lastname: 'Johansson',
mobile: '07071926019',
address: 'Roslinvägen 36',
},
],
className: '2B',
},
{
sisId: '32f31-039fbed-9060b-2d857c46-e47177d',
firstname: 'Emory',
lastname: 'Svensson',
guardians: [
{
email: 'Alfredo_Nilsson96@example.org',
firstname: 'Dolores',
lastname: 'Andersson',
mobile: '070752561937',
address: 'Börjesonsvägen 6',
},
],
className: '2B',
},
{
sisId: 'c9d0a-28c371d-e7be2-9781386b-6841eb0',
firstname: 'Maryjane',
lastname: 'Eriksson',
guardians: [
{
email: 'Eula_Olsson@example.net',
firstname: 'Wendy',
lastname: 'Andersson',
mobile: '07078513037',
address: undefined,
},
{
email: 'Lesley_Persson45@example.org',
firstname: 'Erich',
lastname: 'Persson',
mobile: '070788191316',
address: undefined,
},
],
className: '2B',
},
{
sisId: 'e0f51-3fbd0be-5a8c3-ded7bbed-1d655d5',
firstname: 'Rosendo',
lastname: 'Eriksson',
guardians: [
{
email: 'Mitchell.Gustafsson84@example.org',
firstname: 'Mariam',
lastname: 'Johansson',
mobile: '07074537423',
address: 'Molinvägen 29',
},
{
email: 'Rachelle_Olsson@example.net',
firstname: 'Shaniya',
lastname: 'Persson',
mobile: '070765878480',
address: 'Molinvägen 29',
},
],
className: '2B',
},
{
sisId: '298c2-46a24d4-548b9-3d1f90ee-4fae0ab',
firstname: 'Sammy',
lastname: 'Persson',
guardians: [
{
email: 'Gloria_Svensson@example.com',
firstname: 'Simeon',
lastname: 'Olsson',
mobile: '070753525610',
address: 'Börjesonsvägen 43',
},
],
className: '2B',
},
{
sisId: 'e7628-09352ea-b5d19-1af845b7-63b3e08',
firstname: 'Abraham',
lastname: 'Svensson',
guardians: [
{
email: 'Erica_Johansson40@example.net',
firstname: 'Carlotta',
lastname: 'Nilsson',
mobile: '070737951712',
address: 'Aroseniusvägen 27',
},
{
email: 'Malcolm_Gustafsson55@example.org',
firstname: 'Ramon',
lastname: 'Persson',
mobile: '07070395626',
address: 'Aroseniusvägen 27',
},
],
className: '2B',
},
{
sisId: 'ae315-4696438-b3db6-8f0a5b39-74e34bd',
firstname: 'Devante',
lastname: 'Olsson',
guardians: [
{
email: 'Alf.Johansson39@example.com',
firstname: 'Schuyler',
lastname: 'Gustafsson',
mobile: '07070724289',
address: undefined,
},
],
className: '2B',
},
{
sisId: '0d812-350f1d5-323aa-d5d93cdd-406e337',
firstname: 'Tyrell',
lastname: 'Eriksson',
guardians: [
{
email: 'Brennon.Svensson@example.com',
firstname: 'Belle',
lastname: 'Nilsson',
mobile: '07070137347',
address: undefined,
},
],
className: '2B',
},
]],
[
child2.id, [
{
sisId: '9ee9e-312233c-0df98-05fa5a65-a3787ec',
firstname: 'Raphael',
lastname: 'Olsson',
guardians: [
{
email: 'Johan99@example.com',
firstname: 'Alessandra',
lastname: 'Svensson',
mobile: '070767120463',
address: 'Franklandsvägen 34',
},
],
className: '8C',
},
{
sisId: 'd3a4b-16b53de-63c22-56d1ad24-4a64a2d',
firstname: 'Fanny',
lastname: 'Karlsson',
guardians: [
{
email: 'Bernadette.Eriksson@example.org',
firstname: 'Bernadette',
lastname: 'Karlsson',
mobile: '070759877956',
address: undefined,
},
{
email: 'Candice29@example.net',
firstname: 'Kelley',
lastname: 'Gustafsson',
mobile: '070748592035',
address: undefined,
},
],
className: '8C',
},
{
sisId: '42bde-8fabd1c-7a00e-28aea88a-8481bac',
firstname: 'Jamie',
lastname: 'Persson',
guardians: [
{
email: 'Louisa82@example.net',
firstname: 'Mose',
lastname: 'Larsson',
mobile: '07076548362',
address: undefined,
},
],
className: '8C',
},
{
sisId: 'dad49-74308c8-83612-5eb7f3a5-e1c4047',
firstname: 'Iris',
lastname: 'Eriksson',
guardians: [
{
email: 'Vaughn90@example.net',
firstname: 'Ezra',
lastname: 'Andersson',
mobile: '07078700165',
address: 'Björnsonsgatan 251 D Lgh 1503',
},
{
email: 'Stephany_Svensson22@example.net',
firstname: 'Mia',
lastname: 'Larsson',
mobile: '070761752378',
address: 'Björnsonsgatan 251 D Lgh 1503',
},
],
className: '8C',
},
{
sisId: 'b3425-ada6d70-d3acc-a49a12a6-8b3afdc',
firstname: 'Evans',
lastname: 'Nilsson',
guardians: [
{
email: 'Terry_Svensson@example.com',
firstname: 'Christop',
lastname: 'Olsson',
mobile: '070767660094',
address: undefined,
},
{
email: 'Johanna_Svensson30@example.org',
firstname: 'Madisen',
lastname: 'Johansson',
mobile: '07072269029',
address: undefined,
},
],
className: '8C',
},
{
sisId: '67471-6c03979-9ef6e-bb2827c4-96d00d5',
firstname: 'Evy',
lastname: 'Larsson',
guardians: [
{
email: 'Serenity.Gustafsson@example.net',
firstname: 'Toni',
lastname: 'Larsson',
mobile: '07075211567',
address: 'Roslinvägen 48',
},
],
className: '8C',
},
{
sisId: 'f4040-516c4ed-34555-fd525183-6a2f666',
firstname: 'Maximillia',
lastname: 'Karlsson',
guardians: [
{
email: 'Faustino.Andersson@example.com',
firstname: 'Eriberto',
lastname: 'Nilsson',
mobile: '07076024039',
address: 'Beckombergavägen 213 Lgh 1304',
},
],
className: '8C',
},
{
sisId: 'a9494-75d8ca7-a5fd4-977eca3c-40edbc1',
firstname: 'Pia',
lastname: 'Karlsson',
guardians: [
{
email: 'Arthur.Karlsson4@example.org',
firstname: 'Eldred',
lastname: 'Svensson',
mobile: '07077609534',
address: 'Börjesonsvägen 6',
},
],
className: '8C',
},
{
sisId: '42a6d-3eaf407-fed01-4a9538de-b822503',
firstname: 'Logan',
lastname: 'Larsson',
guardians: [
{
email: 'Blake4@example.org',
firstname: 'Jan',
lastname: 'Karlsson',
mobile: '070728715653',
address: 'Bällstavägen 162',
},
],
className: '8C',
},
{
sisId: '9077d-c323c8d-d0d29-5690abfb-d348317',
firstname: 'Torun',
lastname: 'Eriksson',
guardians: [
{
email: 'Blanca98@example.net',
firstname: 'Dallin',
lastname: 'Eriksson',
mobile: '070766214425',
address: 'Molinvägen 1',
},
],
className: '8C',
},
{
sisId: '31c68-5b86667-0701d-6b7e2471-89e6df9',
firstname: 'Izabella',
lastname: 'Johansson',
guardians: [
{
email: 'Elouise_Johansson25@example.org',
firstname: 'Jerrold',
lastname: 'Nilsson',
mobile: '07073789274',
address: 'Stobaeusvägen 11',
},
],
className: '8C',
},
{
sisId: '1bb69-5f1c3a6-f0ea8-e1dbb608-2756a52',
firstname: 'Ella',
lastname: 'Persson',
guardians: [
{
email: 'Shayna.Olsson54@example.net',
firstname: 'Onie',
lastname: 'Nilsson',
mobile: '07076957797',
address: undefined,
},
],
className: '8C',
},
{
sisId: '348a7-2d0eccc-02981-a02ccb03-cb2a8f2',
firstname: 'Jaylen',
lastname: 'Larsson',
guardians: [
{
email: 'Aileen_Andersson@example.net',
firstname: 'Tess',
lastname: 'Karlsson',
mobile: '070715315590',
address: 'Peringskiöldsvägen 64',
},
],
className: '8C',
}
child1.id,
[
{
sisId: 'd004a-98d965a-45174-d2894ca2-f74ebcb',
firstname: 'Darion',
lastname: 'Gustafsson',
guardians: [
{
email: 'Mike_Svensson@example.net',
firstname: 'Tad',
lastname: 'Eriksson',
mobile: '07074791613',
address: 'Martinvägen 50',
},
],
className: '2B',
},
{
sisId: '54075-284de06-5664c-750b7b13-520fb61',
firstname: 'Brock',
lastname: 'Andersson',
guardians: [
{
email: 'Brad56@example.org',
firstname: 'Camren',
lastname: 'Eriksson',
mobile: '07075129297',
address: undefined,
},
],
className: '2B',
},
{
sisId: 'c1fc7-285f95d-c0f37-ea48a297-281e985',
firstname: 'Eloy',
lastname: 'Karlsson',
guardians: [
{
email: 'Samara.Larsson@example.net',
firstname: 'Ike',
lastname: 'Gustafsson',
mobile: '07077667407',
address: undefined,
},
],
className: '2B',
},
{
sisId: '212e9-8a2609c-b29c1-97a32bd8-5f84645',
firstname: 'Kristina',
lastname: 'Eriksson',
guardians: [
{
email: 'Doug57@example.com',
firstname: 'Rollin',
lastname: 'Olsson',
mobile: '07071720107',
address: 'Höckertsvägen 2',
},
],
className: '2B',
},
{
sisId: '01d21-ebc6f8b-526f8-7cfba0ab-26b9956',
firstname: 'Cydney',
lastname: 'Larsson',
guardians: [
{
email: 'Davon6@example.org',
firstname: 'Oleta',
lastname: 'Svensson',
mobile: '07079762186',
address: undefined,
},
],
className: '2B',
},
{
sisId: 'a45bb-8a481af-0ad12-7bd1fa4c-1eed4b1',
firstname: 'Berneice',
lastname: 'Persson',
guardians: [
{
email: 'Milford_Johansson72@example.com',
firstname: 'Arely',
lastname: 'Johansson',
mobile: '07071926019',
address: 'Roslinvägen 36',
},
],
className: '2B',
},
{
sisId: '32f31-039fbed-9060b-2d857c46-e47177d',
firstname: 'Emory',
lastname: 'Svensson',
guardians: [
{
email: 'Alfredo_Nilsson96@example.org',
firstname: 'Dolores',
lastname: 'Andersson',
mobile: '070752561937',
address: 'Börjesonsvägen 6',
},
],
className: '2B',
},
{
sisId: 'c9d0a-28c371d-e7be2-9781386b-6841eb0',
firstname: 'Maryjane',
lastname: 'Eriksson',
guardians: [
{
email: 'Eula_Olsson@example.net',
firstname: 'Wendy',
lastname: 'Andersson',
mobile: '07078513037',
address: undefined,
},
{
email: 'Lesley_Persson45@example.org',
firstname: 'Erich',
lastname: 'Persson',
mobile: '070788191316',
address: undefined,
},
],
className: '2B',
},
{
sisId: 'e0f51-3fbd0be-5a8c3-ded7bbed-1d655d5',
firstname: 'Rosendo',
lastname: 'Eriksson',
guardians: [
{
email: 'Mitchell.Gustafsson84@example.org',
firstname: 'Mariam',
lastname: 'Johansson',
mobile: '07074537423',
address: 'Molinvägen 29',
},
{
email: 'Rachelle_Olsson@example.net',
firstname: 'Shaniya',
lastname: 'Persson',
mobile: '070765878480',
address: 'Molinvägen 29',
},
],
className: '2B',
},
{
sisId: '298c2-46a24d4-548b9-3d1f90ee-4fae0ab',
firstname: 'Sammy',
lastname: 'Persson',
guardians: [
{
email: 'Gloria_Svensson@example.com',
firstname: 'Simeon',
lastname: 'Olsson',
mobile: '070753525610',
address: 'Börjesonsvägen 43',
},
],
className: '2B',
},
{
sisId: 'e7628-09352ea-b5d19-1af845b7-63b3e08',
firstname: 'Abraham',
lastname: 'Svensson',
guardians: [
{
email: 'Erica_Johansson40@example.net',
firstname: 'Carlotta',
lastname: 'Nilsson',
mobile: '070737951712',
address: 'Aroseniusvägen 27',
},
{
email: 'Malcolm_Gustafsson55@example.org',
firstname: 'Ramon',
lastname: 'Persson',
mobile: '07070395626',
address: 'Aroseniusvägen 27',
},
],
className: '2B',
},
{
sisId: 'ae315-4696438-b3db6-8f0a5b39-74e34bd',
firstname: 'Devante',
lastname: 'Olsson',
guardians: [
{
email: 'Alf.Johansson39@example.com',
firstname: 'Schuyler',
lastname: 'Gustafsson',
mobile: '07070724289',
address: undefined,
},
],
className: '2B',
},
{
sisId: '0d812-350f1d5-323aa-d5d93cdd-406e337',
firstname: 'Tyrell',
lastname: 'Eriksson',
guardians: [
{
email: 'Brennon.Svensson@example.com',
firstname: 'Belle',
lastname: 'Nilsson',
mobile: '07070137347',
address: undefined,
},
],
className: '2B',
},
],
],
[
child2.id,
[
{
sisId: '9ee9e-312233c-0df98-05fa5a65-a3787ec',
firstname: 'Raphael',
lastname: 'Olsson',
guardians: [
{
email: 'Johan99@example.com',
firstname: 'Alessandra',
lastname: 'Svensson',
mobile: '070767120463',
address: 'Franklandsvägen 34',
},
],
className: '8C',
},
{
sisId: 'd3a4b-16b53de-63c22-56d1ad24-4a64a2d',
firstname: 'Fanny',
lastname: 'Karlsson',
guardians: [
{
email: 'Bernadette.Eriksson@example.org',
firstname: 'Bernadette',
lastname: 'Karlsson',
mobile: '070759877956',
address: undefined,
},
{
email: 'Candice29@example.net',
firstname: 'Kelley',
lastname: 'Gustafsson',
mobile: '070748592035',
address: undefined,
},
],
className: '8C',
},
{
sisId: '42bde-8fabd1c-7a00e-28aea88a-8481bac',
firstname: 'Jamie',
lastname: 'Persson',
guardians: [
{
email: 'Louisa82@example.net',
firstname: 'Mose',
lastname: 'Larsson',
mobile: '07076548362',
address: undefined,
},
],
className: '8C',
},
{
sisId: 'dad49-74308c8-83612-5eb7f3a5-e1c4047',
firstname: 'Iris',
lastname: 'Eriksson',
guardians: [
{
email: 'Vaughn90@example.net',
firstname: 'Ezra',
lastname: 'Andersson',
mobile: '07078700165',
address: 'Björnsonsgatan 251 D Lgh 1503',
},
{
email: 'Stephany_Svensson22@example.net',
firstname: 'Mia',
lastname: 'Larsson',
mobile: '070761752378',
address: 'Björnsonsgatan 251 D Lgh 1503',
},
],
className: '8C',
},
{
sisId: 'b3425-ada6d70-d3acc-a49a12a6-8b3afdc',
firstname: 'Evans',
lastname: 'Nilsson',
guardians: [
{
email: 'Terry_Svensson@example.com',
firstname: 'Christop',
lastname: 'Olsson',
mobile: '070767660094',
address: undefined,
},
{
email: 'Johanna_Svensson30@example.org',
firstname: 'Madisen',
lastname: 'Johansson',
mobile: '07072269029',
address: undefined,
},
],
className: '8C',
},
{
sisId: '67471-6c03979-9ef6e-bb2827c4-96d00d5',
firstname: 'Evy',
lastname: 'Larsson',
guardians: [
{
email: 'Serenity.Gustafsson@example.net',
firstname: 'Toni',
lastname: 'Larsson',
mobile: '07075211567',
address: 'Roslinvägen 48',
},
],
className: '8C',
},
{
sisId: 'f4040-516c4ed-34555-fd525183-6a2f666',
firstname: 'Maximillia',
lastname: 'Karlsson',
guardians: [
{
email: 'Faustino.Andersson@example.com',
firstname: 'Eriberto',
lastname: 'Nilsson',
mobile: '07076024039',
address: 'Beckombergavägen 213 Lgh 1304',
},
],
className: '8C',
},
{
sisId: 'a9494-75d8ca7-a5fd4-977eca3c-40edbc1',
firstname: 'Pia',
lastname: 'Karlsson',
guardians: [
{
email: 'Arthur.Karlsson4@example.org',
firstname: 'Eldred',
lastname: 'Svensson',
mobile: '07077609534',
address: 'Börjesonsvägen 6',
},
],
className: '8C',
},
{
sisId: '42a6d-3eaf407-fed01-4a9538de-b822503',
firstname: 'Logan',
lastname: 'Larsson',
guardians: [
{
email: 'Blake4@example.org',
firstname: 'Jan',
lastname: 'Karlsson',
mobile: '070728715653',
address: 'Bällstavägen 162',
},
],
className: '8C',
},
{
sisId: '9077d-c323c8d-d0d29-5690abfb-d348317',
firstname: 'Torun',
lastname: 'Eriksson',
guardians: [
{
email: 'Blanca98@example.net',
firstname: 'Dallin',
lastname: 'Eriksson',
mobile: '070766214425',
address: 'Molinvägen 1',
},
],
className: '8C',
},
{
sisId: '31c68-5b86667-0701d-6b7e2471-89e6df9',
firstname: 'Izabella',
lastname: 'Johansson',
guardians: [
{
email: 'Elouise_Johansson25@example.org',
firstname: 'Jerrold',
lastname: 'Nilsson',
mobile: '07073789274',
address: 'Stobaeusvägen 11',
},
],
className: '8C',
},
{
sisId: '1bb69-5f1c3a6-f0ea8-e1dbb608-2756a52',
firstname: 'Ella',
lastname: 'Persson',
guardians: [
{
email: 'Shayna.Olsson54@example.net',
firstname: 'Onie',
lastname: 'Nilsson',
mobile: '07076957797',
address: undefined,
},
],
className: '8C',
},
{
sisId: '348a7-2d0eccc-02981-a02ccb03-cb2a8f2',
firstname: 'Jaylen',
lastname: 'Larsson',
guardians: [
{
email: 'Aileen_Andersson@example.net',
firstname: 'Tess',
lastname: 'Karlsson',
mobile: '070715315590',
address: 'Peringskiöldsvägen 64',
},
],
className: '8C',
},
],
],
]
])

View File

@ -1,13 +1,13 @@
import { fourDaysAgo, oneDayAgo, oneWeekAgo } from './dates';
/* eslint-disable max-len */
import { fourDaysAgo, oneDayAgo, oneWeekAgo } from './dates'
import {
CalendarItem,
Child,
Notification,
ScheduleItem,
User,
} from '@skolplattformen/api';
import { oneDayForward, oneWeekForward, twoDaysForward } from './dates';
} from '@skolplattformen/api'
import { oneDayForward, oneWeekForward, twoDaysForward } from './dates'
const data: any = {
'39b59e-bf4b9f-f68ac25321-977218-bf0': {
@ -203,18 +203,17 @@ const data: any = {
allDayEvent: false,
startDate: oneDayForward.startOf('day').toISO(),
endDate: oneDayForward.endOf('day').toISO(),
oneDayEvent: true
} as ScheduleItem
oneDayEvent: true,
} as ScheduleItem,
],
notifications: [
{
id: 'bfe19b-766db3-b38d99d321-bbed3d-506',
sender: 'Planering och Bedömning',
dateCreated: oneDayAgo.minus({months: 6}).toISO(),
dateCreated: oneDayAgo.minus({ months: 6 }).toISO(),
dateModified: fourDaysAgo.toISO(),
message: 'Ett nytt inlägg i en lärlogg har skapats.',
url:
'https://www.breakit.se/artikel/21423/har-ar-it-bolaget-bakom-haveriet-pa-skolplattformen',
url: 'https://www.breakit.se/artikel/21423/har-ar-it-bolaget-bakom-haveriet-pa-skolplattformen',
category: 'Lärlogg',
type: 'avisering',
},
@ -224,8 +223,7 @@ const data: any = {
dateCreated: '2020-12-10T14:31:29.966Z',
message:
'Nu kan du ta del av ditt barns dokumentation av utvecklingssamtal',
url:
'https://www.breakit.se/artikel/21404/kodaren-slog-larm-nu-akutstoppas-skolplattformen-i-stockholm',
url: 'https://www.breakit.se/artikel/21404/kodaren-slog-larm-nu-akutstoppas-skolplattformen-i-stockholm',
category: null,
type: 'webnotify',
},
@ -234,8 +232,7 @@ const data: any = {
sender: 'Planering och Bedömning',
dateCreated: '2020-06-10T12:18:00.000Z',
message: 'Nu finns det en bedömning att titta på.',
url:
'https://www.svt.se/nyheter/lokalt/stockholm/skolplattformen-i-stockholm-beratta-om-era-erfarenheter',
url: 'https://www.svt.se/nyheter/lokalt/stockholm/skolplattformen-i-stockholm-beratta-om-era-erfarenheter',
category: 'Bedömning',
type: 'avisering',
},
@ -244,8 +241,7 @@ const data: any = {
sender: 'Planering och Bedömning',
dateCreated: '2020-03-24T14:28:00.000Z',
message: 'Nu finns det en bedömning att titta på.',
url:
'https://www.breakit.se/artikel/18120/skolplattformen-kostade-700-miljoner-strid-med-entreprenor-om-varumarket',
url: 'https://www.breakit.se/artikel/18120/skolplattformen-kostade-700-miljoner-strid-med-entreprenor-om-varumarket',
category: 'Bedömning',
type: 'avisering',
},
@ -254,8 +250,7 @@ const data: any = {
sender: 'Planering och Bedömning',
dateCreated: '2020-03-24T13:48:00.000Z',
message: 'Nu finns det en bedömning att titta på.',
url:
'https://www.mitti.se/nyheter/forskolans-tur-att-fa-kritiserade-skolplattformen-app/lmsau!5338007/',
url: 'https://www.mitti.se/nyheter/forskolans-tur-att-fa-kritiserade-skolplattformen-app/lmsau!5338007/',
category: 'Bedömning',
type: 'avisering',
},
@ -434,8 +429,8 @@ const data: any = {
allDayEvent: false,
startDate: twoDaysForward.startOf('day').toISO(),
endDate: twoDaysForward.endOf('day').toISO(),
oneDayEvent: false
} as ScheduleItem
oneDayEvent: false,
} as ScheduleItem,
],
notifications: [
{
@ -444,8 +439,7 @@ const data: any = {
dateCreated: fourDaysAgo.toISO(),
dateModified: fourDaysAgo.toISO(),
message: 'Ett nytt inlägg i en lärlogg har skapats.',
url:
'https://www.mitti.se/nyheter/rekorddyr-skolplattform-kostar-258-miljoner-till/lmsao!5381301/',
url: 'https://www.mitti.se/nyheter/rekorddyr-skolplattform-kostar-258-miljoner-till/lmsao!5381301/',
category: 'Lärlogg',
messageType: 'avisering',
},
@ -454,8 +448,7 @@ const data: any = {
sender: 'Planering och Bedömning',
dateCreated: '2020-12-01T12:43:00.000Z',
message: 'Ett nytt inlägg i en lärlogg har skapats.',
url:
'https://computersweden.idg.se/2.2683/1.722561/lacka-skolplattformen-datainspektionen',
url: 'https://computersweden.idg.se/2.2683/1.722561/lacka-skolplattformen-datainspektionen',
category: 'Lärlogg',
messageType: 'avisering',
},
@ -473,8 +466,7 @@ const data: any = {
sender: 'Planering och Bedömning',
dateCreated: '2020-11-16T13:24:00.000Z',
message: 'Ett nytt inlägg i en lärlogg har skapats.',
url:
'https://www.breakit.se/artikel/27075/skolplattformen-kostade-1-miljard-att-bygga-nu-tvingas-stockholm-bota',
url: 'https://www.breakit.se/artikel/27075/skolplattformen-kostade-1-miljard-att-bygga-nu-tvingas-stockholm-bota',
category: 'Lärlogg',
messageType: 'avisering',
},
@ -483,8 +475,7 @@ const data: any = {
sender: 'Planering och Bedömning',
dateCreated: '2020-11-12T13:27:00.000Z',
message: 'Ett nytt inlägg i en lärlogg har skapats.',
url:
'https://www.nyteknik.se/sakerhet/ygeman-om-datalackan-i-skolplattformen-det-ar-upprorande-6968853',
url: 'https://www.nyteknik.se/sakerhet/ygeman-om-datalackan-i-skolplattformen-det-ar-upprorande-6968853',
category: 'Lärlogg',
messageType: 'avisering',
},
@ -496,7 +487,7 @@ export const user = (): User => ({
personalNumber: '195001182046', // Test personal number from Skatteverket
firstName: 'Namn',
lastName: 'Namnsson',
isAuthenticated: true
isAuthenticated: true,
})
export const calendar = (child: Child): CalendarItem[] =>

View File

@ -1,14 +1,14 @@
import { DateTime } from "luxon"
import { DateTime } from 'luxon'
export const getDate = () => DateTime.now()
export const oneDayAgo = getDate().minus({days: 1})
export const twoDaysAgo = getDate().minus({days: 2})
export const fourDaysAgo = getDate().minus({days: 4})
export const oneWeekAgo = getDate().minus({weeks: 1})
export const oneDayAgo = getDate().minus({ days: 1 })
export const twoDaysAgo = getDate().minus({ days: 2 })
export const fourDaysAgo = getDate().minus({ days: 4 })
export const oneWeekAgo = getDate().minus({ weeks: 1 })
export const oneDayForward = getDate().plus({days: 1})
export const twoDaysForward = getDate().plus({days: 2})
export const fourDaysForward = getDate().plus({days: 4})
export const oneWeekForward = getDate().plus({weeks: 1})
export const oneDayForward = getDate().plus({ days: 1 })
export const twoDaysForward = getDate().plus({ days: 2 })
export const fourDaysForward = getDate().plus({ days: 4 })
export const oneWeekForward = getDate().plus({ weeks: 1 })
export const week = getDate().weekNumber.toString()

View File

@ -10,9 +10,9 @@ const week = getDate().weekNumber.toString()
const [child1, child2] = children()
const menuData = new Map<string, MenuItem[]>([
[
child1.id,
[
[
child1.id,
[
{
title: 'Måndag - Vecka ' + week,
description: 'Kebabgryta ris<br/>Ratatouille med kikärter',
@ -37,28 +37,33 @@ const menuData = new Map<string, MenuItem[]>([
},
],
],
[child2.id,
[
child2.id,
[
{
title: "Måndag - Vecka " + week,
description: "Thailändsk kycklinggryta med kokosmjölk, rödcurry och jasminris<br/>Thailänsk grönsaksgryta med kokosmjölk, rödcurry och jasminris"
title: 'Måndag - Vecka ' + week,
description:
'Thailändsk kycklinggryta med kokosmjölk, rödcurry och jasminris<br/>Thailänsk grönsaksgryta med kokosmjölk, rödcurry och jasminris',
},
{
title: "Tisdag - Vecka " + week,
description: "Örtomlett med potatis , medelhavsost och olivtapenad"
title: 'Tisdag - Vecka ' + week,
description: 'Örtomlett med potatis , medelhavsost och olivtapenad',
},
{
title: "Onsdag - Vecka " + week,
description: "Spagetti med rökt kalkon , grädde, dijon och persilja<br/>Spagetti med rostade bönor , grädde , dijon och persilja"
title: 'Onsdag - Vecka ' + week,
description:
'Spagetti med rökt kalkon , grädde, dijon och persilja<br/>Spagetti med rostade bönor , grädde , dijon och persilja',
},
{
title: "Torsdag - Vecka " + week,
description: "Panerad flundra med dansk remoulad och koktåotatis<br/>morot och linsbiff med danska remoulad och koktpotatis"
title: 'Torsdag - Vecka ' + week,
description:
'Panerad flundra med dansk remoulad och koktåotatis<br/>morot och linsbiff med danska remoulad och koktpotatis',
},
{
title: "Fredag - Vecka " + week,
description: "Texaschili på högrev med picklad rödlök och bulgur<br/>Texaschili på svartabönor picklad rödlök och bulgur"
}
title: 'Fredag - Vecka ' + week,
description:
'Texaschili på högrev med picklad rödlök och bulgur<br/>Texaschili på svartabönor picklad rödlök och bulgur',
},
],
]
],
])

View File

@ -7,137 +7,132 @@ export const news = (child: Child): NewsItem[] => newsData.get(child.id) ?? []
const [child1, child2] = children()
const newsData = new Map<string, NewsItem[]>([
[child1.id, [
{
id: 'asdfasdfasdfw',
author: 'Vaktmästare Persson',
header: 'Brandsläckare!',
intro: 'Idag hade vi en incident med en brandsläckare.',
body:
'## Information om brandsläckarincidenten\n\nHej, idag vid lunchtid utlöste en elev av misstag en pulverbrandsläckare i kapprummet. En del pulver yrde runt i rummet och under saneringen fick eleverna i angränsande klassrum vara i aulan istället för klassrummet.\n\nFlera elever var på plats i hallen när detta inträffade men utrymdes kort därefter. Pulvret är INTE hälsovådligt men kan ge upphov till halsirritation vid inandning.\n\nJag har pratat med berörda elever om det inträffade och uppmanat dem att ta hem kläder och tillhörigheter som fanns i kapprummet eftersom de troligen blivit dammiga. Vi rekommenderar att ni tvättar eller vädrar dessa.',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl:
'https://cdn.breakit.se/assets/article/6607f9b923edb6f85aa4417bab43c0f8.jpg?d=980x500',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.twoDaysAgo.toISO(),
modified: dates.twoDaysAgo.plus({ hours: 1 }).toISO(),
},
{
id: 'asdfabbuasdfs',
author: 'Ada L.',
header: 'Bygg din egen app',
intro: 'Denna vecka bygger vi appar!',
body:
'## Appar med öppen data \n\nDenna vecka har vi förmånen att få besök av några föräldrar som visar hur vi enkelt kan skapa appar som visar information ifrån öppna datakällor.\n\nEn fantastisk möjlighet att lära oss hur digitalisering skapar nya möjligheter i såväl skolan som arbetslivet.',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl:
'https://live.staticflickr.com/4063/4369776892_5cd42d27ba.jpg',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.oneWeekAgo.toISO(),
modified: dates.oneWeekAgo.toISO(),
},
{
id: 'asdfasdfasdfs',
author: 'Magister Svensson',
header: 'Läxor vecka 6.',
intro: 'Alla elever måste göra sina läxor!',
body:
'## Läxor vecka 6 \n\nFöljande läxor är obligatoriska:\n\n- Antikens historia\n- Svenska stormaktstiden\n- Statistik A\n- Flerdimensionell analys, del 1',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl:
'https://www.mitti.se/_internal/cimg!0/ejf8efxee735ymm8tm40q3hhkl36sdt.jpeg',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.oneWeekAgo.toISO(),
modified: dates.oneWeekAgo.minus({ hours: 3 }).toISO(),
},
]
],
[
child1.id,
[
{
id: 'asdfasdfasdfw',
author: 'Vaktmästare Persson',
header: 'Brandsläckare!',
intro: 'Idag hade vi en incident med en brandsläckare.',
body: '## Information om brandsläckarincidenten\n\nHej, idag vid lunchtid utlöste en elev av misstag en pulverbrandsläckare i kapprummet. En del pulver yrde runt i rummet och under saneringen fick eleverna i angränsande klassrum vara i aulan istället för klassrummet.\n\nFlera elever var på plats i hallen när detta inträffade men utrymdes kort därefter. Pulvret är INTE hälsovådligt men kan ge upphov till halsirritation vid inandning.\n\nJag har pratat med berörda elever om det inträffade och uppmanat dem att ta hem kläder och tillhörigheter som fanns i kapprummet eftersom de troligen blivit dammiga. Vi rekommenderar att ni tvättar eller vädrar dessa.',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl:
'https://cdn.breakit.se/assets/article/6607f9b923edb6f85aa4417bab43c0f8.jpg?d=980x500',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.twoDaysAgo.toISO(),
modified: dates.twoDaysAgo.plus({ hours: 1 }).toISO(),
},
{
id: 'asdfabbuasdfs',
author: 'Ada L.',
header: 'Bygg din egen app',
intro: 'Denna vecka bygger vi appar!',
body: '## Appar med öppen data \n\nDenna vecka har vi förmånen att få besök av några föräldrar som visar hur vi enkelt kan skapa appar som visar information ifrån öppna datakällor.\n\nEn fantastisk möjlighet att lära oss hur digitalisering skapar nya möjligheter i såväl skolan som arbetslivet.',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl:
'https://live.staticflickr.com/4063/4369776892_5cd42d27ba.jpg',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.oneWeekAgo.toISO(),
modified: dates.oneWeekAgo.toISO(),
},
{
id: 'asdfasdfasdfs',
author: 'Magister Svensson',
header: 'Läxor vecka 6.',
intro: 'Alla elever måste göra sina läxor!',
body: '## Läxor vecka 6 \n\nFöljande läxor är obligatoriska:\n\n- Antikens historia\n- Svenska stormaktstiden\n- Statistik A\n- Flerdimensionell analys, del 1',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl:
'https://www.mitti.se/_internal/cimg!0/ejf8efxee735ymm8tm40q3hhkl36sdt.jpeg',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.oneWeekAgo.toISO(),
modified: dates.oneWeekAgo.minus({ hours: 3 }).toISO(),
},
],
],
[child2.id, [
{
id: 'asdfasdfasdfa',
author: 'Rektor Gustavsson',
header: 'Välkommen till skolan!',
intro:
'Hej alla barn och föräldrar och välkomna till Storskolan! Här kommer en del information som kan vara bra att känna till inför första dagen.',
body:
'## Information till föräldrar \n\nSkolan börjar kl 08.00 och slutar 18.00. Kommer man sent eller blir sjuk så ska det anmälas via Skolplattformen. Se till så att dina barn har ätit frukost. Frukt är nyttigt! \n\n## Information till barn\n\nLek är tillåtet på rasterna men enbart på skolgården. Medtag ej egna leksaker. Tvätta händerna.',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl:
'https://timbro.se/app/uploads/2020/10/broman-skolplattformen-1280x752.jpg',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.oneWeekAgo.toISO(),
modified: dates.oneWeekAgo.toISO(),
},
{
id: 'asdfabbuasdfs',
author: 'Ada L.',
header: 'App, App, App',
intro: 'Denna vecka bygger vi appar!',
body:
'## Appar med öppen data \n\nDenna vecka har vi förmånen att få besök av några föräldrar som visar hur vi enkelt kan skapa appar som visar information ifrån öppna datakällor.\n\nEn fantastisk möjlighet att lära oss hur digitalisering skapar nya möjligheter i såväl skolan som arbetslivet.',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl:
'https://live.staticflickr.com/4063/4369776892_5cd42d27ba.jpg',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.fourDaysAgo.toISO(),
modified: dates.fourDaysAgo.plus({minutes: 45}).toISO(),
},
{
id: 'asdfasdfasdfs',
author: 'Magister Svensson',
header: 'Läxor i veckan',
intro: 'Alla elever måste göra sina läxor!',
body:
'## Läxor vecka 6 \n\nFöljande läxor är obligatoriska:\n\n- Antikens historia\n- Svenska stormaktstiden\n- Statistik A\n- Flerdimensionell analys, del 1',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl:
'https://www.mitti.se/_internal/cimg!0/ejf8efxee735ymm8tm40q3hhkl36sdt.jpeg',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.oneWeekAgo.toISO(),
modified: dates.oneWeekAgo.toISO(),
},
{
id: 'asdfasdfasdfd',
author: 'Information från Förskoleklass',
header: 'Vinteraktiviteter',
intro:
'Vi kommer efter att förskoleklassen är slut arrangera olika vinteraktiviteter genom fridtidsverksamheten.',
body:
'## Vänligen ta med hjälm, skridskor eller stjärtlapp.\n\n ![Bild](https://images.unsplash.com/photo-1495377701095-00261b767581?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=988&q=80)\n\n Alla barn måste ha hjälm på sig samt varma kläder. Vi kommer åka i backen bakom skolbyggnaden samt använda isen som spolats vid Mullsjöskolan. Personal kommer finnas på plats samt att vi erbjuda varm dryck, frukt och lek för de barn som ej har hjälm eller lämpligt åkdon.',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl: 'https://unsplash.com/photos/yB_aiAWkm40',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.oneWeekAgo.minus({weeks: 2}).toISO(),
modified: dates.oneWeekAgo.minus({weeks: 1}).toISO(),
},
{
id: 'asdfasdfasdfdsa',
author: 'Köket',
header: 'Ekologisk vecka i matsalen',
intro: 'Ekologiska veckan i matsalen vecka 11',
body:
'## Vi kommer ha tema jorden i matsalen och servera ekologisk mat från hela världen med tema jorden. Detta för att belysa att man kan använda alla delar av råvaorna. Det kommer erbjudas rätter från alla världsdelar som är producerat för jordens bästa. Smaklig spis hälsar Gunnel i köket med personal.',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl: 'https://unsplash.com/photos/7K17MvT8qBg',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.oneWeekAgo.minus({weeks: 3}).toISO(),
modified: dates.oneWeekAgo.minus({days: 2}).toISO(),
},
{
id: 'asdfasdfasdfbvdsa',
author: 'Vaktmästaren',
header: 'Klotter i korridoren (igen)',
intro:
'Ännu en gång har vi råka ut för skadegörelse i korridorerna vid åk 5',
body:
'## Tyvärr har flera elever klottat på skåp och väggar vid åk5 skåpen. Detta är helt oacceptablet beteende och kostar skolan stora belopp att åtgärda. Vi ber alla föräldrar prata med sina barn om klotter samt att det var väldigt grovt spårkbruk. Personalen på skolan kommer att hålla extra uppsikt och vi har även pratat med en del av de inblandade eleverna i denna skadegörelse.\n\nPersonalen har även börjat forska på vad vissa av de skrivna orden betyder och Eva-Britt är förfasad över språkbruket samt vad de innebär. Bernt kommer att påbörja saneringen och återställningen av skadegörelsen samt vakta korridorerna nogrannare för att säkerställa att detta ej kommer ske igen.\n\n Klotter\n\nUPPDATERING: Det som är skrivet om Sara är inte sant! ',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl: 'https://unsplash.com/photos/SkbEZ16VywM',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.oneWeekAgo.minus({weeks: 4}).toISO(),
modified: dates.oneWeekAgo.minus({weeks: 2}).toISO(),
},
]
]
[
child2.id,
[
{
id: 'asdfasdfasdfa',
author: 'Rektor Gustavsson',
header: 'Välkommen till skolan!',
intro:
'Hej alla barn och föräldrar och välkomna till Storskolan! Här kommer en del information som kan vara bra att känna till inför första dagen.',
body: '## Information till föräldrar \n\nSkolan börjar kl 08.00 och slutar 18.00. Kommer man sent eller blir sjuk så ska det anmälas via Skolplattformen. Se till så att dina barn har ätit frukost. Frukt är nyttigt! \n\n## Information till barn\n\nLek är tillåtet på rasterna men enbart på skolgården. Medtag ej egna leksaker. Tvätta händerna.',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl:
'https://timbro.se/app/uploads/2020/10/broman-skolplattformen-1280x752.jpg',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.oneWeekAgo.toISO(),
modified: dates.oneWeekAgo.toISO(),
},
{
id: 'asdfabbuasdfs',
author: 'Ada L.',
header: 'App, App, App',
intro: 'Denna vecka bygger vi appar!',
body: '## Appar med öppen data \n\nDenna vecka har vi förmånen att få besök av några föräldrar som visar hur vi enkelt kan skapa appar som visar information ifrån öppna datakällor.\n\nEn fantastisk möjlighet att lära oss hur digitalisering skapar nya möjligheter i såväl skolan som arbetslivet.',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl:
'https://live.staticflickr.com/4063/4369776892_5cd42d27ba.jpg',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.fourDaysAgo.toISO(),
modified: dates.fourDaysAgo.plus({ minutes: 45 }).toISO(),
},
{
id: 'asdfasdfasdfs',
author: 'Magister Svensson',
header: 'Läxor i veckan',
intro: 'Alla elever måste göra sina läxor!',
body: '## Läxor vecka 6 \n\nFöljande läxor är obligatoriska:\n\n- Antikens historia\n- Svenska stormaktstiden\n- Statistik A\n- Flerdimensionell analys, del 1',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl:
'https://www.mitti.se/_internal/cimg!0/ejf8efxee735ymm8tm40q3hhkl36sdt.jpeg',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.oneWeekAgo.toISO(),
modified: dates.oneWeekAgo.toISO(),
},
{
id: 'asdfasdfasdfd',
author: 'Information från Förskoleklass',
header: 'Vinteraktiviteter',
intro:
'Vi kommer efter att förskoleklassen är slut arrangera olika vinteraktiviteter genom fridtidsverksamheten.',
body: '## Vänligen ta med hjälm, skridskor eller stjärtlapp.\n\n ![Bild](https://images.unsplash.com/photo-1495377701095-00261b767581?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=988&q=80)\n\n Alla barn måste ha hjälm på sig samt varma kläder. Vi kommer åka i backen bakom skolbyggnaden samt använda isen som spolats vid Mullsjöskolan. Personal kommer finnas på plats samt att vi erbjuda varm dryck, frukt och lek för de barn som ej har hjälm eller lämpligt åkdon.',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl: 'https://unsplash.com/photos/yB_aiAWkm40',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.oneWeekAgo.minus({ weeks: 2 }).toISO(),
modified: dates.oneWeekAgo.minus({ weeks: 1 }).toISO(),
},
{
id: 'asdfasdfasdfdsa',
author: 'Köket',
header: 'Ekologisk vecka i matsalen',
intro: 'Ekologiska veckan i matsalen vecka 11',
body: '## Vi kommer ha tema jorden i matsalen och servera ekologisk mat från hela världen med tema jorden. Detta för att belysa att man kan använda alla delar av råvaorna. Det kommer erbjudas rätter från alla världsdelar som är producerat för jordens bästa. Smaklig spis hälsar Gunnel i köket med personal.',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl: 'https://unsplash.com/photos/7K17MvT8qBg',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.oneWeekAgo.minus({ weeks: 3 }).toISO(),
modified: dates.oneWeekAgo.minus({ days: 2 }).toISO(),
},
{
id: 'asdfasdfasdfbvdsa',
author: 'Vaktmästaren',
header: 'Klotter i korridoren (igen)',
intro:
'Ännu en gång har vi råka ut för skadegörelse i korridorerna vid åk 5',
body: '## Tyvärr har flera elever klottat på skåp och väggar vid åk5 skåpen. Detta är helt oacceptablet beteende och kostar skolan stora belopp att åtgärda. Vi ber alla föräldrar prata med sina barn om klotter samt att det var väldigt grovt spårkbruk. Personalen på skolan kommer att hålla extra uppsikt och vi har även pratat med en del av de inblandade eleverna i denna skadegörelse.\n\nPersonalen har även börjat forska på vad vissa av de skrivna orden betyder och Eva-Britt är förfasad över språkbruket samt vad de innebär. Bernt kommer att påbörja saneringen och återställningen av skadegörelsen samt vakta korridorerna nogrannare för att säkerställa att detta ej kommer ske igen.\n\n Klotter\n\nUPPDATERING: Det som är skrivet om Sara är inte sant! ',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl: 'https://unsplash.com/photos/SkbEZ16VywM',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.oneWeekAgo.minus({ weeks: 4 }).toISO(),
modified: dates.oneWeekAgo.minus({ weeks: 2 }).toISO(),
},
],
],
])

View File

@ -1,47 +1,52 @@
import { SchoolContact, Child } from '@skolplattformen/api';
import { SchoolContact, Child } from '@skolplattformen/api'
import { children } from './children'
export const schoolContacts = (child: Child): SchoolContact[] => schoolContactData.get(child.id) ?? []
export const schoolContacts = (child: Child): SchoolContact[] =>
schoolContactData.get(child.id) ?? []
const [child1,child2] = children()
const [child1, child2] = children()
const schoolContactData = new Map<string, SchoolContact[]>([
[
child1.id, [
child1.id,
[
{
title: "Expedition",
title: 'Expedition',
name: undefined,
phone: "508 000 00",
email: "",
schoolName: "Vallaskolan",
phone: '508 000 00',
email: '',
schoolName: 'Vallaskolan',
className: '',
},
{
title: "Rektor",
name: "Alvar Sträng",
phone: "08-50800001",
email: "alvar.strang@edu.stockholm.se",
title: 'Rektor',
name: 'Alvar Sträng',
phone: '08-50800001',
email: 'alvar.strang@edu.stockholm.se',
schoolName: '',
className: '',
}
]],
},
],
],
[
child2.id, [
{
title: "Expedition",
name: undefined,
phone: "508 000 00",
email: "",
schoolName: "Vallaskolan",
className: '',
},
{
title: "Rektor",
name: "Alvar Sträng",
phone: "08-50800001",
email: "alvar.strang@edu.stockholm.se",
schoolName: '',
className: '',
}
]]
child2.id,
[
{
title: 'Expedition',
name: undefined,
phone: '508 000 00',
email: '',
schoolName: 'Vallaskolan',
className: '',
},
{
title: 'Rektor',
name: 'Alvar Sträng',
phone: '08-50800001',
email: 'alvar.strang@edu.stockholm.se',
schoolName: '',
className: '',
},
],
],
])

View File

@ -1,81 +1,86 @@
import { Teacher, Child } from '@skolplattformen/api';
import { Teacher, Child } from '@skolplattformen/api'
import { children } from './children'
export const teachers = (child: Child): Teacher[] => teacherData.get(child.id) ?? []
export const teachers = (child: Child): Teacher[] =>
teacherData.get(child.id) ?? []
const [child1,child2] = children()
const [child1, child2] = children()
const teacherData = new Map<string, Teacher[]>([
[
child1.id, [
child1.id,
[
{
id: 15662220,
firstname: "Cecilia",
firstname: 'Cecilia',
sisId: '',
lastname: "Test",
email: "cecilia.test@edu.stockholm.se",
lastname: 'Test',
email: 'cecilia.test@edu.stockholm.se',
phoneWork: undefined,
active: true,
status: " S",
status: ' S',
timeTableAbbreviation: 'CTE',
},
{
id: 15662221,
firstname: "Anna",
lastname: "Test",
firstname: 'Anna',
lastname: 'Test',
sisId: '',
email: "anna.test@edu.stockholm.se",
email: 'anna.test@edu.stockholm.se',
phoneWork: '08000000',
active: true,
status: " GR",
status: ' GR',
timeTableAbbreviation: 'ATE',
},
{
id: 15662221,
firstname: "Greta",
lastname: "Test",
firstname: 'Greta',
lastname: 'Test',
sisId: '',
email: undefined,
phoneWork: '08000001',
active: true,
status: " F",
status: ' F',
timeTableAbbreviation: 'GTE',
},
]],
[
child2.id, [
{
id: 15662220,
firstname: "Cecilia",
sisId: '',
lastname: "Test",
email: "cecilia.test@edu.stockholm.se",
phoneWork: undefined,
active: true,
status: " S",
timeTableAbbreviation: 'CTE',
},
{
id: 15662221,
firstname: "Anna",
lastname: "Test",
sisId: '',
email: "anna.test@edu.stockholm.se",
phoneWork: '08000000',
active: true,
status: " GR",
timeTableAbbreviation: 'ATE',
},
{
id: 15662221,
firstname: "Greta",
lastname: "Test",
sisId: '',
email: undefined,
phoneWork: '08000001',
active: true,
status: " F",
timeTableAbbreviation: 'GTE',
},
]],
],
],
[
child2.id,
[
{
id: 15662220,
firstname: 'Cecilia',
sisId: '',
lastname: 'Test',
email: 'cecilia.test@edu.stockholm.se',
phoneWork: undefined,
active: true,
status: ' S',
timeTableAbbreviation: 'CTE',
},
{
id: 15662221,
firstname: 'Anna',
lastname: 'Test',
sisId: '',
email: 'anna.test@edu.stockholm.se',
phoneWork: '08000000',
active: true,
status: ' GR',
timeTableAbbreviation: 'ATE',
},
{
id: 15662221,
firstname: 'Greta',
lastname: 'Test',
sisId: '',
email: undefined,
phoneWork: '08000001',
active: true,
status: ' F',
timeTableAbbreviation: 'GTE',
},
],
],
])

View File

@ -1,5 +1,4 @@
import { Skola24Child, TimetableEntry } from "@skolplattformen/api"
import { Skola24Child, TimetableEntry } from '@skolplattformen/api'
export const timetable = (child: Skola24Child): TimetableEntry[] => {
if (!child.personGuid || !child.unitGuid) return []
@ -460,6 +459,6 @@ export const timetable = (child: Skola24Child): TimetableEntry[] => {
timeStart: '10:40:00',
dateStart: '2021-04-16T10:40:00.000+02:00',
dateEnd: '2021-04-16T11:35:00.000+02:00',
}
},
]
}

View File

@ -1,50 +1,57 @@
import { EventEmitter } from 'events';
import { frejaLoginStatus } from './routes';
import { Fetcher, FrejaLoginStatusChecker, RequestInit } from '@skolplattformen/api';
export class FrejaChecker extends EventEmitter implements FrejaLoginStatusChecker {
public token: string;
import { EventEmitter } from 'events'
import { frejaLoginStatus } from './routes'
import {
Fetcher,
FrejaLoginStatusChecker,
RequestInit,
} from '@skolplattformen/api'
export class FrejaChecker
extends EventEmitter
implements FrejaLoginStatusChecker
{
public token: string
private fetcher: Fetcher
private url: string
private fetcher: Fetcher
private url: string
private cancelled = false;
private cancelled = false
constructor(fetcher: Fetcher, token: string) {
super();
this.fetcher = fetcher
constructor(fetcher: Fetcher, token: string) {
super()
this.fetcher = fetcher
this.token = token
this.url = frejaLoginStatus;
this.check();
}
this.token = token
this.url = frejaLoginStatus
this.check()
}
async check(): Promise<void> {
const response = await this.fetcher('freja-login-status', this.url);
let status = await response.text();
async check(): Promise<void> {
const response = await this.fetcher('freja-login-status', this.url)
let status = await response.text()
// For Freja we recieve CANCELED (with one L) - BankId returns CANCELLED (with two L)
// To make the API consistent - we choose the same as BankId - two L
if (status === 'CANCELED') status = 'CANCELLED'
// For Freja we recieve CANCELED (with one L) - BankId returns CANCELLED (with two L)
// To make the API consistent - we choose the same as BankId - two L
if (status === 'CANCELED') status = 'CANCELLED'
console.debug(status)
this.emit(status);
if (!this.cancelled &&
status !== 'APPROVED' &&
status !== 'ERROR' &&
status !== 'CANCELLED'
){
setTimeout(() => this.check(), 1000);
}
}
async cancel(): Promise<void> {
this.cancelled = true;
console.debug(status)
this.emit(status)
if (
!this.cancelled &&
status !== 'APPROVED' &&
status !== 'ERROR' &&
status !== 'CANCELLED'
) {
setTimeout(() => this.check(), 1000)
}
}
async cancel(): Promise<void> {
this.cancelled = true
}
}
export const checkStatus = (
fetch: Fetcher,
token: string,
session: RequestInit
): FrejaLoginStatusChecker => new FrejaChecker(fetch, token)
export const checkStatus = (
fetch: Fetcher,
token: string,
session: RequestInit
): FrejaLoginStatusChecker => new FrejaChecker(fetch, token)

View File

@ -1,49 +1,53 @@
import { EventEmitter } from 'events';
import { loginStatus } from './routes';
import { AuthTicket, Fetcher, LoginStatusChecker } from '@skolplattformen/api';
import { EventEmitter } from 'events'
import { loginStatus } from './routes'
import { AuthTicket, Fetcher, LoginStatusChecker } from '@skolplattformen/api'
export class Checker extends EventEmitter implements LoginStatusChecker {
public token: string;
public token: string
private fetcher: Fetcher;
private fetcher: Fetcher
private url: string;
private url: string
private cancelled = false;
private cancelled = false
constructor(fetcher: Fetcher, ticket: AuthTicket) {
super();
this.fetcher = fetcher;
this.url = loginStatus(ticket.order);
this.token = ticket.token;
this.check();
super()
this.fetcher = fetcher
this.url = loginStatus(ticket.order)
this.token = ticket.token
this.check()
}
async check(): Promise<void> {
const response = await this.fetcher('login-status', this.url);
const status = await response.text();
this.emit(status);
if (!this.cancelled &&
const response = await this.fetcher('login-status', this.url)
const status = await response.text()
this.emit(status)
if (
!this.cancelled &&
status !== 'OK' &&
status !== 'ERROR!' &&
status !== 'CANCELLED') {
setTimeout(() => this.check(), 1000);
status !== 'CANCELLED'
) {
setTimeout(() => this.check(), 1000)
}
}
async cancel(): Promise<void> {
this.cancelled = true;
this.cancelled = true
}
}
export const checkStatus = (
fetch: Fetcher,
ticket: AuthTicket
): LoginStatusChecker => new Checker(fetch, ticket)
export class DummyStatusChecker extends EventEmitter implements LoginStatusChecker {
token = ""
export class DummyStatusChecker
extends EventEmitter
implements LoginStatusChecker
{
token = ''
async cancel(): Promise<void> {
// do nothing
}

View File

@ -19,7 +19,8 @@ describe('news', () => {
NewsListId: '3EC323A1-EA16-4D24-84C8-DAA49E76F9F4',
NewsItemId:
'elevstockholm.sharepoint.com,27892ACC-BA2E-4DEC-97B8-25F7098C3BF6,A239466A-9A52-42FF-8A3F-D94C342F2700_99',
Header: 'Problemet med att se betyg i bild, slöjd och teknik löst!',
Header:
'Problemet med att se betyg i bild, slöjd och teknik löst!',
PublicationDate: '/Date(1608304542000)/',
PubDateSE: '18 december 2020 16:15',
ModifiedDate: '/Date(1608304680000)/',
@ -30,8 +31,7 @@ describe('news', () => {
BannerImageUrl: 'A703552D-DBF3-45B0-8E67-6E062105A0C5.jpeg',
BannerImageGuid: 'A703552D-DBF3-45B0-8E67-6E062105A0C5',
BannerImageListId: 'FFBE49E9-BDE1-4C75-BA0E-D98D4E2FCF21',
Body:
'<div><div data-sp-canvascontrol="" data-sp-canvasdataversion="1.0" data-sp-controldata="&#123;&quot;controlType&quot;&#58;4,&quot;id&quot;&#58;&quot;1212fc8d-dd6b-408a-8d5d-9f1cc787efbb&quot;,&quot;position&quot;&#58;&#123;&quot;controlIndex&quot;&#58;2,&quot;sectionIndex&quot;&#58;1,&quot;sectionFactor&quot;&#58;12,&quot;zoneIndex&quot;&#58;1,&quot;layoutIndex&quot;&#58;1&#125;,&quot;addedFromPersistedData&quot;&#58;true,&quot;emphasis&quot;&#58;&#123;&#125;&#125;"><div data-sp-rte=""><p>Hej,</p><p>Nu är problemet löst! Alla betyg syns som de ska.&#160;</p><p>God jul!</p></div></div><div data-sp-canvascontrol="" data-sp-canvasdataversion="1.0" data-sp-controldata="&#123;&quot;controlType&quot;&#58;0,&quot;pageSettingsSlice&quot;&#58;&#123;&quot;isDefaultDescription&quot;&#58;true,&quot;isDefaultThumbnail&quot;&#58;true&#125;&#125;"></div></div>',
Body: '<div><div data-sp-canvascontrol="" data-sp-canvasdataversion="1.0" data-sp-controldata="&#123;&quot;controlType&quot;&#58;4,&quot;id&quot;&#58;&quot;1212fc8d-dd6b-408a-8d5d-9f1cc787efbb&quot;,&quot;position&quot;&#58;&#123;&quot;controlIndex&quot;&#58;2,&quot;sectionIndex&quot;&#58;1,&quot;sectionFactor&quot;&#58;12,&quot;zoneIndex&quot;&#58;1,&quot;layoutIndex&quot;&#58;1&#125;,&quot;addedFromPersistedData&quot;&#58;true,&quot;emphasis&quot;&#58;&#123;&#125;&#125;"><div data-sp-rte=""><p>Hej,</p><p>Nu är problemet löst! Alla betyg syns som de ska.&#160;</p><p>God jul!</p></div></div><div data-sp-canvascontrol="" data-sp-canvasdataversion="1.0" data-sp-controldata="&#123;&quot;controlType&quot;&#58;0,&quot;pageSettingsSlice&quot;&#58;&#123;&quot;isDefaultDescription&quot;&#58;true,&quot;isDefaultThumbnail&quot;&#58;true&#125;&#125;"></div></div>',
BodyNoHtml: null,
AuthorDisplayName: 'Eva-Lotta Rönnberg',
altText: 'Nyhetsbild. Bildtext ej tillgänglig.',
@ -108,7 +108,8 @@ describe('news', () => {
NewsListId: '3EC323A1-EA16-4D24-84C8-DAA49E76F9F4',
NewsItemId:
'elevstockholm.sharepoint.com,27892ACC-BA2E-4DEC-97B8-25F7098C3BF6,A239466A-9A52-42FF-8A3F-D94C342F2700_99',
Header: 'Problemet med att se betyg i bild, slöjd och teknik löst!',
Header:
'Problemet med att se betyg i bild, slöjd och teknik löst!',
PublicationDate: '/Date(1608304542000)/',
PubDateSE: '18 december 2020 16:15',
ModifiedDate: '/Date(1608304680000)/',
@ -119,8 +120,7 @@ describe('news', () => {
BannerImageUrl: 'A703552D-DBF3-45B0-8E67-6E062105A0C5.jpeg',
BannerImageGuid: 'A703552D-DBF3-45B0-8E67-6E062105A0C5',
BannerImageListId: 'FFBE49E9-BDE1-4C75-BA0E-D98D4E2FCF21',
Body:
'<div><div data-sp-canvascontrol="" data-sp-canvasdataversion="1.0" data-sp-controldata="&#123;&quot;controlType&quot;&#58;4,&quot;id&quot;&#58;&quot;1212fc8d-dd6b-408a-8d5d-9f1cc787efbb&quot;,&quot;position&quot;&#58;&#123;&quot;controlIndex&quot;&#58;2,&quot;sectionIndex&quot;&#58;1,&quot;sectionFactor&quot;&#58;12,&quot;zoneIndex&quot;&#58;1,&quot;layoutIndex&quot;&#58;1&#125;,&quot;addedFromPersistedData&quot;&#58;true,&quot;emphasis&quot;&#58;&#123;&#125;&#125;"><div data-sp-rte=""><p>Hej,</p><p>Nu är problemet löst! Alla betyg syns som de ska.&#160;</p><p>God jul!</p></div></div><div data-sp-canvascontrol="" data-sp-canvasdataversion="1.0" data-sp-controldata="&#123;&quot;controlType&quot;&#58;0,&quot;pageSettingsSlice&quot;&#58;&#123;&quot;isDefaultDescription&quot;&#58;true,&quot;isDefaultThumbnail&quot;&#58;true&#125;&#125;"></div></div>',
Body: '<div><div data-sp-canvascontrol="" data-sp-canvasdataversion="1.0" data-sp-controldata="&#123;&quot;controlType&quot;&#58;4,&quot;id&quot;&#58;&quot;1212fc8d-dd6b-408a-8d5d-9f1cc787efbb&quot;,&quot;position&quot;&#58;&#123;&quot;controlIndex&quot;&#58;2,&quot;sectionIndex&quot;&#58;1,&quot;sectionFactor&quot;&#58;12,&quot;zoneIndex&quot;&#58;1,&quot;layoutIndex&quot;&#58;1&#125;,&quot;addedFromPersistedData&quot;&#58;true,&quot;emphasis&quot;&#58;&#123;&#125;&#125;"><div data-sp-rte=""><p>Hej,</p><p>Nu är problemet löst! Alla betyg syns som de ska.&#160;</p><p>God jul!</p></div></div><div data-sp-canvascontrol="" data-sp-canvasdataversion="1.0" data-sp-controldata="&#123;&quot;controlType&quot;&#58;0,&quot;pageSettingsSlice&quot;&#58;&#123;&quot;isDefaultDescription&quot;&#58;true,&quot;isDefaultThumbnail&quot;&#58;true&#125;&#125;"></div></div>',
BodyNoHtml: null,
AuthorDisplayName: 'Eva-Lotta Rönnberg',
altText: 'Nyhetsbild. Bildtext ej tillgänglig.',
@ -132,7 +132,8 @@ describe('news', () => {
NewsListId: '3EC323A1-EA16-4D24-84C8-DAA49E76F9F4',
NewsItemId:
'elevstockholm.sharepoint.com,27892ACC-BA2E-4DEC-97B8-25F7098C3BF6,A239466A-9A52-42FF-8A3F-D94C342F2700_99',
Header: 'Problemet med att se betyg i bild, slöjd och teknik löst!',
Header:
'Problemet med att se betyg i bild, slöjd och teknik löst!',
PublicationDate: '/Date(1608304542000)/',
PubDateSE: '18 november 2021 16:15',
ModifiedDate: '/Date(1608304680000)/',
@ -143,8 +144,7 @@ describe('news', () => {
BannerImageUrl: 'A703552D-DBF3-45B0-8E67-6E062105A0C5.jpeg',
BannerImageGuid: 'A703552D-DBF3-45B0-8E67-6E062105A0C5',
BannerImageListId: 'FFBE49E9-BDE1-4C75-BA0E-D98D4E2FCF21',
Body:
'<div><div data-sp-canvascontrol="" data-sp-canvasdataversion="1.0" data-sp-controldata="&#123;&quot;controlType&quot;&#58;4,&quot;id&quot;&#58;&quot;1212fc8d-dd6b-408a-8d5d-9f1cc787efbb&quot;,&quot;position&quot;&#58;&#123;&quot;controlIndex&quot;&#58;2,&quot;sectionIndex&quot;&#58;1,&quot;sectionFactor&quot;&#58;12,&quot;zoneIndex&quot;&#58;1,&quot;layoutIndex&quot;&#58;1&#125;,&quot;addedFromPersistedData&quot;&#58;true,&quot;emphasis&quot;&#58;&#123;&#125;&#125;"><div data-sp-rte=""><p>Hej,</p><p>Nu är problemet löst! Alla betyg syns som de ska.&#160;</p><p>God jul!</p></div></div><div data-sp-canvascontrol="" data-sp-canvasdataversion="1.0" data-sp-controldata="&#123;&quot;controlType&quot;&#58;0,&quot;pageSettingsSlice&quot;&#58;&#123;&quot;isDefaultDescription&quot;&#58;true,&quot;isDefaultThumbnail&quot;&#58;true&#125;&#125;"></div></div>',
Body: '<div><div data-sp-canvascontrol="" data-sp-canvasdataversion="1.0" data-sp-controldata="&#123;&quot;controlType&quot;&#58;4,&quot;id&quot;&#58;&quot;1212fc8d-dd6b-408a-8d5d-9f1cc787efbb&quot;,&quot;position&quot;&#58;&#123;&quot;controlIndex&quot;&#58;2,&quot;sectionIndex&quot;&#58;1,&quot;sectionFactor&quot;&#58;12,&quot;zoneIndex&quot;&#58;1,&quot;layoutIndex&quot;&#58;1&#125;,&quot;addedFromPersistedData&quot;&#58;true,&quot;emphasis&quot;&#58;&#123;&#125;&#125;"><div data-sp-rte=""><p>Hej,</p><p>Nu är problemet löst! Alla betyg syns som de ska.&#160;</p><p>God jul!</p></div></div><div data-sp-canvascontrol="" data-sp-canvasdataversion="1.0" data-sp-controldata="&#123;&quot;controlType&quot;&#58;0,&quot;pageSettingsSlice&quot;&#58;&#123;&quot;isDefaultDescription&quot;&#58;true,&quot;isDefaultThumbnail&quot;&#58;true&#125;&#125;"></div></div>',
BodyNoHtml: null,
AuthorDisplayName: 'Eva-Lotta Rönnberg',
altText: 'Nyhetsbild. Bildtext ej tillgänglig.',
@ -206,8 +206,7 @@ describe('newsItem', () => {
BannerImageUrl: '123123.jpeg',
BannerImageGuid: '7a8142d9d9d54cf090e8457e4c629227',
BannerImageListId: 'a88c22e8-7094-4a71-b4fd-8792c62a7b4a',
Body:
'<div data-sp-rte=""><p><span><span><span>Kära vårdnadshavare!</span></span></span></p><p><span><span><span>I helgen är det avlusningsdagar! Ta <strong>tillfället </strong>i akt att luskamma ditt barn </span></span></span></p><p><span><span><span>Du finner all info du behöver på <a href="https&#58;//www.1177.se/sjukdomar--besvar/hud-har-och-naglar/harbotten-och-harsackar/huvudloss/" data-cke-saved-href="https&#58;//www.1177.se/sjukdomar--besvar/hud-har-och-naglar/harbotten-och-harsackar/huvudloss/" data-interception="on" title="https&#58;//www.1177.se/sjukdomar--besvar/hud-har-och-naglar/harbotten-och-harsackar/huvudloss/">1177 hemsida </a></span></span></span><span><span><span></span></span></span></p><p><span><span><span>Trevlig helg!</span></span></span></p><p><span><span><span></span></span></span></p></div>',
Body: '<div data-sp-rte=""><p><span><span><span>Kära vårdnadshavare!</span></span></span></p><p><span><span><span>I helgen är det avlusningsdagar! Ta <strong>tillfället </strong>i akt att luskamma ditt barn </span></span></span></p><p><span><span><span>Du finner all info du behöver på <a href="https&#58;//www.1177.se/sjukdomar--besvar/hud-har-och-naglar/harbotten-och-harsackar/huvudloss/" data-cke-saved-href="https&#58;//www.1177.se/sjukdomar--besvar/hud-har-och-naglar/harbotten-och-harsackar/huvudloss/" data-interception="on" title="https&#58;//www.1177.se/sjukdomar--besvar/hud-har-och-naglar/harbotten-och-harsackar/huvudloss/">1177 hemsida </a></span></span></span><span><span><span></span></span></span></p><p><span><span><span>Trevlig helg!</span></span></span></p><p><span><span><span></span></span></span></p></div>',
BodyNoHtml: null,
AuthorDisplayName: 'Tieto Evry',
altText: null,
@ -264,7 +263,6 @@ describe('newsItem', () => {
})
})
describe('newsItem', () => {
beforeEach(() => {
response = {
@ -288,8 +286,7 @@ describe('newsItem', () => {
BannerImageUrl: '123123.jpeg',
BannerImageGuid: '7a8142d9d9d54cf090e8457e4c629227',
BannerImageListId: 'a88c22e8-7094-4a71-b4fd-8792c62a7b4a',
Body:
'<i>italic</i> <b>bold</b> <em>emphasis </em><br/><strong>strong</strong><strong>nbsp&#160;</strong>',
Body: '<i>italic</i> <b>bold</b> <em>emphasis </em><br/><strong>strong</strong><strong>nbsp&#160;</strong>',
BodyNoHtml: null,
AuthorDisplayName: 'Tieto Evry',
altText: null,
@ -330,4 +327,4 @@ describe('newsItem', () => {
expect(item.body).toContain('**strong**')
expect(item.body).toContain('**nbsp**')
})
})
})

View File

@ -56,7 +56,7 @@ it(' notifications correctly', () => {
sender: 'Elevdokumentation',
url: 'https://elevdokumentation.stockholm.se/loa3/gradesStudent.do',
dateCreated: '2020-12-18T14:59:46.340Z',
dateModified: "2020-12-18T15:59:46.340Z",
dateModified: '2020-12-18T15:59:46.340Z',
category: null,
type: 'webnotify',
},

View File

@ -5,46 +5,46 @@ let response: EtjanstResponse
beforeEach(() => {
response = {
"Success": true,
"Error": null,
"Data": [
{
"Title": "Expedition",
"Name": null,
"Phone": "508 000 00",
"Email": "",
"SchoolName": "Påhittade skolan",
"ClassName": null
},
{
"Title": "Rektor",
"Name": "Andersson, Anna Bella Cecilia",
"Phone": "08-508 000 00",
"Email": "anna.anderssonn@edu.stockholm.se",
"SchoolName": null,
"ClassName": null
}
]
}
Success: true,
Error: null,
Data: [
{
Title: 'Expedition',
Name: null,
Phone: '508 000 00',
Email: '',
SchoolName: 'Påhittade skolan',
ClassName: null,
},
{
Title: 'Rektor',
Name: 'Andersson, Anna Bella Cecilia',
Phone: '08-508 000 00',
Email: 'anna.anderssonn@edu.stockholm.se',
SchoolName: null,
ClassName: null,
},
],
}
})
it('parses teachers correctly', () => {
expect(schoolContacts(response)).toEqual([
{
title: 'Expedition',
name: null,
phone: '508 000 00',
email: '',
schoolName: 'Påhittade skolan',
className: null
},
{
title: 'Rektor',
name: 'Andersson, Anna Bella Cecilia',
phone: '08-508 000 00',
email: 'anna.anderssonn@edu.stockholm.se',
schoolName: null,
className: null
}
title: 'Expedition',
name: null,
phone: '508 000 00',
email: '',
schoolName: 'Påhittade skolan',
className: null,
},
{
title: 'Rektor',
name: 'Andersson, Anna Bella Cecilia',
phone: '08-508 000 00',
email: 'anna.anderssonn@edu.stockholm.se',
schoolName: null,
className: null,
},
])
})

View File

@ -5,64 +5,64 @@ let response: EtjanstResponse
beforeEach(() => {
response = {
"Success": true,
"Error": null,
"Data": [
Success: true,
Error: null,
Data: [
{
"ID": 156735,
"BATCH": "GR",
"SIS_ID": "F154239A-EA4A-4C6C-A112-0B9581132E3D",
"USERNAME": "anna.andersson",
"SCHOOL_SIS_ID": "DE2E1293-0F40-4B91-9D91-1E99355DC257",
"EMAILADDRESS": null,
"STATUS": " GR",
"ERRORCODE": 0,
"FIRSTNAME": "Anna",
"LASTNAME": "Andersson",
"ACTIVE": true,
"TELWORK": "08 508 0000000"
ID: 156735,
BATCH: 'GR',
SIS_ID: 'F154239A-EA4A-4C6C-A112-0B9581132E3D',
USERNAME: 'anna.andersson',
SCHOOL_SIS_ID: 'DE2E1293-0F40-4B91-9D91-1E99355DC257',
EMAILADDRESS: null,
STATUS: ' GR',
ERRORCODE: 0,
FIRSTNAME: 'Anna',
LASTNAME: 'Andersson',
ACTIVE: true,
TELWORK: '08 508 0000000',
},
{
"ID": 156690,
"BATCH": "GR",
"SIS_ID": "9EC59FCA-80AD-4774-AABD-427040207E33",
"USERNAME": "gunnar.grymm",
"SCHOOL_SIS_ID": "DE2E1293-0F40-4B91-9D91-1E99355DC257",
"EMAILADDRESS": "gunnar.grymm@edu.stockholm.se",
"STATUS": " F",
"ERRORCODE": 0,
"FIRSTNAME": "Gunnar",
"LASTNAME": "Grymm",
"ACTIVE": true,
"TELWORK": null
}
]
}
ID: 156690,
BATCH: 'GR',
SIS_ID: '9EC59FCA-80AD-4774-AABD-427040207E33',
USERNAME: 'gunnar.grymm',
SCHOOL_SIS_ID: 'DE2E1293-0F40-4B91-9D91-1E99355DC257',
EMAILADDRESS: 'gunnar.grymm@edu.stockholm.se',
STATUS: ' F',
ERRORCODE: 0,
FIRSTNAME: 'Gunnar',
LASTNAME: 'Grymm',
ACTIVE: true,
TELWORK: null,
},
],
}
})
it('parses teachers correctly', () => {
expect(teachers(response)).toEqual([
{
id: 156735,
sisId: 'F154239A-EA4A-4C6C-A112-0B9581132E3D',
firstname: 'Anna',
lastname: 'Andersson',
email: null,
phoneWork: '08 508 0000000',
active: true,
status: ' GR',
timeTableAbbreviation: 'AAN'
},
{
id: 156690,
sisId: '9EC59FCA-80AD-4774-AABD-427040207E33',
firstname: 'Gunnar',
lastname: 'Grymm',
email: 'gunnar.grymm@edu.stockholm.se',
phoneWork: null,
active: true,
status: ' F',
timeTableAbbreviation: 'GGR'
},
id: 156735,
sisId: 'F154239A-EA4A-4C6C-A112-0B9581132E3D',
firstname: 'Anna',
lastname: 'Andersson',
email: null,
phoneWork: '08 508 0000000',
active: true,
status: ' GR',
timeTableAbbreviation: 'AAN',
},
{
id: 156690,
sisId: '9EC59FCA-80AD-4774-AABD-427040207E33',
firstname: 'Gunnar',
lastname: 'Grymm',
email: 'gunnar.grymm@edu.stockholm.se',
phoneWork: null,
active: true,
status: ' F',
timeTableAbbreviation: 'GGR',
},
])
})

View File

@ -18,7 +18,7 @@ describe('Timetable', () => {
italic: false,
id: 9,
parentId: 6,
type: 'ClockAxisBox'
type: 'ClockAxisBox',
},
{
x: 11,
@ -30,7 +30,7 @@ describe('Timetable', () => {
italic: false,
id: 12,
parentId: 6,
type: 'ClockAxisBox'
type: 'ClockAxisBox',
},
],
boxList: [
@ -44,7 +44,7 @@ describe('Timetable', () => {
id: 0,
parentId: null,
type: 'Footer',
lessonGuids: null
lessonGuids: null,
},
{
x: 56,
@ -56,7 +56,7 @@ describe('Timetable', () => {
id: 1,
parentId: null,
type: 'HeadingDay',
lessonGuids: null
lessonGuids: null,
},
],
lineList: [
@ -68,7 +68,7 @@ describe('Timetable', () => {
color: '#000000',
id: 7,
parentId: 6,
type: 'ClockAxisGradiation'
type: 'ClockAxisGradiation',
},
{
p1x: 0,
@ -78,35 +78,27 @@ describe('Timetable', () => {
color: '#000000',
id: 8,
parentId: 6,
type: 'ClockAxisGradiation'
type: 'ClockAxisGradiation',
},
],
lessonInfo: [
{
guidId: 'N2FjMDc1NjYtZmM2Yy0wZDQyLTY3M2YtZWI5NGNiZDA3ZGU4',
texts: [
'Lunch',
'',
'Ö5'
],
texts: ['Lunch', '', 'Ö5'],
timeStart: '11:40:00',
timeEnd: '12:05:00',
dayOfWeekNumber: 1,
blockName: ''
blockName: '',
},
{
guidId: 'ZTQ1NWE0N2EtNzAwOS0wZTAzLTQ1ZDYtNTA1NWI4Y2JhNDYw',
texts: [
'BL',
'KUr',
'221'
],
texts: ['BL', 'KUr', '221'],
timeStart: '09:40:00',
timeEnd: '11:35:00',
dayOfWeekNumber: 1,
blockName: 'block'
blockName: 'block',
},
]
],
},
exception: null,
validation: [],
@ -116,7 +108,9 @@ describe('Timetable', () => {
it('parses basic timeTableEntry data correctly', () => {
const entry = timetableEntry(response.data.lessonInfo[1], 2021, 15, 'sv')
expect(entry.id).toEqual('ZTQ1NWE0N2EtNzAwOS0wZTAzLTQ1ZDYtNTA1NWI4Y2JhNDYw')
expect(entry.id).toEqual(
'ZTQ1NWE0N2EtNzAwOS0wZTAzLTQ1ZDYtNTA1NWI4Y2JhNDYw'
)
expect(entry.code).toEqual('BL')
expect(entry.name).toEqual('Bild')
expect(entry.teacher).toEqual('KUr')
@ -142,8 +136,12 @@ describe('Timetable', () => {
const table = timetable(response, 2021, 15, 'sv')
expect(table).toHaveLength(2)
expect(table[0].id).toEqual('N2FjMDc1NjYtZmM2Yy0wZDQyLTY3M2YtZWI5NGNiZDA3ZGU4')
expect(table[1].id).toEqual('ZTQ1NWE0N2EtNzAwOS0wZTAzLTQ1ZDYtNTA1NWI4Y2JhNDYw')
expect(table[0].id).toEqual(
'N2FjMDc1NjYtZmM2Yy0wZDQyLTY3M2YtZWI5NGNiZDA3ZGU4'
)
expect(table[1].id).toEqual(
'ZTQ1NWE0N2EtNzAwOS0wZTAzLTQ1ZDYtNTA1NWI4Y2JhNDYw'
)
})
})
})

View File

@ -1,7 +1,6 @@
import { MenuItem, MenuList, toMarkdown } from '@skolplattformen/api'
import { etjanst } from './etjanst'
export const menuItem = ({ title, description }: any): MenuItem => ({
title,
description: toMarkdown(description),
@ -24,7 +23,7 @@ export const menuList = (data: any): MenuItem[] => {
const menuItemsFS = [
{
title: `Måndag - Vecka ${currentWeek.week}`,
description: toMarkdown(currentWeek.mon) ,
description: toMarkdown(currentWeek.mon),
},
{
title: `Tisdag - Vecka ${currentWeek.week}`,

View File

@ -1,7 +1,6 @@
import { NewsItem, parseDate, toMarkdown } from '@skolplattformen/api';
import { NewsItem, parseDate, toMarkdown } from '@skolplattformen/api'
import { etjanst } from './etjanst'
const IMAGE_HOST =
'https://etjanst.stockholm.se/Vardnadshavare/inloggad2/NewsBanner?url='
@ -30,8 +29,8 @@ export const newsItem = ({
// Fixes https://github.com/kolplattformen/skolplattformen-app/issues/525
const toNonEmptyMarkdownString = (str: string): string => {
const res = toMarkdown(str);
if(res?.length == 0 ) return ' '
const res = toMarkdown(str)
if (res?.length == 0) return ' '
return res
}

View File

@ -25,7 +25,10 @@ export const notification = ({
type,
})
const notificationsSort = (item1: Notification, item2: Notification): number => {
const notificationsSort = (
item1: Notification,
item2: Notification
): number => {
const m1 = item1.dateModified || item1.dateCreated
const m2 = item2.dateModified || item2.dateCreated
return m1 < m2 ? 1 : -1

View File

@ -20,19 +20,18 @@ export const scheduleItem = ({
})
export const schedule = (data: any): ScheduleItem[] => {
try{
try {
const scheduleData = etjanst(data)
const mapped = scheduleData.map(scheduleItem)
return mapped
}
catch(e){
} catch (e) {
if (e instanceof Error) {
// If this happens the child has no schedule
// If this happens the child has no schedule
// It is the same on the official web
// Instead of retrying and spamming errors - lets return en empty array
if(e.message === 'A task was canceled.'){
if (e.message === 'A task was canceled.') {
return new Array<ScheduleItem>()
}
}
}
throw e
}

View File

@ -2,21 +2,20 @@ import { etjanst } from './etjanst'
import { SchoolContact } from '@skolplattformen/api'
export const schoolContact = ({
title,
name,
phone,
email,
schoolName,
className,
title,
name,
phone,
email,
schoolName,
className,
}: any): SchoolContact => ({
title,
name,
phone,
email,
schoolName,
className,
title,
name,
phone,
email,
schoolName,
className,
})
export const schoolContacts = (data: any): SchoolContact[] =>
etjanst(data).map(schoolContact)

View File

@ -1,8 +1,8 @@
import { etjanst } from './etjanst'
import { Teacher } from '@skolplattformen/api'
const abbreviate = (firstname?: string, lastname?: string): string =>
`${firstname?.substr(0,1)}${lastname?.substr(0,2)}`.toUpperCase()
const abbreviate = (firstname?: string, lastname?: string): string =>
`${firstname?.substr(0, 1)}${lastname?.substr(0, 2)}`.toUpperCase()
export const teacher = ({
id,
@ -22,8 +22,7 @@ export const teacher = ({
phoneWork: telwork,
active,
status,
timeTableAbbreviation: abbreviate(firstname, lastname)
timeTableAbbreviation: abbreviate(firstname, lastname),
})
export const teachers = (data: any): Teacher[] =>
etjanst(data).map(teacher)
export const teachers = (data: any): Teacher[] => etjanst(data).map(teacher)

View File

@ -85,8 +85,8 @@ export const timetable = (
throw new Error(response.error)
}
if(!response.data.lessonInfo){
throw new Error("Empty lessonInfo received")
if (!response.data.lessonInfo) {
throw new Error('Empty lessonInfo received')
}
return response.data.lessonInfo.map((entry) =>

View File

@ -1,4 +1,4 @@
import { User } from "@skolplattformen/api";
import { User } from '@skolplattformen/api'
export const user = ({
socialSecurityNumber,

View File

@ -29,13 +29,19 @@ export default class AutoQueue extends Queue {
}
public async dequeue() {
if (this.runningTasks >= this.maxConcurrentTasks) { return false }
if (this.runningTasks >= this.maxConcurrentTasks) {
return false
}
if (this.isPaused) { return false }
if (this.isPaused) {
return false
}
const item = super.dequeue()
if (!item) { return false }
if (!item) {
return false
}
try {
this.runningTasks += 1
@ -60,13 +66,15 @@ export default class AutoQueue extends Queue {
public async start() {
this.isPaused = false
// eslint-disable-next-line no-await-in-loop
while (await this.dequeue()) {
// do nothing
}
}
public get runningTaskCount() { return this.runningTasks }
public get runningTaskCount() {
return this.runningTasks
}
public getQueueStatus() {
return this.queueStatus

View File

@ -1,11 +1,19 @@
export class Queue {
private items: any[]
constructor() { this.items = [] }
constructor() {
this.items = []
}
enqueue(item : any) { this.items.push(item) }
enqueue(item: any) {
this.items.push(item)
}
dequeue() { return this.items.shift() }
dequeue() {
return this.items.shift()
}
get size() { return this.items.length }
get size() {
return this.items.length
}
}

View File

@ -2,12 +2,12 @@ import AutoQueue from './autoQueue'
import RoundRobinArray from './roundRobinArray'
export interface QueueEntry {
id : string
queue : AutoQueue
id: string
queue: AutoQueue
}
function delay(time : any) {
return new Promise(resolve => setTimeout(resolve, time))
function delay(time: any) {
return new Promise((resolve) => setTimeout(resolve, time))
}
/**
@ -17,15 +17,15 @@ function delay(time : any) {
* Why? The external api uses state where the child must be selected
* before any calls to News etc can be done.
*
*/
*/
export default class QueueFetcher {
private queues: RoundRobinArray<QueueEntry>
private currentRunningQueue : QueueEntry | undefined
private currentRunningQueue: QueueEntry | undefined
private changeChildFunc : (childId : string) => Promise<any>
private changeChildFunc: (childId: string) => Promise<any>
private lastChildId = ''
private lastChildId = ''
private scheduleTimeout: any
@ -40,7 +40,7 @@ export default class QueueFetcher {
* @param changeChildFunc function that is called to change the current
* selected child on the server
*/
constructor(changeChildFunc : (childId : string) => Promise<any>) {
constructor(changeChildFunc: (childId: string) => Promise<any>) {
this.changeChildFunc = changeChildFunc
this.queues = new RoundRobinArray(new Array<QueueEntry>())
}
@ -54,7 +54,7 @@ export default class QueueFetcher {
* @returns a Promise that resolves when the Promise created by the func is resolved
* (i.e. is dequeued and executed)
*/
public async fetch<T>(func : () => Promise<T>, id : string) : Promise<T> {
public async fetch<T>(func: () => Promise<T>, id: string): Promise<T> {
if (!this.queues.array.some((e) => e.id === id)) {
const newQueue = new AutoQueue(10)
this.queues.add({ id, queue: newQueue })
@ -73,7 +73,9 @@ export default class QueueFetcher {
return promise
}
public get Queues() { return this.queues.array }
public get Queues() {
return this.queues.array
}
/**
* Method to schedule next queue
@ -81,10 +83,9 @@ export default class QueueFetcher {
*/
async schedule() {
// Debug print info for all queues
this.queues.array.forEach(({ id: childId, queue }) => this.debug(
'Schedule: ',
childId, '=>', queue.getQueueInfo(),
))
this.queues.array.forEach(({ id: childId, queue }) =>
this.debug('Schedule: ', childId, '=>', queue.getQueueInfo())
)
if (this.queues.size === 0) {
this.debug('No queues created yet')
@ -130,11 +131,10 @@ export default class QueueFetcher {
})
}
private async runNext(queueToRun : QueueEntry) {
private async runNext(queueToRun: QueueEntry) {
const { id: childId, queue } = queueToRun
this.debug('About to run', childId, queue.getQueueInfo())
if (this.lastChildId === childId) {
this.debug('Child already selected, skipping select call')
} else {
@ -154,20 +154,21 @@ export default class QueueFetcher {
this.scheduleTimeout = setTimeout(async () => this.schedule(), 3000)
}
private findNextQueueToRun() : QueueEntry | undefined {
private findNextQueueToRun(): QueueEntry | undefined {
// Iterate all queues and look for next queue with work to do
for (let i = 0; i < this.queues.size; i += 1) {
const { id: childId, queue } = this.queues.next()
// If queue has items to execute, return it
if (queue.size > 0 || queue.runningTaskCount > 0) return { id: childId, queue }
if (queue.size > 0 || queue.runningTaskCount > 0)
return { id: childId, queue }
}
// Nothing more to do
return undefined
}
private debug(message : any, ...args : any[]) {
private debug(message: any, ...args: any[]) {
if (this.verboseDebug) {
console.debug(message, ...args)
}

View File

@ -3,7 +3,7 @@ export default class RoundRobinArray<T> {
array: T[]
constructor(array : Array<T>, index?: number | undefined) {
constructor(array: Array<T>, index?: number | undefined) {
this.index = index || 0
if (array === undefined || array === null) {
@ -20,11 +20,15 @@ export default class RoundRobinArray<T> {
return this.array[this.index]
}
add(item : T) {
add(item: T) {
this.array.push(item)
}
get first() { return this.array[0] }
get first() {
return this.array[0]
}
get size() { return this.array.length }
get size() {
return this.array.length
}
}

View File

@ -1,14 +1,19 @@
import QueueFetcher from './queue/queueFetcher'
import {Fetcher, RequestInit, Response } from '@skolplattformen/api'
import { Fetcher, RequestInit, Response } from '@skolplattformen/api'
export default function queueFetcherWrapper(fetch: Fetcher,
changeChildFunc: ((childId: string) => Promise<Response>)) : Fetcher {
export default function queueFetcherWrapper(
fetch: Fetcher,
changeChildFunc: (childId: string) => Promise<Response>
): Fetcher {
const queue = new QueueFetcher(changeChildFunc)
queue.verboseDebug = false
return async (name: string, url: string, init: RequestInit = { headers: {} }, childId? : string)
: Promise<Response> => {
return async (
name: string,
url: string,
init: RequestInit = { headers: {} },
childId?: string
): Promise<Response> => {
if (childId === undefined) {
return fetch(name, url, init)
}

View File

@ -1,23 +1,27 @@
// BankId
export const login = (personalNumber?: string) => {
const baseUrl = 'https://login003.stockholm.se/NECSadcmbid/authenticate/NECSadcmbid?TARGET=-SM-HTTPS%3a%2f%2flogin001%2estockholm%2ese%2fNECSadc%2fmbid%2fb64startpage%2ejsp%3fstartpage%3daHR0cHM6Ly9ldGphbnN0LnN0b2NraG9sbS5zZS92YXJkbmFkc2hhdmFyZS9pbmxvZ2dhZDIvaGVt'
const optionalPersonalNumber = personalNumber === undefined ? '' : `&personalNumber=${personalNumber}`
const baseUrl =
'https://login003.stockholm.se/NECSadcmbid/authenticate/NECSadcmbid?TARGET=-SM-HTTPS%3a%2f%2flogin001%2estockholm%2ese%2fNECSadc%2fmbid%2fb64startpage%2ejsp%3fstartpage%3daHR0cHM6Ly9ldGphbnN0LnN0b2NraG9sbS5zZS92YXJkbmFkc2hhdmFyZS9pbmxvZ2dhZDIvaGVt'
const optionalPersonalNumber =
personalNumber === undefined ? '' : `&personalNumber=${personalNumber}`
return `${baseUrl}&initialize=bankid${optionalPersonalNumber}&_=${Date.now()}`
}
export const loginStatus = (order: string) =>
export const loginStatus = (order: string) =>
`https://login003.stockholm.se/NECSadcmbid/authenticate/NECSadcmbid?TARGET=-SM-HTTPS%3a%2f%2flogin001%2estockholm%2ese%2fNECSadc%2fmbid%2fb64startpage%2ejsp%3fstartpage%3daHR0cHM6Ly9ldGphbnN0LnN0b2NraG9sbS5zZS92YXJkbmFkc2hhdmFyZS9pbmxvZ2dhZDIvaGVt&verifyorder=${order}&_=${Date.now()}`
export const loginCookie =
export const loginCookie =
'https://login003.stockholm.se/NECSadcmbid/authenticate/SiteMinderAuthADC?TYPE=33554433&REALMOID=06-42f40edd-0c5b-4dbc-b714-1be1e907f2de&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=IfNE0iMOtzq2TcxFADHylR6rkmFtwzoxRKh5nRMO9NBqIxHrc38jFyt56FASdxk1&TARGET=-SM-HTTPS%3a%2f%2flogin001%2estockholm%2ese%2fNECSadc%2fmbid%2fb64startpage%2ejsp%3fstartpage%3daHR0cHM6Ly9ldGphbnN0LnN0b2NraG9sbS5zZS92YXJkbmFkc2hhdmFyZS9pbmxvZ2dhZDIvR2V0Q2hpbGRyZW4%3d'
// Freja
export const frejaLogin = 'https://login003.stockholm.se/NECSadcfreja/authenticate/NECSadcfreja?action=init&return_url=https%3A%2F%2Flogin003.stockholm.se%2FNECSadcfreja%2Fauthenticate%2FNECSadcfreja'
export const frejaLoginStatus = 'https://login003.stockholm.se/NECSadcfreja/authenticate/NECSadcfreja?TYPE=33554433&REALMOID=06-89cf916c-9764-45fa-8690-eaf3fe9282bc&GUID=1&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=IfNE0iMOtzq2TcxFADHylR6rkmFtwzoxRKh5nRMO9NBqIxHrc38jFyt56FASdxk1&TARGET=-SM-HTTPS%3a%2f%2flogin001%2estockholm%2ese%2fNECSadc%2ffreja%2fb64startpage%2ejsp%3fstartpage%3daHR0cHM6Ly9ldGphbnN0LnN0b2NraG9sbS5zZS92YXJkbmFkc2hhdmFyZS9pbmxvZ2dhZDIvaGVt&action=checkstatus'
export const frejaReturnUrl = 'https://login003.stockholm.se/NECSadcfreja/authenticate/NECSadcfreja?TYPE=33554433&REALMOID=06-89cf916c-9764-45fa-8690-eaf3fe9282bc&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=IfNE0iMOtzq2TcxFADHylR6rkmFtwzoxRKh5nRMO9NBqIxHrc38jFyt56FASdxk1&TARGET=-SM-HTTPS%3a%2f%2flogin001%2estockholm%2ese%2fNECSadc%2ffreja%2fb64startpage%2ejsp%3fstartpage%3daHR0cHM6Ly9ldGphbnN0LnN0b2NraG9sbS5zZS92YXJkbmFkc2hhdmFyZS9pbmxvZ2dhZDIvT3ZlcnNpa3Q%3d'
export const frejaLoginCookie = 'https://login003.stockholm.se/NECSadcfreja/authenticate/SiteMinderAuthADCFREJA?TYPE=33554433&REALMOID=06-89cf916c-9764-45fa-8690-eaf3fe9282bc&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=IfNE0iMOtzq2TcxFADHylR6rkmFtwzoxRKh5nRMO9NBqIxHrc38jFyt56FASdxk1&TARGET=-SM-HTTPS%3a%2f%2flogin001%2estockholm%2ese%2fNECSadc%2ffreja%2fb64startpage%2ejsp%3fstartpage%3daHR0cHM6Ly9ldGphbnN0LnN0b2NraG9sbS5zZS92YXJkbmFkc2hhdmFyZS9pbmxvZ2dhZDIvT3ZlcnNpa3Q%3d'
export const frejaLogin =
'https://login003.stockholm.se/NECSadcfreja/authenticate/NECSadcfreja?action=init&return_url=https%3A%2F%2Flogin003.stockholm.se%2FNECSadcfreja%2Fauthenticate%2FNECSadcfreja'
export const frejaLoginStatus =
'https://login003.stockholm.se/NECSadcfreja/authenticate/NECSadcfreja?TYPE=33554433&REALMOID=06-89cf916c-9764-45fa-8690-eaf3fe9282bc&GUID=1&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=IfNE0iMOtzq2TcxFADHylR6rkmFtwzoxRKh5nRMO9NBqIxHrc38jFyt56FASdxk1&TARGET=-SM-HTTPS%3a%2f%2flogin001%2estockholm%2ese%2fNECSadc%2ffreja%2fb64startpage%2ejsp%3fstartpage%3daHR0cHM6Ly9ldGphbnN0LnN0b2NraG9sbS5zZS92YXJkbmFkc2hhdmFyZS9pbmxvZ2dhZDIvaGVt&action=checkstatus'
export const frejaReturnUrl =
'https://login003.stockholm.se/NECSadcfreja/authenticate/NECSadcfreja?TYPE=33554433&REALMOID=06-89cf916c-9764-45fa-8690-eaf3fe9282bc&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=IfNE0iMOtzq2TcxFADHylR6rkmFtwzoxRKh5nRMO9NBqIxHrc38jFyt56FASdxk1&TARGET=-SM-HTTPS%3a%2f%2flogin001%2estockholm%2ese%2fNECSadc%2ffreja%2fb64startpage%2ejsp%3fstartpage%3daHR0cHM6Ly9ldGphbnN0LnN0b2NraG9sbS5zZS92YXJkbmFkc2hhdmFyZS9pbmxvZ2dhZDIvT3ZlcnNpa3Q%3d'
export const frejaLoginCookie =
'https://login003.stockholm.se/NECSadcfreja/authenticate/SiteMinderAuthADCFREJA?TYPE=33554433&REALMOID=06-89cf916c-9764-45fa-8690-eaf3fe9282bc&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=IfNE0iMOtzq2TcxFADHylR6rkmFtwzoxRKh5nRMO9NBqIxHrc38jFyt56FASdxk1&TARGET=-SM-HTTPS%3a%2f%2flogin001%2estockholm%2ese%2fNECSadc%2ffreja%2fb64startpage%2ejsp%3fstartpage%3daHR0cHM6Ly9ldGphbnN0LnN0b2NraG9sbS5zZS92YXJkbmFkc2hhdmFyZS9pbmxvZ2dhZDIvT3ZlcnNpa3Q%3d'
const urlLoggedIn = `https://etjanst.stockholm.se/vardnadshavare/inloggad2`
@ -47,7 +51,7 @@ export const newsDetails = (childId: string, newsId: string) =>
export const image = (url: string) => `${urlLoggedIn}/NewsBanner?url=${url}`
export const notifications = (childId: string) =>
`${urlLoggedIn}/notifications/getnotifications?childId=${childId}`
`${urlLoggedIn}/notifications/getnotifications?childId=${childId}`
export const menuRss = (childId: string) =>
`${urlLoggedIn}/Matsedel/GetMatsedelRSS?childId=${childId}`
@ -83,15 +87,21 @@ export const createItemConfig =
// Skola24
export const ssoRequestUrl = (targetSystem: string) =>
`https://fnsservicesso1.stockholm.se/sso-ng/saml-2.0/authenticate?customer=https://login001.stockholm.se&targetsystem=${targetSystem}`
`https://fnsservicesso1.stockholm.se/sso-ng/saml-2.0/authenticate?customer=https://login001.stockholm.se&targetsystem=${targetSystem}`
export const ssoResponseUrl = 'https://login001.stockholm.se/affwebservices/public/saml2sso'
export const samlResponseUrl = 'https://fnsservicesso1.stockholm.se/sso-ng/saml-2.0/response'
export const ssoResponseUrl =
'https://login001.stockholm.se/affwebservices/public/saml2sso'
export const samlResponseUrl =
'https://fnsservicesso1.stockholm.se/sso-ng/saml-2.0/response'
export const timetables = 'https://fns.stockholm.se/ng/api/services/skola24/get/personal/timetables'
export const renderKey = 'https://fns.stockholm.se/ng/api/get/timetable/render/key'
export const timetables =
'https://fns.stockholm.se/ng/api/services/skola24/get/personal/timetables'
export const renderKey =
'https://fns.stockholm.se/ng/api/get/timetable/render/key'
export const timetable = 'https://fns.stockholm.se/ng/api/render/timetable'
export const topologyConfigUrl = 'https://fantomenkrypto.vercel.app/api/getConfig'
export const topologyConfigUrl =
'https://fantomenkrypto.vercel.app/api/getConfig'
export const selectChild = 'https://etjanst.stockholm.se/vardnadshavare/inloggad2/SelectChild'
export const selectChild =
'https://etjanst.stockholm.se/vardnadshavare/inloggad2/SelectChild'

View File

@ -1 +1 @@
import '@testing-library/jest-native/extend-expect';
import '@testing-library/jest-native/extend-expect'

View File

@ -70,7 +70,6 @@ export const apiMiddleware: IMiddleware =
}
}
} catch (err) {
// eslint-disable-next-line no-console
console.error(err)
}
return next(action)
@ -105,7 +104,6 @@ export const cacheMiddleware: IMiddleware =
}
}
} catch (err) {
// eslint-disable-next-line no-console
console.error(err)
}
return next(action)

View File

@ -54,7 +54,6 @@ export const ApiProvider: TApiProvider = ({
api.off('login', handler)
api.off('logout', handler)
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [api])
return (

View File

@ -33,7 +33,6 @@ const appReducer = combineReducers({
})
const rootReducer: typeof appReducer = (state, action) => {
if (action.type === 'CLEAR') {
// eslint-disable-next-line no-param-reassign
state = undefined
}
return appReducer(state, action)