From 0885b9db9e264a666cd0fa656442569a953fb7f7 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Thu, 16 Sep 2021 16:23:42 +0200 Subject: update tags. implement clocks --- data_store/tags.csv | 102 ++++++------ db.json | 309 +++++++++++++++++++------------------ index.js | 28 ++-- load_spreadsheet.js | 4 +- public/assets/css/css.css | 13 +- public/assets/img/clock/clock.jpg | Bin 0 -> 692731 bytes public/assets/img/clock/clock.png | Bin 0 -> 754166 bytes public/assets/img/clock/hour.png | Bin 0 -> 39419 bytes public/assets/img/clock/minute.png | Bin 0 -> 47487 bytes public/assets/img/clock/second.png | Bin 0 -> 36025 bytes src/graph.js | 18 ++- src/views/Clock.js | 108 +++++++++++++ src/views/Clocks.js | 15 ++ src/views/Detail.js | 5 +- src/views/Legend.js | 17 +- 15 files changed, 395 insertions(+), 224 deletions(-) create mode 100644 public/assets/img/clock/clock.jpg create mode 100644 public/assets/img/clock/clock.png create mode 100644 public/assets/img/clock/hour.png create mode 100644 public/assets/img/clock/minute.png create mode 100644 public/assets/img/clock/second.png create mode 100644 src/views/Clock.js create mode 100644 src/views/Clocks.js diff --git a/data_store/tags.csv b/data_store/tags.csv index d6a3716..a4738d7 100644 --- a/data_store/tags.csv +++ b/data_store/tags.csv @@ -1,51 +1,51 @@ -Title,Index,IDK,No6092,1620s,painting,blunt,National Gallery of Canada,AGO,courtauld,intervensions,connsoeurship,double agent,forensics,black box,Stankievech -01 Poussin: No6092,1,x,x,x,x,x,x,,,,x,,x,x, -02 No6092: Xray,2,x,x,,,,x,,,,,,x,, -03 Blunt: Apollo,3,,x,,,x,,,,,,,,, -04 Blunt: McCurry's Visit ,4,,x,,,x,x,,,,,,,, -05 Blunt: Telegram ,5,,x,,,x,x,,,,,,,, -06 NGC: Record ,6,,x,,,,x,,,,,,x,, -07 NGC: Receiving ,7,,x,,,,x,,,,,,,, -08 Mahon to Hubbard,8,,x,,,,x,,,,,,,, -09 Hubbard to Mahon ,9,,x,,,,x,,,,,,,, -10 No6092: Label ,10,,x,,,,x,,,,,,x,, -11 Mahon to Hubbard,11,,x,,,,x,,,,,,,, -12 Laskin: Note,12,,x,,,,x,,,,,,,, -13 Laskin to Oberhuber ,13,,x,,,,x,,,,,,,, -14 Laskin to Gerdts ,14,,x,,,,x,,,,,,,, -15 Miles to d'Argencourt ,15,,x,,,,x,,,,,,,, -16 Lavin to Laskin ,16,,x,,,,x,,,,,,,, -17 Laskin to Lavin ,17,,x,,,,x,,,,,,,, -18 NGC: Italian Memo,18,,x,,,,x,,,,,,,, -19 Laskin to Oberhuber ,19,,x,,,,x,,,,,,,, -20 Rees: Xrays,20,,x,,,,,,x,,,,x,, -21 Poussin: Xray,21,,,,x,,x,,,,,,x,, -22 Courbet: Painting,22,,,,x,x,,x,,,,,,, -23 Moore: Painting I,23,,,,x,x,,x,x,,,,,, -24 Moore: Painting II,24,,,,x,x,,x,x,,,,,, -25 Chu: Courbet Signature,25,,,,,,,x,,,,,x,, -26 Fernier: Courbet Signatures,26,,,,,,,x,,,,,x,, -27 Courbet: Signature,27,,,,,,,x,,,,,x,, -28 AGO: Blunt Lecture ,28,,,,,x,,x,,,,,,, -29 Blunt: AGO Opening,29,,,,,x,,x,,,,,,, -30 Stankievech: An Apology ,30,,,,,x,,,,x,,,,,x -31 Stankievech: Courtauld Cocktail ,31,,,,,,,,x,x,,x,,,x -32 Burgess to Blunt,32,,,,,x,,,,,,x,,, -33 Stankievech: Secret Agent ,33,,,,,,,,,x,,x,,,x -34 Blunt: Warburg Journal,34,,,,,x,,,x,,,x,,, -35 Lewis: Secret Agents ,35,,,,,x,,,x,,x,x,,, -36 Blunt: BBC ,36,,,,,x,,,,,x,x,,x, -37 Ruiz: L'Hypothèse du tableau volé ,37,,,,x,,,,,,x,x,,, -38 Benjamin: Mondrian,38,,,,x,,,,,,x,x,,, -39 Broodthaers: Atlas,39,,,,,,,,,,x,x,,, -40 Warburg: Mnemosyne Atlas ,40,,,,,,,,x,,x,x,x,, -41 Mancini: Pittura,41,,,x,x,,,,,,x,x,x,, -42 Stankievech: Mancini / Warburg,42,,,x,,,,,,x,x,,x,,x -43 Ruebens to Nicolas-Claude ,43,,,x,x,,,,,,,x,,, -44 Poe: Purloined Letter,44,,,,,,,,,,,x,x,x, -45 Lacan: Purloined Letter,45,,x,,,x,,,,,,x,x,x, -46 MI6: Zinoviev Letter,46,,,,,,,,,,,x,,x, -47 UN: Vienna Convention,47,,,x,,x,,,,,,,,x, -48 Wittgenstein Key,48,,,,,,,,,,,x,,x, -49 Stankievech: Purloined Letter,49,,x,,,,,,,x,,,,x,x -50 Arendt: Freeport ,50,,,,,,,,,,,,,x, +,,1620s,painting,blunt,National Gallery of Canada,Art Gallery of Ontario,Courtauld Institute,Stankievech,connsoeurship,double agent,forensics ,black box,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +01 Poussin: No6092,1,x,x,x,x,,,,x,,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +02 No6092: Xray,2,,,,x,,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +03 Blunt: Apollo,3,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +04 Blunt: McCurry's Visit ,4,,,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +05 Blunt: Telegram ,5,,,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +06 NGC: Record ,6,,,,x,,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +07 NGC: Receiving ,7,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +08 Mahon to Hubbard,8,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +09 Hubbard to Mahon ,9,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10 No6092: Label ,10,,,,x,,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11 Mahon to Hubbard,11,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12 Laskin: Note,12,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +13 Laskin to Oberhuber ,13,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +14 Laskin to Gerdts ,14,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15 Miles to d'Argencourt ,15,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +16 Lavin to Laskin ,16,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +17 Laskin to Lavin ,17,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +18 NGC: Italian Memo,18,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +19 Laskin to Oberhuber ,19,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +20 Rees: Xrays,20,,,,,,x,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +21 Poussin: Xray,21,,x,,x,,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +22 Courbet: Painting,22,,x,x,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +23 Moore: Painting I,23,,x,x,,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +24 Moore: Painting II,24,,x,x,,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25 Chu: Courbet Signature,25,,,,,x,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +26 Fernier: Courbet Signatures,26,,,,,x,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +27 Courbet: Signature,27,,,,,x,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +28 AGO: Blunt Lecture ,28,,,x,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +29 Blunt: AGO Opening,29,,,x,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +30 Stankievech: An Apology ,30,,,x,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +31 Stankievech: Courtauld Cocktail ,31,,,,,,x,x,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +32 Burgess to Blunt,32,,,x,,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +33 Stankievech: Secret Agent ,33,,,,,,,x,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +34 Blunt: Warburg Journal,34,,,x,,,x,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +35 Lewis: Secret Agents ,35,,,x,,,x,,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +36 Blunt: BBC ,36,,,x,,,,,x,x,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +37 Ruiz: L'Hypothèse du tableau volé ,37,,x,,,,,,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +38 Benjamin: Mondrian,38,,x,,,,,,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +39 Broodthaers: Atlas,39,,,,,,,,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +40 Warburg: Mnemosyne Atlas ,40,,,,,,x,,x,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +41 Mancini: Pittura,41,x,x,,,,,,x,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +42 Stankievech: Mancini / Warburg,42,x,,,,,,x,x,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +43 Ruebens to Nicolas-Claude ,43,x,x,,,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +44 Poe: Purloined Letter,44,,,,,,,,,x,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +45 Lacan: Purloined Letter,45,,,x,,x,,,,x,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +46 MI6: Zinoviev Letter,46,,,,,,,,,x,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +47 UN: Vienna Convention,47,x,,x,,,,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +48 Wittgenstein Key,48,,,,,,,,,x,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +49 Stankievech: Purloined Letter,49,,,,,,,x,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +50 Arendt: Freeport ,50,,,,,,,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/db.json b/db.json index 9028fee..f0e8a4e 100644 --- a/db.json +++ b/db.json @@ -9,10 +9,10 @@ "tag_1": 2, "tag_2": 3, "tag_3": 4, - "tag_4": 5, - "tag_5": 9, - "tag_6": 11, - "tag_7": 12, + "tag_4": 8, + "tag_5": 11, + "tag_6": 0, + "tag_7": 0, "tag_8": 0, "images": [ { @@ -39,9 +39,9 @@ "id": "page_1", "title": "Augustus and Cleopatra ", "type": "image", - "tag_0": 1, - "tag_1": 5, - "tag_2": 11, + "tag_0": 4, + "tag_1": 0, + "tag_2": 0, "tag_3": 0, "tag_4": 0, "tag_5": 0, @@ -73,8 +73,8 @@ "id": "page_2", "title": "A Newly Discovered Poussin", "type": "image", - "tag_0": 1, - "tag_1": 4, + "tag_0": 3, + "tag_1": 0, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -135,9 +135,9 @@ "id": "page_3", "title": "Note on Mr. McCurry's Visit", "type": "image", - "tag_0": 1, + "tag_0": 3, "tag_1": 4, - "tag_2": 5, + "tag_2": 0, "tag_3": 0, "tag_4": 0, "tag_5": 0, @@ -169,9 +169,9 @@ "id": "page_4", "title": "Telegram: Send Express Poussin ", "type": "image", - "tag_0": 1, + "tag_0": 3, "tag_1": 4, - "tag_2": 5, + "tag_2": 0, "tag_3": 0, "tag_4": 0, "tag_5": 0, @@ -203,9 +203,9 @@ "id": "page_5", "title": "Record of Work Done on Pictures ", "type": "image", - "tag_0": 1, - "tag_1": 5, - "tag_2": 11, + "tag_0": 4, + "tag_1": 0, + "tag_2": 0, "tag_3": 0, "tag_4": 0, "tag_5": 0, @@ -237,8 +237,8 @@ "id": "page_6", "title": "Receiving and Shipping Picture", "type": "image", - "tag_0": 1, - "tag_1": 5, + "tag_0": 4, + "tag_1": 0, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -278,8 +278,8 @@ "id": "page_7", "title": "Letter to Robert H. Hubbard Requesting Photo of Label ", "type": "image", - "tag_0": 1, - "tag_1": 5, + "tag_0": 4, + "tag_1": 0, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -312,8 +312,8 @@ "id": "page_8", "title": "Letter to Denis Mahon with Polaroid Photo of Label ", "type": "image", - "tag_0": 1, - "tag_1": 5, + "tag_0": 4, + "tag_1": 0, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -353,9 +353,9 @@ "id": "page_9", "title": "Close Up of no6092 Label ", "type": "image", - "tag_0": 1, - "tag_1": 5, - "tag_2": 11, + "tag_0": 4, + "tag_1": 0, + "tag_2": 0, "tag_3": 0, "tag_4": 0, "tag_5": 0, @@ -394,8 +394,8 @@ "id": "page_10", "title": "Letter to Robert H. Hubbbard ", "type": "image", - "tag_0": 1, - "tag_1": 5, + "tag_0": 4, + "tag_1": 0, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -435,8 +435,8 @@ "id": "page_11", "title": "Note on Two Paintings ", "type": "image", - "tag_0": 1, - "tag_1": 5, + "tag_0": 4, + "tag_1": 0, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -469,8 +469,8 @@ "id": "page_12", "title": "Letter to Konrad Oberhuber ", "type": "image", - "tag_0": 1, - "tag_1": 5, + "tag_0": 4, + "tag_1": 0, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -503,8 +503,8 @@ "id": "page_13", "title": "Letter to William H. Gerdts", "type": "image", - "tag_0": 1, - "tag_1": 5, + "tag_0": 4, + "tag_1": 0, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -537,8 +537,8 @@ "id": "page_14", "title": "Letter to Louise d'Argencourt ", "type": "image", - "tag_0": 1, - "tag_1": 5, + "tag_0": 4, + "tag_1": 0, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -578,8 +578,8 @@ "id": "page_15", "title": "Letter to Myron Laskin, Jr. ", "type": "image", - "tag_0": 1, - "tag_1": 5, + "tag_0": 4, + "tag_1": 0, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -612,8 +612,8 @@ "id": "page_16", "title": "Letter to Marilyn Lavin ", "type": "image", - "tag_0": 1, - "tag_1": 5, + "tag_0": 4, + "tag_1": 0, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -646,8 +646,8 @@ "id": "page_17", "title": "Memo: Italian School 17th Century, no6092 ", "type": "image", - "tag_0": 1, - "tag_1": 5, + "tag_0": 4, + "tag_1": 0, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -680,8 +680,8 @@ "id": "page_18", "title": "Correspondence with Konrad Oberhuber ", "type": "image", - "tag_0": 1, - "tag_1": 5, + "tag_0": 4, + "tag_1": 0, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -728,9 +728,9 @@ "id": "page_19", "title": "Notes on Radiographs of Five Paintings by Poussin", "type": "image", - "tag_0": 1, - "tag_1": 7, - "tag_2": 11, + "tag_0": 6, + "tag_1": 0, + "tag_2": 0, "tag_3": 0, "tag_4": 0, "tag_5": 0, @@ -781,11 +781,10 @@ { "__index": 20, "id": "page_20", - "title": "21 Poussin: Xray", "type": "image", - "tag_0": 3, - "tag_1": 5, - "tag_2": 11, + "tag_0": 2, + "tag_1": 4, + "tag_2": 0, "tag_3": 0, "tag_4": 0, "tag_5": 0, @@ -798,9 +797,9 @@ "id": "page_21", "title": "Woman Painted at Palavas ", "type": "image", - "tag_0": 3, - "tag_1": 4, - "tag_2": 6, + "tag_0": 2, + "tag_1": 3, + "tag_2": 5, "tag_3": 0, "tag_4": 0, "tag_5": 0, @@ -830,12 +829,11 @@ { "__index": 22, "id": "page_22", - "title": "23 Moore: Painting I", "type": "image", - "tag_0": 3, - "tag_1": 4, - "tag_2": 6, - "tag_3": 7, + "tag_0": 2, + "tag_1": 3, + "tag_2": 5, + "tag_3": 6, "tag_4": 0, "tag_5": 0, "tag_6": 0, @@ -845,12 +843,11 @@ { "__index": 23, "id": "page_23", - "title": "24 Moore: Painting II", "type": "image", - "tag_0": 3, - "tag_1": 4, - "tag_2": 6, - "tag_3": 7, + "tag_0": 2, + "tag_1": 3, + "tag_2": 5, + "tag_3": 6, "tag_4": 0, "tag_5": 0, "tag_6": 0, @@ -862,8 +859,8 @@ "id": "page_24", "title": "Email RE: Toronto Courbet question (4.5.2015) ", "type": "image", - "tag_0": 6, - "tag_1": 11, + "tag_0": 5, + "tag_1": 0, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -896,8 +893,8 @@ "id": "page_25", "title": "Courbet Signatures", "type": "image", - "tag_0": 6, - "tag_1": 11, + "tag_0": 5, + "tag_1": 0, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -930,8 +927,8 @@ "id": "page_26", "title": "Woman Painted at Palavas (detail) ", "type": "image", - "tag_0": 6, - "tag_1": 11, + "tag_0": 5, + "tag_1": 0, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -964,8 +961,8 @@ "id": "page_27", "title": "Invitation to Blunt Lecture (16.12.1965)", "type": "image", - "tag_0": 4, - "tag_1": 6, + "tag_0": 3, + "tag_1": 5, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -998,8 +995,8 @@ "id": "page_28", "title": "Letter from Sir Anthony Blunt to William J. Withrow re: Stage I opening ceremonies (8.4.1974) ", "type": "image", - "tag_0": 4, - "tag_1": 6, + "tag_0": 3, + "tag_1": 5, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -1032,9 +1029,9 @@ "id": "page_29", "title": "An Apology for Poussin’s Augustus and Cleopatra: Sir Anthony Blunt’s Farewell Lecture at the Courtauld Institute of Art, 8 April 1974", "type": "video", - "tag_0": 4, - "tag_1": 8, - "tag_2": 13, + "tag_0": 3, + "tag_1": 7, + "tag_2": 0, "tag_3": 0, "tag_4": 0, "tag_5": 0, @@ -1053,7 +1050,7 @@ "author": "CHARLES STANKIEVECH", "threeObject": { "path": "data_store/30-Apology/", - "file": "textured_output.obj" + "file": "Projector.obj" } }, { @@ -1061,10 +1058,10 @@ "id": "page_30", "title": "Courtauld Cocktail ", "type": "video", - "tag_0": 7, - "tag_1": 8, - "tag_2": 10, - "tag_3": 13, + "tag_0": 6, + "tag_1": 7, + "tag_2": 9, + "tag_3": 0, "tag_4": 0, "tag_5": 0, "tag_6": 0, @@ -1079,15 +1076,19 @@ ], "citation": "2016
\nMixed Media
\n5 x 5 x 30cm
\nCourtesy the Artist
\n", "description": "

\nIn 1937 at the Courtauld Institute of Art, Stephen Rees Jones discovered that chemicals in the laboratory were being stolen to create improvised explosives to throw at fascist marches. The term ‘Molotov Cocktail’ comes from the Finnish resistance a few years later but, stemming from their use in the Spanish Civil War earlier in the decade, the British Home Guard disseminated information on how to make such guerilla weapons in case of an invasion in the impending war. One strategy utilized film strips as the fuse because, at the time, the nitrate base of film stock made it highly flammable. \n

\n\n", - "author": "CHARLES STANKIEVECH " + "author": "CHARLES STANKIEVECH ", + "threeObject": { + "path": "data_store/31-Cocktail/", + "file": "Charles_MoltovLowres.obj" + } }, { "__index": 31, "id": "page_31", "title": "Letter to Anthony Blunt about BBC Broadcast (22.7.1938) ", "type": "image", - "tag_0": 4, - "tag_1": 10, + "tag_0": 3, + "tag_1": 9, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -1118,26 +1119,30 @@ { "__index": 32, "id": "page_32", - "title": "33 Stankievech: Secret Agent ", - "type": "image", - "tag_0": 8, - "tag_1": 10, - "tag_2": 13, + "type": "video", + "tag_0": 7, + "tag_1": 9, + "tag_2": 0, "tag_3": 0, "tag_4": 0, "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [], + "threeObject": { + "path": "data_store/33-Agent/", + "file": "Charles_Clock.obj" + } }, { "__index": 33, "id": "page_33", "title": "The Criminal-King in the 19th Century Novel", "type": "image", - "tag_0": 4, - "tag_1": 7, - "tag_2": 10, + "tag_0": 3, + "tag_1": 6, + "tag_2": 9, "tag_3": 0, "tag_4": 0, "tag_5": 0, @@ -1183,10 +1188,10 @@ "id": "page_34", "title": "Connoisseurs and Secret Agents ", "type": "image", - "tag_0": 4, - "tag_1": 7, - "tag_2": 9, - "tag_3": 10, + "tag_0": 3, + "tag_1": 6, + "tag_2": 8, + "tag_3": 9, "tag_4": 0, "tag_5": 0, "tag_6": 0, @@ -1231,10 +1236,10 @@ "id": "page_35", "title": "BBC Panorama: The Queen's Gallery ", "type": "video", - "tag_0": 4, - "tag_1": 9, - "tag_2": 10, - "tag_3": 12, + "tag_0": 3, + "tag_1": 8, + "tag_2": 9, + "tag_3": 11, "tag_4": 0, "tag_5": 0, "tag_6": 0, @@ -1262,9 +1267,9 @@ "id": "page_36", "title": "L'Hypothèse du tableau volé ", "type": "video", - "tag_0": 3, - "tag_1": 9, - "tag_2": 10, + "tag_0": 2, + "tag_1": 8, + "tag_2": 9, "tag_3": 0, "tag_4": 0, "tag_5": 0, @@ -1293,9 +1298,9 @@ "id": "page_37", "title": "Mondrian 63-96 ", "type": "video", - "tag_0": 3, - "tag_1": 9, - "tag_2": 10, + "tag_0": 2, + "tag_1": 8, + "tag_2": 9, "tag_3": 0, "tag_4": 0, "tag_5": 0, @@ -1324,8 +1329,8 @@ "id": "page_38", "title": "The conquest of space, Atlas for the use of artists and the military ", "type": "video", - "tag_0": 9, - "tag_1": 10, + "tag_0": 8, + "tag_1": 9, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -1342,17 +1347,21 @@ ], "citation": "1975
\nArtist Book
\n4.2 x 2.9 x 1 cm
\nPrivate Collection
\n", "description": "

\nMarcel Broodthaers was perhaps the first artist to colonize the role of the curator as an artwork, in his project Museum of Eagles. While maintaining his obsessions with surrealism, his work, over time, took on a role more critical of the history of European colonialism. The last artist book he made was the ridiculously small The conquest of space, Atlas for the use of artists and the military. \n

\n\n", - "author": "MARCEL BROODTHAERS " + "author": "MARCEL BROODTHAERS ", + "threeObject": { + "path": "data_store/39-Broodthaers/", + "file": "Charles_AtlasBook.obj" + } }, { "__index": 39, "id": "page_39", "title": "Der Bildatlas Mnemosyne (Taflen No79)", "type": "image", - "tag_0": 7, - "tag_1": 9, - "tag_2": 10, - "tag_3": 11, + "tag_0": 6, + "tag_1": 8, + "tag_2": 9, + "tag_3": 0, "tag_4": 0, "tag_5": 0, "tag_6": 0, @@ -1383,11 +1392,11 @@ "id": "page_40", "title": "Considerazioni sulla pittura ", "type": "image", - "tag_0": 2, - "tag_1": 3, - "tag_2": 9, - "tag_3": 10, - "tag_4": 11, + "tag_0": 1, + "tag_1": 2, + "tag_2": 8, + "tag_3": 9, + "tag_4": 0, "tag_5": 0, "tag_6": 0, "tag_7": 0, @@ -1417,11 +1426,11 @@ "id": "page_41", "title": "Mancini's Caratteri / Warburg's Atlas", "type": "image", - "tag_0": 2, - "tag_1": 8, - "tag_2": 9, - "tag_3": 11, - "tag_4": 13, + "tag_0": 1, + "tag_1": 7, + "tag_2": 8, + "tag_3": 0, + "tag_4": 0, "tag_5": 0, "tag_6": 0, "tag_7": 0, @@ -1451,9 +1460,9 @@ "id": "page_42", "title": "Letter to Nicolas-Claude Fabri De Peiresc", "type": "image", - "tag_0": 2, - "tag_1": 3, - "tag_2": 10, + "tag_0": 1, + "tag_1": 2, + "tag_2": 9, "tag_3": 0, "tag_4": 0, "tag_5": 0, @@ -1492,9 +1501,9 @@ "id": "page_43", "title": "The Purloined Letter", "type": "image", - "tag_0": 10, + "tag_0": 9, "tag_1": 11, - "tag_2": 12, + "tag_2": 0, "tag_3": 0, "tag_4": 0, "tag_5": 0, @@ -1687,11 +1696,11 @@ "id": "page_44", "title": "Seminar on The Purloined Letter ", "type": "image", - "tag_0": 1, - "tag_1": 4, - "tag_2": 10, + "tag_0": 3, + "tag_1": 5, + "tag_2": 9, "tag_3": 11, - "tag_4": 12, + "tag_4": 0, "tag_5": 0, "tag_6": 0, "tag_7": 0, @@ -1756,8 +1765,8 @@ "id": "page_45", "title": "Zinoviev Letter ", "type": "image", - "tag_0": 10, - "tag_1": 12, + "tag_0": 9, + "tag_1": 11, "tag_2": 0, "tag_3": 0, "tag_4": 0, @@ -1804,9 +1813,9 @@ "id": "page_46", "title": "Vienna Convention On Diplomatic Relations", "type": "image", - "tag_0": 2, - "tag_1": 4, - "tag_2": 12, + "tag_0": 1, + "tag_1": 3, + "tag_2": 11, "tag_3": 0, "tag_4": 0, "tag_5": 0, @@ -1851,27 +1860,31 @@ { "__index": 47, "id": "page_47", - "title": "48 Wittgenstein Key", - "type": "image", - "tag_0": 10, - "tag_1": 12, + "type": "video", + "tag_0": 9, + "tag_1": 11, "tag_2": 0, "tag_3": 0, "tag_4": 0, "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [], + "threeObject": { + "path": "data_store/48-Wittgenstein/", + "file": "Charles_Key.obj" + } }, { "__index": 48, "id": "page_48", "title": "no6092: The Purloined Letter ", "type": "video", - "tag_0": 1, - "tag_1": 8, - "tag_2": 12, - "tag_3": 13, + "tag_0": 7, + "tag_1": 11, + "tag_2": 0, + "tag_3": 0, "tag_4": 0, "tag_5": 0, "tag_6": 0, @@ -1899,7 +1912,7 @@ "id": "page_49", "title": "The Luxembourg Freeport: The Instruction Manual ", "type": "image", - "tag_0": 12, + "tag_0": 11, "tag_1": 0, "tag_2": 0, "tag_3": 0, diff --git a/index.js b/index.js index 8684702..5dfd657 100644 --- a/index.js +++ b/index.js @@ -8,21 +8,19 @@ const __dirname = path.resolve(); var isProduction = process.env.OK_PRODUCTION === "true"; // Charles' types from the spreadsheet -var tagTypes = [ +var categories = [ "(none)", - "No6092", "1620s", "painting", "blunt", "National Gallery of Canada", - "AGO", - "courtauld", - "intervensions", + "Art Gallery of Ontario", + "Courtauld Institute", + "Stankievech", "connsoeurship", "double agent", "forensics", "black box", - "Stankievech", ].map((type, index) => [index, type]); var app = okcms @@ -48,15 +46,15 @@ var app = okcms description: { type: "text" }, thumbnail: { type: "image" }, images: { type: "gallery" }, - tag_0: { type: "enum", options: tagTypes, alias: "Tag #1" }, - tag_1: { type: "enum", options: tagTypes, alias: "Tag #2" }, - tag_2: { type: "enum", options: tagTypes, alias: "Tag #3" }, - tag_3: { type: "enum", options: tagTypes, alias: "Tag #4" }, - tag_4: { type: "enum", options: tagTypes, alias: "Tag #5" }, - tag_5: { type: "enum", options: tagTypes, alias: "Tag #6" }, - tag_6: { type: "enum", options: tagTypes, alias: "Tag #7" }, - tag_7: { type: "enum", options: tagTypes, alias: "Tag #8" }, - tag_8: { type: "enum", options: tagTypes, alias: "Tag #9" }, + tag_0: { type: "enum", options: categories, alias: "Tag #1" }, + tag_1: { type: "enum", options: categories, alias: "Tag #2" }, + tag_2: { type: "enum", options: categories, alias: "Tag #3" }, + tag_3: { type: "enum", options: categories, alias: "Tag #4" }, + tag_4: { type: "enum", options: categories, alias: "Tag #5" }, + tag_5: { type: "enum", options: categories, alias: "Tag #6" }, + tag_6: { type: "enum", options: categories, alias: "Tag #7" }, + tag_7: { type: "enum", options: categories, alias: "Tag #8" }, + tag_8: { type: "enum", options: categories, alias: "Tag #9" }, hidden: { type: "flag" }, }, ui: { diff --git a/load_spreadsheet.js b/load_spreadsheet.js index a7f1793..689b9d8 100644 --- a/load_spreadsheet.js +++ b/load_spreadsheet.js @@ -11,7 +11,7 @@ import sizeOf from "image-size"; const datasheetFile = "./data_store/tags.csv"; const dbFile = "./db.json"; -var tagTypes = "No6092,1620s,painting,blunt,National Gallery of Canada,AGO,courtauld,intervensions,connsoeurship,double agent,forensics,black box,Stankievech".split( +var categories = "1620s,painting,blunt,National Gallery of Canada,Art Gallery of Ontario,Courtauld Institute,Stankievech,connsoeurship,double agent,forensics,black box".split( "," ); @@ -46,7 +46,7 @@ async function main() { }; // loop over the tags... let tagIndex = 0; - tagTypes.forEach((type, tagId) => { + categories.forEach((type, tagId) => { if (row[type] === "x") { record["tag_" + tagIndex] = tagId + 1; tagIndex += 1; diff --git a/public/assets/css/css.css b/public/assets/css/css.css index fddad92..fc05db2 100644 --- a/public/assets/css/css.css +++ b/public/assets/css/css.css @@ -32,7 +32,7 @@ body { background: rgba(0, 0, 0, 0.5); color: #fff; transition: opacity 0.2s; - text-transform: capitalize; + text-transform: lowercase; font-variant: small-caps; } .legend .category { @@ -169,3 +169,14 @@ body { width: 100%; height: 100%; } + +/** Clocks */ + +.clocks { + display: flex; + flex-direction: row; + width: 100%; + height: calc(100vh - 12rem); + align-items: center; + justify-content: space-evenly; +} diff --git a/public/assets/img/clock/clock.jpg b/public/assets/img/clock/clock.jpg new file mode 100644 index 0000000..2ed2b10 Binary files /dev/null and b/public/assets/img/clock/clock.jpg differ diff --git a/public/assets/img/clock/clock.png b/public/assets/img/clock/clock.png new file mode 100644 index 0000000..c1d3e86 Binary files /dev/null and b/public/assets/img/clock/clock.png differ diff --git a/public/assets/img/clock/hour.png b/public/assets/img/clock/hour.png new file mode 100644 index 0000000..b8fd5d3 Binary files /dev/null and b/public/assets/img/clock/hour.png differ diff --git a/public/assets/img/clock/minute.png b/public/assets/img/clock/minute.png new file mode 100644 index 0000000..1dc5df0 Binary files /dev/null and b/public/assets/img/clock/minute.png differ diff --git a/public/assets/img/clock/second.png b/public/assets/img/clock/second.png new file mode 100644 index 0000000..9b2b854 Binary files /dev/null and b/public/assets/img/clock/second.png differ diff --git a/src/graph.js b/src/graph.js index a210f23..3a0e8a1 100644 --- a/src/graph.js +++ b/src/graph.js @@ -3,7 +3,9 @@ import ForceGraph3D from "3d-force-graph"; import SpriteText from "three-spritetext"; import { union } from "./utils/set_utils.js"; -const IMG_SCALE = 20; +const IMG_SCALE = 16; +const MAIN_IMG_SCALE = 80; +const OBJECT_SCALE = 10; export default function buildGraph({ db, objects, handlers }) { const linkable = {}; @@ -85,7 +87,7 @@ export default function buildGraph({ db, objects, handlers }) { var center = new THREE.Vector3(); box.getCenter(center); object.position.sub(center); - object.scale.set(100, 100, 100); + object.scale.set(OBJECT_SCALE, OBJECT_SCALE, OBJECT_SCALE); return object; } else if (node.data.thumbnail?.uri) { if (node.data.thumbnail.type === "video") { @@ -103,7 +105,11 @@ export default function buildGraph({ db, objects, handlers }) { const aspect = node.data.thumbnail.width / node.data.thumbnail.height; material = new THREE.SpriteMaterial({ map: texture }); sprite = new THREE.Sprite(material); - sprite.scale.set(IMG_SCALE, IMG_SCALE / aspect); + if (node.id === 0) { + sprite.scale.set(MAIN_IMG_SCALE, MAIN_IMG_SCALE / aspect); + } else { + sprite.scale.set(IMG_SCALE, IMG_SCALE / aspect); + } return sprite; } else { sprite = new SpriteText( @@ -117,6 +123,12 @@ export default function buildGraph({ db, objects, handlers }) { }) .onNodeClick(handlers.click); + // TrackballControls + graph.controls().addEventListener("change", () => { + const position = graph.cameraPosition(); + // console.log(position); + }); + const initialZoom = () => { const distance = 20000; let angle = 0; diff --git a/src/views/Clock.js b/src/views/Clock.js new file mode 100644 index 0000000..a394b62 --- /dev/null +++ b/src/views/Clock.js @@ -0,0 +1,108 @@ +/** + * Analog Clock + */ + +import React, { useState, useEffect } from "react"; + +const clock = { + width: "20vw", + height: "20vw", + background: "url(assets/img/clock/clock.png)", + backgroundSize: "contain", + backgroundPosition: "center center", + backgroundRepeat: "no-repeat", + position: "relative", +}; + +const handStyle = { + position: "absolute", + top: "0%", + left: "0%", +}; + +const hourStyle = { + ...handStyle, + height: "calc(540 / 1268 * 10vw)", + transformOrigin: "45.46% 96.62%", +}; + +const minuteStyle = { + ...handStyle, + height: "calc(795 / 1268 * 10vw)", + transformOrigin: "50% 84.05%", +}; + +const secondStyle = { + ...handStyle, + height: "calc(993 / 1268 * 10vw)", + transformOrigin: "45.83% 76.63%", +}; + +const hourTransform = + "translateX(10.45vw) translateY(10vw) translateX(-100%) translateY(-100%) "; +const minuteTransform = + "translateX(10.45vw) translateY(10.8vw) translateX(-100%) translateY(-100%) "; +const secondTransform = + "translateX(10.2vw) translateY(11.5vw) translateX(-100%) translateY(-100%) "; + +export default function Clock({ utc }) { + const [hour, setHour] = useState({}); + const [minute, setMinute] = useState({}); + const [second, setSecond] = useState({}); + + useEffect(() => { + const update = () => { + const time = new Date(); + const hours = utc ? time.getUTCHours() : time.getHours(); + const minutes = time.getMinutes(); + const seconds = time.getSeconds(); + const ms = time.getMilliseconds(); + setHour({ + ...hourStyle, + transform: + hourTransform + + "rotate(" + + (((hours % 12) + minutes / 60 + seconds / 3600) / 12) * 360 + + "deg)", + }); + setMinute({ + ...minuteStyle, + transform: + minuteTransform + + "rotate(" + + (minutes / 60 + seconds / 3600) * 360 + + "deg)", + }); + setSecond({ + ...secondStyle, + transform: + secondTransform + + "rotate(" + + (seconds / 60 + ms / 60000) * 360 + + "deg)", + }); + }; + update(); + const intervalId = setInterval(update, 50); + return () => clearInterval(intervalId); + }, []); + + return ( +
+ + + +
+ ); +} + +// ratio: 500 / 1268 +// hour: 540 +// minute: 795 +// second: 993 + +// hour transform origin: 40 x 515 // 88 / 533 +// minute transform origin: 37 x 622 // 72 x 740 +// second transform origin: 11 x 751 // 24 x 980 + +const rand = (n) => Math.random() * n; diff --git a/src/views/Clocks.js b/src/views/Clocks.js new file mode 100644 index 0000000..d984f7b --- /dev/null +++ b/src/views/Clocks.js @@ -0,0 +1,15 @@ +/** + * Two clocks + */ + +import React from "react"; +import Clock from "./Clock.js"; + +export default function Clocks() { + return ( +
+ + +
+ ); +} diff --git a/src/views/Detail.js b/src/views/Detail.js index ff6a6a5..b1c4dcf 100644 --- a/src/views/Detail.js +++ b/src/views/Detail.js @@ -5,6 +5,7 @@ import React from "react"; import Gallery from "./Gallery.js"; +import Clocks from "./Clocks.js"; import Vimeo from "@u-wave/react-vimeo"; export default function Detail({ node, visible, onClose }) { @@ -39,7 +40,9 @@ export default function Detail({ node, visible, onClose }) {
- {data.type === "video" ? ( + {index === 33 ? ( + + ) : data.type === "video" ? ( visible && (