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"], "ignorePatterns": ["!**/*", "public", ".cache", "node_modules"],
"overrides": [ "overrides": [
{ {

View File

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

View File

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

View File

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

View File

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

View File

@ -10,9 +10,9 @@ const week = getDate().weekNumber.toString()
const [child1, child2] = children() const [child1, child2] = children()
const menuData = new Map<string, MenuItem[]>([ const menuData = new Map<string, MenuItem[]>([
[ [
child1.id, child1.id,
[ [
{ {
title: 'Måndag - Vecka ' + week, title: 'Måndag - Vecka ' + week,
description: 'Kebabgryta ris<br/>Ratatouille med kikärter', 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, 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" 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, title: 'Tisdag - Vecka ' + week,
description: "Örtomlett med potatis , medelhavsost och olivtapenad" description: 'Örtomlett med potatis , medelhavsost och olivtapenad',
}, },
{ {
title: "Onsdag - Vecka " + week, 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" 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, title: 'Torsdag - Vecka ' + week,
description: "Panerad flundra med dansk remoulad och koktåotatis<br/>morot och linsbiff med danska remoulad och koktpotatis" description:
'Panerad flundra med dansk remoulad och koktåotatis<br/>morot och linsbiff med danska remoulad och koktpotatis',
}, },
{ {
title: "Fredag - Vecka " + week, 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" 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 [child1, child2] = children()
const newsData = new Map<string, NewsItem[]>([ const newsData = new Map<string, NewsItem[]>([
[child1.id, [ [
{ child1.id,
id: 'asdfasdfasdfw', [
author: 'Vaktmästare Persson', {
header: 'Brandsläckare!', id: 'asdfasdfasdfw',
intro: 'Idag hade vi en incident med en brandsläckare.', author: 'Vaktmästare Persson',
body: header: 'Brandsläckare!',
'## 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.', intro: 'Idag hade vi en incident med en brandsläckare.',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg', 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.',
fullImageUrl: imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
'https://cdn.breakit.se/assets/article/6607f9b923edb6f85aa4417bab43c0f8.jpg?d=980x500', fullImageUrl:
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.', 'https://cdn.breakit.se/assets/article/6607f9b923edb6f85aa4417bab43c0f8.jpg?d=980x500',
published: dates.twoDaysAgo.toISO(), imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
modified: dates.twoDaysAgo.plus({ hours: 1 }).toISO(), published: dates.twoDaysAgo.toISO(),
}, modified: dates.twoDaysAgo.plus({ hours: 1 }).toISO(),
{ },
id: 'asdfabbuasdfs', {
author: 'Ada L.', id: 'asdfabbuasdfs',
header: 'Bygg din egen app', author: 'Ada L.',
intro: 'Denna vecka bygger vi appar!', header: 'Bygg din egen app',
body: intro: 'Denna vecka bygger vi appar!',
'## 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.', 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', imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl: fullImageUrl:
'https://live.staticflickr.com/4063/4369776892_5cd42d27ba.jpg', 'https://live.staticflickr.com/4063/4369776892_5cd42d27ba.jpg',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.', imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.oneWeekAgo.toISO(), published: dates.oneWeekAgo.toISO(),
modified: dates.oneWeekAgo.toISO(), modified: dates.oneWeekAgo.toISO(),
}, },
{ {
id: 'asdfasdfasdfs', id: 'asdfasdfasdfs',
author: 'Magister Svensson', author: 'Magister Svensson',
header: 'Läxor vecka 6.', header: 'Läxor vecka 6.',
intro: 'Alla elever måste göra sina läxor!', intro: 'Alla elever måste göra sina läxor!',
body: 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',
'## 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',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg', fullImageUrl:
fullImageUrl: 'https://www.mitti.se/_internal/cimg!0/ejf8efxee735ymm8tm40q3hhkl36sdt.jpeg',
'https://www.mitti.se/_internal/cimg!0/ejf8efxee735ymm8tm40q3hhkl36sdt.jpeg', imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.', published: dates.oneWeekAgo.toISO(),
published: dates.oneWeekAgo.toISO(), modified: dates.oneWeekAgo.minus({ hours: 3 }).toISO(),
modified: dates.oneWeekAgo.minus({ hours: 3 }).toISO(), },
}, ],
] ],
],
[child2.id, [ [
{ child2.id,
id: 'asdfasdfasdfa', [
author: 'Rektor Gustavsson', {
header: 'Välkommen till skolan!', id: 'asdfasdfasdfa',
intro: author: 'Rektor Gustavsson',
'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.', header: 'Välkommen till skolan!',
body: intro:
'## 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.', '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.',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg', 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.',
fullImageUrl: imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
'https://timbro.se/app/uploads/2020/10/broman-skolplattformen-1280x752.jpg', fullImageUrl:
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.', 'https://timbro.se/app/uploads/2020/10/broman-skolplattformen-1280x752.jpg',
published: dates.oneWeekAgo.toISO(), imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
modified: dates.oneWeekAgo.toISO(), published: dates.oneWeekAgo.toISO(),
}, modified: dates.oneWeekAgo.toISO(),
{ },
id: 'asdfabbuasdfs', {
author: 'Ada L.', id: 'asdfabbuasdfs',
header: 'App, App, App', author: 'Ada L.',
intro: 'Denna vecka bygger vi appar!', header: 'App, App, App',
body: intro: 'Denna vecka bygger vi appar!',
'## 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.', 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', imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
fullImageUrl: fullImageUrl:
'https://live.staticflickr.com/4063/4369776892_5cd42d27ba.jpg', 'https://live.staticflickr.com/4063/4369776892_5cd42d27ba.jpg',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.', imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
published: dates.fourDaysAgo.toISO(), published: dates.fourDaysAgo.toISO(),
modified: dates.fourDaysAgo.plus({minutes: 45}).toISO(), modified: dates.fourDaysAgo.plus({ minutes: 45 }).toISO(),
}, },
{ {
id: 'asdfasdfasdfs', id: 'asdfasdfasdfs',
author: 'Magister Svensson', author: 'Magister Svensson',
header: 'Läxor i veckan', header: 'Läxor i veckan',
intro: 'Alla elever måste göra sina läxor!', intro: 'Alla elever måste göra sina läxor!',
body: 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',
'## 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',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg', fullImageUrl:
fullImageUrl: 'https://www.mitti.se/_internal/cimg!0/ejf8efxee735ymm8tm40q3hhkl36sdt.jpeg',
'https://www.mitti.se/_internal/cimg!0/ejf8efxee735ymm8tm40q3hhkl36sdt.jpeg', imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.', published: dates.oneWeekAgo.toISO(),
published: dates.oneWeekAgo.toISO(), modified: dates.oneWeekAgo.toISO(),
modified: dates.oneWeekAgo.toISO(), },
}, {
{ id: 'asdfasdfasdfd',
id: 'asdfasdfasdfd', author: 'Information från Förskoleklass',
author: 'Information från Förskoleklass', header: 'Vinteraktiviteter',
header: 'Vinteraktiviteter', intro:
intro: 'Vi kommer efter att förskoleklassen är slut arrangera olika vinteraktiviteter genom fridtidsverksamheten.',
'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.',
body: imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
'## 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.', fullImageUrl: 'https://unsplash.com/photos/yB_aiAWkm40',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg', imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
fullImageUrl: 'https://unsplash.com/photos/yB_aiAWkm40', published: dates.oneWeekAgo.minus({ weeks: 2 }).toISO(),
imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.', modified: dates.oneWeekAgo.minus({ weeks: 1 }).toISO(),
published: dates.oneWeekAgo.minus({weeks: 2}).toISO(), },
modified: dates.oneWeekAgo.minus({weeks: 1}).toISO(), {
}, id: 'asdfasdfasdfdsa',
{ author: 'Köket',
id: 'asdfasdfasdfdsa', header: 'Ekologisk vecka i matsalen',
author: 'Köket', intro: 'Ekologiska veckan i matsalen vecka 11',
header: 'Ekologisk vecka i matsalen', 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.',
intro: 'Ekologiska veckan i matsalen vecka 11', imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
body: fullImageUrl: 'https://unsplash.com/photos/7K17MvT8qBg',
'## 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.', imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg', published: dates.oneWeekAgo.minus({ weeks: 3 }).toISO(),
fullImageUrl: 'https://unsplash.com/photos/7K17MvT8qBg', modified: dates.oneWeekAgo.minus({ days: 2 }).toISO(),
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)',
id: 'asdfasdfasdfbvdsa', intro:
author: 'Vaktmästaren', 'Ännu en gång har vi råka ut för skadegörelse i korridorerna vid åk 5',
header: 'Klotter i korridoren (igen)', 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! ',
intro: imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg',
'Ännu en gång har vi råka ut för skadegörelse i korridorerna vid åk 5', fullImageUrl: 'https://unsplash.com/photos/SkbEZ16VywM',
body: imageAltText: 'Nyhetsbild. Bildtext ej tillgänglig.',
'## 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! ', published: dates.oneWeekAgo.minus({ weeks: 4 }).toISO(),
imageUrl: '6607f9b923edb6f85aa4417bab43c0f8.jpg', modified: dates.oneWeekAgo.minus({ weeks: 2 }).toISO(),
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' 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[]>([ const schoolContactData = new Map<string, SchoolContact[]>([
[ [
child1.id, [ child1.id,
[
{ {
title: "Expedition", title: 'Expedition',
name: undefined, name: undefined,
phone: "508 000 00", phone: '508 000 00',
email: "", email: '',
schoolName: "Vallaskolan", schoolName: 'Vallaskolan',
className: '', className: '',
}, },
{ {
title: "Rektor", title: 'Rektor',
name: "Alvar Sträng", name: 'Alvar Sträng',
phone: "08-50800001", phone: '08-50800001',
email: "alvar.strang@edu.stockholm.se", email: 'alvar.strang@edu.stockholm.se',
schoolName: '', schoolName: '',
className: '', className: '',
} },
]], ],
],
[ [
child2.id, [ child2.id,
{ [
title: "Expedition", {
name: undefined, title: 'Expedition',
phone: "508 000 00", name: undefined,
email: "", phone: '508 000 00',
schoolName: "Vallaskolan", email: '',
className: '', schoolName: 'Vallaskolan',
}, className: '',
{ },
title: "Rektor", {
name: "Alvar Sträng", title: 'Rektor',
phone: "08-50800001", name: 'Alvar Sträng',
email: "alvar.strang@edu.stockholm.se", phone: '08-50800001',
schoolName: '', email: 'alvar.strang@edu.stockholm.se',
className: '', schoolName: '',
} className: '',
]] },
],
],
]) ])

View File

@ -1,81 +1,86 @@
import { Teacher, Child } from '@skolplattformen/api'; import { Teacher, Child } from '@skolplattformen/api'
import { children } from './children' 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[]>([ const teacherData = new Map<string, Teacher[]>([
[ [
child1.id, [ child1.id,
[
{ {
id: 15662220, id: 15662220,
firstname: "Cecilia", firstname: 'Cecilia',
sisId: '', sisId: '',
lastname: "Test", lastname: 'Test',
email: "cecilia.test@edu.stockholm.se", email: 'cecilia.test@edu.stockholm.se',
phoneWork: undefined, phoneWork: undefined,
active: true, active: true,
status: " S", status: ' S',
timeTableAbbreviation: 'CTE', timeTableAbbreviation: 'CTE',
}, },
{ {
id: 15662221, id: 15662221,
firstname: "Anna", firstname: 'Anna',
lastname: "Test", lastname: 'Test',
sisId: '', sisId: '',
email: "anna.test@edu.stockholm.se", email: 'anna.test@edu.stockholm.se',
phoneWork: '08000000', phoneWork: '08000000',
active: true, active: true,
status: " GR", status: ' GR',
timeTableAbbreviation: 'ATE', timeTableAbbreviation: 'ATE',
}, },
{ {
id: 15662221, id: 15662221,
firstname: "Greta", firstname: 'Greta',
lastname: "Test", lastname: 'Test',
sisId: '', sisId: '',
email: undefined, email: undefined,
phoneWork: '08000001', phoneWork: '08000001',
active: true, active: true,
status: " F", status: ' F',
timeTableAbbreviation: 'GTE', timeTableAbbreviation: 'GTE',
}, },
]], ],
[ ],
child2.id, [ [
{ child2.id,
id: 15662220, [
firstname: "Cecilia", {
sisId: '', id: 15662220,
lastname: "Test", firstname: 'Cecilia',
email: "cecilia.test@edu.stockholm.se", sisId: '',
phoneWork: undefined, lastname: 'Test',
active: true, email: 'cecilia.test@edu.stockholm.se',
status: " S", phoneWork: undefined,
timeTableAbbreviation: 'CTE', active: true,
}, status: ' S',
{ timeTableAbbreviation: 'CTE',
id: 15662221, },
firstname: "Anna", {
lastname: "Test", id: 15662221,
sisId: '', firstname: 'Anna',
email: "anna.test@edu.stockholm.se", lastname: 'Test',
phoneWork: '08000000', sisId: '',
active: true, email: 'anna.test@edu.stockholm.se',
status: " GR", phoneWork: '08000000',
timeTableAbbreviation: 'ATE', active: true,
}, status: ' GR',
{ timeTableAbbreviation: 'ATE',
id: 15662221, },
firstname: "Greta", {
lastname: "Test", id: 15662221,
sisId: '', firstname: 'Greta',
email: undefined, lastname: 'Test',
phoneWork: '08000001', sisId: '',
active: true, email: undefined,
status: " F", phoneWork: '08000001',
timeTableAbbreviation: 'GTE', 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[] => { export const timetable = (child: Skola24Child): TimetableEntry[] => {
if (!child.personGuid || !child.unitGuid) return [] if (!child.personGuid || !child.unitGuid) return []
@ -460,6 +459,6 @@ export const timetable = (child: Skola24Child): TimetableEntry[] => {
timeStart: '10:40:00', timeStart: '10:40:00',
dateStart: '2021-04-16T10:40:00.000+02:00', dateStart: '2021-04-16T10:40:00.000+02:00',
dateEnd: '2021-04-16T11:35:00.000+02:00', dateEnd: '2021-04-16T11:35:00.000+02:00',
} },
] ]
} }

View File

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

View File

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

View File

@ -19,7 +19,8 @@ describe('news', () => {
NewsListId: '3EC323A1-EA16-4D24-84C8-DAA49E76F9F4', NewsListId: '3EC323A1-EA16-4D24-84C8-DAA49E76F9F4',
NewsItemId: NewsItemId:
'elevstockholm.sharepoint.com,27892ACC-BA2E-4DEC-97B8-25F7098C3BF6,A239466A-9A52-42FF-8A3F-D94C342F2700_99', '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)/', PublicationDate: '/Date(1608304542000)/',
PubDateSE: '18 december 2020 16:15', PubDateSE: '18 december 2020 16:15',
ModifiedDate: '/Date(1608304680000)/', ModifiedDate: '/Date(1608304680000)/',
@ -30,8 +31,7 @@ describe('news', () => {
BannerImageUrl: 'A703552D-DBF3-45B0-8E67-6E062105A0C5.jpeg', BannerImageUrl: 'A703552D-DBF3-45B0-8E67-6E062105A0C5.jpeg',
BannerImageGuid: 'A703552D-DBF3-45B0-8E67-6E062105A0C5', BannerImageGuid: 'A703552D-DBF3-45B0-8E67-6E062105A0C5',
BannerImageListId: 'FFBE49E9-BDE1-4C75-BA0E-D98D4E2FCF21', BannerImageListId: 'FFBE49E9-BDE1-4C75-BA0E-D98D4E2FCF21',
Body: 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>',
'<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, BodyNoHtml: null,
AuthorDisplayName: 'Eva-Lotta Rönnberg', AuthorDisplayName: 'Eva-Lotta Rönnberg',
altText: 'Nyhetsbild. Bildtext ej tillgänglig.', altText: 'Nyhetsbild. Bildtext ej tillgänglig.',
@ -108,7 +108,8 @@ describe('news', () => {
NewsListId: '3EC323A1-EA16-4D24-84C8-DAA49E76F9F4', NewsListId: '3EC323A1-EA16-4D24-84C8-DAA49E76F9F4',
NewsItemId: NewsItemId:
'elevstockholm.sharepoint.com,27892ACC-BA2E-4DEC-97B8-25F7098C3BF6,A239466A-9A52-42FF-8A3F-D94C342F2700_99', '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)/', PublicationDate: '/Date(1608304542000)/',
PubDateSE: '18 december 2020 16:15', PubDateSE: '18 december 2020 16:15',
ModifiedDate: '/Date(1608304680000)/', ModifiedDate: '/Date(1608304680000)/',
@ -119,8 +120,7 @@ describe('news', () => {
BannerImageUrl: 'A703552D-DBF3-45B0-8E67-6E062105A0C5.jpeg', BannerImageUrl: 'A703552D-DBF3-45B0-8E67-6E062105A0C5.jpeg',
BannerImageGuid: 'A703552D-DBF3-45B0-8E67-6E062105A0C5', BannerImageGuid: 'A703552D-DBF3-45B0-8E67-6E062105A0C5',
BannerImageListId: 'FFBE49E9-BDE1-4C75-BA0E-D98D4E2FCF21', BannerImageListId: 'FFBE49E9-BDE1-4C75-BA0E-D98D4E2FCF21',
Body: 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>',
'<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, BodyNoHtml: null,
AuthorDisplayName: 'Eva-Lotta Rönnberg', AuthorDisplayName: 'Eva-Lotta Rönnberg',
altText: 'Nyhetsbild. Bildtext ej tillgänglig.', altText: 'Nyhetsbild. Bildtext ej tillgänglig.',
@ -132,7 +132,8 @@ describe('news', () => {
NewsListId: '3EC323A1-EA16-4D24-84C8-DAA49E76F9F4', NewsListId: '3EC323A1-EA16-4D24-84C8-DAA49E76F9F4',
NewsItemId: NewsItemId:
'elevstockholm.sharepoint.com,27892ACC-BA2E-4DEC-97B8-25F7098C3BF6,A239466A-9A52-42FF-8A3F-D94C342F2700_99', '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)/', PublicationDate: '/Date(1608304542000)/',
PubDateSE: '18 november 2021 16:15', PubDateSE: '18 november 2021 16:15',
ModifiedDate: '/Date(1608304680000)/', ModifiedDate: '/Date(1608304680000)/',
@ -143,8 +144,7 @@ describe('news', () => {
BannerImageUrl: 'A703552D-DBF3-45B0-8E67-6E062105A0C5.jpeg', BannerImageUrl: 'A703552D-DBF3-45B0-8E67-6E062105A0C5.jpeg',
BannerImageGuid: 'A703552D-DBF3-45B0-8E67-6E062105A0C5', BannerImageGuid: 'A703552D-DBF3-45B0-8E67-6E062105A0C5',
BannerImageListId: 'FFBE49E9-BDE1-4C75-BA0E-D98D4E2FCF21', BannerImageListId: 'FFBE49E9-BDE1-4C75-BA0E-D98D4E2FCF21',
Body: 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>',
'<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, BodyNoHtml: null,
AuthorDisplayName: 'Eva-Lotta Rönnberg', AuthorDisplayName: 'Eva-Lotta Rönnberg',
altText: 'Nyhetsbild. Bildtext ej tillgänglig.', altText: 'Nyhetsbild. Bildtext ej tillgänglig.',
@ -206,8 +206,7 @@ describe('newsItem', () => {
BannerImageUrl: '123123.jpeg', BannerImageUrl: '123123.jpeg',
BannerImageGuid: '7a8142d9d9d54cf090e8457e4c629227', BannerImageGuid: '7a8142d9d9d54cf090e8457e4c629227',
BannerImageListId: 'a88c22e8-7094-4a71-b4fd-8792c62a7b4a', BannerImageListId: 'a88c22e8-7094-4a71-b4fd-8792c62a7b4a',
Body: 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>',
'<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, BodyNoHtml: null,
AuthorDisplayName: 'Tieto Evry', AuthorDisplayName: 'Tieto Evry',
altText: null, altText: null,
@ -264,7 +263,6 @@ describe('newsItem', () => {
}) })
}) })
describe('newsItem', () => { describe('newsItem', () => {
beforeEach(() => { beforeEach(() => {
response = { response = {
@ -288,8 +286,7 @@ describe('newsItem', () => {
BannerImageUrl: '123123.jpeg', BannerImageUrl: '123123.jpeg',
BannerImageGuid: '7a8142d9d9d54cf090e8457e4c629227', BannerImageGuid: '7a8142d9d9d54cf090e8457e4c629227',
BannerImageListId: 'a88c22e8-7094-4a71-b4fd-8792c62a7b4a', BannerImageListId: 'a88c22e8-7094-4a71-b4fd-8792c62a7b4a',
Body: Body: '<i>italic</i> <b>bold</b> <em>emphasis </em><br/><strong>strong</strong><strong>nbsp&#160;</strong>',
'<i>italic</i> <b>bold</b> <em>emphasis </em><br/><strong>strong</strong><strong>nbsp&#160;</strong>',
BodyNoHtml: null, BodyNoHtml: null,
AuthorDisplayName: 'Tieto Evry', AuthorDisplayName: 'Tieto Evry',
altText: null, altText: null,
@ -330,4 +327,4 @@ describe('newsItem', () => {
expect(item.body).toContain('**strong**') expect(item.body).toContain('**strong**')
expect(item.body).toContain('**nbsp**') expect(item.body).toContain('**nbsp**')
}) })
}) })

View File

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

View File

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

View File

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

View File

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

View File

@ -1,7 +1,6 @@
import { MenuItem, MenuList, toMarkdown } from '@skolplattformen/api' import { MenuItem, MenuList, toMarkdown } from '@skolplattformen/api'
import { etjanst } from './etjanst' import { etjanst } from './etjanst'
export const menuItem = ({ title, description }: any): MenuItem => ({ export const menuItem = ({ title, description }: any): MenuItem => ({
title, title,
description: toMarkdown(description), description: toMarkdown(description),
@ -24,7 +23,7 @@ export const menuList = (data: any): MenuItem[] => {
const menuItemsFS = [ const menuItemsFS = [
{ {
title: `Måndag - Vecka ${currentWeek.week}`, title: `Måndag - Vecka ${currentWeek.week}`,
description: toMarkdown(currentWeek.mon) , description: toMarkdown(currentWeek.mon),
}, },
{ {
title: `Tisdag - Vecka ${currentWeek.week}`, 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' import { etjanst } from './etjanst'
const IMAGE_HOST = const IMAGE_HOST =
'https://etjanst.stockholm.se/Vardnadshavare/inloggad2/NewsBanner?url=' 'https://etjanst.stockholm.se/Vardnadshavare/inloggad2/NewsBanner?url='
@ -30,8 +29,8 @@ export const newsItem = ({
// Fixes https://github.com/kolplattformen/skolplattformen-app/issues/525 // Fixes https://github.com/kolplattformen/skolplattformen-app/issues/525
const toNonEmptyMarkdownString = (str: string): string => { const toNonEmptyMarkdownString = (str: string): string => {
const res = toMarkdown(str); const res = toMarkdown(str)
if(res?.length == 0 ) return ' ' if (res?.length == 0) return ' '
return res return res
} }

View File

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

View File

@ -20,19 +20,18 @@ export const scheduleItem = ({
}) })
export const schedule = (data: any): ScheduleItem[] => { export const schedule = (data: any): ScheduleItem[] => {
try{ try {
const scheduleData = etjanst(data) const scheduleData = etjanst(data)
const mapped = scheduleData.map(scheduleItem) const mapped = scheduleData.map(scheduleItem)
return mapped return mapped
} } catch (e) {
catch(e){
if (e instanceof Error) { 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 // It is the same on the official web
// Instead of retrying and spamming errors - lets return en empty array // 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>() return new Array<ScheduleItem>()
} }
} }
throw e throw e
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -3,7 +3,7 @@ export default class RoundRobinArray<T> {
array: T[] array: T[]
constructor(array : Array<T>, index?: number | undefined) { constructor(array: Array<T>, index?: number | undefined) {
this.index = index || 0 this.index = index || 0
if (array === undefined || array === null) { if (array === undefined || array === null) {
@ -20,11 +20,15 @@ export default class RoundRobinArray<T> {
return this.array[this.index] return this.array[this.index]
} }
add(item : T) { add(item: T) {
this.array.push(item) 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 QueueFetcher from './queue/queueFetcher'
import {Fetcher, RequestInit, Response } from '@skolplattformen/api' import { Fetcher, RequestInit, Response } from '@skolplattformen/api'
export default function queueFetcherWrapper(
export default function queueFetcherWrapper(fetch: Fetcher, fetch: Fetcher,
changeChildFunc: ((childId: string) => Promise<Response>)) : Fetcher { changeChildFunc: (childId: string) => Promise<Response>
): Fetcher {
const queue = new QueueFetcher(changeChildFunc) const queue = new QueueFetcher(changeChildFunc)
queue.verboseDebug = false queue.verboseDebug = false
return async (name: string, url: string, init: RequestInit = { headers: {} }, childId? : string) return async (
: Promise<Response> => { name: string,
url: string,
init: RequestInit = { headers: {} },
childId?: string
): Promise<Response> => {
if (childId === undefined) { if (childId === undefined) {
return fetch(name, url, init) return fetch(name, url, init)
} }

View File

@ -1,23 +1,27 @@
// BankId // BankId
export const login = (personalNumber?: string) => { 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 baseUrl =
const optionalPersonalNumber = personalNumber === undefined ? '' : `&personalNumber=${personalNumber}` '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()}` 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()}` `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' '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 // 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 frejaLogin =
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' 'https://login003.stockholm.se/NECSadcfreja/authenticate/NECSadcfreja?action=init&return_url=https%3A%2F%2Flogin003.stockholm.se%2FNECSadcfreja%2Fauthenticate%2FNECSadcfreja'
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 frejaLoginStatus =
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' '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` 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 image = (url: string) => `${urlLoggedIn}/NewsBanner?url=${url}`
export const notifications = (childId: string) => export const notifications = (childId: string) =>
`${urlLoggedIn}/notifications/getnotifications?childId=${childId}` `${urlLoggedIn}/notifications/getnotifications?childId=${childId}`
export const menuRss = (childId: string) => export const menuRss = (childId: string) =>
`${urlLoggedIn}/Matsedel/GetMatsedelRSS?childId=${childId}` `${urlLoggedIn}/Matsedel/GetMatsedelRSS?childId=${childId}`
@ -83,15 +87,21 @@ export const createItemConfig =
// Skola24 // Skola24
export const ssoRequestUrl = (targetSystem: string) => 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 ssoResponseUrl =
export const samlResponseUrl = 'https://fnsservicesso1.stockholm.se/sso-ng/saml-2.0/response' '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 timetables =
export const renderKey = 'https://fns.stockholm.se/ng/api/get/timetable/render/key' '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 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) { } catch (err) {
// eslint-disable-next-line no-console
console.error(err) console.error(err)
} }
return next(action) return next(action)
@ -105,7 +104,6 @@ export const cacheMiddleware: IMiddleware =
} }
} }
} catch (err) { } catch (err) {
// eslint-disable-next-line no-console
console.error(err) console.error(err)
} }
return next(action) return next(action)

View File

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

View File

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