Turning ub-movements-test repo into a Svelte project
This commit is contained in:
commit
d59d300276
26 changed files with 8625 additions and 0 deletions
24
.gitignore
vendored
Normal file
24
.gitignore
vendored
Normal file
|
@ -0,0 +1,24 @@
|
|||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
dist
|
||||
dist-ssr
|
||||
*.local
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
.DS_Store
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
3
.vscode/extensions.json
vendored
Normal file
3
.vscode/extensions.json
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"recommendations": ["svelte.svelte-vscode"]
|
||||
}
|
47
README.md
Normal file
47
README.md
Normal file
|
@ -0,0 +1,47 @@
|
|||
# Svelte + TS + Vite
|
||||
|
||||
This template should help get you started developing with Svelte and TypeScript in Vite.
|
||||
|
||||
## Recommended IDE Setup
|
||||
|
||||
[VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode).
|
||||
|
||||
## Need an official Svelte framework?
|
||||
|
||||
Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more.
|
||||
|
||||
## Technical considerations
|
||||
|
||||
**Why use this over SvelteKit?**
|
||||
|
||||
- It brings its own routing solution which might not be preferable for some users.
|
||||
- It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app.
|
||||
|
||||
This template contains as little as possible to get started with Vite + TypeScript + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project.
|
||||
|
||||
Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate.
|
||||
|
||||
**Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?**
|
||||
|
||||
Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information.
|
||||
|
||||
**Why include `.vscode/extensions.json`?**
|
||||
|
||||
Other templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to install the recommended extension upon opening the project.
|
||||
|
||||
**Why enable `allowJs` in the TS template?**
|
||||
|
||||
While `allowJs: false` would indeed prevent the use of `.js` files in the project, it does not prevent the use of JavaScript syntax in `.svelte` files. In addition, it would force `checkJs: false`, bringing the worst of both worlds: not being able to guarantee the entire codebase is TypeScript, and also having worse typechecking for the existing JavaScript. In addition, there are valid use cases in which a mixed codebase may be relevant.
|
||||
|
||||
**Why is HMR not preserving my local component state?**
|
||||
|
||||
HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/rixo/svelte-hmr#svelte-hmr).
|
||||
|
||||
If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR.
|
||||
|
||||
```ts
|
||||
// store.ts
|
||||
// An extremely simple external store
|
||||
import { writable } from 'svelte/store'
|
||||
export default writable(0)
|
||||
```
|
267
data/locaties.csv
Normal file
267
data/locaties.csv
Normal file
|
@ -0,0 +1,267 @@
|
|||
Library Name;Library Code;Location Name;Location Code;Adres;Locatie
|
||||
Allard Pierson Archaeological Collection;APM;Allard Pierson Archaeological Collection;APM;Oude Turfmarkt 129;52.3684642, 4.8932426
|
||||
Allard Pierson Archaeological Collection;APM;Exhibition;EXHI;Oude Turfmarkt 129;52.3684642, 4.8932426
|
||||
Allard Pierson Archaeological Collection;APM;UNASSIGNED location;UNASSIGNED;Oude Turfmarkt 129;52.3684642, 4.8932426
|
||||
Allard Pierson Depot;OTM;Allard Pierson Depot AP21;AP21;Meibergdreef 29;52.29264,4.95835
|
||||
Allard Pierson Depot;OTM;Allard Pierson Depot AP3;AP3;Meibergdreef 29;52.29264,4.95835
|
||||
Allard Pierson Depot;OTM;Allard Pierson Depot SB3;SB3;Meibergdreef 29;52.29264,4.95835
|
||||
Allard Pierson Depot;OTM;Allard Pierson Depot SB3 Kluis;SB3-Kluis;Meibergdreef 29;52.29264,4.95835
|
||||
Allard Pierson Depot;OTM;Allard Pierson Depot SB4;SB4;Meibergdreef 29;52.29264,4.95835
|
||||
Allard Pierson Depot;OTM;Allard Pierson Depot VA3;VA3;Meibergdreef 29;52.29264,4.95835
|
||||
Allard Pierson Depot;OTM;Allard Pierson Depot VA4;VA4;Meibergdreef 29;52.29264,4.95835
|
||||
Allard Pierson Depot;OTM;Allard Pierson Depot VV3;VV3;Meibergdreef 29;52.29264,4.95835
|
||||
Allard Pierson Depot;OTM;Allard Pierson Depot VV4;VV4;Meibergdreef 29;52.29264,4.95835
|
||||
Allard Pierson Depot;OTM;None;I2;Meibergdreef 29;52.29264,4.95835
|
||||
Allard Pierson Depot;OTM;Tijdelijk in Reading Room;RR;Meibergdreef 29;52.29264,4.95835
|
||||
Allard Pierson Depot;OTM;UNASSIGNED location;UNASSIGNED;Meibergdreef 29;52.29264,4.95835
|
||||
Allard Pierson Handbibliotheek;BC;otm-ibl;BCIBL;Oude Turfmarkt 129;52.3684642, 4.8932426
|
||||
Allard Pierson Handbibliotheek;BC;AP-Archeologie;APA;Oude Turfmarkt 129;52.3684642, 4.8932426
|
||||
Allard Pierson Handbibliotheek;BC;AP-BKR;APB;Oude Turfmarkt 129;52.3684642, 4.8932426
|
||||
Allard Pierson Handbibliotheek;BC;AP-Computermuseum;APC;Oude Turfmarkt 129;52.3684642, 4.8932426
|
||||
Allard Pierson Handbibliotheek;BC;AP-Handschriften;APH;Oude Turfmarkt 129;52.3684642, 4.8932426
|
||||
Allard Pierson Handbibliotheek;BC;AP-Universiteitsgeschiedenis;APU;Oude Turfmarkt 129;52.3684642, 4.8932426
|
||||
Allard Pierson Handbibliotheek;BC;Allard Pierson Kaartenzaal;KRTZL;Oude Turfmarkt 129;52.3684642, 4.8932426
|
||||
Allard Pierson Handbibliotheek;BC;Allard Pierson Onderzoekzaal;BCOZL;Oude Turfmarkt 129;52.3684642, 4.8932426
|
||||
Allard Pierson Handbibliotheek;BC;Exhibition;EXHI;Oude Turfmarkt 129;52.3684642, 4.8932426
|
||||
Allard Pierson Handbibliotheek;BC;None;None;Oude Turfmarkt 129;52.3684642, 4.8932426
|
||||
Allard Pierson Handbibliotheek;BC;Randapparatuur;HBAPP;Oude Turfmarkt 129;52.3684642, 4.8932426
|
||||
Allard Pierson Handbibliotheek;BC;UNASSIGNED location;UNASSIGNED;Oude Turfmarkt 129;52.3684642, 4.8932426
|
||||
Artis Bibliotheek;ARTIS;Artis Bibliotheek 242;242;Plantage Middenlaan 45;52.3655771, 4.9147693
|
||||
Artis Bibliotheek;ARTIS;Artis Bibliotheek AB;AB;Plantage Middenlaan 45;52.3655771, 4.9147693
|
||||
Artis Bibliotheek;ARTIS;Artis Bibliotheek CROWN;CROWN;Plantage Middenlaan 45;52.3655771, 4.9147693
|
||||
Artis Bibliotheek;ARTIS;Artis Bibliotheek OTM;OTM;Plantage Middenlaan 45;52.3655771, 4.9147693
|
||||
Artis Bibliotheek;ARTIS;Exhibition;EXHI;Plantage Middenlaan 45;52.3655771, 4.9147693
|
||||
Artis Bibliotheek;ARTIS;UNASSIGNED location;UNASSIGNED;Plantage Middenlaan 45;52.3655771, 4.9147693
|
||||
BORR-IBL Resource Sharing Library ILL;RES_SHARE_ILL;Borrowing Resource Sharing Requests ILL;OUT_RS_ILL;;
|
||||
BORR-IBL Resource Sharing Library ILL;RES_SHARE_ILL;Lending Resource Sharing Requests ILL;IN_RS_ILL;;
|
||||
BORR-IBL Resource Sharing Library ILL;RES_SHARE_ILL;None;ResourceLocated;;
|
||||
BORR-IBL Resource Sharing Library ILL;RES_SHARE_ILL;PCHH-ILL;PCHH-ILL;;
|
||||
Bushuis - pickup location;BHBPU;Exhibition;EXHI;Kloveniersburgwal 48;52.3707822, 4.8981663
|
||||
Bushuis - pickup location;BHBPU;UNASSIGNED location;UNASSIGNED;Kloveniersburgwal 48;52.3707822, 4.8981663
|
||||
CEDLA;CEDLA;CEDLA - IBL;CEDLA-IBL;Roetersstraat 33,;52.3623095, 4.9113548
|
||||
CEDLA;CEDLA;Centrum voor Studie en Documentatie Latijns-Amerika;174;Roetersstraat 33,;52.3623095, 4.9113548
|
||||
CEDLA;CEDLA;Exhibition;EXHI;Roetersstraat 33,;52.3623095, 4.9113548
|
||||
CEDLA;CEDLA;None;174:;Roetersstraat 33,;52.3623095, 4.9113548
|
||||
CEDLA;CEDLA;UNASSIGNED location;UNASSIGNED;Roetersstraat 33,;52.3623095, 4.9113548
|
||||
GW-collecties UB;UBGW;Alfa Informatica;291;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Algemeen;116;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Algemene literatuurwetenschap;112;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Algemene taalwetenschap;110;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Amerika Instituut;173;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Bronnenkamer;601;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Byzantinologie - Nieuwgrieks;107;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Centrum voor Studie en Documentatie Latijns-Amerika;174;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Collectie Esthetica;127;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Culturele Studies;311;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Duits;117;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Engels;115;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Europese studies;301;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Exhibition;EXHI;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Fonetiek;132;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Frans/Roemeens;119;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Fries;114;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Geschiedenis;138;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Hongaars;123;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Instituut Moderne Nabije Oosten (IMNO);105;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Italiaans;120;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Juda Palache instituut;106;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Klassieken & Archeologie;101;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Kunstgeschiedenis;128;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Kunstgeschiedenis - magazijn;128M;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Mediastudies & Theaterwetenschap;125;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Muziekwetenschap;131;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Neerlandistiek;113;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Neolatijn;103;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;None;None;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Oosteuropese studies;172;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Papyrologie – ruimte E2.01;PAPY;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Portugees;122;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Scandinavistiek, incl. Fins;118;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Slavistiek;104;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Spaans;121;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Study room A1.01;A101;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Taalstudie;600;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Temporary not available;UNAV;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Theologie en Religiestudies;100;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;UBGW Tijdschriften;GWSerials;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;UNASSIGNED location;UNASSIGNED;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Vertaalwetenschap;306;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Werkgroepkast - ruimte E 2.01;WERK;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Wijsbegeerte;126;Singel 425;52.3676855, 4.8897127
|
||||
GW-collecties UB;UBGW;Zuidafrikaans;279;Singel 425;52.3676855, 4.8897127
|
||||
IViR;IVIR;Exhibition;EXHI;Nieuwe Achtergracht 166;52.3631403, 4.9122407
|
||||
IViR;IVIR;Instituut voor Informatierecht (IVIR);312;Nieuwe Achtergracht 166;52.3631403, 4.9122407
|
||||
IViR;IVIR;UNASSIGNED location;UNASSIGNED;Nieuwe Achtergracht 166;52.3631403, 4.9122407
|
||||
IWO-depot;IWO;IWO (HvA 1e verdieping);IH1;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;temporary collection conversion UvA;999;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;Artis Bibliotheek;ARTIS;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;Exhibition;EXHI;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;IBL-OUT;IBL-OUT;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;IWO I1;I1;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;IWO I2;I2;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;IWO I3;I3;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;IWO IBL;IWO-IBL;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;IWO Verplaatsing;IWO-TEMP;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;IWO tbv grote formaten;I1F;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;Inzage op IWO wegens groot formaat;I2F;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;Muziek Centrum Nederland;MCN;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;None;115;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;None;242;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;None;IWO-BC;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;None;None;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;None;UBM: Obr. 012 168;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;None;UBM: Obr. FOL 003 960;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;None;UBM: Obr. FOL 004 013;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;None;UBM: W;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;None;music;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;TIN;TIN;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;Temporary location MCN1 (do not use);MCN1;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;Temporary location MCN2 (do not use);MCN2;Meibergdreef 29;52.29264,4.95835
|
||||
IWO-depot;IWO;UNASSIGNED location;UNASSIGNED;Meibergdreef 29;52.29264,4.95835
|
||||
Juridische Bibliotheek;JB;Apparatuur;JB-APP;Nieuwe Achtergracht 166;52.3631403, 4.9122407
|
||||
Juridische Bibliotheek;JB;Buitenlands Recht en Internationaal Privaatrecht;187;Nieuwe Achtergracht 166;52.3631403, 4.9122407
|
||||
Juridische Bibliotheek;JB;Criminologisch instituut Bonger;276;Nieuwe Achtergracht 166;52.3631403, 4.9122407
|
||||
Juridische Bibliotheek;JB;Exhibition;EXHI;Nieuwe Achtergracht 166;52.3631403, 4.9122407
|
||||
Juridische Bibliotheek;JB;Internationaal Recht;171;Nieuwe Achtergracht 166;52.3631403, 4.9122407
|
||||
Juridische Bibliotheek;JB;Internationaal recht;189;Nieuwe Achtergracht 166;52.3631403, 4.9122407
|
||||
Juridische Bibliotheek;JB;JB - IBL;JB-IBL;Nieuwe Achtergracht 166;52.3631403, 4.9122407
|
||||
Juridische Bibliotheek;JB;JB - Tijdschriften;JBSerials;Nieuwe Achtergracht 166;52.3631403, 4.9122407
|
||||
Juridische Bibliotheek;JB;Juridische Bibliotheek;184;Nieuwe Achtergracht 166;52.3631403, 4.9122407
|
||||
Juridische Bibliotheek;JB;None;None;Nieuwe Achtergracht 166;52.3631403, 4.9122407
|
||||
Juridische Bibliotheek;JB;Strafrecht;185;Nieuwe Achtergracht 166;52.3631403, 4.9122407
|
||||
Juridische Bibliotheek;JB;Tijdelijk uitleenbaar;JBTEMP;Nieuwe Achtergracht 166;52.3631403, 4.9122407
|
||||
Juridische Bibliotheek;JB;UNASSIGNED location;UNASSIGNED;Nieuwe Achtergracht 166;52.3631403, 4.9122407
|
||||
Library Learning Centre Roeterseiland;REC;Apparatuur;LLC-RAND;Roetersstraat 11;52.3638465, 4.9112789
|
||||
Library Learning Centre Roeterseiland;REC;Exhibition;EXHI;Roetersstraat 11;52.3638465, 4.9112789
|
||||
Library Learning Centre Roeterseiland;REC;IBL;LLC-IBL;Roetersstraat 11;52.3638465, 4.9112789
|
||||
Library Learning Centre Roeterseiland;REC;LLC REC Studieboeken;LLC-SB;Roetersstraat 11;52.3638465, 4.9112789
|
||||
Library Learning Centre Roeterseiland;REC;LLC REC Testmaterialen;LLC-TEST;Roetersstraat 11;52.3638465, 4.9112789
|
||||
Library Learning Centre Roeterseiland;REC;LLCREC - Tijdschriften;RECSerials;Roetersstraat 11;52.3638465, 4.9112789
|
||||
Library Learning Centre Roeterseiland;REC;None;None;Roetersstraat 11;52.3638465, 4.9112789
|
||||
Library Learning Centre Roeterseiland;REC;Roeterseiland;333;Roetersstraat 11;52.3638465, 4.9112789
|
||||
Library Learning Centre Roeterseiland;REC;Showcase UpForGrabs;TMP_EXHB_R;Roetersstraat 11;52.3638465, 4.9112789
|
||||
Library Learning Centre Roeterseiland;REC;Tijdelijk uitleenbaar;TEMP;Roetersstraat 11;52.3638465, 4.9112789
|
||||
Library Learning Centre Roeterseiland;REC;UNASSIGNED location;UNASSIGNED;Roetersstraat 11;52.3638465, 4.9112789
|
||||
Medische Bibliotheek;AMC;AMC - IBL;AMC-IBL;Meibergdreef 9;52.2948832, 4.9579824
|
||||
Medische Bibliotheek;AMC;Exhibition;EXHI;Meibergdreef 9;52.2948832, 4.9579824
|
||||
Medische Bibliotheek;AMC;Medische Bibliotheek AMC;215;Meibergdreef 9;52.2948832, 4.9579824
|
||||
Medische Bibliotheek;AMC;UNASSIGNED location;UNASSIGNED;Meibergdreef 9;52.2948832, 4.9579824
|
||||
P.C.Hoofthuis;PCHH;Bibliotheek Bungehuis;300;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Magazijn;MAG;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;temporary collection conversion UvA;999;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Alfa Informatica;291;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Algemeen;116;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Algemene literatuurwetenschap;112;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Algemene taalwetenschap;110;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Amerika Instituut;173;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Apparatuur;PCHH-RAND;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Bronnenkamer;601;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Byzantinologie - Nieuwgrieks;107;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Centrum voor Studie en Documentatie Latijns-Amerika;174;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Collectie Esthetica;127;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Culturele Studies;311;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Duits;117;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Engels;115;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Europese studies;301;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Exhibition;EXHI;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Fonetiek;132;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Frans/Roemeens;119;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Fries;114;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Geschiedenis;138;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Hongaars;123;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Instituut Moderne Nabije Oosten (IMNO);105;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Italiaans;120;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Juda Palache instituut;106;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Klassieken & Archeologie;101;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Kunstgeschiedenis;128;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Mediastudies & Theaterwetenschap;125;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Muziekwetenschap;131;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Neerlandistiek;113;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Neolatijn;103;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;None;128M;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;None;None;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Oosteuropese studies;172;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;PCHH - IBL;PCHH-IBL;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;PCHH - Tijdschriften;PCHHSerial;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Portugees;122;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Scandinavistiek, incl. Fins;118;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Slavistiek;104;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Spaans;121;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Taalstudie;600;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Temporary not available;UNAV;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Theologie en Religiestudies;100;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;UNASSIGNED location;UNASSIGNED;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Vertaalwetenschap;306;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Werkgroepkast - 1e etage;WERK;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Wijsbegeerte;126;Spuistraat 134;52.3741032, 4.8898317
|
||||
P.C.Hoofthuis;PCHH;Zuidafrikaans;279;Spuistraat 134;52.3741032, 4.8898317
|
||||
Resource Sharing Library;RES_SHARE;Borrowing Resource Sharing Requests;OUT_RS_REQ;;
|
||||
Resource Sharing Library;RES_SHARE;Lending Resource Sharing Requests;IN_RS_REQ;;
|
||||
Resource Sharing Library;RES_SHARE;None;ResourceLocated;;
|
||||
Sciencepark Bibliotheek;BETA;Amstel instituut;341;Science Park 904;52.3544941, 4.9557553
|
||||
Sciencepark Bibliotheek;BETA;Apparatuur;BETA-RAND;Science Park 904;52.3544941, 4.9557553
|
||||
Sciencepark Bibliotheek;BETA;BETA - IBL;BETA-IBL;Science Park 904;52.3544941, 4.9557553
|
||||
Sciencepark Bibliotheek;BETA;BETA Bibliotheek;450;Science Park 904;52.3544941, 4.9557553
|
||||
Sciencepark Bibliotheek;BETA;Bibliotheek Biologisch Centrum Anna's Hoeve;302;Science Park 904;52.3544941, 4.9557553
|
||||
Sciencepark Bibliotheek;BETA;Exhibition;EXHI;Science Park 904;52.3544941, 4.9557553
|
||||
Sciencepark Bibliotheek;BETA;Hortus;303;Science Park 904;52.3544941, 4.9557553
|
||||
Sciencepark Bibliotheek;BETA;Logica;253;Science Park 904;52.3544941, 4.9557553
|
||||
Sciencepark Bibliotheek;BETA;None;None;Science Park 904;52.3544941, 4.9557553
|
||||
Sciencepark Bibliotheek;BETA;None;Verpl;Science Park 904;52.3544941, 4.9557553
|
||||
Sciencepark Bibliotheek;BETA;Sciencepark Studieboeken;SP-SB;Science Park 904;52.3544941, 4.9557553
|
||||
Sciencepark Bibliotheek;BETA;Sciencepark Tijdschriften;SPSerials;Science Park 904;52.3544941, 4.9557553
|
||||
Sciencepark Bibliotheek;BETA;Showcase UpForGrabs;TMP_EXHB_B;Science Park 904;52.3544941, 4.9557553
|
||||
Sciencepark Bibliotheek;BETA;Sterrenkunde en Informatica;263;Science Park 904;52.3544941, 4.9557553
|
||||
Sciencepark Bibliotheek;BETA;UNASSIGNED location;UNASSIGNED;Science Park 904;52.3544941, 4.9557553
|
||||
Sciencepark Bibliotheek;BETA;Wiskunde;254;Science Park 904;52.3544941, 4.9557553
|
||||
Sciencepark Bibliotheek;BETA;Wiskunde en Informatica;307;Science Park 904;52.3544941, 4.9557553
|
||||
UB Singel;UBB;Apparatuur;UBB-RAND;Singel 425;52.3676855, 4.8897127
|
||||
UB Singel;UBB;Exhibition;EXHI;Singel 425;52.3676855, 4.8897127
|
||||
UB Singel;UBB;Informatiebalie 1e etage;Info-balie;Singel 425;52.3676855, 4.8897127
|
||||
UB Singel;UBB;None;None;Singel 425;52.3676855, 4.8897127
|
||||
UB Singel;UBB;Reading table exhibition;TMP_EXHIB;Singel 425;52.3676855, 4.8897127
|
||||
UB Singel;UBB;Showcase near infodesk;TMP_SHOW;Singel 425;52.3676855, 4.8897127
|
||||
UB Singel;UBB;Tijdelijk uitleenbaar;TEMP;Singel 425;52.3676855, 4.8897127
|
||||
UB Singel;UBB;UB SINGEL - IBL;UBB-IBL;Singel 425;52.3676855, 4.8897127
|
||||
UB Singel;UBB;UNASSIGNED location;UNASSIGNED;Singel 425;52.3676855, 4.8897127
|
||||
UvA library back office;UVABO;Exhibition;EXHI;;
|
||||
UvA library back office;UVABO;UNASSIGNED location;UNASSIGNED;;
|
||||
UvA online;UVAED;None;997;;
|
||||
UvA online;UVAED;UNASSIGNED location;UNASSIGNED;;
|
||||
Z-0 Geesteswetenschappen;0;UNASSIGNED location;UNASSIGNED;;
|
||||
Z-10 Universiteitsbibliotheek;10;UNASSIGNED location;UNASSIGNED;;
|
||||
Z-100 CEDLA;100;UNASSIGNED location;UNASSIGNED;;
|
||||
Z-110 Geneeskunde;110;UNASSIGNED location;UNASSIGNED;;
|
||||
Z-123 FEB;123;UNASSIGNED location;UNASSIGNED;;
|
||||
Z-128;128;UNASSIGNED location;UNASSIGNED;;
|
||||
Z-140 ACTA;140;UNASSIGNED location;UNASSIGNED;;
|
||||
Z-150 NWI;150;UNASSIGNED location;UNASSIGNED;;
|
||||
Z-20 Bijzondere Collecties;20;UNASSIGNED location;UNASSIGNED;;
|
||||
Z-50 FMG;50;UNASSIGNED location;UNASSIGNED;;
|
||||
Z-70 Informatiseringscentrum;70;UNASSIGNED location;UNASSIGNED;;
|
||||
Z-80 IVAM;80;UNASSIGNED location;UNASSIGNED;;
|
||||
Z-90 Rechten;90;UNASSIGNED location;UNASSIGNED;;
|
||||
Z-ILLC;ILLC;Bibliotheca Beth;129;;
|
||||
Z-ILLC;ILLC;UNASSIGNED location;UNASSIGNED;;
|
||||
Z-UB-IBL naar elders;IBL;None;None;;
|
||||
Z-UB-IBL naar elders;IBL;UNASSIGNED location;UNASSIGNED;;
|
||||
Z-UB-magazijn;UBM;UB;BSOU;;
|
||||
Z-UB-magazijn;UBM;UB (D0);D0;;
|
||||
Z-UB-magazijn;UBM;UB (D1);D1;;
|
||||
Z-UB-magazijn;UBM;UB (D2);D2;;
|
||||
Z-UB-magazijn;UBM;UB (D3);D3;;
|
||||
Z-UB-magazijn;UBM;UB (D4);D4;;
|
||||
Z-UB-magazijn;UBM;UB (DKEL);DKEL;;
|
||||
Z-UB-magazijn;UBM;UB (EKEL);EKEL;;
|
||||
Z-UB-magazijn;UBM;temporary collection conversion UvA;999;;
|
||||
Z-UB-magazijn;UBM;None;101;;
|
||||
Z-UB-magazijn;UBM;None;None;;
|
||||
Z-UB-magazijn;UBM;Studiezalen en afdelingen UB;UB;;
|
||||
Z-UB-magazijn;UBM;UNASSIGNED location;UNASSIGNED;;
|
||||
Z-UB-naslagwerken;UBZ;IBL-Buro UB;BIBL;;
|
||||
Z-UB-naslagwerken;UBZ;Studiezalen en afdelingen UB;UB;;
|
||||
Z-UB-naslagwerken;UBZ;UNASSIGNED location;UNASSIGNED;;
|
||||
Z-UvA library Migration;UVAMI;None;UVAMI;;
|
||||
Z-UvA library Migration;UVAMI;UNASSIGNED location;UNASSIGNED;;
|
||||
;;None;-1;#N/A;#N/A
|
||||
;;None;None;#N/A;#N/A
|
|
1
data/parsed_requests.json
Normal file
1
data/parsed_requests.json
Normal file
File diff suppressed because one or more lines are too long
5912
data/requests.csv
Normal file
5912
data/requests.csv
Normal file
File diff suppressed because it is too large
Load diff
74
index.html
Normal file
74
index.html
Normal file
|
@ -0,0 +1,74 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>UvA UB - movements</title>
|
||||
<style>
|
||||
|
||||
#canvas {
|
||||
/* background: white; */
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
transform-origin: top left;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fluxisch Mono', sans-serif;
|
||||
src:
|
||||
url(assets/fonts/FluxischElse-Regular.woff) format('woff');
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fluxisch Mono', sans-serif;
|
||||
src:
|
||||
url(assets/fonts/FluxischElse-Light.woff) format('woff');
|
||||
font-weight: 200;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fluxisch Mono', sans-serif;
|
||||
src:
|
||||
url(assets/fonts/FluxischElse-Bold.woff) format('woff');
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
body {
|
||||
background: black;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
function scaleToFit() {
|
||||
const el = document.getElementById('canvas');
|
||||
|
||||
|
||||
const sw = window.innerWidth / parseInt(el.style.width);
|
||||
const sh = window.innerHeight / parseInt(el.style.height);
|
||||
|
||||
const s = Math.min(sw, sh);
|
||||
|
||||
canvas.style.transform = `scale(${s * 100}%)`;
|
||||
}
|
||||
window.addEventListener('resize', scaleToFit);
|
||||
window.addEventListener('load', scaleToFit);
|
||||
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="canvas">
|
||||
<div id="viz">
|
||||
</div>
|
||||
</div>
|
||||
<script type="module" src="/src/main.ts"></script>
|
||||
</body>
|
||||
|
||||
|
||||
</html>
|
1813
package-lock.json
generated
Normal file
1813
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
21
package.json
Normal file
21
package.json
Normal file
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"name": "ub-movements",
|
||||
"private": true,
|
||||
"version": "0.0.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview",
|
||||
"check": "svelte-check --tsconfig ./tsconfig.json"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@sveltejs/vite-plugin-svelte": "^3.0.2",
|
||||
"@tsconfig/svelte": "^5.0.2",
|
||||
"svelte": "^4.2.12",
|
||||
"svelte-check": "^3.6.7",
|
||||
"tslib": "^2.6.2",
|
||||
"typescript": "^5.2.2",
|
||||
"vite": "^5.2.0"
|
||||
}
|
||||
}
|
55
parse_data.py
Normal file
55
parse_data.py
Normal file
|
@ -0,0 +1,55 @@
|
|||
import csv
|
||||
import json
|
||||
|
||||
node_names = set()
|
||||
edges = []
|
||||
|
||||
libraries = {}
|
||||
locations = {}
|
||||
with open("data/locaties.csv") as fp:
|
||||
reader = csv.DictReader(fp, delimiter=";")
|
||||
for item in reader:
|
||||
locatie = item['Locatie'].split(',')
|
||||
try:
|
||||
lat, lon = locatie
|
||||
except ValueError as e:
|
||||
lat, lon = None, None
|
||||
library = {
|
||||
'name': item['Library Name'],
|
||||
'code': item['Library Code'],
|
||||
'adres': item['Adres'],
|
||||
'lat': lat,
|
||||
'lon': lon,
|
||||
}
|
||||
location = {
|
||||
'location': item['Location Name'],
|
||||
'code': item['Location Code'],
|
||||
'library': library
|
||||
}
|
||||
|
||||
libraries[library['name']] = library
|
||||
locations[location['code']] = location
|
||||
|
||||
|
||||
with open("data/requests.csv") as fp:
|
||||
reader = csv.DictReader(fp, delimiter=";")
|
||||
for item in reader:
|
||||
node_names.add(item['Owning Library Name'])
|
||||
node_names.add(item['Pickup Location'])
|
||||
edges.append(item)
|
||||
|
||||
|
||||
nodes = [{'name': n} for n in node_names]
|
||||
|
||||
print(f"{len(nodes)} nodes, {len(edges)} edges")
|
||||
|
||||
data = {
|
||||
'nodes': list(libraries.values()), #nodes,
|
||||
'edges': edges
|
||||
}
|
||||
|
||||
fn = 'data/parsed_requests.json'
|
||||
with open(fn, 'w') as fp:
|
||||
json.dump(data, fp)
|
||||
|
||||
print(f"Written to {fn}")
|
8
poetry.lock
generated
Normal file
8
poetry.lock
generated
Normal file
|
@ -0,0 +1,8 @@
|
|||
package = []
|
||||
|
||||
[metadata]
|
||||
lock-version = "1.1"
|
||||
python-versions = "^3.9"
|
||||
content-hash = "5b80bcf39bc22fc51a0c05260792ccc8bde494467670046c58c64725c897eb75"
|
||||
|
||||
[metadata.files]
|
BIN
public/fonts/FluxischElse-Bold.woff
Normal file
BIN
public/fonts/FluxischElse-Bold.woff
Normal file
Binary file not shown.
BIN
public/fonts/FluxischElse-Light.woff
Normal file
BIN
public/fonts/FluxischElse-Light.woff
Normal file
Binary file not shown.
BIN
public/fonts/FluxischElse-Regular.woff
Normal file
BIN
public/fonts/FluxischElse-Regular.woff
Normal file
Binary file not shown.
15
pyproject.toml
Normal file
15
pyproject.toml
Normal file
|
@ -0,0 +1,15 @@
|
|||
[tool.poetry]
|
||||
name = "ub-movements"
|
||||
version = "0.1.0"
|
||||
description = ""
|
||||
authors = ["Ruben van de Ven <git@rubenvandeven.com>"]
|
||||
readme = "README.md"
|
||||
packages = [{include = "ub_movements"}]
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.9"
|
||||
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
build-backend = "poetry.core.masonry.api"
|
47
src/App.svelte
Normal file
47
src/App.svelte
Normal file
|
@ -0,0 +1,47 @@
|
|||
<script lang="ts">
|
||||
import svelteLogo from './assets/svelte.svg'
|
||||
import viteLogo from '/vite.svg'
|
||||
import Counter from './lib/Counter.svelte'
|
||||
</script>
|
||||
|
||||
<main>
|
||||
<div>
|
||||
<a href="https://vitejs.dev" target="_blank" rel="noreferrer">
|
||||
<img src={viteLogo} class="logo" alt="Vite Logo" />
|
||||
</a>
|
||||
<a href="https://svelte.dev" target="_blank" rel="noreferrer">
|
||||
<img src={svelteLogo} class="logo svelte" alt="Svelte Logo" />
|
||||
</a>
|
||||
</div>
|
||||
<h1>Vite + Svelte</h1>
|
||||
|
||||
<div class="card">
|
||||
<Counter />
|
||||
</div>
|
||||
|
||||
<p>
|
||||
Check out <a href="https://github.com/sveltejs/kit#readme" target="_blank" rel="noreferrer">SvelteKit</a>, the official Svelte app framework powered by Vite!
|
||||
</p>
|
||||
|
||||
<p class="read-the-docs">
|
||||
Click on the Vite and Svelte logos to learn more
|
||||
</p>
|
||||
</main>
|
||||
|
||||
<style>
|
||||
.logo {
|
||||
height: 6em;
|
||||
padding: 1.5em;
|
||||
will-change: filter;
|
||||
transition: filter 300ms;
|
||||
}
|
||||
.logo:hover {
|
||||
filter: drop-shadow(0 0 2em #646cffaa);
|
||||
}
|
||||
.logo.svelte:hover {
|
||||
filter: drop-shadow(0 0 2em #ff3e00aa);
|
||||
}
|
||||
.read-the-docs {
|
||||
color: #888;
|
||||
}
|
||||
</style>
|
219
src/Viz.svelte
Normal file
219
src/Viz.svelte
Normal file
|
@ -0,0 +1,219 @@
|
|||
<script lang="ts">
|
||||
import parsed_requests from "/data/parsed_requests.json";
|
||||
|
||||
$: console.log(parsed_requests);
|
||||
|
||||
// TODO: pass these from main.ts (or vice versaas)
|
||||
const width = 2160;
|
||||
const height = 3840;
|
||||
|
||||
// preprocess data
|
||||
const nodes = parsed_requests.nodes;
|
||||
const edges: Array<Object> = parsed_requests.edges;
|
||||
|
||||
// filter nodes with only having both Latitude and Longitude.
|
||||
// then map these coordinates to the canvas space
|
||||
const valid_nodes = nodes
|
||||
.filter((n) => n.lat && n.lon)
|
||||
.map((node) => {
|
||||
// const { x: x1, y: y1 } = latLonToOffsets(node.lat, node.lon, 100000, 100000)
|
||||
const { x: x1, y: y1 } = latLonToOffsets(
|
||||
node.lat,
|
||||
node.lon,
|
||||
100000,
|
||||
100000,
|
||||
);
|
||||
console.log(x1, y1);
|
||||
const x2 = inverse_lerp(1358, 1380, x1);
|
||||
const y2 = inverse_lerp(32862, 32900, y1);
|
||||
|
||||
const margin = 200;
|
||||
const x = x2 * (width - 2 * margin) + margin;
|
||||
const y = y2 * (height - 2 * margin) + margin;
|
||||
// console.log(x2, y2)
|
||||
// console.log(node)
|
||||
|
||||
node["x"] = x;
|
||||
node["y"] = y;
|
||||
return node;
|
||||
});
|
||||
|
||||
// create an index to access the node objects by their name
|
||||
const nodeMap = Object.fromEntries(valid_nodes.map((d) => [d["name"], d]));
|
||||
const edgeIndexBarcode = buildIndex(edges, "Barcode");
|
||||
// console.log(edgeIndexBarcode);
|
||||
|
||||
const movements = edges
|
||||
.filter(
|
||||
(l) =>
|
||||
nodeMap[l["Owning Library Name"]] &&
|
||||
nodeMap[l["Pickup Location"]],
|
||||
)
|
||||
.map((l, idx) => {
|
||||
l.source = nodeMap[l["Owning Library Name"]];
|
||||
l.target = nodeMap[l["Pickup Location"]];
|
||||
l.nr = idx;
|
||||
return l;
|
||||
});
|
||||
|
||||
function degreesToRadians(degrees) {
|
||||
return (degrees * Math.PI) / 180;
|
||||
}
|
||||
|
||||
function latLonToOffsets(latitude, longitude, mapWidth, mapHeight) {
|
||||
const FE = 180; // false easting
|
||||
const radius = mapWidth / (2 * Math.PI);
|
||||
|
||||
const latRad = degreesToRadians(latitude);
|
||||
const lonRad = degreesToRadians(longitude + FE);
|
||||
|
||||
const x = lonRad * radius;
|
||||
|
||||
const yFromEquator =
|
||||
radius * Math.log(Math.tan(Math.PI / 4 + latRad / 2));
|
||||
const y = mapHeight / 2 - yFromEquator;
|
||||
|
||||
return { x, y };
|
||||
}
|
||||
|
||||
function lerp(X, Y, t) {
|
||||
return X * t + Y * (1 - t);
|
||||
}
|
||||
|
||||
function inverse_lerp(a, b, x) {
|
||||
return (x - a) / (b - a);
|
||||
}
|
||||
|
||||
interface IndexObject {
|
||||
[index: string]: Array<number>;
|
||||
}
|
||||
|
||||
function buildIndex(objectList: Array<Object>, field: string): IndexObject {
|
||||
const index = {};
|
||||
for (const idx in objectList) {
|
||||
const v = objectList[idx][field];
|
||||
if (!index.hasOwnProperty(v)) {
|
||||
index[v] = [idx];
|
||||
} else {
|
||||
index[v].push(idx);
|
||||
}
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
function get_path_d(movement) {
|
||||
const m = movement;
|
||||
let sourceX, targetX, midX, dx, dy, angle;
|
||||
|
||||
// This mess makes the arrows exactly perfect.
|
||||
// thanks to http://bl.ocks.org/curran/9b73eb564c1c8a3d8f3ab207de364bf4
|
||||
if (m.source.x < m.target.x) {
|
||||
sourceX = m.source.x;
|
||||
targetX = m.target.x;
|
||||
} else if (m.target.x < m.source.x) {
|
||||
targetX = m.target.x;
|
||||
sourceX = m.source.x;
|
||||
} else if (m.target.isCircle) {
|
||||
targetX = sourceX = m.target.x;
|
||||
} else if (m.source.isCircle) {
|
||||
targetX = sourceX = m.source.x;
|
||||
} else {
|
||||
midX = (m.source.x + m.target.x) / 2;
|
||||
if (midX > m.target.x) {
|
||||
midX = m.target.x;
|
||||
} else if (midX > m.source.x) {
|
||||
midX = m.source.x;
|
||||
} else if (midX < m.target.x) {
|
||||
midX = m.target.x;
|
||||
} else if (midX < m.source.x) {
|
||||
midX = m.source.x;
|
||||
}
|
||||
targetX = sourceX = midX;
|
||||
}
|
||||
|
||||
dx = targetX - sourceX;
|
||||
dy = m.target.y - m.source.y;
|
||||
angle = Math.atan2(dx, dy);
|
||||
|
||||
var srcSize = 5; //_mapGraph.getSizeForNode(m.source);
|
||||
var tgtSize = 5; //_mapGraph.getSizeForNode(m.target);
|
||||
|
||||
// Compute the line endpoint such that the arrow
|
||||
// it not in the center, but rather slightly out of it
|
||||
// use a small ofset for the angle to compensate roughly for the curve
|
||||
m.sourceX = sourceX + Math.sin(angle + 0.5) * srcSize;
|
||||
m.targetX = targetX - Math.sin(angle - 0.5) * tgtSize;
|
||||
m.sourceY = m.source.y + Math.cos(angle + 0.5) * srcSize;
|
||||
m.targetY = m.target.y - Math.cos(angle - 0.5) * tgtSize;
|
||||
|
||||
// find radius of arc based on distance between points
|
||||
// add a jitter to spread out the lines when links are stacked
|
||||
const dr = Math.sqrt(dx * dx + dy * dy) * (0.7 + Math.random() * 0.6);
|
||||
|
||||
// "M" + d.source.x + "," + d.source.y + "A" + dr + "," + dr + " 0 0,1 " + d.target.x + "," + d.target.y
|
||||
return `M ${m.sourceX},${m.sourceY} A ${dr},${dr} 0 0,1 ${m.targetX},${m.targetY}`;
|
||||
}
|
||||
|
||||
console.log(movements);
|
||||
|
||||
let drawn_movements = movements;
|
||||
</script>
|
||||
|
||||
<h1>library of <span id="motiontitle">motions</span></h1>
|
||||
<div id="about">
|
||||
Work by <em>Ruben van de Ven</em> for the
|
||||
<em>University of Amsterdam Library</em>. Fonts by
|
||||
<em>Open Source Publishing</em>, map by <em>OpenStreetMap</em>.
|
||||
</div>
|
||||
|
||||
<svg {width} {height}>
|
||||
<g id="movements">
|
||||
{#each drawn_movements as m}
|
||||
<path d={get_path_d(m)}></path>
|
||||
{/each}
|
||||
</g>
|
||||
<g id="libraries">
|
||||
{#each valid_nodes as node}
|
||||
<g id={node.code} transform="translate({node.x}, {node.y})">
|
||||
<circle r="5"></circle>
|
||||
<circle r="20"></circle>
|
||||
<text class="nodeTitle" y="4" x="35">{node.name}</text>
|
||||
</g>
|
||||
{/each}
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
||||
|
||||
<style>
|
||||
#about {
|
||||
position: absolute;
|
||||
font-size: 8pt;
|
||||
bottom: 20px;
|
||||
right: 20px;
|
||||
width: 450px;
|
||||
text-align: right;
|
||||
}
|
||||
#libraries circle:first-child {
|
||||
fill: white;
|
||||
stroke: none;
|
||||
}
|
||||
#libraries circle {
|
||||
fill: none;
|
||||
stroke: white;
|
||||
stroke-width: 10;
|
||||
}
|
||||
path {
|
||||
stroke: #bc89ff10;
|
||||
stroke-width: 2px;
|
||||
fill: none;
|
||||
}
|
||||
text {
|
||||
fill: white;
|
||||
font-size: 30pt;
|
||||
}
|
||||
|
||||
/* path:not(.selected) {
|
||||
opacity: 0;
|
||||
} */
|
||||
</style>
|
31
src/app.css
Normal file
31
src/app.css
Normal file
|
@ -0,0 +1,31 @@
|
|||
/* animation root */
|
||||
#viz {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
font-family: "Fluxisch Else";
|
||||
font-weight: 200;
|
||||
color: black;
|
||||
/* background: linear-gradient(180deg, #3a294c 0%, #62487f 100%); */
|
||||
background: rgb(45, 45, 45);
|
||||
/* background: linear-gradient(to bottom right, #6fa8d9f7, #cdeed3); */
|
||||
border-radius: 40px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
position: absolute;
|
||||
top: calc(50% - 3em);
|
||||
text-align: center;
|
||||
font-weight: 200;
|
||||
font-size: 140pt;
|
||||
left: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
#viz #about {
|
||||
position: absolute;
|
||||
font-size: 8pt;
|
||||
bottom: 20px;
|
||||
right: 20px;
|
||||
width: 450px;
|
||||
text-align: right;
|
||||
}
|
10
src/lib/Counter.svelte
Normal file
10
src/lib/Counter.svelte
Normal file
|
@ -0,0 +1,10 @@
|
|||
<script lang="ts">
|
||||
let count: number = 0
|
||||
const increment = () => {
|
||||
count += 1
|
||||
}
|
||||
</script>
|
||||
|
||||
<button on:click={increment}>
|
||||
count is {count}
|
||||
</button>
|
13
src/main.ts
Normal file
13
src/main.ts
Normal file
|
@ -0,0 +1,13 @@
|
|||
import './app.css'
|
||||
import Viz from './Viz.svelte'
|
||||
|
||||
const width = 2160
|
||||
const height = 3840
|
||||
document.getElementById('canvas')!.style.width = `${width}px`;
|
||||
document.getElementById('canvas')!.style.height = `${height}px`;
|
||||
|
||||
const app = new Viz({
|
||||
target: document.getElementById('viz')!,
|
||||
})
|
||||
|
||||
export default app
|
2
src/vite-env.d.ts
vendored
Normal file
2
src/vite-env.d.ts
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
/// <reference types="svelte" />
|
||||
/// <reference types="vite/client" />
|
19
src/viz.css
Normal file
19
src/viz.css
Normal file
|
@ -0,0 +1,19 @@
|
|||
|
||||
svg path {
|
||||
fill: none;
|
||||
/* stroke: rgba(255, 255, 0, .1); */
|
||||
stroke: #bc89ff10;
|
||||
stroke-width: 2px;
|
||||
}
|
||||
|
||||
svg circle{
|
||||
fill: white;
|
||||
}
|
||||
svg text{
|
||||
fill: white;
|
||||
font-size: 30pt;
|
||||
}
|
||||
|
||||
path:not(.selected){
|
||||
opacity:0;
|
||||
}
|
7
svelte.config.js
Normal file
7
svelte.config.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'
|
||||
|
||||
export default {
|
||||
// Consult https://svelte.dev/docs#compile-time-svelte-preprocess
|
||||
// for more information about preprocessors
|
||||
preprocess: vitePreprocess(),
|
||||
}
|
20
tsconfig.json
Normal file
20
tsconfig.json
Normal file
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"extends": "@tsconfig/svelte/tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"target": "ESNext",
|
||||
"useDefineForClassFields": true,
|
||||
"module": "ESNext",
|
||||
"resolveJsonModule": true,
|
||||
/**
|
||||
* Typecheck JS in `.svelte` and `.js` files by default.
|
||||
* Disable checkJs if you'd like to use dynamic types in JS.
|
||||
* Note that setting allowJs false does not prevent the use
|
||||
* of JS in `.svelte` files.
|
||||
*/
|
||||
"allowJs": true,
|
||||
"checkJs": true,
|
||||
"isolatedModules": true
|
||||
},
|
||||
"include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"],
|
||||
"references": [{ "path": "./tsconfig.node.json" }]
|
||||
}
|
10
tsconfig.node.json
Normal file
10
tsconfig.node.json
Normal file
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"composite": true,
|
||||
"skipLibCheck": true,
|
||||
"module": "ESNext",
|
||||
"moduleResolution": "bundler",
|
||||
"strict": true
|
||||
},
|
||||
"include": ["vite.config.ts"]
|
||||
}
|
7
vite.config.ts
Normal file
7
vite.config.ts
Normal file
|
@ -0,0 +1,7 @@
|
|||
import { defineConfig } from 'vite'
|
||||
import { svelte } from '@sveltejs/vite-plugin-svelte'
|
||||
|
||||
// https://vitejs.dev/config/
|
||||
export default defineConfig({
|
||||
plugins: [svelte()],
|
||||
})
|
Loading…
Reference in a new issue