From 8201e3ce98c081409db20928350d9bbf149dddc7 Mon Sep 17 00:00:00 2001 From: James Chao Date: Mon, 8 Aug 2022 21:59:29 -0700 Subject: [PATCH 1/5] table view and initial flyout --- .../__mock_data__/explanation.ts | 5 + .../__mock_data__/visionData.ts | 44 +++ .../Interfaces/VisionExplanationInterfaces.ts | 9 + .../Controls/Flyout.styles.ts | 63 ++++ .../Controls/Flyout.tsx | 57 ++++ .../Controls/ImageList.styles.ts | 47 +++ .../Controls/ImageList.tsx | 116 +++++++ .../Controls/TableList.tsx | 223 +++++++++++++ .../Interfaces/IExplanationDashboardProps.ts | 19 ++ .../VisionExplanationDashboard.styles.ts | 72 +++++ .../VisionExplanationDashboard.tsx | 306 ++++++++++++++++++ 11 files changed, 961 insertions(+) create mode 100644 apps/dashboard/src/interpret-vision/__mock_data__/explanation.ts create mode 100644 apps/dashboard/src/interpret-vision/__mock_data__/visionData.ts create mode 100644 libs/core-ui/src/lib/Interfaces/VisionExplanationInterfaces.ts create mode 100644 libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.styles.ts create mode 100644 libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.tsx create mode 100644 libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.styles.ts create mode 100644 libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.tsx create mode 100644 libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TableList.tsx create mode 100644 libs/interpret-vision/src/lib/VisionExplanationDashboard/Interfaces/IExplanationDashboardProps.ts create mode 100644 libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.styles.ts create mode 100644 libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.tsx diff --git a/apps/dashboard/src/interpret-vision/__mock_data__/explanation.ts b/apps/dashboard/src/interpret-vision/__mock_data__/explanation.ts new file mode 100644 index 0000000000..7616b58f92 --- /dev/null +++ b/apps/dashboard/src/interpret-vision/__mock_data__/explanation.ts @@ -0,0 +1,5 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +export const explanation = + "/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAH0BdwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKhubu2sohLdXEUEZZUDyuFG5iAoye5JAA7k0ATUVXF/ZtqDaeLuA3qx+abcSDzAmcbtvXbnjPSqU/ifQLa3huJ9c0yKGbPlSSXcarJg4O0k4PII470AatFc94k8Y6V4Yt9MnvLiDyr+6jgjczqgCt1kyTyqjBJ9xWg2v6MmlJqjavYDTnOEuzcp5THJHD5weQR17UAaNFU/7W00acuonULT7C2Ntz5y+UcnaMNnHJIA56nFOstTsNR877De2115L+XL5Eqv5bf3WweD7GgC1RWB4o8W6b4Tj099QliQXt2lspeZU2Bj80hz/CvGfTNXX8Q6JHpceqPrGnrp8hwl2blBExyRgPnB5B79qANKiqg1TTzb21wL61MN04jt5POXbKx6KpzhicHgelOXUbF7q5tVvbdri1UNcRCVS8QIyCwzlQRyM0AWaKoT65pNrp0Wo3GqWUNjKAY7mS4RYnBGQQxODmpDqunLYx3xv7UWkpVY5zMvluWOFAbODknA9TQBboqrY6lYamkj2F7bXaRSGKRoJVkCOACVJB4PI496tUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRUN3d21hayXV5cRW9vEN0kszhEQepJ4FAE1FUrXWNLvbyaztNSs7i6g/1sEU6u8f8AvKDkfjVTStW/4pmDU9X1DSvuFprq0m/0XqRlXY9OnU9c0AbFFcr4h8Xw2nhyLVdDurC/Vr63ti6SCWPEkqo3KN1Ab1rojfWi362JuoBeNGZVtzIPMKA43BeuM8ZoAsUVQstc0jUrqW1sdVsbq4i/1kUFwjun1AORWR4c8d6F4lu7u0tL+zF1BdS28cAukZ51T/loig5KkZOfagDpqKjuLiC0tpbm5mjhgiUvJLIwVUUckkngAetcb4H8ZTeLI7vUZL/RVsV3lLS3ctcQKHIVpm3YAKqT90detAHbUVS07WdL1dZG0zUrO9EZw5tp1k2n0O0nFQw+JNCuLi3gh1rTpJrkboI0ukLSjJGVAOW5B6elAGnRVLUdZ0vR0R9T1KzslkOENzOsYY+24jNLdavptlYLf3eo2lvZsAVuJZlSM56YYnHNAFyiobW7tr62S5tLiK4t5BlJYnDqw9iODU1ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFUr3WNM05yl9qVnasIzMVnnVCEBALcn7uSBnpkikbWtKTTF1J9TslsG+7dGdREfo+cfrQBeoqnb6vpt3pz6jbajaTWKKzNcxzK0agDJJYHAAHWuf8VeNLXS/D13eaPfadeXtu9tmHzRJtSWZE3EKwIBVyQfp1oA6yiq731pHfR2L3UC3ciGRIDIBIyjqwXqQPWrFABRXJ+DfGlrr2gaVNqN9p0GrXqM4s0lCs2HYDajMWPA9639R1nS9IWNtT1KzslkOENzOsYY+g3EZoAu0VVn1Kwto4JJ722ijnO2FpJVUSHBbCknngE8dgaTT9V07VoWm02/tb2JW2s9tMsig+hKk80AW6Kz4Ne0e61F9Pt9WsZr5M7raO5RpFx1yoORWH4U8aWur6Rayarfada6lc3E8UVsJQjSBJnjXarMSSQo6d80AdZRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUVnya9o8OpLpsurWKX7EBbVrlBKSemEzn9KANCiuT8L+NLXVNOjbVr7TrS/mu7iCG380RtII5mjXarMSSQo6d66YXdsb1rMXERuljEpg3jeEJIDbeuCQRn2NAE1FU21fTFiaVtRtBGk/2ZnM64WXOPLJz97Jxt65qEeIdEaxmvhrGnmzhkMUtx9pTy0fj5WbOAeRx70AaVFctrvi2O0s9Fu9IubG8tr/AFWCykmV/MQI5O4qynG4Y9x7Vu6fq+m6skj6bqFperG21zbTLIFPodpODQBcooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK57x1pr6t4G1mziz55tmkhx18xPnT/x5RXQ0daAPB7jxI0UUvxQiVlF482nxhQfufZR5Y/8CIiP+BV0CqdKl0/wrFF4cs5NN0WB7i91mHzDICWDKg3L8oYMSScZbpXpA0LSBpkemDSrEafG25LX7OnlKc7shMYBzz06806+0bS9Ukhk1DTbO7eE5ia4gWQof9kkHH4UAeOabJDN8MfCctw0D21v4oRBIU2xpF9pcdGztTGBgngYHat7xYrt8RdEW3utFttPOnS/Yn1G3823M/mDeEAdQH27ec9N1ejNpGmPYS2DadaGzlZmktzAvluxO4krjBJPJ96jOgaM2lJpbaTYHTk5W0NsnlLyTwmMDkk9O9AHlOu6ILL4a+Kojq2mXkV5qVm7w6WnlxWzmaEMAN7bSeGxnqc969estPs9Nt1gsbSC2hUABIYwgwOBwKhj0PSItOOnR6VYpYlgxtlt0EZYEEHbjGQQD9QKqazeeIre5jXR9Isb2Epl3uL4wFWz0AEbZGMc5oAwviWkH2Pw5NcrH5Uev2ZkeQDaqliDknoOmapap/ZH/C09H/tP7H/Zf9kzf2f5u3yftHmjzNufl3bMfhmupsE1LWLS6tvE2h6dFA20LClx9qSUc53Bo1Axgev6VZfw9okmlx6W+j6e2nxnKWjWyGJTknITGByT270AeWGCNvB/jW90RVOm6brC6jpvlfcDQiOSXy+23crjjjk4rJ1PUJrW0vPFNnvZvF4vbCAkHOS6R2p/74Rz+Ne6R2NpFY/YY7WBLTYY/IWMCPaeq7emPaoTo2lm1tLU6bZm3s3WS2i8hdkDr91kGMKRngjpQB5nr1hPYfELRtOjutItrO20RYdPbV7YyxF1fEgQb1Ak2iP1OPxqlq+hR2vw91OzfVNOv7e71+1Z49NTZDbl5Yt8ajc23ruxn+L3r1y/0yw1W2+z6jY215BnPlXESyLn1wwIqNNE0mOxWxj0yyS0VxItutuojDAghguMZBAOfagCe0srSwgEFnbQ28Q6JDGEXpjo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UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU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NwBxlT1GfWr9p4v1Cfwv4a1N4bYT6pfx20yhW2qrM4JX5sg/KOpNaWl+C9N0iLR4raa7K6TLcS2/mSBixm37gxxk43nHQ9Mk1Wi+H+nxXFmy6jqZtrK8+22tmZl8mF8sSANuSPmPBJxnjFAGGfiJqM15LPZ2Znso71rYWsemXTyyIsnltIJ1HlA8M23B4GCwPT0iudTwjFb30s1jq2qWVvNObiSyglQQs5OWPKFl3HJIVgOT610VABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBxPi/SrFPFPhPVVt0+3Pq6wmfkts+zznb7DIB/Cs3VfEHim+1zXINEg1LGmSi3gjtoLVopZPLV/wB8ZXD4JfHyY4Gck8Dq9Z8H6Nr97Fd6jHdvNDgxmK/nhCEAgMFRwA2GIzjODReeDtDvrgXE1tMJvLWJ5IruaJpVUYAkKuPMwP72aAC517ULRbdT4Y1W6kkhWSQ2rW5SNz1TLyqSR7DHvVPVre78aeEtU0p9Nu9IkuEESm/ETZ5BziORsjjuRXToixRrGgwigKo9AKg1DT7bVLGSzu1doJMbgkjRtwQQQykEHIHQ0Acp4Rgj0PxDqOgNpOj2lx9mivBPpVt5CTIWdAHQkkMCDjkgg9ua7SszSfD+maGZ2sLdllnIM00srzSSY6bncliBk4BPGa06ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/2Q=="; diff --git a/apps/dashboard/src/interpret-vision/__mock_data__/visionData.ts b/apps/dashboard/src/interpret-vision/__mock_data__/visionData.ts new file mode 100644 index 0000000000..baeb4ab1d5 --- /dev/null +++ b/apps/dashboard/src/interpret-vision/__mock_data__/visionData.ts @@ -0,0 +1,44 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { IVisionExplanationDashboardData } from "@responsible-ai/core-ui"; + +import { explanation } from "./explanation"; + +export const visionData: IVisionExplanationDashboardData = { + classNames: ["Water Tower", "not Water Tower"], + images: [ + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg", + "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg" + ], + localExplanations: [explanation], + prediction: [0, 1] +}; diff --git a/libs/core-ui/src/lib/Interfaces/VisionExplanationInterfaces.ts b/libs/core-ui/src/lib/Interfaces/VisionExplanationInterfaces.ts new file mode 100644 index 0000000000..387d22cdca --- /dev/null +++ b/libs/core-ui/src/lib/Interfaces/VisionExplanationInterfaces.ts @@ -0,0 +1,9 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +export interface IVisionExplanationDashboardData { + classNames: string[]; + localExplanations: string[]; + prediction: number[]; + images: string[]; +} diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.styles.ts b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.styles.ts new file mode 100644 index 0000000000..d32ad17cb1 --- /dev/null +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.styles.ts @@ -0,0 +1,63 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + IStyle, + mergeStyleSets, + IProcessedStyleSet, + FontSizes +} from "@fluentui/react"; + +export interface IFlyoutStyles { + line: IStyle; + list: IStyle; + tile: IStyle; + sizer: IStyle; + padder: IStyle; + label: IStyle; + image: IStyle; +} + +export const flyoutStyles: () => IProcessedStyleSet = () => { + return mergeStyleSets({ + image: { + left: 0, + position: "absolute", + top: 0, + width: "100%" + }, + label: { + color: "black", + fontSize: FontSizes.small, + justifySelf: "center", + paddingBottom: "100%", + width: "100%" + }, + line: { + borderTop: "1px solid #EDEBE9" + }, + list: { + fontSize: 0, + overflow: "scroll", + position: "relative" + }, + padder: { + bottom: 2, + left: 2, + position: "absolute", + right: 2, + top: 2 + }, + sizer: { + paddingBottom: "100%" + }, + tile: { + float: "left", + marginTop: "0.5%", + paddingLeft: "1%", + paddingRight: "1%", + position: "relative", + textAlign: "center" + } + }); +}; diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.tsx b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.tsx new file mode 100644 index 0000000000..77974d3c8b --- /dev/null +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.tsx @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { Image, Panel, PanelType, FocusZone, Stack } from "@fluentui/react"; +import React from "react"; + +import { IDatasetSummary } from "../Interfaces/IExplanationDashboardProps"; + +import { flyoutStyles } from "./Flyout.styles"; +import { IListItem } from "./ImageList"; + +export interface IFlyoutProps { + data: IDatasetSummary; + isOpen: boolean; + item: IListItem | undefined; + callback: () => void; +} + +export class IFlyoutState {} + +export class Flyout extends React.Component { + public constructor(props: IFlyoutProps) { + super(props); + this.state = {}; + } + + public render(): React.ReactNode { + const classNames = flyoutStyles(); + + return ( + + + + +
+ + + + + + + + ); + } +} diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.styles.ts b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.styles.ts new file mode 100644 index 0000000000..af95ebf752 --- /dev/null +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.styles.ts @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + IStyle, + mergeStyleSets, + IProcessedStyleSet, + FontSizes +} from "@fluentui/react"; + +export interface IDatasetExplorerTabStyles { + list: IStyle; + tile: IStyle; + label: IStyle; + image: IStyle; +} + +export const imageListStyles: () => IProcessedStyleSet = + () => { + return mergeStyleSets({ + image: { + left: 0, + position: "absolute", + top: 0, + width: "100%" + }, + label: { + color: "black", + fontSize: FontSizes.small, + justifySelf: "center", + paddingBottom: 10, + width: "100%" + }, + list: { + fontSize: 0, + position: "relative" + }, + tile: { + float: "left", + marginTop: 10, + paddingLeft: 10, + paddingRight: 10, + position: "relative", + textAlign: "center" + } + }); + }; diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.tsx b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.tsx new file mode 100644 index 0000000000..791b14b52a --- /dev/null +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.tsx @@ -0,0 +1,116 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + Text, + FocusZone, + List, + Image, + ImageFit, + IRectangle, + IPageSpecification +} from "@fluentui/react"; +import React from "react"; + +import { IDatasetSummary } from "../Interfaces/IExplanationDashboardProps"; + +import { imageListStyles } from "./ImageList.styles"; + +export interface IImageListProps { + data: IDatasetSummary; + imageDim: number; + openPanel: () => void; +} + +export interface IImageListState { + images: IListItem[]; +} + +export interface IListItem { + title: string; + image: string; +} + +export class ImageList extends React.Component< + IImageListProps, + IImageListState +> { + public constructor(props: IImageListProps) { + super(props); + + this.state = { + images: [] + }; + } + + public componentDidMount() { + if (!this.props.data.classNames) { + return; + } + const label: string = this.props.data.classNames[0]; + const images: IListItem[] = []; + this.props.data.images.forEach((item) => { + images.push({ + image: item, + title: label + }); + }); + + this.setState({ images }); + } + + public render(): React.ReactNode { + const classNames = imageListStyles(); + + return ( + + + + ); + } + + private onRenderCell = (item?: IListItem | undefined) => { + const classNames = imageListStyles(); + return ( +
+ {item?.title} + {item?.title} +
+ ); + }; + + private getPageSpecification = ( + itemIndex?: number | undefined, + visibleRect?: IRectangle | undefined + ) => { + const ret: IPageSpecification = {}; + if (!visibleRect || !itemIndex) { + return ret; + } + /* Height of each tile is calculated as rowsPerPage * (defaultImageDim + textPadder + textHeight) */ + ret.height = 750; + + /* Item count is calculated as rowsPerPage * (rectangle width / (imageDim + padder + padder)) */ + ret.itemCount = 3 * (visibleRect.width / (this.props.imageDim + 20 + 20)); + + return ret; + }; +} diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TableList.tsx b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TableList.tsx new file mode 100644 index 0000000000..98874fea02 --- /dev/null +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TableList.tsx @@ -0,0 +1,223 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + FocusZone, + DetailsList, + DetailsHeader, + IDetailsHeaderProps, + IRenderFunction, + IGroup, + IColumn, + Image, + Text, + Stack +} from "@fluentui/react"; +import { localization } from "@responsible-ai/localization"; +import React from "react"; + +export interface ITableListProps { + imageDim: number; + pageSize: number; + openPanel: () => void; +} + +export interface ITableListState { + items: IListItem[]; + groups: IGroup[]; + columns: IColumn[]; +} + +export interface IListItem { + title: string; + subtitle: string; + image: string; + trueY: number; + predictedY: number; + index: number; + other: number; +} + +export class TableList extends React.Component< + ITableListProps, + ITableListState +> { + public constructor(props: ITableListProps) { + super(props); + + this.state = { + columns: [], + groups: [], + items: [] + }; + } + + public componentDidMount(): void { + const items: IListItem[] = []; + + for (let i = 0; i < 50; i++) { + items.push({ + image: + "https://1.bp.blogspot.com/-uhSQ0kz07ZI/UjCVa4_ru9I/AAAAAAAAYZI/g7RsfGH81LA/s1600/Duckling+Wallpapers+%25286%2529.jpg", + index: i + 1, + other: 0, + predictedY: 1, + subtitle: "subtitle", + title: `label ${(i + 1).toString()}`, + trueY: 0 + }); + } + + const groups: IGroup[] = [ + { + count: this.props.pageSize, + key: "success", + level: 0, + name: localization.InterpretVision.Dashboard.titleBarSuccess, + startIndex: 0 + }, + { + count: this.props.pageSize, + key: "error", + level: 0, + name: localization.InterpretVision.Dashboard.titleBarError, + startIndex: this.props.pageSize + } + ]; + + const columns: IColumn[] = [ + { + fieldName: "title", + isResizable: true, + key: "title", + maxWidth: 400, + minWidth: 200, + name: localization.InterpretVision.Dashboard.columnOne + }, + { + fieldName: "index", + isResizable: true, + key: "index", + maxWidth: 400, + minWidth: 200, + name: localization.InterpretVision.Dashboard.columnTwo + }, + { + fieldName: "trueY", + isResizable: true, + key: "truey", + maxWidth: 400, + minWidth: 200, + name: localization.InterpretVision.Dashboard.columnThree + }, + { + fieldName: "predictedY", + isResizable: true, + key: "predictedy", + maxWidth: 400, + minWidth: 200, + name: localization.InterpretVision.Dashboard.columnFour + }, + { + fieldName: "other", + isResizable: true, + key: "other", + maxWidth: 400, + minWidth: 200, + name: localization.InterpretVision.Dashboard.columnFive + } + ]; + + this.setState({ columns, groups, items }); + } + + public render(): React.ReactNode { + return ( + + + + ); + } + + private onRenderDetailsHeader = ( + props: IDetailsHeaderProps | undefined, + _defaultRender?: IRenderFunction | undefined + ) => { + if (!props) { + return
; + } + return ( + + ); + }; + + private onRenderColumn = ( + item: IListItem | undefined, + index: number | undefined, + column?: IColumn | undefined + ) => { + const value = + item && column && column.fieldName + ? item[column.fieldName as keyof IListItem] + : ""; + + const image = + item && column && column.fieldName === "title" + ? item["image" as keyof IListItem] + : ""; + + if (typeof image === "number") { + return
; + } + + if (index) { + index = index + 1; + } + + const subtitle = + item && column && column.fieldName === "title" + ? item["subtitle" as keyof IListItem] + : ""; + + return ( +
+ + {image && ( + + + + )} + + + + {value} + + {subtitle && ( + + {subtitle} + + )} + + + +
+ ); + }; +} diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Interfaces/IExplanationDashboardProps.ts b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Interfaces/IExplanationDashboardProps.ts new file mode 100644 index 0000000000..ea8078151f --- /dev/null +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Interfaces/IExplanationDashboardProps.ts @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +export interface IVisionExplanationDashboardProps { + /* + * the interface design for the dashboard + */ + dataSummary: IDatasetSummary; +} + +export interface IDatasetSummary { + /* + * information about the document given + */ + images: string[]; + classNames?: string[]; + localExplanations: string[]; + prediction?: number[]; +} diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.styles.ts b/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.styles.ts new file mode 100644 index 0000000000..f37e3c06c5 --- /dev/null +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.styles.ts @@ -0,0 +1,72 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { IStyle, mergeStyleSets, IProcessedStyleSet } from "@fluentui/react"; +export interface IDatasetExplorerTab { + cohortDropdown: IStyle; + cohortPickerLabel: IStyle; + cohortPickerLabelWrapper: IStyle; + line: IStyle; + searchBox: IStyle; + filterButton: IStyle; + toolBarContainer: IStyle; + mainContainer: IStyle; + mainImageContainer: IStyle; + halfContainer: IStyle; + imageListContainer: IStyle; + slider: IStyle; + tabs: IStyle; +} + +export const visionExplanationDashboardStyles: () => IProcessedStyleSet = + () => { + return mergeStyleSets({ + cohortDropdown: { + width: "300px" + }, + cohortPickerLabel: { + fontWeight: "600" + }, + cohortPickerLabelWrapper: { + paddingBottom: "5px" + }, + filterButton: { + height: "32px" + }, + halfContainer: { + height: "100%", + width: "50%" + }, + imageListContainer: { + border: "1px solid #D2D4D6", + height: "100%", + overflow: "scroll" + }, + line: { + borderTop: "1px solid #EDEBE9" + }, + mainContainer: { + alignItems: "center", + justifyContent: "space-between", + width: "100%" + }, + mainImageContainer: { + height: "650px" + }, + searchBox: { + width: "300px" + }, + slider: { + width: "320px" + }, + tabs: { + display: "flex", + flexDirection: "row", + left: "-10px", + position: "relative" + }, + toolBarContainer: { + width: "100%" + } + }); + }; diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.tsx b/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.tsx new file mode 100644 index 0000000000..4b21661048 --- /dev/null +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.tsx @@ -0,0 +1,306 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + IDropdownOption, + Dropdown, + Text, + Stack, + Pivot, + PivotItem, + SearchBox, + Slider, + CommandBarButton +} from "@fluentui/react"; +import { localization } from "@responsible-ai/localization"; +import React from "react"; + +import { Flyout } from "./Controls/Flyout"; +import { ImageList } from "./Controls/ImageList"; +import { TableList } from "./Controls/TableList"; +import { TitleBar } from "./Controls/TitleBar"; +import { IVisionExplanationDashboardProps } from "./Interfaces/IExplanationDashboardProps"; +import { visionExplanationDashboardStyles } from "./VisionExplanationDashboard.styles"; + +export interface IVisionExplanationDashboardState { + imageDim: number; + pageSize: number; + panelOpen: boolean; + selectedKey: string; +} + +enum VisionDatasetExplorerTabOptions { + ImageExplorerView = "Image explorer view", + TableView = "Table view", + DataCharacteristics = "Data characteristics" +} + +export enum TitleBarOptions { + Error, + Success +} + +const PageSizeOptions: IDropdownOption[] = [ + { key: "s", text: "10" }, + { key: "m", text: "25" }, + { key: "l", text: "50" }, + { key: "xl", text: "100" } +]; +export class VisionExplanationDashboard extends React.Component< + IVisionExplanationDashboardProps, + IVisionExplanationDashboardState +> { + public constructor(props: IVisionExplanationDashboardProps) { + super(props); + + this.state = { + imageDim: 200, + pageSize: 10, + panelOpen: false, + selectedKey: VisionDatasetExplorerTabOptions.ImageExplorerView + }; + } + + public render(): React.ReactNode { + const classNames = visionExplanationDashboardStyles(); + const dropdownOptions: Array> = [ + { key: 0, text: localization.InterpretVision.Dashboard.allData } + ]; + + return ( + + + + + + + + + + + + + + + + +
+ + + + + + {localization.Interpret.ModelPerformance.cohortPickerLabel} + + + + + + + + + + + + + + + + + + + + + + + {this.state.selectedKey === + VisionDatasetExplorerTabOptions.TableView && ( + + + + + {localization.InterpretVision.Dashboard.pageSize} + + + + + + + + )} + + + {this.state.selectedKey === + VisionDatasetExplorerTabOptions.ImageExplorerView && ( + + + + + + + + + + + + + + + + + + + + + )} + {this.state.selectedKey === + VisionDatasetExplorerTabOptions.TableView && ( + + + + )} + + + + + ); + } + + private onButtonClick = () => { + this.setState({ panelOpen: !this.state.panelOpen }); + }; + + /* For onSliderChange, the max imageDims for each tab (400 and 100) are selected arbitrary to + look close to the Figma design sketch. For handleLinkClick, the default values chosen are half + the maximum values chosen in onSliderChange. */ + + private onSliderChange = (value: number) => { + if ( + this.state.selectedKey === + VisionDatasetExplorerTabOptions.ImageExplorerView + ) { + this.setState({ imageDim: Math.floor((value / 100) * 400) }); + } else { + this.setState({ imageDim: Math.floor((value / 100) * 100) }); + } + }; + + private onPageSizeSelect = ( + event: React.FormEvent, + item: IDropdownOption | undefined + ): void => { + this.setState({ pageSize: Number(item?.text) }); + if (event) { + return; + } + }; + + private handleLinkClick = (item?: PivotItem) => { + if (item) { + this.setState({ selectedKey: item.props.itemKey! }); + if ( + item.props.itemKey === VisionDatasetExplorerTabOptions.ImageExplorerView + ) { + this.setState({ imageDim: 200 }); + } else { + this.setState({ imageDim: 50 }); + } + } + }; +} From 66b2df633723ef3682d9f27b8eed8311a77a1f67 Mon Sep 17 00:00:00 2001 From: James Chao Date: Mon, 8 Aug 2022 22:18:53 -0700 Subject: [PATCH 2/5] fixups --- .../__mock_data__/visionData.ts | 37 ---------- .../Interfaces/VisionExplanationInterfaces.ts | 4 -- .../Controls/ImageList.styles.ts | 10 --- .../Controls/ImageList.tsx | 69 ------------------- .../Controls/TableList.tsx | 14 ++-- .../Interfaces/IExplanationDashboardProps.ts | 4 -- .../VisionExplanationDashboard.styles.ts | 6 -- .../VisionExplanationDashboard.tsx | 42 +---------- 8 files changed, 9 insertions(+), 177 deletions(-) diff --git a/apps/dashboard/src/interpret-vision/__mock_data__/visionData.ts b/apps/dashboard/src/interpret-vision/__mock_data__/visionData.ts index 33a4e4df1f..baeb4ab1d5 100644 --- a/apps/dashboard/src/interpret-vision/__mock_data__/visionData.ts +++ b/apps/dashboard/src/interpret-vision/__mock_data__/visionData.ts @@ -3,7 +3,6 @@ import { IVisionExplanationDashboardData } from "@responsible-ai/core-ui"; -<<<<<<< HEAD import { explanation } from "./explanation"; export const visionData: IVisionExplanationDashboardData = { @@ -41,41 +40,5 @@ export const visionData: IVisionExplanationDashboardData = { "https://raw.githubusercontent.com/slundberg/shap/master/data/imagenet50/sim_n03029197_6381.jpg" ], localExplanations: [explanation], -======= -export const visionData: IVisionExplanationDashboardData = { - classNames: ["duck", "not duck"], - images: [ - "https://th.bing.com/th/id/R.ee6c3b5dda7aba5c34b372bd8409ac49?rik=K%2bmc9gcjVhhYbQ&riu=http%3a%2f%2fclipart-library.com%2fimages%2fBigAn7qMT.jpg&ehk=SNzySL548vPVf1a8PSz5Gv%2bJXdUyh%2bf2VAPT5oVuLtg%3d&risl=&pid=ImgRaw&r=0", - "https://th.bing.com/th/id/R.ee6c3b5dda7aba5c34b372bd8409ac49?rik=K%2bmc9gcjVhhYbQ&riu=http%3a%2f%2fclipart-library.com%2fimages%2fBigAn7qMT.jpg&ehk=SNzySL548vPVf1a8PSz5Gv%2bJXdUyh%2bf2VAPT5oVuLtg%3d&risl=&pid=ImgRaw&r=0", - "https://th.bing.com/th/id/R.ee6c3b5dda7aba5c34b372bd8409ac49?rik=K%2bmc9gcjVhhYbQ&riu=http%3a%2f%2fclipart-library.com%2fimages%2fBigAn7qMT.jpg&ehk=SNzySL548vPVf1a8PSz5Gv%2bJXdUyh%2bf2VAPT5oVuLtg%3d&risl=&pid=ImgRaw&r=0", - "https://th.bing.com/th/id/R.ee6c3b5dda7aba5c34b372bd8409ac49?rik=K%2bmc9gcjVhhYbQ&riu=http%3a%2f%2fclipart-library.com%2fimages%2fBigAn7qMT.jpg&ehk=SNzySL548vPVf1a8PSz5Gv%2bJXdUyh%2bf2VAPT5oVuLtg%3d&risl=&pid=ImgRaw&r=0", - "https://th.bing.com/th/id/R.ee6c3b5dda7aba5c34b372bd8409ac49?rik=K%2bmc9gcjVhhYbQ&riu=http%3a%2f%2fclipart-library.com%2fimages%2fBigAn7qMT.jpg&ehk=SNzySL548vPVf1a8PSz5Gv%2bJXdUyh%2bf2VAPT5oVuLtg%3d&risl=&pid=ImgRaw&r=0", - "https://th.bing.com/th/id/R.ee6c3b5dda7aba5c34b372bd8409ac49?rik=K%2bmc9gcjVhhYbQ&riu=http%3a%2f%2fclipart-library.com%2fimages%2fBigAn7qMT.jpg&ehk=SNzySL548vPVf1a8PSz5Gv%2bJXdUyh%2bf2VAPT5oVuLtg%3d&risl=&pid=ImgRaw&r=0", - "https://th.bing.com/th/id/R.ee6c3b5dda7aba5c34b372bd8409ac49?rik=K%2bmc9gcjVhhYbQ&riu=http%3a%2f%2fclipart-library.com%2fimages%2fBigAn7qMT.jpg&ehk=SNzySL548vPVf1a8PSz5Gv%2bJXdUyh%2bf2VAPT5oVuLtg%3d&risl=&pid=ImgRaw&r=0", - "https://th.bing.com/th/id/R.ee6c3b5dda7aba5c34b372bd8409ac49?rik=K%2bmc9gcjVhhYbQ&riu=http%3a%2f%2fclipart-library.com%2fimages%2fBigAn7qMT.jpg&ehk=SNzySL548vPVf1a8PSz5Gv%2bJXdUyh%2bf2VAPT5oVuLtg%3d&risl=&pid=ImgRaw&r=0", - "https://th.bing.com/th/id/R.ee6c3b5dda7aba5c34b372bd8409ac49?rik=K%2bmc9gcjVhhYbQ&riu=http%3a%2f%2fclipart-library.com%2fimages%2fBigAn7qMT.jpg&ehk=SNzySL548vPVf1a8PSz5Gv%2bJXdUyh%2bf2VAPT5oVuLtg%3d&risl=&pid=ImgRaw&r=0", - "https://th.bing.com/th/id/R.ee6c3b5dda7aba5c34b372bd8409ac49?rik=K%2bmc9gcjVhhYbQ&riu=http%3a%2f%2fclipart-library.com%2fimages%2fBigAn7qMT.jpg&ehk=SNzySL548vPVf1a8PSz5Gv%2bJXdUyh%2bf2VAPT5oVuLtg%3d&risl=&pid=ImgRaw&r=0", - "https://th.bing.com/th/id/R.ee6c3b5dda7aba5c34b372bd8409ac49?rik=K%2bmc9gcjVhhYbQ&riu=http%3a%2f%2fclipart-library.com%2fimages%2fBigAn7qMT.jpg&ehk=SNzySL548vPVf1a8PSz5Gv%2bJXdUyh%2bf2VAPT5oVuLtg%3d&risl=&pid=ImgRaw&r=0", - "https://th.bing.com/th/id/R.ee6c3b5dda7aba5c34b372bd8409ac49?rik=K%2bmc9gcjVhhYbQ&riu=http%3a%2f%2fclipart-library.com%2fimages%2fBigAn7qMT.jpg&ehk=SNzySL548vPVf1a8PSz5Gv%2bJXdUyh%2bf2VAPT5oVuLtg%3d&risl=&pid=ImgRaw&r=0", - "https://th.bing.com/th/id/R.ee6c3b5dda7aba5c34b372bd8409ac49?rik=K%2bmc9gcjVhhYbQ&riu=http%3a%2f%2fclipart-library.com%2fimages%2fBigAn7qMT.jpg&ehk=SNzySL548vPVf1a8PSz5Gv%2bJXdUyh%2bf2VAPT5oVuLtg%3d&risl=&pid=ImgRaw&r=0", - "https://th.bing.com/th/id/R.ee6c3b5dda7aba5c34b372bd8409ac49?rik=K%2bmc9gcjVhhYbQ&riu=http%3a%2f%2fclipart-library.com%2fimages%2fBigAn7qMT.jpg&ehk=SNzySL548vPVf1a8PSz5Gv%2bJXdUyh%2bf2VAPT5oVuLtg%3d&risl=&pid=ImgRaw&r=0", - "https://th.bing.com/th/id/OIP.5hk5_K6MD4JmD0Aqvv0P-wHaHa?pid=ImgDet&rs=1", - "https://th.bing.com/th/id/OIP.5hk5_K6MD4JmD0Aqvv0P-wHaHa?pid=ImgDet&rs=1", - "https://th.bing.com/th/id/OIP.5hk5_K6MD4JmD0Aqvv0P-wHaHa?pid=ImgDet&rs=1", - "https://th.bing.com/th/id/OIP.5hk5_K6MD4JmD0Aqvv0P-wHaHa?pid=ImgDet&rs=1", - "https://th.bing.com/th/id/OIP.5hk5_K6MD4JmD0Aqvv0P-wHaHa?pid=ImgDet&rs=1", - "https://th.bing.com/th/id/OIP.5hk5_K6MD4JmD0Aqvv0P-wHaHa?pid=ImgDet&rs=1", - "https://th.bing.com/th/id/OIP.5hk5_K6MD4JmD0Aqvv0P-wHaHa?pid=ImgDet&rs=1", - "https://th.bing.com/th/id/OIP.5hk5_K6MD4JmD0Aqvv0P-wHaHa?pid=ImgDet&rs=1", - "https://th.bing.com/th/id/OIP.5hk5_K6MD4JmD0Aqvv0P-wHaHa?pid=ImgDet&rs=1", - "https://th.bing.com/th/id/OIP.5hk5_K6MD4JmD0Aqvv0P-wHaHa?pid=ImgDet&rs=1", - "https://th.bing.com/th/id/OIP.5hk5_K6MD4JmD0Aqvv0P-wHaHa?pid=ImgDet&rs=1", - "https://th.bing.com/th/id/OIP.5hk5_K6MD4JmD0Aqvv0P-wHaHa?pid=ImgDet&rs=1" - ], - localExplanations: [ - 0, 0.5, 0, 0, -0.6, 0, 0.4, -0.9, 0, -0.3, 0, 0, 0.3, 0, 0, 0.4, 0, 0, -0.2, - 0, 0, 0.5, 0, 0, -0.6, 0, 0, 0, 0, -0.2, 0, 0, 0, -0.3, 0, 0, 0, 0, 0, 0 - ], ->>>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 prediction: [0, 1] }; diff --git a/libs/core-ui/src/lib/Interfaces/VisionExplanationInterfaces.ts b/libs/core-ui/src/lib/Interfaces/VisionExplanationInterfaces.ts index 737de73938..387d22cdca 100644 --- a/libs/core-ui/src/lib/Interfaces/VisionExplanationInterfaces.ts +++ b/libs/core-ui/src/lib/Interfaces/VisionExplanationInterfaces.ts @@ -3,11 +3,7 @@ export interface IVisionExplanationDashboardData { classNames: string[]; -<<<<<<< HEAD localExplanations: string[]; -======= - localExplanations: number[]; ->>>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 prediction: number[]; images: string[]; } diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.styles.ts b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.styles.ts index e5bb73c7a2..af95ebf752 100644 --- a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.styles.ts +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.styles.ts @@ -28,11 +28,7 @@ export const imageListStyles: () => IProcessedStyleSet>>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 width: "100%" }, list: { @@ -41,15 +37,9 @@ export const imageListStyles: () => IProcessedStyleSet>>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 position: "relative", textAlign: "center" } diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.tsx b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.tsx index 7ea72c0ab5..791b14b52a 100644 --- a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.tsx +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.tsx @@ -7,7 +7,6 @@ import { List, Image, ImageFit, -<<<<<<< HEAD IRectangle, IPageSpecification } from "@fluentui/react"; @@ -19,25 +18,12 @@ import { imageListStyles } from "./ImageList.styles"; export interface IImageListProps { data: IDatasetSummary; -======= - IRectangle -} from "@fluentui/react"; -import React from "react"; - -import { imageListStyles } from "./ImageList.styles"; - -export interface IImageListProps { ->>>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 imageDim: number; openPanel: () => void; } export interface IImageListState { -<<<<<<< HEAD images: IListItem[]; -======= - columnCount: number; ->>>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 } export interface IListItem { @@ -45,11 +31,6 @@ export interface IListItem { image: string; } -<<<<<<< HEAD -======= -const RowsPerPage = 3; - ->>>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 export class ImageList extends React.Component< IImageListProps, IImageListState @@ -58,7 +39,6 @@ export class ImageList extends React.Component< super(props); this.state = { -<<<<<<< HEAD images: [] }; } @@ -89,33 +69,6 @@ export class ImageList extends React.Component< onRenderCell={this.onRenderCell} className={classNames.list} getPageSpecification={this.getPageSpecification} -======= - columnCount: 1 - }; - } - - public render(): React.ReactNode { - const classNames = imageListStyles(); - - const items: IListItem[] = []; - - for (let i = 0; i < 20; i++) { - items.push({ - image: - "https://1.bp.blogspot.com/-uhSQ0kz07ZI/UjCVa4_ru9I/AAAAAAAAYZI/g7RsfGH81LA/s1600/Duckling+Wallpapers+%25286%2529.jpg", - title: `label ${(i + 1).toString()}` - }); - } - - return ( - - >>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 /> ); @@ -144,7 +97,6 @@ export class ImageList extends React.Component< ); }; -<<<<<<< HEAD private getPageSpecification = ( itemIndex?: number | undefined, visibleRect?: IRectangle | undefined @@ -160,26 +112,5 @@ export class ImageList extends React.Component< ret.itemCount = 3 * (visibleRect.width / (this.props.imageDim + 20 + 20)); return ret; -======= - private getPageHeight = () => { - return this.props.imageDim * RowsPerPage; - }; - - private getItemCountForPage = ( - itemIndex?: number | undefined, - surfaceRect?: IRectangle | undefined - ) => { - if (!surfaceRect || !itemIndex) { - return 0; - } - - if (itemIndex === 0) { - this.setState({ - columnCount: Math.ceil(surfaceRect.width / this.props.imageDim) - }); - } - - return this.state.columnCount * RowsPerPage; ->>>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 }; } diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TableList.tsx b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TableList.tsx index 98874fea02..6b9bf83f07 100644 --- a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TableList.tsx +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TableList.tsx @@ -16,7 +16,10 @@ import { import { localization } from "@responsible-ai/localization"; import React from "react"; +import { IDatasetSummary } from "../Interfaces/IExplanationDashboardProps"; + export interface ITableListProps { + data: IDatasetSummary; imageDim: number; pageSize: number; openPanel: () => void; @@ -55,18 +58,17 @@ export class TableList extends React.Component< public componentDidMount(): void { const items: IListItem[] = []; - for (let i = 0; i < 50; i++) { + this.props.data.images.forEach((image, index) => { items.push({ - image: - "https://1.bp.blogspot.com/-uhSQ0kz07ZI/UjCVa4_ru9I/AAAAAAAAYZI/g7RsfGH81LA/s1600/Duckling+Wallpapers+%25286%2529.jpg", - index: i + 1, + image, + index: index + 1, other: 0, predictedY: 1, subtitle: "subtitle", - title: `label ${(i + 1).toString()}`, + title: `label ${(index + 1).toString()}`, trueY: 0 }); - } + }); const groups: IGroup[] = [ { diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Interfaces/IExplanationDashboardProps.ts b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Interfaces/IExplanationDashboardProps.ts index 3578c3f4d4..ea8078151f 100644 --- a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Interfaces/IExplanationDashboardProps.ts +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Interfaces/IExplanationDashboardProps.ts @@ -14,10 +14,6 @@ export interface IDatasetSummary { */ images: string[]; classNames?: string[]; -<<<<<<< HEAD localExplanations: string[]; -======= - localExplanations: number[]; ->>>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 prediction?: number[]; } diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.styles.ts b/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.styles.ts index a2231ef697..f37e3c06c5 100644 --- a/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.styles.ts +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.styles.ts @@ -11,10 +11,7 @@ export interface IDatasetExplorerTab { filterButton: IStyle; toolBarContainer: IStyle; mainContainer: IStyle; -<<<<<<< HEAD mainImageContainer: IStyle; -======= ->>>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 halfContainer: IStyle; imageListContainer: IStyle; slider: IStyle; @@ -53,12 +50,9 @@ export const visionExplanationDashboardStyles: () => IProcessedStyleSet>>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 searchBox: { width: "300px" }, diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.tsx b/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.tsx index 7136bd1993..90254a402a 100644 --- a/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.tsx +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.tsx @@ -15,23 +15,16 @@ import { import { localization } from "@responsible-ai/localization"; import React from "react"; -<<<<<<< HEAD import { Flyout } from "./Controls/Flyout"; import { ImageList } from "./Controls/ImageList"; import { TableList } from "./Controls/TableList"; -======= -import { ImageList } from "./Controls/ImageList"; ->>>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 import { TitleBar } from "./Controls/TitleBar"; import { IVisionExplanationDashboardProps } from "./Interfaces/IExplanationDashboardProps"; import { visionExplanationDashboardStyles } from "./VisionExplanationDashboard.styles"; export interface IVisionExplanationDashboardState { imageDim: number; -<<<<<<< HEAD pageSize: number; -======= ->>>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 panelOpen: boolean; selectedKey: string; } @@ -47,15 +40,12 @@ export enum TitleBarOptions { Success } -<<<<<<< HEAD const PageSizeOptions: IDropdownOption[] = [ { key: "s", text: "10" }, { key: "m", text: "25" }, { key: "l", text: "50" }, { key: "xl", text: "100" } ]; -======= ->>>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 export class VisionExplanationDashboard extends React.Component< IVisionExplanationDashboardProps, IVisionExplanationDashboardState @@ -65,10 +55,7 @@ export class VisionExplanationDashboard extends React.Component< this.state = { imageDim: 200, -<<<<<<< HEAD pageSize: 10, -======= ->>>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 panelOpen: false, selectedKey: VisionDatasetExplorerTabOptions.ImageExplorerView }; @@ -182,16 +169,11 @@ export class VisionExplanationDashboard extends React.Component< min={20} className={classNames.slider} label={localization.InterpretVision.Dashboard.thumbnailSize} -<<<<<<< HEAD defaultValue={50} -======= - defaultValue={40} ->>>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 showValue={false} onChange={this.onSliderChange} /> -<<<<<<< HEAD {this.state.selectedKey === VisionDatasetExplorerTabOptions.TableView && ( @@ -215,8 +197,6 @@ export class VisionExplanationDashboard extends React.Component< )} -======= ->>>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 {this.state.selectedKey === @@ -225,16 +205,7 @@ export class VisionExplanationDashboard extends React.Component< >>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 > >>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 imageDim={this.state.imageDim} openPanel={this.onButtonClick} /> @@ -263,10 +231,7 @@ export class VisionExplanationDashboard extends React.Component< >>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 imageDim={this.state.imageDim} openPanel={this.onButtonClick} /> @@ -275,11 +240,11 @@ export class VisionExplanationDashboard extends React.Component< )} -<<<<<<< HEAD {this.state.selectedKey === VisionDatasetExplorerTabOptions.TableView && ( -======= ->>>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 ); } @@ -319,7 +282,6 @@ export class VisionExplanationDashboard extends React.Component< } }; -<<<<<<< HEAD private onPageSizeSelect = ( event: React.FormEvent, item: IDropdownOption | undefined @@ -330,8 +292,6 @@ export class VisionExplanationDashboard extends React.Component< } }; -======= ->>>>>>> 46e04a056f03bc313b9772a6b29c79a92f937530 private handleLinkClick = (item?: PivotItem) => { if (item) { this.setState({ selectedKey: item.props.itemKey! }); From 8a218513f3991f79d7609178f377585eaaf480c0 Mon Sep 17 00:00:00 2001 From: James Chao Date: Mon, 8 Aug 2022 22:59:35 -0700 Subject: [PATCH 3/5] panel re-implementation --- .../Controls/Flyout.styles.ts | 91 +++++++------- .../Controls/Flyout.tsx | 117 +++++++++++++++++- .../Controls/ImageList.tsx | 17 ++- .../Controls/TableList.tsx | 27 ++-- .../VisionExplanationDashboard.tsx | 28 ++++- libs/localization/src/lib/en.json | 3 + 6 files changed, 219 insertions(+), 64 deletions(-) diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.styles.ts b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.styles.ts index d32ad17cb1..b69714b9e6 100644 --- a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.styles.ts +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.styles.ts @@ -1,63 +1,64 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { - IStyle, - mergeStyleSets, - IProcessedStyleSet, - FontSizes -} from "@fluentui/react"; +import { IStyle, mergeStyleSets, IProcessedStyleSet } from "@fluentui/react"; export interface IFlyoutStyles { - line: IStyle; - list: IStyle; - tile: IStyle; - sizer: IStyle; - padder: IStyle; - label: IStyle; + errorIcon: IStyle; + featureListContainer: IStyle; + iconContainer: IStyle; image: IStyle; + imageContainer: IStyle; + title: IStyle; + label: IStyle; + line: IStyle; + mainContainer: IStyle; + successIcon: IStyle; } export const flyoutStyles: () => IProcessedStyleSet = () => { return mergeStyleSets({ + errorIcon: { + color: "#C50F1F", + fontSize: "large", + fontWeight: "600" + }, + featureListContainer: { + height: 300, + overflow: "auto" + }, + iconContainer: { + position: "relative", + top: "2px" + }, image: { - left: 0, - position: "absolute", - top: 0, - width: "100%" + marginBottom: "20px" + }, + imageContainer: { + maxHeight: "250px", + maxWidth: "250px" }, label: { - color: "black", - fontSize: FontSizes.small, - justifySelf: "center", - paddingBottom: "100%", - width: "100%" + bottom: 20, + position: "relative", + textAlign: "start" }, line: { - borderTop: "1px solid #EDEBE9" - }, - list: { - fontSize: 0, - overflow: "scroll", - position: "relative" - }, - padder: { - bottom: 2, - left: 2, - position: "absolute", - right: 2, - top: 2 - }, - sizer: { - paddingBottom: "100%" - }, - tile: { - float: "left", - marginTop: "0.5%", - paddingLeft: "1%", - paddingRight: "1%", - position: "relative", - textAlign: "center" + borderBottom: "1px solid #EDEBE9", + paddingBottom: "10px", + width: "100%" + }, + mainContainer: { + height: "100%", + overflow: "hidden" + }, + successIcon: { + color: "#6BB700", + fontSize: "large", + fontWeight: "600" + }, + title: { + fontWeight: "600" } }); }; diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.tsx b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.tsx index 77974d3c8b..ec97a48a10 100644 --- a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.tsx +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.tsx @@ -1,7 +1,18 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { Image, Panel, PanelType, FocusZone, Stack } from "@fluentui/react"; +import { + Icon, + Image, + ImageFit, + List, + Panel, + PanelType, + FocusZone, + Stack, + Text +} from "@fluentui/react"; +import { localization } from "@responsible-ai/localization"; import React from "react"; import { IDatasetSummary } from "../Interfaces/IExplanationDashboardProps"; @@ -27,31 +38,131 @@ export class Flyout extends React.Component { public render(): React.ReactNode { const classNames = flyoutStyles(); + const item = this.props.item; + + const list = []; + + for (let i = 0; i < 30; i++) { + list.push({ title: "Feature 1", value: "value" }); + } + return (
- + + + + + + + + + + {item?.predictedY !== item?.trueY + ? localization.InterpretVision.Dashboard.titleBarError + : localization.InterpretVision.Dashboard + .titleBarSuccess} + + + + + + + + {item?.title} + + + + + +
+ + + + {localization.InterpretVision.Dashboard.panelExplanation} + + + + +
+ + + + {localization.InterpretVision.Dashboard.panelInformation} + + + + + ); } + + private onRenderCell = ( + item?: { title: string; value: string } | undefined + ) => { + return ( + + + + {item?.title} + + + {item?.value} + + + + ); + }; } diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.tsx b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.tsx index 791b14b52a..b65ddb8370 100644 --- a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.tsx +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/ImageList.tsx @@ -19,7 +19,7 @@ import { imageListStyles } from "./ImageList.styles"; export interface IImageListProps { data: IDatasetSummary; imageDim: number; - openPanel: () => void; + selectItem: (item: IListItem) => void; } export interface IImageListState { @@ -29,6 +29,8 @@ export interface IImageListState { export interface IListItem { title: string; image: string; + predictedY?: number; + trueY?: number; } export class ImageList extends React.Component< @@ -80,8 +82,8 @@ export class ImageList extends React.Component<
@@ -97,6 +99,15 @@ export class ImageList extends React.Component< ); }; + private callbackWrapper = (item?: IListItem | undefined) => () => { + if (!item) { + return; + } + item.predictedY = 0; + item.trueY = 0; + this.props.selectItem(item); + }; + private getPageSpecification = ( itemIndex?: number | undefined, visibleRect?: IRectangle | undefined diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TableList.tsx b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TableList.tsx index 6b9bf83f07..e1b09e48f6 100644 --- a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TableList.tsx +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TableList.tsx @@ -22,7 +22,7 @@ export interface ITableListProps { data: IDatasetSummary; imageDim: number; pageSize: number; - openPanel: () => void; + selectItem: (item: IListItem) => void; } export interface ITableListState { @@ -33,12 +33,12 @@ export interface ITableListState { export interface IListItem { title: string; - subtitle: string; + subtitle?: string; image: string; - trueY: number; - predictedY: number; - index: number; - other: number; + trueY?: number; + predictedY?: number; + index?: number; + other?: number; } export class TableList extends React.Component< @@ -193,7 +193,11 @@ export class TableList extends React.Component< return (
- + {image && ( ); }; + + private callbackWrapper = (item?: IListItem | undefined) => () => { + if (!item) { + return; + } + item.predictedY = 0; + item.trueY = 0; + this.props.selectItem(item); + }; } diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.tsx b/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.tsx index 90254a402a..7bd1c7c6f1 100644 --- a/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.tsx +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.tsx @@ -26,9 +26,20 @@ export interface IVisionExplanationDashboardState { imageDim: number; pageSize: number; panelOpen: boolean; + selectedItem: IListItem | undefined; selectedKey: string; } +export interface IListItem { + title: string; + subtitle?: string; + image: string; + trueY?: number; + predictedY?: number; + index?: number; + other?: number; +} + enum VisionDatasetExplorerTabOptions { ImageExplorerView = "Image explorer view", TableView = "Table view", @@ -57,6 +68,7 @@ export class VisionExplanationDashboard extends React.Component< imageDim: 200, pageSize: 10, panelOpen: false, + selectedItem: undefined, selectedKey: VisionDatasetExplorerTabOptions.ImageExplorerView }; } @@ -218,7 +230,7 @@ export class VisionExplanationDashboard extends React.Component< @@ -233,7 +245,7 @@ export class VisionExplanationDashboard extends React.Component< @@ -246,7 +258,7 @@ export class VisionExplanationDashboard extends React.Component< @@ -255,18 +267,22 @@ export class VisionExplanationDashboard extends React.Component< ); } - private onButtonClick = () => { + private onPanelClose = () => { this.setState({ panelOpen: !this.state.panelOpen }); }; + private onItemSelect = (item: IListItem): void => { + this.setState({ panelOpen: !this.state.panelOpen, selectedItem: item }); + }; + /* For onSliderChange, the max imageDims for each tab (400 and 100) are selected arbitrary to look close to the Figma design sketch. For handleLinkClick, the default values chosen are half the maximum values chosen in onSliderChange. */ diff --git a/libs/localization/src/lib/en.json b/libs/localization/src/lib/en.json index 02875b9649..6c7c634a44 100644 --- a/libs/localization/src/lib/en.json +++ b/libs/localization/src/lib/en.json @@ -1296,6 +1296,9 @@ "columnFour": "Predicted Y", "columnFive": "Other metadata", "filter": "Filter", + "panelExplanation": "Explanation", + "panelInformation": "Information", + "panelTitle": "Selected Instance", "pageSize": "Page size: ", "search": "Search", "settings": "Settings", From 864b8164d2c01d1edeb9cc0bb4067e00c1a5eace Mon Sep 17 00:00:00 2001 From: James Chao Date: Mon, 15 Aug 2022 15:34:25 -0700 Subject: [PATCH 4/5] fixups --- .vscode/settings.json | 2 +- .../Controls/Flyout.styles.ts | 35 +++-- .../Controls/Flyout.tsx | 40 ++--- .../Controls/TableList.tsx | 142 ++++++++---------- .../Controls/TitleBar.styles.ts | 14 +- .../VisionExplanationDashboard.styles.ts | 14 +- .../VisionExplanationDashboard.tsx | 12 +- libs/localization/src/lib/en.json | 2 +- 8 files changed, 136 insertions(+), 125 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index ad812f35f1..b1000e0411 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -42,7 +42,7 @@ }, "[typescriptreact]": { "editor.formatOnSave": true, - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "rvest.vs-code-prettier-eslint" }, "cSpell.words": [ "automl", diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.styles.ts b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.styles.ts index b69714b9e6..66e23650c4 100644 --- a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.styles.ts +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.styles.ts @@ -1,28 +1,43 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { IStyle, mergeStyleSets, IProcessedStyleSet } from "@fluentui/react"; +import { + IStyle, + mergeStyleSets, + IProcessedStyleSet, + getTheme +} from "@fluentui/react"; export interface IFlyoutStyles { + cell: IStyle; errorIcon: IStyle; + explanation: IStyle; featureListContainer: IStyle; iconContainer: IStyle; image: IStyle; imageContainer: IStyle; - title: IStyle; label: IStyle; - line: IStyle; mainContainer: IStyle; + separator: IStyle; successIcon: IStyle; + title: IStyle; } export const flyoutStyles: () => IProcessedStyleSet = () => { + const theme = getTheme(); return mergeStyleSets({ + cell: { + marginBottom: "20px" + }, errorIcon: { - color: "#C50F1F", + color: theme.semanticColors.errorIcon, fontSize: "large", fontWeight: "600" }, + explanation: { + position: "relative", + right: 85 + }, featureListContainer: { height: 300, overflow: "auto" @@ -43,17 +58,17 @@ export const flyoutStyles: () => IProcessedStyleSet = () => { position: "relative", textAlign: "start" }, - line: { - borderBottom: "1px solid #EDEBE9", - paddingBottom: "10px", - width: "100%" - }, mainContainer: { height: "100%", overflow: "hidden" }, + separator: { + root: { + width: "100&" + } + }, successIcon: { - color: "#6BB700", + color: theme.semanticColors.successIcon, fontSize: "large", fontWeight: "600" }, diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.tsx b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.tsx index ec97a48a10..b1d021f125 100644 --- a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.tsx +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/Flyout.tsx @@ -10,7 +10,8 @@ import { PanelType, FocusZone, Stack, - Text + Text, + Separator } from "@fluentui/react"; import { localization } from "@responsible-ai/localization"; import React from "react"; @@ -27,18 +28,15 @@ export interface IFlyoutProps { callback: () => void; } -export class IFlyoutState {} - -export class Flyout extends React.Component { - public constructor(props: IFlyoutProps) { - super(props); - this.state = {}; - } +const stackTokens = { + childrenGap: "l1" +}; +export class Flyout extends React.Component { public render(): React.ReactNode { - const classNames = flyoutStyles(); + const { data, isOpen, item, callback } = this.props; - const item = this.props.item; + const classNames = flyoutStyles(); const list = []; @@ -50,22 +48,22 @@ export class Flyout extends React.Component { - + -
+ @@ -113,7 +111,7 @@ export class Flyout extends React.Component { -
+ @@ -122,13 +120,13 @@ export class Flyout extends React.Component { -
+ @@ -147,13 +145,15 @@ export class Flyout extends React.Component { private onRenderCell = ( item?: { title: string; value: string } | undefined ) => { + const classNames = flyoutStyles(); + return ( {item?.title} diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TableList.tsx b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TableList.tsx index e1b09e48f6..8c9cf4ea19 100644 --- a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TableList.tsx +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TableList.tsx @@ -41,6 +41,33 @@ export interface IListItem { other?: number; } +const MaxWidth = 400; +const MinWidth = 200; +const BorderRadius = 4; +const NumColumns = 5; +const ColumnNames = [ + { + fieldName: "title", + title: localization.InterpretVision.Dashboard.columnOne + }, + { + fieldName: "index", + title: localization.InterpretVision.Dashboard.columnTwo + }, + { + fieldName: "trueY", + title: localization.InterpretVision.Dashboard.columnThree + }, + { + fieldName: "predictedY", + title: localization.InterpretVision.Dashboard.columnFour + }, + { + fieldName: "other", + title: localization.InterpretVision.Dashboard.columnFive + } +]; + export class TableList extends React.Component< ITableListProps, ITableListState @@ -87,48 +114,17 @@ export class TableList extends React.Component< } ]; - const columns: IColumn[] = [ - { - fieldName: "title", + const columns: IColumn[] = []; + for (let i = 0; i < NumColumns; i++) { + columns.push({ + fieldName: ColumnNames[i].fieldName, isResizable: true, - key: "title", - maxWidth: 400, - minWidth: 200, - name: localization.InterpretVision.Dashboard.columnOne - }, - { - fieldName: "index", - isResizable: true, - key: "index", - maxWidth: 400, - minWidth: 200, - name: localization.InterpretVision.Dashboard.columnTwo - }, - { - fieldName: "trueY", - isResizable: true, - key: "truey", - maxWidth: 400, - minWidth: 200, - name: localization.InterpretVision.Dashboard.columnThree - }, - { - fieldName: "predictedY", - isResizable: true, - key: "predictedy", - maxWidth: 400, - minWidth: 200, - name: localization.InterpretVision.Dashboard.columnFour - }, - { - fieldName: "other", - isResizable: true, - key: "other", - maxWidth: 400, - minWidth: 200, - name: localization.InterpretVision.Dashboard.columnFive - } - ]; + key: ColumnNames[i].fieldName.toLowerCase(), + maxWidth: MaxWidth, + minWidth: MinWidth, + name: ColumnNames[i].title + }); + } this.setState({ columns, groups, items }); } @@ -165,7 +161,7 @@ export class TableList extends React.Component< private onRenderColumn = ( item: IListItem | undefined, - index: number | undefined, + _index: number | undefined, column?: IColumn | undefined ) => { const value = @@ -174,7 +170,7 @@ export class TableList extends React.Component< : ""; const image = - item && column && column.fieldName === "title" + item && column && column.fieldName === ColumnNames[0].fieldName ? item["image" as keyof IListItem] : ""; @@ -182,48 +178,42 @@ export class TableList extends React.Component< return
; } - if (index) { - index = index + 1; - } - const subtitle = - item && column && column.fieldName === "title" + item && column && column.fieldName === ColumnNames[0].fieldName ? item["subtitle" as keyof IListItem] : ""; return ( -
- - {image && ( + + {image && ( + + + + )} + + - + {value} - )} - - + {subtitle && ( - {value} + {subtitle} - {subtitle && ( - - {subtitle} - - )} - - - -
+ )} + + + ); }; diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TitleBar.styles.ts b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TitleBar.styles.ts index 8b8e03f678..81ddcc7df3 100644 --- a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TitleBar.styles.ts +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/TitleBar.styles.ts @@ -1,7 +1,12 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { IStyle, mergeStyleSets, IProcessedStyleSet } from "@fluentui/react"; +import { + IStyle, + mergeStyleSets, + IProcessedStyleSet, + getTheme +} from "@fluentui/react"; export interface ITitleBarStyles { errorIcon: IStyle; @@ -12,9 +17,10 @@ export interface ITitleBarStyles { } export const titleBarStyles: () => IProcessedStyleSet = () => { + const theme = getTheme(); return mergeStyleSets({ errorIcon: { - color: "#d13438", + color: theme.semanticColors.errorIcon, fontSize: "large", fontWeight: "600" }, @@ -23,7 +29,7 @@ export const titleBarStyles: () => IProcessedStyleSet = () => { top: "2px" }, successIcon: { - color: "#107c10", + color: theme.semanticColors.successIcon, fontSize: "large", fontWeight: "600" }, @@ -31,7 +37,7 @@ export const titleBarStyles: () => IProcessedStyleSet = () => { fontWeight: "600" }, titleBarNumber: { - color: "#0078D4" + color: theme.palette.blue } }); }; diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.styles.ts b/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.styles.ts index f37e3c06c5..c73a8c7699 100644 --- a/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.styles.ts +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/VisionExplanationDashboard.styles.ts @@ -1,12 +1,16 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { IStyle, mergeStyleSets, IProcessedStyleSet } from "@fluentui/react"; +import { + IStyle, + mergeStyleSets, + IProcessedStyleSet, + getTheme +} from "@fluentui/react"; export interface IDatasetExplorerTab { cohortDropdown: IStyle; cohortPickerLabel: IStyle; cohortPickerLabelWrapper: IStyle; - line: IStyle; searchBox: IStyle; filterButton: IStyle; toolBarContainer: IStyle; @@ -20,6 +24,7 @@ export interface IDatasetExplorerTab { export const visionExplanationDashboardStyles: () => IProcessedStyleSet = () => { + const theme = getTheme(); return mergeStyleSets({ cohortDropdown: { width: "300px" @@ -38,13 +43,10 @@ export const visionExplanationDashboardStyles: () => IProcessedStyleSet -
+ @@ -299,13 +300,10 @@ export class VisionExplanationDashboard extends React.Component< }; private onPageSizeSelect = ( - event: React.FormEvent, + _event: React.FormEvent, item: IDropdownOption | undefined ): void => { this.setState({ pageSize: Number(item?.text) }); - if (event) { - return; - } }; private handleLinkClick = (item?: PivotItem) => { diff --git a/libs/localization/src/lib/en.json b/libs/localization/src/lib/en.json index 6c7c634a44..3d3df9ecd3 100644 --- a/libs/localization/src/lib/en.json +++ b/libs/localization/src/lib/en.json @@ -1298,7 +1298,7 @@ "filter": "Filter", "panelExplanation": "Explanation", "panelInformation": "Information", - "panelTitle": "Selected Instance", + "panelTitle": "Selected instance", "pageSize": "Page size: ", "search": "Search", "settings": "Settings", From 3d6bc4c5afd4d8055dd4491efee7c2e082978ad7 Mon Sep 17 00:00:00 2001 From: jamesbchao <69280655+jamesbchao@users.noreply.github.com> Date: Mon, 22 Aug 2022 14:16:33 -0700 Subject: [PATCH 5/5] Update settings.json --- .vscode/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index b1000e0411..ad812f35f1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -42,7 +42,7 @@ }, "[typescriptreact]": { "editor.formatOnSave": true, - "editor.defaultFormatter": "rvest.vs-code-prettier-eslint" + "editor.defaultFormatter": "esbenp.prettier-vscode" }, "cSpell.words": [ "automl",