From 7e1b4ad703dd95f514b06e4d460fcb026e0e33d1 Mon Sep 17 00:00:00 2001 From: Correl Roush Date: Fri, 15 Apr 2016 00:38:38 -0400 Subject: [PATCH] Initial commit --- .gitignore | 2 ++ Makefile | 20 ++++++++++++++ README.org | 61 +++++++++++++++++++++++++++++++++++++++++++ css/style.css | 61 +++++++++++++++++++++++++++++++++++++++++++ elm-package.json | 17 ++++++++++++ images/avatar-32.png | Bin 0 -> 1389 bytes images/avatar-64.png | Bin 0 -> 2837 bytes images/avatar.png | Bin 0 -> 10424 bytes json/users.json | 30 +++++++++++++++++++++ sample.html | 30 +++++++++++++++++++++ 10 files changed, 221 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.org create mode 100644 css/style.css create mode 100644 elm-package.json create mode 100644 images/avatar-32.png create mode 100644 images/avatar-64.png create mode 100644 images/avatar.png create mode 100644 json/users.json create mode 100644 sample.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0c3f49a --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +elm-stuff/ +elm.js diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..bd9440e --- /dev/null +++ b/Makefile @@ -0,0 +1,20 @@ +.PHONY: all clean dev + +APP = App.elm +APP_JS = app.js +ELM_FILES = $(shell find . -type f -name '*.elm') + +all: $(APP_JS) + +$(APP_JS): $(ELM_FILES) + elm-make --yes $(APP) --output $@ + +clean-deps: + rm -rf elm-stuff + +clean: + rm -f $(APP_JS) + rm -rf elm-stuff/build-artifacts + +dev: all + elm-reactor diff --git a/README.org b/README.org new file mode 100644 index 0000000..f1800ed --- /dev/null +++ b/README.org @@ -0,0 +1,61 @@ +#+TITLE: Elm Application Exercise +#+STARTUP: indent + +This is an exercise in creating a basic embedded Elm application that +will react to user actions and fetch data from a JSON endpoint. + + +An [[file:sample.html][HTML mockup]] is provided along with CSS and images. + +* Exercise: A Chat Service User List + +The exercise will be a user list application for a phony chat service. + +The application will have three states: +- Offline +- Connecting +- Connected + +Two UI elements must be presented to the User: +- A button to connect or disconnect +- A list of online users + +** Requirements + +*** Behavior +**** Offline +- The application must start in an offline state +- The button should appear in its "Connect" state while offline +- Clicking the "Connect" button should progress the application to + its connecting state, and fetch the JSON user list. +- The user list should be empty. +**** Connecting +- The button should appear in its "Connecting" state while connecting +- When the user list has been fetched, the application should + progress to its connected state with a populated user list. +**** Connected +- The button should appear in its "Connect" state while online (user list is present) +- The user list should be populated. +- Clicking the "Disconnect" button should clear the user list and + progress the application to its offline state. +*** Architecture +- The Elm application should be embedded within an HTML file per + the mockup, loading within the =elm-app= div. +- The Elm application should be built following the [[https://github.com/evancz/elm-architecture-tutorial][Elm + Architecture]] (using [[http://package.elm-lang.org/packages/evancz/start-app/2.0.2/StartApp][StartApp]]). +- The user list should be fetched from the provided JSON file. + +** Hints +- Be sure to reference the [[http://elm-lang.org/docs][official Elm documentation]] as well as the + [[http://www.elm-tutorial.org/][Elm tutorial]] to see how to build Elm application +- The provided Makefile expects your main module to be in =./App.elm=, + and will output the compiled javascript for your application to + =./app.js=. +- While the app is running within the Elm reactor via =make dev=, + assets will be available relative to the project's root directory. + E.g., you can include the css file as =/css/style.css=. +- The external library [[http://package.elm-lang.org/packages/evancz/elm-http/3.0.0/][elm-http]] will be useful for making the request + to fetch the users JSON. +- You may find it easier to build the widgets separately, and to + hard-code the various into your models before implementing your + click actions and HTTP request. diff --git a/css/style.css b/css/style.css new file mode 100644 index 0000000..b6d9823 --- /dev/null +++ b/css/style.css @@ -0,0 +1,61 @@ +body { + font-family: sans-serif; + color: #333; +} + +a.button { + display: inline-block; + padding: 0.5em 1em; + background-color: rgb(150, 150, 150); + color: white; + text-transform: uppercase; + text-decoration: none; + font-weight: bold; +} + +a.button.connect { + background-color: rgb(0, 150, 136); +} + +a.button.connect:hover { + background-color: rgb(0, 179, 162); +} + +a.button.connect:active { + background-color: rgb(102, 204, 194); +} + +a.button.connecting { + cursor: wait; +} + +a.button.disconnect { + background-color: rgb(199, 26, 26); +} + +a.button.disconnect:hover { + background-color: rgb(227, 54, 54); +} + +a.button.disconnect:active { + background-color: rgb(255, 82, 82); +} + +ul.users { + list-style-type: none; + width: 50%; + padding: 0; +} + +ul.users li { + background-image: url("../images/avatar-32.png"); + background-repeat: no-repeat; + color: #778899; + background-color: rgb(245, 249, 250); + border-color: #778899; + border-bottom-style: solid; + border-bottom-width: 1px; + line-height: 32px; + padding-left: 40px; + margin: 0.5em 0; +} diff --git a/elm-package.json b/elm-package.json new file mode 100644 index 0000000..5ba415f --- /dev/null +++ b/elm-package.json @@ -0,0 +1,17 @@ +{ + "version": "1.0.0", + "summary": "Elm Programming Exercise", + "repository": "https://github.com/correl/elm-exercise.git", + "license": "BSD3", + "source-directories": [ + "." + ], + "exposed-modules": [], + "dependencies": { + "elm-lang/core": "3.0.0 <= v < 4.0.0", + "evancz/elm-effects": "2.0.1 <= v < 3.0.0", + "evancz/elm-html": "4.0.2 <= v < 5.0.0", + "evancz/start-app": "2.0.2 <= v < 3.0.0" + }, + "elm-version": "0.16.0 <= v < 0.17.0" +} diff --git a/images/avatar-32.png b/images/avatar-32.png new file mode 100644 index 0000000000000000000000000000000000000000..9c9456a05c13be43aadb3274c392553d132910bf GIT binary patch literal 1389 zcmV-z1(N!SP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x00(qQO+^Rb1P=umINPD+m;e9-aY;l$R9M5EmrZO{MHI(> zb6e81F@P8v`&KUz@Db6JzO;avzDUZ482Sne7K+gjWPuAmHe%EoSA>l%q$UQ_Mib(~ z1v0G|X|-eu_(7aUBWf)Op{o)EP0>;s${iOox7_x<-h0d0+&Aazf9A}*bIu47QZ|=g z2y6kK0agQPV38A#0at)?z)1{W>j8N)iC>Wbcp2~(@H|kJFy33h=fDB2R2a%SGAHu3DY0=SqXfEy)yuR z0UNcFgJC^ymeH~hxB*&?p=rM009wf*V@wm!>U=E)dR=ylGmve}S0XqIta1jgXeB!% zciGq?0QA5y6O)bIz+s2?tHCrBRQCixS)i0kXZ8avZrQ4pJXp$EU1M`uDxKMrN@qSs z(1GB+R65g~N@u)O`q9DBk>R3XMn{GVsdUD7$5Aa16{91=ebX7p=JLyd->|p6-^br@ zPWAZ3J8rH*2njUJvDrSLMJsu$I15`n@V<3H+yNfbN?r`^z&-~)1?(*aZVya!M1TWq z06IzuwDq~yVJvW%h-@yu2p9z_fg@VU7w0&~6~G_F7cT>3w2~L*@N)!s0hj=4Jm5J8 z4)&tVMb9Px$LVa2kOvr*z!nc!?-74Qy?XqOo}d5T_epr9EJ=Til2-Izw_g9U~907JG4?0y3BZ z;A{fbv&Q(RV%<6NLg`u(Wl>Pw2G|K)jZnJ^>?{oQM3!dYA@?2gu#*hfejZ6$$%{Y( zwpE8OtnYXYPA86*yYCf|&E-3RUBESC{D%`n4?s4Tujbyoa9%5UEs0%SW8M>jQJ@;= zD#!NwT|l)E-a6p>B#s>5cS&@^Bn0amI6%J#d#EFfKPy*fujb~S5V!Pvvk5;_cN{J%RvAc?A%rk^cv%D z7Q(B-*8lC;ez7p*YZ5!Abvpaq*e+NR(zyv72aW>Y_`VtUJaGcsF{gl4TFGG%imnYi z0fQ}-PY^wZ{|lxD5Fkc@2O@MQfM0+$Zr!exd;@0Agzo~u?6;QqH$azG-Q!wy{|9u% z=vIcne+S+P1k(X%CC7nn#Fu1%yTGB)`jF$r(GBc)K0PtbD8*XIVPI2&AdYDzFNf?d z0o@6}H_aYYih6-oQUgzM?>I_PTM6EW5&A>Glg{@HD%p%&ChCEM*c%(BOU4&Pol)2h zczG6k%K50DYeY-(I9&<6jeTkbf3tQBZ|VVQ0O}f>g%F|*c+JTtu}``EagUnBQ%*LQ ze-PM;9pP$$69%&n3j3PNXfL8zj03~!qSaf7zbY(hY za%Ew3WdJfTF*YqQG%YbTR4_3*F*G_eIV~_WIxsLxz>d8D001R)MObuXVRU6WZEs|0 vW_bWIFfleQFf=VOHB>M$Ix#dlFgYzSG&(Rav=TAm00000NkvXXu0mjfd|OV4 literal 0 HcmV?d00001 diff --git a/images/avatar-64.png b/images/avatar-64.png new file mode 100644 index 0000000000000000000000000000000000000000..b4c6034e8d3f5384cd0d18be9b96561a04b827ee GIT binary patch literal 2837 zcmV+w3+nWVP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 diff --git a/images/avatar.png b/images/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..6f05402168cfb202b8655f7945885084a86bfcc2 GIT binary patch literal 10424 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 + + Elm Exercise + + + +

Online Users

+ + +
+ + + Connect + Connecting + Disconnect + +
    + + +
  • Sterling Archer
  • +
  • Lana Kane
  • +
  • Malory Archer
  • +
  • Cyril Figgis
  • +
  • Cheryl Tunt
  • +
  • Pam Poovey
  • +
  • Ray Gillette
  • +
+
+ +