Browse Source

project preliminaries

Brandon Wong 1 year ago
commit
d7c24cdedb

+ 14 - 0
.clj-kondo/config.edn

@@ -0,0 +1,14 @@
+{:lint-as {}
+ :linters {:unresolved-symbol {:exclude [goog.DEBUG]}
+           :unused-namespace {:exclude [cljs.repl]}
+           :unused-referred-var {:exclude {cljs.repl [Error->map
+                                                      apropos
+                                                      dir
+                                                      doc
+                                                      error->str
+                                                      ex-str
+                                                      ex-triage
+                                                      find-doc
+                                                      print-doc
+                                                      pst
+                                                      source]}}}}

+ 25 - 0
.gitignore

@@ -0,0 +1,25 @@
+*.swp
+/out/
+/resources/public/js/compiled/
+/target/
+/*-init.clj
+/*.log
+
+# Leiningen
+/.lein-*
+/.nrepl-port
+
+# Node.js dependencies
+/node_modules/
+
+# shadow-cljs cache, port files
+/.shadow-cljs/
+
+# clj-kondo cache and configs from libs
+/.clj-kondo/*
+
+# clj-kondo config
+!/.clj-kondo/config.edn
+
+# clojure-lsp cache
+/.lsp/.cache

+ 4 - 0
README.md

@@ -0,0 +1,4 @@
+# lineup
+
+A visual schedule builder for kids.
+

+ 11 - 0
dev/user.cljs

@@ -0,0 +1,11 @@
+(ns cljs.user
+  "Commonly used symbols for easy access in the ClojureScript REPL during
+  development."
+  (:require
+    [cljs.repl :refer (Error->map apropos dir doc error->str ex-str ex-triage
+                       find-doc print-doc pst source)]
+    [clojure.pprint :refer (pprint)]
+    [clojure.string :as str]))
+
+(comment
+  (pprint (str/trim "This line suppresses some clj-kondo warnings.")))

+ 27 - 0
karma.conf.js

@@ -0,0 +1,27 @@
+module.exports = function (config) {
+  var junitOutputDir = process.env.CIRCLE_TEST_REPORTS || "target/junit"
+
+  config.set({
+    browsers: ['ChromeHeadless'],
+    basePath: 'target',
+    files: ['karma-test.js'],
+    frameworks: ['cljs-test'],
+    plugins: [
+        'karma-cljs-test',
+        'karma-chrome-launcher',
+        'karma-junit-reporter'
+    ],
+    colors: true,
+    logLevel: config.LOG_INFO,
+    client: {
+      args: ['shadow.test.karma.init']
+    },
+
+    // the default configuration
+    junitReporter: {
+      outputDir: junitOutputDir + '/karma', // results will be saved as outputDir/browserName.xml
+      outputFile: undefined, // if included, results will be saved as outputDir/browserName/outputFile
+      suite: '' // suite will become the package name attribute in xml testsuite element
+    }
+  })
+}

File diff suppressed because it is too large
+ 1884 - 0
package-lock.json


+ 16 - 0
package.json

@@ -0,0 +1,16 @@
+{
+	"name": "lineup",
+	"scripts": {
+		"ancient": "clojure -Sdeps '{:deps {com.github.liquidz/antq {:mvn/version \"RELEASE\"}}}' -m antq.core",
+		"watch": "npx shadow-cljs watch app browser-test karma-test",
+		"release": "npx shadow-cljs release app",
+		"build-report": "npx shadow-cljs run shadow.cljs.build-report app target/build-report.html"
+	},
+	"dependencies": {
+		"react": "17.0.2",
+		"react-dom": "17.0.2"
+	},
+	"devDependencies": {
+		"shadow-cljs": "2.20.5"
+	}
+}

BIN
resources/public/clapping.gif


BIN
resources/public/clapping.png


BIN
resources/public/go.png


+ 20 - 0
resources/public/index.html

@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset='utf-8'>
+    <meta name="viewport" content="width=device-width,initial-scale=1">
+    <link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/css/bootstrap.min.css">
+    <link rel="stylesheet" href="/vendor/css/material-design-iconic-font.min.css">
+    <link rel="stylesheet" href="/vendor/css/re-com.css">
+    <link href="http://fonts.googleapis.com/css?family=Roboto:300,400,500,700,400italic" rel="stylesheet" type="text/css">
+    <link href="http://fonts.googleapis.com/css?family=Roboto+Condensed:400,300" rel="stylesheet" type="text/css">
+    <title>lineup</title>
+  </head>
+  <body>
+    <noscript>
+      lineup is a JavaScript app. Please enable JavaScript to continue.
+    </noscript>
+    <div id="app"></div>
+    <script src="/js/compiled/app.js"></script>
+  </body>
+</html>

BIN
resources/public/vendor/css/chosen-sprite.png


BIN
resources/public/vendor/css/chosen-sprite@2x.png


File diff suppressed because it is too large
+ 1 - 0
resources/public/vendor/css/material-design-iconic-font.min.css


File diff suppressed because it is too large
+ 1352 - 0
resources/public/vendor/css/re-com.css


BIN
resources/public/vendor/fonts/Material-Design-Iconic-Font.eot


File diff suppressed because it is too large
+ 1896 - 0
resources/public/vendor/fonts/Material-Design-Iconic-Font.svg


BIN
resources/public/vendor/fonts/Material-Design-Iconic-Font.ttf


BIN
resources/public/vendor/fonts/Material-Design-Iconic-Font.woff


BIN
resources/public/vendor/fonts/Material-Design-Iconic-Font.woff2


+ 28 - 0
shadow-cljs.edn

@@ -0,0 +1,28 @@
+{:nrepl {:port 8777}
+
+ :source-paths ["src" "test"]
+
+ :dependencies
+ [[reagent "1.1.1"]
+  [re-frame "1.3.0"]
+  [re-com "2.13.2"]
+
+  [binaryage/devtools "1.0.6"]]
+
+ :dev-http
+ {8280 "resources/public"
+  8290 "target/browser-test"}
+
+ :builds
+ {:app
+  {:target     :browser
+   :output-dir "resources/public/js/compiled"
+   :asset-path "/js/compiled"
+   :modules
+   {:app {:init-fn lineup.core/init}}
+   :devtools
+   {:preloads []}
+   :dev
+   {:compiler-options
+    {:closure-defines
+     {re-com.config/root-url-for-compiler-output "http://localhost:8290/js/compiled/app/cljs-runtime/"}}}}}}

+ 4 - 0
src/lineup/config.cljs

@@ -0,0 +1,4 @@
+(ns lineup.config)
+
+(def debug?
+  ^boolean goog.DEBUG)

+ 22 - 0
src/lineup/core.cljs

@@ -0,0 +1,22 @@
+(ns lineup.core
+  (:require
+   [reagent.dom :as rdom]
+   [re-frame.core :as re-frame]
+   [lineup.events :as events]
+   [lineup.views :as views]
+   [lineup.config :as config]))
+
+(defn dev-setup []
+  (when config/debug?
+    (println "dev mode")))
+
+(defn ^:dev/after-load mount-root []
+  (re-frame/clear-subscription-cache!)
+  (let [root-el (.getElementById js/document "app")]
+    (rdom/unmount-component-at-node root-el)
+    (rdom/render [views/main-panel] root-el)))
+
+(defn init []
+  (re-frame/dispatch-sync [::events/initialize-db])
+  (dev-setup)
+  (mount-root))

+ 5 - 0
src/lineup/db.cljs

@@ -0,0 +1,5 @@
+(ns lineup.db)
+
+(def default-db
+  {:mode :normal
+   :schedule [{} {}]})

+ 24 - 0
src/lineup/events.cljs

@@ -0,0 +1,24 @@
+(ns lineup.events
+  (:require
+   [lineup.db :as db]
+   [re-frame.core :as re-frame]))
+
+(re-frame/reg-event-db
+ ::initialize-db
+ (fn [_ _]
+   db/default-db))
+
+(re-frame/reg-event-db
+ ::toggle-mode
+ (fn [db [_ new-mode]]
+   (assoc db :mode new-mode)))
+
+(re-frame/reg-event-db
+ ::toggle-task-complete
+ (fn [db [_ which]]
+   (update
+    db
+    :schedule
+    (partial map-indexed #(if (= %1 which)
+                            (update %2 :complete? not)
+                            %2)))))

+ 20 - 0
src/lineup/subs.cljs

@@ -0,0 +1,20 @@
+(ns lineup.subs
+  (:require
+   [re-frame.core :as re-frame]))
+
+(re-frame/reg-sub
+ ::mode
+ (fn [db]
+   (:mode db)))
+
+(re-frame/reg-sub
+ ::schedule
+ (fn [db]
+   (:schedule db)))
+
+(re-frame/reg-sub
+ ::complete
+ (fn [db]
+   (every?
+    :complete?
+    (:schedule db))))

+ 81 - 0
src/lineup/views.cljs

@@ -0,0 +1,81 @@
+(ns lineup.views
+  (:require
+   [lineup.events :as events]
+   [lineup.subs :as subs]
+   [re-com.core :as re-com]
+   [re-frame.core :as re-frame]))
+
+(defn- top-bar [mode]
+  [re-com/h-box
+   :style {:padding-right "10px"}
+   :justify :between
+   :align :center
+   :children
+   [[re-com/title
+     :label "Schedule"
+     :level :level2]
+    [re-com/hyperlink
+     :label (if (= mode :edit) "done" "edit")
+     :on-click #(re-frame/dispatch [::events/toggle-mode (if (= mode :edit) :normal :edit)])]]])
+
+(defn- slot [index task]
+  [re-com/box
+   :width "300px"
+   :height "300px"
+   :style {:padding "10px"
+           :border "3px solid black"
+           :border-radius "10px"
+           :background-color "white"}
+   :child
+   [:div
+    {:style {:width "100%"
+             :height "100%"
+             :cursor "pointer"}
+     :on-click #(re-frame/dispatch [::events/toggle-task-complete index])}
+    "BOX"
+    (when (:complete? task)
+      "COMPLETE!")]])
+
+(defn- schedule []
+  (let [task-list (re-frame/subscribe [::subs/schedule])
+        list-complete? (re-frame/subscribe [::subs/complete])]
+    [re-com/scroller
+     :v-scroll :off
+     :h-scroll :auto
+     :style {:padding "20px 10px"}
+     :width "100%"
+     :child
+     [re-com/h-box
+      :gap "10px"
+      :align :center
+      :children
+      (concat
+       [[re-com/box
+         :height "150px"
+         :width "150px"
+         :child
+         [:img
+          {:src "go.png"}]]]
+       (map-indexed
+        (fn [index task]
+          ^{:key (str "slot-" index)}
+          [slot index task])
+        @task-list)
+       [[re-com/box
+         :height "150px"
+         :width "150px"
+         :child
+         [:img
+          {:src (if @list-complete? "clapping.gif" "clapping.png")}]]])]]))
+
+(defn main-panel []
+  (let [mode (re-frame/subscribe [::subs/mode])]
+    [re-com/v-box
+     :gap "10px"
+     :height   "100%"
+     :children
+     [[top-bar @mode]
+      (if (= @mode :edit)
+        [:div "EDITING!"]
+        [schedule])]]))
+