From 8e6cd2806227f2dd812c7b8f6586f5bfd3ee0afe Mon Sep 17 00:00:00 2001 From: ckonstanski Date: Sun, 9 Aug 2026 18:27:06 -0600 Subject: more react migration --- lisp/service/about-us-service.lisp | 2 +- lisp/service/login-service.lisp | 2 +- lisp/service/resume-service.lisp | 2 +- lisp/service/users-service.lisp | 18 +-- .../clojurescript/resume/src/resume/core.cljs | 174 +++++++++++---------- 5 files changed, 105 insertions(+), 93 deletions(-) diff --git a/lisp/service/about-us-service.lisp b/lisp/service/about-us-service.lisp index efbcbd2..90e2625 100644 --- a/lisp/service/about-us-service.lisp +++ b/lisp/service/about-us-service.lisp @@ -53,7 +53,7 @@ (setf (form instance) (make-form "about-us-modify-form" nil nil - `((:label "Content" :name "txt-content" :field-type "textarea" :value ,(content about-us) :required "required") + `((:label "Content" :name "content" :field-type "textarea" :value ,(content about-us) :required "required") (:label "Modify" :field-type "button" :onclick "on_about_us_modify_submit_clicked()")))))))) (defun about-us-modify-submit-json (category content) diff --git a/lisp/service/login-service.lisp b/lisp/service/login-service.lisp index 1b966e2..cedc867 100644 --- a/lisp/service/login-service.lisp +++ b/lisp/service/login-service.lisp @@ -31,7 +31,7 @@ nil t '((:name "username" :label "Username" :field-type "text" :required "required") - (:label "Send password reset email" :field-type "button" :onclick "on_login_forgot_submit_clicked()"))))) + (:label "Send password reset email" :field-type "button" :onclick "on-login-forgot-submit-clicked"))))) (defun login-json () (with-noauth (instance login-service) diff --git a/lisp/service/resume-service.lisp b/lisp/service/resume-service.lisp index 322ab30..66b0e7b 100644 --- a/lisp/service/resume-service.lisp +++ b/lisp/service/resume-service.lisp @@ -149,7 +149,7 @@ needs to JOIN with other data." (loop for param in (sb-introspect:function-lambda-list #',func-modify-submit-s) do (setf (slot-value new-component param) (symbol-value param))) (setf (user_id new-component) (id user)) - (update-record-no-nulls resume-pkg new-component) + (update-record resume-pkg new-component) (setf (session-value :message) (format nil "~a modified successfully." ,component))) (error (format nil "~a error" ,component)))) (error (e) diff --git a/lisp/service/users-service.lisp b/lisp/service/users-service.lisp index 556ea7f..965fee6 100644 --- a/lisp/service/users-service.lisp +++ b/lisp/service/users-service.lisp @@ -35,7 +35,7 @@ :accessor form)) (:documentation "")) -(defun role-checkboxes (role-groups &optional active-role-groups) +(defun role-checkboxes (name role-groups &optional active-role-groups) (remove-if 'null (mapcar (lambda (role-group) (when (not (intersection `(,(name role-group)) `("_Public" "profile-admin") :test 'string=)) @@ -45,7 +45,7 @@ active-role-groups) :test 'string=) '(:checked "checked" :value "on")))) - (remove-if 'null `(:name ,(format nil "chk_~a" (name role-group)) :label ,(name role-group) :field-type "checkbox" ,@checked))))) + (remove-if 'null `(:name ,(format nil "chk_~a_~a" name (name role-group)) :label ,(name role-group) :field-type "checkbox" ,@checked))))) role-groups))) (defun users-add-json () @@ -61,7 +61,7 @@ `((:name "first_name" :label "First Name" :field-type "text" :required "required") (:name "last_name" :label "Last Name" :field-type "text" :required "required") (:name "email" :label "Email" :field-type "text" :required "required") - ,@(role-checkboxes role-groups) + ,@(role-checkboxes "users_add" role-groups) (:label "Add User" :field-type "button" :onclick "on_users_add_submit_clicked()")))))))) (defun users-add-submit-json (role_groups first_name last_name email) @@ -76,7 +76,7 @@ (setf registration (get-registration-by-id auth-pkg id))) (handler-case (let ((text-message (format nil - "Hello ~a ~a and welcome to the ~a website!~%~%A user account registration has been created for you. It expires in 3 days.~%~%Please click the following link to complete the registration:~%~%~a://~a/register?hash=~a~%" + "Hello ~a ~a and welcome to the ~a website!~%~%A user account registration has been created for you. It expires in 3 days.~%~%Please click the following link to complete the registration:~%~%~a://~a/register/~a~%" (name *webapp*) (first_name registration) (last_name registration) @@ -95,12 +95,12 @@ ((p) "Please click the following link to complete the registration:") ((p) ((a :href ,(format nil - "~a://~a/register?hash=~a" + "~a://~a/register/~a" (scheme *webapp*) (url *webapp*) (hash registration))) ,(format nil - "~a://~a/register?hash=~a" + "~a://~a/register/~a" (scheme *webapp*) (url *webapp*) (hash registration)))))))) @@ -218,7 +218,7 @@ (:name "last_name" :label "Last Name" :field-type "text" :value ,(last_name user) :required "required") (:name "email" :label "Email" :field-type "text" :value ,(email user) :required "required") (:name "phone" :label "Phone" :field-type "text" :value ,(phone user)) - ,@(role-checkboxes role-groups active-role-groups) + ,@(role-checkboxes "users_modify" role-groups active-role-groups) (:label "Modify User" :field-type "button" :onclick "on_users_modify_submit_clicked()")))) (setf (session-value :errormsg) "Error: could not modify user. Not found.")))))) @@ -240,7 +240,7 @@ (cl-ppcre:split "\\|" role_groups) :test 'string=) do (insert-user-role-group auth-pkg (make-instance 'user-role - :user_id (id user) + :user_id id :role_group_name role-group))) (setf (session-value :message) "User saved successfully.")) (setf (session-value :errormsg) "An error occured.")))))) @@ -285,7 +285,7 @@ (define-endpoint ("/users/view" :method :get) () users-view-json) (define-endpoint ("/users/add" :method :post) () users-add-json) (define-endpoint ("/users/add/submit" :method :post) (&post (role_groups :parameter-type 'string) (first_name :parameter-type 'string) (last_name :parameter-type 'string) (email :parameter-type 'string)) users-add-submit-json role_groups first_name last_name email) -(define-endpoint ("/register/:hash" :method :get) (&path (hash 'string)) base (format nil "/register/~a" hash)) +(define-endpoint ("/register" :method :get) (&get (hash :parameter-type 'string)) base (format nil "/register/~a" hash)) (define-endpoint ("/users/register" :method :post) (&post (hash :parameter-type 'string)) users-register-json hash) (define-endpoint ("/users/register/form" :method :post) (&post (hash :parameter-type 'string)) users-register-form-json hash) (define-endpoint ("/users/register/submit" :method :post) (&post (hash :parameter-type 'string) (username :parameter-type 'string) (pwd :parameter-type 'string) (pwd2 :parameter-type 'string) (phone :parameter-type 'string)) users-register-submit-json hash username pwd pwd2 phone) diff --git a/lisp/webapps/resume/clojurescript/resume/src/resume/core.cljs b/lisp/webapps/resume/clojurescript/resume/src/resume/core.cljs index b0a2244..33d03c5 100644 --- a/lisp/webapps/resume/clojurescript/resume/src/resume/core.cljs +++ b/lisp/webapps/resume/clojurescript/resume/src/resume/core.cljs @@ -190,7 +190,7 @@ (def resume-state (r/atom {})) (defn reset-location [url] - (reset! location-state url)) + (reset! location-state (first (str/split url "?")))) (defn reset-login-state [jsonobj] (reset! login-state jsonobj)) @@ -271,23 +271,24 @@ separating the throwaway prefix and the remaining useful bit. `selector' will likely be something like: [id^='chk_']" (reduce (fn [x y] - (cond (and x y) (str x "|" y) - (and x (not y)) x - (and (not x) y) y + (cond (and (not (empty? x)) (not (empty? y))) (str x "|" y) + (and (not (empty? x)) (empty? y)) x + (and (empty? x) (not (empty? y))) y :else "")) (map (fn [elem] (let [this (jquery (str "#" (dommy/attr elem :id)))] (when (-> this (.prop "checked")) - (second (str/split (-> this (.prop "id")) "_"))))) + (last (str/split (-> this (.prop "id")) "_"))))) (.toArray (jquery selector))))) (defn form-fields-to-map [selector] - (apply merge (for [x (jquery selector) - :when (not (empty? (.-name x)))] - {(.-name x) (.-value x)}))) + (let [form-name (str/replace (str/replace-first (first (str/split selector " ")) "#" "") "-" "_")] + (apply merge (for [x (jquery selector) + :when (not (empty? (.-name x)))] + {(str/replace (.-name x) (str form-name "-") "") (.-value x)})))) (hiccups/defhtml generic-component-add-modify [jsonobj] - (ck-form/template-generic-form (get jsonobj "form") (namespace ::x))) + [:div {:dangerouslySetInnerHTML (r/unsafe-html (ck-form/template-generic-form (get jsonobj "form") (namespace ::x)))}]) (defn component-results-table [component jsonobj & [reverse-p]] (let [results (get jsonobj "components") @@ -482,8 +483,7 @@ (defn render-login-authenticate [] (POST "/login/authenticate" {:format :raw - :params {:username (dommy/value (dommy/sel1 :#username)) - :pwd (dommy/value (dommy/sel1 :#pwd))} + :params (form-fields-to-map "#login-form :input") :handler handler-login-authenticate})) ;; logout @@ -746,7 +746,7 @@ (defn render-about-us-modify-submit [] (POST (str "/" @about-us-category-state "/modify/submit") {:format :raw - :params {:content (dommy/value (dommy/sel1 :#txt-content))} + :params (form-fields-to-map "#about-us-modify-form :input") :handler handler-about-us-modify-submit})) ;; contact-us @@ -756,20 +756,21 @@ [:h3 {:style {:text-align "center"}} "Reach out to me by filling out the form."] [comp-contact-us-view] [:table {:width "100%"} - [:tr - [:td {:style {:width "100%" - :text-align "center"}} - [:h3 "Located on the edge of the ISU campus!"]]] - [:tr - [:td {:style {:width "100%" - :text-align "center"}} - [:iframe {:src "https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3225.263770603599!2d-112.4266916!3d42.8635091!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x53554f343c440407%3A0xf13bf897ecb4f7e0!2sBogenherr%20Violin%20and%20Viola%20Studio!5e1!3m2!1sen!2sus!4v1783097048097!5m2!1sen!2sus" - :style {:width "600px" - :height "450px" - :border "0px"} - :allowfullscreen "" - :loading "lazy" - :referrerpolicy "strict-origin-when-cross-origin"}]]]]]) + [:tbody + [:tr + [:td {:style {:width "100%" + :text-align "center"}} + [:h3 "Located on the edge of the ISU campus!"]]] + [:tr + [:td {:style {:width "100%" + :text-align "center"}} + [:iframe {:src "https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3225.263770603599!2d-112.4266916!3d42.8635091!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x53554f343c440407%3A0xf13bf897ecb4f7e0!2sBogenherr%20Violin%20and%20Viola%20Studio!5e1!3m2!1sen!2sus!4v1783097048097!5m2!1sen!2sus" + :style {:width "600px" + :height "450px" + :border "0px"} + :allowfullscreen "" + :loading "lazy" + :referrerpolicy "strict-origin-when-cross-origin"}]]]]]]) (defn handler-contact-us [response] (let [jsonobj (js->clj (js/JSON.parse response))] @@ -829,7 +830,7 @@ ;; messages-results (defn on-messages-mode-clicked [read] - (dommy/set-value! (dommy/sel1 :#read) read) + (dommy/set-value! (dommy/sel1 :#messages_select_mode_form-read) read) (render-messages-results)) (defn comp-messages-results [] @@ -847,7 +848,7 @@ (for [key keys] [:th key]) [:th - (str "Mark " (cond (= (dommy/value (dommy/sel1 :#read)) "read") + (str "Mark " (cond (= (dommy/value (dommy/sel1 :#messages_select_mode_form-read)) "read") "unread" :else "read"))]]] @@ -858,15 +859,15 @@ (for [key keys] [:td {:onclick onclick} (get rec key)]) [:td [:img {:src (str "/static/images/" - (cond (= (dommy/value (dommy/sel1 :#read)) "read") + (cond (= (dommy/value (dommy/sel1 :#messages_select_mode_form-read)) "read") "edit-undo.png" :else "edit-redo.png")) - :on-click #(on-messages-mark((cond (= (dommy/value (dommy/sel1 :#read)) "read") + :on-click #(on-messages-mark (cond (= (dommy/value (dommy/sel1 :#messages_select_mode_form-read)) "read") "'unread'" :else "'read'") - (get rec "id")))}]]]))]])])) + (get rec "id"))}]]]))]])])) (defn handler-messages-results [response] (let [jsonobj (js->clj (js/JSON.parse response))] @@ -892,7 +893,7 @@ (defn render-messages-mark [read id] (POST "/messages/mark" {:format :raw - :params (form-fields-to-map "#messages-select-mode-form :input") + :params (merge (form-fields-to-map "#messages-select-mode-form :input") {"id" (str id)}) :handler handler-messages-mark})) ;; users @@ -901,22 +902,42 @@ [:div {:style {:display (cond (or (= @location-state "/users")) "block" :else "none")}} [:h3 {:style {:text-align "center"}} (get @users-state "title")] [comp-users-view] - [:div {:id "modify-users" + [:div {:id "modal-users-add" + :class "modal fade" + :role "dialog" + :tab-index "-1"} + [:div {:class "modal-dialog modal-lg"} + [:div {:class "modal-content"} + [:div {:class "modal-header"} + [:h5 (get @users-state "title")] + [:button {:type "button" + :class "close" + :data-dismiss "modal"} + "×"]] + [:div {:class "modal-body" + :style {:height "460px"}} + [comp-users-add]] + [:div {:class "modal-footer"} + [:button {:type "submit" + :class "btn btn-danger btn-default" + :data-dismiss "modal"} + [:span {:class "glyphicon glyphicon-remove"}] + "Cancel"]]]]] + [:div {:id "modal-users-modify" :class "modal fade" :role "dialog" :tab-index "-1"} [:div {:class "modal-dialog modal-lg"} [:div {:class "modal-content"} [:div {:class "modal-header"} - [:h5 "Users - Modify"] + [:h5 (get @users-state "title")] [:button {:type "button" :class "close" :data-dismiss "modal"} "×"]] [:div {:class "modal-body" :style {:height "460px"}} - ;;[comp-users-modify] - ] + [comp-users-modify]] [:div {:class "modal-footer"} [:button {:type "submit" :class "btn btn-danger btn-default" @@ -991,7 +1012,7 @@ (let [jsonobj (js->clj (js/JSON.parse response))] (auth-notifications jsonobj) (reset-users-add-state jsonobj) - (.modal (jquery "#modify-users")))) + (.modal (jquery "#modal-users-add")))) (defn render-users-add [] (POST "/users/add" {:handler handler-users-add})) @@ -1002,33 +1023,31 @@ (when (-> (jquery "#users-add-form") (.get "0") (.checkValidity)) - (.modal (jquery "#modify-users") "hide") + (.modal (jquery "#modal-users-add") "hide") (render-users-add-submit))) (defn handler-users-add-submit [response] (let [jsonobj (js->clj (js/JSON.parse response))] (auth-notifications jsonobj) - (on-menu-clicked "/users"))) + (render-users-view))) (defn render-users-add-submit [] (POST "/users/add/submit" {:format :raw - :params {:role_groups (reduce-checkboxes "[id^='chk_']") - :first_name (dommy/value (dommy/sel1 :#first_name)) - :last_name (dommy/value (dommy/sel1 :#last_name)) - :email (dommy/value (dommy/sel1 :#email))} + :params (merge (form-fields-to-map "#users-add-form :input") + {:role_groups (reduce-checkboxes "[id^='users_add_form-chk_users_add_']")}) :handler handler-users-add-submit})) ;; users-register -(hiccups/defhtml template-users-register [jsonobj] - [:h3 {:style {:style "text-align: center"}} (get jsonobj "title")] - [:div {:id "content"}]) +(defn comp-users-register [] + [:div {:style {:display (cond (or (= @location-state "/register")) "block" :else "none")}} + [:h3 {:style {:style "text-align: center"}} (get @users-register-state "title")] + [comp-users-register-form]]) (defn handler-users-register [response] (let [jsonobj (js->clj (js/JSON.parse response))] - (dommy/set-html! (dommy/sel1 :#body) (template-users-register jsonobj)) - (render-users-register-form (get jsonobj "hash")))) + (reset-users-register-state jsonobj))) (defn render-users-register [hash] (POST "/users/register" @@ -1038,22 +1057,23 @@ ;; users-register-form -(hiccups/defhtml template-users-register-form [jsonobj] - (cond (get jsonobj "errormsg") - [:a {:href (str "javascript:" (namespace ::x) ".reset_app()")} - "Click here to return to the home page."] - :else - (do - [:p (str "Welcome " (get jsonobj "firstName") " " (get jsonobj "lastName") " to the new user registration page. Please fill out the form below to complete your registration.")] - [:p "Create a new username and password for your login to the website. Phone number is optional."] - [:p (str "Your email address is recorded as " (get jsonobj "email") ". This is where notifications will be sent. If this is not the desired email address, you can change it later by visiting the Edit Profile page.")] - [:p (str "This registration will expire in " (get jsonobj "validFor") ". Please submit this form before that time.")] - (ck-form/template-generic-form (get jsonobj "form") (namespace ::x))))) +(defn comp-users-register-form [] + [:div + (cond (get @users-register-form-state "errormsg") + [:a {:href (str "javascript:" (namespace ::x) ".reset_app()")} + "Click here to return to the home page."] + :else + (do + [:p (str "Welcome " (get @users-register-form-state "firstName") " " (get @users-register-form-state "lastName") " to the new user registration page. Please fill out the form below to complete your registration.")] + [:p "Create a new username and password for your login to the website. Phone number is optional."] + [:p (str "Your email address is recorded as " (get @users-register-form-state "email") ". This is where notifications will be sent. If this is not the desired email address, you can change it later by visiting the Edit Profile page.")] + [:p (str "This registration will expire in " (get @users-register-form-state "validFor") ". Please submit this form before that time.")] + [:div {:dangerouslySetInnerHTML (r/unsafe-html (ck-form/template-generic-form (get @users-register-form-state "form") (namespace ::x)))}]))]) (defn handler-users-register-form [response] (let [jsonobj (js->clj (js/JSON.parse response))] (notifications jsonobj) - (dommy/set-html! (dommy/sel1 :#content) (template-users-register-form jsonobj)))) + (reset-users-register-form-state jsonobj))) (defn render-users-register-form [hash] (POST "/users/register/form" @@ -1069,28 +1089,20 @@ (.checkValidity)) (render-users-register-submit))) -(hiccups/defhtml template-users-register-submit [jsonobj] - [:a {:href (str "javascript:" (namespace ::x) ".reset_app()")} - "Click here to start using the website!"]) +(defn comp-users-register-submit [] + [:div + [:a {:href (str "javascript:" (namespace ::x) ".reset_app()")} + "Click here to start using the website!"]]) (defn handler-users-register-submit [response] (let [jsonobj (js->clj (js/JSON.parse response))] (notifications jsonobj) - (cond (get jsonobj "errormsg") - (do - (dommy/set-value! (dommy/sel1 :#pwd) "") - (dommy/set-value! (dommy/sel1 :#pwd2) "")) - :else - (dommy/set-html! (dommy/sel1 :#content) (template-users-register-submit jsonobj))))) + (reset-users-register-submit-state jsonobj))) (defn render-users-register-submit [] (POST "/users/register/submit" {:format :raw - :params {:hash (dommy/value (dommy/sel1 :#hash)) - :username (dommy/value (dommy/sel1 :#username)) - :pwd (dommy/value (dommy/sel1 :#pwd)) - :pwd2 (dommy/value (dommy/sel1 :#pwd2)) - :phone (dommy/value (dommy/sel1 :#phone))} + :params (form-fields-to-map "#users-register-form :input") :handler handler-users-register-submit})) ;; users-modify @@ -1098,15 +1110,14 @@ (defn on-users-modify-clicked [id] (render-users-modify id)) -(hiccups/defhtml template-users-modify [jsonobj] - (ck-form/template-generic-form (get jsonobj "form") (namespace ::x))) +(defn comp-users-modify [] + [:div {:dangerouslySetInnerHTML (r/unsafe-html (ck-form/template-generic-form (get @users-modify-state "form") (namespace ::x)))}]) (defn handler-users-modify [response] (let [jsonobj (js->clj (js/JSON.parse response))] (auth-notifications jsonobj) - (dommy/set-html! (dommy/sel1 :#modify-title) (get jsonobj "title")) - (dommy/set-html! (dommy/sel1 :#modify-body) (template-users-modify jsonobj)) - (.modal (jquery "#modify-users")))) + (reset-users-modify-state jsonobj) + (.modal (jquery "#modal-users-modify")))) (defn render-users-modify [id] (POST "/users/modify" @@ -1120,7 +1131,7 @@ (when (-> (jquery "#users-modify-form") (.get "0") (.checkValidity)) - (.modal (jquery "#modify-users") "hide") + (.modal (jquery "#modal-users-modify") "hide") (render-users-modify-submit))) (defn handler-users-modify-submit [response] @@ -1131,7 +1142,8 @@ (defn render-users-modify-submit [] (POST "/users/modify/submit" {:format :raw - :params (form-fields-to-map "#users-modify-form :input") + :params (merge (form-fields-to-map "#users-modify-form :input") + {:role_groups (reduce-checkboxes "[id^='users_modify_form-chk_users_modify_']")}) :handler handler-users-modify-submit})) ;; users-toggle-active -- cgit v1.3